Browse Source

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

chenw 7 years ago
parent
commit
8ceab417db
100 changed files with 1713 additions and 406 deletions
  1. 0 1
      .gitignore
  2. 1 1
      README.md
  3. 50 1
      applications/commons/commons-dto/src/main/java/com/usoftchina/saas/commons/dto/ListReqDTO.java
  4. 2 0
      applications/commons/commons-dto/src/main/java/com/usoftchina/saas/commons/exception/BizExceptionCode.java
  5. 1 0
      applications/commons/commons-server/src/main/resources/i18n/messages_zh_CN.properties
  6. 2 0
      applications/document/document-server/src/main/java/com/usoftchina/saas/document/mapper/FundinouttypeMapper.java
  7. 28 3
      applications/document/document-server/src/main/java/com/usoftchina/saas/document/service/impl/FundinouttypeServiceImpl.java
  8. 3 0
      applications/document/document-server/src/main/resources/application.yml
  9. 11 0
      applications/document/document-server/src/main/resources/mapper/FundinouttypeMapper.xml
  10. 9 0
      applications/money/money-server/src/main/java/com/usoftchina/saas/money/po/Fundtransfer.java
  11. 3 3
      applications/money/money-server/src/main/java/com/usoftchina/saas/money/po/PaydetailView.java
  12. 5 8
      applications/money/money-server/src/main/java/com/usoftchina/saas/money/po/RecdetailView.java
  13. 3 0
      applications/money/money-server/src/main/resources/application.yml
  14. 1 1
      applications/money/money-server/src/main/resources/mapper/AcountbalanceViewMapper.xml
  15. 1 1
      applications/money/money-server/src/main/resources/mapper/CustomerCheckViewMapper.xml
  16. 2 1
      applications/money/money-server/src/main/resources/mapper/FundtransferMapper.xml
  17. 2 2
      applications/money/money-server/src/main/resources/mapper/PaydetailViewMapper.xml
  18. 2 2
      applications/money/money-server/src/main/resources/mapper/RecdetailViewMapper.xml
  19. 1 1
      applications/money/money-server/src/main/resources/mapper/VendorAcountViewMapper.xml
  20. 14 0
      applications/purchase/purchase-api/pom.xml
  21. 14 0
      applications/purchase/purchase-api/src/main/java/com/usoftchina/saas/purchase/api/PurchaseService.java
  22. 4 0
      applications/purchase/purchase-server/src/main/java/com/usoftchina/saas/purchase/controller/PurchaseController.java
  23. 2 0
      applications/purchase/purchase-server/src/main/java/com/usoftchina/saas/purchase/po/PurchaseDetail.java
  24. 1 1
      applications/purchase/purchase-server/src/main/java/com/usoftchina/saas/purchase/service/PurchaseService.java
  25. 0 1
      applications/purchase/purchase-server/src/main/java/com/usoftchina/saas/purchase/service/impl/ProdInOutServiceImpl.java
  26. 7 1
      applications/purchase/purchase-server/src/main/java/com/usoftchina/saas/purchase/service/impl/PurchaseServiceImpl.java
  27. 1 1
      applications/purchase/purchase-server/src/main/resources/application.yml
  28. 2 0
      applications/sale/sale-dto/src/main/java/com/usoftchina/saas/sale/dto/PurchaseDetailDTO.java
  29. 4 0
      applications/sale/sale-server/pom.xml
  30. 10 2
      applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/controller/SaleReportController.java
  31. 2 0
      applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/mapper/SaleListMapper.java
  32. 2 0
      applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/mapper/SaleMapper.java
  33. 2 0
      applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/mapper/SaleProfitViewMapper.java
  34. 2 0
      applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/mapper/SalerecViewMapper.java
  35. 6 4
      applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/service/SaleReportService.java
  36. 7 2
      applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/service/impl/ProdInOutServiceImpl.java
  37. 74 17
      applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/service/impl/SaleReportServiceImpl.java
  38. 51 30
      applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/service/impl/SaleServiceImpl.java
  39. 12 0
      applications/sale/sale-server/src/main/resources/mapper/SaleListMapper.xml
  40. 9 3
      applications/sale/sale-server/src/main/resources/mapper/SaleMapper.xml
  41. 12 0
      applications/sale/sale-server/src/main/resources/mapper/SaleProfitViewMapper.xml
  42. 12 0
      applications/sale/sale-server/src/main/resources/mapper/SalerecViewMapper.xml
  43. 1 1
      applications/storage/storage-dto/src/main/java/com/usoftchina/saas/storage/dto/ProdIODetailDTO.java
  44. 1 1
      applications/storage/storage-dto/src/main/java/com/usoftchina/saas/storage/po/Make.java
  45. 3 121
      applications/storage/storage-dto/src/main/java/com/usoftchina/saas/storage/po/MakeMaterial.java
  46. 2 2
      applications/storage/storage-dto/src/main/java/com/usoftchina/saas/storage/po/ProdIODetail.java
  47. 2 2
      applications/storage/storage-dto/src/main/java/com/usoftchina/saas/storage/po/StockTaking.java
  48. 28 2
      applications/storage/storage-server/src/main/java/com/usoftchina/saas/storage/controller/StocktakingController.java
  49. 1 1
      applications/storage/storage-server/src/main/java/com/usoftchina/saas/storage/mapper/MakeMapper.java
  50. 7 1
      applications/storage/storage-server/src/main/java/com/usoftchina/saas/storage/mapper/StockTakingMapper.java
  51. 5 0
      applications/storage/storage-server/src/main/java/com/usoftchina/saas/storage/service/StocktakingService.java
  52. 156 2
      applications/storage/storage-server/src/main/java/com/usoftchina/saas/storage/service/impl/StocktakingServiceImpl.java
  53. 18 1
      applications/storage/storage-server/src/main/resources/mapper/StockTakingMapper.xml
  54. 1 1
      base-servers/account/account-server/src/main/resources/application.yml
  55. 1 1
      base-servers/account/account-server/src/main/resources/mapper/AccountMapper.xml
  56. 4 0
      frontend/saas-portal-web/Dockerfile
  57. 41 0
      frontend/saas-portal-web/build/build.js
  58. 54 0
      frontend/saas-portal-web/build/check-versions.js
  59. BIN
      frontend/saas-portal-web/build/logo.png
  60. 101 0
      frontend/saas-portal-web/build/utils.js
  61. 22 0
      frontend/saas-portal-web/build/vue-loader.conf.js
  62. 83 0
      frontend/saas-portal-web/build/webpack.base.conf.js
  63. 95 0
      frontend/saas-portal-web/build/webpack.dev.conf.js
  64. 149 0
      frontend/saas-portal-web/build/webpack.prod.conf.js
  65. 4 4
      frontend/saas-portal-web/config/env.js
  66. 20 0
      frontend/saas-portal-web/runtime/nginx/default.conf
  67. 2 2
      frontend/saas-portal-web/src/components/conenter/company.vue
  68. 10 2
      frontend/saas-portal-web/src/components/conenter/enterprise.vue
  69. 87 2
      frontend/saas-portal-web/src/components/conenter/home.vue
  70. 122 3
      frontend/saas-portal-web/src/components/conenter/sanjiliandong.vue
  71. 1 1
      frontend/saas-web/app/model/sale/ProdIODetail.js
  72. 2 1
      frontend/saas-web/app/util/FormUtil.js
  73. 45 2
      frontend/saas-web/app/view/core/base/GridPanel.js
  74. 5 1
      frontend/saas-web/app/view/core/dbfind/DbfindTrigger.js
  75. 92 91
      frontend/saas-web/app/view/core/dbfind/MultiDbfindTrigger.js
  76. 3 0
      frontend/saas-web/app/view/core/dbfind/types/BankInfoDbfindTrigger.js
  77. 1 1
      frontend/saas-web/app/view/core/dbfind/types/BomDbfindTrigger.js
  78. 5 3
      frontend/saas-web/app/view/core/dbfind/types/OriOrderMutiDbfindTrigger.js
  79. 2 2
      frontend/saas-web/app/view/core/form/FormPanel.js
  80. 2 0
      frontend/saas-web/app/view/core/form/field/ConDateField.js
  81. 26 0
      frontend/saas-web/app/view/core/form/field/ConDateField.scss
  82. 3 1
      frontend/saas-web/app/view/core/form/field/DetailGridField.js
  83. 3 23
      frontend/saas-web/app/view/core/query/QueryGridPanel.js
  84. 57 10
      frontend/saas-web/app/view/core/report/ReportPanel.js
  85. 1 0
      frontend/saas-web/app/view/document/product/BasePanel.js
  86. 41 0
      frontend/saas-web/app/view/document/product/FormController.js
  87. 1 0
      frontend/saas-web/app/view/document/vendor/BasePanel.js
  88. 5 5
      frontend/saas-web/app/view/home/InfoCard.js
  89. 1 1
      frontend/saas-web/app/view/home/charts/PurchaseTrend.js
  90. 1 1
      frontend/saas-web/app/view/home/charts/StockAmount.js
  91. 1 2
      frontend/saas-web/app/view/money/fundtransfer/QueryPanel.js
  92. 1 2
      frontend/saas-web/app/view/money/othreceipts/QueryPanel.js
  93. 2 8
      frontend/saas-web/app/view/money/othspendings/QueryPanel.js
  94. 0 5
      frontend/saas-web/app/view/money/payBalance/QueryPanel.js
  95. 3 4
      frontend/saas-web/app/view/money/recBalance/QueryPanel.js
  96. 0 1
      frontend/saas-web/app/view/money/report/AccountBalance.js
  97. 1 1
      frontend/saas-web/app/view/money/report/CustomerCheck.js
  98. 1 1
      frontend/saas-web/app/view/money/report/PayDetail.js
  99. 9 2
      frontend/saas-web/app/view/money/report/RecDetail.js
  100. 1 1
      frontend/saas-web/app/view/money/report/VendorCheck.js

+ 0 - 1
.gitignore

@@ -29,7 +29,6 @@ applications/**/build/
 base-servers/**/build/
 framework/**/build/
 frontend/saas-web/build/
-frontend/saas-portal-web/build/
 nbbuild/
 dist/
 node_modules/

+ 1 - 1
README.md

@@ -107,7 +107,7 @@
 
 > 构建
 
