Browse Source

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

rainco 7 years ago
parent
commit
e409924530
59 changed files with 2494 additions and 81 deletions
  1. 6 0
      applications/money/money-server/src/main/java/com/usoftchina/saas/money/po/Payablesdetail.java
  2. 6 0
      applications/money/money-server/src/main/java/com/usoftchina/saas/money/po/Receivablesdetail.java
  3. 1 0
      applications/money/money-server/src/main/resources/mapper/PayablesdetailMapper.xml
  4. 2 1
      applications/money/money-server/src/main/resources/mapper/ReceivablesdetailMapper.xml
  5. 1 1
      applications/operation/operation-server/src/main/resources/mapper/AccoutMapper.xml
  6. 66 0
      applications/purchase/purchase-dto/src/main/java/com/usoftchina/saas/purchase/dto/InquiryAddDTO.java
  7. 47 0
      applications/purchase/purchase-dto/src/main/java/com/usoftchina/saas/purchase/dto/InquiryDealReqDTO.java
  8. 47 0
      applications/purchase/purchase-dto/src/main/java/com/usoftchina/saas/purchase/dto/InquiryReplayDTO.java
  9. 108 0
      applications/purchase/purchase-dto/src/main/java/com/usoftchina/saas/purchase/dto/InquiryReqDTO.java
  10. 133 0
      applications/purchase/purchase-dto/src/main/java/com/usoftchina/saas/purchase/dto/InquiryRspDTO.java
  11. 100 0
      applications/purchase/purchase-dto/src/main/java/com/usoftchina/saas/purchase/dto/QuotationRspDTO.java
  12. 33 4
      applications/purchase/purchase-server/src/main/java/com/usoftchina/saas/purchase/controller/PurchaseController.java
  13. 2 0
      applications/purchase/purchase-server/src/main/java/com/usoftchina/saas/purchase/po/report/PurchasePay.java
  14. 21 3
      applications/purchase/purchase-server/src/main/java/com/usoftchina/saas/purchase/service/PurchaseService.java
  15. 163 10
      applications/purchase/purchase-server/src/main/java/com/usoftchina/saas/purchase/service/impl/PurchaseServiceImpl.java
  16. 5 4
      applications/purchase/purchase-server/src/main/resources/application.yml
  17. 1 0
      applications/purchase/purchase-server/src/main/resources/mapper/PurchaseReportMapper.xml
  18. 108 0
      applications/sale/sale-dto/src/main/java/com/usoftchina/saas/sale/dto/RemindRspDTO.java
  19. 11 0
      applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/controller/SaleController.java
  20. 2 0
      applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/po/report/SalerecView.java
  21. 3 0
      applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/service/SaleService.java
  22. 53 5
      applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/service/impl/SaleServiceImpl.java
  23. 3 2
      applications/sale/sale-server/src/main/resources/application.yml
  24. 1 0
      applications/sale/sale-server/src/main/resources/mapper/SalerecViewMapper.xml
  25. 3 4
      applications/transfers/mall-api/src/main/java/com/usoftchina/inquiry/api/InquiryApi.java
  26. 15 0
      applications/transfers/mall-api/src/main/java/com/usoftchina/inquiry/api/ProductApi.java
  27. 1 2
      applications/transfers/mall-api/src/main/java/com/usoftchina/inquiry/api/SearchApi.java
  28. 32 0
      applications/transfers/mall-api/src/main/java/com/usoftchina/inquiry/api/SearchUUApi.java
  29. 41 4
      applications/transfers/mall-api/src/test/java/com/usoftchina/inquiry/test/InquiryApiTest.java
  30. 28 0
      applications/transfers/mall-api/src/test/java/com/usoftchina/inquiry/test/ProductApiTest.java
  31. 47 0
      applications/transfers/mall-api/src/test/java/com/usoftchina/inquiry/test/SearchUUApiTest.java
  32. 9 4
      applications/transfers/mall-api/src/test/resources/application.yml
  33. 23 4
      base-servers/account/account-dto/src/main/java/com/usoftchina/saas/account/dto/CompanyRspDTO.java
  34. 1 1
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/service/impl/AccountCenterServiceImpl.java
  35. 1 1
      base-servers/account/account-server/src/main/resources/mapper/CompanyMapper.xml
  36. 2 2
      frontend/operation-web/app/view/cuservice/Feedback.js
  37. 2 2
      frontend/operation-web/app/view/statistical/CompanyAnalysis.js
  38. 2 2
      frontend/operation-web/app/view/statistical/CompanyRegInfo.js
  39. 2 2
      frontend/operation-web/app/view/statistical/LoginLog.js
  40. 2 2
      frontend/operation-web/app/view/statistical/PersonRegInfo.js
  41. 9 4
      frontend/saas-portal-web/src/components/conenter/invitation.vue
  42. 7 4
      frontend/saas-portal-web/src/pages/invitation_mobile_join/invitation_mobile_join.html
  43. 18 7
      frontend/saas-portal-web/static/css/invitation_mobile_join.css
  44. BIN
      frontend/saas-portal-web/static/img/assets/expand.png
  45. BIN
      frontend/saas-portal-web/static/img/invitation_join_background.png
  46. 1 1
      frontend/saas-web/app/view/main/MainController.js
  47. 17 0
      frontend/saas-web/app/view/main/Navigation.js
  48. 428 0
      frontend/saas-web/app/view/purchase/deviceQuery/DataList.js
  49. 10 0
      frontend/saas-web/app/view/purchase/deviceQuery/DataListController.js
  50. 4 0
      frontend/saas-web/app/view/purchase/deviceQuery/DataListlModel.js
  51. 376 0
      frontend/saas-web/app/view/purchase/quotationList/DataList.js
  52. 10 0
      frontend/saas-web/app/view/purchase/quotationList/DataListController.js
  53. 4 0
      frontend/saas-web/app/view/purchase/quotationList/DataListlModel.js
  54. 421 0
      frontend/saas-web/app/view/purchase/sendQuotation/DataList.js
  55. 10 0
      frontend/saas-web/app/view/purchase/sendQuotation/DataListController.js
  56. 4 0
      frontend/saas-web/app/view/purchase/sendQuotation/DataListlModel.js
  57. 1 0
      frontend/saas-web/app/view/sys/maxnumbers/DataList.js
  58. 18 0
      frontend/saas-web/app/view/viewport/ViewportController.js
  59. 22 5
      frontend/saas-web/resources/json/navigation.json

+ 6 - 0
applications/money/money-server/src/main/java/com/usoftchina/saas/money/po/Payablesdetail.java

