333
schangxiang@126.com
2025-09-19 18966e02fb573c7e2bb0c6426ed792b38b910940
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
//#region import
import BaseApiService from "../baseApiService";
import { ResultInfo } from "../../public/commonInterface";
import { ExpressBSHTOrder } from "../../entity/express/bsht/expressBSHTOrder";
import { ExpressBSHTBaseInfo } from "../../entity/express/bsht/expressBSHTBaseInfo";
import { ExpressBSHTOrderList } from "../../entity/express/bsht/expressBSHTOrderList";
//#endregion
 
/**
 * 百世汇通接口帮助类
 */
export default class BshtHelperService extends BaseApiService {
  //#region 推送订单 pushOrder
  public async pushOrder(orderIdList) {
    let info: ResultInfo = {
      result: false,
      msg: undefined
    };
    info.result = false;
 
    let msg = "";
    for (let orderId of orderIdList) {
      let orderInfo = await this.dbRead.findOne(ExpressBSHTOrder, {
        bSHTOrder_Id: orderId
      });
 
      try {
        //获得账户信息
        if (!orderInfo.interfaceAccount_Id) {
          msg += "订单[" + orderInfo.orderCode + "]位置接口账号,无法推送!<br/>";
          continue;
        }
 
        let baseInfo = await this.dbRead.findOne(ExpressBSHTBaseInfo, {
          baseInfo_Id: orderInfo.interfaceAccount_Id
        });
        let url = baseInfo.apiUrl;
 
        let itemName = [];
        let itemWeight = 0;
        let itemCount = 0;
        // 明细名称
        let details = await this.dbRead.find(ExpressBSHTOrderList, {
          bSHTOrder_Id: orderId
        });
        for (let item of details) {
          itemName.push(item.itemName);
          itemWeight += item.itemWeight;
          itemCount += item.itemCount;
        }
        let bizData = {
          deliveryConfirm: false,
          msgId: orderInfo.orderCode,
          auth: {
            username: baseInfo.username,
            pass: baseInfo.password
          },
          EDIPrintDetailList: [
            {
              sendMan: orderInfo.sendMan,
              sendManPhone: orderInfo.sendManPhone,
              sendManAddress: orderInfo.sendManAddress,
              sendPostcode: orderInfo.sendPostcode,
              sendProvince: orderInfo.sendProvince,
              sendCity: orderInfo.sendCity,
              sendCounty: orderInfo.sendCounty,
              receiveMan: orderInfo.receiveMan,
              receiveManPhone: orderInfo.receiveManPhone,
              receiveManAddress: orderInfo.receiveManAddress,
              receivePostcode: orderInfo.receivePostcode,
              receiveProvince: orderInfo.receiveProvince,
              receiveCity: orderInfo.receiveCity,
              receiveCounty: orderInfo.receiveCounty,
              txLogisticID: orderInfo.txLogisticID,
              itemName: itemName.join(","),
              itemWeight: itemWeight,
              itemCount: itemCount,
              remark: orderInfo.remark
            }
          ]
        };
        let signData = JSON.stringify(bizData) + baseInfo.partnerKey;
        let sign = this.ctx.helper.md5(signData).toLocaleLowerCase();
        let postData = {
          serviceType: "KD_WAYBILL_APPLY_NOTIFY",
          bizData: JSON.stringify(bizData),
          partnerID: Number(baseInfo.partnerId),
          sign: sign
        };
        const resultObj = await this.ctx.curl(url, {
          // 必须指定 method
          method: "POST",
          // 通过 contentType 告诉 HttpClient 以 JSON 格式发送
          contentType: "application/x-www-form-urlencoded",
          data: postData,
          // 明确告诉 HttpClient 以 JSON 格式处理返回的响应 body
          dataType: "json"
        });
 
        if (resultObj.data.result) {
          //todo: 以下需要做更新ERP订单快递单号,和接口表快递单号,及相关业务逻辑
          for (let item of resultObj.data.EDIPrintDetailList) {
            let sql = `UPDATE ExpressBSHT_Order SET mailNo=@0, 
            PushDate=GETDATE(),InterfaceStatusID=3, InterfaceStatusText='推送成功', PushCount = ISNULL(PushCount, 0) + 1,
            markDestination=@5, sortingSiteCode=@4
            WHERE bSHTOrder_Id=@1;
            Update Sale_OuterList Set extendField10=@0 From Sale_Outer INNER JOIN Sale_OuterList ON Sale_Outer.Outer_Id=Sale_OuterList.Outer_Id
            Where Sale_Outer.Order_Id=@2 And Sale_OuterList.CaseNumber=@3;
            Update Sale_Order Set ExpressCode=@0, sortingCode=@4, BigPen=@5 Where Order_Id=@2;
            Update dbo.Sale_OrderPrintList Set ExpressCode=(SELECT top 1 ExpressCode FROM dbo.Sale_Order WHERE dbo.Sale_Order.Order_Id=dbo.Sale_OrderPrintList.Order_Id)
            Where Order_Id=@2;`;
            await this.dbWrite.query(sql, [
              item.mailNo, // 0
              orderInfo.bSHTOrder_Id, // 1
              orderInfo.order_Id, // 2
              orderInfo.mailNo, // 3 箱号(可能)
              item.sortingCode, // 4 分拣码
              item.markDestination // 5 大头笔
            ]);
            info.msg = "推送成功!";
            info.result = true;
 
            msg += "订单[" + orderInfo.orderCode + "]推送结果," + info.msg + "<br/>";
          }
        } else {
          info.result = false;
          info.msg = "错误信息:" + resultObj.data.errorDescription;
        }
      } catch (error) {
        msg = error.message;
        await this.dbWrite.update(
          ExpressBSHTOrder,
          {
            bSHTOrder_Id: orderId,
            userProduct_Id: orderInfo.userProduct_Id
          },
          {
            pushCount: (orderInfo.pushCount || 0) + 1
          }
        );
      }
    }
    info.msg = msg;
    console.log(msg);
 
    return info;
  }
  //#endregion
}