-* [jenkins](http://192.168.253.3:8080/job/saas) **账号** admin **密码** select123***
+* [jenkins](http://192.168.0.181:8080/job/saas) **账号** admin **密码** select123***
 
 > 日志
 

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

@@ -18,6 +18,55 @@ public class ListReqDTO implements Serializable {
      */
     private String mode;
 
+    private String calculateFields;
+
+    //将列拼成查询语句,直接查询出数据的格式为json
+    public String getCalculateFieldsSql() {
+        try {
+            JSONArray jsonArray = JSONArray.parseArray(this.calculateFields);
+            if (null != jsonArray && jsonArray.size() > 0) {
+                StringBuilder fieldsSql = new StringBuilder();
+                StringBuilder fieldSql = null;
+                Object field = null;
+                Object operation = null;
+                String sql = null;
+                for (int i = 0; i < jsonArray.size(); i++) {
+                    JSONObject obj = (JSONObject) jsonArray.get(i);
+                    field = obj.get("field");
+                    operation = obj.get("operation");
+                    if (null != field && null != operation && !"".equals(field) && !"".equals(operation)) {
+                        fieldSql = new StringBuilder("'{");
+                        fieldSql.append("\"" + field + "\":'");
+                        fieldSql.append(",");
+                        fieldSql.append(operation + "(" + field + ")");
+                        fieldSql.append(",");
+                        fieldSql.append("',\"operation\":\"" + operation + "\"");
+                        fieldSql.append("}'");
+                    }
+                    if (null != fieldSql) {
+                        fieldsSql.append(fieldSql + ",\",\",");
+                    }
+                }
+                if (fieldsSql.length() > 0) {
+                    sql = "concat('['," + fieldsSql.substring(0, fieldsSql.length() - 5) + ",']')";
+                }
+                return sql;
+            }
+            return null;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    public String getCalculateFields() {
+        return calculateFields;
+    }
+
+    public void setCalculateFields(String calculateFields) {
+        this.calculateFields = calculateFields;
+    }
+
     public String getCondition() {
         return condition;
     }
@@ -87,7 +136,7 @@ public class ListReqDTO implements Serializable {
         }catch (Exception e){
             return null;
         }
-
     }
+
 }
 

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

@@ -70,6 +70,7 @@ public enum BizExceptionCode implements BaseExceptionCode {
     SALEOUT_POST_ERROR(72005,""),
     SALEOUT_UNAUDIT_ERROR(72006,"销售订单已转出货单,无法反审核"),
     SALE_ORDER_HASAUDIT(72003, "存在已审核单据,单据编号:%s"),
+    SALE_EXISTS_PURCHASE(72004, "存在已转的采购单据,单据编号:%s"),
 
     //资金
     PAYBALANCE_OUTNOWBALANCE(74001,"本次核销金额不能大于未核销金额"),
@@ -80,6 +81,7 @@ public enum BizExceptionCode implements BaseExceptionCode {
     BEFORE_UNAUDIT(74006, "单据:<u>%s</u>未审核,无法反审核"),
     BANK_AMOUNT_NOTENOUGH(74004, "资金账号不足"),
     SUBLEDGER_NOT_EXIS(74005,"来源单据不存在"),
+    CHECK_SETACOUNT_EXIS(74006, "不能删除单据日期小于等于结账期间<u>%s</u>的单据"),
 
 
 

+ 1 - 0
applications/commons/commons-server/src/main/resources/i18n/messages_zh_CN.properties

@@ -34,6 +34,7 @@ msg.checkSuccess=\u6838\u5bf9\u6210\u529f
 msg.printSuccess=\u6253\u5370\u6210\u529f
 msg.bannedSuccess=\u7981\u7528\u6210\u529f
 msg.enableSuccess=\u542f\u7528\u6210\u529f
+msg.enable=\u542f\u7528\u64cd\u4f5c
 msg.resBannedSuccess=\u53cd\u7981\u7528\u6210\u529f
 msg.modifySuccess=\u6570\u636e\u66f4\u65b0\u6210\u529f
 msg.modifyDetailSuccess=\u66f4\u65b0\u660e\u7ec6\u6570\u636e\u6210\u529f

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

@@ -7,6 +7,7 @@ import com.usoftchina.saas.document.entities.Fundinouttype;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
+import java.util.Map;
 
 public interface FundinouttypeMapper extends CommonBaseMapper<Fundinouttype> {
     int deleteByPrimaryKey(Long ft_id);
@@ -26,4 +27,5 @@ public interface FundinouttypeMapper extends CommonBaseMapper<Fundinouttype> {
     List<ComboDTO> getCombo(@Param("companyId") Long companyId,@Param("condition") String condition);
 
     List<Fundinouttype> selectAll(@Param("companyId") Long companyId);
+    void check(Map<String, Object> map);
 }

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

@@ -13,15 +13,20 @@ import com.usoftchina.saas.document.service.FundinouttypeService;
 import com.usoftchina.saas.exception.BizException;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
 
 import java.util.Date;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 @Service
 public class FundinouttypeServiceImpl extends CommonBaseServiceImpl<FundinouttypeMapper, Fundinouttype> implements FundinouttypeService {
 
     @Autowired
     private MessageLogService messageLogService;
+    @Autowired
+    private FundinouttypeMapper fundinouttypeMapper;
 
     /**
      * 保存/更新
@@ -63,10 +68,30 @@ public class FundinouttypeServiceImpl extends CommonBaseServiceImpl<Fundinouttyp
      */
     @Override
     public boolean removeByPrimaryKey(Long id){
+        Fundinouttype fundinouttype = getMapper().selectByPrimaryKey(id);
+        String kind = fundinouttype.getFt_kind();
+        int v_id = 0;
+        if ("收入".equals(kind)){
+            v_id = 1;
+        }else {
+            v_id = 0;
+        }
         if(id != null && id > 0){
-            getMapper().deleteByPrimaryKey(id);
-            //记录LOG
-            messageLogService.delete(generateMsgObj(id));
+            Map<String, Object> map = new HashMap<String, Object>();
+            map.put("v_id",v_id);
+            map.put("v_code", fundinouttype.getFt_name());
+            map.put("v_type","fund");
+            map.put("v_companyid",BaseContextHolder.getCompanyId());
+            map.put("v_res","");
+            fundinouttypeMapper.check(map);
+            Object result =  map.get("v_res");
+            if(!StringUtils.isEmpty(result)){
+                throw new BizException(BizExceptionCode.USING_EXISTS.getCode(),result.toString());
+            }else {
+                getMapper().deleteByPrimaryKey(id);
+                //记录LOG
+                messageLogService.delete(generateMsgObj(id));
+            }
         }
         return true;
     }

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

@@ -20,6 +20,9 @@ spring:
       connection-timeout: 30000
   messages:
     basename: i18n/messages
+  redis:
+    host: 192.168.253.12
+    port: 6379
   rabbitmq:
     host: 192.168.0.176
     port: 5672

+ 11 - 0
applications/document/document-server/src/main/resources/mapper/FundinouttypeMapper.xml

@@ -167,4 +167,15 @@
           </if>
         </where>
     </select>
+
+  <select id="check" parameterMap="checkParamMap" statementType="CALLABLE">
+        CALL SP_LIMITBASE(?, ?, ?, ?,?)
+    </select>
+  <parameterMap id="checkParamMap" type="java.util.Map">
+    <parameter property="v_type" jdbcType="VARCHAR" mode="IN" />
+    <parameter property="v_id" jdbcType="INTEGER" mode="IN" />
+    <parameter property="v_code" jdbcType="VARCHAR" mode="IN" />
+    <parameter property="v_companyid" jdbcType="INTEGER" mode="IN" />
+    <parameter property="v_res" jdbcType="VARCHAR" mode="OUT" />
+  </parameterMap>
 </mapper>

+ 9 - 0
applications/money/money-server/src/main/java/com/usoftchina/saas/money/po/Fundtransfer.java

@@ -44,12 +44,21 @@ public class Fundtransfer extends CommonBaseEntity implements Serializable {
     private String ftd_paymethod;
 
     private String ftd_paycode;
+    private String ftd_remark;
 
     private String ft_auditman;
 
     private Date ft_auditdate;
 
 
+    public String getFtd_remark() {
+        return ftd_remark;
+    }
+
+    public void setFtd_remark(String ftd_remark) {
+        this.ftd_remark = ftd_remark;
+    }
+
     public String getFt_auditman() {
         return ft_auditman;
     }

+ 3 - 3
applications/money/money-server/src/main/java/com/usoftchina/saas/money/po/PaydetailView.java

@@ -25,7 +25,7 @@ public class PaydetailView {
 
     private Double mustpay;
 
-    private Long mustdate;
+    private Date mustdate;
 
     private Double pi_total;
 
@@ -129,11 +129,11 @@ public class PaydetailView {
         this.mustpay = mustpay;
     }
 
-    public Long getMustdate() {
+    public Date getMustdate() {
         return mustdate;
     }
 
-    public void setMustdate(Long mustdate) {
+    public void setMustdate(Date mustdate) {
         this.mustdate = mustdate;
     }
 

+ 5 - 8
applications/money/money-server/src/main/java/com/usoftchina/saas/money/po/RecdetailView.java

@@ -25,13 +25,17 @@ public class RecdetailView {
 
     private Double mustpay;
 
-    private Double mustdate;
+    private Date mustdate;
 
     private Double pi_total;
 
     private String pi_remark;
     private Integer companyId;
 
+    public void setMustdate(Date mustdate) {
+        this.mustdate = mustdate;
+    }
+
     public Integer getCompanyId() {
         return companyId;
     }
@@ -104,13 +108,6 @@ public class RecdetailView {
         this.mustpay = mustpay;
     }
 
-    public Double getMustdate() {
-        return mustdate;
-    }
-
-    public void setMustdate(Double mustdate) {
-        this.mustdate = mustdate;
-    }
 
     public Double getPi_total() {
         return pi_total;

+ 3 - 0
applications/money/money-server/src/main/resources/application.yml

@@ -18,6 +18,9 @@ spring:
       connection-timeout: 30000
   messages:
     basename: i18n/messages
+  redis:
+    host: 192.168.253.12
+    port: 6379
   rabbitmq:
     host: 192.168.0.176
     port: 5672

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

@@ -27,7 +27,7 @@
         and  companyId = #{companyId}
       </if>
     </where>
-    order by bankname, date, bankid desc
+    order by bankname asc, date desc, bankid desc
   </select>
 
 </mapper>

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

@@ -30,7 +30,7 @@
                 and  companyId = #{companyId}
             </if>
         </where>
-        order by pi_date desc
+        order by pi_custname asc, pi_date desc, pi_custcode desc
     </select>
 
 </mapper>

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

@@ -24,6 +24,7 @@
     <result column="ftd_nowbalance" property="ftd_nowbalance" jdbcType="DOUBLE" />
     <result column="ftd_paymethod" property="ftd_paymethod" jdbcType="VARCHAR" />
     <result column="ftd_paycode" property="ftd_paycode" jdbcType="VARCHAR" />
+    <result column="ftd_remark" property="ftd_remark" jdbcType="VARCHAR" />
     <result column="creatorName" property="creatorName" jdbcType="VARCHAR" />
     <result column="updaterName" property="updaterName" jdbcType="VARCHAR" />
     <result column="ft_auditman" property="ft_auditman" jdbcType="VARCHAR" />
@@ -37,7 +38,7 @@
     ft_auditman, ft_auditdate
   </sql>
   <sql id="Detail_Column_List" >
-    ftd_bankname,ftd_inbankname,ftd_nowbalance,ftd_paymethod,ftd_paycode
+    ftd_bankname,ftd_inbankname,ftd_nowbalance,ftd_paymethod,ftd_paycode,ftd_remark
   </sql>
   <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" >
     select 

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

@@ -13,7 +13,7 @@
     <result column="pb_pdamount" property="pb_pdamount" jdbcType="DOUBLE" />
     <result column="pb_pbdamount" property="pb_pbdamount" jdbcType="DOUBLE" />
     <result column="mustpay" property="mustpay" jdbcType="DOUBLE" />
-    <result column="mustdate" property="mustdate" jdbcType="DECIMAL" />
+    <result column="mustdate" property="mustdate" jdbcType="TIMESTAMP" />
     <result column="pi_total" property="pi_total" jdbcType="DOUBLE" />
     <result column="pi_remark" property="pi_remark" jdbcType="VARCHAR" />
     <result column="companyId" property="companyId" jdbcType="INTEGER" />
@@ -29,7 +29,7 @@
         and  companyId = #{companyId}
       </if>
     </where>
-    order by pb_date desc
+    order by pi_vendname asc, pb_date desc,pi_vendcode desc
   </select>
 
 </mapper>

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

@@ -13,7 +13,7 @@
     <result column="rb_rdamount" property="rb_rdamount" jdbcType="DOUBLE" />
     <result column="rb_rbdamount" property="rb_rbdamount" jdbcType="DOUBLE" />
     <result column="mustpay" property="mustpay" jdbcType="DOUBLE" />
-    <result column="mustdate" property="mustdate" jdbcType="DOUBLE" />
+    <result column="mustdate" property="mustdate" jdbcType="TIMESTAMP" />
     <result column="pi_total" property="pi_total" jdbcType="DOUBLE" />
     <result column="pi_remark" property="pi_remark" jdbcType="VARCHAR" />
   <result column="companyId" property="companyId" jdbcType="INTEGER" />
@@ -29,6 +29,6 @@
         and  companyId = #{companyId}
       </if>
     </where>
-    order by rb_date desc
+    order by pi_custname asc, rb_date desc, pi_custcode desc
   </select>
 </mapper>

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

@@ -32,6 +32,6 @@
         and  companyId = #{companyId}
       </if>
     </where>
-    order by pi_date desc
+    order by pi_vendname asc, pi_date desc, pi_vendcode desc
   </select>
 </mapper>

+ 14 - 0
applications/purchase/purchase-api/pom.xml

@@ -13,4 +13,18 @@
     <description>purchase server api</description>
 
 
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-openfeign</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.usoftchina.saas</groupId>
+            <artifactId>purchase-dto</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.usoftchina.saas</groupId>
+            <artifactId>core</artifactId>
+        </dependency>
+    </dependencies>
 </project>

+ 14 - 0
applications/purchase/purchase-api/src/main/java/com/usoftchina/saas/purchase/api/PurchaseService.java

@@ -0,0 +1,14 @@
+package com.usoftchina.saas.purchase.api;
+
+import com.usoftchina.saas.commons.dto.DocBaseDTO;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+
+@FeignClient("purchase-server")
+public interface PurchaseService {
+
+    @PostMapping("/purchase/getPurchaseCode")
+    public String getPurchaseCode(@RequestBody DocBaseDTO baseDTO);
+
+}

+ 4 - 0
applications/purchase/purchase-server/src/main/java/com/usoftchina/saas/purchase/controller/PurchaseController.java

@@ -174,4 +174,8 @@ public class PurchaseController {
         return purchaseService.turnProdin(id);
     }
 
+    @PostMapping("/getPurchaseCode")
+    public String getPurchaseCode(@RequestBody DocBaseDTO baseDTO) {
+        return purchaseService.getPurchaseCode(baseDTO);
+    }
 }

+ 2 - 0
applications/purchase/purchase-server/src/main/java/com/usoftchina/saas/purchase/po/PurchaseDetail.java

@@ -42,6 +42,8 @@ public class PurchaseDetail extends CommonBaseEntity implements Serializable {
 
     private Integer pd_saledetno;
 
+    private Long pd_saleid;
+
     private Integer pd_sdid;
 
     private String pd_text1;

+ 1 - 1
applications/purchase/purchase-server/src/main/java/com/usoftchina/saas/purchase/service/PurchaseService.java

@@ -136,5 +136,5 @@ public interface PurchaseService extends CommonBaseService<PurchaseMapper, Purch
      */
     Result turnProdin(Long id);
 
-
+    String getPurchaseCode(DocBaseDTO baseDTO);
 }

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

@@ -438,7 +438,6 @@ public class ProdInOutServiceImpl extends CommonBaseServiceImpl<ProdInOutMapper,
         targetPi.setPi_date(new Date());
         targetPi.setPi_status("未审核");
         targetPi.setPi_statuscode("UNAUDITED");
-        targetPi.setPi_recorddate(new Date());
         targetPi.setPi_vendid(sourcePi.getPi_vendid());
         targetPi.setPi_vendcode(sourcePi.getPi_vendcode());
         targetPi.setPi_vendname(sourcePi.getPi_vendname());

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

@@ -594,7 +594,13 @@ public class PurchaseServiceImpl extends CommonBaseServiceImpl<PurchaseMapper, P
         }
         return billCode;
     }
-    
+
+    @Override
+    public String getPurchaseCode(DocBaseDTO baseDTO) {
+       String caller = baseDTO.getName();
+       String code = maxnumberService.getMaxnumber(caller, false).getData();
+       return pushMaxnubmer(code, baseDTO.getId());
+    }
     /** 
     * @Description
     * @Param: [id]

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

@@ -47,7 +47,7 @@ eureka:
   client:
     registryFetchIntervalSeconds: 5
     serviceUrl:
-      defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@192.168.0.181:8510/eureka/
+      defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@localhost:8500/eureka/
 management:
   endpoints:
     web:

+ 2 - 0
applications/sale/sale-dto/src/main/java/com/usoftchina/saas/sale/dto/PurchaseDetailDTO.java

@@ -42,6 +42,8 @@ public class PurchaseDetailDTO extends CommonBaseEntity implements Serializable
 
     private Integer pd_saledetno;
 
+    private Long pd_saleid;
+
     private Integer pd_sdid;
 
     private String pd_text1;

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

@@ -88,6 +88,10 @@
             <groupId>com.usoftchina.saas</groupId>
             <artifactId>commons-api</artifactId>
         </dependency>
+        <dependency>
+            <groupId>com.usoftchina.saas</groupId>
+            <artifactId>purchase-api</artifactId>
+        </dependency>
     </dependencies>
 
     <build>

+ 10 - 2
applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/controller/SaleReportController.java

@@ -10,6 +10,8 @@ import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.Map;
+
 /**
  * @author: guq
  * @create: 2018-11-09 11:23
@@ -23,13 +25,19 @@ public class SaleReportController {
 
     @GetMapping("/saleProfit")
     public Result SaleProfit(PageRequest page, ListReqDTO req) {
-        PageInfo listData = saleReportService.getSaleProfitData(page, req);
+        Map<String, Object> listData = saleReportService.getSaleProfitData(page, req);
         return Result.success(listData);
     }
 
     @GetMapping("/saleRec")
     public Result SaleRec(PageRequest page, ListReqDTO req) {
-        PageInfo listData = saleReportService.getSaleRecData(page, req);
+        Map<String, Object> listData = saleReportService.getSaleRecData(page, req);
+        return Result.success(listData);
+    }
+
+    @GetMapping("/saleDetail")
+    public Result saleDetail(PageRequest page, ListReqDTO req) {
+        Map<String, Object> listData = saleReportService.getSaleDetail(page, req);
         return Result.success(listData);
     }
 

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

@@ -12,4 +12,6 @@ public interface SaleListMapper {
 
     List<SaleList> selectSaleByCondition(@Param("con") String con, @Param("companyId") Long companyId);
 
+    String selectCalculateFields(@Param("fields") String fields, @Param("con") String con, @Param("companyId") Long companyId);
+
 }

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

@@ -50,4 +50,6 @@ public interface SaleMapper extends CommonBaseMapper<Sale> {
     void turnPurchaseDetail(List<PurchaseDetailDTO> list);
 
     Integer selectPurchaseId(@Param("code") String code,@Param("companyid") Long companyid);
+
+    String checkIsTurnPurchase(@Param("id") Long id,@Param("companyid") Long companyid);
 }

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

@@ -8,4 +8,6 @@ import java.util.List;
 public interface SaleProfitViewMapper {
 
     List<SaleProfitView> selectByCondition(@Param("con") String con, @Param("companyId") Long companyId);
+
+    String selectCalculateFields(@Param("fields") String fields, @Param("con") String con, @Param("companyId") Long companyId);
 }

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

@@ -8,4 +8,6 @@ import java.util.List;
 public interface SalerecViewMapper {
 
     List<SalerecView> selectByCondition(@Param("con") String con, @Param("companyId") Long companyId);
+
+    String selectCalculateFields(@Param("fields") String fields, @Param("con") String con, @Param("companyId") Long companyId);
 }

+ 6 - 4
applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/service/SaleReportService.java

@@ -1,12 +1,14 @@
 package com.usoftchina.saas.sale.service;
 
-import com.github.pagehelper.PageInfo;
 import com.usoftchina.saas.commons.dto.ListReqDTO;
 import com.usoftchina.saas.page.PageRequest;
-import com.usoftchina.saas.sale.po.report.SalerecView;
+
+import java.util.Map;
 
 public interface SaleReportService {
-    PageInfo getSaleProfitData(PageRequest page, ListReqDTO req);
+    Map<String, Object> getSaleProfitData(PageRequest page, ListReqDTO req);
+
+    Map<String, Object> getSaleRecData(PageRequest page, ListReqDTO req);
 
-    PageInfo getSaleRecData(PageRequest page, ListReqDTO req);
+    Map<String, Object> getSaleDetail(PageRequest page, ListReqDTO req);
 }

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

@@ -381,6 +381,7 @@ public class ProdInOutServiceImpl extends CommonBaseServiceImpl<ProdInOutMapper,
         double pdYqty=0;
         double pdSendPrice = 0.0;
         double pdTaxrate = 0.0;
+        DocBaseDTO baseDTO = new DocBaseDTO();
         ProdInOut sourcePi = checkAndReturnOrder(id);
         List<ProdIODetail> sourceDetails =prodIODetailMapper.selectByFK(id);
         if (null == sourcePi || StringUtils.isEmpty(sourcePi.getPi_inoutno()) || sourceDetails.size() == 0) {
@@ -481,8 +482,12 @@ public class ProdInOutServiceImpl extends CommonBaseServiceImpl<ProdInOutMapper,
         setTotal(targetPi);
 
         //日志记录
-        DocBaseDTO baseDTO = new DocBaseDTO(id, sourcePi.getPi_inoutno(), BillCodeSeq.SALEIN.getCaller());
-        messageLogService.customizeLog(baseDTO, Operation.TURNPRODOUTRETURN);
+        DocBaseDTO log = new DocBaseDTO(id, sourcePi.getPi_inoutno(), BillCodeSeq.SALEIN.getCaller());
+        messageLogService.customizeLog(log, Operation.TURNPRODOUTRETURN);
+
+        baseDTO.setId(pi_id);
+        baseDTO.setCode(piInoutno);
+        baseDTO.setName(BillCodeSeq.SALEIN.getName());
         return baseDTO;
 
     }

+ 74 - 17
applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/service/impl/SaleReportServiceImpl.java

@@ -1,18 +1,23 @@
 package com.usoftchina.saas.sale.service.impl;
 
+import com.alibaba.fastjson.JSONArray;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
 import com.usoftchina.saas.commons.dto.ListReqDTO;
 import com.usoftchina.saas.context.BaseContextHolder;
 import com.usoftchina.saas.page.PageDefault;
 import com.usoftchina.saas.page.PageRequest;
+import com.usoftchina.saas.sale.mapper.SaleListMapper;
 import com.usoftchina.saas.sale.mapper.SaleProfitViewMapper;
 import com.usoftchina.saas.sale.mapper.SalerecViewMapper;
 import com.usoftchina.saas.sale.service.SaleReportService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
 
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 /**
  * @author: guq
@@ -25,38 +30,90 @@ public class SaleReportServiceImpl implements SaleReportService{
     private SaleProfitViewMapper saleProfitViewMapper;
     @Autowired
     private SalerecViewMapper salerecViewMapper;
+    @Autowired
+    private SaleListMapper saleListMapper;
 
     @Override
-    public PageInfo getSaleProfitData(PageRequest page, ListReqDTO req) {
-        return getListDATA(page, req, "SaleProfit");
+    public Map<String, Object> getSaleProfitData(@PageDefault(size = 10) PageRequest page, ListReqDTO req) {
+        PageHelper.startPage(page.getNumber(), page.getSize());
+        Map<String, Object> map = new HashMap<String, Object>();
+        List list = null;
+        Long companyId = BaseContextHolder.getCompanyId();
+        String con = req.getFinalCondition();
+        String calculateFieldsSql = req.getCalculateFieldsSql();
+        JSONArray arr = null;
+        if (null == con) {
+            con = "1=1";
+        }
+        list = saleProfitViewMapper.selectByCondition(con, companyId);
+        //取分页信息
+        PageInfo pageInfo = new PageInfo(list);
+        //取对应计算数据
+        if (!StringUtils.isEmpty(calculateFieldsSql)) {
+            String res = saleProfitViewMapper.selectCalculateFields(calculateFieldsSql, con, companyId);
+            try {
+                arr = JSONArray.parseArray(res);
+            } catch (Exception e) {
+            }
+        }
+        map.put("list", pageInfo);
+        map.put("calculate", arr);
+        return map;
     }
 
     @Override
-    public PageInfo getSaleRecData(PageRequest page, ListReqDTO req) {
-        return getListDATA(page, req, "SaleRec");
-    }
-
-    private PageInfo getListDATA(@PageDefault(size = 10) PageRequest page, ListReqDTO req, String type) {
+    public Map<String, Object> getSaleRecData(@PageDefault(size = 10) PageRequest page, ListReqDTO req) {
         PageHelper.startPage(page.getNumber(), page.getSize());
-        //查询数据
-        List lists = getListByType(req, type);
+        Map<String, Object> map = new HashMap<String, Object>();
+        List list = null;
+        Long companyId = BaseContextHolder.getCompanyId();
+        String con = req.getFinalCondition();
+        String calculateFieldsSql = req.getCalculateFieldsSql();
+        JSONArray arr = null;
+        if (null == con) {
+            con = "1=1";
+        }
+        list = salerecViewMapper.selectByCondition(con, companyId);
         //取分页信息
-        PageInfo pageInfo = new PageInfo(lists);
-        return pageInfo;
+        PageInfo pageInfo = new PageInfo(list);
+        //取对应计算数据
+        if (!StringUtils.isEmpty(calculateFieldsSql)) {
+            String res = salerecViewMapper.selectCalculateFields(calculateFieldsSql, con, companyId);
+            try {
+                arr = JSONArray.parseArray(res);
+            } catch (Exception e) {
+            }
+        }
+        map.put("list", pageInfo);
+        map.put("calculate", arr);
+        return map;
     }
 
-    private List getListByType(ListReqDTO req, String type) {
+    @Override
+    public Map<String, Object> getSaleDetail(@PageDefault(size = 10) PageRequest page, ListReqDTO req) {
+        PageHelper.startPage(page.getNumber(), page.getSize());
+        Map<String, Object> map = new HashMap<String, Object>();
         List list = null;
         Long companyId = BaseContextHolder.getCompanyId();
         String con = req.getFinalCondition();
+        String calculateFieldsSql = req.getCalculateFieldsSql();
+        JSONArray arr = null;
         if (null == con) {
             con = "1=1";
         }
-        if ("SaleProfit".equals(type)) {
-            list = saleProfitViewMapper.selectByCondition(con, companyId);
-        } else if ("SaleRec".equals(type)){
-            list = salerecViewMapper.selectByCondition(con, companyId);
+        list = saleListMapper.selectSaleListByCondition(con, companyId);
+        //取分页信息
+        PageInfo pageInfo = new PageInfo(list);
+        //取对应计算数据
+        if (!StringUtils.isEmpty(calculateFieldsSql)) {
+            String res = saleListMapper.selectCalculateFields(calculateFieldsSql, con, companyId);
+            try {
+                arr = JSONArray.parseArray(res);
+            } catch (Exception e) {
+            }
         }
-        return list;
+        map.put("list", pageInfo);
+        map.put("calculate", arr);
+        return map;
     }
 }

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

@@ -19,6 +19,7 @@ import com.usoftchina.saas.document.entities.Product;
 import com.usoftchina.saas.exception.BizException;
 import com.usoftchina.saas.page.PageDefault;
 import com.usoftchina.saas.page.PageRequest;
+import com.usoftchina.saas.purchase.api.PurchaseService;
 import com.usoftchina.saas.sale.dto.*;
 import com.usoftchina.saas.sale.mapper.*;
 import com.usoftchina.saas.sale.po.Sale;
@@ -29,6 +30,7 @@ import com.usoftchina.saas.sale.service.SaleService;
 import com.usoftchina.saas.storage.po.ProdIODetail;
 import com.usoftchina.saas.storage.po.ProdInOut;
 import com.usoftchina.saas.utils.BeanMapper;
+import io.swagger.models.auth.In;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -61,6 +63,8 @@ public class SaleServiceImpl implements SaleService{
     private ProdInOutService prodInOutService;
     @Autowired
     private CommonService commonService;
+    @Autowired
+    private PurchaseService purchaseService;
 
     @Override
     public PageInfo<SaleList> getListData(@PageDefault(size = 10) PageRequest page, ListReqDTO req) {
@@ -285,6 +289,12 @@ public class SaleServiceImpl implements SaleService{
         if (num > 0) {
             throw new BizException(BizExceptionCode.SALEOUT_UNAUDIT_ERROR);
         }
+        //检查是否转采购订单
+        String purchaseCode = saleMapper.checkIsTurnPurchase(id,BaseContextHolder.getCompanyId());
+        if (purchaseCode != null && purchaseCode.length()>0){
+            throw new BizException(BizExceptionCode.SALE_EXISTS_PURCHASE.getCode(),
+                    String.format(BizExceptionCode.SALE_EXISTS_PURCHASE.getMessage(),purchaseCode));
+        }
         singleUnAudit(id);
     }
 
@@ -404,6 +414,7 @@ public class SaleServiceImpl implements SaleService{
         Integer count = 0;
         double pdQty = 0;
         double pdYqty = 0;
+        DocBaseDTO baseDTO = new DocBaseDTO();
         Long companyId = BaseContextHolder.getCompanyId();
         Sale sale = saleMapper.selectByPrimaryKey(id);
         List<SaleDetail> details = saledetailMapper.selectByFK(id);
@@ -478,7 +489,7 @@ public class SaleServiceImpl implements SaleService{
             //获取物料默认仓库
             Map<String, Object> warehouse = getWareHouseByCode(saleDetail.getSd_prodcode());
             if (null != warehouse) {
-                prodIODetail.setPd_whid(warehouse.get("pr_whid") == null ? 0 : Integer.valueOf(warehouse.get("pr_whid").toString()));
+                prodIODetail.setPd_whid(warehouse.get("pr_whid") == null ? 0 : Long.valueOf(warehouse.get("pr_whid").toString()));
                 prodIODetail.setPd_whcode(warehouse.get("pr_whcode") == null ? null : warehouse.get("pr_whcode").toString());
                 prodIODetail.setPd_whname(warehouse.get("pr_whname") == null ? null : warehouse.get("pr_whname").toString());
             }
@@ -492,8 +503,12 @@ public class SaleServiceImpl implements SaleService{
         prodIODetailMapper.updatePDSaleOut(pi_id);
         prodInOutMapper.updatePiTotal(pi_id);
         //日志记录
-        DocBaseDTO baseDTO = new DocBaseDTO(id, sale.getSa_code(), BillCodeSeq.SALEOUT.getCaller());
-        messageLogService.customizeLog(baseDTO, Operation.TURNPRODOUT);
+        DocBaseDTO log = new DocBaseDTO(id, sale.getSa_code(), BillCodeSeq.SALEOUT.getCaller());
+        messageLogService.customizeLog(log, Operation.TURNPRODOUT);
+
+        baseDTO.setId(pi_id);
+        baseDTO.setCode(pi_inoutno);
+        baseDTO.setName(BillCodeSeq.SALEOUT.getName());
         return baseDTO;
     }
 
@@ -529,12 +544,22 @@ public class SaleServiceImpl implements SaleService{
         Sale sale = saleMapper.selectByPrimaryKey(id);
         List<SaleList> dateilList = saleListMapper.selectSaleListByCondition("sa_id="+id,BaseContextHolder.getCompanyId());
 
+        //判断是否已转采购单
+        String purchaseCode = saleMapper.checkIsTurnPurchase(id,BaseContextHolder.getCompanyId());
+        if (purchaseCode != null && purchaseCode.length()>0){
+            throw new BizException(BizExceptionCode.SALE_EXISTS_PURCHASE.getCode(),
+                    String.format(BizExceptionCode.SALE_EXISTS_PURCHASE.getMessage(),purchaseCode));
+        }
+
         PurchaseDTO purchase = new PurchaseDTO();
         List<PurchaseDetailDTO> listPurchaseDetail = new ArrayList<PurchaseDetailDTO>();
-
+        DocBaseDTO baseDTO = new DocBaseDTO();
         //销售主表转采购主表
-        Result<String> result = maxnumberService.getMaxnumber(BillCodeSeq.PURCHASE.getCaller(),false);
-        purchase.setPu_code(result.getData());
+       // Result<String> result = maxnumberService.getMaxnumber(BillCodeSeq.PURCHASE.getCaller(),false);
+        baseDTO.setId(0l);
+        baseDTO.setName(BillCodeSeq.PURCHASE.getCaller());
+        String result = purchaseService.getPurchaseCode(baseDTO);
+        purchase.setPu_code(result);
         purchase.setPu_status(Status.UNAUDITED.getDisplay());
         purchase.setPu_statuscode(Status.UNAUDITED.toString());
         purchase.setCompanyId(BaseContextHolder.getCompanyId());
@@ -545,35 +570,31 @@ public class SaleServiceImpl implements SaleService{
 
         Long purchaseId = purchase.getId();
         for (SaleList detail : dateilList){
-            PurchaseDetailDTO purchaseDetailDTO = new PurchaseDetailDTO();
+            PurchaseDetailDTO purchaseDetail = new PurchaseDetailDTO();
             Double taxPrice = detail.getPr_purcprice()==null?new Double(0):Double.valueOf(detail.getPr_purcprice());
             Double taxrate = detail.getSd_taxrate()==null?new Double(0):detail.getSd_taxrate();
             Double qty = detail.getSd_qty()==null?new Double(0):detail.getSd_qty();
-            purchaseDetailDTO.setPd_prodid(Long.valueOf(String.valueOf(detail.getSd_prodid())));
-            purchaseDetailDTO.setPd_prodcode(detail.getSd_prodcode());
-            purchaseDetailDTO.setPd_detno(detail.getSd_detno());
-            purchaseDetailDTO.setPd_qty(detail.getSd_qty());
-            purchaseDetailDTO.setPd_price(taxPrice/(1+taxrate));
-            purchaseDetailDTO.setPd_salecode(sale.getSa_code());
-            purchaseDetailDTO.setPd_saledetno(detail.getSd_detno());
-            purchaseDetailDTO.setPd_taxrate(taxrate);
-            purchaseDetailDTO.setPd_taxprice(taxPrice);
-            purchaseDetailDTO.setPd_taxtotal(taxPrice*qty);
-            purchaseDetailDTO.setCompanyId(BaseContextHolder.getCompanyId());
-            purchaseDetailDTO.setCreatorId(BaseContextHolder.getUserId());
-            purchaseDetailDTO.setCreateTime(new Date());
-            purchaseDetailDTO.setCreatorName(BaseContextHolder.getUserName());
-            purchaseDetailDTO.setPd_puid(purchaseId);
-            purchaseDetailDTO.setPd_code(result.getData());
-            listPurchaseDetail.add(purchaseDetailDTO);
+            purchaseDetail.setPd_prodid(Long.valueOf(String.valueOf(detail.getSd_prodid())));
+            purchaseDetail.setPd_prodcode(detail.getSd_prodcode());
+            purchaseDetail.setPd_detno(detail.getSd_detno());
+            purchaseDetail.setPd_qty(detail.getSd_qty());
+            purchaseDetail.setPd_price(taxPrice/(1+taxrate));
+            purchaseDetail.setPd_salecode(sale.getSa_code());
+            purchaseDetail.setPd_saledetno(detail.getSd_detno());
+            purchaseDetail.setPd_saleid(sale.getId());
+            purchaseDetail.setPd_taxrate(taxrate);
+            purchaseDetail.setPd_taxprice(taxPrice);
+            purchaseDetail.setPd_taxtotal(taxPrice*qty);
+            purchaseDetail.setCompanyId(BaseContextHolder.getCompanyId());
+            purchaseDetail.setCreatorId(BaseContextHolder.getUserId());
+            purchaseDetail.setCreateTime(new Date());
+            purchaseDetail.setCreatorName(BaseContextHolder.getUserName());
+            purchaseDetail.setPd_puid(purchaseId);
+            purchaseDetail.setPd_code(result);
+            listPurchaseDetail.add(purchaseDetail);
         }
-
         saleMapper.turnPurchaseDetail(listPurchaseDetail);
-
-
-
-        DocBaseDTO baseDTO = new DocBaseDTO();
-        baseDTO.setCode(result.getData());
+        baseDTO.setCode(result);
         baseDTO.setId(Long.valueOf(String.valueOf(purchaseId)));
         baseDTO.setName(BillCodeSeq.PURCHASE.getName());
         return baseDTO;

+ 12 - 0
applications/sale/sale-server/src/main/resources/mapper/SaleListMapper.xml

@@ -108,4 +108,16 @@
         order by sa_id desc
     </select>
 
+    <select id="selectCalculateFields" resultType="string">
+        select  ${fields}  from sale left join saledetail on sa_id=sd_said left join product
+        on sd_prodid = pr_id and sale.companyId = product.companyid
+        <where>
+            <if test="con != null">
+                ${con}
+            </if>
+            <if test="companyId != null">
+                and   sale.companyId = #{companyId}
+            </if>
+        </where>
+    </select>
 </mapper>

+ 9 - 3
applications/sale/sale-server/src/main/resources/mapper/SaleMapper.xml

@@ -421,7 +421,13 @@
   <update id="updateCreator">
     update sale set creatorId = #{userId} , creatorName=#{userName} where sa_id=#{id}
   </update>
-  
+
+  <select id="checkIsTurnPurchase"  resultType="java.lang.String">
+    select distinct pu_code from purchasedetail left join purchase on pd_puid=pu_id and
+    purchasedetail.companyid = purchase.companyid
+    where pd_saleid = #{id}
+    and purchasedetail.companyid= #{companyid}
+  </select>
   
   
   <!-- 销售订单转采购单-->
@@ -633,7 +639,7 @@
     PD_DETNO, PD_PRODID, PD_PRODCODE,
     PD_UNIT, PD_QTY, PD_PRICE,PD_TAXPRICE,
     PD_TOTAL,PD_TAXRATE, PD_TAXTOTAL, PD_ACCEPTQTY,
-    PD_DELIVERY, PD_SALECODE, PD_SALEDETNO,
+    PD_DELIVERY, PD_SALECODE, PD_SALEDETNO,PD_SALEID,
     PD_SDID, companyId, updaterId,
     updateTime, pd_text1, pd_text2,
     pd_text3, pd_text4, pd_text5,
@@ -645,7 +651,7 @@
       #{item.pd_detno,jdbcType=INTEGER}, #{item.pd_prodid,jdbcType=INTEGER}, #{item.pd_prodcode,jdbcType=VARCHAR},
       #{item.pd_unit,jdbcType=VARCHAR}, #{item.pd_qty,jdbcType=DOUBLE}, #{item.pd_price,jdbcType=DOUBLE},#{item.pd_taxprice,jdbcType=DOUBLE},
       #{item.pd_total,jdbcType=DOUBLE},#{item.pd_taxrate,jdbcType=DOUBLE}, #{item.pd_taxtotal,jdbcType=DOUBLE}, #{item.pd_acceptqty,jdbcType=DOUBLE},
-      #{item.pd_delivery,jdbcType=DOUBLE}, #{item.pd_salecode,jdbcType=VARCHAR}, #{item.pd_saledetno,jdbcType=INTEGER},
+      #{item.pd_delivery,jdbcType=DOUBLE}, #{item.pd_salecode,jdbcType=VARCHAR}, #{item.pd_saledetno,jdbcType=INTEGER},#{item.pd_saleid,jdbcType=INTEGER},
       #{item.pd_sdid,jdbcType=INTEGER}, #{item.companyId,jdbcType=INTEGER}, #{item.updaterId,jdbcType=INTEGER},
       #{item.updateTime,jdbcType=TIMESTAMP}, #{item.pd_text1,jdbcType=VARCHAR}, #{item.pd_text2,jdbcType=VARCHAR},
       #{item.pd_text3,jdbcType=VARCHAR}, #{item.pd_text4,jdbcType=VARCHAR}, #{item.pd_text5,jdbcType=VARCHAR},

+ 12 - 0
applications/sale/sale-server/src/main/resources/mapper/SaleProfitViewMapper.xml

@@ -39,4 +39,16 @@
     </where>
     order by sa_date desc
   </select>
+
+  <select id="selectCalculateFields" resultType="string">
+    select   ${fields}  from Sale_Profit_View
+    <where>
+      <if test="con != null">
+        ${con}
+      </if>
+      <if test="companyId != null">
+        and  companyId = #{companyId}
+      </if>
+    </where>
+  </select>
  </mapper>

+ 12 - 0
applications/sale/sale-server/src/main/resources/mapper/SalerecViewMapper.xml

@@ -29,4 +29,16 @@
     </where>
     order by rb_date desc
   </select>
+
+  <select id="selectCalculateFields" resultType="string">
+    select   ${fields}  from Salerec_View
+    <where>
+      <if test="con != null">
+        ${con}
+      </if>
+      <if test="companyId != null">
+        and  companyId = #{companyId}
+      </if>
+    </where>
+  </select>
 </mapper>

+ 1 - 1
applications/storage/storage-dto/src/main/java/com/usoftchina/saas/storage/dto/ProdIODetailDTO.java

@@ -49,7 +49,7 @@ public class ProdIODetailDTO extends CommonBaseDTO implements Serializable {
 
     private Double pd_nettotal;
 
-    private Integer pd_whid;
+    private Long pd_whid;
 
     private String pd_whcode;
 

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

@@ -30,7 +30,7 @@ public class Make extends CommonBaseEntity implements Serializable {
 
     private Double ma_qty;
 
-    private Integer ma_whid;
+    private Long ma_whid;
 
     private String ma_whcode;
 

+ 3 - 121
applications/storage/storage-dto/src/main/java/com/usoftchina/saas/storage/po/MakeMaterial.java

@@ -2,16 +2,16 @@ package com.usoftchina.saas.storage.po;
 
 import com.usoftchina.saas.base.entity.CommonBaseEntity;
 import com.usoftchina.saas.document.dto.ProductDTO;
-import com.usoftchina.saas.document.entities.Product;
+import lombok.Data;
 
 import java.io.Serializable;
-import java.util.Date;
 
 /**
  * 制造单明细
  * @author chenwei
  * @date 2018/10/29
  */
+@Data
 public class MakeMaterial extends CommonBaseEntity implements Serializable {
     private Long mm_maid;
 
@@ -21,7 +21,7 @@ public class MakeMaterial extends CommonBaseEntity implements Serializable {
 
     private String mm_prodcode;
 
-    private Integer mm_whid;
+    private Long mm_whid;
 
     private String mm_whcode;
 
@@ -41,123 +41,5 @@ public class MakeMaterial extends CommonBaseEntity implements Serializable {
 
     private ProductDTO productDTO;
 
-    public String getMm_whname() {
-        return mm_whname;
-    }
 
-    public void setMm_whname(String mm_whname) {
-        this.mm_whname = mm_whname;
-    }
-
-    public ProductDTO getProductDTO() {
-        return productDTO;
-    }
-
-    public void setProductDTO(ProductDTO productDTO) {
-        this.productDTO = productDTO;
-    }
-
-    public Long getMm_maid() {
-        return mm_maid;
-    }
-
-    public void setMm_maid(Long mm_maid) {
-        this.mm_maid = mm_maid;
-    }
-
-    public Integer getMm_detno() {
-        return mm_detno;
-    }
-
-    public void setMm_detno(Integer mm_detno) {
-        this.mm_detno = mm_detno;
-    }
-
-    public Long getMm_prodid() {
-        return mm_prodid;
-    }
-
-    public void setMm_prodid(Long mm_prodid) {
-        this.mm_prodid = mm_prodid;
-    }
-
-    public String getMm_prodcode() {
-        return mm_prodcode;
-    }
-
-    public void setMm_prodcode(String mm_prodcode) {
-        this.mm_prodcode = mm_prodcode == null ? null : mm_prodcode.trim();
-    }
-
-    public Integer getMm_whid() {
-        return mm_whid;
-    }
-
-    public void setMm_whid(Integer mm_whid) {
-        this.mm_whid = mm_whid;
-    }
-
-    public String getMm_whcode() {
-        return mm_whcode;
-    }
-
-    public void setMm_whcode(String mm_whcode) {
-        this.mm_whcode = mm_whcode == null ? null : mm_whcode.trim();
-    }
-
-    public Double getMm_price() {
-        return mm_price;
-    }
-
-    public void setMm_price(Double mm_price) {
-        this.mm_price = mm_price;
-    }
-
-    public Double getMm_oneuseqty() {
-        return mm_oneuseqty;
-    }
-
-    public void setMm_oneuseqty(Double mm_oneuseqty) {
-        this.mm_oneuseqty = mm_oneuseqty;
-    }
-
-    public Double getMm_qty() {
-        return mm_qty;
-    }
-
-    public void setMm_qty(Double mm_qty) {
-        this.mm_qty = mm_qty;
-    }
-
-    public Double getMm_amount() {
-        return mm_amount;
-    }
-
-    public void setMm_amount(Double mm_amount) {
-        this.mm_amount = mm_amount;
-    }
-
-    public String getMm_repprodcode() {
-        return mm_repprodcode;
-    }
-
-    public void setMm_repprodcode(String mm_repprodcode) {
-        this.mm_repprodcode = mm_repprodcode == null ? null : mm_repprodcode.trim();
-    }
-
-    public String getMm_remark() {
-        return mm_remark;
-    }
-
-    public void setMm_remark(String mm_remark) {
-        this.mm_remark = mm_remark == null ? null : mm_remark.trim();
-    }
-
-    public Date getUpdateTime() {
-        return updateTime;
-    }
-
-    public void setUpdateTime(Date updateTime) {
-        this.updateTime = updateTime;
-    }
 }

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

@@ -45,13 +45,13 @@ public class ProdIODetail extends CommonBaseEntity implements Serializable {
 
     private Double pd_nettotal;
 
-    private Integer pd_whid;
+    private Long pd_whid;
 
     private String pd_whcode;
 
     private String pd_whname;
 
-    private Integer pd_inwhid;
+    private Long pd_inwhid;
 
     private String pd_inwhcode;
 

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

@@ -7,7 +7,7 @@ import java.io.Serializable;
 @Data
 public class StockTaking extends CommonBaseEntity implements Serializable {
 
-    private Integer st_prodid;
+    private Long st_prodid;
 
     private String st_prodcode;
 
@@ -19,7 +19,7 @@ public class StockTaking extends CommonBaseEntity implements Serializable {
 
     private String st_produnit;
 
-    private Integer st_whid;
+    private Long st_whid;
 
     private String st_whcode;
 

+ 28 - 2
applications/storage/storage-server/src/main/java/com/usoftchina/saas/storage/controller/StocktakingController.java

@@ -12,6 +12,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
+import java.util.Map;
 
 @RestController
 @RequestMapping("/stocktaking")
@@ -22,6 +23,17 @@ public class StocktakingController {
     @Autowired
     private StocktakingService stocktakingService;
 
+    /**
+     * 生成临时表数据
+     * @param page
+     * @param listReqDTO
+     * @return
+     */
+    @PostMapping("/build")
+    public Result buildListDataByCondition(@RequestBody ListReqDTO listReqDTO){
+        stocktakingService.buildListDataByCondition(listReqDTO);
+        return Result.success();
+    }
 
 
     /**
@@ -35,8 +47,11 @@ public class StocktakingController {
         return Result.success(stocktakingService.getList(page, listReqDTO));
     }
 
-
-
+    /**
+     * 保存
+     * @param list
+     * @return
+     */
     @PostMapping("/save")
     public Result save(@RequestBody List<StockTakingDTO> list){
         DocBaseDTO docBaseDTO = stocktakingService.saveOrUpdate(list);
@@ -44,6 +59,17 @@ public class StocktakingController {
     }
 
 
+    /**
+     * 生成盘点单据
+     * @param list
+     * @return
+     */
+    @GetMapping("/stock")
+    public Result stock(){
+        Map<String,Object> map = stocktakingService.stock();
+        return Result.success(map);
+    }
+
 
 
 }

+ 1 - 1
applications/storage/storage-server/src/main/java/com/usoftchina/saas/storage/mapper/MakeMapper.java

@@ -26,7 +26,7 @@ public interface MakeMapper extends CommonBaseMapper<Make> {
 
     int validateCodeWhenUpdate(@Param("code") String code, @Param("id") Long id, @Param("companyId") Long company);
 
-    Double getOnHand(@Param("prodid") Long prodid, @Param("whid") Integer whid, @Param("companyId") Long companyId);
+    Double getOnHand(@Param("prodid") Long prodid, @Param("whid") Long whid, @Param("companyId") Long companyId);
 
     ProdInOut selectMakeInOutCode(@Param("code") String code, @Param("companyId") Long companyId, @Param("type") String type);
 

+ 7 - 1
applications/storage/storage-server/src/main/java/com/usoftchina/saas/storage/mapper/StockTakingMapper.java

@@ -15,5 +15,11 @@ public interface StockTakingMapper extends CommonBaseMapper<StockTaking> {
 
     int updateByPrimaryKeySelective(StockTaking record);
 
-    List<StockTaking> selectStockTakingBycondition(@Param("con") String con, @Param("companyId") Long companyId);
+    List<StockTaking> selectStockTakingBycondition(@Param("con") String con,@Param("companyId") Long companyId);
+
+    void deleteByCompany(@Param("companyId") Long companyId);
+
+    void insertFormProductWh(@Param("con") String con,@Param("companyId") Long companyId);
+
+    Double getPurcpriceByProduct(Long id);
 }

+ 5 - 0
applications/storage/storage-server/src/main/java/com/usoftchina/saas/storage/service/StocktakingService.java

@@ -11,10 +11,15 @@ import com.usoftchina.saas.storage.mapper.StockTakingMapper;
 import com.usoftchina.saas.storage.po.StockTaking;
 
 import java.util.List;
+import java.util.Map;
 
 public interface StocktakingService extends CommonBaseService<StockTakingMapper, StockTaking> {
 
     PageInfo<StockTaking>  getList(PageRequest page, ListReqDTO listReqDTO);
 
     DocBaseDTO saveOrUpdate(List<StockTakingDTO> list);
+
+    void buildListDataByCondition(ListReqDTO listReqDTO);
+
+    Map<String,Object> stock();
 }

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

@@ -3,19 +3,31 @@ package com.usoftchina.saas.storage.service.impl;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
 import com.usoftchina.saas.base.service.CommonBaseServiceImpl;
+import com.usoftchina.saas.commons.api.MaxnumberService;
 import com.usoftchina.saas.commons.dto.DocBaseDTO;
 import com.usoftchina.saas.commons.dto.ListReqDTO;
+import com.usoftchina.saas.commons.exception.BizExceptionCode;
+import com.usoftchina.saas.commons.po.BillCodeSeq;
 import com.usoftchina.saas.context.BaseContextHolder;
+import com.usoftchina.saas.exception.BizException;
 import com.usoftchina.saas.page.PageRequest;
 import com.usoftchina.saas.storage.dto.StockTakingDTO;
+import com.usoftchina.saas.storage.mapper.ProdIODetailMapper;
+import com.usoftchina.saas.storage.mapper.ProdInOutMapper;
 import com.usoftchina.saas.storage.mapper.StockTakingMapper;
+import com.usoftchina.saas.storage.po.ProdIODetail;
+import com.usoftchina.saas.storage.po.ProdInOut;
 import com.usoftchina.saas.storage.po.StockTaking;
 import com.usoftchina.saas.storage.service.StocktakingService;
 import com.usoftchina.saas.utils.BeanMapper;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.util.Date;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 /**
  * Created by zdw
@@ -24,6 +36,15 @@ import java.util.List;
 @Service
 public class StocktakingServiceImpl extends CommonBaseServiceImpl<StockTakingMapper, StockTaking> implements StocktakingService {
 
+    @Autowired
+    private MaxnumberService maxnumberService;
+    @Autowired
+    private ProdInOutMapper prodInOutMapper;
+    @Autowired
+    private ProdIODetailMapper prodIODetailMapper;
+
+
+
     @Override
     public PageInfo<StockTaking> getList(PageRequest page, ListReqDTO listReqDTO) {
         PageHelper.startPage(page.getNumber(), page.getSize());
@@ -44,14 +65,147 @@ public class StocktakingServiceImpl extends CommonBaseServiceImpl<StockTakingMap
         return baseDTO;
     }
 
-    private List<StockTaking> getList(ListReqDTO listReqDTO) {
+    @Override
+    @Transactional
+    public void buildListDataByCondition(ListReqDTO listReqDTO) {
         List<StockTaking> list = null;
         Long companyId = BaseContextHolder.getCompanyId();
         String con = listReqDTO.getFinalCondition();
+        //删除该companyid的数据
+        getMapper().deleteByCompany(companyId);
         if (null == con) {
             con = "1=1";
         }
-        list = getMapper().selectStockTakingBycondition(con,companyId);
+        //查询存入临时表
+        getMapper().insertFormProductWh(con,companyId);
+    }
+
+    @Override
+    @Transactional
+    public Map<String,Object> stock() {
+        Map<String,Object> resultMap = new HashMap();
+
+        Long companyId = BaseContextHolder.getCompanyId();
+        Long userId = BaseContextHolder.getUserId();
+        //生成入库单
+        ProdInOut prodIn = new ProdInOut();
+        String piInno = getMaxnumber(BillCodeSeq.OTHERIN);
+        prodIn.setPi_inoutno(piInno);
+        prodIn.setPi_class(BillCodeSeq.OTHERIN.getName());
+        prodIn.setPi_date(new Date());
+        prodIn.setPi_status("未审核");
+        prodIn.setPi_statuscode("UNAUDITED");
+        prodIn.setCompanyId(companyId);
+        prodIn.setCreateTime(new Date());
+        prodIn.setCreatorId(userId);
+        prodIn.setPi_remark("盘盈单");
+        prodInOutMapper.insertSelective(prodIn);
+        long inid = prodIn.getId();
+
+        Double purcprice = null;
+
+        List<StockTaking> inlist  = getMapper().selectStockTakingBycondition("st_num>0",companyId);
+        for (int i=0;i<inlist.size();i++) {
+            StockTaking st = inlist.get(i);
+            ProdIODetail prodInDetail = new ProdIODetail();
+            prodInDetail.setPd_piid(inid);
+            prodInDetail.setPd_inoutno(piInno);
+            prodInDetail.setPd_piclass(BillCodeSeq.OTHERIN.getName());
+            prodInDetail.setPd_pdno(i+1);
+
+            purcprice = getMapper().getPurcpriceByProduct(st.getSt_prodid());
+            prodInDetail.setPd_orderprice(purcprice==null?0:purcprice);
+            prodInDetail.setPd_prodid(st.getSt_prodid());
+            prodInDetail.setPd_prodcode(st.getSt_prodcode());
+            prodInDetail.setPd_inqty(st.getSt_num());
+            //仓库
+            prodInDetail.setPd_whid(st.getSt_whid());
+            prodInDetail.setPd_whcode(st.getSt_whcode());
+            prodInDetail.setPd_whname(st.getSt_whname());
+            prodInDetail.setCompanyId(companyId);
+            prodInDetail.setCreateTime(new Date());
+            prodInDetail.setCreatorId(userId);
+            prodIODetailMapper.insertSelective(prodInDetail);
+        }
+
+        //生成出库单
+        ProdInOut prodOut = new ProdInOut();
+        String piOutno = getMaxnumber(BillCodeSeq.OTHEROUT);
+        prodOut.setPi_inoutno(piOutno);
+        prodOut.setPi_class(BillCodeSeq.OTHEROUT.getName());
+        prodOut.setPi_date(new Date());
+        prodOut.setPi_status("未审核");
+        prodOut.setPi_statuscode("UNAUDITED");
+        prodOut.setCompanyId(companyId);
+        prodOut.setCreateTime(new Date());
+        prodOut.setCreatorId(userId);
+        prodOut.setPi_remark("盘亏单");
+        prodInOutMapper.insertSelective(prodOut);
+        long outid = prodOut.getId();
+
+        List<StockTaking> outlist  = getMapper().selectStockTakingBycondition("st_num<0",companyId);
+        for (int i=0;i<outlist.size();i++) {
+            StockTaking st = outlist.get(i);
+            ProdIODetail prodOutDetail = new ProdIODetail();
+            prodOutDetail.setPd_piid(outid);
+            prodOutDetail.setPd_inoutno(piOutno);
+            prodOutDetail.setPd_piclass(BillCodeSeq.OTHERIN.getName());
+            prodOutDetail.setPd_pdno(i+1);
+            prodOutDetail.setPd_prodid(st.getSt_prodid());
+            prodOutDetail.setPd_prodcode(st.getSt_prodcode());
+            prodOutDetail.setPd_outqty(-st.getSt_num());
+            //仓库
+            prodOutDetail.setPd_whid(st.getSt_whid());
+            prodOutDetail.setPd_whcode(st.getSt_whcode());
+            prodOutDetail.setPd_whname(st.getSt_whname());
+            prodOutDetail.setCompanyId(companyId);
+            prodOutDetail.setCreateTime(new Date());
+            prodOutDetail.setCreatorId(userId);
+            prodIODetailMapper.insertSelective(prodOutDetail);
+        }
+        DocBaseDTO baseDTOIN = new DocBaseDTO(inid,piInno,"其它入库单");
+        DocBaseDTO baseDTOOUT = new DocBaseDTO(outid,piOutno,"其它出库单");
+        resultMap.put("inData",baseDTOIN);
+        resultMap.put("outData",baseDTOOUT);
+        return resultMap;
+    }
+
+    private List<StockTaking> getList(ListReqDTO listReqDTO) {
+        List<StockTaking> list = null;
+        Long companyId = BaseContextHolder.getCompanyId();
+        list = getMapper().selectStockTakingBycondition(null,companyId);
         return list;
     }
+
+
+    public String getMaxnumber(BillCodeSeq bill) {
+        String code = maxnumberService.getMaxnumber(bill.getCaller(), false).getData();
+        DocBaseDTO base = new DocBaseDTO(0l, code, bill.getName());
+        return pushMaxnubmer(base);
+    }
+
+    public String pushMaxnubmer(DocBaseDTO baseDTO) {
+        String pi_inoutno = baseDTO.getCode();
+        String pi_class = baseDTO.getName();
+        Long id = baseDTO.getId();
+        if (null == pi_inoutno) {
+            throw new BizException(BizExceptionCode.NULL_CODE);
+        }
+        Long companyId = BaseContextHolder.getCompanyId();
+        String billCode = null;
+        synchronized (ProdInOutServiceImpl.class) {
+            Integer count = "0".equals(String.valueOf(id)) ? prodInOutMapper.validateCodeWhenInsert(pi_inoutno, companyId) :
+                    prodInOutMapper.validateCodeWhenUpdate(pi_inoutno, id, companyId);
+            String caller ="";
+            if("其它入库单".equals(pi_class)){
+                caller = BillCodeSeq.OTHERIN.getCaller();
+            }else if("其它出库单".equals(pi_class)) {
+                caller = BillCodeSeq.OTHEROUT.getCaller();
+            }
+            billCode = maxnumberService.pushMaxnubmer(count, pi_inoutno, caller).getData();
+        }
+        return billCode;
+    }
+
+
 }

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

@@ -238,11 +238,28 @@
         ${con}
       </if>
       <if test="companyId != null">
-        and  companyId = #{companyId}
+      and companyId = #{companyId}
       </if>
+
     </where>
     order by st_id desc
   </select>
 
+  <delete id="deleteByCompany" parameterType="long">
+    delete from stocktaking
+    where companyId = #{companyId,jdbcType=INTEGER}
+  </delete>
+
+  <insert id="insertFormProductWh">
+    insert into stocktaking (st_prodid,st_prodcode,st_proddetail,st_prodorispeccode,st_prodkind,st_produnit,st_whid,st_whcode,st_whname,st_batchqty,companyId)
+    select pr_id,pr_code,pr_detail,pr_orispeccode,pr_kind,pr_unit,wh_id,wh_code,wh_description,pw_onhand,#{companyId} from productwh left join product on pw_prodid = pr_id  left join warehouse on pw_whid = wh_id
+    where productwh.companyid=#{companyId,jdbcType=INTEGER} and product.companyid =#{companyId,jdbcType=INTEGER} and warehouse.companyId=#{companyId,jdbcType=INTEGER}
+    and ${con}
+  </insert>
+
+  <select id="getPurcpriceByProduct"  resultType="double">
+    select pr_purcprice from product where pr_id = #{id}
+  </select>
+
 
 </mapper>

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

@@ -53,7 +53,7 @@ eureka:
   client:
     registryFetchIntervalSeconds: 5
     serviceUrl:
-      defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@127.0.0.1:8500/eureka/
+      defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@192.168.0.181:8510/eureka/
 server:
   port: 8580
   tomcat:

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

@@ -172,7 +172,7 @@
                 updater_id=#{updaterId,jdbcType=BIGINT},
             </if>
             <if test="updateTime != null">
-                update_time=#{updateTime,jdbcType=TIMESTAMP})
+                update_time=#{updateTime,jdbcType=TIMESTAMP}
             </if>
         </set>
         where id=#{id,jdbcType=BIGINT}

+ 4 - 0
frontend/saas-portal-web/Dockerfile

@@ -0,0 +1,4 @@
+FROM hub.c.163.com/library/nginx
+MAINTAINER USOFTCHINA <yingp@usoftchina.com>
+RUN rm /etc/nginx/conf.d/default.conf
+ADD runtime/nginx/default.conf /etc/nginx/conf.d/

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

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

+ 54 - 0
frontend/saas-portal-web/build/check-versions.js

@@ -0,0 +1,54 @@
+'use strict'
+const chalk = require('chalk')
+const semver = require('semver')
+const packageConfig = require('../package.json')
+const shell = require('shelljs')
+
+function exec (cmd) {
+  return require('child_process').execSync(cmd).toString().trim()
+}
+
+const versionRequirements = [
+  {
+    name: 'node',
+    currentVersion: semver.clean(process.version),
+    versionRequirement: packageConfig.engines.node
+  }
+]
+
+if (shell.which('npm')) {
+  versionRequirements.push({
+    name: 'npm',
+    currentVersion: exec('npm --version'),
+    versionRequirement: packageConfig.engines.npm
+  })
+}
+
+module.exports = function () {
+  const warnings = []
+
+  for (let i = 0; i < versionRequirements.length; i++) {
+    const mod = versionRequirements[i]
+
+    if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) {
+      warnings.push(mod.name + ': ' +
+        chalk.red(mod.currentVersion) + ' should be ' +
+        chalk.green(mod.versionRequirement)
+      )
+    }
+  }
+
+  if (warnings.length) {
+    console.log('')
+    console.log(chalk.yellow('To use this template, you must update following to modules:'))
+    console.log()
+
+    for (let i = 0; i < warnings.length; i++) {
+      const warning = warnings[i]
+      console.log('  ' + warning)
+    }
+
+    console.log()
+    process.exit(1)
+  }
+}

BIN
frontend/saas-portal-web/build/logo.png


+ 101 - 0
frontend/saas-portal-web/build/utils.js

@@ -0,0 +1,101 @@
+'use strict'
+const path = require('path')
+const config = require('../config')
+const ExtractTextPlugin = require('extract-text-webpack-plugin')
+const packageConfig = require('../package.json')
+
+exports.assetsPath = function (_path) {
+  const assetsSubDirectory = process.env.NODE_ENV === 'production'
+    ? config.build.assetsSubDirectory
+    : config.dev.assetsSubDirectory
+
+  return path.posix.join(assetsSubDirectory, _path)
+}
+
+exports.cssLoaders = function (options) {
+  options = options || {}
+
+  const cssLoader = {
+    loader: 'css-loader',
+    options: {
+      sourceMap: options.sourceMap
+    }
+  }
+
+  const postcssLoader = {
+    loader: 'postcss-loader',
+    options: {
+      sourceMap: options.sourceMap
+    }
+  }
+
+  // generate loader string to be used with extract text plugin
+  function generateLoaders (loader, loaderOptions) {
+    const loaders = options.usePostCSS ? [cssLoader, postcssLoader] : [cssLoader]
+
+    if (loader) {
+      loaders.push({
+        loader: loader + '-loader',
+        options: Object.assign({}, loaderOptions, {
+          sourceMap: options.sourceMap
+        })
+      })
+    }
+
+    // Extract CSS when that option is specified
+    // (which is the case during production build)
+    if (options.extract) {
+      return ExtractTextPlugin.extract({
+        use: loaders,
+        fallback: 'vue-style-loader'
+      })
+    } else {
+      return ['vue-style-loader'].concat(loaders)
+    }
+  }
+
+  // https://vue-loader.vuejs.org/en/configurations/extract-css.html
+  return {
+    css: generateLoaders(),
+    postcss: generateLoaders(),
+    less: generateLoaders('less'),
+    sass: generateLoaders('sass', { indentedSyntax: true }),
+    scss: generateLoaders('sass'),
+    stylus: generateLoaders('stylus'),
+    styl: generateLoaders('stylus')
+  }
+}
+
+// Generate loaders for standalone style files (outside of .vue)
+exports.styleLoaders = function (options) {
+  const output = []
+  const loaders = exports.cssLoaders(options)
+
+  for (const extension in loaders) {
+    const loader = loaders[extension]
+    output.push({
+      test: new RegExp('\\.' + extension + '$'),
+      use: loader
+    })
+  }
+
+  return output
+}
+
+exports.createNotifierCallback = () => {
+  const notifier = require('node-notifier')
+
+  return (severity, errors) => {
+    if (severity !== 'error') return
+
+    const error = errors[0]
+    const filename = error.file && error.file.split('!').pop()
+
+    notifier.notify({
+      title: packageConfig.name,
+      message: severity + ': ' + error.name,
+      subtitle: filename || '',
+      icon: path.join(__dirname, 'logo.png')
+    })
+  }
+}

+ 22 - 0
frontend/saas-portal-web/build/vue-loader.conf.js

@@ -0,0 +1,22 @@
+'use strict'
+const utils = require('./utils')
+const config = require('../config')
+const isProduction = process.env.NODE_ENV === 'production'
+const sourceMapEnabled = isProduction
+  ? config.build.productionSourceMap
+  : config.dev.cssSourceMap
+
+module.exports = {
+  loaders: utils.cssLoaders({
+    sourceMap: sourceMapEnabled,
+    extract: isProduction
+  }),
+  cssSourceMap: sourceMapEnabled,
+  cacheBusting: config.dev.cacheBusting,
+  transformToRequire: {
+    video: ['src', 'poster'],
+    source: 'src',
+    img: 'src',
+    image: 'xlink:href'
+  }
+}

+ 83 - 0
frontend/saas-portal-web/build/webpack.base.conf.js

@@ -0,0 +1,83 @@
+'use strict'
+const path = require('path')
+const utils = require('./utils')
+const config = require('../config')
+const vueLoaderConfig = require('./vue-loader.conf')
+
+function resolve (dir) {
+  return path.join(__dirname, '..', dir)
+}
+
+
+
+module.exports = {
+  context: path.resolve(__dirname, '../'),
+  entry: {
+    app: './src/main.js',
+    env: './config/env.js'
+  },
+  output: {
+    path: config.build.assetsRoot,
+    filename: '[name].js',
+    publicPath: process.env.NODE_ENV === 'production'
+      ? config.build.assetsPublicPath
+      : config.dev.assetsPublicPath
+  },
+  resolve: {
+    extensions: ['.js', '.vue', '.json'],
+    alias: {
+      'vue$': 'vue/dist/vue.esm.js',
+      '@': resolve('src'),
+    }
+  },
+  module: {
+    rules: [
+      {
+        test: /\.vue$/,
+        loader: 'vue-loader',
+        options: vueLoaderConfig
+      },
+      {
+        test: /\.js$/,
+        loader: 'babel-loader',
+        include: [resolve('src'), resolve('test'), resolve('node_modules/webpack-dev-server/client')]
+      },
+      {
+        test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
+        loader: 'url-loader',
+        options: {
+          limit: 10000,
+          name: utils.assetsPath('img/[name].[hash:7].[ext]')
+        }
+      },
+      {
+        test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,
+        loader: 'url-loader',
+        options: {
+          limit: 10000,
+          name: utils.assetsPath('media/[name].[hash:7].[ext]')
+        }
+      },
+      {
+        test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
+        loader: 'url-loader',
+        options: {
+          limit: 10000,
+          name: utils.assetsPath('fonts/[name].[hash:7].[ext]')
+        }
+      }
+    ]
+  },
+  node: {
+    // prevent webpack from injecting useless setImmediate polyfill because Vue
+    // source contains it (although only uses it if it's native).
+    setImmediate: false,
+    // prevent webpack from injecting mocks to Node native modules
+    // that does not make sense for the client
+    dgram: 'empty',
+    fs: 'empty',
+    net: 'empty',
+    tls: 'empty',
+    child_process: 'empty'
+  }
+}

+ 95 - 0
frontend/saas-portal-web/build/webpack.dev.conf.js

@@ -0,0 +1,95 @@
+'use strict'
+const utils = require('./utils')
+const webpack = require('webpack')
+const config = require('../config')
+const merge = require('webpack-merge')
+const path = require('path')
+const baseWebpackConfig = require('./webpack.base.conf')
+const CopyWebpackPlugin = require('copy-webpack-plugin')
+const HtmlWebpackPlugin = require('html-webpack-plugin')
+const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin')
+const portfinder = require('portfinder')
+
+const HOST = process.env.HOST
+const PORT = process.env.PORT && Number(process.env.PORT)
+
+const devWebpackConfig = merge(baseWebpackConfig, {
+  module: {
+    rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap, usePostCSS: true })
+  },
+  // cheap-module-eval-source-map is faster for development
+  devtool: config.dev.devtool,
+
+  // these devServer options should be customized in /config/index.js
+  devServer: {
+    clientLogLevel: 'warning',
+    historyApiFallback: {
+      rewrites: [
+        { from: /.*/, to: path.posix.join(config.dev.assetsPublicPath, 'index.html') },
+      ],
+    },
+    hot: true,
+    contentBase: false, // since we use CopyWebpackPlugin.
+    compress: true,
+    host: HOST || config.dev.host,
+    port: PORT || config.dev.port,
+    open: config.dev.autoOpenBrowser,
+    overlay: config.dev.errorOverlay
+      ? { warnings: false, errors: true }
+      : false,
+    publicPath: config.dev.assetsPublicPath,
+    proxy: config.dev.proxyTable,
+    quiet: true, // necessary for FriendlyErrorsPlugin
+    watchOptions: {
+      poll: config.dev.poll,
+    }
+  },
+  plugins: [
+    new webpack.DefinePlugin({
+      'process.env': require('../config/dev.env')
+    }),
+    new webpack.HotModuleReplacementPlugin(),
+    new webpack.NamedModulesPlugin(), // HMR shows correct file names in console on update.
+    new webpack.NoEmitOnErrorsPlugin(),
+    // https://github.com/ampedandwired/html-webpack-plugin
+    new HtmlWebpackPlugin({
+      filename: 'index.html',
+      template: 'index.html',
+      inject: true
+    }),
+    // copy custom static assets
+    new CopyWebpackPlugin([
+      {
+        from: path.resolve(__dirname, '../static'),
+        to: config.dev.assetsSubDirectory,
+        ignore: ['.*']
+      }
+    ])
+  ]
+})
+
+module.exports = new Promise((resolve, reject) => {
+  portfinder.basePort = process.env.PORT || config.dev.port
+  portfinder.getPort((err, port) => {
+    if (err) {
+      reject(err)
+    } else {
+      // publish the new Port, necessary for e2e tests
+      process.env.PORT = port
+      // add port to devServer config
+      devWebpackConfig.devServer.port = port
+
+      // Add FriendlyErrorsPlugin
+      devWebpackConfig.plugins.push(new FriendlyErrorsPlugin({
+        compilationSuccessInfo: {
+          messages: [`Your application is running here: http://${devWebpackConfig.devServer.host}:${port}`],
+        },
+        onErrors: config.dev.notifyOnErrors
+        ? utils.createNotifierCallback()
+        : undefined
+      }))
+
+      resolve(devWebpackConfig)
+    }
+  })
+})

+ 149 - 0
frontend/saas-portal-web/build/webpack.prod.conf.js

@@ -0,0 +1,149 @@
+'use strict'
+const path = require('path')
+const utils = require('./utils')
+const webpack = require('webpack')
+const config = require('../config')
+const merge = require('webpack-merge')
+const baseWebpackConfig = require('./webpack.base.conf')
+const CopyWebpackPlugin = require('copy-webpack-plugin')
+const HtmlWebpackPlugin = require('html-webpack-plugin')
+const ExtractTextPlugin = require('extract-text-webpack-plugin')
+const OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin')
+const UglifyJsPlugin = require('uglifyjs-webpack-plugin')
+
+const env = process.env.NODE_ENV === 'testing'
+  ? require('../config/test.env')
+  : require('../config/prod.env')
+
+const webpackConfig = merge(baseWebpackConfig, {
+  module: {
+    rules: utils.styleLoaders({
+      sourceMap: config.build.productionSourceMap,
+      extract: true,
+      usePostCSS: true
+    })
+  },
+  devtool: config.build.productionSourceMap ? config.build.devtool : false,
+  output: {
+    path: config.build.assetsRoot,
+    filename: utils.assetsPath('js/[name].[chunkhash].js'),
+    chunkFilename: utils.assetsPath('js/[id].[chunkhash].js')
+  },
+  plugins: [
+    // http://vuejs.github.io/vue-loader/en/workflow/production.html
+    new webpack.DefinePlugin({
+      'process.env': env
+    }),
+    new UglifyJsPlugin({
+      uglifyOptions: {
+        compress: {
+          warnings: false
+        }
+      },
+      sourceMap: config.build.productionSourceMap,
+      parallel: true
+    }),
+    // extract css into its own file
+    new ExtractTextPlugin({
+      filename: utils.assetsPath('css/[name].[contenthash].css'),
+      // Setting the following option to `false` will not extract CSS from codesplit chunks.
+      // Their CSS will instead be inserted dynamically with style-loader when the codesplit chunk has been loaded by webpack.
+      // It's currently set to `true` because we are seeing that sourcemaps are included in the codesplit bundle as well when it's `false`, 
+      // increasing file size: https://github.com/vuejs-templates/webpack/issues/1110
+      allChunks: true,
+    }),
+    // Compress extracted CSS. We are using this plugin so that possible
+    // duplicated CSS from different components can be deduped.
+    new OptimizeCSSPlugin({
+      cssProcessorOptions: config.build.productionSourceMap
+        ? { safe: true, map: { inline: false } }
+        : { safe: true }
+    }),
+    // generate dist index.html with correct asset hash for caching.
+    // you can customize output by editing /index.html
+    // see https://github.com/ampedandwired/html-webpack-plugin
+    new HtmlWebpackPlugin({
+      filename: process.env.NODE_ENV === 'testing'
+        ? 'index.html'
+        : config.build.index,
+      template: 'index.html',
+      inject: true,
+      minify: {
+        removeComments: true,
+        collapseWhitespace: true,
+        removeAttributeQuotes: true
+        // more options:
+        // https://github.com/kangax/html-minifier#options-quick-reference
+      },
+      // necessary to consistently work with multiple chunks via CommonsChunkPlugin
+      chunksSortMode: 'dependency'
+    }),
+    // keep module.id stable when vendor modules does not change
+    new webpack.HashedModuleIdsPlugin(),
+    // enable scope hoisting
+    new webpack.optimize.ModuleConcatenationPlugin(),
+    // split vendor js into its own file
+    new webpack.optimize.CommonsChunkPlugin({
+      name: 'vendor',
+      minChunks (module) {
+        // any required modules inside node_modules are extracted to vendor
+        return (
+          module.resource &&
+          /\.js$/.test(module.resource) &&
+          module.resource.indexOf(
+            path.join(__dirname, '../node_modules')
+          ) === 0
+        )
+      }
+    }),
+    // extract webpack runtime and module manifest to its own file in order to
+    // prevent vendor hash from being updated whenever app bundle is updated
+    new webpack.optimize.CommonsChunkPlugin({
+      name: 'manifest',
+      minChunks: Infinity
+    }),
+    // This instance extracts shared chunks from code splitted chunks and bundles them
+    // in a separate chunk, similar to the vendor chunk
+    // see: https://webpack.js.org/plugins/commons-chunk-plugin/#extra-async-commons-chunk
+    new webpack.optimize.CommonsChunkPlugin({
+      name: 'app',
+      async: 'vendor-async',
+      children: true,
+      minChunks: 3
+    }),
+
+    // copy custom static assets
+    new CopyWebpackPlugin([
+      {
+        from: path.resolve(__dirname, '../static'),
+        to: config.build.assetsSubDirectory,
+        ignore: ['.*']
+      }
+    ])
+  ]
+})
+
+if (config.build.productionGzip) {
+  const CompressionWebpackPlugin = require('compression-webpack-plugin')
+
+  webpackConfig.plugins.push(
+    new CompressionWebpackPlugin({
+      asset: '[path].gz[query]',
+      algorithm: 'gzip',
+      test: new RegExp(
+        '\\.(' +
+        config.build.productionGzipExtensions.join('|') +
+        ')$'
+      ),
+      threshold: 10240,
+      minRatio: 0.8
+    })
+  )
+}
+
+if (config.build.bundleAnalyzerReport) {
+  const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin
+  webpackConfig.plugins.push(new BundleAnalyzerPlugin())
+}
+
+module.exports = webpackConfig

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

@@ -7,8 +7,8 @@ if (process.env.NODE_ENV == 'production') {
         },
         server: {
             // 后端接口网关
-            // baseUrl: 'http://192.168.0.181:8560',
-            baseUrl: 'http://192.168.253.58:8560',
+            baseUrl: 'http://192.168.0.181:8560',
+            // baseUrl: 'http://192.168.253.58:8560',
             // 账户中心接口
             ssoUrl: 'http://192.168.253.12:32323'
         }
@@ -23,8 +23,8 @@ if (process.env.NODE_ENV == 'production') {
         },
         server: {
             // 后端接口网关
-            // baseUrl: 'http://192.168.0.181:8560',
-            baseUrl: 'http://192.168.253.58:8560',
+            baseUrl: 'http://192.168.0.181:8560',
+            // baseUrl: 'http://192.168.253.58:8560',
             // 账户中心接口
             ssoUrl: 'http://192.168.253.12:32323'
         }

+ 20 - 0
frontend/saas-portal-web/runtime/nginx/default.conf

@@ -0,0 +1,20 @@
+server {
+    listen       80;
+    server_name  localhost;
+
+    charset utf-8;
+
+    location / {
+        root   /usr/share/nginx/html;
+        index  index.html index.htm;
+    }
+
+    #error_page  404              /404.html;
+
+    # redirect server error pages to the static page /50x.html
+    #
+    error_page   500 502 503 504  /50x.html;
+    location = /50x.html {
+        root   html;
+    }
+}

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

@@ -107,8 +107,8 @@
             //没有内容也要有一定的高度
             boxheight(){
                 let H = $(".gs-qiyebox").height();
-                if (H <= 300) {
-                    $(".gs-qiyebox").css("height",'300px')
+                if (H <= 500) {
+                    $(".gs-qiyebox").css("height",'500px')
                 } else {
                     $(".gs-qiyebox").css("height",'')
                 }

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

@@ -24,10 +24,10 @@
                     <li><a href="#"><span>功能</span></a></li>
                     <li><a href="#"><span>帮助中心</span></a></li>
                     <li><a href="#"><span>联系我们</span></a></li>
-                    <li class="login">
+                    <!-- <li class="login">
                         <span class="btn1"><img src="../../../static/img/assets/denglu3x.png" alt="">登录  &nbsp;</span>
                         <span class="register"><img src="../../../static/img/assets/zhuce3x.png" alt="">注册</span>
-                    </li>
+                    </li> -->
                 </ul>
             </div>
         </div>
@@ -72,6 +72,7 @@
                     </div>
                 </div>
     <!-- 安全信息----------------------------------------------------------------------------- -->
+                <!-- <sjld></sjld> -->
                 <div :class="{gsqiye:nowindex == 2}">
                     <div class="gs-anquanxinxi">
                         <div class="over aq-title"><span class="left">登录密码</span><button class="right dianji">更换密码</button></div>
@@ -109,12 +110,19 @@
             return{
                 nowindex: 0,//tab切换
                 tianjiaqiye: true,//添加企业切换
+                mydata: this.$route.query.mydata,
                 tab: [
                     {name: '企业信息'},
                     {name: '个人信息'},
                     {name: '安全信息'},
                     ],
             }
+        },
+        mounted(){
+            console.log(this.mydata)
+        },
+        components: {
+            
         },
         methods: {
             // tab切换

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

@@ -302,7 +302,7 @@
 			}
 		},
 		mounted(){
-			
+			this.zdtoken();
 		},
 		updated(){
 
@@ -417,7 +417,7 @@
 							if (!account.companyId) {
 								// 登录成功跳转到企业设置
 								console.log("跳转前");
-								me.$router.push({path:'/enterprise'});
+								me.$router.push({path:'/enterprise',query: {mydata :account}});
 								console.log("跳转后"); 
 							} else {
 								//如果开通过sass直接跳转到sass页面
@@ -445,6 +445,91 @@
 				$('#box').css('display','none');
 				$(".zhezhao").css("display","none")
 			},
+			zdtoken(){
+				var Store = (function(){
+					var storeKey = 'app-state', store = window.localStorage;
+					return {
+						get: function(key, defaultValue) {
+							var value = store.getItem(storeKey + '-' + key);
+							return value === undefined? defaultValue : JSON.parse(value);
+						},
+						set: function(key, value) {
+							store.setItem(storeKey + '-' + key, JSON.stringify(value));
+						}
+					};
+				})();
+				var Session = (function(){
+					var key = 'session';
+					return {
+						load: function() {
+							return Store.get(key);
+						},
+						loadData: function(data) {
+							data.span = data.timestamp - new Date().getTime();
+							Store.set(key, data);
+						},
+						isValid: function() {
+							var token = this.load();
+							return token && token.timestamp + token.expire * 1000 > new Date().getTime() + token.span;
+						},
+						get: function(prop) {
+							var token = this.load();
+							return token ? token[prop] : null;
+						},
+						set: function(prop, value) {
+							var token = this.load();
+							if (token) {
+								token[prop] = value;
+								Store.set(key, token);
+							}
+						}
+					}
+				})();
+				var setUserProfile = function(account) {
+					if (account) {
+						$(".login").css("display","none");
+						// 显示用户信息
+						$("#user-info").text(account.realname || account.username);
+						$(".profile").css("display","block")
+					} else {
+						$(".login").css("display","block");
+						$(".profile").css("display","none")
+					}
+				};
+				// 已经登录过从Store取出信息
+				setUserProfile(Session.get('account'));
+				// socket
+				var listenOnCallback = function(clientId, resolve) {
+					var socket = new SockJS(env.server.baseUrl + "/ws");
+					var stompClient = Stomp.over(socket);
+					stompClient.connect({}, function(frame) {
+						stompClient.subscribe('/clients/' + clientId + '/sso/callback', function(message){
+							stompClient.disconnect(function(){
+								resolve(JSON.parse(message.body));
+							});
+						});
+					});
+				};
+				// 系统页面token
+				var Frontend = (function(){
+					var frame;
+					return {
+						init: function() {
+							$('body').append('<iframe id="frontend" hidden src="' + 
+								env.frontend.baseUrl + '/set-token.html"></iframe>');
+							frame = window.frames[window.frames.length - 1];
+						},
+						set: function(session, callback) {
+							window.addEventListener('message', callback, false);
+							frame.postMessage(JSON.stringify(session), '*');
+						},
+						redirect: function() {
+							window.location.href = env.frontend.baseUrl;
+						}
+					};
+				})();
+				Frontend.init();
+			}
 		}
     }
 </script>

+ 122 - 3
frontend/saas-portal-web/src/components/conenter/sanjiliandong.vue

@@ -58,7 +58,7 @@
     </div>
 </template>
 <script>
-    import submitB from "../submitB"; 
+    // import submitB from "../submitB"; 
     // 提交否决弹窗import {aprAudApi} from "../../js/server.js";  
     export default {    
         data() {      
@@ -178,5 +178,124 @@
                         //  let data = {                
                             //   "opinionResultCode": 'D',                
                             //   "opinionTxt": this.lastAprOpinion.opinionTxt,                
-                            //   "rejectReasonCode": [this.lastAprOpinion.rejectReasonCode]                // };                // this.$MyFetch.post(`${aprAudApi.taskDetail.submitOper}/${this.$route.params.id}`, data)                // .then((data = {}) => {                //   console.log(data, '提交表格数据');                // })                // .catch(err => {                //   console.log('提交失败', err.code);                // });                // this.$options.methods.close_();              } else {                this.submitdata();                // let data = {                //   "opinionResultCode": 'P',                //   "opinionTxt": this.lastAprOpinion.opinionTxt,                //   "rejectReasonCode": [this.lastAprOpinion.rejectReasonCode]                // };                // this.$MyFetch.post(`${aprAudApi.taskDetail.submitOper}/${this.$route.params.id}`, data)                // .then((data = {}) => {                //   console.log(data, '提交表格数据');                // })                // .catch(err => {                //   console.log('提交失败', err.code);                // });                this.alertSubmitB = true;              }        console.log(this.submitResults);      },      close_submitB() {        this.alertSubmitB = false;      }    },    created() {       this.$MyFetch.get(`${aprAudApi.taskDetail.submitPage}/${this.$route.params.id}`)        .then((data = {}) => {          this.lastAprOpinion = data.lastAprOpinion;          // console.log(data, '进来就有');        })        .catch(err => {          console.log(err);        });        this.getTreeValue();    },    components: {      submitB    }  };</script>
-<style lang="less" scoped>  .submit{    .dialog-box{      font-size: 14px;      line-height: 20px;      width: 946px;      height: 706px;      .el-button {          width: 200px;          height: 40px;        }      .black_font{        color: #151515;      }      .gray_font{        color: #999999;      }      .dialog-box__top{        box-shadow: 0 1px 6px 0 rgba(239,239,239,0.74);        .title{          font-weight: bold;        }      }      .dialog-box__content{        max-height: 470px;        overflow: auto;        margin: 30px;        .dialog-box__content_title{          border-bottom: 1px solid #E5E5E5;          > div {            float: left;            margin: 0 80px 20px 0;            .margin_right{              margin-right: 10px;            }          }        }        .blue_boder{            border: 1px solid #538BF1;            margin-right: 10px;          }        .product-content-title{          font-size: 14px;          color: #333333;          text-align: left;          line-height: 50px;          .product-content-title_deny{            border: 1px solid #E9E9E9;            box-shadow: 0 2px 6px 0 rgba(0,0,0,0.08);            border-radius: 4px;            padding: 10px;            .negation{              margin-right: 500px;            }            .cause{              .form__select{                width: 846px;              }            }          }        }        > textarea {          border: 1px solid #E5E5E5;          border-radius: 4px;          resize: none;          width: 850px;          height: 102px;        }      }    }  }</style>
+                            //   "rejectReasonCode": [this.lastAprOpinion.rejectReasonCode]               
+                            // };                
+                            // this.$MyFetch.post(`${aprAudApi.taskDetail.submitOper}/${this.$route.params.id}`, data)                
+                            // .then((data = {}) => {                
+                                //   console.log(data, '提交表格数据');                
+                                // })                
+                            // .catch(err => {                
+                                //   console.log('提交失败', err.code);                
+                                // });                
+                                // this.$options.methods.close_();              
+                                // } else {                
+                                //     this.submitdata();                
+                                // let data = {                
+                                    //   "opinionResultCode": 'P',                
+                                    //   "opinionTxt": this.lastAprOpinion.opinionTxt,                
+                                    //   "rejectReasonCode": [this.lastAprOpinion.rejectReasonCode]                
+                                    // };                
+                                    // this.$MyFetch.post(`${aprAudApi.taskDetail.submitOper}/${this.$route.params.id}`, data)                
+                                    // .then((data = {}) => {                
+                                        //   console.log(data, '提交表格数据');                
+                                        // })                
+                                        // .catch(err => {                
+                                            //   console.log('提交失败', err.code);                
+                                            // });                
+                                            this.alertSubmitB = true;              
+                                            }        
+                                            console.log(this.submitResults);      
+                                            },      
+                                            close_submitB() {        
+                                                this.alertSubmitB = false;      
+                                                }    
+                                            },    
+                                            created() {       
+                                                this.$MyFetch.get(`${aprAudApi.taskDetail.submitPage}/${this.$route.params.id}`)        
+                                                .then((data = {}) => {          
+                                                    this.lastAprOpinion = data.lastAprOpinion;          
+                                                    // console.log(data, '进来就有');        
+                                                    })        
+                                                    .catch(err => {          
+                                                        console.log(err);        
+                                                    });        
+                                                    this.getTreeValue();    
+                                                    },    
+                                                    components: {      
+                                                        submitB    
+                                                        }  
+                                                    };
+</script>
+
+<style lang="less" scoped>  
+.submit{    
+    .dialog-box{      
+        font-size: 14px;      
+        line-height: 20px;      
+        width: 946px;      
+        height: 706px;      
+        .el-button {          
+            width: 200px;          
+            height: 40px;        
+        }      
+        .black_font{        
+            color: #151515;      
+        }      
+        .gray_font{        
+            color: #999999;      
+        }      
+        .dialog-box__top{       
+             box-shadow: 0 1px 6px 0 rgba(239,239,239,0.74);        
+             .title{          
+                 font-weight: bold;  
+            }      
+        }     
+        .dialog-box__content{        
+            max-height: 470px;       
+            overflow: auto;        
+            margin: 30px;        
+        .dialog-box__content_title{          
+            border-bottom: 1px solid #E5E5E5;          
+            > div {            
+                float: left;            
+                margin: 0 80px 20px 0;            
+        .margin_right{   
+            margin-right: 10px;            
+            }          
+        }       
+        }       
+        .blue_boder{            
+            border: 1px solid #538BF1;            
+            margin-right: 10px;          
+        }        
+        .product-content-title{          
+            font-size: 14px;          
+            color: #333333;         
+            text-align: left;          
+            line-height: 50px;          
+            .product-content-title_deny{            
+                border: 1px solid #E9E9E9;            
+                box-shadow: 0 2px 6px 0 rgba(0,0,0,0.08);            
+                border-radius: 4px;            
+                padding: 10px;            
+            .negation{             
+                margin-right: 500px;            
+            }            
+            .cause{              
+                .form__select{                
+                    width: 846px;              
+                }            
+            }          
+            }        
+            }        
+            > textarea {          
+                border: 1px solid #E5E5E5;          
+                border-radius: 4px;          
+                resize: none;          
+                width: 850px;          
+                height: 102px;        
+            }      
+            }    
+            }  
+            }
+</style>

+ 1 - 1
frontend/saas-web/app/model/sale/ProdIODetail.js

@@ -13,7 +13,7 @@ Ext.define('saas.model.sale.ProdIODetail', {
         { name: 'pd_prodid', type: 'int' },
         { name: 'pd_prodcode', type: 'string' },
         { name: 'pd_unit', type: 'string' },
-        { name: 'pd_inqty', type: 'int' },
+        { name: 'pd_inqty', type: 'float' },
         { name: 'pd_outqty', type: 'float' },
         { name: 'pd_orderprice', type: 'float' },
         { name: 'pd_sendprice', type: 'float' },

+ 2 - 1
frontend/saas-web/app/util/FormUtil.js

@@ -254,8 +254,9 @@ Ext.define('saas.util.FormUtil', {
                                 var detno = 0;
                                 var detnoColumn = grid.detnoColumn;
                                 var datas = [];
+                                var emptyRows = grid.emptyRows;
                                 
-                                Ext.Array.each(new Array(5), function() {
+                                Ext.Array.each(new Array(emptyRows), function() {
                                     detno += 1;
                                     var data = {};
                                     data[detnoColumn] = detno;

+ 45 - 2
frontend/saas-web/app/view/core/base/GridPanel.js

@@ -9,6 +9,13 @@ Ext.define('saas.view.core.base.GridPanel', {
         ignoreRightMouseSelection : false
     },
 
+    requires: [
+        'Ext.grid.plugin.Exporter'
+    ],
+    plugins: {
+        gridexporter: true
+    },
+
     cls:'core-base-gridpanel',
     
     dataUrl: '',
@@ -58,8 +65,8 @@ Ext.define('saas.view.core.base.GridPanel', {
                             condition = "";
                         }
                         Ext.apply(store.proxy.extraParams, {
-                            number: op._page,
-                            size: store.pageSize,
+                            number: store.exportNumber?store.exportNumber:op._page,
+                            size: store.exportPageSize?store.exportPageSize:store.pageSize,
                             condition: JSON.stringify(condition)
                         });
                     }
@@ -155,6 +162,41 @@ Ext.define('saas.view.core.base.GridPanel', {
         this.ownerCt.ownerCt.store.load();
     },
 
+    onImport:function(){
+        var grid = this.ownerCt.ownerCt;
+    },
+
+    onExport:function(me){
+        var grid = me.ownerCt.ownerCt;
+        //导出接口权限设置
+        var url = '/api/commons/'+grid.ownerCt.caller+'/export';
+        saas.util.BaseUtil.request({
+            url: url,
+            params: '',
+            method: 'GET',
+        })
+        .then(function(localJson) {
+            if(localJson.success){
+                grid.store.exportPageSize = 5000;
+                grid.store.exportNumber = 1;
+                grid.store.load(function(records, operation, success) {
+                    grid.saveDocumentAs({
+                        type: 'xlsx',
+                        title: grid.ownerCt._title + '列表',
+                        fileName: grid.ownerCt._title + '列表.xlsx'
+                    });
+                    grid.store.exportPageSize = null;
+                    grid.store.exportNumber = null;
+                    grid.store.load(function(records, operation, success) {
+                    });
+                });
+            }
+        })
+        .catch(function(res) {
+            saas.util.BaseUtil.showErrorToast('导出失败: ' + res.message);
+        });
+    },
+
     onVastDeal:function(url,type){
         var form = this.ownerCt;
         var grid = this;
@@ -174,6 +216,7 @@ Ext.define('saas.view.core.base.GridPanel', {
                 .then(function() {
                     saas.util.BaseUtil.showSuccessToast('操作成功');
                     grid.store.load();
+                    grid.selModel.deselectAll();
                 })
                 .catch(function(res) {
                     console.error(res);

+ 5 - 1
frontend/saas-web/app/view/core/dbfind/DbfindTrigger.js

@@ -256,7 +256,11 @@ Ext.define('saas.view.core.dbfind.DbfindTrigger', {
                                     field.setValue(null);
                                     field.lastTriggerValue=null;
                                 }else{
-                                    field.setValue(null);
+                                    if(field.xtype.indexOf('hidden')>-1){
+                                        field.setValue(0);
+                                    }else{
+                                        field.setValue(null);
+                                    }
                                 }    
                             }
                         }

+ 92 - 91
frontend/saas-web/app/view/core/dbfind/MultiDbfindTrigger.js

@@ -26,110 +26,111 @@ Ext.define('saas.view.core.dbfind.MultiDbfindTrigger', {
     },
     //输入值之后进行模糊查询
     doQuery: function(queryString, forceAll, rawQuery) {
+        if(!this.fireEvent('beforequery', this)) {
+            return;
+        };
     	queryString = queryString || '';
     	var me = this;
-    	if(me.lastQueryValue!=queryString){
-    		me.judge(me);
-    		var field=[];
-    		var sfield='';
-            var dbfinds=me.dbfinds;
-            var dbtpls=me.dbtpls;
-    		me.lastQueryValue=queryString;
-            if(queryString.trim()==''){
+        me.judge(me);
+        var field=[];
+        var sfield='';
+        var dbfinds=me.dbfinds;
+        var dbtpls=me.dbtpls;
+        me.lastQueryValue=queryString;
+        if(queryString.trim()==''){
+            me.collapse( );
+        }else{
+            if(!dbfinds||!dbtpls){
                 me.collapse( );
-            }else{
-                if(!dbfinds||!dbtpls){
-                    me.collapse( );
-                }else{                   
-                    //加载tpl模板
-                    if(dbtpls.length>0){
-                        var span="";
-                        var width=0;
-                        for(var i=0;i<dbtpls.length;i++){
-                            if(i==0){
-                                span=span+'<span style="width:'+dbtpls[i].width+'px;overflow: hidden;white-space: nowrap;text-overflow: ellipsis;float:left;">{'+dbtpls[i].field+'}</span>';//display:block;
-                            }else{
-                                span=span+'<span style="padding:0 0 0 20px;width:'+dbtpls[i].width+'px;overflow: hidden;white-space: nowrap;text-overflow: ellipsis;float:left;">{'+dbtpls[i].field+'}</span>';
-                            }
-                            if(dbtpls[i].dbField=="true"){
-                                me.searchFieldArray=dbtpls[i].field;
-                            }
-                            width=width+dbtpls[i].width+20;
-                            field.push(dbtpls[i].field);
-                            sfield=sfield+dbtpls[i].field+',';
+            }else{                   
+                //加载tpl模板
+                if(dbtpls.length>0){
+                    var span="";
+                    var width=0;
+                    for(var i=0;i<dbtpls.length;i++){
+                        if(i==0){
+                            span=span+'<span style="width:'+dbtpls[i].width+'px;overflow: hidden;white-space: nowrap;text-overflow: ellipsis;float:left;">{'+dbtpls[i].field+'}</span>';//display:block;
+                        }else{
+                            span=span+'<span style="padding:0 0 0 20px;width:'+dbtpls[i].width+'px;overflow: hidden;white-space: nowrap;text-overflow: ellipsis;float:left;">{'+dbtpls[i].field+'}</span>';
                         }
-                        me.defaultListConfig.minWidth=width+10;
-                        me.defaultListConfig.maxHeight=210;
-                        me.defaultListConfig.autoScroll=true;
-                        me.searchField=sfield.substring(0,sfield.length-1);
-                        me.tpl=Ext.create('Ext.XTemplate',
-                                '<ul style="padding-left: 0px;"><tpl for=".">',
-                                '<li role="option" class="x-boundlist-item" style="list-style:none;">' ,
-                                '<div style="height:30px;">',
-                                ''+span+'',
-                                '</li>',
-                            '</tpl></ul>'
-                        );
-                        me.store.setFields(field);
-                    }
-                }
-                //加载数据
-                var data,dbCondition=[];
-                if(me.dbfinds){
-                    var dbtplcondition = "";
-                    for (let index = 0; index < dbfinds.length; index++) {
-                        var item = dbfinds[index].from;
-                        if(!dbfinds[index].ignore){
-                            dbtplcondition+= "upper("+item+") like '%"+queryString.toUpperCase()+"%' or ";
+                        if(dbtpls[i].dbField=="true"){
+                            me.searchFieldArray=dbtpls[i].field;
                         }
+                        width=width+dbtpls[i].width+20;
+                        field.push(dbtpls[i].field);
+                        sfield=sfield+dbtpls[i].field+',';
                     }
-                    dbtplcondition = "(" + dbtplcondition.substring(0,dbtplcondition.length-4) + ")";
-                    if(dbtplcondition.length>0){
-                        dbCondition = [{
-                            type: 'condition',
-                            value:dbtplcondition
-                        }];
+                    me.defaultListConfig.minWidth=width+10;
+                    me.defaultListConfig.maxHeight=210;
+                    me.defaultListConfig.autoScroll=true;
+                    me.searchField=sfield.substring(0,sfield.length-1);
+                    me.tpl=Ext.create('Ext.XTemplate',
+                            '<ul style="padding-left: 0px;"><tpl for=".">',
+                            '<li role="option" class="x-boundlist-item" style="list-style:none;">' ,
+                            '<div style="height:30px;">',
+                            ''+span+'',
+                            '</li>',
+                        '</tpl></ul>'
+                    );
+                    me.store.setFields(field);
+                }
+            }
+            //加载数据
+            var data,dbCondition=[];
+            if(me.dbfinds){
+                var dbtplcondition = "";
+                for (let index = 0; index < dbfinds.length; index++) {
+                    var item = dbfinds[index].from;
+                    if(!dbfinds[index].ignore){
+                        dbtplcondition+= "upper("+item+") like '%"+queryString.toUpperCase()+"%' or ";
                     }
                 }
-                //添加默认条件
-                if(me.defaultCondition) {
-                    dbCondition.push({
+                dbtplcondition = "(" + dbtplcondition.substring(0,dbtplcondition.length-4) + ")";
+                if(dbtplcondition.length>0){
+                    dbCondition = [{
                         type: 'condition',
-                        value: me.defaultCondition
-                    });
+                        value:dbtplcondition
+                    }];
                 }
-                Ext.Ajax.request({
-                    url: me.dataUrl,
-                    params: {
-                        number: 1,
-                        size: 10,
-                        condition:JSON.stringify(dbCondition),
-                        page: 1,
-                        start: 0,
-                        limit: 10
-                    },
-                    method: 'GET',
-                    success: function(response, opts) {
-                        data = Ext.decode(response.responseText);
-                        data = data.data?data.data.list:[];
-                        if(data!=null && data.length>0 && me.store && field.length>0){
-                            me.store.loadData(data,false);
-                            me.expand();
-                        }else{
-                            me.store.removeAll();
-                            me.collapse();
-                        }
-                    },
-                    failure: function(response, opts) {}
-                });                
             }
-            return true;
-    	}else{
-    		return false;
-    	}
+            //添加默认条件
+            if(me.defaultCondition) {
+                dbCondition.push({
+                    type: 'condition',
+                    value: me.defaultCondition
+                });
+            }
+            Ext.Ajax.request({
+                url: me.dataUrl,
+                params: {
+                    number: 1,
+                    size: 10,
+                    condition:JSON.stringify(dbCondition),
+                    page: 1,
+                    start: 0,
+                    limit: 10
+                },
+                method: 'GET',
+                success: function(response, opts) {
+                    data = Ext.decode(response.responseText);
+                    data = data.data?data.data.list:[];
+                    if(data!=null && data.length>0 && me.store && field.length>0){
+                        me.store.loadData(data,false);
+                        me.expand();
+                    }else{
+                        me.store.removeAll();
+                        me.collapse();
+                    }
+                },
+                failure: function(response, opts) {}
+            });                
+        }
+        return true;
     },
     onTriggerClick:function(f){
-        this.fireEvent('beforetriggerclick', this);
+        if(!this.fireEvent('beforetriggerclick', this)) {
+            return;
+        };
         f.blur(f);
         //判断dbfindtrigger归属
         f.judge(f);

+ 3 - 0
frontend/saas-web/app/view/core/dbfind/types/BankInfoDbfindTrigger.js

@@ -1,3 +1,6 @@
+/**
+ * 资金账户放大镜
+ */
 Ext.define('saas.view.core.dbfind.types.BankInfoDbfindTrigger', {
     extend: 'saas.view.core.dbfind.DbfindTrigger',
     xtype: 'bandinfoDbfindTrigger',

+ 1 - 1
frontend/saas-web/app/view/core/dbfind/types/BomDbfindTrigger.js

@@ -1,5 +1,5 @@
 /**
- * 客户资料放大镜
+ * BOM资料放大镜
  */
 Ext.define('saas.view.core.dbfind.types.BomDbfindTrigger', {
     extend: 'saas.view.core.dbfind.DbfindTrigger',

+ 5 - 3
frontend/saas-web/app/view/core/dbfind/types/OriOrderMutiDbfindTrigger.js

@@ -1,10 +1,12 @@
+/**
+ * 资金来源单据放大镜(多选)
+ */
 Ext.define('saas.view.core.dbfind.types.OriOrderMutiDbfindTrigger', {
     extend: 'saas.view.core.dbfind.MultiDbfindTrigger',
     xtype: 'oriOrderMutiDbfindTrigger',
-/**
- * 用于资金首付款单明细
- */
+   
     dataUrl: '/api/money/subledger/list',
+    // dataUrl: 'http://192.168.253.35:8880/subledger/list',
     addTitle: '源单资料',
     dbtpls: [{
         field: 'sl_code',

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

@@ -421,8 +421,8 @@ Ext.define('saas.view.core.form.FormPanel', {
         var me = this;
         var viewModel = me.getViewModel();
         var formItems = me.formItems;
-        var valid = !!Ext.Array.findBy(formItems, function(f) {
-            return f.isValid();
+        var valid = !Ext.Array.findBy(formItems, function(f) {
+            return !f.isValid();
         });
         var detailGrids = me.query('detailGridField');
 

+ 2 - 0
frontend/saas-web/app/view/core/form/field/ConDateField.js

@@ -61,6 +61,7 @@ Ext.define('saas.view.core.form.field.ConDateField', {
             allowBlank: allowBlank,
             flex: 1,
             fieldStyle: me.fieldStyle,
+            emptyText: '起始时间',
             //matchFieldWidth:true,
             listeners: {
                 change: function(f){
@@ -95,6 +96,7 @@ Ext.define('saas.view.core.form.field.ConDateField', {
             formatText: '',
             flex: 1,
             fieldStyle: me.fieldStyle,
+            emptyText: '结束时间',
             listeners: {
                 change: function(){
                     var from = me.from.value, to =me.to.value;

+ 26 - 0
frontend/saas-web/app/view/core/form/field/ConDateField.scss

@@ -0,0 +1,26 @@
+.x-condatefield {
+    .x-field {
+        background: #fff;
+    }
+
+    .x-field:first-child {
+        .x-form-trigger-wrap-default {
+            border-top-right-radius: 0;
+            border-bottom-right-radius: 0;
+        }
+    }
+    .x-field:nth-child(2) {
+        .x-form-trigger-wrap-default {
+            border-radius: 0;
+            border-left: 0;
+            border-right: 0;
+        }
+    }
+    .x-field:last-child {
+        .x-form-trigger-wrap-default {
+            border-top-left-radius: 0;
+            border-bottom-left-radius: 0;
+        }
+    }
+
+}

+ 3 - 1
frontend/saas-web/app/view/core/form/field/DetailGridField.js

@@ -27,6 +27,8 @@ Ext.define('saas.view.core.form.field.DetailGridField', {
     allowEmpty: false, // 表格为空时校验合法
     showCount: true, // 显示合计栏
 
+    emptyRows: 5,
+
     // Clearing selection disables the Actions.
     allowDeselect: true,
     defaultActionType: 'button',
@@ -201,7 +203,7 @@ Ext.define('saas.view.core.form.field.DetailGridField', {
         selectedRecord = me.selModel.lastSelected,
         datas = [];
 
-        num = num || 3;
+        num = num || me.emptyRows;
 
         //当前行后序号全部加1
         var detno = selectedRecord ? selectedRecord.data[detnoColumn] : 0;

+ 3 - 23
frontend/saas-web/app/view/core/query/QueryGridPanel.js

@@ -188,28 +188,7 @@ Ext.define('saas.view.core.query.QueryGridPanel', {
                     bind: {
                         hidden: '{!auditEnable}'
                     }
-                }, {
-                    text: '打印',
-                    handler: me.onPrint,
-                    menu: {
-                        cls:'x-query-menu',
-                        width: 80,
-                        items: [{
-                            text:'设置',
-                            handler:function(){
-                                me.onPrintSet(this)
-                            }
-                        }],
-                        listeners: {
-                            'mouseleave':function(enu){
-                                this.hide();
-                            } 
-                        }
-                    },
-                    bind: {
-                        hidden: '{!printEnable}'
-                    }
-                }, {
+                },  {
                     text: '导入',
                     handler: me.onImport,
                     menu: {
@@ -398,7 +377,8 @@ Ext.define('saas.view.core.query.QueryGridPanel', {
                 }else{
                     saas.util.BaseUtil.showSuccessToast('操作成功');
                 }
-                me.getStore().loadPage(1);
+                me.store.load();
+                me.selModel.deselectAll();
             })
             .catch(function(res) {
                 console.error(res);

+ 57 - 10
frontend/saas-web/app/view/core/report/ReportPanel.js

@@ -21,6 +21,7 @@ Ext.define('saas.view.core.report.ReportPanel', {
     defaultCondition: null, // 默认查询条件
     searchItems: [], // 查询字段
     reportTitle: '报表',
+    autoLoad:true,
 
     initComponent: function() {
         var me = this;
@@ -43,7 +44,8 @@ Ext.define('saas.view.core.report.ReportPanel', {
                     items: [{
                         xtype: 'button',
                         text: '查询',
-                        handler: 'onQuery'
+                        handler: 'onQuery',
+                        formBind:true
                     },{
                         xtype:'button',
                         text:'打印',
@@ -138,7 +140,7 @@ Ext.define('saas.view.core.report.ReportPanel', {
                     enableGroupingMenu: false,
                     collapsible: false
                 }, {
-                    ftype: 'summary',
+                    ftype: 'mysummary',
                     dock: 'bottom'
                 }],
                 store: store,
@@ -180,19 +182,40 @@ Ext.define('saas.view.core.report.ReportPanel', {
         var store = Ext.create('Ext.data.Store', {
             fields: me.getFields(),
             // model: me.reportModel,
-            autoLoad: true,
+            autoLoad: me.autoLoad,
             pageSize: 15,
             data: [],
             proxy: {
                 type: 'ajax',
                 url: me.listUrl,
+                // url: 'http://192.168.253.58:8560/api/sale/report/saleDetail',
                 timeout: 8000,
                 actionMethods: {
                     read: 'GET'
                 },
                 reader: {
                     type: 'json',
-                    rootProperty: 'data.list',
+                    // 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;
+                    },
                     totalProperty: 'data.total',
                 },
                 listeners: {
@@ -202,16 +225,24 @@ Ext.define('saas.view.core.report.ReportPanel', {
                                 saas.util.BaseUtil.showErrorToast('请求超时');
                             }
                         }else {
-                            console.error('exception: ', response.responseJson);
-                            saas.util.BaseUtil.showErrorToast('请求错误:' + response.responseJson);
+                            if(response.timedout) {
+                                saas.util.BaseUtil.showErrorToast('请求超时');
+                            }else{
+                                saas.util.BaseUtil.showErrorToast('查询失败:' + response.responseJson.message);
+                            }
                         }
                     }
                 }
             },
             listeners: {
+                load: function() {
+                    var grid = me.items.items[1];
+                    grid.fireEvent('mysummarychange', grid);
+                },
                 beforeload: function (store, op) {
-                    condition = me.getConditions(),
-                    defaultCondition = me.defaultCondition;
+                    var condition = me.getConditions(),
+                    defaultCondition = me.defaultCondition,
+                    summarys = me.summarys;
     
                     if(defaultCondition) {
                         condition.push({
@@ -223,7 +254,8 @@ Ext.define('saas.view.core.report.ReportPanel', {
                         number: store.exportNumber?store.exportNumber:op._page,
                         size: store.exportPageSize?store.exportPageSize:store.pageSize,
                         mode: 'DETAIL',
-                        condition: JSON.stringify(condition)
+                        condition: JSON.stringify(condition),
+                        calculateFields: JSON.stringify(summarys)
                     });
     
                 }
@@ -250,7 +282,8 @@ Ext.define('saas.view.core.report.ReportPanel', {
 
     initColumns: function() {
         var me = this,
-        columns = me.reportColumns;
+        columns = me.reportColumns,
+        summarys = [];
 
         Ext.Array.each(columns, function(c) {
             c.columns || Ext.applyIf(c, {
@@ -279,8 +312,17 @@ Ext.define('saas.view.core.report.ReportPanel', {
                     }
                 });
             }
+
+            if(c.summaryType) {
+                summarys.push({
+                    field: c.dataIndex,
+                    operation: c.summaryType,
+                });
+            }
         })
 
+        me.summarys = summarys;
+
         return columns;
     },
 
@@ -295,6 +337,11 @@ Ext.define('saas.view.core.report.ReportPanel', {
             ignore = item.ignore,
             defaultValue = item.defaultValue;
 
+            if(item.allowBlank==false){
+                // TODO 需要判断类型
+                item.beforeLabelTextTpl = "<font color=\"red\" style=\"position:relative; top:2px;right:2px; font-weight: bolder;\">*</font>";
+            }
+
             if(item.xtype == 'numberfield') {
                 Ext.applyIf(item, {
                     hideTrigger: true, // 隐藏trigger

+ 1 - 0
frontend/saas-web/app/view/document/product/BasePanel.js

@@ -57,6 +57,7 @@ Ext.define('saas.view.document.product.BasePanel', {
     }],
 
     //字段属性
+    caller:'Product',
     _formXtype:'document-product-formpanel',
     _title:'物料资料',
     _deleteUrl:'/api/document/product/delete/',

+ 41 - 0
frontend/saas-web/app/view/document/product/FormController.js

@@ -51,6 +51,47 @@ Ext.define('saas.view.document.product.FormController', {
         });
 
     },
+
+    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;
+
+        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 grid = form.query('detailGridField')[j],
+            emptyRows = grid.emptyRows,
+            detnoColumn = grid.detnoColumn,
+            detno = 0,
+            datas = [];
+
+            Ext.Array.each(new Array(emptyRows), function() {
+                detno += 1;
+                var data = {};
+                data[detnoColumn] = detno;
+                datas.push(data);
+            })
+            formData['detail' + j] = datas;
+        }
+
+        return me.myInitCopyData(formData);;
+    },
+
     auditBtnClick: function() {
         var me = this,
         form = me.getView(),

+ 1 - 0
frontend/saas-web/app/view/document/vendor/BasePanel.js

@@ -50,6 +50,7 @@ Ext.define('saas.view.document.vendor.BasePanel', {
     }],
 
     //字段属性
+    caller:'Vendor',
     _formXtype:'document-vendor-formpanel',
     _title:'供应商资料',
     _deleteUrl:'/api/document/vendor/delete/',

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

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

@@ -81,7 +81,7 @@ Ext.define('saas.view.home.charts.PurchaseTrend', {
                     style: {
                         lineWidth: 0,
                         strokeStyle: 'transparent',
-                        maxBarWidth: 50,
+                        maxBarWidth: 30,
                     },
                 }]
             }]

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

@@ -75,7 +75,7 @@ Ext.define('saas.view.home.charts.StockAmount', {
                     style: {
                         lineWidth: 0,
                         strokeStyle: 'transparent',
-                        maxBarWidth: 50,
+                        maxBarWidth: 30,
                     },
                 }]
             }]

+ 1 - 2
frontend/saas-web/app/view/money/fundtransfer/QueryPanel.js

@@ -10,7 +10,6 @@ Ext.define('saas.view.money.fundtransfer.QueryPanel', {
     queryFormItems: [{
         xtype: 'textfield',
         name:'ft_code',
-        fieldLabel: '单号',
         emptyText:'请输入单号'
     },{
         xtype : "condatefield",
@@ -139,7 +138,7 @@ Ext.define('saas.view.money.fundtransfer.QueryPanel', {
             width: 110
         }, {
             text: '备注',
-            dataIndex: 'ft_remark',
+            dataIndex: 'ftd_remark',
             width: 250
         } ],
         relativeColumn: []

+ 1 - 2
frontend/saas-web/app/view/money/othreceipts/QueryPanel.js

@@ -10,8 +10,7 @@ Ext.define('saas.view.money.othreceipts.QueryPanel', {
     queryFormItems: [ {
         xtype: 'textfield',
         name: 'or_code',
-        fieldLabel: '单号/客户/账号',
-        emptyText:'请输入单号/客户/账号',
+        emptyText:'请输入单号或客户或账号',
         labelWidth: 100,
         getCondition: function(value) {
            return  ' (or_code like\'%' + value + '%\'' 

+ 2 - 8
frontend/saas-web/app/view/money/othspendings/QueryPanel.js

@@ -19,9 +19,7 @@ Ext.define('saas.view.money.othspendings.QueryPanel', {
     },{
         xtype: 'textfield',
         name: 'os_code',
-        fieldLabel: '单号/客户/账号',
-        emptyText:'请输入单号/客户/账号',
-        labelWidth: 100,
+        emptyText:'请输入单号或客户或账号',
         getCondition: function(value) {
             if(value == 'ALL') {
                 return '1=1';
@@ -100,12 +98,8 @@ Ext.define('saas.view.money.othspendings.QueryPanel', {
             dataIndex: 'os_date',
             xtype: 'datecolumn',
             width: 110
-        },{
-            text: '审核状态',
-            dataIndex: 'os_status',
-            width: 90
         }, {
-            text: '供应商',
+            text: '供应商名称',
             dataIndex: 'os_vendname',
             width:250
         },{

+ 0 - 5
frontend/saas-web/app/view/money/payBalance/QueryPanel.js

@@ -18,7 +18,6 @@ Ext.define('saas.view.money.paybalance.QueryPanel', {
     }, {
         xtype: 'textfield',
         name: 'pb_code',
-        fieldLabel: '单号/供应商',
         emptyText :'请输入单号或供应商',
         getCondition: function(value) {
             if(value == 'ALL') {
@@ -111,10 +110,6 @@ Ext.define('saas.view.money.paybalance.QueryPanel', {
             text: '付款人',
             dataIndex: 'pb_manname',
             width: 110
-        }, {
-            text: '单据状态',
-            dataIndex: 'pb_status',
-            width: 90
         }, {
             text: '备注',
             dataIndex: 'pb_remark',

+ 3 - 4
frontend/saas-web/app/view/money/recBalance/QueryPanel.js

@@ -10,8 +10,7 @@ Ext.define('saas.view.money.recBalance.QueryPanel', {
     queryFormItems: [{
         xtype: 'textfield',
         name: 'rb_code',
-        fieldLabel: '单号/客户',
-        emptyText :'请输入单号或者客户',
+        emptyText :'请输入单号或客户',
         getCondition: function(value) {
             if(value == 'ALL') {
                 return '1=1';
@@ -71,7 +70,7 @@ Ext.define('saas.view.money.recBalance.QueryPanel', {
             xtype: 'numbercolumn',
             hidden: true
         }, {
-            text: '款单号',
+            text: '款单号',
             dataIndex: 'rb_code',
             width: 150
         }, {
@@ -84,7 +83,7 @@ Ext.define('saas.view.money.recBalance.QueryPanel', {
             dataIndex: 'rb_custname',
             width: 250,
         },{
-            text: '款金额',
+            text: '款金额',
             xtype: 'numbercolumn',
             dataIndex: 'rd_amount',
             width: 120,

+ 0 - 1
frontend/saas-web/app/view/money/report/AccountBalance.js

@@ -102,6 +102,5 @@ Ext.define('saas.view.money.report.AccountBalance', {
             text: '备注',
             dataIndex: 'remark',
             width: 250,
-            flex:1
         }]
 });

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

@@ -7,7 +7,7 @@ Ext.define('saas.view.money.report.CustomerCheckCheck', {
 
     viewName: 'money-report-customercheck',
 
-    groupField: null,
+    groupField: 'pi_custname',
     listUrl: '/api/money/report/customercheck',
     defaultCondition: null,
     reportTitle: '客户对账单',

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

@@ -6,7 +6,7 @@ Ext.define('saas.view.money.report.PayDetail', {
     viewModel: 'money-report-paydetail',
     viewName: 'money-report-paydetail',
 
-    groupField: null,
+    groupField:'pi_vendname',
     listUrl: '/api/money/report/payDetail',
     defaultCondition: null,
     reportTitle: '应付账款明细表',

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

@@ -7,7 +7,7 @@ Ext.define('saas.view.money.report.RecDetail', {
 
     viewName: 'money-report-recdetail',
 
-    groupField: null,
+    groupField: 'pi_custname',
     listUrl: '/api/money/report/recDetail',
     defaultCondition: null,
     reportTitle: '应收账款明细',
@@ -124,7 +124,14 @@ Ext.define('saas.view.money.report.RecDetail', {
             text: '单据总金额',
             dataIndex: 'pi_total',
             xtype: 'numbercolumn',
-            width: 110
+            width: 110,
+            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_unit',

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

@@ -7,7 +7,7 @@ Ext.define('saas.view.money.report.VendorCheck', {
 
     viewName: 'money-report-vendorcheck',
 
-    groupField: null,
+    groupField: 'pi_vendname',
     listUrl: '/api/money/report/vendorCheck',
     defaultCondition: null,
     reportTitle: '供应商对账单',

Some files were not shown because too many files changed in this diff