|
@@ -1,68 +1,190 @@
|
|
-<template>
|
|
|
|
- <div>
|
|
|
|
- <div class="asj-h2">分时调价</div>
|
|
|
|
- <SelectTmpl :data="formData" />
|
|
|
|
- <el-form :model="formData" label-position="top" style="margin-top: 20px" ref="formRef">
|
|
|
|
- <el-form-item prop="rule.conditions" :rules="[{ validator: checkConditions, trigger: 'xxx' }]">
|
|
|
|
- <template #label>
|
|
|
|
- <span class="asj-h3">设置竞价</span>
|
|
|
|
- </template>
|
|
|
|
- <TimerBidTable :data="formData.rule.conditions" @click="formRef.clearValidate('rule.conditions')" :disabled="formData.useTmpl" />
|
|
|
|
- </el-form-item>
|
|
|
|
- </el-form>
|
|
|
|
- <div class="auto-page-foot">
|
|
|
|
- <el-button style="width: 200px" @click="cancel">取消</el-button>
|
|
|
|
- <el-button style="width: 200px" type="primary" @click="submit">提交</el-button>
|
|
|
|
- </div>
|
|
|
|
- </div>
|
|
|
|
-</template>
|
|
|
|
-
|
|
|
|
<script lang="ts" setup>
|
|
<script lang="ts" setup>
|
|
-import { ref, onMounted, Ref, watch } from 'vue'
|
|
|
|
-import TimerBidTable from '/@/components/TimerBidTable/index.vue'
|
|
|
|
-import SelectTmpl from './select-tmpl.vue'
|
|
|
|
-import { userFormData } from './common'
|
|
|
|
-import XEUtils from 'xe-utils'
|
|
|
|
|
|
+import { ref, onMounted, Ref, watch, reactive } from 'vue';
|
|
|
|
+import TimerBidTable from '/@/components/TimerBidTable/index.vue';
|
|
|
|
+import SelectTmpl from './select-tmpl.vue';
|
|
|
|
+import { userFormData } from './common';
|
|
|
|
+import XEUtils from 'xe-utils';
|
|
|
|
+import dayjs from 'dayjs';
|
|
|
|
|
|
interface Props {
|
|
interface Props {
|
|
data: {
|
|
data: {
|
|
- campaignId: string
|
|
|
|
- campaignType: string
|
|
|
|
- profileId: string
|
|
|
|
- ruleType: number
|
|
|
|
- }
|
|
|
|
- RuleStatusButton?: { [key: string]: any }
|
|
|
|
|
|
+ campaignId: string;
|
|
|
|
+ campaignType: string;
|
|
|
|
+ profileId: string;
|
|
|
|
+ ruleType: number;
|
|
|
|
+ };
|
|
|
|
+ RuleStatusButton?: { [key: string]: any };
|
|
}
|
|
}
|
|
-const props = defineProps<Props>()
|
|
|
|
-const emits = defineEmits(['refresh'])
|
|
|
|
-const formRef = ref()
|
|
|
|
-const { formData, submitFormData } = userFormData(props)
|
|
|
|
|
|
+
|
|
|
|
+const props = defineProps<Props>();
|
|
|
|
+const emits = defineEmits(['refresh']);
|
|
|
|
+
|
|
|
|
+const formRef = ref();
|
|
|
|
+const { formData, submitFormData } = userFormData(props);
|
|
|
|
|
|
const checkConditions = (rule: any, value: any, callback: any) => {
|
|
const checkConditions = (rule: any, value: any, callback: any) => {
|
|
for (const bidList of formData.value.rule.conditions) {
|
|
for (const bidList of formData.value.rule.conditions) {
|
|
for (const val of bidList) {
|
|
for (const val of bidList) {
|
|
if (val > 0) {
|
|
if (val > 0) {
|
|
- return callback()
|
|
|
|
|
|
+ return callback();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- callback(new Error('请先设置竞价!'))
|
|
|
|
-}
|
|
|
|
|
|
+ callback(new Error('请先设置竞价!'));
|
|
|
|
+};
|
|
const submit = async () => {
|
|
const submit = async () => {
|
|
formRef.value.validate(async (valid: any) => {
|
|
formRef.value.validate(async (valid: any) => {
|
|
if (valid) {
|
|
if (valid) {
|
|
- await submitFormData()
|
|
|
|
- emits('refresh')
|
|
|
|
|
|
+ await submitFormData();
|
|
|
|
+ emits('refresh');
|
|
} else {
|
|
} else {
|
|
- console.log('验证失败')
|
|
|
|
|
|
+ console.log('验证失败');
|
|
}
|
|
}
|
|
- })
|
|
|
|
|
|
+ });
|
|
|
|
+};
|
|
|
|
+const cancel = async () => {
|
|
|
|
+ emits('refresh');
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+const timeRange = ref('Option1');
|
|
|
|
+const schedule = ref('Option1');
|
|
|
|
+const bid = ref('');
|
|
|
|
+const timeRangeOptions = [
|
|
|
|
+ {
|
|
|
|
+ value: 'Option1',
|
|
|
|
+ label: '24小时: 00:00-23:59',
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ value: 'Option2',
|
|
|
|
+ label: '凌晨: 00:00-06:59',
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ value: 'Option3',
|
|
|
|
+ label: '上午: 7:00-11:59',
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ value: 'Option4',
|
|
|
|
+ label: '工作时: 9:00-16:59',
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ value: 'Option5',
|
|
|
|
+ label: '下午: 12:00-16:59',
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ value: 'Option6',
|
|
|
|
+ label: '晚上: 17:00-20:59',
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ value: 'Option7',
|
|
|
|
+ label: '深夜: 21:00-23:59',
|
|
|
|
+ },
|
|
|
|
+];
|
|
|
|
+const scheduleOptions = [
|
|
|
|
+ {
|
|
|
|
+ value: 'Option1',
|
|
|
|
+ label: '每一天',
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ value: 'Option2',
|
|
|
|
+ label: '仅在工作日',
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ value: 'Option3',
|
|
|
|
+ label: '仅在周末',
|
|
|
|
+ },
|
|
|
|
+];
|
|
|
|
+
|
|
|
|
+const isVisible = ref(true)
|
|
|
|
+function handleClose() {
|
|
|
|
+ isVisible.value = false
|
|
}
|
|
}
|
|
|
|
+</script>
|
|
|
|
|
|
-const cancel = async () => {
|
|
|
|
- emits('refresh')
|
|
|
|
|
|
+<template>
|
|
|
|
+ <div class="mx-5">
|
|
|
|
+ <div class="asj-h2">分时调价</div>
|
|
|
|
+ <div class="mt-3.5">
|
|
|
|
+ 规则执行时区: PDT
|
|
|
|
+ <div>
|
|
|
|
+ <el-tag v-if="isVisible" closable @close="handleClose" color="#e7edf4" class="custom-tag">
|
|
|
|
+ <template #default>
|
|
|
|
+ <div class="tag-content">
|
|
|
|
+ <strong>自动化分时规则:</strong>
|
|
|
|
+ <p>
|
|
|
|
+ 1. 应用分时调价后,如需手动修改竞价,只能在Xmars操作。在亚马逊后台或其他第三方系统进行的调价操作,竞价将会被Xmars当前时段的自动化执行结果覆盖。
|
|
|
|
+ </p>
|
|
|
|
+ <p>2. 广告活动开启分时调价,规则的修改将在下一个整点生效。</p>
|
|
|
|
+ </div>
|
|
|
|
+ </template>
|
|
|
|
+ </el-tag>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ <SelectTmpl :data="formData" />
|
|
|
|
+ <el-card class="mt-3">
|
|
|
|
+ <el-form :model="formData" label-position="top" style="margin-top: 20px" ref="formRef">
|
|
|
|
+ <el-form-item prop="rule.conditions" :rules="[{ validator: checkConditions, trigger: 'xxx' }]">
|
|
|
|
+ <template #label>
|
|
|
|
+ <span class="custom-title-icon"></span>
|
|
|
|
+ <span class="asj-h3">设置竞价</span>
|
|
|
|
+ </template>
|
|
|
|
+ <div class="flex flex-col">
|
|
|
|
+ <div class="flex gap-2 my-2">
|
|
|
|
+ <el-select v-model="timeRange">
|
|
|
|
+ <el-option v-for="item in timeRangeOptions" :key="item.value" :label="item.label" :value="item.value" />
|
|
|
|
+ </el-select>
|
|
|
|
+ <el-select v-model="schedule">
|
|
|
|
+ <el-option v-for="item in scheduleOptions" :key="item.value" :label="item.label" :value="item.value" />
|
|
|
|
+ </el-select>
|
|
|
|
+ <el-input v-model="bid" style="width: 150px" placeholder="1.0"></el-input>
|
|
|
|
+ <el-button link class="active-btn" style="color: #3c58af">应用</el-button>
|
|
|
|
+ </div>
|
|
|
|
+ <TimerBidTable
|
|
|
|
+ :data="formData.rule.conditions"
|
|
|
|
+ @click="formRef.clearValidate('rule.conditions')"
|
|
|
|
+ :disabled="formData.useTmpl" />
|
|
|
|
+ </div>
|
|
|
|
+ </el-form-item>
|
|
|
|
+ </el-form>
|
|
|
|
+ </el-card>
|
|
|
|
+
|
|
|
|
+ <div class="auto-page-foot">
|
|
|
|
+ <el-button style="width: 200px" @click="cancel">取消</el-button>
|
|
|
|
+ <el-button style="width: 200px" type="primary" @click="submit">提交</el-button>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+</template>
|
|
|
|
+
|
|
|
|
+<style scoped>
|
|
|
|
+.active-btn:hover {
|
|
|
|
+ color: #7a9ce4 !important; /* 如果需要改变字体颜色 */
|
|
|
|
+ transition: all 0.3s; /* 添加过渡效果 */
|
|
}
|
|
}
|
|
|
|
|
|
-</script>
|
|
|
|
|
|
+.custom-title-icon {
|
|
|
|
+ padding-right: 10px;
|
|
|
|
+}
|
|
|
|
|
|
-<style scoped></style>
|
|
|
|
|
|
+.custom-title-icon:before {
|
|
|
|
+ content: '';
|
|
|
|
+ width: 4px;
|
|
|
|
+ height: 15px;
|
|
|
|
+ background: #3569d6;
|
|
|
|
+ position: absolute;
|
|
|
|
+ transform: translateY(25%);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+.custom-tag {
|
|
|
|
+ height: auto;
|
|
|
|
+ padding: 8px 8px 8px 16px;
|
|
|
|
+ color: #505968;
|
|
|
|
+ border-color: #abbbd8;
|
|
|
|
+ align-items: flex-start !important;
|
|
|
|
+ white-space: normal;
|
|
|
|
+ line-height: 1.5;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+.tag-content {
|
|
|
|
+ display: block;
|
|
|
|
+ max-width: 100%;
|
|
|
|
+}
|
|
|
|
+</style>
|