Explorar el Código

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

hy hace 6 años
padre
commit
4708cfc289
Se han modificado 55 ficheros con 990 adiciones y 93 borrados
  1. 2 5
      applications/commons/commons-dto/src/main/java/com/usoftchina/saas/commons/exception/BizExceptionCode.java
  2. 26 0
      applications/commons/commons-dto/src/main/java/com/usoftchina/saas/commons/po/Status.java
  3. 1 4
      applications/document/document-api/src/main/java/com/usoftchina/saas/document/api/VendorApi.java
  4. 1 1
      applications/document/document-server/src/main/resources/application.yml
  5. 35 0
      applications/money/money-dto/src/main/java/com/usoftchina/saas/money/b2b/dto/APCheck.java
  6. 26 0
      applications/money/money-dto/src/main/java/com/usoftchina/saas/money/b2b/dto/APCheckDetail.java
  7. 30 0
      applications/money/money-dto/src/main/java/com/usoftchina/saas/money/po/ApcheckDetail.java
  8. 14 4
      applications/money/money-server/src/main/java/com/usoftchina/saas/money/controller/ApcheckController.java
  9. 3 0
      applications/money/money-server/src/main/java/com/usoftchina/saas/money/mapper/ApcheckMapper.java
  10. 3 0
      applications/money/money-server/src/main/java/com/usoftchina/saas/money/service/ApcheckService.java
  11. 56 1
      applications/money/money-server/src/main/java/com/usoftchina/saas/money/service/impl/ApcheckServiceImpl.java
  12. 1 1
      applications/money/money-server/src/main/resources/application.yml
  13. 11 1
      applications/money/money-server/src/main/resources/mapper/ApcheckMapper.xml
  14. 31 0
      applications/money/money-server/src/test/java/APcheckTest.java
  15. 2 4
      applications/purchase/purchase-server/src/main/java/com/usoftchina/saas/purchase/service/impl/PurchaseServiceImpl.java
  16. 1 1
      applications/purchase/purchase-server/src/main/resources/application.yml
  17. 2 2
      applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/controller/SaleDownController.java
  18. 20 0
      applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/po/SaleDown.java
  19. 20 0
      applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/po/SaleDownDetail.java
  20. 2 0
      applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/service/SaleDownService.java
  21. 52 2
      applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/service/impl/SaleDownServiceImpl.java
  22. 1 1
      applications/sale/sale-server/src/main/resources/application.yml
  23. 3 0
      applications/sale/sale-server/src/main/resources/config/application-dev.yml
  24. 10 24
      applications/sale/sale-server/src/main/resources/mapper/SaledownMapper.xml
  25. 24 0
      applications/sale/sale-server/src/test/java/com/usoftchina/saas/sale/controller/SaleDownTest.java
  26. 1 1
      applications/transfers/mall-api/src/test/resources/application.yml
  27. 0 5
      applications/transfers/transfers-server/src/main/java/com/usoftchina/saas/transfers/controller/ApCheckController.java
  28. 4 0
      applications/transfers/transfers-server/src/main/java/com/usoftchina/saas/transfers/service/impl/ApCheckServiceImpl.java
  29. 8 2
      applications/transfers/transfers-server/src/main/java/com/usoftchina/saas/transfers/task/SendPurchaseEndTask.java
  30. 10 2
      applications/transfers/transfers-server/src/main/java/com/usoftchina/saas/transfers/task/SendPurchaseInResTask.java
  31. 11 1
      applications/transfers/transfers-server/src/main/java/com/usoftchina/saas/transfers/task/SendPurchaseInTask.java
  32. 10 2
      applications/transfers/transfers-server/src/main/java/com/usoftchina/saas/transfers/task/SendPurchaseOutResTask.java
  33. 12 1
      applications/transfers/transfers-server/src/main/java/com/usoftchina/saas/transfers/task/SendPurchaseOutTask.java
  34. 10 2
      applications/transfers/transfers-server/src/main/java/com/usoftchina/saas/transfers/task/SendPurchaseTask.java
  35. 7 1
      applications/transfers/transfers-server/src/main/java/com/usoftchina/saas/transfers/utils/SendUtil.java
  36. 1 1
      applications/transfers/transfers-server/src/main/resources/application.yml
  37. 1 0
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/controller/AccountController.java
  38. 2 0
      base-servers/auth/auth-server/src/main/java/com/usoftchina/saas/auth/controller/AuthController.java
  39. 5 0
      framework/core/src/main/java/com/usoftchina/saas/utils/http/HttpUtil.java
  40. 13 0
      frontend/saas-web/app/model/sale/b2b/PurchaseDetail.js
  41. 9 8
      frontend/saas-web/app/view/core/dbfind/types/CustomerDbfindTrigger.js
  42. 10 9
      frontend/saas-web/app/view/core/dbfind/types/VendorDbfindTrigger.js
  43. 1 1
      frontend/saas-web/app/view/core/tab/Controller.js
  44. 6 0
      frontend/saas-web/app/view/document/uusetting/UUSettingController.js
  45. 0 1
      frontend/saas-web/app/view/home/InfoCard.js
  46. 1 1
      frontend/saas-web/app/view/purchase/purchase/QueryPanel.js
  47. 1 1
      frontend/saas-web/app/view/purchase/purchaseIn/QueryPanel.js
  48. 1 1
      frontend/saas-web/app/view/purchase/purchaseOut/QueryPanel.js
  49. 203 0
      frontend/saas-web/app/view/sale/b2b/Purchase.js
  50. 236 0
      frontend/saas-web/app/view/sale/b2b/PurchaseDetail.js
  51. 29 0
      frontend/saas-web/app/view/sale/b2b/PurchaseDetailController.js
  52. 14 0
      frontend/saas-web/app/view/sale/b2b/PurchaseDetailModel.js
  53. 1 1
      frontend/saas-web/app/view/sale/sale/QueryPanel.js
  54. 1 1
      frontend/saas-web/app/view/sale/saleIn/QueryPanel.js
  55. 5 0
      frontend/saas-web/resources/json/navigation.json

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

