Files
zsw-jx-store/src/subPages/orderChild/orderDetail/orderDetail.ts
2025-12-10 16:28:35 +08:00

630 lines
22 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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