ttad.vue 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637
  1. <script setup lang="ts">
  2. import { EleBtnType } from '@/types/Button/buttonType'
  3. import type {
  4. OperationItem,
  5. Operations,
  6. } from '@/types/Tables/Operations/operations'
  7. import type {
  8. FilterInfo,
  9. TableInfoItem,
  10. BaseFieldItem,
  11. } from '@/types/Tables/table'
  12. import type { TablePaginationProps } from '@/types/Tables/pagination'
  13. import type { BaseMenu } from '@/types/Promotion/Menu'
  14. import type {
  15. AdmgeTTAccData,
  16. AdmgeTTProjData,
  17. AdmgeTTAdData,
  18. } from '@/types/Tables/tableData/ttAd'
  19. import type {
  20. AdmgeTTAccFileds,
  21. AdmgeTTProjFileds,
  22. AdmgeTTAdFileds,
  23. } from '@/types/Tables/tableData/ttAd'
  24. import type {
  25. BaseTableInfo,
  26. BaseAllFieldsInfo,
  27. BaseAllFilterInfo,
  28. BaseAllFixedFiledsInfo,
  29. } from '@/types/Tables/tablePageData'
  30. import type { MenuTableReq } from '@/types/Tables/MenuTable/menuTableReq'
  31. import { TableFilterType } from '@/types/Tables/table'
  32. import { useRequest } from '@/hooks/useRequest'
  33. import { useDate } from '@/hooks/useDate'
  34. import { reactive, readonly } from 'vue'
  35. import MenuTable from '@/components/promotion/MenuTable.vue'
  36. // 表格信息
  37. interface TableInfo extends BaseTableInfo {
  38. account: TableInfoItem<AdmgeTTAccData, BaseFieldItem<AdmgeTTAccFileds>> // 账户信息
  39. project: TableInfoItem<AdmgeTTProjData, BaseFieldItem<AdmgeTTProjFileds>> // 项目信息
  40. advertise: TableInfoItem<AdmgeTTAdData, BaseFieldItem<AdmgeTTAdFileds>> // 广告信息
  41. }
  42. // 所有字段信息
  43. interface AllFieldsInfo extends BaseAllFieldsInfo {
  44. account: AdmgeTTAccFileds[]
  45. project: AdmgeTTProjFileds[]
  46. advertise: AdmgeTTAdFileds[]
  47. }
  48. // 上方查询表单字段
  49. interface AllFilterInfo extends BaseAllFilterInfo {
  50. account: FilterInfo
  51. project: FilterInfo
  52. advertise: FilterInfo
  53. }
  54. // 固定字段
  55. interface AllFixedFiledsInfo extends BaseAllFixedFiledsInfo {
  56. account: Array<string>
  57. project: Array<string>
  58. advertise: Array<string>
  59. }
  60. // 操作信息
  61. interface Operation extends Operations {
  62. account: OperationItem[]
  63. project: OperationItem[]
  64. advertise: OperationItem[]
  65. }
  66. const { AllApi } = useRequest()
  67. const { shortcuts } = useDate()
  68. // 所有子字段信息
  69. const AllFields: AllFieldsInfo = {
  70. account: [
  71. { label: '账户余额', name: 'accountBalance', state: true, fixed: false },
  72. { label: '账户流动', name: 'accountFlow', state: true, fixed: false },
  73. { label: '账户名', name: 'accountName', state: true, fixed: true },
  74. { label: '账户状态', name: 'accountStatus', state: true, fixed: false },
  75. { label: '操作', name: 'action', state: true, fixed: true },
  76. {
  77. label: '广告账户数量',
  78. name: 'adAccountCount',
  79. state: true,
  80. fixed: false,
  81. },
  82. { label: '每日预算', name: 'dailyBudget', state: true, fixed: false },
  83. { label: '登录邮箱', name: 'loginEmail', state: true, fixed: false },
  84. { label: '媒体ID', name: 'mediaId', state: true, fixed: false },
  85. ],
  86. project: [
  87. { label: '项目', name: 'project', state: true, fixed: false },
  88. { label: '项目预算(元)', name: 'projectBudget', state: true, fixed: false },
  89. { label: '创建时间', name: 'creationTime', state: true, fixed: false },
  90. { label: '项目出价(元)', name: 'projectBid', state: true, fixed: false },
  91. {
  92. label: '深度转化出价(元)',
  93. name: 'deepConversionBid',
  94. state: true,
  95. fixed: false,
  96. },
  97. { label: '消耗', name: 'consumption', state: true, fixed: false },
  98. { label: '展示数', name: 'impressions', state: true, fixed: false },
  99. {
  100. label: '平均千次展示费用',
  101. name: 'averageCpm',
  102. state: true,
  103. fixed: false,
  104. },
  105. { label: '点击数', name: 'clicks', state: true, fixed: false },
  106. { label: '点击率', name: 'clickThroughRate', state: true, fixed: false },
  107. { label: '转化数', name: 'conversions', state: true, fixed: false },
  108. { label: '转化成本', name: 'conversionCost', state: true, fixed: false },
  109. { label: '转化率', name: 'conversionRate', state: true, fixed: false },
  110. { label: '深度转化数', name: 'deepConversions', state: true, fixed: false },
  111. {
  112. label: '深度转化成本',
  113. name: 'deepConversionCost',
  114. state: true,
  115. fixed: false,
  116. },
  117. {
  118. label: '深度转化率',
  119. name: 'deepConversionRate',
  120. state: true,
  121. fixed: false,
  122. },
  123. ],
  124. advertise: [
  125. { label: '广告', name: 'ad', state: true, fixed: false },
  126. { label: '广告预算(元)', name: 'adBudget', state: true, fixed: false },
  127. { label: '拒绝建议', name: 'rejectSuggestions', state: true, fixed: false },
  128. { label: '广告出价(元)', name: 'adBid', state: true, fixed: false },
  129. {
  130. label: '深度转化出价(元)',
  131. name: 'deepConversionBid',
  132. state: true,
  133. fixed: false,
  134. },
  135. { label: '消耗', name: 'consumption', state: true, fixed: false },
  136. { label: '展示数', name: 'impressions', state: true, fixed: false },
  137. {
  138. label: '平均千次展现费用',
  139. name: 'averageCpm',
  140. state: true,
  141. fixed: false,
  142. },
  143. { label: '点击数', name: 'clicks', state: true, fixed: false },
  144. { label: '点击率', name: 'clickThroughRate', state: true, fixed: false },
  145. { label: '转化数', name: 'conversions', state: true, fixed: false },
  146. { label: '转化成本', name: 'conversionCost', state: true, fixed: false },
  147. { label: '转化率', name: 'conversionRate', state: true, fixed: false },
  148. { label: '深度转化数', name: 'deepConversions', state: true, fixed: false },
  149. {
  150. label: '深度转化成本',
  151. name: 'deepConversionCost',
  152. state: true,
  153. fixed: false,
  154. },
  155. {
  156. label: '深度转化率',
  157. name: 'deepConversionRate',
  158. state: true,
  159. fixed: false,
  160. },
  161. ],
  162. }
  163. // 账户查询表单信息
  164. const accFilterInfo: FilterInfo = {
  165. accMain: {
  166. label: '账号主体',
  167. name: 'accMain',
  168. type: TableFilterType.Select,
  169. value: 'all',
  170. options: [
  171. { label: '全部', value: 'all' },
  172. { label: '主体1', value: '1' },
  173. { label: '主体2', value: '2' },
  174. ],
  175. },
  176. ttProject: {
  177. label: '创量项目',
  178. name: 'ttProject',
  179. type: TableFilterType.Select,
  180. value: 'A',
  181. options: [
  182. { label: '项目A', value: 'A' },
  183. { label: '项目B', value: 'B' },
  184. ],
  185. },
  186. optimizer: {
  187. label: '优化师',
  188. name: 'optimizer',
  189. type: TableFilterType.Select,
  190. value: 'jack',
  191. options: [
  192. { label: '优化师1', value: 'jack' },
  193. { label: '优化师2', value: 'rose' },
  194. ],
  195. },
  196. search: {
  197. label: '搜索',
  198. name: 'search',
  199. type: TableFilterType.Search,
  200. value: 'name',
  201. options: [
  202. { label: '名称', value: 'name' },
  203. { label: '备注', value: 'backup' },
  204. ],
  205. },
  206. product: {
  207. label: '产品',
  208. name: 'product',
  209. type: TableFilterType.Select,
  210. value: '1',
  211. options: [
  212. { label: '产品1', value: '1' },
  213. { label: '产品2', value: '2' },
  214. ],
  215. },
  216. }
  217. // 项目查询表单信息
  218. const projectFilter: FilterInfo = {
  219. search: {
  220. label: '搜索',
  221. name: 'search',
  222. type: TableFilterType.Search,
  223. value: 'name',
  224. options: [{ label: '名称', value: 'name' }],
  225. },
  226. ttProject: {
  227. label: '创量项目',
  228. name: 'ttProject',
  229. type: TableFilterType.Select,
  230. value: 'all',
  231. options: [
  232. { label: '全部', value: 'all' },
  233. { label: '产品A', value: 'A' },
  234. { label: '产品B', value: 'B' },
  235. ], // Search 类型一般不需要 options
  236. },
  237. product: {
  238. label: '创量产品',
  239. name: 'product',
  240. type: TableFilterType.Select,
  241. value: 'all',
  242. options: [
  243. { label: '全部', value: 'all' },
  244. { label: '产品A', value: 'A' },
  245. { label: '产品B', value: 'B' },
  246. ],
  247. },
  248. optimizationGoal: {
  249. label: '优化目标',
  250. name: 'optimizationGoal',
  251. type: TableFilterType.Select,
  252. value: 'clicks',
  253. options: [
  254. { label: '点击量', value: 'clicks' },
  255. { label: '转化量', value: 'conversions' },
  256. { label: '展示量', value: 'impressions' },
  257. ],
  258. },
  259. deepOptimizationGoal: {
  260. label: '深度优化目标',
  261. name: 'deepOptimizationGoal',
  262. type: TableFilterType.Select,
  263. value: 'ROI',
  264. options: [
  265. { label: '投资回报率 (ROI)', value: 'ROI' },
  266. { label: '订单数', value: 'orders' },
  267. { label: '注册量', value: 'registrations' },
  268. ],
  269. },
  270. mediaAccount: {
  271. label: '媒体账户',
  272. name: 'mediaAccount',
  273. type: TableFilterType.Select,
  274. value: 'all',
  275. options: [
  276. { label: '全部', value: 'all' },
  277. { label: '账户1', value: '1' },
  278. { label: '账户2', value: '2' },
  279. ],
  280. },
  281. promotionObjective: {
  282. label: '推广目的',
  283. name: 'promotionObjective',
  284. type: TableFilterType.Select,
  285. value: 'sales',
  286. options: [
  287. { label: '销售转化', value: 'sales' },
  288. { label: '品牌推广', value: 'branding' },
  289. { label: '应用安装', value: 'app_install' },
  290. ],
  291. },
  292. deliveryMode: {
  293. label: '投放模式',
  294. name: 'deliveryMode',
  295. type: TableFilterType.Select,
  296. value: 'automated',
  297. options: [
  298. { label: '自动投放', value: 'automated' },
  299. { label: '手动投放', value: 'manual' },
  300. ],
  301. },
  302. status: {
  303. label: '状态',
  304. name: 'status',
  305. type: TableFilterType.Select,
  306. value: 'active',
  307. options: [
  308. { label: '全部', value: 'all' },
  309. { label: '启用', value: 'active' },
  310. { label: '暂停', value: 'paused' },
  311. { label: '已结束', value: 'ended' },
  312. ],
  313. },
  314. creationTime: {
  315. label: '创建时间',
  316. name: 'creationTime',
  317. type: TableFilterType.Date,
  318. startDate: shortcuts[0].value[0],
  319. endDate: shortcuts[0].value[1],
  320. value: '',
  321. },
  322. adType: {
  323. label: '广告类型',
  324. name: 'adType',
  325. type: TableFilterType.Select,
  326. value: 'display',
  327. options: [
  328. { label: '展示广告', value: 'display' },
  329. { label: '视频广告', value: 'video' },
  330. { label: '搜索广告', value: 'search' },
  331. ],
  332. },
  333. }
  334. // 广告查询表单信息
  335. const adFilterInfo: FilterInfo = {
  336. ttProject: {
  337. label: '创量项目',
  338. name: 'ttProject',
  339. type: TableFilterType.Select,
  340. value: 'name',
  341. options: [{ label: '名称', value: 'name' }],
  342. },
  343. product: {
  344. label: '创量产品',
  345. name: 'product',
  346. type: TableFilterType.Select,
  347. value: 'all',
  348. options: [
  349. { label: '全部', value: 'all' },
  350. { label: '产品A', value: 'A' },
  351. { label: '产品B', value: 'B' },
  352. ],
  353. },
  354. optimizer: {
  355. label: '优化师',
  356. name: 'optimizer',
  357. type: TableFilterType.Select,
  358. value: 'all',
  359. options: [
  360. { label: '全部', value: 'all' },
  361. { label: '优化师A', value: 'A' },
  362. { label: '优化师B', value: 'B' },
  363. ],
  364. },
  365. diagnosticSuggestion: {
  366. label: '诊断建议',
  367. name: 'diagnosticSuggestion',
  368. type: TableFilterType.Select,
  369. value: 'all',
  370. options: [
  371. { label: '全部', value: 'all' },
  372. { label: '建议A', value: 'A' },
  373. { label: '建议B', value: 'B' },
  374. ],
  375. },
  376. strategyGroup: {
  377. label: '策略组',
  378. name: 'strategyGroup',
  379. type: TableFilterType.Select,
  380. value: 'all',
  381. options: [
  382. { label: '全部', value: 'all' },
  383. { label: '组A', value: 'A' },
  384. { label: '组B', value: 'B' },
  385. ],
  386. },
  387. learningStatus: {
  388. label: '学习期状态',
  389. name: 'learningStatus',
  390. type: TableFilterType.Select,
  391. value: 'all',
  392. options: [
  393. { label: '全部', value: 'all' },
  394. { label: '进行中', value: 'ongoing' },
  395. { label: '已完成', value: 'completed' },
  396. ],
  397. },
  398. mediaAssets: {
  399. label: '信息素材',
  400. name: 'mediaAssets',
  401. type: TableFilterType.Select,
  402. value: 'all',
  403. options: [
  404. { label: '全部', value: 'all' },
  405. { label: '素材A', value: 'A' },
  406. { label: '素材B', value: 'B' },
  407. ],
  408. },
  409. mediaAccount: {
  410. label: '媒体账户',
  411. name: 'mediaAccount',
  412. type: TableFilterType.Select,
  413. value: 'all',
  414. options: [
  415. { label: '全部', value: 'all' },
  416. { label: '账户1', value: '1' },
  417. { label: '账户2', value: '2' },
  418. ],
  419. },
  420. promotionObjective: {
  421. label: '推广目的',
  422. name: 'promotionObjective',
  423. type: TableFilterType.Select,
  424. value: 'all',
  425. options: [
  426. { label: '全部', value: 'all' },
  427. { label: '销售', value: 'sales' },
  428. { label: '品牌推广', value: 'branding' },
  429. ],
  430. },
  431. deliveryMode: {
  432. label: '投放模式',
  433. name: 'deliveryMode',
  434. type: TableFilterType.Select,
  435. value: 'all',
  436. options: [
  437. { label: '全部', value: 'all' },
  438. { label: '自动投放', value: 'automated' },
  439. { label: '手动投放', value: 'manual' },
  440. ],
  441. },
  442. status: {
  443. label: '状态',
  444. name: 'status',
  445. type: TableFilterType.Select,
  446. value: 'all',
  447. options: [
  448. { label: '全部', value: 'all' },
  449. { label: '启用', value: 'active' },
  450. { label: '暂停', value: 'paused' },
  451. ],
  452. },
  453. creationTime: {
  454. label: '创建时间',
  455. name: 'creationTime',
  456. type: TableFilterType.Date,
  457. startDate: new Date(),
  458. endDate: new Date(),
  459. value: '',
  460. },
  461. adType: {
  462. label: '广告类型',
  463. name: 'adType',
  464. type: TableFilterType.Select,
  465. value: 'all',
  466. options: [
  467. { label: '全部', value: 'all' },
  468. { label: '展示广告', value: 'display' },
  469. { label: '视频广告', value: 'video' },
  470. ],
  471. },
  472. }
  473. // 所有的查询表单信息
  474. const allFilters: AllFilterInfo = {
  475. account: accFilterInfo,
  476. project: projectFilter,
  477. advertise: adFilterInfo,
  478. }
  479. // 所有需要固定的字段
  480. const allFixedFileds: AllFixedFiledsInfo = {
  481. account: ['accountName', 'action'],
  482. project: [],
  483. advertise: [],
  484. }
  485. // 所有的表格请求
  486. const tableReqInfo: MenuTableReq = {
  487. account: {
  488. url: AllApi.mockAdTTAcc,
  489. config: {
  490. params: {},
  491. },
  492. },
  493. project: {
  494. url: AllApi.mockAdTTProj,
  495. config: {
  496. params: {},
  497. },
  498. },
  499. advertise: {
  500. url: AllApi.mockAdTTAd,
  501. config: {
  502. params: {},
  503. },
  504. },
  505. }
  506. // 所有表格需要排除的字段信息
  507. const allExcludeFields: {
  508. [key: string]: string[]
  509. } = {
  510. account: ['accountBalance'],
  511. project: [],
  512. advertise: [],
  513. }
  514. // 表格信息
  515. const tableInfo = reactive<TableInfo>({
  516. account: {
  517. data: [],
  518. fields: [
  519. {
  520. label: '基础',
  521. name: 'base1',
  522. value: [],
  523. children: AllFields['account'],
  524. },
  525. ],
  526. tableSortedFields: [],
  527. filters: allFilters['account'],
  528. fixedFields: allFixedFileds['account'],
  529. },
  530. project: {
  531. data: [],
  532. fields: [
  533. {
  534. label: '基础',
  535. name: 'base2',
  536. value: [],
  537. children: AllFields['project'],
  538. },
  539. ],
  540. tableSortedFields: [],
  541. filters: allFilters['project'],
  542. fixedFields: allFixedFileds['project'],
  543. },
  544. advertise: {
  545. data: [],
  546. fields: [
  547. {
  548. label: '基础',
  549. name: 'base3',
  550. value: [],
  551. children: AllFields['advertise'],
  552. },
  553. ],
  554. tableSortedFields: [],
  555. filters: allFilters['advertise'],
  556. fixedFields: allFixedFileds['advertise'],
  557. },
  558. })
  559. // 分页配置
  560. const tablePaginationConfig = reactive<TablePaginationProps>({
  561. total: 0,
  562. pageSizeList: [10, 20, 40],
  563. })
  564. // 自定义的操作字段
  565. const operations: Operation = {
  566. account: [
  567. {
  568. label: '修改',
  569. type: EleBtnType.Primary,
  570. },
  571. {
  572. label: '删除',
  573. type: EleBtnType.Danger,
  574. },
  575. ],
  576. advertise: [],
  577. project: [],
  578. }
  579. // 导航
  580. const ttAdMenu: BaseMenu[] = [
  581. {
  582. name: 'account',
  583. title: '账户',
  584. },
  585. {
  586. name: 'project',
  587. title: '项目',
  588. },
  589. {
  590. name: 'advertise',
  591. title: '广告',
  592. },
  593. ]
  594. // 表格名
  595. const saveTableName = 'ttad-tableInfo'
  596. </script>
  597. <template>
  598. <MenuTable
  599. :menu-default-active="ttAdMenu[0].name"
  600. :menu-list="ttAdMenu"
  601. :operations="operations"
  602. :save-table-name="saveTableName"
  603. :table-info="tableInfo"
  604. :table-pagination-config="tablePaginationConfig"
  605. :table-req-info="tableReqInfo"
  606. :exclude-fields="allExcludeFields"
  607. >
  608. <template #operationDialog>
  609. <div>测试后</div>
  610. </template>
  611. </MenuTable>
  612. </template>
  613. <style scoped></style>