This commit is contained in:
2025-06-16 20:54:38 +08:00
parent 969dd6d5d9
commit 00a055685e
11 changed files with 161 additions and 48 deletions

View File

@@ -263,7 +263,7 @@ const admin = {
}, },
getTaskblockList: async (data) => { getTaskblockList: async (data) => {
return request({ return request({
url: '/admin/taskblock/getList', url: '/admin/TaskBlock/getList',
method: Method.POST, method: Method.POST,
data: data data: data
}); });
@@ -651,6 +651,27 @@ const admin = {
data: data, data: data,
}); });
}, },
withdrawallogTranfer: async (data) => {
return request({
url: '/admin/withdrawalLog/tranfer',
method: Method.POST,
data: data,
});
},
withdrawalLogAddRemark: async (data) => {
return request({
url: '/admin/withdrawalLog/addRemark',
method: Method.POST,
data: data,
});
},
taskBlockCancel: async (data) => {
return request({
url: '/admin/TaskBlock/cancel',
method: Method.POST,
data: data,
});
},
} }
export default admin; export default admin;

View File

@@ -540,6 +540,20 @@ const merchant = {
data: data data: data
}); });
}, },
findTask: async (data) => {
return request({
url: '/index/task/findTask',
method: Method.POST,
data: data
});
},
getChildrenInfo: async (id) => {
return request({
url: '/index/task/getChildrenInfo',
method: Method.POST,
data: {id}
});
},
} }
export default merchant; export default merchant;

View File

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

View File

@@ -32,6 +32,7 @@ const reset = () => {
Object.keys(from.value).forEach(key => { Object.keys(from.value).forEach(key => {
from.value[key] = null; from.value[key] = null;
}); });
emits('reset');
emits('search'); emits('search');
} }
</script> </script>

View File

