/** * @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 }