This commit is contained in:
wtq
2025-11-13 14:42:30 +08:00
commit 7d879ff3bc
349 changed files with 54558 additions and 0 deletions

View File

@@ -0,0 +1,629 @@
import order from '@/api/https/order'
import toast from '@/utils/toast'
import { store } from '@/store'
import { timeFormatHMS, timeFormatDHM, clearList } from '@/utils/tools'
import { onLoad, onUnload,onShow } from '@dcloudio/uni-app'
import { computed, onBeforeUnmount, ref } from 'vue'
import useOrderInfo from '@/composables/useOrderInfo'
import configCms from "@/utils/configCms"
import { setStorage, getStorage, cleatStorage } from '@/utils/storage'
// import log from '@/utils/log'
/**
* 订单详情
* @param *
* @return 模板使用数据与方法详情内容请查看return
*/
function orderDetailFn() {
const { phoneCall, afterSalesDetaile } = useOrderInfo()
onUnload(() => {
cleatStorage("templateMessage")
})
/***************************************************************
* 收集传递信息
*/
const vendorID = ref<number>(0)
const vendorOrderID = ref<number>(0)
onLoad(async (options: any) => {
// // 订单管理-新订单通知
// let logData = {
// '日志记录时间': Date(),
// '启动类型': '订单详情',
// '启动参数': options,
// '用户TOKEN': getStorage('token') ? getStorage('token') : '未获取到用户TOKEN',
// '用户手机号': getStorage('mobile') ? getStorage('mobile') : '未获取到用户手机号',
// '店铺ID': getStorage('storeID') ? getStorage('storeID') : '未获取到店铺ID',
// '店铺名字': getStorage('storeName') ? getStorage('storeName') : '未获取到店铺名字',
// }
// log.info(JSON.stringify(logData))
vendorID.value = options.vendorID
vendorOrderID.value = options.vendorOrderID
store.commit('storeInfo/jxLoadingFn', true)
await getOrderInfo(options.vendorOrderID) // 获取订单详情
await getBarCode() // 获取条形码
await getWayBill(2) // 获取运单状态
await GetAfsOrders() // 售后单
await getSkuList() // 获取商品列表
await getComplaintList() // 是否可以投诉骑手
store.commit('storeInfo/jxLoadingFn', false)
})
onShow(() => {
if(getStorage('reLoadOrderDetail')) getSkuList()
})
/***************************************************************
* 获取订单详情
* @vendorOrderID {number} 订单号
*/
const invoiceTitle = ref<string>('') // 发票抬头
const invoiceTaxerID = ref<string>('') // 纳税人ID
const orderData = ref<AnyObject>({
vendorID: -99 // 默认值判断,防止页面渲染报错
}) // 订单信息1
async function getOrderInfo(vendorOrderID: number) {
let res = await order.get_orders({ vendorOrderID })
if (res.code == 0 && res.data.totalCount) {
// 公众号模板消息-新订单通知
let templateMessage: any = getStorage("templateMessage")
let newData = res.data.data[0]
if (templateMessage && templateMessage.scene === 1043) {
setStorage("storeID", +newData.jxStoreID)
await store.dispatch('storeInfo/getOneStore', newData.jxStoreID)
}
if (getStorage('storeID') != newData.jxStoreID) {
setStorage('storeID', +newData.jxStoreID)
await store.dispatch('storeInfo/getOneStore', +newData.jxStoreID)
}
invoiceTitle.value = newData.invoiceTitle
invoiceTaxerID.value = newData.invoiceTaxerID
orderData.value = newData
GetOrderInfo(newData, vendorOrderID)
} else {
uni.jxAlert({
title: '提示',
content: '获取订单号信息失败',
success: () => {
uni.navigateBack()
}
})
}
}
const orderInfo = ref<AnyObject>({
vendorID: -99 // 默认值判断,防止页面渲染报错
}) // 订单信息2
async function GetOrderInfo(orderData: AnyObject, vendorOrderID: number) {
let data = {
vendorOrderID,
vendorID: orderData.vendorID,
refresh: false
}
let res = await order.get_order_info(data)
if (res.code == 0) {
orderInfo.value = res.data
// 是否是京西新用户
if (res.data.vendorID == 9) getOrderUserBuyFirst(res.data.vendorOrderID)
} else {
uni.jxAlert({
title: '提示',
content: '获取订单号信息失败',
success: () => {
uni.navigateBack()
}
})
}
}
// 获取条形码
const barCodeImg = ref<string>('https://image.jxc4.com/image/34e6c3b22b914d7102c99bebfc95f9dd.png')
async function getBarCode() {
let data = {
width: 600,
height: 200,
codetype: 'bar',
srcData: vendorOrderID.value,
}
let res = await order.create_qrOr_bar_code(data)
if (res.code == 0) barCodeImg.value = res.data
}
// 查询京西是否是新用户
const isNewUser = ref<boolean>(false)
async function getOrderUserBuyFirst(vendorOrderID: number) {
let res = await order.get_order_user_buy_first({ vendorOrderID })
if (res.code == 0) isNewUser.value = res.data
}
/***************************************************************
* 订单状态
*/
const orderType:AnyObject = configCms.serveInfo
const orderStatus = computed(() => {
if (orderData.value.status != '') {
return orderType.orderStatus[orderData.value.status]
} else {
return '未知'
}
})
/***************************************************************
* 取消订单
*/
function cancelOrder(vendorOrderID: string) {
uni.jxConfirm({
title: '提示',
content: '是否取消该订单',
success: async () => {
let data = {
vendorOrderID: vendorOrderID,
isDetail: true
}
let res = await order.getafs_orders(data)
if (res.code == 0) {
handleResData(res.data)
if (cancelOrderFail.value) {
uni.jxAlert({
title: '提示',
content: '有待审核的售后单,请先审核售后单再取消订单',
success: () => {
afterSalesDetaile(res.data.data[0].afsOrderID || 123)
}
})
} else {
let data = {
vendorOrderID: vendorOrderID,
vendorID: vendorID.value,
// %E5%8D%8F%E5%95%86%E4%B8%80%E8%87%B4 这一串是啥密文,没搞清从哪编译来的
// reason: '%E5%8D%8F%E5%95%86%E4%B8%80%E8%87%B4'
reason: '协商一致'
}
let res = await order.cancel_order(data)
if (res.code == 0) {
toast('取消成功', 1)
uni.jxAlert({
title: '提示',
content: '取消成功'
})
} else {
uni.jxAlert({
title: '提示',
content: `取消失败:${res.desc || res.data}`
})
}
}
} else {
uni.jxAlert({
title: '提示',
content: `取消失败:${res.desc || res.data}`
})
}
}
})
}
const afsCount = ref<number>(0) // 取消订单标识
const cancelOrderFail = ref<boolean>(false)
function handleResData(res: AnyObject) {
res.data && res.data.forEach((item: AnyObject) => {
item.skus.forEach((item: AnyObject) => {
afsCount.value += item.count
if (afsCount.value == orderData.value.goodsCount) cancelOrderFail.value = true
})
afsCount.value = 0
})
}
/**
* 拨打电话
*/
function callPhone(item:AnyObject) {
let itemList:string[] = []
if(item.consigneeMobile) itemList.push('临1' + item.consigneeMobile.split(',')[0] +'转' + item.consigneeMobile.split(',')[1])
if(item.consigneeMobile2) itemList.push('临2' + item.consigneeMobile2.split(',')[0] +'转' + item.consigneeMobile2.split(',')[1])
if(itemList.length === 0) return toast('该订单暂无联系方式', 2)
uni.showActionSheet({
// title: '退出后不会删除任何数据',
itemColor: '#4eb331',
itemList,
popover: {
width: 5000,
},
success: function (res) {
if(res.tapIndex === 0) phoneCall(item.consigneeMobile)
if(res.tapIndex === 1) phoneCall(item.consigneeMobile2)
}
});
}
/***************************************************************
* 联系用户
*/
function realMobile() {
if(orderData.value.vendorID === 1){
if(store.getters['storeInfo/imMtStatus'][0].imStatus !== 1) return toast('美团IM状态已关闭', 1)
setStorage('vendorUserInfo',{
venderOrderID:orderData.value.vendorOrderID,
orderSeq:orderData.value.orderSeq,
vendorOrgCode:orderData.value.vendorOrgCode,
vendorStoreID:orderData.value.vendorStoreID,
userID:orderData.value.vendorUserID,
vendorID:orderData.value.vendorID
})
uni.navigateTo({ url: '/subPages/messageChild/msgChat/msgChat' })
}else{
// 饿百
toast('暂不支持聊天', 2)
}
}
/***************************************************************
* 饿佰订单号
*/
const elemIDPre = computed(() => {
return orderData.value.vendorOrderID2 ? orderData.value.vendorOrderID2.slice(0, orderData.value.vendorOrderID2.length - 4) : ''
})
const elemIDSuf = computed(() => {
return orderData.value.vendorOrderID2 ? orderData.value.vendorOrderID2.slice(orderData.value.vendorOrderID2.length - 4) : ''
})
/***************************************************************
* 格式化预计送达时间
*/
const expectTime = computed(() => {
if (
!orderData.value.expectedDeliveredTime ||
orderData.value.expectedDeliveredTime.indexOf('1970') !== -1
) {
// 处理预计送达数据为空
return timeFormatHMS()
} else {
return timeFormatHMS(orderData.value.expectedDeliveredTime)
}
})
/**
* 是否隐藏订单信息
*/
const isHiddenOrderInfo = computed(() => {
return !(orderData.value.buyerComment && orderData.value.buyerComment.includes('支付方式'))
})
/***************************************************************
* 收益异常处理
*/
const isPointStore = computed(() => {
return store.getters['storeInfo/isPointStore']
})
const earningTooSmall = computed(() => {
const { payPercentage } = storeInfo.value
const {
totalShopMoney,
desiredFee,
shopPrice,
distanceFreightMoney,
waybillTipMoney,
} = orderData.value
let jxEarning = 0
if (isPointStore.value) {
// 扣点
jxEarning = (totalShopMoney * payPercentage) / 200 / 100
} else {
// 报价
jxEarning =
(totalShopMoney -
desiredFee -
shopPrice -
distanceFreightMoney -
waybillTipMoney) /
100
}
if (
(jxEarning < -10 || totalShopMoney < 0) &&
orderData.value.buyerComment.indexOf('【JD】') == -1
) {
return true
} else {
return false
}
})
/***************************************************************
* 获取门店信息
*/
const storeInfo = computed(() => {
return store.state.storeInfo.allStoreInfo
})
/***************************************************************
* 均价
*/
const avgPriceInfo = computed(() => {
const avgPrice = orderInfo.value.avgPrice || 0
if (avgPrice <= 2000) {
return '超低'
} else if (avgPrice > 2000 && avgPrice <= 4000) {
return '较低'
} else if (avgPrice > 4000 && avgPrice <= 10000) {
return '中等'
} else if (avgPrice > 10000 && avgPrice <= 20000) {
return '较高'
} else if (avgPrice > 20000) {
return '超高'
}
})
/***************************************************************
* 运单状态
*/
const finallyWaybillStatus = ref<any>([]) // 最终运单状态
const waybillStatus = computed(() => {
let orderStatus:AnyObject = configCms.serveInfo.waybillStatus
let newArr: Array<AnyObject> = []
let delivery: any = {}
finallyWaybillStatus.value.forEach((element: AnyObject) => {
delivery[element.vendorID] = (configCms as AnyObject).serveInfo.vendorName[element.vendorID]
if (element.vendorOrderID == orderData.value.vendorWaybillID) {
let obj = {
...element,
status: orderStatus[element.status],
statusTime: timeFormatDHM(element.statusTime)
}
newArr.push(obj)
}
})
return newArr
})
async function getWayBill(orderType: number) {
let data = {
vendorOrderID: vendorOrderID.value,
vendorID: vendorID.value,
orderType
}
let res = await order.get_order_status_list(data)
if (res.code == 0 && res.data != null) {
finallyWaybillStatus.value = res.data
}
}
/***************************************************************
* 查询售后单
*/
const afsOrder = ref<Array<AnyObject>>([])
async function GetAfsOrders() {
let data = {
vendorOrderID: vendorOrderID.value
}
let res = await order.get_afs_orders(data)
if (res.code == 0) {
afsOrder.value = res.data.data || []
}
}
/***************************************************************
* 获取商品列表
*/
const skuList = ref<Array<AnyObject>>([])
const totalCount = ref<number>(0)
async function getSkuList() {
let data = {
vendorOrderID: vendorOrderID.value,
vendorID: vendorID.value
}
let res = await order.get_order_sku_info(data)
if (res.code == 0) {
skuList.value = res.data
skuList.value.forEach((item: AnyObject) => {
totalCount.value += item.count
item.comparePrice = (item.shopPrice / 100).toFixed(2)
item.earnPrice = (item.earningPrice / 100).toFixed(2)
item.saleSalePrice = (item.salePrice / 100).toFixed(2)
})
setStorage('reLoadOrderDetail',false)
}
}
/***************************************************************
* 跳转创建售后单
* @param {type} 1部分退款 2发起售后
* @param {skuList} 部分退款数据
* @param {tel} 用户手机号
*/
function toCreateAfsOrderPage(type: number, tel?: string) {
if (type == 1) {
uni.jxConfirm({
title: '提示',
content: '修改订单比例大于10%您的门店将被下线。请联系客户\r\n1.请联系客户更换其他等价商品\r\n2.联系客户说明可做售后退款',
confirmText: '继续退款',
cancelText: '联系客服',
success: () => {
let data = JSON.stringify({
vendorOrderID: vendorOrderID.value,
vendorID: vendorID.value,
buyerComment:orderData.value.buyerComment
})
uni.navigateTo({
url: `/subPages/orderChild/createAfterSales/createAfterSales?type=${type}&data=${data}`
})
},
fail: () => {
phoneCall(tel!)
}
})
} else {
let data = JSON.stringify({
vendorOrderID: vendorOrderID.value,
vendorID: vendorID.value,
buyerComment:orderData.value.buyerComment
})
uni.navigateTo({
url: `/subPages/orderChild/createAfterSales/createAfterSales?type=${type}&data=${data}`
})
}
}
/***************************************************************
* 平台补贴筛选
*/
const realPointStore = computed(() => {
if (orderData.value.vendorPayPercentage != 0) {
if (orderData.value.vendorPayPercentage < 50) {//扣点
return true
} else {//报价
return false
}
} else {
if (isPointStore.value) {//扣点
return true
} else {//报价
return false
}
}
})
/***************************************************************
* 运营负责人
*/
const yunyingInfo = computed(() => {
if (typeof vendorID.value === 'undefined') return { name: '', mobile: '' }
const obj:AnyObject = {
0: ['operatorName', 'operatorPhone'],
1: ['operatorName2', 'operatorPhone2'],
3: ['operatorName3', 'operatorPhone3'],
9: ['operatorName', 'operatorPhone'],
4: ['operatorName', 'operatorPhone'],
5: ['operatorName', 'operatorPhone'],
6: ['operatorName', 'operatorPhone'],
7: ['operatorName', 'operatorPhone'],
8: ['operatorName', 'operatorPhone'],
14: ['operatorName', 'operatorPhone'],
16: ['operatorName', 'operatorPhone'],
}
return {
name: storeInfo.value[obj[vendorID.value][0]],
mobile: storeInfo.value[obj[vendorID.value][1]],
}
})
const waybillType = computed(() => {
switch (orderData.value.waybillVendorID) {
case 0:
return 'dd'
case 1:
return 'mt'
case 2:
return 'fn'
case 3:
return 'fn'
case 101:
return 'dd'
case 102:
return 'mt'
default:
return orderData.value.waybillVendorID
}
})
/**
* 拣货完成
*/
async function pickingComplete(vendorOrderID: string, vendorID: string) {
let data = {
vendorOrderID,
vendorID,
}
let res = await order.finished_pickup(data)
if (res.code == 0) {
toast('拣货成功', 1)
// 刷新订单
} else {
toast('拣货异常', 2)
}
}
/*************************************************
* 投诉骑手
*/
function complaintHandler(vendorOrderID: string) {
uni.navigateTo({
url: `/subPages/orderChild/complaint/complaint?vendorOrderID=${vendorOrderID}`
})
}
const isComplaint = ref<boolean>(false)
/*************************************************
* 查看是否能投诉骑手
*/
async function getComplaintList() {
const res = await order.complaint_rider_list({ vendorOrderID: orderData.value.vendorOrderID })
if (res.code == 0 && res.data != null) {
// 可以投诉
isComplaint.value = true
} else {
// 只能投诉三方配送,不能投诉官方配送
isComplaint.value = false
}
}
/*************************************************
* 收尾工作
*/
onBeforeUnmount(() => {
clearList()
})
return {
invoiceTitle, // 抬头发票
invoiceTaxerID, // 纳税
orderData, // 信息1
orderInfo, // 信息2
orderStatus, // 订单状态
cancelOrder, // 取消订单
elemIDPre, // 饿了么订单编号
elemIDSuf, // 饿了么订单编号
expectTime, // 预计送达
barCodeImg, // 条形码
earningTooSmall, // 收益异常
isNewUser, // 新用户
realMobile, // 真实手机号
avgPriceInfo, // 均价
waybillStatus, // 运单状态
afsOrder, // 售后单
skuList, // 商品列表
totalCount, // 商品数量
toCreateAfsOrderPage, // 跳转到售后单页面
isPointStore, // 扣点信息
realPointStore, // 平台补贴筛选
storeInfo, // 门店收款人
yunyingInfo, // 运营负责人
waybillType, // 快递类型
pickingComplete, // 拣货完成
complaintHandler, // 投诉骑手
isComplaint, // 是否可以投诉骑手
isHiddenOrderInfo, // 是否隐藏订单信息
callPhone // 拨打电话
}
}
export default orderDetailFn