@@ -3,53 +3,53 @@ import Filter from "../../../../components/Filter/index.vue";
import {reactive} from "vue"; import {reactive} from "vue";
import useTableQuery from "../../../../hooks/useTableQuery.js"; import useTableQuery from "../../../../hooks/useTableQuery.js";
import Api from "../../../../api/index.js"; import Api from "../../../../api/index.js";
import {Message} from "@arco-design/web-vue";
const columns = [ const columns = [
{ {
title: '商家ID', title: '商家ID',
dataIndex: 'key', dataIndex: 'b_uid',
}, },
{ {
title: '渠道', title: '渠道',
dataIndex: 'key', dataIndex: 'name',
}, },
{ {
title: '达人ID', title: '达人ID',
dataIndex: 'key', dataIndex: 'u_uid',
}, },
{ {
title: '推广账号ID', title: '推广账号ID',
dataIndex: 'image', dataIndex: 'a_uid',
slotName: 'image',
}, },
{ {
title: '推广账号', title: '推广账号',
dataIndex: 'image', dataIndex: 'account',
slotName: 'image',
}, },
{ {
title: '拉黑原因', title: '拉黑原因',
dataIndex: 'key', dataIndex: 'remark',
}, },
{ {
title: '拉黑效果', title: '拉黑效果',
dataIndex: 'key', dataIndex: 'xg',
slotName: 'xg',
}, },
{ {
title: '开始日期', title: '开始日期',
dataIndex: 'key', dataIndex: 'createtime',
}, },
{ {
title: '结束日期', title: '结束日期',
dataIndex: 'key', dataIndex: 'endtime',
}, },
{ {
title: '关联任务ID', title: '关联任务ID',
dataIndex: 'key', dataIndex: 'task_id',
}, },
{ {
title: '关联子任务ID', title: '关联子任务ID',
dataIndex: 'key', dataIndex: 'task_children_id',
}, },
{ {
title: '操作', title: '操作',
@@ -93,13 +93,19 @@ const vo = reactive({
total: 0, total: 0,
}); });
const {loading, pagination, initFetchData} = useTableQuery({ const {loading, pagination, initFetchData, fetchData} = useTableQuery({
parameter: po, parameter: po,
api: Api.admin.getTaskblockList, api: Api.admin.getTaskblockList,
callback: (data) => { callback: (data) => {
Object.assign(vo, data); Object.assign(vo, data);
} }
}); });
const taskBlockCancel = async (id) => {
const {msg} = await Api.admin.taskBlockCancel({id});
Message.success(msg);
await fetchData();
}
</script> </script>
<template> <template>
@@ -118,9 +124,15 @@ const {loading, pagination, initFetchData} = useTableQuery({
:loading="loading" :loading="loading"
:columns="columns" :columns="columns"
class="flex-grow"> class="flex-grow">
<template v-slot:action> <template v-slot:xg="{record}">
<div v-if="record.type === 1">对方此账号不能接我任务</div>
<div v-else>对方所有账号不能接我任务</div>
</template>
<template v-slot:action="{record}">
<div class="flex gap-[20px]"> <div class="flex gap-[20px]">
<a-link :hoverable="false">取消拉黑</a-link> <a-link :disabled="record.is_cancel===1" :hoverable="false" @click="taskBlockCancel(record.id)">
{{ record.is_cancel ? record.is_cancel_text : '取消拉黑' }}
</a-link>
</div> </div>
</template> </template>
</a-table> </a-table>

View File

@@ -3,6 +3,7 @@ import Filter from "../../../../components/Filter/index.vue";
import {reactive} from "vue"; import {reactive} from "vue";
import useTableQuery from "../../../../hooks/useTableQuery.js"; import useTableQuery from "../../../../hooks/useTableQuery.js";
import Api from "../../../../api/index.js"; import Api from "../../../../api/index.js";
import {Message} from "@arco-design/web-vue";
const columns = [ const columns = [
{ {
@@ -106,13 +107,30 @@ const vo = reactive({
total: 0, total: 0,
}); });
const {loading, pagination, initFetchData} = useTableQuery({ const {loading, pagination, initFetchData, fetchData} = useTableQuery({
parameter: po, parameter: po,
api: Api.admin.getWithdrawllogList, api: Api.admin.getWithdrawllogList,
callback: (data) => { callback: (data) => {
Object.assign(vo, data); Object.assign(vo, data);
} }
}); });
const withdrawallogTranfer = async (item) => {
const {msg} = await Api.admin.withdrawallogTranfer({
id: item.id
});
Message.success(msg);
await fetchData();
}
const changeWithdrawalLogAddRemark = async (content, item) => {
const {msg} = await Api.admin.withdrawalLogAddRemark({
id: item.id,
content: content,
});
Message.success(msg);
await fetchData();
}
</script> </script>
<template> <template>
@@ -172,11 +190,13 @@ const {loading, pagination, initFetchData} = useTableQuery({
<div v-if="record.status===-1" class="status danger">{{ record.status_text }}</div> <div v-if="record.status===-1" class="status danger">{{ record.status_text }}</div>
<div v-if="record.status===1" class="status primary">{{ record.status_text }}</div> <div v-if="record.status===1" class="status primary">{{ record.status_text }}</div>
</template> </template>
<template v-slot:action> <template v-slot:action="{record}">
<a-link :hoverable="false">打款</a-link> <a-link :hoverable="false" @click="withdrawallogTranfer(record)">打款</a-link>
</template> </template>
<template v-slot:remark="{record}"> <template v-slot:remark="{record}">
<a-input v-model:model-value="record.remark" class="w-full" placeholder="请输入备注信息"></a-input> <a-input @change="changeWithdrawalLogAddRemark($event, record)" v-model:model-value="record.remark"
class="w-full"
placeholder="请输入备注信息"></a-input>
</template> </template>
</a-table> </a-table>
</a-card> </a-card>

View File

@@ -4,23 +4,24 @@ import {computed, reactive} from "vue";
import useTableQuery from "../../../../hooks/useTableQuery.js"; import useTableQuery from "../../../../hooks/useTableQuery.js";
import Api from "../../../../api/index.js"; import Api from "../../../../api/index.js";
import LookBackfillModal from "./components/look-backfill-modal.vue"; import LookBackfillModal from "./components/look-backfill-modal.vue";
import Chat from "../../../../components/Chat/index.vue";
const columns = [ const columns = [
{ {
title: '任务编号', title: '任务编号',
dataIndex: 'name', dataIndex: 'code',
}, },
{ {
title: '任务名称', title: '任务名称',
dataIndex: 'name', dataIndex: 'goods_name',
}, },
{ {
title: '子任务编号', title: '子任务编号',
dataIndex: 'name', dataIndex: 'uid',
}, },
{ {
title: '领取时间', title: '领取时间',
dataIndex: 'name', dataIndex: 'accept_time',
align: 'center', align: 'center',
}, },
{ {
@@ -31,7 +32,7 @@ const columns = [
}, },
{ {
title: '达人账号', title: '达人账号',
dataIndex: 'name', dataIndex: 'account',
align: 'center', align: 'center',
}, },
{ {
@@ -55,16 +56,28 @@ const columns = [
]; ];
const FilterConfig = computed(() => [ const FilterConfig = computed(() => [
{ {
key: 'wd', key: 'name',
type: 'input', type: 'input',
label: '任务名称', label: '任务名称',
placeholder: '请输入任务名称' placeholder: '请输入任务名称'
}, },
{ {
key: 'wd', key: 'is_pay',
type: 'select', type: 'select',
label: '支付状态', label: '支付状态',
placeholder: '请选择支付状态' placeholder: '请选择支付状态',
api: async () => ({
data: [
{
id: 1,
name: '已支付',
},
{
id: 0,
name: '未支付',
},
]
})
}, },
{ // 占位 { // 占位
key: 'wd', key: 'wd',
@@ -72,26 +85,30 @@ const FilterConfig = computed(() => [
label: '', label: '',
}, },
{ {
key: 'wd', key: 'code',
type: 'input', type: 'input',
label: '任务编号', label: '任务编号',
placeholder: '请输入任务编号' placeholder: '请输入任务编号'
}, },
{ {
key: 'wd', key: 'childrencode',
type: 'input', type: 'input',
label: '子任务编号', label: '子任务编号',
placeholder: '请输入子任务编号' placeholder: '请输入子任务编号'
}, },
{ {
key: 'wd', key: 'account',
type: 'input', type: 'input',
label: '达人账号', label: '达人账号',
placeholder: '请输入达人账号' placeholder: '请输入达人账号'
}, },
]); ]);
const state = reactive({
showChat: false,
task: null,
})
const po = reactive({ const po = reactive({
wd: null, status: 0,
}); });
const vo = reactive({ const vo = reactive({
page: '', page: '',
@@ -100,7 +117,7 @@ const vo = reactive({
}); });
const {loading, pagination, initFetchData} = useTableQuery({ const {loading, pagination, initFetchData} = useTableQuery({
parameter: po, parameter: po,
api: Api.system.getData, api: Api.merchant.findTask,
callback: (data) => { callback: (data) => {
Object.assign(vo, data); Object.assign(vo, data);
} }
@@ -111,12 +128,12 @@ const {loading, pagination, initFetchData} = useTableQuery({
<!-- 沟通中心 --> <!-- 沟通中心 -->
<div id="Item-View"> <div id="Item-View">
<a-card> <a-card>
<Filter v-model:from="po" :config="FilterConfig" @search="initFetchData"></Filter> <Filter v-model:from="po" :config="FilterConfig" @search="initFetchData" @reset="po.status = 0"></Filter>
<a-tabs class="pt-[20px]" type="rounded"> <a-tabs class="pt-[20px]" type="rounded" v-model:active-key="po.status" @change="initFetchData">
<a-tab-pane title="待回复" :key="1"> <a-tab-pane title="待回复" :key="0">
</a-tab-pane> </a-tab-pane>
<a-tab-pane title="已完成" :key="2"> <a-tab-pane title="已完成" :key="1">
</a-tab-pane> </a-tab-pane>
</a-tabs> </a-tabs>
@@ -129,17 +146,26 @@ const {loading, pagination, initFetchData} = useTableQuery({
:columns="columns" :columns="columns"
:data="vo.rows"> :data="vo.rows">
<template v-slot:gtjd> <template v-slot:gtjd>
<div class="flex items-center gap-[8px] justify-center"> <div class="flex items-center gap-[8px] justify-center" v-if="po.status === 0">
<div class="bg-[#165DFF] w-[6px] aspect-square rounded-[50%]"></div> <div class="bg-[#165DFF] w-[6px] aspect-square rounded-[50%]"></div>
待回复 待回复
</div> </div>
<div class="flex items-center gap-[8px] justify-center" v-else>
<div class="bg-[#00B42A] w-[6px] aspect-square rounded-[50%]"></div>
已完成
</div>
</template> </template>
<template v-slot:htsj> <template v-slot:htsj>
<look-backfill-modal></look-backfill-modal> <look-backfill-modal></look-backfill-modal>
</template> </template>
<template v-slot:drfk> <template v-slot:drfk="{record}">
<a-badge :count="9" dot :dotStyle="{ width: '10px', height: '10px' }"> <a-badge :count="9" dot :dotStyle="{ width: '10px', height: '10px' }">
<a-link :hoverable="false">沟通记录</a-link> <a-link :hoverable="false" @click="async () => {
state.showChat = true;
const {data} = await Api.merchant.getChildrenInfo(record.id);
state.task = data;
}">沟通记录
</a-link>
</a-badge> </a-badge>
</template> </template>
<template v-slot:zfzt="{rowIndex}"> <template v-slot:zfzt="{rowIndex}">
@@ -150,6 +176,11 @@ const {loading, pagination, initFetchData} = useTableQuery({
</div> </div>
</a-card> </a-card>
</div> </div>
<Chat
:task="state.task"
v-model:visible="state.showChat">
</Chat>
</template> </template>
<style scoped> <style scoped>

View File

@@ -4,10 +4,14 @@ import Api from "../../../../../api";
import XImage from "../../../../../components/XImage/Index.vue"; import XImage from "../../../../../components/XImage/Index.vue";
import UploadButton from "../../../../../components/upload/UploadButton.vue"; import UploadButton from "../../../../../components/upload/UploadButton.vue";
const {task} = defineProps({ const {task, disabled} = defineProps({
task: { task: {
type: Object, type: Object,
default: {}, default: {},
},
disabled: {
type: Boolean,
default: false,
} }
}); });
const visible = ref(false); const visible = ref(false);
@@ -66,7 +70,7 @@ const confirmTask = () => {
</script> </script>
<template> <template>
<a-link @click="visible = true" :hoverable="false" status="success"> <a-link @click="visible = true" :hoverable="false" :disabled="disabled" status="success">
确认结算 确认结算
</a-link> </a-link>

View File

@@ -42,6 +42,11 @@ const success = async () => {
} }
}); });
} }
const getChooseContent = async (req) => {
const {data} = await Api.merchant.getChooseContent(req);
return {data: data.filter(v => form.value.backfill.map(v => v.content_id).includes(v.id))};
}
</script> </script>
<template> <template>
@@ -83,7 +88,7 @@ const success = async () => {
:init="true" :init="true"
:api-po="{id: form.platform_id}" :api-po="{id: form.platform_id}"
v-model:model-value="form.back_id" v-model:model-value="form.back_id"
:api="Api.merchant.getChooseContent"> :api="getChooseContent">
</XSelect> </XSelect>
且审核通过 且审核通过
</a-form-item> </a-form-item>

View File

@@ -77,6 +77,11 @@ const state = reactive({
}) })
const vo = reactive({ const vo = reactive({
limit: {
title_limit: 0,
desc_limit: 0,
tags_limit: 0,
},
page: '', page: '',
rows: [], rows: [],
total: 0, total: 0,
@@ -199,13 +204,13 @@ const passTask = async (id, task_backfill_id) => {
</template> </template>
<template v-slot:payStatus="{record}"> <template v-slot:payStatus="{record}">
<settlement :task="record"></settlement> <settlement :task="record" :disabled="record.is_settlement > 0"></settlement>
</template> </template>
<template v-slot:action2="{record}"> <template v-slot:action2="{record}">
<div class="flex gap-[16px] justify-center items-center"> <div class="flex gap-[16px] justify-center items-center">
<PreviewTaskMaterialModal title="查看素材" :task="record" @success="fetchData"> <PreviewTaskMaterialModal title="查看素材" :task="record" @success="fetchData">
<a-link :hoverable="false">查看素材</a-link> <a-link :hoverable="false" :disabled="record.check_status === 1">查看素材</a-link>
</PreviewTaskMaterialModal> </PreviewTaskMaterialModal>
<a-dropdown> <a-dropdown>
<a-link :hoverable="false"> <a-link :hoverable="false">

View File

@@ -81,7 +81,7 @@ const editMaterial = (index) => {
const success = async () => { const success = async () => {
const {msg} = await Api.merchant.editChildrenMaterimal({ const {msg} = await Api.merchant.editChildrenMaterimal({
id: vo.rows[0]?.task_id, id: vo.rows[0]?.task_id,
data: vo.rows.map(v => v.childrenMaterial.map(k => ({ data: vo.rows.filter(v => v.status !== 1).map(v => v.childrenMaterial.map(k => ({
id: k.id, id: k.id,
title: k.title, title: k.title,
content: k.content, content: k.content,