This commit is contained in:
2025-06-21 19:27:06 +08:00
parent e50aa7cbdf
commit 9abc42de68
17 changed files with 370 additions and 99 deletions

View File

@@ -714,6 +714,69 @@ const admin = {
data: data,
});
},
addChildrenComment: async (data) => {
return request({
url: '/admin/TaskChildren/addChildrenComment',
method: Method.POST,
data: data,
});
},
getChildrenComment: async (id) => {
return request({
url: '/admin/TaskChildren/getChildrenComment',
method: Method.POST,
data: {id},
});
},
delChildrenComment: async (id) => {
return request({
url: '/admin/TaskChildren/delChildrenComment',
method: Method.POST,
data: {id},
});
},
passChildrenMaterial: async (data) => {
return request({
url: '/admin/TaskChildren/passChildrenMaterial',
method: Method.POST,
data: data,
});
},
getBackinfo: async (data) => {
return request({
url: '/admin/intervention/getBackinfo',
method: Method.POST,
data: data,
});
},
checkSettlement: async (data) => {
return request({
url: '/admin/intervention/checkSettlement',
method: Method.POST,
data: data,
});
},
settlement: async (data) => {
return request({
url: '/admin/intervention/settlement',
method: Method.POST,
data: data,
});
},
editStatus: async (data) => {
return request({
url: '/admin/intervention/editStatus',
method: Method.POST,
data: data,
});
},
stopTaskChildren: async (id) => {
return request({
url: '/admin/TaskChildren/stopTaskChildren',
method: Method.POST,
data: {id},
});
},
}
export default admin;

View File

@@ -575,6 +575,13 @@ const merchant = {
data: data
});
},
intervention: async (data) => {
return request({
url: '/index/task/intervention',
method: Method.POST,
data: data
});
},
}
export default merchant;

View File

