This commit is contained in:
2025-05-20 14:11:32 +08:00
parent 8f6a003c93
commit c06d377b8f
10 changed files with 294 additions and 74 deletions

View File

@@ -4,7 +4,7 @@
"version": "0.0.1",
"type": "module",
"scripts": {
"dev": "vite",
"dev": "vite --mode=production",
"build": "vite build --mode=production",
"preview": "vite preview",
"commit": "git add . && git commit -m 'update' && git push"

View File

@@ -2,11 +2,16 @@
import Api from "../../../../../api/index.js";
import XSelect from "../../../../../components/XSelect/index.vue";
import XTimePicker from "../../../../../components/XTimePicker/XTimePicker.vue";
import {dayjs} from "@arco-design/web-vue/es/_utils/date.js";
const {form} = defineProps({
const {form, index} = defineProps({
form: {
type: Object,
default: {}
},
index: {
type: Number,
default: null
}
});
const po = defineModel('po');
@@ -17,7 +22,11 @@ const po = defineModel('po');
<a-form
:auto-label-width="true">
<a-form-item label="回填时间">
<x-time-picker v-model:start="po.start_time" v-model:end="po.end_time"></x-time-picker>
<x-time-picker
:disabledDate="(current) => dayjs(current).isBefore(dayjs(form.start_time))"
v-model:start="po.start_time"
v-model:end="po.end_time">
</x-time-picker>
<div class="ml-[6px]">之间</div>
<a-button type="primary" class="ml-[38px]">一键快速设置</a-button>
</a-form-item>
@@ -26,6 +35,7 @@ const po = defineModel('po');
<XSelect
class="w-auto"
:init="true"
:disabled="index === 0 && form.is_comment === 1"
:api-po="{id: form.platform_id}"
v-model:model-value="po.content_id"
:api="Api.merchant.getChooseContent">

View File

@@ -1,13 +1,50 @@
<script setup>
import {useTemplateRef} from "vue";
import Api from "../../../../../api/index.js";
import XSelect from "../../../../../components/XSelect/index.vue";
import FormTitle from "../../../../../components/FormTitle/index.vue";
import {Message} from "@arco-design/web-vue";
const emits = defineEmits(['success']);
const form = defineModel('form');
const formRef = useTemplateRef('formRef');
const rules = {
platform_id: [{
required: true,
message: '投放渠道不能为空',
}],
material_id: [{
required: true,
message: '素材类型不能为空',
}],
goods_name: [{
required: true,
message: '产品名称不能为空',
}],
goods_intro: [{
required: true,
message: '产品功效不能为空',
}],
children_num: [{
required: true,
message: '包含子任务数量不能为空',
}],
children_price: [{
required: true,
message: '单个子任务价格不能为空',
}],
case_url: [],
}
const success = () => {
const success = async () => {
formRef.value.validate().then((res) => {
if (res) {
const firstKey = Object.keys(res)[0];
Message.warning(res[firstKey].message);
} else {
emits('success', form.value);
}
});
}
</script>
@@ -17,40 +54,41 @@ const success = () => {
<a-form
class="mt-[30px]"
ref="formRef"
:model="form"
:rules="rules"
:label-col-props="{span: 3}"
:wrapper-col-props="{span: 12, offset: 1}">
<a-form-item label="投放渠道">
<a-form-item label="投放渠道" field="platform_id">
<XSelect
:init="true"
v-model:model-value="form.platform_id"
:api="Api.merchant.getPlatformList">
</XSelect>
</a-form-item>
<a-form-item label="素材类型">
<a-form-item label="素材类型" v-if="form.platform_id" field="material_id">
<XSelect
:init="true"
v-if="form.platform_id"
:api-po="{id: form.platform_id}"
v-model:model-value="form.material_id"
:api="Api.merchant.getMaterialType">
</XSelect>
</a-form-item>
<a-form-item label="产品名称">
<a-form-item label="产品名称" field="goods_name">
<a-input v-model:model-value="form.goods_name" placeholder="请输入产品名称,如:花露水"></a-input>
</a-form-item>
<a-form-item label="产品功效">
<a-form-item label="产品功效" field="goods_intro">
<a-input v-model:model-value="form.goods_intro" placeholder="请输入产品功效,如:驱蚊"></a-input>
</a-form-item>
<a-form-item label="包含子任务数量">
<a-form-item label="包含子任务数量" field="children_num">
<a-input v-model:model-value="form.children_num"
placeholder="请输入代发的账号数量最多一个任务可包含50个子任务"></a-input>
</a-form-item>
<a-form-item label="单个子任务价格">
<a-form-item label="单个子任务价格" field="children_price">
<a-input v-model:model-value="form.children_price" placeholder="请输入单个子任务价格"></a-input>
</a-form-item>
<a-form-item label="案例链接">
<a-form-item label="案例链接" field="case_url">
<a-input v-model:model-value="form.case_url" placeholder="请输入案例链接">
<template #prepend>http://</template>
</a-input>

View File

@@ -3,12 +3,37 @@ import Api from "../../../../../api/index.js";
import XSelect from "../../../../../components/XSelect/index.vue";
import FormTitle from "../../../../../components/FormTitle/index.vue";
import UploadOne from "../../../../../components/upload/UploadOne.vue";
import {useTemplateRef} from "vue";
import {Message} from "@arco-design/web-vue";
const emits = defineEmits(['success', 'prev']);
const form = defineModel('form');
const formRef = useTemplateRef('formRef');
const rules = {
fb_num: [{
required: true,
message: '发布次数不能为空',
}],
is_identical: [{
required: true,
message: '请选择每次素材是否相同',
}],
duration: [],
special_text: [],
special_images: [],
choose_area: [],
machine: [],
}
const success = () => {
const success = async () => {
formRef.value.validate().then((res) => {
if (res) {
const firstKey = Object.keys(res)[0];
Message.warning(res[firstKey].message);
} else {
emits('success', form.value);
}
});
}
</script>
@@ -18,10 +43,12 @@ const success = () => {
<a-form
class="mt-[30px]"
ref="formRef"
:model="form"
:rules="rules"
:label-col-props="{span: 4}"
:wrapper-col-props="{span: 12, offset: 1}">
<a-form-item label="发布次数">
<a-form-item label="发布次数" field="fb_num">
<XSelect
v-model:model-value="form.fb_num"
:init="true"
@@ -29,14 +56,14 @@ const success = () => {
</XSelect>
</a-form-item>
<a-form-item label="每次素材是否相同">
<a-form-item label="每次素材是否相同" field="is_identical">
<a-radio-group v-model:model-value="form.is_identical">
<a-radio :value="1">相同</a-radio>
<a-radio :value="0">不同</a-radio>
</a-radio-group>
</a-form-item>
<a-form-item label="每次发布间隔时长">
<a-form-item label="每次发布间隔时长" field="duration" v-if="form.fb_num > 1">
<XSelect
v-model:model-value="form.duration"
placeholder="无要求"
@@ -45,17 +72,17 @@ const success = () => {
</XSelect>
</a-form-item>
<a-form-item label="特殊要求">
<a-form-item label="特殊要求" field="special_text">
<a-input v-model:model-value="form.special_text"
placeholder="请输入特殊要求,如:请勿截图,必须下载原图再上传到抖音"></a-input>
</a-form-item>
<a-form-item label="">
<a-form-item label="" field="special_images">
{{ form.special_images }}
<upload-one :file="form.special_images" size="100px" :api="Api.system.uploadFile2"></upload-one>
</a-form-item>
<a-form-item label="选择限制 IP">
<a-form-item label="选择限制 IP" field="choose_area">
<XSelect
multiple
:max-tag-count="4"
@@ -65,7 +92,7 @@ const success = () => {
</XSelect>
</a-form-item>
<a-form-item label="每个设备可参加几次">
<a-form-item label="每个设备可参加几次" field="machine">
<a-input-number placeholder="敬请期待" disabled></a-input-number>
</a-form-item>

View File

@@ -1,11 +1,51 @@
<script setup>
import FormTitle from "../../../../../components/FormTitle/index.vue";
import {useTemplateRef} from "vue";
import {Message} from "@arco-design/web-vue";
const emits = defineEmits(['success', 'prev']);
const form = defineModel('form');
const formRef = useTemplateRef('formRef');
const rules = {
platform_id: [{
required: true,
message: '投放渠道不能为空',
}],
material_id: [{
required: true,
message: '素材类型不能为空',
}],
goods_name: [{
required: true,
message: '产品名称不能为空',
}],
goods_intro: [{
required: true,
message: '产品功效不能为空',
}],
children_num: [{
required: true,
message: '包含子任务数量不能为空',
}],
children_price: [{
required: true,
message: '单个子任务价格不能为空',
}],
case_url: [{
required: true,
message: '案例链接不能为空',
}],
}
const success = () => {
const success = async () => {
formRef.value.validate().then((res) => {
if (res) {
const firstKey = Object.keys(res)[0];
Message.warning(res[firstKey].message);
} else {
emits('success', form.value);
}
});
}
</script>
@@ -15,7 +55,9 @@ const success = () => {
<a-form
class="mt-[30px]"
ref="formRef"
:model="form"
:rules="rules"
:label-col-props="{span: 3}"
:wrapper-col-props="{span: 12, offset: 1}">
<a-form-item label="是否需要评论"

View File

@@ -3,18 +3,52 @@ import FormTitle from "../../../../../components/FormTitle/index.vue";
import Backfill from "./Backfill.vue";
import {v4} from "uuid";
import XTimePicker from "../../../../../components/XTimePicker/XTimePicker.vue";
import {useTemplateRef} from "vue";
import {Message} from "@arco-design/web-vue";
import Api from "../../../../../api/index.js";
const INDEX = ['一', '二', '三'];
const emits = defineEmits(['success', 'prev']);
const form = defineModel('form');
const formRef = useTemplateRef('formRef');
const rules = {
start_time: [{
required: true,
message: '任务可接时段不完整',
}],
end_time: [{
required: true,
message: '任务可接时段不完整',
}],
is_other: [],
backfill: [{
required: true,
validator: (value, callback) => {
for (const v of value) {
if (!v.end_time || !v.start_time || !v.content_id) {
callback('回填内容不完整');
}
}
}
}],
}
form.value.backfill.push({
if (form.value.backfill.length === 0) form.value.backfill.push({
id: v4(),
start_time: null,
end_time: null,
content_id: null
});
if (form.value.is_comment === 1) {
Api.merchant.getChooseContent({
id: form.value.platform_id,
}).then(({data}) => {
const k = data.find(v => v.is_comment === 1);
form.value.backfill[0].content_id = k.id;
})
}
const addHT = () => {
form.value.backfill.push({
id: v4(),
@@ -24,8 +58,15 @@ const addHT = () => {
});
}
const success = () => {
const success = async () => {
formRef.value.validate().then((res) => {
if (res) {
const firstKey = Object.keys(res)[0];
Message.warning(res[firstKey].message);
} else {
emits('success', form.value);
}
});
}
</script>
@@ -35,11 +76,13 @@ const success = () => {
<a-form
class="mt-[30px]"
ref="formRef"
:model="form"
:rules="rules"
label-align="right"
:label-col-props="{span: 4}"
:wrapper-col-props="{span: 12, offset: 1}">
<a-form-item label="任务可接时间段" extra="达人可在此时段内接受任务,超出将无法领取任务">
<a-form-item field="start_time" label="任务可接时间段" extra="达人可在此时段内接受任务,超出将无法领取任务">
<x-time-picker v-model:start="form.start_time" v-model:end="form.end_time"></x-time-picker>
</a-form-item>
@@ -59,10 +102,11 @@ const success = () => {
<a-form-item
v-for="(item, index) in form.backfill"
field="backfill"
:key="item.id"
:label="`第${INDEX[index]}次回填`">
<div class="flex flex-col gap-[20px]">
<Backfill :form="form" v-model:po="form.backfill[index]"></Backfill>
<Backfill :form="form" :index="index" v-model:po="form.backfill[index]"></Backfill>
<div class="flex gap-[8px]">
<a-button type="outline">

View File

@@ -2,12 +2,45 @@
import FormTitle from "../../../../../components/FormTitle/index.vue";
import Api from "../../../../../api/index.js";
import XSelect from "../../../../../components/XSelect/index.vue";
import {useTemplateRef} from "vue";
import {Message} from "@arco-design/web-vue";
const emits = defineEmits(['success', 'prev']);
const form = defineModel('form');
const formRef = useTemplateRef('formRef');
const rules = {
retention_time: [{
required: true,
message: '保留时间不能为空',
}],
retention_type: [],
check_time: [{
required: true,
message: '审核时间不能为空',
}],
check_type: [],
back_id: [{
required: true,
message: '结算条件不能为空',
}],
back_time: [{
required: true,
message: '结算时间不能为空',
}],
back_type: [],
}
const success = () => {
if (form.value.backfill[0].content_id) form.value.back_id = form.value.backfill[0].content_id;
const success = async () => {
formRef.value.validate().then((res) => {
if (res) {
const firstKey = Object.keys(res)[0];
Message.warning(res[firstKey].message);
} else {
emits('success', form.value);
}
});
}
</script>
@@ -17,11 +50,13 @@ const success = () => {
<a-form
class="mt-[30px]"
ref="formRef"
:model="form"
:rules="rules"
label-align="right"
:label-col-props="{span: 3}"
:wrapper-col-props="{span: 12, offset: 1}">
<a-form-item label="保留时间" extra="达人发布成功后,该内容需要保留多久才可删除">
<a-form-item field="retention_time" label="保留时间" extra="达人发布成功后,该内容需要保留多久才可删除">
<a-input-number v-model:model-value="form.retention_time" placeholder="请输入保留时间" :min="1"
:max="60"></a-input-number>
<a-radio-group v-model:model-value="form.retention_type" type="button" class="ml-[10px] flex-shrink-0">
@@ -30,7 +65,7 @@ const success = () => {
</a-radio-group>
</a-form-item>
<a-form-item label="审核时间" extra="商家收到每次回填后,多长时间内审核">
<a-form-item field="check_time" label="审核时间" extra="商家收到每次回填后,多长时间内审核">
<a-input-number v-model:model-value="form.check_time" placeholder="请输入保留时间" :min="1"
:max="60"></a-input-number>
<a-radio-group v-model:model-value="form.check_type" type="button" class="ml-[10px] flex-shrink-0">
@@ -39,31 +74,28 @@ const success = () => {
</a-radio-group>
</a-form-item>
<a-form-item label="确认结算时间" extra="达人回传的信息审核通过后,在多长时间内确认结算">
<a-form-item field="back_id" label="确认结算时间" extra="达人回传的信息审核通过后,在多长时间内确认结算">
<div id="block">
<a-form>
<a-form-item label="结算条件" class="whitespace-nowrap">
<a-form-item field="back_id" label="结算条件" class="whitespace-nowrap">
达人回传
<XSelect
disabled
class="mx-[6px]"
:init="true"
:api-po="{id: form.platform_id}"
:default-value="form.backfill[0].content_id"
v-model:model-value="form.back_id"
:api="Api.merchant.getChooseContent">
</XSelect>
且审核通过
</a-form-item>
<a-form-item label="结算时间">
<a-input v-model:model-value="form.back_time" placeholder="请入时间"></a-input>
<a-form-item field="back_time" label="结算时间">
<a-input v-model:model-value="form.back_time" placeholder="请入时间"></a-input>
<a-radio-group v-model:model-value="form.back_type" type="button"
class="ml-[10px] flex-shrink-0">
<a-radio :value="1">分钟</a-radio>
<a-radio :value="2">小时</a-radio>
</a-radio-group>
</a-form-item>
</a-form>
</div>
</a-form-item>

View File

@@ -1,13 +1,27 @@
<script setup>
import FormTitle from "../../../../../components/FormTitle/index.vue";
import XAutoComplete from "../../../../../components/XAutoComplete/index.vue";
import {onMounted, reactive} from "vue";
import {onMounted, reactive, useTemplateRef} from "vue";
import {v4} from "uuid";
import Api from "../../../../../api/index.js";
import {Message} from "@arco-design/web-vue";
const settltment_after_list = reactive([]);
const emits = defineEmits(['success', 'prev']);
const form = defineModel('form');
const formRef = useTemplateRef('formRef');
const rules = {
settltment_before: [{
validator: (value, callback) => {
console.log(value)
for (const v of value) {
if (!v.intro || !v.ratio) {
callback('信息不完整');
}
}
}
}],
}
const addHT = () => {
form.value.settltment_before.push({
@@ -17,8 +31,15 @@ const addHT = () => {
});
}
const success = () => {
const success = async () => {
formRef.value.validate().then((res) => {
if (res) {
const firstKey = Object.keys(res)[0];
Message.warning(res[firstKey].message);
} else {
emits('success', form.value);
}
});
}
onMounted(() => {
@@ -35,12 +56,14 @@ onMounted(() => {
<a-form
class="mt-[30px]"
ref="formRef"
:model="form"
:rules="rules"
label-align="right"
:label-col-props="{span: 3}"
:wrapper-col-props="{span: 12, offset: 1}">
<a-form-item label="结算前">
<a-form-item label="结算前" field="settltment_before">
<div class="w-full flex justify-between">
<div class="max-w-[500px] info" v-if="!form.settltment_before.length>0">
*哪种情况少结算及对应的扣除比例当天发其他广告未按照要求评论未按照要求回填建议最少设置一个未按要求发布作品扣款100%的要求
@@ -58,8 +81,12 @@ onMounted(() => {
:apiPo="{platform_id: form.platform_id}">
</x-auto-complete>
扣除
<a-input-number class="w-[150px]" v-model:model-value="item.ratio"
:max="100"></a-input-number>
<a-input-number
class="w-[150px]"
:precision="0"
v-model:model-value="item.ratio"
:max="100">
</a-input-number>
%金额
<div class="ml-auto flex gap-[8px]">

View File

@@ -10,7 +10,6 @@ import NewTask7 from "./components/new-task-7.vue";
import {useRoute} from "vue-router";
import Api from "../../../../api/index.js";
import {deleteObjectFields} from "../../../../utils/index.js";
import {v4} from "uuid";
import {Message} from "@arco-design/web-vue";
const routes = useRoute();
@@ -43,18 +42,14 @@ const form = reactive({
backfill: [],
retention_time: null,
retention_type: 0,
retention_type: 2,
check_time: null,
check_type: 0,
check_type: 1,
back_id: null,
back_time: null,
back_type: 0,
back_type: 1,
settltment_before: [{
id: v4(),
intro: null,
ratio: null,
}],
settltment_before: [],
});
const init = () => {

View File

@@ -198,14 +198,19 @@ const stopTask = async (id) => {
</template>
<template v-slot:action="{record}">
<div class="flex gap-[16px]">
<a-link :hoverable="false" @click="toPath('/home/task-center/new-task', {id: record.id})">编辑
<a-link
:hoverable="false"
@click="toPath('/home/task-center/new-task', {id: record.id})">
编辑
</a-link>
<a-link :hoverable="false"
@click="record.status >= 2 ? toPath('/home/task-center/look-min-task', {id: record.id}) : Message.warning('审核未通过')">
查看子任务
</a-link>
<a-popconfirm content="确认终止吗?" @ok="stopTask(record.id)">
<a-link :hoverable="false" status="danger">终止</a-link>
<a-link :disabled="!(record.status === 4 || record.status === -2)" :hoverable="false"
status="danger">终止
</a-link>
</a-popconfirm>
</div>
</template>