128 Commits 816ea24c4c ... ac0dc1e6e8

Autor SHA1 Mensaje Fecha
  liubei@c-top.com.cn ac0dc1e6e8 运营经理盯盘和账户页面盯盘联调 hace 3 años
  liubei@c-top.com.cn b9208376ed 日期控件修改日期范围限制 hace 3 años
  liubei@c-top.com.cn 1f2ad3fc30 3d柱状图增加颜色,环形图调节间距 hace 3 años
  朱鑫波 b39c67ce39 测试代码合饼 hace 3 años
  liubei@c-top.com.cn 48a2c63c44 首页增加数据看板按钮进行跳转 hace 3 años
  朱鑫波 a8fe59485a 测试代码合饼 hace 3 años
  liubei@c-top.com.cn 20289bba02 Merge branch 'feature/work-test' of http://git.tjyourong.com.cn/ctop/adsp-vue into feature/work-test hace 3 años
  liubei@c-top.com.cn c1beb14e74 修改自动弹出看板问题 hace 3 años
  朱鑫波 dfd149795c Merge branch 'feature/work-test' of http://git.tjyourong.com.cn/ctop/adsp-vue into feature/work-test hace 3 años
  朱鑫波 c55a29cbe5 测试代码合饼 hace 3 años
  liubei@c-top.com.cn bc5a3c3f94 数据看板修改样式小细节 hace 3 años
  朱鑫波 ca61ef56fa Merge branch 'feature/work-test' of http://git.tjyourong.com.cn/ctop/adsp-vue into feature/work-test hace 3 años
  朱鑫波 224f3153fa 拉取代码 hace 3 años
  liubei@c-top.com.cn bac63b98dd 账户配置查询修改页码传参 hace 3 años
  liubei@c-top.com.cn 25d9e4a62b 修改数据看板的横向柱状图的展示效果 hace 3 años
  朱鑫波 a16f78cab3 Merge branch 'feature/work-test' of http://git.tjyourong.com.cn/ctop/adsp-vue into feature/work-test hace 3 años
  朱鑫波 abcd17f00f 拉取代码 hace 3 años
  朱鑫波 c9639f4d51 跑量视频库 hace 3 años
  liubei@c-top.com.cn f0adb94910 修改分公司看板数据细节样式 hace 3 años
  朱鑫波 fcb7b90c85 爆款视频库已提测 hace 3 años
  liubei@c-top.com.cn af898067b7 分公司数据看板素材相关数据修改 hace 3 años
  liubei@c-top.com.cn ceace3da3a 分公司数据看板修改按钮大小 hace 3 años
  liubei@c-top.com.cn 33af809acf 修改分公司数据看板折线图的宽度 hace 3 años
  liubei@c-top.com.cn 2d4b1ce975 分公司数据看板调整柱状图位置 hace 3 años
  liubei@c-top.com.cn bfbe873dd6 分公司数据看板修改第二版 hace 3 años
  liubei@c-top.com.cn c62d9dcbed Merge branch 'feature/work-test' of http://git.tjyourong.com.cn/ctop/adsp-vue into feature/work-test hace 3 años
  liubei@c-top.com.cn bdb4c056d5 修改3D饼图 hace 3 años
  朱鑫波 549275656b 测试代码合饼 hace 3 años
  朱鑫波 03049f5769 Merge branch 'feature/work-test' of http://git.tjyourong.com.cn/ctop/adsp-vue into feature/work-test hace 3 años
  liubei@c-top.com.cn 7514b6ecf2 Merge branch 'feature/work-test' of http://git.tjyourong.com.cn/ctop/adsp-vue into feature/work-test hace 3 años
  liubei@c-top.com.cn 731a893841 看板数据提交 hace 3 años
  朱鑫波 981d826b91 年前封板 hace 3 años
  朱鑫波 e3a5e6ad41 Merge branch 'feature/work-test' hace 3 años
  朱鑫波 1b9a27d7a3 脚本视频封板;头条监测链接;账户管理项目列表接口更换;批量2.0上下划 hace 3 años
  朱鑫波 fc2802ad35 提交测试 hace 3 años
  朱鑫波 0778d34a5e master代码发版 hace 3 años
  liubei@c-top.com.cn 16670ff293 链接配置联调、我的项目增加优化目标和最高出价 hace 3 años
  liubei@c-top.com.cn 7b9dc3c49f Merge branch 'feature/work-test' of http://git.tjyourong.com.cn/ctop/adsp-vue into feature/work-test hace 3 años
  liubei@c-top.com.cn 084a61760b 修改应用下载图片的高 hace 3 años
  朱鑫波 3b8516050b 测试封板 hace 3 años
  朱鑫波 43226b7fae Merge branch 'feature/work-test' of http://git.tjyourong.com.cn/ctop/adsp-vue into feature/work-test hace 3 años
  朱鑫波 a3b0019187 拉取代码 hace 3 años
  liubei@c-top.com.cn 121754f548 账户配置开关修改传参、广告立项修改优化出价不回填 hace 3 años
  liubei@c-top.com.cn 9ff8a023aa Merge branch 'feature/work-test' of http://git.tjyourong.com.cn/ctop/adsp-vue into feature/work-test hace 3 años
  liubei@c-top.com.cn 9ddc6139cb 立项类型增加千川和磁力金牛,修改通投智选 hace 3 años
  朱鑫波 0d8d768618 Merge branch 'master' into feature/work-test hace 3 años
  朱鑫波 9e9bf35e72 修改行动号召按钮传参 hace 3 años
  朱鑫波 1a05936f62 Merge branch 'feature/work-test' of http://git.tjyourong.com.cn/ctop/adsp-vue into feature/work-test hace 3 años
  朱鑫波 8e2156822d 批量2.0添加程序化 hace 3 años
  朱鑫波 bd9497f633 修改打包地址 hace 3 años
  liubei@c-top.com.cn 1b59eeee28 Merge branch 'feature/work-test' of http://git.tjyourong.com.cn/ctop/adsp-vue into feature/work-test hace 3 años
  liubei@c-top.com.cn 60db9a4a29 通投智选 hace 3 años
  朱鑫波 fc8b5ea48b Merge branch 'feature/work-test' of http://git.tjyourong.com.cn/ctop/adsp-vue into feature/work-test hace 3 años
  朱鑫波 7371608706 渠道号发版 hace 3 años
  liubei@c-top.com.cn df7cfa30a4 政策管理修改销售对应人员按钮的隐藏显示的判断条件 hace 3 años
  朱鑫波 434db5fee1 Merge branch 'master' into feature/work-test hace 3 años
  liubei@c-top.com.cn 7e1c1444b6 Merge branch 'feature/work-test' hace 3 años
  liubei@c-top.com.cn 2d316555d4 深度优化方式修改自动优化的值 hace 3 años
  liubei@c-top.com.cn 4487ef0b6a 账户设置内应用名的显示判断条件修改 hace 3 años
  liubei@c-top.com.cn d59b4f7676 修改深度转化出价的传参 hace 3 años
  liubei@c-top.com.cn 3880ab82b1 深度优化修改传参 hace 3 años
  liubei@c-top.com.cn 83f26344e7 头条账户配置列表取消注释通投智选 hace 3 años
  liubei@c-top.com.cn d825426d23 头条深度转化出价修改 hace 3 años
  liubei@c-top.com.cn 6ac39d612d 头条深度优化方式修改 hace 3 años
  朱鑫波 b094d7e3ba Merge branch 'master' into feature/work-test hace 3 años
  朱鑫波 63921f6c5b Merge branch 'feature/work-test' of http://git.tjyourong.com.cn/ctop/adsp-vue into feature/work-test hace 3 años
  朱鑫波 4cbf8d6fac 修改渠道号 hace 3 años
  liubei@c-top.com.cn 0c7700075f 账户配置深度转化出价修改判断条件 hace 3 años
  朱鑫波 c991e79140 Merge branch 'feature/work-test' of http://git.tjyourong.com.cn/ctop/adsp-vue into feature/work-test hace 3 años
  liubei@c-top.com.cn d8bcc5d6ad 注释头条的深度出价和通投智选 hace 3 años
  朱鑫波 0de018860d Merge branch 'feature/work-test' of http://git.tjyourong.com.cn/ctop/adsp-vue into feature/work-test hace 3 años
  liubei@c-top.com.cn 587be094d4 项目列表编辑头条无法保存问题 hace 3 años
  朱鑫波 43cbb180f6 Merge branch 'feature/work-test' of http://git.tjyourong.com.cn/ctop/adsp-vue into feature/work-test hace 3 años
  朱鑫波 ea4a1912be 切换测试分支 hace 3 años
  liubei@c-top.com.cn 87a626db6c Merge branch 'feature/work-test' of http://git.tjyourong.com.cn/ctop/adsp-vue into feature/work-test hace 3 años
  liubei@c-top.com.cn 28e4bc7b71 头条无法过验证修改 hace 3 años
  朱鑫波 676f284b75 切换测试分支 hace 3 años
  朱鑫波 d142f0facb Merge branch 'feature/work-test' of http://git.tjyourong.com.cn/ctop/adsp-vue into feature/work-test hace 3 años
  朱鑫波 33276ddfd4 提交代码测试 hace 3 años
  liubei@c-top.com.cn 95e9e1bbc0 广告主最高价回填修改 hace 3 años
  朱鑫波 4943f9bbfd Merge branch 'master' into feature/work-test hace 3 años
  朱鑫波 264d0ddca7 Merge branch 'feature/work-test' of http://git.tjyourong.com.cn/ctop/adsp-vue into feature/work-test hace 3 años
  liubei@c-top.com.cn f8b1d529c1 最高出价回显时的显示隐藏控制 hace 3 años
  liubei@c-top.com.cn 1d83149967 项目列表修改传参 hace 3 años
  朱鑫波 68014b3ae9 Merge branch 'feature/work-test' of http://git.tjyourong.com.cn/ctop/adsp-vue into feature/work-test hace 3 años
  liubei@c-top.com.cn 56fd4f50e2 深度转化出价完善交互 hace 3 años
  朱鑫波 3fea54e7b3 Merge branch 'feature/work-test' of http://git.tjyourong.com.cn/ctop/adsp-vue into feature/work-test hace 3 años
  朱鑫波 cb3ba71778 拉取代码 hace 3 años
  liubei@c-top.com.cn de261d35d9 Merge branch 'work-adver' into feature/work-test hace 3 años
  liubei@c-top.com.cn f0d43eb166 项目列表修改最高出价 hace 3 años
  liubei@c-top.com.cn 80282f0e18 修改最高出价显示问题 hace 3 años
  liubei@c-top.com.cn 5ba2a68d63 Merge branch 'work-adver' into feature/work-test hace 3 años
  liubei@c-top.com.cn 7c144ed8da 快手广告信息预警完善字段 hace 3 años
  liubei@c-top.com.cn 3555c1e6e3 Merge branch 'work-adver' into feature/work-test hace 3 años
  朱鑫波 d7fd33b324 智能投放2.0-测试结束 hace 3 años
  liubei@c-top.com.cn 0a28450e3b 广告主管理价格预警修改 hace 3 años
  liubei@c-top.com.cn d0bdaf07ff 广告主信息及时清空广告主id hace 3 años
  liubei@c-top.com.cn 6966a04314 修改广告位置的字段回填判断 hace 3 años
  liubei@c-top.com.cn 75ec231248 头条自动投放账户配置修改 hace 3 años
  liubei@c-top.com.cn 944e999c2b 联调通投智选 hace 3 años
  朱鑫波 675c531940 Merge branch 'feature/work-test' of http://git.tjyourong.com.cn/ctop/adsp-vue into feature/work-test hace 3 años
  朱鑫波 794632058d 智能投放v2.0-基本测试完毕 hace 3 años
  liubei@c-top.com.cn 415b3ae779 合并分支 hace 3 años
  liubei@c-top.com.cn 57908f9ece Merge branch 'work-adver' into feature/work-test hace 3 años
  朱鑫波 c4a3134da5 修改请求方式和番茄小说版位 hace 3 años
  朱鑫波 d7b5ab99cd 修改 hace 3 años
  liubei@c-top.com.cn 97b606074c 头条自动投放账户配置新增深度优化 hace 3 años
  朱鑫波 3264c6cf07 修改视频素材修改素材名称的权限 hace 3 años
  朱鑫波 02066056f7 修改快手智能投放2.0 hace 3 años
  朱鑫波 8e484b75a0 视频素材批量审核添加loading hace 3 años
  朱鑫波 76518e9b07 Merge branch 'master' of http://git.tjyourong.com.cn/ctop/adsp-vue hace 3 años
  朱鑫波 09209df32a 视频素材批量审核添加loading hace 3 años
  liubei@c-top.com.cn 26e360595e 提交 hace 3 años
  jiayufei baeef1b42a 提交 hace 3 años
  jiayufei c7a4378498 提交 hace 3 años
  朱鑫波 52e60e8440 合并快手智能投放2.0,提测 hace 3 años
  朱鑫波 24226f8948 智能投放2.0可提测 hace 3 años
  朱鑫波 8186978607 新版智能投放 hace 3 años
  朱鑫波 01f713b972 切换分支-财务模块 hace 3 años
  朱鑫波 ae463b73e8 Merge branch 'master' into work-newCreate hace 3 años
  朱鑫波 48ed944bdd 定向包完成 hace 3 años
  朱鑫波 22aff58dc7 切换分支 hace 3 años
  朱鑫波 cd28ed7733 暂存 hace 3 años
  朱鑫波 ce1e0b2961 切换分支 hace 3 años
  朱鑫波 7cff07b7ac 切换分支 hace 3 años
  朱鑫波 ed2c7ee0b6 create hace 3 años
  朱鑫波 dd2288c423 Merge branch 'master' into work-newCreate hace 3 años
  朱鑫波 72b72b7dad 新版智能投放-备注 hace 3 años
Se han modificado 65 ficheros con 21237 adiciones y 20441 borrados
  1. 8 1
      .env.development
  2. 14 2
      .env.production
  3. 0 20041
      package-lock.json
  4. 1 0
      package.json
  5. 4 0
      public/index.html
  6. BIN
      src/assets/img/head_bg.png
  7. 6 0
      src/assets/img/u2.svg
  8. 6 0
      src/assets/img/u3.svg
  9. 6 0
      src/assets/img/u4.svg
  10. BIN
      src/assets/img/wangge2.png
  11. 6 5
      src/components/jeecg/JTreeSelect.vue
  12. 2 2
      src/components/page/GlobalLayout.vue
  13. 10 0
      src/config/router.config.js
  14. 2 1
      src/filters.js
  15. 7 0
      src/mixins/JeecgListMixin.js
  16. 10 0
      src/mixins/videoMaterialMixin.js
  17. 41 6
      src/permission.js
  18. 2 2
      src/utils/request.js
  19. 278 0
      src/views/bossDataKanban/chart.js
  20. 1780 0
      src/views/bossDataKanban/index.vue
  21. 25 2
      src/views/dashboard/Analysis.vue
  22. 7 0
      src/views/modules/Statistics/kuaishouReport/accountReport.vue
  23. 7 0
      src/views/modules/Statistics/kuaishouReport/videoReport.vue
  24. 30 7
      src/views/modules/account-config/account-config.vue
  25. 170 17
      src/views/modules/account-config/components/configuration-modal.vue
  26. 331 0
      src/views/modules/account-config/components/link-configuration.vue
  27. 69 33
      src/views/modules/advertiser/AdvertiserList.vue
  28. 28 19
      src/views/modules/advertiser/ProjectList.vue
  29. 94 4
      src/views/modules/advertiser/ProjectMemberList.vue
  30. 53 36
      src/views/modules/advertiser/UserAllocationList.vue
  31. 130 43
      src/views/modules/advertiser/modules/ProjectModal.vue
  32. 4 4
      src/views/modules/advertiser/modules/UserAllocationModal.vue
  33. 118 29
      src/views/modules/advertiser/modules/projectListModal.vue
  34. 15 15
      src/views/modules/autoLaunch/channelManage/channelDetailList.vue
  35. 11 2
      src/views/modules/autoLaunch/configLaunchInfo.vue
  36. 50 4
      src/views/modules/autoLaunch/trusteeship/creatMaterialTest.vue
  37. 1 1
      src/views/modules/autoLaunch/trusteeship/index.vue
  38. 849 0
      src/views/modules/autoLaunchRevision/autoLaunchList.vue
  39. 633 0
      src/views/modules/autoLaunchRevision/components/configLaunchExploreDrawer.vue
  40. 96 0
      src/views/modules/autoLaunchRevision/components/editablCell.vue
  41. 429 0
      src/views/modules/autoLaunchRevision/components/selectRegion.vue
  42. 1597 0
      src/views/modules/autoLaunchRevision/components/targetedPopulation.vue
  43. 340 0
      src/views/modules/autoLaunchRevision/components/templateModal.vue
  44. 4802 0
      src/views/modules/autoLaunchRevision/createLaunch.vue
  45. 4 2
      src/views/modules/kuaishouapp/account/stepForm/stepModule/targetedPopulation.vue
  46. 9 1
      src/views/modules/kuaishouapp/batchCreation/campaignList.vue
  47. 256 109
      src/views/modules/kuaishouapp/batchCreation/creat/creatUnit.vue
  48. 2 1
      src/views/modules/kuaishouapp/crossAccount/templateModal.vue
  49. 342 0
      src/views/modules/material/comment/uploadFilePopilar.vue
  50. 9 4
      src/views/modules/material/videoMaterial.vue
  51. 3253 0
      src/views/modules/material/videoPopular.vue
  52. 5 1
      src/views/modules/policy-management/policy-management.vue
  53. 489 0
      src/views/modules/script/components/keyWord.vue
  54. 85 43
      src/views/modules/script/index.vue
  55. 1 1
      src/views/modules/stockWatch/modules/keep-person/keep-person.vue
  56. 1343 0
      src/views/modules/stockWatch/modules/new-keepManage/account-newkeepManage.vue
  57. 1294 0
      src/views/modules/stockWatch/modules/new-keepManage/acountProjectData.js
  58. 296 0
      src/views/modules/stockWatch/modules/new-keepManage/customColumnProject.vue
  59. 1025 0
      src/views/modules/stockWatch/modules/new-keepManage/group-keepManage.vue
  60. 135 0
      src/views/modules/stockWatch/modules/new-keepManage/new-keep-data.js
  61. 32 0
      src/views/modules/stockWatch/modules/new-keepManage/new-keepManage.vue
  62. 327 0
      src/views/modules/stockWatch/modules/new-keepManage/personal-keepManage.vue
  63. 240 0
      src/views/modules/stockWatch/modules/new-keepManage/selectComponentPrject.vue
  64. 16 1
      src/views/user/Login.vue
  65. 2 2
      vue.config.js

+ 8 - 1
.env.development

@@ -10,8 +10,15 @@ VUE_APP_BASE_REPORT_URL = http://api.tjyourong.com.cn/reportModule
 # 杨字安 http://192.168.1.43:9999
 # 杨字安 http://192.168.1.43:9999
 
 
 #脚本视频接口
 #脚本视频接口
-VUE_APP_BASE_SCRIPT_URL = http://139.186.134.115:31013
+VUE_APP_BASE_SCRIPT_URL = http://192.168.0.195:31013
 
 
 
 
 #素材大盘相关接口
 #素材大盘相关接口
 VUE_APP_BASE_MATERIAL_URL = http://192.168.0.195:9999/material
 VUE_APP_BASE_MATERIAL_URL = http://192.168.0.195:9999/material
+# 字安接口 http://192.168.1.43:9999
+# 测试环境 http://192.168.0.195:9999
+
+#盯盘相关接口
+VUE_APP_BASE_STARE_URL = http://192.168.0.195:9999/material
+# 字安接口 http://192.168.1.43:9999
+# 测试环境 http://192.168.0.195:9999

+ 14 - 2
.env.production

@@ -10,9 +10,21 @@ VUE_APP_BASE_REPORT_URL = http://api.tjyourong.com.cn/reportModule
 VUE_APP_BASE_SCRIPT_URL = http://114.117.193.186:31013
 VUE_APP_BASE_SCRIPT_URL = http://114.117.193.186:31013
 # 线上地址 http://114.117.193.186:31013
 # 线上地址 http://114.117.193.186:31013
 # 测试地址 http://139.186.134.115:31013
 # 测试地址 http://139.186.134.115:31013
+# 新测试地址 http://192.168.0.195:31013
 
 
 
 
 #素材大盘相关接口
 #素材大盘相关接口
-VUE_APP_BASE_MATERIAL_URL = http://api.tjyourong.com.cn/material
+VUE_APP_BASE_MATERIAL_URL = http://192.168.0.195:9999/material
 # 泽宇 http://192.168.1.134:9999
 # 泽宇 http://192.168.1.134:9999
-# 测试 http://192.168.0.195:9999
+# 测试 http://192.168.0.195:9999
+
+
+#宇飞接口地址
+VUE_APP_BASE_MOST_SYSTEM = http://118.24.244.213:8808
+# 线上 http://118.24.244.213:8808
+# 测试 http://139.186.165.84:8808
+
+#盯盘相关接口
+VUE_APP_BASE_STARE_URL = http://192.168.0.195:9999/material
+# 字安接口 http://192.168.1.43:9999
+# 测试环境 http://192.168.0.195:9999

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 20041
package-lock.json


+ 1 - 0
package.json

@@ -29,6 +29,7 @@
     "cos-js-sdk-v5": "^0.5.26",
     "cos-js-sdk-v5": "^0.5.26",
     "dayjs": "^1.8.0",
     "dayjs": "^1.8.0",
     "echarts": "^4.9.0",
     "echarts": "^4.9.0",
+    "echarts-gl": "^1.1.2",
     "element-ui": "^2.13.0",
     "element-ui": "^2.13.0",
     "enquire.js": "^2.1.6",
     "enquire.js": "^2.1.6",
     "html2canvas": "^1.0.0-rc.3",
     "html2canvas": "^1.0.0-rc.3",

+ 4 - 0
public/index.html

@@ -6,6 +6,10 @@
   <meta http-equiv="X-UA-Compatible" content="IE=edge">
   <meta http-equiv="X-UA-Compatible" content="IE=edge">
   <meta name="referrer" content="never">
   <meta name="referrer" content="never">
   <meta name="viewport" content="width=device-width,initial-scale=1.0">
   <meta name="viewport" content="width=device-width,initial-scale=1.0">
+  <meta http-equiv="pragram" content="no-cache">
+  <meta http-equiv="cache-control" content="no-cache, no-store, must-revalidate">
+  <meta http-equiv="expires" content="0">
+
   <title>有腾投放助手</title>
   <title>有腾投放助手</title>
   <link rel="icon" href="<%= BASE_URL %>logo.png">
   <link rel="icon" href="<%= BASE_URL %>logo.png">
   <link href="<%= BASE_URL %>color.less">
   <link href="<%= BASE_URL %>color.less">

BIN
src/assets/img/head_bg.png


+ 6 - 0
src/assets/img/u2.svg

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" width="739px" height="357px" xmlns="http://www.w3.org/2000/svg">
+  <g transform="matrix(1 0 0 1 -590 -298 )">
+    <path d="M 959.5 298  C 1166.42 298  1329 376.54  1329 476.5  C 1329 576.46  1166.42 655  959.5 655  C 752.58 655  590 576.46  590 476.5  C 590 376.54  752.58 298  959.5 298  Z " fill-rule="nonzero" fill="#6633ff" stroke="none" fill-opacity="0.0980392156862745" />
+  </g>
+</svg>

+ 6 - 0
src/assets/img/u3.svg

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" width="639px" height="309px" xmlns="http://www.w3.org/2000/svg">
+  <g transform="matrix(1 0 0 1 -640 -302 )">
+    <path d="M 959.5 302  C 1138.42 302  1279 369.98  1279 456.5  C 1279 543.02  1138.42 611  959.5 611  C 780.58 611  640 543.02  640 456.5  C 640 369.98  780.58 302  959.5 302  Z " fill-rule="nonzero" fill="#6633ff" stroke="none" fill-opacity="0.0980392156862745" />
+  </g>
+</svg>

+ 6 - 0
src/assets/img/u4.svg

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" width="480px" height="232px" xmlns="http://www.w3.org/2000/svg">
+  <g transform="matrix(1 0 0 1 -720 -330 )">
+    <path d="M 960 330  C 1094.4 330  1200 381.04  1200 446  C 1200 510.96  1094.4 562  960 562  C 825.6 562  720 510.96  720 446  C 720 381.04  825.6 330  960 330  Z " fill-rule="nonzero" fill="#6633ff" stroke="none" fill-opacity="0.0980392156862745" />
+  </g>
+</svg>

BIN
src/assets/img/wangge2.png


+ 6 - 5
src/components/jeecg/JTreeSelect.vue

@@ -154,11 +154,12 @@
             if(res.success){
             if(res.success){
               for(let i of res.result){
               for(let i of res.result){
                 i.value = i.key
                 i.value = i.key
-                if(i.leaf==false){
-                  i.isLeaf=false
-                }else if(i.leaf==true){
-                  i.isLeaf=true
-                }
+                i.isLeaf=true
+                // if(i.leaf==false){
+                //   i.isLeaf=false
+                // }else if(i.leaf==true){
+                //   i.isLeaf=true
+                // }
               }
               }
               this.addChildren(pid,res.result,this.treeData)
               this.addChildren(pid,res.result,this.treeData)
               this.treeData = [...this.treeData]
               this.treeData = [...this.treeData]

+ 2 - 2
src/components/page/GlobalLayout.vue

@@ -679,8 +679,8 @@
         }
         }
 
 
         .ant-form-item-control {
         .ant-form-item-control {
-          height: 32px;
-          line-height: 32px;
+          // height: 32px;
+          // line-height: 32px;
         }
         }
       }
       }
     }
     }

+ 10 - 0
src/config/router.config.js

@@ -90,6 +90,11 @@ export const constantRouterMap = [
     component: () => import(/* webpackChunkName: "fail" */ '@/views/modules/autoLaunch/material-test/creatMaterialTest')
     component: () => import(/* webpackChunkName: "fail" */ '@/views/modules/autoLaunch/material-test/creatMaterialTest')
   },
   },
   {
   {
+    path: '/create-launch',
+    name: 'createLaunch',
+    component: () => import(/* webpackChunkName: "fail" */ '@/views/modules/autoLaunchRevision/createLaunch')
+  },
+  {
     path: '/test',
     path: '/test',
     component: BlankLayout,
     component: BlankLayout,
     redirect: '/test/home',
     redirect: '/test/home',
@@ -110,5 +115,10 @@ export const constantRouterMap = [
     name: 'errorPage',
     name: 'errorPage',
     component: () => import(/* webpackChunkName: "fail" */ '@/views/errorPage')
     component: () => import(/* webpackChunkName: "fail" */ '@/views/errorPage')
   },
   },
+  {
+    path: '/boss-data-kanban',
+    name: 'bossDataKanban',
+    component: () => import(/* webpackChunkName: "fail" */ '@/views/bossDataKanban/index')
+  },
 
 
 ]
 ]

+ 2 - 1
src/filters.js

@@ -384,7 +384,8 @@ const filters = {
             3: '视频播放页广告',
             3: '视频播放页广告',
             6: '上下滑大屏广告',
             6: '上下滑大屏广告',
             7: '信息流广告',
             7: '信息流广告',
-            5: "联盟广告"
+            5: "联盟广告",
+            24: '激励视频广告'
         }
         }
 
 
         return data[val]
         return data[val]

+ 7 - 0
src/mixins/JeecgListMixin.js

@@ -9,6 +9,7 @@ import {deleteAction, getAction, downFile} from '@/api/manage'
 import Vue from 'vue'
 import Vue from 'vue'
 import {ACCESS_TOKEN} from "@/store/mutation-types"
 import {ACCESS_TOKEN} from "@/store/mutation-types"
 import { transformTozTreeFormat } from '@/utils/util.js'
 import { transformTozTreeFormat } from '@/utils/util.js'
+import {mapGetters} from 'vuex';
 export const JeecgListMixin = {
 export const JeecgListMixin = {
   data() {
   data() {
     return {
     return {
@@ -63,6 +64,7 @@ export const JeecgListMixin = {
     this.initDictConfig();
     this.initDictConfig();
   },
   },
   methods: {
   methods: {
+    ...mapGetters(['nickname', 'avatar', 'userInfo']),
     // 二级树
     // 二级树
     expand(expanded,record){
     expand(expanded,record){
         if(this.url.listTwo){
         if(this.url.listTwo){
@@ -144,7 +146,12 @@ export const JeecgListMixin = {
       // if(params.endDate){
       // if(params.endDate){
       //   params.endDate = moment(params.endDate).format('YYYY-MM-DD')
       //   params.endDate = moment(params.endDate).format('YYYY-MM-DD')
       // }
       // }
+      if(params.userId){
 
 
+      }else{
+        params.userId = this.userInfo().id
+      }
+      
       this.loading = true;
       this.loading = true;
       await getAction(this.url.list, params).then((res) => {
       await getAction(this.url.list, params).then((res) => {
         if (res.success) {
         if (res.success) {

+ 10 - 0
src/mixins/videoMaterialMixin.js

@@ -9,6 +9,7 @@
  import Vue from 'vue'
  import Vue from 'vue'
  import {ACCESS_TOKEN} from "@/store/mutation-types"
  import {ACCESS_TOKEN} from "@/store/mutation-types"
  import { transformTozTreeFormat } from '@/utils/util.js'
  import { transformTozTreeFormat } from '@/utils/util.js'
+ import {mapGetters} from 'vuex';
  export const JeecgListMixin = {
  export const JeecgListMixin = {
    data() {
    data() {
      return {
      return {
@@ -93,6 +94,7 @@
              }
              }
          }
          }
      },
      },
+     ...mapGetters(['nickname', 'avatar', 'userInfo']),
      async loadData(arg) {
      async loadData(arg) {
        this.cancel()
        this.cancel()
        this.spinning= true
        this.spinning= true
@@ -115,6 +117,13 @@
        if(params.stateDate){
        if(params.stateDate){
          params.stateDate = moment(params.stateDate).format('YYYY-MM-DD')
          params.stateDate = moment(params.stateDate).format('YYYY-MM-DD')
        }
        }
+       if(params.createTimeDate&&params.createTimeDate.length>0){
+        // params.createTime = moment(params.createTime).format('YYYY-MM-DD')
+        params.startTime = moment(params.createTimeDate[0]).format('YYYY-MM-DD')
+        params.endTime = moment(params.createTimeDate[1]).format('YYYY-MM-DD')
+        params.createTimeDate = null
+      }
+       
        // if(params.endDate){
        // if(params.endDate){
        //   params.endDate = moment(params.endDate).format('YYYY-MM-DD')
        //   params.endDate = moment(params.endDate).format('YYYY-MM-DD')
        // }
        // }
@@ -144,6 +153,7 @@
         params.syncBytedance = null
         params.syncBytedance = null
       }
       }
        this.loading = true;
        this.loading = true;
+       params.userId = this.userInfo().id
        await getAction(this.url.list, params).then((res) => {
        await getAction(this.url.list, params).then((res) => {
          if (res.success) {
          if (res.success) {
            this.loading = false;
            this.loading = false;

+ 41 - 6
src/permission.js

@@ -8,27 +8,35 @@ import { ACCESS_TOKEN } from '@/store/mutation-types'
 import { generateIndexRouter } from "@/utils/util"
 import { generateIndexRouter } from "@/utils/util"
 import warterMark from './warterMark'
 import warterMark from './warterMark'
 import { mapGetters, mapMutations, mapActions } from 'vuex'
 import { mapGetters, mapMutations, mapActions } from 'vuex'
+import { cmpPos } from 'codemirror'
 NProgress.configure({ showSpinner: false }) // NProgress Configuration
 NProgress.configure({ showSpinner: false }) // NProgress Configuration
 
 
 
 
-const whiteList = ['/user/login', '/user/register', '/user/register-result', '/user/alteration', '/user/transfer-local', '/errorPage', '/user/new-batch', '/user/lookPreview', 'http://192.168.0.111:8088/jeecg-boot/sys/feishu/url', '/user/FStransfer','/creat-config'] // no redirect whitelist
+const whiteList = ['/user/login', '/user/register', '/user/register-result', '/user/alteration', '/user/transfer-local', '/errorPage', '/user/new-batch', '/user/lookPreview', 'http://192.168.0.111:8088/jeecg-boot/sys/feishu/url', '/user/FStransfer', '/creat-config', '/create-launch', '/boss-data-kanban'] // no redirect whitelist
 
 
 router.beforeEach((to, from, next) => {
 router.beforeEach((to, from, next) => {
   NProgress.start() // start progress bar
   NProgress.start() // start progress bar
   //if (whiteList.indexOf(to.path) !== -1) {
   //if (whiteList.indexOf(to.path) !== -1) {
-    // 在免登录白名单,直接进入
-   // next()
- //}
+  // 在免登录白名单,直接进入
+  // next()
+  //}
+  console.log(to,from)
   if (Vue.ls.get(ACCESS_TOKEN)) {
   if (Vue.ls.get(ACCESS_TOKEN)) {
+    console.log(store.getters.userInfo.id);
     /* has token */
     /* has token */
-
+   
     if (to.path === '/user/login') {
     if (to.path === '/user/login') {
-      warterMark.out()
+      warterMark.out();
+     
       next({ path: '/dashboard/workplace' })
       next({ path: '/dashboard/workplace' })
+     
       NProgress.done()
       NProgress.done()
     } else {
     } else {
+
       // warterMark.set(store.getters.userInfo.roleName)
       // warterMark.set(store.getters.userInfo.roleName)
+
       if (store.getters.permissionList.length === 0) {
       if (store.getters.permissionList.length === 0) {
+       
         store.dispatch('GetPermissionList').then(res => {
         store.dispatch('GetPermissionList').then(res => {
           const menuData = res.result.menu;
           const menuData = res.result.menu;
           localStorage.setItem("roleCode", res.result.roleCode)
           localStorage.setItem("roleCode", res.result.roleCode)
@@ -48,6 +56,19 @@ router.beforeEach((to, from, next) => {
               next({ ...to, replace: true })
               next({ ...to, replace: true })
             } else {
             } else {
               // 跳转到目的路由
               // 跳转到目的路由
+              if( to.path === '/dashboard/analysis' && from.path == '/'){
+                if (store.getters.userInfo.id == '4aba62011120ac565c7f2b9f8f4aa96b' || store.getters.userInfo.id == 'e9ca23d68d884d4ebb19d07889727dae') {
+                  const a = document.createElement('a');
+                                      document.body.appendChild(a);
+                                      a.style.display = 'none';
+                                      a.href = 'http://192.168.0.195:9001/boss-data-kanban';
+                                      a.target = '_blank'
+                                      a.click();
+                                      document.body.removeChild(a);
+                  // let tempPage = window.open('', '_blank');
+                  // tempPage.location="/boss-data-kanban";
+                }
+              }
               next({ path: redirect })
               next({ path: redirect })
             }
             }
           })
           })
@@ -66,6 +87,20 @@ router.beforeEach((to, from, next) => {
         warterMark.set(store.getters.userInfo.realname)
         warterMark.set(store.getters.userInfo.realname)
         next()
         next()
       }
       }
+      if( to.path === '/dashboard/analysis' && from.path == '/'){
+        if (store.getters.userInfo.id == '4aba62011120ac565c7f2b9f8f4aa96b' || store.getters.userInfo.id == 'e9ca23d68d884d4ebb19d07889727dae') {
+          const a = document.createElement('a');
+                              document.body.appendChild(a);
+                              a.style.display = 'none';
+                              a.href = 'http://192.168.0.195:9001/boss-data-kanban';
+                              a.target = '_blank'
+                              a.click();
+                              document.body.removeChild(a);
+          // let tempPage = window.open('', '_blank');
+          // tempPage.location="/boss-data-kanban";
+          return
+        }
+      }
     }
     }
   } else {
   } else {
     if (whiteList.indexOf(to.path) !== -1) {
     if (whiteList.indexOf(to.path) !== -1) {

+ 2 - 2
src/utils/request.js

@@ -21,9 +21,9 @@ else if (process.env.NODE_ENV === 'debug') {
 else if (process.env.NODE_ENV === 'production') {
 else if (process.env.NODE_ENV === 'production') {
 	// axios.defaults.baseURL = 'http://apipre.tjyourong.com.cn/jeecg-boot'; // 预生产
 	// axios.defaults.baseURL = 'http://apipre.tjyourong.com.cn/jeecg-boot'; // 预生产
 	// axios.defaults.baseURL = 'http://gateway.tjyourong.com.cn/jeecg-boot';//测试
 	// axios.defaults.baseURL = 'http://gateway.tjyourong.com.cn/jeecg-boot';//测试
-	axios.defaults.baseURL = 'http://api.tjyourong.com.cn/jeecg-boot'; // 生产环境
+	// axios.defaults.baseURL = 'http://api.tjyourong.com.cn/jeecg-boot'; // 生产环境
 	// axios.defaults.baseURL = 'http://gateway.tjyourong.com.cn/jeecg-boot'; // 测试环境
 	// axios.defaults.baseURL = 'http://gateway.tjyourong.com.cn/jeecg-boot'; // 测试环境
-	// axios.defaults.baseURL = 'http://192.168.0.195:9999/jeecg-boot'; // 测试环境
+	axios.defaults.baseURL = 'http://192.168.0.195:9999/jeecg-boot'; // 测试环境
 	// axios.defaults.baseURL = 'http://192.168.1.134:9999/jeecg-boot'; // 泽宇环境
 	// axios.defaults.baseURL = 'http://192.168.1.134:9999/jeecg-boot'; // 泽宇环境
 
 
 }
 }

+ 278 - 0
src/views/bossDataKanban/chart.js

@@ -0,0 +1,278 @@
+/**
+ * 绘制3d图
+ * @param pieData 总数据
+ * @param internalDiameterRatio:透明的空心占比
+ * @param distance 视角到主体的距离
+ * @param alpha 旋转角度
+ * @param pieHeight 立体的高度
+ * @param opacity 饼或者环的透明度
+ */
+ const getPie3D = (pieData, internalDiameterRatio, distance, alpha, pieHeight, opacity = 1) => {
+    const series = []
+    let sumValue = 0
+    let startValue = 0
+    let endValue = 0
+    let legendData = []
+    let legendBfb = []
+    const k = 1 - internalDiameterRatio
+    pieData.sort((a, b) => {
+      return b.value - a.value
+    })
+    // 为每一个饼图数据,生成一个 series-surface 配置
+    for (let i = 0; i < pieData.length; i++) {
+      sumValue += pieData[i].value
+      const seriesItem = {
+        name:
+            typeof pieData[i].name === 'undefined'
+              ? `series${i}`
+              : pieData[i].name,
+        type: 'surface',
+        parametric: true,
+        wireframe: {
+          show: false
+        },
+        pieData: pieData[i],
+        pieStatus: {
+          selected: false,
+          hovered: false,
+          k: k
+        },
+        center: ['10%', '50%']
+      }
+      if (typeof pieData[i].itemStyle !== 'undefined') {
+        const itemStyle = {}
+        itemStyle.color =
+            typeof pieData[i].itemStyle.color !== 'undefined'
+              ? pieData[i].itemStyle.color
+              : opacity
+        itemStyle.opacity =
+            typeof pieData[i].itemStyle.opacity !== 'undefined'
+              ? pieData[i].itemStyle.opacity
+              : opacity
+        seriesItem.itemStyle = itemStyle
+      }
+      series.push(seriesItem)
+    }
+   
+    // 使用上一次遍历时,计算出的数据和 sumValue,调用 getParametricEquation 函数,
+    // 向每个 series-surface 传入不同的参数方程 series-surface.parametricEquation,也就是实现每一个扇形。
+    legendData = []
+    legendBfb = []
+    for (let i = 0; i < series.length; i++) {
+      endValue = startValue + series[i].pieData.value
+      series[i].pieData.startRatio = startValue / sumValue
+      series[i].pieData.endRatio = endValue / sumValue
+      series[i].parametricEquation = getParametricEquation(
+        series[i].pieData.startRatio,
+        series[i].pieData.endRatio,
+        false,
+        false,
+        k,
+        series[i].pieData.value
+      )
+      startValue = endValue
+      const bfb = fomatFloat(series[i].pieData.value / sumValue, 4)
+      legendData.push({
+        name: series[i].name,
+        value: bfb
+      })
+      legendBfb.push({
+        name: series[i].name,
+        value: bfb
+      })
+    }
+    const boxHeight = getHeight3D(series, pieHeight) // 通过pieHeight设定3d饼/环的高度,单位是px
+    // 准备待返回的配置项,把准备好的 legendData、series 传入。
+    const option = {
+      legend: {
+        show: false,
+        data: legendData,
+        orient: 'vertical',
+        left: 10,
+        top: 10,
+        itemGap: 10,
+        textStyle: {
+          color: '#A1E2FF'
+        },
+        icon: 'circle',
+        formatter: function (param) {
+          const item = legendBfb.filter(item => item.name === param)[0]
+          const bfs = fomatFloat(item.value * 100, 2) + '%'
+          return `${item.name}  ${bfs}`
+        }
+      },
+      labelLine: {
+        show: true,
+        lineStyle: {
+          color: '#fff'
+        }
+      },
+      label: {
+        show: true,
+        position: 'outside',
+        formatter: '{b} \n{c} {d}%'
+      },
+    //   tooltip: {
+    //     backgroundColor: '#033b77',
+    //     borderColor: '#21f2c4',
+    //     textStyle: {
+    //       color: '#fff',
+    //       fontSize: 13
+    //     },
+    //     formatter: params => {
+    //       if (
+    //         params.seriesName !== 'mouseoutSeries' &&
+    //           params.seriesName !== 'pie2d'
+    //       ) {
+    //         const bfb = (
+    //           (option.series[params.seriesIndex].pieData.endRatio -
+    //               option.series[params.seriesIndex].pieData.startRatio) *
+    //             100
+    //         ).toFixed(2)
+    //         return (
+    //           `${params.seriesName}<br/>` +
+    //           `<span style="display:inline-block;margin-right:5px;border-radius:10px;width:10px;height:10px;background-color:${params.color};"></span>` +
+    //           `${bfb}%`
+    //         )
+    //       }
+    //     }
+    //   },
+      xAxis3D: {
+        min: -1,
+        max: 1
+      },
+      yAxis3D: {
+        min: -1,
+        max: 1
+      },
+      zAxis3D: {
+        min: -1,
+        max: 1
+      },
+      grid3D: {
+        show: false,
+        width:'80%',
+        height:'80%',
+        left:'10%',
+        top:'10%',
+        boxHeight: boxHeight, // 圆环的高度
+        viewControl: {
+          // 3d效果可以放大、旋转等
+          alpha:40, // 角度
+          distance:400, // 调整视角到主体的距离,类似调整zoom
+          rotateSensitivity: 0, // 设置为0无法旋转
+          zoomSensitivity: 0, // 设置为0无法缩放
+          panSensitivity: 0, // 设置为0无法平移
+          autoRotate: false // 自动旋转
+        }
+      },
+      series: series
+    }
+    return option
+  }
+   
+  /**
+   * 生成扇形的曲面参数方程,用于 series-surface.parametricEquation
+   */
+  const getParametricEquation = (startRatio, endRatio, isSelected, isHovered, k, h) => {
+    // 计算
+    const midRatio = (startRatio + endRatio) / 2
+    const startRadian = startRatio * Math.PI * 2
+    const endRadian = endRatio * Math.PI * 2
+    const midRadian = midRatio * Math.PI * 2
+    // 如果只有一个扇形,则不实现选中效果。
+    if (startRatio === 0 && endRatio === 1) {
+      isSelected = false
+    }
+    // 通过扇形内径/外径的值,换算出辅助参数 k(默认值 1/3)
+    k = typeof k !== 'undefined' ? k : 1 / 3
+    // 计算选中效果分别在 x 轴、y 轴方向上的位移(未选中,则位移均为 0)
+    const offsetX = isSelected ? Math.cos(midRadian) * 0.1 : 0
+    const offsetY = isSelected ? Math.sin(midRadian) * 0.1 : 0
+    // 计算高亮效果的放大比例(未高亮,则比例为 1)
+    const hoverRate = isHovered ? 1.05 : 1
+    // 返回曲面参数方程
+    return {
+      u: {
+        min: -Math.PI,
+        max: Math.PI * 3,
+        step: Math.PI / 32
+      },
+      v: {
+        min: 0,
+        max: Math.PI * 2,
+        step: Math.PI / 20
+      },
+      x: function (u, v) {
+        if (u < startRadian) {
+          return (
+            offsetX +
+            Math.cos(startRadian) * (1 + Math.cos(v) * k) * hoverRate
+          )
+        }
+        if (u > endRadian) {
+          return (
+            offsetX + Math.cos(endRadian) * (1 + Math.cos(v) * k) * hoverRate
+          )
+        }
+        return offsetX + Math.cos(u) * (1 + Math.cos(v) * k) * hoverRate
+      },
+      y: function (u, v) {
+        if (u < startRadian) {
+          return (
+            offsetY +
+            Math.sin(startRadian) * (1 + Math.cos(v) * k) * hoverRate
+          )
+        }
+        if (u > endRadian) {
+          return (
+            offsetY + Math.sin(endRadian) * (1 + Math.cos(v) * k) * hoverRate
+          )
+        }
+        return offsetY + Math.sin(u) * (1 + Math.cos(v) * k) * hoverRate
+      },
+      z: function (u, v) {
+        if (u < -Math.PI * 0.5) {
+          return Math.sin(u)
+        }
+        if (u > Math.PI * 2.5) {
+          return Math.sin(u) * h * 0.1
+        }
+        return Math.sin(v) > 0 ? 1 * h * 0.1 : -1
+      }
+    }
+  }
+   
+  /**
+   * 获取3d丙图的最高扇区的高度
+   */
+  const getHeight3D = (series, height) => {
+    series.sort((a, b) => {
+      return b.pieData.value - a.pieData.value
+    })
+    return (height * 25) / series[0].pieData.value
+  }
+   
+  /**
+   * 格式化浮点数
+   */
+  const fomatFloat = (num, n) => {
+    let f = parseFloat(num)
+    if (isNaN(f)) {
+      return false
+    }
+    f = Math.round(num * Math.pow(10, n)) / Math.pow(10, n) // n 幂
+    let s = f.toString()
+    let rs = s.indexOf('.')
+    // 判定如果是整数,增加小数点再补0
+    if (rs < 0) {
+      rs = s.length
+      s += '.'
+    }
+    while (s.length <= rs + n) {
+      s += '0'
+    }
+    return s
+  }
+   
+  export { getPie3D, getParametricEquation }

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 1780 - 0
src/views/bossDataKanban/index.vue


+ 25 - 2
src/views/dashboard/Analysis.vue

@@ -70,6 +70,8 @@
 </style>
 </style>
 <template>
 <template>
   <div class="page-header-index-wide analysis">
   <div class="page-header-index-wide analysis">
+    <a-button  type='primary' style="position:absolute;z-index: 99;right: 28px;top: 133px;" @click="dataKanBan"
+    v-if="userInfoId">数据看板</a-button>
     <div v-if="roleCode == 'operator'">
     <div v-if="roleCode == 'operator'">
       <a-row :gutter="24">
       <a-row :gutter="24">
         <a-col :sm="24" :md="12" :xl="6" :style="{ marginBottom: '24px' }">
         <a-col :sm="24" :md="12" :xl="6" :style="{ marginBottom: '24px' }">
@@ -220,7 +222,7 @@
 
 
     <Workbench v-else-if="roleCode == 'clip'" />
     <Workbench v-else-if="roleCode == 'clip'" />
     <Workbench v-else-if="roleCode == 'plane'" />
     <Workbench v-else-if="roleCode == 'plane'" />
-
+    
     <a-tabs default-active-key="1" v-else-if="roleCode == 'admin'" class="only-there">
     <a-tabs default-active-key="1" v-else-if="roleCode == 'admin'" class="only-there">
       <a-tab-pane key="1" tab="快手">
       <a-tab-pane key="1" tab="快手">
         <statistics />
         <statistics />
@@ -228,7 +230,6 @@
       <a-tab-pane key="2" tab="头条">
       <a-tab-pane key="2" tab="头条">
         <newHome />
         <newHome />
       </a-tab-pane>
       </a-tab-pane>
-
     </a-tabs>
     </a-tabs>
     <!-- 更新公告 -->
     <!-- 更新公告 -->
     <a-modal v-model="visible" title="" @ok="handleOk" :closable='false' :footer="null" id="updateInfo">
     <a-modal v-model="visible" title="" @ok="handleOk" :closable='false' :footer="null" id="updateInfo">
@@ -282,6 +283,7 @@
   import LineChartMultid from '@/components/chart/LineChartMultid'
   import LineChartMultid from '@/components/chart/LineChartMultid'
   import HeadInfo from '@/components/tools/HeadInfo.vue'
   import HeadInfo from '@/components/tools/HeadInfo.vue'
   import { getAction, postAction, downFile, downFilePost } from '@/api/manage';
   import { getAction, postAction, downFile, downFilePost } from '@/api/manage';
+  import { mapActions, mapGetters } from 'vuex'
   import Trend from '@/components/Trend'
   import Trend from '@/components/Trend'
   import {
   import {
     getLoginfo,
     getLoginfo,
@@ -336,6 +338,7 @@
         visible:false,//更新通知消息提示框
         visible:false,//更新通知消息提示框
         updateTime:['2021-03-03'],
         updateTime:['2021-03-03'],
         versionId:0,//存储版本号 判断通知什么时候显示
         versionId:0,//存储版本号 判断通知什么时候显示
+        userInfoId:false,
       }
       }
     },
     },
     created() {
     created() {
@@ -344,7 +347,26 @@
       }, 1000)
       }, 1000)
       this.initLogInfo()
       this.initLogInfo()
     },
     },
+
     methods: {
     methods: {
+      ...mapGetters(['userInfo']),
+      getUserId(){
+        if (this.userInfo().id == '4aba62011120ac565c7f2b9f8f4aa96b' || this.userInfo().id == 'e9ca23d68d884d4ebb19d07889727dae') {
+          this.userInfoId = true;
+        }else{
+          this.userInfoId = false;
+        }
+      },
+      // 跳转数据看板
+      dataKanBan(){
+                    const a = document.createElement('a');
+                    document.body.appendChild(a);
+                    a.style.display = 'none';
+                    a.href = 'http://192.168.0.195:9001/boss-data-kanban';
+                    a.target = '_blank'
+                    a.click();
+                    document.body.removeChild(a);
+      },
       initLogInfo() {
       initLogInfo() {
         getLoginfo(null).then(res => {
         getLoginfo(null).then(res => {
           if (res.success) {
           if (res.success) {
@@ -389,6 +411,7 @@
             }
             }
            
            
         })
         })
+        this.getUserId();
     },
     },
   }
   }
 </script>
 </script>

+ 7 - 0
src/views/modules/Statistics/kuaishouReport/accountReport.vue

@@ -1510,6 +1510,13 @@ export default {
                     element.fixed = false
                     element.fixed = false
                 })
                 })
             }
             }
+            let arr = JSON.stringify(this.columns)
+            postAction('/toutiao/videoReportDaily/saveOrUpdateColumnJson', {
+                json: arr,
+                columnType: 2
+            }).then(res => {
+                // console.log(res)
+            })
         },
         },
         tableHandle() {
         tableHandle() {
             // this.listNum = [...this.columns]
             // this.listNum = [...this.columns]

+ 7 - 0
src/views/modules/Statistics/kuaishouReport/videoReport.vue

@@ -733,6 +733,13 @@ export default {
                     element.fixed = false
                     element.fixed = false
                 })
                 })
             }
             }
+            let arr = JSON.stringify(this.columns)
+            postAction('/toutiao/videoReportDaily/saveOrUpdateColumnJson', {
+                json: arr,
+                columnType: 4
+            }).then(res => {
+                // console.log(res)
+            })
         },
         },
         // 日期的开关
         // 日期的开关
         //打开日期框
         //打开日期框

+ 30 - 7
src/views/modules/account-config/account-config.vue

@@ -23,6 +23,7 @@
                             <a-select-option value="CREATIVE_IMAGE_MODE_LARGE">大图横图</a-select-option>
                             <a-select-option value="CREATIVE_IMAGE_MODE_LARGE">大图横图</a-select-option>
                             <a-select-option value="CREATIVE_IMAGE_MODE_LARGE_VERTICAL">大图竖图</a-select-option>
                             <a-select-option value="CREATIVE_IMAGE_MODE_LARGE_VERTICAL">大图竖图</a-select-option>
                             <a-select-option value="CREATIVE_IMAGE_MODE_UNION_SPLASH">开屏</a-select-option>
                             <a-select-option value="CREATIVE_IMAGE_MODE_UNION_SPLASH">开屏</a-select-option>
+                            <a-select-option value="UNIVERSAL">通投智选</a-select-option>
                         </a-select>
                         </a-select>
                     </a-form-item>
                     </a-form-item>
                     <a-form-item label="状态">
                     <a-form-item label="状态">
@@ -38,6 +39,7 @@
                     </a-form-item>
                     </a-form-item>
                 </a-row>
                 </a-row>
             </a-form>
             </a-form>
+            <a-button type="primary" style=" position: absolute;right: 150px;top: 0;" @click="linkConfigurtion">链接配置</a-button>
             <a-button type="primary" class="upload-person" @click="handleAddAccountConfig">新建账户配置</a-button>
             <a-button type="primary" class="upload-person" @click="handleAddAccountConfig">新建账户配置</a-button>
         </div>
         </div>
         <div class="control-con-table">
         <div class="control-con-table">
@@ -62,8 +64,8 @@
                 <span slot="acountRelax" slot-scope="text, record">
                 <span slot="acountRelax" slot-scope="text, record">
                     <a-switch :checked="text === 0" @change="handleSwitchChang($event, record)"/>
                     <a-switch :checked="text === 0" @change="handleSwitchChang($event, record)"/>
                 </span>
                 </span>
-                <span slot="creativeImageMode" slot-scope="text">
-                    <span>{{ handleChangeCreativeImage(text) }}</span>
+                <span slot="creativeImageMode" slot-scope="text,record">
+                    <span>{{ handleChangeCreativeImage(text,record) }}</span>
                 </span>
                 </span>
                 <span solt="accountBudget" slot-scope="text, record">
                 <span solt="accountBudget" slot-scope="text, record">
                     {{ record.accountBudgetMode === '1' ? '不限' : text }}
                     {{ record.accountBudgetMode === '1' ? '不限' : text }}
@@ -430,9 +432,20 @@ export default {
         this.handleInitTable();
         this.handleInitTable();
     },
     },
     methods: {
     methods: {
+        
         ...mapGetters(['nickname', 'avatar', 'userInfo']),
         ...mapGetters(['nickname', 'avatar', 'userInfo']),
-        handleChangeCreativeImage(val) {
-            return val ? this.creativeImageOption.filter(item => item.id === val)[0].value : '-';
+        handleChangeCreativeImage(val,record) {
+           
+
+           if (record.inventoryCatalog == 'UNIVERSAL') {
+           
+            return  record.inventoryCatalog != null && record.inventoryCatalog == 'UNIVERSAL' ?'通投智选' : '-'
+           }else{
+               return val ? this.creativeImageOption.filter(item => item.id === val)[0].value : '-';
+           }
+                
+            
+            
         },
         },
         handleAccountMode(e) {
         handleAccountMode(e) {
             this.budgetForm.budget = 1000;
             this.budgetForm.budget = 1000;
@@ -552,7 +565,8 @@ export default {
             const paramsData = {
             const paramsData = {
                 accountId: this.acountId,
                 accountId: this.acountId,
                 status: this.searchStatus === 2 ? '' : this.searchStatus,
                 status: this.searchStatus === 2 ? '' : this.searchStatus,
-                creativeImageMode: this.creativeStatus === 2 ? '' : this.creativeStatus,
+                creativeImageMode: this.creativeStatus === 2 || this.creativeStatus == 'UNIVERSAL'? '' : this.creativeStatus,
+                inventoryCatalog:this.creativeStatus == 'UNIVERSAL' ? 'UNIVERSAL' :'',
                 loginUserId: this.userInfo().id,
                 loginUserId: this.userInfo().id,
                 pageNo: this.tablePag.page,
                 pageNo: this.tablePag.page,
                 pageSize: this.tablePag.size
                 pageSize: this.tablePag.size
@@ -613,6 +627,7 @@ export default {
             });
             });
         },
         },
         handleQueryList(event) {
         handleQueryList(event) {
+            this.tablePag.page = 1;
             event.preventDefault();
             event.preventDefault();
             this.controlLoading = true;
             this.controlLoading = true;
             this.handleInitTable();
             this.handleInitTable();
@@ -632,13 +647,18 @@ export default {
                 state: checked ? 0 : 1,
                 state: checked ? 0 : 1,
                 creativeImageMode: this.creativeStatus === 2 ? '' : this.creativeStatus,
                 creativeImageMode: this.creativeStatus === 2 ? '' : this.creativeStatus,
                 accountId: data.accountId,
                 accountId: data.accountId,
-                creativeImageMode: data.creativeImageMode
+                creativeImageMode: data.creativeImageMode,
+                adDeliveryRange:'UNIVERSAL'
             };
             };
             const forDate = new FormData();
             const forDate = new FormData();
             forDate.append('id', paramsData.id);
             forDate.append('id', paramsData.id);
             forDate.append('state', paramsData.state);
             forDate.append('state', paramsData.state);
             forDate.append('accountId', paramsData.accountId);
             forDate.append('accountId', paramsData.accountId);
             forDate.append('creativeImageMode', paramsData.creativeImageMode);
             forDate.append('creativeImageMode', paramsData.creativeImageMode);
+            if (data.inventoryCatalog == 'UNIVERSAL') {
+                forDate.append('adDeliveryRange',paramsData.adDeliveryRange)
+            }
+            
             putAction(urlAcount + '/bytedance-api/advertiser/aiBytedanceAdvertiserStrategy/updStaById', forDate).then(result => {
             putAction(urlAcount + '/bytedance-api/advertiser/aiBytedanceAdvertiserStrategy/updStaById', forDate).then(result => {
                 if (result.code === 0) {
                 if (result.code === 0) {
                     this.$message.success(result.message);
                     this.$message.success(result.message);
@@ -666,7 +686,10 @@ export default {
             };
             };
             localStorage.setItem('queryList', JSON.stringify(params));
             localStorage.setItem('queryList', JSON.stringify(params));
             this.$router.push('/account-config/components/configuration-modal');
             this.$router.push('/account-config/components/configuration-modal');
-        }
+        },
+        linkConfigurtion(){
+            this.$router.push('/account-config/components/link-configuration');
+        },
     }
     }
 };
 };
 </script>
 </script>

+ 170 - 17
src/views/modules/account-config/components/configuration-modal.vue

@@ -236,8 +236,8 @@
                     <div v-if="platformLoadingType === 'APP_ANDROID' && configForm.adDownloadType === 'DOWNLOAD_URL'" class="adver-position-radio">
                     <div v-if="platformLoadingType === 'APP_ANDROID' && configForm.adDownloadType === 'DOWNLOAD_URL'" class="adver-position-radio">
                         <div class="create-web-url-class">
                         <div class="create-web-url-class">
                             <div class="web-url-img">
                             <div class="web-url-img">
-                                <img v-if="landingPageShowData.thumbnail" :src="landingPageShowData.thumbnail"/>
-                                <img v-else src="@/assets/noImg.png"/>
+                                <img v-if="landingPageShowData.thumbnail" style=" height: 110px;" :src="landingPageShowData.thumbnail"/>
+                                <img v-else style=" height: 110px;" src="@/assets/noImg.png"/>
                             </div>
                             </div>
                             <div class="web-url-content">
                             <div class="web-url-content">
                                 <div class="url-content-name"><a>{{ landingPageShowData.name }}</a></div>
                                 <div class="url-content-name"><a>{{ landingPageShowData.name }}</a></div>
@@ -292,6 +292,7 @@
                             <a-radio-button value="a">系统优选广告位</a-radio-button>
                             <a-radio-button value="a">系统优选广告位</a-radio-button>
                             <a-radio-button value="b">首选媒体</a-radio-button>
                             <a-radio-button value="b">首选媒体</a-radio-button>
                             <!-- <a-radio-button value="c">按场景指定位置</a-radio-button> -->
                             <!-- <a-radio-button value="c">按场景指定位置</a-radio-button> -->
+                            <a-radio-button value="d">通投智选</a-radio-button>
                         </a-radio-group>
                         </a-radio-group>
                     </a-form-model-item>
                     </a-form-model-item>
                     <div class="adver-position-radio">
                     <div class="adver-position-radio">
@@ -319,7 +320,9 @@
                             </a-checkbox-group>
                             </a-checkbox-group>
                         </div>
                         </div>
                     </div>
                     </div>
-                    <a-form-model-item v-if="configForm.checkboxChangeValue.length === 1 && configForm.checkboxChangeValue[0] === 'INVENTORY_UNION_SLOT'" label="投放形式">
+                    <a-form-model-item v-if="
+                    (configForm.checkboxChangeValue.length === 1 && configForm.checkboxChangeValue[0] === 'INVENTORY_UNION_SLOT')
+                    " label="投放形式">
                         <a-radio-group
                         <a-radio-group
                             v-model="configForm.adUnionVideoType"
                             v-model="configForm.adUnionVideoType"
                             button-style="solid"
                             button-style="solid"
@@ -793,7 +796,27 @@
                                 :step="0.01"
                                 :step="0.01"
                                 placeholder="请输入"
                                 placeholder="请输入"
                                 @blur="handleFloatingInterval"
                                 @blur="handleFloatingInterval"
-                            /> 元
+                            /> 
+                            <span>元</span>
+                        </a-form-model-item>
+                    </div>
+                    <div v-if="deepExternalShow">
+                        <a-form-model-item label="深度优化方式" prop="deepExternal">
+                            <a-radio-group @change="adDeepBidTypeChange" v-model="configForm.adDeepBidType" button-style="solid">
+                                <a-radio-button value="DEEP_BID_MIN" >自定义双出价</a-radio-button>
+                                <a-radio-button value="DEEP_BID_PACING" >自动优化</a-radio-button>
+                            </a-radio-group>
+                        </a-form-model-item>
+                         <a-form-model-item v-if="adDeepCpabidShow" label="深度转化出价" prop="adDeepCpabid">
+                            <a-input-number
+                            class="common-input"
+                            v-model="configForm.adDeepCpabid"
+                            :min="0.1"
+                            :max="10000"
+                            :step="0.01"
+                            placeholder="请输入"
+                        /> 元
+                            
                         </a-form-model-item>
                         </a-form-model-item>
                     </div>
                     </div>
                 </div>
                 </div>
@@ -852,7 +875,7 @@
                                 allow-clear
                                 allow-clear
                             />
                             />
                         </a-form-model-item>
                         </a-form-model-item>
-                        <a-form-model-item v-if="configForm.adDownloadType === 'DOWNLOAD_URL'&&configForm.adverPosition != 'a'" label="应用名" prop="creativeAppName" key="creativeAppName24">
+                        <a-form-model-item v-if="configForm.adDownloadType === 'DOWNLOAD_URL'" label="应用名" prop="creativeAppName" key="creativeAppName24">
                             <a-input
                             <a-input
                                 class="common-input-long"
                                 class="common-input-long"
                                 placeholder="请输入应用名"
                                 placeholder="请输入应用名"
@@ -889,7 +912,7 @@
                             </a-radio-group>
                             </a-radio-group>
                         </a-form-model-item> -->
                         </a-form-model-item> -->
                     </div>
                     </div>
-                    <div v-else-if="configForm.adUnionVideoType === 'ORIGINAL_VIDEO'">
+                    <div v-else-if="configForm.adUnionVideoType === 'ORIGINAL_VIDEO'||(configForm.checkboxChangeValue.length === 1 && configForm.checkboxChangeValue[0] === 'INVENTORY_TOMATO_NOVEL')">
                         <a-form-model-item label="创意内容">
                         <a-form-model-item label="创意内容">
                             <a-radio-group v-model="configForm.creativeImageMode" button-style="solid"  @change="handleChangeCreativeType">
                             <a-radio-group v-model="configForm.creativeImageMode" button-style="solid"  @change="handleChangeCreativeType">
                                 <a-radio-button value="CREATIVE_IMAGE_MODE_VIDEO_VERTICAL">竖版视频</a-radio-button>
                                 <a-radio-button value="CREATIVE_IMAGE_MODE_VIDEO_VERTICAL">竖版视频</a-radio-button>
@@ -921,7 +944,7 @@
                                 allow-clear
                                 allow-clear
                             />
                             />
                         </a-form-model-item>
                         </a-form-model-item>
-                        <a-form-model-item v-if="configForm.adDownloadType === 'DOWNLOAD_URL'&&configForm.adverPosition != 'a'" label="应用名" prop="creativeAppName" key="creativeAppName23">
+                        <a-form-model-item v-if="configForm.adDownloadType === 'DOWNLOAD_URL'" label="应用名" prop="creativeAppName" key="creativeAppName23">
                             <a-input
                             <a-input
                                 class="common-input-long"
                                 class="common-input-long"
                                 placeholder="请输入应用名"
                                 placeholder="请输入应用名"
@@ -986,7 +1009,7 @@
                                 allow-clear
                                 allow-clear
                             />
                             />
                         </a-form-model-item>
                         </a-form-model-item>
-                        <a-form-model-item v-if="configForm.adDownloadType === 'DOWNLOAD_URL'&&configForm.adverPosition != 'a'" label="应用名" prop="creativeAppName" key="creativeAppName25">
+                        <a-form-model-item v-if="configForm.adDownloadType === 'DOWNLOAD_URL'" label="应用名" prop="creativeAppName" key="creativeAppName25">
                             <a-input
                             <a-input
                                 class="common-input-long"
                                 class="common-input-long"
                                 placeholder="请输入应用名"
                                 placeholder="请输入应用名"
@@ -1073,7 +1096,7 @@
                                 allow-clear
                                 allow-clear
                             />
                             />
                         </a-form-model-item>
                         </a-form-model-item>
-                        <a-form-model-item v-if="configForm.adDownloadType === 'DOWNLOAD_URL'&&configForm.adverPosition != 'a'" label="应用名" prop="creativeAppName" key="creativeAppName26">
+                        <a-form-model-item v-if="configForm.adDownloadType === 'DOWNLOAD_URL'" label="应用名" prop="creativeAppName" key="creativeAppName26">
                             <a-input
                             <a-input
                                 class="common-input-long"
                                 class="common-input-long"
                                 placeholder="请输入应用名"
                                 placeholder="请输入应用名"
@@ -1127,7 +1150,7 @@
                         </a-form-model-item>
                         </a-form-model-item>
                     </div>
                     </div>
                     <div v-else>
                     <div v-else>
-                        <a-form-model-item label="创意内容">
+                        <a-form-model-item label="创意内容" v-if="creativeImageShow">
                             <a-radio-group v-model="configForm.creativeImageMode" button-style="solid"  @change="handleChangeCreativeType">
                             <a-radio-group v-model="configForm.creativeImageMode" button-style="solid"  @change="handleChangeCreativeType">
                                 <a-radio-button value="CREATIVE_IMAGE_MODE_VIDEO_VERTICAL">竖版视频</a-radio-button>
                                 <a-radio-button value="CREATIVE_IMAGE_MODE_VIDEO_VERTICAL">竖版视频</a-radio-button>
                                 <a-radio-button value="CREATIVE_IMAGE_MODE_VIDEO" :disabled="pictureStatus">横版视频</a-radio-button>
                                 <a-radio-button value="CREATIVE_IMAGE_MODE_VIDEO" :disabled="pictureStatus">横版视频</a-radio-button>
@@ -1136,6 +1159,9 @@
                                 <a-radio-button value="CREATIVE_IMAGE_MODE_LARGE_VERTICAL" :disabled="pictureStatus">大图竖图</a-radio-button>
                                 <a-radio-button value="CREATIVE_IMAGE_MODE_LARGE_VERTICAL" :disabled="pictureStatus">大图竖图</a-radio-button>
                             </a-radio-group>
                             </a-radio-group>
                         </a-form-model-item>
                         </a-form-model-item>
+                        <a-form-model-item label="创意内容" v-else="creativeImageShow">      
+                                <radio-check v-model="configForm.creativeImageMode" :options="creativeImageModeArr"></radio-check>
+                        </a-form-model-item>
                         <a-form-model-item label="创意组件" prop="componentId" key="componentIdkey" 
                         <a-form-model-item label="创意组件" prop="componentId" key="componentIdkey" 
                         v-if="configForm.creativeImageMode!='CREATIVE_IMAGE_MODE_LARGE'&&configForm.creativeImageMode!='CREATIVE_IMAGE_MODE_LARGE_VERTICAL'&&configForm.adverPosition != 'a'">
                         v-if="configForm.creativeImageMode!='CREATIVE_IMAGE_MODE_LARGE'&&configForm.creativeImageMode!='CREATIVE_IMAGE_MODE_LARGE_VERTICAL'&&configForm.adverPosition != 'a'">
                             <a-input
                             <a-input
@@ -1167,7 +1193,7 @@
                                 allow-clear
                                 allow-clear
                             />
                             />
                         </a-form-model-item>
                         </a-form-model-item>
-                        <a-form-model-item v-if="configForm.adDownloadType === 'DOWNLOAD_URL'&&configForm.adverPosition != 'a'" label="应用名" prop="creativeAppName" key="creativeAppName26">
+                        <a-form-model-item v-if="configForm.adDownloadType === 'DOWNLOAD_URL'" label="应用名" prop="creativeAppName" key="creativeAppName26">
                             <a-input
                             <a-input
                                 class="common-input-long"
                                 class="common-input-long"
                                 placeholder="请输入应用名"
                                 placeholder="请输入应用名"
@@ -1296,7 +1322,7 @@
                         :key="index"
                         :key="index"
                         @click="handleViedoListClick(item)"
                         @click="handleViedoListClick(item)"
                     >
                     >
-                        <img v-if="item.thumbnail" :src="item.thumbnail"/>
+                        <img v-if="item.thumbnail" :src="item.thumbnail" style="height: 78%;"/>
                         <img v-else src="@/assets/noImg.png"/>
                         <img v-else src="@/assets/noImg.png"/>
                         <div class="checkbox-select-show"><a>{{ item.name }}</a></div>
                         <div class="checkbox-select-show"><a>{{ item.name }}</a></div>
                         <div class="checkbox-select-time">ID:{{ item.siteId }}</div>
                         <div class="checkbox-select-time">ID:{{ item.siteId }}</div>
@@ -1635,6 +1661,25 @@ export default {
                     label: '50岁+'
                     label: '50岁+'
                 }
                 }
             ],
             ],
+            creativeImageModeArr:[
+                {
+                    value:"CREATIVE_IMAGE_MODE_VIDEO_VERTICAL",
+                    label:'竖版视频'
+                },{
+                    value:"CREATIVE_IMAGE_MODE_VIDEO",
+                    label:'横版视频'
+                },{
+                    value:"CREATIVE_IMAGE_MODE_LARGE",
+                    label:'大图横图'
+                },{
+                    value:"CREATIVE_IMAGE_MODE_SMALL",
+                    label:'小图',
+                    disabled:true
+                },{
+                    value:"CREATIVE_IMAGE_MODE_LARGE_VERTICAL",
+                    label:"大图竖图"
+                }
+            ],
             fileList: [],
             fileList: [],
             isCoverImgDiv: false,
             isCoverImgDiv: false,
             imageUrl: '',
             imageUrl: '',
@@ -1723,9 +1768,12 @@ export default {
                 creativeActionText: [{required: true, message: '请选择', trigger: 'change'}],
                 creativeActionText: [{required: true, message: '请选择', trigger: 'change'}],
                 adConvertType: [{required: true, message: '请选择', trigger: 'change'}],
                 adConvertType: [{required: true, message: '请选择', trigger: 'change'}],
                 adConvertId: [{required: true, message: '请选择', trigger: 'change'}],
                 adConvertId: [{required: true, message: '请选择', trigger: 'change'}],
-                creativeThirdIndustryIds: [{required: true, message: '请选择', trigger: 'change'}]
+                creativeThirdIndustryIds: [{required: true, message: '请选择', trigger: 'change'}],
+                adDeepCpabid:[ {required: true, message: '请输入', trigger: 'blur'},]
             },
             },
             configForm: {
             configForm: {
+                adDeepBidType:'DEEP_BID_MIN',
+                adDeepCpabid:0.1,
                 copywritingNumber: undefined,
                 copywritingNumber: undefined,
                 marketingPurpose: 'CONVERSION',
                 marketingPurpose: 'CONVERSION',
                 componentId: '',
                 componentId: '',
@@ -1829,7 +1877,11 @@ export default {
             originalityStatus: true, // 创意状态
             originalityStatus: true, // 创意状态
             pictureStatus: false,
             pictureStatus: false,
             isTomatoStatus: false,
             isTomatoStatus: false,
-            isTAwemeStatus: true
+            isTAwemeStatus: true,
+            creativeImageShow:true,
+            deepExternalArr:[],
+            deepExternalShow:false,
+            adDeepCpabidShow:true
         };
         };
     },
     },
     computed: {
     computed: {
@@ -2088,6 +2140,7 @@ export default {
 
 
         },
         },
         handleSelectValue(data) {
         handleSelectValue(data) {
+            this.deepExternalShow = false;
             this.configForm.accountId = data.id;
             this.configForm.accountId = data.id;
             // this.$refs['ruleForm'].resetFields();
             // this.$refs['ruleForm'].resetFields();
 
 
@@ -2583,6 +2636,7 @@ export default {
             }
             }
         },
         },
         getAgeSelect(data) {
         getAgeSelect(data) {
+            console.log(data);
             if (data.length > 1 && data.findIndex(item => item === 'NONE') === 0) {
             if (data.length > 1 && data.findIndex(item => item === 'NONE') === 0) {
                 data.splice(data.findIndex(item => item === 'NONE'), 1);
                 data.splice(data.findIndex(item => item === 'NONE'), 1);
             }
             }
@@ -2705,20 +2759,38 @@ export default {
                 this.isTAwemeStatus = true;
                 this.isTAwemeStatus = true;
                 this.originalityStatus = true;
                 this.originalityStatus = true;
                 this.pictureStatus = false;
                 this.pictureStatus = false;
+                this.creativeImageShow = true;
+                this.configForm.creativeImageMode = 'CREATIVE_IMAGE_MODE_VIDEO_VERTICAL';
             }
             }
             else if (e.target.value === 'b') {
             else if (e.target.value === 'b') {
                 this.configForm.radioChangeValue = '';
                 this.configForm.radioChangeValue = '';
                 this.pictureStatus = true;
                 this.pictureStatus = true;
                 this.originalityStatus = true;
                 this.originalityStatus = true;
+                this.creativeImageShow = true;
+                this.configForm.creativeImageMode = 'CREATIVE_IMAGE_MODE_VIDEO_VERTICAL';
             }
             }
             else if (e.target.value === 'c') {
             else if (e.target.value === 'c') {
                 this.configForm.checkboxChangeValue = [];
                 this.configForm.checkboxChangeValue = [];
                 this.isTAwemeStatus = true;
                 this.isTAwemeStatus = true;
                 this.originalityStatus = true;
                 this.originalityStatus = true;
                 this.pictureStatus = false;
                 this.pictureStatus = false;
+                this.creativeImageShow = true;
+                this.configForm.creativeImageMode = 'CREATIVE_IMAGE_MODE_VIDEO_VERTICAL';
+                // this.configForm.creativeImageMode = this.configForm.creativeImageMode.toString();
+            }
+            else if(e.target.value === 'd'){
+                this.configForm.radioChangeValue = '';
+                this.configForm.checkboxChangeValue = [];
+                this.isTAwemeStatus = true;
+                this.originalityStatus = true;
+                this.pictureStatus = false;
+                this.creativeImageShow = false;
+                this.configForm.creativeImageMode = [];
+                this.configForm.creativeImageMode.push('CREATIVE_IMAGE_MODE_VIDEO_VERTICAL','CREATIVE_IMAGE_MODE_VIDEO','CREATIVE_IMAGE_MODE_LARGE');
+                // this.configForm.creativeImageMode = this.configForm.creativeImageMode.toString();
             }
             }
             this.configForm.adUnionVideoType = '';
             this.configForm.adUnionVideoType = '';
-            this.configForm.creativeImageMode = 'CREATIVE_IMAGE_MODE_VIDEO_VERTICAL';
+            // this.configForm.creativeImageMode = 'CREATIVE_IMAGE_MODE_VIDEO_VERTICAL';
             this.handleGetAdAudiencePackage();
             this.handleGetAdAudiencePackage();
         },
         },
         handleAccountMode(e) {
         handleAccountMode(e) {
@@ -2787,6 +2859,20 @@ export default {
             }
             }
         },
         },
         handleConvertChange(e) {
         handleConvertChange(e) {
+            this.optimizationOption.forEach(element => {
+                if (element.convert_id == e) {
+                   if ("deep_external_actions" in element && element.deep_external_actions != null ) {
+                       this.deepExternalShow = true;
+                       this.$nextTick(()=>{
+                        this.configForm.adDeepBidType = 'DEEP_BID_MIN';
+                        this.configForm.adDeepCpabid = 0.1;
+                       })
+                       
+                   }else{
+                    this.deepExternalShow = false;
+                   }
+                }
+            });
             // postAction(urlAcount + `/bytedance-api/advertiser/aiBytedanceAdvertiserStrategy/readToolConvertInfo?accountId=${this.configForm.accountId}&convertId=${this.configForm.adConvertId}`)
             // postAction(urlAcount + `/bytedance-api/advertiser/aiBytedanceAdvertiserStrategy/readToolConvertInfo?accountId=${this.configForm.accountId}&convertId=${this.configForm.adConvertId}`)
             // .then(res=>{
             // .then(res=>{
             //     if(res.success){
             //     if(res.success){
@@ -2794,6 +2880,14 @@ export default {
             //     }
             //     }
             // })
             // })
         },
         },
+        adDeepBidTypeChange(e){
+            if (e.target.value == 'DEEP_BID_PACING') {
+                this.adDeepCpabidShow = false;
+            }else{
+                this.adDeepCpabidShow = true;
+                this.configForm.adDeepCpabid = 0.1;
+            }
+        },
         handleGetDetailList() {
         handleGetDetailList() {
             const routeQuery = JSON.parse(localStorage.getItem('queryList'));
             const routeQuery = JSON.parse(localStorage.getItem('queryList'));
             getAction(urlAcount + '/bytedance-api/advertiser/aiBytedanceAdvertiserStrategy/queryById', {id: routeQuery.id})
             getAction(urlAcount + '/bytedance-api/advertiser/aiBytedanceAdvertiserStrategy/queryById', {id: routeQuery.id})
@@ -2881,7 +2975,25 @@ export default {
                                             }
                                             }
                                             this.configForm.adConvertType = updateResult[0].convert_type;
                                             this.configForm.adConvertType = updateResult[0].convert_type;
                                             this.optimizationOption = updateResult[0].external_actions;
                                             this.optimizationOption = updateResult[0].external_actions;
-
+                                            this.optimizationOption.forEach(element => {
+                                                    if (element.convert_id == detailData.adConvertId) {
+                                                    if ("deep_external_actions" in element && element.deep_external_actions != null ) {
+                                                        this.deepExternalShow = true;
+                                                        
+                                                    }else{
+                                                        this.deepExternalShow = false;
+                                                    }
+                                                    }
+                                                });
+                                                if (detailData.adDeepBidType == 'DEEP_BID_PACING') {
+                                                        this.adDeepCpabidShow = false;
+                                                        this.configForm.adDeepCpabid = 0.1
+                                                    }else{
+                                                        this.adDeepCpabidShow = true;
+                                                    }
+                                                this.configForm.adDeepBidType = detailData.adDeepBidType;
+                                                this.configForm.adDeepCpabid = detailData.adDeepCpabid;
+                                                console.log( this.configForm.adDeepBidType, this.configForm.adDeepCpabid);
                                         
                                         
                                         })
                                         })
                                     
                                     
@@ -3089,10 +3201,14 @@ export default {
                         else {
                         else {
                             this.configForm.launchTimeInterval = 'buxian';
                             this.configForm.launchTimeInterval = 'buxian';
                         }
                         }
+                        console.log(
+                            detailData
+                        );
                         if (detailData.creativeSceneInventory) {
                         if (detailData.creativeSceneInventory) {
                             this.configForm.adverPosition = 'c';
                             this.configForm.adverPosition = 'c';
                             this.configForm.radioChangeValue = detailData.creativeSceneInventory;
                             this.configForm.radioChangeValue = detailData.creativeSceneInventory;
                         }
                         }
+                        
                         else if (detailData.creativeInventoryType) {
                         else if (detailData.creativeInventoryType) {
                             this.configForm.adverPosition = 'b';
                             this.configForm.adverPosition = 'b';
                             this.configForm.checkboxChangeValue = detailData.creativeInventoryType.split(',');
                             this.configForm.checkboxChangeValue = detailData.creativeInventoryType.split(',');
@@ -3115,6 +3231,8 @@ export default {
                                 this.configForm.adDeliveryRange = '';
                                 this.configForm.adDeliveryRange = '';
                             }
                             }
                             this.NewCheckboxChangeValue(this.configForm.checkboxChangeValue);
                             this.NewCheckboxChangeValue(this.configForm.checkboxChangeValue);
+                        }else if(detailData.inventoryCatalog == 'UNIVERSAL'){
+                            this.configForm.adverPosition  = 'd'
                         }
                         }
                         else {
                         else {
                             this.configForm.adverPosition = 'a';
                             this.configForm.adverPosition = 'a';
@@ -3125,7 +3243,14 @@ export default {
                             })
                             })
                         }
                         }
                         this.$nextTick(()=>{
                         this.$nextTick(()=>{
-                            this.configForm.creativeImageMode = detailData.creativeImageMode;
+                            // this.configForm.creativeImageMode = detailData.creativeImageMode
+                            if (detailData.inventoryCatalog == 'UNIVERSAL') {
+                                this.creativeImageShow = false;
+                                this.configForm.creativeImageMode = detailData.creativeImageMode.split(',')
+                            }else{
+                                this.creativeImageShow = true
+                                this.configForm.creativeImageMode = detailData.creativeImageMode
+                            }
                         })
                         })
                         this.configForm.adInterestActionMode = detailData.adInterestActionMode;
                         this.configForm.adInterestActionMode = detailData.adInterestActionMode;
                         this.configForm.creativeDisplayMode = detailData.creativeDisplayMode;
                         this.configForm.creativeDisplayMode = detailData.creativeDisplayMode;
@@ -3160,6 +3285,15 @@ export default {
                     this.optimizationOption = [...item.external_actions];
                     this.optimizationOption = [...item.external_actions];
                 }
                 }
             });
             });
+            // this.optimizationOption.forEach(element => {
+            //                     if (element.convert_id == detailData.adConvertId) {
+            //                     if ("deep_external_actions" in element) {
+            //                         this.deepExternalShow = true;
+            //                     }else{
+            //                         this.deepExternalShow = false;
+            //                     }
+            //                     }
+            //                 });
         },
         },
         // 优化目标数据获取
         // 优化目标数据获取
         handleGetOptimizationObjective(paramsData) {
         handleGetOptimizationObjective(paramsData) {
@@ -3431,6 +3565,7 @@ export default {
         },
         },
         handleRelaxSure() {
         handleRelaxSure() {
             let paramsFormData = this.configForm;
             let paramsFormData = this.configForm;
+            console.log(paramsFormData);
             if (paramsFormData.adDirectionalFlag === 'add') {
             if (paramsFormData.adDirectionalFlag === 'add') {
                 paramsFormData.adAudiencePackageId = null;
                 paramsFormData.adAudiencePackageId = null;
                 this.packageMessageDetail = [];
                 this.packageMessageDetail = [];
@@ -3550,6 +3685,10 @@ export default {
                     return;
                     return;
                 }
                 }
                 paramsFormData.creativeSceneInventory = paramsFormData.radioChangeValue;
                 paramsFormData.creativeSceneInventory = paramsFormData.radioChangeValue;
+            }else if (paramsFormData.adverPosition === 'd') {
+                paramsFormData.inventoryCatalog = 'UNIVERSAL';
+                paramsFormData.creativeSmartInventory = 'UNIVERSAL';
+                paramsFormData.adDeliveryRange = 'UNIVERSAL'
             }
             }
             if (paramsFormData.launchTimeInterval === 'buxian') {
             if (paramsFormData.launchTimeInterval === 'buxian') {
                 paramsFormData.adScheduleTime = '';
                 paramsFormData.adScheduleTime = '';
@@ -3592,6 +3731,20 @@ export default {
             paramsFormData.adKeywords = this.creativeTag;
             paramsFormData.adKeywords = this.creativeTag;
             paramsFormData.copywritingNumber = paramsFormData.copywritingNumber?paramsFormData.copywritingNumber:0
             paramsFormData.copywritingNumber = paramsFormData.copywritingNumber?paramsFormData.copywritingNumber:0
             paramsFormData.userId = this.userInfo().id;
             paramsFormData.userId = this.userInfo().id;
+            if (this.deepExternalShow == false) {
+                paramsFormData.adDeepBidType = '';
+                // this.$delete(paramsFormData,'adDeepBidType')
+                this.$delete(paramsFormData,'adDeepCpabid')
+            }
+            if (this.adDeepCpabidShow == false) {
+                paramsFormData.adDeepCpabid = 0.1
+                // this.$delete(paramsFormData,'adDeepCpabid')
+            }
+            if (typeof paramsFormData.creativeImageMode == 'object'){
+                paramsFormData.creativeImageMode = paramsFormData.creativeImageMode.toString()
+            }
+            console.log(paramsFormData);
+            
             this.$refs.ruleForm.validate(valid => {
             this.$refs.ruleForm.validate(valid => {
                 if (valid) {
                 if (valid) {
                     this.sureLoading = true;
                     this.sureLoading = true;

+ 331 - 0
src/views/modules/account-config/components/link-configuration.vue

@@ -0,0 +1,331 @@
+<style lang="less" scoped>
+    @import "../account-config.less";
+</style>
+
+<template>
+        <div class="account-config-content">
+            <div class="control-con-header">
+                <a-form
+                class="grid-form"
+                layout="inline"
+                hide-required-mark
+            >
+                <a-row class="grid-form-options">
+                    <a-form-item
+                        class="grid-form-item"
+                        label="账户"
+                        :colon="false"
+                    >
+                        <acount-search class="acount-search-class" :appId.sync="acountId" :multiple="false" request="1,3"></acount-search>
+                    </a-form-item>
+                    <a-form-item label="状态">
+                        <a-select v-model="searchStatus" style="width: 100px">
+                            <a-select-option :value="0">不限</a-select-option>
+                            <a-select-option :value="1">开启</a-select-option>
+                            <a-select-option :value="2">关闭</a-select-option>
+                        </a-select>
+                    </a-form-item>
+                    <a-form-item class="form-handle-btn">
+                        <a-button type="primary" html-type="submit" @click="searchClick">查询</a-button>
+                    </a-form-item>
+                </a-row>
+            </a-form>
+            <a-button type="primary" class="upload-person" @click="addLink">添加</a-button>
+            </div>
+
+            <div class="control-con-table">
+                <a-table
+                    ref="table"
+                    size="middle"
+                    bordered
+                    :loading="controlLoading"
+                    :columns="columns"
+                    :dataSource="dataSource"
+                    :pagination="false">
+                    <span slot="acountRelax" slot-scope="text, record">
+                        <a-switch :checked="record.warningFlag == '1'" @change="handleSwitchChang($event, record)"/>
+                    </span>
+                  
+                    <span slot="action" slot-scope="text, record">
+                       
+                        <a @click="handleEdit(record)">编辑</a>
+                       
+                    </span>
+                  
+                </a-table>
+                <a-pagination
+                    class="pagin-table-class"
+                    :total="totalAll"
+                    :show-total="total => `共 ${totalAll} 条`"
+                    size="small"
+                    show-size-changer
+                    show-quick-jumper
+                    @change="onShowSizeChange"
+                    @showSizeChange="onShowSizeChange"
+                />
+            </div>
+
+
+            <a-modal
+            :title="linkTitle"
+            v-if="visible"
+            :visible="visible"
+            :confirm-loading="confirmLoading"
+            :width="850"
+            @ok="handleOk"
+            @cancel="handleCancel">
+            <a-form-model
+                    ref="ruleForm"
+                    :model="configForm"
+                    :rules="rules"
+                    :label-col="labelCol"
+                    :wrapper-col="wrapperCol"
+                >
+                <a-form-model-item label="广告账户">
+                   <acount-search style="width: 100%;" :disabled="linkTitle == '修改配置'" :appId.sync="configForm.advertisementacountId" :multiple="false" request="1,3"></acount-search>
+                </a-form-model-item>
+                <a-form-model-item label="有效触点" prop="linkAddress">
+                    <a-input placeholder="请输入链接地址" allow-clear v-model="configForm.linkAddress"/>
+                </a-form-model-item>
+            
+            </a-form-model>
+            
+          </a-modal>
+        </div>
+</template>
+
+
+<script>
+    import AcountSearch from '@/views/modules/Statistics/components/Treeselect.vue';
+    import {mapGetters} from 'vuex';
+    import {getAction, postAction,putAction} from '@/api/manage';
+    import {urlAcount} from '../account-config-server.js';
+    export default{
+        name: 'link-configuration',
+        components:{AcountSearch},
+        data() {
+            return {
+                linkTitle:'',
+                visible:false,
+                confirmLoading:false,
+                acountId: undefined,
+                labelCol: {span: 4},
+                wrapperCol: {span: 14},
+                searchStatus:0,
+                controlLoading: true,
+                dataSource: [],
+                configForm:{
+                    advertisementacountId:undefined,
+                    linkAddress:'',
+                },
+                rules:{
+                    linkAddress:[
+                    {required: true, message: '请输入', trigger: 'blur'},
+                ],
+                },
+                columns:[
+                    {
+                    title: '开关',
+                    align: 'center',
+                    width:80,
+                    dataIndex: 'acountRelax',
+                    scopedSlots: {customRender: 'acountRelax'}
+                    },{
+                        title: '项目名称',
+                        align: 'center',
+                        width:100,
+                        dataIndex:'projectName',
+                    },{
+                        title: '账户名称',
+                        align: 'center',
+                        width:150,
+                        dataIndex:'accountName',
+                    },{
+                        title: '账户ID',
+                        align: 'center',
+                        width:150,
+                        dataIndex:'accountId',
+                    },{
+                        title: '第三方点击监测链接',
+                        align: 'center',
+                        width:350,
+                        dataIndex:'actionTrackUrl',
+                    },{
+                        title: '账户所属人',
+                        align: 'center',
+                        width:100,
+                        dataIndex:'operateUserName',
+                    },{
+                        title: '状态',
+                        align: 'center',
+                        width:100,
+                        dataIndex:'warningFlag',
+                        customRender: function (text) {
+                            if (text == 1) {
+                                return '开启'
+                            } else if (text == 2) {
+                                return '关闭'
+                            } 
+                        },
+                    },{
+                    title: '操作',
+                    dataIndex: 'action',
+                    align: 'center',
+                    width: '10%',
+                    scopedSlots: {customRender: 'action'}
+                    }
+                ],
+                totalAll: 0,
+                    tablePag: {
+                    page: 1,
+                    size: 10
+                },
+                createUserId:'',
+            }
+        },
+        mounted() {
+            this.handleInitTable();
+        },
+        methods: {
+            ...mapGetters(['userInfo']),
+            // 查询
+            handleInitTable(){
+                let params = {
+                    userId: this.userInfo().id,
+                    accountId:this.acountId,
+                    warningFlag:this.searchStatus == 0 ? '' : this.searchStatus,
+                    pageNo: this.tablePag.page,
+                    pageSize: this.tablePag.size
+                }
+                getAction(urlAcount + '/bytedance-api/ad/bytedancePlanJobController/selectAccountActionTrackUrlList', params).then(res => {
+                if (res.code === 0) {
+                   
+                    this.controlLoading = false;
+                    this.dataSource = res.result.list;
+                    this.totalAll = res.result.total;
+                }
+                else {
+                    this.controlLoading = false;
+                    this.$message.error(res.message);
+                }
+            }).catch(error => {
+                console.log(error, 'eeee');
+            });
+
+
+            },
+            // 新增
+            addLink(){
+                this.configForm.advertisementacountId = undefined;
+                this.configForm.linkAddress = '';
+                this.linkTitle = '添加配置'
+                this.visible = true;
+            },
+            // 编辑
+            handleEdit(item){
+                this.linkTitle = '修改配置'
+                this.visible = true;
+                this.createUserId = item.createUserId;
+                this.configForm.advertisementacountId = item.accountId;
+                this.configForm.linkAddress = item.actionTrackUrl;
+            },
+            // 确定
+            handleOk(){
+                if (this.configForm.advertisementacountId) {
+                    this.$refs.ruleForm.validate(valid => {
+                if (valid) {
+                    this.controlLoading = true;
+                    if (this.linkTitle == '添加配置') {
+                        let params = {
+                        accountId:this.configForm.advertisementacountId,
+                        actionTrackUrl:this.configForm.linkAddress,
+                        createUserId:this.userInfo().id
+                    }
+                    
+                    postAction(urlAcount+'/bytedance-api/ad/bytedancePlanJobController/insertAccountTrackUrl',params).then(res=>{
+                        if (res.code == 0) {
+                            this.visible = false;
+                            this.handleInitTable();
+                            this.$message.success('新增成功');
+                        }else{
+                            this.controlLoading = false;
+                            this.$message.error(res.message);
+                        }
+                    }).catch(error => {
+                        console.log(error, 'eeee');
+                    });
+                    }else{
+                        let params = {
+                            accountId:this.configForm.advertisementacountId,
+                            actionTrackUrl:this.configForm.linkAddress,
+                            createUserId:this.createUserId
+                        }
+                        
+                        postAction(urlAcount+'/bytedance-api/ad/bytedancePlanJobController/updAccountActionTrackUrl',params).then(res=>{
+                        if (res.code == 0) {
+                            this.visible = false;
+                            this.handleInitTable();
+                            this.$message.success('修改成功');
+                        }else{
+                            this.controlLoading = false;
+                            this.$message.error(res.message);
+                        }
+                    }).catch(error => {
+                        console.log(error, 'eeee');
+                    });
+                    }
+                    
+                }
+                else {
+                    console.log('error submit!!');
+                    return false;
+                }
+            });
+                }else{
+                    this.$message.error('请选择广告账户');
+                }
+                
+            },
+            // 开关
+            handleSwitchChang(checked, data){
+                this.controlLoading = true;
+                let params = {
+                    accountId:data.accountId,
+                    warningFlag:checked?1:2,
+                    createUserId:this.userInfo().id
+                }
+                postAction(urlAcount+'/bytedance-api/ad/bytedancePlanJobController/updAccountActionTrackUrl',params).then(res=>{
+                    if (res.code == 0) {
+                        this.$message.success(res.message);
+                        this.handleInitTable();
+                    }else {
+                    this.$message.error(res.message);
+                }
+                }).catch(error => {
+                console.log(error, 'eeee');
+            });
+            },
+            // 取消 
+            handleCancel(){
+                this.configForm.advertisementacountId = undefined;
+                this.configForm.linkAddress = '';
+                this.visible = false;
+                this.controlLoading = false;
+            },
+            searchClick(){
+                this.controlLoading = true;
+                this.tablePag.page = 1;
+                this.handleInitTable();
+
+            },
+            onShowSizeChange(current, pageSize) {
+            this.tablePag = {
+                page: current,
+                size: pageSize
+            };
+            this.controlLoading = true;
+            this.handleInitTable();
+        },
+        },
+    }
+</script>

+ 69 - 33
src/views/modules/advertiser/AdvertiserList.vue

@@ -94,20 +94,34 @@
         :loading="loading"
         :loading="loading"
         @change="handleTableChange"
         @change="handleTableChange"
       >
       >
-        <span slot="ocpxActionType" slot-scope="text">
-          <div v-if="text">
-            <span v-for="(item, index) of JSON.parse(text)" :key="index"
-              >{{ item | ocpxActionType }}{{ index == JSON.parse(text).length - 1 ? '' : ',' }}</span
-            >
-          </div>
-          <div v-else>-</div>
+      <span slot="maxBid" slot-scope="text,record">{{ record.maxBid == 0? '-': (record.maxBid / 1000).toFixed(2) }}</span>
+      <span slot="ocpxActionType" slot-scope="text,record">
+        <div v-if="!!record.ocpxActionTypeArray&&record.ocpxActionTypeArray.length>0">
+          <span v-for="(item, index)  in record.ocpxActionTypeArray" :key="index"
+            >{{item.ocpxName}}({{(item.maxValue / 1000).toFixed(2)}})<br>
+            <!-- <span v-if="item instanceof Object">{{item.ocpxName}}({{(item.maxValue / 1000).toFixed(2)}})<br></span>
+            <span v-else>{{(item / 1000).toFixed(2)}}</span> -->
+            </span
+          >
+        </div>
+        <div v-else>-</div>
 
 
-          <!-- {{ text | ocpxActionType }} -->
-        </span>
+        <!-- {{ text | ocpxActionType }} -->
+      </span>
+      <span slot="deepConversionType" slot-scope="text,record">
+        <div v-if="!!record.deepConversionTypeArray&&record.deepConversionTypeArray.length != 0">
+          <span v-for="(item, index)  in record.deepConversionTypeArray" :key="index"
+            >{{item.deepName}}({{(item.deepValue / 1000).toFixed(2)}})<br></span
+          >
+        </div>
+        <div v-else>-</div>
+
+        <!-- {{ text | ocpxActionType }} -->
+      </span>
         <span slot="bidType" slot-scope="text">
         <span slot="bidType" slot-scope="text">
           <div v-if="text && JSON.parse(text).length > 0">
           <div v-if="text && JSON.parse(text).length > 0">
             <span v-for="(item, index) of JSON.parse(text)" :key="index"
             <span v-for="(item, index) of JSON.parse(text)" :key="index"
-              >{{ item | bidType }}{{ index == JSON.parse(text).length - 1 ? '' : ',' }}</span
+              >{{ item | bidType }}{{ index == JSON.parse(text).length - 1 ? '' : '' }}</span
             >
             >
           </div>
           </div>
           <div v-else>-</div>
           <div v-else>-</div>
@@ -137,8 +151,8 @@
             <a>删除</a>
             <a>删除</a>
           </a-popconfirm>
           </a-popconfirm>
         </span>
         </span>
-        <span slot="maxBid" slot-scope="text">{{ text / 1000 }}</span>
-        <span slot="maxDeepCpaBid" slot-scope="text">{{ text / 1000 }}</span>
+        <!-- <span slot="maxBid" slot-scope="text">{{ text / 1000 }}</span> -->
+        <!-- <span slot="maxDeepCpaBid" slot-scope="text">{{ text / 1000 }}</span> -->
         <a slot="name" slot-scope="text, record" @click="toProduct(record, 'product')">{{ text }}</a>
         <a slot="name" slot-scope="text, record" @click="toProduct(record, 'product')">{{ text }}</a>
         <a slot="productName" slot-scope="text, record" @click="toProduct(record, 'project')">{{ text }}</a>
         <a slot="productName" slot-scope="text, record" @click="toProduct(record, 'project')">{{ text }}</a>
       </a-table>
       </a-table>
@@ -257,37 +271,47 @@ const projectColumns = [
     dataIndex: 'advertiserId_dictText',
     dataIndex: 'advertiserId_dictText',
   },
   },
   {
   {
-    title: '最高出价',
-    align: 'center',
-    dataIndex: 'maxBid',
-    scopedSlots: {
-      customRender: 'maxBid',
-    },
-  },
-  {
-    title: '最高转化出价',
+    title: '优化目标',
     align: 'center',
     align: 'center',
-    dataIndex: 'maxDeepCpaBid',
+    dataIndex: 'bidType',
     scopedSlots: {
     scopedSlots: {
-      customRender: 'maxDeepCpaBid',
+      customRender: 'bidType',
     },
     },
   },
   },
   {
   {
-    title: '优化目标',
+    title: '最高出价(元)',
     align: 'center',
     align: 'center',
-    dataIndex: 'bidType',
+    dataIndex: 'maxBid',
     scopedSlots: {
     scopedSlots: {
-      customRender: 'bidType',
+      customRender: 'maxBid',
     },
     },
   },
   },
+  // {
+  //   title: '最高转化出价',
+  //   align: 'center',
+  //   dataIndex: 'maxDeepCpaBid',
+  //   scopedSlots: {
+  //     customRender: 'maxDeepCpaBid',
+  //   },
+  // },
+  
   {
   {
-    title: '转化目标',
+    title: '转化目标(出价/元)',
     align: 'center',
     align: 'center',
     dataIndex: 'ocpxActionType',
     dataIndex: 'ocpxActionType',
+    width: 150,
     scopedSlots: {
     scopedSlots: {
       customRender: 'ocpxActionType',
       customRender: 'ocpxActionType',
     },
     },
-  },
+  },{
+          title: '深度转化目标(出价)',
+          align: 'center',
+          dataIndex: 'deepConversionType',
+          width: 150,
+          scopedSlots: {
+            customRender: 'deepConversionType',
+          },
+        },
   {
   {
     title: '供应商',
     title: '供应商',
     align: 'center',
     align: 'center',
@@ -312,6 +336,7 @@ const projectColumns = [
     title: '操作',
     title: '操作',
     dataIndex: 'actionProject',
     dataIndex: 'actionProject',
     align: 'center',
     align: 'center',
+    width:100,
     scopedSlots: {
     scopedSlots: {
       customRender: 'actionProject',
       customRender: 'actionProject',
     },
     },
@@ -381,6 +406,19 @@ export default {
       },
       },
     }
     }
   },
   },
+  filters: {
+    bidType(sta) {
+      var data = {
+        null: '-',
+        1: 'CPM',
+        2: '点击数',
+        6: 'OCPC',
+        10: 'OCPM',
+        12: "最大转化数"
+      }
+      return data[sta]
+    },
+  },
   computed: {
   computed: {
     importExcelUrl: function () {
     importExcelUrl: function () {
       return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`
       return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`
@@ -426,12 +464,14 @@ export default {
     clear(type) {
     clear(type) {
       this.queryParam.name = null
       this.queryParam.name = null
       this.queryParam.advertiserId = null
       this.queryParam.advertiserId = null
+      this.advertiserId = null
       this.queryParam.productId = null
       this.queryParam.productId = null
       this.queryParam.id = null
       this.queryParam.id = null
       this.queryParam.productName = null
       this.queryParam.productName = null
       this.queryParam.projectName = null
       this.queryParam.projectName = null
       this.allIdUser = {}
       this.allIdUser = {}
       this.loadData(1)
       this.loadData(1)
+      
     },
     },
     addNew() {
     addNew() {
       if (this.active == 'advertiser') {
       if (this.active == 'advertiser') {
@@ -448,11 +488,7 @@ export default {
         this.$refs.modalFormTwo.disableSubmit = false
         this.$refs.modalFormTwo.disableSubmit = false
       } else if (this.active == 'project') {
       } else if (this.active == 'project') {
         this.$refs.modalFormThree.add({
         this.$refs.modalFormThree.add({
-          advertiserId: this.queryParam.advertiserId
-            ? this.queryParam.advertiserId
-            : this.advertiserId
-            ? this.advertiserId
-            : undefined,
+          advertiserId: this.queryParam.advertiserId ? this.queryParam.advertiserId : this.advertiserId ? this.advertiserId : undefined,
           productId: this.queryParam.productId ? this.queryParam.productId : undefined,
           productId: this.queryParam.productId ? this.queryParam.productId : undefined,
         })
         })
         this.$refs.modalFormThree.title = '新增'
         this.$refs.modalFormThree.title = '新增'

+ 28 - 19
src/views/modules/advertiser/ProjectList.vue

@@ -120,8 +120,8 @@
         :loading="loading"
         :loading="loading"
         @change="handleTableChange"
         @change="handleTableChange"
       >
       >
-        <span slot="maxBid" slot-scope="text,record">{{ record.maxBid == 0? '-': record.maxBid / 1000 }}</span>
-        <span slot="maxDeepCpaBid" slot-scope="text">{{ text / 1000 }}</span>
+        <span slot="maxBid" slot-scope="text,record">{{ record.maxBid == 0? '-': (record.maxBid / 1000).toFixed(2) }}</span>
+        <!-- <span slot="maxDeepCpaBid" slot-scope="text">{{ text / 1000 }}</span> -->
         <span slot="ocpxActionType" slot-scope="text,record">
         <span slot="ocpxActionType" slot-scope="text,record">
           <div v-if="!!record.ocpxActionTypeArray&&record.ocpxActionTypeArray.length>0">
           <div v-if="!!record.ocpxActionTypeArray&&record.ocpxActionTypeArray.length>0">
             <span v-for="(item, index)  in record.ocpxActionTypeArray" :key="index"
             <span v-for="(item, index)  in record.ocpxActionTypeArray" :key="index"
@@ -151,7 +151,7 @@
           <div v-else>-</div>
           <div v-else>-</div>
         </span>
         </span>
         <span slot="mediaId" slot-scope="text">
         <span slot="mediaId" slot-scope="text">
-          {{ text == '1' || text == '3' ? '头条' : '快手' }}
+          {{ text == '1' || text == '3' ? '头条' :text == '2' || text=='4'?'快手' :text=='5'?'千川':'磁力金牛'}}
         </span>
         </span>
 
 
         <span slot="action" slot-scope="text, record">
         <span slot="action" slot-scope="text, record">
@@ -205,29 +205,30 @@ export default {
           dataIndex: 'advertiserId_dictText',
           dataIndex: 'advertiserId_dictText',
         },
         },
         {
         {
-          title: '最高出价',
-          align: 'center',
-          dataIndex: 'maxBid',
-          scopedSlots: {
-            customRender: 'maxBid',
-          },
-        },
-        {
-          title: '最高转化出价',
+          title: '优化目标',
           align: 'center',
           align: 'center',
-          dataIndex: 'maxDeepCpaBid',
+          dataIndex: 'bidType',
           scopedSlots: {
           scopedSlots: {
-            customRender: 'maxDeepCpaBid',
+            customRender: 'bidType',
           },
           },
         },
         },
         {
         {
-          title: '优化目标',
+          title: '最高出价(元)',
           align: 'center',
           align: 'center',
-          dataIndex: 'bidType',
+          dataIndex: 'maxBid',
           scopedSlots: {
           scopedSlots: {
-            customRender: 'bidType',
+            customRender: 'maxBid',
           },
           },
         },
         },
+        // {
+        //   title: '最高转化出价',
+        //   align: 'center',
+        //   dataIndex: 'maxDeepCpaBid',
+        //   scopedSlots: {
+        //     customRender: 'maxDeepCpaBid',
+        //   },
+        // },
+       
         {
         {
           title: '转化目标(出价/元)',
           title: '转化目标(出价/元)',
           align: 'center',
           align: 'center',
@@ -306,10 +307,10 @@ export default {
       var data = {
       var data = {
         null: '-',
         null: '-',
         1: 'CPM',
         1: 'CPM',
-        2: 'CPC',
+        2: '点击数',
         6: 'OCPC',
         6: 'OCPC',
         10: 'OCPM',
         10: 'OCPM',
-        12: "最大转化"
+        12: "最大转化"
       }
       }
       return data[sta]
       return data[sta]
     },
     },
@@ -319,6 +320,9 @@ export default {
       return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`
       return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`
     },
     },
   },
   },
+  created() {
+    this.queryParam.userId = this.userInfo().id;
+  },
   methods: {
   methods: {
     onChange(text,record) {
     onChange(text,record) {
       this.spinning=true;
       this.spinning=true;
@@ -340,6 +344,7 @@ export default {
         }
         }
       })
       })
     },
     },
+   
     ...mapGetters(['nickname', 'avatar', 'userInfo']),
     ...mapGetters(['nickname', 'avatar', 'userInfo']),
     getList() {
     getList() {
       var params = {}
       var params = {}
@@ -357,6 +362,10 @@ export default {
         })
         })
         .finally(() => {})
         .finally(() => {})
     },
     },
+    // searchQuery(){
+    //   this.queryParam.userId = this.userInfo().id;
+    //   this.getList();
+    // },
     filterOption(input, option) {
     filterOption(input, option) {
       return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
       return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
     },
     },

+ 94 - 4
src/views/modules/advertiser/ProjectMemberList.vue

@@ -51,9 +51,40 @@
         :pagination="ipagination"
         :pagination="ipagination"
         :loading="loading"
         :loading="loading"
       >
       >
-        <span slot="maxBid" slot-scope="maxBid">{{ maxBid / 1000 }}</span>
+      <span slot="bidType" slot-scope="text">
+        <div v-if="text && JSON.parse(text).length > 0">
+          <span v-for="(item, index) of JSON.parse(text)" :key="index"
+            >{{ item | bidTypeData }}{{ index == JSON.parse(text).length - 1 ? '' : '、' }}</span
+          >
+        </div>
+        <div v-else>-</div>
+      </span>
+      <span slot="ocpxActionType" slot-scope="text,record">
+        <div v-if="!!record.ocpxActionType&&JSON.parse(record.ocpxActionType).length>0">
+          <span v-for="(item, index)  in JSON.parse(record.ocpxActionType)" :key="index"
+            >{{item.ocpxName}}({{(item.maxValue / 1000).toFixed(2)}})<br>
+            <!-- <span v-if="item instanceof Object">{{item.ocpxName}}({{(item.maxValue / 1000).toFixed(2)}})<br></span>
+            <span v-else>{{(item / 1000).toFixed(2)}}</span> -->
+            </span
+          >
+        </div>
+        <div v-else>-</div>
+
+        <!-- {{ text | ocpxActionType }} -->
+      </span>
+      <span slot="deepConversionType" slot-scope="text,record">
+        <div v-if="!!record.deepConversionType&&JSON.parse(record.deepConversionType).length != 0">
+          <span v-for="(item, index)  in JSON.parse(record.deepConversionType)" :key="index"
+            >{{item.deepName}}({{(item.deepValue / 1000).toFixed(2)}})<br></span
+          >
+        </div>
+        <div v-else>-</div>
+
+        <!-- {{ text | ocpxActionType }} -->
+      </span>
+        <span slot="maxBid" slot-scope="maxBid,record">{{ record.maxBid == 0? '-': (record.maxBid / 1000).toFixed(2) }}</span>
         <span slot="mediaId" slot-scope="mediaId">{{
         <span slot="mediaId" slot-scope="mediaId">{{
-          mediaId == 1 ? '头条' : mediaId == 2 ? '快手' : mediaId == 3 ? '头条内广' : '快手内广'
+          mediaId == 1 ? '头条' : mediaId == 2 ? '快手' : mediaId == 3 ? '头条内广' : mediaId == 4 ? '快手内广':mediaId== 5 ? '千川' :'磁力金牛'
         }}</span>
         }}</span>
         <span slot="action" slot-scope="text, record">
         <span slot="action" slot-scope="text, record">
           <a @click="handleEdit(record)">{{ noTitleKey == 'myProject' ? '查看成员' : '账号绑定' }}</a>
           <a @click="handleEdit(record)">{{ noTitleKey == 'myProject' ? '查看成员' : '账号绑定' }}</a>
@@ -396,7 +427,15 @@ const myProjectColumns = [
     },
     },
   },
   },
   {
   {
-    title: '最高出价',
+    title: '优化目标',
+    align: 'center',
+    dataIndex: 'bidType',
+    scopedSlots: {
+      customRender: 'bidType',
+    },
+  },
+  {
+    title: '最高出价(元)',
     align: 'center',
     align: 'center',
     dataIndex: 'maxBid',
     dataIndex: 'maxBid',
     scopedSlots: {
     scopedSlots: {
@@ -404,6 +443,22 @@ const myProjectColumns = [
     },
     },
   },
   },
   {
   {
+    title: '转化目标(出价/元)',
+    align: 'center',
+    dataIndex: 'ocpxActionType',
+    scopedSlots: {
+      customRender: 'ocpxActionType',
+    },
+  },
+  {
+    title: '深度转化目标(出价)',
+    align: 'center',
+    dataIndex: 'deepConversionType',
+    scopedSlots: {
+      customRender: 'deepConversionType',
+    },
+  },
+  {
     title: '操作',
     title: '操作',
     dataIndex: 'action',
     dataIndex: 'action',
     align: 'center',
     align: 'center',
@@ -447,7 +502,15 @@ const participationColumns = [
     },
     },
   },
   },
   {
   {
-    title: '最高出价',
+    title: '优化目标',
+    align: 'center',
+    dataIndex: 'bidType',
+    scopedSlots: {
+      customRender: 'bidType',
+    },
+  },
+  {
+    title: '最高出价(元)',
     align: 'center',
     align: 'center',
     dataIndex: 'maxBid',
     dataIndex: 'maxBid',
     scopedSlots: {
     scopedSlots: {
@@ -455,6 +518,22 @@ const participationColumns = [
     },
     },
   },
   },
   {
   {
+    title: '转化目标(出价/元)',
+    align: 'center',
+    dataIndex: 'ocpxActionType',
+    scopedSlots: {
+      customRender: 'ocpxActionType',
+    },
+  },
+  {
+    title: '深度转化目标(出价)',
+    align: 'center',
+    dataIndex: 'deepConversionType',
+    scopedSlots: {
+      customRender: 'deepConversionType',
+    },
+  },
+  {
     title: '操作',
     title: '操作',
     dataIndex: 'action',
     dataIndex: 'action',
     align: 'center',
     align: 'center',
@@ -634,6 +713,17 @@ export default {
         return '暂无'
         return '暂无'
       }
       }
     },
     },
+    bidTypeData(sta) {
+      var data = {
+        null: '-',
+        1: 'CPM',
+        2: '点击数',
+        6: 'OCPC',
+        10: 'OCPM',
+        12: "最大转化数"
+      }
+      return data[sta]
+    },
     getDate(value) {
     getDate(value) {
       let date = new Date(value)
       let date = new Date(value)
       let y = date.getFullYear()
       let y = date.getFullYear()

+ 53 - 36
src/views/modules/advertiser/UserAllocationList.vue

@@ -49,6 +49,8 @@
                 showSearch
                 showSearch
                 optionFilterProp="children"
                 optionFilterProp="children"
                 :filterOption="filterOption"
                 :filterOption="filterOption"
+                @focus="getParticipateList"
+                @search="getParticipateList"
               >
               >
                 <a-select-option :value="item.projectId" v-for="item of dataElse" :key="item.id">
                 <a-select-option :value="item.projectId" v-for="item of dataElse" :key="item.id">
                   {{
                   {{
@@ -229,35 +231,14 @@
           :labelCol="{ xs: { span: 24 }, sm: { span: 5 } }"
           :labelCol="{ xs: { span: 24 }, sm: { span: 5 } }"
           :wrapperCol="{ xs: { span: 24 }, sm: { span: 16 } }"
           :wrapperCol="{ xs: { span: 24 }, sm: { span: 16 } }"
         >
         >
-          <a-select
-            v-decorator="[
-              'projectId', // 给表单赋值或拉取表单时,该input对应的key
-              { rules: [{ required: true, message: '请选择项目!' }] },
-            ]"
-            showSearch
-            optionFilterProp="children"
-            :filterOption="filterOption"
-            disabled
-          >
-            <a-select-option :value="item.projectId" v-for="item of dataElse" :key="item.id">
-              {{ item.projectName }}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{{
-                item.mediaId == '1'
-                  ? '头条'
-                  : item.mediaId == '2'
-                  ? '快手'
-                  : item.mediaId == '3'
-                  ? '头条内广'
-                  : '快手内广'
-              }}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{{ item.advertiserName }}
-            </a-select-option>
-          </a-select>
+          {{projectName}}
         </a-form-item>
         </a-form-item>
         <a-form-item
         <a-form-item
           label="转移项目"
           label="转移项目"
           :labelCol="{ xs: { span: 24 }, sm: { span: 5 } }"
           :labelCol="{ xs: { span: 24 }, sm: { span: 5 } }"
           :wrapperCol="{ xs: { span: 24 }, sm: { span: 16 } }"
           :wrapperCol="{ xs: { span: 24 }, sm: { span: 16 } }"
         >
         >
-          <a-select
+          <!-- <a-select
             v-decorator="[
             v-decorator="[
               'projectNewId', // 给表单赋值或拉取表单时,该input对应的key
               'projectNewId', // 给表单赋值或拉取表单时,该input对应的key
               { rules: [{ required: true, message: '请选择项目!' }] },
               { rules: [{ required: true, message: '请选择项目!' }] },
@@ -277,6 +258,29 @@
                   : '快手内广'
                   : '快手内广'
               }}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{{ item.advertiserName }}
               }}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{{ item.advertiserName }}
             </a-select-option>
             </a-select-option>
+          </a-select> -->
+          <a-select
+            v-decorator="[
+                'projectNewId', // 给表单赋值或拉取表单时,该input对应的key
+                { rules: [{ required: true, message: '请选择项目!' }] },
+            ]"
+            @focus="getParticipateList"
+            showSearch
+            optionFilterProp="children"
+            :filterOption="filterOption"
+            @search="getParticipateList"
+          >
+              <a-select-option :value="item.projectId" v-for="item of dataElse" :key="item.id">
+                  {{ item.projectName }}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{{
+                      item.mediaId == '1'
+                      ? '头条'
+                      : item.mediaId == '2'
+                      ? '快手'
+                      : item.mediaId == '3'
+                      ? '头条内广'
+                      : '快手内广'
+                  }}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{{ item.advertiserName }}
+              </a-select-option>
           </a-select>
           </a-select>
         </a-form-item>
         </a-form-item>
         <!-- 
         <!-- 
@@ -415,6 +419,7 @@ export default {
       confirmLoading: false,
       confirmLoading: false,
       accountLoading: false,
       accountLoading: false,
       projectId: '',
       projectId: '',
+      projectName:'',
       accountId: '',
       accountId: '',
       mediaId: '',
       mediaId: '',
       form: this.$form.createForm(this),
       form: this.$form.createForm(this),
@@ -429,7 +434,7 @@ export default {
     },
     },
   },
   },
   mounted() {
   mounted() {
-    this.getParticipateList()
+    this.getParticipateList(null)
   },
   },
   methods: {
   methods: {
     renew(item) {
     renew(item) {
@@ -490,14 +495,25 @@ export default {
         }
         }
       })
       })
     },
     },
-    getParticipateList() {
-      getAction('/ctop/projectMember/participateList', {
+    getParticipateList(value) {
+      // getAction('/ctop/projectMember/participateList', {
+      //   userId: this.userInfo().id,
+      // }).then((res) => {
+      //   if (res.code == 0) {
+      //     this.dataElse = res.result
+      //   }
+      // })
+      getAction('/ctop/projectMember/participateListV2', {
         userId: this.userInfo().id,
         userId: this.userInfo().id,
-      }).then((res) => {
-        if (res.code == 0) {
-          this.dataElse = res.result
-        }
-      })
+        pageSize: 100,
+        pageNo: 1,
+        projectName: value,
+      }).then(res => {
+          if (res.code == 0) {
+              let defaultData = res.result.records;
+              this.dataElse = defaultData;
+          }
+      });
     },
     },
     filterOption(input, option) {
     filterOption(input, option) {
       return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
       return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
@@ -528,12 +544,13 @@ export default {
       this.visibleAccount = true
       this.visibleAccount = true
       this.accountId = item.accountId
       this.accountId = item.accountId
       this.projectId = item.projectId
       this.projectId = item.projectId
+      this.projectName = item.projectId_dictText
       this.accountLoading = false
       this.accountLoading = false
-      setTimeout(() => {
-        this.formAccount.setFieldsValue({
-          projectId: item.projectId,
-        })
-      }, 0)
+      // setTimeout(() => {
+      //   this.formAccount.setFieldsValue({
+      //     projectId: item.projectId,
+      //   })
+      // }, 0)
     },
     },
     handleOkAccount(e) {
     handleOkAccount(e) {
       this.formAccount.validateFieldsAndScroll((err, values) => {
       this.formAccount.validateFieldsAndScroll((err, values) => {

+ 130 - 43
src/views/modules/advertiser/modules/ProjectModal.vue

@@ -9,6 +9,8 @@
             <a-radio-button value="2">快手</a-radio-button>
             <a-radio-button value="2">快手</a-radio-button>
             <a-radio-button value="3">头条内广</a-radio-button>
             <a-radio-button value="3">头条内广</a-radio-button>
             <a-radio-button value="4">快手内广</a-radio-button>
             <a-radio-button value="4">快手内广</a-radio-button>
+            <a-radio-button value="5">千川</a-radio-button>
+            <a-radio-button value="6">磁力金牛</a-radio-button>
           </a-radio-group>
           </a-radio-group>
         </a-form-item>
         </a-form-item>
         <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="项目名称">
         <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="项目名称">
@@ -20,7 +22,7 @@
           </j-tree-select>
           </j-tree-select>
         </a-form-item>-->
         </a-form-item>-->
         <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="供应商"
         <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="供应商"
-          v-show="model.mediaId == '2' || model.mediaId == '4'">
+          v-show="model.mediaId == '2' || model.mediaId == '4'|| model.mediaId == '6'">
           <a-select optionFilterProp="children" showSearch :filterOption="filterOption"
           <a-select optionFilterProp="children" showSearch :filterOption="filterOption"
             v-decorator="['supplierCode', validatorRules.supplierCode]">
             v-decorator="['supplierCode', validatorRules.supplierCode]">
             <a-select-option :value="item.supplierCode" v-for="(item, index) of supplierList" :key="index">
             <a-select-option :value="item.supplierCode" v-for="(item, index) of supplierList" :key="index">
@@ -46,25 +48,28 @@
             </a-select-option>
             </a-select-option>
           </a-select>
           </a-select>
         </a-form-item>
         </a-form-item>
-        <a-form-item v-if="model.mediaId == '1' || model.mediaId == '3' || maxBidShow" :labelCol="labelCol"
+        <a-form-item v-if="model.mediaId == '1' || model.mediaId == '3'|| model.mediaId == '5' || maxBidShow" :labelCol="labelCol"
           :wrapperCol="wrapperCol" label="最高出价">
           :wrapperCol="wrapperCol" label="最高出价">
           <a-input placeholder="请输入最高出价" v-decorator="['maxBid', validatorRules.maxBid]" addonAfter="元" />
           <a-input placeholder="请输入最高出价" v-decorator="['maxBid', validatorRules.maxBid]" addonAfter="元" />
         </a-form-item>
         </a-form-item>
-        <a-form-item v-if="model.mediaId == '1' || model.mediaId == '3'" :labelCol="labelCol" :wrapperCol="wrapperCol"
+        <a-form-item v-if="model.mediaId == '1' || model.mediaId == '3'|| model.mediaId == '5'" :labelCol="labelCol" :wrapperCol="wrapperCol"
           label="最高转化出价">
           label="最高转化出价">
           <a-input placeholder="最高转化出价" v-decorator="['maxDeepCpaBid']" addonAfter="元" />
           <a-input placeholder="最高转化出价" v-decorator="['maxDeepCpaBid']" addonAfter="元" />
         </a-form-item>
         </a-form-item>
-        <div v-show="model.mediaId == '2' || model.mediaId == '4'">
-          <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="优化目标">
-            <a-select @change="bidTypeChange($event)"
-              v-decorator="['bidType', { rules: [{ required: true, message: '请选择优化目标' }], initialValue: 2 }]"
+        <div v-show="model.mediaId == '2' || model.mediaId == '4'|| model.mediaId == '6'">
+          <div v-if="model.mediaId == '2' || model.mediaId == '4'|| model.mediaId == '6'">
+             <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="优化目标">
+            <a-select @change="bidTypeChange($event)" @deselect="bidtypedeselect"
+              v-decorator="['bidType', { rules: [{ required: true, message: '请选择优化目标' }],}]"
               mode="multiple">
               mode="multiple">
               <a-select-option :value="2">点击数</a-select-option>
               <a-select-option :value="2">点击数</a-select-option>
               <a-select-option :value="10">OCPM</a-select-option>
               <a-select-option :value="10">OCPM</a-select-option>
               <a-select-option :value="6">OCPC</a-select-option>
               <a-select-option :value="6">OCPC</a-select-option>
-              <a-select-option :value="12">最大转化</a-select-option>
+              <a-select-option :value="12">最大转化</a-select-option>
             </a-select>
             </a-select>
           </a-form-item>
           </a-form-item>
+          </div>
+         
           <div v-if="Array.isArray(getFormFieldValue('bidType'))">
           <div v-if="Array.isArray(getFormFieldValue('bidType'))">
             <a-form-item label="转化目标" :labelCol="labelCol" :wrapperCol="wrapperCol" v-if="
             <a-form-item label="转化目标" :labelCol="labelCol" :wrapperCol="wrapperCol" v-if="
                 getFormFieldValue('bidType').findIndex((item) => item == 10) > -1 ||
                 getFormFieldValue('bidType').findIndex((item) => item == 10) > -1 ||
@@ -72,7 +77,7 @@
                 getFormFieldValue('bidType').findIndex((item) => item == 12) > -1
                 getFormFieldValue('bidType').findIndex((item) => item == 12) > -1
               ">
               ">
               <!-- v-model="model.ocpxActionType" -->
               <!-- v-model="model.ocpxActionType" -->
-              <a-select @change="ocpxActionTypeChange($event)" v-decorator="[
+              <a-select @change="ocpxActionTypeChange($event)" @deselect="ocpextiondeselect" v-decorator="[
                   'ocpxActionType',
                   'ocpxActionType',
                   { rules: [{ required: true, message: '请选择转化目标' }] },
                   { rules: [{ required: true, message: '请选择转化目标' }] },
                 ]" mode="multiple">
                 ]" mode="multiple">
@@ -84,9 +89,9 @@
             </a-form-item>
             </a-form-item>
 
 
             <div v-if="Array.isArray(getFormFieldValue('ocpxActionType'))">
             <div v-if="Array.isArray(getFormFieldValue('ocpxActionType'))">
-              <a-form-item v-show="getFormFieldValue('ocpxActionType').length > 0" :labelCol="labelCol"
+              <a-form-item v-if="getFormFieldValue('ocpxActionType').length > 0" :labelCol="labelCol"
                 :wrapperCol="wrapperCol" v-for="(item, index) in ocpxActionTypeArray" :key="index"
                 :wrapperCol="wrapperCol" v-for="(item, index) in ocpxActionTypeArray" :key="index"
-                :label="item.ocpxName+'最高价'">
+                :label="item.ocpxName+'最高价'">
                 <a-input @input="maxValueInput"
                 <a-input @input="maxValueInput"
                   @keyup.native="item.maxValue = item.maxValue.replace(/^(\-)*(\d+)\.(\d\d).*$/,'$1$2.$3');"
                   @keyup.native="item.maxValue = item.maxValue.replace(/^(\-)*(\d+)\.(\d\d).*$/,'$1$2.$3');"
                   placeholder="请输入最高出价" v-model="item.maxValue" addonAfter="元" />
                   placeholder="请输入最高出价" v-model="item.maxValue" addonAfter="元" />
@@ -94,9 +99,13 @@
             </div>
             </div>
 
 
             <div v-if="Array.isArray(getFormFieldValue('ocpxActionType'))">
             <div v-if="Array.isArray(getFormFieldValue('ocpxActionType'))">
-              <a-form-item label="深度转化目标" :labelCol="labelCol" :wrapperCol="wrapperCol" v-show="getFormFieldValue('ocpxActionType').length > 0">
+              <a-form-item v-if="
+              getFormFieldValue('bidType').findIndex((item) => item == 10) > -1 ||
+              getFormFieldValue('bidType').findIndex((item) => item == 6) > -1||
+              getFormFieldValue('bidType').findIndex((item) => item == 12) > -1 || getFormFieldValue('ocpxActionType').length == 0
+            " label="深度转化目标" :labelCol="labelCol" :wrapperCol="wrapperCol" >
                 <!-- v-model="model.ocpxActionType" -->
                 <!-- v-model="model.ocpxActionType" -->
-                <a-select @change="depthChange($event)" v-model="model.deepConversionType" mode="multiple">
+                <a-select @change="depthChange($event)" @deselect="depthChangedeselect" v-model="model.deepConversionType" mode="multiple">
                   <a-select-option :value="item.deepCode" v-for="(item, index) in depthList" :key="index">{{
                   <a-select-option :value="item.deepCode" v-for="(item, index) in depthList" :key="index">{{
                     item.deepName
                     item.deepName
                     }}</a-select-option>
                     }}</a-select-option>
@@ -106,7 +115,7 @@
 
 
             <div v-if="model.deepConversionType">
             <div v-if="model.deepConversionType">
               <a-form-item v-show="model.deepConversionType.length >0" :labelCol="labelCol" :wrapperCol="wrapperCol"
               <a-form-item v-show="model.deepConversionType.length >0" :labelCol="labelCol" :wrapperCol="wrapperCol"
-                v-for="(item, index) in depthArray" :key="index" :label="item.deepName+'最高价'">
+                v-for="(item, index) in depthArray" :key="index" :label="item.deepName+'最高价'">
                 <a-input placeholder="请输入最高出价" @input="deepInput"
                 <a-input placeholder="请输入最高出价" @input="deepInput"
                   @keyup.native="item.deepValue = item.deepValue.replace(/^(\-)*(\d+)\.(\d\d).*$/,'$1$2.$3');"
                   @keyup.native="item.deepValue = item.deepValue.replace(/^(\-)*(\d+)\.(\d\d).*$/,'$1$2.$3');"
                   v-model="item.deepValue" addonAfter="元" />
                   v-model="item.deepValue" addonAfter="元" />
@@ -230,21 +239,15 @@
         console.log(item);
         console.log(item);
         // this.maxBidShow =   item.findIndex((item) => item == 2)
         // this.maxBidShow =   item.findIndex((item) => item == 2)
         let odx = item.indexOf(2)
         let odx = item.indexOf(2)
-        if (odx == -1) {
-          this.maxBidShow = false;
-        } else {
+        if (item.length == 1 && odx > -1) {
+          this.maxBidShow = true;
+           this.model.deepConversionType = [];
+          this.depthArray = [];
+          this.ocpxActionTypeArray = [];
+        }else if (odx > -1) {
           this.maxBidShow = true;
           this.maxBidShow = true;
         }
         }
-        // item.indexOf(item=>{
-        //   console.log(item);
-        //   if (item == 2) {
-        //     console.log(this.maxBidShow);
-        //     this.maxBidShow = true;
-        //   }else{
-        //     this.maxBidShow = false;
-
-        //   }
-        // })
+          
         if (item.length == 0) {
         if (item.length == 0) {
           this.model.deepConversionType = [];
           this.model.deepConversionType = [];
           this.depthArray = [];
           this.depthArray = [];
@@ -252,22 +255,50 @@
           this.maxBidShow = false;
           this.maxBidShow = false;
         }
         }
       },
       },
+      bidtypedeselect(item){
+        if (item ==2) {
+          this.maxBidShow = false
+         
+        }
+      },
       ocpxActionTypeChange(item) {
       ocpxActionTypeChange(item) {
-        this.ocpxActionTypeArray = [];
+        // this.ocpxActionTypeArray = [];
         item.forEach(element => {
         item.forEach(element => {
           this.ocpxList.find((par) => {
           this.ocpxList.find((par) => {
             if (par.ocpxActionType == element) {
             if (par.ocpxActionType == element) {
+             
               this.ocpxActionTypeArray.push({ ocpxCode: par.ocpxActionType, ocpxName: par.ocpxActionName });
               this.ocpxActionTypeArray.push({ ocpxCode: par.ocpxActionType, ocpxName: par.ocpxActionName });
             }
             }
 
 
           })
           })
         });
         });
+        this.deWeight();
         if (item.length == 0) {
         if (item.length == 0) {
           this.model.deepConversionType = [];
           this.model.deepConversionType = [];
         }
         }
       },
       },
+      deWeight() {
+            for (var i = 0; i < this.ocpxActionTypeArray.length - 1; i++) {
+                for (var j = i + 1; j < this.ocpxActionTypeArray.length; j++) {
+                    if (this.ocpxActionTypeArray[i].ocpxName == this.ocpxActionTypeArray[j].ocpxName) {
+                        this.ocpxActionTypeArray.splice(j, 1);
+                        //因为数组长度减小1,所以直接 j++ 会漏掉一个元素,所以要 j--
+                        j--;
+                    }
+                }
+            }
+            // return this.ocpxActionTypeArray;
+            
+        },
+        ocpextiondeselect(item){
+          this.ocpxActionTypeArray.forEach((element,index) => {
+            if (element.ocpxCode == item) {
+              this.ocpxActionTypeArray.splice(index,1)
+            }
+          });
+        },
       depthChange(event) {
       depthChange(event) {
-        this.depthArray = [];
+        // this.depthArray = [];
         event.forEach(element => {
         event.forEach(element => {
           this.depthList.find((par) => {
           this.depthList.find((par) => {
             if (par.deepCode == element) {
             if (par.deepCode == element) {
@@ -276,7 +307,25 @@
 
 
           })
           })
         });
         });
-        console.log(this.depthArray);
+        this.duplicate();
+      },
+      duplicate(){
+        for (var i = 0; i < this.depthArray.length - 1; i++) {
+                for (var j = i + 1; j < this.depthArray.length; j++) {
+                    if (this.depthArray[i].deepName == this.depthArray[j].deepName) {
+                        this.depthArray.splice(j, 1);
+                        //因为数组长度减小1,所以直接 j++ 会漏掉一个元素,所以要 j--
+                        j--;
+                    }
+                }
+            }
+      },
+      depthChangedeselect(item){
+        this.depthArray.forEach((element,index) => {
+            if (element.deepCode == item) {
+              this.depthArray.splice(index,1)
+            }
+          });
       },
       },
       validateInputCode(rule, value, callback) {
       validateInputCode(rule, value, callback) {
         if (value > 0) {
         if (value > 0) {
@@ -300,10 +349,26 @@
 
 
       ...mapGetters(['nickname', 'avatar', 'userInfo']),
       ...mapGetters(['nickname', 'avatar', 'userInfo']),
       onChange(e) {
       onChange(e) {
+        console.log(this.ocpxActionTypeArray);
         console.log(e);
         console.log(e);
+        
         if (e.target.value == 1 || e.target.value == 3) {
         if (e.target.value == 1 || e.target.value == 3) {
-          this.ocpxActionTypeArray = [];
-          this.depthArray = [];
+        //  console.log(this.model.bidType);
+         this.$nextTick(()=>{
+           this.form.setFieldsValue({maxBid:this.model.maxBid,bidType:this.model.bidType})
+         })
+          
+          // this.form.maxBid = this.model.maxBid ? this.model.maxBid / 1000 : 0
+          // console.log(this.form.getFieldValue('maxBid'));
+        }else{
+          this.$nextTick(()=>{
+            this.form.setFieldsValue({bidType:this.model.bidType})
+          })
+          setTimeout(()=>{
+            this.form.setFieldsValue({ocpxActionType:this.model.ocpxActionType})
+          },100)
+          console.log(this.model.bidType);
+          
         }
         }
         console.log(`checked = ${e.target.value}`)
         console.log(`checked = ${e.target.value}`)
         // this.form.resetFields([])
         // this.form.resetFields([])
@@ -374,19 +439,25 @@
         }
         }
 
 
         // var params = { ...record }
         // var params = { ...record }
-        if (record.mediaId == '2' || record.mediaId == '4') {
+        if (record.mediaId == '2' || record.mediaId == '4' ||  record.mediaId == '6') {
           console.log(record)
           console.log(record)
           var params = { ...record }
           var params = { ...record }
           params.bidType = record.bidType == null || record.bidType == '' ? [] : JSON.parse(record.bidType)
           params.bidType = record.bidType == null || record.bidType == '' ? [] : JSON.parse(record.bidType)
           // this.maxBidShow = params.bidType.findIndex((item) => item == 2)
           // this.maxBidShow = params.bidType.findIndex((item) => item == 2)
-          params.bidType.findIndex(item => {
-            if (item == 2) {
-              this.maxBidShow = true;
-            } else {
-              this.maxBidShow = false;
+          let odx =  params.bidType.indexOf(2)
+          if (odx > -1) {
+            this.maxBidShow = true;
+          }else{
+            this.maxBidShow = false;
+          }
+          // params.bidType.findIndex(item => {
+          //   if (item == 2) {
+          //     this.maxBidShow = true;
+          //   } else {
+          //     this.maxBidShow = false;
 
 
-            }
-          })
+          //   }
+          // })
 
 
           let newArray = [];
           let newArray = [];
           newArray = record.ocpxActionType == null || record.ocpxActionType == '' ? [] : JSON.parse(record.ocpxActionType)
           newArray = record.ocpxActionType == null || record.ocpxActionType == '' ? [] : JSON.parse(record.ocpxActionType)
@@ -512,7 +583,7 @@
         } else {
         } else {
           this.form.validateFields((err, values) => {
           this.form.validateFields((err, values) => {
             if (!err) {
             if (!err) {
-              that.confirmLoading = true
+              
               let httpurl = ''
               let httpurl = ''
               let method = ''
               let method = ''
               if (!this.model.id) {
               if (!this.model.id) {
@@ -524,8 +595,24 @@
               }
               }
               var data = values.advertiserId
               var data = values.advertiserId
               let formData = Object.assign(this.model, values)
               let formData = Object.assign(this.model, values)
-              //   if(this.model.mediaId)
-              formData.maxBid = formData.maxBid * 1000
+                if (this.model.mediaId == 1 || this.model.mediaId == 3|| this.model.mediaId == 5) {
+                  this.ocpxActionTypeArray = [];
+                  this.depthArray = [];
+                  formData.bidType = [];
+                }
+                
+              if (this.maxBidShow) {
+                formData.maxBid = formData.maxBid * 1000
+              }else{
+               if (this.model.mediaId == 1 || this.model.mediaId == 3|| this.model.mediaId == 5) {
+                formData.maxBid = formData.maxBid * 1000
+               }else{
+                 formData.maxBid = 0
+               }
+                
+              }
+              that.confirmLoading = true
+              // formData.maxBid = formData.maxBid * 1000
               formData.maxDeepCpaBid = formData.maxDeepCpaBid * 1000
               formData.maxDeepCpaBid = formData.maxDeepCpaBid * 1000
               //时间格式化
               //时间格式化
               // formData.advertiserId = data.key
               // formData.advertiserId = data.key

+ 4 - 4
src/views/modules/advertiser/modules/UserAllocationModal.vue

@@ -29,10 +29,10 @@
           <a-input placeholder="请输入账户id --授权" v-decorator="['accountId', {}]" disabled />
           <a-input placeholder="请输入账户id --授权" v-decorator="['accountId', {}]" disabled />
         </a-form-item>
         </a-form-item>
         <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="广告主名称">
         <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="广告主名称">
-          <a-input placeholder="请输入广告主名称" v-decorator="['advertiserName', {}]" disabled />
+          <a-input placeholder="请输入广告主名称" v-decorator="['advertiserId_dictText', {}]" disabled />
         </a-form-item>
         </a-form-item>
         <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="项目名称">
         <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="项目名称">
-          <a-input placeholder="请输入项目名称" v-decorator="['projectName', {}]" disabled />
+          <a-input placeholder="请输入项目名称" v-decorator="['projectId_dictText', {}]" disabled />
         </a-form-item>
         </a-form-item>
         <!-- <a-form-item
         <!-- <a-form-item
           :labelCol="labelCol"
           :labelCol="labelCol"
@@ -154,9 +154,9 @@ export default {
             'userName',
             'userName',
             'accountId',
             'accountId',
             'advertiserId',
             'advertiserId',
-            'advertiserName',
+            'advertiserId_dictText',
             'projectId',
             'projectId',
-            'projectName',
+            'projectId_dictText',
             'accountName',
             'accountName',
             'authName',
             'authName',
             'mediaId',
             'mediaId',

+ 118 - 29
src/views/modules/advertiser/modules/projectListModal.vue

@@ -17,7 +17,7 @@
         </a-form-item>
         </a-form-item>
 
 
         <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="供应商"
         <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="供应商"
-          v-if="model.mediaId == '2' || model.mediaId == '4'">
+          v-if="model.mediaId == '2' || model.mediaId == '4'|| model.mediaId == '6'">
           <a-select optionFilterProp="children" showSearch :filterOption="filterOption"
           <a-select optionFilterProp="children" showSearch :filterOption="filterOption"
             v-decorator="['supplierCode', validatorRules.supplierCode]">
             v-decorator="['supplierCode', validatorRules.supplierCode]">
             <a-select-option :value="item.supplierCode" v-for="(item, index) of supplierList" :key="index">
             <a-select-option :value="item.supplierCode" v-for="(item, index) of supplierList" :key="index">
@@ -42,20 +42,20 @@
             </a-select-option>
             </a-select-option>
           </a-select>
           </a-select>
         </a-form-item>
         </a-form-item>
-        <a-form-item v-if="model.mediaId == '1' || model.mediaId == '3' || maxBidShow" :labelCol="labelCol"
+        <a-form-item v-if="model.mediaId == '1' || model.mediaId == '3'|| model.mediaId == '5' || maxBidShow" :labelCol="labelCol"
           :wrapperCol="wrapperCol" label="最高出价">
           :wrapperCol="wrapperCol" label="最高出价">
           <a-input placeholder="请输入最高出价" v-decorator="['maxBid', validatorRules.maxBid]" addonAfter="元" />
           <a-input placeholder="请输入最高出价" v-decorator="['maxBid', validatorRules.maxBid]" addonAfter="元" />
         </a-form-item>
         </a-form-item>
-        <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="最高转化出价">
+        <!-- <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="最高转化出价">
           <a-input placeholder="最高转化出价" v-decorator="['maxDeepCpaBid']" addonAfter="元" />
           <a-input placeholder="最高转化出价" v-decorator="['maxDeepCpaBid']" addonAfter="元" />
-        </a-form-item>
+        </a-form-item> -->
         <div v-if="showDian">
         <div v-if="showDian">
           <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="优化目标">
           <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="优化目标">
-            <a-select v-decorator="['bidType', { initialValue: 2 }]" mode="multiple" @change="bidTypeChange($event)">
+            <a-select v-decorator="['bidType', { initialValue: 2 }]" mode="multiple" @change="bidTypeChange($event)" @deselect="bidtypedeselect">
               <a-select-option :value="2">点击数</a-select-option>
               <a-select-option :value="2">点击数</a-select-option>
               <a-select-option :value="10">OCPM</a-select-option>
               <a-select-option :value="10">OCPM</a-select-option>
               <a-select-option :value="6">OCPC</a-select-option>
               <a-select-option :value="6">OCPC</a-select-option>
-              <a-select-option :value="12">最大转化</a-select-option>
+              <a-select-option :value="12">最大转化</a-select-option>
             </a-select>
             </a-select>
           </a-form-item>
           </a-form-item>
           <div v-if="Array.isArray(getFormFieldValue('bidType'))">
           <div v-if="Array.isArray(getFormFieldValue('bidType'))">
@@ -64,7 +64,7 @@
                 getFormFieldValue('bidType').findIndex((item) => item == 6) > -1||
                 getFormFieldValue('bidType').findIndex((item) => item == 6) > -1||
                 getFormFieldValue('bidType').findIndex((item) => item == 12) > -1
                 getFormFieldValue('bidType').findIndex((item) => item == 12) > -1
               ">
               ">
-              <a-select v-model="model.ocpxActionType" @change="ocpxActionTypeChange($event)" mode="multiple">
+              <a-select v-model="model.ocpxActionType" @change="ocpxActionTypeChange($event)"  @deselect="ocpextiondeselect" mode="multiple">
                 <!-- <a-select-option :value="2">行为数</a-select-option> -->
                 <!-- <a-select-option :value="2">行为数</a-select-option> -->
                 <a-select-option :value="item.ocpxActionType" v-for="(item, index) in ocpxList" :key="item.id">{{
                 <a-select-option :value="item.ocpxActionType" v-for="(item, index) in ocpxList" :key="item.id">{{
                   item.ocpxActionName
                   item.ocpxActionName
@@ -74,7 +74,7 @@
 
 
             <div v-if="model.ocpxActionType">
             <div v-if="model.ocpxActionType">
               <a-form-item v-show="model.ocpxActionType.length > 0" :labelCol="labelCol" :wrapperCol="wrapperCol"
               <a-form-item v-show="model.ocpxActionType.length > 0" :labelCol="labelCol" :wrapperCol="wrapperCol"
-                v-for="(item, index) in ocpxActionTypeArray" :key="index" :label="item.ocpxName+'最高价'">
+                v-for="(item, index) in ocpxActionTypeArray" :key="index" :label="item.ocpxName+'最高价'">
                 <a-input @input="maxValueInput"
                 <a-input @input="maxValueInput"
                   @keyup.native="item.maxValue = item.maxValue.replace(/^(\-)*(\d+)\.(\d\d).*$/,'$1$2.$3');"
                   @keyup.native="item.maxValue = item.maxValue.replace(/^(\-)*(\d+)\.(\d\d).*$/,'$1$2.$3');"
                   placeholder="请输入最高出价" v-model="item.maxValue" addonAfter="元" />
                   placeholder="请输入最高出价" v-model="item.maxValue" addonAfter="元" />
@@ -87,7 +87,7 @@
             <a-form-item label="深度转化目标" :labelCol="labelCol" :wrapperCol="wrapperCol"
             <a-form-item label="深度转化目标" :labelCol="labelCol" :wrapperCol="wrapperCol"
                v-show="model.ocpxActionType.length > 0">
                v-show="model.ocpxActionType.length > 0">
               <!-- v-model="model.ocpxActionType" -->
               <!-- v-model="model.ocpxActionType" -->
-              <a-select @change="depthChange($event)" v-model="model.deepConversionType" mode="multiple">
+              <a-select @change="depthChange($event)" @deselect="depthChangedeselect" v-model="model.deepConversionType" mode="multiple">
                 <a-select-option :value="item.deepCode" v-for="(item, index) in depthList" :key="index">{{
                 <a-select-option :value="item.deepCode" v-for="(item, index) in depthList" :key="index">{{
                   item.deepName
                   item.deepName
                   }}</a-select-option>
                   }}</a-select-option>
@@ -97,7 +97,7 @@
 
 
           <div v-if="model.deepConversionType">
           <div v-if="model.deepConversionType">
             <a-form-item v-show="model.deepConversionType.length >0" :labelCol="labelCol" :wrapperCol="wrapperCol"
             <a-form-item v-show="model.deepConversionType.length >0" :labelCol="labelCol" :wrapperCol="wrapperCol"
-              v-for="(item, index) in depthArray" :key="index" :label="item.deepName+'最高价'">
+              v-for="(item, index) in depthArray" :key="index" :label="item.deepName+'最高价'">
               <a-input placeholder="请输入最高出价" @input="deepInput"
               <a-input placeholder="请输入最高出价" @input="deepInput"
                 @keyup.native="item.deepValue = item.deepValue.replace(/^(\-)*(\d+)\.(\d\d).*$/,'$1$2.$3');"
                 @keyup.native="item.deepValue = item.deepValue.replace(/^(\-)*(\d+)\.(\d\d).*$/,'$1$2.$3');"
                 v-model="item.deepValue" addonAfter="元" />
                 v-model="item.deepValue" addonAfter="元" />
@@ -250,9 +250,12 @@
         console.log(item);
         console.log(item);
         // this.maxBidShow =   item.findIndex((item) => item == 2)
         // this.maxBidShow =   item.findIndex((item) => item == 2)
         let odx = item.indexOf(2)
         let odx = item.indexOf(2)
-        if (odx == -1) {
-          this.maxBidShow = false;
-        } else {
+        if (item.length == 1 && odx > -1) {
+          this.maxBidShow = true;
+          this.model.deepConversionType = [];
+          this.depthArray = [];
+          this.ocpxActionTypeArray = [];
+        }else if (odx > -1) {
           this.maxBidShow = true;
           this.maxBidShow = true;
         }
         }
         if (item.length == 0) {
         if (item.length == 0) {
@@ -263,8 +266,14 @@
           this.maxBidShow = false;
           this.maxBidShow = false;
         }
         }
       },
       },
+      bidtypedeselect(item){
+        if (item ==2) {
+          this.maxBidShow = false
+         
+        }
+      },
       ocpxActionTypeChange(item) {
       ocpxActionTypeChange(item) {
-        this.ocpxActionTypeArray = [];
+        // this.ocpxActionTypeArray = [];
         item.forEach(element => {
         item.forEach(element => {
           this.ocpxList.find((par) => {
           this.ocpxList.find((par) => {
             if (par.ocpxActionType == element) {
             if (par.ocpxActionType == element) {
@@ -274,14 +283,36 @@
 
 
           })
           })
         });
         });
-
+        this.deWeight();
         if (item.length == 0) {
         if (item.length == 0) {
           this.model.deepConversionType = [];
           this.model.deepConversionType = [];
         }
         }
 
 
       },
       },
+      deWeight() {
+            for (var i = 0; i < this.ocpxActionTypeArray.length - 1; i++) {
+                for (var j = i + 1; j < this.ocpxActionTypeArray.length; j++) {
+                    if (this.ocpxActionTypeArray[i].ocpxName == this.ocpxActionTypeArray[j].ocpxName) {
+                        this.ocpxActionTypeArray.splice(j, 1);
+                        //因为数组长度减小1,所以直接 j++ 会漏掉一个元素,所以要 j--
+                        j--;
+                    }
+                }
+            }
+            // return this.ocpxActionTypeArray;
+            
+        },
+        ocpextiondeselect(item){
+          this.ocpxActionTypeArray.forEach((element,index) => {
+            if (element.ocpxCode == item) {
+              this.ocpxActionTypeArray.splice(index,1)
+            }
+          });
+        },
+
+
       depthChange(event) {
       depthChange(event) {
-        this.depthArray = [];
+        // this.depthArray = [];
         event.forEach(element => {
         event.forEach(element => {
           this.depthList.find((par) => {
           this.depthList.find((par) => {
             if (par.deepCode == element) {
             if (par.deepCode == element) {
@@ -290,7 +321,26 @@
 
 
           })
           })
         });
         });
-        console.log(this.depthArray);
+        this.duplicate();
+        
+      },
+      duplicate(){
+        for (var i = 0; i < this.depthArray.length - 1; i++) {
+                for (var j = i + 1; j < this.depthArray.length; j++) {
+                    if (this.depthArray[i].deepName == this.depthArray[j].deepName) {
+                        this.depthArray.splice(j, 1);
+                        //因为数组长度减小1,所以直接 j++ 会漏掉一个元素,所以要 j--
+                        j--;
+                    }
+                }
+            }
+      },
+      depthChangedeselect(item){
+        this.depthArray.forEach((element,index) => {
+            if (element.deepCode == item) {
+              this.depthArray.splice(index,1)
+            }
+          });
       },
       },
       validateInputCode(rule, value, callback) {
       validateInputCode(rule, value, callback) {
         if (!value || value > 0) {
         if (!value || value > 0) {
@@ -363,17 +413,23 @@
         // else if (this.request == '2,4') {
         // else if (this.request == '2,4') {
         //         params.type = 'kuaishou'
         //         params.type = 'kuaishou'
         //       }
         //       }
-        if (record.mediaId == '2' || record.mediaId == '4') {
+        if (record.mediaId == '2' || record.mediaId == '4' || record.mediaId == '6') {
           var params = { ...record }
           var params = { ...record }
           params.bidType = record.bidType == null || record.bidType == '' ? [] : JSON.parse(record.bidType)
           params.bidType = record.bidType == null || record.bidType == '' ? [] : JSON.parse(record.bidType)
-          params.bidType.findIndex(item => {
-            if (item == 2) {
-              this.maxBidShow = true;
-            } else {
-              this.maxBidShow = false;
-
-            }
-          })
+          let odx =  params.bidType.indexOf(2)
+          if (odx > -1) {
+            this.maxBidShow = true;
+          }else{
+            this.maxBidShow = false;
+          }
+          // params.bidType.findIndex(item => {
+          //   if (item == 2) {
+          //     this.maxBidShow = true;
+          //   } else {
+          //     this.maxBidShow = false;
+
+          //   }
+          // })
           // params.ocpxActionType =
           // params.ocpxActionType =
           //   record.ocpxActionType == null || record.ocpxActionType == '' ? [] : JSON.parse(record.ocpxActionType)
           //   record.ocpxActionType == null || record.ocpxActionType == '' ? [] : JSON.parse(record.ocpxActionType)
           let newArray = [];
           let newArray = [];
@@ -407,9 +463,11 @@
           });
           });
 
 
           this.showDian = true
           this.showDian = true
+         
         } else {
         } else {
           var { ocpxActionType, bidType, ...params } = record
           var { ocpxActionType, bidType, ...params } = record
           this.showDian = false
           this.showDian = false
+          
         }
         }
         this.form.resetFields()
         this.form.resetFields()
         this.model = Object.assign({}, params)
         this.model = Object.assign({}, params)
@@ -480,13 +538,28 @@
       },
       },
       handleOk() {
       handleOk() {
         const that = this
         const that = this
+        var isEvery = '';
+        var deepIsEvery = '';
         // 触发表单验证
         // 触发表单验证
-        let isEvery = this.ocpxActionTypeArray.every((item, i) => {
+        if (this.model.mediaId == 2 || this.model.mediaId == 4 ||this.model.mediaId == 6) {
+           isEvery = this.ocpxActionTypeArray.every((item, i) => {
           return "maxValue" in item && item.maxValue != "" && item.maxValue * 1000 >= 0 && item.maxValue * 1000 <= 999999 * 1000
           return "maxValue" in item && item.maxValue != "" && item.maxValue * 1000 >= 0 && item.maxValue * 1000 <= 999999 * 1000
         })
         })
-        let deepIsEvery = this.depthArray.every((event, i) => {
+         deepIsEvery = this.depthArray.every((event, i) => {
           return "deepValue" in event && event.deepValue != "" && event.deepValue * 1000 >= 0 && event.deepValue * 1000 <= 999999 * 1000
           return "deepValue" in event && event.deepValue != "" && event.deepValue * 1000 >= 0 && event.deepValue * 1000 <= 999999 * 1000
         })
         })
+        }else{
+        isEvery = true;
+        deepIsEvery = true;
+        this.ocpxActionTypeArray = [];
+        this.depthArray = [];
+        }
+        // let isEvery = this.ocpxActionTypeArray.every((item, i) => {
+        //   return "maxValue" in item && item.maxValue != "" && item.maxValue * 1000 >= 0 && item.maxValue * 1000 <= 999999 * 1000
+        // })
+        // let deepIsEvery = this.depthArray.every((event, i) => {
+        //   return "deepValue" in event && event.deepValue != "" && event.deepValue * 1000 >= 0 && event.deepValue * 1000 <= 999999 * 1000
+        // })
         if (!isEvery || !deepIsEvery) {
         if (!isEvery || !deepIsEvery) {
           this.$message.warning('请输入0~999999之间的最高价')
           this.$message.warning('请输入0~999999之间的最高价')
         } else {
         } else {
@@ -506,9 +579,25 @@
               let formData = Object.assign(this.model, values)
               let formData = Object.assign(this.model, values)
               console.log(formData);
               console.log(formData);
               //   if(this.model.mediaId)
               //   if(this.model.mediaId)
-              if (formData.maxBid) {
+              if (this.model.mediaId == 2 || this.model.mediaId == 4 || this.model.mediaId == 6) {
+                if (this.maxBidShow) {
+                if (formData.maxBid) {
+                formData.maxBid = formData.maxBid * 1000
+                }
+              }else{
+                formData.maxBid = 0
+              }
+              }else{
                 formData.maxBid = formData.maxBid * 1000
                 formData.maxBid = formData.maxBid * 1000
               }
               }
+              // if (this.maxBidShow) {
+              //   if (formData.maxBid) {
+              //   formData.maxBid = formData.maxBid * 1000
+              // }
+              // }else{
+              //   formData.maxBid = 0
+              // }
+             
               if (formData.maxDeepCpaBid) {
               if (formData.maxDeepCpaBid) {
                 formData.maxDeepCpaBid = formData.maxDeepCpaBid * 1000
                 formData.maxDeepCpaBid = formData.maxDeepCpaBid * 1000
               }
               }

+ 15 - 15
src/views/modules/autoLaunch/channelManage/channelDetailList.vue

@@ -594,21 +594,21 @@ let detailColumns = [
         align: 'center',
         align: 'center',
         key: 'channelName'
         key: 'channelName'
     },
     },
-    {
-        title: '使用范围',
-        dataIndex: 'usageRange',
-        customRender: function(text) {
-            if (text == 1) {
-                return '账户'
-            } else if (text == 2) {
-                return '项目'
-            } else {
-                return text
-            }
-        },
-        align: 'center',
-        key: 'usageRange'
-    },
+    // {
+    //     title: '使用范围',
+    //     dataIndex: 'usageRange',
+    //     customRender: function(text) {
+    //         if (text == 1) {
+    //             return '账户'
+    //         } else if (text == 2) {
+    //             return '项目'
+    //         } else {
+    //             return text
+    //         }
+    //     },
+    //     align: 'center',
+    //     key: 'usageRange'
+    // },
     // {
     // {
     //     title: '项目名称',
     //     title: '项目名称',
     //     dataIndex: 'projectName',
     //     dataIndex: 'projectName',

+ 11 - 2
src/views/modules/autoLaunch/configLaunchInfo.vue

@@ -3079,8 +3079,12 @@ export default {
                  this.$message.error('请正确填写必填项目')
                  this.$message.error('请正确填写必填项目')
                  return 
                  return 
             }
             }
-
-            this.form.validateFields((err, values) => {
+            this.getAction('/auto/aiKuaishouAccountAutoStrategy/checkStrategy', {
+                accountId: this.accountId,
+                type: 0
+            }).then(res => {
+                if(res.success){
+                    this.form.validateFields((err, values) => {
                 //console.log(values) 
                 //console.log(values) 
                 if (!err) {  
                 if (!err) {  
                     let isNotComplete = this.descriptionList.findIndex(item => {
                     let isNotComplete = this.descriptionList.findIndex(item => {
@@ -3305,6 +3309,11 @@ export default {
                     this.$message.error('请正确填写必填项目')
                     this.$message.error('请正确填写必填项目')
                 }
                 }
             })
             })
+                }else{
+                    this.$message.error(res.message)
+                }
+            })
+
             
             
         })
         })
         
         

+ 50 - 4
src/views/modules/autoLaunch/trusteeship/creatMaterialTest.vue

@@ -55,6 +55,37 @@
                                 </a-row>
                                 </a-row>
                                 <a-row :gutter="16">
                                 <a-row :gutter="16">
                                     <a-col :span="16">
                                     <a-col :span="16">
+                                        <a-form-item label="投放媒体">
+                                            <!-- { label: '视频播放页广告', value: 3 }, -->
+                                            <checkBoxGroup
+                                                :options="[
+                                                    { label: '优选广告位', value: 1 },
+                                                    { label: '上下滑大屏广告', value: 6 },
+
+                                                    { label: '快手联盟优选', value: 10 },
+
+                                                    { label: '激励视频广告', value: 24 }
+                                                ]"
+                                                v-decorator="[
+                                                    'sceneIds',
+                                                    {
+                                                        rules: [
+                                                            {
+                                                                required: true,
+                                                                message: '投放媒体必选'
+                                                            }
+                                                        ],
+                                                        initialValue: [1]
+                                                    }
+                                                ]"
+                                                @change="changeData"
+                                            />
+                                        </a-form-item>
+                                    </a-col>
+                                </a-row>
+
+                                <a-row :gutter="16">
+                                    <a-col :span="16">
                                         <a-form-item label="营销目标">
                                         <a-form-item label="营销目标">
                                             <a-radio-group
                                             <a-radio-group
                                                 button-style="solid"
                                                 button-style="solid"
@@ -518,10 +549,11 @@
                                                         initialValue: 3
                                                         initialValue: 3
                                                     }
                                                     }
                                                 ]"
                                                 ]"
+                                                :disabled="getFormData('formProject', 'campaignType') != 5"
                                             >
                                             >
-                                                <a-radio-button :value="3" disabled>不限</a-radio-button>
-                                                <a-radio-button :value="1" disabled>android</a-radio-button>
-                                                <a-radio-button :value="2" disabled>ios</a-radio-button>
+                                                <a-radio-button :value="3">不限</a-radio-button>
+                                                <a-radio-button :value="1">android</a-radio-button>
+                                                <a-radio-button :value="2">ios</a-radio-button>
                                             </a-radio-group>
                                             </a-radio-group>
                                         </a-form-item>
                                         </a-form-item>
                                         <a-form-item
                                         <a-form-item
@@ -1516,6 +1548,18 @@ export default {
     methods: {
     methods: {
         ...mapGetters(['userInfo']),
         ...mapGetters(['userInfo']),
         moment,
         moment,
+        changeData(data) {
+            if (data.length > 1 && data.findIndex(item => item == 1) == 0) {
+                data.splice(
+                    data.findIndex(item => item == 1),
+                    1
+                )
+            } else if (data.length > 1 && data.findIndex(item => item == 1) == data.length - 1) {
+                data.splice(0, data.length - 1)
+            } else if (data.length == 0) {
+                data.push(1)
+            } 
+        },
         changeCampaign(e) {
         changeCampaign(e) {
             console.log(e.target.value)
             console.log(e.target.value)
             this.getActionBarText()
             this.getActionBarText()
@@ -1703,7 +1747,8 @@ export default {
                     this.$nextTick(() => {
                     this.$nextTick(() => {
                         let data = res.result
                         let data = res.result
                         this.accountIds = data.accountId
                         this.accountIds = data.accountId
-                        this.formProject.setFieldsValue(pick(data, 'campaignType'))
+                        data.sceneIds = data.sceneIds ? JSON.parse(data.sceneIds) : [1]
+                        this.formProject.setFieldsValue(pick(data, 'campaignType', 'sceneIds'))
                         this.$nextTick(() => {
                         this.$nextTick(() => {
                             this.getActionBarText()
                             this.getActionBarText()
                         })
                         })
@@ -2006,6 +2051,7 @@ export default {
                         params.userId = this.userInfo().id
                         params.userId = this.userInfo().id
                         params.useAppMarket = params.useAppMarket ? 1 : 2
                         params.useAppMarket = params.useAppMarket ? 1 : 2
                         params.appStore = params.appStore ? JSON.stringify(params.appStore) : '[]'
                         params.appStore = params.appStore ? JSON.stringify(params.appStore) : '[]'
+                        params.sceneIds = params.sceneIds ? JSON.stringify(params.sceneIds) : '[]'
                         params.regionIds =
                         params.regionIds =
                             this.district == 'NONE'
                             this.district == 'NONE'
                                 ? JSON.stringify([])
                                 ? JSON.stringify([])

+ 1 - 1
src/views/modules/autoLaunch/trusteeship/index.vue

@@ -741,7 +741,7 @@ export default {
                 if (res.success) {
                 if (res.success) {
                     this.$message.success(res.message)
                     this.$message.success(res.message)
                     this.tongbuLoading = false
                     this.tongbuLoading = false
-                    postAction('/hosting/kuaishouHostingTemplate/getVideoList', {
+                    this.getAction('/hosting/kuaishouHostingTemplate/getVideoList', {
                         id: this.ipaginationVideo.id,
                         id: this.ipaginationVideo.id,
                         accountId: this.ipaginationVideo.accountId,
                         accountId: this.ipaginationVideo.accountId,
                         pageSize: this.ipaginationVideo.pageSize,
                         pageSize: this.ipaginationVideo.pageSize,

+ 849 - 0
src/views/modules/autoLaunchRevision/autoLaunchList.vue

@@ -0,0 +1,849 @@
+<style scoped lang="scss">
+/deep/ .ant-drawer-header {
+    border-bottom: 0px;
+}
+</style>
+<template>
+    <div class="toutiaoBatch">
+        <div class="toolbox-automate-rules-create-content_title">
+            <h3>账户配置列表</h3>
+            <a-button type="primary" @click="goNewConfigInfo(null)" class="goNewConfigInfo">创建投放策略</a-button>
+        </div>
+        <div class="directional-content">
+            <div class="table-page-search-wrapper">
+                <a-form layout="inline" :form="form" hide-required-mark :selfUpdate="true" @submit="search">
+                    <a-row :gutter="24">
+                        <!-- v-decorator="[
+                                        'dateValue',
+                                        { initialValue: [moment().subtract(7, 'days'), moment().subtract(1, 'days')] }
+                                    ]" -->
+                        <a-col :md="10" :sm="10" :xxl="10">
+                            <a-form-item label="账户名称">
+                                <Treeselect
+                                    :appId.sync="accountId"
+                                    :multiple="false"
+                                    request="2,4"
+                                    ref="treeSelect"
+                                    style="width:100%"
+                                />
+                            </a-form-item>
+                        </a-col>
+                        <a-col :md="8" :sm="8" :xxl="6">
+                            <a-form-item label="投放状态">
+                                <a-select v-model="status" placeholder="请选择投放状态" allowClear>
+                                    <a-select-option :value="1">开启</a-select-option>
+                                    <a-select-option :value="0">关闭</a-select-option>
+                                </a-select>
+                            </a-form-item>
+                        </a-col>
+                        <a-col :md="6" :sm="6" :xxl="8" style="display: flex;justify-content: flex-end;">
+                            <span style="float: left; overflow: hidden" class="table-page-search-submitButtons">
+                                <a-button type="primary" icon="search" @click="search">查询</a-button>
+                                <a-button @click="handleResetForm" icon="reload" style="margin-left:10px"
+                                    >重置</a-button
+                                >
+                            </span>
+                        </a-col>
+                    </a-row>
+                </a-form>
+            </div>
+        </div>
+        <!-- <div class="topOptions">
+            <div></div>
+            <span class="optionBtn">
+                <a-button type="primary" @click="search" class="searchBtn">查询</a-button>
+            </span>
+        </div> -->
+        <div class="tableArea">
+            <!-- <div class="tableOption" v-if="selectedRowKeys.length">
+                
+                
+               :row-selection="{ selectedRowKeys: selectedRowKeys, onChange: onSelectChange }"
+            </div> -->
+            <div class="table">
+                <a-table
+                    :columns="columns"
+                    :data-source="data"
+                    bordered
+                    :pagination="ipagination"
+                    :loading="loading"
+                    @change="sort"
+                >
+                    <span slot="status" slot-scope="text, record">
+                        <a-spin :spinning="record.spin" size="small">
+                            <div class="spin-content">
+                                <a-switch size="default" :checked="text == 1" @change="switchChange(text, record)" />
+                            </div>
+                        </a-spin>
+                    </span>
+                    <span slot="openProgramCreate" slot-scope="text, record">
+                        <a-spin :spinning="record.openProgramCreateSpin" size="small">
+                            <div class="spin-content">
+                                <a-switch
+                                    size="default"
+                                    :checked="text == 1"
+                                    @change="openProgramCreateSwitchChange(text, record)"
+                                />
+                            </div>
+                        </a-spin>
+                    </span>
+                    <span slot="cpaType" slot-scope="text, record">
+                        {{
+                            ('' + record.cpaBid).includes('/')
+                                ? '阶梯出价'
+                                : ('' + record.cpaBid).includes('-')
+                                ? '随机出价'
+                                : '统一出价'
+                        }}
+                    </span>
+                    <span slot="customCreatedUnitCnt" slot-scope="text, record">
+                        {{ text + '/' + record.programCreatedUnitCnt }}
+                    </span>
+                    <div slot="cpaBid" slot-scope="text, record">
+                        <!-- {{
+                          text==0?record.roiRatio:
+                          text.includes('/')? text.split 
+                        }} -->
+                        <span v-if="text === 0">{{ record.roiRatio }}</span>
+                        <span v-else-if="('' + text).includes('/')">
+                            <!-- {{text.split('/')}} -->
+                            <span v-for="(item, index) in ('' + text).split('/')">
+                                {{ item / 1000 + (index === ('' + text).split('/').length - 1 ? '' : '/') }}
+                            </span>
+                        </span>
+                        <span v-else-if="('' + text).includes('-')">
+                            <!-- {{text.split('/')}} -->
+                            <span v-for="(item, index) in ('' + text).split('-')">
+                                {{ item / 1000 + (index === ('' + text).split('-').length - 1 ? '' : '-') }}
+                            </span>
+                        </span>
+                        <span v-else>{{ text / 1000 }}</span>
+                    </div>
+                    <span slot="ocpxActionType" slot-scope="text">
+                        {{ text | ocpxActionType }}
+                    </span>
+                    <span slot="authName" slot-scope="text">
+                        <!-- <a href="javascript:;" >{{text}}</a> -->
+                        {{ text || '-' }}
+                    </span>
+                    <span slot="time" slot-scope="text, record"> {{ record.startTime }}至{{ record.endTime }} </span>
+                    <span slot="operator" slot-scope="text, record">
+                        <a href="javascript:;" @click="goNewConfigInfo(record.id)">编辑</a>
+                        <a-divider type="vertical" />
+                        <!-- <a href="javascript:;"  @click="deleteRecord(record)">删除</a>
+                        <a-divider type="vertical" /> -->
+                        <a-popover
+                            v-model="record.visible"
+                            trigger="click"
+                            placement="topLeft"
+                            @visibleChange="visibleChange"
+                        >
+                            <span slot="title">出价</span>
+                            <template slot="content" style="width:300px;">
+                                <div style="margin:5px 0 0">
+                                    <span
+                                        ><a-input-number
+                                            :min="0"
+                                            v-model="newBid"
+                                            :step="0.1"
+                                            placeholder="请输入出价"
+                                            size="small"
+                                            style="margin-right:20px;width:120px"
+                                    /></span>
+                                    <p style="color:red;font-size:12px;height:16px;padding:5px 0">
+                                        {{ bidErrorMessage }}
+                                    </p>
+                                </div>
+
+                                <div>
+                                    <a-button
+                                        type="default"
+                                        @click="bidChangeCancel(record)"
+                                        size="small"
+                                        style="margin-right:10px"
+                                        >取消</a-button
+                                    >
+                                    <a-button type="primary" @click="bidChangeOk(record)" size="small" class="ok"
+                                        >修改</a-button
+                                    >
+                                </div>
+                            </template>
+                            <a
+                                href="javascript:;"
+                                type="primary"
+                                @click="
+                                    () => {
+                                        record.visible = true
+                                    }
+                                "
+                                >修改出价</a
+                            >
+                        </a-popover>
+
+                        <!-- <a-divider type="vertical" />
+                        -->
+                        <a-divider type="vertical" />
+
+                        <a-dropdown>
+                            <a class="ant-dropdown-link" @click="e => e.preventDefault()">
+                                更多
+                            </a>
+                            <a-menu slot="overlay">
+                                <a-menu-item>
+                                    <a @click="goExplore(record)">加速探索</a>
+                                </a-menu-item>
+                                <a-menu-item>
+                                    <a-popover
+                                        v-model="record.show"
+                                        trigger="click"
+                                        placement="topRight"
+                                        @visibleChange="visibleChange"
+                                    >
+                                        <div slot="content">
+                                            <span style="font-weight:700;margin-right:15px;font-size:15px"
+                                                >修改后重提</span
+                                            >
+                                            <a-radio-group v-model="examineAgainType">
+                                                <a-radio :value="1">修改广告语</a-radio>
+                                                <a-radio :value="0">修改封面</a-radio>
+                                            </a-radio-group>
+                                            <a-button
+                                                type="default"
+                                                @click="examineAgainCancel(record)"
+                                                size="small"
+                                                style="margin-right:10px"
+                                                >取消</a-button
+                                            >
+                                            <a-button
+                                                type="primary"
+                                                @click="examineAgainOk(record)"
+                                                size="small"
+                                                class="ok"
+                                                >重提</a-button
+                                            >
+                                        </div>
+                                        <a
+                                            href="javascript:;"
+                                            type="primary"
+                                            @click="
+                                                () => {
+                                                    record.show = true
+                                                }
+                                            "
+                                            >一键重提</a
+                                        >
+                                    </a-popover>
+                                </a-menu-item>
+                                <a-menu-item>
+                                    <a href="javascript:;" @click="deleteRecord(record)">删除</a>
+                                </a-menu-item>
+                            </a-menu>
+                        </a-dropdown>
+                    </span>
+                    <!-- <span slot="action" slot-scope="text,record">
+                        <a  @click="goExplore(record)">加速探索</a>
+                    </span> -->
+                </a-table>
+            </div>
+        </div>
+        <configLaunchExploreDrawer
+            :exploreVisible.sync="exploreVisible"
+            :exploreKey.sync="exploreKey"
+            ref="exploreDrawer"
+        />
+    </div>
+</template>
+
+<script>
+import moment from 'moment'
+import { getAction, postAction, downFile, downFilePost, deleteAction } from '@/api/manage'
+// import { JeecgListMixin } from '@/mixins/ipagination'
+// import editableCell from './editableCell'
+import Treeselect from '@/views/modules/Statistics/components/Treeselect.vue'
+import configLaunchExploreDrawer from './components/configLaunchExploreDrawer.vue'
+import qs from 'qs'
+import { mapActions, mapGetters } from 'vuex'
+let typeValue = '预算'
+
+const strategyColumns = [
+    {
+        title: '开关',
+        dataIndex: 'status',
+        key: 'status',
+        align: 'center',
+        scopedSlots: { customRender: 'status' },
+        width: 110
+    },
+    {
+        title: '所属账户名称',
+        dataIndex: 'authName',
+        key: 'authName',
+        align: 'center',
+        scopedSlots: { customRender: 'authName' },
+        width: 200
+    },
+    {
+        title: '所属账户ID',
+        dataIndex: 'accountId',
+        key: 'accountId',
+        align: 'center',
+        scopedSlots: { customRender: 'accountId' }
+    },
+
+    {
+        title: '创建时间',
+        dataIndex: 'createTime',
+        key: 'createTime',
+        align: 'center',
+        scopedSlots: { customRender: 'createTime' }
+    },
+    {
+        title: '转化目标',
+        dataIndex: 'ocpxActionType',
+        align: 'center',
+        scopedSlots: { customRender: 'ocpxActionType' }
+        // sorter:() => {}
+    },
+    {
+        title: '出价类型',
+        dataIndex: 'cpaType',
+        align: 'center',
+        scopedSlots: { customRender: 'cpaType' }
+        // sorter:() => {}
+    },
+    {
+        title: '出价',
+        dataIndex: 'cpaBid',
+        align: 'center',
+        scopedSlots: { customRender: 'cpaBid' }
+        // sorter:() => {}
+    },
+
+    {
+        title: '自定义/程序化创建数量',
+        dataIndex: 'customCreatedUnitCnt',
+        align: 'center',
+        scopedSlots: { customRender: 'customCreatedUnitCnt' }
+        // sorter:() => {}
+    },
+    //   {
+    //         title: '是否开启程序化创建',
+    //         dataIndex: 'openProgramCreate',
+    //         align: 'center',
+    //         scopedSlots: { customRender: 'openProgramCreate' },
+    //         sorter:() => {},
+    //         width:180,
+    //     },
+    {
+        title: '操作',
+        dataIndex: 'operator',
+        key: 'operator',
+        align: 'center',
+        scopedSlots: { customRender: 'operator' }
+    }
+    //   {
+    //     title: '探索工具',
+    //     dataIndex: 'action',
+    //     key: 'action',
+    //     align: 'center',
+    //     scopedSlots: { customRender: 'action' },
+    //     fixed:'right',
+    //     width:150,
+
+    //   },
+]
+
+const publicColumns = []
+
+export default {
+    name: 'strategy-list',
+    components: {
+        // editableCell,
+        Treeselect,
+        configLaunchExploreDrawer
+    },
+    // mixins: [JeecgListMixin],
+    data() {
+        return {
+            form: this.$form.createForm(this),
+            exploreAccountId: '',
+            exploreVisible: false,
+            exploreKey: '',
+            targetVisible: false,
+            selectedRecord: {},
+            bidErrorMessage: '',
+            examineAgainType: 1,
+            newBid: undefined,
+            examineAgain: false,
+            accountId: [],
+            status: undefined,
+            accountList: [],
+            strategyState: undefined,
+            strategyName: '',
+            strategyId: undefined,
+            scrollX: 1400,
+            ipagination: {
+                current: 1,
+                pageSize: 10,
+                //   pageSizeOptions: ['10', '20', '30'],
+                showTotal: (total, range) => {
+                    return range[0] + '-' + range[1] + ' 共' + total + '条'
+                },
+                showQuickJumper: true,
+                showSizeChanger: true,
+                pageSizeOptions: ['10', '30', '50'],
+                total: 0,
+                onChange: (current, pageSize) => {
+                    // 切换分页时的回调,
+                    // 当在页面定义change事件时,切记要把此处的事件清除,因为这两个事件重叠了,可能到时候会导致一些莫名的bug
+                    this.ipagination.current = current
+                    this.ipagination.pageSize = pageSize
+                }
+            },
+
+            spinning: false,
+            moment,
+
+            optionId: '', //input输入的id或关键词
+
+            selectDisable: true,
+            optValue: undefined, //操作设置的值 删除 暂停 开启
+            visible: false, //出价里的弹出框
+
+            //主页的表格
+            data: [],
+            columns: [...strategyColumns, ...publicColumns],
+            selectedRowKeys: [],
+
+            loading: false,
+            editID: 0,
+
+            url: {
+                list: '/auto/aiKuaishouAccountAutoStrategy/list',
+                delete: '/auto/aiKuaishouAccountAutoStrategy/delete'
+            },
+
+            xiugaiData: [] //存分别修改时候的数组
+        }
+    },
+    computed: {
+        hasSelected() {
+            return this.selectedRowKeys.length > 0
+        }
+    },
+    methods: {
+        ...mapGetters(['userInfo']),
+        goExplore(item) {
+            this.exploreVisible = true
+            this.exploreKey = '1'
+            this.exploreAccountId = item.accountId
+            this.$refs.exploreDrawer.getData(item.accountId)
+        },
+        //状态改变
+        switchChange(text, record) {
+            // this.spinning=true;
+            console.log(text, record)
+            record.spin = true
+
+            let status = text == 1 ? 0 : 1
+            this.postDataAction(`/auto/aiKuaishouAccountAutoStrategy/updateState`, {
+                id: record.id,
+                status
+            }).then(res => {
+                record.spin = false
+                if (res.success) {
+                    this.getStrategyList()
+                    this.$message.success(res.message)
+                } else {
+                    this.$message.error(res.message)
+                }
+            })
+        },
+        //是否开启程序化创意状态改变
+        openProgramCreateSwitchChange(text, record) {
+            // this.spinning=true;
+            console.log(text, record)
+            record.openProgramCreateSpin = true
+
+            let status = text == 1 ? 0 : 1
+            getAction(`/ctop/aiKuaishouAdvertiserStrategy/oprateCreativeStatus`, {
+                id: record.id,
+                status
+            }).then(res => {
+                record.openProgramCreateSpin = false
+                if (res.success) {
+                    this.getStrategyList()
+                    this.$message.success(res.message)
+                } else {
+                    this.$message.error(res.message)
+                }
+            })
+        },
+        examineAgainMethod(record) {
+            console.log(record)
+            this.examineAgain = true
+            this.selectedRecord = record
+        },
+        visibleChange() {
+            this.bidErrorMessage = ''
+            this.examineAgainType = 1
+            this.newBid = undefined
+        },
+        bidChangeCancel(record) {
+            record.visible = false
+            this.newBid = undefined
+            this.bidErrorMessage = ''
+        },
+        bidChangeOk(record) {
+            if (this.newBid) {
+                record.visible = false
+                postAction('/ai/batchUpdate/updateGroupBid', {
+                    accountId: record.accountId,
+                    bid: this.newBid * 1000
+                }).then(res => {
+                    console.log(res)
+                    if (res.code == 0) {
+                        this.$message.success(res.message)
+                        this.newBid = undefined
+                        this.getStrategyList()
+                    }
+                })
+            } else {
+                this.bidErrorMessage = '请正确填写出价'
+                // this.$message.error('请正确填写出价')
+            }
+        },
+
+        examineAgainCancel(record) {
+            record.show = false
+            this.examineAgainType = 1
+        },
+        examineAgainOk(record) {
+            record.show = false
+            postAction('/kuaishou/creative/again', {
+                accountId: record.accountId,
+                updateType: this.examineAgainType
+            }).then(res => {
+                console.log(res)
+                if (res.code == 0) {
+                    this.$message.success('正在重提中,您可稍后查看结果')
+                } else {
+                    this.$message.success(res.message)
+                }
+                this.examineAgainType = 1
+            })
+        },
+        onSelectChange(selectedRowKeys) {
+            console.log('selectedRowKeys changed: ', selectedRowKeys)
+            this.selectedRowKeys = selectedRowKeys
+        },
+        goNewConfigInfo(id) {
+            // this.$router.push('/autoLaunch/configLaunchInfo')
+
+            if (id) {
+                window.open('/create-launch?id=' + id, '_blank')
+            } else {
+                window.open('/create-launch', '_blank')
+            }
+        },
+        goPlanList(record) {
+            console.log(record)
+            this.$parent.currentStrategyId = record.id
+            this.$router.push(`/autoLaunch/configLaunchInfo?id=${record.id}`)
+        },
+        deleteRecord(record) {
+            let that = this
+            this.$confirm({
+                title: '删除提示',
+                content: '是否删除该账户配置信息?',
+                onOk() {
+                    that.loading = true
+                    getAction(that.url.delete, {
+                        id: record.id
+                    }).then(res => {
+                        that.loading = false
+                        if (res.success) {
+                            that.$message.success(res.message)
+                            that.getStrategyList()
+                        } else {
+                            that.$message.success(res.message)
+                        }
+                    })
+                }
+            })
+        },
+        filterOption(input, option) {
+            return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
+        },
+
+        //查询按钮事件
+        search() {
+            this.ipagination.current = 1
+            this.getStrategyList()
+        },
+        handleResetForm() {
+            this.accountId = ''
+            this.status = null
+            this.ipagination.current = 1
+            this.getStrategyList()
+        },
+        //点击分页
+        sort(pagination, filters, sorter, { currentDataSource }) {
+            console.log(pagination)
+            this.ipagination.current = pagination.current
+
+            this.ipagination.pageSize = pagination.pageSize
+            this.getStrategyList()
+        },
+
+        getStrategyList() {
+            this.loading = true
+            getAction(this.url.list, {
+                strategyId: this.strategyId == undefined ? null : this.strategyId,
+
+                accountId: this.accountId,
+                pageNo: this.ipagination.current,
+                pageSize: this.ipagination.pageSize,
+                userId: this.userInfo().id,
+                status: this.status
+            }).then(res => {
+                this.data = []
+                console.log(res)
+                this.loading = false
+                if (res.success) {
+                    this.ipagination.total = res.result.total
+
+                    res.result.list.forEach(item => {
+                        item.key = item.id
+                        item.show = false
+                        item.visible = false
+                        item.spin = false
+                        item.openProgramCreateSpin = false
+                    })
+
+                    this.data = res.result.list
+                    this.selectedRowKeys = []
+                }
+            })
+        }
+    },
+    mounted() {
+        this.getStrategyList()
+    },
+
+    activated() {
+        this.getStrategyList()
+    },
+    beforeDestroy() {},
+    filters: {
+        toPercentage(val) {
+            if (val) {
+                if (typeof val != 'string') {
+                    return (val * 100).toFixed(2) + '%'
+                } else {
+                    return val
+                }
+            } else if (typeof val == 'string') {
+                return val
+            } else {
+                return 0
+            }
+        },
+        //保留两位小数并且变成货币格式
+        decimalsHandle(val) {
+            if (val && typeof val != 'string') {
+                if (val >= 0) {
+                    val = parseFloat(val).toFixed(2)
+                    let numberStr = val.toString()
+                    let str = numberStr.split('.')
+
+                    let str0 = str[0].split('').reverse()
+                    for (let i = 0; i < str0.length; i++) {
+                        if ((i + 1) % 4 === 0) {
+                            str0.splice(i, 0, ',')
+                        }
+                    }
+                    str0.reverse()
+                    let handleResult = ''
+                    for (let j = 0; j < str0.length; j++) {
+                        handleResult += str0[j]
+                    }
+
+                    return handleResult + '.' + str[1]
+                } else {
+                    val = parseFloat(val).toFixed(2)
+                    let numberStr = val.toString()
+                    let str = numberStr.split('.')
+
+                    let str0 = str[0]
+                        .substr(1)
+                        .split('')
+                        .reverse()
+                    for (let i = 0; i < str0.length; i++) {
+                        if ((i + 1) % 4 === 0) {
+                            str0.splice(i, 0, ',')
+                        }
+                    }
+                    str0.reverse()
+                    let handleResult = ''
+                    for (let j = 0; j < str0.length; j++) {
+                        handleResult += str0[j]
+                    }
+
+                    return '-' + handleResult + '.' + str[1]
+                }
+            } else if (typeof val == 'string') {
+                return val
+            } else {
+                return 0
+            }
+        },
+        //变成货币格式
+        formatCurrency(val) {
+            if ((val || val == 0) && typeof val != 'string') {
+                let numberStr = val.toString()
+                let str = numberStr.split('').reverse()
+                for (let i = 0; i < str.length; i++) {
+                    if ((i + 1) % 4 === 0) {
+                        str.splice(i, 0, ',')
+                    }
+                }
+                str.reverse()
+                let handleResult = ''
+                for (let j = 0; j < str.length; j++) {
+                    handleResult += str[j]
+                }
+                return handleResult
+            } else if (typeof val == 'string') {
+                return val
+            } else {
+                return '-'
+            }
+        }
+    }
+}
+</script>
+<style lang="scss">
+#closeIcon {
+    color: #0e74d2;
+}
+.toutiaoBatch {
+    .ant-tag .anticon-close {
+        color: #1890ff;
+    }
+    .ant-tag .anticon-close:hover {
+        color: rgba(0, 0, 0, 0.85);
+    }
+}
+
+#batchModal {
+    .rules,
+    .totalPrice {
+        font-weight: 600;
+    }
+
+    .selectePlan {
+        font-size: 14px;
+        font-weight: 700;
+        color: #333;
+        padding: 20px 0;
+    }
+    .totalPrice {
+        margin-left: 20px;
+    }
+    .modifyTable {
+        margin-top: 20px;
+        width: 100%;
+        height: 400px;
+        overflow: auto;
+        font-weight: 600;
+    }
+}
+#copyModal {
+    .ant-modal-header {
+        text-align: center;
+    }
+    .copyTip {
+        font-size: 12px;
+        color: #999;
+    }
+    .copyName {
+        width: 118px;
+        display: inline-block;
+        text-align: right;
+        .copyKeyStart {
+            color: red;
+        }
+    }
+    // font-weight: 600;
+}
+</style>
+<style lang="scss" scoped>
+.toutiaoBatch {
+    .breadcrumb {
+        height: 22px;
+        font-size: 12px;
+        font-family: PingFangSC-Regular, PingFang SC;
+        font-weight: 400;
+        color: #000000;
+        line-height: 22px;
+    }
+    background-color: #fff;
+    padding: 10px 20px;
+    position: relative;
+    width: 100%;
+    .OptinItem {
+        display: inline-block;
+        margin-right: 15px;
+        margin-top: 15px;
+        .ok {
+            margin-right: 15px;
+        }
+    }
+    .OptinItem:first-child {
+        margin-right: 10px;
+    }
+    .topOptions {
+        padding: 15px 0;
+        display: flex;
+        justify-content: space-between;
+        .topOpt {
+            width: 100%;
+            margin-bottom: 10px;
+        }
+    }
+    .optionBtn {
+        // display: inline-block;
+        float: right;
+        // .searchBtn{
+        // margin-right: 10px;
+        // }
+    }
+    .tableArea {
+        .tableOption {
+            padding: 20px 0;
+        }
+    }
+    .toolbox-automate-rules-create-content_title {
+        background-color: #fff;
+        display: flex;
+        flex-flow: row nowrap;
+        justify-content: flex-start;
+        align-items: center;
+        margin-bottom: 28px;
+        position: relative;
+        h3 {
+            font-size: 22px;
+            margin: 0;
+            font-weight: 400;
+            height: 30px;
+            line-height: 30px;
+        }
+        .goNewConfigInfo {
+            position: absolute;
+            right: 0;
+            top: 4px;
+        }
+    }
+}
+</style>

+ 633 - 0
src/views/modules/autoLaunchRevision/components/configLaunchExploreDrawer.vue

@@ -0,0 +1,633 @@
+<style scoped lang="scss">
+/deep/ .ant-drawer-header {
+    border-bottom: 0px;
+    padding: 0;
+}
+/deep/.ant-drawer-body {
+    padding-top: 0;
+}
+/deep/.ant-tooltip-inner {
+    color: #fff !important;
+    background-color: rgba(0, 0, 0, 0.75) !important;
+}
+/deep/.ant-tooltip-arrow::before {
+    color: #fff !important;
+    background-color: rgba(0, 0, 0, 0.75) !important;
+}
+</style>
+<template>
+    <a-drawer width="50%" :visible="exploreVisible" @close="closeDrawer" id="explore">
+        <a-tabs v-model="exploreKey" slot="title">
+            <a-tab-pane key="1" tab="加速探索"> </a-tab-pane>
+            <a-tab-pane key="2" tab="辅助探索" disabled> </a-tab-pane>
+        </a-tabs>
+        <div v-if="exploreKey == '1'" style="padding-bottom:30px">
+            <a-tabs v-model="exploreHistory" @change="checkTab">
+                <a-tab-pane key="1" tab="批量加速探索"> </a-tab-pane>
+                <a-tab-pane key="2" tab="加速探索历史"> </a-tab-pane>
+            </a-tabs>
+            <div v-if="exploreHistory == '1'">
+                <a-form :form="form">
+                    <p style="font-size:16px">
+                        加速探索开启后预算会在6小时内消耗完成,给单元提供更多的曝光机会,使系统对当前单元的判断更加精准,加速探索不一定能使单元探索成功。
+                    </p>
+                    <p style="font-size:16px">
+                        当前预算:<span v-if="nowBudget == 0" style="font-weight:700"> 不限 </span
+                        ><span v-else style="font-weight:700">{{ nowBudget | decimalsHandle }}</span>
+                    </p>
+                    <p style="font-size:16px;">
+                        探索预算
+                        <a-tooltip>
+                            <template slot="title">
+                                注意:此处的预算为单组预算,总预算为:选择广告组数*单组预算 ,总预算不能超过当前账户预算
+                            </template>
+                            <a-icon type="question-circle" /> </a-tooltip
+                        >:
+                        <a-form-item style="display:inline-block;position:relative;top:-5px;margin-bottom:0">
+                            <a-input-number
+                                style="width:200px"
+                                v-decorator="[
+                                    'exploreDudget',
+                                    { rules: [{ required: true, message: '您还未设置加速探索预算,请先设置预算。' }] }
+                                ]"
+                                :min="100"
+                                :max="nowBudget == 0 ? 99999999999999 : nowBudget"
+                                :step="0.01"
+                            />
+                            <span style="margin: 0 10px" v-if="getFormData('exploreDudget')">
+                                可选:{{
+                                    nowBudget == 0 ? '不限' : Math.floor(nowBudget / getFormData('exploreDudget'))
+                                }}
+                            </span>
+                            <span style="margin: 0 10px"> 已选:{{ selectedRowKeys.length }} </span>
+                        </a-form-item>
+                    </p>
+                    <p>
+                        批量选择需要使用探索工具的广告组
+                        <a style="margin-left:15px" @click="allOpen">一键全部开启</a>
+                    </p>
+                </a-form>
+            </div>
+            <div v-else>
+                <a-form layout="inline" :form="formSearch" hide-required-mark :selfUpdate="true">
+                    <a-row :gutter="24" style="margin-bottom:15px">
+                        <a-col :md="8" :sm="8" :xxl="8">
+                            <a-form-item label="广告组ID">
+                                <a-input allow-clear v-decorator="['unitId']" type="text" placeholder="请输入需要搜索的广告组ID" />
+                            </a-form-item>
+                        </a-col>
+                        <!--  -->
+                        <a-col :md="8" :sm="8" :xxl="8">
+                            <a-form-item label="广告组名称" style="    display: flex;">
+                                <a-input
+                                    allow-clear
+                                    v-decorator="['unitName']"
+                                    type="text"
+                                    placeholder="请输入需要搜索的广告组名称"
+
+                                />
+                            </a-form-item>
+                        </a-col>
+                        <a-col :md="8" :sm="8" :xxl="8">
+                            <a-form-item label="状态">
+                                <a-select
+                                    v-decorator="['exploreStatus', { initialValue: 'null' }]"
+                                    placeholder="请选择"
+                                    style="width:200px"
+                                    allow-clear
+                                >
+                                    <a-select-option key="null">
+                                        全选
+                                    </a-select-option>
+                                    <a-select-option :key="1">
+                                        加速探索
+                                    </a-select-option>
+                                    <a-select-option :key="2">
+                                        加速探索手动暂停
+                                    </a-select-option>
+                                    <a-select-option :key="3">
+                                        探索金额完成
+                                    </a-select-option>
+                                    <a-select-option :key="4">
+                                        时间到达截止时间
+                                    </a-select-option>
+                                </a-select>
+                            </a-form-item>
+                        </a-col>
+                    </a-row>
+                    <a-row :gutter="24">
+                        <a-col :md="16" :sm="16" :xxl="16">
+                            <a-form-item label="时间维度">
+                                <a-radio-group v-decorator="['timeRange', { initialValue: 'lastWeek' }]">
+                                    <a-radio-button value="today">
+                                        今天
+                                    </a-radio-button>
+                                    <a-radio-button value="yesterday">
+                                        昨天
+                                    </a-radio-button>
+                                    <a-radio-button value="lastWeek">
+                                        最近七天
+                                    </a-radio-button>
+                                    <a-radio-button value="lastMonth">
+                                        最近一月
+                                    </a-radio-button>
+                                </a-radio-group>
+                            </a-form-item>
+                        </a-col>
+                        <a-col :md="8" :sm="8" :xxl="8">
+                            <span style="float: left; overflow: hidden" class="table-page-search-submitButtons">
+                                <a-button type="primary" icon="search" @click="handleQueryList">查询</a-button>
+                                <a-button type="primary" @click="handleResetForm" icon="reload" style="margin-left:10px"
+                                    >重置</a-button
+                                >
+                            </span>
+                        </a-col>
+                    </a-row>
+                </a-form>
+            </div>
+            <!-- :scroll="{ x: scrollX }" -->
+            <div class="table">
+                <a-table
+                    :columns="exploreColumns"
+                    :data-source="exploreList"
+                    bordered
+                    :pagination="ipagination"
+                    :loading="loading"
+                    :scroll="{ x: changeNum }"
+                    :rowSelection="
+                        exploreHistory == '1' ? { selectedRowKeys: selectedRowKeys, onChange: onSelectChange } : null
+                    "
+                    @change="sort"
+                    rowKey="unit_id"
+                >
+                    <span slot="ocpxActionType" slot-scope="text, record">
+                        {{ text | ocpxActionType }}
+                    </span>
+                </a-table>
+            </div>
+        </div>
+        <div v-else></div>
+        <div
+            v-if="exploreHistory == '1'"
+            :style="{
+                position: 'absolute',
+                right: 0,
+                bottom: 0,
+                width: '100%',
+                borderTop: '1px solid #e9e9e9',
+                padding: '10px 16px',
+                background: '#fff',
+                textAlign: 'right',
+                zIndex: 1
+            }"
+        >
+            <a-button :style="{ marginRight: '8px' }" @click="closeDrawer">
+                取消
+            </a-button>
+            <a-button type="primary" @click="batchOpen" :disabled="selectedRowKeys.length == 0">
+                批量开启
+            </a-button>
+        </div>
+    </a-drawer>
+</template>
+
+<script>
+import moment from 'moment'
+import { getAction, postAction, downFile, downFilePost, deleteAction } from '@/api/manage'
+import qs from 'qs'
+let typeValue = '预算'
+const exploreColumns = [
+    {
+        title: '组名称',
+        dataIndex: 'unit_name',
+        key: 'unit_name',
+        align: 'center',
+        scopedSlots: { customRender: 'unit_name' },
+        width: 200,
+        fixed: 'left'
+    },
+    {
+        title: '消耗',
+        dataIndex: 'charge',
+        key: 'charge',
+        align: 'center',
+        scopedSlots: { customRender: 'charge' },
+        sorter: () => {}
+    },
+    {
+        title: '激活数',
+        dataIndex: 'activation',
+        key: 'activation',
+        align: 'center',
+        scopedSlots: { customRender: 'activation' },
+        sorter: () => {}
+    },
+    {
+        title: '激活成本',
+        dataIndex: 'activationCost',
+        key: 'activationCost',
+        align: 'center',
+        scopedSlots: { customRender: 'activationCost' },
+        sorter: () => {}
+    },
+    {
+        title: '新增付费人数',
+        dataIndex: 'eventPay',
+        key: 'eventPay',
+        align: 'center',
+        scopedSlots: { customRender: 'eventPay' },
+        sorter: () => {}
+    },
+    {
+        title: '新增付费人数成本',
+        dataIndex: 'eventPayCost',
+        key: 'eventPayCost',
+        align: 'center',
+        scopedSlots: { customRender: 'eventPayCost' },
+        sorter: () => {}
+    },
+    {
+        title: '注册数',
+        dataIndex: 'eventRegister',
+        key: 'eventRegister',
+        align: 'center',
+        scopedSlots: { customRender: 'eventRegister' },
+        sorter: () => {}
+    },
+    {
+        title: '注册成本',
+        dataIndex: 'eventRegisterCost',
+        key: 'eventRegisterCost',
+        align: 'center',
+        scopedSlots: { customRender: 'eventRegisterCost' },
+        sorter: () => {}
+    },
+    {
+        title: '曝光数',
+        dataIndex: 'aclick',
+        key: 'aclick',
+        align: 'center',
+        scopedSlots: { customRender: 'aclick' },
+        sorter: () => {}
+    }
+]
+const exploreHistoryColumns = [
+    {
+        title: '广告组ID',
+        dataIndex: 'unitId',
+        key: 'unitId',
+        align: 'center',
+        scopedSlots: { customRender: 'unitId' },
+        fixed: 'left',
+        width: 120
+    },
+    {
+        title: '组名称',
+        dataIndex: 'unitName',
+        key: 'unitName',
+        align: 'center',
+        scopedSlots: { customRender: 'unitName' },
+        fixed: 'left',
+        width: 200
+    },
+    {
+        title: '总消耗',
+        dataIndex: 'totalCharge',
+        key: 'totalCharge',
+        align: 'center',
+        scopedSlots: { customRender: 'totalCharge' },
+        fixed: 'left',
+        width: 100
+    },
+    {
+        title: '探索预算',
+        dataIndex: 'exploreBudget',
+        key: 'exploreBudget',
+        align: 'center',
+        scopedSlots: { customRender: 'exploreBudget' }
+    },
+    {
+        title: '优化目标',
+        dataIndex: 'ocpxActionType',
+        key: 'ocpxActionType',
+        align: 'center',
+        scopedSlots: { customRender: 'ocpxActionType' }
+    },
+    {
+        title: '封面曝光数',
+        dataIndex: 'impression',
+        key: 'impression',
+        align: 'center',
+        scopedSlots: { customRender: 'impression' }
+    },
+    {
+        title: '素材曝光数',
+        dataIndex: 'click',
+        key: 'click',
+        align: 'center',
+        scopedSlots: { customRender: 'click' }
+    },
+    {
+        title: '封面点击数',
+        dataIndex: 'photoClick',
+        key: 'photoClick',
+        align: 'center',
+        scopedSlots: { customRender: 'photoClick' }
+    },
+    {
+        title: '转化数',
+        dataIndex: 'unifiedConversion',
+        key: 'unifiedConversion',
+        align: 'center',
+        scopedSlots: { customRender: 'unifiedConversion' }
+    },
+    {
+        title: '转化成本',
+        dataIndex: 'unitfiedConversionCost',
+        key: 'unitfiedConversionCost',
+        align: 'center',
+        scopedSlots: { customRender: 'unitfiedConversionCost' }
+    },
+    {
+        title: '状态',
+        dataIndex: 'exploreStatus',
+        key: 'exploreStatus',
+        align: 'center',
+        customRender: function(text) {
+            if (text == 0) {
+                return '默认'
+            } else if (text == 1) {
+                return '加速探索'
+            } else if (text == 2) {
+                return '加速探索手动暂停'
+            } else if (text == 3) {
+                return '探索金额完成'
+            } else if (text == 4) {
+                return '时间到达截止时间'
+            }
+        }
+    }
+]
+export default {
+    name: 'strategy-list',
+    components: {},
+    props: {
+        exploreVisible: {
+            type: Boolean,
+            default() {
+                return false
+            }
+        },
+        exploreKey: {
+            type: String,
+            default() {
+                return '1'
+            }
+        }
+    },
+    // mixins: [JeecgListMixin],
+    data() {
+        return {
+            accountId: '',
+            exploreHistory: '1',
+            nowBudget: 0,
+            changeNum: 1500,
+            target: 'charge',
+            order: 'descend',
+            exploreList: [],
+            exploreDudget: null,
+            loading: false,
+            exploreColumns: [...exploreColumns],
+            selectedRowKeys: [],
+            selectedRows: [],
+            form: this.$form.createForm(this),
+            formSearch: this.$form.createForm(this),
+            exploreUrl: '/explore/todaylist',
+            ipagination: {
+                current: 1,
+                pageSize: 10,
+                //   pageSizeOptions: ['10', '20', '30'],
+                showTotal: (total, range) => {
+                    return range[0] + '-' + range[1] + ' 共' + total + '条'
+                },
+                showQuickJumper: true,
+                showSizeChanger: true,
+                pageSizeOptions: ['10', '30', '50'],
+                total: 0,
+                onChange: (current, pageSize) => {
+                    // 切换分页时的回调,
+                    // 当在页面定义change事件时,切记要把此处的事件清除,因为这两个事件重叠了,可能到时候会导致一些莫名的bug
+                    this.ipagination.current = current
+                    this.ipagination.pageSize = pageSize
+                }
+            }
+        }
+    },
+
+    methods: {
+        closeDrawer() {
+            this.exploreList = []
+            this.selectedRowKeys = []
+            this.exploreKey = '1'
+            this.exploreHistory = '1'
+            this.exploreUrl = '/explore/todaylist'
+            this.exploreColumns = [...exploreColumns]
+            this.form.resetFields()
+            this.$emit('update:exploreVisible', false)
+            this.$emit('update:exploreKey', '1')
+            this.$emit('update:accountId', '')
+        },
+        allOpen() {
+            this.form.validateFields((err, values) => {
+                if (!err) {
+                    if (this.nowBudget == 0) {
+                    } else {
+                        if (this.ipagination.total > Math.floor(this.nowBudget / values.exploreDudget)) {
+                            this.$message.error('预算不足,请重新选择广告组!')
+                            return
+                        }
+                    }
+                    let params = {}
+                    params.accountId = this.accountId
+                    params.exploreBudget = values.exploreDudget
+                    let that = this
+                    this.$confirm({
+                        title: '该操作有数倍超预算风险,你还要继续吗?',
+                        onOk() {
+                            that.postDataAction('/explore/openBudgets', params).then(res => {
+                                if (res.success) {
+                                    that.closeDrawer()
+                                    that.$message.success(res.result)
+                                } else {
+                                }
+                            })
+                        },
+                        onCancel() {}
+                    })
+                }
+            })
+        },
+        batchOpen() {
+            this.form.validateFields((err, values) => {
+                if (!err) {
+                    if (this.selectedRowKeys.length == 0) {
+                        this.$message.error('请选择广告组')
+                        return
+                    }
+                    if (this.nowBudget == 0) {
+                    } else {
+                        if (this.selectedRowKeys.length > Math.floor(this.nowBudget / values.exploreDudget)) {
+                            this.$message.error('预算不足,请重新选择广告组!')
+                            return
+                        }
+                    }
+                    let params = {}
+                    params.accountId = this.accountId
+                    params.unitIds = this.selectedRowKeys
+                    params.exploreBudget = values.exploreDudget
+                    let that = this
+                    this.$confirm({
+                        title: '该操作有数倍超预算风险,你还要继续吗?',
+                        onOk() {
+                            that.postDataAction('/explore/openBudgets', params).then(res => {
+                                if (res.success) {
+                                    that.closeDrawer()
+                                    that.$message.success(res.result)
+                                } else {
+                                }
+                            })
+                        },
+                        onCancel() {}
+                    })
+                }
+            })
+        },
+        onSelectChange(selectedRowKeys, selectionRows) {
+            this.selectedRowKeys = selectedRowKeys
+            this.selectionRows = selectionRows
+        },
+        sort(pagination, filters, sorter, { currentDataSource }) {
+            this.ipagination.current = pagination.current
+            this.ipagination.pageSize = pagination.pageSize
+
+            if (sorter.order) {
+                this.order = sorter.order ? sorter.order : 'descend'
+                this.target = sorter.columnKey
+                this.getData(this.accountId, {
+                    target: sorter.columnKey,
+                    order: sorter.order ? sorter.order : 'descend'
+                })
+            } else {
+                if (this.exploreHistory == '2') {
+                    const paramsData = this.formSearch.getFieldsValue()
+                    this.getData(this.accountId, paramsData)
+                } else {
+                    this.getData(this.accountId, null)
+                }
+            }
+        },
+        checkTab(key) {
+            if (key == '1') {
+                this.exploreUrl = '/explore/todaylist'
+                this.changeNum = 1500
+                this.exploreColumns = [...exploreColumns]
+                this.getData(this.accountId, null)
+            } else if (key == '2') {
+                this.exploreUrl = '/explore/historyList'
+                this.cancel()
+                this.ipagination.current = 1
+                this.exploreColumns = [...exploreHistoryColumns]
+                const paramsData = this.formSearch.getFieldsValue()
+                this.getData(this.accountId, paramsData)
+            }
+        },
+        handleQueryList() {
+            this.ipagination.current = 1
+            const paramsData = this.formSearch.getFieldsValue()
+            this.getData(this.accountId, paramsData)
+        },
+        handleResetForm() {
+            this.ipagination.current = 1
+            this.formSearch.resetFields()
+            const paramsData = this.formSearch.getFieldsValue()
+            this.getData(this.accountId, paramsData)
+        },
+        getData(accountId, data) {
+            this.exploreList = []
+            this.loading = true
+            this.accountId = accountId
+            let params = {}
+            params.accountId = accountId
+            params.pageSize = this.ipagination.pageSize
+            params.pageNo = this.ipagination.current
+            if (data && data.target) {
+                params.sortCode = data.target
+                if (data.order == 'descend') {
+                    params.sortType = 'DESC'
+                } else {
+                    params.sortType = 'ASC'
+                }
+            } else {
+                if (this.exploreHistory == '2') {
+                    params.unitId = data.unitId ? data.unitId : null
+                    params.unitName = data.unitName ? data.unitName : null
+                    params.exploreStatus = data.exploreStatus == 'null' ? null : data.exploreStatus
+                    switch (data.timeRange) {
+                        case 'today':
+                            params.startTime = moment().format('YYYY-MM-DD')
+                            params.endTime = moment().format('YYYY-MM-DD')
+                            break
+                        case 'yesterday':
+                            params.startTime = moment()
+                                .subtract(1, 'days')
+                                .format('YYYY-MM-DD')
+                            params.endTime = moment()
+                                .subtract(1, 'days')
+                                .format('YYYY-MM-DD')
+                            break
+                        case 'lastWeek':
+                            params.startTime = moment()
+                                .subtract(6, 'days')
+                                .format('YYYY-MM-DD')
+                            params.endTime = moment().format('YYYY-MM-DD')
+                            break
+                        case 'lastMonth':
+                            params.startTime = moment()
+                                .subtract(1, 'months')
+                                .format('YYYY-MM-DD')
+                            params.endTime = moment().format('YYYY-MM-DD')
+                            break
+                        default:
+                            params.startTime = moment()
+                                .subtract(6, 'days')
+                                .format('YYYY-MM-DD')
+                            params.endTime = moment().format('YYYY-MM-DD')
+                            break
+                    }
+                } else {
+                    params.sortCode = this.target
+                    params.sortType = this.order == 'descend' ? 'DESC' : 'ASC'
+                }
+            }
+            this.postDataAction(this.exploreUrl, params)
+                .then(res => {
+                    this.loading = false
+                    if (res.success) {
+                        this.nowBudget = res.result.dayBudget ? res.result.dayBudget : 0
+                        this.exploreList = res.result.pageInfo.list
+                        this.ipagination.total = res.result.pageInfo.total
+                    }
+                })
+                .catch(err => {
+                    // 3、调用取消 注意:要写在catch回调函数里
+                })
+        },
+        getFormData(className) {
+            return this.form.getFieldValue(className)
+        }
+    },
+    mounted() {},
+
+    filters: {}
+}
+</script>

+ 96 - 0
src/views/modules/autoLaunchRevision/components/editablCell.vue

@@ -0,0 +1,96 @@
+<template>
+    <div class="editable-cell">
+        <div v-if="editable" class="editable-cell-input-wrapper">
+            <a-input :value="value" @change="handleChange" @pressEnter="check" /><a-icon
+                type="check"
+                class="editable-cell-icon-check"
+                @click="check"
+            />
+        </div>
+        <div v-else class="editable-cell-text-wrapper">
+            <div
+                style="width:90%;
+                overflow:hidden;
+                text-overflow:ellipsis;
+                white-space:nowrap;"
+                :title="value"
+            >
+                {{ value || '' }}
+            </div>
+
+            <a-icon type="edit" class="editable-cell-icon" :style="{ top: value ? '10px' : '0px' }" @click="edit" />
+        </div>
+    </div>
+</template>
+
+<script>
+export default {
+    props: {
+        text: String
+    },
+    data() {
+        return {
+            value: this.text,
+            editable: false
+        }
+    },
+    methods: {
+        handleChange(e) {
+            const value = e.target.value
+            this.value = value
+        },
+        check() {
+            this.editable = false
+            this.$emit('change', this.value)
+        },
+        edit() {
+            this.editable = true
+        }
+    }
+}
+</script>
+<style lang="scss" scoped>
+.editable-cell {
+    position: relative;
+}
+
+.editable-cell-input-wrapper,
+.editable-cell-text-wrapper {
+    padding-right: 24px;
+}
+
+.editable-cell-text-wrapper {
+    padding: 5px 24px 5px 5px;
+}
+
+.editable-cell-icon,
+.editable-cell-icon-check {
+    position: absolute;
+    right: 0;
+    width: 20px;
+    top: 10px;
+    cursor: pointer;
+}
+
+.editable-cell-icon {
+    line-height: 18px;
+    display: none;
+}
+
+.editable-cell-icon-check {
+    line-height: 28px;
+}
+
+.editable-cell:hover .editable-cell-icon {
+    display: inline-block;
+}
+
+.editable-cell-icon:hover,
+.editable-cell-icon-check:hover {
+    color: #108ee9;
+}
+
+.editable-add-btn {
+    margin-bottom: 8px;
+}
+</style>

+ 429 - 0
src/views/modules/autoLaunchRevision/components/selectRegion.vue

@@ -0,0 +1,429 @@
+<style scoped>
+  .transfer {
+    display: flex;
+  }
+
+  .transfer .transfer-box {
+    width: 350px;
+    height: 250px;
+    border: 1px solid #dadfe3;
+    display: flex;
+    overflow-x: auto;
+    overflow-y: hidden;
+    box-sizing: border-box;
+    margin-right: 25px;
+  }
+
+  .content-box {
+    min-width: 174px;
+    width: 100%;
+    height: 100%;
+    border-right: 1px solid #dadfe3;
+  }
+
+  .content-box .content-title {
+    width: 100%;
+    background: #f8f9fa;
+    border-bottom: 1px solid #dadfe3;
+    padding: 5px 15px;
+    font-size: 16px;
+    font-weight: 700;
+    line-height: 30px;
+  }
+
+  .content-box .content {
+    width: 100%;
+    height: 85%;
+    overflow: auto;
+  }
+
+  .content-box .content p:hover {
+    background: #edf1f5;
+    cursor: pointer;
+  }
+
+  .content-box .content p:hover span {
+    display: inline-block;
+  }
+
+  .content-box .content p span {
+    display: none;
+  }
+
+  p {
+    padding: 5px;
+    margin-bottom: 0;
+    border-bottom: 1px solid #f2f2f2;
+  }
+
+  .backgroundOnly {
+    background: #edf1f5;
+  }
+</style>
+<style>
+  .transfer .ant-checkbox-group {
+    width: 100px;
+    overflow-x: hidden;
+  }
+
+  .transfer .ant-checkbox-group-item {
+    display: inline-block;
+    margin-right: 8px;
+    width: 100%;
+  }
+</style>
+
+<template>
+  <div class="transfer">
+    <div class="transfer-box">
+      <div class="content-box">
+        <p class="content-title">省份</p>
+        <div class="content" style="position:relative">
+          <!-- <div style="position:absolute;top:0;left:0;width:100%;height:100%;background: rgba(0, 0, 0, 0.5)"
+            v-if="loading"></div> -->
+          <p><input type="checkbox" class="select_all" @change="checkAllBox" v-model="checkAll" /> 全选</p>
+
+          <p v-for="(item, index) of province" :key="item.value" :class="{ backgroundOnly: provinceIndex == index }">
+            <input class="checkItem" type="checkbox" :value="item.value" :id="item.value" v-model="checkMatched"
+              @change="checkOne(item, index)" />
+            <span @click="showCity(item, index)" style="color:black;display:inline-block;margin-left:5px;width:80%">{{
+              item.label
+            }}</span>
+          </p>
+        </div>
+      </div>
+      <div class="content-box" :style="{ borderRight: !showClass ? '0px' : '1px solid #dadfe3' }" v-show="showCityData">
+        <p class="content-title">城市</p>
+        <div class="content">
+          <!-- <p>
+            <input
+              type="checkbox"
+              class="select_all"
+              @change="checkAllBoxCity"
+              v-model="checkAllCity"
+            /> 全选
+          </p>-->
+          <p v-for="(item, index) of city" :key="item.id" :class="{ backgroundOnly: cityIndex == index }">
+            <input class="checkItem" type="checkbox" :value="item.value" :id="item.value" v-model="checkMatchedCity"
+              @change="checkOneCity(item, index)" />
+            {{ item.label }}
+          </p>
+        </div>
+      </div>
+    </div>
+    <div class="transfer-box" style="width:176px">
+      <div class="content-box">
+        <p class="content-title">
+          已选
+          <span style="float:right;font-weight:normal;color:blue;cursor: pointer;font-size:14px"
+            @click="clear">清空</span>
+        </p>
+        <div class="content">
+          <p v-for="(item, index) of checkData" :key="index">
+            {{ item.label }}
+            <!-- <span
+              style="float:right;font-weight:normal;color:blue;cursor: pointer;font-size:14px"
+              @click="detele(item,index)"
+            >删除</span>-->
+          </p>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+  import {
+    JeecgListMixin
+  } from '@/mixins/JeecgListMixin'
+  import {
+    getProvince,
+    postAction
+  } from '@/api/manage'
+  import $ from 'jquery'
+  export default {
+    name: 'ByteDanceUserOrientationTemplateList',
+    components: {},
+    props: ['dataValue'],
+    data() {
+      return {
+        showClass: false,
+        showCityData: false,
+        checkData: [],
+        checkMatched: [],
+        province: [],
+        city: [],
+        area: [],
+        CityData: '/kuaishou/batch/getRegion',
+        provinceIndex: null,
+        cityIndex: null,
+        checkAll: false,
+        checkMatchedCity: [],
+        checkAllCity: false,
+        nowProvince: null,
+        loading: false
+      }
+    },
+    computed: {},
+    mounted() {
+      this.$nextTick(() => {
+        this.getData().then(() => {
+            console.log(this.dataValue)
+          if (this.dataValue.length>0&&this.dataValue[0].value) {
+            return
+          } else {
+            postAction('/kuaishou/batch/getRegionDetail', {
+              regionArr: this.dataValue
+            }).then(res => {
+              if (res.success) {
+                //   this.populationData.allForm.region = res.result
+                this.checkData = res.result
+                this.checkMatched = res.result.map(item => {
+                  return item.value
+                })
+                this.checkMatchedCity = res.result.map(item => {
+                  return item.value
+                })
+                this.$emit('update:checkData', this.checkData)
+              }
+            })
+          }
+
+          //   if (this.dataValue.length > 0) {
+
+          //   }
+        })
+
+      })
+    },
+    watch: {
+      dataValue: {
+        deep: true,
+        immediate: true, // immediate选项可以开启首次赋值监听
+        handler(n, o) {
+          if (n.length > 0 && n[0].value) {
+            // this.getData().then(() => {
+            console.log(1)
+            //   if (n.length > 0) {
+            this.$nextTick(() => {
+              this.checkData = n
+              this.checkMatched = n.map(item => {
+                return item.value
+              })
+              this.checkMatchedCity = n.map(item => {
+                return item.value
+              })
+              this.$emit('update:checkData', this.checkData)
+            })
+            //   }
+            // })
+
+          }
+
+        }
+      }
+    },
+    methods: {
+      getData() {
+        this.loading = true
+        var that = this
+        return new Promise(function (resolve, reject) {
+          getProvince(that.CityData, {
+            level: 1
+          }).then(res => {
+            if (res.code == '0') {
+              //   this.province.push(...res.result.records)
+              that.province = res.result.map(item => {
+                return {
+                  label: item.name,
+                  value: item.regionId
+                }
+              })
+              that.province = that.province.filter(item => {
+                return item.label != '台湾' && item.label != '香港' && item.label != '澳门'
+              })
+              that.loading = false
+              resolve()
+            }
+          })
+        })
+
+      },
+      showCity(item, index) {
+        this.city = []
+        this.showCityData = false
+        this.showClass = false
+        this.provinceIndex = index
+        this.cityIndex = null
+        this.nowProvince = item
+        this.checkMatchedCity = []
+        getProvince(this.CityData, {
+          parent: item.value
+        }).then(res => {
+          if (res.code == '0') {
+            this.city = res.result.map(item => {
+              return {
+                label: item.name,
+                value: item.regionId
+              }
+            })
+            if (this.checkMatched.indexOf(item.value) != -1) {
+              this.checkAllCity = true
+              this.checkMatchedCity = this.city.map(item => {
+                return item.value
+              })
+            } else {
+              this.checkMatchedCity = this.checkData.map(item => {
+                return item.value
+              })
+            }
+            //   this.city.push(...res.result.records)
+            this.showCityData = true
+          }
+        })
+      },
+      checkAllBox() {
+        this.checkMatched = []
+        this.checkData = []
+        if (this.checkAll) {
+          this.checkMatched = this.province.map(item => {
+            return item.value
+          })
+          this.checkData.push(...this.province)
+        } else {
+          this.checkMatched = []
+          this.checkData = []
+          this.checkMatchedCity = []
+        }
+        this.$emit('update:checkData', this.checkData)
+      },
+      checkOne(item, index) {
+        if (this.checkMatched.indexOf(item.value) == -1) {
+          var index1 = this.checkData.findIndex(v => v.value === item.value)
+          this.checkData.splice(index1, 1)
+          if (this.nowProvince) {
+            if (this.nowProvince.value == item.value) {
+              this.checkMatchedCity = []
+            }
+          }
+        } else {
+          this.checkData.push(item)
+          var data = []
+          getProvince(this.CityData, {
+            parent: item.value
+          }).then(res => {
+            if (res.code == '0') {
+              data = res.result.map(item => {
+                return {
+                  label: item.name,
+                  value: item.regionId
+                }
+              })
+              for (var i = 0; i < this.checkData.length; i++) {
+                for (let j = 0; j < data.length; j++) {
+                  if (this.checkData[i].value == data[j].value) {
+                    this.checkData.splice(i, 1)
+                  }
+                }
+              }
+            }
+          })
+
+          if (this.nowProvince) {
+            if (item.value == this.nowProvince.value) {
+              this.checkMatchedCity = this.city.map(item => {
+                return item.value
+              })
+            }
+          }
+        }
+        if (this.checkMatched.length == this.province.length) {
+          this.checkAll = true
+        } else {
+          this.checkAll = false
+        }
+        this.$emit('update:checkData', this.checkData)
+      },
+      checkAllBoxCity() {
+        this.checkMatchedCity = []
+        if (this.checkAllCity) {
+          this.checkMatchedCity = this.city.map(item => {
+            return item.value
+          })
+          this.checkMatched.push(this.nowProvince.value)
+          this.checkData.push(this.nowProvince)
+        } else {
+          this.checkMatchedCity = []
+          var index = this.checkData.findIndex(v => v.value === this.nowProvince.value)
+          var index1 = this.checkMatched.findIndex(v => v === this.nowProvince.value)
+          this.checkData.splice(index, 1)
+          this.checkMatched.splice(index1, 1)
+        }
+        this.$emit('update:checkData', this.checkData)
+      },
+      checkOneCity(item, index) {
+        var allCity = this.checkMatchedCity.filter(v => {
+          return v.toString().slice(0, 2) == this.nowProvince.value
+        })
+
+        if (allCity.length == this.city.length) {
+          this.checkMatched.push(this.nowProvince.value)
+          this.checkData.push(this.nowProvince)
+          for (var i = 0; i < allCity.length; i++) {
+            for (var j = 0; j < this.checkData.length; j++) {
+              if (allCity[i] == this.checkData[j].value) {
+                this.checkData.splice(j, 1)
+                j--
+              }
+            }
+          }
+        }
+        if (this.checkMatchedCity.indexOf(item.value) != -1) {
+          if (allCity.length != this.city.length) {
+            this.checkData.push(item)
+          }
+          if (this.checkMatched.length == this.province.length) {
+            this.checkAll = true
+          } else {
+            this.checkAll = false
+          }
+        } else {
+          if (this.checkMatched.indexOf(this.nowProvince.value) != -1) {
+            var index1 = this.checkData.findIndex(v => v.value === this.nowProvince.value)
+            var index2 = this.checkMatched.findIndex(v => v === this.nowProvince.value)
+            this.checkData.splice(index1, 1)
+            this.checkMatched.splice(index2, 1)
+            this.checkAll = false
+            var data = this.city.filter(v => {
+              return v.value != item.value
+            })
+            this.checkData.push(...data)
+          } else {
+            var index1 = this.checkData.findIndex(v => v.value === item.value)
+            this.checkData.splice(index1, 1)
+          }
+        }
+        this.$emit('update:checkData', this.checkData)
+      },
+      clear() {
+        this.checkData = []
+        this.checkMatched = []
+        this.checkMatchedCity = []
+        this.checkAll = false
+        this.$emit('update:checkData', this.checkData)
+      },
+      detele(item, index) {
+        //   if (this.checkMatched.indexOf(this.nowProvince.value) != -1) {
+        var index1 = this.checkMatched.findIndex(v => v === item.value)
+        var index2 = this.checkData.findIndex(v => v.value === item.value)
+        this.checkData.splice(index2, 1)
+        this.checkMatched.splice(index1, 1)
+        this.checkAll = false
+        //   } else {
+        //   }
+
+        this.$emit('update:checkData', this.checkData)
+      }
+    }
+  }
+</script>

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 1597 - 0
src/views/modules/autoLaunchRevision/components/targetedPopulation.vue


+ 340 - 0
src/views/modules/autoLaunchRevision/components/templateModal.vue

@@ -0,0 +1,340 @@
+<style>
+#table_time_selected1 tr {
+    border: 1px solid rgb(102, 162, 243);
+}
+
+.plug-timer-grid th {
+    line-height: 25px;
+}
+
+.group-creat .ant-form-item-required::before {
+    display: inline-block;
+    margin-right: 4px;
+    color: #f5222d;
+    font-size: 14px;
+    font-family: SimSun, sans-serif;
+    line-height: 1;
+    content: '';
+}
+
+.else-label .ant-form-item-label label::after {
+    content: '';
+    position: relative;
+    top: -0.5px;
+    margin: 0 8px 0 2px;
+}
+.ant-form-item-required::before {
+    display: inline-block;
+    margin-right: 4px;
+    color: #f5222d;
+    font-size: 14px;
+    font-family: SimSun, sans-serif;
+    line-height: 1;
+    content: '*';
+}
+</style>
+<style lang="scss" scoped>
+.require-check {
+    /deep/ .ant-form-item-label {
+        label::before {
+            display: inline-block;
+            margin-right: 4px;
+            color: #f5222d;
+            font-size: 14px;
+            font-family: SimSun, sans-serif;
+            line-height: 1;
+            content: '*';
+        }
+    }
+}
+</style>
+<template>
+    <a-modal v-model="visible" :title="type === 'add' ? '新建定向包' : '修改定向包'" :width="1100" v-if="visible">
+        <a-spin :spinning="spinning">
+            <a-form @submit="handleSubmit" :form="form">
+                <a-row :gutter="24">
+                    <a-col :md="24" :sm="24" :xxl="24">
+                        <a-form-item
+                            label="账户ID"
+                            :labelCol="{ lg: { span: 7 }, sm: { span: 7 } }"
+                            :wrapperCol="{ lg: { span: 12 }, sm: { span: 12 } }"
+                            class="require-check"
+                        >
+                            <!-- <a-input v-model="accountId" :disabled="disabled"></a-input> -->
+                            {{ accountId }}
+                        </a-form-item>
+                    </a-col>
+                </a-row>
+                <a-form-item
+                    label="定向包名称"
+                    :labelCol="{ lg: { span: 7 }, sm: { span: 7 } }"
+                    :wrapperCol="{ lg: { span: 12 }, sm: { span: 12 } }"
+                >
+                    <a-input
+                        v-decorator="[
+                            'templateName',
+                            {
+                                rules: [
+                                    { required: true, message: '模板名称必填' },
+                                    { min: 1, max: 30, message: '请输入1-30个字', trigger: 'blur' }
+                                ]
+                            }
+                        ]"
+                    ></a-input>
+                </a-form-item>
+
+                <targeted-population
+                    ref="population"
+                    :populationData.sync="populationData"
+                    :accountId.sync="accountId"
+                />
+            </a-form>
+        </a-spin>
+        <template slot="footer">
+            <!-- <a-button type="primary" @click="handleSubmit" :loading="loading"> 确定 </a-button> -->
+            <a-button
+                type="default"
+                @click="
+                    () => {
+                        this.visible = false
+                    }
+                "
+            >
+                取消
+            </a-button>
+            <a-button type="primary" @click="handleSubmit" :loading="loading">
+                {{ type == 'add' ? '确定' : '修改' }}
+            </a-button>
+        </template>
+    </a-modal>
+</template>
+
+<script>
+import { getAction, postAction, deleteAction, putAction } from '@/api/manage'
+import moment from 'moment'
+import { mapGetters } from 'vuex'
+import jq from 'jquery'
+import selectTable from '@/views/modules/Statistics/components/selectPagination.vue'
+import targetedPopulation from './targetedPopulation.vue'
+import pick from 'lodash.pick'
+export default {
+    name: 'new-mould',
+    components: {
+        targetedPopulation,
+        selectTable
+    },
+    data() {
+        return {
+            visible: false,
+            spinning: false,
+            projectName: '',
+            form: this.$form.createForm(this),
+            projectId: '',
+            populationData: {},
+            accountId: '',
+            templateId: undefined,
+            type: 'add',
+            loading: false,
+            labelCol: { lg: { span: 7 }, sm: { span: 7 } },
+            disabled: false
+        }
+    },
+    computed: {},
+    methods: {
+        create(accountId, type) {
+            this.disabled = false
+            this.spinning = false
+            this.visible = true
+            this.type = type
+            this.populationData = {}
+            this.accountId = accountId
+            localStorage.setItem('createLaunch', accountId)
+        },
+        handleOk(item, type) {
+            this.spinning = true
+            this.visible = true
+            this.type = type
+            var params = {}
+            params.id = item.id
+            this.accountId = item.accountId
+            this.templateId = item.id
+            getAction('/auto/aiKuaishouAccountAutoTarget/queryById', params).then(res => {
+                if (res.success) {
+                    var dataJson = {
+                        ...res.result,
+                        templateName: res.result.targetName
+                    }
+
+                    this.populationData = dataJson
+
+                    this.populationData.devicePrice = dataJson.devicePrice ? JSON.parse(dataJson.devicePrice) : null
+                    this.populationData.appInterest = dataJson.appInterest ? JSON.parse(dataJson.appInterest) : null
+                    this.populationData.businessInterest = dataJson.businessInterest
+                        ? JSON.parse(dataJson.businessInterest)
+                        : null
+                    this.populationData.fansStar = dataJson.fansStar ? JSON.parse(dataJson.fansStar) : null
+                    this.populationData.interestVideo = dataJson.interestVideo
+                        ? JSON.parse(dataJson.interestVideo)
+                        : null
+                    this.populationData.deviceBrand = dataJson.deviceBrand ? JSON.parse(dataJson.deviceBrand) : null
+
+                    this.populationData.age = dataJson.min ? [dataJson.min, dataJson.max] : []
+                    this.populationData.agesRange = dataJson.agesRange ? JSON.parse(dataJson.agesRange) : []
+                    this.populationData.devicePrice = dataJson.devicePrice ? dataJson.devicePrice : null
+
+                    // this.populationData.behavior = dataJson.label
+                    // this.populationData.interest = dataJson.interestLabel
+
+                    // this.populationData.sceneType = dataJson.sceneType ? JSON.parse(dataJson.sceneType) : []
+                    this.populationData.allForm = {}
+                    var population = dataJson.population ? JSON.parse(dataJson.population) : null
+                    var excludePopulation = dataJson.excludePopulation ? JSON.parse(dataJson.excludePopulation) : null
+                    this.populationData.allForm.people =
+                        population && excludePopulation && excludePopulation.length > 0 && population.length > 0
+                            ? '3'
+                            : population &&
+                              population.length > 0 &&
+                              (!excludePopulation || excludePopulation.length == 0)
+                            ? '1'
+                            : (!population || population.length == 0) &&
+                              excludePopulation &&
+                              excludePopulation.length > 0
+                            ? '2'
+                            : (!population || population.length == 0) &&
+                              (!excludePopulation || excludePopulation.length == 0)
+                            ? '0'
+                            : '0'
+                    this.populationData.allForm.tabKey =
+                        this.populationData.allForm.people == '0'
+                            ? '1'
+                            : this.populationData.allForm.people == '1'
+                            ? '1'
+                            : this.populationData.allForm.people == '2'
+                            ? '2'
+                            : '1'
+                    this.populationData.allForm.incluedSelectedRowKeys =
+                        dataJson.population && dataJson.population.length > 0 ? dataJson.population : []
+                    this.populationData.allForm.incluedSelectedKeys =
+                        dataJson.population && dataJson.population.length > 0 ? dataJson.population : []
+                    this.populationData.allForm.excludeSelectedKeys =
+                        dataJson.excludePopulation && dataJson.excludePopulation.length > 0
+                            ? dataJson.excludePopulation
+                            : []
+                    this.populationData.allForm.excludeSelectedRowKeys =
+                        dataJson.excludePopulation && dataJson.excludePopulation.length > 0
+                            ? dataJson.excludePopulation
+                            : []
+                    this.populationData.allForm.regionType =
+                        dataJson.region && JSON.parse(dataJson.region).length > 0 ? 'limit' : 'noLimit'
+
+                    this.populationData.allForm.region = dataJson.region
+                    // postAction('/kuaishou/batch/getRegionDetail', {
+                    //   regionArr: dataJson.region
+                    // }).then(res => {
+                    //   console.log(res, 11111)
+                    //   if (res.success) {
+                    //     this.populationData.allForm.region = res.result
+                    //   }
+                    // })
+
+                    this.populationData.allForm.ageType =
+                        dataJson.agesRange.length > 0 ? 'ageLimit' : dataJson.min > 0 ? 'ageCustom' : 'noLimit'
+                    this.populationData.allForm.device =
+                        dataJson.deviceBrand && eval(dataJson.deviceBrand).length > 0 ? '1' : '0'
+                    this.populationData.allForm.price =
+                        dataJson.devicePrice && eval(dataJson.devicePrice).length > 0 ? '1' : '0'
+                    this.populationData.allForm.appType =
+                        dataJson.appInterest && eval(dataJson.appInterest).length > 0
+                            ? '1'
+                            : dataJson.appIds && eval(dataJson.appIds).length > 0
+                            ? '2'
+                            : '0'
+                    this.populationData.allForm.fansStar =
+                        dataJson.fansStar && eval(dataJson.fansStar).length > 0 ? '1' : '0'
+                    this.populationData.allForm.interestVideo =
+                        dataJson.interestVideo && eval(dataJson.interestVideo).length > 0 ? '1' : '0'
+                    this.populationData.allForm.platform_os = dataJson.platformOs
+                    this.populationData.allForm.businessInterestType = dataJson.businessInterestType
+                    this.populationData.allForm.isOpen = dataJson.isOpen
+                    this.populationData.allForm.noAgeBreak = dataJson.noAgeBreak + ''
+                    this.populationData.allForm.noGenderBreak = dataJson.noGenderBreak + ''
+                    this.populationData.allForm.noAreaBreak = dataJson.noAreaBreak + ''
+                    // this.populationData.allForm.behaviorInterest = dataJson.label && dataJson.label != '[]' ? '1' : '0'
+                    this.populationData.allForm.checkArr =
+                        this.populationData.allForm.appType == '2' ? JSON.parse(dataJson.appIds) : []
+                    this.populationData.projectId = dataJson.projectId + ''
+
+                    this.disabled = true
+
+                    this.$nextTick(() => {
+                        console.log(dataJson)
+                        this.form.setFieldsValue(pick(dataJson, ['templateName']))
+                        this.spinning = false
+                    })
+                }
+            })
+        },
+        handleCancel(e) {
+            this.visible = false
+        },
+        handleSubmit(e) {
+            //   this.$refs.population.handleSubmit()
+
+            e.preventDefault()
+            this.$refs.population.handleSubmit()
+            this.$refs.population.formAll.validateFields((err, value) => {
+                if (this.populationData.allForm.appType == '2') {
+                    if (this.populationData.appIds.length == 0) {
+                        this.$message.error('APP名称未选择')
+                    }
+                }
+                if (!err) {
+                    this.form.validateFieldsAndScroll((err, values) => {
+                        if (!err) {
+                            // this.loading = true
+                            if (this.accountId) {
+                                var params = {
+                                    ...this.populationData,
+                                    targetName: values.templateName,
+                                    accountId: this.accountId
+                                }
+                                // params.label = params.behavior ? JSON.stringify(params.behavior) : '[]'
+                                // params.interestLabel = params.interest ? JSON.stringify(params.interest) : '[]'
+                                if (this.type == 'add') {
+                                    postAction('/auto/aiKuaishouAccountAutoTarget/addLocalTarget', params).then(res => {
+                                        if (res.success) {
+                                            this.visible = false
+                                            this.loading = false
+                                            this.$emit('getData')
+                                        } else {
+                                            this.loading = false
+                                            this.$message.error(res.message)
+                                        }
+                                    })
+                                } else if (this.type == 'edit') {
+                                    params.id = this.templateId
+                                    postAction('/auto/aiKuaishouAccountAutoTarget/updateLocalTarget', params).then(
+                                        res => {
+                                            this.loading = false
+                                            if (res.success) {
+                                                this.visible = false
+                                                
+                                                this.$emit('getData')
+                                            } else {
+                                                // this.loading = false
+                                                this.$message.error(res.message)
+                                            }
+                                        }
+                                    )
+                                }
+                            } else {
+                                this.$message.error('请选择项目')
+                            }
+                        }
+                    })
+                }
+            })
+        }
+    }
+}
+</script>

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 4802 - 0
src/views/modules/autoLaunchRevision/createLaunch.vue


+ 4 - 2
src/views/modules/kuaishouapp/account/stepForm/stepModule/targetedPopulation.vue

@@ -555,7 +555,7 @@ li:hover {
         <a-radio-button :value="2">广告计划</a-radio-button>
         <a-radio-button :value="2">广告计划</a-radio-button>
         <a-radio-button :value="3">本账户</a-radio-button>
         <a-radio-button :value="3">本账户</a-radio-button>
         <a-radio-button :value="4">公司主体</a-radio-button>
         <a-radio-button :value="4">公司主体</a-radio-button>
-        <a-radio-button :value="5">APP</a-radio-button>
+        <a-radio-button :value="5" v-if="!populationData.checkApp">APP</a-radio-button>
       </a-radio-group>
       </a-radio-group>
     </a-form-item>
     </a-form-item>
     <a-form-item
     <a-form-item
@@ -1183,7 +1183,9 @@ export default {
               jsonData = {}
               jsonData = {}
             }
             }
           }
           }
-
+          if(this.populationData.checkApp){
+            jsonData.checkApp = 'none'
+          }
           var dataJson = {
           var dataJson = {
             ...values,
             ...values,
             platformOs: this.allForm.platform_os,
             platformOs: this.allForm.platform_os,

+ 9 - 1
src/views/modules/kuaishouapp/batchCreation/campaignList.vue

@@ -1090,7 +1090,15 @@ export default {
       })
       })
     },
     },
   },
   },
-  watch: {},
+  watch: {
+    appId(n, o) {
+      if(!n){
+        this.dataList = []
+        this.cost = 0
+        this.balance = 0
+      }
+    }
+  },
 
 
   computed: {},
   computed: {},
   activated() {
   activated() {

+ 256 - 109
src/views/modules/kuaishouapp/batchCreation/creat/creatUnit.vue

@@ -37,9 +37,20 @@
         :wrapperCol="{ lg: { span: 10 }, sm: { span: 17 } }"
         :wrapperCol="{ lg: { span: 10 }, sm: { span: 17 } }"
         >
         >
             <div style="color:red">
             <div style="color:red">
-                {{createCount}}
+                {{getData('unitType') == '4' ? createCount.ctmCount : createCount.pgdCount  }}
             </div>
             </div>
         </a-form-item>
         </a-form-item>
+      <a-form-item
+        label="创意制作方式"
+        :labelCol="{ lg: { span: 7 }, sm: { span: 7 } }"
+        :wrapperCol="{ lg: { span: 10 }, sm: { span: 17 } }"
+      >
+        <a-radio-group buttonStyle="solid" v-decorator="['unitType', { initialValue: '4' }]" @change="changeUnitType">
+          <a-radio-button value="4">自定义</a-radio-button>
+          <a-radio-button value="7">程序化</a-radio-button>
+        </a-radio-group>
+      </a-form-item>
+
         
         
       <a-form-item
       <a-form-item
         label="目标应用"
         label="目标应用"
@@ -593,6 +604,7 @@
         label="创建类型"
         label="创建类型"
         :labelCol="{ lg: { span: 7 }, sm: { span: 7 } }"
         :labelCol="{ lg: { span: 7 }, sm: { span: 7 } }"
         :wrapperCol="{ lg: { span: 10 }, sm: { span: 17 } }"
         :wrapperCol="{ lg: { span: 10 }, sm: { span: 17 } }"
+        v-if="getData('unitType')=='4'"
       >
       >
          <a-radio-group
          <a-radio-group
           buttonStyle="solid"
           buttonStyle="solid"
@@ -604,18 +616,18 @@
         </a-radio-group>
         </a-radio-group>
       </a-form-item>
       </a-form-item>
       <a-form-item
       <a-form-item
-        v-if="getData('createType')=='0'"
-        label="封面数"
+        v-if="getData('unitType')=='7' || getData('createType')!='1'"
+        :label="getData('unitType')=='7'?'视频数':'封面数'"
         :labelCol="{ lg: { span: 7 }, sm: { span: 7 } }"
         :labelCol="{ lg: { span: 7 }, sm: { span: 7 } }"
         :wrapperCol="{ lg: { span: 10 }, sm: { span: 17 } }"
         :wrapperCol="{ lg: { span: 10 }, sm: { span: 17 } }"
       >
       >
          <a-input-number
          <a-input-number
-          :max="15"
-          :min="1"
+          :max="getData('unitType')=='7'?10:15"
+          :min="getData('unitType')=='7'?3:1"
           v-decorator="[
           v-decorator="[
             'imageCount',
             'imageCount',
             {
             {
-              rules: [{ required: true, message: '封面数必填' }],
+              rules: [{ required: true, message: '数量必填必填' }],
               initialValue: 5,
               initialValue: 5,
             },
             },
           ]"
           ]"
@@ -629,7 +641,11 @@
         :labelCol="{ lg: { span: 7 }, sm: { span: 7 } }"
         :labelCol="{ lg: { span: 7 }, sm: { span: 7 } }"
         :wrapperCol="{ lg: { span: 10 }, sm: { span: 17 } }"
         :wrapperCol="{ lg: { span: 10 }, sm: { span: 17 } }"
       >
       >
-        <a @click="getVideoList()">选择视频</a> {{ videoList.length + '/' + (getData('createType')=='0'?getData('createCount'):getData('createCount')*15) }}
+        <a @click="getVideoList()">选择视频</a> 
+        {{ videoList.length + '/' + (getData('unitType')=='4'
+        ?(getData('createType')=='0'?
+        getData('createCount'):getData('createCount')*15)
+        :getData('createCount')*getData('imageCount')) }}
         <br />
         <br />
         <div v-if="videoList.length > 0 && showVideo" style="display:flex;flex-wrap:wrap">
         <div v-if="videoList.length > 0 && showVideo" style="display:flex;flex-wrap:wrap">
           <span v-for="(item, index) of videoList" :key="index" style="position: relative" class="width-video">
           <span v-for="(item, index) of videoList" :key="index" style="position: relative" class="width-video">
@@ -645,39 +661,48 @@
       >
       >
       <!-- v-model.trim="allForm.description" -->
       <!-- v-model.trim="allForm.description" -->
       <!-- @keyup="getData('description')?getData('description')=this.value.replace(/^ +| +$/g,'')" -->
       <!-- @keyup="getData('description')?getData('description')=this.value.replace(/^ +| +$/g,'')" -->
-        <a @click="showTitle()">推荐广告语</a>
-        <div class="step4-else" style="display: inline-block; position: relative; border-radius: 4px; width: 100%; border: 1px solid #d9d9d9;">
-          <a-textarea
-            class="rending"
-            placeholder="请输入广告语"
-             v-decorator="['description',{ rules: [{ required: true, message: '广告语必填' }] }]"
-             @keyup="getData('description')?form.setFieldsValue({
-                description: getData('description').replace(/\s/g,'')
-              }):null"
-            @change="getData('description')?form.setFieldsValue({
-                description: getData('description').replace(/\s/g,'')
-              }):null"
-            :autosize="{ minRows: 2, maxRows: 6 }"
-            :max-length="30"
-          ></a-textarea>
-          <p
-            style="
-              font-size: 12px;
-              color: #b6bbc7;
-              letter-spacing: 0.3px;
-              text-align: right;
-              line-height: 20px;
-              position: absolute;
-              bottom: 0;
-              right: 6px;
-              width: 100%;
-              margin-bottom: 0;
-            "
-          >
-            {{ (getData('description')?getData('description').length:0) + '/30' }}
-          </p>
+        <!-- <a @click="showTitle()">推荐广告语</a> -->
+        <div style="position:relative" v-for="(item, index) in descriptionList" :key="index">
+            <a-textarea
+                class="rending"
+                placeholder="请输入广告语"
+                @change="descriptionchange(item.value, index)"
+                v-model="item.value"
+                :autosize="{ minRows: 2, maxRows: 6 }"
+                :max-length="30"
+                style=" width: 80%;"
+            ></a-textarea>
+            <p
+                style="
+                font-size: 12px;
+                color: #b6bbc7;
+                letter-spacing: 0.3px;
+                text-align: right;
+                line-height: 30px;
+                position: absolute;
+                bottom: 0;
+                left: 0;
+                width: 80%;
+                margin-bottom: 0;
+                "
+            >
+                {{ item.value.length }}/30
+                <!-- {{ getFormData('description').length  }}/30 -->
+            </p>
+            <div style="position:absolute;right:0;top:-10px">
+                <a-icon
+                    type="plus"
+                    @click="addDescription()"
+                    style="margin-right:15px"
+                    v-if="descriptionList.length < 10"
+                />
+                <a-icon
+                    type="minus"
+                    @click="removeDescription(index)"
+                    v-if="descriptionList.length > 1"
+                />
+            </div>
         </div>
         </div>
-        <br />
         <a @click="cunTitle()">收藏</a>
         <a @click="cunTitle()">收藏</a>
         <a @click="showCunTitle()" style="margin-left: 10px">收藏列表</a>
         <a @click="showCunTitle()" style="margin-left: 10px">收藏列表</a>
         <!-- 
         <!-- 
@@ -890,7 +915,7 @@
           <a-col :span="8">
           <a-col :span="8">
             <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol">
             <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol">
               当前选择数量
               当前选择数量
-              {{ sumContent + '/' + (getData('createType')=='0'?getData('createCount'):getData('createCount')*15) }}
+              {{ sumContent + '/' + (getData('unitType')=='4'?(getData('createType')=='0'?getData('createCount'):getData('createCount')*15):getData('createCount')*getData('imageCount') )}}
               <a-button  type="primary" @click="tongbu()" :loading="tongbuLoading" style="margin-left:10px"  v-if="mediaDimension == 'a'">
               <a-button  type="primary" @click="tongbu()" :loading="tongbuLoading" style="margin-left:10px"  v-if="mediaDimension == 'a'">
               刷新素材</a-button>
               刷新素材</a-button>
             </a-form-item>
             </a-form-item>
@@ -939,10 +964,13 @@
               </video> -->
               </video> -->
               <a-checkbox
               <a-checkbox
                 :value="item.photoId"
                 :value="item.photoId"
-                style="width: 100%; position: absolute; z-index: 100; right: 0; top: 0"
+                style="width: 100%; position: absolute; z-index: 100; right: 0; top: 0;    max-height: 80%;overflow: hidden;"
               >
               >
                 <img :src="item.coverUrl" alt="" style="width: 90%; margin-bottom: 30px" />
                 <img :src="item.coverUrl" alt="" style="width: 90%; margin-bottom: 30px" />
-                <div>
+                
+              
+              </a-checkbox>
+              <div style="position: absolute; z-index: 100; bottom: 35px;width:100%;left:0">
                   <div style="width: 100%; text-align: center">
                   <div style="width: 100%; text-align: center">
                     {{ item.statDate&&item.channelType == 0 ? 
                     {{ item.statDate&&item.channelType == 0 ? 
                     '内部  ' + item.statDate.split(' ')[0]:item.statDate&&item.channelType == 1 ?
                     '内部  ' + item.statDate.split(' ')[0]:item.statDate&&item.channelType == 1 ?
@@ -950,9 +978,7 @@
                     '内部  ' + item.charge :'素造  ' + item.charge}}
                     '内部  ' + item.charge :'素造  ' + item.charge}}
                   </div>
                   </div>
                 </div>
                 </div>
-              
-              </a-checkbox>
-              <a @click="matemalVideo(item, index)" style="position: absolute; z-index: 100; right: 56px; bottom: 5px"
+              <a @click="matemalVideo(item, index)" style="position: absolute; z-index: 100; right: 0; bottom: 5px;width:100%;text-align:center"
                 >查看视频</a
                 >查看视频</a
               >
               >
             </li>
             </li>
@@ -1236,6 +1262,7 @@ export default {
 
 
   data() {
   data() {
     return {
     return {
+      descriptionList: [{value:''}],
       showNumber:false,
       showNumber:false,
       md5Str:'',
       md5Str:'',
       photoId:'',
       photoId:'',
@@ -1441,6 +1468,17 @@ export default {
     },
     },
   },
   },
   methods: {
   methods: {
+    descriptionchange(val, index) {
+      this.$nextTick(() => {
+          this.descriptionList[index].value = val.replace(/\s*/g, '').trim()
+      })
+    },
+    addDescription() {
+      this.descriptionList.push({ value: '' })
+    },
+    removeDescription(index) {
+      this.descriptionList.splice(index, 1)
+    },
     searchVideo() {
     searchVideo() {
       let url = '/kuaishou/kuaiShouVideoGet/getBatchV2VideoList'
       let url = '/kuaishou/kuaiShouVideoGet/getBatchV2VideoList'
       let params = {}
       let params = {}
@@ -1451,6 +1489,7 @@ export default {
       params.status = 0
       params.status = 0
       params.photoId = this.photoId
       params.photoId = this.photoId
       params.photoName = this.photoName
       params.photoName = this.photoName
+      params.materialType =this.creativeMaterialType 
       if(this.mediaDimension == 'a'){
       if(this.mediaDimension == 'a'){
         url = '/kuaishou/kuaiShouVideoGet/getBatchV2VideoList'
         url = '/kuaishou/kuaiShouVideoGet/getBatchV2VideoList'
         // params.signatures = this.md5Str
         // params.signatures = this.md5Str
@@ -1498,28 +1537,49 @@ export default {
     },
     },
     okTitleCun(item) {
     okTitleCun(item) {
       this.allForm.description = item.title
       this.allForm.description = item.title
-      this.form.setFieldsValue({
-        description: item.title,
-      })
+      // this.form.setFieldsValue({
+      //   description: item.title,
+      // })
+
+
+      if (this.descriptionList[0].value == '') {
+        this.descriptionList = [{value:item.title}]
+      } else {
+        for (let index = 0; index < this.descriptionList.length; index++) {
+          if (this.descriptionList[index].value == '') {
+              this.descriptionList.splice(index, 1)
+          }
+        }
+        if(this.descriptionList.length<=9){
+          this.descriptionList.push({value:item.title})
+        }
+      }
+     
       this.cunTitleVisible = false
       this.cunTitleVisible = false
       this.cunTitleList = []
       this.cunTitleList = []
     },
     },
     cunTitle() {
     cunTitle() {
-      if (this.getData('description') && this.getData('description') == '') {
-        this.$message.error('请填写广告语后再进行收藏')
-      } else {
-        var params = {}
-        params.accountId = localStorage.getItem('campaignAccountId')
-        params.userId = this.userInfo().id
-        params.title = this.getData('description')
-        postAction('/kuaishou/kuaiShouTitleCollection/add', params).then((res) => {
-          if (res.success) {
-            this.$message.success('收藏成功')
-          } else {
-            this.$message.error(res.message)
-          }
-        })
+      let isNotComplete = this.descriptionList.findIndex(item => {
+          return item.value === ''
+      })
+      if (isNotComplete > -1) {
+          this.$message.error('广告语未填,不可收藏')
+          return
       }
       }
+      var params = {}
+      params.accountId = localStorage.getItem('campaignAccountId')
+      params.userId = this.userInfo().id
+      params.titles = this.descriptionList.map(item=>{
+        return item.value
+      })
+      postAction('/kuaishou/kuaiShouTitleCollection/addMore', params).then((res) => {
+        if (res.success) {
+          this.$message.success('收藏成功')
+        } else {
+          this.$message.error(res.message)
+        }
+      })
+      
     },
     },
     showCunTitle() {
     showCunTitle() {
       this.cunTitleVisible = true
       this.cunTitleVisible = true
@@ -1540,9 +1600,18 @@ export default {
     okTitle(item) {
     okTitle(item) {
       this.allForm.description = item
       this.allForm.description = item
       this.$nextTick(() => {
       this.$nextTick(() => {
-        this.form.setFieldsValue({
-          description: item,
-        })
+        if (this.descriptionList[0].value == '') {
+          this.descriptionList = [{value:item}]
+        } else {
+          for (let index = 0; index < this.descriptionList.length; index++) {
+            if (this.descriptionList[index].value == '') {
+                this.descriptionList.splice(index, 1)
+            }
+          }
+          if(this.descriptionList.length<=9){
+            this.descriptionList.push({value:item})
+          }
+        }
       })
       })
 
 
       this.titleVisible = false
       this.titleVisible = false
@@ -1847,26 +1916,39 @@ export default {
         sum += this.checkVideoWai[i].length
         sum += this.checkVideoWai[i].length
       }
       }
       this.sumContent = sum
       this.sumContent = sum
-      if (this.getData('createType') == '0') {
-        if (sum > this.getData('createCount')) {
-          this.$message.error('最多选择' + this.getData('createCount') + '个素材')
-          this.checkVideo = []
-          this.sumContent = this.sumContent - 10
-
-          // if (this.active == 0) {
-            this.checkVideoAll[this.ipagination.current - 1] = this.checkVideo
-         
+      if(this.getData('unitType') == '4'){
+        if (this.getData('createType') == '0') {
+          if (sum > this.getData('createCount')) {
+            this.$message.error('最多选择' + this.getData('createCount') + '个素材')
+            this.checkVideo = []
+            this.sumContent = this.sumContent - 10
+
+            // if (this.active == 0) {
+              this.checkVideoAll[this.ipagination.current - 1] = this.checkVideo
+          
+          }
+        } else {
+          if (sum > this.getData('createCount') * 15) {
+            this.$message.error('最多选择' + this.getData('createCount') * 15 + '个素材')
+            this.checkVideo = []
+            this.sumContent = this.sumContent - 15
+
+            // if (this.active == 0) {
+              this.checkVideoAll[this.ipagination.current - 1] = this.checkVideo
+            // } else if (this.active == 1) {
+            //   this.checkVideoWai[this.ipagination.current - 1] = this.checkVideo
+            // }
+          }
         }
         }
-      } else {
-        if (sum > this.getData('createCount') * 15) {
-          this.$message.error('最多选择' + this.getData('createCount') * 15 + '个素材')
+      }else{
+        if (sum > this.getData('createCount')*this.getData('imageCount')) {
+          this.$message.error('最多选择'+this.getData('createCount')*this.getData('imageCount')+'个素材')
           this.checkVideo = []
           this.checkVideo = []
-          this.sumContent = this.sumContent - 15
-
+          this.sumContent-=10
           // if (this.active == 0) {
           // if (this.active == 0) {
             this.checkVideoAll[this.ipagination.current - 1] = this.checkVideo
             this.checkVideoAll[this.ipagination.current - 1] = this.checkVideo
           // } else if (this.active == 1) {
           // } else if (this.active == 1) {
-          //   this.checkVideoWai[this.ipagination.current - 1] = this.checkVideo
+            // this.checkVideoWai[this.ipagination.current - 1] = this.checkVideo
           // }
           // }
         }
         }
       }
       }
@@ -1892,21 +1974,33 @@ export default {
         sum += this.checkVideoWai[i].length
         sum += this.checkVideoWai[i].length
       }
       }
       this.sumContent = sum
       this.sumContent = sum
-
-      if (this.getData('createType') == '0') {
-        if (sum > this.getData('createCount')) {
-          this.$message.error('最多选择' + this.getData('createCount') + '个素材')
-          this.checkVideo.pop()
-          this.sumContent--
-          // if (this.active == 0) {
-            this.checkVideoAll[this.ipagination.current - 1] = this.checkVideo
-          // } else if (this.active == 1) {
-          //   this.checkVideoWai[this.ipagination.current - 1] = this.checkVideo
-          // }
+      if(this.getData('unitType') == '4'){
+        if (this.getData('createType') == '0') {
+          if (sum > this.getData('createCount')) {
+            this.$message.error('最多选择' + this.getData('createCount') + '个素材')
+            this.checkVideo.pop()
+            this.sumContent--
+            // if (this.active == 0) {
+              this.checkVideoAll[this.ipagination.current - 1] = this.checkVideo
+            // } else if (this.active == 1) {
+            //   this.checkVideoWai[this.ipagination.current - 1] = this.checkVideo
+            // }
+          }
+        } else {
+          if (sum > this.getData('createCount') * 15) {
+            this.$message.error('最多选择' + this.getData('createCount') * 15 + '个素材')
+            this.checkVideo.pop()
+            this.sumContent--
+            // if (this.active == 0) {
+              this.checkVideoAll[this.ipagination.current - 1] = this.checkVideo
+            // } else if (this.active == 1) {
+              // this.checkVideoWai[this.ipagination.current - 1] = this.checkVideo
+            // }
+          }
         }
         }
-      } else {
-        if (sum > this.getData('createCount') * 15) {
-          this.$message.error('最多选择' + this.getData('createCount') * 15 + '个素材')
+      }else{
+        if (sum > this.getData('createCount')*this.getData('imageCount')) {
+          this.$message.error('最多选择'+this.getData('createCount')*this.getData('imageCount')+'个素材')
           this.checkVideo.pop()
           this.checkVideo.pop()
           this.sumContent--
           this.sumContent--
           // if (this.active == 0) {
           // if (this.active == 0) {
@@ -1916,6 +2010,8 @@ export default {
           // }
           // }
         }
         }
       }
       }
+      
+
     },
     },
     getVideoList() {
     getVideoList() {
       this.orderBy = 'time'
       this.orderBy = 'time'
@@ -1939,7 +2035,8 @@ export default {
       // })
       // })
     },
     },
     getDataSource(page, pageSize) {
     getDataSource(page, pageSize) {
-
+      console.log(this.checkVideo, this.checkVideoAll)
+      this.checkVideo = this.checkVideoAll[page-1]
       this.ipagination.current = page
       this.ipagination.current = page
       this.searchVideo()
       this.searchVideo()
     },
     },
@@ -1983,13 +2080,17 @@ export default {
     changeType() {
     changeType() {
       this.$nextTick(() => {
       this.$nextTick(() => {
         if (this.getData('creativeMaterialType') == '1') {
         if (this.getData('creativeMaterialType') == '1') {
-          this.form.setFieldsValue({
-            name: '自定义创意_竖版视频',
-          })
+          if(this.getData('unitType') == '4') {
+            this.form.setFieldsValue({creativeName:'自定义创意_竖版视频'})
+          }else{
+            this.form.setFieldsValue({creativeName:'程序化创意_竖版视频'})
+          }
         } else {
         } else {
-          this.form.setFieldsValue({
-            name: '自定义创意_横版视频',
-          })
+          if(this.getData('unitType') == '4') {
+            this.form.setFieldsValue({creativeName:'自定义创意_横版视频'})
+          }else{
+            this.form.setFieldsValue({creativeName:'程序化创意_横版视频'})
+          }
         }
         }
       })
       })
     },
     },
@@ -2174,15 +2275,15 @@ export default {
       return this.form.getFieldValue(className)
       return this.form.getFieldValue(className)
     },
     },
     bidCheck(rule, value, callback) {
     bidCheck(rule, value, callback) {
-      if (value < 0.2 || value > this.maxBid) {
-        callback('不得低于0.2元,不得高于项目最高出价' + this.maxBid + '元')
+      if (value < 0.2) {
+        callback('不得低于0.2元')
       } else {
       } else {
         callback()
         callback()
       }
       }
     },
     },
     cpaBidCheck(rule, value, callback) {
     cpaBidCheck(rule, value, callback) {
-      if (value < 1 || value > this.maxBid) {
-        callback('不得低于1元,不得高于项目最高出价' + this.maxBid + '元')
+      if (value < 1) {
+        callback('不得低于1元')
       } else {
       } else {
         callback()
         callback()
       }
       }
@@ -2315,13 +2416,27 @@ export default {
       e.preventDefault()
       e.preventDefault()
       if (
       if (
         this.checkVideo.length <
         this.checkVideo.length <
-        (this.getData('createType') == '0' ? this.getData('createCount') : this.getData('createCount') * 15)
+        (this.getData('unitType')=='4'?this.getData('createType') == '0' ? this.getData('createCount') : this.getData('createCount') * 15:
+        this.getData('createCount')*this.getData('imageCount'))
       ) {
       ) {
         // this.$message.error('选择的素材不能小于创建条数')
         // this.$message.error('选择的素材不能小于创建条数')
+        this.getData('unitType')=='4'?
         this.getData('createType') == '0'
         this.getData('createType') == '0'
           ? this.$message.error('选择的素材不能小于创建条数')
           ? this.$message.error('选择的素材不能小于创建条数')
-          : this.$message.error('选择的素材不能小于创建条数*15')
+          : this.$message.error('选择的素材不能小于创建条数*15'):
+          this.$message.error('选择的素材不能小于创建条数*'+this.getData('imageCount'))
       } else {
       } else {
+        let isNotComplete = this.descriptionList.findIndex(item => {
+            return item.value === ''
+        })
+        if (isNotComplete > -1) {
+            this.$message.error('广告语未填')
+            return
+        }
+        if(this.getData('unitType')=='7'&&this.descriptionList.length<3){
+          this.$message.error('程序化创意广告语最少三条')
+          return
+        }
         this.form.validateFieldsAndScroll((err, values) => {
         this.form.validateFieldsAndScroll((err, values) => {
           if (!err) {
           if (!err) {
             this.loading = true
             this.loading = true
@@ -2344,12 +2459,13 @@ export default {
               creativeCategory: values.creativeCategory
               creativeCategory: values.creativeCategory
                 ? values.creativeCategory[values.creativeCategory.length - 1]
                 ? values.creativeCategory[values.creativeCategory.length - 1]
                 : null,
                 : null,
-              unitType: '4',
+              unitType: values.unitType,
             }
             }
             var params = {
             var params = {
               userId: this.userInfo().id,
               userId: this.userInfo().id,
               ...json,
               ...json,
               ...groupArr[0],
               ...groupArr[0],
+              description:JSON.stringify(this.descriptionList.map(item=>{return item.value})),
               accountId: localStorage.getItem('campaignAccountId'),
               accountId: localStorage.getItem('campaignAccountId'),
               campaignId: localStorage.getItem('campaignList'),
               campaignId: localStorage.getItem('campaignList'),
               beginTime: moment(this.timeRange[0]).format('YYYY-MM-DD'),
               beginTime: moment(this.timeRange[0]).format('YYYY-MM-DD'),
@@ -2379,6 +2495,34 @@ export default {
     onChange(value) {
     onChange(value) {
       // console.log(value)
       // console.log(value)
     },
     },
+    changeUnitType(e){
+      this.sumContent = 0
+      this.videoList = []
+      this.checkVideo = []
+      this.checkVideoAll = []
+      this.ipagination.pageSize = 10
+      this.$nextTick(()=>{
+        if (this.getData('creativeMaterialType') == '1') {
+          if(this.getData('unitType') == '4') {
+            this.form.setFieldsValue({creativeName:'自定义创意_竖版视频'})
+          }else{
+            this.form.setFieldsValue({creativeName:'程序化创意_竖版视频'})
+          }
+        } else {
+          if(this.getData('unitType') == '4') {
+            this.form.setFieldsValue({creativeName:'自定义创意_横版视频'})
+          }else{
+            this.form.setFieldsValue({creativeName:'程序化创意_横版视频'})
+          }
+        }
+        // if(e.target.value == '4') {
+        //   this.form.setFieldsValue({creativeName:'自定义创意_竖版视频'})
+        // }else{
+        //   this.form.setFieldsValue({creativeName:'程序化创意_竖版视频'})
+        // }
+      })
+      
+    },
     handleChange(value) {
     handleChange(value) {
       //   this.$refs.population.getAppList(value)
       //   this.$refs.population.getAppList(value)
       this.getSiteList(value)
       this.getSiteList(value)
@@ -2574,7 +2718,10 @@ export default {
       // this.checkVideo = [...new Set(n)]
       // this.checkVideo = [...new Set(n)]
     },
     },
     time(n, o) {
     time(n, o) {
-      this.searchVideo()
+      if(this.visibleMatemal){
+        this.searchVideo()
+      }
+      
       // if (n.length > 0) {
       // if (n.length > 0) {
       //   var params = {}
       //   var params = {}
       //   params.accountId = localStorage.getItem('campaignAccountId')
       //   params.accountId = localStorage.getItem('campaignAccountId')

+ 2 - 1
src/views/modules/kuaishouapp/crossAccount/templateModal.vue

@@ -81,7 +81,7 @@ export default {
       this.spinning = false
       this.spinning = false
       this.visible = true
       this.visible = true
       this.type = type
       this.type = type
-      this.populationData = {}
+      this.populationData = {checkApp:'none'}
       this.accountId = accountId
       this.accountId = accountId
     },
     },
     handleOk(accountId, templateId, type) {
     handleOk(accountId, templateId, type) {
@@ -146,6 +146,7 @@ export default {
           this.populationData.allForm.noAreaBreak = dataJson.noAreaBreak + ''
           this.populationData.allForm.noAreaBreak = dataJson.noAreaBreak + ''
           this.populationData.allForm.checkArr =
           this.populationData.allForm.checkArr =
             this.populationData.allForm.appType == '2' ? JSON.parse(dataJson.appIds) : []
             this.populationData.allForm.appType == '2' ? JSON.parse(dataJson.appIds) : []
+          this.populationData.checkApp = 'none'
           this.$nextTick(() => { 
           this.$nextTick(() => { 
             console.log(dataJson)
             console.log(dataJson)
             this.form.setFieldsValue(pick(dataJson, ['templateName']))
             this.form.setFieldsValue(pick(dataJson, ['templateName']))

+ 342 - 0
src/views/modules/material/comment/uploadFilePopilar.vue

@@ -0,0 +1,342 @@
+<style></style>
+<style lang="scss" scoped></style>
+<template>
+    <div class="upload-file">
+        <a-upload
+            name="file"
+            :multiple="multiple"
+            list-type="picture-card"
+            class="avatar-uploader"
+            action="https://media-1301855440.cos.ap-chongqing.myqcloud.com/"
+            :before-upload="beforeUpload"
+            @change="handleChange"
+            :accept="uploadType + '/' + (uploadType == 'image' ? 'jpeg,image/jpg' : 'mp4')"
+            :file-list="fileList"
+            :remove="removeFile"
+            @preview="handlePreview"
+            :disabled="loadingElse || disabled"
+        >
+            <div v-if="fileList.length < fileCount || fileList.length < 1">
+                <a-progress v-if="loadingElse" :percent="percent" :show-info="false" />
+                <div class="ant-upload-text">点击上传</div>
+            </div>
+        </a-upload>
+        <div style="color: red" v-if="sizeCheck">
+            {{ uploadType == 'image' ? '请上传jpg格式的图片,并且大小在2m之内' : '请上传mp4格式,大小在100m之内' }}
+        </div>
+        <a-modal :visible="previewVisible" :footer="null" @cancel="handleCancel">
+            <img alt="example" style="width: 100%" :src="previewImage" v-if="uploadType == 'image'" />
+            <video :src="previewImage" v-else style="width: 100%" controls="controls">
+                您的浏览器不支持 video 标签。
+            </video>
+        </a-modal>
+    </div>
+</template>
+
+<script>
+import { stopOtherVideo, closeAllVideoFun } from '@/utils/videoControl' // 停止除当前外的其他视频播放,及停止所有视频播放的方法
+import { mapGetters } from 'vuex'
+import moment from 'moment'
+
+import BMF from 'browser-md5-file'
+
+import qs from 'qs'
+var COS = require('cos-js-sdk-v5')
+var cos = new COS({
+    SecretId: 'AKIDE6IpMi8fJQRCg1iuWzFajjRs43kbbets',
+    SecretKey: 'tXzuwMfplTTK3c9GFUyETilasvQfePu9',
+})
+var i = 0
+const oneKB = 1024
+
+function getBase64(file) {
+    return new Promise((resolve, reject) => {
+        const reader = new FileReader()
+        reader.readAsDataURL(file)
+        reader.onload = () => resolve(reader.result)
+        reader.onerror = (error) => reject(error)
+    })
+}
+export default {
+    name: 'upload-file',
+    components: {},
+    props: {
+        uploadType: {
+            //上传类型  值为  image/video,同时目录名称也是这样
+            type: String,
+            default() {
+                return 'image'
+            },
+        },
+        multiple: {
+            // true 可以批量上传  false 不可以
+            type: Boolean,
+            default() {
+                return true
+            },
+        },
+        fileCount: {
+            //最大上传数量
+            type: Number,
+            default() {
+                return 10
+            },
+        },
+        checkFile: {
+            //返回promise方法,判读文件是否上传过,进行上传拦截
+            type: Function,
+            default() {
+                return Promise.resolve()
+            },
+        },
+        disabled: {
+            type: Boolean,
+            default() {
+                return false
+            },
+        },
+        value: {
+            required: true,
+            default() {
+                return ''
+            },
+        },
+        size: {
+            type: Number,
+            default() {
+                if (this.sizeCheck) {
+                    if (this.uploadType == 'image') {
+                        return 2048
+                    } else {
+                        return 102400
+                    }
+                }
+            },
+        },
+        sizeCheck: {
+            type: Boolean,
+            default() {
+                return true
+            },
+        },
+        onOversize: {
+            type: Function,
+            default() {
+                alert(`请选择${this.size}KB内的文件!`)
+            },
+        },
+    },
+    data() {
+        return {
+            fileList: [],
+            loadingElse: false,
+            imageUrl: '',
+            percent: 0,
+            previewVisible: false,
+            previewImage: '',
+        }
+    },
+    filters: {},
+    computed: {},
+    mounted() {},
+    watch: {
+        //    fileListAll
+        value: {
+            immediate: true,
+            handler(n, o) {
+                this.$nextTick(() => {
+                    if (this.fileList && this.fileList.length == 0) {
+                        if (typeof n == 'object') {
+                            this.fileList = n.map((item, index) => {
+                                return {
+                                    uid: index + 1,
+                                    name: index + 1,
+                                    status: 'done',
+                                    url: item,
+                                }
+                            })
+                        } else {
+                            if (n === '') {
+                                this.fileList = []
+                            } else {
+                                this.fileList = []
+                                var data = {
+                                    uid: 1,
+                                    name: '回显',
+                                    status: 'done',
+                                    url: n,
+                                }
+                                this.fileList.push(data)
+                            }
+                        }
+                    } else {
+                        if (n.length == 0 || n == '') {
+                            this.clearAll()
+                        }
+                    }
+                })
+            },
+            deep: true,
+        },
+    },
+    methods: {
+        handleCancel() {
+            closeAllVideoFun()
+            this.previewVisible = false
+        },
+        handleChange(info) {
+            if (info.file.status === 'uploading') {
+                this.loading = true
+                return
+            }
+            if (info.file.status === 'done') {
+                // Get this url from response in real world.
+                getBase64(info.file.originFileObj, (imageUrl) => {
+                    this.imageUrl = imageUrl
+                    this.loading = false
+                })
+            }
+        },
+        removeFile(file) {
+            // console.log(file)
+            var index = this.fileList.findIndex((v) => v.uid === file.uid)
+            this.fileList.splice(index, 1)
+            this.$emit('removeUpload', file)
+        },
+        async handlePreview(file) {
+            if (!file.url && !file.preview) {
+                file.preview = await getBase64(file.originFileObj)
+            }
+            this.previewImage = file.url || file.preview
+            this.previewVisible = true
+        },
+        beforeUpload(file) {
+            this.percent = 0
+            this.loadingElse = true
+            const fileOvesize = file.size > this.size * oneKB
+            // console.log(fileOvesize)
+            if (fileOvesize && this.sizeCheck) {
+                this.onOversize()
+                this.loadingElse = false
+                return
+            } else {
+                this.checkFile(file)
+                    .then((res) => {
+                        this.cosUpload(file)
+                    })
+                    .catch(() => {
+                        this.loadingElse = false
+                    })
+                return new Promise(function (resolve, reject) {
+                    reject()
+                })
+            }
+        },
+        clearAll() {
+            this.fileList = []
+        },
+        cosUpload(file) {
+            var that = this
+            let date = new Date()
+            let y = date.getFullYear()
+            let MM = date.getMonth() + 1
+            MM = MM < 10 ? '0' + MM : MM
+            let d = date.getDate()
+            d = d < 10 ? '0' + d : d
+            var timeElse = new Date().getTime()
+            var arr = file.name.split('.')
+
+            var str = ''
+            for (let i = 0; i < arr.length; i++) {
+                if (i == arr.length - 1) {
+                } else {
+                    if (i == arr.length - 2) {
+                        str += arr[i]
+                    } else {
+                        str += arr[i] + '.'
+                    }
+                }
+            }
+            // console.log(str + '-' + timeElse + '.' + arr[arr.length - 1])
+            cos.putObject(
+                {
+                    Bucket: 'media-1301855440',
+                    /* 必须 */
+                    Region: 'ap-chongqing',
+                    /* 存储桶所在地域,必须字段 */
+                    Key:
+                        '/external-videos/' +
+                        y +
+                        '' +
+                        MM +
+                        '' +
+                        d +
+                        '/' +
+                        str +
+                        '-' +
+                        timeElse +
+                        '.' +
+                        arr[arr.length - 1],
+                    /* 必须 */
+                    StorageClass: 'STANDARD',
+                    Body: file, // 上传文件对象
+                    onProgress: function (progressData) {
+                        //进度条方法
+
+                        that.percent = progressData.percent * 100
+                    },
+                    onTaskReady: function (tid) {
+                        // console.log('onTaskReady', tid);
+                    },
+                    onTaskStart: function (info) {
+                        //开始上传
+                        // console.log('onTaskStart', info);
+                    },
+                },
+                function (err, data) {
+                    if (err) {
+                        that.loadingElse = false
+                        that.$message.error('上传失败!!!' + err)
+                        return
+                    }
+                    // alert('成功')
+                    that.loadingElse = false
+                    if (that.fileList.length < that.fileCount) {
+                        that.fileList.push({
+                            uid: file.name,
+                            name: file.name,
+                            status: 'done',
+                            url: '//' + data.Location,
+                        })
+
+                        // that.$emit('overUpload', that.fileList.map(item => {
+                        //                 return item.url
+                        //               }))
+                        that.$emit('overUpload', that.fileList)
+
+                        if (that.multiple) {
+                            let urlList = that.fileList.map((item) => {
+                                return item.url
+                            })
+
+                            that.$emit('update:value', urlList)
+                        } else {
+                            that.$emit(
+                                'update:value',
+                                that.fileList.map((item) => {
+                                    return item.url
+                                })[0]
+                            )
+                        }
+                    } else {
+                        that.$message.error('上传已达上限' + that.fileCount + '张')
+                    }
+                }
+            )
+        },
+    },
+}
+</script>
+<style scoped>
+@import '~@assets/less/common.less';
+</style>

+ 9 - 4
src/views/modules/material/videoMaterial.vue

@@ -81,7 +81,7 @@ li.chouzhen.first:before {
   background: rgba(0, 0, 0, 0.5);
   background: rgba(0, 0, 0, 0.5);
   border-radius: 2px;
   border-radius: 2px;
 }
 }
-.table-page-search-wrapper {
+.video-metarial-table {
   .el-cascader .el-input {
   .el-cascader .el-input {
     cursor: pointer;
     cursor: pointer;
     height: 100%;
     height: 100%;
@@ -354,7 +354,7 @@ a {
 <template>
 <template>
   <a-card :bordered="false" class="only-video-material-disable">
   <a-card :bordered="false" class="only-video-material-disable">
     <!-- 查询区域 -->
     <!-- 查询区域 -->
-    <div class="table-page-search-wrapper">
+    <div class="table-page-search-wrapper video-metarial-table">
       <a-form layout="inline" :selfUpdate="true">
       <a-form layout="inline" :selfUpdate="true">
         <a-row :gutter="24">
         <a-row :gutter="24">
           <a-col :md="8" :sm="8">
           <a-col :md="8" :sm="8">
@@ -504,6 +504,7 @@ a {
         @click="passTheAudit"
         @click="passTheAudit"
         :disabled="checkArr.length == 0"
         :disabled="checkArr.length == 0"
         v-if="active == '0'"
         v-if="active == '0'"
+        :loading="passTheAuditLoading"
         type="primary"
         type="primary"
         >批量通过审核</a-button
         >批量通过审核</a-button
       >
       >
@@ -847,7 +848,7 @@ a {
                         <a-menu-item
                         <a-menu-item
                           key="1"
                           key="1"
                           v-show="active != '3'"
                           v-show="active != '3'"
-                          v-if="items.userId == userInfo().id || role.roleCode == 'designTeamLeader'"
+                          v-if="items.userId == userInfo().id || role.roleCode == 'designTeamLeader'|| userInfo().id == 'e9ca23d68d884d4ebb19d07889727dae'"
                         >
                         >
                           <a href="javascript:;" style="margin-right: 20px" @click="personEdit(items, '2')">人员修改</a>
                           <a href="javascript:;" style="margin-right: 20px" @click="personEdit(items, '2')">人员修改</a>
                         </a-menu-item>
                         </a-menu-item>
@@ -860,7 +861,8 @@ a {
                         <a-menu-item key="5">
                         <a-menu-item key="5">
                           <a href="javascript:;" style="margin-right: 20px" @click="editTagList(items)">修改标签</a>
                           <a href="javascript:;" style="margin-right: 20px" @click="editTagList(items)">修改标签</a>
                         </a-menu-item>
                         </a-menu-item>
-                        <a-menu-item key="6"  v-show="active !== '1'"  v-if="items.userId == userInfo().id ||(userInfo().id == 'a549d89000eb432d80af11e1be8a623a' && items.projectId == 4830885)">
+                        <a-menu-item key="6"  v-show="userInfo().id == 'e9ca23d68d884d4ebb19d07889727dae'||active !== '1'"  
+                        v-if="items.userId == userInfo().id ||(userInfo().id == '6a2e036486ea480ab3d9870e2d810daf' && items.projectId == 4830885) || userInfo().id == 'e9ca23d68d884d4ebb19d07889727dae'">
                           <a href="javascript:;" style="margin-right: 20px" @click="editMaterialName(items)">修改素材名称</a>
                           <a href="javascript:;" style="margin-right: 20px" @click="editMaterialName(items)">修改素材名称</a>
                         </a-menu-item>
                         </a-menu-item>
                         <a-menu-item key="7" v-show="active === '0' || active === '1'">
                         <a-menu-item key="7" v-show="active === '0' || active === '1'">
@@ -2381,6 +2383,7 @@ export default {
 				scopedSlots: {customRender: 'refuseDetail'}
 				scopedSlots: {customRender: 'refuseDetail'}
 			},
 			},
 		],
 		],
+    passTheAuditLoading:false,
 		toutiaoMateriaLoading: false,
 		toutiaoMateriaLoading: false,
 		defaultCurrentToutiao: 1,
 		defaultCurrentToutiao: 1,
 		materiaDataTotalToutiao: 0,
 		materiaDataTotalToutiao: 0,
@@ -3545,7 +3548,9 @@ export default {
       if(this.checkArr.length == 0){
       if(this.checkArr.length == 0){
         this.$message.error('请选择素材')
         this.$message.error('请选择素材')
       }else{
       }else{
+        this.passTheAuditLoading = true
         this.postDataAction('/ctop/materialInfo/batchEditStatus', {ids:this.checkArr, status:'1'}).then(res=>{
         this.postDataAction('/ctop/materialInfo/batchEditStatus', {ids:this.checkArr, status:'1'}).then(res=>{
+          this.passTheAuditLoading = false
           if(res.success){
           if(res.success){
             this.$message.success(res.message)
             this.$message.success(res.message)
             this.checkArr = []
             this.checkArr = []

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 3253 - 0
src/views/modules/material/videoPopular.vue


+ 5 - 1
src/views/modules/policy-management/policy-management.vue

@@ -5,7 +5,11 @@
                 <span class="policy-export-btn">销售政策列表</span>
                 <span class="policy-export-btn">销售政策列表</span>
             </div>
             </div>
             <div>
             <div>
-                <span v-if="userInfo().roleName == '管理员'||userInfo().roleName == '销售总监'" class="add-acount-policy-btn">
+                <span v-if="userInfo().roleName == '管理员'
+                ||userInfo().id == '7fb2684c348341d193727e791c75dbeb'
+                ||userInfo().id == '1cd4c769eabb4de98fed306de2a3bbbd'
+                ||userInfo().id == '388e787edd294ecfb9243fe176a3ae56'
+                ||userInfo().id == 'a8c0a3d4df4f4b7083107a429b5391df'" class="add-acount-policy-btn">
                     <a-button @click="handleAddSale">销售对应人员</a-button>
                     <a-button @click="handleAddSale">销售对应人员</a-button>
                 </span>
                 </span>
                 <span v-if="userInfo().roleName !== '财务'" class="add-acount-policy-btn">
                 <span v-if="userInfo().roleName !== '财务'" class="add-acount-policy-btn">

+ 489 - 0
src/views/modules/script/components/keyWord.vue

@@ -0,0 +1,489 @@
+<style>
+.select-table .ant-table-thead > tr > th,
+.select-table .ant-table-tbody > tr > td {
+    padding: 0 !important;
+}
+.select-table .ant-table {
+    font-size: 12px;
+}
+.demo-infinite-container {
+    border: 1px solid #e8e8e8;
+    border-radius: 4px;
+    overflow: auto;
+    padding: 8px 24px;
+    height: 300px;
+}
+.demo-loading-container {
+    position: absolute;
+    bottom: 40px;
+    width: 100%;
+    text-align: center;
+}
+</style>
+<style lang="scss" scoped>
+.require-check {
+    ::v-deep .ant-form-item-label {
+        label::before {
+            display: inline-block;
+            margin-right: 4px;
+            color: #f5222d;
+            font-size: 14px;
+            font-family: SimSun, sans-serif;
+            line-height: 1;
+            content: '*';
+        }
+    }
+}
+</style>
+<template>
+    <div>
+        <a-form-item
+            label="关键字"
+            v-clickoutside="handleClose"
+            style="width: 100%"
+            class="select-table"
+            :class="{ 'require-check': requireCheck }"
+        >
+            <a-input
+                @focus="
+                    topMiddle = true
+                    getData()
+                "
+                v-model="keyValue"
+                @change="getData"
+                :disabled="disabled"
+                @keyup.enter.native="okWord"
+                addon-after="选中后按回车键添加"
+            />
+            <div
+                v-show="topMiddle"
+                style="
+                background: white;
+                padding: 10px;
+                box-shadow: 0 2px 8px 0 rgba(0, 0, 0, 0.15);
+                position: absolute;
+                z-index: 1000;
+                width: 100%;
+            "
+                class="demo-infinite-container"
+            >
+                <!-- <a-list :data-source="data">
+                <a-list-item slot="renderItem" slot-scope="item" @click="showProject(item)">
+                    <a-list-item-meta>
+                        <a slot="title">{{ item.word }}</a>
+                    </a-list-item-meta>
+                </a-list-item>
+                <div v-if="loading && !busy" class="demo-loading-container">
+                    <a-spin />
+                </div>
+            </a-list> -->
+
+                <a-checkbox-group
+                    v-model="selectDescriptionArr"
+                    style="width:100%;margin-top:10px"
+                    v-on:keyup.enter.native="okWord"
+                >
+                    <a-list bordered :data-source="data" style="width:100%;max-height: 450px;overflow:auto">
+                        <a-list-item slot="renderItem" slot-scope="item, index">
+                            <a-checkbox :value="item.word">
+                                {{ item.word }}
+                            </a-checkbox>
+                        </a-list-item>
+                    </a-list>
+                </a-checkbox-group>
+            </div>
+        </a-form-item>
+        <a-table
+            :columns="columns"
+            :dataSource="dataSource"
+            :pagination="false"
+            bordered
+            size="middle"
+            style="word-break: break-all;font-size:16px;font-weight:600"
+            id="outTable"
+            ref="accountTable"
+        >
+            <span slot="query_word" slot-scope="text, record">
+                {{ text }}
+            </span>
+            <span slot="recommended_word" slot-scope="text, record">
+                {{ !!text[0] ? text.join() : '-' }}
+            </span>
+            <span slot="action" slot-scope="text, record">
+                <a @click.stop="deleteScript(record)">删除</a>
+            </span>
+        </a-table>
+    </div>
+</template>
+
+<script>
+import { getAction, postAction } from '@/api/manage'
+import moment from 'moment'
+import { mapGetters } from 'vuex'
+import jq from 'jquery'
+import infiniteScroll from 'vue-infinite-scroll'
+const clickoutside = {
+    // 初始化指令
+    bind(el, binding, vnode) {
+        function documentHandler(e) {
+            // 这里判断点击的元素是否是本身,是本身,则返回
+            if (el.contains(e.target)) {
+                return false
+            }
+            // 判断指令中是否绑定了函数
+            if (binding.expression) {
+                // 如果绑定了函数 则调用那个函数,此处binding.value就是handleClose方法
+                binding.value(e)
+            }
+        }
+        // 给当前元素绑定个私有变量,方便在unbind中可以解除事件监听
+        el.__vueClickOutside__ = documentHandler
+        document.addEventListener('click', documentHandler)
+    },
+    update() {},
+    unbind(el, binding) {
+        // 解除事件监听
+        document.removeEventListener('click', el.__vueClickOutside__)
+        delete el.__vueClickOutside__
+    }
+}
+let TTcolumns = [
+    {
+        title: '关键字',
+        dataIndex: 'query_word',
+        scopedSlots: { customRender: 'query_word' },
+        align: 'center',
+        key: 'query_word'
+    },
+    {
+        title: '推荐词',
+        dataIndex: 'recommended_word',
+        scopedSlots: { customRender: 'recommended_word' },
+        align: 'center',
+        key: 'recommended_word'
+    },
+    {
+        title: '操作',
+        dataIndex: 'action',
+        scopedSlots: { customRender: 'action' },
+        align: 'center',
+        key: 'action'
+    }
+]
+export default {
+    name: 'select-pagination',
+    components: {},
+    directives: { clickoutside, infiniteScroll },
+    props: {
+        projectId: {
+            type: [String, Number, Array],
+            default() {
+                return []
+            }
+        },
+        allScript: {
+            type: [String, Number, Array],
+            default() {
+                return []
+            }
+        },
+        type: {
+            type: String,
+            default() {
+                return ''
+            }
+        },
+        labelCol: {
+            type: Object,
+            default() {
+                return {
+                    xs: { span: 24 },
+                    sm: { span: 5 }
+                }
+            }
+        },
+        disabled: {
+            type: Boolean,
+            default() {
+                return false
+            }
+        },
+        requireCheck: {
+            type: Boolean,
+            default() {
+                return false
+            }
+        }
+    },
+
+    data() {
+        return {
+            loading: false,
+            busy: false,
+            wrapperCol: {
+                xs: { span: 24 },
+                sm: { span: 12 }
+            },
+            selectedRowKeys: [],
+            selectedRowKeysValue: [],
+            topMiddle: false,
+            keyValue: '',
+            data: [],
+            selectDescriptionArr: [],
+            dataElse: [],
+            ipagination: {
+                current: 0,
+                pageSize: 20
+            },
+            columns: TTcolumns,
+            dataSource: [],
+            rowClick: (record, index) => ({
+                // 事件
+                on: {
+                    click: () => {
+                        // var str =
+                        //   record.mediaId == '1'
+                        //     ? '头条'
+                        //     : record.mediaId == '2'
+                        //     ? '快手'
+                        //     : record.mediaId == '3'
+                        //     ? '头条内广'
+                        //     : '快手内广'
+                        this.keyValue = record.productName
+                        this.topMiddle = false
+                        this.data = this.dataElse
+                        // this.$emit('update:projectId', record.id)
+                    }
+                }
+            })
+        }
+    },
+    computed: {},
+    filters: {},
+    methods: {
+        deleteScript(item) {
+            var index = this.dataSource.findIndex(i=>i==item.query_word)
+            this.dataSource.splice(index,1)
+            var indexRemove = this.projectId.findIndex(i=>i==item.query_word)
+            this.projectId.splice(indexRemove,1)
+        },
+        showProject(record) {
+            var str =
+                record.mediaId == '1'
+                    ? '头条'
+                    : record.mediaId == '2'
+                    ? '快手'
+                    : record.mediaId == '3'
+                    ? '头条内广'
+                    : '快手内广'
+            this.keyValue = record.productName
+            this.topMiddle = false
+            this.$emit('update:projectId', record.id)
+        },
+        ...mapGetters(['nickname', 'avatar', 'userInfo']),
+        onSelectChange(selectedRowKeys, selectionRows) {
+            this.selectedRowKeys = selectedRowKeys
+            this.selectedRowKeysValue = selectionRows.map(item => {
+                return { orientationId: item.orientationId, orientationName: item.orientationName }
+            })
+        },
+        getData() {
+            if (this.keyValue == '') {
+                this.$emit('update:projectId', this.projectId)
+            }
+            if (!!this.keyValue) {
+                this.topMiddle = true
+                this.ipagination.current = 1
+                postAction(process.env.VUE_APP_BASE_SCRIPT_URL + '/related_words/?word=' + this.keyValue).then(res => {
+                    if (res.code == 0) {
+                        this.data = res.result.map((item, index) => {
+                            return {
+                                productId: item,
+                                key: index,
+                                word: item
+                            }
+                        })
+                        // if (this.type === 'taobao') {
+                        //     this.data = defaultList.filter(item => item.productId === 1410280)
+                        // } else {
+                        //     this.data = defaultList
+                        // }
+                        // this.dataElse = res.result.records.map((item, index) => {
+                        //   return {
+                        //     ...item,
+                        //     projectId: item.projectId + '',
+                        //     key: index,
+                        //   }
+                        // })
+                    }
+                })
+            } else {
+                this.data = []
+                this.selectDescriptionArr = []
+            }
+        },
+        okWord() {
+
+            if (this.projectId.findIndex(item => item == this.keyValue) > -1) {
+            } else {
+                this.projectId.push(this.keyValue)
+            }
+
+            var index = this.dataSource.findIndex(item => item.query_word == this.keyValue)
+            if (index > -1) {
+                this.dataSource[index].recommended_word = this.selectDescriptionArr
+            } else {
+                this.dataSource.push({ query_word: this.keyValue, recommended_word: this.selectDescriptionArr })
+            }
+            this.keyValue = ''
+            this.selectDescriptionArr = []
+            
+            this.$nextTick(()=>{
+                setTimeout(()=>{
+                    this.$emit('update:allScript', this.dataSource)
+                },100)
+                
+            })
+            
+            this.handleClose()
+        },
+        handleClose() {
+            this.topMiddle = false
+            if (!!!this.projectId) {
+                this.keyValue = ''
+            }
+        },
+        // allData() {
+        //   getAction('/ctop/product/getUserProductList', {
+        //     userId: this.userInfo().id,
+        //     pageSize: this.ipagination.pageSize,
+        //     pageNo: this.ipagination.current,
+        //   }).then((res) => {
+        //     if (res.code == 0) {
+        //       this.data = res.result.records.map((item, index) => {
+        //         return {
+        //           ...item,
+        //           projectId: item.projectId + '',
+        //           key: index,
+        //         }
+        //       })
+        //       this.dataElse = res.result.records.map((item, index) => {
+        //         return {
+        //           ...item,
+        //           projectId: item.projectId + '',
+        //           key: index,
+        //         }
+        //       })
+        //     }
+        //   })
+        // },
+        handleInfiniteOnLoad() {
+            const data = this.data
+            this.loading = true
+            this.ipagination.current++
+            // this.fetchData((res) => {
+            //   this.data = data.concat(res.results)
+            //   this.loading = false
+            // })
+            // getAction('/ctop/product/getUserProductList', {
+            //     userId: this.userInfo().id,
+            //     pageSize: this.ipagination.pageSize,
+            //     pageNo: this.ipagination.current,
+            //     productName: this.keyValue
+            // }).then(res => {
+            //     if (res.code == 0) {
+            //         this.busy = true
+            //         let defaultList = res.result.records.map((item, index) => {
+            //             return {
+            //                 ...item,
+            //                 projectId: item.projectId + ''
+            //             }
+            //         })
+            //         this.data = data.concat()
+            //         if (this.type === 'taobao') {
+            //             this.data = defaultList.filter(item => item.productId === 1410280)
+            //         } else {
+            //             this.data = data.concat(defaultList)
+            //         }
+            //         // this.data = res.result.records.map((item, index) => {
+            //         //   return {
+            //         //     ...item,
+            //         //     projectId: item.projectId + '',
+            //         //     key: index,
+            //         //   }
+            //         // })
+            //         // this.dataElse = res.result.records.map((item, index) => {
+            //         //   return {
+            //         //     ...item,
+            //         //     projectId: item.projectId + '',
+            //         //     key: index,
+            //         //   }
+            //         // })
+            //     }
+            // })
+        }
+    },
+    watch: {
+        projectId(n, o) {
+            if (n == '') {
+                this.keyValue = ''
+            } else {
+            }
+        }
+    },
+    mounted() {}
+}
+</script>
+
+<style type="text/css">
+.plug-timer-grid {
+    width: 100%;
+}
+
+.plug-timer-grid td,
+.plug-timer-grid th {
+    border: 1px solid #97b4d1;
+    text-align: center; /*cursor:pointer;*/
+    font-size: 10px;
+    line-height: 10px;
+}
+
+.Selected {
+    background-color: rgb(102, 162, 243);
+    opacity: 0.5;
+}
+
+.plug-timer-grid {
+    border-collapse: collapse;
+    z-index: 4;
+}
+
+.plug-timer-grid thead tr {
+    display: table-row;
+    vertical-align: inherit;
+    border-color: inherit;
+}
+
+.group-creat table td {
+    height: 20px;
+    max-width: 5px;
+    font-size: 12px;
+    text-align: center;
+    vertical-align: middle;
+    overflow: hidden;
+    transition: background 0.5s;
+    -webkit-transition: background 0.5s;
+}
+
+.plug-timer-grid tbody th {
+    width: 4%;
+}
+
+.plug-timer-grid tbody tr td {
+    width: 2%;
+}
+
+/*.clear{*/
+/*  margin:20px 0px 20px 0px;*/
+/*}*/
+</style>

+ 85 - 43
src/views/modules/script/index.vue

@@ -261,7 +261,7 @@
                                 <a-range-picker
                                 <a-range-picker
                                     v-decorator="[
                                     v-decorator="[
                                         'timeRange',
                                         'timeRange',
-                                        { initialValue: [moment().subtract(6, 'days'), moment()] }
+                                        { initialValue: [moment().subtract(1, 'months'), moment()] }
                                     ]"
                                     ]"
                                     :ranges="dateRanges"
                                     :ranges="dateRanges"
                                     :disabled-date="disabledDate"
                                     :disabled-date="disabledDate"
@@ -347,15 +347,22 @@
                         style="word-break: break-all;font-size:16px;font-weight:600"
                         style="word-break: break-all;font-size:16px;font-weight:600"
                         id="outTable"
                         id="outTable"
                         ref="accountTable"
                         ref="accountTable"
+                        rowKey="number"
                         :customRow="rowClick"
                         :customRow="rowClick"
                         :rowSelection="tabKey == 1 ? null : { selectedRowKeys, onChange: onSelectChange }"
                         :rowSelection="tabKey == 1 ? null : { selectedRowKeys, onChange: onSelectChange }"
                     >
                     >
-                        <span slot="query_word_lst" slot-scope="text, record">
-                            {{ text.join() }}
+                        <span slot="query_word" slot-scope="text, record">
+                            {{ Array.isArray(text) ? text.join() : text }}
+                        </span>
+                        <span slot="recommended_word" slot-scope="text, record">
+                            {{ !!text[0] ? text.join() : '-' }}
                         </span>
                         </span>
                         <span slot="script_num" slot-scope="text, record">
                         <span slot="script_num" slot-scope="text, record">
                             {{ text ? text : '-' }}
                             {{ text ? text : '-' }}
                         </span>
                         </span>
+                        <span slot="action" slot-scope="text, record">
+                            <a @click.stop="deleteScript(record)">删除</a>
+                        </span>
                     </a-table>
                     </a-table>
                     <a-pagination
                     <a-pagination
                         size="small"
                         size="small"
@@ -381,19 +388,8 @@
             @cancel="handleCancelAll"
             @cancel="handleCancelAll"
             @ok="handleBudgetSure"
             @ok="handleBudgetSure"
         >
         >
-            <a-form-item label="关键字">
-                <a-select
-                    v-model="scriptLabel"
-                    :token-separators="[',', ' ', ',']"
-                    mode="tags"
-                    style="width: 320px"
-                    placeholder="按回车生成关键字"
-                    dropdownClassName="display-none-selset"
-                    @change="handleEnterChang"
-                >
-                </a-select>
-            </a-form-item>
-            <div class="adver-position-radio">
+            <keyWord :projectId.sync="scriptLabel" :allScript.sync="creativeTag" ref="selectTable" />
+            <!-- <div class="adver-position-radio">
                 <div class="creative-label-content">
                 <div class="creative-label-content">
                     <p>已选:{{ creativeTag.length || 0 }}</p>
                     <p>已选:{{ creativeTag.length || 0 }}</p>
                     <div class="label-content-select-tag">
                     <div class="label-content-select-tag">
@@ -408,7 +404,7 @@
                         </a-tag>
                         </a-tag>
                     </div>
                     </div>
                 </div>
                 </div>
-            </div>
+            </div> -->
         </a-modal>
         </a-modal>
     </div>
     </div>
 </template>
 </template>
@@ -425,6 +421,7 @@ import selectCheckAll from '@/views/modules/kuaishouapp/account/stepForm/stepMod
 import qs from 'qs'
 import qs from 'qs'
 import { mapGetters } from 'vuex'
 import { mapGetters } from 'vuex'
 import selectTreeAccount from '@/components/formComponents/selectAccount.vue'
 import selectTreeAccount from '@/components/formComponents/selectAccount.vue'
+import keyWord from './components/keyWord.vue'
 function tqFun(qcArr1) {
 function tqFun(qcArr1) {
     var tempArr = []
     var tempArr = []
     function bbFun(qcArr) {
     function bbFun(qcArr) {
@@ -442,11 +439,17 @@ function tqFun(qcArr1) {
 let TTcolumns = [
 let TTcolumns = [
     {
     {
         title: '关键字',
         title: '关键字',
-        dataIndex: 'query_word_lst',
-        scopedSlots: { customRender: 'query_word_lst' },
+        dataIndex: 'query_word',
+        scopedSlots: { customRender: 'query_word' },
+        align: 'center',
+        key: 'query_word'
+    },
+    {
+        title: '推荐词',
+        dataIndex: 'recommended_word',
+        scopedSlots: { customRender: 'recommended_word' },
         align: 'center',
         align: 'center',
-        key: 'query_word_lst',
-        width: 600
+        key: 'recommended_word'
     },
     },
     {
     {
         title: '创建时间',
         title: '创建时间',
@@ -461,6 +464,13 @@ let TTcolumns = [
         scopedSlots: { customRender: 'operator' },
         scopedSlots: { customRender: 'operator' },
         align: 'center',
         align: 'center',
         key: 'operator'
         key: 'operator'
+    },
+    {
+        title: '操作',
+        dataIndex: 'action',
+        scopedSlots: { customRender: 'action' },
+        align: 'center',
+        key: 'action'
     }
     }
 ]
 ]
 
 
@@ -508,7 +518,8 @@ export default {
         ARow,
         ARow,
         checkBoxGroup,
         checkBoxGroup,
         selectCheckAll,
         selectCheckAll,
-        selectTreeAccount
+        selectTreeAccount,
+        keyWord
     },
     },
 
 
     data() {
     data() {
@@ -517,7 +528,9 @@ export default {
             scriptLabel: [],
             scriptLabel: [],
             creativeTag: [],
             creativeTag: [],
             selectedRowKeys: [],
             selectedRowKeys: [],
+            selectedRowKeysAll: [],
             selectionRows: [],
             selectionRows: [],
+            selectionRowsAll: [],
             downLoading: false,
             downLoading: false,
             config_id: null,
             config_id: null,
             appIds: [],
             appIds: [],
@@ -596,7 +609,7 @@ export default {
             SHOW_PARENT,
             SHOW_PARENT,
 
 
             type: 3,
             type: 3,
-            dateValue: [moment().subtract(7, 'days'), moment()],
+            dateValue: [moment().subtract(30, 'days'), moment()],
 
 
             operate: '',
             operate: '',
             designList: [],
             designList: [],
@@ -626,7 +639,7 @@ export default {
             projectId: undefined,
             projectId: undefined,
             projectIdAll: undefined,
             projectIdAll: undefined,
             dataLoading: false,
             dataLoading: false,
-            url: process.env.VUE_APP_BASE_SCRIPT_URL + '/get_script_config_lst',
+            url: process.env.VUE_APP_BASE_SCRIPT_URL + '/get_script_config_lst/',
             modifyPriceVisible: false,
             modifyPriceVisible: false,
             modifyPriceLoading: false,
             modifyPriceLoading: false,
             modifyPriceDetail: null,
             modifyPriceDetail: null,
@@ -640,7 +653,30 @@ export default {
     methods: {
     methods: {
         moment,
         moment,
         ...mapGetters(['userInfo']),
         ...mapGetters(['userInfo']),
+        deleteScript(item) {
+            let that = this
+            this.$confirm({
+                title: '确定要删除此条脚本?',
+                content: '',
+                onOk() {
+                    var params = {}
+                    params.config_id = item.config_id
+                    params.user_id = item.user_id
+                    params.operator = item.operator
+                    that.postDataAction(process.env.VUE_APP_BASE_SCRIPT_URL + '/delete_script_config/', params).then(
+                        res => {
+                            if (res.success) {
+                                const paramsData = that.form.getFieldsValue()
+                                that.handleGetTableList(paramsData)
+                            }
+                        }
+                    )
+                },
+                onCancel() {}
+            })
+        },
         handleOkDownLoad() {
         handleOkDownLoad() {
+            this.selectionRows = tqFun(this.selectionRowsAll)
             if (this.selectionRows.length > 0) {
             if (this.selectionRows.length > 0) {
                 this.downLoading = true
                 this.downLoading = true
                 let params = this.selectionRows.map(item => {
                 let params = this.selectionRows.map(item => {
@@ -651,7 +687,7 @@ export default {
                     }
                     }
                 })
                 })
 
 
-                downFilePost(process.env.VUE_APP_BASE_SCRIPT_URL + '/export_script_file', params).then(res => {
+                downFilePost(process.env.VUE_APP_BASE_SCRIPT_URL + '/export_script_file/', params).then(res => {
                     this.downLoading = false
                     this.downLoading = false
                     let blob = new Blob([res], {
                     let blob = new Blob([res], {
                         type: 'application/vnd.openxmlformats-officedocument.spre1adsheetml.sheet'
                         type: 'application/vnd.openxmlformats-officedocument.spre1adsheetml.sheet'
@@ -707,10 +743,10 @@ export default {
                 this.$message.error('请输入关键字')
                 this.$message.error('请输入关键字')
             } else {
             } else {
                 var params = {}
                 var params = {}
-                params.query_word_lst = this.creativeTag
+                params.query_word_pair = this.creativeTag
                 params.operator = this.userInfo().realname
                 params.operator = this.userInfo().realname
                 params.user_id = this.userInfo().id
                 params.user_id = this.userInfo().id
-                this.postDataAction(process.env.VUE_APP_BASE_SCRIPT_URL + '/add_script_config', params).then(res => {
+                this.postDataAction(process.env.VUE_APP_BASE_SCRIPT_URL + '/add_script_config/', params).then(res => {
                     if (res.success) {
                     if (res.success) {
                         this.handleCancelAll()
                         this.handleCancelAll()
                         this.creativeTag = []
                         this.creativeTag = []
@@ -734,6 +770,14 @@ export default {
         onSelectChange(selectedRowKeys, selectionRows) {
         onSelectChange(selectedRowKeys, selectionRows) {
             this.selectedRowKeys = selectedRowKeys
             this.selectedRowKeys = selectedRowKeys
             this.selectionRows = selectionRows
             this.selectionRows = selectionRows
+
+            for (let i = 0; i < this.ipagination.current; i++) {
+                this.selectedRowKeysAll.push([])
+                this.selectionRowsAll.push([])
+            }
+            this.selectedRowKeysAll[this.ipagination.current - 1] = selectedRowKeys
+            this.selectionRowsAll[this.ipagination.current - 1] = selectionRows
+            console.log(this.selectedRowKeysAll,this.selectionRowsAll)
         },
         },
         getDataSource(current, pageSize) {
         getDataSource(current, pageSize) {
             console.log(pageSize)
             console.log(pageSize)
@@ -742,8 +786,12 @@ export default {
             this.$nextTick(() => {
             this.$nextTick(() => {
                 this.ipagination.current = current
                 this.ipagination.current = current
                 this.ipagination.pageSize = pageSize
                 this.ipagination.pageSize = pageSize
-                this.selectedRowKeys = []
-                this.selectionRows = []
+                for (let i = 0; i < this.ipagination.current; i++) {
+                    this.selectedRowKeysAll.push([])
+                    this.selectionRowsAll.push([])
+                }
+                this.selectedRowKeys = this.selectedRowKeysAll[current - 1]
+                this.selectionRows = this.selectionRowsAll[current - 1]
                 const paramsData = this.form.getFieldsValue()
                 const paramsData = this.form.getFieldsValue()
                 this.handleGetTableList(paramsData)
                 this.handleGetTableList(paramsData)
             })
             })
@@ -752,6 +800,8 @@ export default {
             this.ipagination.current = 1
             this.ipagination.current = 1
             this.selectedRowKeys = []
             this.selectedRowKeys = []
             this.selectionRows = []
             this.selectionRows = []
+            this.selectedRowKeysAll = []
+            this.selectionRowsAll = []
             event.preventDefault()
             event.preventDefault()
             const paramsData = this.form.getFieldsValue()
             const paramsData = this.form.getFieldsValue()
             this.handleGetTableList(paramsData)
             this.handleGetTableList(paramsData)
@@ -765,6 +815,8 @@ export default {
             this.ipagination.current = 1
             this.ipagination.current = 1
             this.selectedRowKeys = []
             this.selectedRowKeys = []
             this.selectionRows = []
             this.selectionRows = []
+            this.selectedRowKeysAll = []
+            this.selectionRowsAll = []
             this.form.resetFields()
             this.form.resetFields()
             if (this.tabKey == 1) {
             if (this.tabKey == 1) {
                 this.projectId = undefined
                 this.projectId = undefined
@@ -803,6 +855,7 @@ export default {
                         // }
                         // }
 
 
                         this.ipagination.total = result.total_num || 0
                         this.ipagination.total = result.total_num || 0
+
                         // result.result.total
                         // result.result.total
                     } else {
                     } else {
                         this.$message.error(result.message)
                         this.$message.error(result.message)
@@ -835,13 +888,14 @@ export default {
             this.columns = this.tabKey == 1 ? [...TTcolumns] : [...KScolumns]
             this.columns = this.tabKey == 1 ? [...TTcolumns] : [...KScolumns]
             this.url =
             this.url =
                 this.tabKey == 1
                 this.tabKey == 1
-                    ? process.env.VUE_APP_BASE_SCRIPT_URL + '/get_script_config_lst'
-                    : process.env.VUE_APP_BASE_SCRIPT_URL + '/get_query_word_task_info_lst'
+                    ? process.env.VUE_APP_BASE_SCRIPT_URL + '/get_script_config_lst/'
+                    : process.env.VUE_APP_BASE_SCRIPT_URL + '/get_query_word_task_info_lst/'
             if (this.tabKey == 1) {
             if (this.tabKey == 1) {
                 this.config_id = null
                 this.config_id = null
             }
             }
             this.selectedRowKeys = []
             this.selectedRowKeys = []
             this.selectionRows = []
             this.selectionRows = []
+            this.form.resetFields()
             const paramsData = this.form.getFieldsValue()
             const paramsData = this.form.getFieldsValue()
             this.handleGetTableList(paramsData)
             this.handleGetTableList(paramsData)
         },
         },
@@ -855,18 +909,6 @@ export default {
             }
             }
         },
         },
 
 
-        tableChange(pagination, filters, sorter, { currentDataSource }) {
-            console.log(pagination)
-            this.ipagination.current = pagination.current
-            this.ipagination.pageSize = pagination.pageSize
-            // if (sorter.order) {
-            //     this.order = sorter.order ? sorter.order : 'descend'
-            //     this.target = sorter.columnKey
-            // }
-            const paramsData = this.form.getFieldsValue()
-            this.handleGetTableList(paramsData)
-        },
-
         // table区域的tab切换
         // table区域的tab切换
         tableTabChange(key) {
         tableTabChange(key) {
             if (key == 1) {
             if (key == 1) {

+ 1 - 1
src/views/modules/stockWatch/modules/keep-person/keep-person.vue

@@ -332,7 +332,7 @@ export default {
             }).then((res) => {
             }).then((res) => {
                 // console.log(res)
                 // console.log(res)
                 if (res.success) {
                 if (res.success) {
-                // console.log(JSON.parse(res.result))
+                console.log(JSON.parse(res.result))
                 if (res.result) {
                 if (res.result) {
                     let columns = JSON.parse(res.result)
                     let columns = JSON.parse(res.result)
                     if (columns.length) {
                     if (columns.length) {

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 1343 - 0
src/views/modules/stockWatch/modules/new-keepManage/account-newkeepManage.vue


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 1294 - 0
src/views/modules/stockWatch/modules/new-keepManage/acountProjectData.js


+ 296 - 0
src/views/modules/stockWatch/modules/new-keepManage/customColumnProject.vue

@@ -0,0 +1,296 @@
+<template>
+    <div class="customColumnKS">
+      <a-modal v-model="visibleOk" title="自定义列" on-ok="handleOk" @cancel="handleCancel" width="65%">
+        <template slot="footer">
+          <a-button key="back" @click="handleCancel">取消</a-button>
+          <a-button key="submit" type="primary" :loading="loading" @click="handleOk">应用</a-button>
+        </template>
+        <!-- <a-input-search placeholder="输入要添加的列的名称" style="width: 40%" enter-button @search="onSearch" /> -->
+        <div class="zhuti">
+          <div class="addlist">
+            <p>可添加的列</p>
+            <div class="selectionList">
+              <!--  v-for="(item,index) in addColumns" :key="index" -->
+              <!-- <div v-if="mediaType==1"> -->
+                <selectComponent
+                :showCol="mylistNum"
+                @getshowlist="getshowlist"
+                :fixedCol="fiexColumn"
+                :mediaType='mediaType'
+                
+                />
+              <!-- </div> -->
+              <!-- <div v-if="mediaType==2">
+                <selectComponentKS
+                :showCol="mylistNum"
+                @getshowlist="getshowlist"
+                :fixedCol="fiexColumn"
+                :mediaType='mediaType'
+                
+              />
+              </div> -->
+              
+            </div>
+          </div>
+          <div class="listNum">
+            <p>已选{{mylistNum.length}}列</p>
+            <a-button id="btn" type="link" @click="clearAllList">清空全部</a-button>
+            <ul class="selectlist">
+                  <!-- draggable="true"
+                    @dragstart="handleDragStart($event, item.dataIndex)"
+                    @dragover.prevent="handleDragOver($event, item.dataIndex)"
+                    @dragenter="handleDragEnter($event, item.dataIndex)"
+                    @dragend="handleDragEnd($event, item.dataIndex)" -->
+              <li v-for="(item,index) in mylistNum" :key="index">
+                <span v-if=" index < fiexColumn.length">
+                  <a-icon type="lock" />
+                  <span class="listText">{{item.title}}</span>
+                </span>
+                <span v-else-if=" index >=fiexColumn.length"  >
+                  <a-icon type="menu" style="color:#ccc" />
+                  <span class="listText">{{item.title}}</span>
+                  <a-icon
+                    type="close"
+                    @click="deleteCol(item,index)"
+                    id="closeStyle"
+                    style="fontSize:12px;"
+                  />
+                </span>
+              </li>
+            </ul>
+          </div>
+        </div>
+      </a-modal>
+    </div>
+  </template>
+  
+  <script>
+  import selectComponent from './selectComponentPrject.vue'
+  export default {
+    components: {
+      selectComponent,
+    },
+    props: ['visible', 'listNum', 'fiexColumn','mediaType'],
+  
+    data() {
+      return {
+        dragging: null,
+        dataKey: 0,
+        visibleOk: false,
+        mylistNum: [],
+        loading: false
+      }
+    },
+    watch: {
+      visible(n, o) {
+        // console.log(n,o)
+        this.visibleOk = this.visible
+      },
+      listNum: {
+        handler(newValue, oldValue) {
+          this.mylistNum = newValue
+        },
+        immediate: true
+        // deep: true
+      }
+    },
+    methods: {
+       //li展示里的关闭按钮 删除当前被选中的这一个列
+      deleteCol(item, index) {
+        this.mylistNum = this.mylistNum.filter((item1, num) => {
+          return num != index
+        })
+      },
+      handleDragStart(e, item) {
+        this.dragging = item
+      },
+      handleDragEnd(e, item) {
+        this.dragging = null
+      },
+      //首先把div变成可以放置的元素,即重写dragenter/dragover
+      handleDragOver(e) {
+        e.dataTransfer.dropEffect = 'move' // e.dataTransfer.dropEffect="move";//在dragenter中针对放置目标来设置!
+      },
+      handleDragEnter(e, item) {
+        e.dataTransfer.effectAllowed = 'move' //为需要移动的元素设置dragstart事件
+        if (item === this.dragging) {
+          return
+        }
+        const newItems = [...this.mylistNum]
+        const src = newItems.findIndex(v => v.dataIndex === this.dragging)
+        const dst = newItems.findIndex(v => v.dataIndex === item)
+  
+        newItems.splice(dst, 0, ...newItems.splice(src, 1))
+  
+        this.mylistNum = newItems
+      },
+      //弹出框确定
+      handleOk(e) {
+        this.loading = false
+        this.visibleOk = false
+        this.$emit('closeCustomColumn', false)
+        this.$emit('changeColumn', this.mylistNum)
+      },
+      //取消按钮
+      handleCancel() {
+        this.visibleOk = false
+        this.$emit('closeCustomColumn', false)
+      },
+      //清空全部
+      clearAllList() {
+        this.mylistNum = [...this.fiexColumn]
+      },
+      //从自定义列拿选择的项
+      getshowlist(val) {
+        var arr = []
+  
+        // console.log(val)
+        if (val.length) {
+          if (val.flag) {
+            let newArr = val.arr
+            newVal.map((item, index) => {
+              // if(JSON.stringify(this.listNum).indexOf(JSON.stringify(item))==-1){
+              //  this.listNum.push(item); // 进行动态的操作
+              // }
+              var result = this.listNum.some(items => {
+                if (items.dataIndex == item.dataIndex) {
+                  return true
+                }
+              })
+  
+              // console.log(result)
+              if (result) {
+                newArr.splice(index, 1)
+              }
+            })
+  
+            this.mylistNum = [...this.mylistNum, ...newArr]
+          } else {
+            //取消全选  清楚listNum中的val里的值
+            val.arr.map((item, index) => {
+              var result = this.mylistNum.some(items => {
+                if (items.dataIndex == item.dataIndex) {
+                  return true
+                }
+              })
+              // console.log(result)
+              if (result) {
+                this.mylistNum.splice(index, 1)
+              }
+            })
+          }
+        } else {
+          arr = this.mylistNum.filter((item, index) => {
+            return item.dataIndex == val.dataIndex
+          })
+        }
+        if (arr.length) {
+          var index
+          this.mylistNum.map((item, ind) => {
+            if (item.dataIndex == val.dataIndex) {
+              index = ind
+            }
+          })
+          this.mylistNum.splice(index, 1)
+        } else {
+          this.mylistNum.push(val)
+        }
+      }
+    },
+    mounted() {
+    }
+  }
+  </script>
+  
+  <style lang="scss" scoped>
+  
+  
+  .addlist {
+    float: left;
+    width: 70%;
+    border: 1px solid #eee;
+    .selectionList {
+      padding: 10px 15px;
+      height: 450px;
+      overflow: auto;
+      .leibie {
+        .leiName {
+          font-size: 26px;
+          text-align: left;
+        }
+      }
+      .jutixiang {
+        display: inline-block;
+        width: 32%;
+        box-sizing: border-box;
+        padding: 10px 3px;
+      }
+    }
+  }
+  .listNum {
+    float: right;
+    width: 28%;
+    border: 1px solid #eee;
+    position: relative;
+  }
+  .zhuti {
+    margin-top: 15px;
+    overflow: hidden;
+  
+    p {
+      height: 40px;
+      line-height: 20px;
+      padding: 10px 15px;
+  
+      background: rgb(249, 250, 253);
+      border-bottom: 1px solid #eee;
+    }
+    #btn {
+      position: absolute;
+      right: 0;
+      top: 5px;
+    }
+    .selectlist {
+      width: 100%;
+      list-style: none;
+      margin: 0;
+      height: 450px;
+      padding: 0 15px 10px;
+      overflow: auto;
+  
+      li {
+        width: 100%;
+        padding: 5px 8px;
+        margin: 6px 0;
+        border-radius: 10px;
+        background: rgb(248, 248, 248);
+        height: 32px;
+        position: relative;
+        span {
+          width: 80%;
+          height: 100%;
+          display: inline-block;
+          margin: 0 10px;
+          // overflow:hidden;
+          // text-overflow:ellipsis;
+          // white-space: nowrap;
+        }
+        .listText {
+          position: absolute;
+          top: 2;
+          left: 10;
+          width: 60%;
+          overflow: hidden;
+          white-space: nowrap;
+          text-overflow: ellipsis;
+        }
+        #closeStyle {
+          position: absolute;
+          top: 9px;
+          right: 7px;
+        }
+      }
+    }
+  }
+  
+  </style>

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 1025 - 0
src/views/modules/stockWatch/modules/new-keepManage/group-keepManage.vue


+ 135 - 0
src/views/modules/stockWatch/modules/new-keepManage/new-keep-data.js

@@ -0,0 +1,135 @@
+/**
+ * @file 盯盘基础展示数据
+ * @author zhuxinbo(zhuxinbo@c-top.com.cn)
+ */
+ import moment from 'moment'
+ class keepPersonServer {
+     constructor() {}
+ 
+     // 固定不可删除的列
+     setNoDeleteColumns() {
+         return [
+             {
+                 title: '项目名称',
+                 dataIndex: 'projectName',
+                 scopedSlots: { customRender: 'projectName' },
+                 align: 'center',
+                 key: 'date',
+                 width: 200,
+                 fixed: 'left',
+             },
+             {
+                 title: '账户数量',
+                 dataIndex: 'accountNum',
+                 align: 'center',
+                 width: 100,
+                 fixed: 'left',
+             },
+             {
+                 title: '运营人员数量',
+                 dataIndex: 'userNum',
+                 scopedSlots: { customRender: 'userNum' },
+                 align: 'center',
+                 width: 100,
+                 fixed: 'left',
+                 sorter: () => {},
+             },
+             {
+                 title: '花费',
+                 dataIndex: 'totalCost',
+                 align: 'center',
+                 width: 100,
+                 fixed: 'left',
+                 sorter: () => {},
+             },
+             {
+                 title: '花费环比',
+                 dataIndex: 'yearOnYear',
+                 width: 150,
+                 tip: '',
+                 align: 'center',
+                 
+             },{
+                title: '花费同比',
+                dataIndex: 'equallyRate',
+                width: 150,
+                tip: '',
+                align: 'center',
+                
+            },
+         ]
+     }
+
+     setNoDeleteProjectColumns() {
+        return [
+            {
+                title: '账户名称',
+                dataIndex: 'authName',
+                scopedSlots: { customRender: 'authName' },
+                align: 'center',
+                key: 'date',
+                width: 200,
+                fixed: 'left',
+            },
+            {
+                title: '运营人员',
+                dataIndex: 'realname',
+                align: 'center',
+                width: 100,
+                fixed: 'left',
+            },
+            {
+                title: '花费',
+                dataIndex: 'totalCost',
+                scopedSlots: { customRender: 'totalCost' },
+                align: 'center',
+                width: 100,
+                fixed: 'left',
+                sorter: () => {},
+            },
+            {
+                title: '花费环比',
+                dataIndex: 'yearOnYear',
+                align: 'center',
+                width: 100,
+                fixed: 'left',
+                sorter: () => {},
+            },{
+                title: '花费同比',
+                dataIndex: 'equallyRate',
+                align: 'center',
+                width: 100,
+                fixed: 'left',
+                sorter: () => {},
+            },
+            
+        ]
+    }
+ 
+     // 默认初始展示列
+     setDefaultColumns() {
+         return [
+             
+         ]
+     }
+ 
+     //时间段筛选
+     setTimeRange() {
+         return {
+             昨天: [moment().subtract(1, 'days'), moment().subtract(1, 'days')],
+             // 今天: [moment(), moment()],
+     
+             近三天: [moment().subtract(3, 'days'), moment().subtract(1, 'days')],
+             近一周: [moment().subtract(7, 'days'), moment().subtract(1, 'days')],
+             近14天: [moment().subtract(14, 'days'), moment().subtract(1, 'days')],
+             近一月: [moment().subtract(1, 'months'), moment().subtract(1, 'days')],
+             近半年: [moment().subtract(6, 'months'), moment().subtract(1, 'days')],
+             近一年: [moment().subtract(12, 'months'), moment().subtract(1, 'days')],
+         }
+     }
+ 
+ 
+ }
+ 
+ export default new keepPersonServer();
+ 

+ 32 - 0
src/views/modules/stockWatch/modules/new-keepManage/new-keepManage.vue

@@ -0,0 +1,32 @@
+<template>
+    <div>
+       <newKeepManage v-if="disabledMange"></newKeepManage>
+       <newPersonal v-else></newPersonal>
+    </div>
+</template>
+
+
+<script>
+    import newKeepManage from './group-keepManage'
+    import newPersonal from './personal-keepManage.vue'
+    export default {
+        components:{
+            newKeepManage,
+            newPersonal
+        },
+        data() {
+            return {
+                disabledMange:true
+            }
+        },
+        mounted() {
+           
+            
+        },
+        methods: {
+            
+        
+        },
+    }
+
+</script>

+ 327 - 0
src/views/modules/stockWatch/modules/new-keepManage/personal-keepManage.vue

@@ -0,0 +1,327 @@
+<template>
+    <div>
+        <a-row :gutter="24" style="margin-bottom: 20px;">
+            <a-col :sm="18" :md="18" :xl="18" class="keep-manage-col">
+                <a-card class="card-content echarts-card">
+                    <div slot="title">
+                        数据总览 更新时间:{{updateAccountEchart||'-'}}
+                    </div>
+                    <div class="person-content-title" slot="extra">
+
+                        <div class="content-title-acount"></div>
+                        <div class="content-title-checkout">
+                            <span class="title-checkout-time">
+                                <a-range-picker v-model="dateEchart" :range="dateRanges" />
+                            </span>
+                        </div>
+                    </div>
+
+                    <div id="accountIndexEchart" ref="accountIndexEchart"
+                    style="width: 90%;height: 315px;margin: 0 auto;">
+                    <a-empty />
+                    </div>
+
+                </a-card>
+            </a-col>
+
+            <a-col :sm="6" :md="6" :xl="6"  class="keep-manage-col">
+                <a-card title="运营个人数据" class="card-content">
+                    <div style="width: 100%;height: 315px;">
+                        <ul class="group-keep-ul">
+                            <li>
+                                今日消耗: <span style="font-weight: bold;">21,233.958</span> 
+                            </li>
+                            <li>
+                                <span  style="margin-left:20%;" v-if="personData  < 0">
+                                    <img style=" width: 25px;height: 25px;" class="title-radio-img" src="@/assets/up.png" alt="">
+                                    <span style="color: green;">10%</span>
+                                </span>
+                                <span style="margin-left:20%;" v-else-if="personData>= 0">
+                                    <img style=" width: 25px;height: 25px;" class="title-radio-img" src="@/assets/down.png" alt="">
+                                    <span style="color: red;">10%</span>
+                                </span>
+                            </li>
+                            <li>
+                                消耗:118,2335.112
+                            </li>
+                            <li>
+                                <span>环比:</span>
+                                <span style="margin-left: 10%;" v-if="personData  < 0">
+                                    <img style=" width: 25px;height: 25px;" class="title-radio-img" src="@/assets/up.png" alt="">
+                                    <span style="color: green;">10%</span>
+                                </span>
+                                <span style="margin-left: 10%;" v-else-if="personData>= 0">
+                                    <img style=" width: 25px;height: 25px;" class="title-radio-img" src="@/assets/down.png" alt="">
+                                    <span style="color: red;">10%</span>
+                                </span>
+                            </li>
+                            <li>
+                                月消耗:12,520.525
+                            </li>
+                            <li>
+                                月激励:12,520.525
+                            </li>
+                            <li>
+                                月框返:12,520.525
+                            </li>
+                            <li>
+                                团队内排名:1/86
+                            </li>
+                        </ul>
+                        
+                      
+                    </div>
+                </a-card>
+            </a-col>
+        </a-row>
+
+        <a-row :gutter="24">
+            <a-col>
+                <a-card title="项目列表" >
+                    <div class="person-content-title" slot="extra">
+                        <div class="content-title-acount"></div>
+                        <div class="content-title-checkout">
+                            <span style="margin-right: 20px;">
+                                <a-button type="link">
+                                    自定义列
+                                  </a-button>
+                            </span>
+                            <span style="margin-right: 20px;">
+                                <a-range-picker
+                                v-model="dateMiddleProject"
+                                :ranges="dateRanges"
+                                />
+                            </span>
+                            <span>
+                                <a-radio-group v-model="projectAccount" >
+                                    <a-radio-button value="a">
+                                      项目
+                                    </a-radio-button>
+                                    <a-radio-button value="b">
+                                      账户
+                                    </a-radio-button>
+                                  </a-radio-group>
+                            </span>
+                        </div>
+                    </div>
+
+                    <a-table
+                    size="middle"
+                    :dataSource="echartsDataProject"
+                    :columns="columnsProject"
+                    bordered
+                    id="outTable"
+                    :pagination="echartsIpaginationProject"
+                    :loading="echartsLoading"
+                    ref="accountTable"
+                    ></a-table>
+
+                </a-card>
+            </a-col>
+        </a-row>
+    </div>
+</template>
+
+
+<script>
+    import keepPersonData from '../keep-manage/keep-manage-data.js';
+    import moment from 'moment';
+    // 引入基本模板
+    var echarts = require('echarts');
+    // 引入折线图组件
+    require('echarts/lib/chart/line');
+    // 引入提示框和title组件
+    require('echarts/lib/component/tooltip');
+    require('echarts/lib/component/title');
+    require('echarts/lib/component/graphic');
+    require('echarts/lib/component/toolbox');
+    require('echarts/lib/component/legend');
+    export default{
+        data() {
+            return {
+                updateAccountEchart:'2021-12-22 8:00:00',
+                dateEchart:[moment(), moment()],
+                dateRanges: keepPersonData.setTimeRange(),
+                personData:0,
+                dateMiddleProject:[moment(), moment()],
+                echartsDataProject:[],
+                echartsLoading: false,
+                projectAccount:'a',
+                echartsIpaginationProject:{
+                current: 1,
+                pageSize: 5,
+                //   pageSizeOptions: ['10', '20', '30'],
+                showTotal: (total, range) => {
+                return range[0] + '-' + range[1] + ' 共' + total + '条'
+                },
+                showQuickJumper: true,
+                // showSizeChanger: true,
+                // pageSizeOptions: ['10', '30', '50'],
+                total: 0,
+                onChange: (current, pageSize) => {
+                    // 切换分页时的回调,
+                    // 当在页面定义change事件时,切记要把此处的事件清除,因为这两个事件重叠了,可能到时候会导致一些莫名的bug
+                    this.echartsIpaginationProject.current = current
+                    this.echartsIpaginationProject.pageSize = pageSize
+                },
+                },
+                columnsProject:[
+                    {
+                    title: '项目名称',
+                    align: "center",
+                    dataIndex: ''
+                    },{
+                    title: '账户数量',
+                    align: "center",
+                    dataIndex: ''
+                    },{
+                    title: '运营人员',
+                    align: "center",
+                    dataIndex: ''
+                    },{
+                    title: '花费',
+                    align: "center",
+                    dataIndex: '',
+                    sorter: true,
+                    },{
+                    title: '花费环比',
+                    align: "center",
+                    dataIndex: ''
+                    },{
+                    title: '花费同比',
+                    align: "center",
+                    dataIndex: ''
+                    },{
+                    title: '上新素材数',
+                    align: "center",
+                    dataIndex: ''
+                    },{
+                    title: '有效素材数',
+                    align: "center",
+                    dataIndex: ''
+                    },{
+                    title: '爆款素材数',
+                    align: "center",
+                    dataIndex: ''
+                    },{
+                    title: '激活数',
+                    align: "center",
+                    dataIndex: ''
+                    },{
+                    title: '激活单价',
+                    align: "center",
+                    dataIndex: ''
+                    },{
+                    title: '行为数',
+                    align: "center",
+                    dataIndex: ''
+                    },
+                ]
+            }
+        },
+        mounted() {
+            this.getQueryNewlyData();
+        },
+        methods: {
+            getQueryNewlyData(){
+                this.initEchart('accountIndexEchart',this.initAccountIndexEchart())
+            },
+               //获取echart的值
+            initEchart(idName, optionName) {
+                let that = this;
+                const chart = this.$refs[idName]
+                //   // console.log(res);(chart)
+                if (chart) {
+                    console.log(chart);
+                    const myChart = echarts.init(document.getElementById(idName))
+                    // myChart.showLoading({
+                    //     text: "图表数据正在努力加载..."
+                    // });
+                    myChart.clear()
+                    myChart.setOption(optionName)
+                    window.addEventListener('resize', function() {
+                        that.clientWidth = document.documentElement.clientWidth - 224
+                        myChart.resize()
+                    })
+                }
+            },
+             //趋势图echarts配置
+             initAccountIndexEchart() {
+                // this.clientWidth  =  document.documentElement.clientWidth - 224
+                // var myChart = echarts.init(document.getElementById('accountIndexEchart'))
+                let option = {
+                  
+                    tooltip: {
+                        trigger: 'axis'
+                    },
+                    legend: {
+                        data: ['today','yesterday']
+                    },
+                    grid: {
+                        left: '3%',
+                        right: '4%',
+                        bottom: '3%',
+                        containLabel: true
+
+                    },
+                    // toolbox: {
+                    //     feature: {
+                    //         saveAsImage: {}
+                    //     }
+                    // },
+                    xAxis: {
+                        type: 'category',
+                        boundaryGap: false,
+                        data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
+                    },
+                    yAxis: {
+                        type: 'value'
+                    },
+                    series: [
+                        {
+                            name: 'today',
+                            type: 'line',
+                            smooth: true,
+                            symbol: 'circle',
+                            data: [120, 132, 101, 134, 90, 230, 210],
+                            lineStyle: {                               
+                            color: '#00BFFF',   
+                            width: 2,
+                            },
+                            itemStyle:{
+                            color:'#00BFFF',
+                            borderWidth:2,
+                            borderColor:'#00BFFF'
+                            },
+                        },
+                        {
+                            name: 'yesterday',
+                            type: 'line',
+                            smooth: true,
+                            symbol: 'circle',
+                            data: [220, 182, 191, 234, 290, 330, 310],
+                            lineStyle: {                               
+                            color: '#00FF7F',   
+                            width: 2,
+                            },
+                            itemStyle:{
+                            color:'#00FF7F',
+                            borderWidth:2,
+                            borderColor:'#00FF00'
+                            },
+                        },
+                       
+                    ]
+                };
+                return option
+            },
+        },
+    }
+</script>
+<style lang="less" scoped>
+     @import "../keep-manage/keep-manage.less";
+    .group-keep-ul li{
+    margin-bottom: 15px;
+    font-size: 16px;
+}
+</style>

+ 240 - 0
src/views/modules/stockWatch/modules/new-keepManage/selectComponentPrject.vue

@@ -0,0 +1,240 @@
+<template>
+    <div>
+      <div v-for="(item,index) in customFields" :key="index">
+        <div class="leibie">
+          <p class="leiName">{{item.title}}</p>
+          <!-- <span class="jutixiang">
+            <a-checkbox
+              :value="index"
+              name="type"
+              @change="isSelectAll($event,index)"
+              :checked="item.checkall"
+            >全选</a-checkbox>
+          </span> -->
+          <!-- {{item.form}} -->
+          <a-checkbox-group v-model="item.form" >
+            <span class="jutixiang" v-for="(zhi,num) in item.specificFields " :key="num">
+  
+              <a-checkbox :value="zhi.dataIndex" :disabled="zhi.disabled"  name="type" @change="checkboxClick(zhi)">
+                <a-tooltip
+                  class="select-component"
+                  placement="top"
+                  :title="zhi.tip"
+                  :overlayClassName="tooltipShow"
+                >{{zhi.title}}</a-tooltip>
+              </a-checkbox>
+            </span>
+          </a-checkbox-group>
+        </div>
+      </div>
+    </div>
+  </template>
+  
+  <script>
+  import  {customFieldsSource ,KScustomFields}  from './acountProjectData.js'
+  // let customFields=customFields
+  export default {
+    props: ['showCol','fixedCol','mediaType'],
+    data() {
+      return {
+          // customFields,
+        customFields:[],
+        quanxuanflag: [],
+        hovered: false,
+        tooltipShow: 'tooltipShow',
+        toParentArr: []
+      }
+    },
+    watch: {
+      
+      showCol(n) {
+        // console.log(n)
+        //
+        if (this.showCol.length == this.fixedCol.length) {
+  
+          for (let i = 0; i < this.customFields.length; i++) {
+            this.customFields[i].form=[]          
+          }
+          this.showCol.map((item, index) => {
+            this.customFields.map((it, ind) => {
+              it.specificFields.map((i, d) => {
+                if (i.dataIndex === item.dataIndex) {
+                  it.form.push(item.dataIndex)
+                }else{
+  
+                }
+              })
+            })
+          })
+        } else {
+          
+         for (let i = 0; i < this.customFields.length; i++) {
+            this.customFields[i].form=[]
+            
+          }
+          n.map((item, index) => {
+            this.customFields.map((it, ind) => {
+              it.specificFields.map((i, d) => {
+                if (i.dataIndex === item.dataIndex) {
+                  it.form.push(item.dataIndex)
+                }else{
+  
+                }
+              })
+            })
+          })
+        }
+        // console.log(this.form)
+      },
+    
+    },
+    mounted() {
+      if(this.mediaType==1){
+        //头条自定义列
+        this.customFields=customFieldsSource
+      }else if(this.mediaType==2){
+        //快手自定义列
+        this.customFields=KScustomFields
+      }
+      for (let i = 0; i < this.customFields.length; i++) {
+        this.customFields[i].form=[]
+      }
+      // console.log(1)
+      this.showCol.map((item, index) => {
+        this.customFields.map((it, ind) => {
+          it.specificFields.map((i, d) => {
+            if (i.dataIndex === item.dataIndex) {
+              it.form.push(item.dataIndex)
+            }
+          })
+        })
+      })
+      this.fixedCol.map((item, index) => {
+        this.customFields.map((it, ind) => {
+          it.specificFields.map((i, d) => {
+            if (i.dataIndex === item.dataIndex) {
+              i.disabled=true;
+            }
+          })
+        })
+      })
+  
+  
+      console.log(this.customFields, 'customFields-customFields');
+      
+    },
+    methods: {
+      hide() {
+        this.clicked = false
+        this.hovered = false
+      },
+      handleHoverChange(visible) {
+        this.clicked = false
+        this.hovered = visible
+      },
+      getPopupContainer() {
+        console.log(this)
+      },
+  
+      //全选框   判断是否全选
+      isSelectAll(e, val) {
+        //像父元素传递
+        console.log(e, val)
+        let arr=JSON.parse(JSON.stringify(this.customFields[val].specificFields))
+        let valArr={
+          flag:true,
+          arr
+        }
+        this.customFields[val].checkall = e.target.checked
+        console.log(this.customFields[val].checkall)
+  
+        if (this.customFields[val].checkall) {
+         
+          this.customFields[val].form=[]
+   
+          this.customFields[val].specificFields.map((item, index) => {
+  
+            this.customFields[val].form.push(item.dataIndex)
+  
+          })
+          valArr.flag=true;
+          this.$emit('getshowlist', valArr)
+        } else {
+          console.log(this.customFields[val])
+          this.customFields[val].form=[];
+          valArr.flag=false;
+          console.log(this.customFields[val].form=[])
+          this.$emit('getshowlist', valArr)
+        }
+  
+        console.log(this.form[val])
+      },
+  
+      onChange(){
+          
+      },
+  
+      //复选框的点击事件
+      checkboxClick(val) {
+        // console.log(val)
+      //   this.$emit('update:count',)
+        this.$emit('getshowlist', val)
+        // console.log(val,this.customFields[0].form)
+        // this.customFields[val].checkall=!this.customFields[val].checkall
+        // for (let i = 0; i < this.customFields.length; i++) {
+        //   // console.log(this.customFields[0].form,this.customFields[i].specificFields.length)
+        //   if(this.customFields[i].form.length==this.customFields[i].specificFields.length-1){
+        //       this.customFields[i].checkall=true;
+        //   }else{
+        //     this.customFields[i].checkall=false;
+        //   }
+            
+        //   }
+      }
+    }
+  }
+  </script>
+  <style>
+  .tooltipShow {
+    max-width: 30%;
+  }
+  .tooltipShow .ant-tooltip-content .ant-tooltip-inner {
+    background: white;
+    font-size: 10px;
+    color: #333;
+  }
+  .ant-tooltip-content .ant-tooltip-arrow::before {
+    background-color: white;
+  }
+  </style>
+  <style lang="scss" scoped>
+  .leibie {
+    width: 100%;
+    margin-bottom: 10px;
+    .leiName {
+      font-size: 20px;
+      text-align: left;
+      margin-bottom: 5px;
+      margin-top: 0px;
+    }
+  }
+  .jutixiang {
+    display: inline-block;
+    width: 32%;
+    box-sizing: border-box;
+    padding: 8px 3px;
+    height: 30px;
+    overflow: hidden;
+    text-overflow: ellipsis;
+  }
+  
+  .ant-tooltip-content .tooltipShow {
+    background: #eee;
+    font-size: 10px;
+    color: #333;
+  }
+  
+  .ant-checkbox-group {
+    width: 100%;
+  }
+  </style>

+ 16 - 1
src/views/user/Login.vue

@@ -159,7 +159,7 @@
 //import md5 from "md5"
 //import md5 from "md5"
 import api from '@/api'
 import api from '@/api'
 import TwoStepCaptcha from '@/components/tools/TwoStepCaptcha'
 import TwoStepCaptcha from '@/components/tools/TwoStepCaptcha'
-import { mapActions } from 'vuex'
+import { mapActions, mapGetters } from 'vuex'
 import { timeFix } from '@/utils/util'
 import { timeFix } from '@/utils/util'
 import Vue from 'vue'
 import Vue from 'vue'
 import { ACCESS_TOKEN } from '@/store/mutation-types'
 import { ACCESS_TOKEN } from '@/store/mutation-types'
@@ -287,6 +287,7 @@ export default {
   },
   },
   methods: {
   methods: {
     ...mapActions(['Login', 'Logout', 'PhoneLogin']),
     ...mapActions(['Login', 'Logout', 'PhoneLogin']),
+    ...mapGetters(['userInfo']),
     setData() {
     setData() {
       if (this.creativeTag == 'huichuang') {
       if (this.creativeTag == 'huichuang') {
         this.appId = 'ww24b8a47826f5875f'
         this.appId = 'ww24b8a47826f5875f'
@@ -446,6 +447,20 @@ export default {
       this.$router.push({
       this.$router.push({
         path: '/dashboard/analysis',
         path: '/dashboard/analysis',
       })
       })
+      if (this.userInfo().id == '4aba62011120ac565c7f2b9f8f4aa96b' || this.userInfo().id == 'e9ca23d68d884d4ebb19d07889727dae') {
+                    const a = document.createElement('a');
+                    document.body.appendChild(a);
+                    a.style.display = 'none';
+                    a.href = 'http://192.168.0.195:9001/boss-data-kanban';
+                    a.target = '_blank'
+                    a.click();
+                    document.body.removeChild(a);
+        // let tempPage = window.open('', '_blank');
+        // tempPage.location="/boss-data-kanban";
+        // window.open("/boss-data-kanban","_blank")
+        
+      }
+      
       this.$notification.success({
       this.$notification.success({
         message: '欢迎',
         message: '欢迎',
         description: `${timeFix()},欢迎回来`,
         description: `${timeFix()},欢迎回来`,

+ 2 - 2
vue.config.js

@@ -105,7 +105,7 @@ module.exports = {
         // target: 'http://192.168.1.43:8088', //请求本地 需要jeecg-boot后台项目  毕洁泉
         // target: 'http://192.168.1.43:8088', //请求本地 需要jeecg-boot后台项目  毕洁泉
         // target: 'http://192.168.1.43:8806', //请求本地 需要jeecg-boot后台项目  毕洁泉
         // target: 'http://192.168.1.43:8806', //请求本地 需要jeecg-boot后台项目  毕洁泉
         // target: 'http://192.168.0.252:8098', //请求本地 需要jeecg-boot后台项目  毕洁泉
         // target: 'http://192.168.0.252:8098', //请求本地 需要jeecg-boot后台项目  毕洁泉
-        target: 'http://192.168.1.59:7701', //请求本地 需要jeecg-boot后台项目  赵西安
+        // target: 'http://192.168.1.59:7701', //请求本地 需要jeecg-boot后台项目  赵西安
         // target: 'http://192.168.1.193:8080', //请求本地 需要jeecg-boot后台项目  李煜一
         // target: 'http://192.168.1.193:8080', //请求本地 需要jeecg-boot后台项目  李煜一
         // target: 'http://192.168.1.193:31012', //请求本地 需要jeecg-boot后台项目  李煜一
         // target: 'http://192.168.1.193:31012', //请求本地 需要jeecg-boot后台项目  李煜一
         // target: 'http://api.tjyourong.com.cn', //请求本地 需要jeecg-boot后台项目
         // target: 'http://api.tjyourong.com.cn', //请求本地 需要jeecg-boot后台项目
@@ -119,7 +119,7 @@ module.exports = {
         // target:'http://gateway.tjyourong.com.cn', //测试
         // target:'http://gateway.tjyourong.com.cn', //测试
         // target:'http://apipre.tjyourong.com.cn', //预生产
         // target:'http://apipre.tjyourong.com.cn', //预生产
         // target: 'http://192.168.1.134:7001', //请求本地 需要jeecg-boot后台项目  周泽宇
         // target: 'http://192.168.1.134:7001', //请求本地 需要jeecg-boot后台项目  周泽宇
-        // target:'http://192.168.0.195:9999/',
+        target:'http://192.168.0.195:9999/',
         // target:'http://gateway.tjyourong.com.cn/',//测试
         // target:'http://gateway.tjyourong.com.cn/',//测试
 
 
         ws: false,
         ws: false,