//#region import
|
import BaseApiService from "../baseApiService";
|
import { ResultInfo } from "../../public/commonInterface";
|
import { ExpressQZPortOrderList } from "../../entity/express/ldg/expressQZPortOrderList";
|
import { ExpressQZPortOrder } from "../../entity/express/ldg/expressQZPortOrder";
|
import moment = require("moment");
|
import * as crypto from "crypto";
|
import xml2js = require("xml2js");
|
import { TMSWayBill } from "../../entity/express/tms/tmsWayBill";
|
import { ExpressQZPortOrderRoute } from "../../entity/express/ldg/expressQZPortOrderRoute";
|
|
// import moment = require("moment");
|
|
//#endregion
|
|
/**
|
* 陆地港接口帮助类
|
*/
|
export default class ldgHelper extends BaseApiService {
|
//#region 通过陆地港获取快递单号
|
public async pushOrderByLgd(orderId): Promise<ResultInfo> {
|
// let { ctx } = this;
|
let info: ResultInfo = {
|
result: false,
|
msg: undefined
|
};
|
try {
|
let app_key = "AODE001";
|
let app_secret = "063e00365a413edfd528d9b9c238c5bd";
|
let url = "http://112.51.251.8:8706/qh-ocenter-api-web/api/expressorder/expressno";
|
let timestamp = moment(new Date()).format("YYYY-MM-DD HH:mm:ss");
|
|
let orderInfo = await this.dbRead.findOne(ExpressQZPortOrder, {
|
qZPortOrder_Id: orderId
|
});
|
var expressSupplier = "";
|
var theExpressCorpType = 0;
|
var PushNum = 0;
|
if (orderInfo.pushNum) {
|
PushNum = orderInfo.pushNum;
|
}
|
if (PushNum >= 5) {
|
info.msg = orderInfo.orderCode + "推送超过五次,单据已失效";
|
info.result = false;
|
}
|
PushNum = PushNum + 1;
|
await this.dbWrite
|
.createQueryBuilder(ExpressQZPortOrder, "t")
|
.update()
|
.set({
|
pushNum: PushNum
|
})
|
.where(`qZPortOrder_Id=:qZPortOrder_Id`, {
|
qZPortOrder_Id: orderInfo.qZPortOrder_Id
|
})
|
.execute();
|
if (orderInfo.expressCorpName === "陆地港顺丰") {
|
expressSupplier = "SF";
|
theExpressCorpType = 22;
|
} else if (orderInfo.expressCorpName === "陆地港圆通") {
|
expressSupplier = "SDGJ";
|
theExpressCorpType = 21;
|
}
|
let expressList = await this.dbRead
|
.createQueryBuilder(ExpressQZPortOrderList, "t")
|
.where(`qZPortOrder_Id=:qZPortOrder_Id`, {
|
qZPortOrder_Id: orderId
|
})
|
.getMany();
|
var orderItems = [];
|
var itemMsg = "";
|
for (let item of expressList) {
|
// item.name = item.name.replace("+", "");
|
// var reg = new RegExp("+", "g");
|
item.name = item.name.replace(/\+/g, "");
|
item.name = item.name.replace(/\%/g, "");
|
|
var orderItemsInfo = {
|
goodName: item.name ? item.name : "",
|
piece: item.count ? item.count : 0,
|
price: item.amount ? item.amount : 0,
|
proMarCountry: "CN"
|
};
|
orderItems.push(orderItemsInfo);
|
if (!item.name) {
|
itemMsg = "物料明细名称不能为空";
|
}
|
}
|
if (itemMsg) {
|
info.msg = itemMsg;
|
info.result = false;
|
return info;
|
}
|
if (!orderInfo.d_contact) {
|
info.msg = "到件方联系人不能为空";
|
info.result = false;
|
return info;
|
}
|
if (!orderInfo.d_address) {
|
info.msg = "到件方详细地址不能为空";
|
info.result = false;
|
return info;
|
}
|
orderInfo.d_address = orderInfo.d_address.replace(/\+/g, "").replace(/\%/g, "").replace(/\s+/g, "");
|
if (!orderInfo.d_city) {
|
info.msg = "到件方城市不能为空";
|
info.result = false;
|
return info;
|
}
|
if (!orderInfo.d_county) {
|
info.msg = "到件方区县不能为空";
|
info.result = false;
|
return info;
|
}
|
if (!orderInfo.d_province) {
|
info.msg = "到件方省份不能为空";
|
info.result = false;
|
return info;
|
}
|
if (!orderInfo.d_mobile) {
|
info.msg = "到件方电话不能为空";
|
info.result = false;
|
return info;
|
}
|
if (!orderInfo.j_contact) {
|
info.msg = "寄件方联系人不能为空";
|
info.result = false;
|
return info;
|
}
|
if (!orderInfo.j_address) {
|
info.msg = "寄件方详细地址不能为空";
|
info.result = false;
|
return info;
|
}
|
if (!orderInfo.j_mobile) {
|
info.msg = "寄件方手机不能为空";
|
info.result = false;
|
return info;
|
}
|
var ldgparams = {
|
consignee: orderInfo.d_contact ? orderInfo.d_contact : "",
|
consigneeAddress: orderInfo.d_address ? orderInfo.d_address : "",
|
consigneeCity: orderInfo.d_city ? orderInfo.d_city : "",
|
consigneeCountry: "CN",
|
consigneeCounty: orderInfo.d_county ? orderInfo.d_county : "",
|
consigneeProvince: orderInfo.d_province ? orderInfo.d_province : "",
|
consigneeTel: orderInfo.d_mobile ? orderInfo.d_mobile : "",
|
cusOrderNo: orderInfo.orderCode ? orderInfo.orderCode : "",
|
expressServerType: "GNQG",
|
expressSupplier: expressSupplier,
|
orderItems: orderItems,
|
sender: orderInfo.j_contact ? orderInfo.j_contact : "",
|
senderAddress: orderInfo.j_address ? orderInfo.j_address : "",
|
senderCountry: "CN",
|
senderTel: orderInfo.j_mobile ? orderInfo.j_mobile : ""
|
};
|
|
var md5 = crypto.createHash("md5");
|
const sign = md5
|
.update(app_secret + JSON.stringify(ldgparams) + app_secret, "utf8")
|
.digest("hex")
|
.toUpperCase();
|
console.log("陆地港获取单号传入信息:" + JSON.stringify(ldgparams));
|
const resData = await this.ctx.curl(url, {
|
headers: {
|
app_key: app_key,
|
sign: sign,
|
timestamp: timestamp
|
},
|
// 必须指定 method
|
method: "POST",
|
// 通过 contentType 告诉 HttpClient 以 JSON 格式发送
|
contentType: "json",
|
data: ldgparams,
|
// 明确告诉 HttpClient 以 JSON 格式处理返回的响应 body
|
dataType: "json",
|
timeout: 20000
|
});
|
var dynData = resData.data;
|
console.log("陆地港获取单号传出信息:" + JSON.stringify(dynData));
|
if (dynData.code == 0 || dynData.msg.indexOf("已存在") > 0) {
|
await this.dbWrite
|
.createQueryBuilder(ExpressQZPortOrder, "t")
|
.update()
|
.set({
|
mailno: dynData.data.expressNo,
|
interfaceStatusID: 3,
|
interfaceStatusText: "推送成功",
|
bigPen: dynData.data.distributeCode
|
})
|
.where(`qZPortOrder_Id=:qZPortOrder_Id`, {
|
qZPortOrder_Id: orderInfo.qZPortOrder_Id
|
})
|
.execute();
|
await this.dbWrite
|
.createQueryBuilder(TMSWayBill, "t")
|
.update()
|
.set({
|
expressCode: dynData.data.expressNo,
|
bigPen: dynData.data.distributeCode
|
})
|
.where(`wayBill_Id=:wayBill_Id and expressCode is null and expressCorpType=:expressCorpType`, {
|
wayBill_Id: orderInfo.order_Id,
|
expressCorpType: theExpressCorpType
|
})
|
.execute();
|
let where = "wayBill_Id=:wayBill_Id";
|
var tmsWayBillInfo = await this.dbRead
|
.createQueryBuilder(TMSWayBill, "t")
|
.where(where, {
|
wayBill_Id: orderInfo.order_Id
|
})
|
.getOne();
|
if (tmsWayBillInfo) {
|
await this.ctx.service.tms.wayBillHelper.setStatusHistory(tmsWayBillInfo, "获取快递号", "陆地港获取单号" + dynData.data.expressNo);
|
}
|
info.msg = "获取成功";
|
info.result = true;
|
} else {
|
await this.dbWrite
|
.createQueryBuilder(ExpressQZPortOrder, "t")
|
.update()
|
.set({
|
remark: dynData.msg
|
})
|
.where(`qZPortOrder_Id=:qZPortOrder_Id`, {
|
qZPortOrder_Id: orderInfo.qZPortOrder_Id
|
})
|
.execute();
|
info.msg = dynData.msg;
|
info.result = false;
|
}
|
} catch (error) {
|
info.msg = error.message;
|
info.result = false;
|
}
|
return info;
|
}
|
|
//#endregion
|
|
//#region 通过陆地港获取路由
|
public async getRoute(expressNo) {
|
try {
|
let app_key = "AODE001";
|
let app_secret = "063e00365a413edfd528d9b9c238c5bd";
|
let url = "http://112.51.251.8:8706/qh-ocenter-api-web/api/expressorder/tracking";
|
let timestamp = moment(new Date()).format("YYYY-MM-DD HH:mm:ss");
|
|
var ldgparams = {
|
expressNo: expressNo
|
};
|
|
var lastMsg = "";
|
var md5 = crypto.createHash("md5");
|
const sign = md5
|
.update(app_secret + JSON.stringify(ldgparams) + app_secret, "utf8")
|
.digest("hex")
|
.toUpperCase();
|
console.log("陆地港获取单号传入信息:" + JSON.stringify(ldgparams));
|
const params: any = {
|
headers: {
|
app_key: app_key,
|
sign: sign,
|
timestamp: timestamp
|
},
|
// 必须指定 method
|
method: "POST",
|
// 通过 contentType 告诉 HttpClient 以 JSON 格式发送
|
contentType: "json",
|
data: ldgparams,
|
// 明确告诉 HttpClient 以 JSON 格式处理返回的响应 body
|
dataType: "json",
|
timeout: 20000
|
};
|
const resData = await this.ctx.curl(url, params);
|
var dynData = resData.data;
|
// console.log(expressNo + "陆地港获取轨迹:", dynData);
|
if (dynData.code == 0) {
|
var routeList = await this.dbRead.find(ExpressQZPortOrderRoute, {
|
where: {
|
mailno: expressNo
|
}
|
});
|
for (let item of dynData.data.expressTrackingResultInfos) {
|
let acceptAddress = item.acceptAddress + item.remark;
|
if (acceptAddress == "快件电子信息已经收到" || acceptAddress == "XIAMEN快件到达作业中心") {
|
continue;
|
}
|
let routeInfo = routeList.find(_item => _item.acceptAddress.indexOf(item.remark) >= 0);
|
if (!routeInfo) routeInfo = new ExpressQZPortOrderRoute();
|
|
routeInfo.acceptAddress = acceptAddress;
|
routeInfo.acceptTime = item.acceptTime;
|
routeInfo.createDate = new Date();
|
routeInfo.createID = 1;
|
routeInfo.creator = "api";
|
routeInfo.qZPortOrder_Id = 0;
|
routeInfo.mailno = expressNo;
|
routeInfo.userProduct_Id = 1007;
|
routeInfo.platUser_Id = 1;
|
routeInfo.userProduct_Id = 1007;
|
|
if (!(routeInfo.orderRout_Id > 0)) {
|
await this.dbWrite.insert(ExpressQZPortOrderRoute, routeInfo);
|
}
|
if (lastMsg.indexOf("已签收") < 0) {
|
lastMsg = acceptAddress;
|
}
|
}
|
} else {
|
lastMsg = dynData.msg;
|
}
|
return lastMsg;
|
} catch (error) {
|
return error.message;
|
}
|
}
|
|
//#endregion
|
|
//#region 陆地港通过圆通官方来获取路由 getRouteByYT
|
public async getRouteByYT(expressNo): Promise<ResultInfo> {
|
let { ctx } = this;
|
let info: ResultInfo = {
|
result: false,
|
msg: undefined
|
};
|
try {
|
// let orderInfo = await this.dbRead.findOne(ExpressYTOrder, {
|
// yTOrder_Id: orderId
|
// });
|
var yT_WebService = "http://MarketingInterface.yto.net.cn"; //请求地址
|
var user_id = "AUOD2144"; //用户在开放平台注册时填写的客户标识
|
var app_key = "cKbkXv"; //分配给用户的app_key
|
var method = "yto.Marketing.WaybillTrace"; //分配给用户的方法名
|
var timestamp = moment(new Date()).format("YYYY-MM-DD HH:mm:ss"); //时间戳,格式为yyyy-MM-dd HH:mm:ss,例如2012-06-20 11:00:00
|
var v = "1.01"; //API协议的版本号
|
var format = "XML";
|
var secret_Key = "ntdyg2"; //由开放平台分配给用户的Secret_Key,生成签名时使用
|
var num = "1.0";
|
var formatInfo =
|
'<?xml version="' +
|
num +
|
'"?>' +
|
"<ufinterface>" +
|
"<Result>" +
|
"<WaybillCode>" +
|
"<Number>" +
|
expressNo +
|
"</Number>" +
|
"</WaybillCode>" +
|
"</Result>" +
|
"</ufinterface>";
|
var xml =
|
secret_Key + "app_key" + app_key + "format" + format + "method" + method + "timestamp" + timestamp + "user_id" + user_id + "v" + v + "";
|
var md5 = crypto.createHash("md5");
|
var sign = md5.update(xml).digest("hex").toUpperCase();
|
let result = await this.ctx.curl(yT_WebService, {
|
method: "POST",
|
contentType: "application/x-www-form-urlencoded;charset=utf-8",
|
data: {
|
sign: sign,
|
app_key: app_key,
|
format: format,
|
method: method,
|
timestamp: timestamp,
|
user_id: user_id,
|
v: v,
|
param: formatInfo
|
}
|
});
|
let data = Buffer.from(result.data).toString();
|
ctx.logger.info("圆通获取单号xml返回信息-=======" + data);
|
// data = "<?xml version='1.0'?><ufinterface> <Result> <WaybillProcessInfo> <Waybill_No>500121003301</Waybill_No> <Upload_Time>2015/5/5 19:34:55</Upload_Time> <ProcessInfo>北京市海淀区中关村公司 已揽收</ProcessInfo> </WaybillProcessInfo> <WaybillProcessInfo> <Waybill_No>500121003301</Waybill_No> <Upload_Time>2015/5/5 20:13:20</Upload_Time> <ProcessInfo>北京市海淀区中关村公司 已打包,发往下一站 济南转运中心</ProcessInfo> </WaybillProcessInfo> <WaybillProcessInfo> <Waybill_No>500121003301</Waybill_No> <Upload_Time>2015/5/6 10:21:10</Upload_Time> <ProcessInfo>济南转运中心公司 已发出,下一站 山东省济南市千佛山</ProcessInfo> </WaybillProcessInfo> <WaybillProcessInfo> <Waybill_No>500121003301</Waybill_No> <Upload_Time>2015/5/6 13:36:31</Upload_Time> <ProcessInfo>快件到达 山东省济南市千佛山公司</ProcessInfo> </WaybillProcessInfo> <WaybillProcessInfo> <Waybill_No>500121003301</Waybill_No> <Upload_Time>2015/5/6 13:41:55</Upload_Time> <ProcessInfo>山东省济南市千佛山公司 派件人: ***** 派件中 派件员电话1234567891</ProcessInfo> </WaybillProcessInfo> </Result> </ufinterface>";
|
var xmlParser = new xml2js.Parser();
|
var errorStr = "";
|
var success = true;
|
var nodeList = [];
|
await xmlParser.parseString(data, function (err, result) {
|
ctx.logger.info("圆通查询路由error-=======" + err);
|
ctx.logger.info("圆通查询路由josnResult-=======" + JSON.stringify(result));
|
var successStr = "";
|
if (result.Response) {
|
successStr = result.Response.success[0];
|
}
|
if (successStr == "false") {
|
success = false;
|
errorStr = result.Response.reason[0];
|
} else {
|
success = true;
|
nodeList = result.ufinterface.Result[0].WaybillProcessInfo;
|
}
|
});
|
var lastMsg = "";
|
if (success) {
|
// var ytOrderRouteInfo = await this.dbRead.findOne(ExpressYTOrderRoute, {
|
// where: { mailno: orderInfo.trackingNumber },
|
// order: { orderRoute_Id: "DESC" }
|
// });
|
// for (var item of nodeList) {
|
// var accept_time = item.Upload_Time[0];
|
// var remark = item.ProcessInfo[0];
|
// var mailno = item.Waybill_No[0];
|
// var accept_timeDate = moment(accept_time);
|
// if (lastMsg.indexOf("已签收") < 0) {
|
// lastMsg = remark;
|
// }
|
// if (ytOrderRouteInfo && accept_timeDate <= moment(ytOrderRouteInfo.accept_time)) {
|
// continue;
|
// }
|
// let routeInfo = new ExpressYTOrderRoute();
|
// routeInfo.mailNo = mailno;
|
// routeInfo.accept_time = moment(accept_time).toDate();
|
// routeInfo.accept_address = remark;
|
// routeInfo.yTOrder_Id = orderInfo.yTOrder_Id;
|
// routeInfo.order_Id = orderInfo.order_Id;
|
// await this.dbWrite.insert(ExpressYTOrderRoute, routeInfo);
|
// }
|
var routeList = await this.dbRead.find(ExpressQZPortOrderRoute, {
|
where: {
|
mailno: expressNo
|
}
|
});
|
for (let item of nodeList) {
|
let acceptAddress = item.ProcessInfo[0];
|
if (acceptAddress == "快件电子信息已经收到" || acceptAddress == "XIAMEN快件到达作业中心") {
|
continue;
|
}
|
let routeInfo = routeList.find(_item => _item.acceptAddress.indexOf(acceptAddress) >= 0);
|
if (!routeInfo) routeInfo = new ExpressQZPortOrderRoute();
|
|
routeInfo.acceptAddress = acceptAddress;
|
routeInfo.acceptTime = item.Upload_Time[0];
|
routeInfo.createDate = new Date();
|
routeInfo.createID = 1;
|
routeInfo.creator = "api";
|
routeInfo.qZPortOrder_Id = 0;
|
routeInfo.mailno = expressNo;
|
routeInfo.userProduct_Id = 1007;
|
routeInfo.platUser_Id = 1;
|
routeInfo.userProduct_Id = 1007;
|
|
if (!(routeInfo.orderRout_Id > 0)) {
|
await this.dbWrite.insert(ExpressQZPortOrderRoute, routeInfo);
|
}
|
if (lastMsg.indexOf("已签收") < 0) {
|
lastMsg = acceptAddress;
|
}
|
}
|
info.msg = lastMsg;
|
info.result = true;
|
} else {
|
info.result = false;
|
var orderMsg = "错误信息:" + errorStr;
|
info.msg = "获取结果:" + orderMsg;
|
}
|
} catch (error) {
|
info.msg = error.message;
|
info.result = false;
|
}
|
return info;
|
}
|
// #endregion
|
}
|