630 lines
22 KiB
TypeScript
630 lines
22 KiB
TypeScript
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
|