This commit is contained in:
2025-06-24 20:54:56 +08:00
parent 872999905c
commit 7e588ba737
8 changed files with 182 additions and 24 deletions

View File

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

View File

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

View File

@@ -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>

View File

@@ -5,6 +5,7 @@ import Api from "../../../../api/index.js";
import Filter from "../../../../components/Filter/index.vue";
import RefuseModal from "./components/RefuseModal.vue";
import {Message} from "@arco-design/web-vue";
import EditTGInfoModal from "./components/EditTGInfoModal.vue";
const columns = [
{
@@ -135,7 +136,7 @@ const accept = async (id) => {
</template>
<template v-slot:action="{record}">
<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>
<RefuseModal @success="fetchData" :id="record.id"></RefuseModal>
</div>

View File

@@ -7,6 +7,7 @@ import PreviewTaskModal from "../../../../components/PreviewTaskModal/PreviewTas
import openTerminateTask from "../../../../components/TerminateTask/TerminateTask.js";
import {Message} from "@arco-design/web-vue";
import RejectTaskModal from "./components/RejectTaskModal.vue";
import TooltipTag from "../../../../components/TooltipTag/index.vue";
const columns = [
{
@@ -145,13 +146,21 @@ const plTaskChildren = async () => {
:columns="columns"
class="flex-grow">
<template v-slot:status_text="{record}">
<a-tag v-if="record.status===0" color="cyan">{{ record.status_text }}</a-tag>
<a-tag v-if="record.status===1" color="orangered">{{ record.status_text }}</a-tag>
<a-tag v-if="record.status===2" color="red">{{ record.status_text }}</a-tag>
<a-tag v-if="record.status===3" color="arcoblue">{{ record.status_text }}</a-tag>
<a-tag v-if="record.status===4" color="green">{{ record.status_text }}</a-tag>
<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 v-if="record.status === 0" color="red" :content="record.check_remark">待上传素材
</TooltipTag>
<TooltipTag v-if="record.status === 1" color="orangered" :content="record.check_remark">素材审核中
</TooltipTag>
<TooltipTag v-if="record.status === 2" color="orangered" :content="record.check_remark">
重新上传素材
</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 v-slot:check_status_text="{record}">
<a-tag v-if="record.check_status===0" color="cyan">{{ record.check_status_text }}</a-tag>

View File

@@ -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 api = SystemStore.isRoot ? Api.admin.settlement : Api.merchant.confirmTask
const {msg} = await api({
id: task.id,
type: 1,
content: TaskSettltment.filter(v => selectedKeys.value.includes(v.id)).map(v => ({
...v,
id: v.id,
@@ -146,23 +164,16 @@ const confirmTask = async () => {
</a-table>
<div class="mt-[22px] flex">
该子任务需结算
<div class="text-[#165DFF] text-[16px]">¥{{
task.coin / 100
-
TaskSettltment.filter((v, index) => selectedKeys.includes(index)).reduce((accumulator, item) => {
return accumulator + item.discount;
}, 0)
<div class="text-[#165DFF] text-[16px]">¥
{{
selectedKeys.length > 0 ? sum : task.coin / 100
}}
</div>
<div class="text-[14px] text-[#4E5969]" v-if="selectedKeys.length > 0">
{{ task.coin / 100 }}
<span v-for="v in selectedKeys">- {{ TaskSettltment.find(k => k.id === v)?.discount }}</span>
= {{
task.coin / 100
-
TaskSettltment.filter((v, index) => selectedKeys.includes(index)).reduce((accumulator, item) => {
return accumulator + item.discount;
}, 0)
sum
}}
</div>
</div>

View File

@@ -73,8 +73,10 @@ const success = async () => {
</a-form-item>
<a-form-item label="特殊要求" field="special_text">
<a-input v-model:model-value="form.special_text"
placeholder="请输入特殊要求,如:请勿截图,必须下载原图再上传到抖音"></a-input>
<a-textarea
placeholder="请输入特殊要求,如:请勿截图,必须下载原图再上传到抖音"
v-model:model-value="form.special_text">
</a-textarea>
</a-form-item>
<a-form-item label="" field="special_images">

View File

@@ -187,12 +187,12 @@ const passTask = async (id, task_backfill_id) => {
<div class="flex gap-[16px] justify-center items-center">
<a-popconfirm content="确定通过吗?" @ok="passTask(record.id, item.back.id)">
<a-link :hoverable="false" status="success"
:disabled="!(item.back_status===2)">通过
:disabled="!(item.back_status === 4 || item.back_status === 2)">通过
</a-link>
</a-popconfirm>
<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>
<a-divider v-if="index+1 !== record.task_content.length"></a-divider>
</div>
@@ -259,7 +259,9 @@ const passTask = async (id, task_backfill_id) => {
})">
终止子任务
</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>
</template>