2026-07-27 11:28:33 +08:00

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
}