This commit is contained in:
2025-06-13 21:01:19 +08:00
parent e90242f469
commit f27e7f5137
6 changed files with 158 additions and 20 deletions

View File

@@ -637,6 +637,20 @@ const admin = {
data: data,
});
},
getExchangeLogIntervention: async (data) => {
return request({
url: '/admin/Intervention/getExchangeLog',
method: Method.POST,
data: data,
});
},
addIntervention: async (data) => {
return request({
url: '/admin/Intervention/addIntervention',
method: Method.POST,
data: data,
});
},
}
export default admin;

View File

@@ -7,7 +7,11 @@ import {Message} from "@arco-design/web-vue";
import useTableQuery from "../../hooks/useTableQuery.js";
import dayjs from "dayjs";
import {throttle} from "lodash";
import {useSystemStore} from "../../pinia/SystemStore/index.js";
import UploadSlot from "../upload/UploadSlot.vue";
const SystemStore = useSystemStore();
const emits = defineEmits(['success']);
const ChatBoxRef = useTemplateRef('ChatBox');
const {task} = defineProps({
task: {
@@ -19,6 +23,7 @@ const po = reactive({
id: task.id,
});
const vo = reactive({
info: null,
rows: [],
total: 0,
});
@@ -29,10 +34,11 @@ const form = reactive({
const {loading, pagination, initFetchData, fetchData} = useTableQuery({
parameter: po,
api: Api.merchant.getExchangeLog,
api: SystemStore.isRoot ? Api.admin.getExchangeLogIntervention : Api.merchant.getExchangeLog,
callback: (data) => {
if (data.rows.length === 0) {
} else {
vo.info = data.info;
vo.total = data.total;
vo.rows.push(...data.rows);
}
@@ -58,12 +64,19 @@ const handleScroll = ({target}) => {
}, 500)();
}
}
const addIntervention = async () => {
const {msg} = await Api.admin.addIntervention({...form, id: task.id,});
Message.success(msg);
await fetchData();
emits('success')
}
</script>
<template>
<div
@scroll="handleScroll"
class="size-full flex flex-col gap-[30px] max-h-[600px] overflow-auto">
:class="['size-full flex flex-col gap-[30px] overflow-auto', !SystemStore.isRoot ? 'max-h-[600px]' : 'max-h-[800px]']">
<div :class="['flex gap-[18px]', v.right === 0 ? 'chat-right' : 'chat-left']" v-for="v in vo.rows">
<a-image :src="v.people.avatar" class="rounded-[50%] overflow-hidden" width="64px"
height="64px"></a-image>
@@ -88,9 +101,46 @@ const handleScroll = ({target}) => {
</div>
</div>
</div>
<div v-if="SystemStore.isRoot && vo.info?.id" class="flex justify-center">
<a-card class="w-[528px]" title="达人发起了平台介入" :header-style="{textAlign: 'center'}">
<div class="font-bold text-[#1D2129] mb-[6px]">达人申诉理由:</div>
<div class="px-[16px] py-[12px] bg-[#F7F8FA]">
<div>
{{ vo.info.remark }}
</div>
<div class="grid grid-cols-5 gap-[12px] mt-[4px]">
<x-image hideDelete v-for="v in vo.info.image_arr" :src="v"></x-image>
</div>
</div>
<div class="font-bold text-[#1D2129] mt-[20px] mb-[6px]">平台处理结果:</div>
<div id="ROOT" class="flex flex-col justify-center items-center">
<a-textarea v-model:model-value="form.content" class="w-full h-[140px]"
placeholder="输入平台介入结果"></a-textarea>
<div class="flex flex-wrap gap-[16px] mt-[10px] mr-auto">
<x-image
v-for="(v, index) in form.images"
@delete="form.images.splice(index,1)"
:key="index"
width="32px"
height="32px"
:src="v">
</x-image>
<upload-slot @success="(e) => form.images.push(e)">
<div
class="size-[32px] bg-[#F2F3F5] flex justify-center items-center flex-col rounded-[8px] cursor-pointer">
<icon-plus/>
</div>
</upload-slot>
</div>
<a-button type="primary" class="mt-[10px]" @click="addIntervention">平台介入</a-button>
</div>
</a-card>
</div>
</div>
<div
v-if="!SystemStore.isRoot"
class="bg-white rounded-[2px] w-[calc(100%-40px)] h-[144px] absolute left-0 bottom-[20px] mx-[20px] py-[8px]">
<a-textarea
v-model:model-value="form.content"
@@ -131,6 +181,14 @@ const handleScroll = ({target}) => {
</div>
</template>
<style lang="scss">
#ROOT {
textarea {
background-color: #F7F8FA;
}
}
</style>
<style scoped lang="scss">
.chat-right {
@apply flex-row-reverse;

View File

@@ -10,6 +10,7 @@ const {task} = defineProps({
}
});
const visible = defineModel('visible');
const emits = defineEmits(['success']);
</script>
<template>
@@ -25,7 +26,7 @@ const visible = defineModel('visible');
</a-alert>
<div class="flex">
<div class="p-[20px] bg-[#F2F3F5] flex-grow min-h-[800px] relative">
<Information :task="task" v-if="visible"></Information>
<Information :task="task" v-if="visible" @success="emits('success')"></Information>
</div>
<div class="w-[280px] h-auto flex flex-col bg-[#F2F3F5] gap-[20px]" v-if="task">
<div class="bg-white p-[20px]">

View File

@@ -1,11 +1,14 @@
<script setup>
import Api from "../../api/index.js";
import {useSystemStore} from "../../pinia/SystemStore/index.js";
const emits = defineEmits(['success']);
const SystemStore = useSystemStore();
const upload = (e) => {
const file = e.target.files[0];
Api.system.uploadFile2(file).then(({data}) => {
const api = SystemStore.isRoot ? Api.system.uploadFile : Api.system.uploadFile2;
api(file).then(({data}) => {
emits('success', data);
});
}

View File

@@ -4,51 +4,54 @@ import useTableQuery from "../../../../hooks/useTableQuery.js";
import Api from "../../../../api/index.js";
import Filter from "../../../../components/Filter/index.vue";
import XSelect from "../../../../components/XSelect/index.vue";
import Chat from "../../../../components/Chat/index.vue";
const columns = [
{
title: '沟通事件ID',
dataIndex: 'key',
dataIndex: 'code',
},
{
title: '商家ID',
dataIndex: 'key',
dataIndex: 'b_uid',
},
{
title: '任务编号',
dataIndex: 'key',
dataIndex: 't_uid',
},
{
title: '子任务编号',
dataIndex: 'key',
dataIndex: 'm_code',
},
{
title: '申诉状态',
dataIndex: 'key',
dataIndex: 'status',
slotName: 'status',
},
{
title: '结算状态',
dataIndex: 'key',
dataIndex: 'settlement',
slotName: 'settlement',
},
{
title: '达人ID',
dataIndex: 'key',
dataIndex: 'uuid',
},
{
title: '达人账号',
dataIndex: 'key',
dataIndex: 'account',
},
{
title: '领取时间',
dataIndex: 'key',
dataIndex: 'receive_time',
},
{
title: '扣除',
dataIndex: 'key',
dataIndex: 'ratio',
},
{
title: '金额',
dataIndex: 'key',
dataIndex: 'money',
},
{
title: '原因',
@@ -127,7 +130,10 @@ const FilterConfig = [
span: 6,
},
];
const state = reactive({
showChat: false,
task: null,
})
const po = reactive({
pass: 1,
money_type: null,
@@ -141,7 +147,7 @@ const vo = reactive({
rows: [],
total: 0,
});
const {loading, pagination, initFetchData} = useTableQuery({
const {loading, pagination, initFetchData, fetchData} = useTableQuery({
parameter: po,
api: Api.admin.getInterventionList,
callback: (data) => {
@@ -183,9 +189,14 @@ const {loading, pagination, initFetchData} = useTableQuery({
:loading="loading"
:columns="columns"
class="flex-grow">
<template v-slot:action>
<template v-slot:action="{record}">
<div class="flex gap-[16px]">
<a-link :hoverable="false">沟通记录</a-link>
<a-link :hoverable="false" @click="async () => {
const {data} = await Api.admin.getTaskChildrenInfo(record.tc_id);
state.showChat = true;
state.task = data;
}">沟通记录
</a-link>
<a-link :hoverable="false">查看回填</a-link>
<a-link :hoverable="false" status="success">确认结算</a-link>
</div>
@@ -193,10 +204,56 @@ const {loading, pagination, initFetchData} = useTableQuery({
<template v-slot:why>
<a-link :hoverable="false">原因</a-link>
</template>
<template v-slot:status="{record}">
<a-tag color="green" v-if="record.status===1">已处理</a-tag>
<a-tag color="cyan" v-if="record.status===0">未处理</a-tag>
</template>
<template v-slot:settlement="{record}">
<div v-if="record.status===2" class="status success">{{ record.settlement_text }}</div>
<div v-if="record.status===1" class="status warning">{{ record.settlement_text }}</div>
<div v-if="record.status===-1" class="status danger">{{ record.settlement_text }}</div>
<div v-if="record.status===0" class="status primary">{{ record.settlement_text }}</div>
</template>
</a-table>
</a-card>
<Chat
:task="state.task"
@success="fetchData"
v-model:visible="state.showChat">
</Chat>
</template>
<style scoped>
<style lang="scss" scoped>
.status {
@apply flex whitespace-nowrap items-center gap-[6px];
&::before {
content: '';
@apply block size-[6px] rounded-[50%];
}
}
.success {
&::before {
@apply bg-[rgb(var(--green-6))];
}
}
.danger {
&::before {
@apply bg-[rgb(var(--red-6))];
}
}
.warning {
&::before {
@apply bg-[rgb(var(--orange-6))];
}
}
.primary {
&::before {
@apply bg-[rgb(var(--arcoblue-6))];
}
}
</style>