update
This commit is contained in:
@@ -362,6 +362,20 @@ const system = {
|
|||||||
data: data
|
data: data
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
abandonTask: async (data) => {
|
||||||
|
return request({
|
||||||
|
method: MethodsENUM.POST,
|
||||||
|
url: "/task/abandonTask",
|
||||||
|
data: data
|
||||||
|
});
|
||||||
|
},
|
||||||
|
intervention: async (data) => {
|
||||||
|
return request({
|
||||||
|
method: MethodsENUM.POST,
|
||||||
|
url: "/task/intervention",
|
||||||
|
data: data
|
||||||
|
});
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
export default system;
|
export default system;
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
import {onMounted, ref} from "vue";
|
import {onMounted, ref, watch} from "vue";
|
||||||
import warn from '../static/icons/warn.png';
|
import warn from '../static/icons/warn.png';
|
||||||
import success from '../static/icons/info.png';
|
import success from '../static/icons/info.png';
|
||||||
|
|
||||||
@@ -37,6 +37,22 @@ const XNoticeBox = ref();
|
|||||||
const Context = ref();
|
const Context = ref();
|
||||||
const roll = ref(false);
|
const roll = ref(false);
|
||||||
|
|
||||||
|
watch(
|
||||||
|
() => text,
|
||||||
|
() => {
|
||||||
|
if (!tile) {
|
||||||
|
if (
|
||||||
|
Context.value.$el.clientWidth
|
||||||
|
>
|
||||||
|
XNoticeBox.value.$el.clientWidth
|
||||||
|
) {
|
||||||
|
roll.value = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{deep: true}
|
||||||
|
)
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
if (!tile) {
|
if (!tile) {
|
||||||
if (
|
if (
|
||||||
@@ -56,9 +72,9 @@ onMounted(() => {
|
|||||||
:style="{alignItems: tile ? 'start' : 'center'}">
|
:style="{alignItems: tile ? 'start' : 'center'}">
|
||||||
<image v-if="status==='error'" class="!size-[26rpx] flex-shrink-0" :src="warn"></image>
|
<image v-if="status==='error'" class="!size-[26rpx] flex-shrink-0" :src="warn"></image>
|
||||||
<image v-else class="!size-[26rpx] flex-shrink-0" :src="success"></image>
|
<image v-else class="!size-[26rpx] flex-shrink-0" :src="success"></image>
|
||||||
<text v-if="!tile" class="!whitespace-nowrap flex-shrink-0" :style="{color: textColor}">{{ text }}</text>
|
<text v-if="!tile" class="!whitespace-nowrap flex-shrink-0" :style="{color: textColor}"
|
||||||
<text v-else :style="{color: textColor}">
|
v-html="text"></text>
|
||||||
{{ text }}
|
<text v-else :style="{color: textColor}" v-html="text">
|
||||||
</text>
|
</text>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
|
|||||||
@@ -1,12 +1,21 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
|
import CLOSE_ICON from "../static/icons/close2.png";
|
||||||
import ADDICON from "../static/icons/add.png";
|
import ADDICON from "../static/icons/add.png";
|
||||||
import {uploadFile} from "../utils/uils";
|
import {uploadFile} from "../utils/uils";
|
||||||
import XImage from "./XImage.vue";
|
import XImage from "./XImage.vue";
|
||||||
|
|
||||||
const {size} = defineProps({
|
const {size, single, del} = defineProps({
|
||||||
size: {
|
size: {
|
||||||
type: String,
|
type: String,
|
||||||
default: "160rpx"
|
default: "160rpx"
|
||||||
|
},
|
||||||
|
single: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false,
|
||||||
|
},
|
||||||
|
del: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false,
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
const emits = defineEmits(['success']);
|
const emits = defineEmits(['success']);
|
||||||
@@ -15,7 +24,8 @@ const files = defineModel('files');
|
|||||||
const upload = async () => {
|
const upload = async () => {
|
||||||
uploadFile({
|
uploadFile({
|
||||||
count: 1,
|
count: 1,
|
||||||
}).then(({data}) => {
|
}).then(([res]) => {
|
||||||
|
const {data} = res;
|
||||||
files.value?.push(data);
|
files.value?.push(data);
|
||||||
emits('success', data);
|
emits('success', data);
|
||||||
})
|
})
|
||||||
@@ -24,22 +34,25 @@ const upload = async () => {
|
|||||||
|
|
||||||
<template>
|
<template>
|
||||||
<view class="!flex gap-[12rpx] flex-wrap">
|
<view class="!flex gap-[12rpx] flex-wrap">
|
||||||
<view class="x-upload" @click="upload">
|
<view class="x-upload" @click="upload" v-if="single && files.length < 1">
|
||||||
<image class="!size-[28rpx]" :src="ADDICON"></image>
|
<image class="!size-[28rpx]" :src="ADDICON"></image>
|
||||||
<view>上传图片</view>
|
<view>上传图片</view>
|
||||||
</view>
|
</view>
|
||||||
|
|
||||||
<x-image
|
<view class="!relative" v-for="(v, index) in files" :key="v">
|
||||||
:style="{
|
<image v-if="del" @click="files.splice(index, 1)" :src="CLOSE_ICON"
|
||||||
|
class="!size-[48rpx] !absolute !z-10 !top-0 !right-0"
|
||||||
|
mode="aspectFill"></image>
|
||||||
|
<x-image
|
||||||
|
:style="{
|
||||||
width: size,
|
width: size,
|
||||||
height: size,
|
height: size,
|
||||||
}"
|
}"
|
||||||
class="border border-[rgb(229,230,235)]"
|
class="border border-[rgb(229,230,235)]"
|
||||||
v-for="v in files"
|
:src="v"
|
||||||
:src="v"
|
:list="[v]">
|
||||||
:list="[v]"
|
</x-image>
|
||||||
:key="v">
|
</view>
|
||||||
</x-image>
|
|
||||||
</view>
|
</view>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
|||||||
@@ -48,6 +48,7 @@ function useTableQuery({
|
|||||||
rows: data.list.map(v => ({...v, key: v.id})),
|
rows: data.list.map(v => ({...v, key: v.id})),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Object.assign(vo, data);
|
||||||
vo.page = _vo.page;
|
vo.page = _vo.page;
|
||||||
vo.total = _vo.total;
|
vo.total = _vo.total;
|
||||||
vo.rows = [...vo.rows, ..._vo.rows];
|
vo.rows = [...vo.rows, ..._vo.rows];
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ import OpenTypeFun from "../../components/OpenTypeFun.js";
|
|||||||
import XNoticeBar from "../../components/XNoticeBar.vue";
|
import XNoticeBar from "../../components/XNoticeBar.vue";
|
||||||
|
|
||||||
const showAddCustomer = ref(false);
|
const showAddCustomer = ref(false);
|
||||||
|
const textContent = ref(null);
|
||||||
const advList = reactive([]);
|
const advList = reactive([]);
|
||||||
const nav = [
|
const nav = [
|
||||||
{
|
{
|
||||||
@@ -94,13 +95,19 @@ onMounted(() => {
|
|||||||
advList.length = 0;
|
advList.length = 0;
|
||||||
advList.push(...data);
|
advList.push(...data);
|
||||||
});
|
});
|
||||||
|
Api.system.getBarrageList().then(({data}) => {
|
||||||
|
textContent.value = '';
|
||||||
|
data.forEach((v, index) => {
|
||||||
|
textContent.value += `${index + 1}.${v} `;
|
||||||
|
});
|
||||||
|
});
|
||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<!--首页-->
|
<!--首页-->
|
||||||
<XNav :show-back="false"></XNav>
|
<XNav :show-back="false"></XNav>
|
||||||
<x-notice-bar></x-notice-bar>
|
<x-notice-bar :text="textContent" v-if="textContent"></x-notice-bar>
|
||||||
|
|
||||||
<add-customer-service-modal v-model:show="showAddCustomer"></add-customer-service-modal>
|
<add-customer-service-modal v-model:show="showAddCustomer"></add-customer-service-modal>
|
||||||
|
|
||||||
|
|||||||
@@ -1,16 +1,15 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
import {reactive, onMounted} from "vue";
|
import {onMounted, reactive} from "vue";
|
||||||
import Api from "../../api/index.js";
|
import Api from "../../api/index.js";
|
||||||
|
|
||||||
|
const list = ['简单做轻松赚', '我是大圆宝 已提现304.46元', '路马克 已提现858.37元', 'Rainy day 已提现1634.78元', '邀请好友,更多奖励', '0成本轻创业,有手就行', '无套路,没门槛', '一边带娃一边赚钱,方便省心~', '舍友同学都在用,提现快捷'];
|
||||||
const list1 = reactive([]);
|
const list1 = reactive([]);
|
||||||
const list2 = reactive([]);
|
const list2 = reactive([]);
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
Api.system.getBarrageList().then(({data}) => {
|
for (let i = 0; i <= 1000; i++) {
|
||||||
for (let i = 0; i <= 1000; i++) {
|
list1.push(list[Math.floor(Math.random() * list.length)]);
|
||||||
list1.push(data[Math.floor(Math.random() * data.length)]);
|
list2.push(list[Math.floor(Math.random() * list.length)]);
|
||||||
list2.push(data[Math.floor(Math.random() * data.length)]);
|
}
|
||||||
}
|
|
||||||
});
|
|
||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
import {reactive, ref, watch} from "vue";
|
import {defineEmits, reactive, ref, watch} from "vue";
|
||||||
import XLink from "../../../components/XLink.vue";
|
import XLink from "../../../components/XLink.vue";
|
||||||
import XUpload from "../../../components/XUpload.vue";
|
import XUpload from "../../../components/XUpload.vue";
|
||||||
import XInput from "../../../components/XInput.vue";
|
import XInput from "../../../components/XInput.vue";
|
||||||
@@ -8,7 +8,10 @@ import {showToast} from "../../../utils/uils.js";
|
|||||||
import dayjs from "dayjs";
|
import dayjs from "dayjs";
|
||||||
import XCountdown from "../../../components/XCountdown.vue";
|
import XCountdown from "../../../components/XCountdown.vue";
|
||||||
import XImage from "../../../components/XImage.vue";
|
import XImage from "../../../components/XImage.vue";
|
||||||
|
import Resubmit from "./Resubmit.vue";
|
||||||
|
import ReplyMessageModal from "./replyMessageModal.vue";
|
||||||
|
|
||||||
|
const emits = defineEmits(['success']);
|
||||||
const {data} = defineProps({
|
const {data} = defineProps({
|
||||||
data: {
|
data: {
|
||||||
type: Object,
|
type: Object,
|
||||||
@@ -28,6 +31,7 @@ const success = async () => {
|
|||||||
type: data.task_content[current.value].is_image,
|
type: data.task_content[current.value].is_image,
|
||||||
});
|
});
|
||||||
showToast(msg);
|
showToast(msg);
|
||||||
|
emits('success');
|
||||||
}
|
}
|
||||||
|
|
||||||
watch(
|
watch(
|
||||||
@@ -69,7 +73,8 @@ watch(
|
|||||||
回填时间:
|
回填时间:
|
||||||
</view>
|
</view>
|
||||||
<view class="block-info">
|
<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>
|
||||||
</view>
|
</view>
|
||||||
|
|
||||||
@@ -78,26 +83,85 @@ watch(
|
|||||||
倒计时:
|
倒计时:
|
||||||
</view>
|
</view>
|
||||||
<view class="block-info">
|
<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>
|
</x-countdown>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
|
|
||||||
<view class="block" v-for="(v, index) in data.fb_num">
|
<view class="block" v-for="(v, index) in data.fb_num">
|
||||||
<view class="block-title">
|
<view class="block-title">
|
||||||
视频1的评论区截图:
|
回填{{ index + 1 }}的截图:
|
||||||
</view>
|
</view>
|
||||||
<view class="block-info">
|
<view class="block-info">
|
||||||
<x-upload
|
<x-upload
|
||||||
@success="(e) => content[index] = e"
|
:del="data.children.back[current]"
|
||||||
:files="content[index] ? [content[index]] : []"
|
:single="true"
|
||||||
|
v-model:files="content"
|
||||||
v-if="data.task_content[current].is_image === 1">
|
v-if="data.task_content[current].is_image === 1">
|
||||||
</x-upload>
|
</x-upload>
|
||||||
<x-input v-else v-model:model-value="content[index]" height="64rpx" placeholder="请输入内容"></x-input>
|
<x-input v-else v-model:model-value="content[index]" height="64rpx" placeholder="请输入内容"></x-input>
|
||||||
</view>
|
</view>
|
||||||
</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>
|
</template>
|
||||||
|
|
||||||
<style scoped lang="scss">
|
<style scoped lang="scss">
|
||||||
|
|||||||
120
src/pages/taskDetails/components/QuickOperation.vue
Normal file
120
src/pages/taskDetails/components/QuickOperation.vue
Normal 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>
|
||||||
91
src/pages/taskDetails/components/Resubmit.vue
Normal file
91
src/pages/taskDetails/components/Resubmit.vue
Normal 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>
|
||||||
@@ -6,6 +6,8 @@ import Api from "../../../api/index.js";
|
|||||||
import useTableQuery from "../../../hooks/useTableQuery.js";
|
import useTableQuery from "../../../hooks/useTableQuery.js";
|
||||||
import dayjs from "dayjs";
|
import dayjs from "dayjs";
|
||||||
import ReplyMessageModal from "./replyMessageModal.vue";
|
import ReplyMessageModal from "./replyMessageModal.vue";
|
||||||
|
import QuickOperation from "./QuickOperation.vue";
|
||||||
|
import XImage from "../../../components/XImage.vue";
|
||||||
|
|
||||||
const {data} = defineProps({
|
const {data} = defineProps({
|
||||||
data: {
|
data: {
|
||||||
@@ -17,12 +19,15 @@ const {data} = defineProps({
|
|||||||
const po = reactive({
|
const po = reactive({
|
||||||
id: data.children.id,
|
id: data.children.id,
|
||||||
});
|
});
|
||||||
const vo = reactive({});
|
const vo = reactive({
|
||||||
|
intervention: null,
|
||||||
|
});
|
||||||
|
|
||||||
const {loading, pagination, initFetchData, fetchData} = useTableQuery({
|
const {loading, pagination, initFetchData, fetchData} = useTableQuery({
|
||||||
api: Api.system.getExchangeLog,
|
api: Api.system.getExchangeLog,
|
||||||
parameter: po,
|
parameter: po,
|
||||||
callback: (data) => {
|
callback: (data) => {
|
||||||
|
console.log(data);
|
||||||
Object.assign(vo, data);
|
Object.assign(vo, data);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -42,7 +47,7 @@ const {loading, pagination, initFetchData, fetchData} = useTableQuery({
|
|||||||
<view class="chat-box">
|
<view class="chat-box">
|
||||||
<view v-for="v in vo.rows" class="!mb-[24rpx]">
|
<view v-for="v in vo.rows" class="!mb-[24rpx]">
|
||||||
<view :class="['!flex gap-[12rpx]', v.right === 1 ? 'right-box' : '' ]">
|
<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>
|
:src="v.people.avatar"></image>
|
||||||
<view class="flex-grow content !flex flex-col">
|
<view class="flex-grow content !flex flex-col">
|
||||||
<view class="time">{{ dayjs(v.createtime).format('MM月DD日 HH:mm') }}</view>
|
<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>
|
||||||
</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>
|
||||||
</view>
|
</view>
|
||||||
</scroll-view>
|
</scroll-view>
|
||||||
|
|
||||||
|
|
||||||
<view class="p-[24rpx] !pt-0 !flex gap-[22rpx]">
|
<view class="p-[24rpx] !pt-0 !flex gap-[22rpx]">
|
||||||
<x-button class="!w-[220rpx]">
|
<reply-message-modal :data="data" :intervention="true" @success="fetchData">
|
||||||
发起申述
|
<x-button class="!w-[220rpx]">
|
||||||
</x-button>
|
发起申述
|
||||||
|
</x-button>
|
||||||
|
</reply-message-modal>
|
||||||
<reply-message-modal :data="data"></reply-message-modal>
|
<reply-message-modal :data="data"></reply-message-modal>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
|
|||||||
@@ -1,15 +1,24 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
import {ref, reactive} from "vue";
|
import {ref, reactive, defineEmits} from "vue";
|
||||||
import XModal from "../../../components/XModal.vue";
|
import XModal from "../../../components/XModal.vue";
|
||||||
import rback from "../../../static/icons/rout-back.png";
|
import rback from "../../../static/icons/rout-back.png";
|
||||||
import XButton from "../../../components/XButton.vue";
|
import XButton from "../../../components/XButton.vue";
|
||||||
import {showToast, uploadFile} from "../../../utils/uils.js";
|
import {showToast, uploadFile} from "../../../utils/uils.js";
|
||||||
import Api from "../../../api/index.js";
|
import Api from "../../../api/index.js";
|
||||||
|
|
||||||
const {data} = defineProps({
|
const emits = defineEmits(['success']);
|
||||||
|
const {data, backId, intervention} = defineProps({
|
||||||
data: {
|
data: {
|
||||||
type: Object,
|
type: Object,
|
||||||
default: {},
|
default: {},
|
||||||
|
},
|
||||||
|
backId: {
|
||||||
|
type: Number,
|
||||||
|
default: null,
|
||||||
|
},
|
||||||
|
intervention: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false,
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
const show = ref(false);
|
const show = ref(false);
|
||||||
@@ -21,27 +30,33 @@ const form = reactive({
|
|||||||
});
|
});
|
||||||
|
|
||||||
const upload = async () => {
|
const upload = async () => {
|
||||||
const res = await uploadFile({
|
const [res] = await uploadFile({
|
||||||
count: 9,
|
count: 9,
|
||||||
});
|
});
|
||||||
form.images.push(...res);
|
const {data} = res;
|
||||||
|
form.images.push(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
const success = async () => {
|
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);
|
showToast(msg);
|
||||||
form.images.length = 0;
|
form.images.length = 0;
|
||||||
form.content = null;
|
form.content = null;
|
||||||
form.pattern = 0;
|
form.pattern = 0;
|
||||||
show.value = false;
|
show.value = false;
|
||||||
|
emits('success');
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<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>
|
<image :src="rback" class="!w-[22rpx]" mode="widthFix"></image>
|
||||||
回复
|
回复
|
||||||
</x-button>
|
</x-button>
|
||||||
|
<view v-else @click="show=true">
|
||||||
|
<slot></slot>
|
||||||
|
</view>
|
||||||
|
|
||||||
<x-modal
|
<x-modal
|
||||||
v-model:show="show">
|
v-model:show="show">
|
||||||
@@ -64,7 +79,8 @@ const success = async () => {
|
|||||||
</view>
|
</view>
|
||||||
|
|
||||||
<view class="!mt-[20rpx] bg-[#F2F3F5] rounded-[4rpx] py-[16rpx] px-[30rpx]">
|
<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>
|
||||||
|
|
||||||
<view class="text-[#86909C] test-24r !mt-[20rpx]">提示:请确认内容无误后提交,提交虚假回复会封号</view>
|
<view class="text-[#86909C] test-24r !mt-[20rpx]">提示:请确认内容无误后提交,提交虚假回复会封号</view>
|
||||||
|
|||||||
@@ -51,8 +51,9 @@ const getData = async (id) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
onLoad((options) => {
|
onLoad((options) => {
|
||||||
const {id, home: _home} = options;
|
const {id, home: _home, tab} = options;
|
||||||
home.value = _home === '1';
|
home.value = _home === '1';
|
||||||
|
if (tab) currentTabs.value = Number(tab);
|
||||||
getData(id);
|
getData(id);
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -114,7 +115,7 @@ onMounted(() => {
|
|||||||
<view class="goods-st-info">发布平台</view>
|
<view class="goods-st-info">发布平台</view>
|
||||||
</view>
|
</view>
|
||||||
<view class="bg-[#E8F3FF] px-[26rpx] py-[20rpx] rounded-[8rpx]">
|
<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 class="goods-st-info">任务报酬</view>
|
||||||
</view>
|
</view>
|
||||||
<view class="bg-[#E8F3FF] px-[26rpx] py-[20rpx] rounded-[8rpx]">
|
<view class="bg-[#E8F3FF] px-[26rpx] py-[20rpx] rounded-[8rpx]">
|
||||||
@@ -170,7 +171,7 @@ onMounted(() => {
|
|||||||
<Suspense>
|
<Suspense>
|
||||||
<template #default>
|
<template #default>
|
||||||
<div class="h-full flex flex-col items-start">
|
<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>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
|||||||
@@ -5,12 +5,13 @@ import {showToast} from "../../../utils/uils.js";
|
|||||||
import {useUserStore} from "../../../pinia/UserStore/index.js";
|
import {useUserStore} from "../../../pinia/UserStore/index.js";
|
||||||
import dayjs from "dayjs";
|
import dayjs from "dayjs";
|
||||||
import Api from "../../../api/index.js";
|
import Api from "../../../api/index.js";
|
||||||
|
import {debounce} from "lodash";
|
||||||
|
|
||||||
const UserStore = useUserStore();
|
const UserStore = useUserStore();
|
||||||
const emits = defineEmits(['success']);
|
const emits = defineEmits(['success']);
|
||||||
const show = ref(false);
|
const show = ref(false);
|
||||||
const defaultDrawal = ref();
|
const defaultDrawal = ref();
|
||||||
const open = async () => {
|
const open = debounce(async () => {
|
||||||
if (UserStore.userInfo.money < 1) {
|
if (UserStore.userInfo.money < 1) {
|
||||||
showToast({
|
showToast({
|
||||||
icon: 'error',
|
icon: 'error',
|
||||||
@@ -28,9 +29,9 @@ const open = async () => {
|
|||||||
const {data} = await Api.system.getDefaultWithdrawalInfo();
|
const {data} = await Api.system.getDefaultWithdrawalInfo();
|
||||||
defaultDrawal.value = data;
|
defaultDrawal.value = data;
|
||||||
show.value = true;
|
show.value = true;
|
||||||
}
|
}, 500);
|
||||||
|
|
||||||
const success = async () => {
|
const success = debounce(async () => {
|
||||||
const {msg} = await Api.system.postWithdrawal({
|
const {msg} = await Api.system.postWithdrawal({
|
||||||
id: defaultDrawal.value.id,
|
id: defaultDrawal.value.id,
|
||||||
money: UserStore.userInfo.money,
|
money: UserStore.userInfo.money,
|
||||||
@@ -40,7 +41,7 @@ const success = async () => {
|
|||||||
title: msg,
|
title: msg,
|
||||||
});
|
});
|
||||||
emits('success');
|
emits('success');
|
||||||
}
|
}, 500);
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
|
|||||||
BIN
src/static/icons/close2.png
Normal file
BIN
src/static/icons/close2.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.3 KiB |
BIN
src/static/icons/yy.png
Normal file
BIN
src/static/icons/yy.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 749 B |
Reference in New Issue
Block a user