@@ -123,9 +123,6 @@ public enum BizExceptionCode implements BaseExceptionCode {
 
     //反结账
     EARLY_USERING(74012, "期初余额被使用,无法反结账"),
-
-
-
     //库存
     EMPTY_DATA(76100,"数据为空,请填写后再保存"),
     STORAGE_POST_ERROR(76200,""),
@@ -135,8 +132,8 @@ public enum BizExceptionCode implements BaseExceptionCode {
     STORAGE_WAREHOUSE_SAME(76501, "调拨单拨入拨出仓库一致"),
     STORAGE_WAREHOUSE_SAMES(76502, "调拨单: %s 拨入拨出仓库一致"),
     SALEIN_OUTOFQTY(76503, "销售退货单数量大于出货单数量"),
-    STOCKPROFIT_NULL(76600, "没有需要生成的盘盈盘亏单")
-    ;
+    STOCKPROFIT_NULL(76600, "没有需要生成的盘盈盘亏单"),
+    SALEDOWN_CLOSE(7650004, "客户采购单已关闭");
     private int code;
     private String message;
 

+ 26 - 0
applications/commons/commons-dto/src/main/java/com/usoftchina/saas/commons/po/Status.java

@@ -90,6 +90,32 @@ public enum Status {
      */
     PAYPART("部分付款"),
 
+    /**
+     * 未确认
+     */
+    UNCONFIRM("未确认"),
+
+    /**
+     * 确认
+     */
+    CONFIRMED("已确认"),
+
+    /**
+     * 确认
+     */
+    REJECT("不同意"),
+
+    /**
+     * 未上传
+     */
+    UNSEND("未上传"),
+
+    /**
+     * 已上传
+     */
+    SENDED("已上传"),
+
+
     /**
      * 已付款
      */

+ 1 - 4
applications/document/document-api/src/main/java/com/usoftchina/saas/document/api/VendorApi.java

@@ -2,13 +2,10 @@ package com.usoftchina.saas.document.api;
 
 import com.usoftchina.saas.auth.client.interceptor.ServiceFeignInterceptor;
 import com.usoftchina.saas.base.Result;
-import com.usoftchina.saas.document.dto.VendorDTO;
 import com.usoftchina.saas.document.dto.VendorListDTO;
-import com.usoftchina.saas.page.PageRequest;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestParam;
 
 import java.util.List;
 
@@ -20,6 +17,6 @@ public interface VendorApi {
      * @param id
      * @return
      */
-    @GetMapping("/read/{id}")
+    @GetMapping("/vendor/read/{id}")
     Result<VendorListDTO> getDataById(@PathVariable("id") Long id);
 }

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

@@ -98,4 +98,4 @@ b2b:
     inquiry: https://test-inquiry.uuzcc.cn
     Component: https://test-mall.uuzcc.cn
     product: http://test-product.uuzcc.cn
-    common: https://test-b2b.uuzcc.cn
+    common: http://test-b2b.uuzcc.cn

+ 35 - 0
applications/money/money-dto/src/main/java/com/usoftchina/saas/money/b2b/dto/APCheck.java

@@ -0,0 +1,35 @@
+package com.usoftchina.saas.money.b2b.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author: guq
+ * @create: 2019-01-19 14:06
+ **/
+@Data
+public class APCheck implements Serializable{
+    private Long ac_b2bid;
+    private Date ac_fromdate; // 对账起始日期
+    private Date ac_todate; // 对账截止日期
+    private Date ac_recorddate; // 录单日期
+    private String ac_recorder;//录单人
+    private Date ac_apdate; // 应付日期
+    private String ac_checkstatus;//对账状态
+    private String ac_remark;// 备注
+    private Date ac_commitdate;//提交日期  #
+    private Short ac_status;//上传状态 #
+    private Double ac_checkamount; // 对账金额
+    private String ac_currency; // 币别
+    private Double ac_rate; // 汇率
+    private String ac_paymentname; // 收款方式
+    private Long ac_custuu;//客户UU #
+    private Long ac_enuu;//供应商UU  #
+    private String ac_code; // 单据编号
+    private String ac_confirmstatus;//客户回复状态 #
+    private List<APCheckDetail> details; // 明细
+    private String ac_reason;//回复平台原因
+}

+ 26 - 0
applications/money/money-dto/src/main/java/com/usoftchina/saas/money/b2b/dto/APCheckDetail.java

@@ -0,0 +1,26 @@
+package com.usoftchina.saas.money.b2b.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author: guq
+ * @create: 2019-01-19 14:06
+ **/
+@Data
+public class APCheckDetail implements Serializable{
+    private Short ad_detno; // 明细行号
+    private Long ad_prid;// 客户物料ID #
+    private String ad_inoutno; // 客户出入库单号
+    private String ad_orderclass; // 客户出入库类型 #
+    private Long ad_orderdetno; // 客户出入库序号 #
+    private Double ad_price; // 单价
+    private Double ad_b2bqty; // 对账数量
+    private Double ad_b2bamount; // 本次对账金额
+    private Double ad_custcheckqty; // 客户确认数量 #
+    private String ad_remark; // 备注
+    private Long ad_id;// id
+    private Long ad_apid; // 关联Id
+    private Integer ad_status; // 对账状态 #
+}

+ 30 - 0
applications/money/money-dto/src/main/java/com/usoftchina/saas/money/po/ApcheckDetail.java

@@ -26,6 +26,36 @@ public class ApcheckDetail extends CommonBaseEntity{
 
     private Double ad_b2bqty;
 
+    private String pr_detail;
+
+    private String pr_spec;
+
+    private String pr_orispeccode;
+
+    public String getPr_detail() {
+        return pr_detail;
+    }
+
+    public void setPr_detail(String pr_detail) {
+        this.pr_detail = pr_detail;
+    }
+
+    public String getPr_spec() {
+        return pr_spec;
+    }
+
+    public void setPr_spec(String pr_spec) {
+        this.pr_spec = pr_spec;
+    }
+
+    public String getPr_orispeccode() {
+        return pr_orispeccode;
+    }
+
+    public void setPr_orispeccode(String pr_orispeccode) {
+        this.pr_orispeccode = pr_orispeccode;
+    }
+
     public Long getAd_acid() {
         return ad_acid;
     }

+ 14 - 4
applications/money/money-server/src/main/java/com/usoftchina/saas/money/controller/ApcheckController.java

@@ -3,6 +3,7 @@ package com.usoftchina.saas.money.controller;
 import com.github.pagehelper.PageInfo;
 import com.usoftchina.saas.base.Result;
 import com.usoftchina.saas.commons.dto.ListReqDTO;
+import com.usoftchina.saas.commons.po.Status;
 import com.usoftchina.saas.money.mapper.ApcheckMapper;
 import com.usoftchina.saas.money.po.Apcheck;
 import com.usoftchina.saas.money.po.ApcheckForm;
@@ -10,10 +11,7 @@ import com.usoftchina.saas.money.service.ApcheckService;
 import com.usoftchina.saas.page.PageDefault;
 import com.usoftchina.saas.page.PageRequest;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 /**
  * @author: guq
@@ -37,4 +35,16 @@ public class ApcheckController {
         ApcheckForm apcheckForm = apcheckService.getFormData(id);
         return Result.success(apcheckForm);
     }
+
+    @PostMapping("/agree/{id}")
+    public Result agree(@PathVariable("id") Long id) {
+        apcheckService.action(id, Status.CONFIRMED);
+        return Result.success();
+    }
+
+    @PostMapping("/reject/{id}")
+    public Result reject(@PathVariable("id") Long id) {
+        apcheckService.action(id, Status.REJECT);
+        return Result.success();
+    }
 }

+ 3 - 0
applications/money/money-server/src/main/java/com/usoftchina/saas/money/mapper/ApcheckMapper.java

@@ -1,5 +1,6 @@
 package com.usoftchina.saas.money.mapper;
 
+import com.usoftchina.saas.money.b2b.dto.APCheck;
 import com.usoftchina.saas.money.po.Apcheck;
 import com.usoftchina.saas.money.po.ApcheckDetail;
 import org.apache.ibatis.annotations.Param;
@@ -16,4 +17,6 @@ public interface ApcheckMapper {
     Apcheck selectByPrimaryKey(Long id);
 
     List<ApcheckDetail> selectByFK(Long id);
+
+    void updateStatus(@Param("status") String status, @Param("code") String code, @Param("id") Long id);
 }

+ 3 - 0
applications/money/money-server/src/main/java/com/usoftchina/saas/money/service/ApcheckService.java

@@ -3,6 +3,7 @@ package com.usoftchina.saas.money.service;
 import com.github.pagehelper.PageInfo;
 import com.usoftchina.saas.base.Result;
 import com.usoftchina.saas.commons.dto.ListReqDTO;
+import com.usoftchina.saas.commons.po.Status;
 import com.usoftchina.saas.money.po.Apcheck;
 import com.usoftchina.saas.money.po.ApcheckForm;
 import com.usoftchina.saas.page.PageRequest; /**
@@ -13,4 +14,6 @@ public interface ApcheckService {
     PageInfo<Apcheck> getListData(PageRequest page, ListReqDTO req);
 
     ApcheckForm getFormData(Long id);
+
+    void action(Long id, Status confirmed);
 }

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

@@ -2,17 +2,32 @@ package com.usoftchina.saas.money.service.impl;
 
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
+import com.usoftchina.saas.account.api.CompanyApi;
+import com.usoftchina.saas.account.dto.CompanyDTO;
+import com.usoftchina.saas.base.Result;
 import com.usoftchina.saas.commons.dto.ListReqDTO;
+import com.usoftchina.saas.commons.exception.BizExceptionCode;
+import com.usoftchina.saas.commons.po.Status;
 import com.usoftchina.saas.context.BaseContextHolder;
+import com.usoftchina.saas.context.SpringContextHolder;
+import com.usoftchina.saas.exception.BizException;
+import com.usoftchina.saas.money.b2b.dto.APCheck;
 import com.usoftchina.saas.money.mapper.ApcheckMapper;
 import com.usoftchina.saas.money.po.Apcheck;
 import com.usoftchina.saas.money.po.ApcheckDetail;
 import com.usoftchina.saas.money.po.ApcheckForm;
 import com.usoftchina.saas.money.service.ApcheckService;
 import com.usoftchina.saas.page.PageRequest;
+import com.usoftchina.saas.utils.JsonUtils;
+import com.usoftchina.saas.utils.StringUtils;
+import com.usoftchina.saas.utils.http.HttpUtil;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.HttpStatus;
 import org.springframework.stereotype.Service;
 
+import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
 
 /**
@@ -22,15 +37,22 @@ import java.util.List;
 @Service
 public class ApcheckServiceImpl implements ApcheckService{
 
+    @Value("${b2b.baseUrl.common}")
+    private String replyUrl;
+
     @Autowired
     private ApcheckMapper apcheckMapper;
 
+    @Autowired
+    private CompanyApi companyApi;
+
+    private static final String URI = "/erp/sale/APCheck/reply?access_id=";
+
     @Override
     public PageInfo<Apcheck> getListData(PageRequest page, ListReqDTO req) {
         PageHelper.startPage(page.getNumber(), page.getSize());
         //查询数据
         Long companyId = BaseContextHolder.getCompanyId();
-        companyId = 334l;
         String con = req.getFinalCondition();
         if (null == con) {
             con = "1=1";
@@ -55,4 +77,37 @@ public class ApcheckServiceImpl implements ApcheckService{
         saleFormDTO.setItems(items);
         return saleFormDTO;
     }
+
+    @Override
+    public void action(Long id, Status confirmed) {
+        if (StringUtils.isEmpty(id)) {
+            throw new BizException(BizExceptionCode.NULL_DATA);
+        }
+        Apcheck main = apcheckMapper.selectByPrimaryKey(id);
+        //传至b2b
+        if (null != main) {
+            Long companyid = BaseContextHolder.getCompanyId();
+            APCheck b2bCheck = new APCheck();
+            b2bCheck.setAc_code(main.getAc_code());
+            b2bCheck.setAc_b2bid(main.getAc_b2bid());
+            b2bCheck.setAc_confirmstatus(confirmed.getDisplay());
+            List<APCheck> replies = new ArrayList<APCheck>();
+            replies.add(b2bCheck);
+            HashMap<String, String> params = new HashMap<String, String>();
+            params.put("data", JsonUtils.toJsonString(replies));
+            Result<CompanyDTO> result = companyApi.getCompanyById(companyid);
+            if (result.isSuccess()) {
+                try {
+                    HttpUtil.Response response = HttpUtil.sendPostRequest(replyUrl + URI + result.getData().getUu(), params, true, result.getData().getAccessKey());
+                    if (response.getStatusCode() == HttpStatus.OK.value()) {
+                        //更新本地状态
+                        apcheckMapper.updateStatus(confirmed.getDisplay(), confirmed.name(), main.getAc_b2bid());
+                    }
+                } catch (Exception e) {
+                }
+            }
+
+        }
+    }
+
 }

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

@@ -84,4 +84,4 @@ b2b:
     inquiry: https://test-inquiry.uuzcc.cn
     Component: https://test-mall.uuzcc.cn
     product: http://test-product.uuzcc.cn
-    common: https://test-b2b.uuzcc.cn
+    common: http://test-b2b.uuzcc.cn

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

@@ -50,6 +50,9 @@
     <result column="createTime" property="createTime" jdbcType="TIMESTAMP" />
     <result column="creatorId" property="creatorId" jdbcType="INTEGER" />
     <result column="creatorName" property="creatorName" jdbcType="VARCHAR" />
+    <result column="pr_detail" property="pr_detail" jdbcType="VARCHAR" />
+    <result column="creatorName" property="pr_spec" jdbcType="VARCHAR" />
+    <result column="pr_orispeccode" property="pr_orispeccode" jdbcType="VARCHAR" />
   </resultMap>
 
   <sql id="Base_Column_List" >
@@ -72,7 +75,8 @@
     order by ac_id desc
   </select>
   <select id="selectByFK" resultMap="detailMap" parameterType="long">
-    select * from apcheckdetail where ad_acid=#{id}
+    select * from apcheckdetail left join product on pr_code = ad_prodcode
+     and apcheckdetail.companyid=product.companyid where ad_acid=#{id}
   </select>
   <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="long" >
     select 
@@ -443,4 +447,10 @@
       createTime = #{createTime,jdbcType=TIMESTAMP}
     where ac_id = #{ac_id,jdbcType=INTEGER}
   </update>
+
+
+  <update id="updateStatus">
+    update apcheck set ac_sendstatus='已上传',ac_confirmstatus=#{status},ac_confirmstatuscode=#{code},ac_confirmdate=now()
+    where ac_b2bid=#{id} and ifnull(ac_sendstatus,'未上传')='未上传'
+  </update>
 </mapper>

+ 31 - 0
applications/money/money-server/src/test/java/APcheckTest.java

@@ -0,0 +1,31 @@
+import com.usoftchina.saas.money.b2b.dto.APCheck;
+import com.usoftchina.saas.utils.JsonUtils;
+import com.usoftchina.saas.utils.http.HttpUtil;
+import org.junit.Test;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * @author: guq
+ * @create: 2019-01-19 14:00
+ **/
+public class APcheckTest {
+
+    private static final String URL = "http://test-b2b.uuzcc.cn/erp/sale/APCheck/reply?access_id=";
+    @Test
+    public void testA_httpUtil() throws Exception {
+        APCheck apCheck = new APCheck();
+        apCheck.setAc_b2bid(4643l);
+        apCheck.setAc_code("AP201901140002");
+        apCheck.setAc_confirmstatus("已确认");
+        List<APCheck> replies = new ArrayList<APCheck>();
+        replies.add(apCheck);
+        HashMap<String, String> params = new HashMap<String, String>();
+        System.out.println(JsonUtils.toJsonString(replies));
+        params.put("data", JsonUtils.toJsonString(replies));
+        HttpUtil.Response response = HttpUtil.sendPostRequest(URL + "10041166", params, true, "2c1ea0898633796fe050007f01002ea6");
+        System.out.println(response.getStatusCode() + "----" + response.getResponseText());
+    }
+}

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

@@ -194,10 +194,6 @@ public class PurchaseServiceImpl extends CommonBaseServiceImpl<PurchaseMapper, P
             calcPurchase(pu_id);
             //日志记录
             messageLogService.save(baseDTO);
-
-            //上传至B2B
-            uploadB2B(pu_id);
-
             return baseDTO;
         }
         //校验有来源的验收验退币别是否与源单据一致
@@ -639,6 +635,8 @@ public class PurchaseServiceImpl extends CommonBaseServiceImpl<PurchaseMapper, P
         getMapper().updateByPrimaryKeySelective(purchase);
         //日志
         messageLogService.audit(docBaseDTO);
+        //上传至B2B
+        uploadB2B(id);
         return result;
     }
 

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

@@ -96,4 +96,4 @@ b2b:
     inquiry: https://test-inquiry.uuzcc.cn
     Component: https://test-mall.uuzcc.cn
     product: http://test-product.uuzcc.cn
-    common: https://test-b2b.uuzcc.cn
+    common: http://test-b2b.uuzcc.cn

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

@@ -54,8 +54,8 @@ public class SaleDownController {
     @ApiOperation("转销售订单")
     @PostMapping("/toSale/{id}")
     public Result toSale(@PathVariable("id") Long id) {
-
-        return Result.success();
+        DocBaseDTO baseDTO = saleDownService.toSale(id);
+        return Result.success(baseDTO);
     }
 
 }

+ 20 - 0
applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/po/SaleDown.java

@@ -62,6 +62,26 @@ public class SaleDown extends CommonBaseEntity{
 
     private String sa_turnstatuscode;
 
+    private String sa_salecode;
+
+    private String sa_sendstatus;
+
+    public String getSa_salecode() {
+        return sa_salecode;
+    }
+
+    public void setSa_salecode(String sa_salecode) {
+        this.sa_salecode = sa_salecode;
+    }
+
+    public String getSa_sendstatus() {
+        return sa_sendstatus;
+    }
+
+    public void setSa_sendstatus(String sa_sendstatus) {
+        this.sa_sendstatus = sa_sendstatus;
+    }
+
     public String getSa_turnstatus() {
         return sa_turnstatus;
     }

+ 20 - 0
applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/po/SaleDownDetail.java

@@ -52,6 +52,26 @@ public class SaleDownDetail extends CommonBaseEntity{
 
     private String sd_remark;
 
+    private String sd_proddetail;
+
+    private String sd_prodbrand;
+
+    public String getSd_proddetail() {
+        return sd_proddetail;
+    }
+
+    public void setSd_proddetail(String sd_proddetail) {
+        this.sd_proddetail = sd_proddetail;
+    }
+
+    public String getSd_prodbrand() {
+        return sd_prodbrand;
+    }
+
+    public void setSd_prodbrand(String sd_prodbrand) {
+        this.sd_prodbrand = sd_prodbrand;
+    }
+
     public Long getSd_said() {
         return sd_said;
     }

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

@@ -17,4 +17,6 @@ public interface SaleDownService {
     SaleDownForm getFormData(Long id);
 
     DocBaseDTO update(SaleDownForm saleDownForm);
+
+    DocBaseDTO toSale(Long id);
 }

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

@@ -2,16 +2,24 @@ package com.usoftchina.saas.sale.service.impl;
 
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
+import com.usoftchina.saas.base.Result;
+import com.usoftchina.saas.commons.api.MaxnumberService;
 import com.usoftchina.saas.commons.dto.DocBaseDTO;
 import com.usoftchina.saas.commons.dto.ListReqDTO;
 import com.usoftchina.saas.commons.exception.BizExceptionCode;
 import com.usoftchina.saas.commons.po.BillCodeSeq;
+import com.usoftchina.saas.commons.po.Status;
 import com.usoftchina.saas.context.BaseContextHolder;
 import com.usoftchina.saas.exception.BizException;
 import com.usoftchina.saas.page.PageRequest;
+import com.usoftchina.saas.sale.dto.SaleDTO;
+import com.usoftchina.saas.sale.dto.SaleDetailDTO;
+import com.usoftchina.saas.sale.dto.SaleFormDTO;
 import com.usoftchina.saas.sale.mapper.SaledownMapper;
 import com.usoftchina.saas.sale.po.*;
 import com.usoftchina.saas.sale.service.SaleDownService;
+import com.usoftchina.saas.sale.service.SaleService;
+import com.usoftchina.saas.utils.BeanMapper;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.StringUtils;
@@ -30,12 +38,17 @@ public class SaleDownServiceImpl implements SaleDownService{
     @Autowired
     private SaledownMapper saledownMapper;
 
+    @Autowired
+    private MaxnumberService maxnumberService;
+
+    @Autowired
+    private SaleService saleService;
+
     @Override
     public PageInfo getListData(PageRequest page, ListReqDTO req) {
         PageHelper.startPage(page.getNumber(), page.getSize());
         //查询数据
         Long companyId = BaseContextHolder.getCompanyId();
-        companyId = 334l;
         String con = req.getFinalCondition();
         if (null == con) {
             con = "1=1";
@@ -68,7 +81,7 @@ public class SaleDownServiceImpl implements SaleDownService{
         Long sa_id = main.getId();
         String sa_code = main.getSa_code();
         //更新操作
-        saledownMapper.updateByPrimaryKeySelective(main);
+        //saledownMapper.updateByPrimaryKeySelective(main);
         //添加从表传输对象
         for (SaleDownDetail detail : items) {
             detail.setSd_said(sa_id);
@@ -95,6 +108,43 @@ public class SaleDownServiceImpl implements SaleDownService{
         return baseDTO;
     }
 
+    @Override
+    public DocBaseDTO toSale(Long id) {
+        if (StringUtils.isEmpty(id)){
+            throw new BizException(BizExceptionCode.EMPTY_DATA);
+        }
+        //查询主表信息
+        SaleDown main = saledownMapper.selectByPrimaryKey(id);
+        //查询从表
+        List<SaleDownDetail> items = saledownMapper.selectByFK(id);
+        //检测料号是否存在
+        for (SaleDownDetail  item : items) {
+            if (StringUtils.isEmpty(item.getSd_prodcode())) {
+                throw new BizException(789876, "序号:" + item.getSd_detno() + " 物料编号不存在,不允许转销售订单");
+            }
+        }
+        if (Status.CLOSE.getDisplay().equals(main.getSa_status())) {
+            throw new BizException(BizExceptionCode.SALEDOWN_CLOSE);
+        }
+        //转销售单
+        SaleFormDTO saleFormDTO = new SaleFormDTO();
+        List<SaleDetailDTO> details = null;
+        SaleDTO map = BeanMapper.map(main, SaleDTO.class);
+        Result<String> maxnumber = maxnumberService.getMaxnumber(BillCodeSeq.SALE.getCaller(), true);
+        if (maxnumber.isSuccess()) {
+            map.setSa_code(maxnumber.getData());
+        } else {
+            throw new BizException(maxnumber.getCode(), maxnumber.getMessage());
+        }
+        map.setId(0l);
+        map.setSa_date(new Date());
+
+        details = BeanMapper.mapList(items, SaleDetailDTO.class);
+        saleFormDTO.setMain(map);
+        saleFormDTO.setItems(details);
+        return saleService.saveFormData(saleFormDTO);
+    }
+
     @Override
     public SaleDownForm getFormData(Long id) {
         if (null == id || "0".equals(id)) {

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

@@ -96,4 +96,4 @@ b2b:
     inquiry: https://test-inquiry.uuzcc.cn
     Component: https://test-mall.uuzcc.cn
     product: http://test-product.uuzcc.cn
-    common: https://test-b2b.uuzcc.cn
+    common: http://test-b2b.uuzcc.cn

+ 3 - 0
applications/sale/sale-server/src/main/resources/config/application-dev.yml

@@ -10,3 +10,6 @@ eureka:
     registryFetchIntervalSeconds: 5
     serviceUrl:
       defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@127.0.0.1:8500/eureka/
+  logging:
+    level:
+      com.usoftchina.saas.sale: DEBUG

+ 10 - 24
applications/sale/sale-server/src/main/resources/mapper/SaledownMapper.xml

@@ -32,6 +32,8 @@
     <result column="creatorId" property="creatorId" jdbcType="INTEGER" />
     <result column="updateTime" property="updateTime" jdbcType="TIMESTAMP" />
     <result column="updaterId" property="updaterId" jdbcType="INTEGER" />
+    <result column="sa_salecode" property="sa_salecode" jdbcType="VARCHAR" />
+    <result column="sa_sendstatus" property="sa_sendstatus" jdbcType="VARCHAR" />
   </resultMap>
 
   <sql id="Base_Column_List" >
@@ -350,7 +352,7 @@
         updaterId = #{updaterId,jdbcType=INTEGER},
       </if>
     </set>
-    where sa_id = #{sa_id,jdbcType=INTEGER}
+    where sa_id = #{id,jdbcType=INTEGER}
   </update>
 
   <insert id="batchInsert" parameterType="java.util.List" >
@@ -423,6 +425,8 @@
     <result column="updateTime" property="updateTime" jdbcType="TIMESTAMP" />
     <result column="updaterId" property="updaterId" jdbcType="INTEGER" />
     <result column="creatorName" property="creatorName" jdbcType="VARCHAR" />
+    <result column="sd_proddetail" property="sd_proddetail" jdbcType="VARCHAR" />
+    <result column="sd_proddetail" property="sd_proddetail" jdbcType="VARCHAR" />
   </resultMap>
   <sql id="Detail_Column_List" >
     sd_id, sd_said, sd_code, sd_detno, b2b_pd_id, sd_prodid, sd_prodcode, sd_prodspec,
@@ -432,11 +436,12 @@
   </sql>
 
   <select id="selectByFK" parameterType="long" resultMap="detailMap">
-    select * from saledowndetail where sd_said=#{id}
+    select saledowndetail.*, pr_detail sd_proddetail, pr_brand sd_prodbrand from saledowndetail left join product on sd_prodid = pr_id where sd_said=#{id}
   </select>
 
   <select id="selectListByCon" resultMap="BaseResultMap">
-    select  *  from saledown
+    select  *  from
+    (select saledown.*,sale.sa_sendstatus from saledown left join sale on sa_saleid = sale.sa_id)tab_
     <where>
       <if test="con != null">
         ${con}
@@ -450,31 +455,12 @@
 
   <update id="batchUpdate" parameterType="com.usoftchina.saas.sale.po.SaleDownDetail">
     <foreach collection="list" item="item" index="index" open="" close="" separator=";">
-      update saledetail <set>
-      sd_said = #{item.sd_said},
-      sd_detno = #{item.sd_detno},
+      update saledowndetail <set>
       sd_prodid = #{item.sd_prodid},
       sd_prodcode = #{item.sd_prodcode},
-      sd_qty = #{item.sd_qty,jdbcType=DOUBLE},
-      sd_price = #{item.sd_price,jdbcType=DOUBLE},
-      sd_total = #{item.sd_total,jdbcType=DOUBLE},
-      sd_taxrate = #{item.sd_taxrate,jdbcType=DOUBLE},
-      sd_netprice = #{item.sd_netprice,jdbcType=DOUBLE},
-      sd_nettotal = #{item.sd_nettotal,jdbcType=DOUBLE},
-      sd_delivery = #{item.sd_delivery,jdbcType=TIMESTAMP},
-      sd_sendqty = #{item.sd_sendqty,jdbcType=DOUBLE},
-      sd_pdqty = #{item.sd_pdqty,jdbcType=DOUBLE},
       sd_remark = #{item.sd_remark,jdbcType=VARCHAR},
       companyId = #{item.companyId,jdbcType=INTEGER},
-      updaterId = #{item.updaterId,jdbcType=INTEGER},
-      updateTime = #{item.updateTime,jdbcType=TIMESTAMP},
-      sd_text1 = #{item.sd_text1,jdbcType=VARCHAR},
-      sd_text2 = #{item.sd_text2,jdbcType=VARCHAR},
-      sd_text3 = #{item.sd_text3,jdbcType=VARCHAR},
-      sd_text4 = #{item.sd_text4,jdbcType=VARCHAR},
-      sd_text5 = #{item.sd_text5,jdbcType=VARCHAR},
-      sd_yqty = #{item.sd_yqty,jdbcType=DOUBLE},
-      sd_code = #{item.sd_code,jdbcType=VARCHAR}
+      updateTime = now()
     </set>
       where sd_id = #{item.id,jdbcType=INTEGER}
     </foreach>

+ 24 - 0
applications/sale/sale-server/src/test/java/com/usoftchina/saas/sale/controller/SaleDownTest.java

@@ -0,0 +1,24 @@
+package com.usoftchina.saas.sale.controller;
+
+import com.usoftchina.saas.utils.JsonUtils;
+import com.usoftchina.saas.utils.http.HttpUtil;
+import org.junit.Test;
+
+import java.util.HashMap;
+
+/**
+ * @author: guq
+ * @create: 2019-01-19 13:49
+ **/
+
+public class SaleDownTest {
+
+    private static final String URL = "https://test-b2b.uuzcc.cn/erp/sale/APCheck/reply?access_id=";
+ @Test
+public void testA_httpUtil() {
+/*    // List<APCheck> replies
+     HashMap<String, String> params = new HashMap<String, String>();
+     params.put("data", JsonUtils.toJsonString(replies));
+     HttpUtil.sendPostRequest(URL + "10041166",);*/
+}
+}

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

@@ -3,4 +3,4 @@ b2b:
     inquiry: https://test-inquiry.uuzcc.cn
     Component: https://test-mall.uuzcc.cn
     product: http://test-product.uuzcc.cn
-    common: https://test-b2b.uuzcc.cn
+    common: http://test-b2b.uuzcc.cn

+ 0 - 5
applications/transfers/transfers-server/src/main/java/com/usoftchina/saas/transfers/controller/ApCheckController.java

@@ -46,9 +46,4 @@ public class ApCheckController {
         return Result.success(ids);
     }
 
-    @PostMapping("/test")
-    @ApiOperation(value = "测试")
-    public void test(@RequestBody ApcheckDTO apcheckDTO) {
-        System.out.println(apcheckDTO);
-    }
 }

+ 4 - 0
applications/transfers/transfers-server/src/main/java/com/usoftchina/saas/transfers/service/impl/ApCheckServiceImpl.java

@@ -2,6 +2,7 @@ package com.usoftchina.saas.transfers.service.impl;
 
 import com.usoftchina.saas.commons.api.MaxnumberService;
 import com.usoftchina.saas.commons.po.BillCodeSeq;
+import com.usoftchina.saas.commons.po.Status;
 import com.usoftchina.saas.document.entities.Vendor;
 import com.usoftchina.saas.money.dto.ApcheckFormDTO;
 import com.usoftchina.saas.money.po.Apcheck;
@@ -64,6 +65,9 @@ public class ApCheckServiceImpl implements ApCheckService{
             main.setAc_vendname(vendor.getVe_name());
             main.setCompanyId(companyId);
             main.setCreateTime(new Date());
+            main.setAc_confirmstatus(Status.UNCONFIRM.getDisplay());
+            main.setAc_confirmstatuscode(Status.UNCONFIRM.name());
+            main.setAc_sendstatus(Status.SENDED.getDisplay());
             //获取编号
             String code = maxnumberService.getMaxnumberByCompanyid(BillCodeSeq.APCHECK.getCaller(), true, companyId).getData();
             main.setAc_code(code);

+ 8 - 2
applications/transfers/transfers-server/src/main/java/com/usoftchina/saas/transfers/task/SendPurchaseEndTask.java

@@ -1,6 +1,8 @@
 package com.usoftchina.saas.transfers.task;
 
+import com.alibaba.fastjson.JSON;
 import com.usoftchina.saas.account.api.CompanyApi;
+import com.usoftchina.saas.account.dto.CompanyDTO;
 import com.usoftchina.saas.inquiry.po.purchase.PurchaseDetailEnd;
 import com.usoftchina.saas.purchase.api.PurchaseApi;
 import com.usoftchina.saas.purchase.dto.PurchaseDetailDTO;
@@ -41,7 +43,7 @@ public class SendPurchaseEndTask extends Executable {
 
     @Override
     public void execute(MessageInfo messageInfo) throws Exception {
-        String accessSecretKey = companyApi.getCompanyById(messageInfo.getCompanyId()).getData().getAccessKey();
+        CompanyDTO companyDTO = companyApi.getCompanyById(messageInfo.getCompanyId()).getData();
         PurchaseFormDTO purchaseFormDTO = purchaseApi.getFormData(Long.parseLong(messageInfo.getBizId())).getData();
         short endStatus = 0;
         //结案、反结案
@@ -60,10 +62,14 @@ public class SendPurchaseEndTask extends Executable {
                         new BigDecimal(purchaseDetailDTO.getId()).intValue());
                 purchaseDetailEndList.add(purchaseDetailEnd);
             }
+            //添加身份ID
+            String url = b2bConfig.getCommon() + purchaseEndUrl + "?access_id=" + companyDTO.getUu();
             //发送给b2b
-            boolean success = SendUtil.sendToB2B(b2bConfig.getCommon() + purchaseEndUrl, JsonUtils.toJsonString(purchaseDetailEndList), accessSecretKey);
+            boolean success = SendUtil.sendToB2B(url, JSON.toJSONString(purchaseDetailEndList), companyDTO.getAccessKey());
             if (success) {
                 purchaseApi.updateB2BStatus(Long.parseLong(messageInfo.getBizId()), "已上传");
+            } else {
+                throw new Exception("上传失败");
             }
         }
 

+ 10 - 2
applications/transfers/transfers-server/src/main/java/com/usoftchina/saas/transfers/task/SendPurchaseInResTask.java

@@ -1,5 +1,6 @@
 package com.usoftchina.saas.transfers.task;
 
+import com.alibaba.fastjson.JSON;
 import com.usoftchina.saas.account.api.CompanyApi;
 import com.usoftchina.saas.account.dto.CompanyDTO;
 import com.usoftchina.saas.inquiry.po.purchase.PurchaseProdInOut;
@@ -20,6 +21,7 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties
 import org.springframework.stereotype.Component;
 
 import java.math.BigDecimal;
+import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -39,7 +41,7 @@ public class SendPurchaseInResTask extends Executable {
     private B2BConfig b2bConfig;
 
     private static final Logger LOGGER = LoggerFactory.getLogger(SendProductTask.class);
-    private final String prodInUrl = "/erp/purchase/prodInOut/nonPosting";
+    private final String prodInResUrl = "/erp/purchase/prodInOut/nonPosting";
 
     @Override
     public void execute(MessageInfo messageInfo) throws Exception {
@@ -56,7 +58,13 @@ public class SendPurchaseInResTask extends Executable {
         b2bPurchaseProdInOut.setDetails(b2bPurchaseProdInOutDetailList);
         LOGGER.info("ProdIODetailDTOList={}, b2bPurchaseProdInOutDetailList={}", JsonUtils.toJsonString(prodInOutFormDTO.getItems()), JsonUtils.toJsonString(b2bPurchaseProdInOutDetailList));
 
-        boolean success = SendUtil.sendToB2B(b2bConfig.getCommon() + prodInUrl, JsonUtils.toJsonString(b2bPurchaseProdInOut), companyDTO.getAccessKey());
+        //添加身份ID
+        String url = b2bConfig.getCommon() + prodInResUrl + "?access_id=" + companyDTO.getUu();
+        //将数据改为B2B数据格式
+        List<PurchaseProdInOut> data = new ArrayList<PurchaseProdInOut>();
+        data.add(b2bPurchaseProdInOut);
+
+        boolean success = SendUtil.sendToB2B(url, JSON.toJSONString(data), companyDTO.getAccessKey());
         if (success) {
             LOGGER.info("采购验收单(反过账)上传成功, id={}", messageInfo.getBizId());
             prodInOutApi.updateB2BStatus(Long.parseLong(messageInfo.getBizId()), "已上传");

+ 11 - 1
applications/transfers/transfers-server/src/main/java/com/usoftchina/saas/transfers/task/SendPurchaseInTask.java

@@ -1,5 +1,6 @@
 package com.usoftchina.saas.transfers.task;
 
+import com.alibaba.fastjson.JSON;
 import com.usoftchina.saas.account.api.AccountApi;
 import com.usoftchina.saas.account.api.CompanyApi;
 import com.usoftchina.saas.account.dto.AccountDTO;
@@ -24,6 +25,7 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties
 import org.springframework.stereotype.Component;
 
 import java.math.BigDecimal;
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -62,10 +64,18 @@ public class SendPurchaseInTask extends Executable{
         b2bPurchaseProdInOut.setDetails(b2bPurchaseProdInOutDetailList);
         LOGGER.info("ProdIODetailDTOList={}, b2bPurchaseProdInOutDetailList={}", JsonUtils.toJsonString(prodInOutFormDTO.getItems()), JsonUtils.toJsonString(b2bPurchaseProdInOutDetailList));
 
-        boolean success = SendUtil.sendToB2B(b2bConfig.getCommon() + prodInUrl, JsonUtils.toJsonString(b2bPurchaseProdInOut), companyDTO.getAccessKey());
+        //添加身份ID
+        String url = b2bConfig.getCommon() + prodInUrl + "?access_id=" + companyDTO.getUu();
+        //将数据改为B2B数据格式
+        List<PurchaseProdInOut> data = new ArrayList<PurchaseProdInOut>();
+        data.add(b2bPurchaseProdInOut);
+        boolean success = SendUtil.sendToB2B(url, JSON.toJSONString(data), companyDTO.getAccessKey());
         if (success) {
             LOGGER.info("采购验收单上传成功, id={}", messageInfo.getBizId());
             prodInOutApi.updateB2BStatus(Long.parseLong(messageInfo.getBizId()), "已上传");
+        } else {
+            LOGGER.info("采购验收单上传失败, id={}", messageInfo.getBizId());
+            throw new Exception("上传失败");
         }
     }
 

+ 10 - 2
applications/transfers/transfers-server/src/main/java/com/usoftchina/saas/transfers/task/SendPurchaseOutResTask.java

@@ -1,5 +1,6 @@
 package com.usoftchina.saas.transfers.task;
 
+import com.alibaba.fastjson.JSON;
 import com.usoftchina.saas.account.api.CompanyApi;
 import com.usoftchina.saas.account.dto.CompanyDTO;
 import com.usoftchina.saas.inquiry.po.purchase.PurchaseProdInOut;
@@ -20,6 +21,7 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties
 import org.springframework.stereotype.Component;
 
 import java.math.BigDecimal;
+import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -38,7 +40,7 @@ public class SendPurchaseOutResTask extends Executable {
     private B2BConfig b2bConfig;
 
     private static final Logger LOGGER = LoggerFactory.getLogger(SendProductTask.class);
-    private final String prodOutUrl = "/erp/purchase/prodReturn/nonPosting";
+    private final String prodOutResUrl = "/erp/purchase/prodReturn/nonPosting";
 
 
     @Override
@@ -56,7 +58,13 @@ public class SendPurchaseOutResTask extends Executable {
         b2bPurchaseProdInOut.setDetails(b2bPurchaseProdInOutDetailList);
         LOGGER.info("ProdIODetailDTOList={}, b2bPurchaseProdInOutDetailList={}", JsonUtils.toJsonString(prodInOutFormDTO.getItems()), JsonUtils.toJsonString(b2bPurchaseProdInOutDetailList));
 
-        boolean success = SendUtil.sendToB2B(b2bConfig.getCommon() + prodOutUrl, JsonUtils.toJsonString(b2bPurchaseProdInOut), companyDTO.getAccessKey());
+        //添加身份ID
+        String url = b2bConfig.getCommon() + prodOutResUrl + "?access_id=" + companyDTO.getUu();
+        //将数据改为B2B数据格式
+        List<PurchaseProdInOut> data = new ArrayList<PurchaseProdInOut>();
+        data.add(b2bPurchaseProdInOut);
+
+        boolean success = SendUtil.sendToB2B(url, JSON.toJSONString(data), companyDTO.getAccessKey());
         if (success) {
             LOGGER.info("采购验退单(反过账)上传成功, id={}", messageInfo.getBizId());
             prodInOutApi.updateB2BStatus(Long.parseLong(messageInfo.getBizId()), "已上传");

+ 12 - 1
applications/transfers/transfers-server/src/main/java/com/usoftchina/saas/transfers/task/SendPurchaseOutTask.java

@@ -1,5 +1,6 @@
 package com.usoftchina.saas.transfers.task;
 
+import com.alibaba.fastjson.JSON;
 import com.usoftchina.saas.account.api.CompanyApi;
 import com.usoftchina.saas.account.dto.CompanyDTO;
 import com.usoftchina.saas.inquiry.po.purchase.PurchaseProdInOut;
@@ -20,6 +21,7 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties
 import org.springframework.stereotype.Component;
 
 import java.math.BigDecimal;
+import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -57,10 +59,19 @@ public class SendPurchaseOutTask extends Executable{
         b2bPurchaseProdInOut.setDetails(b2bPurchaseProdInOutDetailList);
         LOGGER.info("ProdIODetailDTOList={}, b2bPurchaseProdInOutDetailList={}", JsonUtils.toJsonString(prodInOutFormDTO.getItems()), JsonUtils.toJsonString(b2bPurchaseProdInOutDetailList));
 
-        boolean success = SendUtil.sendToB2B(b2bConfig.getCommon() + prodOutUrl, JsonUtils.toJsonString(b2bPurchaseProdInOut), companyDTO.getAccessKey());
+        //添加身份ID
+        String url = b2bConfig.getCommon() + prodOutUrl + "?access_id=" + companyDTO.getUu();
+        //将数据改为B2B数据格式
+        List<PurchaseProdInOut> data = new ArrayList<PurchaseProdInOut>();
+        data.add(b2bPurchaseProdInOut);
+
+        boolean success = SendUtil.sendToB2B(url, JSON.toJSONString(data), companyDTO.getAccessKey());
         if (success) {
             LOGGER.info("采购验退单上传成功, id={}", messageInfo.getBizId());
             prodInOutApi.updateB2BStatus(Long.parseLong(messageInfo.getBizId()), "已上传");
+        } else {
+            LOGGER.info("采购验退单上传失败, id={}", messageInfo.getBizId());
+            throw new Exception("上传失败");
         }
     }
 

+ 10 - 2
applications/transfers/transfers-server/src/main/java/com/usoftchina/saas/transfers/task/SendPurchaseTask.java

@@ -1,5 +1,6 @@
 package com.usoftchina.saas.transfers.task;
 
+import com.alibaba.fastjson.JSON;
 import com.usoftchina.saas.account.api.AccountApi;
 import com.usoftchina.saas.account.api.CompanyApi;
 import com.usoftchina.saas.account.dto.AccountDTO;
@@ -26,6 +27,7 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties
 import org.springframework.stereotype.Component;
 
 import java.math.BigDecimal;
+import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -67,10 +69,16 @@ public class SendPurchaseTask extends Executable {
             LOGGER.info("PurchaseDetailDTO={}, b2bPurchaseDetailList={}", JsonUtils.toJsonString(purchaseFormDTO.getItems()), JsonUtils.toJsonString(b2bPurchaseDetailList));
 
             b2bPurchase.setPurchaseDetails(b2bPurchaseDetailList);
-
-            boolean success = SendUtil.sendToB2B(b2bConfig.getCommon() + purchaseUrl, JsonUtils.toJsonString(b2bPurchase), companyDTO.getAccessKey());
+            //添加身份ID
+            String url = b2bConfig.getCommon() + purchaseUrl + "?access_id=" + companyDTO.getUu();
+            //将数据改为B2B数据格式
+            List<Purchase> data = new ArrayList<Purchase>();
+            data.add(b2bPurchase);
+            boolean success = SendUtil.sendToB2B(url, JSON.toJSONString(data), companyDTO.getAccessKey());
             if (success) {
                 purchaseApi.updateB2BStatus(Long.parseLong(messageInfo.getBizId()), "已上传");
+            }else{
+                throw new Exception("处理失败");
             }
         }
 

+ 7 - 1
applications/transfers/transfers-server/src/main/java/com/usoftchina/saas/transfers/utils/SendUtil.java

@@ -3,6 +3,8 @@ package com.usoftchina.saas.transfers.utils;
 import com.usoftchina.saas.utils.JsonUtils;
 import com.usoftchina.saas.utils.http.HttpUtil;
 import com.usoftchina.saas.utils.http.HttpUtil.Response;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import java.util.HashMap;
 import java.util.Map;
@@ -14,6 +16,8 @@ import java.util.Map;
  */
 public class SendUtil {
 
+    private static final Logger LOGGER = LoggerFactory.getLogger(SendUtil.class);
+
     /**
      *  发送请求给B2B
      * @param url         URL
@@ -24,7 +28,9 @@ public class SendUtil {
      */
     public static boolean sendToB2B(String url, String data, String accessSecretKey) throws Exception {
         Map<String, String> params = new HashMap<String, String>();
-        params.put("data", JsonUtils.toJsonString(data));
+        params.put("data", data);
+        LOGGER.info("url={}, accessSecretKey={}", url, accessSecretKey);
+        LOGGER.info("data={}", data);
         Response response = HttpUtil.sendPostRequest(url, params, true, accessSecretKey);
         if (response.getStatusCode() == 200){
             return true;

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

@@ -95,4 +95,4 @@ b2b:
     inquiry: https://test-inquiry.uuzcc.cn
     Component: https://test-mall.uuzcc.cn
     product: http://test-product.uuzcc.cn
-    common: https://test-b2b.uuzcc.cn
+    common: http://test-b2b.uuzcc.cn

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

@@ -519,6 +519,7 @@ public class AccountController {
 
     //清空缓存
     @RequestMapping("/cache/clearAll")
+    @IgnoreAuth
     public Result clearAll() {
         CompanyCache.current().clear();
         AccountCache.current().clear();

+ 2 - 0
base-servers/auth/auth-server/src/main/java/com/usoftchina/saas/auth/controller/AuthController.java

@@ -5,6 +5,7 @@ import com.usoftchina.saas.account.api.AccountApi;
 import com.usoftchina.saas.account.api.CompanyApi;
 import com.usoftchina.saas.account.constant.AccountType;
 import com.usoftchina.saas.account.dto.*;
+import com.usoftchina.saas.auth.client.annotation.IgnoreAuth;
 import com.usoftchina.saas.auth.common.cookie.CookieHelper;
 import com.usoftchina.saas.auth.common.cookie.CookieInfo;
 import com.usoftchina.saas.auth.common.jwt.JwtHelper;
@@ -49,6 +50,7 @@ import java.util.List;
 @RestController
 @RequestMapping
 @EnableConfigurationProperties(CookieConfig.class)
+@IgnoreAuth
 public class AuthController {
 
     @Autowired

+ 5 - 0
framework/core/src/main/java/com/usoftchina/saas/utils/http/HttpUtil.java

@@ -48,6 +48,8 @@ import org.apache.http.impl.client.HttpClients;
 import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
 import org.apache.http.message.BasicNameValuePair;
 import org.apache.http.protocol.HTTP;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.http.HttpStatus;
 import org.springframework.web.bind.annotation.RequestMethod;
 
@@ -60,6 +62,8 @@ import org.springframework.web.bind.annotation.RequestMethod;
  */
 @SuppressWarnings("deprecation")
 public class HttpUtil {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(HttpUtil.class);
 	
 	/** 
 	 * 绕过验证 
@@ -754,6 +758,7 @@ public class HttpUtil {
 			buf.append("&_signature=").append(HmacUtils.encode(message, signKey));
 		} else
 			buf.deleteCharAt(buf.length() - 1);
+		LOGGER.info("send URL={}", buf.toString());
 		return buf.toString();
 	}
 

+ 13 - 0
frontend/saas-web/app/model/sale/b2b/PurchaseDetail.js

@@ -0,0 +1,13 @@
+Ext.define('saas.model.sale.b2b.PurchaseDetail', {
+    extend: 'saas.model.Base',
+
+    fields: [
+        { name: 'id', type: 'int' }, // id
+        { name: 'sd_prodid', type: 'int' }, // 物料id
+        { name: 'sd_prodcode', type: 'string' }, // 物料编号
+        { name: 'sd_proddetail', type: 'string' }, // 物料名称
+        { name: 'sd_proddbrand', type: 'string' }, // 品牌
+        { name: 'sd_orispeccode', type: 'string' }, // 型号
+        { name: 'sd_prodspec', type: 'string' }, // 规格
+    ],
+});

+ 9 - 8
frontend/saas-web/app/view/core/dbfind/types/CustomerDbfindTrigger.js

@@ -48,14 +48,6 @@ Ext.define('saas.view.core.dbfind.types.CustomerDbfindTrigger', {
         text: "客户类型",
         dataIndex: "cu_type",
         width: 110
-    }, {
-        text: "税率(%)",
-        dataIndex: "cu_taxrate",
-        xtype: 'numbercolumn',
-        width:80,
-        renderer: function (v, m, r) {
-            return saas.util.BaseUtil.numberFormat(v, 2, false);
-        }
     }, {
         text: "币别",
         dataIndex: "cu_currency",
@@ -65,10 +57,19 @@ Ext.define('saas.view.core.dbfind.types.CustomerDbfindTrigger', {
         text: "汇率",
         xtype:'numbercolumn',
         dataIndex: "cr_rate",
+        hidden: true,
         width:110,
         renderer: function (v, m, r) {
             return saas.util.BaseUtil.numberFormat(v, 6, false);
         }
+    }, {
+        text: "税率(%)",
+        dataIndex: "cu_taxrate",
+        xtype: 'numbercolumn',
+        width:80,
+        renderer: function (v, m, r) {
+            return saas.util.BaseUtil.numberFormat(v, 2, false);
+        }
     }, {
         text: "业务员编号",
         dataIndex: "cu_sellercode",

+ 10 - 9
frontend/saas-web/app/view/core/dbfind/types/VendorDbfindTrigger.js

@@ -49,15 +49,6 @@ Ext.define('saas.view.core.dbfind.types.VendorDbfindTrigger', {
         text: "供应商类型",
         dataIndex: "ve_type",
         width: 110,
-    }, {
-        text: "税率(%)",
-        dataIndex: "ve_taxrate",
-        width: 80,
-        xtype: 'numbercolumn',
-        align:'end',
-        renderer : function(v, m, r) {
-            return saas.util.BaseUtil.numberFormat(v, 2, false);
-        }
     }, {
         text: "币别",
         dataIndex: "ve_currency",
@@ -66,11 +57,21 @@ Ext.define('saas.view.core.dbfind.types.VendorDbfindTrigger', {
     }, {
         text: "汇率",
         xtype:'numbercolumn',
+        hidden: true,
         dataIndex: "cr_rate",
         width:110,
         renderer: function (v, m, r) {
             return saas.util.BaseUtil.numberFormat(v, 6, false);
         }
+    }, {
+        text: "税率(%)",
+        dataIndex: "ve_taxrate",
+        width: 80,
+        xtype: 'numbercolumn',
+        align:'end',
+        renderer : function(v, m, r) {
+            return saas.util.BaseUtil.numberFormat(v, 2, false);
+        }
     }, {
         text: "采购员编号",
         dataIndex: "ve_buyercode",

+ 1 - 1
frontend/saas-web/app/view/core/tab/Controller.js

@@ -33,7 +33,7 @@ Ext.define('saas.view.core.tab.Controller', {
         if(!component.resetCloseClick) {
             component.tab.onCloseClick = function() {
                 var me = this,
-                tabView = component.down('panel');
+                tabView = component.down('container');
          
                 if (me.fireEvent('beforeclose', me) !== false) {
                     if (me.tabBar) {

+ 6 - 0
frontend/saas-web/app/view/document/uusetting/UUSettingController.js

@@ -68,8 +68,14 @@ Ext.define('saas.view.document.uusetting.UUSettingController', {
             kind: kind
         };
         if(kind == 'vendorkind') {
+            if(!!record.get('ve_uu')) {
+                return;
+            }
             config.cname = record.get('ve_name');
         }else {
+            if(!!record.get('cu_uu')) {
+                return;
+            }
             config.cname = record.get('cu_name');
         }
         this.getViewModel().setData(record.data);

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

@@ -107,7 +107,6 @@ Ext.define('saas.view.home.InfoCard', {
         p = me.up('home'),
         cards = me.cards,
         datas = [],
-        items = [];
         size = Math.ceil(me.body.el.getBox().width / 230);
 
         me.removeAll();

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

@@ -239,7 +239,7 @@ Ext.define('saas.view.purchase.purchase.QueryPanel', {
                     text: '税率(%)',
                     dataIndex: 'pd_taxrate',
                     xtype: 'numbercolumn',
-                    width: 110,
+                    width: 80,
                     renderer : function(v, m, r) {
                         return saas.util.BaseUtil.numberFormat(v, 0, true);
                     }

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

@@ -250,7 +250,7 @@ Ext.define('saas.view.purchase.purchaseIn.QueryPanel', {
                     text: '税率(%)',
                     dataIndex: 'pd_taxrate',
                     xtype: 'numbercolumn',
-                    width: 110,
+                    width: 80,
                     renderer : function(v, m, r) {
                         return saas.util.BaseUtil.numberFormat(v, 0, true);
                     }

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

@@ -256,7 +256,7 @@ Ext.define('saas.view.purchase.purchaseOut.QueryPanel', {
                     text: '税率(%)',
                     dataIndex: 'pd_taxrate',
                     xtype: 'numbercolumn',
-                    width: 110,
+                    width: 80,
                     renderer : function(v, m, r) {
                         return saas.util.BaseUtil.numberFormat(v, 0, true);
                     }

+ 203 - 0
frontend/saas-web/app/view/sale/b2b/Purchase.js

@@ -0,0 +1,203 @@
+/**
+ * 客户采购单
+ */
+Ext.define('saas.view.sale.b2b.Purchase', {
+    extend: 'saas.view.core.base.BasePanel',
+    xtype: 'sale-b2b-purchase',
+
+    // controller: 'sale-b2b-purchase',
+    // viewModel: 'sale-b2b-purchase',
+    viewName: 'sale-b2b-purchase',
+
+
+    // dataUrl: 'http://10.1.80.35:8560/api/sale/saledown/list',
+    dataUrl: '/api/sale/saledown/list',
+    initComponent: function() {
+        var me = this;
+        Ext.apply(this, {
+            searchField: [{
+                xtype: 'textfield',
+                name: 'keyword',
+                columnWidth: 0.15,
+                emptyText:'请输入供应商名称'
+            }, {
+                xtype: 'condatefield',
+                name: 'date',
+                fieldLabel: '日期',
+                columnWidth: 0.5,
+                labelWidth: 50,
+            }, {
+                xtype: 'textfield',
+                name: 'keyword',
+                labelWidth: 0,
+                columnWidth: 0.15,
+                emptyText: '销售单号'
+            }, {
+                xtype: 'checkbox',
+                name: 'status',
+                fieldLabel: '已结案',
+                columnWidth: 0.1,
+                labelWidth: 50,
+                getCondition: function(v) {
+                    if(v) {
+                        return 'status=' + Number(v);
+                    }else {
+                        return '1=1';
+                    }
+                }
+            }, {
+                xtype: 'checkbox',
+                name: 'status',
+                fieldLabel: '待出货',
+                columnWidth: 0.1,
+                labelWidth: 50,
+                getCondition: function(v) {
+                    if(v) {
+                        return 'status=' + Number(v);
+                    }else {
+                        return '1=1';
+                    }
+                }
+            }],
+        
+            caller: null,
+            _formXtype: null,
+            _title: null,
+            _deleteUrl: null,
+            _batchOpenUrl: null,
+            _batchCloseUrl: null,
+            _batchDeleteUrl: null,
+        
+            gridConfig: {
+                idField: null,
+                codeField: null,
+                statusCodeField: null,
+                dataUrl: me.dataUrl,
+                caller: null,
+                rootProperty: 'data.list',
+                totalProperty: 'data.total',
+                actionColumn: [],
+                selModel: {
+                    type: 'cellmodel'
+                },
+                hiddenTools: true,
+                data: [{
+
+                }],
+                columns : [{
+                    text: 'ID',
+                    dataIndex: 'id',
+                    hidden: true,
+                    width: 100
+                }, {
+                    text: '转单状态',
+                    dataIndex: 'sa_trunstatus',
+                    width: 100,
+                    textAlign: 'center'
+                }, {
+                    text: '客户PO',
+                    dataIndex: 'sa_pocode',
+                    width: 160
+                }, {
+                    text: '订单日期',
+                    xtype: 'datecolumn',
+                    dataIndex: 'createTime',
+                    width: 160,
+                    format: 'Y-m-d H:i:s'
+                }, {
+                    text: '客户编号',
+                    dataIndex: 'sa_custcode',
+                    width: 120
+                }, {
+                    text: '客户名称',
+                    dataIndex: 'sa_custname',
+                    width: 200
+                }, {
+                    text: '销售单号',
+                    dataIndex: 'sa_salecode',
+                    width: 120
+                }, {
+                    text: '出货状态',
+                    dataIndex: 'sa_sendstatus',
+                    textAlign: 'center'
+                }, {
+                    text: '交货地址',
+                    dataIndex: 'sa_toplace',
+                    width: 250
+                }],
+                listeners: {
+                    itemclick: function(view, record, item, index, e, eOpts) {
+                        saas.util.BaseUtil.openTab('sale-b2b-purchasedetail', '客户采购单', 'sale-b2b-purchasedetail'+record.id, {
+                            initId: record.get('id')
+                        }); 
+                    }
+                }
+            },
+        });
+        this.callParent(arguments);
+    },
+
+    /**
+     * 处理部分字段值
+     */
+    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;
+    },
+
+    getExtraParams: function(store, op, condition) {
+        var temp = {};
+
+        for(let x = 0; x < condition.length; x++) {
+            let c = condition[x];
+            if(c.field == 'keyword') {
+                temp.keyword = c.value;
+            }else if(c.field == 'date') {
+                temp.fromDate = new Date(c.value.split(',')[0]).getTime();
+                temp.endDate = new Date(c.value.split(',')[1]).getTime();
+            }else if(c.field == 'quoted') {
+                temp.quoted = c.value == 'all' ? null : c.value;
+            }else if(c.field == 'closed') {
+                // temp.endDate = c.value == 'all' ? null : (
+                //     c.value == '0' ? 
+                // );
+            }
+        }
+        let obj = {
+            pageNumber: store.exportNumber?store.exportNumber:op._page,
+            pageSize: store.exportPageSize?store.exportPageSize:store.pageSize
+        };
+        for(let k in temp) {
+            if(!!temp[k]) {
+                obj[k] = temp[k];
+            }
+        }
+        return obj;
+     },
+});

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

@@ -0,0 +1,236 @@
+Ext.define('saas.view.sale.b2b.PurchaseDetail', {
+    extend: 'saas.view.core.form.FormPanel',
+    xtype: 'sale-b2b-purchasedetail',
+
+    controller: 'sale-b2b-purchasedetail',
+    viewModel: 'sale-b2b-purchasedetail',
+
+    viewName: 'sale-b2b-purchasedetail',
+
+    //字段属性
+    _title: '客户采购单',
+    _idField: 'id',
+    _codeField: 'sa_code',
+    _statusField: null,
+    _statusCodeField: null,
+    _auditmanField: 'sa_auditman',
+    _auditdateField: 'sa_auditdate',
+    _relationColumn: 'sd_puid',
+    // _readUrl: 'http://10.1.80.35:8560/api/sale/saledown/read',
+    _readUrl: '/api/sale/saledown/read',
+    // _saveUrl: 'http://10.1.80.35:8560/api/sale/saledown/update',
+    _saveUrl: '/api/sale/saledown/update',
+    // _toSaleUrl: 'http://10.1.80.35:8560/api/sale/saledown/toSale',
+    _toSaleUrl: '/api/sale/saledown/toSale',
+    initId: 0,
+
+    codeInHeader: false,
+
+    initComponent: function () {
+        Ext.apply(this, {
+            defaultItems: [{
+                xtype: 'textfield',
+                name: 'sa_pocode',
+                fieldLabel: '客户PO',
+                readOnly: true
+            }, {
+                xtype: "datefield",
+                name: "createTime",
+                fieldLabel: "单据日期",
+                readOnly: true
+            }, {
+                xtype: 'condbfindtrigger',
+                fieldLabel: '币别汇率',
+                allowBlank: false,
+                readOnly: true,
+                dbType: 'currencyDbfindTrigger',
+                dbfinds: [{
+                    from: 'cr_name', to: 'sa_currency'
+                }, {
+                    from: 'cr_rate', to: 'sa_rate'
+                }],
+                supFieldConfig: {
+                    xtype: 'numberfield',
+                    readOnly: false,
+                    defaultReadOnly: false,
+                    defaultValue: 1,
+                    decimalPrecision: 6,
+                    vtype: 'positiveNumber'
+                }
+            }, {
+                name: "sa_status",
+                xtype: "textfield",
+                fieldLabel: "单据状态",
+                readOnly: true
+            }, {
+                xtype: 'textfield',
+                name: 'sa_custname',
+                fieldLabel: '客户名称',
+                columnWidth: 0.5,
+                readOnly: true
+            }, {
+                xtype: 'textfield',
+                name: 'sa_toplace',
+                fieldLabel: '交货地址',
+                columnWidth: 0.5,
+                readOnly: true
+            }, {
+                name: "detailGridField",
+                xtype: "detailGridField",
+                detnoColumn: 'sd_detno',
+                storeModel: 'saas.model.sale.b2b.PurchaseDetail',
+                deleteDetailUrl: '/api/sale/sale/deleteDetail',
+                allowEmpty: true,
+                columns: [{
+                    text: 'id',
+                    dataIndex: 'id',
+                    hidden: true,
+                }, {
+                    text: '物料id',
+                    dataIndex: 'sd_prodid',
+                    hidden: true
+                }, {
+                    text: "物料编号",
+                    width: 150.0,
+                    dataIndex: "sd_prodcode",
+                    allowBlank: false,
+                    editor: {
+                        displayField: "display",
+                        editable: true,
+                        format: "",
+                        hideTrigger: false,
+                        maxLength: 100.0,
+                        minValue: null,
+                        positiveNum: false,
+                        queryMode: "local",
+                        store: null,
+                        valueField: "value",
+                        xtype: "productDbfindTrigger",
+                        dbfinds: [{
+                            from: 'pr_code', to: 'sd_prodcode'
+                        }, {
+                            from: 'pr_detail', to: 'sd_proddetail'
+                        }, {
+                            from: 'pr_spec', to: 'sd_prodspec'
+                        },{
+                            from: 'pr_brand', to: 'sd_proddbrand'
+                        },{
+                            from: 'pr_orispeccode', to: 'sd_orispeccode'
+                        },{
+                            from: 'id', to: 'sd_prodid'
+                        }]
+                    }
+                }, {
+                    text: "物料名称",
+                    width: 150.0,
+                    dataIndex: "sd_proddetail"
+                }, {
+                    text: "品牌",
+                    width: 100.0,
+                    dataIndex: "sd_proddbrand"
+                }, {
+                    text: "型号",
+                    width: 200.0,
+                    dataIndex: "sd_orispeccode",
+                    ignore: true
+                }, {
+                    text: "规格",
+                    width: 200,
+                    dataIndex: "sd_prodspec"
+                }, {
+                    text: '客户料号',
+                    width: 120,
+                    dataIndex: 'sd_custprodcode',
+                }, {
+                    text: '客户型号',
+                    width: 120,
+                    dataIndex: 'sd_custorispeccode',
+                }, {
+                    text: '客户规格',
+                    dataIndex: 'sd_custprodspec',
+                    width: 120
+                }, {
+                    text: "数量",
+                    dataIndex: "sd_qty",
+                    width: 110.0,
+                    xtype: 'numbercolumn',
+                    allowBlank: false,
+                    renderer: function(v, m, r) {
+                        return saas.util.BaseUtil.numberFormat(v, 3, false);
+                    },
+                    summaryType: 'sum',
+                    summaryRenderer: function(v, d, f, m) {
+                        return saas.util.BaseUtil.numberFormat(v, 3, false);
+                    }
+                }, {
+                    text: "单位",
+                    width: 65.0,
+                    dataIndex: "sd_produnit",
+                    ignore: true,
+                    renderer: function (v, m, r) {
+                        if (!v) {
+                            return r.data["productDTO"] ? r.data["productDTO"][m.column.dataIndex] : null;
+                        }
+                        return v;
+                    }
+                }, {
+                    text: "含税单价(元)",
+                    xtype: 'numbercolumn',
+                    dataIndex: "sd_price",
+                    width: 120,
+                    renderer: function(v, m, r) {
+                        return saas.util.BaseUtil.numberFormat(v, 4, true);
+                    },
+                    listeners: {
+                        edit: function (value, grid) {
+                            var r = grid.getSelection()[0],
+                                sd_taxrate = r.get('sd_taxrate');
+                            var v = value / (1 + sd_taxrate / 100);
+                            r.set('sd_netprice', Number(saas.util.BaseUtil.numberFormat(v, 4, false)));
+                        }
+                    }
+                }, {
+                    text: "税率(%)",
+                    xtype: 'numbercolumn',
+                    dataIndex: "sd_taxrate",
+                    width: 80,
+                    renderer: function(v, m, r) {
+                        return saas.util.BaseUtil.numberFormat(v, 2, false);
+                    }
+                }, {
+                    text: "价税合计(元)",
+                    xtype: 'numbercolumn',
+                    dataIndex: "sd_total",
+                    width: 120,
+                    renderer: function(v, m, r) {
+                        return saas.util.BaseUtil.numberFormat(v, 2, true);
+                    },
+                    summaryType: 'sum',
+                    summaryRenderer: function(v, d, f, m) {
+                        return saas.util.BaseUtil.numberFormat(v, 2, true);
+                    }
+                }, {
+                    text: "交货日期",
+                    dataIndex: "sd_delivery",
+                    width: 110.0,
+                    xtype: 'datecolumn',
+                }, {
+                    text: "备注",
+                    dataIndex: "sd_remark",
+                    width: 250,
+                    items: null,
+                }]
+            }],
+            toolBtns: [{
+                xtype: 'button',
+                text: '转销售',
+                handler: 'turnSale',
+            }, {
+                xtype: 'button',
+                text: '更新',
+                handler: 'onSave',
+            }]
+        });
+        this.callParent();
+    },
+});

+ 29 - 0
frontend/saas-web/app/view/sale/b2b/PurchaseDetailController.js

@@ -0,0 +1,29 @@
+Ext.define('saas.view.sale.b2b.PurchaseDetailController', {
+    extend: 'saas.view.core.form.FormPanelController',
+    alias: 'controller.sale-b2b-purchasedetail',
+
+    turnSale: function() {
+        var me = this,
+        view = me.getView(),
+        viewModel = me.getViewModel(),
+        id = viewModel.get(view._idField);
+
+        view.setLoading(true);
+        saas.util.BaseUtil.request({
+            url: view._toSaleUrl + '/' + id,
+            method: 'POST'
+        })
+        .then(function(res) {
+            view.setLoading(false);
+            var id = res.data.id;
+            var code = res.data.code;
+            saas.util.BaseUtil.showSuccessToast('转单成功');
+            saas.util.BaseUtil.openTab('sale-sale-formpanel', '销售订单' + '(' + code + ')', 'sale-sale-formpanel-' + id, {
+                initId: id
+            } )
+        })
+        .catch(function(e) {
+            saas.util.BaseUtil.showErrorToast(e.message);
+        });
+    }
+});

+ 14 - 0
frontend/saas-web/app/view/sale/b2b/PurchaseDetailModel.js

@@ -0,0 +1,14 @@
+Ext.define('saas.view.sale.b2b.PurchaseDetailModel', {
+    extend: 'saas.view.core.base.BasePanelModel',
+    alias: 'viewmodel.sale-b2b-purchasedetail',
+
+    data: {
+        showAddBtn: false, // 显示新增按钮
+        showSaveBtn: false, // 显示保存按钮
+        showDeleteBtn: false, // 显示删除按钮
+        showCopyBtn: false, // 显示复制按钮
+        showAuditBtn: false, // 显示审核、反审核按钮
+        showPrintBtn: false, // 显示打印按钮
+        configurable: true, // 显示界面设置按钮
+    }
+});

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

@@ -243,7 +243,7 @@ Ext.define('saas.view.sale.sale.QueryPanel', {
                     text: '税率(%)',
                     dataIndex: 'sd_taxrate',
                     xtype: 'numbercolumn',
-                    width: 110,
+                    width: 80,
                     renderer : function(v, m, r) {
                         return saas.util.BaseUtil.numberFormat(v, 0, true);
                     }

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

@@ -250,7 +250,7 @@ Ext.define('saas.view.sale.saleIn.QueryPanel', {
                     text: '税率(%)',
                     dataIndex: 'pd_taxrate',
                     xtype: 'numbercolumn',
-                    width: 110,
+                    width: 80,
                     renderer : function(v, m, r) {
                         return saas.util.BaseUtil.numberFormat(v, 0, true);
                     }

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

@@ -90,6 +90,11 @@
             "id": "sale-b2b-mybusiness",
             "text": "我的商机",
             "viewType": "sale-b2b-mybusiness"
+        }, {
+            "b2b":true,
+            "id": "sale-b2b-purchase",
+            "text": "客户采购单",
+            "viewType": "sale-b2b-purchase"  
         }]
     }, {
         "text": "报表",