294 lines
8.7 KiB
JavaScript
294 lines
8.7 KiB
JavaScript
import request from '../../../utils/request.js'
|
|
import { openCustomerServiceChat } from '../../../utils/kefu-nav.js'
|
|
|
|
const TYPES = [
|
|
{ value: 1, label: '订单投诉' },
|
|
{ value: 2, label: '充值投诉' },
|
|
{ value: 3, label: '罚款投诉' },
|
|
{ value: 4, label: '管事投诉' },
|
|
{ value: 5, label: '被骗投诉' },
|
|
{ value: 6, label: '组长投诉' },
|
|
]
|
|
|
|
Page({
|
|
data: {
|
|
types: TYPES,
|
|
leixing: 1,
|
|
order_id: '',
|
|
chongzhi_id: '',
|
|
fadan_id: '',
|
|
target_user_id: '',
|
|
target_nicheng: '',
|
|
canComplainInviter: false,
|
|
inviterReason: '',
|
|
humanKefu: {
|
|
available: false,
|
|
wechat: '',
|
|
link: '',
|
|
tip: '',
|
|
},
|
|
shuoming: '',
|
|
images: [],
|
|
maxImages: 9,
|
|
submitting: false,
|
|
},
|
|
|
|
onLoad(q) {
|
|
const patch = {}
|
|
if (q.leixing) patch.leixing = Number(q.leixing) || 1
|
|
if (q.order_id) patch.order_id = decodeURIComponent(q.order_id)
|
|
if (q.chongzhi_id) patch.chongzhi_id = decodeURIComponent(q.chongzhi_id)
|
|
if (q.fadan_id) patch.fadan_id = decodeURIComponent(q.fadan_id)
|
|
if (Object.keys(patch).length) this.setData(patch)
|
|
this.loadMeta()
|
|
},
|
|
|
|
async loadMeta() {
|
|
try {
|
|
const res = await request({ url: '/gongdan/meta/', method: 'GET' })
|
|
const body = res.data || {}
|
|
if (!(body.code === 200 || body.code === 0)) return
|
|
const data = body.data || {}
|
|
const hk = data.human_kefu || {}
|
|
this.setData({
|
|
humanKefu: {
|
|
available: !!hk.available,
|
|
wechat: hk.wechat || '',
|
|
link: hk.link || '',
|
|
tip: hk.tip || '',
|
|
},
|
|
maxImages: data.max_images || 9,
|
|
})
|
|
this.applyInviterFromMeta(data.inviter_targets)
|
|
} catch (e) {
|
|
// ignore
|
|
}
|
|
if (this.data.leixing === 4 || this.data.leixing === 6) {
|
|
this.loadInviterTarget(this.data.leixing)
|
|
}
|
|
},
|
|
|
|
applyInviterFromMeta(targets) {
|
|
if (!targets) return
|
|
const leixing = this.data.leixing
|
|
const info = leixing === 4 ? targets.guanshi : (leixing === 6 ? targets.zuzhang : null)
|
|
if (!info) return
|
|
this.setData({
|
|
canComplainInviter: !!info.can_complain,
|
|
target_user_id: info.user_id || '',
|
|
target_nicheng: info.nicheng || '',
|
|
inviterReason: info.reason || '',
|
|
})
|
|
},
|
|
|
|
async loadInviterTarget(leixing) {
|
|
try {
|
|
const res = await request({
|
|
url: '/gongdan/my-inviter-target/',
|
|
method: 'POST',
|
|
data: { leixing },
|
|
})
|
|
const body = res.data || {}
|
|
const info = body.data || {}
|
|
this.setData({
|
|
canComplainInviter: !!info.can_complain,
|
|
target_user_id: info.user_id || '',
|
|
target_nicheng: info.nicheng || '',
|
|
inviterReason: info.reason || (body.message || ''),
|
|
})
|
|
} catch (e) {
|
|
this.setData({
|
|
canComplainInviter: false,
|
|
target_user_id: '',
|
|
target_nicheng: '',
|
|
inviterReason: '无法获取邀请人信息',
|
|
})
|
|
}
|
|
},
|
|
|
|
onPickType(e) {
|
|
const leixing = Number(e.currentTarget.dataset.v)
|
|
this.setData({
|
|
leixing,
|
|
target_user_id: '',
|
|
target_nicheng: '',
|
|
canComplainInviter: false,
|
|
inviterReason: '',
|
|
})
|
|
if (leixing === 4 || leixing === 6) {
|
|
this.loadInviterTarget(leixing)
|
|
}
|
|
},
|
|
onOrderId(e) { this.setData({ order_id: e.detail.value }) },
|
|
onChongzhiId(e) { this.setData({ chongzhi_id: e.detail.value }) },
|
|
onFadanId(e) { this.setData({ fadan_id: e.detail.value }) },
|
|
onShuoming(e) { this.setData({ shuoming: e.detail.value }) },
|
|
|
|
openMiniKefu() { openCustomerServiceChat() },
|
|
openWxKefu() {
|
|
const app = getApp()
|
|
const cfg = app.globalData.kefuConfig || {}
|
|
if (!cfg.link || !cfg.enterpriseId) {
|
|
wx.showToast({ title: '微信客服未配置', icon: 'none' })
|
|
return
|
|
}
|
|
wx.openCustomerServiceChat({
|
|
extInfo: { url: cfg.link },
|
|
corpId: cfg.enterpriseId,
|
|
fail: () => wx.showToast({ title: '打开微信客服失败', icon: 'none' }),
|
|
})
|
|
},
|
|
|
|
openHumanLink() {
|
|
const link = (this.data.humanKefu.link || '').trim()
|
|
if (!link) return
|
|
// 企业微信客服链接优先用官方能力打开
|
|
const app = getApp()
|
|
const cfg = app.globalData.kefuConfig || {}
|
|
if (cfg.enterpriseId && (link.indexOf('work.weixin.qq.com') >= 0 || link.indexOf('kf') >= 0)) {
|
|
wx.openCustomerServiceChat({
|
|
extInfo: { url: link },
|
|
corpId: cfg.enterpriseId,
|
|
fail: () => {
|
|
wx.setClipboardData({
|
|
data: link,
|
|
success: () => wx.showToast({ title: '链接已复制', icon: 'none' }),
|
|
})
|
|
},
|
|
})
|
|
return
|
|
}
|
|
wx.setClipboardData({
|
|
data: link,
|
|
success: () => wx.showToast({ title: '客服链接已复制', icon: 'none' }),
|
|
})
|
|
},
|
|
|
|
copyHumanWechat() {
|
|
const wxid = (this.data.humanKefu.wechat || '').trim()
|
|
if (!wxid) return
|
|
wx.setClipboardData({
|
|
data: wxid,
|
|
success: () => wx.showToast({ title: '微信号已复制', icon: 'success' }),
|
|
})
|
|
},
|
|
|
|
goChongzhiList() {
|
|
wx.navigateTo({ url: '/pages/gongdan/chongzhi-list/chongzhi-list?from=complaint' })
|
|
},
|
|
goPenalty() { wx.navigateTo({ url: '/pages/penalty/penalty/penalty' }) },
|
|
goMyList() { wx.navigateTo({ url: '/pages/gongdan/list/list' }) },
|
|
|
|
chooseImg() {
|
|
const left = this.data.maxImages - this.data.images.length
|
|
wx.chooseMedia({
|
|
count: left,
|
|
mediaType: ['image'],
|
|
success: async (res) => {
|
|
wx.showLoading({ title: '上传中' })
|
|
try {
|
|
const urls = [...this.data.images]
|
|
for (const f of res.tempFiles || []) {
|
|
const url = await this.uploadOne(f.tempFilePath)
|
|
if (url) urls.push(url)
|
|
}
|
|
this.setData({ images: urls.slice(0, this.data.maxImages) })
|
|
} catch (e) {
|
|
wx.showToast({ title: '上传失败', icon: 'none' })
|
|
} finally {
|
|
wx.hideLoading()
|
|
}
|
|
},
|
|
})
|
|
},
|
|
|
|
uploadOne(filePath) {
|
|
const app = getApp()
|
|
const base = (app.globalData.apiBaseUrl || '').replace(/\/$/, '')
|
|
const token = wx.getStorageSync('token') || ''
|
|
return new Promise((resolve, reject) => {
|
|
wx.uploadFile({
|
|
url: `${base}/gongdan/upload-image/`,
|
|
filePath,
|
|
name: 'file',
|
|
header: { Authorization: token ? `Bearer ${token}` : '' },
|
|
success: (res) => {
|
|
try {
|
|
const body = JSON.parse(res.data || '{}')
|
|
if ((body.code === 200 || body.code === 0) && body.data && body.data.url) {
|
|
resolve(body.data.url)
|
|
} else reject(new Error(body.message || '上传失败'))
|
|
} catch (e) { reject(e) }
|
|
},
|
|
fail: reject,
|
|
})
|
|
})
|
|
},
|
|
|
|
delImg(e) {
|
|
const i = e.currentTarget.dataset.i
|
|
const images = this.data.images.slice()
|
|
images.splice(i, 1)
|
|
this.setData({ images })
|
|
},
|
|
|
|
preview(e) {
|
|
wx.previewImage({ current: e.currentTarget.dataset.url, urls: this.data.images })
|
|
},
|
|
|
|
async submit() {
|
|
if (this.data.submitting) return
|
|
if (!(this.data.shuoming || '').trim()) {
|
|
wx.showToast({ title: '请填写投诉说明', icon: 'none' })
|
|
return
|
|
}
|
|
if (this.data.leixing === 4 || this.data.leixing === 6) {
|
|
if (!this.data.canComplainInviter || !this.data.target_user_id) {
|
|
wx.showToast({
|
|
title: this.data.inviterReason || '没有邀请人,无法投诉',
|
|
icon: 'none',
|
|
})
|
|
return
|
|
}
|
|
}
|
|
this.setData({ submitting: true })
|
|
try {
|
|
const payload = {
|
|
leixing: this.data.leixing,
|
|
shuoming: this.data.shuoming,
|
|
order_id: this.data.order_id,
|
|
chongzhi_id: this.data.chongzhi_id,
|
|
fadan_id: this.data.fadan_id,
|
|
images: this.data.images,
|
|
}
|
|
if (this.data.leixing === 4) {
|
|
payload.target_role = 'guanshi'
|
|
// 后端会强制本人邀请人,这里仅作兼容提交
|
|
payload.target_user_id = this.data.target_user_id
|
|
payload.guanshi_id = this.data.target_user_id
|
|
} else if (this.data.leixing === 6) {
|
|
payload.target_role = 'zuzhang'
|
|
payload.target_user_id = this.data.target_user_id
|
|
}
|
|
const res = await request({
|
|
url: '/gongdan/create/',
|
|
method: 'POST',
|
|
data: payload,
|
|
})
|
|
const body = res.data || {}
|
|
if (body.code === 200 || body.code === 0) {
|
|
wx.showToast({ title: '提交成功', icon: 'success' })
|
|
setTimeout(() => {
|
|
wx.redirectTo({ url: '/pages/gongdan/list/list?tab=created' })
|
|
}, 500)
|
|
} else {
|
|
wx.showToast({ title: body.message || body.msg || '提交失败', icon: 'none' })
|
|
}
|
|
} catch (e) {
|
|
wx.showToast({ title: '网络错误', icon: 'none' })
|
|
} finally {
|
|
this.setData({ submitting: false })
|
|
}
|
|
},
|
|
})
|