import { TMSWayBill } from "../../entity/express/tms/tmsWayBill";
|
import { TMSWayBillTracking } from "../../entity/express/tms/tmsWayBillTracking";
|
import BaseService from "../baseService";
|
import { TMSWayBillReceive } from "../../entity/express/tms/tmsWayBillReceive";
|
import moment = require("moment");
|
import { SaleOrder } from "../../entity/outbound/sale/saleOrder";
|
import { getConnection } from "typeorm";
|
|
/**
|
* 运单轨迹帮助类
|
*/
|
export default class WayBillHelperService extends BaseService {
|
//#region setStatusHistory
|
/**
|
* 操作新增运单追踪记录
|
* @param wayInfo 运单信息
|
* @param action 动作
|
* @param toStatus 操作后状态
|
* @param clientDesc 客户端描述
|
* @param remark 备注
|
*/
|
public async setStatusHistory(wayInfo: TMSWayBill, action: string, toStatus: string, clientDesc?: string, remark?: string) {
|
let hisEntity = new TMSWayBillTracking();
|
hisEntity.wayBill_Id = wayInfo.wayBill_Id;
|
hisEntity.wayBillCode = wayInfo.wayBillCode;
|
hisEntity.action = action;
|
hisEntity.plateCode = wayInfo.plateCode;
|
hisEntity.fromStatus = wayInfo.orderStatus;
|
hisEntity.toStatus = toStatus;
|
hisEntity.clientDesc = clientDesc;
|
hisEntity.userProduct_Id = 1007;
|
var userInfo = await this.ctx.helper.userInfo();
|
hisEntity.creator = !userInfo ? "分拣机" : userInfo.userTrueName;
|
hisEntity.createDate = new Date();
|
|
hisEntity.remark = remark;
|
try {
|
await this.dbWrite.insert(TMSWayBillTracking, hisEntity);
|
if (!hisEntity.userProduct_Id) {
|
hisEntity.userProduct_Id = 1007;
|
hisEntity.userProductCode = "100000001";
|
hisEntity.userProductAlias = "WmsSaaS云仓系统";
|
hisEntity.platUser_Id = 1;
|
hisEntity.platCorpName = "澳德";
|
hisEntity.platUserCode = "PT20180001";
|
await this.dbWrite.update(TMSWayBillTracking, hisEntity.wayBillTracking_Id, hisEntity);
|
}
|
} catch (error) {
|
console.log("运单轨迹生成失败:" + error.message);
|
}
|
}
|
|
//#endregion
|
|
//#region getWayBillInfo
|
public async getWayBillInfo(wayBillCode: string, addQingGuan?: boolean) {
|
let { ctx } = this;
|
try {
|
let waybill = await this.dbRead.findOne(TMSWayBill, { wayBillCode: wayBillCode });
|
if (!waybill) {
|
waybill = await this.dbRead.findOne(TMSWayBill, { expressCode: wayBillCode });
|
}
|
if (!waybill) {
|
waybill = await this.dbRead.findOne(TMSWayBill, { customerOrderNo: wayBillCode });
|
}
|
// if (!waybill) {
|
// this.info.result = false;
|
// this.info.msg = "运单号不存在";
|
// return this.info;
|
// }
|
|
let wayBillReceive = await this.dbRead.findOne(TMSWayBillReceive, {
|
where: { wayBillCode: wayBillCode }
|
});
|
if (waybill || wayBillReceive) {
|
let remark: string | undefined;
|
//#region 及时获新对应快递单号路由
|
if (waybill && waybill.expressCode && waybill.orderStatus === "清关中") {
|
try {
|
wayBillCode = waybill.wayBillCode;
|
var result = await this.service.tms.routerHelper.getRouter(waybill, true, addQingGuan);
|
// await this.ctx.helper.sleep(1500); //暂停1.5秒,用于数据同步
|
remark = result.msg;
|
if (this.service.tms.routerHelper.isQianShou(result.msg)) {
|
this.dbWrite.update(TMSWayBill, waybill.wayBill_Id, { orderStatus: "已签收" });
|
waybill.orderStatus = "已签收";
|
ctx.service.tms.wayBillHelper.setStatusHistory(waybill, "快递轨迹", "已签收");
|
}
|
} catch (error) {
|
remark = error.message;
|
}
|
}
|
if (waybill && waybill.orderStatus === "已签收") {
|
let sql = `UPDATE dbo.TMS_RouterTask SET OrderStatus='已签收'
|
WHERE WayBillCode ='${wayBillCode}'`;
|
await this.dbWrite.query(sql);
|
}
|
//#endregion
|
|
//#region 获得路由组合
|
var expressCode = waybill != null ? waybill.expressCode : wayBillCode;
|
var expressCorpName = waybill != null ? waybill.expressCorpName : "";
|
let sql = `
|
SELECT clientDesc, MAX(t.createDate) AS createDate, statusType
|
FROM
|
(
|
SELECT (
|
CASE
|
WHEN R.clientDesc='清关中' OR CHARINDEX('身份证', R.clientDesc)>0
|
THEN R.clientDesc + '-' + convert(nvarchar(16), R.createDate, 121)
|
ELSE R.clientDesc
|
END
|
) as clientDesc, R.createDate, '内部' AS statusType
|
FROM dbo.TMS_WayBillTracking R with(nolock)
|
WHERE R.wayBillCode='${wayBillCode}' And clientDesc IS NOT NULL
|
UNION ALL`;
|
if (expressCorpName == "EMS标准") {
|
sql += ` SELECT accept_address as AcceptAddress, accept_time AS AcceptTime, '快递' AS statusType
|
FROM dbo.ExpressEMS_OrderRoute R with(nolock)
|
WHERE R.mailno='${expressCode}'`;
|
} else if (expressCorpName === "顺丰快递" || expressCorpName === "泉州顺丰") {
|
sql += ` SELECT accept_address as AcceptAddress, accept_time AS AcceptTime, '快递' AS statusType
|
FROM dbo.ExpressSF_OrderRoute R with(nolock)
|
WHERE R.mailno='${expressCode}' `;
|
} else if (
|
expressCorpName === "福州EMS" ||
|
expressCorpName === "邮政小包" ||
|
expressCorpName === "广州EMS" ||
|
expressCorpName === "厦门EMS"
|
) {
|
sql += ` SELECT AcceptAddress as AcceptAddress, AcceptTime AS AcceptTime, '快递' AS statusType
|
FROM dbo.ExpressKD100_OrderRoute R with(nolock)
|
WHERE R.TrackNo='${expressCode}' `;
|
} else if (expressCorpName === "圆通") {
|
sql += ` SELECT accept_address as AcceptAddress, accept_time AS AcceptTime, '快递' AS statusType
|
FROM dbo.ExpressYT_OrderRoute R with(nolock)
|
WHERE R.mailNo='${expressCode}' `;
|
} else if (expressCorpName == "陆地港圆通" || expressCorpName == "陆地港顺丰") {
|
sql += ` SELECT acceptAddress as AcceptAddress, acceptTime AS AcceptTime, '快递' AS StatusType
|
FROM dbo.ExpressQZPort_OrderRoute R with(nolock)
|
WHERE R.mailNo='${waybill.expressCode}'`;
|
} else {
|
// sql += ` SELECT AcceptAddress, AcceptTime, '快递' AS statusType
|
// FROM dbo.vExpress_OrderRoute R with(nolock)
|
// WHERE R.ExpressCode='${expressCode}'`;
|
sql += ` SELECT AcceptAddress as AcceptAddress, AcceptTime AS AcceptTime, '快递' AS statusType
|
FROM dbo.ExpressKD100_OrderRoute R with(nolock)
|
WHERE R.TrackNo='${expressCode}' `;
|
}
|
|
sql += `) t
|
GROUP BY t.clientDesc, statusType
|
`;
|
let hisList = await this.dbRead.query(sql);
|
|
interface ItemType {
|
toStatus: string;
|
statusType: string;
|
createDate: Date;
|
}
|
let historylist: ItemType[] = [];
|
for (let row of hisList) {
|
let obj: ItemType = {
|
toStatus: "",
|
statusType: "",
|
createDate: new Date()
|
};
|
obj.toStatus = row.clientDesc;
|
obj.statusType = row.statusType;
|
obj.createDate = new Date(row.createDate);
|
|
if (obj.toStatus) {
|
historylist.push(obj);
|
if (
|
(obj.toStatus === "包裹已理货完毕,等待安排航司收货" || obj.toStatus === "出库扫描完毕,等待发往机场") &&
|
obj.createDate &&
|
!hisList.find(item => item.clientDesc === "已退货")
|
) {
|
// 组板后1or2小时显示
|
let moment = require("moment");
|
let end = moment(new Date());
|
let start = moment(new Date(obj.createDate));
|
let span = moment.duration(end - start, "ms");
|
let hours = span.get("hours");
|
if (hours >= 1) {
|
var obj1: ItemType = {
|
toStatus: "包裹已到达机场等待发运",
|
createDate: moment(obj.createDate).add(1, "hours"),
|
statusType: "内部"
|
};
|
historylist.push(obj1);
|
}
|
}
|
}
|
}
|
//#endregion
|
|
//#region 整理数据
|
if (waybill == null) {
|
waybill = new TMSWayBill();
|
if (wayBillReceive) {
|
Object.assign(waybill, wayBillReceive);
|
}
|
}
|
|
historylist = historylist.sort(function (item1, item2) {
|
return item1.createDate > item2.createDate ? -1 : 1;
|
});
|
var qingGuanList = historylist.filter(w => {
|
return w.toStatus.indexOf("清关中") >= 0;
|
});
|
for (let qingGuanInfo of qingGuanList) {
|
// 有快递轨迹不在显示清关中
|
var prev = historylist.find(w => {
|
return w.statusType === "快递" && w.createDate < qingGuanInfo.createDate;
|
});
|
if (prev) {
|
var curr = historylist.find(f => {
|
return f.toStatus === qingGuanInfo.toStatus;
|
});
|
if (curr) {
|
curr.statusType = "不显示";
|
}
|
}
|
}
|
historylist = historylist.filter(w => {
|
return w.statusType !== "不显示";
|
});
|
//#endregion
|
|
//#region 返回数据
|
this.info.result = true;
|
this.info.data = {
|
statusCode: 0,
|
state: null,
|
dynamic: null,
|
msg: null,
|
wbInfo: {
|
wayBillCode: waybill.wayBillCode,
|
portName: waybill.portName,
|
expressCorpName: waybill.expressCorpName,
|
voyageCode: waybill.voyageCode,
|
plateCode: waybill.plateCode,
|
weight: waybill.weight,
|
grandTotal: waybill.grandTotal,
|
storageName: waybill.storageName,
|
orderType: waybill.orderType,
|
orderStatus: waybill.orderStatus,
|
// consigneeName: waybill.consigneeName,
|
// consigneeMobile: waybill.consigneeMobile,
|
// consigneeIdcard: waybill.consigneeIdcard,
|
consigneePostCode: waybill.consigneePostCode,
|
provinceName: waybill.provinceName,
|
cityName: waybill.cityName,
|
regionName: waybill.regionName,
|
// consigneeAddress: waybill.consigneeAddress,
|
makeWay: waybill.makeWay,
|
expressCode: waybill.expressCode,
|
actualWeight: waybill.actualWeight,
|
grossWeight: waybill.grossWeight,
|
totalQuantityOrder: waybill.totalQuantityOrder
|
},
|
hisList: historylist.map(s => {
|
let createDate = moment(s.createDate);
|
return {
|
toStatus: s.toStatus,
|
createDate: createDate.format("YYYY-MM-DD HH:mm:ss")
|
};
|
}),
|
remark: remark
|
};
|
//#endregion
|
} else {
|
await this.getHis(wayBillCode);
|
}
|
} catch (ex) {
|
this.info.result = false;
|
this.info.msg = ex.message;
|
}
|
return this.info;
|
}
|
|
//#endregion
|
|
private async getHis(wayBillCode: string) {
|
let conn = getConnection("mssql-his");
|
let manager = conn.manager;
|
|
let waybill = await manager.findOne(TMSWayBill, {
|
where: [{ wayBillCode: wayBillCode }, { customerOrderNo: wayBillCode }, { expressCode: wayBillCode }]
|
});
|
if (!waybill) {
|
this.info.result = false;
|
this.info.msg = "运单不存在";
|
return;
|
}
|
|
let wayBillReceive = await manager.findOne(TMSWayBillReceive, {
|
where: { wayBillCode: wayBillCode }
|
});
|
|
//#region 获得路由组合
|
var expressCode = waybill != null ? waybill.expressCode : wayBillCode;
|
var expressCorpName = waybill != null ? waybill.expressCorpName : "";
|
let sql = `
|
SELECT clientDesc, MAX(t.createDate) AS createDate, statusType
|
FROM
|
(
|
SELECT (
|
CASE
|
WHEN R.clientDesc='清关中' OR CHARINDEX('身份证', R.clientDesc)>0
|
THEN R.clientDesc + '-' + convert(nvarchar(16), R.createDate, 121)
|
ELSE R.clientDesc
|
END
|
) as clientDesc, R.createDate, '内部' AS statusType
|
FROM dbo.TMS_WayBillTracking R with(nolock)
|
WHERE R.wayBillCode='${wayBillCode}' And clientDesc IS NOT NULL
|
UNION ALL`;
|
if (expressCorpName == "EMS标准") {
|
sql += ` SELECT accept_address as AcceptAddress, accept_time AS AcceptTime, '快递' AS statusType
|
FROM dbo.ExpressEMS_OrderRoute R with(nolock)
|
WHERE R.mailno='${expressCode}'`;
|
} else if (expressCorpName === "顺丰快递" || expressCorpName === "泉州顺丰") {
|
sql += ` SELECT accept_address as AcceptAddress, accept_time AS AcceptTime, '快递' AS statusType
|
FROM dbo.ExpressSF_OrderRoute R with(nolock)
|
WHERE R.mailno='${expressCode}' `;
|
} else if (expressCorpName === "福州EMS" || expressCorpName === "邮政小包") {
|
sql += ` SELECT AcceptAddress as AcceptAddress, AcceptTime AS AcceptTime, '快递' AS statusType
|
FROM dbo.ExpressKD100_OrderRoute R with(nolock)
|
WHERE R.TrackNo='${expressCode}' `;
|
} else if (expressCorpName === "圆通") {
|
sql += ` SELECT accept_address as AcceptAddress, accept_time AS AcceptTime, '快递' AS statusType
|
FROM dbo.ExpressYT_OrderRoute R with(nolock)
|
WHERE R.mailNo='${expressCode}' `;
|
} else {
|
// sql += ` SELECT AcceptAddress, AcceptTime, '快递' AS statusType
|
// FROM dbo.vExpress_OrderRoute R with(nolock)
|
// WHERE R.ExpressCode='${expressCode}'`;
|
sql += ` SELECT AcceptAddress as AcceptAddress, AcceptTime AS AcceptTime, '快递' AS statusType
|
FROM dbo.ExpressKD100_OrderRoute R with(nolock)
|
WHERE R.TrackNo='${expressCode}' `;
|
}
|
|
sql += `) t
|
GROUP BY t.clientDesc, statusType
|
`;
|
let hisList = await manager.query(sql);
|
|
interface ItemType {
|
toStatus: string;
|
statusType: string;
|
createDate: Date;
|
}
|
let historylist: ItemType[] = [];
|
for (let row of hisList) {
|
let obj: ItemType = {
|
toStatus: "",
|
statusType: "",
|
createDate: new Date()
|
};
|
obj.toStatus = row.clientDesc;
|
obj.statusType = row.statusType;
|
obj.createDate = new Date(row.createDate);
|
|
if (obj.toStatus) {
|
historylist.push(obj);
|
if (
|
(obj.toStatus === "包裹已理货完毕,等待安排航司收货" || obj.toStatus === "出库扫描完毕,等待发往机场") &&
|
obj.createDate &&
|
!hisList.find(item => item.clientDesc === "已退货")
|
) {
|
// 组板后1or2小时显示
|
let moment = require("moment");
|
let end = moment(new Date());
|
let start = moment(new Date(obj.createDate));
|
let span = moment.duration(end - start, "ms");
|
let hours = span.get("hours");
|
if (hours >= 1) {
|
var obj1: ItemType = {
|
toStatus: "包裹已到达机场等待发运",
|
createDate: moment(obj.createDate).add(1, "hours"),
|
statusType: "内部"
|
};
|
historylist.push(obj1);
|
}
|
}
|
}
|
}
|
//#endregion
|
|
//#region 整理数据
|
if (waybill == null) {
|
waybill = new TMSWayBill();
|
if (wayBillReceive) {
|
Object.assign(waybill, wayBillReceive);
|
}
|
}
|
|
historylist = historylist.sort(function (item1, item2) {
|
return item1.createDate > item2.createDate ? -1 : 1;
|
});
|
var qingGuanList = historylist.filter(w => {
|
return w.toStatus.indexOf("清关中") >= 0;
|
});
|
for (let qingGuanInfo of qingGuanList) {
|
// 有快递轨迹不在显示清关中
|
var prev = historylist.find(w => {
|
return w.statusType === "快递" && w.createDate < qingGuanInfo.createDate;
|
});
|
if (prev) {
|
var curr = historylist.find(f => {
|
return f.toStatus === qingGuanInfo.toStatus;
|
});
|
if (curr) {
|
curr.statusType = "不显示";
|
}
|
}
|
}
|
historylist = historylist.filter(w => {
|
return w.statusType !== "不显示";
|
});
|
//#endregion
|
|
//#region 返回数据
|
this.info.result = true;
|
this.info.data = {
|
statusCode: 0,
|
state: null,
|
dynamic: null,
|
msg: null,
|
wbInfo: {
|
wayBillCode: waybill.wayBillCode,
|
portName: waybill.portName,
|
expressCorpName: waybill.expressCorpName,
|
voyageCode: waybill.voyageCode,
|
plateCode: waybill.plateCode,
|
weight: waybill.weight,
|
grandTotal: waybill.grandTotal,
|
storageName: waybill.storageName,
|
orderType: waybill.orderType,
|
orderStatus: waybill.orderStatus,
|
// consigneeName: waybill.consigneeName,
|
// consigneeMobile: waybill.consigneeMobile,
|
// consigneeIdcard: waybill.consigneeIdcard,
|
consigneePostCode: waybill.consigneePostCode,
|
provinceName: waybill.provinceName,
|
cityName: waybill.cityName,
|
regionName: waybill.regionName,
|
// consigneeAddress: waybill.consigneeAddress,
|
makeWay: waybill.makeWay,
|
expressCode: waybill.expressCode,
|
actualWeight: waybill.actualWeight,
|
grossWeight: waybill.grossWeight,
|
totalQuantityOrder: waybill.totalQuantityOrder
|
},
|
hisList: historylist.map(s => {
|
let createDate = moment(s.createDate);
|
return {
|
toStatus: s.toStatus,
|
createDate: createDate.format("YYYY-MM-DD HH:mm:ss")
|
};
|
}),
|
remark: null
|
};
|
//#endregion
|
}
|
|
//#region 扫描成功出库成功后,生成揽收信息
|
public async createWayBillReceive(expressCode: string, weight: number) {
|
let { ctx } = this;
|
let userInfo = await this.ctx.helper.userInfo();
|
|
var orderInfo = await this.dbRead
|
.createQueryBuilder(SaleOrder, "t")
|
.where("expressCode=:orderCode OR orderCode=:orderCode", {
|
orderCode: expressCode
|
})
|
.getOne();
|
if (orderInfo.orderType === "仓配订单") {
|
let orderCode = orderInfo.orderCode;
|
if (orderCode) {
|
console.log(orderCode + "开始更新重量=" + weight);
|
//#region 将输入的重量更新到对应运单的包裹毛重中
|
var dataInfo = await this.dbRead.findOne(TMSWayBill, {
|
wayBillCode: orderCode
|
});
|
if (dataInfo != null) {
|
await this.dbWrite.update(TMSWayBill, dataInfo.wayBill_Id, {
|
grossWeight: weight
|
});
|
|
console.log(orderCode + "运单更新成功重量=" + weight);
|
}
|
console.log(orderCode + "结束更新重量=" + weight);
|
//#endregion
|
|
//根据运单号去揽收表查询是否存在,存在则不进行下面操作
|
var wayBillReceive = await this.dbRead.findOne(TMSWayBillReceive, {
|
wayBillCode: orderCode
|
});
|
if (wayBillReceive == null) {
|
//#region 揽收记录不存在此运单号的信息时操作
|
if (dataInfo != null) {
|
//修改运单揽收状态
|
await this.dbWrite.update(
|
TMSWayBill,
|
{
|
wayBillCode: orderCode
|
},
|
{
|
collectStatus: "已揽收"
|
}
|
);
|
}
|
|
//增加一条揽收记录
|
let receive = new TMSWayBillReceive();
|
receive.wayBillCode = dataInfo.wayBillCode;
|
receive.consignor_Id = dataInfo.consignor_Id;
|
receive.consignorName = dataInfo.consignorName;
|
receive.consignorCode = dataInfo.consignorCode;
|
receive.collectStatus = "已揽收";
|
receive.user_Id = userInfo.platUser_Id;
|
receive.userTrueName = userInfo.platUserName;
|
receive.createID = userInfo.platUser_Id;
|
receive.creator = userInfo.platUserName;
|
receive.createDate = new Date();
|
receive.storageName = dataInfo.storageName;
|
receive.storage_Id = dataInfo.storage_Id;
|
await this.setAccountInfo(receive);
|
|
await this.dbWrite.save(receive);
|
await ctx.service.tms.wayBillHelper.setStatusHistory(dataInfo, "打包完成", "打包完成", "包裹已配货,打包完毕");
|
//#endregion
|
} else {
|
//#region 揽收记录存在此运单号的信息时操作
|
if (dataInfo != null) {
|
//修改运单揽收状态
|
await this.dbWrite.update(
|
TMSWayBill,
|
{
|
wayBillCode: orderCode
|
},
|
{
|
collectStatus: "已揽收"
|
}
|
);
|
}
|
//揽收表存在信息则修改揽收表的信息
|
wayBillReceive.consignor_Id = dataInfo.consignor_Id;
|
wayBillReceive.consignorName = dataInfo.consignorName;
|
wayBillReceive.consignorCode = dataInfo.consignorCode;
|
wayBillReceive.collectStatus = "已揽收";
|
wayBillReceive.modifyID = userInfo.platUser_Id;
|
wayBillReceive.modifier = userInfo.platUserName;
|
wayBillReceive.modifyDate = new Date();
|
wayBillReceive.user_Id = wayBillReceive.modifyID;
|
wayBillReceive.userTrueName = wayBillReceive.modifier;
|
wayBillReceive.storageName = dataInfo.storageName;
|
wayBillReceive.storage_Id = dataInfo.storage_Id;
|
await this.dbWrite.save(wayBillReceive);
|
await ctx.service.tms.wayBillHelper.setStatusHistory(dataInfo, "打包完成", "打包完成", "包裹打包完毕,仓库已揽收");
|
//#endregion
|
}
|
}
|
}
|
}
|
//#endregion
|
}
|