|
@@ -0,0 +1,470 @@
|
|
1
|
+<template>
|
|
2
|
+ <Dialog :dialogVisible="dialogShow" @confirm="confirmEvent" @close="closeEvent" :cancleText="pageInfo.cancleText"
|
|
3
|
+ :closeOnModal="false" :hasBtn="pageInfo.hasBtn" :destroyOnCloseFlag="true" width="800px" dialog-title="批量修改日预算">
|
|
4
|
+ <template v-slot:content>
|
|
5
|
+ <div class="dialogBox" v-if="pageInfo.schedule == 1">
|
|
6
|
+ <div class="batch-title">已选{{ pageInfo.multipleSelection.length }}个可操作媒体账户</div>
|
|
7
|
+ <div class="flex bMar15">
|
|
8
|
+ <span class="form-block-item-title">修改规则</span>
|
|
9
|
+ <el-radio-group v-model="pageInfo.modifyRuleValue" size="default">
|
|
10
|
+ <template v-for="item in modifyRule">
|
|
11
|
+ <el-radio-button :label="item.value">{{ item.label }}</el-radio-button>
|
|
12
|
+ </template>
|
|
13
|
+ </el-radio-group>
|
|
14
|
+ </div>
|
|
15
|
+ <div class="flex_start bMar15">
|
|
16
|
+ <span class="form-block-item-title">预算</span>
|
|
17
|
+ <div class="flex_start">
|
|
18
|
+ <el-select v-model="pageInfo.selectValue" style="width: 115px" @change="selectChange">
|
|
19
|
+ <el-option :label="item.label" :value="item.value" v-for="item in selectList" />
|
|
20
|
+ </el-select>
|
|
21
|
+ <div>
|
|
22
|
+ <el-input v-model="pageInfo.inputValue" :class="pageInfo.mainInputError ? 'inputError' : ''"
|
|
23
|
+ v-if="pageInfo.selectValue != 6" style="width:260px" @input="onChangeInput('mainInput')">
|
|
24
|
+ <template #suffix>
|
|
25
|
+ <span>{{ selectList.filter((v) => v.value == pageInfo.selectValue)[0]?.unit }}</span>
|
|
26
|
+ </template>
|
|
27
|
+ </el-input>
|
|
28
|
+ <div class="error" v-if="pageInfo.mainInputError">{{ pageInfo.mainInputErrHint }}</div>
|
|
29
|
+ </div>
|
|
30
|
+ <el-tooltip placement="top" content="选中广告主账户预算包含不限,不可以设置此内容"
|
|
31
|
+ :disabled="!(pageInfo.selectValue == 1 || pageInfo.selectValue == 6 ? false : pageInfo.isNoLimit)"
|
|
32
|
+ effect="light">
|
|
33
|
+ <span>
|
|
34
|
+ <el-button type="primary" class="lMar10"
|
|
35
|
+ :disabled="pageInfo.selectValue == 1 || pageInfo.selectValue == 6 ? false : pageInfo.isNoLimit"
|
|
36
|
+ @click="application">应 用</el-button>
|
|
37
|
+ </span>
|
|
38
|
+ </el-tooltip>
|
|
39
|
+ </div>
|
|
40
|
+ </div>
|
|
41
|
+ <!-- 更改预算 table -->
|
|
42
|
+ <el-table :data="pageInfo.multipleSelection" :header-cell-style="tableHeaderStyle" border style="width: 100%">
|
|
43
|
+ <el-table-column prop="advertiser_id" label="广告主账户" width="180" />
|
|
44
|
+ <el-table-column label="日预算" width="180" align="right">
|
|
45
|
+ <template #default="scope">
|
|
46
|
+ {{ scope.row.daily_budget || '不限' }}
|
|
47
|
+ </template>
|
|
48
|
+ </el-table-column>
|
|
49
|
+ <el-table-column label="分别修改日预算">
|
|
50
|
+ <template #default="scope">
|
|
51
|
+ <el-input v-model="scope.row.modifyDailyBudget"
|
|
52
|
+ :class="scope.row.inputError != '' && scope.row.inputError ? 'inputError' : ''" placeholder="请输入日预算"
|
|
53
|
+ style="width:260px" @input="onChangeInput('tableInput', scope.$index)"></el-input>
|
|
54
|
+ <div class="error" v-if="scope.row.inputError">{{ scope.row.inputError }}</div>
|
|
55
|
+ </template>
|
|
56
|
+ </el-table-column>
|
|
57
|
+ </el-table>
|
|
58
|
+ </div>
|
|
59
|
+ <!-- 确定修改操作 -->
|
|
60
|
+ <div class="dialogBox" v-if="pageInfo.schedule == 2 || pageInfo.schedule == 3">
|
|
61
|
+ <div class="flex bMar15" v-if="pageInfo.schedule == 2">
|
|
62
|
+ <el-icon color="#ff9b48">
|
|
63
|
+ <WarningFilled />
|
|
64
|
+ </el-icon>
|
|
65
|
+ <p class="f13 c-555 lMar5">确定要执行以下修改操作吗?此操作不可逆!</p>
|
|
66
|
+ </div>
|
|
67
|
+ <div class="flex bMar15" v-if="pageInfo.schedule == 3">
|
|
68
|
+ <el-icon color="#00b697">
|
|
69
|
+ <CircleCheckFilled />
|
|
70
|
+ </el-icon>
|
|
71
|
+ <p class="f13 c-555 lMar5">修改完成,共{{ pageInfo.successLength }}项修改成功</p>
|
|
72
|
+ </div>
|
|
73
|
+ <el-table :data="pageInfo.multipleSelection" :header-cell-style="tableHeaderStyle" border style="width: 100%">
|
|
74
|
+ <el-table-column prop="advertiser_id" label="广告主账户" />
|
|
75
|
+ <el-table-column label="日预算">
|
|
76
|
+ <template #default="scope">
|
|
77
|
+ <div class="preview-modified">
|
|
78
|
+ <div class="budget">{{ scope.row.daily_budget || '不限' }}</div>
|
|
79
|
+ <div class="modified-info">
|
|
80
|
+ <div class="status">
|
|
81
|
+ <div class="text">{{ scope.row.modifyDailyBudget && scope.row.modifyDailyBudget != '' ? '修改为' :
|
|
82
|
+ '(未修改)' }}</div>
|
|
83
|
+ </div>
|
|
84
|
+ <div class="modified-budget">{{ scope.row.modifyDailyBudget }}</div>
|
|
85
|
+ </div>
|
|
86
|
+ </div>
|
|
87
|
+ </template>
|
|
88
|
+ </el-table-column>
|
|
89
|
+ <el-table-column label="修改结果" v-if="pageInfo.schedule == 3" width="180px">
|
|
90
|
+ <template #default="scope">
|
|
91
|
+ <div class="flex" v-if="scope.row.state != 2 && (scope.row.modifyDailyBudget && scope.row.modifyDailyBudget != '')">
|
|
92
|
+ <el-icon color="#00b697" class="rMar5">
|
|
93
|
+ <CircleCheckFilled />
|
|
94
|
+ </el-icon>
|
|
95
|
+ <span>修改成功</span>
|
|
96
|
+ </div>
|
|
97
|
+ <div class="flex" v-if="scope.row.state == 2">
|
|
98
|
+ <el-icon color="#fb1919" class="rMar5">
|
|
99
|
+ <CircleCloseFilled />
|
|
100
|
+ </el-icon>
|
|
101
|
+ <span>失败:{{ scope.row.err_msg }}</span>
|
|
102
|
+ </div>
|
|
103
|
+ </template>
|
|
104
|
+ </el-table-column>
|
|
105
|
+ </el-table>
|
|
106
|
+ </div>
|
|
107
|
+ </template>
|
|
108
|
+ </Dialog>
|
|
109
|
+</template>
|
|
110
|
+<script setup lang="ts">
|
|
111
|
+import Dialog from '@/components/capsulationMoudle/_dialog.vue'
|
|
112
|
+import { nextTick, onMounted, reactive, ref } from "vue";
|
|
113
|
+import { ElLoading, ElMessage } from "element-plus";
|
|
114
|
+import _ from 'lodash';
|
|
115
|
+import http from '@/http/http'
|
|
116
|
+import { getDay } from '@/common/common';
|
|
117
|
+
|
|
118
|
+const emit = defineEmits<{
|
|
119
|
+ (event: "confirm", val: string): void;
|
|
120
|
+}>();
|
|
121
|
+
|
|
122
|
+const props = withDefaults(defineProps<{
|
|
123
|
+ title?: string,
|
|
124
|
+}>(), {
|
|
125
|
+ title: '提示',
|
|
126
|
+})
|
|
127
|
+
|
|
128
|
+const modifyRule = [
|
|
129
|
+ { label: '立即生效', value: 1 },
|
|
130
|
+ { label: '次日0时生效', value: 2 }
|
|
131
|
+]
|
|
132
|
+const selectList = [
|
|
133
|
+ { label: '修改为', value: 1, unit: '元' },
|
|
134
|
+ { label: '提高', value: 2, unit: '元' },
|
|
135
|
+ { label: '降低', value: 3, unit: '元' },
|
|
136
|
+ { label: '按 % 提高', value: 4, unit: '%' },
|
|
137
|
+ { label: '按 % 降低', value: 5, unit: '%' },
|
|
138
|
+ { label: '不限', value: 6, unit: '' },
|
|
139
|
+]
|
|
140
|
+const pageInfo: any = reactive({})
|
|
141
|
+const nameRef = ref<{ value: any }>()
|
|
142
|
+const confirmEvent = async () => {
|
|
143
|
+ if (pageInfo.schedule == 1) {
|
|
144
|
+ let isErrItem = false;
|
|
145
|
+ let isEmpty = false
|
|
146
|
+ pageInfo.multipleSelection.forEach((item) => {
|
|
147
|
+ if (item.inputError && item.inputError != '') {
|
|
148
|
+ isErrItem = true
|
|
149
|
+ }
|
|
150
|
+ if (item.modifyDailyBudget && item.modifyDailyBudget != '') {
|
|
151
|
+ isEmpty = true;
|
|
152
|
+ }
|
|
153
|
+ })
|
|
154
|
+ if (isErrItem) {
|
|
155
|
+ ElMessage.error('存在不合法日预算,请重新填写不合法的日预算')
|
|
156
|
+ return
|
|
157
|
+ }
|
|
158
|
+ if (!isEmpty) {
|
|
159
|
+ ElMessage.error(' 请修改至少一个广告主账户的日预算!')
|
|
160
|
+ return
|
|
161
|
+ }
|
|
162
|
+ pageInfo.schedule = 2;
|
|
163
|
+ pageInfo.cancleText = '返回编辑'
|
|
164
|
+ return;
|
|
165
|
+ }
|
|
166
|
+ if (pageInfo.schedule == 2) {
|
|
167
|
+ const loading = ElLoading.service({
|
|
168
|
+ lock: true,
|
|
169
|
+ text: '修改操作进行中...',
|
|
170
|
+ background: 'rgba(255, 255, 255, 0.7)',
|
|
171
|
+ })
|
|
172
|
+ let str_val: any[] = []
|
|
173
|
+ pageInfo.multipleSelection.forEach((item) => {
|
|
174
|
+ if (item.modifyDailyBudget && item.modifyDailyBudget != '') {
|
|
175
|
+ str_val.push({
|
|
176
|
+ "account_id": item.advertiser_id,
|
|
177
|
+ "daily_budget": item.modifyDailyBudget == '不限' ? 0 : item.modifyDailyBudget
|
|
178
|
+ })
|
|
179
|
+ }
|
|
180
|
+ })
|
|
181
|
+
|
|
182
|
+ let params = {
|
|
183
|
+ 'str_val': JSON.stringify(str_val)
|
|
184
|
+ }
|
|
185
|
+ if (pageInfo.modifyRuleValue == 1) {
|
|
186
|
+ params['start_time'] = getDay(0, true).now
|
|
187
|
+ }
|
|
188
|
+ if (pageInfo.modifyRuleValue == 2) {
|
|
189
|
+ params['start_time'] = getDay(1, false) + ' 00:00:00'
|
|
190
|
+ }
|
|
191
|
+ const res: any = await http.post('/api/ad/multiUpDailyBudget', params)
|
|
192
|
+ loading.close()
|
|
193
|
+ if (res.errNo == 0) {
|
|
194
|
+ ElMessage.success('修改成功')
|
|
195
|
+ if (res.rst.record_id) {
|
|
196
|
+ getMultiUpDailyBudgetRes(res.rst.record_id, str_val)
|
|
197
|
+ }
|
|
198
|
+ } else {
|
|
199
|
+ ElMessage.error(res.errMsg)
|
|
200
|
+ }
|
|
201
|
+ return
|
|
202
|
+ }
|
|
203
|
+}
|
|
204
|
+/**获取批量修改日预算结果 */
|
|
205
|
+const getMultiUpDailyBudgetRes = async (record_id, str_val) => {
|
|
206
|
+ const loading = ElLoading.service({
|
|
207
|
+ lock: true,
|
|
208
|
+ text: '结果获取中...',
|
|
209
|
+ background: 'rgba(255, 255, 255, 0.7)',
|
|
210
|
+ })
|
|
211
|
+ const res: any = await http.get('/api/ad/multiUpDailyBudgetRes', { record_id })
|
|
212
|
+ loading.close()
|
|
213
|
+ if (res.errNo == 0) {
|
|
214
|
+ pageInfo.schedule = 3;
|
|
215
|
+ pageInfo.cancleText = '关闭'
|
|
216
|
+ pageInfo.hasBtn = true;
|
|
217
|
+ if (Array.isArray(res.rst.result)) {
|
|
218
|
+ pageInfo.multipleSelection.forEach((item) => {
|
|
219
|
+ let arr = str_val.filter((v) => v.account_id == item.advertiser_id)
|
|
220
|
+ if (arr.length > 0) {
|
|
221
|
+ let brr = res.rst.result.filter((v) => { v.account_id == arr[0].account_id })
|
|
222
|
+ if (brr.length > 0) {
|
|
223
|
+ item['state'] = brr[0].state
|
|
224
|
+ item['err_msg'] = brr[0].err_msg
|
|
225
|
+ }
|
|
226
|
+ }
|
|
227
|
+ })
|
|
228
|
+ pageInfo.successLength = str_val.length - res.rst.result?.length
|
|
229
|
+ } else {
|
|
230
|
+ pageInfo.successLength = str_val.length
|
|
231
|
+ }
|
|
232
|
+ } else {
|
|
233
|
+ ElMessage.error(res.errMsg)
|
|
234
|
+ }
|
|
235
|
+}
|
|
236
|
+const closeEvent = () => {
|
|
237
|
+ if (pageInfo.schedule == 1) {
|
|
238
|
+ dialogShow.value = false
|
|
239
|
+ }
|
|
240
|
+ if (pageInfo.schedule == 2) {
|
|
241
|
+ pageInfo.schedule = 1;
|
|
242
|
+ pageInfo.cancleText = '取消'
|
|
243
|
+ }
|
|
244
|
+ if (pageInfo.schedule == 3) {
|
|
245
|
+ dialogShow.value = false
|
|
246
|
+ emit('confirm', '')
|
|
247
|
+ }
|
|
248
|
+}
|
|
249
|
+/**点击应用 */
|
|
250
|
+const application = () => {
|
|
251
|
+ if ((pageInfo.selectValue != 1 && pageInfo.selectValue != 6 && pageInfo.isNoLimit) || pageInfo.mainInputError) {
|
|
252
|
+ ElMessage.error('预算批量规则设置有误')
|
|
253
|
+ return
|
|
254
|
+ }
|
|
255
|
+ if (pageInfo.selectValue != 6 && pageInfo.inputValue == '') {
|
|
256
|
+ pageInfo.mainInputErrHint = '请输入账户日预算,仅支持正整数'
|
|
257
|
+ pageInfo.mainInputError = true;
|
|
258
|
+ ElMessage.error('预算批量规则设置有误')
|
|
259
|
+ return
|
|
260
|
+ }
|
|
261
|
+ if (pageInfo.selectValue == 1) {//修改为
|
|
262
|
+ pageInfo.multipleSelection.forEach((item) => {
|
|
263
|
+ item.modifyDailyBudget = pageInfo.inputValue
|
|
264
|
+ })
|
|
265
|
+ }
|
|
266
|
+ if (pageInfo.selectValue == 2) {//提高
|
|
267
|
+ pageInfo.multipleSelection.forEach((item) => {
|
|
268
|
+ item.modifyDailyBudget = parseFloat((Number(item.daily_budget) + Number(pageInfo.inputValue)).toFixed(2).toString())
|
|
269
|
+ })
|
|
270
|
+ }
|
|
271
|
+ if (pageInfo.selectValue == 3) {//降低
|
|
272
|
+ pageInfo.multipleSelection.forEach((item) => {
|
|
273
|
+ item.modifyDailyBudget = parseFloat((Number(item.daily_budget) - Number(pageInfo.inputValue)).toFixed(2).toString())
|
|
274
|
+ })
|
|
275
|
+ }
|
|
276
|
+ if (pageInfo.selectValue == 4) {//按 % 提高
|
|
277
|
+ pageInfo.multipleSelection.forEach((item) => {
|
|
278
|
+ item.modifyDailyBudget = parseFloat((Number(item.daily_budget) * (Number(pageInfo.inputValue) / 100 + 1)).toFixed(2).toString())
|
|
279
|
+ })
|
|
280
|
+ }
|
|
281
|
+ if (pageInfo.selectValue == 5) {//按 % 降低
|
|
282
|
+ pageInfo.multipleSelection.forEach((item) => {
|
|
283
|
+ item.modifyDailyBudget = parseFloat((Number(item.daily_budget) * (1 - Number(pageInfo.inputValue) / 100)).toFixed(2).toString())
|
|
284
|
+ })
|
|
285
|
+ }
|
|
286
|
+ if (pageInfo.selectValue == 6) {//不限
|
|
287
|
+ pageInfo.multipleSelection.forEach((item) => {
|
|
288
|
+ item.modifyDailyBudget = '不限'
|
|
289
|
+ })
|
|
290
|
+ }
|
|
291
|
+ pageInfo.multipleSelection.forEach((item) => {
|
|
292
|
+ item.inputError = ''
|
|
293
|
+ if (item.modifyDailyBudget == '不限') return
|
|
294
|
+ if (!isPositiveInteger(item.modifyDailyBudget)) {
|
|
295
|
+ item.inputError = '请输入账户日预算,仅支持正整数'
|
|
296
|
+ return
|
|
297
|
+ }
|
|
298
|
+ let isDetermine = isLimit(50, 40000000, item.modifyDailyBudget)
|
|
299
|
+ if (!isDetermine.flag) {
|
|
300
|
+ item.inputError = isDetermine.err
|
|
301
|
+ return
|
|
302
|
+ }
|
|
303
|
+ })
|
|
304
|
+}
|
|
305
|
+// 切换显隐
|
|
306
|
+const dialogShow = ref<boolean>(false)
|
|
307
|
+const switchShow = (val: boolean, multipleSelection_c: any[]) => {
|
|
308
|
+ dialogShow.value = val
|
|
309
|
+ if (val) {
|
|
310
|
+ const initObj = {
|
|
311
|
+ hasBtn: false,
|
|
312
|
+ cancleText: '取消',
|
|
313
|
+ schedule: 1,
|
|
314
|
+ successLength: 0,//修改成功条数
|
|
315
|
+ multipleSelection: [],
|
|
316
|
+ oldMultipleSelection: [],
|
|
317
|
+ isNoLimit: false,//所选账户是否包含不限
|
|
318
|
+ modifyRuleValue: 1,//规则
|
|
319
|
+ inputValue: '',
|
|
320
|
+ mainInputError: false,
|
|
321
|
+ mainInputErrHint: '',
|
|
322
|
+ selectValue: 1,
|
|
323
|
+ }
|
|
324
|
+ for (let key in initObj) {//所有字段 清空重来
|
|
325
|
+ pageInfo[key] = _.cloneDeep(initObj[key])
|
|
326
|
+ }
|
|
327
|
+ pageInfo.oldMultipleSelection = multipleSelection_c;
|
|
328
|
+ pageInfo.multipleSelection = _.cloneDeep(multipleSelection_c)
|
|
329
|
+ pageInfo.multipleSelection.forEach((item) => {
|
|
330
|
+ item['modifyDailyBudget'] = ''
|
|
331
|
+ if (item.daily_budget == 0) {
|
|
332
|
+ pageInfo.isNoLimit = true
|
|
333
|
+ }
|
|
334
|
+ });
|
|
335
|
+ }
|
|
336
|
+}
|
|
337
|
+const selectChange = () => {
|
|
338
|
+ pageInfo.inputValue = ''
|
|
339
|
+ pageInfo.mainInputError = false;
|
|
340
|
+ pageInfo.mainInputErrHint = ''
|
|
341
|
+}
|
|
342
|
+/**input change */
|
|
343
|
+const onChangeInput = (type, index?) => {
|
|
344
|
+ if (type == 'mainInput') {
|
|
345
|
+ pageInfo.mainInputError = false;
|
|
346
|
+ if (pageInfo.selectValue == 1 || pageInfo.selectValue == 2 || pageInfo.selectValue == 3) {
|
|
347
|
+ if (!isPositiveInteger(pageInfo.inputValue)) {
|
|
348
|
+ pageInfo.mainInputError = true;
|
|
349
|
+ pageInfo.mainInputErrHint = '请输入账户日预算,仅支持正整数'
|
|
350
|
+ return
|
|
351
|
+ }
|
|
352
|
+ let isDetermine = isLimit(1, 40000000, pageInfo.inputValue)
|
|
353
|
+ if (!isDetermine.flag) {
|
|
354
|
+ pageInfo.mainInputError = true;
|
|
355
|
+ pageInfo.mainInputErrHint = isDetermine.err
|
|
356
|
+ return
|
|
357
|
+ }
|
|
358
|
+ } else {
|
|
359
|
+ if (!isPositiveNumberWithTwoDecimalPlaces(pageInfo.inputValue)) {
|
|
360
|
+ pageInfo.mainInputError = true;
|
|
361
|
+ pageInfo.mainInputErrHint = '请输入预算调整比例,最多支持小数点后两位'
|
|
362
|
+ return
|
|
363
|
+ }
|
|
364
|
+ }
|
|
365
|
+ }
|
|
366
|
+ if (type == 'tableInput') {
|
|
367
|
+ let item = pageInfo.multipleSelection[index]
|
|
368
|
+ item.inputError = ''
|
|
369
|
+ if (item.modifyDailyBudget == '') return;
|
|
370
|
+ if (item.modifyDailyBudget != '不限') {
|
|
371
|
+ if (!isPositiveInteger(item.modifyDailyBudget)) {
|
|
372
|
+ item.inputError = '请输入账户日预算,仅支持正整数'
|
|
373
|
+ return
|
|
374
|
+ }
|
|
375
|
+ let isDetermine = isLimit(50, 40000000, item.modifyDailyBudget)
|
|
376
|
+ if (!isDetermine.flag) {
|
|
377
|
+ item.inputError = isDetermine.err
|
|
378
|
+ return
|
|
379
|
+ }
|
|
380
|
+ }
|
|
381
|
+ }
|
|
382
|
+}
|
|
383
|
+/**使用正则表达式检查是否为正数且最多两位小数 */
|
|
384
|
+const isPositiveNumberWithTwoDecimalPlaces = (value) => {
|
|
385
|
+ const regex = /^[1-9]\d*(\.\d{1,2})?$|^0\.\d{1,2}$/;
|
|
386
|
+ return regex.test(value.toString());
|
|
387
|
+}
|
|
388
|
+/**判断是否是正整数 */
|
|
389
|
+const isPositiveInteger = (value) => {
|
|
390
|
+ return /^[1-9]\d*$/.test(value.toString());
|
|
391
|
+}
|
|
392
|
+/**判断限额 */
|
|
393
|
+const isLimit = (min: number, max: number, value: number) => {
|
|
394
|
+ if (value < min || value > max) {
|
|
395
|
+ return {
|
|
396
|
+ flag: false,
|
|
397
|
+ err: `日预算范围限制:${min}-${max}`
|
|
398
|
+ }
|
|
399
|
+ } else {
|
|
400
|
+ return {
|
|
401
|
+ flag: true
|
|
402
|
+ }
|
|
403
|
+ }
|
|
404
|
+}
|
|
405
|
+const tableHeaderStyle = ({ row, column, rowIndex, columnIndex }: never) => {
|
|
406
|
+ return {
|
|
407
|
+ backgroundColor: '#FAFAFA',
|
|
408
|
+ color: '#161E46',
|
|
409
|
+ height: '44px'
|
|
410
|
+ }
|
|
411
|
+}
|
|
412
|
+// 父组件共享值
|
|
413
|
+defineExpose({
|
|
414
|
+ switchShow,
|
|
415
|
+});
|
|
416
|
+onMounted(() => {
|
|
417
|
+ nextTick(() => {
|
|
418
|
+
|
|
419
|
+ })
|
|
420
|
+})
|
|
421
|
+</script>
|
|
422
|
+<style lang="scss" scoped>
|
|
423
|
+@import "@/assets/style/batchDialogGdt.scss";
|
|
424
|
+
|
|
425
|
+.batch-title {
|
|
426
|
+ position: relative;
|
|
427
|
+ margin-bottom: 25px;
|
|
428
|
+ font-size: 14px;
|
|
429
|
+ color: #333330;
|
|
430
|
+}
|
|
431
|
+
|
|
432
|
+.error {
|
|
433
|
+ color: #f56c6c;
|
|
434
|
+ line-height: 20px;
|
|
435
|
+ font-size: 12px;
|
|
436
|
+}
|
|
437
|
+
|
|
438
|
+.inputError {
|
|
439
|
+ --el-input-hover-border-color: #f56c6c;
|
|
440
|
+ --el-input-focus-border-color: #f56c6c;
|
|
441
|
+ --el-input-border-color: #f56c6c;
|
|
442
|
+}
|
|
443
|
+
|
|
444
|
+.preview-modified {
|
|
445
|
+ display: flex;
|
|
446
|
+ align-items: center;
|
|
447
|
+
|
|
448
|
+ .budget {
|
|
449
|
+ width: 100px;
|
|
450
|
+ margin-right: 20px;
|
|
451
|
+ }
|
|
452
|
+
|
|
453
|
+ .modified-info {
|
|
454
|
+ display: flex;
|
|
455
|
+ align-items: center;
|
|
456
|
+ }
|
|
457
|
+
|
|
458
|
+ .status {
|
|
459
|
+ width: 70px;
|
|
460
|
+ }
|
|
461
|
+
|
|
462
|
+ .text {
|
|
463
|
+ color: #888;
|
|
464
|
+ }
|
|
465
|
+
|
|
466
|
+ .modified-budget {
|
|
467
|
+ margin-left: 20px;
|
|
468
|
+ }
|
|
469
|
+}
|
|
470
|
+</style>
|