This commit is contained in:
2025-06-13 21:01:33 +08:00
parent 376d9d5cfe
commit 88a8d119cf
15 changed files with 429 additions and 49 deletions

View File

@@ -1,5 +1,5 @@
<script setup>
import {reactive, ref, watch} from "vue";
import {defineEmits, reactive, ref, watch} from "vue";
import XLink from "../../../components/XLink.vue";
import XUpload from "../../../components/XUpload.vue";
import XInput from "../../../components/XInput.vue";
@@ -8,7 +8,10 @@ import {showToast} from "../../../utils/uils.js";
import dayjs from "dayjs";
import XCountdown from "../../../components/XCountdown.vue";
import XImage from "../../../components/XImage.vue";
import Resubmit from "./Resubmit.vue";
import ReplyMessageModal from "./replyMessageModal.vue";
const emits = defineEmits(['success']);
const {data} = defineProps({
data: {
type: Object,
@@ -28,6 +31,7 @@ const success = async () => {
type: data.task_content[current.value].is_image,
});
showToast(msg);
emits('success');
}
watch(
@@ -69,7 +73,8 @@ watch(
回填时间:
</view>
<view class="block-info">
{{ data.task_content[current].start_time }} {{ data.task_content[current].end_time }}
{{ dayjs(data.task_content[current].start_time).format('YYYY-MM-DD HH:mm') }}
{{ dayjs(data.task_content[current].end_time).format('YYYY-MM-DD HH:mm') }}
</view>
</view>
@@ -78,26 +83,85 @@ watch(
倒计时:
</view>
<view class="block-info">
<x-countdown :time="dayjs(data.task_content[current].end_time)">
<view v-if="data.children.back[current]">/</view>
<x-countdown v-else :time="dayjs(data.task_content[current].end_time)">
</x-countdown>
</view>
</view>
<view class="block" v-for="(v, index) in data.fb_num">
<view class="block-title">
视频1的评论区截图:
回填{{ index + 1 }}截图:
</view>
<view class="block-info">
<x-upload
@success="(e) => content[index] = e"
:files="content[index] ? [content[index]] : []"
:del="data.children.back[current]"
:single="true"
v-model:files="content"
v-if="data.task_content[current].is_image === 1">
</x-upload>
<x-input v-else v-model:model-value="content[index]" height="64rpx" placeholder="请输入内容"></x-input>
</view>
</view>
<tui-button @click="success">提交</tui-button>
<template v-if="data.children.back[current]">
<view class="text-[#165DFF] test-24r py-[32rpx]" v-if="data.children.back[current].status === 1">
{{ dayjs(data.children.createtime * 1000).format('YYYY-MM-DD HH:mm') }}已提交审核通过
</view>
<template v-if="data.children.back[current].status === 2">
<view class="text-[#165DFF] test-24r py-[32rpx]" v-if="data.children.back[current].operate === 1">
<view>{{ dayjs(data.children.createtime * 1000).format('YYYY-MM-DD HH:mm') }}已提交审核拒绝</view>
<view>请请点击审核沟通查看修改建议</view>
<view>
并于{{ dayjs(data.children.back[current].end_time * 1000).format('YYYY-MM-DD HH:mm') }}前点击下方重新提交本次回填
</view>
</view>
<view class="text-[#165DFF] test-24r py-[32rpx]" v-if="data.children.back[current].operate === 2">
<view>{{ dayjs(data.children.createtime * 1000).format('YYYY-MM-DD HH:mm') }}已提交审核拒绝</view>
<view>请请点击审核沟通查看修改建议</view>
<view>
并于{{
dayjs(data.children.back[current].end_time * 1000).format('YYYY-MM-DD HH:mm')
}}前点击下方回复按照要求进行回复
</view>
</view>
</template>
<view class="text-[#165DFF] test-24r py-[32rpx]"
v-if="data.children.back[current].status === 0">
{{ dayjs(data.children.createtime * 1000).format('YYYY-MM-DD HH:mm') }}已提交审核中
</view>
<view class="text-[#165DFF] test-24r py-[32rpx]"
v-if="data.children.back[current].status === -1">
{{ dayjs(data.children.createtime * 1000).format('YYYY-MM-DD HH:mm') }}已提交审核失败
</view>
</template>
<template
v-if="data.children.back[current].status === 0 || data.children.back[current].status === -1">
<tui-button @click="success" :disabled="data.children.back[current]">
{{
data.children.back[current].status === 0 || data.children.back[current].status === -1 ? '已提交' : '提交'
}}
</tui-button>
</template>
<template v-else>
<view class="!flex !w-full gap-[30rpx]">
<view class="!w-[50%]">
<tui-button disabled>已提交</tui-button>
</view>
<view class="!w-[50%]" v-if="data.children.back[current].operate === 1">
<resubmit :data="data" :current="current" @success="emits('success')">
<tui-button>重新提交</tui-button>
</resubmit>
</view>
<view class="!w-[50%]" v-if="data.children.back[current].operate === 2">
<reply-message-modal :data="data" @success="emits('success')" :backId="data.children.back[current].id">
<tui-button>回复</tui-button>
</reply-message-modal>
</view>
</view>
</template>
</template>
<style scoped lang="scss">

View File

@@ -0,0 +1,120 @@
<script setup>
import YY_ICON from "../../../static/icons/yy.png";
import {showToast, toPage} from "../../../utils/uils.js";
import ReplyMessageModal from "./replyMessageModal.vue";
import Api from "../../../api/index.js";
const emits = defineEmits(['success']);
const {operate, data} = defineProps({
operate: {
type: Number,
default: 1,
},
data: {
type: Object,
default: () => ({})
}
});
const abandonTask = async () => {
const {msg} = await Api.system.abandonTask({id: data.id});
showToast(msg);
emits('success');
}
</script>
<template>
<view class="p-[24rpx] bg-white w-[460rpx] !flex flex-col gap-[16rpx]">
<template v-if="operate===1">
<view
class="w-full py-[8rpx] bg-[#F2F3F5] px-[30rpx] test-22r text-[#86909C] !flex items-center gap-[10rpx] rounded-[4rpx]">
<image :src="YY_ICON" class="!size-[26rpx]"></image>
提示点击下方按钮快速回复
</view>
<view
@click="toPage(`/pages/taskDetails/index?id=${data.id}&tab=2`)"
class="py-[15rpx] !flex justify-center flex-col items-center test-28r text-[#165DFF] bg-[#E8F3FF] px-[26rpx]">
去重新回填
</view>
<view
@click="abandonTask"
class="py-[15rpx] !flex justify-center flex-col items-center test-28r text-[#165DFF] bg-[#E8F3FF] px-[26rpx]">
拒绝修改并放弃任务
<view class="w-full h-[2rpx] bg-[#E5E6EB] !my-[8rpx]"></view>
<view class="test-22r text-[#86909C]">商家将根据约定扣钱或不结算</view>
</view>
<reply-message-modal :data="data" :intervention="true" @success="emits('success')">
<view
class="py-[15rpx] !flex justify-center flex-col items-center test-28r text-[#165DFF] bg-[#E8F3FF] px-[26rpx]">
发起申诉
</view>
</reply-message-modal>
</template>
<template v-if="operate===2">
<view
class="w-full py-[8rpx] bg-[#F2F3F5] px-[30rpx] test-22r text-[#86909C] !flex items-center gap-[10rpx] rounded-[4rpx]">
<image :src="YY_ICON" class="!size-[26rpx]"></image>
提示点击下方按钮快速回复
</view>
<reply-message-modal :data="data" :intervention="true" @success="emits('success')">
<view
class="py-[15rpx] !flex justify-center flex-col items-center test-28r text-[#165DFF] bg-[#E8F3FF] px-[26rpx]">
去回复
</view>
</reply-message-modal>
<view
@click="abandonTask"
class="py-[15rpx] !flex justify-center flex-col items-center test-28r text-[#165DFF] bg-[#E8F3FF] px-[26rpx]">
拒绝修改并放弃任务
<view class="w-full h-[2rpx] bg-[#E5E6EB] !my-[8rpx]"></view>
<view class="test-22r text-[#86909C]">商家将根据约定扣钱或不结算</view>
</view>
<reply-message-modal :data="data" :intervention="true" @success="emits('success')">
<view
class="py-[15rpx] !flex justify-center flex-col items-center test-28r text-[#165DFF] bg-[#E8F3FF] px-[26rpx]">
发起申诉
</view>
</reply-message-modal>
</template>
<template v-if="operate===3">
<view
class="w-full py-[8rpx] bg-[#F2F3F5] px-[30rpx] test-22r text-[#86909C] !flex items-center gap-[10rpx] rounded-[4rpx]">
<image :src="YY_ICON" class="!size-[26rpx]"></image>
提示点击下方按钮快速回复
</view>
<reply-message-modal :data="data" :intervention="true" @success="emits('success')">
<view
class="py-[15rpx] !flex justify-center flex-col items-center test-28r text-[#165DFF] bg-[#E8F3FF] px-[26rpx]">
发起申诉
<view class="w-full h-[2rpx] bg-[#E5E6EB] !my-[8rpx]"></view>
<view class="test-22r text-[#86909C]">对商家处理有异议可点击申诉</view>
</view>
</reply-message-modal>
</template>
<template v-if="operate===4">
<view
class="w-full py-[8rpx] bg-[#F2F3F5] px-[30rpx] test-22r text-[#86909C] !flex items-center gap-[10rpx] rounded-[4rpx]">
<image :src="YY_ICON" class="!size-[26rpx]"></image>
提示点击下方按钮快速回复
</view>
<view
class="py-[15rpx] !flex justify-center flex-col items-center test-28r text-[#165DFF] bg-[#E8F3FF] px-[26rpx]">
我同意
<view class="w-full h-[2rpx] bg-[#E5E6EB] !my-[8rpx]"></view>
<view class="test-22r text-[#86909C]">将在12时00分00秒后自动同意</view>
</view>
<reply-message-modal :data="data" :intervention="true" @success="emits('success')">
<view
class="py-[15rpx] !flex justify-center flex-col items-center test-28r text-[#165DFF] bg-[#E8F3FF] px-[26rpx]">
发起申诉
<view class="w-full h-[2rpx] bg-[#E5E6EB] !my-[8rpx]"></view>
<view class="test-22r text-[#86909C]">对结算有异议可点击申诉</view>
</view>
</reply-message-modal>
</template>
</view>
</template>
<style scoped lang="scss">
</style>

View File

@@ -0,0 +1,91 @@
<script setup>
import XModal from "../../../components/XModal.vue";
import {defineEmits, reactive, ref} from "vue";
import XUpload from "../../../components/XUpload.vue";
import XInput from "../../../components/XInput.vue";
import Api from "../../../api/index.js";
import {showToast} from "../../../utils/uils.js";
const emits = defineEmits(['success']);
const {data, current} = defineProps({
data: {
type: Object,
default: null,
},
current: {
type: Number,
default: null,
}
});
const content = reactive([]);
const show = ref(false);
const success = async () => {
const {msg} = await Api.system.addTaskBackfill({
id: data.children.id,
cid: current + 1,
content: content,
type: data.task_content[current].is_image,
});
showToast(msg);
emits('success');
show.value = false;
}
</script>
<template>
<view @click="show=true">
<slot></slot>
</view>
<x-modal v-model:show="show">
<view class="!py-[40rpx] !px-[32rpx] test-32r font-blod">
<view class="text-center text-[#1D2129] pb-[20rpx]">重新回填回填数据1</view>
<view class="block" v-for="(v, index) in data.fb_num">
<view class="block-title">
回填{{ index + 1 }}的截图:
</view>
<view class="block-info">
<x-upload
:del="data.children.user_status !== 2"
:single="true"
v-model:files="content"
v-if="data.task_content[current].is_image === 1">
</x-upload>
<x-input v-else v-model:model-value="content[index]" height="64rpx"
placeholder="请输入内容"></x-input>
</view>
</view>
<tui-button height="80rpx" @click="success">重新提交</tui-button>
</view>
</x-modal>
</template>
<style scoped lang="scss">
.block {
display: flex;
gap: 20rpx;
margin-bottom: 20rpx;
.block-title {
flex-shrink: 0;
color: rgb(134, 144, 156);
font-size: 24rpx;
font-weight: 500;
line-height: 140%;
letter-spacing: 0;
text-align: left;
width: 160rpx;
}
.block-info {
color: rgb(78, 89, 105);
font-size: 24rpx;
font-weight: 500;
line-height: 140%;
letter-spacing: 0;
}
}
</style>

View File

@@ -6,6 +6,8 @@ import Api from "../../../api/index.js";
import useTableQuery from "../../../hooks/useTableQuery.js";
import dayjs from "dayjs";
import ReplyMessageModal from "./replyMessageModal.vue";
import QuickOperation from "./QuickOperation.vue";
import XImage from "../../../components/XImage.vue";
const {data} = defineProps({
data: {
@@ -17,12 +19,15 @@ const {data} = defineProps({
const po = reactive({
id: data.children.id,
});
const vo = reactive({});
const vo = reactive({
intervention: null,
});
const {loading, pagination, initFetchData, fetchData} = useTableQuery({
api: Api.system.getExchangeLog,
parameter: po,
callback: (data) => {
console.log(data);
Object.assign(vo, data);
}
});
@@ -42,7 +47,7 @@ const {loading, pagination, initFetchData, fetchData} = useTableQuery({
<view class="chat-box">
<view v-for="v in vo.rows" class="!mb-[24rpx]">
<view :class="['!flex gap-[12rpx]', v.right === 1 ? 'right-box' : '' ]">
<image class="!size-[80rpx] flex-shrink-0 rounded-[50%] overflow-hidden test" mode="aspectFill"
<image class="!size-[80rpx] flex-shrink-0 rounded-[50%] overflow-hidden" mode="aspectFill"
:src="v.people.avatar"></image>
<view class="flex-grow content !flex flex-col">
<view class="time">{{ dayjs(v.createtime).format('MM月DD日 HH:mm') }}</view>
@@ -57,14 +62,46 @@ const {loading, pagination, initFetchData, fetchData} = useTableQuery({
</view>
</view>
</view>
<view class="!flex justify-center !mt-[24rpx]" v-if="v.operate !== 0">
<QuickOperation :operate="v.operate" :data="data" @success="fetchData"></QuickOperation>
</view>
</view>
<view class="w-full bg-white p-[24rpx] !mt-[24rpx] rounded-[8rpx]" v-if="vo.intervention.id">
<view class="test-28r text-[#1D2129] text-center">达人发起了平台介入</view>
<view class="bg-[#F7F8FA] px-[24rpx] py-[15rpx] !mt-[20rpx]">
<view class="test-28r text-[#1D2129]">申诉原因</view>
<view class="bg-[#E5E6EB] w-2/3 h-[2rpx] !my-[8rpx]"></view>
<view class="text-[#4E5969] test-28r">
{{ vo.intervention.remark }}
</view>
<view class="!grid !grid-cols-5 gap-[20rpx]">
<view class="!w-full aspect-square border border-[#E5E6EB] p-[4rpx]"
v-for="v in vo.intervention.image_arr">
<x-image class="!size-full" :src="v">
</x-image>
</view>
</view>
</view>
<view class="bg-[#F7F8FA] px-[24rpx] py-[15rpx] !mt-[20rpx]" v-if="vo.intervention.status === 1">
<view class="test-28r text-[#1D2129]">平台处理结果</view>
<view class="bg-[#E5E6EB] w-2/3 h-[2rpx] !my-[8rpx]"></view>
<view class="text-[#4E5969] test-28r">
{{ vo.intervention.intro }}
</view>
</view>
</view>
</view>
</scroll-view>
<view class="p-[24rpx] !pt-0 !flex gap-[22rpx]">
<x-button class="!w-[220rpx]">
发起申述
</x-button>
<reply-message-modal :data="data" :intervention="true" @success="fetchData">
<x-button class="!w-[220rpx]">
发起申述
</x-button>
</reply-message-modal>
<reply-message-modal :data="data"></reply-message-modal>
</view>
</view>

View File

@@ -1,15 +1,24 @@
<script setup>
import {ref, reactive} from "vue";
import {ref, reactive, defineEmits} from "vue";
import XModal from "../../../components/XModal.vue";
import rback from "../../../static/icons/rout-back.png";
import XButton from "../../../components/XButton.vue";
import {showToast, uploadFile} from "../../../utils/uils.js";
import Api from "../../../api/index.js";
const {data} = defineProps({
const emits = defineEmits(['success']);
const {data, backId, intervention} = defineProps({
data: {
type: Object,
default: {},
},
backId: {
type: Number,
default: null,
},
intervention: {
type: Boolean,
default: false,
}
});
const show = ref(false);
@@ -21,27 +30,33 @@ const form = reactive({
});
const upload = async () => {
const res = await uploadFile({
const [res] = await uploadFile({
count: 9,
});
form.images.push(...res);
const {data} = res;
form.images.push(data);
}
const success = async () => {
const {msg} = await Api.system.addExchangeLog(form);
const api = intervention ? Api.system.intervention : Api.system.addExchangeLog
const {msg} = await api({...form, backfill_id: backId});
showToast(msg);
form.images.length = 0;
form.content = null;
form.pattern = 0;
show.value = false;
emits('success');
}
</script>
<template>
<x-button class="flex-grow !flex gap-[16rpx]" @click="show=true">
<x-button v-if="!$slots.default" class="flex-grow !flex gap-[16rpx]" @click="show=true">
<image :src="rback" class="!w-[22rpx]" mode="widthFix"></image>
回复
</x-button>
<view v-else @click="show=true">
<slot></slot>
</view>
<x-modal
v-model:show="show">
@@ -64,7 +79,8 @@ const success = async () => {
</view>
<view class="!mt-[20rpx] bg-[#F2F3F5] rounded-[4rpx] py-[16rpx] px-[30rpx]">
<textarea v-model="form.content" placeholder="请输入申诉原因"></textarea>
<textarea v-model="form.content"
:placeholder="intervention ? '请输入申诉内容' : '请输入内容'"></textarea>
</view>
<view class="text-[#86909C] test-24r !mt-[20rpx]">提示请确认内容无误后提交提交虚假回复会封号</view>

View File

@@ -51,8 +51,9 @@ const getData = async (id) => {
}
onLoad((options) => {
const {id, home: _home} = options;
const {id, home: _home, tab} = options;
home.value = _home === '1';
if (tab) currentTabs.value = Number(tab);
getData(id);
});
@@ -114,7 +115,7 @@ onMounted(() => {
<view class="goods-st-info">发布平台</view>
</view>
<view class="bg-[#E8F3FF] px-[26rpx] py-[20rpx] rounded-[8rpx]">
<view class="goods-st">¥ {{ details.real_price.toFixed(2) }}</view>
<view class="goods-st whitespace-nowrap">¥ {{ details.real_price.toFixed(2) }}</view>
<view class="goods-st-info">任务报酬</view>
</view>
<view class="bg-[#E8F3FF] px-[26rpx] py-[20rpx] rounded-[8rpx]">
@@ -170,7 +171,7 @@ onMounted(() => {
<Suspense>
<template #default>
<div class="h-full flex flex-col items-start">
<component :is="tabs[currentTabs].component" :data="details"></component>
<component :is="tabs[currentTabs].component" :data="details" @success="getData"></component>
</div>
</template>