//#region import
|
import BaseApiService from "../baseApiService";
|
import { ResultInfo } from "../../public/commonInterface";
|
// import moment = require("moment");
|
import * as crypto from "crypto";
|
import { ExpressSTOOrder } from "../../entity/express/shentong/expressSTOOrder";
|
import { ExpressSTOBaseInfo } from "../../entity/express/shentong/expressSTOBaseInfo";
|
import { ExpressSTOOrderRoute } from "../../entity/express/shentong/expressSTOOrderRoute";
|
import { SaleOrder } from "../../entity/outbound/sale/saleOrder";
|
import { SaleOuterList } from "../../entity/outbound/sale/saleOuterList";
|
|
//#endregion
|
|
/**
|
* 运单轨迹帮助类
|
*/
|
export default class StoHelperService extends BaseApiService {
|
//#region 申通推送运单 pushOrderbySTO
|
public async pushOrderbySTO(orderId): Promise<ResultInfo> {
|
let { ctx } = this;
|
let info: ResultInfo = {
|
result: false,
|
msg: undefined
|
};
|
try {
|
let orderInfo = await this.dbRead.findOne(ExpressSTOOrder, {
|
stoOrder_Id: orderId
|
});
|
if (orderInfo.interfaceStatusText === "推送成功") {
|
info.msg = orderInfo.orderCode + "已经推送成功不能重复推送。";
|
info.result = false;
|
return info;
|
}
|
|
let baseInfo = await this.dbRead.findOne(ExpressSTOBaseInfo, {
|
userProduct_Id: orderInfo.userProduct_Id,
|
baseInfo_Id: orderInfo.interfaceAccount_Id
|
});
|
if (baseInfo === null) {
|
info.msg = orderInfo.orderCode + "无接口信息不能推送。";
|
info.result = false;
|
return info;
|
}
|
var sto_WebService = baseInfo.apiUrl;
|
var api_name = baseInfo.getCodeApiName;
|
var from_appkey = baseInfo.from_appkey;
|
var from_code = baseInfo.from_code;
|
var to_code = baseInfo.to_code;
|
var to_appkey = baseInfo.to_appkey;
|
var secretKey = baseInfo.secretKey;
|
var siteCode = baseInfo.cusite;
|
var customerName = baseInfo.cusname;
|
var sitePwd = baseInfo.cuspwd;
|
var expressCorpCode = baseInfo.expressCorpCode;
|
var sendername = baseInfo.sendername;
|
var senderpostCode = baseInfo.senderpostCode;
|
var senderphone = baseInfo.senderphone;
|
var sendermobile = baseInfo.sendermobile;
|
var senderprov = baseInfo.senderprov;
|
var sendercity = baseInfo.sendercity;
|
var sendercounty = baseInfo.sendercounty;
|
var senderaddress = baseInfo.senderaddress;
|
// var sendercompany = baseInfo.sendercompany;
|
var content = {
|
orderNo: orderInfo.orderCode,
|
orderSource: expressCorpCode,
|
billType: "00",
|
orderType: "01",
|
sender: {
|
name: orderInfo.sendperson ? orderInfo.sendperson : sendername,
|
tel: orderInfo.sendtel ? orderInfo.sendtel : senderphone,
|
mobile: orderInfo.sendtel ? orderInfo.sendtel : sendermobile,
|
postCode: senderpostCode,
|
country: "中国",
|
province: orderInfo.sendprovince ? orderInfo.sendprovince : senderprov,
|
city: orderInfo.sendcity ? orderInfo.sendcity : sendercity,
|
area: orderInfo.sendarea ? orderInfo.sendarea : sendercounty,
|
town: orderInfo.sendaddress ? orderInfo.sendaddress : senderaddress,
|
address: orderInfo.sendaddress ? orderInfo.sendaddress : senderaddress
|
},
|
receiver: {
|
name: orderInfo.receiveperson,
|
tel: orderInfo.receivetel,
|
mobile: orderInfo.receivetel,
|
postCode: "",
|
country: "中国",
|
province: orderInfo.receiveprovince,
|
city: orderInfo.receivecity,
|
area: orderInfo.receivearea,
|
town: orderInfo.receiveaddress,
|
address: orderInfo.receiveaddress
|
},
|
cargo: {
|
battery: "10",
|
goodsType: "大件",
|
goodsName: orderInfo.goodsname
|
},
|
customer: {
|
siteCode: siteCode,
|
customerName: customerName,
|
sitePwd: sitePwd
|
},
|
codValue: "2000",
|
freightCollectValue: "20",
|
timelessType: "01",
|
productType: "01"
|
};
|
var md5 = crypto.createHash("md5");
|
var data_digest = md5.update(JSON.stringify(content) + secretKey, "utf8").digest("base64");
|
let result = await this.ctx.curl(sto_WebService, {
|
method: "POST",
|
contentType: "application/x-www-form-urlencoded;charset=utf-8",
|
data: {
|
api_name: api_name,
|
content: JSON.stringify(content),
|
from_appkey: from_appkey,
|
from_code: from_code,
|
to_appkey: to_appkey,
|
to_code: to_code,
|
data_digest: data_digest
|
}
|
});
|
// result.data="";
|
let data = Buffer.from(result.data).toString();
|
ctx.logger.info("申通请求获取单号返回json信息-=======" + data);
|
var dynData = JSON.parse(data);
|
if (dynData.success && dynData.success === "false") {
|
info.msg = orderInfo.orderCode + dynData.errorMsg;
|
info.result = false;
|
} else if (dynData.success === "true") {
|
// 更新接口单
|
await this.dbWrite
|
.createQueryBuilder(ExpressSTOOrder, "t")
|
.update()
|
.set({
|
billno: dynData.data.waybillNo,
|
orderno: dynData.data.waybillNo,
|
interfaceStatusID: 3,
|
interfaceStatusText: "推送成功",
|
bigchar: dynData.data.bigWord
|
})
|
.where(`stoOrder_Id=:stoOrder_Id`, {
|
stoOrder_Id: orderInfo.stoOrder_Id
|
})
|
.execute();
|
// 更新销售单
|
await this.dbWrite
|
.createQueryBuilder(SaleOrder, "t")
|
.update()
|
.set({
|
expressCode: dynData.data.waybillNo,
|
bigPen: dynData.data.bigWord,
|
sortingCode: dynData.data.packagePlace
|
})
|
.where(`order_Id=:order_Id and expressCorpType=:expressCorpType`, {
|
order_Id: orderInfo.order_Id,
|
expressCorpType: 6
|
})
|
.execute();
|
|
// 更新出库单单中快递单号
|
await this.dbWrite.update(
|
SaleOuterList,
|
{
|
order_Id: orderInfo.order_Id,
|
caseNumber: orderInfo.storeOrderCode
|
},
|
{
|
extendField10: dynData.data.waybillNo
|
}
|
);
|
let where = "order_Id=:order_Id";
|
var saleOrderInfo = await this.dbRead
|
.createQueryBuilder(SaleOrder, "t")
|
.where(where, {
|
order_Id: orderInfo.order_Id
|
})
|
.getOne();
|
// 记录销售单轨迹
|
if (saleOrderInfo) {
|
await ctx.service.outbound.orderHelper.setStatusHistory(
|
saleOrderInfo.order_Id,
|
saleOrderInfo.statusID,
|
saleOrderInfo.statusID,
|
"获取申通快递单号",
|
"快递单号:" + dynData.waybillNo
|
);
|
}
|
|
info.msg = orderInfo.orderCode + "获取快递单号" + dynData.data.waybillNo + "成功!";
|
info.result = true;
|
}
|
} catch (error) {
|
info.msg = error.message;
|
info.result = false;
|
}
|
return info;
|
}
|
// #endregion
|
|
//#region 申通获取路由 getRouteBySTO
|
public async getRouteBySTO(orderId): Promise<ResultInfo> {
|
let { ctx } = this;
|
let info: ResultInfo = {
|
result: false,
|
msg: undefined
|
};
|
try {
|
let orderInfo = await this.dbRead.findOne(ExpressSTOOrder, {
|
stoOrder_Id: orderId
|
});
|
// let baseInfo = await this.dbRead.findOne(ExpressSTOBaseInfo, {
|
// userProduct_Id: orderInfo.userProduct_Id,
|
// apiType: '物流轨迹查询'
|
// });
|
let baseInfo = await this.dbRead.findOne(ExpressSTOBaseInfo, {
|
userProduct_Id: orderInfo.userProduct_Id,
|
baseInfo_Id: orderInfo.interfaceAccount_Id
|
});
|
if (baseInfo === null) {
|
info.msg = orderInfo.orderCode + "无接口信息不能推送。";
|
info.result = false;
|
return info;
|
}
|
var sto_WebService = baseInfo.apiUrl;
|
var api_name = baseInfo.getRouteApiName;
|
var from_appkey = baseInfo.from_appkey;
|
var from_code = baseInfo.from_code;
|
var to_code = baseInfo.route_to_code;
|
var to_appkey = baseInfo.route_to_appkey;
|
var secretKey = baseInfo.secretKey;
|
var noList = [];
|
noList.push(orderInfo.billno);
|
// noList = ["773031309794393"]
|
var content = {
|
order: "asc",
|
waybillNoList: noList
|
};
|
var md5 = crypto.createHash("md5");
|
var data_digest = md5.update(JSON.stringify(content) + secretKey, "utf8").digest("base64");
|
let result = await this.ctx.curl(sto_WebService, {
|
method: "POST",
|
contentType: "application/x-www-form-urlencoded;charset=utf-8",
|
data: {
|
api_name: api_name,
|
content: JSON.stringify(content),
|
from_appkey: from_appkey,
|
from_code: from_code,
|
to_appkey: to_appkey,
|
to_code: to_code,
|
data_digest: data_digest
|
}
|
});
|
|
let data = Buffer.from(result.data).toString();
|
ctx.logger.info("申通获取轨迹json返回信息-=======" + data);
|
var dynData = JSON.parse(data);
|
if (dynData.success && dynData.success === "false") {
|
info.msg = orderInfo.orderCode + dynData.errorMsg;
|
info.result = false;
|
} else if (dynData.success === "true" && dynData.data && dynData.data[orderInfo.billno]) {
|
var routeList = await this.dbRead.find(ExpressSTOOrderRoute, {
|
where: {
|
mailno: orderInfo.billno
|
}
|
});
|
var lastMsg = "";
|
for (let item of dynData.data[orderInfo.billno]) {
|
let acceptAddress = item.memo;
|
if (acceptAddress == "快件电子信息已经收到" || acceptAddress == "XIAMEN快件到达作业中心") {
|
continue;
|
}
|
let routeInfo = routeList.find(_item => _item.acceptAddress.indexOf(acceptAddress) >= 0);
|
if (!routeInfo) routeInfo = new ExpressSTOOrderRoute();
|
routeInfo.acceptAddress = acceptAddress;
|
routeInfo.acceptTime = item.opTime;
|
routeInfo.createDate = new Date();
|
routeInfo.createID = 1;
|
routeInfo.creator = "api";
|
routeInfo.stoOrder_Id = orderInfo.stoOrder_Id;
|
routeInfo.orderCode = orderInfo.orderCode;
|
routeInfo.order_Id = orderInfo.order_Id;
|
routeInfo.stoOrder_Id = orderInfo.stoOrder_Id;
|
routeInfo.mailno = orderInfo.billno;
|
routeInfo.userProduct_Id = orderInfo.userProduct_Id;
|
routeInfo.platUser_Id = orderInfo.platUser_Id;
|
|
if (!(routeInfo.orderRout_Id > 0)) {
|
await this.dbWrite.insert(ExpressSTOOrderRoute, routeInfo);
|
}
|
if (lastMsg.indexOf("已签收") < 0) {
|
lastMsg = acceptAddress;
|
}
|
}
|
} else {
|
info.msg = orderInfo.orderCode + "暂无轨迹。";
|
info.result = false;
|
}
|
} catch (error) {
|
info.msg = error.message;
|
info.result = false;
|
}
|
return info;
|
}
|
// #endregion
|
}
|