@@ -37,6 +37,12 @@ public class Payablesdetail {
 
     private Integer pd_ym;
 
+    private String pd_currency;
+
+    public String getPd_currency() { return  pd_currency; }
+
+    public void setPd_currency(String pd_currency) { this.pd_currency = pd_currency; }
+
     public Integer getPd_ym() {
         return pd_ym;
     }

+ 6 - 0
applications/money/money-server/src/main/java/com/usoftchina/saas/money/po/Receivablesdetail.java

@@ -37,6 +37,12 @@ public class Receivablesdetail {
 
     private Integer rd_ym;
 
+    private String rd_currency;
+
+    public String getRd_currency() { return  rd_currency; }
+
+    public void setRd_currency(String rd_currency) {this.rd_currency = rd_currency; }
+
     public Integer getRd_ym() {
         return rd_ym;
     }

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

@@ -19,6 +19,7 @@
     <result column="pd_status" property="pd_status" jdbcType="INTEGER" />
     <result column="pd_query" property="pd_query" jdbcType="INTEGER" />
     <result column="pd_ym" property="pd_ym" jdbcType="INTEGER" />
+    <result column="pd_currency" property="pd_currency" jdbcType="VARCHAR" />
   </resultMap>
   <sql id="Base_Column_List" >
     pd_id, pd_detno, pd_vendid, pd_vendcode, pd_vendname, pd_date, pd_code, pd_kind, 

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

@@ -19,11 +19,12 @@
     <result column="rd_status" property="rd_status" jdbcType="INTEGER" />
     <result column="rd_query" property="rd_query" jdbcType="INTEGER" />
     <result column="rd_ym" property="rd_ym" jdbcType="INTEGER" />
+    <result column="rd_currency" property="rd_currency" jdbcType="VARCHAR"/>
   </resultMap>
   <sql id="Base_Column_List" >
     rd_id, rd_detno, rd_custid, rd_custcode, rd_custname, rd_date, rd_code, rd_kind, 
     rd_sellerid, rd_sellername, rd_addrec, rd_addpre, rd_remain, companyid, rd_status, 
-    rd_query,rd_ym
+    rd_query,rd_ym,rd_currency
   </sql>
 
   <select id="selectByCondition" resultMap="BaseResultMap">

+ 1 - 1
applications/operation/operation-server/src/main/resources/mapper/AccoutMapper.xml

@@ -45,7 +45,7 @@
     </where>
     </select>
     <select id="getLogin" parameterType="string" resultMap="loginMap">
-        SELECT * FROM (select account_id  ,count(account_id) login_num,max(ac_account.realname) username,max(login_time) lastesttime, max(ac_account.mobile) mobile from au_authorize_log left join saas_account.ac_account on account_id= ac_account.id  where login_time >  date_sub(now(),interval 3 MONTH) GROUP BY account_id order by lastesttime desc
+        SELECT * FROM (select account_id  ,count(account_id) login_num,max(ac_account.realname) username,max(login_time) lastesttime, max(ac_account.mobile) mobile from saas_auth.au_authorize_log left join saas_account.ac_account on account_id= ac_account.id  where login_time >  date_sub(now(),interval 3 MONTH) GROUP BY account_id order by lastesttime desc
         )login_info
         <where>
             <if test="con != null">

+ 66 - 0
applications/purchase/purchase-dto/src/main/java/com/usoftchina/saas/purchase/dto/InquiryAddDTO.java

@@ -0,0 +1,66 @@
+package com.usoftchina.saas.purchase.dto;
+
+import java.io.Serializable;
+
+/**
+ * @Description 发起询价
+ * @Author chenwei
+ * @Date 2019/01/08
+ */
+public class InquiryAddDTO implements Serializable {
+
+    private String prodCode;
+    private String prodName;
+    private String prodSpec;
+    private String prodOrispeccode;
+    private String prodBrand;
+    private Long leadTime;
+
+    public String getProdCode() {
+        return prodCode;
+    }
+
+    public void setProdCode(String prodCode) {
+        this.prodCode = prodCode;
+    }
+
+    public String getProdName() {
+        return prodName;
+    }
+
+    public void setProdName(String prodName) {
+        this.prodName = prodName;
+    }
+
+    public String getProdSpec() {
+        return prodSpec;
+    }
+
+    public void setProdSpec(String prodSpec) {
+        this.prodSpec = prodSpec;
+    }
+
+    public String getProdOrispeccode() {
+        return prodOrispeccode;
+    }
+
+    public void setProdOrispeccode(String prodOrispeccode) {
+        this.prodOrispeccode = prodOrispeccode;
+    }
+
+    public String getProdBrand() {
+        return prodBrand;
+    }
+
+    public void setProdBrand(String prodBrand) {
+        this.prodBrand = prodBrand;
+    }
+
+    public Long getLeadTime() {
+        return leadTime;
+    }
+
+    public void setLeadTime(Long leadTime) {
+        this.leadTime = leadTime;
+    }
+}

+ 47 - 0
applications/purchase/purchase-dto/src/main/java/com/usoftchina/saas/purchase/dto/InquiryDealReqDTO.java

@@ -0,0 +1,47 @@
+package com.usoftchina.saas.purchase.dto;
+
+import java.io.Serializable;
+
+/**
+ * @Description 报价采纳拒绝
+ * @Author chenwei
+ * @Date 2019/01/08
+ */
+public class InquiryDealReqDTO implements Serializable {
+    /**
+     * 报价单ID
+     */
+    private Long id;
+    /**
+     * 是否采纳:1是 0否
+     */
+    private Short status;
+    /**
+     * 拒绝原因
+     */
+    private String refusereason;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Short getStatus() {
+        return status;
+    }
+
+    public void setStatus(Short status) {
+        this.status = status;
+    }
+
+    public String getRefusereason() {
+        return refusereason;
+    }
+
+    public void setRefusereason(String refusereason) {
+        this.refusereason = refusereason;
+    }
+}

+ 47 - 0
applications/purchase/purchase-dto/src/main/java/com/usoftchina/saas/purchase/dto/InquiryReplayDTO.java

@@ -0,0 +1,47 @@
+package com.usoftchina.saas.purchase.dto;
+
+import java.io.Serializable;
+
+/**
+ * @Description TODO
+ * @Author chenwei
+ * @Date 2019/01/08
+ */
+public class InquiryReplayDTO implements Serializable {
+    /**
+     * id
+     */
+    private Long id;
+    /**
+     * (买家或卖家定义的)分段数量
+     */
+    private Double lapQty;
+    /**
+     * (卖家报的)单价
+     */
+    private Double price;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Double getLapQty() {
+        return lapQty;
+    }
+
+    public void setLapQty(Double lapQty) {
+        this.lapQty = lapQty;
+    }
+
+    public Double getPrice() {
+        return price;
+    }
+
+    public void setPrice(Double price) {
+        this.price = price;
+    }
+}

+ 108 - 0
applications/purchase/purchase-dto/src/main/java/com/usoftchina/saas/purchase/dto/InquiryReqDTO.java

@@ -0,0 +1,108 @@
+package com.usoftchina.saas.purchase.dto;
+
+import java.io.Serializable;
+
+/**
+ * @Description TODO
+ * @Author chenwei
+ * @Date 2019/01/08
+ */
+public class InquiryReqDTO implements Serializable {
+
+    /**
+     * 页码
+     */
+    private int pageNumber;
+    /**
+     * 每页条数
+     */
+    private int pageSize;
+    /**
+     * 关键词
+     */
+    private String keyword;
+    /**
+     * 企业UU
+     */
+    private Long enUU;
+    /**
+     *  已报价:1, 未报价:0
+     */
+    private Long quoted;
+    /**
+     * 开始日期
+     */
+    private Long fromDate;
+    /**
+     * 结束日期
+     */
+    private Long endDate;
+    /**
+     * 1已过期 0 未过期
+     */
+    private Integer overdue;
+
+    public int getPageNumber() {
+        return pageNumber;
+    }
+
+    public void setPageNumber(int pageNumber) {
+        this.pageNumber = pageNumber;
+    }
+
+    public int getPageSize() {
+        return pageSize;
+    }
+
+    public void setPageSize(int pageSize) {
+        this.pageSize = pageSize;
+    }
+
+    public String getKeyword() {
+        return keyword;
+    }
+
+    public void setKeyword(String keyword) {
+        this.keyword = keyword;
+    }
+
+    public Long getEnUU() {
+        return enUU;
+    }
+
+    public void setEnUU(Long enUU) {
+        this.enUU = enUU;
+    }
+
+    public Long getQuoted() {
+        return quoted;
+    }
+
+    public void setQuoted(Long quoted) {
+        this.quoted = quoted;
+    }
+
+    public Long getFromDate() {
+        return fromDate;
+    }
+
+    public void setFromDate(Long fromDate) {
+        this.fromDate = fromDate;
+    }
+
+    public Long getEndDate() {
+        return endDate;
+    }
+
+    public void setEndDate(Long endDate) {
+        this.endDate = endDate;
+    }
+
+    public Integer getOverdue() {
+        return overdue;
+    }
+
+    public void setOverdue(Integer overdue) {
+        this.overdue = overdue;
+    }
+}

+ 133 - 0
applications/purchase/purchase-dto/src/main/java/com/usoftchina/saas/purchase/dto/InquiryRspDTO.java

@@ -0,0 +1,133 @@
+package com.usoftchina.saas.purchase.dto;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @Description TODO
+ * @Author chenwei
+ * @Date 2019/01/08
+ */
+public class InquiryRspDTO implements Serializable {
+    /**
+     * 物料编号
+     */
+    private String prodCode;
+    /**
+     * 物料品牌
+     */
+    private String prodBrand;
+    /**
+     * 物料名称
+     */
+    private String prodName;
+    /**
+     * 物料型号
+     */
+    private String prodOrispeccode;
+    /**
+     * 物料规格
+     */
+    private String prodSpec;
+    /**
+     * 物料单位
+     */
+    private String prodUnit;
+    /**
+     * 起始日期
+     */
+    private Date startDate;
+    /**
+     * 截止日期
+     */
+    private Date endDate;
+    /**
+     * 是否已报价 1、是;0、否
+     */
+    private Short quoted;
+    /**
+     * 报价信息
+     */
+    private List<QuotationRspDTO> qutations;
+
+    public String getProdCode() {
+        return prodCode;
+    }
+
+    public void setProdCode(String prodCode) {
+        this.prodCode = prodCode;
+    }
+
+    public String getProdBrand() {
+        return prodBrand;
+    }
+
+    public void setProdBrand(String prodBrand) {
+        this.prodBrand = prodBrand;
+    }
+
+    public String getProdName() {
+        return prodName;
+    }
+
+    public void setProdName(String prodName) {
+        this.prodName = prodName;
+    }
+
+    public String getProdOrispeccode() {
+        return prodOrispeccode;
+    }
+
+    public void setProdOrispeccode(String prodOrispeccode) {
+        this.prodOrispeccode = prodOrispeccode;
+    }
+
+    public String getProdSpec() {
+        return prodSpec;
+    }
+
+    public void setProdSpec(String prodSpec) {
+        this.prodSpec = prodSpec;
+    }
+
+    public String getProdUnit() {
+        return prodUnit;
+    }
+
+    public void setProdUnit(String prodUnit) {
+        this.prodUnit = prodUnit;
+    }
+
+    public Date getStartDate() {
+        return startDate;
+    }
+
+    public void setStartDate(Date startDate) {
+        this.startDate = startDate;
+    }
+
+    public Date getEndDate() {
+        return endDate;
+    }
+
+    public void setEndDate(Date endDate) {
+        this.endDate = endDate;
+    }
+
+    public Short getQuoted() {
+        return quoted;
+    }
+
+    public void setQuoted(Short quoted) {
+        this.quoted = quoted;
+    }
+
+    public List<QuotationRspDTO> getQutations() {
+        return qutations;
+    }
+
+    public void setQutations(List<QuotationRspDTO> qutations) {
+        this.qutations = qutations;
+    }
+}

+ 100 - 0
applications/purchase/purchase-dto/src/main/java/com/usoftchina/saas/purchase/dto/QuotationRspDTO.java

@@ -0,0 +1,100 @@
+package com.usoftchina.saas.purchase.dto;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @Author chenwei
+ * @Date 2019/01/08
+ */
+public class QuotationRspDTO implements Serializable {
+
+    private Long id;
+    private String vendName;
+    private String tel;
+    private String replaceOrispeccode;
+    private Long leadTime;
+    private Double texRate;
+    /**
+     * 是否采纳 1 为已采纳 0为已拒绝  空 未处理
+     */
+    private Short agreed;
+    /**
+     * 拒绝采纳理由
+     */
+    private String refusereason;
+
+    private List<InquiryReplayDTO> replies;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getVendName() {
+        return vendName;
+    }
+
+    public void setVendName(String vendName) {
+        this.vendName = vendName;
+    }
+
+    public String getTel() {
+        return tel;
+    }
+
+    public void setTel(String tel) {
+        this.tel = tel;
+    }
+
+    public String getReplaceOrispeccode() {
+        return replaceOrispeccode;
+    }
+
+    public void setReplaceOrispeccode(String replaceOrispeccode) {
+        this.replaceOrispeccode = replaceOrispeccode;
+    }
+
+    public Long getLeadTime() {
+        return leadTime;
+    }
+
+    public void setLeadTime(Long leadTime) {
+        this.leadTime = leadTime;
+    }
+
+    public Double getTexRate() {
+        return texRate;
+    }
+
+    public void setTexRate(Double texRate) {
+        this.texRate = texRate;
+    }
+
+    public Short getAgreed() {
+        return agreed;
+    }
+
+    public void setAgreed(Short agreed) {
+        this.agreed = agreed;
+    }
+
+    public String getRefusereason() {
+        return refusereason;
+    }
+
+    public void setRefusereason(String refusereason) {
+        this.refusereason = refusereason;
+    }
+
+    public List<InquiryReplayDTO> getReplies() {
+        return replies;
+    }
+
+    public void setReplies(List<InquiryReplayDTO> replies) {
+        this.replies = replies;
+    }
+}

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

@@ -8,14 +8,13 @@ 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.page.PageRequest;
-import com.usoftchina.saas.purchase.dto.DeviceDTO;
-import com.usoftchina.saas.purchase.dto.DeviceReqDTO;
-import com.usoftchina.saas.purchase.dto.PurchaseFormDTO;
+import com.usoftchina.saas.purchase.dto.*;
 import com.usoftchina.saas.purchase.po.PurchaseList;
 import com.usoftchina.saas.purchase.service.PurchaseService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.List;
 
 
 /**
@@ -189,8 +188,38 @@ public class PurchaseController {
      * @return
      */
     @GetMapping("/device/list")
-    public Result getDevice(DeviceReqDTO deviceReqDTO){
+    public Result getDevice(DeviceReqDTO deviceReqDTO) {
         IPage<DeviceDTO> deviceDTOIPage = purchaseService.getDevice(deviceReqDTO);
         return Result.success(deviceDTOIPage);
     }
+
+    /**
+     * 询价列表
+     * @param inquiryReqDTO
+     * @return
+     */
+    @GetMapping("/inquiry/list")
+    public Result inquiryList(InquiryReqDTO inquiryReqDTO){
+        return Result.success(purchaseService.getInquiryList(inquiryReqDTO));
+    }
+
+    /**
+     * 对报价采纳/拒绝
+     * @return
+     */
+    @PostMapping("/inquiry/deal")
+    public Result dealInquiry(InquiryDealReqDTO inquiryDealReqDTO){
+        purchaseService.DealInquiry(inquiryDealReqDTO);
+        return Result.success();
+    }
+
+    /**
+     * 发起询价
+     * @return
+     */
+    @PostMapping("/inquiry/save")
+    public Result saveInquiry(List<InquiryAddDTO> inquiryAddDTO){
+        purchaseService.saveInquiry(inquiryAddDTO);
+        return Result.success();
+    }
 }

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

@@ -41,4 +41,6 @@ public class PurchasePay  extends CommonBaseEntity implements Serializable {
     private Double pi_nettotal;
 
     private String pb_manname;
+
+    private String pi_currency;
 }

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

@@ -8,13 +8,13 @@ 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.page.PageRequest;
-import com.usoftchina.saas.purchase.dto.DeviceDTO;
-import com.usoftchina.saas.purchase.dto.DeviceReqDTO;
-import com.usoftchina.saas.purchase.dto.PurchaseFormDTO;
+import com.usoftchina.saas.purchase.dto.*;
 import com.usoftchina.saas.purchase.mapper.PurchaseMapper;
 import com.usoftchina.saas.purchase.po.Purchase;
 import com.usoftchina.saas.purchase.po.PurchaseList;
 
+import java.util.List;
+
 /**
  * @author yingp
  * @date 2018/10/9
@@ -147,4 +147,22 @@ public interface PurchaseService extends CommonBaseService<PurchaseMapper, Purch
      * @return
      */
     IPage<DeviceDTO> getDevice(DeviceReqDTO deviceReqDTO);
+    /**
+     * 查询询价列表
+     * @param inquiryReqDTO
+     * @return
+     */
+    IPage<InquiryRspDTO> getInquiryList(InquiryReqDTO inquiryReqDTO);
+
+    /**
+     * 报价信息的采纳/拒绝
+     * @param inquiryDealReqDTO
+     */
+    void DealInquiry(InquiryDealReqDTO inquiryDealReqDTO);
+
+    /**
+     * 发起询价
+     * @param inquiryAddDTO
+     */
+    void saveInquiry(List<InquiryAddDTO> inquiryAddDTO);
 }

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

@@ -2,13 +2,15 @@ package com.usoftchina.saas.purchase.service.impl;
 
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
+import com.usoftchina.inquiry.api.InquiryApi;
 import com.usoftchina.inquiry.api.SearchApi;
-import com.usoftchina.inquiry.po.inquiry.IPage;
-import com.usoftchina.inquiry.po.inquiry.InquiryEnRemind;
-import com.usoftchina.inquiry.po.inquiry.InquiryRemind;
-import com.usoftchina.inquiry.po.search.FuturesEntity;
+import com.usoftchina.inquiry.po.inquiry.*;
 import com.usoftchina.inquiry.po.search.ProductEntity;
 import com.usoftchina.inquiry.po.search.SearchComponentResp;
+import com.usoftchina.saas.account.api.AccountApi;
+import com.usoftchina.saas.account.api.CompanyApi;
+import com.usoftchina.saas.account.dto.AccountDTO;
+import com.usoftchina.saas.account.dto.CompanyRspDTO;
 import com.usoftchina.saas.base.Result;
 import com.usoftchina.saas.base.service.CommonBaseServiceImpl;
 import com.usoftchina.saas.commons.api.CommonService;
@@ -26,22 +28,23 @@ import com.usoftchina.saas.exception.BizException;
 import com.usoftchina.saas.exception.ExceptionCode;
 import com.usoftchina.saas.page.PageRequest;
 import com.usoftchina.saas.purchase.dto.*;
+import com.usoftchina.saas.purchase.dto.InquiryReqDTO;
+import com.usoftchina.saas.purchase.dto.PurchaseDTO;
+import com.usoftchina.saas.purchase.dto.PurchaseDetailDTO;
+import com.usoftchina.saas.purchase.dto.PurchaseFormDTO;
 import com.usoftchina.saas.purchase.mapper.*;
 import com.usoftchina.saas.purchase.po.*;
 import com.usoftchina.saas.purchase.service.ProdInOutService;
 import com.usoftchina.saas.purchase.service.PurchaseService;
 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 org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.StringUtils;
 
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
+import java.math.BigDecimal;
+import java.util.*;
 
 
 /**
@@ -71,6 +74,12 @@ public class PurchaseServiceImpl extends CommonBaseServiceImpl<PurchaseMapper, P
     private CommonService commonService;
     @Autowired
     private SearchApi searchApi;
+    @Autowired
+    private InquiryApi inquiryApi;
+    @Autowired
+    private CompanyApi companyApi;
+    @Autowired
+    private AccountApi accountApi;
 
 
     @Override
@@ -657,7 +666,151 @@ public class PurchaseServiceImpl extends CommonBaseServiceImpl<PurchaseMapper, P
        String code = maxnumberService.getMaxnumber(caller, false).getData();
        return pushMaxnubmer(code, baseDTO.getId());
     }
-    /** 
+
+    /**
+     * 询价单列表
+     * @param inquiryReqDTO
+     * @return
+     */
+    @Override
+    public IPage<InquiryRspDTO> getInquiryList(InquiryReqDTO inquiryReqDTO) {
+        IPage<PurcInquiryItemInfo> purcInquiryItemInfoIPage = null;
+        Long enUU = companyApi.getCompanyById(BaseContextHolder.getCompanyId()).getData().getUu();
+        if (inquiryReqDTO.getQuoted() == 1){
+            purcInquiryItemInfoIPage = inquiryApi.findQuotationsByPage("done", enUU, inquiryReqDTO.getPageNumber(), inquiryReqDTO.getPageSize());
+        }else{
+            purcInquiryItemInfoIPage = inquiryApi.getInquiryList(enUU, inquiryReqDTO.getOverdue(), inquiryReqDTO.getPageNumber(), inquiryReqDTO.getPageSize(), "todo");
+        }
+        List<PurcInquiryItemInfo> purcInquiryItemInfoList =  purcInquiryItemInfoIPage.getContent();
+        if (CollectionUtils.isEmpty(purcInquiryItemInfoList)){
+            return null;
+        }
+        List<InquiryRspDTO> inquiryRspDTOList = convertToInquiryRspDTO(purcInquiryItemInfoList);
+        //转换成分页对象
+        IPage<InquiryRspDTO> remindRspDTOIPage = new IPage<InquiryRspDTO>(purcInquiryItemInfoIPage.getNumber(), purcInquiryItemInfoIPage.getSize(),
+                purcInquiryItemInfoIPage.getNumberOfElements(),inquiryRspDTOList, purcInquiryItemInfoIPage.isFirst(), purcInquiryItemInfoIPage.isLast(),
+                purcInquiryItemInfoIPage.getTotalElements());
+        return remindRspDTOIPage;
+    }
+
+    /**
+     * 报价的采纳/拒绝
+     * @param inquiryDealReqDTO
+     */
+    @Override
+    public void DealInquiry(InquiryDealReqDTO inquiryDealReqDTO) {
+        Long enUU = companyApi.getCompanyById(BaseContextHolder.getCompanyId()).getData().getUu();
+        Long userUU = accountApi.getAccountById(BaseContextHolder.getUserId()).getData().getUu();
+        if (inquiryDealReqDTO.getStatus() == 1){
+            inquiryApi.adoptQuote(inquiryDealReqDTO.getId(), inquiryDealReqDTO.getStatus(), enUU, userUU);
+        }else{
+            inquiryApi.refuseQuote(inquiryDealReqDTO.getId(), inquiryDealReqDTO.getStatus(), enUU, userUU, inquiryDealReqDTO.getRefusereason());
+        }
+    }
+
+    /**
+     * 发起询价
+     * @param inquiryAddDTOList
+     */
+    @Override
+    public void saveInquiry(List<InquiryAddDTO> inquiryAddDTOList) {
+        List<PurcInquiry> purcInquiryList = new ArrayList<PurcInquiry>();
+        CompanyRspDTO companyRspDTO = companyApi.getCompanyRspDTOById(BaseContextHolder.getCompanyId()).getData();
+        AccountDTO accountDTO = accountApi.getAccountById(BaseContextHolder.getUserId()).getData();
+        //企业信息
+        Enterprise enterprise = new Enterprise();
+        enterprise.setAdminUU(companyRspDTO.getAdminUU());
+        enterprise.setBusinesscode(companyRspDTO.getBusinessCode());
+        enterprise.setEnAddress(companyRspDTO.getAddress());
+        enterprise.setEnName(companyRspDTO.getName());
+        enterprise.setEnTel(companyRspDTO.getTel());
+        enterprise.setUu(companyRspDTO.getUu());
+        for (InquiryAddDTO inquiryAddDTO : inquiryAddDTOList){
+            PurcInquiry purcInquiry = new PurcInquiry();
+            //询价主表信息
+            purcInquiry.setEnterprise(enterprise);
+            purcInquiry.setEnName(companyRspDTO.getName());
+            purcInquiry.setRecorderUU(accountDTO.getUu());
+            purcInquiry.setDate(new Date());
+            purcInquiry.setRecorder(accountDTO.getRealname());
+            purcInquiry.setEndDate(new Date(System.currentTimeMillis() + inquiryAddDTO.getLeadTime() * 24 * 60 * 60 * 1000));
+            purcInquiry.setSourceapp("sp");
+            purcInquiry.setShip(companyRspDTO.getAddress());
+            //询价明细
+            PurcInquiryItem purcInquiryItem = new PurcInquiryItem();
+            purcInquiryItem.setCmpCode(inquiryAddDTO.getProdOrispeccode());
+            purcInquiryItem.setUserUU(accountDTO.getUu());
+            purcInquiryItem.setUserName(accountDTO.getRealname());
+            purcInquiryItem.setUserTel(accountDTO.getMobile());
+            purcInquiryItem.setProdCode(inquiryAddDTO.getProdCode());
+            purcInquiryItem.setProdTitle(inquiryAddDTO.getProdName());
+            purcInquiryItem.setSpec(inquiryAddDTO.getProdSpec());
+            purcInquiryItem.setInbrand(inquiryAddDTO.getProdBrand());
+
+            Set<PurcInquiryItem> purcInquiryItemSet = new HashSet<PurcInquiryItem>();
+            purcInquiryItemSet.add(purcInquiryItem);
+
+            purcInquiry.setInquiryItems(purcInquiryItemSet);
+            purcInquiryList.add(purcInquiry);
+        }
+        //调用商城ap,保存询价
+
+    }
+
+    /**
+     * 将平台返回的结果集转成SAAS的传输对象
+     * @param purcInquiryItemInfoList
+     * @return
+     */
+    private List<InquiryRspDTO> convertToInquiryRspDTO(List<PurcInquiryItemInfo> purcInquiryItemInfoList) {
+        List<InquiryRspDTO> inquiryRspDTOList = new ArrayList<InquiryRspDTO>();
+        for (PurcInquiryItemInfo purcInquiryItemInfo : purcInquiryItemInfoList){
+            InquiryRspDTO inquiryRspDTO = new InquiryRspDTO();
+            inquiryRspDTO.setProdCode(purcInquiryItemInfo.getProdCode());
+            inquiryRspDTO.setProdUnit(purcInquiryItemInfo.getProduct().getUnit());
+            inquiryRspDTO.setProdOrispeccode(purcInquiryItemInfo.getCmpCode());
+            inquiryRspDTO.setProdBrand(purcInquiryItemInfo.getProduct().getBrand());
+            inquiryRspDTO.setProdName(purcInquiryItemInfo.getProdTitle());
+            inquiryRspDTO.setProdSpec(purcInquiryItemInfo.getSpec());
+            inquiryRspDTO.setStartDate(purcInquiryItemInfo.getFromDate());
+            inquiryRspDTO.setEndDate(purcInquiryItemInfo.getEndDate());
+            inquiryRspDTO.setQuoted(purcInquiryItemInfo.getQuoted());
+            //报价信息
+            List<PublicInquiryItem> publicInquiryItemList = purcInquiryItemInfo.getQutations();
+            List<QuotationRspDTO> quotationRspDTOList = new ArrayList<QuotationRspDTO>();
+            if (!CollectionUtils.isEmpty(publicInquiryItemList)){
+                for (PublicInquiryItem publicInquiryItem : publicInquiryItemList){
+                    QuotationRspDTO quotationRspDTO = new QuotationRspDTO();
+                    quotationRspDTO.setId(publicInquiryItem.getId());
+                    quotationRspDTO.setVendName(publicInquiryItem.getVendName());
+                    quotationRspDTO.setTexRate(new BigDecimal(publicInquiryItem.getTaxrate()).doubleValue());
+                    quotationRspDTO.setLeadTime(publicInquiryItem.getLeadtime());
+                    quotationRspDTO.setTel(publicInquiryItem.getUserTel());
+                    quotationRspDTO.setAgreed(publicInquiryItem.getAgreed());
+                    quotationRspDTO.setReplaceOrispeccode(publicInquiryItem.getCmpCode());
+                    //分段报价信息
+                    List<PublicInquiryReply> publicInquiryReplyList = publicInquiryItem.getReplies();
+                    List<InquiryReplayDTO> inquiryReplayDTOList = new ArrayList<InquiryReplayDTO>();
+                    if (!CollectionUtils.isEmpty(publicInquiryReplyList)){
+                        for (PublicInquiryReply publicInquiryReply : publicInquiryReplyList){
+                            InquiryReplayDTO inquiryReplayDTO = new InquiryReplayDTO();
+                            inquiryReplayDTO.setId(publicInquiryReply.getId());
+                            inquiryReplayDTO.setLapQty(publicInquiryReply.getLapQty());
+                            inquiryReplayDTO.setPrice(publicInquiryReply.getPrice());
+                            inquiryReplayDTOList.add(inquiryReplayDTO);
+                        }
+                        quotationRspDTO.setReplies(inquiryReplayDTOList);
+                    }
+                    quotationRspDTOList.add(quotationRspDTO);
+                }
+                inquiryRspDTO.setQutations(quotationRspDTOList);
+            }
+            inquiryRspDTOList.add(inquiryRspDTO);
+        }
+        return inquiryRspDTOList;
+    }
+
+    /**
     * @Description
     * @Param: [id]
     * @return: com.usoftchina.saas.commons.dto.DocBaseDTO 

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

@@ -89,7 +89,8 @@ hystrix:
               isolation:
                     thread:
                         timeoutInMilliseconds: 4000
-inquiry:
-  base-url: https://test-inquiry.uuzcc.cn
-Component:
-  base-url: https://test-mall.uuzcc.cn
+b2b:
+  inquiry:
+    base-url: https://test-inquiry.uuzcc.cn
+  Component:
+    base-url: https://test-mall.uuzcc.cn

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

@@ -21,6 +21,7 @@
     <result column="pi_nettotal" property="pi_nettotal" jdbcType="DOUBLE" />
     <result column="pi_total" property="pi_total" jdbcType="DOUBLE" />
     <result column="pb_manname" property="pb_manname" jdbcType="VARCHAR"/>
+    <result column="pi_currency" property="pi_currency" jdbcType="VARCHAR"/>
   </resultMap>
   <resultMap id="ListMap" type="com.usoftchina.saas.purchase.po.report.PurchaseReportDetail">
     <id column="pu_id" property="pu_id" jdbcType="INTEGER" />

+ 108 - 0
applications/sale/sale-dto/src/main/java/com/usoftchina/saas/sale/dto/RemindRspDTO.java

@@ -46,6 +46,42 @@ public class RemindRspDTO implements Serializable {
      * 截止日期
      */
     private Date endDate;
+    /**
+     * 是否已报价, 1是  0否
+     */
+    private int quoted;
+    /**
+     * 买家联系人名称
+     */
+    private String userName;
+    /**
+     * 买家联系人UU
+     */
+    private Long userUU;
+    /**
+     * 买家联系人电话
+     */
+    private String userTel;
+    /**
+     * 询价明细ID
+     */
+    private Long sourceId;
+    /**
+     * 询价企业UU
+     */
+    private Long enUU;
+    /**
+     * 询价单录入人UU
+     */
+    private Long recorderUU;
+    /**
+     * 询价单号
+     */
+    private String inquiryCode;
+    /**
+     * 询价单ID
+     */
+    private Long inquiryId;
 
     public String getCustName() {
         return custName;
@@ -118,4 +154,76 @@ public class RemindRspDTO implements Serializable {
     public void setEndDate(Date endDate) {
         this.endDate = endDate;
     }
+
+    public int getQuoted() {
+        return quoted;
+    }
+
+    public void setQuoted(int quoted) {
+        this.quoted = quoted;
+    }
+
+    public String getUserName() {
+        return userName;
+    }
+
+    public void setUserName(String userName) {
+        this.userName = userName;
+    }
+
+    public Long getUserUU() {
+        return userUU;
+    }
+
+    public void setUserUU(Long userUU) {
+        this.userUU = userUU;
+    }
+
+    public String getUserTel() {
+        return userTel;
+    }
+
+    public void setUserTel(String userTel) {
+        this.userTel = userTel;
+    }
+
+    public Long getSourceId() {
+        return sourceId;
+    }
+
+    public void setSourceId(Long sourceId) {
+        this.sourceId = sourceId;
+    }
+
+    public Long getEnUU() {
+        return enUU;
+    }
+
+    public void setEnUU(Long enUU) {
+        this.enUU = enUU;
+    }
+
+    public Long getRecorderUU() {
+        return recorderUU;
+    }
+
+    public void setRecorderUU(Long recorderUU) {
+        this.recorderUU = recorderUU;
+    }
+
+    public String getInquiryCode() {
+        return inquiryCode;
+    }
+
+    public void setInquiryCode(String inquiryCode) {
+        this.inquiryCode = inquiryCode;
+    }
+
+    public Long getInquiryId() {
+        return inquiryId;
+    }
+
+    public void setInquiryId(Long inquiryId) {
+        this.inquiryId = inquiryId;
+    }
 }

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

@@ -2,6 +2,7 @@ package com.usoftchina.saas.sale.controller;
 
 import com.github.pagehelper.PageInfo;
 import com.usoftchina.inquiry.po.inquiry.IPage;
+import com.usoftchina.inquiry.po.inquiry.PublicInquiryItem;
 import com.usoftchina.saas.base.Result;
 import com.usoftchina.saas.commons.dto.BatchDealBaseDTO;
 import com.usoftchina.saas.commons.dto.DocBaseDTO;
@@ -215,4 +216,14 @@ public class SaleController {
         IPage<RemindRspDTO> remindRspDTOIPage = saleService.findRemindByUserInfo(remindReqDTO);
         return Result.success(remindRspDTOIPage);
     }
+
+    /**
+     * 报价
+     * @param publicInquiryItem
+     * @return
+     */
+    @PostMapping("/businessChance/saveQuote")
+    public Result saveQuote(PublicInquiryItem publicInquiryItem){
+        return Result.success(saleService.saveQuote(publicInquiryItem));
+    }
 }

+ 2 - 0
applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/po/report/SalerecView.java

@@ -41,4 +41,6 @@ public class SalerecView {
     private Double pi_total;
 
     private Double pi_nettotal;
+
+    private String pi_currency;
 }

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

@@ -2,6 +2,7 @@ package com.usoftchina.saas.sale.service;
 
 import com.github.pagehelper.PageInfo;
 import com.usoftchina.inquiry.po.inquiry.IPage;
+import com.usoftchina.inquiry.po.inquiry.PublicInquiryItem;
 import com.usoftchina.saas.commons.dto.BatchDealBaseDTO;
 import com.usoftchina.saas.commons.dto.DocBaseDTO;
 import com.usoftchina.saas.commons.dto.ListReqDTO;
@@ -52,4 +53,6 @@ public interface SaleService {
     IPage<RemindRspDTO> getEnremind(RemindReqDTO remindReqDTO);
 
     IPage<RemindRspDTO> findRemindByUserInfo(RemindReqDTO remindReqDTO);
+
+    String saveQuote(PublicInquiryItem publicInquiryItem);
 }

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

@@ -6,6 +6,7 @@ import com.usoftchina.inquiry.api.InquiryApi;
 import com.usoftchina.inquiry.po.inquiry.IPage;
 import com.usoftchina.inquiry.po.inquiry.InquiryEnRemind;
 import com.usoftchina.inquiry.po.inquiry.InquiryRemind;
+import com.usoftchina.inquiry.po.inquiry.PublicInquiryItem;
 import com.usoftchina.saas.account.api.AccountApi;
 import com.usoftchina.saas.account.api.CompanyApi;
 import com.usoftchina.saas.base.Result;
@@ -33,13 +34,13 @@ import com.usoftchina.saas.sale.service.ProdInOutService;
 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 com.usoftchina.saas.utils.CollectionUtils;
-import com.usoftchina.saas.utils.DateUtils;
-import com.usoftchina.saas.utils.JsonUtils;
+import com.usoftchina.saas.utils.*;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.ui.ModelMap;
 import org.springframework.util.StringUtils;
 
 import java.util.*;
@@ -78,6 +79,8 @@ public class SaleServiceImpl implements SaleService{
     @Autowired
     private CompanyApi companyApi;
 
+    private static final Logger LOGGER = LoggerFactory.getLogger(SaleServiceImpl.class);
+
     @Override
     public PageInfo<SaleList> getListData(@PageDefault(size = 10) PageRequest page, ListReqDTO req) {
         PageHelper.startPage(page.getNumber(), page.getSize());
@@ -678,7 +681,7 @@ public class SaleServiceImpl implements SaleService{
         Long enUU = companyApi.getCompanyById(BaseContextHolder.getCompanyId()).getData().getUu();
         //Long userUU = 1000002503L, enUU = 10041559L;
         IPage<InquiryEnRemind> inquiryEnRemindIPage = inquiryApi.findEnRemind(userUU, enUU, remindReqDTO.getPageNumber(),
-                remindReqDTO.getPageSize(), remindReqDTO.getEnableOffer(), remindReqDTO.getKeyword(), /*remindReqDTO.getQuoted(),*/
+                remindReqDTO.getPageSize(), remindReqDTO.getEnableOffer(), remindReqDTO.getKeyword(), remindReqDTO.getQuoted(),
                 remindReqDTO.getFromDate(), remindReqDTO.getEndDate());
         List<InquiryEnRemind> inquiryEnRemindList = inquiryEnRemindIPage.getContent();
         if (CollectionUtils.isEmpty(inquiryEnRemindList)){
@@ -716,6 +719,23 @@ public class SaleServiceImpl implements SaleService{
         return remindRspDTOIPage;
     }
 
+    /**
+     * 报价
+     * @param publicInquiryItem
+     * @return
+     */
+    @Override
+    public String saveQuote(PublicInquiryItem publicInquiryItem) {
+        Long enUU = companyApi.getCompanyById(BaseContextHolder.getCompanyId()).getData().getUu();
+        Long userUU = accountApi.getAccountById(BaseContextHolder.getUserId()).getData().getUu();
+        publicInquiryItem.setVendUU(enUU);
+        publicInquiryItem.setVendUserUU(userUU);
+        LOGGER.info("publicInquiryItem, {}", JsonUtils.toJsonString(publicInquiryItem));
+        ModelMap modelMap = inquiryApi.saveQuote(publicInquiryItem);
+        LOGGER.info("返回结果, ModelMap{}", JsonUtils.toJsonString(modelMap));
+        return null;
+    }
+
     /**
      * 将平台返回的结果集转成SAAS的传输对象
      * @param data
@@ -738,6 +758,20 @@ public class SaleServiceImpl implements SaleService{
                 remindRspDTO.setNeedQty(inquiryEnRemind.getNeedQty());
                 remindRspDTO.setStartDate(inquiryEnRemind.getReDate());
                 remindRspDTO.setEndDate(inquiryEnRemind.getEndDate());
+                if (ObjectUtils.isEmpty(inquiryEnRemind.getQuotation())){
+                    remindRspDTO.setQuoted(0);
+                }else{
+                    remindRspDTO.setQuoted(1);
+                }
+                Long userUU = inquiryEnRemind.getInquiry().getRecorderUU();
+                remindRspDTO.setUserName(inquiryEnRemind.getUserName());
+                remindRspDTO.setUserTel(inquiryEnRemind.getUserTel());
+                remindRspDTO.setUserUU(userUU);
+                remindRspDTO.setSourceId(inquiryEnRemind.getItemId());
+                remindRspDTO.setEnUU(inquiryEnRemind.getEnUU());
+                remindRspDTO.setRecorderUU(userUU);
+                remindRspDTO.setInquiryCode(inquiryEnRemind.getCode());
+                remindRspDTO.setInquiryId(inquiryEnRemind.getId());
                 remindRspDTOList.add(remindRspDTO);
             }
         }else if("personal".equals(type)){
@@ -753,6 +787,20 @@ public class SaleServiceImpl implements SaleService{
                 remindRspDTO.setNeedQty(inquiryRemind.getNeedQty());
                 remindRspDTO.setStartDate(inquiryRemind.getReDate());
                 remindRspDTO.setEndDate(inquiryRemind.getEndDate());
+                if (ObjectUtils.isEmpty(inquiryRemind.getQuotation())){
+                    remindRspDTO.setQuoted(0);
+                }else{
+                    remindRspDTO.setQuoted(1);
+                }
+                Long userUU = inquiryRemind.getInquiry().getRecorderUU();
+                remindRspDTO.setUserName(inquiryRemind.getUserName());
+                remindRspDTO.setUserTel(inquiryRemind.getUserTel());
+                remindRspDTO.setUserUU(userUU);
+                remindRspDTO.setSourceId(inquiryRemind.getItemId());
+                remindRspDTO.setEnUU(inquiryRemind.getEnUU());
+                remindRspDTO.setRecorderUU(userUU);
+                remindRspDTO.setInquiryCode(inquiryRemind.getCode());
+                remindRspDTO.setInquiryId(inquiryRemind.getId());
                 remindRspDTOList.add(remindRspDTO);
             }
         }

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

@@ -89,5 +89,6 @@ hystrix:
               isolation:
                     thread:
                         timeoutInMilliseconds: 4000
-inquiry:
-  base-url: https://test-inquiry.uuzcc.cn
+b2b:
+  inquiry:
+    base-url: https://test-inquiry.uuzcc.cn

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

@@ -18,6 +18,7 @@
     <result column="rbd_amount" property="rbd_amount" jdbcType="DOUBLE" />
     <result column="pi_nettotal" property="pi_nettotal" jdbcType="DOUBLE" />
     <result column="pi_total" property="pi_total" jdbcType="DOUBLE" />
+    <result column="pi_currency" property="pi_currency" jdbcType="VARCHAR" />
   </resultMap>
   <select id="selectByCondition" resultMap="BaseResultMap">
     select  *  from Salerec_View

+ 3 - 4
applications/transfers/mall-api/src/main/java/com/usoftchina/inquiry/api/InquiryApi.java

@@ -5,7 +5,7 @@ import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.ui.ModelMap;
 import org.springframework.web.bind.annotation.*;
 
-@FeignClient(url = "${inquiry.base-url}", name = "inquiry-server")
+@FeignClient(url = "${b2b.inquiry.base-url}", name = "inquiry-server")
 @RequestMapping("/inquiry")
 public interface InquiryApi {
 
@@ -36,7 +36,7 @@ public interface InquiryApi {
     IPage<InquiryEnRemind> findEnRemind(@RequestParam("useruu") Long useruu, @RequestParam("enuu") Long enuu,
                                         @RequestParam("pageNumber") int pageNumber, @RequestParam("pageSize") int pageSize,
                                         @RequestParam("enableOffer") Integer enableOffer, @RequestParam("keyword") String keyword,
-                                        /*@RequestParam("quoted") Integer quoted, */@RequestParam("fromDate") Long fromDate,
+                                        @RequestParam("quoted") Integer quoted, @RequestParam("fromDate") Long fromDate,
                                         @RequestParam("endDate") Long endDate);
 
     /**
@@ -98,8 +98,7 @@ public interface InquiryApi {
      * @return
      */
     @GetMapping("/buyer/quotations")
-    IPage<PurcInquiryItemInfo> findQuotationsByPage(@RequestParam(value = "state", defaultValue = "done") String state,
-                                                    @RequestParam("enUU") Long enUU,
+    IPage<PurcInquiryItemInfo> findQuotationsByPage(@RequestParam("state") String state, @RequestParam("enUU") Long enUU,
                                                     @RequestParam("pageNumber") int pageNumber, @RequestParam("pageSize") int pageSize);
 
     /**

+ 15 - 0
applications/transfers/mall-api/src/main/java/com/usoftchina/inquiry/api/ProductApi.java

@@ -0,0 +1,15 @@
+package com.usoftchina.inquiry.api;
+
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+@FeignClient(url = "${b2b.product.base-url}", name = "product-server")
+@RequestMapping("/product")
+public interface ProductApi {
+
+    @PostMapping("/erp/save")
+    void saveProducts(@RequestParam("data") String data, @RequestParam("enUU")Long enUU);
+
+}

+ 1 - 2
applications/transfers/mall-api/src/main/java/com/usoftchina/inquiry/api/SearchApi.java

@@ -1,11 +1,10 @@
 package com.usoftchina.inquiry.api;
 
-import com.usoftchina.inquiry.po.inquiry.IPage;
 import com.usoftchina.inquiry.po.search.SearchComponentResp;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.*;
 
-@FeignClient(url = "${Component.base-url}", name = "search-server")
+@FeignClient(url = "${b2b.Component.base-url}", name = "search-server")
 @RequestMapping("/search")
 public interface SearchApi {
 

+ 32 - 0
applications/transfers/mall-api/src/main/java/com/usoftchina/inquiry/api/SearchUUApi.java

@@ -0,0 +1,32 @@
+package com.usoftchina.inquiry.api;
+
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.ui.ModelMap;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import java.util.Map;
+
+@FeignClient(url = "${b2b.uu.base-url}", name = "b2b-server")
+@RequestMapping("/public")
+public interface SearchUUApi {
+    /**
+     * 通过企业名称获取UU号, 全名称匹配
+     * @param data
+     * @return
+     */
+    @GetMapping("/queriable/batch/members")
+    Map<String, Map<String, Object>> queryEnterprises(@RequestParam("data") String data);
+
+    /**
+     * 按企业名称、简称、UU号等查找企业信息, 模糊匹配
+     * @param name
+     * @param shortName
+     * @param uu
+     * @return
+     */
+    @GetMapping("/queriable/members")
+    ModelMap queryEnterprise(@RequestParam("name") String name, @RequestParam("shortName") String shortName, @RequestParam("uu") Long uu);
+
+}

+ 41 - 4
applications/transfers/mall-api/src/test/java/com/usoftchina/inquiry/test/InquiryApiTest.java

@@ -13,9 +13,7 @@ import org.springframework.test.context.junit4.SpringRunner;
 import org.springframework.ui.ModelMap;
 
 import javax.naming.directory.InvalidSearchFilterException;
-import java.util.Date;
-import java.util.HashSet;
-import java.util.Set;
+import java.util.*;
 
 /**
  * 询报价接口测试
@@ -44,7 +42,7 @@ public class InquiryApiTest {
 
     @Test
     public void testB_findEnRemind(){
-        IPage<InquiryEnRemind> inquiryEnRemindIPage = inquiryApi.findEnRemind(userUU, enUU, pageNum, pageSize, 0, "", /*0,*/ null, null);
+        IPage<InquiryEnRemind> inquiryEnRemindIPage = inquiryApi.findEnRemind(userUU, enUU, pageNum, pageSize, 0, "", 0, null, null);
         System.out.println(JsonUtils.toJsonString(inquiryEnRemindIPage));
     }
 
@@ -57,6 +55,45 @@ public class InquiryApiTest {
     @Test
     public void testD_saveQuote(){
         PublicInquiryItem publicInquiryItem = new PublicInquiryItem();
+        publicInquiryItem.setSourceId(2443698L);
+        publicInquiryItem.setVendUU(10050549L);     //祝通鸿
+        publicInquiryItem.setVendUserUU(1000027410L);   //祝通鸿
+        publicInquiryItem.setIsReplace((short) 0);
+        publicInquiryItem.setCmpCode("MT8783V");
+        publicInquiryItem.setSpec("MT8783V/CT,VFBGA641,SMD,无卤");
+        publicInquiryItem.setDate(new Date());
+        publicInquiryItem.setEndDate(new Date(System.currentTimeMillis() + 3 * 24 * 60 * 60 * 1000));
+        publicInquiryItem.setInbrand("MTK");
+        publicInquiryItem.setProdTitle("控制器IC");
+        publicInquiryItem.setQutoApp("sp");
+        publicInquiryItem.setCurrency("RMB");
+        publicInquiryItem.setLeadtime(3L);
+        publicInquiryItem.setTaxrate(0.16f);
+        //分段报价信息
+        List<PublicInquiryReply> replyList = new ArrayList<PublicInquiryReply>();
+        PublicInquiryReply publicInquiryReply = new PublicInquiryReply();
+        publicInquiryReply.setLapQty(100.0);
+        publicInquiryReply.setPrice(23.13);
+        replyList.add(publicInquiryReply);
+        publicInquiryReply = new PublicInquiryReply();
+        publicInquiryReply.setLapQty(200.0);
+        publicInquiryReply.setPrice(22.13);
+        replyList.add(publicInquiryReply);
+
+        //买家采购员信息
+        publicInquiryItem.setUserName("何炎");
+        publicInquiryItem.setUserTel("13978887888");
+        publicInquiryItem.setUserUU(1000012297L);
+        //询价单信息
+        PublicInquiry inquiry = new PublicInquiry();
+        inquiry.setId(2293571L);
+        inquiry.setEnUU(10050573L);
+        inquiry.setRecorderUU(1000012297L);
+        inquiry.setCode("sp1546790412000295579");
+
+        publicInquiryItem.setInquiry(inquiry);
+        publicInquiryItem.setReplies(replyList);
+        System.out.println(JsonUtils.toJsonString(publicInquiryItem));
         ModelMap modelMap = inquiryApi.saveQuote(publicInquiryItem);
         System.out.println(JsonUtils.toJsonString(modelMap));
     }

+ 28 - 0
applications/transfers/mall-api/src/test/java/com/usoftchina/inquiry/test/ProductApiTest.java

@@ -0,0 +1,28 @@
+package com.usoftchina.inquiry.test;
+
+import com.usoftchina.inquiry.api.ProductApi;
+import org.junit.FixMethodOrder;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.MethodSorters;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest
+@FixMethodOrder(MethodSorters.NAME_ASCENDING)
+public class ProductApiTest {
+
+    @Autowired
+    private ProductApi productApi;
+
+    @Test
+    public void testA_saveProduct(){
+        String data = "[{\"pr_code\":\"0204020020015\",\"pr_detail\":\"P沟道场效应管\",\"pr_id\":3057682,\"pr_ispubsale\":0,\"pr_ispurchase\":1,\"pr_issale\":1,\"pr_isshow\":0,\"pr_leadtime\":28.0,\"pr_ltinstock\":0.0,\"pr_spec\":\"WPM1485-6/TR,-7.4A,-12V,DFN8,SMD,无卤/WPM1485-6/TR/Will SEMI\",\"pr_unit\":\"PCS\",\"pr_zxbzs\":3000.0,\"pr_zxdhl\":3000.0},{\"pr_code\":\"B2B001\",\"pr_detail\":\"B2B平台测试\",\"pr_id\":50688771,\"pr_ispubsale\":0,\"pr_ispurchase\":1,\"pr_issale\":1,\"pr_isshow\":0,\"pr_leadtime\":0.0,\"pr_orispeccode\":\"LMK01020ISQX/NOPB\",\"pr_spec\":\"B2B平台测试01\",\"pr_unit\":\"PCS\",\"pr_uuid\":\"1200200000000521\",\"pr_zxbzs\":0.0,\"pr_zxdhl\":0.0}]";
+        Long enUU = 10050573L;
+        productApi.saveProducts(data, enUU);
+        System.out.println("success");
+    }
+
+}

+ 47 - 0
applications/transfers/mall-api/src/test/java/com/usoftchina/inquiry/test/SearchUUApiTest.java

@@ -0,0 +1,47 @@
+package com.usoftchina.inquiry.test;
+
+import com.usoftchina.inquiry.api.SearchUUApi;
+import com.usoftchina.saas.utils.CollectionUtils;
+import com.usoftchina.saas.utils.JsonUtils;
+import org.junit.FixMethodOrder;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.MethodSorters;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.ui.ModelMap;
+
+import java.util.Map;
+
+/**
+ * @Description 获取UU号测试
+ * @Author chenwei
+ * @Date 2019/01/09
+ */
+@RunWith(SpringRunner.class)
+@SpringBootTest
+@FixMethodOrder(MethodSorters.NAME_ASCENDING)
+public class SearchUUApiTest {
+
+    @Autowired
+    private SearchUUApi searchUUApi;
+
+    @Test
+    public void testA_queryEnterprises(){
+        String enterpriseName = "祝通鸿2";
+        Map<String, Map<String, Object>> resultMap = searchUUApi.queryEnterprises(enterpriseName);
+        if (CollectionUtils.isEmpty(resultMap)){
+            System.out.println("empty result!");
+        }
+        System.out.println(JsonUtils.toJsonString(resultMap));
+    }
+
+    @Test
+    public void testB_queryEnterprise(){
+        String enterpriseName = "陈炜测试企业";
+        ModelMap modelMap = searchUUApi.queryEnterprise(enterpriseName, null, null);
+        System.out.println(JsonUtils.toJsonString(modelMap));
+    }
+
+}

+ 9 - 4
applications/transfers/mall-api/src/test/resources/application.yml

@@ -1,4 +1,9 @@
-inquiry:
-  base-url: https://test-inquiry.uuzcc.cn
-Component:
-  base-url: https://test-mall.uuzcc.cn
+b2b:
+  inquiry:
+    base-url: https://test-inquiry.uuzcc.cn
+  Component:
+    base-url: https://test-mall.uuzcc.cn
+  product:
+    base-url: http://test-product.uuzcc.cn
+  uu:
+    base-url: https://test-b2b.uuzcc.cn

+ 23 - 4
base-servers/account/account-dto/src/main/java/com/usoftchina/saas/account/dto/CompanyRspDTO.java

@@ -22,7 +22,8 @@ public class CompanyRspDTO implements Serializable {
      * 是否开通saas
      */
     private boolean saas_;
-    private String uu;
+    private Long uu;
+    private String tel;
     /**
      * 所属行业
      */
@@ -47,6 +48,24 @@ public class CompanyRspDTO implements Serializable {
 
     private String adminMobile;
 
+    private Long adminUU;
+
+    public String getTel() {
+        return tel;
+    }
+
+    public void setTel(String tel) {
+        this.tel = tel;
+    }
+
+    public Long getAdminUU() {
+        return adminUU;
+    }
+
+    public void setAdminUU(Long adminUU) {
+        this.adminUU = adminUU;
+    }
+
     public String getAdminMobile() {
         return adminMobile;
     }
@@ -103,11 +122,11 @@ public class CompanyRspDTO implements Serializable {
         this.defaultCompanyId = defaultCompanyId;
     }
 
-    public String getUu() {
+    public Long getUu() {
         return uu;
     }
 
-    public void setUu(String uu) {
+    public void setUu(Long uu) {
         this.uu = uu;
     }
 
@@ -159,7 +178,7 @@ public class CompanyRspDTO implements Serializable {
         this.default_ = default_;
     }
 
-    public CompanyRspDTO(String name, String businessCode, String address, boolean default_, boolean saas_, String uu, String admin, Long adminId, String type, String adminMobile) {
+    public CompanyRspDTO(String name, String businessCode, String address, boolean default_, boolean saas_, Long uu, String admin, Long adminId, String type, String adminMobile) {
         this.name = name;
         this.businessCode = businessCode;
         this.address = address;

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

@@ -166,7 +166,7 @@ public class AccountCenterServiceImpl implements AccountCenterService {
                         ssoUserSpace.getRegAddress(),
                         false,
                         false,
-                        ssoUserSpace.getSpaceUU()!=null ? ssoUserSpace.getSpaceUU().toString() : "0",
+                        ssoUserSpace.getSpaceUU()!=null ? ssoUserSpace.getSpaceUU() : 0,
                         ssoUserSpace.getAdmin()!=null ? ssoUserSpace.getAdmin().getVipName() : null,
                         0L,
                         ssoUserSpace.getProfession(),

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

@@ -117,7 +117,7 @@
     </select>
     <select id="findByFuzzyName" parameterType="java.lang.String" resultType="com.usoftchina.saas.account.dto.CompanyRspDTO">
         SELECT
-          ac.id,ac.name,aa.realname admin,aa.mobile adminMobile
+          ac.id,ac.name,aa.realname admin,aa.mobile adminMobile,aa.uu adminUU,ac.uu,ac.tel,ac.address,ac.business_code businessCode
         FROM
           ac_company ac
           INNER JOIN ac_account aa on ac.creator_id = aa.id

+ 2 - 2
frontend/operation-web/app/view/cuservice/Feedback.js

@@ -22,8 +22,8 @@ Ext.define('saas.view.cuservice.Feedback', {
             }],
 
             gridConfig: {
-                // dataUrl: '/api/operation/customerFeedBack/list',
-                dataUrl: 'http://10.1.80.35:9040/customerFeedBack/list',
+                dataUrl: '/api/operation/customerFeedBack/list',
+                // dataUrl: 'http://10.1.80.35:9040/customerFeedBack/list',
                 columns: [{
                     text: 'id',
                     dataIndex: 'cf_id',

+ 2 - 2
frontend/operation-web/app/view/statistical/CompanyAnalysis.js

@@ -18,8 +18,8 @@ Ext.define('saas.view.statistical.CompanyAnalysis', {
             }],
 
             gridConfig: {
-                // dataUrl: '/api/operation/data/getCompany',
-                dataUrl: 'http://10.1.80.35:9040/data/getConpanyAnalyze',
+                dataUrl: '/api/operation/data/getConpanyAnalyze',
+                // dataUrl: 'http://10.1.80.35:9040/data/getConpanyAnalyze',
                 columns: [{
                     text: 'ID',
                     dataIndex: 'ca_id',

+ 2 - 2
frontend/operation-web/app/view/statistical/CompanyRegInfo.js

@@ -18,8 +18,8 @@ Ext.define('saas.view.statistical.CompanyRegInfo', {
             }],
 
             gridConfig: {
-                // dataUrl: '/api/operation/data/getCompany',
-                dataUrl: 'http://10.1.80.35:9040/data/getCompany',
+                dataUrl: '/api/operation/data/getCompany',
+                // dataUrl: 'http://10.1.80.35:9040/data/getCompany',
                 columns: [{
                     text: '注册时间',
                     dataIndex: 'create_time',

+ 2 - 2
frontend/operation-web/app/view/statistical/LoginLog.js

@@ -17,8 +17,8 @@ Ext.define('saas.view.statistical.LoginLog', {
             }],
 
             gridConfig: {
-                // dataUrl: '/api/operation/data/getLogin',
-                dataUrl: 'http://10.1.80.35:9040/data/getLogin',
+                dataUrl: '/api/operation/data/getLogin',
+                // dataUrl: 'http://10.1.80.35:9040/data/getLogin',
                 columns: [{
                     text: 'id',
                     dataIndex: 'account_id',

+ 2 - 2
frontend/operation-web/app/view/statistical/PersonRegInfo.js

@@ -17,8 +17,8 @@ Ext.define('saas.view.statistical.PersonRegInfo', {
             }],
 
             gridConfig: {
-                // dataUrl: '/api/operation/data/getAccount',
-                dataUrl: 'http://10.1.80.35:9040/data/getAccount',
+                dataUrl: '/api/operation/data/getAccount',
+                // dataUrl: 'http://10.1.80.35:9040/data/getAccount',
                 columns: [{
                     text: 'id',
                     dataIndex: 'id',

+ 9 - 4
frontend/saas-portal-web/src/components/conenter/invitation.vue

@@ -87,8 +87,7 @@ import { log } from 'util';
         },
         methods:{
             browserRedirect() {
-                let url1 = window.location.href;
-                let param = url1.substring(url1.lastIndexOf('=')+1, url1.length);
+                let param = this.getUrlParam('param');
                 var sUserAgent = navigator.userAgent.toLowerCase();
                 var bIsIpad = sUserAgent.match(/ipad/i) == "ipad";
                 var bIsIphoneOs = sUserAgent.match(/iphone os/i) == "iphone os";
@@ -251,10 +250,16 @@ import { log } from 'util';
                     }
                 })
             },
+            getUrlParam(name){   
+                var reg=new RegExp("(^|&)"+name+"=([^&]*)(&|$)");   
+                var index = window.location.href.indexOf('?')
+                var r=window.location.href.substr(index+1).match(reg);   
+                if  (r!=null)   return decodeURI(r[2]); 
+                return   null;   
+            },
             //同步获取页面参数
             param: async function () {
-                let url1 = window.location.href;
-                let param = url1.substring(url1.lastIndexOf('=')+1, url1.length);
+                let param = this.getUrlParam('param');
                 let data = await this.$ajax({
                     url: this.$url.api+"/api/commons/share/valid/param?param="+param,
                     method:'POST',

+ 7 - 4
frontend/saas-portal-web/src/pages/invitation_mobile_join/invitation_mobile_join.html

@@ -26,6 +26,9 @@
                 if(hostname.indexOf('saas-dev')>-1){
                     api = 'https://saas-api-dev.usoftchina.com:5443'
                 }
+                if(hostname.indexOf('saas-test')>-1){
+                    api = 'https://saas-api-test.usoftchina.com:5443'
+                }
                 $( "#dialog-message" ).dialog({
                     autoOpen : false, 
                     modal: true,
@@ -184,7 +187,7 @@
         </script> 
     </head>
     <body>
-        <div class="x-join" style="width:100%;">
+        <div class="x-join" style="width:100%;    min-height: 600px;">
             <div class="x-join-center" hidden>
                 <div class="subtitle">U企云服</div>
                 <div style="margin:20px 0 0 0px">
@@ -200,13 +203,13 @@
                 <button style="position: absolute;" class="btn-check" type="button" id="checkBtn" onclick="getCode()">获取验证码</button>
                 <input class="input_style" id="selectName" type="text" placeholder="请输入姓名"></input>
                 <select class="input_style " id="selectJob" placeholder="请选择岗位(必填)"></select>
-                <button style="position: absolute;" class="expand_icon" type="button" ></button>
+                <!-- <button style="position: absolute;" class="expand_icon" type="button" ></button> -->
                 <button class="btn-submit" style="border-radius: 30px;width: 80%;      margin-top: 40px;   font-size: 18px; height: 47px;" type="button" id="joinBtn" onclick="join();">提 交</button>
             </div>
-            <div class="x-join-bottom" style=" display:table-cell;font-size:12px;font-height:14px;vertical-align:middle;text-align:center;   height: 50px;">
+            <!-- <div class="x-join-bottom" style=" display:table-cell;font-size:12px;font-height:14px;vertical-align:middle;text-align:center;   height: 50px;">
                 <span class="x-bottom-text">U企云服 | 电子行业企业管理云端方案</span>
                 <span class="x-bottom-text" style="    margin-top: 2px;">深圳市优软科技有限公司</span>
-            </div>
+            </div> -->
             <div class="x-join-error" hidden>
                 </br></br></br></br>
                 <span id="error_code" style="padding:0 0 0 5px;color: #2f2c27;">访问链接已失效</span>

+ 18 - 7
frontend/saas-portal-web/static/css/invitation_mobile_join.css

@@ -3,24 +3,35 @@
 	padding: 0;
 	box-sizing: border-box
 }
-body, html {
+select{
+    /* 解决select下拉箭头在ios上不兼容的问题 */
+    appearance: none;
+    -webkit-appearance: none;
+    -moz-appearance: none;
+    background-origin: content-box;
+    background: url(../img/assets/expand.png) no-repeat scroll right center transparent;
+}
+html,body{
+    height: 100%;
+    width: 100%;
 }
 body {
     background-repeat: no-repeat;
     background-position: center;
-    background-attachment: fixed;
+    height: 100%;
     z-index: -1;
     width: 100%;
     background-size: cover;
-    background-image: url(../img/invitation_background.png);
+    background-image: url(../img/invitation_join_background.png);
 	font-family: Microsoft YaHei, 微软雅黑, simhei;
 	font-size: 18px;
 	color:#333;	
 }
 .x-join-bottom {
+    right: 0;
+    position: fixed;
     bottom: 0;
     width: 100%;
-    position: absolute;
     height: 55px;
 	text-align: center;
 	background-color: #fff;
@@ -102,6 +113,7 @@ body {
 	margin: 15px 5px 0 30px;
 }
 .input_style{
+    padding-right: 13px;
     border-radius: 30px;
     opacity: 0.8;
     border: 1px solid #bdbdbd;
@@ -116,15 +128,14 @@ body {
     display: block;
     color: #555;
     background-color: #fff;
-    background-image: none;
     border: 1px solid #656565;
 }
 .expand_icon{
     border: none;
-    margin-left: 70%;
+    margin-left: 75%;
     position: absolute;
     margin-top: -26px;
-    display: inline-block;
+    display: block;
     height: 16px;
     width: 28px;
     background: url(../img/assets/expand.png)no-repeat right;

BIN
frontend/saas-portal-web/static/img/assets/expand.png


BIN
frontend/saas-portal-web/static/img/invitation_join_background.png


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

@@ -365,7 +365,7 @@ Ext.define('saas.view.main.MainController', {
                                     success: function(response, o){
                                         var res = Ext.decode(response.responseText);
                                         var url = res.data;
-                                        f.setValue(url)
+                                        f.setValue(url + '&_noc=1')
                                     },
                                     failure: function (response, opts) {
                                         saas.util.BaseUtil.showErrorToast('获取分享地址失败');

+ 17 - 0
frontend/saas-web/app/view/main/Navigation.js

@@ -86,6 +86,23 @@ Ext.define('saas.view.main.Navigation', {
             menuId = 'navMenu-' + id,
             menu = Ext.getCmp(menuId);
 
+        //获取b2b权限
+        var enableB2B = me.ownerCt.ownerCt.getViewModel().get('enableB2B');
+
+        if(enableB2B==null||enableB2B==0||enableB2B=='0'){
+            Ext.each(menuItems,function(item,index){
+                if(item.items.length>0){
+                    var l = item.items.length;
+                    for(var i = 0;i<l;i++){
+                        if(item.items[i].b2b){
+                            item.items.splice(i--,1);
+                            l--;
+                        }
+                    };
+                }
+            })
+        }
+            
         if (!menu) {
             var view = new Ext.DataView({
                 store: Ext.create('Ext.data.Store', {

+ 428 - 0
frontend/saas-web/app/view/purchase/deviceQuery/DataList.js

@@ -0,0 +1,428 @@
+/**
+ * Created by zhouy on 2018/10/18.
+ */
+Ext.define('saas.view.purchase.deviceQuery.DataList', {
+    extend: 'Ext.grid.Panel',
+    xtype: 'purchase-deviceQuery-datalist',
+    controller: 'purchase-deviceQuery-datalist',
+    viewModel: 'purchase-deviceQuery-datalist',
+    autoScroll: true,
+    frame:true,
+    style:'padding:0;',
+    layout:'fit',
+    dataUrl:'/api/purchase/purchase/device/list',                 
+    deleteUrl:'/api/commons/number/delete/',
+
+    plugins: [{
+        ptype: 'menuclipboard'
+    }],
+
+    tbar: [{
+        width: 240,
+        name: 'mn_name',
+        xtype: 'textfield',
+        allowBlank:true,
+        emptyText : '请输入型号/物料名称/品牌搜索',
+        enableKeyEvents: true,
+        listeners: {
+            keydown: {
+                fn: function(th, e, eOpts) {
+                    if(e.keyCode == 13) {
+                        var grid = th.up('grid');
+                        grid.condition = grid.getConditions();
+                        grid.store.loadPage(1);
+                    }
+                }
+            }
+        },
+        getCondition:function(v){
+            return v;
+        }
+    },{
+        cls:'x-formpanel-btn-blue',
+        xtype:'button',
+        text:'查询',
+        listeners: {
+            click:function(b){
+                var grid = b.ownerCt.ownerCt;
+                grid.condition = grid.getConditions();
+                grid.store.loadPage(1);
+            }
+        }
+    },'->'],
+
+    columns : [{
+        text : 'id', 
+        width : 0, 
+        dataIndex : 'id', 
+        xtype : 'numbercolumn', 
+        hidden:true
+    },{
+        text : '品牌', 
+        width : 150.0, 
+        dataIndex : 'pr_brand', 
+        xtype : '', 
+    },{
+        text : '名称', 
+        width : 200.0, 
+        dataIndex : 'pr_detail', 
+        xtype : '', 
+    },{
+        text : '型号', 
+        width : 200.0, 
+        dataIndex : 'pr_orispeccode', 
+        xtype : '', 
+    },{
+        text : '规格', 
+        width : 200, 
+        dataIndex : 'pr_spec', 
+        xtype : '', 
+    },{
+        text : '包装', 
+        width : 100, 
+        dataIndex : 'pr_pack', 
+        xtype : '', 
+    },{
+        text : '供应商', 
+        width : 150.0, 
+        dataIndex : 'pr_vendor', 
+        xtype : '', 
+    },{
+        text : '库存', 
+        width : 100, 
+        dataIndex : 'pr_qty', 
+        xtype : 'numbercolumn', 
+        renderer: function(v, m, r) {
+            return saas.util.BaseUtil.numberFormat(v, 0, false);
+        },
+    },{
+        hidden:true,
+        text : '梯度', 
+        width : 100.0, 
+        dataIndex : 'pr_level', 
+        xtype : '', 
+    },{
+        hidden:true,
+        text : '大陆交货单价', 
+        width : 200.0, 
+        dataIndex : 'pr_cnprice', 
+        xtype : '', 
+    },{
+        hidden:true,
+        text : '香港交货单价', 
+        width : 200.0, 
+        dataIndex : 'pr_hkprice', 
+        xtype : '', 
+    },{
+        hidden:true,
+        text : '交期', 
+        width : 200.0, 
+        dataIndex : 'pr_leadtime', 
+        xtype : '', 
+    }, 
+    {
+        dataIndex: '',
+        flex: 1
+    }],
+
+    initComponent: function() {
+        var me = this;
+        if(me.columns){
+            var fields = me.columns.map(column => column.dataIndex);
+            me.columns = me.insertFirstColumn(me.columns);
+            me.store = Ext.create('Ext.data.Store',{
+                fields:fields,
+                autoLoad: true,
+                pageSize: 15,
+                data: [],
+                proxy: {
+                    timeout:8000,
+                    type: 'ajax',
+                    headers:{
+                        'Access-Control-Allow-Origin': '*',
+                        "Content-Type": 'application/json;charset=UTF-8'
+                    },
+                    url: me.dataUrl,
+                    actionMethods: {
+                        read: 'GET'
+                    },
+                    reader: {
+                        type: 'json',
+                        rootProperty: 'data.content',
+                        totalProperty: 'data.totalElements',
+                    }
+                },
+                listeners: {
+                    beforeload: function (store, op) {
+                        var condition = me.condition;
+                        if (Ext.isEmpty(condition)) {
+                            condition = '';
+                        }
+                        Ext.apply(store.proxy.extraParams, {
+                            type :'component',
+                            keyword :condition==''?' ':condition[0].value,
+                            page: op._page,
+                            count: store.pageSize,
+                            filter: '',
+                            sorting:''
+                        });
+                    }
+                }
+            });
+
+            Ext.apply(me, {
+                dockedItems:[{
+                    xtype: 'pagingtoolbar',
+                    dock: 'bottom',
+                    displayInfo: true,
+                    store: me.store
+                }]
+            });
+        }
+        me.callParent(arguments);
+    },
+
+    onVastDeal:function(url,type){
+        var form = this.ownerCt;
+        var grid = this;
+        var data = grid.getGridSelected(type);
+        if(!data){
+            saas.util.BaseUtil.showErrorToast('请勾选符合条件的行进行操作。');
+            return false;
+        }
+        if(data&&data.length>0){
+            var params = JSON.stringify({baseDTOs:data});
+            saas.util.BaseUtil.request({
+                    url: url,
+                    params: params,
+                    method: 'POST',
+                    async:false
+                })
+                .then(function() {
+                    saas.util.BaseUtil.showSuccessToast('操作成功');
+                    grid.store.load();
+                })
+                .catch(function(e) {
+                    saas.util.BaseUtil.showErrorToast('操作失败: ' + e.message);
+                });
+        }else{
+            saas.util.BaseUtil.showErrorToast('请勾选至少一条明细。');
+        }
+    },
+
+    listeners:{
+        boxready: function(grid, width, height, eOpts) {
+            var store = grid.getStore(),
+            gridBodyBox = grid.body.dom.getBoundingClientRect(),
+            gridBodyBoxHeight = gridBodyBox.height;
+
+            var pageSize = Math.floor(gridBodyBoxHeight / 32);
+
+            store.setPageSize(pageSize);
+        },
+        itemClick: function(view,record,a,index,c) {
+            var classList = c.target.classList.value;
+            var grid = this;
+            if(classList.indexOf('fa-pencil')>-1){
+                var form = this.ownerCt;
+                this.dialog = form.getController().getView().add({
+                    xtype: 'sys-maxnumbers-window',
+                    bind: {
+                        title: '修改单据编码规则'
+                    },
+                    _parent:form,
+                    _combo:this,
+                    record:record,
+                    session: true
+                });
+                this.dialog.show();
+            }else if(classList.indexOf('fa-trash-o')>-1){
+                //删除
+                var id = record.get('id');
+                if(id){
+                    saas.util.BaseUtil.request({
+                        url: grid.deleteUrl+id,
+                        method: 'POST',
+                    })
+                    .then(function(localJson) {
+                        if(localJson.success){
+                            //解析参数
+                            saas.util.BaseUtil.showSuccessToast('删除成功');
+                            view.ownerCt.store.load();
+                        }
+                    })
+                    .catch(function(e) {
+                        saas.util.BaseUtil.showErrorToast('删除失败: ' + e.message);
+                    });
+                }
+            }
+        }
+    },
+
+    insertFirstColumn:function(columns){
+        var me=this;
+        return columns;
+    },
+
+    getGridSelected:function(type){
+        var isErrorSelect = false;
+        var checkField = this.statusCodeField;
+        var me = this,
+        items = me.selModel.getSelection(),
+        data = new Array() ;
+        Ext.each(items, function(item, index){
+            if(!Ext.isEmpty(item.data[me.idField])){
+                var o = new Object();
+                if(me.idField){
+                    o['id'] = item.data[me.idField];
+                }
+                if(me.codeField){
+                    o['code'] = item.data[me.codeField];
+                }
+                if(type&&type==item.data[checkField]){
+                    isErrorSelect = true
+                }
+                data.push(o);
+            }
+        });
+        if(isErrorSelect){
+            return false;
+        }
+		return data;
+    },
+
+    /**
+     * 获得过滤条件
+     */
+    getConditions: function() {
+        var me = this,
+        tbar = me.getDockedItems()[0],
+        items = Ext.Array.filter(tbar.items.items, function(item) {
+            return !!item.name;
+        }),
+        conditions = [];
+        for(var i = 0; i < items.length; i++) {
+            var item = items[i];
+            var field = item.name,
+            func = item.getCondition,
+            value = item.value,
+            condition;
+
+            if(value&&value!=''){
+                if(typeof func == 'function') {
+                    condition = {
+                        type: 'condition',
+                        value: func(value)
+                    }
+                }else {
+                    var type = item.fieldType || me.getDefaultFieldType(item),
+                    operation = item.operation || me.getDefaultFieldOperation(item),
+                    conditionValue = me.getConditionValue(item, value);
+        
+                    if(!conditionValue) {
+                        continue;
+                    }
+                    condition = {
+                        type: type,
+                        field: field,
+                        operation: operation,
+                        value: conditionValue
+                    }
+                }
+                conditions.push(condition);
+            }
+        }
+
+        return conditions;
+    },
+
+    /**
+     * 只要arr1和arr2中存在相同项即返回真
+     */
+    isContainsAny: function (arr1, arr2) {
+        for (var i = 0; i < arr2.length; i++) {
+            var a2 = arr2[i];
+            if (!!arr1.find(function (a1) {
+                    return a1 == a2
+                })) {
+                return true;
+            }
+        }
+        return false;
+    },
+
+    getDefaultFieldType: function (field) {
+        var me = this,
+            xtypes = field.getXTypes().split('/'),
+            type;
+
+        if (me.isContainsAny(xtypes, ['numberfield'])) {
+            type = 'number';
+        } else if (me.isContainsAny(xtypes, ['datefield', 'condatefield', 'conmonthfield'])) {
+            type = 'date';
+        } else if (me.isContainsAny(xtypes, ['dbfindtrigger'])) {
+            type = 'enum';
+        } else if (me.isContainsAny(xtypes, ['combobox', 'multicombo', 'combo', 'radiofield', 'radio'])) {
+            type = 'enum';
+        } else {
+            type = 'string';
+        }
+
+        return type;
+    },
+
+    getDefaultFieldOperation: function (field) {
+        var me = this,
+            xtypes = field.getXTypes().split('/'),
+            operation;
+
+        if (me.isContainsAny(xtypes, ['numberfield', 'datefield', 'dbfindtrigger'])) {
+            operation = '=';
+        } else if (me.isContainsAny(xtypes, ['condatefield', 'conmonthfield'])) {
+            operation = 'between';
+        } else if (me.isContainsAny(xtypes, ['multidbfindtrigger', 'combobox', 'multicombo', 'combo'])) {
+            operation = 'in';
+        } else {
+            operation = 'like';
+        }
+
+        return operation;
+    },
+
+    /**
+     * 处理部分字段值
+     */
+    getConditionValue: function (field, value) {
+        var me = this,
+            xtypes = field.getXTypes().split('/'),
+            conditionValue;
+        if (me.isContainsAny(xtypes, ['datefield'])) {
+            conditionValue = Ext.Date.format(new Date(from), 'Y-m-d H:i:s');
+        } else if (me.isContainsAny(xtypes, ['conmonthfield'])) {
+            var from = value.from,
+                to = value.to;
+
+            conditionValue = from + ',' + to;
+        } else if (me.isContainsAny(xtypes, ['condatefield'])) {
+            var from = value.from,
+                to = value.to;
+
+            conditionValue = Ext.Date.format(new Date(from), 'Y-m-d 00:00:00') + ',' + Ext.Date.format(new Date(to), 'Y-m-d 23:59:59');
+        } else if (me.isContainsAny(xtypes, ['dbfindtrigger'])) {
+            conditionValue = value;
+        } else if (me.isContainsAny(xtypes, ['combobox', 'combo'])) {
+            conditionValue = '\'' + value + '\'';
+        } else if (me.isContainsAny(xtypes, ['multicombo'])) {
+            conditionValue = value.map ? value.map(function (v) {
+                return '\'' + v.value + '\'';
+            }).join(',') : '';
+        } else {
+            conditionValue = value;
+        }
+
+        return conditionValue;
+    }
+
+})
+
+

+ 10 - 0
frontend/saas-web/app/view/purchase/deviceQuery/DataListController.js

@@ -0,0 +1,10 @@
+Ext.define('saas.view.purchase.deviceQuery.DataListController', {
+    extend: 'saas.view.core.base.BasePanelController',
+    alias: 'controller.purchase-deviceQuery-datalist',
+
+    init: function (form) {
+        var me = this;
+        this.control({
+        });
+    }
+});

+ 4 - 0
frontend/saas-web/app/view/purchase/deviceQuery/DataListlModel.js

@@ -0,0 +1,4 @@
+Ext.define('saas.view.purchase.deviceQuery.DataListModel', {
+    extend: 'saas.view.core.base.BasePanelModel',
+    alias: 'viewmodel.purchase-deviceQuery-datalist'
+});

+ 376 - 0
frontend/saas-web/app/view/purchase/quotationList/DataList.js

@@ -0,0 +1,376 @@
+
+Ext.define('saas.view.purchase.quotationList.DataList', {
+    extend: 'Ext.grid.Panel',
+    xtype: 'purchase-quotationList-datalist',
+    controller: 'purchase-quotationList-datalist',
+    viewModel: 'purchase-quotationList-datalist',
+    autoScroll: true,
+    frame:true,
+    layout:'fit',
+    
+    dataUrl:'http://10.1.80.23:8560/api/purchase/purchase/inquiry/list',                 
+    quotationListUrl:'/api/commons/number/delete/',
+
+    plugins: [{
+        ptype: 'menuclipboard'
+    },{
+        ptype: 'rowwidget',
+        widget: {
+            frame:true,
+            xtype: 'grid',
+            bind: {
+                store: '{record.quotationRspDTOList}',
+                //title: 'Orders for {record.name}'
+            },
+            columns: [{
+                text: '供应商名称',
+                dataIndex: 'vendName',
+                width: 175
+            }, {
+                text: '联系电话',
+                dataIndex: 'tel',
+                width: 265
+            }, {
+                text: '替代型号',
+                dataIndex: 'replaceOrispeccode',
+                width: 100,
+            }, {
+                width: 120,
+                text: '交期',
+                dataIndex: 'leadTime'
+            }, {
+                width: 120,
+                text: '税率',
+                dataIndex: 'taxRate'
+            }, {
+                width: 120,
+                text: '分段信息',
+                dataIndex: 'replies'
+            }, {
+                width: 120,
+                text: '操作',
+                dataIndex: 'agreed'
+            }]
+        }
+    }],
+
+    tbar: [{
+        width: 310,
+        name: 'search',
+        xtype: 'textfield',
+        emptyText : '请输入物料编号/品牌/名称/型号',
+        enableKeyEvents: true,
+        getCondition: function (value) {
+            return ' (pr_code like\'%' + value + '%\' or pr_detail like \'%' + value + '%\' or pr_brand like \'%' + value + '%\' or pr_orispeccode like \'%' + value + '%\') ';
+        },
+        listeners: {
+            keydown: {
+                fn: function(th, e, eOpts) {
+                    if(e.keyCode == 13) {
+                        var grid = th.up('grid');
+                        grid.condition = grid.getConditions();
+                        grid.store.loadPage(1);
+                    }
+                }
+            }
+        }
+    },{
+        cls:'x-formpanel-btn-blue',
+        xtype:'button',
+        text:'查询',
+        listeners: {
+            click:function(b){
+                var grid = b.ownerCt.ownerCt;
+                grid.condition = grid.getConditions();
+                grid.store.loadPage(1);
+            }
+        }
+    }],
+
+    columns : [{
+        text : 'id', 
+        width : 0, 
+        dataIndex : 'id', 
+        xtype : 'numbercolumn', 
+        hidden:true
+    },{
+        text : '物料编号', 
+        width : 200.0, 
+        dataIndex : 'prodCode', 
+        xtype : '', 
+    }, 
+    {
+        text : '品牌', 
+        dataIndex : 'prodBrand', 
+        width : 110.0, 
+        xtype : '', 
+    }, 
+    {
+        text : '名称', 
+        dataIndex : 'prodName', 
+        width : 150.0
+    },{
+        text : '型号', 
+        dataIndex : 'prodOrispeccode',
+        width : 110.0
+    },{
+        text : '规格', 
+        dataIndex : 'prodSpec',
+        width : 110.0
+    },{
+        text : '单位', 
+        dataIndex : 'prodUnit',
+        width : 110.0
+    },{
+        text : '发起时间', 
+        dataIndex : 'startDate',
+        width : 160.0
+    },{
+        text : '截止日期', 
+        dataIndex : 'endDate',
+        width : 160.0
+    },{
+        text : '报价状态', 
+        dataIndex : 'quoted',
+        width : 110.0
+    }, {
+        dataIndex: '',
+        flex: 1
+    }],
+
+
+    dbSearchFields: [],
+    condition:'',
+
+    initComponent: function() {
+        var me = this;
+        if(me.columns){
+            var fields = me.columns.map(column => column.dataIndex);
+            me.store = Ext.create('Ext.data.Store',{
+                fields:fields,
+                autoLoad: true,
+                pageSize: 15,
+                proxy: {
+                    timeout:8000,
+                    type: 'ajax',
+                    headers:{
+                        'Access-Control-Allow-Origin': '*',
+                        "Content-Type": 'application/json;charset=UTF-8'
+                    },
+                    url: me.dataUrl,
+                    actionMethods: {
+                        read: 'GET'
+                    },
+                    reader: {
+                        type: 'json',
+                        rootProperty: 'data.content',
+                        totalProperty: 'data.totalElements',
+                    }
+                },
+                listeners: {
+                    beforeload: function (store, op) {
+                        var condition = me.condition;
+                        if (Ext.isEmpty(condition)) {
+                            condition = '';
+                        }
+                        Ext.apply(store.proxy.extraParams, {
+                            keyword:condition,
+                            pageNumber: op._page,
+                            pageSize: store.pageSize,
+                            quoted:1,
+                            fromDate:null,
+                            endDate:null,
+                            overdue:0
+                        });
+                    }
+                }
+            });
+
+            Ext.apply(me, {
+                dockedItems:[{
+                    xtype: 'pagingtoolbar',
+                    dock: 'bottom',
+                    displayInfo: true,
+                    store: me.store
+                }]
+            });
+        }
+        me.callParent(arguments);
+    },
+
+    listeners:{
+        boxready: function(grid, width, height, eOpts) {
+            var store = grid.getStore(),
+            gridBodyBox = grid.body.dom.getBoundingClientRect(),
+            gridBodyBoxHeight = gridBodyBox.height;
+
+            var pageSize = Math.floor(gridBodyBoxHeight / 32);
+
+            store.setPageSize(pageSize);
+        },
+        itemClick: function(view,record,a,index,c) {
+        }
+    },
+
+    getGridSelected:function(type){
+        var isErrorSelect = false;
+        var checkField = this.statusCodeField;
+        var me = this,
+        items = me.selModel.getSelection(),
+        data = new Array() ;
+        Ext.each(items, function(item, index){
+            if(!Ext.isEmpty(item.data[me.idField])){
+                var o = new Object();
+                if(me.idField){
+                    o['id'] = item.data[me.idField];
+                }
+                if(me.codeField){
+                    o['code'] = item.data[me.codeField];
+                }
+                if(type&&type==item.data[checkField]){
+                    isErrorSelect = true
+                }
+                data.push(o);
+            }
+        });
+        if(isErrorSelect){
+            return false;
+        }
+		return data;
+    },
+
+    /**
+     * 获得过滤条件
+     */
+    getConditions: function() {
+        var me = this,
+        tbar = me.getDockedItems()[0],
+        items = Ext.Array.filter(tbar.items.items, function(item) {
+            return !!item.name;
+        }),
+        conditions = [];
+        for(var i = 0; i < items.length; i++) {
+            var item = items[i];
+            var field = item.name,
+            func = item.getCondition,
+            value = item.value,
+            condition;
+
+            if(value&&value!=''){
+                if(typeof func == 'function') {
+                    condition = {
+                        type: 'condition',
+                        value: func(value)
+                    }
+                }else {
+                    var type = item.fieldType || me.getDefaultFieldType(item),
+                    operation = item.operation || me.getDefaultFieldOperation(item),
+                    conditionValue = me.getConditionValue(item, value);
+        
+                    if(!conditionValue) {
+                        continue;
+                    }
+                    condition = {
+                        type: type,
+                        field: field,
+                        operation: operation,
+                        value: conditionValue
+                    }
+                }
+                conditions.push(condition);
+            }
+        }
+
+        return conditions;
+    },
+
+    /**
+     * 只要arr1和arr2中存在相同项即返回真
+     */
+    isContainsAny: function (arr1, arr2) {
+        for (var i = 0; i < arr2.length; i++) {
+            var a2 = arr2[i];
+            if (!!arr1.find(function (a1) {
+                    return a1 == a2
+                })) {
+                return true;
+            }
+        }
+        return false;
+    },
+
+    getDefaultFieldType: function (field) {
+        var me = this,
+            xtypes = field.getXTypes().split('/'),
+            type;
+
+        if (me.isContainsAny(xtypes, ['numberfield'])) {
+            type = 'number';
+        } else if (me.isContainsAny(xtypes, ['datefield', 'condatefield', 'conmonthfield'])) {
+            type = 'date';
+        } else if (me.isContainsAny(xtypes, ['dbfindtrigger'])) {
+            type = 'enum';
+        } else if (me.isContainsAny(xtypes, ['combobox', 'multicombo', 'combo', 'radiofield', 'radio'])) {
+            type = 'enum';
+        } else {
+            type = 'string';
+        }
+
+        return type;
+    },
+
+    getDefaultFieldOperation: function (field) {
+        var me = this,
+            xtypes = field.getXTypes().split('/'),
+            operation;
+
+        if (me.isContainsAny(xtypes, ['numberfield', 'datefield', 'dbfindtrigger'])) {
+            operation = '=';
+        } else if (me.isContainsAny(xtypes, ['condatefield', 'conmonthfield'])) {
+            operation = 'between';
+        } else if (me.isContainsAny(xtypes, ['multidbfindtrigger', 'combobox', 'multicombo', 'combo'])) {
+            operation = 'in';
+        } else {
+            operation = 'like';
+        }
+
+        return operation;
+    },
+
+    /**
+     * 处理部分字段值
+     */
+    getConditionValue: function (field, value) {
+        var me = this,
+            xtypes = field.getXTypes().split('/'),
+            conditionValue;
+        if (me.isContainsAny(xtypes, ['datefield'])) {
+            conditionValue = Ext.Date.format(new Date(from), 'Y-m-d H:i:s');
+        } else if (me.isContainsAny(xtypes, ['conmonthfield'])) {
+            var from = value.from,
+                to = value.to;
+
+            conditionValue = from + ',' + to;
+        } else if (me.isContainsAny(xtypes, ['condatefield'])) {
+            var from = value.from,
+                to = value.to;
+
+            conditionValue = Ext.Date.format(new Date(from), 'Y-m-d 00:00:00') + ',' + Ext.Date.format(new Date(to), 'Y-m-d 23:59:59');
+        } else if (me.isContainsAny(xtypes, ['dbfindtrigger'])) {
+            conditionValue = value;
+        } else if (me.isContainsAny(xtypes, ['combobox', 'combo'])) {
+            conditionValue = '\'' + value + '\'';
+        } else if (me.isContainsAny(xtypes, ['multicombo'])) {
+            conditionValue = value.map ? value.map(function (v) {
+                return '\'' + v.value + '\'';
+            }).join(',') : '';
+        } else {
+            conditionValue = value;
+        }
+
+        return conditionValue;
+    }
+
+})
+
+

+ 10 - 0
frontend/saas-web/app/view/purchase/quotationList/DataListController.js

@@ -0,0 +1,10 @@
+Ext.define('saas.view.purchase.quotationList.DataListController', {
+    extend: 'saas.view.core.base.BasePanelController',
+    alias: 'controller.purchase-quotationList-datalist',
+
+    init: function (form) {
+        var me = this;
+        this.control({
+        });
+    }
+});

+ 4 - 0
frontend/saas-web/app/view/purchase/quotationList/DataListlModel.js

@@ -0,0 +1,4 @@
+Ext.define('saas.view.purchase.quotationList.DataListModel', {
+    extend: 'saas.view.core.base.BasePanelModel',
+    alias: 'viewmodel.purchase-quotationList-datalist'
+});

+ 421 - 0
frontend/saas-web/app/view/purchase/sendQuotation/DataList.js

@@ -0,0 +1,421 @@
+/**
+ * Created by zhouy on 2018/10/18.
+ */
+Ext.define('saas.view.purchase.sendQuotation.DataList', {
+    extend: 'Ext.grid.Panel',
+    xtype: 'purchase-sendQuotation-datalist',
+    controller: 'purchase-sendQuotation-datalist',
+    viewModel: 'purchase-sendQuotation-datalist',
+    autoScroll: true,
+    frame:true,
+    layout:'fit',
+    
+    dataUrl:'/api/document/product/list',                 
+    sendQuotationUrl:'/api/commons/number/delete/',
+
+    plugins: [{
+        ptype: 'menuclipboard'
+    }],
+
+    selModel: {
+        checkOnly:true,
+        type:'checkboxmodel'
+	},
+
+    tbar: [{
+        width: 310,
+        name: 'search',
+        xtype: 'textfield',
+        emptyText : '请输入物料编号/品牌/名称/型号',
+        enableKeyEvents: true,
+        getCondition: function (value) {
+            return ' (pr_code like\'%' + value + '%\' or pr_detail like \'%' + value + '%\' or pr_brand like \'%' + value + '%\' or pr_orispeccode like \'%' + value + '%\') ';
+        },
+        listeners: {
+            keydown: {
+                fn: function(th, e, eOpts) {
+                    if(e.keyCode == 13) {
+                        var grid = th.up('grid');
+                        grid.condition = grid.getConditions();
+                        grid.store.loadPage(1);
+                    }
+                }
+            }
+        }
+    },{
+        cls:'x-formpanel-btn-blue',
+        xtype:'button',
+        text:'查询',
+        listeners: {
+            click:function(b){
+                var grid = b.ownerCt.ownerCt;
+                grid.condition = grid.getConditions();
+                grid.store.loadPage(1);
+            }
+        }
+    },'->',{
+        width: 180,
+        name: 'endDate',
+        xtype: 'numberfield',
+        decimalPrecision:0,
+        minValue:0,
+        fieldLabel : '报价截至天数'
+    },{
+        cls:'x-formpanel-btn-blue',
+        xtype:'button',
+        text:'发起询价',
+        listeners: {
+            click: function(){
+                var form = this.ownerCt.ownerCt;
+                var grid = this.ownerCt.ownerCt.items.items[0].grid;
+                var endDate = form.down('[name=endDate]');
+                if(!endDate.value||endDate.value==0){
+                    saas.util.BaseUtil.showErrorToast('请填写报价截至天数');
+                    return false;
+                }
+                form.onVastDeal(sendQuotation,'发起询价');
+            }
+        }
+    }],
+
+    columns : [{
+        text : 'id', 
+        width : 0, 
+        dataIndex : 'id', 
+        xtype : 'numbercolumn', 
+        hidden:true
+    },{
+        text : '物料编号', 
+        width : 200.0, 
+        dataIndex : 'pr_code', 
+        xtype : '', 
+    }, 
+    {
+        text : '品牌', 
+        dataIndex : 'pr_brand', 
+        width : 110.0, 
+        xtype : '', 
+    }, 
+    {
+        text : '名称', 
+        dataIndex : 'pr_detail', 
+        width : 150.0
+    },{
+        text : '型号', 
+        dataIndex : 'pr_orispeccode',
+        width : 110.0
+    },{
+        text : '规格', 
+        dataIndex : 'pr_spec',
+        width : 110.0
+    },{
+        text : '单位', 
+        dataIndex : 'pr_unit',
+        width : 110.0
+    }, {
+        dataIndex: '',
+        flex: 1
+    }],
+
+    dbSearchFields: [],
+    condition:'',
+
+    initComponent: function() {
+        var me = this;
+        if(me.columns){
+            var fields = me.columns.map(column => column.dataIndex);
+            me.columns = me.insertFirstColumn(me.columns);
+            me.store = Ext.create('Ext.data.Store',{
+                fields:fields,
+                autoLoad: true,
+                pageSize: 15,
+                data: [],
+                proxy: {
+                    timeout:8000,
+                    type: 'ajax',
+                    headers:{
+                        'Access-Control-Allow-Origin': '*',
+                        "Content-Type": 'application/json;charset=UTF-8'
+                    },
+                    url: me.dataUrl,
+                    actionMethods: {
+                        read: 'GET'
+                    },
+                    reader: {
+                        type: 'json',
+                        rootProperty: 'data.list',
+                        totalProperty: 'data.total',
+                    }
+                },
+                listeners: {
+                    beforeload: function (store, op) {
+                        var condition = me.condition;
+                        if (Ext.isEmpty(condition)) {
+                            condition = '';
+                        }
+                        Ext.apply(store.proxy.extraParams, {
+                            w:1,
+                            page: op._page,
+                            count: store.pageSize,
+                            condition: JSON.stringify(condition)
+                        });
+                    }
+                }
+            });
+
+            Ext.apply(me, {
+                dockedItems:[{
+                    xtype: 'pagingtoolbar',
+                    dock: 'bottom',
+                    displayInfo: true,
+                    store: me.store
+                }]
+            });
+        }
+        me.callParent(arguments);
+    },
+
+    onVastDeal:function(url,type){
+        var form = this.ownerCt;
+        var grid = this;
+        var data = grid.getGridSelected(type);
+        if(!data){
+            saas.util.BaseUtil.showErrorToast('请勾选符合条件的行进行操作。');
+            return false;
+        }
+        if(data&&data.length>0){
+            var params = JSON.stringify({baseDTOs:data});
+            saas.util.BaseUtil.request({
+                    url: url,
+                    params: params,
+                    method: 'POST',
+                    async:false
+                })
+                .then(function() {
+                    saas.util.BaseUtil.showSuccessToast('操作成功');
+                    grid.store.load();
+                })
+                .catch(function(e) {
+                    saas.util.BaseUtil.showErrorToast('操作失败: ' + e.message);
+                });
+        }else{
+            saas.util.BaseUtil.showErrorToast('请勾选至少一条明细。');
+        }
+    },
+
+    listeners:{
+        boxready: function(grid, width, height, eOpts) {
+            var store = grid.getStore(),
+            gridBodyBox = grid.body.dom.getBoundingClientRect(),
+            gridBodyBoxHeight = gridBodyBox.height;
+
+            var pageSize = Math.floor(gridBodyBoxHeight / 32);
+
+            store.setPageSize(pageSize);
+        },
+        itemClick: function(view,record,a,index,c) {
+            var classList = c.target.classList.value;
+            var grid = this;
+            if(classList.indexOf('fa-pencil')>-1){
+                var form = this.ownerCt;
+                this.dialog = form.getController().getView().add({
+                    xtype: 'sys-maxnumbers-window',
+                    bind: {
+                        title: '修改单据编码规则'
+                    },
+                    _parent:form,
+                    _combo:this,
+                    record:record,
+                    session: true
+                });
+                this.dialog.show();
+            }else if(classList.indexOf('fa-trash-o')>-1){
+                //删除
+                var id = record.get('id');
+                if(id){
+                    saas.util.BaseUtil.request({
+                        url: grid.deleteUrl+id,
+                        method: 'POST',
+                    })
+                    .then(function(localJson) {
+                        if(localJson.success){
+                            //解析参数
+                            saas.util.BaseUtil.showSuccessToast('删除成功');
+                            view.ownerCt.store.load();
+                        }
+                    })
+                    .catch(function(e) {
+                        saas.util.BaseUtil.showErrorToast('删除失败: ' + e.message);
+                    });
+                }
+            }
+        }
+    },
+
+    insertFirstColumn:function(columns){
+        var me=this;
+        return columns;
+    },
+
+    getGridSelected:function(type){
+        var isErrorSelect = false;
+        var checkField = this.statusCodeField;
+        var me = this,
+        items = me.selModel.getSelection(),
+        data = new Array() ;
+        Ext.each(items, function(item, index){
+            if(!Ext.isEmpty(item.data[me.idField])){
+                var o = new Object();
+                if(me.idField){
+                    o['id'] = item.data[me.idField];
+                }
+                if(me.codeField){
+                    o['code'] = item.data[me.codeField];
+                }
+                if(type&&type==item.data[checkField]){
+                    isErrorSelect = true
+                }
+                data.push(o);
+            }
+        });
+        if(isErrorSelect){
+            return false;
+        }
+		return data;
+    },
+
+    /**
+     * 获得过滤条件
+     */
+    getConditions: function() {
+        var me = this,
+        tbar = me.getDockedItems()[0],
+        items = Ext.Array.filter(tbar.items.items, function(item) {
+            return !!item.name;
+        }),
+        conditions = [];
+        for(var i = 0; i < items.length; i++) {
+            var item = items[i];
+            var field = item.name,
+            func = item.getCondition,
+            value = item.value,
+            condition;
+
+            if(value&&value!=''){
+                if(typeof func == 'function') {
+                    condition = {
+                        type: 'condition',
+                        value: func(value)
+                    }
+                }else {
+                    var type = item.fieldType || me.getDefaultFieldType(item),
+                    operation = item.operation || me.getDefaultFieldOperation(item),
+                    conditionValue = me.getConditionValue(item, value);
+        
+                    if(!conditionValue) {
+                        continue;
+                    }
+                    condition = {
+                        type: type,
+                        field: field,
+                        operation: operation,
+                        value: conditionValue
+                    }
+                }
+                conditions.push(condition);
+            }
+        }
+
+        return conditions;
+    },
+
+    /**
+     * 只要arr1和arr2中存在相同项即返回真
+     */
+    isContainsAny: function (arr1, arr2) {
+        for (var i = 0; i < arr2.length; i++) {
+            var a2 = arr2[i];
+            if (!!arr1.find(function (a1) {
+                    return a1 == a2
+                })) {
+                return true;
+            }
+        }
+        return false;
+    },
+
+    getDefaultFieldType: function (field) {
+        var me = this,
+            xtypes = field.getXTypes().split('/'),
+            type;
+
+        if (me.isContainsAny(xtypes, ['numberfield'])) {
+            type = 'number';
+        } else if (me.isContainsAny(xtypes, ['datefield', 'condatefield', 'conmonthfield'])) {
+            type = 'date';
+        } else if (me.isContainsAny(xtypes, ['dbfindtrigger'])) {
+            type = 'enum';
+        } else if (me.isContainsAny(xtypes, ['combobox', 'multicombo', 'combo', 'radiofield', 'radio'])) {
+            type = 'enum';
+        } else {
+            type = 'string';
+        }
+
+        return type;
+    },
+
+    getDefaultFieldOperation: function (field) {
+        var me = this,
+            xtypes = field.getXTypes().split('/'),
+            operation;
+
+        if (me.isContainsAny(xtypes, ['numberfield', 'datefield', 'dbfindtrigger'])) {
+            operation = '=';
+        } else if (me.isContainsAny(xtypes, ['condatefield', 'conmonthfield'])) {
+            operation = 'between';
+        } else if (me.isContainsAny(xtypes, ['multidbfindtrigger', 'combobox', 'multicombo', 'combo'])) {
+            operation = 'in';
+        } else {
+            operation = 'like';
+        }
+
+        return operation;
+    },
+
+    /**
+     * 处理部分字段值
+     */
+    getConditionValue: function (field, value) {
+        var me = this,
+            xtypes = field.getXTypes().split('/'),
+            conditionValue;
+        if (me.isContainsAny(xtypes, ['datefield'])) {
+            conditionValue = Ext.Date.format(new Date(from), 'Y-m-d H:i:s');
+        } else if (me.isContainsAny(xtypes, ['conmonthfield'])) {
+            var from = value.from,
+                to = value.to;
+
+            conditionValue = from + ',' + to;
+        } else if (me.isContainsAny(xtypes, ['condatefield'])) {
+            var from = value.from,
+                to = value.to;
+
+            conditionValue = Ext.Date.format(new Date(from), 'Y-m-d 00:00:00') + ',' + Ext.Date.format(new Date(to), 'Y-m-d 23:59:59');
+        } else if (me.isContainsAny(xtypes, ['dbfindtrigger'])) {
+            conditionValue = value;
+        } else if (me.isContainsAny(xtypes, ['combobox', 'combo'])) {
+            conditionValue = '\'' + value + '\'';
+        } else if (me.isContainsAny(xtypes, ['multicombo'])) {
+            conditionValue = value.map ? value.map(function (v) {
+                return '\'' + v.value + '\'';
+            }).join(',') : '';
+        } else {
+            conditionValue = value;
+        }
+
+        return conditionValue;
+    }
+
+})
+
+

+ 10 - 0
frontend/saas-web/app/view/purchase/sendQuotation/DataListController.js

@@ -0,0 +1,10 @@
+Ext.define('saas.view.purchase.sendQuotation.DataListController', {
+    extend: 'saas.view.core.base.BasePanelController',
+    alias: 'controller.purchase-sendQuotation-datalist',
+
+    init: function (form) {
+        var me = this;
+        this.control({
+        });
+    }
+});

+ 4 - 0
frontend/saas-web/app/view/purchase/sendQuotation/DataListlModel.js

@@ -0,0 +1,4 @@
+Ext.define('saas.view.purchase.sendQuotation.DataListModel', {
+    extend: 'saas.view.core.base.BasePanelModel',
+    alias: 'viewmodel.purchase-sendQuotation-datalist'
+});

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

@@ -91,6 +91,7 @@ Ext.define('saas.view.sys.maxnumbers.DataList', {
         width : 0, 
         dataIndex : 'id', 
         xtype : 'numbercolumn', 
+        hidden:true
     },{
         text : '单据名称', 
         width : 200.0, 

+ 18 - 0
frontend/saas-web/app/view/viewport/ViewportController.js

@@ -33,6 +33,7 @@ Ext.define('saas.view.viewport.ViewportController', {
     },
 
     mainviewboxready: function() {
+        var me = this;
         //初始化setSessionPage地址
         Ext.DomHelper.insertHtml('beforeEnd', document.body, 
             '<iframe name="setSessionPage" hidden src="' + 
@@ -41,6 +42,23 @@ Ext.define('saas.view.viewport.ViewportController', {
         if(!Ext.isChrome && !Ext.isFirefox) {
             saas.util.BaseUtil.showConfirm('温馨提示', '为了更好地呈现页面效果,推荐使用Chrome浏览器或火狐浏览器');
         }
+        //读取系统参数
+        saas.util.BaseUtil.request({url:'/api/commons/configs/list'})
+        .then(function(res) {
+            if(res.success) {
+                var list = res.data.list;
+                if(list.length>0){
+                    var d = {};
+                    Ext.each(list, function(item, index){
+                        d[item.code] = item.data;
+                    });
+                    me.getViewModel().setData(d)
+                }
+            }
+        })
+        .catch(function(e) {
+            console.error(e);
+        });
     },
 
     showView: function(xtype) {

+ 22 - 5
frontend/saas-web/resources/json/navigation.json

@@ -18,6 +18,21 @@
             "text": "采购验退单",
             "addType": "purchase-purchaseout-formpanel",
             "viewType": "purchase-purchaseout-querypanel"
+        },{
+            "b2b":true,
+            "id": "deviceQuery",
+            "text": "器件查询",
+            "viewType": "purchase-deviceQuery-datalist"
+        },{
+            "b2b":true,
+            "id": "sendQuotation",
+            "text": "发起询价",
+            "viewType": "purchase-sendQuotation-datalist"
+        },{
+            "b2b":true,
+            "id": "quotationList",
+            "text": "询价信息查询",
+            "viewType": "purchase-quotationList-datalist"
         }]
     }, {
         "text": "报表",
@@ -56,10 +71,12 @@
             "addType": "sale-salein-formpanel",
             "viewType": "sale-salein-querypanel"
         }, {
+            "b2b":true,
             "id": "sale-business-business",
             "text": "公司商机",
             "viewType": "sale-business-business"
         }, {
+            "b2b":true,
             "id": "sale-business-mybusiness",
             "text": "我的商机",
             "viewType": "sale-business-mybusiness"
@@ -236,6 +253,11 @@
             "viewType": "document-bom-basepanel",
             "addType": "document-bom-formpanel",
             "leaf": true
+        }, {
+            "id":"document-currencys-datalist",
+            "text": "币别资料",
+            "viewType": "document-currencys-datalist",
+            "leaf": true
         }, {
             "id":"document-bankinformation-datalist",
             "text": "资金账户",
@@ -288,11 +310,6 @@
             "text": "收支类别",
             "viewType": "document-kind",
             "leaf": true
-        }, {
-            "id":"document-currencys-datalist",
-            "text": "币别",
-            "viewType": "document-currencys-datalist",
-            "leaf": true
         }]
     }]
 }, {