Files
xingque/pages/merchant-penalty/components/merchant-fakuan-list/merchant-fakuan-list.js
2026-06-27 05:41:55 +08:00

407 lines
13 KiB
JavaScript

import request from '../../../../utils/request.js';
const app = getApp();
const MEIYE = 5;
Component({
properties: {
status: { type: Number, value: 1, observer: 'reload' },
searchDingdan: { type: String, value: '', observer: 'reload' },
trigger: { type: Number, value: 0, observer: 'reload' }
},
data: {
list: [],
page: 1,
hasMore: true,
loading: false,
loadingMore: false,
ossImageUrl: app.globalData.ossImageUrl || '',
showDetail: false,
detailItem: null,
showModify: false,
modifyLiyou: '',
modifyJine: '',
showCancel: false,
cancelLiyou: '',
showResubmit: false,
resubmitLiyou: '',
resubmitJine: '',
uploading: false,
uploadProgressWidth: '0%'
},
lifetimes: {
attached() { this.reload(); }
},
methods: {
reload() {
this.setData({ page: 1, list: [], hasMore: true });
this.loadData();
},
mapItem(item) {
const z = Number(item.zhuangtai);
let display_status = '未知', status_class = 'zhuangtai-weizhi';
if (z === 1) { display_status = '待缴纳'; status_class = 'zhuangtai-daijiaona'; }
else if (z === 2) { display_status = '已缴纳'; status_class = 'zhuangtai-yijiaona'; }
else if (z === 3) { display_status = '申诉中'; status_class = 'zhuangtai-shensuzhong'; }
else if (z === 4) { display_status = '已驳回'; status_class = 'zhuangtai-yibohui'; }
const zhengju = (item.zhengju_tupian || []).map(img => ({
id: img.id,
url: img.url,
fullUrl: this.getFullUrl(img.url)
}));
const shensu = (item.shensu_tupian || []).map(img => ({
id: img.id,
url: img.url,
fullUrl: this.getFullUrl(img.url)
}));
return {
...item,
display_status,
status_class,
create_time: item.CreateTime || '',
zhengju_list: zhengju,
shensu_list: shensu,
staff_label: item.staff_display_name ? `客服:${item.staff_display_name}` : ''
};
},
async loadData(isLoadMore = false) {
if (this.data.loading || this.data.loadingMore) return;
if (isLoadMore && !this.data.hasMore) return;
if (isLoadMore) this.setData({ loadingMore: true });
else this.setData({ loading: true });
try {
const res = await request({
url: '/yonghu/sjfklbhq',
method: 'POST',
data: {
page: this.data.page,
page_size: MEIYE,
zhuangtai: this.data.status,
sousuo_dingdan_id: this.data.searchDingdan
}
});
if (res.statusCode === 200 && res.data.code === 0) {
const data = res.data.data;
const rows = (data.list || []).map(item => this.mapItem(item));
const newList = isLoadMore ? this.data.list.concat(rows) : rows;
this.setData({
list: newList,
hasMore: data.has_more || false,
page: isLoadMore ? this.data.page + 1 : 2,
loading: false,
loadingMore: false
});
} else {
wx.showToast({ title: res.data?.msg || '加载失败', icon: 'none' });
this.setData({ loading: false, loadingMore: false });
}
} catch (e) {
wx.showToast({ title: '网络请求失败', icon: 'none' });
this.setData({ loading: false, loadingMore: false });
}
},
loadMore() {
if (this.data.list.length === 0 || !this.data.hasMore) return;
this.loadData(true);
},
openDetail(e) {
const item = e.currentTarget.dataset.item;
this.setData({ showDetail: true, detailItem: item });
},
closeDetail() {
this.setData({ showDetail: false, detailItem: null });
},
goOrder(e) {
const id = e.currentTarget.dataset.id || this.data.detailItem?.guanliandingdan_id;
if (!id) return;
wx.navigateTo({ url: `/pages/merchant-order-detail/merchant-order-detail?dingdan_id=${id}` });
},
openModify() {
const item = this.data.detailItem;
this.setData({
showModify: true,
modifyLiyou: item.chufaliyou || '',
modifyJine: item.fakuanjine || ''
});
},
closeModify() { this.setData({ showModify: false }); },
onModifyLiyou(e) { this.setData({ modifyLiyou: e.detail.value.slice(0, 500) }); },
onModifyJine(e) { this.setData({ modifyJine: e.detail.value }); },
async submitModify() {
const item = this.data.detailItem;
const liyou = this.data.modifyLiyou.trim();
const jine = parseFloat(this.data.modifyJine);
if (!liyou) { wx.showToast({ title: '请输入罚款原因', icon: 'none' }); return; }
if (!jine || jine <= 0) { wx.showToast({ title: '金额无效', icon: 'none' }); return; }
wx.showLoading({ title: '提交中' });
try {
const res = await request({
url: '/dingdan/sjfkxgycx',
method: 'POST',
data: {
operation: 'modify_penalty',
dingdan_id: item.guanliandingdan_id,
fadan_id: item.id,
liyou: liyou,
jine: jine.toFixed(2)
}
});
if (res.statusCode === 200 && res.data.code === 0) {
wx.showToast({ title: '修改成功', icon: 'success' });
this.setData({ showModify: false });
this.closeDetail();
this.reload();
this.triggerEvent('changed');
} else {
wx.showToast({ title: res.data?.msg || '修改失败', icon: 'none' });
}
} finally {
wx.hideLoading();
}
},
openCancel() { this.setData({ showCancel: true, cancelLiyou: '' }); },
closeCancel() { this.setData({ showCancel: false }); },
onCancelLiyou(e) { this.setData({ cancelLiyou: e.detail.value.slice(0, 500) }); },
async submitCancel() {
const item = this.data.detailItem;
const liyou = this.data.cancelLiyou.trim();
if (!liyou) { wx.showToast({ title: '请输入驳回理由', icon: 'none' }); return; }
wx.showLoading({ title: '提交中' });
try {
const res = await request({
url: '/dingdan/sjfkxgycx',
method: 'POST',
data: {
operation: 'cancel_penalty',
dingdan_id: item.guanliandingdan_id,
fadan_id: item.id,
liyou: liyou
}
});
if (res.statusCode === 200 && res.data.code === 0) {
wx.showToast({ title: '已撤销', icon: 'success' });
this.setData({ showCancel: false });
this.closeDetail();
this.reload();
this.triggerEvent('changed');
} else {
wx.showToast({ title: res.data?.msg || '操作失败', icon: 'none' });
}
} finally {
wx.hideLoading();
}
},
openResubmit() {
const item = this.data.detailItem;
this.setData({
showResubmit: true,
resubmitLiyou: item.chufaliyou || '',
resubmitJine: item.fakuanjine || ''
});
},
closeResubmit() { this.setData({ showResubmit: false }); },
onResubmitLiyou(e) { this.setData({ resubmitLiyou: e.detail.value.slice(0, 500) }); },
onResubmitJine(e) { this.setData({ resubmitJine: e.detail.value }); },
async submitResubmit() {
const item = this.data.detailItem;
const liyou = this.data.resubmitLiyou.trim();
const jine = parseFloat(this.data.resubmitJine);
if (!liyou || !jine || jine <= 0) {
wx.showToast({ title: '请填写完整信息', icon: 'none' });
return;
}
wx.showLoading({ title: '提交中' });
try {
const res = await request({
url: '/dingdan/sjfkxgycx',
method: 'POST',
data: {
operation: 'resubmit_penalty',
dingdan_id: item.guanliandingdan_id,
fadan_id: item.id,
liyou: liyou,
jine: jine.toFixed(2)
}
});
if (res.statusCode === 200 && res.data.code === 0) {
wx.showToast({ title: '已重新申请', icon: 'success' });
this.setData({ showResubmit: false });
this.closeDetail();
this.reload();
this.triggerEvent('changed');
} else {
wx.showToast({ title: res.data?.msg || '操作失败', icon: 'none' });
}
} finally {
wx.hideLoading();
}
},
chooseEvidence() {
const item = this.data.detailItem;
const remain = 9 - (item.zhengju_list || []).length;
if (remain <= 0) return;
wx.chooseMedia({
count: remain,
mediaType: ['image'],
sourceType: ['album', 'camera'],
success: async (res) => {
const paths = res.tempFiles.map(f => f.tempFilePath);
await this.uploadAndAddEvidence(paths);
}
});
},
async uploadAndAddEvidence(localPaths) {
const item = this.data.detailItem;
if (!localPaths.length) return;
this.setData({ uploading: true, uploadProgressWidth: '0%' });
try {
const keys = await this.uploadToCos(localPaths, item);
if (!keys) return;
const res = await request({
url: '/dingdan/sjfkxgycx',
method: 'POST',
data: {
operation: 'manage_penalty_evidence',
dingdan_id: item.guanliandingdan_id,
fadan_id: item.id,
add_urls: keys,
remove_ids: []
}
});
if (res.statusCode === 200 && res.data.code === 0) {
wx.showToast({ title: '图片已更新', icon: 'success' });
this.reload();
this.triggerEvent('changed');
this.setData({ showDetail: false, detailItem: null });
} else {
wx.showToast({ title: res.data?.msg || '保存失败', icon: 'none' });
}
} finally {
this.setData({ uploading: false });
}
},
async deleteEvidence(e) {
const imgId = e.currentTarget.dataset.id;
const item = this.data.detailItem;
wx.showLoading({ title: '删除中' });
try {
const res = await request({
url: '/dingdan/sjfkxgycx',
method: 'POST',
data: {
operation: 'manage_penalty_evidence',
dingdan_id: item.guanliandingdan_id,
fadan_id: item.id,
add_urls: [],
remove_ids: [imgId]
}
});
if (res.statusCode === 200 && res.data.code === 0) {
const zhengju = item.zhengju_list.filter(img => img.id !== imgId);
this.setData({ detailItem: { ...item, zhengju_list: zhengju } });
this.reload();
this.triggerEvent('changed');
} else {
wx.showToast({ title: res.data?.msg || '删除失败', icon: 'none' });
}
} finally {
wx.hideLoading();
}
},
async uploadToCos(localPaths, item) {
const credRes = await request({
url: '/dingdan/dsscpz',
method: 'POST',
data: {
dingdan_id: item.guanliandingdan_id,
fadan_id: item.id,
yongtu: 'fakuan_evidence'
}
});
if (credRes.data.code !== 0) {
wx.showToast({ title: credRes.data.msg || '凭证失败', icon: 'none' });
return null;
}
const tokenData = credRes.data.data;
const credentials = tokenData.credentials || tokenData;
const COS = require('../../../../utils/cos-wx-sdk-v5.min.js');
const cos = new COS({
SimpleUploadMethod: 'putObject',
getAuthorization: (_, callback) => {
callback({
TmpSecretId: credentials.tmpSecretId,
TmpSecretKey: credentials.tmpSecretKey,
SecurityToken: credentials.sessionToken || '',
StartTime: tokenData.startTime,
ExpiredTime: tokenData.expiredTime
});
}
});
const bucket = tokenData.bucket || 'julebu-1361527063';
const region = tokenData.region || 'ap-shanghai';
const uid = app.globalData.userInfo?.yonghuid || wx.getStorageSync('uid') || '0000000';
const keys = [];
const total = localPaths.length;
for (let i = 0; i < total; i++) {
const key = `fakuan/shangjiafakuan/zhengju/${uid}_${item.id}_${Date.now() + i}.jpg`;
await new Promise((resolve, reject) => {
cos.uploadFile({
Bucket: bucket,
Region: region,
Key: key,
FilePath: localPaths[i]
}, (err) => err ? reject(err) : resolve());
});
keys.push(key);
this.setData({ uploadProgressWidth: `${((i + 1) / total * 100).toFixed(0)}%` });
}
return keys;
},
previewImage(e) {
const url = e.currentTarget.dataset.url;
wx.previewImage({ current: url, urls: [url] });
},
getFullUrl(url) {
if (!url) return '';
if (url.startsWith('http')) return url;
return this.data.ossImageUrl + url;
}
}
});