Просмотр исходного кода

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

guq 6 лет назад
Родитель
Сommit
a1d7b5e0ce
54 измененных файлов с 1029 добавлено и 259 удалено
  1. 2 0
      applications/commons/commons-dto/src/main/java/com/usoftchina/saas/commons/exception/BizExceptionCode.java
  2. 1 0
      applications/document/document-dto/src/main/java/com.usoftchina.saas.document.dto/ProductDTO.java
  3. 2 0
      applications/document/document-server/src/main/java/com/usoftchina/saas/document/mapper/CustomerMapper.java
  4. 2 0
      applications/document/document-server/src/main/java/com/usoftchina/saas/document/mapper/VendorMapper.java
  5. 10 1
      applications/document/document-server/src/main/java/com/usoftchina/saas/document/service/impl/CurrencyServiceImpl.java
  6. 10 0
      applications/document/document-server/src/main/resources/mapper/CustomerMapper.xml
  7. 1 0
      applications/document/document-server/src/main/resources/mapper/ProductMapper.xml
  8. 10 0
      applications/document/document-server/src/main/resources/mapper/VendorMapper.xml
  9. 139 0
      applications/money/money-server/src/main/java/com/usoftchina/saas/money/po/Custmonth.java
  10. 1 0
      applications/money/money-server/src/main/java/com/usoftchina/saas/money/po/Profitpresent.java
  11. 139 0
      applications/money/money-server/src/main/java/com/usoftchina/saas/money/po/Vendmonth.java
  12. 1 1
      applications/money/money-server/src/main/resources/mapper/ApcheckMapper.xml
  13. 6 3
      applications/money/money-server/src/main/resources/mapper/CustmonthMapper.xml
  14. 38 102
      applications/money/money-server/src/main/resources/mapper/ProfitdetailMapper.xml
  15. 5 2
      applications/money/money-server/src/main/resources/mapper/VendmonthMapper.xml
  16. 3 0
      applications/purchase/purchase-server/src/main/java/com/usoftchina/saas/purchase/po/ProdInOutList.java
  17. 6 1
      applications/purchase/purchase-server/src/main/java/com/usoftchina/saas/purchase/service/impl/ProdInOutServiceImpl.java
  18. 9 0
      applications/purchase/purchase-server/src/main/java/com/usoftchina/saas/purchase/service/impl/PurchaseServiceImpl.java
  19. 1 1
      applications/purchase/purchase-server/src/main/resources/mapper/ProdInOutListMapper.xml
  20. 17 0
      applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/controller/SaleController.java
  21. 22 0
      applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/mapper/DataImportMapper.java
  22. 6 0
      applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/mapper/SaleMapper.java
  23. 2 0
      applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/service/SaleService.java
  24. 74 3
      applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/service/impl/SaleServiceImpl.java
  25. 110 0
      applications/sale/sale-server/src/main/resources/mapper/DataImportMapper.xml
  26. 64 0
      applications/sale/sale-server/src/main/resources/mapper/SaleMapper.xml
  27. 1 1
      frontend/saas-web/app/model/report/PurchasePay.js
  28. 4 5
      frontend/saas-web/app/model/report/SaleProfit.js
  29. 6 1
      frontend/saas-web/app/view/core/base/ImportWindow.js
  30. 5 0
      frontend/saas-web/app/view/core/base/ImportWindow.scss
  31. 5 10
      frontend/saas-web/app/view/core/form/FormPanel.js
  32. 8 1
      frontend/saas-web/app/view/core/query/QueryGridPanel.js
  33. 1 0
      frontend/saas-web/app/view/core/query/QueryPanelController.js
  34. 2 1
      frontend/saas-web/app/view/core/query/QueryPanelModel.js
  35. 3 2
      frontend/saas-web/app/view/core/report/ReportPanel.js
  36. 2 6
      frontend/saas-web/app/view/money/report/CustomerCheck.js
  37. 4 1
      frontend/saas-web/app/view/money/report/PayDetail.js
  38. 0 18
      frontend/saas-web/app/view/money/report/ProfitDetail.js
  39. 3 0
      frontend/saas-web/app/view/money/report/RecDetail.js
  40. 19 1
      frontend/saas-web/app/view/money/report/TotalPayDetail.js
  41. 16 1
      frontend/saas-web/app/view/money/report/TotalRecDetail.js
  42. 2 6
      frontend/saas-web/app/view/money/report/VendorCheck.js
  43. 1 1
      frontend/saas-web/app/view/money/verification/FormPanelController.js
  44. 5 1
      frontend/saas-web/app/view/purchase/purchaseIn/QueryPanel.js
  45. 5 1
      frontend/saas-web/app/view/purchase/purchaseOut/QueryPanel.js
  46. 95 4
      frontend/saas-web/app/view/purchase/report/PurchasePay.js
  47. 2 2
      frontend/saas-web/app/view/sale/b2b/PurchaseDetail.js
  48. 1 1
      frontend/saas-web/app/view/sale/report/SaleProfit.js
  49. 35 2
      frontend/saas-web/app/view/sale/report/SaleRec.js
  50. 4 2
      frontend/saas-web/app/view/sale/sale/QueryPanel.js
  51. 27 0
      frontend/saas-web/app/view/sale/sale/QueryPanelController.js
  52. 5 1
      frontend/saas-web/app/view/sale/sale/QueryPanelModel.js
  53. 3 1
      frontend/saas-web/app/view/stock/make/FormPanelController.js
  54. 84 75
      frontend/saas-web/ext/packages/ux/src/feature/MySummary.js

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

