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) => {
return request({
url: '/admin/taskblock/getList',
url: '/admin/TaskBlock/getList',
method: Method.POST,
data: data
});
@@ -651,6 +651,27 @@ const admin = {
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;

View File

@@ -540,6 +540,20 @@ const merchant = {
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;

View File

@@ -26,7 +26,7 @@ const emits = defineEmits(['success']);
</a-alert>
<div class="flex">
<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 class="w-[280px] h-auto flex flex-col bg-[#F2F3F5] gap-[20px]" v-if="task">
<div class="bg-white p-[20px]">

View File

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

View File

@@ -3,53 +3,53 @@ import Filter from "../../../../components/Filter/index.vue";
import {reactive} from "vue";
import useTableQuery from "../../../../hooks/useTableQuery.js";
import Api from "../../../../api/index.js";
import {Message} from "@arco-design/web-vue";
const columns = [
{
title: '商家ID',
dataIndex: 'key',
dataIndex: 'b_uid',
},
{
title: '渠道',
dataIndex: 'key',
dataIndex: 'name',
},
{
title: '达人ID',
dataIndex: 'key',
dataIndex: 'u_uid',
},
{
title: '推广账号ID',
dataIndex: 'image',
slotName: 'image',
dataIndex: 'a_uid',
},
{
title: '推广账号',
dataIndex: 'image',
slotName: 'image',
dataIndex: 'account',
},
{
title: '拉黑原因',
dataIndex: 'key',
dataIndex: 'remark',
},
{
title: '拉黑效果',
dataIndex: 'key',
dataIndex: 'xg',
slotName: 'xg',
},
{
title: '开始日期',
dataIndex: 'key',
dataIndex: 'createtime',
},
{
title: '结束日期',
dataIndex: 'key',
dataIndex: 'endtime',
},
{
title: '关联任务ID',
dataIndex: 'key',
dataIndex: 'task_id',
},
{
title: '关联子任务ID',
dataIndex: 'key',
dataIndex: 'task_children_id',
},
{
title: '操作',
@@ -93,13 +93,19 @@ const vo = reactive({
total: 0,
});
const {loading, pagination, initFetchData} = useTableQuery({
const {loading, pagination, initFetchData, fetchData} = useTableQuery({
parameter: po,
api: Api.admin.getTaskblockList,
callback: (data) => {
Object.assign(vo, data);
}
});
const taskBlockCancel = async (id) => {
const {msg} = await Api.admin.taskBlockCancel({id});
Message.success(msg);
await fetchData();
}
</script>
<template>
@@ -118,9 +124,15 @@ const {loading, pagination, initFetchData} = useTableQuery({
:loading="loading"
:columns="columns"
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]">
<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>
</template>
</a-table>

View File

@@ -3,6 +3,7 @@ import Filter from "../../../../components/Filter/index.vue";
import {reactive} from "vue";
import useTableQuery from "../../../../hooks/useTableQuery.js";
import Api from "../../../../api/index.js";
import {Message} from "@arco-design/web-vue";
const columns = [
{
@@ -106,13 +107,30 @@ const vo = reactive({
total: 0,
});
const {loading, pagination, initFetchData} = useTableQuery({
const {loading, pagination, initFetchData, fetchData} = useTableQuery({
parameter: po,
api: Api.admin.getWithdrawllogList,
callback: (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>
<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 primary">{{ record.status_text }}</div>
</template>
<template v-slot:action>
<a-link :hoverable="false">打款</a-link>
<template v-slot:action="{record}">
<a-link :hoverable="false" @click="withdrawallogTranfer(record)">打款</a-link>
</template>
<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>
</a-table>
</a-card>

View File

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

View File

@@ -4,10 +4,14 @@ import Api from "../../../../../api";
import XImage from "../../../../../components/XImage/Index.vue";
import UploadButton from "../../../../../components/upload/UploadButton.vue";
const {task} = defineProps({
const {task, disabled} = defineProps({
task: {
type: Object,
default: {},
},
disabled: {
type: Boolean,
default: false,
}
});
const visible = ref(false);
@@ -66,7 +70,7 @@ const confirmTask = () => {
</script>
<template>
<a-link @click="visible = true" :hoverable="false" status="success">
<a-link @click="visible = true" :hoverable="false" :disabled="disabled" status="success">
确认结算
</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>
<template>
@@ -83,7 +88,7 @@ const success = async () => {
:init="true"
:api-po="{id: form.platform_id}"
v-model:model-value="form.back_id"
:api="Api.merchant.getChooseContent">
:api="getChooseContent">
</XSelect>
且审核通过
</a-form-item>

View File

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

View File

@@ -81,7 +81,7 @@ const editMaterial = (index) => {
const success = async () => {
const {msg} = await Api.merchant.editChildrenMaterimal({
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,
title: k.title,
content: k.content,