update
This commit is contained in:
@@ -784,6 +784,20 @@ const admin = {
|
|||||||
data: {ids},
|
data: {ids},
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
tgAccountDetail: async (id) => {
|
||||||
|
return request({
|
||||||
|
url: '/admin/account/detail',
|
||||||
|
method: Method.POST,
|
||||||
|
data: {id},
|
||||||
|
});
|
||||||
|
},
|
||||||
|
tgAccountEdit: async (data) => {
|
||||||
|
return request({
|
||||||
|
url: '/admin/account/edit',
|
||||||
|
method: Method.POST,
|
||||||
|
data: data,
|
||||||
|
});
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
export default admin;
|
export default admin;
|
||||||
|
|||||||
@@ -393,6 +393,13 @@ const merchant = {
|
|||||||
data: data
|
data: data
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
jsTask: async (data) => {
|
||||||
|
return request({
|
||||||
|
url: '/index/task/jsTask',
|
||||||
|
method: Method.POST,
|
||||||
|
data: data
|
||||||
|
});
|
||||||
|
},
|
||||||
addExchangeLog: async (data) => {
|
addExchangeLog: async (data) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/index/task/addExchangeLog',
|
url: '/index/task/addExchangeLog',
|
||||||
|
|||||||
@@ -0,0 +1,112 @@
|
|||||||
|
<script setup>
|
||||||
|
import XSelect from "../../../../../components/XSelect/index.vue";
|
||||||
|
import {reactive, ref, watch} from "vue";
|
||||||
|
import Api from "../../../../../api/index.js";
|
||||||
|
import {Message} from "@arco-design/web-vue";
|
||||||
|
|
||||||
|
const emits = defineEmits(['success']);
|
||||||
|
const visible = ref(false);
|
||||||
|
const detail = reactive({});
|
||||||
|
const {id} = defineProps({
|
||||||
|
id: {
|
||||||
|
type: Number,
|
||||||
|
default: null,
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
watch(
|
||||||
|
() => visible.value,
|
||||||
|
(val) => {
|
||||||
|
if (val) Api.admin.tgAccountDetail(id).then(({data}) => {
|
||||||
|
data.abnormaltime = data.abnormaltime * 1000;
|
||||||
|
Object.assign(detail, data);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
const getState = async () => {
|
||||||
|
return {
|
||||||
|
data: [
|
||||||
|
{
|
||||||
|
id: -2,
|
||||||
|
name: '禁用'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 1,
|
||||||
|
name: '正常'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 2,
|
||||||
|
name: '异常'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: -1,
|
||||||
|
name: '未通过'
|
||||||
|
},
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const success = async () => {
|
||||||
|
const {msg} = await Api.admin.tgAccountEdit(detail);
|
||||||
|
Message.success(msg);
|
||||||
|
emits('success');
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<a-link :hoverable="false" @click="visible=true">编辑</a-link>
|
||||||
|
|
||||||
|
<a-modal
|
||||||
|
@ok="success"
|
||||||
|
ok-text="确定修改"
|
||||||
|
title="编辑"
|
||||||
|
title-align="start"
|
||||||
|
v-model:visible="visible">
|
||||||
|
<a-form layout="vertical">
|
||||||
|
<a-form-item label="ID">
|
||||||
|
<a-input :model-value="detail.uid" disabled placeholder="ID"></a-input>
|
||||||
|
</a-form-item>
|
||||||
|
<a-form-item label="账号">
|
||||||
|
<a-input v-model:model-value="detail.account" placeholder="昵称"></a-input>
|
||||||
|
</a-form-item>
|
||||||
|
<a-form-item label="昵称">
|
||||||
|
<a-input v-model:model-value="detail.nickname" placeholder="昵称"></a-input>
|
||||||
|
</a-form-item>
|
||||||
|
<a-form-item label="主页截图">
|
||||||
|
<div class="flex flex-wrap gap-[12px]">
|
||||||
|
<a-image
|
||||||
|
width="62px"
|
||||||
|
height="62px"
|
||||||
|
:src="detail.homepage">
|
||||||
|
</a-image>
|
||||||
|
</div>
|
||||||
|
</a-form-item>
|
||||||
|
<a-form-item label="主页二维码">
|
||||||
|
<div class="flex flex-wrap gap-[12px]">
|
||||||
|
<a-image
|
||||||
|
width="62px"
|
||||||
|
height="62px"
|
||||||
|
:src="detail.qrcode">
|
||||||
|
</a-image>
|
||||||
|
</div>
|
||||||
|
</a-form-item>
|
||||||
|
<a-form-item label="状态">
|
||||||
|
<x-select v-model:model-value="detail.status" :api="getState" init></x-select>
|
||||||
|
</a-form-item>
|
||||||
|
<a-form-item label="拒绝原因" v-if="detail.status < 0">
|
||||||
|
<a-input v-model:model-value="detail.remark" placeholder="拒绝原因"></a-input>
|
||||||
|
</a-form-item>
|
||||||
|
<a-form-item label="异常截止时间" v-if="detail.status === 2">
|
||||||
|
<a-date-picker class="w-full" v-model:model-value="detail.abnormaltime" showTime></a-date-picker>
|
||||||
|
</a-form-item>
|
||||||
|
<a-form-item label="添加日期">
|
||||||
|
<a-input v-model:model-value="detail.createtime" placeholder="添加日期" disabled></a-input>
|
||||||
|
</a-form-item>
|
||||||
|
</a-form>
|
||||||
|
</a-modal>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style scoped lang="scss">
|
||||||
|
|
||||||
|
</style>
|
||||||
@@ -5,6 +5,7 @@ import Api from "../../../../api/index.js";
|
|||||||
import Filter from "../../../../components/Filter/index.vue";
|
import Filter from "../../../../components/Filter/index.vue";
|
||||||
import RefuseModal from "./components/RefuseModal.vue";
|
import RefuseModal from "./components/RefuseModal.vue";
|
||||||
import {Message} from "@arco-design/web-vue";
|
import {Message} from "@arco-design/web-vue";
|
||||||
|
import EditTGInfoModal from "./components/EditTGInfoModal.vue";
|
||||||
|
|
||||||
const columns = [
|
const columns = [
|
||||||
{
|
{
|
||||||
@@ -135,7 +136,7 @@ const accept = async (id) => {
|
|||||||
</template>
|
</template>
|
||||||
<template v-slot:action="{record}">
|
<template v-slot:action="{record}">
|
||||||
<div class="flex gap-[20px]">
|
<div class="flex gap-[20px]">
|
||||||
<a-link :hoverable="false">编辑</a-link>
|
<EditTGInfoModal :id="record.id" @success="fetchData"></EditTGInfoModal>
|
||||||
<a-link :hoverable="false" status="success" @click="accept(record.id)">通过</a-link>
|
<a-link :hoverable="false" status="success" @click="accept(record.id)">通过</a-link>
|
||||||
<RefuseModal @success="fetchData" :id="record.id"></RefuseModal>
|
<RefuseModal @success="fetchData" :id="record.id"></RefuseModal>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import PreviewTaskModal from "../../../../components/PreviewTaskModal/PreviewTas
|
|||||||
import openTerminateTask from "../../../../components/TerminateTask/TerminateTask.js";
|
import openTerminateTask from "../../../../components/TerminateTask/TerminateTask.js";
|
||||||
import {Message} from "@arco-design/web-vue";
|
import {Message} from "@arco-design/web-vue";
|
||||||
import RejectTaskModal from "./components/RejectTaskModal.vue";
|
import RejectTaskModal from "./components/RejectTaskModal.vue";
|
||||||
|
import TooltipTag from "../../../../components/TooltipTag/index.vue";
|
||||||
|
|
||||||
const columns = [
|
const columns = [
|
||||||
{
|
{
|
||||||
@@ -145,13 +146,21 @@ const plTaskChildren = async () => {
|
|||||||
:columns="columns"
|
:columns="columns"
|
||||||
class="flex-grow">
|
class="flex-grow">
|
||||||
<template v-slot:status_text="{record}">
|
<template v-slot:status_text="{record}">
|
||||||
<a-tag v-if="record.status===0" color="cyan">{{ record.status_text }}</a-tag>
|
<TooltipTag v-if="record.status === 0" color="red" :content="record.check_remark">待上传素材
|
||||||
<a-tag v-if="record.status===1" color="orangered">{{ record.status_text }}</a-tag>
|
</TooltipTag>
|
||||||
<a-tag v-if="record.status===2" color="red">{{ record.status_text }}</a-tag>
|
<TooltipTag v-if="record.status === 1" color="orangered" :content="record.check_remark">素材审核中
|
||||||
<a-tag v-if="record.status===3" color="arcoblue">{{ record.status_text }}</a-tag>
|
</TooltipTag>
|
||||||
<a-tag v-if="record.status===4" color="green">{{ record.status_text }}</a-tag>
|
<TooltipTag v-if="record.status === 2" color="orangered" :content="record.check_remark">
|
||||||
<a-tag v-if="record.status===5" color="green">{{ record.status_text }}</a-tag>
|
重新上传素材
|
||||||
<a-tag v-if="record.status===6">{{ record.status_text }}</a-tag>
|
</TooltipTag>
|
||||||
|
<TooltipTag v-if="record.status === 3" color="gray" :content="record.check_remark">待领取
|
||||||
|
</TooltipTag>
|
||||||
|
<TooltipTag v-if="record.status === 4" color="green" :content="record.check_remark">已领取
|
||||||
|
</TooltipTag>
|
||||||
|
<TooltipTag v-if="record.status === 5" color="green" :content="record.check_remark">已结算
|
||||||
|
</TooltipTag>
|
||||||
|
<TooltipTag v-if="record.status === 6" color="arcoblue" :content="record.check_remark">已终止
|
||||||
|
</TooltipTag>
|
||||||
</template>
|
</template>
|
||||||
<template v-slot:check_status_text="{record}">
|
<template v-slot:check_status_text="{record}">
|
||||||
<a-tag v-if="record.check_status===0" color="cyan">{{ record.check_status_text }}</a-tag>
|
<a-tag v-if="record.check_status===0" color="cyan">{{ record.check_status_text }}</a-tag>
|
||||||
|
|||||||
@@ -75,11 +75,29 @@ watch(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
const sum = ref(0);
|
||||||
|
const sumData = async () => {
|
||||||
|
const api = SystemStore.isRoot ? Api.admin.settlement : Api.merchant.jsTask
|
||||||
|
const {data: {real_coin}} = await api({
|
||||||
|
id: task.id,
|
||||||
|
ids: TaskSettltment.filter(v => selectedKeys.value.includes(v.id)).map(v => v.id)
|
||||||
|
});
|
||||||
|
sum.value = real_coin;
|
||||||
|
}
|
||||||
|
|
||||||
|
watch(
|
||||||
|
() => selectedKeys.value,
|
||||||
|
() => {
|
||||||
|
sumData();
|
||||||
|
},
|
||||||
|
{deep: true}
|
||||||
|
)
|
||||||
|
|
||||||
const confirmTask = async () => {
|
const confirmTask = async () => {
|
||||||
const api = SystemStore.isRoot ? Api.admin.settlement : Api.merchant.confirmTask
|
const api = SystemStore.isRoot ? Api.admin.settlement : Api.merchant.confirmTask
|
||||||
const {msg} = await api({
|
const {msg} = await api({
|
||||||
id: task.id,
|
id: task.id,
|
||||||
|
type: 1,
|
||||||
content: TaskSettltment.filter(v => selectedKeys.value.includes(v.id)).map(v => ({
|
content: TaskSettltment.filter(v => selectedKeys.value.includes(v.id)).map(v => ({
|
||||||
...v,
|
...v,
|
||||||
id: v.id,
|
id: v.id,
|
||||||
@@ -146,23 +164,16 @@ const confirmTask = async () => {
|
|||||||
</a-table>
|
</a-table>
|
||||||
<div class="mt-[22px] flex">
|
<div class="mt-[22px] flex">
|
||||||
该子任务需结算:
|
该子任务需结算:
|
||||||
<div class="text-[#165DFF] text-[16px]">¥{{
|
<div class="text-[#165DFF] text-[16px]">¥
|
||||||
task.coin / 100
|
{{
|
||||||
-
|
selectedKeys.length > 0 ? sum : task.coin / 100
|
||||||
TaskSettltment.filter((v, index) => selectedKeys.includes(index)).reduce((accumulator, item) => {
|
|
||||||
return accumulator + item.discount;
|
|
||||||
}, 0)
|
|
||||||
}}
|
}}
|
||||||
</div>
|
</div>
|
||||||
<div class="text-[14px] text-[#4E5969]" v-if="selectedKeys.length > 0">
|
<div class="text-[14px] text-[#4E5969]" v-if="selectedKeys.length > 0">
|
||||||
({{ task.coin / 100 }}
|
({{ task.coin / 100 }}
|
||||||
<span v-for="v in selectedKeys">- {{ TaskSettltment.find(k => k.id === v)?.discount }}</span>
|
<span v-for="v in selectedKeys">- {{ TaskSettltment.find(k => k.id === v)?.discount }}</span>
|
||||||
= {{
|
= {{
|
||||||
task.coin / 100
|
sum
|
||||||
-
|
|
||||||
TaskSettltment.filter((v, index) => selectedKeys.includes(index)).reduce((accumulator, item) => {
|
|
||||||
return accumulator + item.discount;
|
|
||||||
}, 0)
|
|
||||||
}})
|
}})
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -73,8 +73,10 @@ const success = async () => {
|
|||||||
</a-form-item>
|
</a-form-item>
|
||||||
|
|
||||||
<a-form-item label="特殊要求" field="special_text">
|
<a-form-item label="特殊要求" field="special_text">
|
||||||
<a-input v-model:model-value="form.special_text"
|
<a-textarea
|
||||||
placeholder="请输入特殊要求,如:请勿截图,必须下载原图再上传到抖音"></a-input>
|
placeholder="请输入特殊要求,如:请勿截图,必须下载原图再上传到抖音"
|
||||||
|
v-model:model-value="form.special_text">
|
||||||
|
</a-textarea>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
|
|
||||||
<a-form-item label="" field="special_images">
|
<a-form-item label="" field="special_images">
|
||||||
|
|||||||
@@ -187,12 +187,12 @@ const passTask = async (id, task_backfill_id) => {
|
|||||||
<div class="flex gap-[16px] justify-center items-center">
|
<div class="flex gap-[16px] justify-center items-center">
|
||||||
<a-popconfirm content="确定通过吗?" @ok="passTask(record.id, item.back.id)">
|
<a-popconfirm content="确定通过吗?" @ok="passTask(record.id, item.back.id)">
|
||||||
<a-link :hoverable="false" status="success"
|
<a-link :hoverable="false" status="success"
|
||||||
:disabled="!(item.back_status===2)">通过
|
:disabled="!(item.back_status === 4 || item.back_status === 2)">通过
|
||||||
</a-link>
|
</a-link>
|
||||||
</a-popconfirm>
|
</a-popconfirm>
|
||||||
|
|
||||||
<RefuseModal :taskId="record.id" :task="item" @success="fetchData"
|
<RefuseModal :taskId="record.id" :task="item" @success="fetchData"
|
||||||
:disabled="!(item.back_status===2)"></RefuseModal>
|
:disabled="!(item.back_status === 4 || item.back_status === 2)"></RefuseModal>
|
||||||
</div>
|
</div>
|
||||||
<a-divider v-if="index+1 !== record.task_content.length"></a-divider>
|
<a-divider v-if="index+1 !== record.task_content.length"></a-divider>
|
||||||
</div>
|
</div>
|
||||||
@@ -259,7 +259,9 @@ const passTask = async (id, task_backfill_id) => {
|
|||||||
})">
|
})">
|
||||||
终止子任务
|
终止子任务
|
||||||
</a-doption>
|
</a-doption>
|
||||||
<a-doption @click="() => {state.openBlackjackExpertModal=true;taskId=record.id}">
|
<a-doption
|
||||||
|
:disabled="!record.account"
|
||||||
|
@click="() => {state.openBlackjackExpertModal=true;taskId=record.id}">
|
||||||
拉黑达人
|
拉黑达人
|
||||||
</a-doption>
|
</a-doption>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
Reference in New Issue
Block a user