@@ -52,6 +52,7 @@ public enum BizExceptionCode implements BaseExceptionCode {
     BIZ_SAMEVENDAP_SAVE(79357, "已存在相同供应商和币别的期初数据,不能新增"),
     BIZ_SAMECUSTAR_SAVE(79358, "已存在相同客户和币别的期初数据,不能新增"),
     BIZ_MAINCURRENCY_DELETE(79359, "该币别为本位币,不能删除"),
+    BIZ_CUSTOMER_CODE_NOT_EXISTS(79360, "客户%s不存在或已禁用"),
 
     NO_OPRATIONDATA(79400,"无可操作单据"),
     NULL_DATA(23232,"无数据"),
@@ -94,6 +95,7 @@ public enum BizExceptionCode implements BaseExceptionCode {
     PURCHASE_ORDER_HASUNAUDIT(70003, "存在未审核单据,单据编号:%s"),
     PURCHASE_ORDER_HASUPLOAD(70004, "已上传优软商务平台的采购订单不允许反审核,如交易信息发生变更请关闭该订单重新新增订单"),
     PURCHASE_INOUTORDER_HASCHECK(70005, "反审核失败!该单存在已对账明细,不允许反审核"),
+    PURCHASE_INOUTORDER_AUDIT_PREUPLOAD(70006, "审核失败!待上传的验收单/验退单不允许此操作!"),
 
 
     //销售

+ 1 - 0
applications/document/document-dto/src/main/java/com.usoftchina.saas.document.dto/ProductDTO.java

@@ -41,4 +41,5 @@ public class ProductDTO implements Serializable {
 
     private Double po_avprice;
     private String pr_remark;
+    private String b2bStatus;
 }

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

@@ -42,4 +42,6 @@ public interface CustomerMapper extends CommonBaseMapper<Customer> {
     int updateCustleftamountByPrimaryKey(Long cu_id);
 
     List<Customer> getCustomersByCondition(@Param("condition") String condition, @Param("companyId") Long companyId);
+
+    void updateAllCustleftamount(@Param("companyId") Long companyId);
 }

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

@@ -39,4 +39,6 @@ public interface VendorMapper extends CommonBaseMapper<Vendor> {
     VendorDTO selectByName(@Param("name") String name, @Param("companyId") Long companyId);
 
     int updateVendleftamountByPrimaryKey(Long ve_id);
+
+    void updateAllVendleftamount(@Param("companyId") Long companyId);
 }

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

@@ -17,6 +17,8 @@ import com.usoftchina.saas.page.PageRequest;
 import com.usoftchina.saas.utils.BeanMapper;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import com.usoftchina.saas.document.mapper.CustomerMapper;
+import com.usoftchina.saas.document.mapper.VendorMapper;
 
 import java.util.List;
 
@@ -29,7 +31,10 @@ public class CurrencyServiceImpl extends CommonBaseServiceImpl<CurrencyMapper, C
 
     @Autowired
     private MessageLogService messageLogService;
-
+    @Autowired
+    private CustomerMapper customerMapper;
+    @Autowired
+    private VendorMapper vendorMapper;
     @Override
     public void save(CurrencyDTO currencyDTO) {
         Currency currency = BeanMapper.map(currencyDTO, Currency.class);
@@ -49,6 +54,10 @@ public class CurrencyServiceImpl extends CommonBaseServiceImpl<CurrencyMapper, C
             docBaseDTO = generateMsgObj(currency.getId());
             messageLogService.update(docBaseDTO);
         }
+        //更新客户余额
+        customerMapper.updateAllCustleftamount(companyId);
+        //更新供应商余额
+        vendorMapper.updateAllVendleftamount(companyId);
     }
 
     @Override

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

@@ -424,4 +424,14 @@
     </where>
     ORDER BY CU_ID DESC
   </select>
+
+  <update id="updateAllCustleftamount">
+    update customer
+    <set>
+      cu_leftamount=ifnull((select sum(ca_leftamount*(case when ifnull(cr_rate,0)=0 then 1 else ifnull(cr_rate,0) end ))
+      from custaramount left join currencys on cr_name=ca_currency and custaramount.companyid=currencys.companyid
+      where custaramount.companyid=customer.companyid and ca_custid=cu_id),0)
+    </set>
+    where companyId = #{companyId}
+  </update>
 </mapper>

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

@@ -56,6 +56,7 @@
         <result column="pr_status" property="pr_status" jdbcType="VARCHAR"/>
         <result column="pr_statuscode" property="pr_statuscode" jdbcType="VARCHAR"/>
         <result column="pr_remark" property="pr_remark" jdbcType="VARCHAR"/>
+        <result column="b2bStatus" property="b2bStatus" jdbcType="VARCHAR"/>
     </resultMap>
 
 

+ 10 - 0
applications/document/document-server/src/main/resources/mapper/VendorMapper.xml

@@ -515,5 +515,15 @@
         </set>
         where ve_id = #{ve_id}
     </update>
+
+    <update id="updateAllVendleftamount">
+        update vendor
+        <set>
+            ve_leftamount=ifnull((select sum(va_leftamount*(case when ifnull(cr_rate,0)=0 then 1 else ifnull(cr_rate,0) end ))
+            from VendApamount left join currencys on cr_name=va_currency and VendApamount.companyid=currencys.companyid
+            where VendApamount.companyid=vendor.companyid and va_vendid=ve_id),0)
+        </set>
+        where companyId = #{companyId}
+    </update>
 </mapper>
 

+ 139 - 0
applications/money/money-server/src/main/java/com/usoftchina/saas/money/po/Custmonth.java

@@ -35,4 +35,143 @@ public class Custmonth {
 
     private String cm_currency;
 
+    private Double cm_amount_cr;
+
+    private Double cm_rate;
+
+    public Integer getCm_id() {
+        return cm_id;
+    }
+
+    public void setCm_id(Integer cm_id) {
+        this.cm_id = cm_id;
+    }
+
+    public Integer getCm_yearmonth() {
+        return cm_yearmonth;
+    }
+
+    public void setCm_yearmonth(Integer cm_yearmonth) {
+        this.cm_yearmonth = cm_yearmonth;
+    }
+
+    public Integer getCm_custid() {
+        return cm_custid;
+    }
+
+    public void setCm_custid(Integer cm_custid) {
+        this.cm_custid = cm_custid;
+    }
+
+    public String getCm_custcode() {
+        return cm_custcode;
+    }
+
+    public void setCm_custcode(String cm_custcode) {
+        this.cm_custcode = cm_custcode;
+    }
+
+    public String getCm_custname() {
+        return cm_custname;
+    }
+
+    public void setCm_custname(String cm_custname) {
+        this.cm_custname = cm_custname;
+    }
+
+    public Double getCm_beginamount() {
+        return cm_beginamount;
+    }
+
+    public void setCm_beginamount(Double cm_beginamount) {
+        this.cm_beginamount = cm_beginamount;
+    }
+
+    public Double getCm_nowamount() {
+        return cm_nowamount;
+    }
+
+    public void setCm_nowamount(Double cm_nowamount) {
+        this.cm_nowamount = cm_nowamount;
+    }
+
+    public Double getCm_nowpreamount() {
+        return cm_nowpreamount;
+    }
+
+    public void setCm_nowpreamount(Double cm_nowpreamount) {
+        this.cm_nowpreamount = cm_nowpreamount;
+    }
+
+    public Double getCm_endamount() {
+        return cm_endamount;
+    }
+
+    public void setCm_endamount(Double cm_endamount) {
+        this.cm_endamount = cm_endamount;
+    }
+
+    public Integer getCompanyid() {
+        return companyid;
+    }
+
+    public void setCompanyid(Integer companyid) {
+        this.companyid = companyid;
+    }
+
+    public Double getCm_beginpreamount() {
+        return cm_beginpreamount;
+    }
+
+    public void setCm_beginpreamount(Double cm_beginpreamount) {
+        this.cm_beginpreamount = cm_beginpreamount;
+    }
+
+    public Double getCm_nowpayamount() {
+        return cm_nowpayamount;
+    }
+
+    public void setCm_nowpayamount(Double cm_nowpayamount) {
+        this.cm_nowpayamount = cm_nowpayamount;
+    }
+
+    public Double getCm_nowprepayamount() {
+        return cm_nowprepayamount;
+    }
+
+    public void setCm_nowprepayamount(Double cm_nowprepayamount) {
+        this.cm_nowprepayamount = cm_nowprepayamount;
+    }
+
+    public Double getCm_endpreamount() {
+        return cm_endpreamount;
+    }
+
+    public void setCm_endpreamount(Double cm_endpreamount) {
+        this.cm_endpreamount = cm_endpreamount;
+    }
+
+    public String getCm_currency() {
+        return cm_currency;
+    }
+
+    public void setCm_currency(String cm_currency) {
+        this.cm_currency = cm_currency;
+    }
+
+    public Double getCm_amount_cr() {
+        return cm_amount_cr;
+    }
+
+    public void setCm_amount_cr(Double cm_amount_cr) {
+        this.cm_amount_cr = cm_amount_cr;
+    }
+
+    public Double getCm_rate() {
+        return cm_rate;
+    }
+
+    public void setCm_rate(Double cm_rate) {
+        this.cm_rate = cm_rate;
+    }
 }

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

@@ -106,4 +106,5 @@ public class Profitpresent {
     public void setProfitpresent(Double profitpresent) {
         this.profitpresent = profitpresent;
     }
+
 }

+ 139 - 0
applications/money/money-server/src/main/java/com/usoftchina/saas/money/po/Vendmonth.java

@@ -35,4 +35,143 @@ public class Vendmonth {
 
     private String vm_currency;
 
+    private Double vm_amount_cr;
+
+    private Double vm_rate;
+
+    public Integer getVm_id() {
+        return vm_id;
+    }
+
+    public void setVm_id(Integer vm_id) {
+        this.vm_id = vm_id;
+    }
+
+    public Integer getVm_yearmonth() {
+        return vm_yearmonth;
+    }
+
+    public void setVm_yearmonth(Integer vm_yearmonth) {
+        this.vm_yearmonth = vm_yearmonth;
+    }
+
+    public Integer getVm_vendid() {
+        return vm_vendid;
+    }
+
+    public void setVm_vendid(Integer vm_vendid) {
+        this.vm_vendid = vm_vendid;
+    }
+
+    public String getVm_vendcode() {
+        return vm_vendcode;
+    }
+
+    public void setVm_vendcode(String vm_vendcode) {
+        this.vm_vendcode = vm_vendcode;
+    }
+
+    public String getVm_vendname() {
+        return vm_vendname;
+    }
+
+    public void setVm_vendname(String vm_vendname) {
+        this.vm_vendname = vm_vendname;
+    }
+
+    public Double getVm_beginamount() {
+        return vm_beginamount;
+    }
+
+    public void setVm_beginamount(Double vm_beginamount) {
+        this.vm_beginamount = vm_beginamount;
+    }
+
+    public Double getVm_nowamount() {
+        return vm_nowamount;
+    }
+
+    public void setVm_nowamount(Double vm_nowamount) {
+        this.vm_nowamount = vm_nowamount;
+    }
+
+    public Double getVm_nowpreamount() {
+        return vm_nowpreamount;
+    }
+
+    public void setVm_nowpreamount(Double vm_nowpreamount) {
+        this.vm_nowpreamount = vm_nowpreamount;
+    }
+
+    public Double getVm_endamount() {
+        return vm_endamount;
+    }
+
+    public void setVm_endamount(Double vm_endamount) {
+        this.vm_endamount = vm_endamount;
+    }
+
+    public Integer getCompanyid() {
+        return companyid;
+    }
+
+    public void setCompanyid(Integer companyid) {
+        this.companyid = companyid;
+    }
+
+    public Double getVm_beginpreamount() {
+        return vm_beginpreamount;
+    }
+
+    public void setVm_beginpreamount(Double vm_beginpreamount) {
+        this.vm_beginpreamount = vm_beginpreamount;
+    }
+
+    public Double getVm_nowpayamount() {
+        return vm_nowpayamount;
+    }
+
+    public void setVm_nowpayamount(Double vm_nowpayamount) {
+        this.vm_nowpayamount = vm_nowpayamount;
+    }
+
+    public Double getVm_nowprepayamount() {
+        return vm_nowprepayamount;
+    }
+
+    public void setVm_nowprepayamount(Double vm_nowprepayamount) {
+        this.vm_nowprepayamount = vm_nowprepayamount;
+    }
+
+    public Double getVm_endpreamount() {
+        return vm_endpreamount;
+    }
+
+    public void setVm_endpreamount(Double vm_endpreamount) {
+        this.vm_endpreamount = vm_endpreamount;
+    }
+
+    public String getVm_currency() {
+        return vm_currency;
+    }
+
+    public void setVm_currency(String vm_currency) {
+        this.vm_currency = vm_currency;
+    }
+
+    public Double getVm_amount_cr() {
+        return vm_amount_cr;
+    }
+
+    public void setVm_amount_cr(Double vm_amount_cr) {
+        this.vm_amount_cr = vm_amount_cr;
+    }
+
+    public Double getVm_rate() {
+        return vm_rate;
+    }
+
+    public void setVm_rate(Double vm_rate) {
+        this.vm_rate = vm_rate;
+    }
 }

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

@@ -450,7 +450,7 @@
 
 
   <update id="updateStatus">
-    update apcheck set ac_sendstatus='已上传',ac_confirmstatus=#{status},ac_confirmstatuscode=#{code},ac_confirmdate=now()
+    update apcheck set ac_sendstatus='已上传',ac_thischeck=ac_thisamount,ac_confirmstatus=#{status},ac_confirmstatuscode=#{code},ac_confirmdate=now()
     where ac_b2bid=#{id} and ifnull(ac_sendstatus,'未上传')='未上传'
   </update>
 </mapper>

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

@@ -8,9 +8,11 @@
     <result column="cm_custcode" property="cm_custcode" jdbcType="VARCHAR" />
     <result column="cm_custname" property="cm_custname" jdbcType="VARCHAR" />
     <result column="cm_beginamount" property="cm_beginamount" jdbcType="DOUBLE" />
-   <result column="cm_nowamount" property="cm_nowamount" jdbcType="DOUBLE" />
+    <result column="cm_nowamount" property="cm_nowamount" jdbcType="DOUBLE" />
     <result column="cm_nowpreamount" property="cm_nowpreamount" jdbcType="DOUBLE" />
     <result column="cm_endamount" property="cm_endamount" jdbcType="DOUBLE" />
+    <result column="cm_amount_cr" property="cm_amount_cr" jdbcType="DOUBLE" />
+    <result column="cm_rate" property="cm_rate" jdbcType="DOUBLE" />
     <result column="companyid" property="companyid" jdbcType="INTEGER" />
     <result column="cm_beginpreamount" property="cm_beginpreamount" jdbcType="DOUBLE" />
     <result column="cm_nowpayamount" property="cm_nowpayamount" jdbcType="DOUBLE" />
@@ -24,13 +26,14 @@
   </sql>
 
   <select id="selectByCondition" resultMap="BaseResultMap">
-    select  *  from custmonth
+      select  a.*,cr_rate cm_rate, cr_rate*(cm_endamount-cm_endpreamount) cm_amount_cr from custmonth a
+      left join currencys on cr_name = a.cm_currency and currencys.companyId = a.companyid
     <where>
       <if test="con != null">
         ${con}
       </if>
       <if test="companyId != null">
-        and  companyId = #{companyId} and abs(cm_beginamount)+abs(cm_beginpreamount)+abs(cm_nowamount)+abs(cm_nowpreamount)+abs(cm_nowprepayamount)+abs(cm_nowpayamount)>0
+        and  a.companyId = #{companyId} and abs(cm_beginamount)+abs(cm_beginpreamount)+abs(cm_nowamount)+abs(cm_nowpreamount)+abs(cm_nowprepayamount)+abs(cm_nowpayamount)>0
       </if>
     </where>
     order by cm_yearmonth desc,cm_custcode

+ 38 - 102
applications/money/money-server/src/main/resources/mapper/ProfitdetailMapper.xml

@@ -20,122 +20,58 @@
   </sql>
 
   <select id="selectByCondition" parameterType="java.lang.Long" resultMap="BaseResultMap">
-   SELECT
-	a.pi_custcode,
-	a.pi_custname,
-	a.cu_type,
-	a.cu_sellername,
-	  IFNULL(a.saamount,0) as saamount,
-	  IFNULL(a.netamount,0) as netamount,
-	  IFNULL(a.costamount,0) as costamount,
-	  IFNULL(SUM(a.netamount - a.costamount),0) as profit,
-	  IFNULL((SUM(a.netamount - a.costamount)/IFNULL(a.netamount,SUM(a.netamount - a.costamount))),0) as profitpresent
-
-FROM
-	(
-		SELECT
-			pi_custcode,
-			pi_custname,
-	        cu_type,
-			cu_sellername,
-	  SUM(
-	  IFNULL(pd_sendprice,0) * (IFNULL(pd_outqty,0) - IFNULL(pd_inqty,0))
-	  ) AS saamount,
-	  SUM(
-	  IFNULL(pd_netprice,0) * (IFNULL(pd_outqty,0) - IFNULL(pd_inqty,0))
-	  ) AS netamount,
-	  SUM(
-	  IFNULL(pd_price,0) * (IFNULL(pd_outqty,0) - IFNULL(pd_inqty,0))
-	  ) AS costamount
-		FROM
-			prodinout,
-			prodiodetail,
-			customer
-    <where>
-      <if test="con != null">
-        ${con}
-      </if>
-      <if test="companyId != null">
-        and  prodinout.companyid = #{companyId}
-      </if>
-    </where>
-		and	pi_id = pd_piid
-		AND pi_custid = cu_id and pi_status = '已审核' and
-prodinout.companyid= prodiodetail.companyid
-		GROUP BY
-			pi_custcode,
-			pi_custname,
-	        cu_type,
-			cu_sellername
-	) a
-	  where saamount + netamount + costamount != 0
-	  GROUP BY
-			a.pi_custcode,
-			a.pi_custname,
-	        a.cu_type,
-			a.cu_sellername
-	  ORDER BY a.pi_custname asc,a.pi_custname desc
+	  select
+	      cu_type,
+		  pi_custid,
+		  pi_custcode,
+		  pi_custname,
+		  sum(pd_sendprice*pi_rate) as saamount,
+		  sum(pd_price) as costamount,
+	  	  sum(pd_sendprice*pi_rate)-sum(pd_price) as profit,
+		  (sum(pd_sendprice*pi_rate)-sum(pd_price) )/sum(pd_sendprice*pi_rate) as profitpresent
+	  from prodiodetail
+	  left join prodinout on pd_piid=pi_Id
+	  left join customer on cu_id = pi_custid
+	  <where>
+		  <if test="con != null">
+			  ${con}
+		  </if>
+		  <if test="companyId != null">
+			  and  prodinout.companyid = #{companyId}
+		  </if>
+		  and pi_class in('出货单','销售退货单')
+	  </where>
+	  group by pi_custid,pi_custcode,pi_custname,cu_type
+	  ORDER BY pi_custname asc
   </select>
 
 	<select id="selectCalculateFields" resultType="string">
 		SELECT ${fields}
-		FROM
-		(
-		SELECT
-		a.pi_custcode,
-		a.pi_custname,
-		a.cu_type,
-		a.cu_sellername,
-		IFNULL(a.saamount,0) as saamount,
-		IFNULL(a.netamount,0) as netamount,
-		IFNULL(a.costamount,0) as costamount,
-		IFNULL(SUM(a.netamount - a.costamount),0) as profit,
-		IFNULL((SUM(a.netamount - a.costamount)/IFNULL(a.netamount,SUM(a.netamount - a.costamount))),0) as profitpresent
-		FROM
-		(
-		SELECT
+		from(
+		select
+		cu_type,
+		pi_custid,
 		pi_custcode,
 		pi_custname,
-		cu_type,
-		cu_sellername,
-		SUM( (IFNULL( pd_sendprice, 0 ) * ( IFNULL( pd_outqty, 0 ) - IFNULL( pd_inqty, 0 ) )) * ifnull(cr_rate,1) ) AS saamount,
-		SUM(
-		IFNULL(pd_netprice,0) * (IFNULL(pd_outqty,0) - IFNULL(pd_inqty,0))
-		) AS netamount,
-		SUM(
-		IFNULL(pd_price,0) * (IFNULL(pd_outqty,0) - IFNULL(pd_inqty,0))
-		) AS costamount
-		FROM
-		prodinout,
-		prodiodetail,
-		customer,
-		currencys
+		sum(pd_sendprice*pi_rate) as saamount,
+		sum(pd_price) as costamount,
+		sum(pd_sendprice*pi_rate)-sum(pd_price) as profit,
+		(sum(pd_sendprice*pi_rate)-sum(pd_price) )/sum(pd_sendprice*pi_rate) as profitpresent
+		from prodiodetail
+		left join prodinout on pd_piid=pi_Id
+		left join customer on cu_id = pi_custid
 		<where>
 			<if test="con != null">
 				${con}
 			</if>
 			<if test="companyId != null">
-				and  prodinout.companyid = #{companyId}
+				and prodinout.companyid = #{companyId}
 			</if>
+			and pi_class in('出货单','销售退货单')
 		</where>
-		AND	pi_id = pd_piid
-		AND pi_custid = cu_id
-		AND pi_status = '已审核'
-		AND prodinout.companyid= prodiodetail.companyid
-		AND prodiodetail.companyid = prodinout.companyid
-		AND currencys.cr_name = prodinout.pi_currency
-		AND currencys.companyid = prodinout.companyid
-		GROUP BY
-		pi_custcode,
-		pi_custname,
-		cu_type,
-		cu_sellername
+		group by pi_custid,pi_custcode,pi_custname,cu_type
+		ORDER BY pi_custname asc
 		) a
-		GROUP BY
-		a.pi_custcode,
-		a.pi_custname,
-		a.cu_type,
-		a.cu_sellername)b
 	</select>
 
 </mapper>

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

@@ -11,6 +11,8 @@
     <result column="vm_nowamount" property="vm_nowamount" jdbcType="DOUBLE" />
     <result column="vm_nowpreamount" property="vm_nowpreamount" jdbcType="DOUBLE" />
     <result column="vm_endamount" property="vm_endamount" jdbcType="DOUBLE" />
+    <result column="vm_amount_cr" property="vm_amount_cr" jdbcType="DOUBLE" />
+    <result column="vm_rate" property="vm_rate" jdbcType="DOUBLE" />
     <result column="companyid" property="companyid" jdbcType="INTEGER" />
     <result column="vm_beginpreamount" property="vm_beginpreamount" jdbcType="DOUBLE" />
     <result column="vm_nowpayamount" property="vm_nowpayamount" jdbcType="DOUBLE" />
@@ -24,13 +26,14 @@
   </sql>
 
   <select id="selectByCondition" resultMap="BaseResultMap">
-    select  *  from vendmonth
+    select  a.*,cr_rate vm_rate, cr_rate*(vm_endamount-vm_endpreamount) vm_amount_cr from vendmonth a
+    left join currencys on cr_name = a.vm_currency and currencys.companyId = a.companyid
     <where>
       <if test="con != null">
         ${con}
       </if>
       <if test="companyId != null">
-        and  companyid = #{companyId} and abs(vm_beginamount)+abs(vm_beginpreamount)+abs(vm_nowamount)+abs(vm_nowpreamount)+abs(vm_nowprepayamount)+abs(vm_nowpayamount)>0
+        and  a.companyid = #{companyId} and abs(vm_beginamount)+abs(vm_beginpreamount)+abs(vm_nowamount)+abs(vm_nowpreamount)+abs(vm_nowprepayamount)+abs(vm_nowpayamount)>0
       </if>
     </where>
     order by vm_yearmonth desc,vm_vendcode

+ 3 - 0
applications/purchase/purchase-server/src/main/java/com/usoftchina/saas/purchase/po/ProdInOutList.java

@@ -164,6 +164,7 @@ public class ProdInOutList extends CommonBaseEntity{
 
     private String pi_prstatuscode;
 
+
     //private ProductDTO productDTO;
     private Long pr_id;
     private String pr_code;
@@ -197,4 +198,6 @@ public class ProdInOutList extends CommonBaseEntity{
     private Integer iodetno;
 
     private String b2bStatus;
+
+    private String apcheckStatus;
 }

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

@@ -337,6 +337,9 @@ public class ProdInOutServiceImpl extends CommonBaseServiceImpl<ProdInOutMapper,
      * @param prodInOutDTO
      */
     private void uploadToB2B(ProdInOutDTO prodInOutDTO) {
+        if ("待上传".equals(prodInOutDTO.getB2bStatus())) {
+            throw new BizException(BizExceptionCode.PURCHASE_INOUTORDER_AUDIT_PREUPLOAD);
+        }
         if (ConfigsCache.current().enableB2B()){
             MessageInfo messageInfo = null;
             if ("采购验收单".equals(prodInOutDTO.getPi_class())){
@@ -382,7 +385,8 @@ public class ProdInOutServiceImpl extends CommonBaseServiceImpl<ProdInOutMapper,
         String pi_statuscode = prodInOutDTO.getPi_statuscode();
         if(StringUtils.isEmpty(pi_statuscode)||(!StringUtils.isEmpty(pi_statuscode)&&!pi_statuscode.equals(Status.AUDITED.name()))){
             throw  new BizException(BizExceptionCode.BIZ_UNAUDITED);
-        };
+        }
+        //明细已对账,不允许反审核
         if (ConfigsCache.current().enableB2B()) {
             //明细已对账数量
             int count = prodIODetailMapper.selectApCheckCountByFK(prodInOutDTO.getId());
@@ -416,6 +420,7 @@ public class ProdInOutServiceImpl extends CommonBaseServiceImpl<ProdInOutMapper,
      */
     private void uploadResToB2B(ProdInOutDTO prodInOutDTO) {
         if (ConfigsCache.current().enableB2B()){
+            updateB2BStatus(prodInOutDTO.getId(), "待上传");
             MessageInfo messageInfo = null;
             if ("采购验收单".equals(prodInOutDTO.getPi_class())){
                 messageInfo = new MessageInfo(BaseContextHolder.getUserId(), BillCodeSeq.PURCHASEINRES.name(), String.valueOf(prodInOutDTO.getId()), BaseContextHolder.getCompanyId());

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

@@ -52,6 +52,7 @@ import com.usoftchina.saas.transfers.dto.MessageInfo;
 import com.usoftchina.saas.utils.BeanMapper;
 import com.usoftchina.saas.utils.CollectionUtils;
 import com.usoftchina.saas.utils.JsonUtils;
+import com.usoftchina.saas.utils.ObjectUtils;
 import feign.Response;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -1050,6 +1051,7 @@ public class PurchaseServiceImpl extends CommonBaseServiceImpl<PurchaseMapper, P
         enterprise.setEnName(companyRspDTO.getName());
         enterprise.setEnTel(companyRspDTO.getTel());
         enterprise.setUu(companyRspDTO.getUu());
+        StringBuilder ids = new StringBuilder();
         for (InquiryAddDTO inquiryAddDTO : inquiryAddDTOList){
             PurcInquiry purcInquiry = new PurcInquiry();
             //询价主表信息
@@ -1080,6 +1082,10 @@ public class PurchaseServiceImpl extends CommonBaseServiceImpl<PurchaseMapper, P
             product.setSpec(inquiryAddDTO.getProdSpec());
             product.setLeadtime(new BigDecimal(inquiryAddDTO.getLeadTime()).doubleValue());
             product.setCode(inquiryAddDTO.getProdCode());
+            ProductDTO productDTO = productApi.getByProdCode(inquiryAddDTO.getProdCode()).getData();
+            if (!ObjectUtils.isEmpty(productDTO) && !"已上传".equals(productDTO.getB2bStatus())) {
+                ids.append(productDTO.getId() + ",");
+            }
             product.setUnit(inquiryAddDTO.getProdUnit());
             purcInquiryItem.setProduct(product);
 
@@ -1089,6 +1095,9 @@ public class PurchaseServiceImpl extends CommonBaseServiceImpl<PurchaseMapper, P
             purcInquiry.setInquiryItems(purcInquiryItemSet);
             purcInquiryList.add(purcInquiry);
         }
+        String prodIds = ids.substring(0, ids.length() - 1);
+        productApi.updateStatus(prodIds, "待上传");
+        productApi.uploadToB2B();
         //开启线程调用商城ap,保存询价
         int length = purcInquiryList.size();
         CountDownLatch latch = new CountDownLatch(length);

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

@@ -212,7 +212,7 @@ prodinout.creatorName creatorName,prodinout.creatorId creatorId,prodinout.create
     prodiodetail.pd_id pd_id,prodiodetail.pd_piid pd_piid,prodiodetail.pd_inoutno pd_inoutno,prodiodetail.pd_piclass pd_piclass,prodiodetail.pd_pdno pd_pdno,prodiodetail.pd_ordercode pd_ordercode,prodiodetail.pd_orderdetno pd_orderdetno,prodiodetail.pd_prodid pd_prodid,prodiodetail.pd_prodcode pd_prodcode,prodiodetail.pd_unit pd_unit,prodiodetail.pd_inqty pd_inqty,prodiodetail.pd_outqty pd_outqty,prodiodetail.pd_orderprice pd_orderprice,prodiodetail.pd_sendprice pd_sendprice,prodiodetail.pd_price pd_price,prodiodetail.pd_total pd_total,prodiodetail.pd_taxrate pd_taxrate,prodiodetail.pd_netprice pd_netprice,prodiodetail.pd_nettotal pd_nettotal,prodiodetail.pd_whid pd_whid,prodiodetail.pd_whcode pd_whcode,prodiodetail.pd_whname pd_whname,prodiodetail.pd_inwhid pd_inwhid,prodiodetail.pd_inwhcode pd_inwhcode,prodiodetail.pd_inwhname pd_inwhname,prodiodetail.pd_orderid pd_orderid,prodiodetail.pd_sdid pd_sdid,prodiodetail.pd_status pd_status,prodiodetail.pd_remark pd_remark,prodiodetail.pd_text1 pd_text1,prodiodetail.pd_text2 pd_text2,prodiodetail.pd_text3 pd_text3,
     prodiodetail.pd_text4 pd_text4,prodiodetail.pd_text5 pd_text5,prodiodetail.pd_ym pd_ym,prodiodetail.pd_yqty pd_yqty,prodiodetail.pd_ioid pd_ioid,prodiodetail.pd_ordertotal pd_ordertotal
     ,prodiodetail.pd_profit pd_profit,
-    prodiodetail.pd_profitpresent pd_profitpresent,
+    prodiodetail.pd_profitpresent pd_profitpresent,prodiodetail.apcheckStatus apcheckStatus,
   </sql>
   <sql id="Vendor_Column_List" >
     vendor.ve_id ve_id,vendor.ve_code ve_code,vendor.ve_shortname ve_shortname,vendor.ve_name ve_name,vendor.ve_uu ve_uu,vendor.ve_type ve_type,vendor.ve_begindate ve_begindate,vendor.ve_beginapamount ve_beginapamount,vendor.ve_beginprepayamount ve_beginprepayamount,vendor.ve_promisedays ve_promisedays,vendor.ve_taxrate ve_taxrate,vendor.ve_nsrzh ve_nsrzh,vendor.ve_bankaccount ve_bankaccount,vendor.ve_bankcode ve_bankcode,vendor.ve_status ve_status,vendor.ve_statuscode ve_statuscode,vendor.ve_text1 ve_text1,vendor.ve_text2 ve_text2,vendor.ve_text3 ve_text3,vendor.ve_text4 ve_text4,vendor.ve_text5 ve_text5,vendor.ve_payamount ve_payamount,vendor.ve_leftamount ve_leftamount,vendor.ve_beginym ve_beginym,vendor.ve_preamount ve_preamount,vendor.ve_remark ve_remark,vendor.ve_buyerid ve_buyerid,vendor.ve_buyercode ve_buyercode,vendor.ve_buyername ve_buyername,

+ 17 - 0
applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/controller/SaleController.java

@@ -191,12 +191,29 @@ public class SaleController {
        return Result.success();
     }
 
+    /**
+     * 转采购订单
+     * @param id
+     * @return
+     */
     @PostMapping("/saleTurnPurchase/{id}")
     public Result saleTurnPurchase(@PathVariable("id") Long id){
         DocBaseDTO baseDTO = saleService.saleTurnPurchase(id);
         return Result.success(baseDTO);
     }
 
+    /**
+     * 导入保存至列表
+     * @param id
+     * @param update
+     * @return
+     */
+    @PostMapping("/saveToFormal")
+    public Result saveToFormal(Long id, boolean update){
+        saleService.saveToFormal(id, update);
+        return Result.success();
+    }
+
     /**
      * 企业商机
      * @param remindReqDTO

+ 22 - 0
applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/mapper/DataImportMapper.java

@@ -0,0 +1,22 @@
+package com.usoftchina.saas.sale.mapper;
+
+import com.usoftchina.saas.commons.po.DataImport;
+import com.usoftchina.saas.commons.po.DataImportDetail;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+public interface DataImportMapper {
+    void deleteByCaller(@Param("caller") String caller, @Param("companyid") Long companyid);
+    int insertSelective(DataImport record);
+
+    void updateErr(@Param("err") String err, @Param("id") Integer id);
+
+    List<DataImportDetail> selectDataById(Long id);
+
+    DataImportDetail selectMainBycode(@Param("code") String code, @Param("id") int id, @Param("companyid") Long companyId);
+
+    void updateDataImport(Integer id);
+
+    void updateDataImportError(@Param("err") String err, @Param("id") int id);
+}

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

@@ -3,6 +3,8 @@ package com.usoftchina.saas.sale.mapper;
 import com.netflix.ribbon.proxy.annotation.ClientProperties;
 import com.usoftchina.saas.base.mapper.CommonBaseMapper;
 import com.usoftchina.saas.commons.dto.DocBaseDTO;
+import com.usoftchina.saas.document.dto.CustomerDTO;
+import com.usoftchina.saas.document.dto.ProductDTO;
 import com.usoftchina.saas.sale.dto.PurchaseDTO;
 import com.usoftchina.saas.sale.dto.PurchaseDetailDTO;
 import com.usoftchina.saas.sale.po.Sale;
@@ -72,4 +74,8 @@ public interface SaleMapper extends CommonBaseMapper<Sale> {
     void updateDelivery(@Param("id")Long id);
 
     void updateSaleDown(Long id);
+
+    CustomerDTO selectCustByCustCode(@Param("code") String code, @Param("companyId") Long companyId);
+
+    ProductDTO selectProductByCode(@Param("code") String code, @Param("companyId") Long companyId);
 }

+ 2 - 0
applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/service/SaleService.java

@@ -55,6 +55,8 @@ public interface SaleService {
 
     DocBaseDTO saleTurnPurchase(Long id);
 
+    void saveToFormal(Long id, boolean update);
+
     IPage<RemindRspDTO> getEnremind(RemindReqDTO remindReqDTO);
 
     IPage<RemindRspDTO> findRemindByUserInfo(RemindReqDTO remindReqDTO);

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

@@ -1,7 +1,11 @@
 package com.usoftchina.saas.sale.service.impl;
 
+import com.alibaba.fastjson.JSONObject;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
+import com.usoftchina.saas.commons.po.*;
+import com.usoftchina.saas.document.dto.CustomerDTO;
+import com.usoftchina.saas.document.dto.ProductDTO;
 import com.usoftchina.saas.inquiry.api.InquiryApi;
 import com.usoftchina.saas.inquiry.po.inquiry.*;
 import com.usoftchina.saas.account.api.AccountApi;
@@ -14,9 +18,6 @@ import com.usoftchina.saas.commons.dto.BatchDealBaseDTO;
 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.commons.po.Operation;
-import com.usoftchina.saas.commons.po.Status;
 import com.usoftchina.saas.context.BaseContextHolder;
 import com.usoftchina.saas.exception.BizException;
 import com.usoftchina.saas.page.PageDefault;
@@ -80,6 +81,8 @@ public class SaleServiceImpl implements SaleService{
     private AccountApi accountApi;
     @Autowired
     private CompanyApi companyApi;
+    @Autowired
+    private DataImportMapper dataImportMapper;
 
     private static final Logger LOGGER = LoggerFactory.getLogger(SaleServiceImpl.class);
 
@@ -675,6 +678,74 @@ public class SaleServiceImpl implements SaleService{
         return baseDTO;
     }
 
+    @Override
+    @Transactional
+    public void saveToFormal(Long id, boolean update){
+        if (null == id || "0".equals(id)) {
+            throw new BizException(BizExceptionCode.NO_DATA);
+        }
+        String userName = BaseContextHolder.getUserName();
+        Long companyId = BaseContextHolder.getCompanyId();
+        SaleFormDTO saleFormDTO = null;
+        List<DataImportDetail> details = dataImportMapper.selectDataById(id);
+        if (!CollectionUtils.isEmpty(details)) {
+            Map<String, List<DataImportDetail>> datas = CollectionUtils.groupBy(details, DataImportDetail::getDd_codevalue);
+            int detno = 0;
+            for (String code : datas.keySet()) {
+                saleFormDTO = new SaleFormDTO();
+                List<SaleDetailDTO> saleDetailDTOList = new ArrayList<>();
+                List<DataImportDetail> data = datas.get(code);
+                //准备主表数据
+                DataImportDetail main = dataImportMapper.selectMainBycode(code, id.intValue(), companyId);
+                if (StringUtils.isEmpty(main)){
+                    throw new BizException(BizExceptionCode.BIZ_REPORT_NOTCORRECT);
+                }
+                SaleDTO saleDTO = JSONObject.parseObject(main.getDd_maindata(), SaleDTO.class);
+                CustomerDTO customerDTO = saleMapper.selectCustByCustCode(saleDTO.getSa_custcode(), companyId);
+                if (ObjectUtils.isEmpty(customerDTO)) {
+                    throw new BizException(BizExceptionCode.BIZ_CUSTOMER_CODE_NOT_EXISTS.getCode(),
+                            String.format(BizExceptionCode.BIZ_CUSTOMER_CODE_NOT_EXISTS.getMessage(), saleDTO.getSa_custname() + "(" + saleDTO.getSa_custcode() + ")"));
+                }
+                if (!customerDTO.getCu_name().equals(saleDTO.getSa_custname())) {
+                    throw new BizException(79360, "客户编号" + saleDTO.getSa_custcode() + "客户名称" + saleDTO.getSa_custname() + "匹配错误");
+                }
+                saleDTO.setSa_custid(customerDTO.getId().intValue());
+                saleDTO.setId(0L);
+                saleDTO.setCreateTime(new Date());
+                saleDTO.setCreatorName(userName);
+                saleDTO.setSa_date(new Date());
+                saleDTO.setSa_status(Status.UNAUDITED.getDisplay());
+                saleDTO.setSa_statuscode(Status.UNAUDITED.name());
+
+                saleFormDTO.setMain(saleDTO);
+                //准备从表数据
+                if (data.size() > 0) {
+                    detno = 1;
+                    for (DataImportDetail detail : data) {
+                        SaleDetailDTO saleDetailDTO = JSONObject.parseObject(detail.getDd_detaildata(), SaleDetailDTO.class);
+                        //校验明细物料
+                        ProductDTO productDTO = saleMapper.selectProductByCode(saleDetailDTO.getSd_prodcode(), companyId);
+                        if (ObjectUtils.isEmpty(productDTO)) {
+                            throw new BizException(79360, "物料" + saleDetailDTO.getSd_prodcode() + "不存在");
+                        }
+                        saleDetailDTO.setSd_prodid(productDTO.getId());
+                        saleDetailDTO.setSd_detno(detno++);
+                        saleDetailDTO.setId(0L);
+                        saleDetailDTO.setSd_price(saleDetailDTO.getSd_netprice() * (100 + saleDetailDTO.getSd_taxrate()) / 100);
+                        saleDetailDTO.setSd_nettotal(saleDetailDTO.getSd_netprice() * saleDetailDTO.getSd_qty());
+                        saleDetailDTO.setSd_total(saleDetailDTO.getSd_price() * saleDetailDTO.getSd_qty());
+
+                        saleDetailDTOList.add(saleDetailDTO);
+                    }
+                }
+                saleFormDTO.setItems(saleDetailDTOList);
+                //保存
+                saleFormDTO.setCodeModified(true);
+                saveFormData(saleFormDTO);
+            }
+        }
+    }
+
     /**
      * 获取企业商机
      * @param remindReqDTO

+ 110 - 0
applications/sale/sale-server/src/main/resources/mapper/DataImportMapper.xml

@@ -0,0 +1,110 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.usoftchina.saas.sale.mapper.DataImportMapper" >
+  <resultMap id="DetailMap" type="com.usoftchina.saas.commons.po.DataImportDetail" >
+    <id column="dd_id" property="dd_id" jdbcType="INTEGER" />
+    <result column="dd_maindata" property="dd_maindata" jdbcType="VARCHAR" />
+    <result column="dd_detno" property="dd_detno" jdbcType="INTEGER" />
+    <result column="dd_diid" property="dd_diid" jdbcType="INTEGER" />
+    <result column="dd_checked" property="dd_checked" jdbcType="INTEGER" />
+    <result column="dd_success" property="dd_success" jdbcType="INTEGER" />
+    <result column="dd_toformal" property="dd_toformal" jdbcType="INTEGER" />
+    <result column="companyid" property="companyid" jdbcType="INTEGER" />
+    <result column="dd_detaildata" property="dd_detaildata" jdbcType="VARCHAR" />
+    <result column="dd_codevalue" property="dd_codevalue" jdbcType="VARCHAR" />
+  </resultMap>
+
+  <delete id="deleteByCaller">
+  delete from data_import where di_caller=#{caller} and companyid=#{companyid} and
+  il_toformal=0 and il_result is not null
+</delete>
+
+  <insert id="insertSelective" parameterType="com.usoftchina.saas.commons.po.DataImport" >
+    <selectKey  resultType="java.lang.Integer" keyProperty="di_id">
+      SELECT LAST_INSERT_ID() AS ID
+    </selectKey>
+    insert into data_import
+    <trim prefix="(" suffix=")" suffixOverrides="," >
+      <if test="di_caller != null" >
+        di_caller,
+      </if>
+      <if test="companyid != null" >
+        companyid,
+      </if>
+      <if test="di_date != null" >
+        di_date,
+      </if>
+      <if test="di_count != null" >
+        di_count,
+      </if>
+      <if test="di_result != null" >
+        di_result,
+      </if>
+      <if test="di_success != null" >
+        di_success,
+      </if>
+      <if test="di_man != null" >
+        di_man,
+      </if>
+      <if test="di_toformal != null" >
+        di_toformal,
+      </if>
+    </trim>
+    <trim prefix="values (" suffix=")" suffixOverrides="," >
+      <if test="di_caller != null" >
+        #{di_caller,jdbcType=VARCHAR},
+      </if>
+      <if test="companyid != null" >
+        #{companyid,jdbcType=INTEGER},
+      </if>
+      <if test="di_date != null" >
+        #{di_date,jdbcType=TIMESTAMP},
+      </if>
+      <if test="di_count != null" >
+        #{di_count,jdbcType=INTEGER},
+      </if>
+      <if test="di_result != null" >
+        #{di_result,jdbcType=VARCHAR},
+      </if>
+      <if test="di_success != null" >
+        #{di_success,jdbcType=INTEGER},
+      </if>
+      <if test="di_man != null" >
+        #{di_man,jdbcType=VARCHAR},
+      </if>
+      <if test="di_toformal != null" >
+        #{di_toformal,jdbcType=INTEGER},
+      </if>
+    </trim>
+  </insert>
+
+  <update id="updateErr" >
+  update data_import
+  set
+  di_result = #{err},
+  di_success = 0,
+  where di_id = #{id}
+</update>
+
+<select id="selectDataById" resultMap="DetailMap">
+  select * from  data_importdetail
+  where dd_diid = #{id}
+</select>
+
+  <select id="selectMainBycode" resultMap="DetailMap">
+    select * from  data_importdetail
+    where dd_codevalue = #{code} and dd_diid=#{id} and ifnull(dd_success,0)=0 and ifnull(dd_maindata,'')!='' and companyid=#{companyid}
+  </select>
+
+  <select id="selectMainOnly" resultMap="DetailMap">
+    select * from  data_importdetail
+    where dd_diid=#{id} and ifnull(dd_success,0)=0 and ifnull(dd_maindata,'')!='' and companyid=#{companyid}
+  </select>
+
+  <update id="updateDataImport" parameterType="integer">
+    update data_import set di_toformal=1,di_success=1  where di_id=#{id}
+  </update>
+  <update id="updateDataImportError">
+    update data_import set di_toformal=1,di_result=#{err} where di_id=#{id}
+  </update>
+</mapper>

+ 64 - 0
applications/sale/sale-server/src/main/resources/mapper/SaleMapper.xml

@@ -747,4 +747,68 @@
     update saledown set sa_salecode=null ,sa_turnstatus=null,sa_turnstatuscode=null,sa_turndate=null
     where sa_saleid= #{id}
   </update>
+
+  <resultMap id="CustomerDTOMap" type="com.usoftchina.saas.document.dto.CustomerDTO">
+    <id column="cu_id" jdbcType="INTEGER" property="id" />
+    <result column="cu_code" jdbcType="VARCHAR" property="cu_code" />
+    <result column="cu_shortname" jdbcType="VARCHAR" property="cu_shortname" />
+    <result column="cu_name" jdbcType="VARCHAR" property="cu_name" />
+    <result column="cu_uu" jdbcType="VARCHAR" property="cu_uu" />
+    <result column="cu_type" jdbcType="VARCHAR" property="cu_type" />
+    <result column="cu_begindate" jdbcType="TIMESTAMP" property="cu_begindate" />
+    <result column="cu_beginaramount" jdbcType="DOUBLE" property="cu_beginaramount" />
+    <result column="cu_beginprerecamount" jdbcType="DOUBLE" property="cu_beginprerecamount" />
+    <result column="cu_promisedays" jdbcType="DOUBLE" property="cu_promisedays" />
+    <result column="cu_taxrate" jdbcType="DOUBLE" property="cu_taxrate" />
+    <result column="cu_sellerid" jdbcType="INTEGER" property="cu_sellerid" />
+    <result column="cu_sellercode" jdbcType="VARCHAR" property="cu_sellercode" />
+    <result column="cu_sellername" jdbcType="VARCHAR" property="cu_sellername" />
+    <result column="cu_credit" jdbcType="DOUBLE" property="cu_credit" />
+    <result column="cu_status" jdbcType="VARCHAR" property="cu_status" />
+    <result column="cu_statuscode" jdbcType="VARCHAR" property="cu_statuscode" />
+    <result column="updatetime" jdbcType="TIMESTAMP" property="updateTime" />
+    <result column="cu_text1" jdbcType="VARCHAR" property="cu_text1" />
+    <result column="cu_text2" jdbcType="VARCHAR" property="cu_text2" />
+    <result column="cu_text3" jdbcType="VARCHAR" property="cu_text3" />
+    <result column="cu_text4" jdbcType="VARCHAR" property="cu_text4" />
+    <result column="cu_text5" jdbcType="VARCHAR" property="cu_text5" />
+    <result column="cu_leftamount" jdbcType="DOUBLE" property="cu_leftamount" />
+    <result column="cu_recamount" jdbcType="DOUBLE" property="cu_recamount" />
+    <result column="cu_preamount" jdbcType="DOUBLE" property="cu_preamount" />
+    <result column="cu_remark" jdbcType="VARCHAR" property="cu_remark" />
+    <result column="cu_currency" jdbcType="VARCHAR" property="cu_currency" />
+    <result column="cr_rate" jdbcType="DOUBLE" property="cr_rate" />
+  </resultMap>
+
+  <select id="selectCustByCustCode" resultMap="CustomerDTOMap">
+    select * from customer where cu_code = #{code} and companyId = #{companyId} and cu_status != '已禁用'
+  </select>
+
+  <resultMap id="ProductDTOResultMapper" type="com.usoftchina.saas.document.dto.ProductDTO">
+    <id column="pr_id" property="id" jdbcType="INTEGER"/>
+    <result column="pr_code" property="pr_code" jdbcType="VARCHAR"/>
+    <result column="pr_detail" property="pr_detail" jdbcType="VARCHAR"/>
+    <result column="pr_spec" property="pr_spec" jdbcType="VARCHAR"/>
+    <result column="pr_unit" property="pr_unit" jdbcType="VARCHAR"/>
+    <result column="pr_whid" property="pr_whid" jdbcType="INTEGER"/>
+    <result column="pr_whcode" property="pr_whcode" jdbcType="VARCHAR"/>
+    <result column="pr_whname" property="pr_whname" jdbcType="VARCHAR"/>
+    <!--productonhand-->
+    <result column="po_onhand" property="po_onhand" jdbcType="DOUBLE"/>
+    <result column="po_avprice" property="po_avprice" jdbcType="DOUBLE"/>
+    <!--productonhand-->
+    <result column="pr_kind" property="pr_kind" jdbcType="VARCHAR"/>
+    <result column="pr_orispeccode" property="pr_orispeccode" jdbcType="VARCHAR"/>
+    <result column="pr_brand" property="pr_brand" jdbcType="VARCHAR"/>
+    <result column="pr_vendname" property="pr_vendname" jdbcType="VARCHAR"/>
+    <result column="pr_zxbzs" property="pr_zxbzs" jdbcType="VARCHAR"/>
+    <result column="pr_leadtime" property="pr_leadtime" jdbcType="INTEGER"/>
+    <result column="pr_status" property="pr_status" jdbcType="VARCHAR"/>
+    <result column="pr_statuscode" property="pr_statuscode" jdbcType="VARCHAR"/>
+    <result column="pr_remark" property="pr_remark" jdbcType="VARCHAR"/>
+  </resultMap>
+
+  <select id="selectProductByCode" resultMap="ProductDTOResultMapper">
+    select * from product where pr_code = #{code} and companyId = #{companyId}
+  </select>
 </mapper>

+ 1 - 1
frontend/saas-web/app/model/report/PurchasePay.js

@@ -8,7 +8,7 @@ Ext.define('saas.model.report.PurchasePay', {
         { name: 'pbd_slcode', type: 'string' }, // 来源单号
         { name: 'pbd_slkind', type: 'string' }, // 业务类型
         { name: 'pi_nettotal', type: 'float' }, // 金额
-        { name: 'pd_total-pi_nettotal', type: 'float', // 税额
+        { name: 'pi_total-pi_nettotal', type: 'float', // 税额
             convert: function(v, rec) {
                 var t = (rec.get('pi_total') || 0.0) - (rec.get('pi_nettotal') || 0.0);
                 return Number(saas.util.BaseUtil.numberFormat(t, 2, false));

+ 4 - 5
frontend/saas-web/app/model/report/SaleProfit.js

@@ -39,13 +39,12 @@ Ext.define('saas.model.report.SaleProfit', {
         },//价税合计本位币
         { name: 'pd_price', type: 'float' },//成本单价
         { name: 'pd_total', type: 'float' },
-        { name: 'pd_profit', type: 'float' ,
+        { name: 'pd_profit', type: 'float' },
+        { name: 'pd_profit*pi_rate', type: 'float' ,
             convert: function(v, rec) {
-                var t = (((rec.get('pd_sendprice') || 0.0) * (rec.get('pi_rate') || 1.0) / (1 + (rec.get('pd_taxrate') || 0.0)/100 )) 
-                - (rec.get('pd_price') || 0.0) )*(rec.get('pd_outqty') || 0.0);
-                return Number(saas.util.BaseUtil.numberFormat(t, 2, false));
+                return Number(saas.util.BaseUtil.numberFormat((rec.get('pd_profit') || 0.0), 2, false));
             },
-            depends: ['pd_sendprice', 'pi_rate','pd_taxrate','pd_price','pd_outqty']
+            depends: ['pd_profit']
         },//毛利润(元) = ( (含税单价 * 汇率) / (1+税率%) - 成本单价 ) *  数量
         { name: 'pd_profitpresent', type: 'float',
             convert: function(v, rec) {

+ 6 - 1
frontend/saas-web/app/view/core/base/ImportWindow.js

@@ -8,6 +8,8 @@ Ext.define('saas.view.core.base.ImportWindow', {
         'Ext.container.ButtonGroup'
     ],
 
+    cls: 'import-window',
+
     bbar:['->',{
         hidden:true,
         name:'prev',
@@ -79,10 +81,11 @@ Ext.define('saas.view.core.base.ImportWindow', {
         handler:function(b){
             var form = b.ownerCt.ownerCt;
             var id = form.importId;
+            var importUploadPath = form.importUploadPath;
             if(id){
                 form.setLoading(true);
                 Ext.Ajax.request({
-                    url: '/api/document/'+form.ownerCt.caller.toLocaleLowerCase()+'/saveToFormal',//这里是填写需要跨域访问的URL
+                    url: importUploadPath || '/api/document/'+form.ownerCt.caller.toLocaleLowerCase()+'/saveToFormal',//这里是填写需要跨域访问的URL
                     method: 'post',
                     headers: {
                         'Access-Control-Allow-Origin': '*',
@@ -179,6 +182,7 @@ Ext.define('saas.view.core.base.ImportWindow', {
                             //获取模版
                             var serverOptions = Ext.manifest.server;
                             window.location.href = (serverOptions.basePath.https?serverOptions.basePath.https:serverOptions.basePath) + '/api/commons/excel/import/templet?caller='+caller;
+                            // window.open('http://10.1.80.36:8560' + '/api/commons/excel/import/templet?caller='+caller);
                         }
                     }
                 },{
@@ -251,6 +255,7 @@ Ext.define('saas.view.core.base.ImportWindow', {
                             form.setLoading(true);
                             Ext.Ajax.request({
                                 url: '/api/commons/excel/import/parse',//这里是填写需要跨域访问的URL
+                                // url: 'http://10.1.80.36:8560' + '/api/commons/excel/import/parse',//这里是填写需要跨域访问的URL
                                 cors: true,
                                 useDefaultXhrHeader: false,
                                 method: 'post',

+ 5 - 0
frontend/saas-web/app/view/core/base/ImportWindow.scss

@@ -0,0 +1,5 @@
+.x-window-dbfind {
+    .x-panel-bodyWrap .x-panel-body .x-box-inner {
+        background: #ffffff !important;
+    }
+}

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

@@ -378,17 +378,12 @@ Ext.define('saas.view.core.form.FormPanel', {
         });
 
         store.removeAll();
-        if (detailData.length > 0) {
 
-            for(let j = 0; j < detailData.length; j++) {
-                let d = detailData[j];
-                let o = {};
-                o[detnoColumn] = j + 1;
-                let r = store.add(o)[0];
-                for(let k in d) {
-                    r.set(k, d[k]);
-                }
-            }
+        if (detailData.length > 0) {
+            store.loadData(detailData.map(function(d, i) {
+                d[detnoColumn] = i + 1;
+                return d;
+            }));
         }
 
         me.isValid();

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

@@ -214,12 +214,19 @@ Ext.define('saas.view.core.query.QueryGridPanel', {
                     bind: {
                         hidden: '{!auditEnable}'
                     }
+                },  {
+                    text: '导入',
+                    handler: 'onImport',
+                    hidden: true,
+                    bind: {
+                        hidden: '{!importEnable}'
+                    }
                 },  {
                     text: '导出',
                     handler: me.onExport,
                     hidden: true,
                     bind: {
-                        hidden: '{!importEnable}'
+                        hidden: '{!exportEnable}'
                     }
                 },{
                     text: '关闭',

+ 1 - 0
frontend/saas-web/app/view/core/query/QueryPanelController.js

@@ -45,6 +45,7 @@ Ext.define('saas.view.core.query.QueryPanelController', {
     onCloseClick:function(btn){
         this.queryWin = Ext.destroy(this.queryWin);
     },
+    onImport: Ext.emptyFn,
 
     onColSetting: function() {
         var me = this,

+ 2 - 1
frontend/saas-web/app/view/core/query/QueryPanelModel.js

@@ -7,7 +7,8 @@ Ext.define('saas.view.core.query.QueryPanelModel', {
         addEnable: true, // 显示新增按钮
         auditEnable: true, // 显示审核按钮
         printEnable: true, // 显示打印按钮
-        importEnable: true, // 显示导入按钮
+        importEnable: false, // 显示导入按钮
+        exportEnable: true, // 显示导出按钮
         closeEnable: true, // 显示关闭按钮
         deleteEnable: true, // 显示删除按钮
         deleteDisable:false, //删除按钮是否可使用

+ 3 - 2
frontend/saas-web/app/view/core/report/ReportPanel.js

@@ -26,6 +26,7 @@ Ext.define('saas.view.core.report.ReportPanel', {
     printAble: true,
     exportAble: true,
     showMySummary: true,
+    mySummaryConfig: {},
     queryMode: 'DETAIL',
    
     calculateProperty: 'data.calculate',
@@ -240,11 +241,11 @@ Ext.define('saas.view.core.report.ReportPanel', {
         }];
 
         if (me.showMySummary) {
-            f.push({
+            f.push(Ext.apply({
                 ftype: 'mysummary',
                 dock: 'bottom',
                 hidden: !me.showMySummary
-            });
+            }, me.mySummaryConfig));
         }
 
         return f;

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

@@ -154,12 +154,7 @@ Ext.define('saas.view.money.report.CustomerCheckCheck', {
             var xr = (new Array(arr[1].length > 2 ? 2 : arr[1].length)).fill('0');
             var format = '0,000.' + xr.join('');
             return Ext.util.Format.number(v, format);
-        },
-        // summaryType: 'sum',
-        // summaryLabel: '价税合计(本位币)',
-        // summaryRenderer: function(v) {
-        //     return saas.util.BaseUtil.numberFormat(v, 2, true);
-        // }
+        }
     },{
         text: '币别',
         dataIndex: 'pi_currency',
@@ -174,6 +169,7 @@ Ext.define('saas.view.money.report.CustomerCheckCheck', {
             return saas.util.BaseUtil.numberFormat(v, 4, false);
         }
     },{
+        hidden:true,
         text: '价税合计(本位币)',
         width: 140,
         xtype: 'numbercolumn',

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

@@ -74,6 +74,7 @@ Ext.define('saas.view.money.report.PayDetail', {
             return saas.util.BaseUtil.numberFormat(v, 2, true);
         },
     },{
+        hidden:true,
         text: '增加应付(本位币)(元)',
         xtype: 'numbercolumn',
         exportFormat: 'Amount',
@@ -105,6 +106,7 @@ Ext.define('saas.view.money.report.PayDetail', {
             return saas.util.BaseUtil.numberFormat(v, 2, true);
         }
     },{
+        hidden:true,
         text: '增加预付(本位币)(元)',
         xtype: 'numbercolumn',
         exportFormat: 'Amount',
@@ -136,7 +138,8 @@ Ext.define('saas.view.money.report.PayDetail', {
             return saas.util.BaseUtil.numberFormat(v, 2, true);
         }
     },{
-        text: '应付余额(元)',
+        hidden:true,
+        text: '应付余额(本位币)',
         xtype: 'numbercolumn',
         exportFormat: 'Amount',
         dataIndex: 'pd_remain_cr',

+ 0 - 18
frontend/saas-web/app/view/money/report/ProfitDetail.js

@@ -49,24 +49,6 @@ Ext.define('saas.view.money.report.ProfitDetail', {
         text: '客户名称',
         dataIndex: 'pi_custname',
         width: 200,
-    }, {
-        text: '金额(元)',
-        dataIndex: 'netamount',
-        exportFormat: 'Amount',
-        xtype: 'numbercolumn',
-        width: 0,
-        renderer : function(v, m, r) {
-            return saas.util.BaseUtil.numberFormat(v, 2, true);
-        },
-    }, {
-        text: '税额(元)',
-        dataIndex: 'saamount-netamount',
-        exportFormat: 'Amount',
-        xtype: 'numbercolumn',
-        width: 0,
-        renderer : function(v, m, r) {
-            return saas.util.BaseUtil.numberFormat(v, 2, true);
-        },
     }, {
         text: '销售金额(元)',
         dataIndex: 'saamount',

+ 3 - 0
frontend/saas-web/app/view/money/report/RecDetail.js

@@ -75,6 +75,7 @@ Ext.define('saas.view.money.report.RecDetail', {
             return saas.util.BaseUtil.numberFormat(v, 2, true);
         }
     },{
+        hidden:true,
         text: '增加应收(本位币)(元)',
         dataIndex: 'rd_addrec_cr',
         exportFormat: 'Amount',
@@ -106,6 +107,7 @@ Ext.define('saas.view.money.report.RecDetail', {
             return saas.util.BaseUtil.numberFormat(v, 2, true);
         }
     },{
+        hidden:true,
         text: '增加预收(本位币)(元)',
         dataIndex: 'rd_addpre_cr',
         exportFormat: 'Amount',
@@ -137,6 +139,7 @@ Ext.define('saas.view.money.report.RecDetail', {
             return saas.util.BaseUtil.numberFormat(v, 2, true);
         }
     },{
+        hidden:true,
         text: '应收余额(本位币)(元)',
         dataIndex: 'rd_remain_cr',
         exportFormat: 'Amount',

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

@@ -44,6 +44,14 @@ Ext.define('saas.view.money.report.TotalPayDetail', {
         dataIndex: 'vm_currency',
         align:'center',
         width: 65,
+    }, {
+        text: '汇率',
+        dataIndex: 'vm_rate',
+        align:'center',
+        width: 65,
+        renderer: function (v, m, r) {
+            return saas.util.BaseUtil.numberFormat(v, 6, false);
+        }
     }, {
         text: '期初',
         columns: [{
@@ -130,11 +138,21 @@ Ext.define('saas.view.money.report.TotalPayDetail', {
         exportFormat: 'Amount',
         xtype: 'numbercolumn',
         width: 120,
+        renderer: function(v, m, r) {
+            return saas.util.BaseUtil.numberFormat(v, 2, true);
+        }
+    },{
+        hidden:true,
+        text: '应付余额(本位币)(元)',
+        dataIndex: 'vm_amount_cr',
+        exportFormat: 'Amount',
+        xtype: 'numbercolumn',
+        width: 160,
         renderer: function(v, m, r) {
             return saas.util.BaseUtil.numberFormat(v, 2, true);
         },
         summaryType: 'sum',
-        summaryLabel: '应付余额',
+        summaryLabel: '应付余额(本位币)',
         summaryRenderer: function(v, d, f, m) {
             return saas.util.BaseUtil.numberFormat(v, 2, true);
         }

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

@@ -44,6 +44,11 @@ Ext.define('saas.view.money.report.TotalRecDetail', {
         dataIndex: 'cm_currency',
         align:'center',
         width: 65,
+    }, {
+        text: '汇率',
+        dataIndex: 'cm_rate',
+        align:'center',
+        width: 65,
     }, {
         text: '期初',
         columns: [{
@@ -130,11 +135,21 @@ Ext.define('saas.view.money.report.TotalRecDetail', {
         exportFormat: 'Amount',
         xtype: 'numbercolumn',
         width: 120,
+        renderer: function(v, m, r) {
+            return saas.util.BaseUtil.numberFormat(v, 2, true);
+        }
+    }, {
+        hidden:true,
+        text: '应收余额(本位币)(元)',
+        dataIndex: 'cm_amount_cr',
+        exportFormat: 'Amount',
+        xtype: 'numbercolumn',
+        width: 160,
         renderer: function(v, m, r) {
             return saas.util.BaseUtil.numberFormat(v, 2, true);
         },
         summaryType: 'sum',
-        summaryLabel: '应收余额',
+        summaryLabel: '应收余额(本位币)',
         summaryRenderer: function(v, d, f, m) {
             return saas.util.BaseUtil.numberFormat(v, 2, true);
         }

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

@@ -158,12 +158,7 @@ Ext.define('saas.view.money.report.VendorCheck', {
             var xr = (new Array(arr[1].length > 2 ? 2 : arr[1].length)).fill('0');
             var format = '0,000.' + xr.join('');
             return Ext.util.Format.number(v, format);
-        },
-        // summaryType: 'sum',
-        // summaryLabel: '价税合计(本位币)',
-        // summaryRenderer: function(v) {
-        //     return saas.util.BaseUtil.numberFormat(v, 2, true);
-        // }
+        }
     },{
         text: '币别',
         dataIndex: 'pi_currency',
@@ -178,6 +173,7 @@ Ext.define('saas.view.money.report.VendorCheck', {
             return saas.util.BaseUtil.numberFormat(v, 4, false);
         }
     },{
+        hidden:true,
         text: '价税合计(本位币)',
         width: 140,
         xtype: 'numbercolumn',

+ 1 - 1
frontend/saas-web/app/view/money/verification/FormPanelController.js

@@ -343,7 +343,7 @@ Ext.define('saas.view.money.verification.FormPanelController', {
         codeField = form.getForm().findField(form._codeField),
         detailCount = form.detailCount,
         viewModel = me.getViewModel(),
-        codeModified = codeField && codeField.isDirty();
+        codeModified = !form.initId || (codeField && codeField.isDirty());
 
 
         //form里面数据

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

@@ -298,7 +298,11 @@ Ext.define('saas.view.purchase.purchaseIn.QueryPanel', {
                     text: '关联采购单号',
                     dataIndex: 'pi_pucode',
                     width: 150
-                }, {
+                },{
+                    text: "对账状态",
+                    dataIndex: "apcheckStatus",
+                    width: 100.0
+                },{
                     text: 'B2B上传状态',
                     dataIndex: 'b2bStatus',
                     textAlign: 'center',

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

@@ -303,7 +303,11 @@ Ext.define('saas.view.purchase.purchaseOut.QueryPanel', {
                     text: '关联验收单号',
                     dataIndex: 'pi_iocode',
                     width: 150
-                }, {
+                },{
+                    text: "对账状态",
+                    dataIndex: "apcheckStatus",
+                    width: 100.0
+                },{
                     text: 'B2B上传状态',
                     dataIndex: 'b2bStatus',
                     textAlign: 'center',

+ 95 - 4
frontend/saas-web/app/view/purchase/report/PurchasePay.js

@@ -61,11 +61,25 @@ Ext.define('saas.view.purchase.report.PurchasePay', {
         text: '税额(元)',
         xtype: 'numbercolumn',
         exportFormat: 'Amount',
-        dataIndex: 'pd_total-pi_nettotal',
+        dataIndex: 'pi_total-pi_nettotal',
         width: 120,
         renderer: function(v) {
             return saas.util.BaseUtil.numberFormat(v, 2, true);
         },
+        disableMySummary:true,
+        summaryType: 'sum',
+        summaryRenderer: function(v) {
+            return saas.util.BaseUtil.numberFormat(v, 2, true);
+        }
+    },{
+        hidden:true,
+        text: '税额(本位币)(元)',
+        dataIndex: '(pi_total-pi_nettotal)*pi_rate',
+        exportFormat: 'Amount',
+        xtype: 'numbercolumn',
+        width: 120,
+        summaryType: 'sum',
+        summaryLabel: '税额(本位币)'
     }, {
         text: '价税合计(元)',
         xtype: 'numbercolumn',
@@ -75,20 +89,34 @@ Ext.define('saas.view.purchase.report.PurchasePay', {
         renderer: function(v) {
             return saas.util.BaseUtil.numberFormat(v, 2, true);
         },
+        disableMySummary:true,
+        summaryType: 'sum',
+        summaryRenderer: function(v) {
+            return saas.util.BaseUtil.numberFormat(v, 2, true);
+        }
     }, {
         text: '付款金额(元)',
         dataIndex: 'pbd_nowbalance',
         exportFormat: 'Amount',
         xtype: 'numbercolumn',
         width: 120,
-        summaryType: 'sum',
-        summaryLabel: '付款金额',
         renderer: function(v) {
             return saas.util.BaseUtil.numberFormat(v, 2, true);
         },
+        disableMySummary:true,
+        summaryType: 'sum',
         summaryRenderer: function(v) {
             return saas.util.BaseUtil.numberFormat(v, 2, true);
         }
+    },{
+        hidden:true,
+        text: '付款金额(本位币)(元)',
+        dataIndex: 'pbd_nowbalance*pi_rate',
+        exportFormat: 'Amount',
+        xtype: 'numbercolumn',
+        width: 120,
+        summaryType: 'sum',
+        summaryLabel: '付款金额(本位币)'
     }, {
         text: '币别',
         dataIndex: 'pi_currency',
@@ -110,6 +138,69 @@ Ext.define('saas.view.purchase.report.PurchasePay', {
         text: '备注',
         dataIndex: 'pb_remark',
         width: 250
-    }]
+    }],
+
+    // 自定义合计逻辑,直接使用后台返回的内容作为合计栏内容
+    mySummaryConfig: {
+        renderSummaryData: [],
+        mySummaryTpl: [
+            '<table class="x-grid-row-mysummary x-mmmmmmmmmmmm">',
+                '<tbody>',
+                    '<tr>',
+                        '<tpl for=".">',
+                        '<td class="x-grid-cell x-grid-td x-grid-cell-numbercolumn-1526 x-unselectable x-mysummary-item">',
+                            '<div class="x-grid-cell-inner x-mysummary-item-cell">{label}',
+                                '{str}',
+                            '</div>',
+                        '</td>',
+                        '</tpl>',
+                    '</tr>',
+                '</tbody>',
+            '</table>',
+        ],
+        initSummarys: function() {
+            var me = this,
+            summaryData = me.renderSummaryData;
+            
+            var summarys = [{
+                str: JSON.stringify(summaryData)
+            }];
+            this.summarys = summarys;
+            return summarys;
+        },
+        updateSummarys: function() {
+            var me = this,
+            summaryData = me.renderSummaryData;
+            var summarys = [{
+                str: JSON.stringify(summaryData)
+            }];
+            this.summarys = summarys;
+            return summarys;
+        },
+        applySummarys: function(response) {
+            var me = this,
+            grid = me.grid;
+            var _res = response,
+            _calculateProperty = grid.calculateProperty;
+
+            var _root = _calculateProperty.split('.')[0];
+            eval('var ' + _root + ' = _res[_root];');
+            try {
+                summaryData = [];
+                try {
+                    summaryData = eval(_calculateProperty);
 
+                    if(!Ext.isArray(summaryData)) {
+                        summaryData = [];
+                    }
+                }catch(e) {
+                    // don't care this...
+                }
+                me.renderSummaryData =summaryData;
+            } catch (e) {
+                console.error(e);
+                saas.util.BaseUtil.showErrorToast(e.message);
+            }
+        }
+    }
 });

+ 2 - 2
frontend/saas-web/app/view/sale/b2b/PurchaseDetail.js

@@ -62,9 +62,9 @@ Ext.define('saas.view.sale.b2b.PurchaseDetail', {
                     vtype: 'positiveNumber'
                 }
             }, {
-                name: "sa_status",
+                name: "sa_turnstatus",
                 xtype: "textfield",
-                fieldLabel: "单状态",
+                fieldLabel: "单状态",
                 readOnly: true
             }, {
                 xtype: 'textfield',

+ 1 - 1
frontend/saas-web/app/view/sale/report/SaleProfit.js

@@ -193,7 +193,7 @@ Ext.define('saas.view.sale.report.SaleProfit', {
         }
     }, {
         text: '毛利润(元)',
-        dataIndex: 'pd_profit',
+        dataIndex: 'pd_profit*pi_rate',
         exportFormat: 'Amount',
         xtype: 'numbercolumn',
         renderer: function(v) {

+ 35 - 2
frontend/saas-web/app/view/sale/report/SaleRec.js

@@ -66,8 +66,22 @@ Ext.define('saas.view.sale.report.SaleRec', {
         renderer : function(v, m, r) {
             return saas.util.BaseUtil.numberFormat(v, 2, true);
         },
+        disableMySummary:true,
         summaryType: 'sum',
-        summaryLabel: '税额',
+        summaryRenderer: function(v) {
+            return saas.util.BaseUtil.numberFormat(v, 2, true);
+        }
+    },{
+        hidden:true,
+        text: '税额(元)',
+        xtype: 'numbercolumn',
+        exportFormat: 'Amount',
+        dataIndex: '(pi_total-pi_nettotal)*pi_rate',
+        renderer : function(v, m, r) {
+            return saas.util.BaseUtil.numberFormat(v, 2, true);
+        },
+        summaryType: 'sum',
+        summaryLabel: '税额(本位币)',
         summaryRenderer: function(v) {
             return saas.util.BaseUtil.numberFormat(v, 2, true);
         }
@@ -79,8 +93,8 @@ Ext.define('saas.view.sale.report.SaleRec', {
         renderer : function(v, m, r) {
             return saas.util.BaseUtil.numberFormat(v, 2, true);
         },
+        disableMySummary:true,
         summaryType: 'sum',
-        summaryLabel: '价税合计',
         summaryRenderer: function(v) {
             return saas.util.BaseUtil.numberFormat(v, 2, true);
         }
@@ -91,6 +105,25 @@ Ext.define('saas.view.sale.report.SaleRec', {
         dataIndex: 'rbd_nowbalance',
         renderer : function(v, m, r) {
             return saas.util.BaseUtil.numberFormat(v, 2, true);
+        },
+        disableMySummary:true,
+        summaryType: 'sum',
+        summaryRenderer: function(v) {
+            return saas.util.BaseUtil.numberFormat(v, 2, true);
+        }
+    },{
+        hidden:true,
+        text: '收款金额(元)',
+        xtype: 'numbercolumn',
+        exportFormat: 'Amount',
+        dataIndex: 'rbd_nowbalance*pi_rate',
+        renderer : function(v, m, r) {
+            return saas.util.BaseUtil.numberFormat(v, 2, true);
+        },
+        summaryType: 'sum',
+        summaryLabel: '收款金额(本位币)',
+        summaryRenderer: function(v) {
+            return saas.util.BaseUtil.numberFormat(v, 2, true);
         }
     }, {
         text: '币别',

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

@@ -6,6 +6,9 @@ Ext.define('saas.view.sale.sale.QueryPanel', {
     viewModel: 'sale-sale-querypanel',
 
     viewName: 'sale-sale-querypanel',
+
+    caller: 'Sale',
+    importUploadPath: '/api/sale/sale/saveToFormal',
     
     initComponent: function() {
         var me = this;
@@ -154,8 +157,7 @@ Ext.define('saas.view.sale.sale.QueryPanel', {
                     text: '备注',
                     dataIndex: 'sa_remark',
                     width: 250
-                }
-            ],
+                }],
                 relativeColumn: [ {
                     text: 'id',
                     dataIndex: 'sa_id',

+ 27 - 0
frontend/saas-web/app/view/sale/sale/QueryPanelController.js

@@ -50,5 +50,32 @@ Ext.define('saas.view.sale.sale.QueryPanelController', {
             }
         });
 
+    },
+
+    onImport: function() {
+        var me = this;
+        var view = me.getView();
+        var panelEl = view.getEl();
+        var box = panelEl.getBox();
+        var height = box.height;
+        var width = box.width;
+
+        var win = view.add(Ext.create('saas.view.core.base.ImportWindow', {  
+            cls:'x-window-dbfind', 
+            belong:view,  
+            modal:true,
+            height: height * 0.8,
+            width: width * 0.8,
+            title: '导入',
+            scrollable: true,
+            bodyPadding: 10,
+            constrain: true,
+            closable: true,
+            layout:'fit',
+            caller: view.caller,
+            importUploadPath: view.importUploadPath,
+            renderTo:view.getEl()
+        }));
+        win.show();
     }
 });

+ 5 - 1
frontend/saas-web/app/view/sale/sale/QueryPanelModel.js

@@ -1,5 +1,9 @@
 Ext.define('saas.view.sale.sale.QueryPanelModel', {
     extend: 'saas.view.core.query.QueryPanelModel',
-    alias: 'viewmodel.sale-sale-querypanel'
+    alias: 'viewmodel.sale-sale-querypanel',
+
+    data: {
+        importEnable: true, // 显示导入按钮
+    }
 
 });

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

@@ -110,7 +110,9 @@ Ext.define('saas.view.stock.make.FormPanelController', {
                             to: 'ma_whname'
                         }],
                         aftertrigger: function (f, record) {
-                            me.getBomData(record.data.id)
+                            if(record.data.id&&record.data.id>0){
+                                me.getBomData(record.data.id)
+                            }
                         }
                     });
 

+ 84 - 75
frontend/saas-web/ext/packages/ux/src/feature/MySummary.js

@@ -10,6 +10,25 @@ Ext.define('Ext.ux.feature.MySummary', {
 
     showSummaryRow: true,
 
+    mySummaryTpl: [
+        '<table class="x-grid-row-mysummary">',
+            '<tbody>',
+                '<tr>',
+                    '<tpl for=".">',
+                    '<td class="x-grid-cell x-grid-td x-grid-cell-numbercolumn-1526 x-unselectable x-mysummary-item">',
+                        '<div class="x-grid-cell-inner x-mysummary-item-cell">{label}',
+                            '<tpl if="typeLabel">',
+                            '({typeLabel})',
+                            '</tpl>',
+                            ': {value}',
+                        '</div>',
+                    '</td>',
+                    '</tpl>',
+                '</tr>',
+            '</tbody>',
+        '</table>',
+    ],
+
     init: function(grid) {
         var me = this,
             view = me.view,
@@ -42,24 +61,7 @@ Ext.define('Ext.ux.feature.MySummary', {
                             '{%this.renderContent(out,values)%}',
                         '</div>'
                     ],
-                    tpl: [
-                        '<table class="x-grid-row-mysummary">',
-                            '<tbody>',
-                                '<tr>',
-                                    '<tpl for=".">',
-                                    '<td class="x-grid-cell x-grid-td x-grid-cell-numbercolumn-1526 x-unselectable x-mysummary-item">',
-                                        '<div class="x-grid-cell-inner x-mysummary-item-cell">{label}',
-                                            '<tpl if="typeLabel">',
-                                            '({typeLabel})',
-                                            '</tpl>',
-                                            ': {value}',
-                                        '</div>',
-                                    '</td>',
-                                    '</tpl>',
-                                '</tr>',
-                            '</tbody>',
-                        '</table>',
-                    ],
+                    tpl: me.mySummaryTpl,
                     data: me.getSummarys(),
                     height: 36,
                     scrollable: {
@@ -83,63 +85,7 @@ Ext.define('Ext.ux.feature.MySummary', {
         });
 
         store.on('load', function( s, records, successful, operation, eOpts) {
-            var _res = operation._response.responseJson,
-            _calculateProperty = grid.calculateProperty,
-            _rootProperty = grid.rootProperty;
-
-            var _root = _calculateProperty.split('.')[0];
-            eval('var ' + _root + ' = _res[_root];');
-            try {
-                var columns = grid.columns,
-                summaryData = [],
-                datas = [];
-                try {
-                    summaryData = eval(_calculateProperty);
-                    datas = eval(_rootProperty);
-
-                    if(!Ext.isArray(summaryData)) {
-                        summaryData = [];
-                    }
-                    if(!Ext.isArray(datas)) {
-                        datas = [];
-                    }
-                }catch(e) {
-                    // don't care this...
-                }
-                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) {
-                        if(typeof c.mySummaryRenderer == 'function') {
-                            c.summaryValue = c.mySummaryRenderer(grid, c, datas);
-                        }else if (type == 'count') {
-                            c.summaryValue = Ext.util.Format.number(d[name], c.format || '0');
-                        } else if (typeof c.summaryRenderer == 'function') {
-                            c.summaryValue = c.summaryRenderer(d[name]);
-                        } else if (typeof c.renderer == 'function') {
-                            c.summaryValue = c.renderer(d[name]);
-                        } else {
-                            c.summaryValue = Ext.util.Format.number(d[name], c.format || '0.00');
-                        }
-                    } else if(type && !d) {
-                        if(typeof c.mySummaryRenderer == 'function') {
-                            c.summaryValue = c.mySummaryRenderer(grid, c, datas);
-                        }else {
-                            c.summaryValue = me.applySummaryValue(datas, c);
-                        }
-                    } else {
-                        c.summaryValue = null;
-                    }
-                });
-                return datas;
-            } catch (e) {
-                console.error(e);
-                saas.util.BaseUtil.showErrorToast(e.message);
-            }
+            me.applySummarys(operation._response.responseJson);
         });
 
         me.bindStore(grid, store);
@@ -245,6 +191,69 @@ Ext.define('Ext.ux.feature.MySummary', {
         }
     },
 
+    // 处理后台返回的合计数据,默认将合计值赋予对应列
+    applySummarys: function(response) {
+        var me = this,
+        grid = me.grid;
+        var _res = response,
+        _calculateProperty = grid.calculateProperty,
+        _rootProperty = grid.rootProperty;
+
+        var _root = _calculateProperty.split('.')[0];
+        eval('var ' + _root + ' = _res[_root];');
+        try {
+            var columns = grid.columns,
+            summaryData = [],
+            datas = [];
+            try {
+                summaryData = eval(_calculateProperty);
+                datas = eval(_rootProperty);
+
+                if(!Ext.isArray(summaryData)) {
+                    summaryData = [];
+                }
+                if(!Ext.isArray(datas)) {
+                    datas = [];
+                }
+            }catch(e) {
+                // don't care this...
+            }
+            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) {
+                    if(typeof c.mySummaryRenderer == 'function') {
+                        c.summaryValue = c.mySummaryRenderer(grid, c, datas);
+                    }else if (type == 'count') {
+                        c.summaryValue = Ext.util.Format.number(d[name], c.format || '0');
+                    } else if (typeof c.summaryRenderer == 'function') {
+                        c.summaryValue = c.summaryRenderer(d[name]);
+                    } else if (typeof c.renderer == 'function') {
+                        c.summaryValue = c.renderer(d[name]);
+                    } else {
+                        c.summaryValue = Ext.util.Format.number(d[name], c.format || '0.00');
+                    }
+                } else if(type && !d) {
+                    if(typeof c.mySummaryRenderer == 'function') {
+                        c.summaryValue = c.mySummaryRenderer(grid, c, datas);
+                    }else {
+                        c.summaryValue = me.applySummaryValue(datas, c);
+                    }
+                } else {
+                    c.summaryValue = null;
+                }
+            });
+            return datas;
+        } catch (e) {
+            console.error(e);
+            saas.util.BaseUtil.showErrorToast(e.message);
+        }
+    },
+
     applySummaryValue: function(datas, c) {
         var dataIndex = c.dataIndex,
         type = c.summaryType,