211 lines
7.9 KiB
JavaScript
211 lines
7.9 KiB
JavaScript
|
|
/**
|
||
|
|
* @author huxuejian
|
||
|
|
* @date 2025-12-19
|
||
|
|
* @description 邮政快递相关业务代码
|
||
|
|
*/
|
||
|
|
const dayjs = require('dayjs');
|
||
|
|
const apiCode = require('./apiCode');
|
||
|
|
const request = require('../../request');
|
||
|
|
const sm4Tool = require('./sm4Tool');
|
||
|
|
// const exam = require('./exam')
|
||
|
|
|
||
|
|
const emsApiUrl = process.env.CONFIG_EMS_API_URL;
|
||
|
|
const emsAuthCode = process.env.CONFIG_EMS_AUTH_CODE;
|
||
|
|
const emsSignSecret = process.env.CONFIG_EMS_SIGN_SECRET;
|
||
|
|
const emsUserCode = process.env.CONFIG_EMS_USER_CODE;
|
||
|
|
const senderNo = process.env.CONFIG_EMS_SENDER_NO;
|
||
|
|
|
||
|
|
function getRequestBody(apiCode, data) {
|
||
|
|
const str = `${JSON.stringify(data)}${emsSignSecret}`
|
||
|
|
const logitcsInterface = sm4Tool.sm4Encrypt(str, emsSignSecret)
|
||
|
|
const timeStamp = dayjs().format('YYYY-MM-DD HH:mm:ss');
|
||
|
|
return {
|
||
|
|
apiCode,
|
||
|
|
senderNo,
|
||
|
|
authorization: emsAuthCode,
|
||
|
|
msgType: '0',
|
||
|
|
timeStamp,
|
||
|
|
version: 'V1.0.0',
|
||
|
|
logitcsInterface,
|
||
|
|
userCode: emsUserCode,
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
async function cancelOrder({ logisticsOrderNo, waybillNo, cancelReason }) {
|
||
|
|
try {
|
||
|
|
if ([logisticsOrderNo, waybillNo, cancelReason].some(i => typeof i !== 'string' || i.trim() === '')) {
|
||
|
|
return { success: false, message: '参数错误' }
|
||
|
|
}
|
||
|
|
const payload = getRequestBody(apiCode.cancelOrder, { logisticsOrderNo, waybillNo, cancelReason })
|
||
|
|
const res = await request.main(emsApiUrl, payload, 'FORM_POST');
|
||
|
|
if (res && res.retCode === '00000') {
|
||
|
|
return { success: true, message: '[ems]取消订单成功' }
|
||
|
|
}
|
||
|
|
return { success: false, message: `[ems]取消订单失败: ${res && res.retMsg ? res.retMsg : '未知错误'}` }
|
||
|
|
} catch (e) {
|
||
|
|
return { success: false, message: `[ems]取消订单错误: ${e.message}` }
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
async function createOrder(businessData) {
|
||
|
|
try {
|
||
|
|
const payload = getRequestBody(apiCode.createOrder, businessData)
|
||
|
|
const res = await request.main(emsApiUrl, payload, 'FORM_POST');
|
||
|
|
if (res && res.retCode === '00000') {
|
||
|
|
const retBody = JSON.parse(res.retBody)
|
||
|
|
return { success: true, message: '[ems]订单创建成功', data: retBody }
|
||
|
|
}
|
||
|
|
return { success: false, message: `[ems]订单创建失败: ${res && res.retMsg ? res.retMsg : '订单创建失败'}` }
|
||
|
|
} catch (e) {
|
||
|
|
return { success: false, message: `[ems]订单创建错误: ${e.message}` }
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
async function getPickUpResult(logisticsOrderNo) {
|
||
|
|
try {
|
||
|
|
const payload = getRequestBody(apiCode.pickupResult, { logisticsOrderNo })
|
||
|
|
const res = await request.main(emsApiUrl, payload, 'FORM_POST');
|
||
|
|
if (res && res.retCode === '00000') {
|
||
|
|
const retBody = JSON.parse(res.retBody)
|
||
|
|
return { success: true, message: '[ems]订单创建成功', data: retBody }
|
||
|
|
}
|
||
|
|
return { success: false, message: `[ems]订单创建失败: ${res && res.retMsg ? res.retMsg : '订单创建失败'}` }
|
||
|
|
} catch (e) {
|
||
|
|
return { success: false, message: `[ems]订单创建错误: ${e.message}` }
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
async function getShippingDetail(waybillNo) {
|
||
|
|
try {
|
||
|
|
const payload = getRequestBody(apiCode.getShippingDetail, { waybillNo })
|
||
|
|
const res = await request.main(emsApiUrl, payload, 'FORM_POST');
|
||
|
|
if (res && res.retCode === '00000') {
|
||
|
|
const retBody = JSON.parse(res.retBody)
|
||
|
|
const routes = Array.isArray(retBody.responseItems) ? retBody.responseItems.sort((a, b) => dayjs(a.opTime).isAfter(dayjs(b.opTime)) ? -1 : 1) : [];
|
||
|
|
return { success: true, message: '[ems]获取物流信息成功', data: routes }
|
||
|
|
}
|
||
|
|
return { success: false, message: `[ems]获取物流信息失败: ${res && res.retMsg ? res.retMsg : '获取物流信息失败'}` }
|
||
|
|
} catch (e) {
|
||
|
|
return { success: false, message: `[ems]获取物流信息错误: ${e.message}` }
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
async function getWayBill({ waybillNo }) {
|
||
|
|
try {
|
||
|
|
const payload = getRequestBody(apiCode.getWayBill, { waybillNo, type: '129', getURL: "1" })
|
||
|
|
const res = await request.main(emsApiUrl, payload, 'FORM_POST');
|
||
|
|
if (res && res.retCode === '00000') {
|
||
|
|
return { success: true, message: '[ems]获取面单成功', data: res.retBody }
|
||
|
|
}
|
||
|
|
return { success: false, message: `[ems]获取面单失败: ${res && res.retMsg ? res.retMsg : '获取面单失败'}` }
|
||
|
|
} catch (e) {
|
||
|
|
return { success: false, message: `[ems]获取面单错误: ${e.message}` }
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
async function modifyOrder({ mark, waybillNo, pro, city, county, address }) {
|
||
|
|
// 撤单标识字段 枚举
|
||
|
|
const identification = {
|
||
|
|
changeAdress: 1, // 改址标识(仅支持寄件人修改)
|
||
|
|
undo: 2,// 撤单
|
||
|
|
abandon: 3,// 作废
|
||
|
|
expedite: 4,// 催投
|
||
|
|
redispatch: 5,// 再派
|
||
|
|
}
|
||
|
|
try {
|
||
|
|
if (typeof waybillNo !== 'string' || waybillNo.trim() === '') {
|
||
|
|
return { success: false, message: '运单号不能为空' }
|
||
|
|
}
|
||
|
|
if (typeof mark !== 'number' || !Object.values(identification).includes(mark)) {
|
||
|
|
return { success: false, message: '撤单标识格式不正确' }
|
||
|
|
}
|
||
|
|
if (mark === 1 && (typeof pro !== 'string' || pro.trim() === '')) {
|
||
|
|
return { success: false, message: '省份不能为空' }
|
||
|
|
}
|
||
|
|
if (mark === 1 && (typeof city !== 'string' || city.trim() === '')) {
|
||
|
|
return { success: false, message: '城市不能为空' }
|
||
|
|
}
|
||
|
|
if (mark === 1 && (typeof county !== 'string' || county.trim() === '')) {
|
||
|
|
return { success: false, message: '区县不能为空' }
|
||
|
|
}
|
||
|
|
if (mark === 1 && (typeof address !== 'string' || address.trim() === '')) {
|
||
|
|
return { success: false, message: '详细地址不能为空' }
|
||
|
|
}
|
||
|
|
const businessData = { identification: mark, waybillNo };
|
||
|
|
if (mark === 1) {
|
||
|
|
businessData.receiverProv = pro;
|
||
|
|
businessData.receiverCity = city;
|
||
|
|
businessData.receiverCounty = county;
|
||
|
|
businessData.receiverAddress = address;
|
||
|
|
}
|
||
|
|
const payload = getRequestBody(apiCode.modifyOrder, businessData)
|
||
|
|
const res = await request.main(emsApiUrl, payload, 'FORM_POST');
|
||
|
|
if (res && res.retCode === '00000') {
|
||
|
|
return { success: true, message: '[ems]修改订单成功' }
|
||
|
|
}
|
||
|
|
return { success: false, message: `[ems]修改订单失败: ${res && res.retMsg ? res.retMsg : '修改订单失败'}` }
|
||
|
|
} catch (e) {
|
||
|
|
return { success: false, message: `[ems]修改订单错误: ${e.message}` }
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
async function parseAddress(wholeAddress) {
|
||
|
|
try {
|
||
|
|
const payload = getRequestBody(apiCode.parseAddress, [{ wholeAddress }])
|
||
|
|
const res = await request.main(emsApiUrl, payload, 'FORM_POST');
|
||
|
|
if (res && res.retCode === '00000') {
|
||
|
|
const retBody = JSON.parse(res.retBody)
|
||
|
|
return { success: true, message: '[ems]地址解析成功', data: retBody }
|
||
|
|
}
|
||
|
|
return { success: false, message: `[ems]地址解析失败: ${res && res.retMsg ? res.retMsg : '地址解析失败'}` }
|
||
|
|
} catch (e) {
|
||
|
|
return { success: false, message: `[ems]地址解析错误: ${e.message}` }
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
async function checkAddress({ province, city, area, address }) {
|
||
|
|
try {
|
||
|
|
console.log({ province, city, area, address })
|
||
|
|
const data = {
|
||
|
|
baseProductNo: 1,
|
||
|
|
contentsAttribute: 3,
|
||
|
|
receiverProv: province,
|
||
|
|
receiverCity: city,
|
||
|
|
receiverCounty: area,
|
||
|
|
receiverAddress: address,
|
||
|
|
senderProv: '浙江省',
|
||
|
|
senderCity: '绍兴市',
|
||
|
|
senderCounty: '越城区',
|
||
|
|
senderAddress: '胜利西路657号震元堂中医院三楼',
|
||
|
|
}
|
||
|
|
const payload = getRequestBody(apiCode.checkAddress, data)
|
||
|
|
const res = await request.main(emsApiUrl, payload, 'FORM_POST');
|
||
|
|
if (res && res.retCode === '00000') {
|
||
|
|
return { success: true, message: '[ems]地址校验成功' }
|
||
|
|
}
|
||
|
|
return { success: false, message: `[ems]地址校验失败: ${res && res.retMsg ? res.retMsg : '地址校验失败'}` }
|
||
|
|
} catch (e) {
|
||
|
|
return { success: false, message: `[ems]地址校验错误: ${e.message}` }
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
async function emsTest() {
|
||
|
|
// const data = exam.createOrder;
|
||
|
|
// return await createOrder(data);
|
||
|
|
// return await getWayBill({ waybillNo: '1346293627926' })
|
||
|
|
return await getPickUpResult('HLW260109114044586910974886679')
|
||
|
|
}
|
||
|
|
|
||
|
|
module.exports = {
|
||
|
|
createOrder,
|
||
|
|
getShippingDetail,
|
||
|
|
cancelOrder,
|
||
|
|
modifyOrder,
|
||
|
|
emsTest,
|
||
|
|
parseAddress,
|
||
|
|
checkAddress
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
|