@@ -79,6 +79,13 @@ const addIntervention = async () => {
await fetchData();
emits('success')
}
const intervention = async () => {
const {msg} = await Api.merchant.intervention({...form, id: task.id});
Message.success(msg);
await fetchData();
emits('success')
}
</script>
<template>
@@ -114,7 +121,7 @@ const addIntervention = async () => {
</div>
</div>
<div v-if="SystemStore.isRoot && vo.info?.id" class="flex justify-center">
<div v-if="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]">
@@ -126,7 +133,7 @@ const addIntervention = async () => {
</div>
</div>
<div class="font-bold text-[#1D2129] mt-[20px] mb-[6px]">平台处理结果:</div>
<div id="ROOT" class="flex flex-col justify-center items-center">
<div id="ROOT" class="flex flex-col justify-center items-center" v-if="SystemStore.isRoot">
<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">
@@ -147,6 +154,14 @@ const addIntervention = async () => {
</div>
<a-button type="primary" class="mt-[10px]" @click="addIntervention">平台介入</a-button>
</div>
<div v-else class="px-[16px] py-[12px] bg-[#F7F8FA]">
<div>
{{ vo.info.intro }}
</div>
<div class="grid grid-cols-5 gap-[12px] mt-[4px]">
<x-image hideDelete v-for="v in vo.info.intro_image_arr" :src="v"></x-image>
</div>
</div>
</a-card>
</div>
</div>
@@ -165,7 +180,7 @@ const addIntervention = async () => {
</template>
发送
</a-button>
<a-button class="absolute right-[110px] bottom-[12px] z-[2]">
<a-button class="absolute right-[110px] bottom-[12px] z-[2]" @click="intervention">
<template #icon>
<icon-robot/>
</template>

View File

@@ -5,7 +5,9 @@ import Information from "./Information.vue";
import dayjs from "dayjs";
import Api from "../../api/index.js";
import {Message} from "@arco-design/web-vue";
import {useSystemStore} from "../../pinia/SystemStore/index.js";
const SystemStore = useSystemStore();
const InformationRef = ref();
const {task} = defineProps({
task: {
@@ -57,16 +59,18 @@ const changeStatus = async () => {
</div>
<div class="w-[280px] h-auto flex flex-col bg-[#F2F3F5] gap-[20px]" v-if="task">
<div class="bg-white p-[20px]">
<template v-if="!SystemStore.isRoot">
<div class="mb-[20px] text-[16px]">进度管理</div>
<x-select v-model:model-value="task.is_reply" placeholder="待回复" :api="getStatus"
@change="changeStatus" :init="true"></x-select>
<a-divider></a-divider>
</template>
<div class="mb-[20px] text-[16px]">进度管理</div>
<div class="grid grid-cols-2 gap-y-[12px]">
<div class="text-[#86909C]">创建时间</div>
<div class="#1D2129">{{ dayjs(task.createtime * 1000).format('MM-DD HH:mm') }}</div>
<div class="text-[#86909C]">任务编号</div>
<div class="#1D2129">{{ task.taskcode }}</div>
<div class="#1D2129">{{ task?.taskcode || task.m_code }}</div>
<div class="text-[#86909C]">子任务编号</div>
<div class="#1D2129">{{ task.uid }}</div>
<div class="text-[#86909C]">子任务状态</div>

View File

@@ -2,8 +2,10 @@
import {computed} from "vue";
import Api from "../../api/index.js";
import {Message} from "@arco-design/web-vue";
import {useSystemStore} from "../../pinia/SystemStore/index.js";
const emits = defineEmits(['success']);
const SystemStore = useSystemStore();
const {data, hideDelete} = defineProps({
data: {
type: Object,
@@ -16,7 +18,8 @@ const {data, hideDelete} = defineProps({
});
const list = computed(() => data?.flatMap(v => v.children ? [v, ...v.children] : [v]));
const del = async (id) => {
const {msg} = await Api.merchant.delChildrenComment(id);
const api = SystemStore.isRoot ? Api.admin.delChildrenComment : Api.merchant.delChildrenComment;
const {msg} = await api(id);
Message.success(msg);
emits('success');
}

View File

@@ -5,8 +5,12 @@ import Api from "../../api/index.ts";
import {Message} from "@arco-design/web-vue";
import Comment from "../Comment/index.vue";
import Talk from "../Talk/index.vue";
import AddMaterial from "../../pages/merchant/components/AddMaterial.vue";
import AddComment from "../../pages/merchant/components/AddComment.vue";
import RejectTaskModal from "../../pages/manage/pages/manage-reward-mission/components/RejectTaskModal.vue";
const emits = defineEmits(['success']);
const selecdKey = ref([]);
const {id} = defineProps({
id: {
type: Number,
@@ -17,23 +21,66 @@ const visible = ref(false);
const detail = reactive({});
const activeKey = ref(0);
const getData = async (update) => {
Api.admin.getTaskChildrenInfo(id).then(({data}) => {
if (update) {
detail.content.forEach((v, index) => {
v.comment = data.content[index].comment;
});
} else {
Object.assign(detail, data);
}
});
}
watch(
() => visible.value,
(val) => {
if (val) Api.admin.getTaskChildrenInfo(id).then(({data}) => {
Object.assign(detail, data);
console.log('我看看我看看', data);
});
if (val) getData();
},
{deep: true}
)
const passTaskChildren = async () => {
const {code, msg} = await Api.admin.passTaskChildren(id);
if (code === 1) Message.success(msg);
console.log(selecdKey.value);
const pro_list = [];
if (selecdKey.value.length === 0) {
pro_list.push(new Promise((reactive, reject) => {
Api.admin.passChildrenMaterial(detail.content[activeKey.value]).then((res) => {
reactive(res);
}).catch((err) => {
reject(err);
})
}));
}
selecdKey.value.forEach(v => {
pro_list.push(new Promise((reactive, reject) => {
Api.admin.passChildrenMaterial(v).then((res) => {
reactive(res);
}).catch((err) => {
reject(err);
})
}));
})
const res = await Promise.all(pro_list);
let flag = true;
for (const v of res) {
if (v.code !== 1) {
Message.warning(v.msg)
flag = false;
}
}
if (flag) {
Message.success(res[0].msg);
visible.value = false;
emits('success');
}
}
const refuseTaskChildren = async () => {
const {code, msg} = await Api.admin.refuseTaskChildren(id);
@@ -57,41 +104,66 @@ const refuseTaskChildren = async () => {
<a-tab-pane v-for="(item, index) in detail.content" :title="`素材${index+1}`" :key="index">
<a-form
layout="vertical">
<a-form-item label="标题">
<a-input v-model:model-value="item.title" :disabled="detail.check_status !== 0"></a-input>
<a-form-item label="标题" v-if="item?.material_type?.title_limit > 0">
<a-input v-model:model-value="item.title" :disabled="detail.check_status !== 0"
:max-length="item.material_type.title_limit"></a-input>
</a-form-item>
<a-form-item label="正文">
<a-form-item label="正文" v-if="item?.material_type?.desc_limit > 0">
<a-textarea
auto-size
:max-length="1000"
v-model:model-value="item.content"
:max-length="item.material_type.desc_limit"
show-word-limit
:disabled="detail.check_status !== 0"
:model-value="item.content">
</a-textarea>
</a-form-item>
<a-form-item label="话题">
<Talk v-model:model-value="item.tags_arr" :disabled="detail.check_status !== 0"></Talk>
<a-form-item label="话题" v-if="item?.material_type?.tags_limit > 0">
<Talk v-model:model-value="item.tags" :disabled="detail.check_status !== 0"
:limit="item?.material_type?.tags_limit"></Talk>
</a-form-item>
<a-form-item label="素材">
<div v-if="item.materia_arr.length > 0" class="flex flex-wrap gap-[16px]">
<div class="flex flex-wrap gap-[16px]">
<x-image
v-for="(v, index) in item.materia_arr"
v-for="(v, index) in item.material"
@delete="item.material.splice(index, 1)"
:hide-delete="detail.check_status !== 0"
:key="index"
width="60px"
height="60px"
:src="v">
</x-image>
<add-material
v-if="detail.check_status === 0"
@success="val => item.material = val"
ref="AddMaterialRef"
:id="item.task_id"
:material="item">
<div
class="size-[60px] bg-[#F2F3F5] flex justify-center items-center flex-col rounded-[8px] cursor-pointer">
<icon-plus/>
<div>添加</div>
</div>
<div v-else>
暂无素材
</add-material>
</div>
</a-form-item>
<a-form-item label="评论区内容">
<div v-if="item?.comment?.length > 0" class="flex flex-col gap-[8px] w-full">
<comment :data="item.comment" :hide-delete="true"></comment>
<div class="flex-grow">
<div v-if="item.comment.length > 0" class="flex flex-col gap-[8px] w-full mb-[12px]">
<comment :data="item.comment" :hide-delete="detail.check_status !== 0"
@success="getData(true)"></comment>
</div>
<add-comment
v-if="detail.check_status === 0"
@success="getData(true)"
:material="{id: id}"
:item="item">
<a-button>
<icon-plus/>
<div>添加评论</div>
</a-button>
</add-comment>
</div>
</a-form-item>
</a-form>
@@ -100,16 +172,25 @@ const refuseTaskChildren = async () => {
<template #footer>
<div class="flex items-center gap-[8px]">
<!-- <a-checkbox-group>-->
<!-- <template v-for="(item, index) in detail.content" :key="item">-->
<!-- <a-checkbox v-show="activeKey === index" :value="item">选中</a-checkbox>-->
<!-- </template>-->
<!-- </a-checkbox-group>-->
<a-checkbox-group v-model:model-value="selecdKey">
<template v-for="(item, index) in detail.content" :key="item">
<a-checkbox v-show="activeKey === index" :value="item">选中
</a-checkbox>
</template>
</a-checkbox-group>
<template v-if="detail.check_status === 0">
<a-button @click="passTaskChildren" type="primary" class="ml-auto">通过
</a-button>
<a-button @click="refuseTaskChildren">拒绝</a-button>
<RejectTaskModal
:api="Api.admin.refuseTaskChildren"
:id="detail.id"
@success="() => {
visible = false;
emits('success')
}">
<a-button>拒绝</a-button>
</RejectTaskModal>
</template>
<a-button v-else @click="visible=false" class="ml-auto">关闭</a-button>
</div>

View File

@@ -34,7 +34,11 @@ const success = async () => {
</script>
<template>
<a-link :hoverable="false" status="danger" @click="visible=true" :disabled="disabled">拒绝</a-link>
<a-link v-if="!$slots.default" :hoverable="false" status="danger" @click="visible=true" :disabled="disabled">拒绝
</a-link>
<div v-else @click="visible=true">
<slot></slot>
</div>
<a-modal
title-align="start"

View File

@@ -147,7 +147,17 @@ const refuseTaskChildren = async (id) => {
:id="record.id"
@success="fetchData">
</RejectTaskModal>
<a-link :hoverable="false" status="danger" @click="openTerminateTask">终止子任务</a-link>
<a-link
:hoverable="false"
status="danger"
@click="openTerminateTask({
Api: Api.admin.stopTaskChildren,
status_text: record.stattus_text,
type: record.status === 6 || record.status === 4 ? 'warning' : 'success',
taskId: record.id,
callback: fetchData,
})">终止子任务
</a-link>
</div>
</template>
</a-table>

View File

@@ -60,35 +60,37 @@ const columns = [
];
const FilterConfig = [
{
key: 'wd',
key: 'm_code',
type: 'input',
label: '任务编号',
placeholder: '请输入任务编号',
},
{
key: 'wd',
key: 'uid',
type: 'input',
label: '子任务编号',
placeholder: '请输入子任务编号',
},
{
key: 'wd',
key: 'status',
type: 'select',
label: '标签',
placeholder: '请选择标签',
label: '审核状态',
placeholder: '请选择审核状态',
span: 6,
api: async () => {
return await Api.admin.getStatusAttr();
},
},
{
key: 'wd',
key: 'bid',
type: 'input',
label: '商家ID',
placeholder: '请输入商家ID',
},
{
key: 'rangeTime',
start: 'start_time',
end: 'end_time',
type: 'datetime',
label: '创建日期',
}
@@ -147,6 +149,7 @@ const refuseExchangeAll = async () => {
<!-- 免审审核 -->
<a-card>
<Filter
@search="initFetchData"
v-model:from="po"
:config="FilterConfig">
</Filter>

View File

@@ -5,6 +5,10 @@ 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";
import LookBackfillModal from "../../../merchant/pages/communication-center/components/look-backfill-modal.vue";
import Settlement from "../../../merchant/pages/task-center/components/Settlement.vue";
import XTagSelect from "../../../../components/XSelect/XTagSelect.vue";
import {Message} from "@arco-design/web-vue";
const columns = [
{
@@ -154,12 +158,37 @@ const {loading, pagination, initFetchData, fetchData} = useTableQuery({
Object.assign(vo, data);
}
});
const getStatus = () => Promise.resolve({
data: [
{
id: 0,
name: '未处理',
color: 'green',
},
{
id: 1,
name: '已处理',
color: 'cyan',
},
]
});
const changeStatus = async (record) => {
const {msg} = await Api.admin.editStatus({
id: record.id,
status: record.status,
});
Message.success(msg);
await fetchData();
}
</script>
<template>
<!-- 平台介入 -->
<a-card>
<Filter
@search="initFetchData"
v-model:from="po"
:config="FilterConfig">
<template v-slot:deduct>
@@ -197,16 +226,23 @@ const {loading, pagination, initFetchData, fetchData} = useTableQuery({
state.task = data;
}">沟通记录
</a-link>
<a-link :hoverable="false">查看回填</a-link>
<a-link :hoverable="false" status="success">确认结算</a-link>
<look-backfill-modal :item="record"></look-backfill-modal>
<settlement :task="record" :disabled="record.is_settlement === 2"
@success="fetchData"></settlement>
</div>
</template>
<template v-slot:why>
<template v-slot:why="{record}">
<settlement :yy="true" :task="record" :disabled="record.is_settlement > 0" @success="fetchData">
<a-link :hoverable="false">原因</a-link>
</settlement>
</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>
<XTagSelect
@change="changeStatus(record)"
v-model:model-value="record.status"
:api="getStatus"
init>
</XTagSelect>
</template>
<template v-slot:settlement="{record}">
<div v-if="record.status===2" class="status success">{{ record.settlement_text }}</div>

View File

@@ -4,7 +4,9 @@ import {reactive, ref} from "vue";
import UploadAvatar from "../../../components/upload/UploadAvatar.vue";
import Api from "../../../api/index.js";
import {Message} from "@arco-design/web-vue";
import {useSystemStore} from "../../../pinia/SystemStore/index.js";
const SystemStore = useSystemStore();
const emits = defineEmits(['success']);
const {item, material} = defineProps({
item: {
@@ -24,7 +26,8 @@ const form = reactive({
});
const visible = ref(false);
const success = async () => {
const {msg} = await Api.merchant.addChildrenComment({
const api = SystemStore.isRoot ? Api.admin.addChildrenComment : Api.merchant.addChildrenComment;
const {msg} = await api({
id: material.id,
material_id: item.id,
pid: form.pid,
@@ -34,6 +37,7 @@ const success = async () => {
});
Message.success(msg);
Object.keys(form).forEach(key => form[key] = null);
form.files = [];
form.is_reply = 0;
visible.value = false;
emits('success');
@@ -65,14 +69,14 @@ const success = async () => {
:disabled="form.is_reply===0"
v-model:model-value="form.pid"
:apiPo="item.id"
:api="Api.merchant.getChildrenComment">
:api="SystemStore.isRoot ? Api.admin.getChildrenComment : Api.merchant.getChildrenComment">
</x-select>
</a-form-item>
<a-form-item label="添加图片">
<UploadAvatar
:multiple="false"
v-model:files="form.files"
:api="Api.system.uploadFile2">
:api="SystemStore.isRoot ? Api.system.uploadFile : Api.system.uploadFile2">
</UploadAvatar>
</a-form-item>
<a-form-item label="添加文字">

View File

@@ -5,7 +5,9 @@ import UploadButton from "../../../components/upload/UploadButton.vue";
import Api from "../../../api/index.js";
import {v4} from "uuid";
import MaterialSource from "./MaterialSource.vue";
import {useSystemStore} from "../../../pinia/SystemStore/index.js";
const SystemStore = useSystemStore();
const MaterialSourceRef = ref();
const visible = ref(false);
const targetList = reactive([]);
@@ -32,7 +34,7 @@ watch(
() => visible.value,
(val) => {
if (val) {
MaterialSourceRef.value.getMaterialList();
MaterialSourceRef.value?.getMaterialList();
targetList.length = 0;
material.material?.forEach(v => uploadSuccess(v));
}
@@ -85,7 +87,8 @@ const success = async () => {
<div class="mt-[20px]">
<div class="text-[#1D2129] text-[14px] mb-[12px]">从本地添加</div>
<UploadButton :multiple="true" :api="Api.system.uploadFile2" @success="uploadSuccess">
<UploadButton :multiple="true" :api="SystemStore.isRoot ? Api.system.uploadFile : Api.system.uploadFile2"
@success="uploadSuccess">
<template #upload-button>
<a-button>
<template #icon>
@@ -97,7 +100,7 @@ const success = async () => {
</UploadButton>
</div>
<div class="mt-[20px]">
<div class="mt-[20px]" v-if="!SystemStore.isRoot">
<div class="text-[#1D2129] text-[14px] mb-[12px]">从素材库添加</div>
<MaterialSource
ref="MaterialSourceRef"

View File

@@ -1,11 +1,14 @@
<script setup>
import {reactive, ref} from 'vue';
import {computed, reactive, ref} from 'vue';
import RefuseModal from "../../task-center/components/RefuseModal.vue";
import OriginTag from "../../../../../components/OriginTag/index.vue";
import Api from "../../../../../api/index.js";
import {Message} from "@arco-design/web-vue";
import {useSystemStore} from "../../../../../pinia/SystemStore/index.js";
const columns = [
const SystemStore = useSystemStore();
const columns = computed(() => {
const temp = [
{
title: '回传数据',
dataIndex: 'backData',
@@ -22,6 +25,9 @@ const columns = [
slotName: 'backStatus',
},
];
if (SystemStore.isRoot) temp.splice(1, 1);
return temp;
});
const {item} = defineProps({
item: {
type: Object,
@@ -32,7 +38,9 @@ const visible = ref(false);
const data = reactive([]);
const getData = async () => {
const {data: _data} = await Api.merchant.getBackinfo({id: item.id});
const api = SystemStore.isRoot ? Api.admin.getBackinfo : Api.merchant.getBackinfo;
const id = SystemStore.isRoot ? item.tc_id : item.id;
const {data: _data} = await api({id: id});
data.length = 0;
data.push(..._data);
}
@@ -65,7 +73,7 @@ const passTask = async (id, task_backfill_id) => {
:columns="columns">
<template v-slot:backData="{record}">
<div class="flex flex-col">
<a-link v-for="v in record.back.content_arr" :hoverable="false" :href="v">{{ v }}</a-link>
<a-link v-for="v in record.back?.content_arr" :hoverable="false" :href="v">{{ v }}</a-link>
</div>
</template>

View File

@@ -116,7 +116,7 @@ const vo = reactive({
rows: [],
total: 0,
});
const {loading, pagination, initFetchData} = useTableQuery({
const {loading, pagination, initFetchData, fetchData} = useTableQuery({
parameter: po,
api: Api.merchant.findTask,
callback: (data) => {
@@ -172,15 +172,16 @@ const {loading, pagination, initFetchData} = useTableQuery({
<template v-slot:drfk="{record}">
<a-badge :count="record.is_read" dot :dotStyle="{ width: '10px', height: '10px' }">
<a-link :hoverable="false" @click="async () => {
state.showChat = true;
const {data} = await Api.merchant.getChildrenInfo(record.id);
state.showChat = true;
state.task = data;
}">沟通记录
</a-link>
</a-badge>
</template>
<template v-slot:zfzt="{record}">
<settlement :task="record" :disabled="record.is_settlement > 0"></settlement>
<settlement :task="record" :disabled="record.is_settlement > 0"
@success="fetchData"></settlement>
</template>
</a-table>
</div>

View File

@@ -3,8 +3,12 @@ import {reactive, ref, watch} from "vue";
import Api from "../../../../../api";
import XImage from "../../../../../components/XImage/Index.vue";
import UploadButton from "../../../../../components/upload/UploadButton.vue";
import {Message} from "@arco-design/web-vue";
import {useSystemStore} from "../../../../../pinia/SystemStore/index.js";
const {task, disabled} = defineProps({
const SystemStore = useSystemStore();
const emits = defineEmits(['success']);
const {task, disabled, yy} = defineProps({
task: {
type: Object,
default: {},
@@ -12,6 +16,10 @@ const {task, disabled} = defineProps({
disabled: {
type: Boolean,
default: false,
},
yy: {
type: Boolean,
default: false,
}
});
const visible = ref(false);
@@ -47,37 +55,56 @@ const selectedKeys = ref([]);
watch(
() => visible.value,
(val) => {
if (val) Api.merchant.getTaskSettltment({id: task.task_id}).then(({data}) => {
if (val) {
const api = SystemStore.isRoot ? Api.admin.checkSettlement : Api.merchant.getTaskSettltment;
api({id: task.task_id || task.id}).then(({data}) => {
TaskSettltment.length = 0;
TaskSettltment.push(...data.map((v, index) => ({
...v,
key: index,
images: [],
key: v.id,
images: v?.images ? [...v.images] : [],
})));
if (yy) {
selectedKeys.value = data.filter(v => v.is_check === 1).map(v => v.id);
console.log(selectedKeys.value);
}
});
}
}
)
const confirmTask = () => {
Api.merchant.confirmTask({
const confirmTask = async () => {
const api = SystemStore.isRoot ? Api.admin.settlement : Api.merchant.confirmTask
const {msg} = await api({
id: task.id,
content: TaskSettltment.filter((v, index) => selectedKeys.value.includes(index)).map(v => ({
content: TaskSettltment.filter(v => selectedKeys.value.includes(v.id)).map(v => ({
...v,
id: v.id,
images: v.images,
})),
});
Message.success(msg);
emits('success');
}
</script>
<template>
<a-link @click="visible = true" :hoverable="false" :disabled="disabled" status="success">
<a-link v-if="!$slots.default" @click="visible = true" :hoverable="false" :disabled="disabled" status="success">
确认结算
</a-link>
<div v-else @click="visible = true">
<slot></slot>
</div>
<a-modal
width="800px"
title-align="start"
@ok="confirmTask"
:footer="!yy"
v-model:visible="visible">
<template v-slot:title>
<div>确认结算</div>
@@ -91,19 +118,21 @@ const confirmTask = () => {
:row-selection="rowSelection"
v-model:selectedKeys="selectedKeys">
<template v-slot:discount="{record}">
{{ record.discount.toFixed(2) }}
{{ record?.discount?.toFixed(2) }}
</template>
<template v-slot:images="{record}">
<div class="flex gap-[16px]">
<x-image
v-for="(v, index) in record.images"
:hide-delete="yy"
class="flex-shrink-0"
:key="index"
width="40px"
height="40px"
:src="v">
</x-image>
<upload-button :api="Api.system.uploadFile2" @success="e => record.images.push(e)">
<upload-button v-if="!yy" :api="SystemStore.isRoot ? Api.system.uploadFile : Api.system.uploadFile2"
@success="e => record.images.push(e)">
<template v-slot:upload-button>
<div
class="size-[40px] bg-[#F2F3F5] flex justify-center items-center flex-col rounded-[8px] cursor-pointer">
@@ -127,7 +156,7 @@ const confirmTask = () => {
</div>
<div class="text-[14px] text-[#4E5969]" v-if="selectedKeys.length > 0">
{{ task.coin / 100 }}
<span v-for="v in selectedKeys">- {{ TaskSettltment[v].discount }}</span>
<span v-for="v in selectedKeys">- {{ TaskSettltment.find(k => k.id === v)?.discount }}</span>
= {{
task.coin / 100
-

View File

@@ -115,7 +115,7 @@ const passTask = async (id, task_backfill_id) => {
<!-- 查看子任务 -->
<div class="mb-[20px]">
<a-breadcrumb
:routes="[{path: '/', label: '任务中心'}, {path: '/', label: '悬赏任务'}, {path: '/', label: '查看子任务'}]">
:routes="[{path: '/home/task-center', label: '任务中心'}, {path: '/reward-mission', label: '悬赏任务'}, {path: '/', label: '查看子任务'}]">
</a-breadcrumb>
</div>

View File

@@ -1,10 +1,10 @@
import {createMemoryHistory, createRouter} from 'vue-router';
import {createRouter, createWebHashHistory} from 'vue-router';
import routes from "./routes.js";
import {useUserStore} from "../pinia/UserStore/index.js";
import {useSystemStore} from "../pinia/SystemStore/index.js";
const router = createRouter({
history: createMemoryHistory(),
history: createWebHashHistory(),
routes,
})