Parcourir la source

Merge branch 'feature/work-jyf' of http://git.tjyourong.com.cn/ctop/adsp-vue into feature/work-jyf

jiayufei il y a 3 ans
Parent
commit
fbaf3aa5e1
86 fichiers modifiés avec 13194 ajouts et 27333 suppressions
  1. 264 0
      package-lock.json
  2. 3 2
      package.json
  3. 0 8643
      public/ckplayer/ckplayer.js
  4. 0 120
      public/ckplayer/ckplayer.min.js
  5. 0 110
      public/ckplayer/ckplayer.xml
  6. 0 28
      public/ckplayer/hls/LICENSE
  7. 0 15403
      public/ckplayer/hls/hls.js
  8. 0 7
      public/ckplayer/hls/hls.min.js
  9. 0 46
      public/ckplayer/language.xml
  10. 0 739
      public/ckplayer/style.xml
  11. 4 4
      public/index.html
  12. 3 3
      src/api/video.js
  13. BIN
      src/assets/img/test.jpg
  14. 1 1
      src/components/README.md
  15. 1 1
      src/components/tools/UserPassword.vue
  16. 19 15
      src/components/uploadFile.vue
  17. 6 0
      src/config/router.config.js
  18. 1 0
      src/filters.js
  19. 405 0
      src/mixins/videoMaterialMixin.js
  20. 2 2
      src/utils/request.js
  21. 1 1
      src/views/account/settings/BaseSetting.vue
  22. 0 1
      src/views/dashboard/Analysis.vue
  23. 1 1
      src/views/modules/BatchCreate/components/Treeselect.vue
  24. 4 1
      src/views/modules/Statistics/KSAccountReport.vue
  25. 56 0
      src/views/modules/Statistics/change-face/change-face.less
  26. 445 0
      src/views/modules/Statistics/change-face/change-face.vue
  27. 10 2
      src/views/modules/Statistics/newHome.vue
  28. 873 892
      src/views/modules/Statistics/newPlanStatic/newPlanStatic.vue
  29. 639 690
      src/views/modules/Statistics/popularVideo.vue
  30. 4 0
      src/views/modules/Statistics/videoStatics/KSvideoStatics.vue
  31. 19 2
      src/views/modules/account-config/components/configuration-copy.vue
  32. 21 2
      src/views/modules/account-config/components/configuration-modal.vue
  33. 1 1
      src/views/modules/advertiser/UserAllocationList.vue
  34. 2 2
      src/views/modules/advertiser/modules/BindAccountLoginModal__Style#Drawer.vue
  35. 1 1
      src/views/modules/advertiser/modules/ProjectModal.vue
  36. 2 2
      src/views/modules/advertiser/modules/UserAllocationModal.vue
  37. 4 4
      src/views/modules/advertiser/modules/UserAllocationModal__Style#Drawer.vue
  38. 1 1
      src/views/modules/advertiser/modules/productModal.vue
  39. 1 1
      src/views/modules/advertiser/modules/projectListModal.vue
  40. 29 17
      src/views/modules/autoLaunch/configLaunchInfo.vue
  41. 1 0
      src/views/modules/autoLaunch/configProject/creatConfig.vue
  42. 3 0
      src/views/modules/autoLaunch/directional/components/targetedPopulation.vue
  43. 3 3
      src/views/modules/autoLaunch/directional/components/templateModal.vue
  44. 3 0
      src/views/modules/autoLaunch/material-all/components/targetedPopulation.vue
  45. 1 1
      src/views/modules/autoLaunch/material-all/components/templateModal.vue
  46. 3170 0
      src/views/modules/autoLaunch/material-test/creatMaterialTest.vue
  47. 1673 0
      src/views/modules/autoLaunch/material-test/index.vue
  48. 1136 0
      src/views/modules/autoLaunch/material-test/lookPreview.vue
  49. 304 0
      src/views/modules/autoLaunch/material-test/treeSelectAccount.vue
  50. 4 0
      src/views/modules/autoLaunch/setDirectional.vue
  51. 8 1
      src/views/modules/crowd-control/crowd-control.vue
  52. 673 0
      src/views/modules/earlyWarningRules/accountClear/createClear.vue
  53. 972 0
      src/views/modules/earlyWarningRules/accountClear/index.vue
  54. 1 0
      src/views/modules/kuaishouapp/account/copyAllUnit.vue
  55. 3 0
      src/views/modules/kuaishouapp/account/editGroup.vue
  56. 4 0
      src/views/modules/kuaishouapp/account/editGroupNew.vue
  57. 3 0
      src/views/modules/kuaishouapp/account/stepForm/Step2.vue
  58. 2 2
      src/views/modules/kuaishouapp/account/stepForm/Step3.vue
  59. 2 2
      src/views/modules/kuaishouapp/account/stepForm/Step4.vue
  60. 3 0
      src/views/modules/kuaishouapp/account/stepForm/stepModule/newModulePop.vue
  61. 3 0
      src/views/modules/kuaishouapp/account/stepForm/stepModule/targetedPopulation.vue
  62. 0 1
      src/views/modules/kuaishouapp/account/stepForm/stepModule/test.vue
  63. 17 1
      src/views/modules/kuaishouapp/batchCreation/creat/creatUnit.vue
  64. 2 2
      src/views/modules/kuaishouapp/creativeCreate.vue
  65. 9 0
      src/views/modules/kuaishouapp/crossAccount/createUnit.vue
  66. 3 0
      src/views/modules/kuaishouapp/groupCreate.vue
  67. 3 0
      src/views/modules/kuaishouapp/newBatch/index.vue
  68. 3 5
      src/views/modules/material/accountCheck.vue
  69. 7 7
      src/views/modules/material/materialList.vue
  70. 895 5
      src/views/modules/material/videoMaterial.vue
  71. 9 12
      src/views/modules/onlineTraining/onlineTrainingList.vue
  72. 6 6
      src/views/modules/policy-management/policy-management-server.js
  73. 104 1
      src/views/modules/policy-management/policy-management.less
  74. 216 98
      src/views/modules/policy-management/policy-management.vue
  75. 11 0
      src/views/modules/settlement-account/settlement-account-server.js
  76. 408 194
      src/views/modules/settlement-account/settlement-account.vue
  77. 11 0
      src/views/modules/settlement-information/settlement-information-server.js
  78. 1 1
      src/views/modules/settlement-information/settlement-information.less
  79. 587 173
      src/views/modules/settlement-information/settlement-information.vue
  80. 2 2
      src/views/modules/user-manage-operation/user-manage-operation-server.js
  81. 1 1
      src/views/modules/workBench/placeOrder.vue
  82. 4 4
      src/views/system/modules/PasswordModal.vue
  83. 4 4
      src/views/system/modules/UserModal.vue
  84. 10 7
      src/views/user/Login.vue
  85. 6 6
      src/views/user/layer.vue
  86. 80 49
      vue.config.js

+ 264 - 0
package-lock.json

@@ -1252,6 +1252,21 @@
         "to-fast-properties": "^2.0.0"
       }
     },
+    "@femessage/img-preview": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/@femessage/img-preview/-/img-preview-1.5.0.tgz",
+      "integrity": "sha512-omjNTkU5tVGp9EahcMq5QeL/Va9O4bcddKy4p94aYo5Zr7R6cE8UCqLVl18uLbUfwGLuxBeIG225t1CHjCAgOw=="
+    },
+    "@femessage/upload-to-ali": {
+      "version": "1.9.2",
+      "resolved": "https://registry.npmjs.org/@femessage/upload-to-ali/-/upload-to-ali-1.9.2.tgz",
+      "integrity": "sha512-ej83NZ8UqcAcJhu+ym6qrIy+YGIg24FhJqDLiPiLVF5NTTcKtqIN2Rj9r6zjVO6QU2bdkirAzJKit/nyxQbO4A==",
+      "requires": {
+        "@femessage/img-preview": "^1.2.0",
+        "ali-oss": "^6.0.1",
+        "image-compressor.js": "^1.1.4"
+      }
+    },
     "@hapi/address": {
       "version": "2.1.4",
       "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz",
@@ -1375,6 +1390,33 @@
       "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==",
       "dev": true
     },
+    "@npmcli/move-file": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz",
+      "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==",
+      "dev": true,
+      "requires": {
+        "mkdirp": "^1.0.4",
+        "rimraf": "^3.0.2"
+      },
+      "dependencies": {
+        "mkdirp": {
+          "version": "1.0.4",
+          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+          "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+          "dev": true
+        },
+        "rimraf": {
+          "version": "3.0.2",
+          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+          "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+          "dev": true,
+          "requires": {
+            "glob": "^7.1.3"
+          }
+        }
+      }
+    },
     "@riophae/vue-treeselect": {
       "version": "0.4.0",
       "resolved": "https://registry.npmjs.org/@riophae/vue-treeselect/-/vue-treeselect-0.4.0.tgz",
@@ -3588,6 +3630,24 @@
         "humanize-ms": "^1.2.1"
       }
     },
+    "aggregate-error": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
+      "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
+      "dev": true,
+      "requires": {
+        "clean-stack": "^2.0.0",
+        "indent-string": "^4.0.0"
+      },
+      "dependencies": {
+        "indent-string": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
+          "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
+          "dev": true
+        }
+      }
+    },
     "ajv": {
       "version": "6.12.6",
       "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
@@ -4998,6 +5058,11 @@
       "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
       "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg=="
     },
+    "blueimp-canvas-to-blob": {
+      "version": "3.28.0",
+      "resolved": "https://registry.npmjs.org/blueimp-canvas-to-blob/-/blueimp-canvas-to-blob-3.28.0.tgz",
+      "integrity": "sha512-5q+YHzgGsuHQ01iouGgJaPJXod2AzTxJXmVv90PpGrRxU7G7IqgPqWXz+PBmt3520jKKi6irWbNV87DicEa7wg=="
+    },
     "blueimp-md5": {
       "version": "2.18.0",
       "resolved": "https://registry.npmjs.org/blueimp-md5/-/blueimp-md5-2.18.0.tgz",
@@ -5580,6 +5645,12 @@
         "source-map": "~0.6.0"
       }
     },
+    "clean-stack": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
+      "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
+      "dev": true
+    },
     "cli-cursor": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
@@ -6005,6 +6076,114 @@
         }
       }
     },
+    "compression-webpack-plugin": {
+      "version": "5.0.2",
+      "resolved": "https://registry.npmjs.org/compression-webpack-plugin/-/compression-webpack-plugin-5.0.2.tgz",
+      "integrity": "sha512-F2G4cQfsMZ6CiPlG22Q5EDUCqnfyZqTjyJP5cMgNYUbBg/dUzV3hto8yTFFIogDCTWooVbePHQE0qL6FrJUSsA==",
+      "dev": true,
+      "requires": {
+        "cacache": "^15.0.5",
+        "find-cache-dir": "^3.3.1",
+        "schema-utils": "^2.7.0",
+        "serialize-javascript": "^4.0.0",
+        "webpack-sources": "^1.4.3"
+      },
+      "dependencies": {
+        "cacache": {
+          "version": "15.2.0",
+          "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.2.0.tgz",
+          "integrity": "sha512-uKoJSHmnrqXgthDFx/IU6ED/5xd+NNGe+Bb+kLZy7Ku4P+BaiWEUflAKPZ7eAzsYGcsAGASJZsybXp+quEcHTw==",
+          "dev": true,
+          "requires": {
+            "@npmcli/move-file": "^1.0.1",
+            "chownr": "^2.0.0",
+            "fs-minipass": "^2.0.0",
+            "glob": "^7.1.4",
+            "infer-owner": "^1.0.4",
+            "lru-cache": "^6.0.0",
+            "minipass": "^3.1.1",
+            "minipass-collect": "^1.0.2",
+            "minipass-flush": "^1.0.5",
+            "minipass-pipeline": "^1.2.2",
+            "mkdirp": "^1.0.3",
+            "p-map": "^4.0.0",
+            "promise-inflight": "^1.0.1",
+            "rimraf": "^3.0.2",
+            "ssri": "^8.0.1",
+            "tar": "^6.0.2",
+            "unique-filename": "^1.1.1"
+          }
+        },
+        "chownr": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
+          "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
+          "dev": true
+        },
+        "lru-cache": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+          "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+          "dev": true,
+          "requires": {
+            "yallist": "^4.0.0"
+          }
+        },
+        "mkdirp": {
+          "version": "1.0.4",
+          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+          "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+          "dev": true
+        },
+        "p-map": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
+          "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
+          "dev": true,
+          "requires": {
+            "aggregate-error": "^3.0.0"
+          }
+        },
+        "rimraf": {
+          "version": "3.0.2",
+          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+          "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+          "dev": true,
+          "requires": {
+            "glob": "^7.1.3"
+          }
+        },
+        "ssri": {
+          "version": "8.0.1",
+          "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz",
+          "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==",
+          "dev": true,
+          "requires": {
+            "minipass": "^3.1.1"
+          }
+        },
+        "tar": {
+          "version": "6.1.10",
+          "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.10.tgz",
+          "integrity": "sha512-kvvfiVvjGMxeUNB6MyYv5z7vhfFRwbwCXJAeL0/lnbrttBVqcMOnpHUf0X42LrPMR8mMpgapkJMchFH4FSHzNA==",
+          "dev": true,
+          "requires": {
+            "chownr": "^2.0.0",
+            "fs-minipass": "^2.0.0",
+            "minipass": "^3.0.0",
+            "minizlib": "^2.1.1",
+            "mkdirp": "^1.0.3",
+            "yallist": "^4.0.0"
+          }
+        },
+        "yallist": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+          "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+          "dev": true
+        }
+      }
+    },
     "concat-map": {
       "version": "0.0.1",
       "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
@@ -9681,6 +9860,15 @@
         "universalify": "^0.1.0"
       }
     },
+    "fs-minipass": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
+      "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
+      "dev": true,
+      "requires": {
+        "minipass": "^3.0.0"
+      }
+    },
     "fs-write-stream-atomic": {
       "version": "1.0.10",
       "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz",
@@ -10559,6 +10747,15 @@
       "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==",
       "dev": true
     },
+    "image-compressor.js": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/image-compressor.js/-/image-compressor.js-1.1.4.tgz",
+      "integrity": "sha512-DF1YFSw+m6FqpXsleD4+q9eu/wFFkm8sHuYhgYy5GWFVencXeuB1/UqC12xz+dCZooPetf5LIb8JOGkgEWmlcg==",
+      "requires": {
+        "blueimp-canvas-to-blob": "^3.14.0",
+        "is-blob": "^1.0.0"
+      }
+    },
     "image-size": {
       "version": "0.5.5",
       "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz",
@@ -10878,6 +11075,11 @@
         "binary-extensions": "^2.0.0"
       }
     },
+    "is-blob": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-blob/-/is-blob-1.0.0.tgz",
+      "integrity": "sha1-o9fZb+HD/wZex84nwsIea6ksGDI="
+    },
     "is-boolean-object": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.0.tgz",
@@ -12285,6 +12487,68 @@
       "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
       "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
     },
+    "minipass": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz",
+      "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==",
+      "dev": true,
+      "requires": {
+        "yallist": "^4.0.0"
+      },
+      "dependencies": {
+        "yallist": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+          "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+          "dev": true
+        }
+      }
+    },
+    "minipass-collect": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz",
+      "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==",
+      "dev": true,
+      "requires": {
+        "minipass": "^3.0.0"
+      }
+    },
+    "minipass-flush": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz",
+      "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==",
+      "dev": true,
+      "requires": {
+        "minipass": "^3.0.0"
+      }
+    },
+    "minipass-pipeline": {
+      "version": "1.2.4",
+      "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz",
+      "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==",
+      "dev": true,
+      "requires": {
+        "minipass": "^3.0.0"
+      }
+    },
+    "minizlib": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
+      "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
+      "dev": true,
+      "requires": {
+        "minipass": "^3.0.0",
+        "yallist": "^4.0.0"
+      },
+      "dependencies": {
+        "yallist": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+          "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+          "dev": true
+        }
+      }
+    },
     "mississippi": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz",

+ 3 - 2
package.json

@@ -75,6 +75,7 @@
     "@vue/eslint-config-standard": "^4.0.0",
     "babel-eslint": "^10.0.1",
     "babel-plugin-component": "^1.1.1",
+    "compression-webpack-plugin": "^5.0.1",
     "eslint": "^5.16.0",
     "eslint-plugin-vue": "^5.1.0",
     "html-webpack-plugin": "^3.2.0",
@@ -82,9 +83,9 @@
     "less-loader": "^4.1.0",
     "node-sass": "^4.11.0",
     "sass-loader": "^7.0.1",
-    "vue-template-compiler": "^2.6.10",
     "style-resources-loader": "^1.3.2",
-    "vue-cli-plugin-style-resources-loader": "^0.1.3"
+    "vue-cli-plugin-style-resources-loader": "^0.1.3",
+    "vue-template-compiler": "^2.6.10"
   },
   "eslintConfig": {
     "root": true,

Fichier diff supprimé car celui-ci est trop grand
+ 0 - 8643
public/ckplayer/ckplayer.js


Fichier diff supprimé car celui-ci est trop grand
+ 0 - 120
public/ckplayer/ckplayer.min.js


Fichier diff supprimé car celui-ci est trop grand
+ 0 - 110
public/ckplayer/ckplayer.xml


+ 0 - 28
public/ckplayer/hls/LICENSE

@@ -1,28 +0,0 @@
-Copyright (c) 2017 Dailymotion (http://www.dailymotion.com)
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-
-src/remux/mp4-generator.js and src/demux/exp-golomb.js implementation in this project
-are derived from the HLS library for video.js (https://github.com/videojs/videojs-contrib-hls)
-
-That work is also covered by the Apache 2 License, following copyright:
-Copyright (c) 2013-2015 Brightcove
-
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.

Fichier diff supprimé car celui-ci est trop grand
+ 0 - 15403
public/ckplayer/hls/hls.js


Fichier diff supprimé car celui-ci est trop grand
+ 0 - 7
public/ckplayer/hls/hls.min.js


+ 0 - 46
public/ckplayer/language.xml

@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-	<language>
-		<adCountdown>[$second]</adCountdown><!--广告播放结束倒计时-->
-		<skipDelay>[$second]</skipDelay>
-		<buttonOver>
-			<play>点击播放</play>
-			<pause>暂停播放</pause>
-			<mute>静音</mute>
-			<escMute>恢复音量</escMute>
-			<full>全屏</full>
-			<escFull>退出全屏</escFull>
-			<previousPage>上一集</previousPage>
-			<nextPage>下一集</nextPage>
-			<definition>点击选择清晰度</definition>
-			<subtitle>选择字幕</subtitle>
-		</buttonOver>
-		<volumeSliderOver>
-			音量:[$volume]%
-		</volumeSliderOver>
-		<buffer>[$percentage]%</buffer>
-		<timeSliderOver><!--鼠标经过进度条显示的时间格式-->
-			[$timeh]:[$timei]:[$times]
-		</timeSliderOver>
-		<liveAndVod>
-			[$timeh]:[$timei]:[$times]
-		</liveAndVod>
-		<live>
-			直播中 [$liveTimeY]-[$liveTimem]-[$liveTimed] [$liveTimeh]:[$liveTimei]:[$liveTimes]
-		</live>
-		<m3u8Definition>
-			<name>流畅</name>
-			<name>低清</name>
-			<name>标清</name>
-			<name>高清</name>
-			<name>超清</name>
-			<name>蓝光</name>
-			<name>未知</name>
-		</m3u8Definition>
-		<error>
-			<cannotFindUrl>视频地址不存在</cannotFindUrl>
-			<streamNotFound>加载失败</streamNotFound>
-			<formatError>视频格式错误</formatError>
-		</error>
-		<definition>自动</definition>
-		<subtitle>默认</subtitle>
-	</language>

Fichier diff supprimé car celui-ci est trop grand
+ 0 - 739
public/ckplayer/style.xml


+ 4 - 4
public/index.html

@@ -280,9 +280,9 @@
   <script>
     window._CONFIG = {};
     // window._CONFIG['domianURL'] = 'http://192.168.1.72:8088/jeecg-boot';
-    window._CONFIG['domianURL'] = 'http://139.186.31.213:8804/jeecg-boot';
-    window._CONFIG['imgDomainURL'] = 'http://139.186.31.213:8804/jeecg-boot/sys/common/view';
-    window._CONFIG['pdfDomainURL'] = 'http://139.186.31.213:8804/jeecg-boot/sys/common/pdf/pdfPreviewIframe';
+    window._CONFIG['domianURL'] = 'http://gateway.tjyourong.com.cn/jeecg-boot';
+    window._CONFIG['imgDomainURL'] = 'http://gateway.tjyourong.com.cn/jeecg-boot/sys/common/view';
+    window._CONFIG['pdfDomainURL'] = 'http://gateway.tjyourong.com.cn/jeecg-boot/sys/common/pdf/pdfPreviewIframe';
   </script>
   <script src="<%= BASE_URL %>splitting.js"></script>
 
@@ -311,7 +311,7 @@
 <script src="<%= BASE_URL %>xlsx.full.min.js"></script>
 
 <script src="<%= BASE_URL %>export.js"></script>
-<script src="<%= BASE_URL %>ckplayer/ckplayer.js"></script>
+<!-- <script src="<%= BASE_URL %>ckplayer/ckplayer.js"></script> -->
 
 <script type="text/javascript" src="<%= BASE_URL %>cryptojs/rollups/tripledes.js"></script>
 <script type="text/javascript" src="<%= BASE_URL %>cryptojs/components/mode-ecb-min.js"></script>

+ 3 - 3
src/api/video.js

@@ -2,7 +2,7 @@
 import {axios} from '@/utils/request'
 
 
-//获取登账户已经绑定过的快手账户列表
+//获取登账户已经绑定过的快手账户列表
 export function getUserList() {
     return axios({
       url: "/ks/web/user/list",
@@ -11,7 +11,7 @@ export function getUserList() {
     })
 }
 
-// 获取登二维码
+// 获取登二维码
 export function getLoginQr() {
     return axios({
       url: "/ks/web/login/qr",
@@ -20,7 +20,7 @@ export function getLoginQr() {
     })
 }
 
-// 获取登状态
+// 获取登状态
 // /ks/web/login/status
 // 参数 String requestId
 export function getLoginStatus(parameter) {

BIN
src/assets/img/test.jpg


+ 1 - 1
src/components/README.md

@@ -11,7 +11,7 @@ onEnd倒计时结束触发函数
 ####6.Ellipsis包:字符串截取组件,可以指定字符串的显示长度,并将全部内容显示到tip中,简单使用参考src\views\system\PermissionList.vue
 ####7.jeecg包:该包下自定义了很多列表/表单中用到的组件 参考包下readme文件
 ####8.jeecgbiz包:该包下定义了一些业务相关的组件,比如选择用户弹框,根据部门选择用户等等
-####9.layouts+page包:系统页面布局相关组件,比如登进去之后页面顶部显示什么,底部显示什么,菜单点击触发多个tab的布局等等 一般情况不需要修改
+####9.layouts+page包:系统页面布局相关组件,比如登进去之后页面顶部显示什么,底部显示什么,菜单点击触发多个tab的布局等等 一般情况不需要修改
 ####10.menun包:菜单组件,俩个,一个折叠菜单一个正常显示的菜单
 ####11.NumberInfo:数字信息显示组件 如下图
 ![输入图片说明](https://static.oschina.net/uploads/img/201904/12185858_uvJ5.png "在这里输入图片标题")

+ 1 - 1
src/components/tools/UserPassword.vue

@@ -88,7 +88,7 @@
     methods: {
       show(uname){
         if(!uname){
-          this.$message.warning("当前系统无登用户!");
+          this.$message.warning("当前系统无登用户!");
           return
         }else{
           this.username = uname

+ 19 - 15
src/components/uploadFile.vue

@@ -156,17 +156,17 @@ export default {
                 }
               })
             } else {
-              if (n == '') {
+              if (n === '') {
                 this.fileList = []
               } else {
-                this.fileList = [
-                  {
-                    uid: 1,
-                    name: 1,
-                    status: 'done',
-                    url: n,
-                  },
-                ]
+                this.fileList = []
+                var data = {
+                  uid: 1,
+                  name: '回显',
+                  status: 'done',
+                  url: n,
+                }
+                this.fileList.push(data)
               }
             }
           } else {
@@ -303,12 +303,16 @@ export default {
             that.$emit('overUpload', that.fileList)
 
             if (that.multiple) {
-              that.$emit(
-                'update:value',
-                that.fileList.map((item) => {
-                  return item.url
-                })
-              )
+              let urlList =  that.fileList.map((item) => {
+                return item.url
+              })
+             
+                that.$emit(
+                  'update:value',urlList
+                 
+                )
+    
+              
             } else {
               that.$emit(
                 'update:value',

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

@@ -83,6 +83,12 @@ export const constantRouterMap = [
     component: () => import(/* webpackChunkName: "fail" */ '@/views/modules/autoLaunch/configProject/creatConfig')
   },
 
+  
+  {
+    path: '/creat-material-test',
+    name: 'creatMaterialTest',
+    component: () => import(/* webpackChunkName: "fail" */ '@/views/modules/autoLaunch/material-test/creatMaterialTest')
+  },
   {
     path: '/test',
     component: BlankLayout,

+ 1 - 0
src/filters.js

@@ -160,6 +160,7 @@ const filters = {
             396: '注册优化目标',
             731: '广告观看5次',
             732: '广告观看10次',
+            773: '关键行为'
         }
         return data[sta]
     },

+ 405 - 0
src/mixins/videoMaterialMixin.js

@@ -0,0 +1,405 @@
+/**
+ * 新增修改完成调用 modalFormOk方法 编辑弹框组件ref定义为modalForm
+ * 高级查询按钮调用 superQuery方法  高级查询组件ref定义为superQueryModal
+ * data中url定义 list为查询列表  delete为删除单条记录  deleteBatch为批量删除
+ */
+ import {filterObj} from '@/utils/util';
+ import moment from 'moment'
+ import {deleteAction, getAction, downFile} from '@/api/manage'
+ import Vue from 'vue'
+ import {ACCESS_TOKEN} from "@/store/mutation-types"
+ import { transformTozTreeFormat } from '@/utils/util.js'
+ export const JeecgListMixin = {
+   data() {
+     return {
+       spinning:true,
+       //token header
+       tokenHeader: {'X-Access-Token': Vue.ls.get(ACCESS_TOKEN)},
+       /* 查询条件-请不要在queryParam中声明非字符串值的属性 */
+       queryParam: {},
+       /* 数据源 */
+       dataSource: [],
+       innerData:[],
+       /* 分页参数 */
+       ipagination: {
+         current: 1,
+         pageSize: 10,
+         pageSizeOptions: ['8', '16', '32'],
+         showTotal: (total, range) => {
+           return range[0] + "-" + range[1] + " 共" + total + "条"
+         },
+         showQuickJumper: true,
+         // showSizeChanger: true,
+         total: 0
+       },
+       /* 排序参数 */
+       isorter: {
+         column: 'createTime',
+         order: 'desc',
+       },
+       /* 筛选参数 */
+       filters: {},
+       /* table加载状态 */
+       loading: false,
+       /* table选中keys*/
+       selectedRowKeys: [],
+       /* table选中records*/
+       selectionRows: [],
+       /* 查询折叠 */
+       toggleSearchStatus: false,
+       /* 高级查询条件生效状态 */
+       superQueryFlag: false,
+       /* 高级查询条件 */
+       superQueryParams: ""
+     }
+   },
+   mounted() {
+     if(this.startList){
+ 
+     }else{
+        this.loadData();
+     }
+     //初始化字典配置 在自己页面定义
+     this.initDictConfig();
+   },
+   methods: {
+     // 二级树
+     expand(expanded,record){
+         if(this.url.listTwo){
+             var param = {}
+             param.field = this.getQueryField();
+             param.pageNo = this.ipagination.current;
+             param.pageSize = this.ipagination.pageSize;
+             param.parentId = record.id
+             if(expanded){
+                 getAction(this.url.listTwo, filterObj(param)).then((res) => {
+                     if (res.success) {
+                         record.innerData=res.result.records.map((item,index)=>{
+                             return {
+                                 ...item,
+                                 key:index
+                             }
+                         })
+                         // console.log(record.innerData)
+                         record.innerData = transformTozTreeFormat( record.innerData)
+                     }
+                     if (res.code === 510) {
+                       this.$message.warning(res.message)
+                     }
+                     this.loading = false;
+                 })
+             }else{
+                 record.innerData = []
+             }
+         }
+     },
+     async loadData(arg) {
+       this.spinning= true
+       this.dataSource = []
+       if (!this.url.list) {
+         this.$message.error("请设置url.list属性!")
+         return
+       }
+       //加载数据 若传入参数1则加载第一页的内容
+       if (arg === 1) {
+         this.ipagination.current = 1;
+       }
+       var params = this.getQueryParams();//查询条件
+       if(params.createTime&&params.createTime.length>0){
+         // params.createTime = moment(params.createTime).format('YYYY-MM-DD')
+         params.startDate = moment(params.createTime[0]).format('YYYY-MM-DD')
+         params.endDate = moment(params.createTime[1]).format('YYYY-MM-DD')
+         params.createTime = null
+       }
+       if(params.stateDate){
+         params.stateDate = moment(params.stateDate).format('YYYY-MM-DD')
+       }
+       // if(params.endDate){
+       //   params.endDate = moment(params.endDate).format('YYYY-MM-DD')
+       // }
+ 
+       this.loading = true;
+       await getAction(this.url.list, params).then((res) => {
+         if (res.success) {
+           this.loading = false;
+           if(res.result){
+             if(res.result.records){
+               this.dataSource = res.result.records.map(item=>{
+                 return {
+                     ...item,
+                     innerData:[],
+                     showVideo:false
+                 }
+               })
+               this.ipagination.total = res.result.total;
+             }else if(res.result.list){
+               this.dataSource = res.result.list.map(item=>{
+                 return {
+                     ...item,
+                     innerData:[],
+                     showVideo:false
+                 }
+               })
+               this.ipagination.total = res.result.total;
+             }else{
+               this.dataSource = res.result.map(item=>{
+                 return {
+                     ...item,
+                     innerData:[],
+                     showVideo:false
+                 }
+               })
+               // this.ipagination = null;
+               this.ipagination.pageSize=res.result.length
+             }
+           }else if(res.data){
+             if(res.data.list){
+               this.dataSource = res.data.list.map(item=>{
+                 return {
+                     ...item,
+                     innerData:[],
+                     showVideo:false
+                 }
+               })
+               this.ipagination.total = res.data.total;
+             }
+           }
+           
+           this.spinning= false
+         }
+         if (res.code === 510) {
+           this.$message.warning(res.message)
+         }
+         this.loading = false;
+         this.spinning= false
+       })
+     },
+     initDictConfig() {
+     //   console.log("--这是一个假的方法!")
+     },
+     handleSuperQuery(arg) {
+       //高级查询方法
+       if (!arg) {
+         this.superQueryParams = ''
+         this.superQueryFlag = false
+       } else {
+         this.superQueryFlag = true
+         this.superQueryParams = JSON.stringify(arg)
+       }
+       this.loadData()
+     },
+     editDate(value) {
+       let date = new Date(value)
+       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
+       return y + '-' + MM + '-' + d
+     },
+     getQueryParams() {
+       //获取查询条件
+       let sqp = {}
+       if (this.superQueryParams) {
+         sqp['superQueryParams'] = encodeURI(this.superQueryParams)
+       }
+       // console.log(this.queryParam)
+       var param = {...this.queryParam,...this.isorter, ...this.filters}
+       param.pageNo = this.ipagination.current;
+       param.pageSize = this.ipagination.pageSize;
+       return param
+     },
+     getQueryField() {
+       //TODO 字段权限控制
+       var str = "id,";
+       this.columns.forEach(function (value) {
+         str += "," + value.dataIndex;
+       });
+       return str;
+     },
+ 
+     onSelectChange(selectedRowKeys, selectionRows) {
+       this.selectedRowKeys = selectedRowKeys;
+       this.selectionRows = selectionRows;
+     },
+     onClearSelected() {
+       this.selectedRowKeys = [];
+       this.selectionRows = [];
+     },
+     searchQuery() {
+       this.loadData(1);
+     },
+     superQuery() {
+       this.$refs.superQueryModal.show();
+     },
+     searchReset() {
+       this.queryParam = {}
+       this.loadData(1);
+     },
+     batchDel: function () {
+       if (!this.url.deleteBatch) {
+         this.$message.error("请设置url.deleteBatch属性!")
+         return
+       }
+       if (this.selectedRowKeys.length <= 0) {
+         this.$message.warning('请选择一条记录!');
+         return;
+       } else {
+         var ids = "";
+         for (var a = 0; a < this.selectedRowKeys.length; a++) {
+           ids += this.selectedRowKeys[a] + ",";
+         }
+         var that = this;
+         this.$confirm({
+           title: "确认删除",
+           content: "是否删除选中数据?",
+           onOk: function () {
+             deleteAction(that.url.deleteBatch, {ids: ids}).then((res) => {
+               if (res.success) {
+                 that.$message.success(res.message);
+                 that.loadData();
+                 that.onClearSelected();
+               } else {
+                 that.$message.warning(res.message);
+               }
+             });
+           }
+         });
+       }
+     },
+     handleDelete: function (id) {
+       if (!this.url.delete) {
+         this.$message.error("请设置url.delete属性!")
+         return
+       }
+       var that = this;
+       deleteAction(that.url.delete, {id: id}).then((res) => {
+         if (res.success) {
+           that.$message.success(res.message);
+           that.loadData();
+         } else {
+           that.$message.warning(res.message);
+         }
+       });
+     },
+     handleEdit: function (record,sign) {
+         // console.log(record,sign)
+       this.$refs.modalForm.edit(record,sign);
+       this.$refs.modalForm.title = "编辑";
+       this.$refs.modalForm.disableSubmit = false;
+       if(sign == 'preview'){
+         this.$refs.modalForm.title = "预览";
+       }
+     },
+     handleImagePreview: function (record) {
+         this.$refs.modalForm.imagePreview(record);
+         this.$refs.modalForm.title = "预览";
+         this.$refs.modalForm.disableSubmit = false;
+     },
+     handleAdd: function (sign) {
+       this.$refs.modalForm.add(sign);
+       this.$refs.modalForm.title = "新增";
+       this.$refs.modalForm.disableSubmit = false;
+     },
+     handleOpen: function () {
+       this.$refs.userForm.open();
+       this.$refs.userForm.title = "选择";
+       this.$refs.userForm.disableSubmit = false;
+     },
+     handleTableChange(pagination, filters, sorter) {
+       //分页、排序、筛选变化时触发
+       //TODO 筛选
+       if (Object.keys(sorter).length > 0) {
+         this.isorter.column = sorter.field;
+         this.isorter.order = "ascend" == sorter.order ? "asc" : "desc"
+       }
+       this.ipagination = pagination;
+       this.loadData();
+     },
+     handleToggleSearch() {
+       this.toggleSearchStatus = !this.toggleSearchStatus;
+     },
+     modalFormOk() {
+       // 新增/修改 成功时,重载列表
+       this.loadData(this.ipagination.current);
+     },
+     handleDetail: function (record) {
+       this.$nextTick(()=>{
+         this.$refs.modalForm.edit(record);
+         this.$refs.modalForm.title = "详情";
+         this.$refs.modalForm.disableSubmit = true;
+       })
+       
+     },
+     /* 导出 */
+     handleExportXls2() {
+       let paramsStr = encodeURI(JSON.stringify(this.getQueryParams()));
+       let url = `${window._CONFIG['domianURL']}/${this.url.exportXlsUrl}?paramsStr=${paramsStr}`;
+       window.location.href = url;
+     },
+     handleExportXls(fileName) {
+       if (!fileName || typeof fileName != "string") {
+         fileName = "导出文件"
+       }
+       let param = {...this.queryParam};
+       if (this.selectedRowKeys && this.selectedRowKeys.length > 0) {
+         param['selections'] = this.selectedRowKeys.join(",")
+       }
+       // console.log("导出参数", param)
+       downFile(this.url.exportXlsUrl, param).then((data) => {
+         if (!data) {
+           this.$message.warning("文件下载失败")
+           return
+         }
+         if (typeof window.navigator.msSaveBlob !== 'undefined') {
+           window.navigator.msSaveBlob(new Blob([data]), fileName + '.xls')
+         } else {
+           let url = window.URL.createObjectURL(new Blob([data]))
+           let link = document.createElement('a')
+           link.style.display = 'none'
+           link.href = url
+           link.setAttribute('download', fileName + '.xls')
+           document.body.appendChild(link)
+           link.click()
+           document.body.removeChild(link); //下载完成移除元素
+           window.URL.revokeObjectURL(url); //释放掉blob对象
+         }
+       })
+     },
+     /* 导入 */
+     handleImportExcel(info) {
+       if (info.file.status !== 'uploading') {
+         // console.log(info.file, info.fileList);
+       }
+       if (info.file.status === 'done') {
+         if (info.file.response.success) {
+           this.$message.success(`${info.file.name} 文件上传成功`);
+           this.loadData();
+         } else {
+           this.$message.error(`${info.file.name} ${info.file.response.message}.`);
+         }
+       } else if (info.file.status === 'error') {
+         this.$message.error(`文件上传失败: ${info.file.msg} `);
+       }
+     },
+     /* 图片预览 */
+     getImgView(text) {
+       if (text && text.indexOf(",") > 0) {
+         text = text.substring(0, text.indexOf(","))
+       }
+       return window._CONFIG['imgDomainURL'] + "/" + text
+     },
+     /* 文件下载 */
+     uploadFile(text) {
+       if (!text) {
+         this.$message.warning("未知的文件")
+         return;
+       }
+       if (text.indexOf(",") > 0) {
+         text = text.substring(0, text.indexOf(","))
+       }
+       window.open(window._CONFIG['domianURL'] + "/sys/common/download/" + text);
+     },
+   }
+ 
+ }

+ 2 - 2
src/utils/request.js

@@ -19,8 +19,8 @@ else if (process.env.NODE_ENV === 'debug') {
 }
 else if (process.env.NODE_ENV === 'production') {
 	// axios.defaults.baseURL = 'http://apipre.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://gateway.tjyourong.com.cn/jeecg-boot';//测试
+	// axios.defaults.baseURL = 'http://api.tjyourong.com.cn/jeecg-boot'; // 生产环境
 }
 const service = axios.create({
 	// baseURL: '/jeecg-boot', // api base_url

+ 1 - 1
src/views/account/settings/BaseSetting.vue

@@ -38,7 +38,7 @@
             <a-input placeholder="h3gSbecd"/>
           </a-form-item>
           <a-form-item
-            label="登密码"
+            label="登密码"
             :required="false"
           >
             <a-input placeholder="密码"/>

+ 0 - 1
src/views/dashboard/Analysis.vue

@@ -343,7 +343,6 @@
         this.loading = !this.loading
       }, 1000)
       this.initLogInfo()
-      console.log(localStorage.getItem('roleCode'),345678901222)
     },
     methods: {
       initLogInfo() {

+ 1 - 1
src/views/modules/BatchCreate/components/Treeselect.vue

@@ -61,7 +61,7 @@
       reqUrl: {
         type: String,
         default () {
-          return '/ctop/projectMember/participateList'
+          return ''
         }
 
       }

+ 4 - 1
src/views/modules/Statistics/KSAccountReport.vue

@@ -275,6 +275,8 @@
 
 <script>
 import moment from 'moment';
+import {mapGetters} from 'vuex';
+
 import { getAction, postAction, downFile, downFilePost } from '@/api/manage';
 
 import { TreeSelect } from 'ant-design-vue';
@@ -585,6 +587,7 @@ export default {
     },
   },
   methods: {
+    ...mapGetters(['userInfo']),
     treeSearch(){
       console.log(arguments);
     },
@@ -909,7 +912,7 @@ export default {
    accountHttp(){
      this.treeData=[];
      this.treeValue=[];
-     getAction('/ctop/projectMember/getProjectAccountByUserId?mediaType=2', {}).then(res => {
+     getAction('/ctop/projectMember/getProjectAccountByUserId?mediaType=2&userId=' + this.userInfo().id, {}).then(res => {
        if(res.success){
             // console.log(res);
             if(res.result){

+ 56 - 0
src/views/modules/Statistics/change-face/change-face.less

@@ -0,0 +1,56 @@
+.change-face-modal {
+    width: 800px !important;
+    .policy-operation-form,
+    .face-right-div,
+    .face-right-table {
+        margin-top: 20px;
+    }
+    .face-right-div-p {
+        display: flex;
+        justify-content: space-between;
+    }
+    .pagin-table-class {
+        display: flex;
+        justify-content: flex-end;
+        margin-top: 20px;
+    }
+    .avatar-uploader > .ant-upload {
+        width: 128px;
+        height: 128px;
+        position: relative;
+    }
+    .upload-img-class {
+        position: absolute;
+        top: 0;
+        left: 0;
+        height: 100%;
+        .img-flex-url {
+            width: 128px;
+            display: flex;
+            align-items: center;
+            justify-content: center;
+            height: 100%;
+            img {
+                max-width: 100%;
+                max-height: 100%;
+            }
+        }
+        .cover-img-div {
+            position: absolute;
+            top: 0;
+            left: 0;
+            width: 100%;
+            height: 100%;
+            line-height: 120px;;
+            background: rgba(10, 10, 10, 0.5);
+            z-index: 10000;
+            .delete-icon-class {
+                font-size: 20px;
+                color: #1890ff;
+            }
+        }
+    }
+}
+.change-list-modal-show {
+    width: 1000px !important;
+}

+ 445 - 0
src/views/modules/Statistics/change-face/change-face.vue

@@ -0,0 +1,445 @@
+<template>
+    <!-- 换脸弹窗 -->
+    <a-modal
+        v-if="faceShowStatus"
+        title="换脸操作"
+        :visible="faceShowStatus"
+        :confirmLoading="confirmLoading"
+        dialog-class="change-face-modal"
+        @ok="handlePolicyOperationSure"
+        @cancel="handlePolicyOperationCancel"
+    >  
+        <div class="face-right-div-p">
+            <a-radio-group v-model="faceType" button-style="solid" @change="handleFaceTypeChange">
+                <a-radio-button value="a">人脸合成</a-radio-button>
+                <a-radio-button value="b">合成列表</a-radio-button>
+            </a-radio-group>
+            <span v-if="faceType === 'b'" class="add-acount-policy-btn">
+                <a-button type="primary" @click="handleRefresh">刷新</a-button>
+            </span>
+        </div>
+        <a-form-model
+            v-if="faceType === 'a'"
+            class="policy-operation-form"
+            ref="policyOperationForm"
+            :model="policyOperationForm"
+            :label-col="labelCol"
+            :wrapper-col="wrapperCol"
+        >
+            <a-form-model-item label="图片上传">
+                <a-upload
+                    name="avatar"
+                    list-type="picture-card"
+                    class="avatar-uploader"
+                    :show-upload-list="false"
+                    :before-upload="beforeUpload"
+                >
+                    <div v-if="imageUrl" class="upload-img-class">
+                        <div class="img-flex-url">
+                            <img :src="imageUrl" alt="avatar"/>
+                        </div>
+                    </div>
+                    <div v-else>
+                        <a-icon type="plus" style="margin-top: 10px;"/>
+                        <div class="ant-upload-text">Upload</div>
+                    </div>
+                </a-upload>
+                <p style="margin: 0;">1、请保证脸部无遮挡、光线充足</p>
+                <p style="margin: 0;">2、视频、照片中只能出现一张人脸</p>
+                <p style="margin: 0;">3、图片尺寸不能小于500*500</p>
+            </a-form-model-item>
+        </a-form-model>
+        <div v-else-if="faceType === 'b'" class="face-right-div">
+            <a-table
+                class="face-right-table"
+                ref="table"
+                size="middle"
+                bordered
+                :columns="settlementColumns"
+                :dataSource="dataSource"
+                :pagination="false"
+            >
+                <span slot="input_video_url" slot-scope="text, record">
+                    <div style="width:100px;height:177px;margin-left:25px;">
+                        <video v-if="record.input_video_url" :src="record.input_video_url" style="width:100px" controls></video>
+                        <img v-else style="width:100px" src="@/assets/noImg.png">
+                    </div>
+                </span>
+                <span slot="input_image_url" slot-scope="text, record">
+                    <img v-if="text" :src="text" style="width:60px">
+                    <img v-if="!text" src="@/assets/noImg.png" style="width:60px">
+                </span>
+                <span slot="actions" slot-scope="text, record">
+                    <a :disabled="!faceShowList.projectId || record.status !== 'finished'" @click="handlePushData(record)">推送</a>
+                    <a-divider type="vertical"/>
+                    <a @click="handleDownLoadData(record)" :disabled="record.status !== 'finished'">下载</a>
+                </span>
+            </a-table>
+            <a-pagination
+                class="pagin-table-class"
+                :total="totalAll"
+                :show-total="total => `共 ${totalAll} 条`"
+                size="small"
+                :current="defaultCurrent"
+                :defaultPageSize="2"
+                @change="onShowSizeChange"
+                @showSizeChange="onShowSizeChange"
+            />
+        </div>
+    </a-modal>
+</template>
+<script>
+import {mapGetters} from 'vuex';
+import {fileInsertV2} from '@/api/actor';
+import {getAction, postAction} from '@/api/manage';
+
+import BMF from 'browser-md5-file';
+let COS = require('cos-js-sdk-v5');
+let cos = new COS({
+    SecretId: 'AKIDE6IpMi8fJQRCg1iuWzFajjRs43kbbets',
+    SecretKey: 'tXzuwMfplTTK3c9GFUyETilasvQfePu9'
+});
+
+export default {
+    name: 'change-face',
+    props: {
+        status: {
+            type: Boolean,
+            default: false
+        },
+        defaultList: {
+            type: Object,
+            default: () => {}
+        }
+    },
+    data() {
+        return {
+            confirmLoading: false,
+            departValueInfoModality: [],
+            departValueInfoMod: [],
+            departValueInfoSence: [],
+            getProjectId: '',
+            defaultCurrent: 1,
+            dataAllList: [],
+            totalAll: 0,
+            uploadType: 'face',
+            dataSource: [],
+            settlementColumns: [
+                {
+                    title: '视频',
+                    dataIndex: 'input_video_url',
+                    align: 'center',
+                    width: 150,
+                    scopedSlots: {customRender: 'input_video_url'}
+                },
+                {
+                    title: '人脸',
+                    dataIndex: 'input_image_url',
+                    align: 'center',
+                    width: 150,
+                    scopedSlots: {customRender: 'input_image_url'}
+                },
+                {
+                    title: '状态',
+                    align: 'center',
+                    dataIndex: 'status',
+                    width: 100
+                },
+                {
+                    title: '操作',
+                    align: 'center',
+                    dataIndex: 'actions',
+                    width: 130,
+                    scopedSlots: {customRender: 'actions'}
+                }
+            ],
+            labelCol: {span: 4},
+            wrapperCol: {span: 16},
+            imageUrl: '',
+            faceShowStatus: false,
+            faceType: 'a',
+            policyOperationForm: {},
+            urlResult: '',
+            md5Result: ''
+        };
+    },
+    watch: {
+        status(newVal) {
+            this.faceShowStatus = newVal;
+        },
+        defaultList(newVal) {
+            if (newVal) {
+                this.faceShowList = newVal;
+            }
+        }
+    },
+    methods: {
+        ...mapGetters(['userInfo']),
+        // 分页操作按钮
+        onShowSizeChange(current, pageSize) {
+            this.dataSource = [];
+            this.defaultCurrent = current;
+            const defaultData = [...this.dataAllList];
+            this.dataSource = [...defaultData.slice(2 * current - 2, 2 * current)];
+        },
+        handleFaceTypeChange(e) {
+            if (e.target.value === 'b') {
+                this.handleInitTable();
+                this.handleGetMaterialTagInfo();
+            }
+        },
+        handleInitTable() {
+            const paramsData = {
+                videoMd5: this.faceShowList.projectId ? this.faceShowList.code : this.faceShowList.videoCode
+            };
+            this.dataSource = [];
+            // http://192.168.1.204:8000
+            // http://faceswap.tjyourong.com.cn
+            postAction('http://faceswap.tjyourong.com.cn/jeecg-boot/task/query', paramsData).then(result => {
+                if (result.code === 0) {
+                    this.dataAllList = result.data;
+                    this.dataSource = result.data.slice(0, 2);
+                    this.totalAll = result.data.length ? result.data.length : 0;
+                }
+                else {
+                    this.dataAllList = [];
+                    this.dataSource = [];
+                    this.totalAll = 0;
+                }
+            }).catch(error => {
+                console.log(error, 'eeee');
+            });
+        },
+        handleGetDetailList() {
+            getAction('/ctop/materialInfo/queryById', {
+                id: this.faceShowList.projectId ? this.faceShowList.code : this.faceShowList.videoCode
+            }).then(res => {
+                if (res.success) {
+                    this.getProjectId = res.result.projectId;
+                }
+            });
+        },
+        handleGetMaterialTagInfo() {
+            getAction('/ctop/materialTagInfo/detail', {
+                code: this.faceShowList.projectId ? this.faceShowList.code : this.faceShowList.videoCode
+            }).then(res => {
+                if (res.success) {
+                    this.departValueInfoModality = res.modalityTagList.map(item => item.tagId);
+                    this.departValueInfoMod = res.modTagList.map(item => item.tagId);
+                    this.departValueInfoSence = res.senceTagList.map(item => item.tagId);
+                }
+            });
+        },
+        // TODO 推送操作
+        handlePushData(list) {
+            const paramsData = {
+                projectId: this.faceShowList.projectId, // 项目选择
+                ascription: {
+                    planId: 'e9ca23d68d884d4ebb19d07889727dae',
+                    shotId: 'e9ca23d68d884d4ebb19d07889727dae',
+                    clipId: 'e9ca23d68d884d4ebb19d07889727dae'
+                },
+                status: '1',
+                code: list.output_video_md5,
+                url: list.output_video_url && list.output_video_url.split(':')[1],
+                type: 'VIDEO',
+                userId: this.userInfo().id,
+                modalityTagList: this.departValueInfoModality, // 形式标签
+                senceTagList: this.departValueInfoSence, // 场景标签
+                modTagList: this.departValueInfoMod // 基调标签
+            };
+            const that = this;
+            this.$confirm({
+                title: '提示',
+                content: '是否进行推送操作',
+                onOk() {
+                    fileInsertV2(paramsData).then(res => {
+                        if (res.code === 0) {
+                            that.handlePolicyOperationCancel();
+                            that.$emit('sureface');
+                            that.$message.success('素材已经同步到未审核列表,请进入查看');
+                        }
+                        else {
+                            that.$message.error(res.message);
+                        }
+                    });
+                }
+            });
+        },
+        // 下载操作
+        handleDownLoadData(list) {
+            const randomTime = new Date().getTime() + '_check.mp4';
+            fetch(list.output_video_url)
+                .then(res => res.blob())
+                .then(blob => {
+                    const a = document.createElement('a');
+                    document.body.appendChild(a);
+                    a.style.display = 'none';
+                    // 使用获取到的blob对象创建的url
+                    const url = window.URL.createObjectURL(blob);
+                    a.href = url;
+                    // 指定下载的文件名
+                    a.download = randomTime;
+                    a.click()
+                    document.body.removeChild(a);
+                    // 移除blob对象的url
+                    window.URL.revokeObjectURL(url);
+                });
+        },
+        // 刷新按钮
+        handleRefresh() {
+            this.defaultCurrent = 1;
+            this.handleInitTable();
+        },
+        checkTv(data) {
+            const index = data.lastIndexOf(".");
+            let tv_id = '';
+            tv_id = data.substring(index);
+            if(tv_id !== ".mp4" && tv_id !== ".rmvb" && tv_id !== ".avi" && tv_id !== ".ts") {
+                return data + '.mp4';
+            }
+            else {
+                return data;
+            }
+        },
+        // 确定按钮
+        handlePolicyOperationSure() {
+            if (this.faceType === 'a') {
+                this.confirmLoading = true;
+                if (!this.md5Result) {
+                    this.$message.error('请上传图片');
+                    return;
+                }
+                const paramsData = {
+                    inputVideoUrl: this.checkTv(this.faceShowList.url),
+                    inputImageUrl: this.urlResult,
+                    videoMd5: this.faceShowList.projectId ? this.faceShowList.code : this.faceShowList.videoCode,
+                    imageMd5: this.md5Result,
+                    createBy: this.userInfo().id
+                };
+                postAction('http://faceswap.tjyourong.com.cn/jeecg-boot/task/single', paramsData).then(result => {
+                    if (result.code === 0) {
+                        this.handlePolicyOperationCancel();
+                        this.$emit('sureface');
+                        this.$message.success('图片上传成功');l
+                        this.confirmLoading = false;
+                    }
+                    else {
+                        this.$message.success('目标图片已存在,请下载视频');
+                        this.faceType = 'b';
+                        this.handleInitTable();
+                        this.handleGetMaterialTagInfo();
+                        this.confirmLoading = false;
+                    }
+                }).catch(error => {
+                    this.confirmLoading = false;
+                });
+            }
+            else {
+                this.handlePolicyOperationCancel();
+            }
+        },
+        // 取消按钮
+        handlePolicyOperationCancel() {
+            this.faceType = 'a';
+            this.imageUrl = '';
+            this.urlResult = '';
+            this.md5Result = '';
+            this.defaultCurrent = 1;
+            this.$emit('closeface');
+        },
+        getBase64(img, callback) {
+            const reader = new FileReader();
+            reader.addEventListener('load', () => callback(reader.result));
+            reader.readAsDataURL(img);
+        },
+        beforeUpload(info) {
+            const isZip = info.type.includes('png') || info.type.includes('jpeg');
+            if (!isZip) {
+                this.$message.error('请上传正确类型的图片');
+                this.imageUrl = '';
+                this.urlResult = '';
+                this.md5Result = '';
+                return;
+            }
+            new Promise(function (resolve, reject) {
+                let width = 500;
+                let height = 500;
+                let _URL = window.URL || window.webkitURL;
+                let img = new Image();
+                img.onload = function () {
+                    let valid = img.width >= width && img.height >= height;
+                    valid ? resolve() : reject();
+                };
+                img.src = _URL.createObjectURL(info);
+            }).then(() => {
+                this.handleMd5(info);
+                this.cosUpload(info);
+                this.getBase64(info, imageUrl => {
+                    this.imageUrl = imageUrl;
+                });
+            }, () => {
+                this.$message.error('图片尺寸不能小于500*500');
+                this.imageUrl = '';
+                this.urlResult = '';
+                this.md5Result = '';
+                return Promise.reject();
+            });
+        },
+        handleMd5(file) {
+            let bmf = new BMF();
+            let that = this;
+            return new Promise(function (resolve, reject) {
+                bmf.md5(file, (err, md5) => {
+                    that.md5Result = md5;
+                });
+            });
+        },
+        cosUpload(file) {
+            let 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;
+            let timeElse = new Date().getTime();
+            let arr = file.name.split('.');
+            let 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] + '.';
+                    }
+                }
+            }
+            cos.putObject(
+                {
+                    Bucket: 'media-1301855440',
+                    Region: 'ap-chongqing',
+                    // 存储桶所在地域,必须字段
+                    Key: that.uploadType + '/' + y + '-' + MM + '-' + d + '/' + str + '-' + timeElse + '.' + arr[arr.length - 1],
+                    StorageClass: 'STANDARD',
+                    Body: file // 上传文件对象
+                },
+                function (err, data) {
+                    if (err) {
+                        that.$message.error('上传失败!!!' + err);
+                        return;
+                    }
+                    that.loadingElse = false;
+                    that.urlResult = 'http://' + data.Location;
+                }
+            );
+        }
+    }
+}
+</script>
+<style lang="less">
+    @import "change-face";
+</style>

+ 10 - 2
src/views/modules/Statistics/newHome.vue

@@ -680,9 +680,17 @@ export default {
               total.cp=(total.cost/total.click).toFixed(2)
               total.cpm=(total.cost/total.showNum*1000).toFixed(2)
               if(afterData.length>0){
-                this.tableData=[total,...afterData]
+                const defaultAfterData = afterData;
+                defaultAfterData.forEach(item => {
+                  item.clickRate = Number(item.clickRate) + '%';
+                });
+                this.tableData = [total,...defaultAfterData]
               }else{
-                this.tableData=[total,...res.result.list]
+                const defaultData = res.result.list;
+                defaultData.forEach(item => {
+                  item.clickRate = Number(item.clickRate) + '%';
+                });
+                this.tableData = [total,...defaultData]
               }
               
             }

Fichier diff supprimé car celui-ci est trop grand
+ 873 - 892
src/views/modules/Statistics/newPlanStatic/newPlanStatic.vue


Fichier diff supprimé car celui-ci est trop grand
+ 639 - 690
src/views/modules/Statistics/popularVideo.vue


+ 4 - 0
src/views/modules/Statistics/videoStatics/KSvideoStatics.vue

@@ -312,6 +312,7 @@ import selectComponent from './selectComponent'
 import Treeselect from '../components/Treeselect'
 import DatePicker from '@/components/DatePicker'
 import customColumn from '../components/customColumn.vue'
+import {mapGetters} from 'vuex';
 const columnsFixd = [
   {
     title: '视频',
@@ -614,6 +615,7 @@ export default {
       
   },
   methods: {
+    ...mapGetters(['userInfo']),
     filterOption(input, option) {
       return (
         option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
@@ -756,6 +758,7 @@ export default {
       this.searchLoading=true
       show = 0
       postAction('/ctop/kuaishou/videoReport/list', {
+        userId:this.userInfo().id,
         startDate: this.dateValue[0].format('YYYY-MM-DD'),
         endDate: this.dateValue[1].format('YYYY-MM-DD'),
         pageNo:this.ipagination.current,
@@ -805,6 +808,7 @@ export default {
       }
       downFilePost('/ctop/kuaishou/videoReport/excelV2', {
         columns,
+        userId:this.userInfo().id,
         target:this.target,
         order:this.order,
         startDate: this.dateValue[0].format('YYYY-MM-DD'),

+ 19 - 2
src/views/modules/account-config/components/configuration-copy.vue

@@ -158,6 +158,23 @@
                             <a-radio-button value="CPM" disabled>展示量</a-radio-button>
                         </a-radio-group>
                     </a-form-model-item>
+                    <a-form-model-item label="下载链接" prop="adDownloadUrl">
+                        <a-input
+                            class="common-input-long"
+                            v-model="configForm.adDownloadUrl"
+                            placeholder="请输入下载链接"
+                            allow-clear
+                            @change="handleDownloadLink"
+                        />
+                    </a-form-model-item>
+                    <a-form-model-item label="应用包名" prop="adPackage">
+                        <a-input
+                            class="common-input-long"
+                            v-model="configForm.adPackage"
+                            placeholder="请输入应用包名"
+                            allow-clear
+                        />
+                    </a-form-model-item>
                     <a-form-model-item label="下载方式">
                         <a-radio-group
                             v-model="configForm.adDownloadType"
@@ -176,7 +193,7 @@
                             allow-clear
                         />
                     </a-form-model-item>
-                    <a-form-model-item v-if="configForm.adDownloadType === 'DOWNLOAD_URL'" label="下载链接" prop="adDownloadUrl">
+                    <!-- <a-form-model-item v-if="configForm.adDownloadType === 'DOWNLOAD_URL'" label="下载链接" prop="adDownloadUrl">
                         <a-input
                             class="common-input-long"
                             v-model="configForm.adDownloadUrl"
@@ -192,7 +209,7 @@
                             placeholder="请输入应用包名"
                             allow-clear
                         />
-                    </a-form-model-item>
+                    </a-form-model-item> -->
                     <a-form-model-item label="直达链接内容">
                         <a-input
                             class="common-input-long"

+ 21 - 2
src/views/modules/account-config/components/configuration-modal.vue

@@ -157,6 +157,25 @@
                             <a-radio-button value="CPM" disabled>展示量</a-radio-button>
                         </a-radio-group>
                     </a-form-model-item>
+                    <a-form-model-item label="下载链接" prop="adDownloadUrl">
+                        <a-input
+                            class="common-input-long"
+                            :disabled="modalTitle === 'edit'"
+                            v-model="configForm.adDownloadUrl"
+                            placeholder="请输入下载链接"
+                            allow-clear
+                            @change="handleDownloadLink"
+                        />
+                    </a-form-model-item>
+                    <a-form-model-item label="应用包名" prop="adPackage">
+                        <a-input
+                            class="common-input-long"
+                            :disabled="modalTitle === 'edit'"
+                            v-model="configForm.adPackage"
+                            placeholder="请输入应用包名"
+                            allow-clear
+                        />
+                    </a-form-model-item>
                     <a-form-model-item label="下载方式">
                         <a-radio-group
                             :disabled="modalTitle === 'edit'"
@@ -177,7 +196,7 @@
                             allow-clear
                         />
                     </a-form-model-item>
-                    <a-form-model-item v-if="configForm.adDownloadType === 'DOWNLOAD_URL'" label="下载链接" prop="adDownloadUrl">
+                    <!-- <a-form-model-item v-if="configForm.adDownloadType === 'DOWNLOAD_URL'" label="下载链接" prop="adDownloadUrl">
                         <a-input
                             class="common-input-long"
                             :disabled="modalTitle === 'edit'"
@@ -195,7 +214,7 @@
                             placeholder="请输入应用包名"
                             allow-clear
                         />
-                    </a-form-model-item>
+                    </a-form-model-item> -->
                     <a-form-model-item label="直达链接内容">
                         <a-input
                             class="common-input-long"

+ 1 - 1
src/views/modules/advertiser/UserAllocationList.vue

@@ -341,7 +341,7 @@ export default {
           dataIndex: 'projectId_dictText',
         },
         //    {
-        //     title: '输入账号  --登',
+        //     title: '输入账号  --登',
         //     align:"center",
         //     dataIndex: 'accountName'
         //    },

+ 2 - 2
src/views/modules/advertiser/modules/BindAccountLoginModal__Style#Drawer.vue

@@ -38,8 +38,8 @@
         <a-form-item
           :labelCol="labelCol"
           :wrapperCol="wrapperCol"
-          label="1未登陆 2已登陆">
-          <a-input placeholder="请输入1未登陆 2已登陆" v-decorator="['status', {}]" />
+          label="1未登录 2已登录">
+          <a-input placeholder="请输入1未登录 2已登录" v-decorator="['status', {}]" />
         </a-form-item>
         <a-form-item
           :labelCol="labelCol"

+ 1 - 1
src/views/modules/advertiser/modules/ProjectModal.vue

@@ -278,7 +278,7 @@ export default {
     },
     getSupplierList() {
       var params = {}
-      getAction('/ctop/supplierList/list').then((res) => {
+      getAction('/ctop/supplierList/list',{pageNo:1,pageSize:100}).then((res) => {
         if (res.success) {
           this.supplierList = res.result.records
         } else {

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

@@ -37,8 +37,8 @@
         <!-- <a-form-item
           :labelCol="labelCol"
           :wrapperCol="wrapperCol"
-          label="输入账号  --登">
-          <a-input placeholder="请输入输入账号  --登" v-decorator="['accountName', {}]" />
+          label="输入账号  --登">
+          <a-input placeholder="请输入输入账号  --登" v-decorator="['accountName', {}]" />
         </a-form-item> -->
         <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="授权名称">
           <a-input placeholder="请输入授权名称" v-decorator="['authName', {}]" />

+ 4 - 4
src/views/modules/advertiser/modules/UserAllocationModal__Style#Drawer.vue

@@ -14,8 +14,8 @@
         <a-form-item
           :labelCol="labelCol"
           :wrapperCol="wrapperCol"
-          label="登人id">
-          <a-input placeholder="请输入登人id" v-decorator="['userId', {}]" />
+          label="登人id">
+          <a-input placeholder="请输入登人id" v-decorator="['userId', {}]" />
         </a-form-item>
         <a-form-item
           :labelCol="labelCol"
@@ -56,8 +56,8 @@
         <a-form-item
           :labelCol="labelCol"
           :wrapperCol="wrapperCol"
-          label="输入账号  --登">
-          <a-input placeholder="请输入输入账号  --登" v-decorator="['accountName', {}]" />
+          label="输入账号  --登">
+          <a-input placeholder="请输入输入账号  --登" v-decorator="['accountName', {}]" />
         </a-form-item>
         <a-form-item
                 :labelCol="labelCol"

+ 1 - 1
src/views/modules/advertiser/modules/productModal.vue

@@ -183,7 +183,7 @@
       },
       getSupplierList() {
         var params = {}
-        getAction('/ctop/supplierList/list').then(res => {
+        getAction('/ctop/supplierList/list',{pageNo:1,pageSize:100}).then(res => {
           if (res.success) {
             this.supplierList = res.result.records
           } else {

+ 1 - 1
src/views/modules/advertiser/modules/projectListModal.vue

@@ -289,7 +289,7 @@ export default {
     },
     getSupplierList() {
       var params = {}
-      getAction('/ctop/supplierList/list').then((res) => {
+      getAction('/ctop/supplierList/list',{pageNo:1,pageSize:100}).then((res) => {
         if (res.success) {
           this.supplierList = res.result.records
         } else {

+ 29 - 17
src/views/modules/autoLaunch/configLaunchInfo.vue

@@ -1097,6 +1097,10 @@
                                     groupTypeData.isAdWatchTimes == '1'
                                 ">广告观看次数</a-select-option>
                                 
+                                
+                                <a-select-option :value="773" v-if="
+                                    groupTypeData.isKeyAction == '1'
+                                ">关键行为</a-select-option>
                             </a-select>
 
                            
@@ -1410,11 +1414,11 @@
                         </a-form-item>                       
                         </div>
                     </div>
-                    <!-- <div class="row-item" >
+                    <div class="row-item" v-if="getData('singleAppid') == 1">
                         <div class="hint-item"></div>
                         <div class="label-item">
                         <div class="text-item">下载详情</div>
-                        <div class="required-item"></div>
+                        <!-- <div class="required-item"></div> -->
                         </div>
                         <div class="input-item" >
                             
@@ -1435,7 +1439,7 @@
                                 </a-select>                               
                                 </a-form-item>
                         </div>
-                    </div> -->
+                    </div>
                      <div class="row-item" >
                         <div class="hint-item"></div>
                         <div class="label-item">
@@ -1488,25 +1492,26 @@
                         </a-form-item>
                         </div>
                     </div>
-                    <!-- <div class="row-item"  v-if="whiteList.actionbar_click_url_switch&&getFormData('generalTrack')==1">
+                    <!-- <div class="row-item">
                         <div class="hint-item"></div>
                         <div class="label-item">
-                        <div class="text-item">第三方ActionBar点击监控链接</div>
+                        <div class="text-item">下载详情</div>
                         <div class="required-item"></div>
                         </div>
                         <div class="input-item">
                             <a-form-item  >
-                                <a-input
-                                v-decorator="[
-                                    'actionbarClickUrl',
-                                    {
-                                        rules: [{ message: '请输入第三方点击监控链接' }],
-                                    },
-                                ]"
-                                placeholder="请输入第三方点击监控链接"
-                                >
-                                </a-input>
-                                <span style="color: red; position: relative; top: -10px">仅加白使用</span>
+                                <a-select
+                                    v-decorator="['siteId']"
+                                    showSearch
+                                    allowClear
+                                    placeholder="选择应用下载详情页"
+                                    optionFilterProp="children"
+                                    :filterOption="filterOption"
+                                    >
+                                    <a-select-option v-for="appModel in siteList" :key="appModel.siteId" :value="appModel.siteId">
+                                        {{ appModel.name }}
+                                    </a-select-option>
+                                </a-select>
                             </a-form-item>        
                         </div>
                     </div> -->
@@ -2588,7 +2593,7 @@ export default {
         appIdChange(val){
             console.log(val)
             this.siteList=[]
-            // this.getPageList(val)
+
             if(this.getFormData('singleAppid')==0){
                 if(val&&val.findIndex(item=>item.key===0)>-1){
                     let appidArr=this.appList.map(item=>{
@@ -2645,6 +2650,7 @@ export default {
                 if(this.getFormData('campaignType')==2){
                     
                     if(this.getFormData('singleAppid')==1){
+                        this.getPageList(val.key)
                         this.getIsActivate(val.key)
                     }else{
                        
@@ -3407,6 +3413,9 @@ export default {
                             deepConversionBid:item.deep_conversion_bid?item.deep_conversion_bid/1000:null,
                         }
                     }):[]
+                    if(res.result.singleAppid){
+                        this.getPageList(JSON.parse(res.result.appIdArray)[0]) 
+                    }
                     setTimeout(()=>{                       
                         this.form.setFieldsValue({
                              ...res.result,
@@ -3436,9 +3445,12 @@ export default {
                             roiRatio:res.result.roiRatio?res.result.roiRatio:null,
                             multipleBids:res.result.multipleBids,
                             cpaBid:cpaBid,
+                            siteId:res.result.siteId,
                         })
                         
                     },100)
+
+                    
                     if((res.result.ocpxActionType == 180 || res.result.ocpxActionType == 53) && this.groupTypeData.deepConversionTypes&&this.groupTypeData.deepConversionTypes.length > 0){
                         // //console.log(1)
                         setTimeout(()=>{

+ 1 - 0
src/views/modules/autoLaunch/configProject/creatConfig.vue

@@ -930,6 +930,7 @@ li.chouzhen.first:before {
                                             <a-select-option :value="715">微信复制优化目标</a-select-option>
                                             <a-select-option :value="716">多转化事件</a-select-option>
                                             <a-select-option :value="717">广告观看次数</a-select-option>
+                                             <a-select-option :value="773">关键行为</a-select-option>
                                         </a-select>
                                     </a-form-item>
                                 </a-col>

+ 3 - 0
src/views/modules/autoLaunch/directional/components/targetedPopulation.vue

@@ -243,6 +243,9 @@ li:hover {
         <a-radio :value="5">5x+</a-radio>
         <a-radio :value="6">6x+</a-radio>
         <a-radio :value="7">7x+</a-radio>
+        <a-radio :value="8">8x+</a-radio>
+        <a-radio :value="9">9x+</a-radio>
+        <a-radio :value="10">10x+</a-radio>
       </a-radio-group>
     </a-form-item>
     <a-form-item

+ 3 - 3
src/views/modules/autoLaunch/directional/components/templateModal.vue

@@ -213,7 +213,7 @@ export default {
           this.populationData.allForm.noAgeBreak = dataJson.noAgeBreak + ''
           this.populationData.allForm.noGenderBreak = dataJson.noGenderBreak + ''
           this.populationData.allForm.noAreaBreak = dataJson.noAreaBreak + ''
-          this.populationData.allForm.behaviorInterest = dataJson.label ? '1' : '0'
+          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 + ''
@@ -252,8 +252,8 @@ export default {
                   templateName: values.templateName,
                   projectId: this.projectId,
                 }
-                params.label = JSON.stringify(params.behavior)
-                params.interestLabel = JSON.stringify(params.interest)
+                params.label = params.behavior?JSON.stringify(params.behavior):'[]'
+                params.interestLabel = params.interest?JSON.stringify(params.interest):'[]'
                 if (this.type == 'add') {
                   postAction('/kuaishouDirectionalPackage/createDirectionalPackage', params).then((res) => {
                     if (res.success) {

+ 3 - 0
src/views/modules/autoLaunch/material-all/components/targetedPopulation.vue

@@ -243,6 +243,9 @@ li:hover {
         <a-radio :value="5">5x+</a-radio>
         <a-radio :value="6">6x+</a-radio>
         <a-radio :value="7">7x+</a-radio>
+        <a-radio :value="8">8x+</a-radio>
+        <a-radio :value="9">9x+</a-radio>
+        <a-radio :value="10">10x+</a-radio>
       </a-radio-group>
     </a-form-item>
     <a-form-item

+ 1 - 1
src/views/modules/autoLaunch/material-all/components/templateModal.vue

@@ -185,7 +185,7 @@ export default {
           this.populationData.allForm.noAgeBreak = dataJson.noAgeBreak + ''
           this.populationData.allForm.noGenderBreak = dataJson.noGenderBreak + ''
           this.populationData.allForm.noAreaBreak = dataJson.noAreaBreak + ''
-          this.populationData.allForm.behaviorInterest = dataJson.label=='[]' ? '1' : '0'
+          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 + ''

Fichier diff supprimé car celui-ci est trop grand
+ 3170 - 0
src/views/modules/autoLaunch/material-test/creatMaterialTest.vue


Fichier diff supprimé car celui-ci est trop grand
+ 1673 - 0
src/views/modules/autoLaunch/material-test/index.vue


Fichier diff supprimé car celui-ci est trop grand
+ 1136 - 0
src/views/modules/autoLaunch/material-test/lookPreview.vue


+ 304 - 0
src/views/modules/autoLaunch/material-test/treeSelectAccount.vue

@@ -0,0 +1,304 @@
+<style lang="scss" scoped>
+.select-project {
+    width: 50%;
+}
+</style>
+<template>
+    <div class="select-project">
+        <treeselect
+            :multiple="multiple"
+            :disable-branch-nodes="!multiple"
+            :disable-fuzzy-matching="true"
+            :options="options"
+            :load-options="loadOptions"
+            placeholder="请选择项目以及账户"
+            v-model="value"
+            :value-consists-of="valueConsistsOf"
+            :auto-load-root-options="false"
+            @select="update"
+            @input="emitValue"
+            :limit="limit"
+            :default-options="true"
+            :disabled="disabled"
+            :limitText="
+                count => {
+                    return '隐藏' + count + '条'
+                }
+            "
+            noChildrenText="该项目下暂无账号"
+            :noOptionsText="showLoading"
+        />
+    </div>
+</template>
+
+<script>
+//   @open="getParticipateList"
+// import the component
+import Treeselect from '@riophae/vue-treeselect'
+// import the styles
+import '@riophae/vue-treeselect/dist/vue-treeselect.css'
+import { LOAD_CHILDREN_OPTIONS } from '@riophae/vue-treeselect'
+
+import { getAction, postAction } from '@/api/manage'
+import { mapGetters } from 'vuex'
+// We just use `setTimeout()` here to simulate an async operation
+// instead of requesting a real API server for demo purpose.
+let called = false
+export default {
+    data: () => ({
+        value: null,
+        valueConsistsOf: 'LEAF_PRIORITY',
+        options: [],
+        showLoading: 'loading...'
+    }),
+    props: {
+        oneData: {
+            type: Boolean,
+            default() {
+                return false
+            }
+        },
+        //是否多选
+        multiple: {
+            type: Boolean,
+            default() {
+                return true
+            }
+        },
+        appId: {
+            default() {
+                return ''
+            }
+        },
+        //判断媒体类型
+        request: {
+            type: String,
+            default() {
+                return '2,4'
+            }
+        },
+        //一级请求接口
+        reqUrl: {
+            type: String,
+            default() {
+                return '/ctop/projectMember/participateListByMediaId'
+            }
+        },
+        // 展示条数
+        limit: {
+            type: Number,
+            default() {
+                return 2
+            }
+        },
+        disabled: {
+            type: Boolean,
+            default() {
+                return false
+            }
+        }
+    },
+    components: {
+        Treeselect
+    },
+    watch: {
+        $route(n, o) {},
+        appId: {
+            handler(n, o) {
+                console.log(n)
+                if (n.length == 0) {
+                    if (this.multiple) {
+                        this.value = []
+                    } else {
+                        this.value = undefined
+                    }
+                } else {
+                    this.value = this.appId
+                }
+            },
+            deep: true,
+            immediate: true
+        }
+    },
+    methods: {
+        ...mapGetters(['nickname', 'avatar', 'userInfo']),
+        update(node, id) {
+            this.$emit('select-value', node)
+            console.log(node)
+            if (typeof node.id == 'string' && node.id.indexOf('p') != -1) {
+                getAction('/ctop/userAllocation/getByProjectId', {
+                    projectId: node.id.split('p')[0]
+                }).then(res => {
+                    // console.log(res)
+                    if (res.code == 0) {
+                        if (res.result.length > 0) {
+                            node.children = res.result.map(item => {
+                                return {
+                                    id: item.userId ? item.userId : '',
+                                    label: item.userId ? item.userId : '',
+                                    children: item.accounts.map(c => {
+                                        return {
+                                            id: c.accountId,
+                                            label:
+                                                c.userName +
+                                                '\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0' +
+                                                c.authName
+                                        }
+                                    })
+                                }
+                            })
+                        } else {
+                        }
+                    } else {
+                        new Error('Failed to load options: network error.')
+                    }
+                })
+            }
+        },
+        emitValue(value, id) {
+            this.$emit('update:appId', this.value)
+        },
+        loadOptions({ action, parentNode, callback }) {
+            // Typically, do the AJAX stuff here.
+            // Once the server has responded,
+            // assign children options to the parent node & call the callback.
+            if (action === LOAD_CHILDREN_OPTIONS) {
+                getAction('/ctop/userAllocation/getByProjectId', {
+                    projectId: parentNode.id.split('p')[0]
+                }).then(res => {
+                    if (res.code == 0) {
+                        if (res.result.length > 0) {
+                            parentNode.children = res.result.map(item => {
+                                return {
+                                    id: item.userId ? item.userId : '',
+                                    label: item.userId ? item.userId : '',
+                                    children: item.accounts.map(c => {
+                                        return {
+                                            id: c.accountId,
+                                            label:
+                                                c.userName +
+                                                '\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0' +
+                                                c.authName
+                                        }
+                                    })
+                                }
+                            })
+                            callback()
+                        } else {
+                            parentNode.children = []
+                            callback()
+                        }
+                    } else {
+                        callback(new Error('Failed to load options: network error.'))
+                    }
+                })
+            }
+        },
+        getParticipateList() {
+            //我参与的
+            //   toutiaoParticipateList
+            var params = {}
+            params.userId = this.userInfo().id
+
+            if (this.request == '1,3') {
+                params.type = 'bytedance'
+            } else if (this.request == '2,4') {
+                params.type = 'kuaishou'
+            }
+
+            if (this.reqUrl == '/ctop/projectMember/participateListByMediaId') {
+                if (this.options.length > 0) {
+                    return
+                }
+                getAction('/ctop/projectMember/projectList').then(res => {
+                    if (res.success) {
+                        this.options = res.data.map(item => {
+                            return {
+                                id: item.id + 'projectId',
+                                label: item.projectName,
+                                children: null
+                            }
+                        })
+                        if (this.oneData && !this.multiple) {
+                            var data = this.options.filter(item => {
+                                if (item.children && item.children.length > 0) {
+                                    return { ...item }
+                                }
+                            })
+                            this.$emit('update:appId', data[0].children[0].id)
+                        }
+                    }
+                })
+            } else if (this.reqUrl == '/ctop/projectMember/getProjectAccountByUserId') {
+                getAction(this.reqUrl, {
+                    mediaType: this.request
+                }).then(res => {
+                    if (res.code == 0) {
+                        if (res.result.length > 0) {
+                            res.result.forEach((element, index) => {
+                                if (element) {
+                                    this.options.push({})
+                                    this.options[index].label =
+                                        element.project.projectName + '_(' + element.project.advertiserName + ')'
+                                    this.options[index].id = 'project' + element.project.projectId
+                                    this.options[index].key = element.project.projectId
+                                    this.options[index].mediaId = element.project.mediaId
+                                    this.options[index].children = []
+
+                                    if (element.account.length) {
+                                        element.account.forEach((ele, i) => {
+                                            this.options[index].children.push({})
+                                            this.options[index].children[i].label =
+                                                ele.userName + '_' + ele.authName + '_' + element.project.projectName
+                                            this.options[index].children[i].id = ele.accountId
+                                            this.options[index].children[i].key = ele.accountId
+                                        })
+                                    }
+                                }
+                            })
+                        } else {
+                            this.showLoading = '暂无数据'
+                        }
+                    }
+                })
+            } else {
+                getAction(this.reqUrl, {
+                    userId: this.userInfo().id
+                }).then(res => {
+                    if (res.code == 0) {
+                        if (res.result.length > 0) {
+                            var arr = this.request.split(',')
+                            var dataTwo = []
+                            var data = res.result.filter(item => {
+                                return item.mediaId == arr[0]
+                            })
+                            if (arr.length > 1) {
+                                dataTwo = res.result.filter(item => {
+                                    return item.mediaId == arr[1]
+                                })
+                            }
+                            var allData = data.concat(dataTwo)
+                            this.options = allData.map(item => {
+                                return {
+                                    id: item.projectId,
+                                    label:
+                                        item.projectName +
+                                        '\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0' +
+                                        item.advertiserName,
+                                    children: null
+                                }
+                            })
+                        } else {
+                            this.showLoading = '暂无数据'
+                        }
+                    }
+                })
+            }
+        }
+    },
+
+    mounted() {
+        this.getParticipateList()
+    }
+}
+</script>

+ 4 - 0
src/views/modules/autoLaunch/setDirectional.vue

@@ -436,6 +436,10 @@
                                 <a-select-option :value="396" v-if="
                                     groupTypeData.isRegister == '1'
                                 ">注册优化目标</a-select-option>
+
+                                 <a-select-option :value="773" v-if="
+                                    groupTypeData.isKeyAction == '1'
+                                ">关键行为</a-select-option>
                             </a-select>
 
                            

+ 8 - 1
src/views/modules/crowd-control/crowd-control.vue

@@ -47,6 +47,7 @@
                 :columns="columns"
                 :dataSource="dataSource"
                 :pagination="false"
+                :loading="dataLoading"
             >
                 <span slot="action" slot-scope="text, record">
                     <a @click="handleEdit(record)">推送</a>
@@ -68,6 +69,7 @@
                 </span>
             </a-table>
             <a-pagination
+                v-if="dataSource.length>0"
                 class="pagin-table-class"
                 :total="totalAll"
                 :show-total="total => `共 ${totalAll} 条`"
@@ -262,6 +264,7 @@ export default {
     data() {
         let that = this;
         return {
+            dataLoading: false,
             src: '/kuaishouPopulationPackage/getAccountByProjectId',
             unitAccountId: '',
             personResourceDisabled: false,
@@ -509,16 +512,20 @@ export default {
                 pageNo: this.tablePag.page,
                 pageSize: this.tablePag.size
             };
-            this.dataSource = []
+            this.dataSource = [];
+            this.dataLoading = true;
             getAction('/kuaishouPopulationPackage/list', paramsData).then(result => {
                 if (result.code === 200) {
+                    this.dataLoading = false;
                     this.dataSource = result.result.list || [];
                     this.totalAll = result.result.total || 0;
                 }
                 else {
+                    this.dataLoading = false;
                     this.$message.error(result.message);
                 }
             }).catch(error => {
+                this.dataLoading = false;
                 console.log(error, 'eeee');
             });
         },

+ 673 - 0
src/views/modules/earlyWarningRules/accountClear/createClear.vue

@@ -0,0 +1,673 @@
+<style scoped lang="scss">
+/deep/.display-none-selset {
+    display: none !important;
+}
+.step-jump {
+    /deep/ table tr td {
+        border-bottom: 0px;
+    }
+}
+.bottom-to-one {
+    /deep/ .ant-form-item {
+        margin-bottom: 0;
+    }
+}
+.target-person-add-button {
+    margin-left: 15px;
+}
+.card-person {
+    width: 300px;
+    /deep/.ant-card-body {
+        padding: 0px;
+    }
+    /deep/.ant-card-head {
+        padding: 0px 10px;
+    }
+    .card-main-case {
+        height: 250px;
+        overflow: auto;
+        padding: 0 5px;
+    }
+}
+.card-person-drawer {
+    width: 100%;
+    height: 90%;
+    overflow: hidden;
+    padding: 10px 0px;
+    display: flex;
+    flex-wrap: wrap;
+    margin-right: -10px;
+    justify-content: space-between;
+    .card-item {
+        width: calc(33% - 10px);
+        margin-bottom: 10px;
+        float: left;
+    }
+    .card-item-else {
+        width: calc(20% - 10px);
+        margin-bottom: 10px;
+        float: left;
+    }
+}
+.showShare {
+    position: relative;
+}
+.share {
+    display: none;
+}
+.showShare:hover .share {
+    display: flex;
+    justify-content: center;
+    align-items: center;
+}
+.chouzhen {
+    border-style: solid;
+    border-width: 1px;
+    border-color: #e4e4e4;
+    width: calc(20% - 10px);
+    padding: 10px;
+    margin-right: 10px;
+    margin-bottom: 10px;
+    display: flex;
+    align-items: center;
+    background: #fff;
+    position: relative;
+    z-index: 99;
+    float: left;
+}
+
+li.chouzhen.first:before {
+    font-size: 12px;
+    content: '首帧';
+    position: absolute;
+    top: 7px;
+    left: 5px;
+    width: 36px;
+    height: 20px;
+    color: rgb(255, 255, 255);
+    line-height: 20px;
+    text-align: center;
+    background: rgba(0, 0, 0, 0.5);
+    border-radius: 2px;
+    z-index: 1000;
+}
+.display-none-selset {
+    display: none !important;
+}
+.logo {
+    padding-left: 24px;
+    img {
+        height: 32px !important;
+    }
+    .name {
+        font-size: 14px;
+        font-family: PingFangSC-Medium, PingFang SC;
+        font-weight: 500;
+        color: #ced2d9;
+        // line-height: 22px;
+        margin-left: 20px;
+        padding-left: 21px;
+        position: relative;
+    }
+    .name::before {
+        content: '';
+        width: 1px;
+        height: 18px;
+        background: rgba(255, 255, 255, 0.31);
+        position: absolute;
+        left: 0;
+        top: 50%;
+        margin-top: -9px;
+    }
+}
+.chartBox {
+    .chartBody {
+        display: flex;
+        justify-content: space-around;
+        flex-wrap: wrap;
+    }
+    .search-box {
+        margin-bottom: 20px;
+    }
+}
+
+/deep/ .ant-descriptions-item-content {
+    font-weight: bold;
+}
+
+.info-detail {
+    /deep/ table tr td {
+        border: 0;
+    }
+    /deep/ .ant-descriptions-item-label {
+        color: darkgray;
+        // min-width: 30px;
+        white-space: nowrap;
+    }
+}
+.flex-main {
+    display: flex;
+    margin-bottom: 10px;
+    p {
+        color: black;
+        font-weight: 600;
+        overflow: hidden; //超出的文本隐藏
+        text-overflow: ellipsis; //溢出用省略号显示
+        white-space: nowrap; //溢出不换行
+    }
+}
+</style>
+<style lang="scss">
+.hide-checkbox .ant-table-thead .ant-table-selection {
+    display: none;
+}
+.new-batch .ant-card-head-title {
+    font-weight: 700;
+}
+// .new-batch textarea {
+//   resize: none;
+//   border: none;
+//   outline: 0;
+//   box-shadow: none;
+// }
+.create-info .ant-form-item {
+    margin-bottom: 0 !important;
+}
+.fengmian .ant-checkbox-wrapper:first-child {
+    margin-left: 8px;
+}
+@media screen and (max-width: 1200px) {
+    // 这里写对应要修改的样式如:
+    .new-batch .el-step__title {
+        font-size: 12px;
+    }
+}
+.line-height-one .ant-form-item-control {
+    line-height: inherit;
+}
+.creat-all-info .ant-form-item-control {
+    width: 60%;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+}
+.config-new-batch {
+    .display-none-selset {
+        display: none !important;
+    }
+    .ant-btn-danger {
+        background-color: #ff4d4f !important;
+    }
+}
+</style>
+<template>
+    <div ref="questionnaireBox" class="new-batch config-new-batch">
+        <div class="chartBox">
+            <a-row :gutter="20">
+                <a-col :sm="24" style="margin-bottom: 20px; z-index: 10" id="container">
+                    <a-card class="search-box step-jump">
+                        <a-form layout="horizontal" v-bind="formItemLayout" :form="formOptimize">
+                            <a-row :gutter="16">
+                                <a-col :span="16">
+                                    <a-form-item label="模板名称">
+                                        <a-input
+                                            :disabled="$route.query.id"
+                                            v-decorator="[
+                                                'templateName',
+                                                {
+                                                    rules: [
+                                                        { required: true, message: ' ' },
+                                                        { validator: templateNameValid }
+                                                    ]
+                                                }
+                                            ]"
+                                        >
+                                        </a-input>
+                                    </a-form-item>
+                                </a-col>
+                            </a-row>
+                            <a-row :gutter="16">
+                                <a-col :span="16">
+                                    <a-form-item label="清理时间范围">
+                                        <a-select
+                                            :disabled="$route.query.preview == 'true'"
+                                            v-decorator="[
+                                                'cleanTime',
+                                                {
+                                                    rules: [{ required: true, message: '清理时间范围必选' }],
+                                                    initialValue: '1'
+                                                }
+                                            ]"
+                                        >
+                                            <a-select-option value="1">最近一天</a-select-option>
+                                            <a-select-option value="3">最近三天</a-select-option>
+                                            <a-select-option value="7">最近七天</a-select-option>
+                                            <a-select-option value="15">最近十五天</a-select-option>
+                                        </a-select>
+                                    </a-form-item>
+                                </a-col>
+                            </a-row>
+                            <a-row :gutter="16">
+                                <a-col :span="16">
+                                    <a-form-item label="优化目标">
+                                        <a-select
+                                            :disabled="$route.query.preview == 'true'"
+                                            showSearch
+                                            allowClear
+                                            mode="multiple"
+                                            v-decorator="[
+                                                'optimizationObjective',
+                                                {
+                                                    rules: [{ required: true, message: '优化目标必选' }],
+                                                    initialValue: ['activation']
+                                                }
+                                            ]"
+                                        >
+                                            <!-- <a-select-option value="bclick">行为数</a-select-option> -->
+                                            <a-select-option value="activation">激活</a-select-option>
+                                            <a-select-option value="formSize">表单提交</a-select-option>
+                                            <a-select-option value="pay">付费</a-select-option>
+                                            <!-- <a-select-option value="roi">首日ROI</a-select-option> -->
+                                            <a-select-option value="evocativeApplication">唤起应用</a-select-option>
+                                            <!-- <a-select-option value="effectiveClues">使用有效线索</a-select-option> -->
+                                            <!-- <a-select-option value="creditApp">授信App</a-select-option> -->
+                                            <!-- <a-select-option value="creditGrant">授信落地页</a-select-option> -->
+                                            <!-- <a-select-option value="ordersSubmitted">订单提交</a-select-option> -->
+                                            <!-- <a-select-option value="finishedPieceApp">App完件数</a-select-option> -->
+                                            <!-- <a-select-option value="finishedPieceGrant">落地页完件数</a-select-option> -->
+                                            <!-- <a-select-option value="registered">注册优化目标</a-select-option> -->
+                                        </a-select>
+                                    </a-form-item>
+                                </a-col>
+                            </a-row>
+                            <a-row :gutter="16">
+                                <a-col :span="16">
+                                    <a-form-item label="累计消耗">
+                                        <span style="width: 15%;display: inline-block;">小于等于</span>
+                                        <a-input-number
+                                            :disabled="$route.query.preview == 'true'"
+                                            v-decorator="[
+                                                'charge',
+                                                {
+                                                    rules: [
+                                                        {
+                                                            required: true,
+                                                            message: '累计消耗必填'
+                                                        }
+                                                    ],
+                                                    initialValue: 100
+                                                }
+                                            ]"
+                                            :min="0"
+                                            :precision="0"
+                                            style="width: 60%"
+                                        />
+                                        元
+                                    </a-form-item>
+                                </a-col>
+                            </a-row>
+                            <a-row :gutter="16">
+                                <a-col :span="16">
+                                    <a-form-item label="累计转化数">
+                                        <span style="width: 15%;display: inline-block;">小于等于</span>
+
+                                        <a-input-number
+                                            :disabled="$route.query.preview == 'true'"
+                                            v-decorator="[
+                                                'conversion',
+                                                {
+                                                    rules: [
+                                                        {
+                                                            required: true,
+                                                            message: '累计转化数必填'
+                                                        }
+                                                    ],
+                                                    initialValue: 2
+                                                }
+                                            ]"
+                                            :min="0"
+                                            :precision="0"
+                                            style="width: 60%"
+                                        />
+                                        个
+                                    </a-form-item>
+                                </a-col>
+                            </a-row>
+                            <a-row :gutter="16">
+                                <a-col :span="16">
+                                    <a-form-item label="推广组状态">
+                                        <a-select
+                                            :disabled="$route.query.preview == 'true'"
+                                            v-decorator="[
+                                                'promotionGroupStatus',
+                                                {
+                                                    rules: [{ required: true, message: '推广组状态必选' }],
+                                                    initialValue: '1'
+                                                }
+                                            ]"
+                                            @change="checkStatus"
+                                        >
+                                            <a-select-option value="1">投放中</a-select-option>
+                                            <a-select-option value="2">暂停</a-select-option>
+                                            <a-select-option value="3">不限</a-select-option>
+                                        </a-select>
+                                    </a-form-item>
+                                </a-col>
+                            </a-row>
+                            <!-- { rules: [{ validator: deepBidValid }] } -->
+                            <a-row :gutter="16">
+                                <a-col :span="16">
+                                    <a-form-item label="执行操作类型">
+                                        <a-radio-group
+                                            :disabled="$route.query.preview == 'true'"
+                                            button-style="solid"
+                                            v-decorator="[
+                                                'performOperations',
+                                                {
+                                                    rules: [{ required: true, message: '执行操作类型必选' }],
+                                                    initialValue: '3'
+                                                }
+                                            ]"
+                                        >
+                                            <a-radio-button value="3">删除</a-radio-button>
+                                            <a-radio-button
+                                                value="2"
+                                                :disabled="getFormData('formOptimize', 'promotionGroupStatus') != '1'"
+                                                >暂停</a-radio-button
+                                            >
+                                        </a-radio-group>
+                                    </a-form-item>
+                                </a-col>
+                            </a-row>
+                            <a-row :gutter="16">
+                                <a-col :span="16">
+                                    <a-form-item label="执行操作时间">
+                                        每天上午10点以后执行
+                                    </a-form-item>
+                                </a-col>
+                            </a-row>
+                        </a-form>
+                    </a-card>
+                    <div
+                        style="display: flex; justify-content: flex-end; margin-bottom: 100px"
+                        v-if="$route.query.preview != 'true'"
+                    >
+                        <div>
+                            <a-button
+                                type="primary"
+                                style="margin-right: 15px"
+                                @click="handleSubmit"
+                                :loading="sumbitLoading"
+                                :disabled="disabled"
+                            >
+                                创建
+                            </a-button>
+                            <a-button @click="clearAllData"> 取消 </a-button>
+                        </div>
+                    </div>
+                </a-col>
+            </a-row>
+        </div>
+    </div>
+</template>
+
+<script>
+//   import UserMenu from '../tools/UserMenu'
+//   import SMenu from '../menu/'
+import Logo from '@/components/tools/Logo.vue'
+import pick from 'lodash.pick'
+import { mixin } from '@/utils/mixin.js'
+import Treeselect from '@/views/modules/Statistics/components/Treeselect.vue'
+import moment from 'moment'
+import selectCheckAll from '@/components/formComponents/toutiaoTime'
+import checkBoxGroup from '@/components/formComponents/checkBoxGroup'
+import uploadFile from '@/components/uploadFileMd5Push.vue'
+import { stopOtherVideo, closeAllVideoFun } from '@/utils/videoControl' // 停止除当前外的其他视频播放,及停止所有视频播放的方法
+import selectTable from '@/views/modules/Statistics/components/selectPagination.vue'
+import { mapGetters } from 'vuex'
+// import lookPreviewVue from './lookPreview.vue'
+function tqFun(qcArr1) {
+    var tempArr = []
+    function bbFun(qcArr) {
+        for (var i = 0; i < qcArr.length; i++) {
+            if (qcArr[i] instanceof Array) {
+                bbFun(qcArr[i])
+            } else {
+                tempArr.push(qcArr[i])
+            }
+        }
+        return tempArr
+    }
+    return bbFun(qcArr1)
+}
+
+export default {
+    name: 'GlobalHeader',
+    components: {
+        //   UserMenu,
+        //   SMenu,
+        Logo,
+        Treeselect,
+        selectCheckAll,
+        checkBoxGroup,
+        uploadFile,
+        selectTable
+    },
+    data() {
+        return {
+            formOptimize: this.$form.createForm(this), //优化目标表单
+            sumbitLoading: false,
+            formItemLayout: {
+                labelCol: { span: 4 },
+                wrapperCol: { span: 16 }
+            },
+            formDrawerItemLayout: {
+                labelCol: { span: 5 },
+                wrapperCol: { span: 19 }
+            },
+            tailFormItemLayout: {
+                wrapperCol: {
+                    sm: {
+                        span: 20,
+                        offset: 4
+                    }
+                }
+            },
+            tailFormItemLayoutElse: {
+                wrapperCol: {
+                    sm: {
+                        span: 20,
+                        offset: 1
+                    }
+                }
+            },
+            tailFormDrawerItemLayout: {
+                wrapperCol: {
+                    sm: {
+                        span: 19,
+                        offset: 5
+                    }
+                }
+            },
+            disabled: false
+        }
+    },
+    computed: {},
+    watch: {},
+    mounted() {
+        this.$nextTick(function() {
+            if (this.$route.query.id) {
+                this.getAction('/accountClean/previewTemplate', { templateId: this.$route.query.id }).then(res => {
+                    if (res.success) {
+                        let data = res.result
+                        data.optimizationObjective = data.optimizationObjective.split(',')
+                        this.formOptimize.setFieldsValue(
+                            pick(
+                                data,
+                                'templateName',
+                                'cleanTime',
+                                'optimizationObjective',
+                                'charge',
+                                'conversion',
+                                'promotionGroupStatus',
+                                'performOperations'
+                            )
+                        )
+                    }
+                })
+            } else {
+                this.formOptimize.setFieldsValue({
+                    promotionGroupStatus: '1'
+                })
+            }
+        })
+    },
+    filters: {},
+    methods: {
+        moment,
+        templateNameValid(rule, value, callback) {
+            if (value === '' || value === undefined || value === 0 || value === '0') {
+                callback('模板名称必须填写')
+            } else {
+                let params = {}
+                params.templateName = value
+                if (this.$route.query.id) {
+                    params.id = this.$route.query.id
+                    callback()
+                } else {
+                    this.getAction('/accountClean/getTemplateNameSize', params).then(res => {
+                        if (res.success) {
+                            if (res.result > 0) {
+                                callback('模板名称重复')
+                            } else {
+                                callback()
+                            }
+                        }
+                    })
+                }
+            }
+        },
+        ...mapGetters(['userInfo']),
+        getFormData(form, className) {
+            return this[form].getFieldValue(className)
+        },
+        handleSubmit() {
+            // /accountClean/createTemplate
+            this.formOptimize.validateFields((err, values) => {
+                if (!err) {
+                    this.sumbitLoading = true
+                    let params = { ...values }
+                    params.optimizationObjective = params.optimizationObjective.join()
+                    params.createId = this.userInfo().id
+                    params.createUser = this.userInfo().username
+                    console.log(this.userInfo())
+                    if (this.$route.query.id) {
+                        params.id = this.$route.query.id
+                        this.postDataAction('/accountClean/updateTemplate', params).then(res => {
+                            this.sumbitLoading = false
+                            if (res.success) {
+                                this.$router.replace('/earlyWarningRules/accountClear')
+                                this.$bus.$emit('remove', `/earlyWarningRules/createClear?id=${this.$route.query.id}`)
+                            } else {
+                                this.$message.error(res.message)
+                            }
+                        })
+                    } else {
+                        this.postDataAction('/accountClean/createTemplate', params).then(res => {
+                            this.sumbitLoading = false
+                            if (res.success) {
+                                this.$router.replace('/earlyWarningRules/accountClear')
+                                this.$bus.$emit('remove', '/earlyWarningRules/createClear')
+                            } else {
+                                this.$message.error(res.message)
+                            }
+                        })
+                    }
+                } else {
+                }
+            })
+        },
+        checkStatus(e) {
+            // if (e != '1') {
+            this.formOptimize.setFieldsValue({
+                performOperations: '3'
+            })
+            // }else{
+            //      this.formOptimize.setFieldsValue({
+            //         performOperations: undefined
+            //     })
+            // }
+        },
+        clearAllData() {
+            if (this.$route.query.id) {
+                this.$router.replace('/earlyWarningRules/accountClear')
+                this.$bus.$emit('remove', `/earlyWarningRules/createClear?id=${this.$route.query.id}`)
+            } else {
+                this.$router.replace('/earlyWarningRules/accountClear')
+                this.$bus.$emit('remove', '/earlyWarningRules/createClear')
+            }
+        }
+    }
+}
+</script>
+
+<style lang="scss" scoped>
+/* update_begin author:scott date:20190220 for: 缩小首页布局顶部的高度*/
+
+$height: 59px;
+.layout .header .user-wrapper .action .anticon,
+.layout .top-nav-header-index .user-wrapper .action .anticon {
+    color: #999;
+}
+.layout .header .user-wrapper .action .anticon,
+.layout .top-nav-header-index .user-wrapper .action .anticon {
+    color: #999;
+}
+.layout {
+    .top-nav-header-index {
+        .header-index-wide {
+            margin-left: 10px;
+
+            .ant-menu.ant-menu-horizontal {
+                height: $height;
+                line-height: $height;
+            }
+        }
+
+        .trigger {
+            line-height: 48px;
+            font-size: 17px;
+            &:hover {
+                background: rgba(0, 0, 0, 0.05);
+            }
+        }
+    }
+
+    .header {
+        z-index: 2;
+        color: #999;
+        height: $height;
+        background-color: #1890ff;
+        transition: background 300ms;
+
+        /* dark 样式 */
+        &.dark {
+            color: #000000;
+            box-shadow: 0 0 4px rgba(0, 0, 0, 0.2);
+            background-color: white !important;
+        }
+    }
+
+    .header,
+    .top-nav-header-index {
+        &.dark .trigger:hover {
+            background: rgba(0, 0, 0, 0.05);
+        }
+    }
+}
+
+.ant-layout-header {
+    height: $height;
+    line-height: $height;
+}
+</style>

+ 972 - 0
src/views/modules/earlyWarningRules/accountClear/index.vue

@@ -0,0 +1,972 @@
+<style lang="scss" scoped>
+.search-bar {
+    display: flex;
+    align-items: center;
+}
+.search-box p {
+    display: inline-block;
+    border: 1px solid #f2f2f2;
+    border-radius: 5px;
+    margin-right: 10px;
+    padding: 5px 10px;
+    cursor: pointer;
+}
+</style>
+<style scoped>
+.showNumBox {
+    margin: 10px 0;
+}
+.showNumBox .ant-card-body {
+    display: flex;
+    justify-content: center;
+}
+.showNumBox p,
+.showNumBox span {
+    text-align: center;
+    line-height: 40px;
+    font-size: 30px;
+    font-weight: 600;
+    color: red;
+    margin: 0;
+}
+.search-box .ant-card-body {
+    padding: 5px 15px;
+}
+.showNumBox .ant-card-body .styleElse {
+    line-height: 60px;
+    height: 40px;
+    font-size: 16px;
+    font-weight: 400;
+    margin-left: 10px;
+}
+.ant-modal-wrap .yincang .ant-modal-content .ant-modal-footer {
+    display: none !important;
+}
+.yincang .ant-col-6 p {
+    text-align: left;
+    color: red;
+    font-size: 16px;
+    font-weight: 500;
+}
+.ant-table-thead div {
+    font-weight: 700;
+}
+.tool-tip {
+    position: absolute;
+    top: 65px;
+    right: 10px;
+}
+</style>
+<style lang="less" scoped>
+.ant-card-head .ant-tabs-bar {
+    padding: 0;
+}
+.search-box .ant-card-body {
+    padding: 5px 15px;
+}
+.search-box {
+    padding: 15px 10px;
+}
+.search-box p {
+    display: inline-block;
+    border: 1px solid #f2f2f2;
+    border-radius: 5px;
+    margin-right: 10px;
+    padding: 5px 10px;
+    cursor: pointer;
+}
+.statistics .ant-col-6 .ant-card-body .styleElse {
+    line-height: 60px;
+    height: 40px;
+    font-size: 16px;
+    font-weight: 400;
+    margin-left: 10px;
+}
+.ant-modal-wrap .yincang .ant-modal-content .ant-modal-footer {
+    display: none !important;
+}
+.yincang .ant-col-6 p {
+    text-align: left;
+    color: red;
+    font-size: 16px;
+    font-weight: 500;
+}
+.ant-table-thead div {
+    font-weight: 700;
+}
+.tool-tip {
+    position: absolute;
+    top: 65px;
+    right: 10px;
+}
+.statistics {
+    .ant-card-bordered {
+        border: none;
+    }
+    .ant-card-head .ant-tabs {
+        clear: both;
+        margin-bottom: -13px;
+        color: rgba(0, 0, 0, 0.65);
+        font-weight: normal;
+        font-size: 14px;
+    }
+    .duibi {
+        position: absolute;
+        right: 24px;
+        top: 15px;
+    }
+    p {
+        margin-bottom: 0;
+    }
+}
+</style>
+
+<style lang="less" scoped>
+.middle-button {
+    margin: 0 10px;
+}
+.newPlanStatic {
+    .divider {
+        height: 62px;
+    }
+    .showNumBox {
+        background: white;
+        overflow: hidden;
+        margin: 15px 0;
+        padding: 30px 0;
+        text-align: center;
+        .ant-card-body {
+            padding-top: 0;
+        }
+        .title {
+            font-size: 14px;
+            font-family: PingFangSC-Regular, PingFang SC;
+            font-weight: 400;
+            color: #999999;
+            line-height: 22px;
+            display: inline-block;
+        }
+    }
+    .tabbody {
+        background: white;
+        padding: 0 24px;
+        margin-bottom: 15px;
+        .ant-tabs-bar {
+            margin: 0;
+        }
+    }
+    .chartBox {
+        background: white;
+        padding: 20px 0;
+    }
+    .tableBody {
+        background: white;
+        padding: 20px;
+    }
+}
+</style>
+<template>
+    <div class="newPlanStatic config-project">
+        <div class="tabbody">
+            <a-tabs v-model="tabKey" @change="tabChange">
+                <a-tab-pane :key="1" tab="清理模板列表"> </a-tab-pane>
+                <a-tab-pane :key="2" tab="我的清理模板"> </a-tab-pane>
+                <!-- <a-button slot="tabBarExtraContent" type="primary" @click="getHistroy(null)">
+                    历史记录查询
+                </a-button> -->
+            </a-tabs>
+        </div>
+        <a-card>
+            <div class="table-page-search-wrapper">
+                <a-form layout="inline" :form="form" hide-required-mark :selfUpdate="true" @submit="handleQueryList">
+                    <a-row :gutter="24" v-if="tabKey === 1">
+                        <a-col :md="8" :sm="8" :xxl="6">
+                            <a-form-item label="模板名称">
+                                <a-input
+                                    v-decorator="['templateName']"
+                                    type="text"
+                                    placeholder="请输入需要搜索的模板名称"
+                                />
+                            </a-form-item>
+                            <!-- <selectTable :projectId.sync="projectIdAll" ref="selectTable"></selectTable> -->
+                        </a-col>
+
+                        <a-col :md="8" :sm="8" :xxl="6">
+                            <a-form-item label="创建人">
+                                <a-input
+                                    v-decorator="['createUser']"
+                                    type="text"
+                                    placeholder="请输入创建模板的账号归属人名字"
+                                />
+                            </a-form-item>
+                        </a-col>
+                        <a-col :md="8" :sm="8" :xxl="6">
+                            <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" class="middle-button"
+                                    >重置</a-button
+                                >
+                                <a-button type="primary" @click="newCreat(null)">
+                                    新建清理模板
+                                </a-button>
+                            </span>
+                        </a-col>
+                    </a-row>
+                    <a-row :gutter="24" v-else>
+                        <a-col :md="8" :sm="8" :xxl="6">
+                            <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-input v-decorator="['userName']" type="text" placeholder="请输入绑定的运营名称" />
+                            </a-form-item>
+                        </a-col>
+
+                        <a-col :md="8" :sm="8" :xxl="6">
+                            <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" class="middle-button"
+                                    >重置</a-button
+                                >
+                            </span>
+                        </a-col>
+                    </a-row>
+                </a-form>
+            </div>
+        </a-card>
+
+        <a-row style="margin-bottom:15px;margin-top:12px">
+            <a-col :span="24">
+                <div class="tableBody" style="min-height:200px;padding-bottom: 50px">
+                    <a-table
+                        :columns="columns"
+                        :dataSource="dataSource"
+                        :pagination="false"
+                        :loading="dataLoading"
+                        bordered
+                        @change="tableChange"
+                        size="middle"
+                        style="word-break: break-all;font-size:16px;font-weight:600"
+                        id="outTable"
+                        ref="accountTable"
+                    >
+                        <span slot="action" slot-scope="text, record">
+                            <a @click="newCreat(record.id, 'preview')">预览</a>
+                            <a-divider type="vertical" />
+                            <a @click="matchingAccount(record)">推送</a>
+                            <a-divider type="vertical" />
+                            <a @click="newCreat(record.id, 'edit')">编辑</a>
+                        </span>
+                        <span slot="actionTwo" slot-scope="text, record">
+                            <a @click="removeTemplate(record)">删除清理模板</a>
+                            <a-divider type="vertical" />
+                            <a @click="getHistroy(record)">历史记录查询</a>
+                        </span>
+                        <span slot="status" slot-scope="text, record">
+                            <a-switch
+                                :checked="text == '0'"
+                                @change="onChangeStatus(text, record, 'status')"
+                                :loading="spinning"
+                                v-if="record.projectName !== '-'"
+                            />
+                        </span>
+                    </a-table>
+                    <a-pagination
+                        size="small"
+                        :showTotal="ipagination.showTotal"
+                        style="float: right;margin-top:10px"
+                        v-if="dataSource.length > 0"
+                        showQuickJumper
+                        :pageSize.sync="ipagination.pageSize"
+                        :total="ipagination.total"
+                        v-model="ipagination.current"
+                        @change="getDataSource"
+                    />
+                </div>
+            </a-col>
+        </a-row>
+
+        <a-modal
+            title="推送账户选择"
+            :width="800"
+            v-if="accountVisible"
+            :visible="accountVisible"
+            @cancel="
+                accountVisible = false
+                accountIdPush = ''
+            "
+            dialog-class="push-modal"
+            @ok="handleOkPrice"
+            :confirm-loading="modifyPriceLoading"
+        >
+            <div v-if="accountProjectDetail" style="display:flex">
+                <span>请选择账户:</span>
+                <Treeselect
+                    :appId.sync="accountIdPush"
+                    :multiple="false"
+                    request="2,4"
+                    ref="treeSelect"
+                    style="width:80%;position: relative;top: -5px;"
+                />
+            </div>
+        </a-modal>
+        <a-modal
+            title="推送组清理记录"
+            :width="800"
+            v-if="unitVisible"
+            :visible="unitVisible"
+            @cancel="unitVisible = false"
+            dialog-class="push-modal"
+            :footer="null"
+        >
+            <a-table
+                :columns="historyColumns"
+                :dataSource="historyList"
+                :pagination="ipaginationHistory"
+                bordered
+                size="middle"
+                style="word-break: break-all;font-size:16px;font-weight:600"
+            >
+                <span slot="authStatus" slot-scope="text">
+                    {{ text === 0 ? '失败' : '成功' }}
+                </span>
+            </a-table>
+        </a-modal>
+    </div>
+</template>
+
+<script>
+import ARow from 'ant-design-vue/es/grid/Row'
+import ACol from 'ant-design-vue/es/grid/Col'
+import moment from 'moment'
+import selectTable from '@/views/modules/Statistics/components/selectPagination.vue'
+import { getKsAccountReport, getKsDetail, getReportList } from '@api/video.js'
+import { getAction, postAction, downFile, downFilePost } from '@/api/manage'
+import { mapGetters } from 'vuex'
+import Treeselect from '@/views/modules/Statistics/components/Treeselect.vue'
+import qs from 'qs'
+
+let TTcolumns = [
+    {
+        title: '开关',
+        dataIndex: 'status',
+        scopedSlots: { customRender: 'status' },
+        align: 'center',
+        key: 'status'
+    },
+    {
+        title: '模板id',
+        dataIndex: 'id',
+        scopedSlots: { customRender: 'id' },
+        align: 'center',
+        key: 'id'
+    },
+    {
+        title: '模板名称',
+        dataIndex: 'templateName',
+        scopedSlots: { customRender: 'templateName' },
+        align: 'center',
+        key: 'templateName'
+    },
+    {
+        title: '应用媒体',
+        dataIndex: 'appliedMedia',
+        scopedSlots: { customRender: 'appliedMedia' },
+        align: 'center',
+        key: 'appliedMedia'
+    },
+
+    {
+        title: '创建人',
+        dataIndex: 'createUser',
+        scopedSlots: { customRender: 'createUser' },
+        align: 'center',
+        key: 'createUser'
+    },
+    {
+        title: '操作',
+        dataIndex: 'action',
+        scopedSlots: { customRender: 'action' },
+        align: 'center',
+        key: 'action'
+    }
+]
+
+let KScolumns = [
+    {
+        title: '模板id',
+        dataIndex: 'id',
+        scopedSlots: { customRender: 'id' },
+        align: 'center',
+        key: 'id'
+    },
+    {
+        title: '模板名称',
+        dataIndex: 'templateName',
+        scopedSlots: { customRender: 'templateName' },
+        align: 'center',
+        key: 'templateName'
+    },
+
+    {
+        title: '应用媒体',
+        dataIndex: 'appliedMedia',
+        scopedSlots: { customRender: 'appliedMedia' },
+        align: 'center',
+        key: 'appliedMedia'
+    },
+    {
+        title: '账户名称',
+        dataIndex: 'accountName',
+        scopedSlots: { customRender: 'accountName' },
+        align: 'center',
+        key: 'accountName'
+    },
+    {
+        title: '账户ID',
+        dataIndex: 'accountId',
+        scopedSlots: { customRender: 'accountId' },
+        align: 'center',
+        key: 'accountId'
+    },
+    {
+        title: '账户状态',
+        dataIndex: 'accountStatus',
+        customRender(t) {
+            if (t == 0) {
+                return '启用'
+            } else {
+                return '停用'
+            }
+        },
+        align: 'center',
+        key: 'accountStatus'
+    },
+    {
+        title: '运营名称',
+        dataIndex: 'userName',
+        scopedSlots: { customRender: 'userName' },
+        align: 'center',
+        key: 'userName'
+    },
+    {
+        title: '操作',
+        dataIndex: 'actionTwo',
+        scopedSlots: { customRender: 'actionTwo' },
+        align: 'center',
+        key: 'actionTwo'
+    }
+]
+
+export default {
+    components: {
+        ACol,
+        ARow,
+        selectTable,
+        Treeselect
+    },
+
+    data() {
+        return {
+            indexAll: 0,
+            accountIdPush: '',
+            spinning: false,
+            form: this.$form.createForm(this),
+            priceForm: this.$form.createForm(this),
+            exportloading: false,
+            accountId: null,
+            noImg: require('@/assets/noImg.png'),
+            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
+                }
+            },
+            ipaginationHistory: {
+                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.ipaginationHistory.current = current
+                    this.ipaginationHistory.pageSize = pageSize
+                    this.getHistroy({ userId: this.userName, id: this.accountIdSearch })
+                }
+            },
+            historyColumns: [
+                {
+                    title: '账户id',
+                    dataIndex: 'accountId',
+                    scopedSlots: { customRender: 'accountId' },
+                    align: 'center',
+                    key: 'accountId'
+                },
+                {
+                    title: '运营名称',
+                    dataIndex: 'userName',
+                    scopedSlots: { customRender: 'userName' },
+                    align: 'center',
+                    key: 'userName'
+                },
+                {
+                    title: '操作类型',
+                    dataIndex: 'operationType',
+                    customRender(t) {
+                        if (t == '3') {
+                            return '删除'
+                        } else if (t == '2'){
+                            return '暂停'
+                        }
+                    },
+                    align: 'center',
+                    key: 'operationType'
+                },
+
+                {
+                    title: '操作时间',
+                    dataIndex: 'createTime',
+                    scopedSlots: { customRender: 'createTime' },
+                    align: 'center',
+                    key: 'createTime'
+                },
+                {
+                    title: '执行信息',
+                    dataIndex: 'executiveInformation',
+                    scopedSlots: { customRender: 'executiveInformation' },
+                    align: 'center',
+                    key: 'executiveInformation'
+                }
+            ],
+            value: 'valid',
+
+            operateDisabled: false,
+            duration: 1000,
+            //treeselect的参数
+            treeValue: [],
+            treeData: [],
+
+            type: 3,
+
+            operate: '',
+
+            tabKey: 1,
+
+            loading: false,
+            TTcolumns,
+            KScolumns,
+            columns: [...TTcolumns],
+            dataSource: [],
+
+            tableTab: 1,
+
+            newPlan: 0,
+            effectPlan: 0,
+
+            openOptions: false,
+
+            dataLoading: false,
+            url: '/accountClean/getTemplateList',
+            modifyPriceVisible: false,
+            modifyPriceLoading: false,
+            modifyPriceDetail: null,
+            accountVisible: false,
+            againLoading: false,
+            accountProjectDetail: null,
+            userName: null,
+            accountIdSearch: null,
+            historyList: [],
+            unitVisible: false
+        }
+    },
+    methods: {
+        moment,
+        ...mapGetters(['userInfo']),
+        getHistroy(item) {
+            this.unitVisible = true
+            this.userName = item.userId
+            this.accountIdSearch = item.id
+            let params = {}
+            params.userId = this.userInfo().id
+            params.templateId = item.id
+            params.pageNum = this.ipaginationHistory.current
+            params.pageSize = this.ipaginationHistory.pageSize
+
+            this.getAction('/accountClean/getCleanUpLog', params).then(res => {
+                if (res.success) {
+                    this.historyList = res.result.list
+                    this.ipaginationHistory.total = res.result.total
+                }
+            })
+        },
+        removeTemplate(item) {
+            let that = this
+            this.$confirm({
+                title: '删除提示',
+                content: '当前删除会解除此账户绑定模板,确定删除吗?',
+                onOk() {
+                    getAction('/accountClean/removeBinding', { templateId: item.id, accountId: item.accountId })
+                        .then(result => {
+                            if (result.success) {
+                                const paramsData = that.form.getFieldsValue()
+                                that.handleGetTableList(paramsData)
+
+                                that.$message.success('删除成功')
+                            } else {
+                                that.$message.error(result.message)
+                            }
+                        })
+                        .catch(error => {
+                            console.log(error, 'eeee')
+                        })
+                }
+            })
+        },
+        newCreat(id, type) {
+            if (id) {
+                if (type == 'edit') {
+                    this.$router.push({
+                        path: '/earlyWarningRules/createClear?id=' + id
+                    })
+                } else {
+                    this.$router.push({
+                        path: '/earlyWarningRules/createClear?preview=true&&id=' + id
+                    })
+                }
+            } else {
+                // window.open('/creat-material-test', '_blank')
+                this.$router.push({
+                    path: '/earlyWarningRules/createClear'
+                })
+            }
+        },
+        editPrice(item) {
+            getAction('/kuaishouProjectStrategy/queryBidInfo', { id: item.id }).then(res => {
+                if (res.success) {
+                    this.modifyPriceVisible = true
+                    this.modifyPriceDetail = { ...res.result, projectName: item.projectName, id: item.id }
+                    console.log(this.modifyPriceDetail)
+                    this.$nextTick(() => {
+                        let cpaBid = ''
+                        let changeBid = res.result.bidType === 2 ? res.result.bid : res.result.cpaBid
+                        if ((changeBid + '').includes('/')) {
+                            let bidArr = changeBid.split('/')
+                            for (let index = 0; index < bidArr.length; index++) {
+                                bidArr[index] = bidArr[index] / 1000
+                            }
+                            cpaBid = bidArr.join('/')
+                        } else if ((changeBid + '').includes('-')) {
+                            let bidArr = changeBid.split('-')
+                            for (let index = 0; index < bidArr.length; index++) {
+                                bidArr[index] = bidArr[index] / 1000
+                            }
+                            cpaBid = bidArr.join('-')
+                        } else {
+                            cpaBid = changeBid / 1000
+                        }
+
+                        let deepConversionBid = undefined
+                        if (res.result.deepConversionBid && res.result.deepConversionBid != '') {
+                            if ((res.result.deepConversionBid + '').includes('/')) {
+                                let bidArr = res.result.deepConversionBid.split('/')
+                                for (let index = 0; index < bidArr.length; index++) {
+                                    bidArr[index] = bidArr[index] / 1000
+                                }
+                                deepConversionBid = bidArr.join('/')
+                            } else if ((res.result.deepConversionBid + '').includes('-')) {
+                                let bidArr = res.result.deepConversionBid.split('-')
+                                for (let index = 0; index < bidArr.length; index++) {
+                                    bidArr[index] = bidArr[index] / 1000
+                                }
+                                deepConversionBid = bidArr.join('-')
+                            } else {
+                                deepConversionBid = res.result.deepConversionBid / 1000
+                            }
+                        }
+
+                        this.priceForm.setFieldsValue({
+                            cpaBid: cpaBid,
+                            deepConversionBid: deepConversionBid
+                        })
+                    })
+                }
+            })
+        },
+        handleOkPrice() {
+            this.modifyPriceLoading = true
+            let params = {}
+            params.templateId = this.accountProjectDetail.id
+            params.accountId = this.accountIdPush
+            this.getAction('/accountClean/pushTemplate', params).then(res => {
+                this.modifyPriceLoading = false
+                if (res.success) {
+                    this.accountVisible = false
+                    this.accountIdPush = ''
+
+                    if (res.message != '推送成功') {
+                        this.$message.error(res.message)
+                    } else {
+                        this.$message.success(res.message)
+                    }
+                } else {
+                }
+            })
+        },
+        cpaBidValid(rule, value, callback) {
+            let z = /-/g
+            let a = /\//g
+            let d = /\./g
+            if (value === '' || value === undefined) {
+                callback('出价必须填写')
+            } else if (value.startsWith('.') || value.endsWith('.')) {
+                callback('请填写正确出价')
+            } else if (value.startsWith('-') || value.endsWith('-')) {
+                callback('请填写正确出价')
+            } else if (value.match(a) && value.match(z)) {
+                callback('不允许出现除"-"和"/"之外的所有字符,并且二者不可同时出现')
+            } else if (value.match(/[^0-9+-\/]/g)) {
+                callback('请填写正确出价')
+            } else {
+                callback()
+            }
+        },
+        btKeyUp(e) {
+            //没有显示‘破折号’和 '.' 需要的可以手动加上
+            // this.priceForm.setFieldsValue({
+            //     cpaBid: e.target.value.replace(/[^0-9+-\/]/g, '')
+            // })
+            // (
+            //         /[\u4e00-\u9fa5/\s+/]|[`~!@#$%^&*() \+ =<>?"{}|, \/ ;' \\ [ \] ·~!@#¥%……&*()—— \+ ={}|《》?:“”【】、;‘’,。、]/g,
+            //         ''
+            //     )
+        },
+        getData(className) {
+            return this.priceForm.getFieldValue(className)
+        },
+        matchingAccount(item) {
+            this.accountVisible = true
+            this.accountProjectDetail = { id: item.id }
+        },
+        getDataSource(current, pageSize) {
+            // 切换分页时的回调,
+            // 当在页面定义change事件时,切记要把此处的事件清除,因为这两个事件重叠了,可能到时候会导致一些莫名的bug
+            this.ipagination.current = current
+            this.ipagination.pageSize = pageSize
+            const paramsData = this.form.getFieldsValue()
+            this.handleGetTableList(paramsData)
+        },
+        onChangeStatus(text, record, type) {
+            let status = text === '0' ? '1' : '0'
+            let url = '/accountClean/updateTemplateStatus'
+            let params = {}
+            params.templateId = record.id
+            params.status = status
+            this.getAction(url, params).then(res => {
+                if (res.success) {
+                    const paramsData = this.form.getFieldsValue()
+                    this.handleGetTableList(paramsData)
+                } else {
+                    this.$message.error(res.message)
+                }
+            })
+        },
+        handleQueryList(event) {
+            this.ipagination.current = 1
+            event.preventDefault()
+            const paramsData = this.form.getFieldsValue()
+            this.handleGetTableList(paramsData)
+        },
+        handleResetForm() {
+            this.ipagination.current = 1
+            this.form.resetFields()
+            this.accountId = ''
+            const paramsData = this.form.getFieldsValue()
+            this.handleGetTableList(paramsData)
+        },
+        handleGetTableList(data) {
+            let paramsData = {
+                ...data,
+                pageNum: this.ipagination.current,
+                pageSize: this.ipagination.pageSize,
+                userId: this.userInfo().id,
+                accountId: this.accountId
+            }
+            this.dataSource = []
+            this.dataLoading = true
+            getAction(this.url, paramsData)
+                .then(result => {
+                    this.dataLoading = false
+                    if (result.code === 200) {
+                        this.dataSource = result.result.list || []
+
+                        this.ipagination.total = result.result.total || 0
+                    } else {
+                        this.$message.error(result.message)
+                    }
+                })
+                .catch(error => {
+                    this.dataLoading = false
+                    console.log(error, 'eeee')
+                })
+        },
+        disabledDate(current) {
+            // Can not select days before today and today
+            return current && current > moment().endOf('day')
+        },
+
+        filterOption(input, option) {
+            // console.log(input, option)
+            return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
+        },
+
+        // 快手头条的切换
+        tabChange(key) {
+            this.ipagination.current = 1
+            this.columns = this.tabKey == 1 ? [...TTcolumns] : [...KScolumns]
+            this.url = this.tabKey == 1 ? '/accountClean/getTemplateList' : '/accountClean/getMyselfTemplateList'
+            this.target = this.tabKey == 1 ? 'createTime' : 'statDate'
+            this.accountId = ''
+            const paramsData = this.form.getFieldsValue()
+            this.handleGetTableList(paramsData)
+        },
+
+        tableChange(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
+                const paramsData = this.form.getFieldsValue()
+                this.handleGetTableList({
+                    ...paramsData,
+                    target: sorter.columnKey,
+                    order: sorter.order ? sorter.order : 'descend'
+                })
+            }
+        }
+    },
+    watch: {},
+    computed: {
+        newDate() {
+            var myDate = new Date()
+            myDate.getYear() //获取当前年份(2位)
+            var n = myDate.getFullYear() //获取完整的年份(4位,1970-????)
+            var m = myDate.getMonth() //获取当前月份(0-11,0代表1月)
+            var d = myDate.getDate() //获取当前日(1-31)
+            var day = myDate.getHours()
+            return day
+        }
+    },
+    mounted() {
+        const paramsData = this.form.getFieldsValue()
+        this.handleGetTableList(paramsData)
+    },
+    activated: function() {},
+
+    filters: {
+        toPercentage(val) {
+            if (typeof val != 'string') {
+                return (val * 100).toFixed(2) + '%'
+            } else {
+                return val
+            }
+        },
+        //保留两位小数并且变成货币格式
+        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) {
+                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 {
+                return '-'
+            }
+        }
+    }
+}
+</script>

+ 1 - 0
src/views/modules/kuaishouapp/account/copyAllUnit.vue

@@ -213,6 +213,7 @@
             <a-select-option :value="190" v-if="allForm.groupTypeData.isPurchase == '1'">付费出价</a-select-option>
             <a-select-option :value="191" v-if="allForm.groupTypeData.isFirstdayRoi == '1'">首日ROI</a-select-option>
             <a-select-option :value="396" v-if="allForm.groupTypeData.isRegister == '1'">注册优化目标</a-select-option>
+            <a-select-option :value="773" v-if="groupTypeData.isKeyAction == '1'">关键行为</a-select-option>
           </a-select>
         </a-form-item>
         <a-form-item

+ 3 - 0
src/views/modules/kuaishouapp/account/editGroup.vue

@@ -262,6 +262,9 @@
                           <a-select-option :value="396" v-if="
                              allForm.groupTypeData.isRegister == '1'
                           ">注册优化目标</a-select-option>
+                           <a-select-option :value="773" v-if="
+                              allForm.groupTypeData.isKeyAction == '1'
+                          ">关键行为</a-select-option>
                       </a-select>
 
                     </a-form-item>

+ 4 - 0
src/views/modules/kuaishouapp/account/editGroupNew.vue

@@ -265,6 +265,10 @@
                           <a-select-option :value="396" v-if="
                              allForm.groupTypeData.isRegister == '1'
                           ">注册优化目标</a-select-option>
+                          <a-select-option :value="773" v-if="
+                                    allForm.groupTypeData.isKeyAction == '1'
+                                ">关键行为</a-select-option>
+                          
                       </a-select>
 
                     </a-form-item>

+ 3 - 0
src/views/modules/kuaishouapp/account/stepForm/Step2.vue

@@ -315,6 +315,9 @@
                           <a-select-option :value="396" v-if="
                              allForm.groupTypeData.isRegister == '1'
                           ">注册优化目标</a-select-option>
+                          <a-select-option :value="773" v-if="
+                                    allForm.groupTypeData.isKeyAction == '1'
+                                ">关键行为</a-select-option>
                       </a-select>
 
                     </a-form-item>

+ 2 - 2
src/views/modules/kuaishouapp/account/stepForm/Step3.vue

@@ -916,7 +916,7 @@ import { getAction, postAction, deleteAction } from '@/api/manage'
 import { mapGetters } from 'vuex'
 import UploadToAli from '@femessage/upload-to-ali'
 import moment from 'moment'
-import VuePreview from 'vue-preview'
+// import VuePreview from 'vue-preview'
 import jq from 'jquery'
 import { stopOtherVideo, closeAllVideoFun } from '@/utils/videoControl' // 停止除当前外的其他视频播放,及停止所有视频播放的方法
 import checkMatemal from './stepModule/checkMatemal'
@@ -929,7 +929,7 @@ export default {
   name: 'BaseForm',
   components: {
     UploadToAli,
-    VuePreview,
+    // VuePreview,
     checkMatemal,
     uploadFile,
   },

+ 2 - 2
src/views/modules/kuaishouapp/account/stepForm/Step4.vue

@@ -846,7 +846,7 @@ import { getAction, postAction, deleteAction } from '@/api/manage'
 import { mapGetters } from 'vuex'
 import UploadToAli from '@femessage/upload-to-ali'
 import moment from 'moment'
-import VuePreview from 'vue-preview'
+// import VuePreview from 'vue-preview'
 import jq from 'jquery'
 import { stopOtherVideo, closeAllVideoFun } from '@/utils/videoControl' // 停止除当前外的其他视频播放,及停止所有视频播放的方法
 import checkMatemal from './stepModule/checkMatemal'
@@ -875,7 +875,7 @@ export default {
   name: 'BaseForm',
   components: {
     UploadToAli,
-    VuePreview,
+    // VuePreview,
     checkMatemal,
     uploadFile,
   },

+ 3 - 0
src/views/modules/kuaishouapp/account/stepForm/stepModule/newModulePop.vue

@@ -250,6 +250,9 @@ li:hover {
         <a-radio :value="5">5x+</a-radio>
         <a-radio :value="6">6x+</a-radio>
         <a-radio :value="7">7x+</a-radio>
+        <a-radio :value="8">8x+</a-radio>
+        <a-radio :value="9">9x+</a-radio>
+        <a-radio :value="10">10x+</a-radio>
       </a-radio-group>
     </a-form-item>
     <a-form-item

+ 3 - 0
src/views/modules/kuaishouapp/account/stepForm/stepModule/targetedPopulation.vue

@@ -249,6 +249,9 @@ li:hover {
         <a-radio :value="5">5x+</a-radio>
         <a-radio :value="6">6x+</a-radio>
         <a-radio :value="7">7x+</a-radio>
+        <a-radio :value="8">8x+</a-radio>
+        <a-radio :value="9">9x+</a-radio>
+        <a-radio :value="10">10x+</a-radio>
       </a-radio-group>
     </a-form-item>
     <a-form-item

+ 0 - 1
src/views/modules/kuaishouapp/account/stepForm/stepModule/test.vue

@@ -186,7 +186,6 @@ export default {
           return 0
         }
       })
-      console.log(this.dataString.join(''))
       this.$emit('update:scheduleTime', this.dataString.join(''))
       this.selectFlag = false
       this.max = {

+ 17 - 1
src/views/modules/kuaishouapp/batchCreation/creat/creatUnit.vue

@@ -417,6 +417,7 @@
             <a-select-option :value="190" v-if="allForm.groupTypeData.isPurchase == '1'">付费出价</a-select-option>
             <a-select-option :value="191" v-if="allForm.groupTypeData.isFirstdayRoi == '1'">首日ROI</a-select-option>
             <a-select-option :value="396" v-if="allForm.groupTypeData.isRegister == '1'">注册优化目标</a-select-option>
+            <a-select-option :value="773" v-if="allForm.groupTypeData.isKeyAction == '1'">关键行为</a-select-option>
           </a-select>
         </a-form-item>
         <a-form-item
@@ -685,6 +686,21 @@
           itemTag.name
         }}</a-tag> -->
       </a-form-item>
+      <a-form-item label="下载详情" v-if="showSite" :labelCol="{ lg: { span: 7 }, sm: { span: 7 } }"
+        :wrapperCol="{ lg: { span: 10 }, sm: { span: 17 } }">
+            <a-select
+              v-decorator="['siteId']"
+              showSearch
+              allowClear
+              placeholder="选择应用下载详情页"
+              optionFilterProp="children"
+              :filterOption="filterOption"
+            >
+              <a-select-option v-for="appModel in siteList" :key="appModel.siteId" :value="appModel.siteId">
+                {{ appModel.name }}
+              </a-select-option>
+            </a-select>
+      </a-form-item>
       <a-form-item
         label="创意分类"
         :labelCol="{ lg: { span: 7 }, sm: { span: 7 } }"
@@ -2445,7 +2461,7 @@ export default {
         viewComp: 7,
       }).then((res) => {
         if (res.success) {
-          this.siteLiRst = res.result
+          this.siteList = res.result
           if (this.siteList.length > 0) {
             this.showSite = true
           }

+ 2 - 2
src/views/modules/kuaishouapp/creativeCreate.vue

@@ -522,7 +522,7 @@ import { getAction, postAction } from '@/api/manage'
 import { mapGetters } from 'vuex'
 import UploadToAli from '@femessage/upload-to-ali'
 import moment from 'moment'
-import VuePreview from 'vue-preview'
+// import VuePreview from 'vue-preview'
 import jq from 'jquery'
 import { stopOtherVideo, closeAllVideoFun } from '@/utils/videoControl' // 停止除当前外的其他视频播放,及停止所有视频播放的方法
 import { fileCheck, fileInsert } from '@/api/actor'
@@ -531,7 +531,7 @@ export default {
   name: 'BaseForm',
   components: {
     UploadToAli,
-    VuePreview
+    // VuePreview
   },
   data() {
     return {

+ 9 - 0
src/views/modules/kuaishouapp/crossAccount/createUnit.vue

@@ -343,6 +343,9 @@
                         <a-select-option :value="396" v-if="groupTypeData.isRegister == '1'"
                           >注册优化目标</a-select-option
                         >
+                        <a-select-option :value="773" v-if="
+                                    groupTypeData.isKeyAction == '1'
+                                ">关键行为</a-select-option>
                       </a-select>
                     </a-form-model-item>
                     <a-form-model-item
@@ -704,6 +707,9 @@
                       <a-select-option :value="396" v-if="groupTypeData.isRegister == '1'"
                         >注册优化目标</a-select-option
                       >
+                      <a-select-option :value="773" v-if="
+                                    groupTypeData.isKeyAction == '1'
+                                ">关键行为</a-select-option>
                     </a-select>
                   </a-form-model-item>
                   <a-form-model-item
@@ -1042,6 +1048,9 @@
                   <a-select-option :value="190" v-if="groupTypeData.isPurchase == '1'">付费出价</a-select-option>
                   <a-select-option :value="191" v-if="groupTypeData.isFirstdayRoi == '1'">首日ROI</a-select-option>
                   <a-select-option :value="396" v-if="groupTypeData.isRegister == '1'">注册优化目标</a-select-option>
+                  <a-select-option :value="773" v-if="
+                                    groupTypeData.isKeyAction == '1'
+                                ">关键行为</a-select-option>
                 </a-select>
               </a-form-model-item>
               <a-form-model-item

+ 3 - 0
src/views/modules/kuaishouapp/groupCreate.vue

@@ -114,6 +114,9 @@
           <a-radio value='5'>5.x+</a-radio>
           <a-radio value='6'>6.x+</a-radio>
           <a-radio value='7'>7.x+</a-radio>
+          <a-radio value="8">8x+</a-radio>
+          <a-radio value="9">9x+</a-radio>
+          <a-radio value="10">10x+</a-radio>
         </a-radio-group>
       </a-form-item>
 

+ 3 - 0
src/views/modules/kuaishouapp/newBatch/index.vue

@@ -963,6 +963,9 @@ li.chouzhen.first:before {
                 <a-select-option :value="190" v-if="groupTypeData.isPurchase == '1'">付费出价</a-select-option>
                 <a-select-option :value="191" v-if="groupTypeData.isFirstdayRoi == '1'">首日ROI</a-select-option>
                 <a-select-option :value="396" v-if="groupTypeData.isRegister == '1'">注册优化目标</a-select-option>
+                <a-select-option :value="773" v-if="
+                                    groupTypeData.isKeyAction == '1'
+                                ">关键行为</a-select-option>
               </a-select>
             </a-form-model-item>
           </a-col>

+ 3 - 5
src/views/modules/material/accountCheck.vue

@@ -67,17 +67,15 @@ export default {
       this.autoExpandParent = false
     },
     onCheck(checkedKeys) {
-      console.log('onCheck', checkedKeys)
       this.checkedKeys = checkedKeys
     },
     onSelect(selectedKeys, info) {
-      console.log('onSelect', info)
       this.selectedKeys = selectedKeys
     },
     handleOk(e) {
-      console.log(e)
+	  let defaultData = this.checkedKeys.filter(item => item.toString().indexOf('-') === -1);
       this.showEdit = false
-      this.$emit('synchro', this.checkedKeys)
+      this.$emit('synchro', defaultData)
     },
     close() {
       this.showEdit = false
@@ -117,7 +115,7 @@ export default {
           this.treeData = res.result.map(item=>{
             return {
               title: item.projectName,
-              key: item.projectId,
+              key: item.projectId + '-',
               children:item.userAllocationList.map(i=>{
                   return {
                     title: i.authName+'\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0'+(i.userName?i.userName:'管理员'), 

+ 7 - 7
src/views/modules/material/materialList.vue

@@ -1010,13 +1010,13 @@ export default {
       })
     },
     getParticipateList() {
-      getAction('/ctop/projectMember/participateList', {
-        userId: this.userInfo().id
-      }).then(res => {
-        if (res.code == 0) {
-          this.dataElse = res.result
-        }
-      })
+      // getAction('/ctop/projectMember/participateList', {
+      //   userId: this.userInfo().id
+      // }).then(res => {
+      //   if (res.code == 0) {
+      //     this.dataElse = res.result
+      //   }
+      // })
     },
     getProjectId(items) {
       getAction('/ctop/projectMember/getMemberList', {

Fichier diff supprimé car celui-ci est trop grand
+ 895 - 5
src/views/modules/material/videoMaterial.vue


+ 9 - 12
src/views/modules/onlineTraining/onlineTrainingList.vue

@@ -178,20 +178,17 @@
 <script>
 import { getAction, postAction } from '@/api/manage'
 import { JeecgListMixin } from '@/mixins/JeecgListMixin'
-import moment from 'moment'
-import $ from 'jquery'
-import qs from 'qs'
 import UploadToAli from '@femessage/upload-to-ali'
 import uploadFile from '@/components/uploadFile.vue'
 import { mapActions, mapGetters, mapState } from 'vuex'
 // document.write(textDes('https://ctop-media.oss-cn-beijing.aliyuncs.com/video/2020-03-20/20网服-1584693978588.mp4'))
 // document.write('<br>' + desDecrypt('s4HMPbmUfZ0=', 'ckplayerDesKey'))
-function textDes(str) {
-  var keyCode = 'ckplayerDesKey'
-  var newText = encodeURI(desEncrypt(str, keyCode))
-  newText = (keyCode == 'ckplayerDesKey' ? 'CK:' : 'CE:') + newText
-  return newText
-}
+// function textDes(str) {
+//   var keyCode = 'ckplayerDesKey'
+//   var newText = encodeURI(desEncrypt(str, keyCode))
+//   newText = (keyCode == 'ckplayerDesKey' ? 'CK:' : 'CE:') + newText
+//   return newText
+// }
 
 function desEncrypt(word, keyCode) {
   var key = CryptoJS.enc.Utf8.parse(keyCode)
@@ -311,7 +308,7 @@ export default {
         debug: true,
         loadNext: 10,
         usehardwareeecoder: true, //硬件加速
-        video: textDes(), //视频地址(必填)
+        video: "", //视频地址(必填)
       },
       videoObjectNot: {
         container: '#videoPlay', //“#”代表容器的ID,“.”或“”代表容器的class
@@ -662,7 +659,7 @@ export default {
                 }
                 console.log(this.videoObject.video)
 
-                let player = new ckplayer(this.videoObject)
+                // let player = new ckplayer(this.videoObject)
                 console.log(player)
               } else {
                 this.startList = true
@@ -796,7 +793,7 @@ export default {
     this.$nextTick(() => {
       this.videoObject.video = ' CK:2OoC8kA6lhNFqCi2uVquDPpnuq9VcRji9nGXe5nqadA6Jey7YFFEP8pE99j58UBbLyb7YN7cpkw='
 
-      let player = new ckplayer(this.videoObject)
+      // let player = new ckplayer(this.videoObject)
 
       getAction('/sys/user/getRoleInfo', {
         userId: this.userInfo().id,

+ 6 - 6
src/views/modules/policy-management/policy-management-server.js

@@ -1,11 +1,11 @@
 /**
- * @file 账户配置API
+ * @file 政策管理模块配置API
  * @author jiayufei
  */
 
-//  export const urlAcount = 'http://118.24.244.213:8808'; // 线上
- // export const urlAcount = 'http://apipre.tjyourong.com.cn'; // 预生产
- // export const urlAcount = 'http://192.168.1.43:8808'; // 子安
- // export const urlAcount = 'http://139.186.165.84:8808'; // 测试
- export const urlAcount = 'http://192.168.1.8:9999'; // 学超
+//  export const urlAcount = 'http://api.tjyourong.com.cn'; // 线上
+//  export const urlAcount = 'http://gateway.tjyourong.com.cn'; // 测试
+//  export const urlAcount = 'http://192.168.1.43:9999'; // 子安
+ export const urlAcount = 'http://gateway.tjyourong.com.cn'; // 测试
+//  export const urlAcount = 'http://192.168.1.8:9999'; // 学超
  

+ 104 - 1
src/views/modules/policy-management/policy-management.less

@@ -3,60 +3,138 @@
     height: calc(100vh - 137px);
     padding: 20px;
     overflow-y: auto;
+
     .control-con-title {
         height: 50px;
         display: flex;
         justify-content: space-between;
         align-items: center;
+
         .add-acount-policy-btn {
             margin-left: 15px;
         }
+
         .policy-export-btn {
             font-size: 18px;
             font-weight: bold;
         }
+
     }
     .control-con-header {
         margin-bottom: 20px;
         position: relative;
+
         .grid-form-options {
             margin-bottom: 10px;
         }
+
         .acount-search-class {
             width: 450px;
         }
+
         .reset-class {
             margin-right: 10px !important;
         }
+
         .upload-person {
             position: absolute;
             right: 10px;
             top: 0;
         }
+
     }
+
+    // .control-con-table {
+    //     /* 设置滚动条的样式 */
+    //     ::-webkit-scrollbar {
+    //         width:12px;
+    //         background: #fff !important;
+    //     }
+    //     /* 滚动槽 */
+    //     ::-webkit-scrollbar-track {
+    //         background: #fff !important;
+    //     }
+    //     /* 滚动条滑块 */
+    //     ::-webkit-scrollbar-thumb {
+    //         border-radius:10px;
+    //         background:#000;
+    //     }
+    //     ::-webkit-scrollbar-thumb:window-inactive {
+    //         background:#ccc;
+    //     }
+    //     ::-webkit-scrollbar-button:hover {  
+    //         /*当鼠标在水平滚动条下面的按钮上的状态*/ 
+    //         background:#f00 
+    //     }  
+    // }
+
     .pagin-table-class {
         display: flex;
         justify-content: flex-end;
         margin-top: 20px;
     }
+
 }
 /deep/ .rejection-reason-class {
     width: 600px !important;
+
+    .audit-policy-icon {
+        position: absolute;
+        right: 22px;
+        top: 20px;
+        font-size: 15px;
+        cursor: pointer;
+    }
+
+    .audit-policy-footer {
+        display: flex;
+        justify-content: space-between;
+        align-items: center;
+        border-top: 1px solid #e8e8e8;
+
+        .cancel-btn {
+            margin-right: 12px;
+            margin-top: 12px;
+        }
+
+    }
+
     .reason-class-header {
         margin-bottom: 18px;
         font-size: 16px;
         font-weight: bold;
     }
+
+    .reason-class-content {
+        height: 100px;
+    }
+
     .rejection-textarea-msg {
         height: 150px;
     }
+
 }
 /deep/ .audit-policy-class {
     width: 930px !important;
+
+    .audit-policy-footer {
+        display: flex;
+        justify-content: space-between;
+        align-items: center;
+        border-top: 1px solid #e8e8e8;
+
+        .cancel-btn {
+            margin-right: 12px;
+            margin-top: 12px;
+        }
+
+    }
+
     .ant-modal-body {
-        height: 420px;
+        height: 440px;
         overflow-y: auto;
     }
+
     .audit-policy-icon {
         position: absolute;
         right: 22px;
@@ -64,20 +142,27 @@
         font-size: 15px;
         cursor: pointer;
     }
+
     .policy-line-quen {
         display: flex;
+        height: 345px;
+        overflow-y: auto;
+
         .line-quen-left,
         .line-quen-right {
             flex: 1;
+
             .policy-line-left,
             .policy-line-right {
                 display: flex;
                 margin-bottom: 16px;
+
                 .line-left-spn {
                     display: inline-block;
                     width: 120px;
                     text-align: right;
                 }
+
                 .line-right-spn {
                     display: inline-block;
                     width: 220px;
@@ -85,8 +170,11 @@
                     white-space: nowrap;
                     text-overflow: ellipsis;
                 }
+
             }
+
         }
+
     }
 }
 /deep/ .policy-operation-class {
@@ -97,6 +185,21 @@
     }
     .policy-operation-form {
         display: flex;
+        .group-abbreviation-class {
+            display: flex;
+            .settlement-header-icon {
+                margin-left: 47px;
+                margin-top: 12px;
+            }
+        }
+        .promotion-type-class {
+            position: relative;
+            .settlement-header-icon {
+                position: absolute;
+                left: -90px;
+                top: 3px;
+            }
+        }
         .policy-operation-form-left,
         .policy-operation-form-right {
             flex: 1;

+ 216 - 98
src/views/modules/policy-management/policy-management.vue

@@ -1,10 +1,13 @@
 <template>
     <div class="policy-management-content">
         <div class="control-con-title">
-            <div><span class="policy-export-btn">销售政策列表</span></div>
             <div>
-                <!-- <span><a-button type="default" @click="handlePolicyExport">政策导出</a-button></span> -->
-                <span class="add-acount-policy-btn"><a-button type="primary" @click="handleAddAccountPolicy">创建账户政策</a-button></span>
+                <span class="policy-export-btn">销售政策列表</span>
+            </div>
+            <div>
+                <span v-if="userInfo().roleName !== '财务'" class="add-acount-policy-btn">
+                    <a-button type="primary" @click="handleAddAccountPolicy">新增政策</a-button>
+                </span>
             </div>
         </div>
         <div class="control-con-header">
@@ -20,24 +23,28 @@
                         label="公司名称:"
                         :colon="false"
                     >
-                        <a-input v-model="configForm.companyName" placeholder="请输入公司名称"/>
+                        <a-input v-model="configForm.companyName" placeholder="请输入公司名称" allow-clear/>
                     </a-form-item>
                     <a-form-item
                         class="grid-form-item"
                         label="广告主名称:"
                         :colon="false"
                     >
-                        <a-input v-model="configForm.adverName" placeholder="请输入广告主名称"/>
+                        <a-input v-model="configForm.adverName" placeholder="请输入广告主名称" allow-clear/>
                     </a-form-item>
                     <a-form-item
                         class="grid-form-item"
                         label="产品名称:"
                         :colon="false"
                     >
-                        <a-input v-model="configForm.productName" placeholder="请输入产品名称"/>
+                        <a-input v-model="configForm.productName" placeholder="请输入产品名称" allow-clear/>
                     </a-form-item>
                     <a-form-item label="媒体:">
-                        <a-select v-model="configForm.creativeMedia" style="width: 100px">
+                        <a-select
+                            v-model="configForm.creativeMedia"
+                            style="width: 100px"
+                            allow-clear
+                        >
                             <a-select-option
                                 v-for="item in creativeMediaOptions"
                                 :key="item.id"
@@ -48,7 +55,11 @@
                         </a-select>
                     </a-form-item>
                     <a-form-item label="返点类型:">
-                        <a-select v-model="configForm.creativeRebate" style="width: 140px">
+                        <a-select
+                            v-model="configForm.creativeRebate"
+                            style="width: 140px"
+                            allow-clear
+                        >
                             <a-select-option
                                 v-for="item in creativeRebateOptions"
                                 :key="item.id"
@@ -73,35 +84,41 @@
                             style="width: 100px"
                             :filter-option="handleFilterOption"
                             show-search
+                            allow-clear
                         >
                             <a-select-option
                                 v-for="item in allSaleListOption"
                                 :key="item.userId"
-                                :value="item.userId"
+                                :value="item.userName"
                             >
                                 {{ item.userName }}
                             </a-select-option>
                         </a-select>
                     </a-form-item>
                     <a-form-item label="运营方式:">
-                        <a-select v-model="configForm.creativeOperate" style="width: 100px">
+                        <a-select
+                            v-model="configForm.creativeOperate"
+                            style="width: 100px"
+                            allow-clear
+                        >
                             <a-select-option value="no">不限</a-select-option>
                             <a-select-option :value="0">自运营</a-select-option>
                             <a-select-option :value="1">代运营</a-select-option>
                         </a-select>
                     </a-form-item>
-                    <a-form-item
-                        class="grid-form-item"
-                        label="时间:"
-                        :colon="false"
-                    >
+                    <a-form-item class="grid-form-item" label="时间:" :colon="false">
                         <a-range-picker
                             v-model="configForm.time"
                             format="YYYY-MM-DD"
+                            @change="handleLaunchData"
                         />
                     </a-form-item>
                     <a-form-item label="状态:">
-                        <a-select v-model="configForm.searchStatus" style="width: 100px">
+                        <a-select
+                            v-model="configForm.searchStatus"
+                            style="width: 100px"
+                            allow-clear
+                        >
                             <a-select-option
                                 v-for="item in searchStatusOptions"
                                 :key="item.id"
@@ -130,43 +147,55 @@
                 :scroll="{x: 3000}"
             >
                 <span slot="advertiserName" slot-scope="text">
-                    <a>{{ text }}</a>
+                    <span>{{ text }}</span>
                 </span>
                 <span slot="updatePolicyProductName" slot-scope="text">
                     <a-tooltip placement="top">
                         <template slot="title">
                             <span>{{ text }}</span>
                         </template>
-                        <a>{{ text }}</a>
+                        <span>{{ text }}</span>
                     </a-tooltip>
                 </span>
                 <span slot="promotionType" slot-scope="text">
-                    <a>{{ text === 0 ? '自运营' : '代运营' }}</a>
+                    <span>{{ text === 0 ? '自运营' : '代运营' }}</span>
                 </span>
                 <span slot="advancePay" slot-scope="text">
-                    <a>{{ text === 0 ? '否' : '是' }}</a>
+                    <span>{{ text === 0 ? '否' : '是' }}</span>
                 </span>
                 <span slot="isDianPay" slot-scope="text">
-                    <a>{{ text === 0 ? '否' : '是' }}</a>
+                    <span>{{ calculationScope(text) }}</span>
                 </span>
                 <span slot="updateApprovedStatus" slot-scope="text">
                     <a>{{ text }}</a>
                 </span>
+                <span slot="dianPayCompanyName" slot-scope="text">
+                    <span>{{ text ? text : '-' }}</span>
+                </span>
+                <span slot="dianPayCompanyRebateRate" slot-scope="text">
+                    <span>{{ text ? text + '%' : '-' }}</span>
+                </span>
                 <span slot="accountingPeriod" slot-scope="text">
-                    <a>{{ text }}</a>
+                    <span>{{ text ? text + '天' : '-' }}</span>
+                </span>
+                <span slot="rebateRate" slot-scope="text">
+                    <span>{{ text ? text + '%' : '-' }}</span>
                 </span>
                 <span slot="policyStartDate" slot-scope="text, record">
-                    <span>{{ text }} 至 {{ record.policyEndDate}}</span>
+                    <span>{{ text }} 至 {{ record.policyEndDate }}</span>
+                </span>
+                <span slot="remarks" slot-scope="text">
+                    <span>{{ text ? text : '-' }}</span>
                 </span>
                 <span slot="action" slot-scope="text, record">
                     <a v-if="record.updateOperation.includes('查看')" @click="handleDetail(record)">查看</a>
-                    <a-divider v-if="record.updateOperation.includes('查看')" type="vertical"/>
-                    <a v-if="record.updateOperation.includes('提交审核')" @click="handleSubmitReview(record)">提交审核</a>
                     <a-divider v-if="record.updateOperation.includes('提交审核')" type="vertical"/>
-                    <a v-if="record.approvedStatus === 4" @click="handleEditTable(record)">编辑</a>
-                    <a-divider v-if="record.approvedStatus === 4" type="vertical"/>
-                    <a v-if="record.updateOperation.includes('审核通过')" @click="handleAuditSure(record)">审核通过</a>
+                    <a v-if="record.updateOperation.includes('提交审核')" @click="handleSubmitReview(record)">提交审核</a>
+                    <a-divider v-if="record.updateOperation.includes('编辑')" type="vertical"/>
+                    <a v-if="record.updateOperation.includes('编辑')" @click="handleEditTable(record)">编辑</a>
                     <a-divider v-if="record.updateOperation.includes('审核通过')" type="vertical"/>
+                    <a v-if="record.updateOperation.includes('审核通过')" @click="handleAuditSure(record)">审核通过</a>
+                    <a-divider v-if="record.updateOperation.includes('审核拒绝')" type="vertical"/>
                     <a v-if="record.updateOperation.includes('审核拒绝')" @click="handleAuditCancel(record)">审核拒绝</a>
                 </span>
                 <span slot="reason" slot-scope="text, record">
@@ -188,27 +217,31 @@
         <a-modal
             v-if="rejectionReasonStatus"
             title="审核不通过"
-            :visible="rejectionReasonStatus"
             dialog-class="rejection-reason-class"
-            @ok="handleModeSure"
-            @cancel="handleModeCancel"
+            :visible="rejectionReasonStatus"
+            :footer="null"
+            :closable="false"
         >
             <div>
+                <span class="audit-policy-icon" @click="handleModeCancel"><a-icon type="close"/></span>
                 <div class="reason-class-header">审核不通过的理由:</div>
-                <div>{{ rejectionReasonList.approvalContent }}</div>
+                <div class="reason-class-content">{{ rejectionReasonList.approvalContent }}</div>
+                <div solt="footer" class="audit-policy-footer">
+                    <div></div>
+                    <div>
+                        <a-button type="default" class="cancel-btn" @click="handleModeCancel">取消</a-button>
+                    </div>
+                </div>
             </div>
         </a-modal>
         <!-- 查看详情 -->
         <a-modal
             v-if="auditPolicyStatus"
             title="审核政策"
+            dialog-class="audit-policy-class"
             :visible="auditPolicyStatus"
             :closable="false"
-            okText="审核通过"
-            cancelText="审核拒绝"
-            dialog-class="audit-policy-class"
-            @ok="handleAuditSure"
-            @cancel="handleAuditCancel"
+            :footer="null"
         >
             <div>
                 <span class="audit-policy-icon" @click="handleCloseAuditPolicy"><a-icon type="close"/></span>
@@ -256,7 +289,7 @@
                         </div>
                         <div class="policy-line-left">
                             <span class="line-left-spn">集团简称:</span>
-                            <span class="line-right-spn">{{ queryByIdList.groupAbbreviation }}</span>
+                            <span class="line-right-spn">{{ queryByIdList.groupAbbreviation || '-' }}</span>
                         </div>
                     </div>
                     <div class="line-quen-right">
@@ -270,12 +303,12 @@
                         </div>
                         <div class="policy-line-right">
                             <span class="line-left-spn">返点比例:</span>
-                            <span class="line-right-spn">{{ queryByIdList.rebateRate }}</span>
+                            <span class="line-right-spn">{{ queryByIdList.rebateRate + '%' }}</span>
                         </div>
                         <div v-if="queryByIdList.advancePay === 0">
                             <div class="policy-line-right">
                                 <span class="line-left-spn">账期:</span>
-                                <span class="line-right-spn">{{ queryByIdList.accountingPeriod }}</span>
+                                <span class="line-right-spn">{{ queryByIdList.accountingPeriod && queryByIdList.accountingPeriod + '天' }}</span>
                             </div>
                             <div class="policy-line-right">
                                 <span class="line-left-spn">是否第三方垫付:</span>
@@ -288,7 +321,7 @@
                                 </div>
                                 <div class="policy-line-right">
                                     <span class="line-left-spn">垫付返点:</span>
-                                    <span class="line-right-spn">{{ queryByIdList.dianPayCompanyRebateRate }}</span>
+                                    <span class="line-right-spn">{{ queryByIdList.dianPayCompanyRebateRate && queryByIdList.dianPayCompanyRebateRate + '%' }}</span>
                                 </div>
                             </div>
                         </div>
@@ -298,18 +331,25 @@
                         </div>
                         <div class="policy-line-right">
                             <span class="line-left-spn">备注:</span>
-                            <span class="line-right-spn">{{ queryByIdList.remarks }}</span>
+                            <span class="line-right-spn">{{ queryByIdList.remarks || '-' }}</span>
                         </div>
                     </div>
                 </div>
+                <div v-if="queryByIdList.updateOperation.includes('审核拒绝')" solt="footer" class="audit-policy-footer">
+                    <div></div>
+                    <div>
+                        <a-button type="default" class="cancel-btn" @click="handleAuditCancel">审核拒绝</a-button>
+                        <a-button type="primary" @click="handleAuditSure">审核通过</a-button>
+                    </div>
+                </div>
             </div>
         </a-modal>
         <!-- 审核拒绝 -->
         <a-modal
             v-if="rejectAuditStatus"
             title="审核不通过"
-            :visible="rejectAuditStatus"
             dialog-class="rejection-reason-class"
+            :visible="rejectAuditStatus"
             @ok="handleRejectSure"
             @cancel="handleRejectCancel"
         >
@@ -334,9 +374,10 @@
         <!-- 新增、编辑政策 -->
         <a-modal
             v-if="policyOperationStatus"
+            dialog-class="policy-operation-class"
             :title="addType === 'add' ? '新增政策' : '编辑政策'"
             :visible="policyOperationStatus"
-            dialog-class="policy-operation-class"
+            :confirmLoading="confirmLoading"
             @ok="handlePolicyOperationSure"
             @cancel="handlePolicyOperationCancel"
         >
@@ -364,31 +405,58 @@
                                 allow-clear
                             />
                         </a-form-model-item>
-                        <div class="product-name-class" v-for="(item, index) in policyOperationForm.defaultFormList" :key="item.id">
+                        <div
+                            class="product-name-class"
+                            v-for="(item, index) in policyOperationForm.defaultFormList"
+                            :key="item.id"
+                        >
                             <a-form-model-item
                                 :label="index === 0 ? '产品名称' : ''"
                                 :class="{'isActive': index > 0 }"
                                 :prop="'defaultFormList.' + index + '.value'"
                                 :rules="changeRules"
                             >
-                                <a-input class="input-common-short" v-model="item.value" placeholder="请输入" allow-clear/>
-                                <a-icon v-if="index === 0" class="circle-icon-class circle-icon-plus" type="plus-circle" @click="handleAddOrigin"/>
-                                <a-icon v-if="policyOperationForm.defaultFormList.length > 1 && index === 0" class="circle-icon-class circle-icon-minus" type="minus-circle" @click="handleDelOrigin(item)"/>
-                                <a-icon v-if="policyOperationForm.defaultFormList.length > 1 && index > 0" class="circle-icon-class circle-icon-plus" type="minus-circle" @click="handleDelOrigin(item)"/>
+                                <a-input
+                                    class="input-common-short"
+                                    v-model="item.value"
+                                    placeholder="请输入"
+                                    allow-clear
+                                />
+                                <a-icon
+                                    v-if="index === 0"
+                                    class="circle-icon-class circle-icon-plus"
+                                    type="plus-circle"
+                                    @click="handleAddOrigin"
+                                />
+                                <a-icon
+                                    v-if="policyOperationForm.defaultFormList.length > 1 && index === 0" class="circle-icon-class circle-icon-minus"
+                                    type="minus-circle"
+                                    @click="handleDelOrigin(item)"
+                                />
+                                <a-icon
+                                    v-if="policyOperationForm.defaultFormList.length > 1 && index > 0" class="circle-icon-class circle-icon-plus"
+                                    type="minus-circle"
+                                    @click="handleDelOrigin(item)"
+                                />
                             </a-form-model-item>
                         </div>
                         <a-form-model-item label="媒体" prop="mediaType">
-                            <a-select v-model="policyOperationForm.mediaType" placeholder="请选择投放媒体">
-                                <a-select-option :value="1">快手</a-select-option>
-                                <a-select-option :value="2">头条</a-select-option>
+                            <a-select
+                                v-model="policyOperationForm.mediaType"
+                                placeholder="请选择投放媒体"
+                                allow-clear
+                            >
+                                <a-select-option :value="1">头条</a-select-option>
+                                <a-select-option :value="2">快手</a-select-option>
                             </a-select>
                         </a-form-model-item>
                         <a-form-model-item label="销售" prop="createUserId">
                             <a-select
                                 v-model="policyOperationForm.createUserId"
                                 style="width: 100px"
-                                :filter-option="handleFilterOption"
                                 show-search
+                                allow-clear
+                                :filter-option="handleFilterOption"
                             >
                                 <a-select-option
                                     v-for="item in saleShowOption"
@@ -400,7 +468,11 @@
                             </a-select>
                         </a-form-model-item>
                         <a-form-model-item label="区域" prop="areaInfo">
-                            <a-select v-model="policyOperationForm.areaInfo" placeholder="请选择区域">
+                            <a-select
+                                v-model="policyOperationForm.areaInfo"
+                                placeholder="请选择区域"
+                                allow-clear
+                            >
                                 <a-select-option
                                     v-for="item in addAreaList"
                                     :key="item"
@@ -414,8 +486,9 @@
                             <a-select
                                 v-model="policyOperationForm.companySubjectName"
                                 placeholder="请选择我司主体"
-                                :filter-option="handleFilterOption"
                                 show-search
+                                allow-clear
+                                :filter-option="handleFilterOption"
                             >
                                 <a-select-option
                                     v-for="item in addSubjectList"
@@ -426,31 +499,53 @@
                                 </a-select-option>
                             </a-select>
                         </a-form-model-item>
-                        <a-form-model-item label="运营方式" prop="promotionType">
+                        <a-form-model-item
+                            class="promotion-type-class"
+                            label="运营方式"
+                            prop="promotionType"
+                        >
                             <a-radio-group v-model="policyOperationForm.promotionType" button-style="solid">
                                 <a-radio-button :value="0">自运营</a-radio-button>
                                 <a-radio-button :value="1">代运营</a-radio-button>
                             </a-radio-group>
+                            <a-tooltip>
+                                <template slot="title">自运营是客户自己运营,代运营由我们帮助客户运营账户</template>
+                                <a-icon class="settlement-header-icon" type="question-circle"/>
+                            </a-tooltip>
                         </a-form-model-item>
-                        <a-form-model-item label="集团简称">
-                            <a-input
-                                v-model="policyOperationForm.groupAbbreviation"
-                                placeholder="请输入集团简称"
-                                allow-clear
-                                @change="handleGroupAbbreviationChange"
-                            />
-                        </a-form-model-item>
-                        <div v-if="subTitleMsgStatus" style="color: #f00;margin-left: 140px">只能输入30个汉字</div>
+                        <div class="group-abbreviation-class">
+                            <a-tooltip>
+                                <template slot="title">由销售人员自行定义的集团系列产品简称</template>
+                                <a-icon class="settlement-header-icon" type="question-circle"/>
+                            </a-tooltip>
+                            <a-form-model-item label="集团简称">
+                                <a-input
+                                    v-model="policyOperationForm.groupAbbreviation"
+                                    placeholder="请输入集团简称"
+                                    allow-clear
+                                    @change="handleGroupAbbreviationChange"
+                                />
+                            </a-form-model-item>
+                            <div v-if="subTitleMsgStatus" style="color: #f00;margin-left: 140px">只能输入30个汉字</div>
+                        </div>
                     </a-row>
                     <a-row class="policy-operation-form-right">
                         <a-form-model-item label="是否预付" prop="advancePay">
-                            <a-radio-group v-model="policyOperationForm.advancePay" button-style="solid" @change="handlePrepaidNotChange">
+                            <a-radio-group
+                                v-model="policyOperationForm.advancePay"
+                                button-style="solid"
+                                @change="handlePrepaidNotChange"
+                            >
                                 <a-radio-button :value="1">是</a-radio-button>
                                 <a-radio-button :value="0">否</a-radio-button>
                             </a-radio-group>
                         </a-form-model-item>
                         <a-form-model-item label="返点类型:" prop="rebateType">
-                            <a-select v-model="policyOperationForm.rebateType" placeholder="请选择返点类型">
+                            <a-select
+                                v-model="policyOperationForm.rebateType"
+                                placeholder="请选择返点类型"
+                                allow-clear
+                            >
                                 <a-select-option :value="0">返现</a-select-option>
                                 <a-select-option :value="1">返货</a-select-option>
                                 <a-select-option :value="2">返现+返货</a-select-option>
@@ -463,15 +558,20 @@
                                 :precision="2"
                             /> %
                         </a-form-model-item>
-                        <a-form-model-item v-if="policyOperationForm.advancePay === 0" label="账期" prop="accountingPeriod">
-                            <a-input-number
-                                v-model="policyOperationForm.accountingPeriod"
-                                :precision="0"
-                            /> 天
+                        <a-form-model-item
+                            v-if="policyOperationForm.advancePay === 0"
+                            label="账期"
+                            prop="accountingPeriod"
+                        >
+                            <a-input-number v-model="policyOperationForm.accountingPeriod" :precision="0"/> 天
                         </a-form-model-item>
                         <div v-if="policyOperationForm.advancePay === 0">
-                            <a-form-model-item label="是否第三方垫付" prop="isDianPay" @change="handleIsDianPayChange">
-                                <a-radio-group v-model="policyOperationForm.isDianPay" button-style="solid">
+                            <a-form-model-item label="是否第三方垫付" prop="isDianPay">
+                                <a-radio-group
+                                    v-model="policyOperationForm.isDianPay"
+                                    button-style="solid"
+                                    @change="handleIsDianPayChange"
+                                >
                                     <a-radio-button :value="1">是</a-radio-button>
                                     <a-radio-button :value="0">否</a-radio-button>
                                 </a-radio-group>
@@ -516,9 +616,10 @@
     </div>
 </template>
 <script>
+import moment from 'moment';
+
 import {getAction, postAction} from '@/api/manage';
 import {mapGetters} from 'vuex';
-import moment from 'moment';
 import {urlAcount} from './policy-management-server.js';
 
 export default {
@@ -531,6 +632,7 @@ export default {
             this.handleDescRules(value, 5, 100, callback);
         };
         return {
+            confirmLoading: false,
             controlLoading: false,
             allSaleListOption: [],
             creativeMediaOptions: [
@@ -612,7 +714,7 @@ export default {
                 advancePay: 0,
                 advertiserName: '',
                 rebateType: undefined,
-                mediaType: 1,
+                mediaType: 2,
                 createUserId: undefined,
                 areaInfo: undefined,
                 companySubjectName: undefined,
@@ -724,7 +826,8 @@ export default {
                     title: '返点比例',
                     align: 'center',
                     dataIndex: 'rebateRate',
-                    width: 150
+                    width: 150,
+                    scopedSlots: {customRender: 'rebateRate'}
                 },
                 {
                     title: '是否垫付',
@@ -737,13 +840,15 @@ export default {
                     title: '垫付公司',
                     align: 'center',
                     dataIndex: 'dianPayCompanyName',
-                    width: 150
+                    width: 150,
+                    scopedSlots: {customRender: 'dianPayCompanyName'}
                 },
                 {
                     title: '垫付公司返点',
                     align: 'center',
                     dataIndex: 'dianPayCompanyRebateRate',
-                    width: 150
+                    width: 150,
+                    scopedSlots: {customRender: 'dianPayCompanyRebateRate'}
                 },
                 {
                     title: '运营方式',
@@ -763,10 +868,11 @@ export default {
                     title: '备注',
                     align: 'center',
                     dataIndex: 'remarks',
-                    width: 190
+                    width: 190,
+                    scopedSlots: {customRender: 'remarks'}
                 },
                 {
-                    title: '操作', // operation
+                    title: '操作',
                     dataIndex: 'action',
                     align: 'center',
                     width: 250,
@@ -774,7 +880,7 @@ export default {
                     scopedSlots: {customRender: 'action'}
                 },
                 {
-                    title: '审核理由', // approvalContent
+                    title: '审核理由',
                     dataIndex: 'reason',
                     align: 'center',
                     width: 150,
@@ -791,7 +897,7 @@ export default {
                 creativeAdvance: undefined,
                 creativeSale: undefined,
                 creativeOperate: 'no',
-                time: [],
+                time: [moment().subtract(6, 'days').format('YYYY-MM-DD'), moment().format('YYYY-MM-DD')],
                 searchStatus: 'no'
             },
             tablePag: {
@@ -816,6 +922,23 @@ export default {
     methods: {
         ...mapGetters(['userInfo']),
         moment,
+        calculationScope(data) {
+            let defaultScope = '';
+            switch (data) {
+                case 0:
+                    defaultScope = '否';
+                    break;
+                case 1:
+                    defaultScope = '是';
+                    break;
+                default:
+                    defaultScope = '-';
+            }
+            return defaultScope;
+        },
+        handleLaunchData(date, dateString) {
+            this.configForm.time = dateString;
+        },
         handleFilterOption(input, option) {
             return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0;
         },
@@ -888,7 +1011,7 @@ export default {
                 mediaType: this.configForm.creativeMedia === 'no' ? '' : this.configForm.creativeMedia,
                 rebateType: this.configForm.creativeRebate === 'no' ? '' : this.configForm.creativeRebate,
                 dianPayCompanyName: this.configForm.creativeAdvance,
-                createUserId: this.configForm.creativeSale === 'no' ? '' : this.configForm.creativeSale,
+                createUserName: this.configForm.creativeSale === 'no' ? '' : this.configForm.creativeSale,
                 promotionType: this.configForm.creativeOperate === 'no' ? '' : this.configForm.creativeOperate,
                 approvedStatus: this.configForm.searchStatus === 'no' ? '' : this.configForm.searchStatus,
                 startTime: this.configForm.time[0],
@@ -901,7 +1024,6 @@ export default {
                     let defaultList = result.result.list;
                     defaultList.forEach(item => {
                         item.updatePolicyProductName = item.policyProductName.join(',');
-                        item.remarks = item.remarks ? item.remarks : '-';
                         item.updateOperation = item.operation.split('|');
                         item.updateMediaType = this.creativeMediaOptions.filter(val => val.id === item.mediaType)[0].name;
                         item.updateRebateType = this.creativeRebateOptions.filter(val => val.id === item.rebateType)[0].name;
@@ -981,14 +1103,14 @@ export default {
         handleIsDianPayChange(e) {
             if (e.target.value === 0) {
                 this.policyOperationForm.dianPayCompanyName = '';
-                this.policyOperationForm.dianPayCompanyRebateRate = '';
+                this.policyOperationForm.dianPayCompanyRebateRate = 0;
             }
         },
         handlePrepaidNotChange(e) {
             if (e.target.value === 1) {
                 this.policyOperationForm.accountingPeriod = '';
                 this.policyOperationForm.dianPayCompanyName = '';
-                this.policyOperationForm.dianPayCompanyRebateRate = '';
+                this.policyOperationForm.dianPayCompanyRebateRate = 0;
                 this.policyOperationForm.isDianPay = undefined;
             }
             else if (e.target.value === 0) {
@@ -1060,10 +1182,6 @@ export default {
             };
             this.policyOperationForm = Object.assign({}, list, originChange);
         },
-        // 政策导出按钮
-        handlePolicyExport() {
-            console.log('政策导出按钮');
-        },
         // 新增政策按钮
         handleAddAccountPolicy() {
             this.addType = 'add';
@@ -1092,10 +1210,12 @@ export default {
                 isDianPay,
                 dianPayCompanyName,
                 dianPayCompanyRebateRate,
-                remarks
+                remarks,
+                createUserName: this.saleShowOption[0].userName || ''
             };
             this.$refs.policyOperationForm.validate(valid => {
                 if (valid) {
+                    this.confirmLoading = true;
                     if (this.addType === 'add') {
                         this.handleAddSureBtn(paramsData, '/finance/cwjsPolicyInfo/add');
                     }
@@ -1120,10 +1240,9 @@ export default {
                 }
             }).catch(error => {
                 console.log(error, 'eeee');
+            }).finally(() => {
+                this.confirmLoading = false;
             });
-            // .finally(() => {
-            //     this.handlePolicyOperationCancel();
-            // });
         },
         // 新增政策取消按钮
         handlePolicyOperationCancel() {
@@ -1138,7 +1257,7 @@ export default {
                 advancePay: 0,
                 advertiserName: '',
                 rebateType: undefined,
-                mediaType: 1,
+                mediaType: 2,
                 createUserId: undefined,
                 areaInfo: undefined,
                 companySubjectName: undefined,
@@ -1167,7 +1286,6 @@ export default {
                     this.handleRejectCancel();
                 }
                 else {
-                    console.log('error submit!!');
                     return false;
                 }
             });
@@ -1255,7 +1373,7 @@ export default {
                 creativeAdvance: undefined,
                 creativeSale: undefined,
                 creativeOperate: 'no',
-                time: [],
+                time: [moment().subtract(6, 'days').format('YYYY-MM-DD'), moment().format('YYYY-MM-DD')],
                 searchStatus: 'no'
             };
             this.tablePag = {

+ 11 - 0
src/views/modules/settlement-account/settlement-account-server.js

@@ -0,0 +1,11 @@
+/**
+ * @file 账户配置API
+ * @author jiayufei
+ */
+
+//  export const urlAcount = 'http://api.tjyourong.com.cn'; // 线上
+//  export const urlAcount = 'http://gateway.tjyourong.com.cn'; // 测试
+// export const urlAcount = 'http://192.168.1.43:9999'; // 子安
+ export const urlAcount = 'http://gateway.tjyourong.com.cn'; // 测试
+// export const urlAcount = 'http://192.168.1.8:9999'; // 学超
+ 

+ 408 - 194
src/views/modules/settlement-account/settlement-account.vue

@@ -12,7 +12,9 @@
                 </span>
             </div>
             <div>
-                <span class="add-acount-policy-btn"><a-button type="primary" @click="handleUploadAccount">上传账户数据</a-button></span>
+                <span v-if="userSaleList.includes(userInfo().roleName)" class="add-acount-policy-btn">
+                    <a-button type="primary" @click="handleUploadAccount">上传账户数据</a-button>
+                </span>
             </div>
         </div>
         <div class="control-con-header">
@@ -28,45 +30,53 @@
                         label="广告主名称:"
                         :colon="false"
                     >
-                        <a-input v-model="configForm.creativeAdvance" placeholder="请输入广告主名称"/>
+                        <a-input v-model="configForm.advertiserName" placeholder="请输入广告主名称" allow-clear/>
                     </a-form-item>
                     <a-form-item
                         class="grid-form-item"
                         label="产品名称:"
                         :colon="false"
                     >
-                        <a-input v-model="configForm.creativeAdvance11" placeholder="请输入产品名称"/>
+                        <a-input v-model="configForm.productName" placeholder="请输入产品名称" allow-clear/>
                     </a-form-item>
                     <a-form-item
                         class="grid-form-item"
                         label="项目名称:"
                         :colon="false"
                     >
-                        <a-input v-model="configForm.creativeAdvance22" placeholder="请输入项目名称"/>
+                        <a-input v-model="configForm.projectName" placeholder="请输入项目名称" allow-clear/>
                     </a-form-item>
                     <a-form-item
                         class="grid-form-item"
                         label="账户名称:"
                         :colon="false"
                     >
-                        <a-input v-model="configForm.creativeAdvance33" placeholder="请输入账户名称"/>
+                        <a-input v-model="configForm.accountName" placeholder="请输入账户名称" allow-clear/>
                     </a-form-item>
                 </a-row>
                 <a-row>
-                    <a-form-item label="销售:">
-                        <a-select v-model="configForm.creativeSale" style="width: 100px">
-                            <a-select-option :value="2">不限</a-select-option>
-                            <a-select-option value="CREATIVE_IMAGE_MODE_VIDEO_VERTICAL">竖版视频</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_UNION_SPLASH">开屏</a-select-option>
+                    <a-form-item label="负责人:">
+                        <a-select
+                            v-model="configForm.createUserName"
+                            style="width: 100px"
+                            :filter-option="handleFilterOption"
+                            show-search
+                            allow-clear
+                        >
+                            <a-select-option
+                                v-for="item in allSaleListOption"
+                                :key="item.id"
+                                :value="item.realname"
+                            >
+                                {{ item.realname }}
+                            </a-select-option>
                         </a-select>
                     </a-form-item>
-                    <a-form-item label="负责人:">
-                        <a-select v-model="configForm.creativeMedia" style="width: 100px">
-                            <a-select-option :value="2">不限</a-select-option>
-                            <a-select-option value="CREATIVE_IMAGE_MODE_VIDEO_VERTICAL">快手</a-select-option>
-                            <a-select-option value="CREATIVE_IMAGE_MODE_LARGE">头条</a-select-option>
+                    <a-form-item label="媒体类型:">
+                        <a-select v-model="configForm.mediaId" style="width: 100px">
+                            <a-select-option value="no">不限</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
@@ -77,6 +87,7 @@
                         <a-range-picker
                             v-model="configForm.time"
                             format="YYYY-MM-DD"
+                            @change="handleAddTimesChange"
                         />
                     </a-form-item>
                     <a-form-item class="form-handle-btn">
@@ -95,14 +106,45 @@
                 :dataSource="dataSource"
                 :pagination="false"
                 :scroll="{x: 1800}"
+                :loading="controlLoading"
             >
-                <span slot="acountRelax" slot-scope="text, record">
+                <span slot="advertiserName" slot-scope="text">
+                    <a-tooltip placement="top">
+                        <template slot="title">
+                            <span>{{ text }}</span>
+                        </template>
+                        <span>{{ text }}</span>
+                    </a-tooltip>
+                </span>
+                <span slot="productName" slot-scope="text">
+                    <a-tooltip placement="top">
+                        <template slot="title">
+                            <span>{{ text }}</span>
+                        </template>
+                        <span>{{ text }}</span>
+                    </a-tooltip>
+                </span>
+                <span slot="accountName" slot-scope="text">
+                    <a-tooltip placement="top">
+                        <template slot="title">
+                            <span>{{ text }}</span>
+                        </template>
+                        <span>{{ text }}</span>
+                    </a-tooltip>
+                </span>
+                <span slot="mediaId" slot-scope="text">
+                    <span>{{ text === 1 ? '头条' : '快手' }}</span>
+                </span>
+                <span slot="operateType" slot-scope="text">
+                    <span>{{ text === 1 ? '自运营' : '代运营' }}</span>
+                </span>
+                <span slot="status" slot-scope="text, record">
                     <a-switch :checked="text === 0" @change="handleSwitchChang($event, record)"/>
                 </span>
                 <span slot="action" slot-scope="text, record">
                     <a @click="handleSettleDel(record)">删除</a>
                     <a-divider type="vertical"/>
-                    <a>更多</a>
+                    <a disabled>更多</a>
                 </span>
             </a-table>
             <a-pagination
@@ -116,12 +158,13 @@
                 @showSizeChange="onShowSizeChange"
             />
         </div>
-        <!-- 新增、编辑政策 -->
+        <!-- 上传账户数据 -->
         <a-modal
             v-if="policyOperationStatus"
             title="账户上传"
             :visible="policyOperationStatus"
             dialog-class="settlement-modal-class"
+            :confirmLoading="confirmLoading"
             @ok="handlePolicyOperationSure"
             @cancel="handlePolicyOperationCancel"
         >
@@ -134,47 +177,79 @@
                     :label-col="labelCol"
                     :wrapper-col="wrapperCol"
                 >
-                    <a-form-model-item label="选择广告主公司名称" prop="name6">
-                        <a-select v-model="policyOperationForm.name6" placeholder="请选择广告主公司名称">
-                            <a-select-option :value="1">快手</a-select-option>
-                            <a-select-option :value="2">头条</a-select-option>
-                        </a-select>
+                    <a-form-model-item label="选择媒体">
+                        <a-radio-group v-model="policyOperationForm.mediaId" button-style="solid" @change="handleMediaIdChange">
+                            <a-radio-button :value="1">头条</a-radio-button>
+                            <a-radio-button :value="2">快手</a-radio-button>
+                        </a-radio-group>
                     </a-form-model-item>
-                    <a-form-model-item label="选择产品名称" prop="name7">
-                        <a-select v-model="policyOperationForm.name7" placeholder="请选择产品名称">
-                            <a-select-option :value="1">快手</a-select-option>
-                            <a-select-option :value="2">头条</a-select-option>
+                    <a-form-model-item label="选择广告主公司名称" prop="advertiserId">
+                        <a-select
+                            v-model="policyOperationForm.advertiserId"
+                            placeholder="请选择广告主名称"
+                            :filter-option="handleFilterOption"
+                            show-search
+                            @change="handleAdverOptionChange"
+                        >
+                            <a-select-option
+                                v-for="item in allAdverListOption"
+                                :key="item.advertiserId"
+                                :value="item.advertiserId"
+                            >
+                                {{ item.advertiserName }}
+                            </a-select-option>
                         </a-select>
                     </a-form-model-item>
-                    <a-form-model-item label="选择项目名称" prop="name8">
-                        <a-select v-model="policyOperationForm.name8" placeholder="请选择项目名称">
-                            <a-select-option :value="1">快手</a-select-option>
-                            <a-select-option :value="2">头条</a-select-option>
+                    <a-form-model-item label="选择产品名称" prop="productId">
+                        <a-select
+                            v-model="policyOperationForm.productId"
+                            placeholder="请选择产品名称"
+                            :filter-option="handleFilterOption"
+                            show-search
+                            @change="handleProductOptionChange"
+                        >
+                            <a-select-option
+                                v-for="item in allProductListOption"
+                                :key="item.id"
+                                :value="item.id"
+                            >
+                                {{ item.productName }}
+                            </a-select-option>
                         </a-select>
                     </a-form-model-item>
-                    <a-form-model-item label="选择媒体">
-                        <a-radio-group v-model="policyOperationForm.name9" button-style="solid">
-                            <a-radio-button value="a">头条</a-radio-button>
-                            <a-radio-button value="b">快手</a-radio-button>
-                        </a-radio-group>
+                    <a-form-model-item label="选择项目名称" prop="projectId">
+                        <a-select
+                            v-model="policyOperationForm.projectId"
+                            placeholder="请选择产品名称"
+                            :filter-option="handleFilterOption"
+                            show-search
+                        >
+                            <a-select-option
+                                v-for="item in allProjectListOption"
+                                :key="item.id"
+                                :value="item.id"
+                            >
+                                {{ item.projectName }}
+                            </a-select-option>
+                        </a-select>
                     </a-form-model-item>
                     <a-form-model-item label="运营方式">
-                        <a-radio-group v-model="policyOperationForm.name10" button-style="solid">
-                            <a-radio-button value="a">自运营</a-radio-button>
-                            <a-radio-button value="b">代运营</a-radio-button>
+                        <a-radio-group v-model="policyOperationForm.operateType" button-style="solid">
+                            <a-radio-button :value="1">自运营</a-radio-button>
+                            <a-radio-button :value="2">代运营</a-radio-button>
                         </a-radio-group>
                     </a-form-model-item>
                     <a-form-model-item label="附件上传">
                         <a-upload
                             name="file"
-                            :file-list="fileList"
-                            :before-upload="beforeUpload"
-                            @change="handleChange"
+                            :file-list="policyOperationForm.fileList"
+                            :customRequest="handleCustomRequest"
+                            :remove="handleRemoveUpload"
                         >
-                            <a-button><a-icon type="upload" />文件上传</a-button>
+                            <a-button><a-icon type="upload"/>文件上传</a-button>
                         </a-upload>
                         <a class="file-down-title" @click="handleFileDownTitle">文件格式下载</a>
-                        <p class="upload-txt-rules">支持扩展名:.xlxs</p>
+                        <p class="upload-txt-rules">支持扩展名:.xlsx、.xls</p>
                     </a-form-model-item>
                 </a-form-model>
             </div>
@@ -183,67 +258,61 @@
 </template>
 <script>
 import {mapGetters} from 'vuex';
-
-import BMF from 'browser-md5-file';
-let COS = require('cos-js-sdk-v5');
-let cos = new COS({
-    SecretId: 'AKIDE6IpMi8fJQRCg1iuWzFajjRs43kbbets',
-    SecretKey: 'tXzuwMfplTTK3c9GFUyETilasvQfePu9'
-});
+import moment from 'moment';
+import {getAction, postFileAction} from '@/api/manage';
+import {urlAcount} from './settlement-account-server.js';
 
 export default {
     name: 'settlement-account',
     data() {
         return {
-            fileList: [],
+            userSaleList: ['外部销售', '销售总监', '销售', '销售助理', '销售支持经理', '销售AM', '媒介', '管理员'],
+            confirmLoading: false,
+            allProjectListOption: [],
+            allAdverListOption: [],
+            allProductListOption: [],
+            controlLoading: false,
+            allSaleListOption: [],
             labelCol: {span: 7},
             wrapperCol: {span: 14},
             policyOperationForm: {
-                name6: undefined,
-                name7: undefined,
-                name8: undefined,
-                name9: 'a',
-                name10: 'a',
+                advertiserId: undefined,
+                productId: undefined,
+                projectId: undefined,
+                mediaId: 1,
+                operateType: 1,
+                fileList: []
             },
             policyOperationRules: {
-                name6: [{required: true, message: '请选择广告主公司名称', trigger: 'change'}],
-                name7: [{required: true, message: '请选择产品名称', trigger: 'change'}],
-                name8: [{required: true, message: '请选择项目名称', trigger: 'change'}],
+                advertiserId: [{required: true, message: '请选择广告主公司名称', trigger: 'change'}],
+                productId: [{required: true, message: '请选择产品名称', trigger: 'change'}],
+                projectId: [{required: true, message: '请选择项目名称', trigger: 'change'}]
             },
             policyOperationStatus: false,
-            totalAll: 100,
-            dataSource: [
-                {
-                    status: '腾讯科技有限公司', 
-                    accountId_dictText: '腾讯科技有限公司', 
-                    creativeImageMode: '产品名称', 
-                    accountId: '快手', 
-                    createTime: '何甜甜', 
-                    validBalance: '待审核', 
-                    accountBudget: '是', 
-                    adCpaBidStr: '80天',
-                    acountRelax: 0
-                }
-            ],
+            totalAll: 0,
+            dataSource: [],
             settlementColumns: [
                 {
                     title: '广告主主体名称',
                     align: 'center',
-                    dataIndex: 'status',
-                    width: 150
+                    dataIndex: 'advertiserName',
+                    width: 240,
+                    ellipsis: true,
+                    scopedSlots: {customRender: 'advertiserName'}
                 },
                 {
                     title: '产品名称',
                     align: 'center',
-                    dataIndex: 'accountId_dictText',
-                    width: 150,
-                    scopedSlots: {customRender: 'accountId_dictText'}
+                    dataIndex: 'productName',
+                    ellipsis: true,
+                    width: 200,
+                    scopedSlots: {customRender: 'productName'}
                 },
                 {
                     title: '项目名称',
                     align: 'center',
-                    dataIndex: 'creativeImageMode',
-                    width: 150
+                    dataIndex: 'projectName',
+                    width: 180
                 },
                 {
                     title: '账户ID',
@@ -253,36 +322,38 @@ export default {
                 },
                 {
                     title: '账户名称',
-                    dataIndex: 'createTime',
+                    dataIndex: 'accountName',
                     align: 'center',
-                    width: 150
+                    width: 160,
+                    ellipsis: true,
+                    scopedSlots: {customRender: 'accountName'}
                 },
                 {
                     title: '媒体',
-                    dataIndex: 'validBalance',
+                    dataIndex: 'mediaId',
                     align: 'center',
                     width: 150,
-                    scopedSlots: {customRender: 'validBalance'}
+                    scopedSlots: {customRender: 'mediaId'}
                 },
                 {
                     title: '负责人',
-                    dataIndex: 'accountBudget',
+                    dataIndex: 'createUserName',
                     width: 180,
                     align: 'center'
                 },
                 {
                     title: '运营方式',
-                    dataIndex: 'adCpaBidStr',
+                    dataIndex: 'operateType',
                     align: 'center',
                     width: 150,
-                    scopedSlots: {customRender: 'adCpaBidStr'}
+                    scopedSlots: {customRender: 'operateType'}
                 },
                 {
                     title: '账户状态',
                     align: 'center',
-                    dataIndex: 'acountRelax',
+                    dataIndex: 'status',
                     width: 150,
-                    scopedSlots: {customRender: 'acountRelax'}
+                    scopedSlots: {customRender: 'status'}
                 },
                 {
                     title: '操作',
@@ -294,13 +365,13 @@ export default {
                 }
             ],
             configForm: {
-                creativeAdvance: '',
-                creativeAdvance11: '',
-                creativeAdvance22: '',
-                creativeAdvance33: '',
+                advertiserName: '',
+                productName: '',
+                projectName: '',
+                accountName: '',
                 creativeSale: 2,
-                creativeMedia: 2,
-                time: []
+                mediaId: 'no',
+                time: [moment().subtract(7, 'days').format('YYYY-MM-DD'), moment().format('YYYY-MM-DD')]
             },
             tablePag: {
                 page: 1,
@@ -311,122 +382,235 @@ export default {
     created() {
         this.searchForm = this.$form.createForm(this);
     },
+    mounted() {
+        this.handleInitTable();
+        this.handleGetAllSaleList();
+        this.handleGetAllAdverList(1);
+    },
     methods: {
         ...mapGetters(['userInfo']),
-        // 文件格式下载
-        handleFileDownTitle() {
-            console.log('文件格式下载');
+        moment,
+        handleMediaIdChange(e) {
+            this.policyOperationForm.advertiserId = undefined;
+            this.policyOperationForm.productId = undefined;
+            this.policyOperationForm.projectId = undefined;
+            this.policyOperationForm.operateType = 1;
+            this.policyOperationForm.fileList = [];
+            this.handleGetAllAdverList(e.target.value)
         },
-        beforeUpload(file) {
-            this.cosUpload(file);
+        handleAddTimesChange(date, dateString) {
+            this.configForm.time = dateString;
         },
-        handleMd5(file) {
-            let bmf = new BMF();
-            let that = this;
-            return new Promise(function (resolve, reject) {
-                bmf.md5(file, (err, md5) => {
-                    getAction('kuaishouPopulationPackage/checkPopulationPackage', {signature: md5}).then(result => {
-                        if (result.code === 200) {
-                            that.personNameDisabled = false;
-                            that.personResourceDisabled = false;
-                            resolve();
-                        }
-                        else if (result.code === 201) {
-                            that.$message.error(result.message);
-                            that.personForm.name = result.result.orientationName;
-                            that.personForm.resource = result.result.type;
-                            that.personNameDisabled = true;
-                            that.personResourceDisabled = true;
-                            reject();
-                        }
-                    }).catch(error => {
-                        console.log(error, 'eeee');
-                        reject();
-                    });
-                });
+        handleProductOptionChange(e) {
+            this.policyOperationForm.projectId = undefined;
+            const paramsData = {
+                pageNo: 1,
+                pageSize: 1000,
+                mediaId: this.policyOperationForm.mediaId === 1 ? '1,3' : '2,4',
+                advertiserId: this.policyOperationForm.advertiserId,
+                productId: e
+            };
+            getAction('/ctop/project/list', paramsData).then(result => {
+                if (result.success) {
+                    this.allProjectListOption = result.result.records || [];
+                }
+                else {
+                    this.$message.error(result.message);
+                }
+            }).catch(error => {
+                console.log(error, 'eeee');
             });
         },
-        handleChange(info) {
-            this.fileList = info.fileList;
+        handleAdverOptionChange(e) {
+            this.policyOperationForm.productId = undefined;
+            this.policyOperationForm.projectId = undefined;
+            const paramsData = {
+                pageNo: 1,
+                pageSize: 1000,
+                advertiserId: e
+            };
+            getAction('/ctop/product/list', paramsData).then(result => {
+                if (result.success) {
+                    this.allProductListOption = result.result.records || [];
+                }
+                else {
+                    this.$message.error(result.message);
+                }
+            }).catch(error => {
+                console.log(error, 'eeee');
+            });
         },
-        cosUpload(file) {
-            let 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;
-            let timeElse = new Date().getTime();
-            let arr = file.name.split('.');
-            let str = '';
-            for (let i = 0; i < arr.length; i++) {
-                if (i === arr.length - 1) {
+        handleFilterOption(input, option) {
+            return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0;
+        },
+        // 获取所有的广告主列表
+        handleGetAllAdverList(type) {
+            const paramsData = {
+                userId: this.userInfo().id,
+                mediaId: type,
+                pageNo: 1,
+                pageSize: 1000
+            };
+            getAction('/ctop/projectMember/participateListV3', paramsData).then(result => {
+                if (result.success) {
+                    this.allAdverListOption = result.result || [];
                 }
                 else {
-                    if (i === arr.length - 2) {
-                        str += arr[i];
-                    }
-                    else {
-                        str += arr[i] + '.';
-                    }
+                    this.$message.error(result.message);
+                }
+            }).catch(error => {
+                console.log(error, 'eeee');
+            });
+        },
+        // 获取所有的媒体 枚举值
+        handleGetAllSaleList() {
+            const paramsData = {
+                userId: this.userInfo().id
+            };
+            getAction(urlAcount + '/finance/settLementController/getResponsibleUserByIds', paramsData).then(result => {
+                if (result.code === 0) {
+                    this.allSaleListOption = result.result || [];
                 }
+                else {
+                    this.$message.error(result.message);
+                }
+            }).catch(error => {
+                console.log(error, 'eeee');
+            });
+        },
+        // 获取默认的列表数据
+        handleInitTable() {
+            this.controlLoading = true;
+            const paramsData = {
+                createUserId: this.userInfo().id,
+                advertiserName: this.configForm.advertiserName,
+                productName: this.configForm.productName,
+                projectName: this.configForm.projectName,
+                accountName: this.configForm.accountName,
+                createUserName: this.configForm.createUserName,
+                mediaId: this.configForm.mediaId === 'no' ? '' : this.configForm.mediaId,
+                startTime: this.configForm.time[0],
+                endTime: this.configForm.time[1],
+                pageNo: this.tablePag.page,
+                pageSize: this.tablePag.size
+            };
+            getAction(urlAcount + '/finance/settLementController/getSettlementList', paramsData).then(result => {
+                if (result.code === 0) {
+                    let defaultList = result.result.list;
+                    this.dataSource = defaultList;
+                    this.totalAll = result.result.total;
+                }
+                else {
+                    this.dataSource = [];
+                    this.totalAll = 0;
+                    this.$message.error(result.message);
+                }
+            }).catch(error => {
+                console.log(error, 'eeee');
+            }).finally(() => {
+                this.controlLoading = false;
+            });
+        },
+        // 文件格式下载
+        handleFileDownTitle() {
+            const {mediaId} = this.policyOperationForm;
+            if (mediaId === 1) {
+                window.location.href = 'http://media-1301855440.cos.ap-chongqing.myqcloud.com/undefined/2021-08-17/%E5%A4%B4%E6%9D%A1%E8%B4%A6%E6%88%B7%E4%B8%8A%E4%BC%A0%E6%A8%A1%E6%9D%BF-1629185054420.xlsx';
             }
-            cos.putObject(
-                {
-                    Bucket: 'media-1301855440',
-                    Region: 'ap-chongqing',
-                    // 存储桶所在地域,必须字段
-                    Key: that.uploadType + '/' + y + '-' + MM + '-' + d + '/' + str + '-' + timeElse + '.' + arr[arr.length - 1],
-                    StorageClass: 'STANDARD',
-                    Body: file // 上传文件对象
-                },
-                function (err, data) {
-                    if (err) {
-                        that.$message.error('上传失败!!!' + err);
+            else if (mediaId === 2) {
+                window.location.href = 'http://media-1301855440.cos.ap-chongqing.myqcloud.com/undefined/2021-08-17/%E5%BF%AB%E6%89%8B%E8%B4%A6%E6%88%B7%E4%B8%8A%E4%BC%A0%E6%A8%A1%E6%9D%BF-1629185318124.xlsx';
+            }
+        },
+        handleCustomRequest(info) {
+            const isZip = info.file.name.indexOf('xlsx') !== -1 || info.file.name.indexOf('xls') !== -1;
+            if (!isZip) {
+                this.$message.error('上传模板只能是 xls、xlsx格式!');
+                return;
+            }
+            this.policyOperationForm.fileList = [];
+            this.$nextTick(() => {
+                this.policyOperationForm.fileList.push(info.file);
+            });
+        },
+        handleRemoveUpload(data) {
+            let index = this.policyOperationForm.fileList.indexOf(data);
+            let newUploadFile = this.policyOperationForm.fileList;
+            newUploadFile.splice(index, 1);
+            this.policyOperationForm.fileList = newUploadFile;
+        },
+        // 上传确定按钮操作
+        handlePolicyOperationSure() {
+            const {advertiserId, productId, projectId, mediaId, operateType, fileList} = this.policyOperationForm;
+            this.$refs.policyOperationForm.validate(valid => {
+                if (valid) {
+                    if (!fileList.length) {
+                        this.$message.error('请上传文件');
                         return;
                     }
-                    that.loadingElse = false;
-                    that.fileList.push({
-                        uid: file.name,
-                        name: file.name,
-                        status: 'done',
-                        url: '//' + data.Location
+                    let paramsData = new FormData();
+                    paramsData.append('advertiserId', advertiserId);
+                    paramsData.append('productId', productId);
+                    paramsData.append('projectId', projectId);
+                    paramsData.append('mediaId', mediaId);
+                    paramsData.append('operateType', operateType);
+                    paramsData.append('file', fileList[0]);
+                    paramsData.append('createUserId', this.userInfo().id);
+                    this.confirmLoading = true;
+                    postFileAction(urlAcount + '/finance/settLementController/settlementAccountImport', paramsData, {
+                        headers: {
+                            'Content-Type': 'multipart/form-data'
+                        }
+                    }).then(result => {
+                        if (result.code === 0) {
+                            this.$message.success(result.message);
+                            this.handlePolicyOperationCancel();
+                            this.handleInitTable();
+                        }
+                        else {
+                            this.$message.error(result.message);
+                        }
+                    }).catch(error => {
+                        console.log(error, 'eeee');
+                    }).finally(() => {
+                        this.confirmLoading = false;
                     });
-                    if (that.fileList.length > 1) {
-                        that.fileList = that.fileList.slice(-1);
-                    }
-                    const isZip = file.type.includes('xlxs');
-                    const fileOvesize = file.size > (1024 * 1024 * 1024);
-                    if (!isZip) {
-                        that.$message.error('只能上传xlxs格式的文件');
-                        return;
-                    }
-                    if (fileOvesize) {
-                        that.$message.error('文件大小不能超过1G');
-                        return;
-                    }
-                    // that.handleMd5(file);
                 }
-            );
-        },
-        // 上传确定按钮操作
-        handlePolicyOperationSure() {
-            console.log('上传确定按钮操作');
+                else {
+                    return false;
+                }
+            });
         },
         // 上传取消按钮操作
         handlePolicyOperationCancel() {
-            console.log('上传取消按钮操作');
+            this.policyOperationForm = {
+                advertiserId: undefined,
+                productId: undefined,
+                projectId: undefined,
+                mediaId: 1,
+                operateType: 1,
+                fileList: []
+            };
             this.policyOperationStatus = false;
         },
         // 删除操作
         handleSettleDel(list) {
-            console.log(list, '删除操作');
             let that = this;
             this.$confirm({
                 title: '提示',
-                content: '确认删除该条数据',
-                onOk() {}
+                content: '是否确认删除该条数据',
+                onOk() {
+                    getAction(urlAcount + '/finance/settLementController/deleteSettlementById', {id: list.id}).then(result => {
+                        if (result.code === 0) {
+                            that.handleInitTable();
+                            that.$message.success('删除成功');
+                        }
+                        else {
+                            that.$message.error(result.message);
+                        }
+                    }).catch(error => {
+                        console.log(error, 'eeee');
+                    });
+                }
             });
         },
         // 分页操作按钮
@@ -435,24 +619,54 @@ export default {
                 page: current,
                 size: pageSize
             };
-            // this.handleInitTable();
+            this.handleInitTable();
         },
         // table 开关 操作按钮
         handleSwitchChang(checked, data) {
-            console.log(checked, data, '------');
+            const paramsData = {
+                id: data.id,
+                status: checked ? 0 : 1
+            };
+            getAction(urlAcount + '/finance/settLementController/updSettlementStatusById', paramsData).then(result => {
+                if (result.code === 0) {
+                    this.$message.success(result.message);
+                    this.handleInitTable();
+                }
+                else {
+                    this.$message.error(result.message);
+                }
+            }).catch(error => {
+                console.log(error, 'eeee');
+            });
         },
         // 账户上传按钮
         handleUploadAccount() {
-            console.log('上传账户数据');
             this.policyOperationStatus = true;
         },
         // 查询的按钮
         handleQueryList() {
-            console.log(this.configForm, '搜索的按钮');
+            this.tablePag = {
+                page: 1,
+                size: 10
+            };
+            this.handleInitTable();
         },
         // 重置的按钮
         handleResetList() {
-            console.log(this.configForm, '重置的按钮');
+            this.configForm = {
+                advertiserName: '',
+                productName: '',
+                projectName: '',
+                accountName: '',
+                creativeSale: 2,
+                mediaId: 'no',
+                time: [moment().subtract(7, 'days').format('YYYY-MM-DD'), moment().format('YYYY-MM-DD')]
+            };
+            this.tablePag = {
+                page: 1,
+                size: 10
+            };
+            this.handleInitTable();
         }
     }
 };

+ 11 - 0
src/views/modules/settlement-information/settlement-information-server.js

@@ -0,0 +1,11 @@
+/**
+ * @file 账户配置API
+ * @author jiayufei
+ */
+
+//  export const urlAcount = 'http://api.tjyourong.com.cn'; // 线上
+//  export const urlAcount = 'http://gateway.tjyourong.com.cn'; // 测试
+//  export const urlAcount = 'http://192.168.1.43:9999'; // 子安
+ export const urlAcount = 'http://gateway.tjyourong.com.cn'; // 测试
+// export const urlAcount = 'http://192.168.1.8:9999'; // 学超
+ 

+ 1 - 1
src/views/modules/settlement-information/settlement-information.less

@@ -46,7 +46,7 @@
     }
 }
 /deep/ .information-modal-class {
-    width: 700px !important;
+    width: 750px !important;
     .upload-txt-rules {
         margin: 0;
     }

Fichier diff supprimé car celui-ci est trop grand
+ 587 - 173
src/views/modules/settlement-information/settlement-information.vue


+ 2 - 2
src/views/modules/user-manage-operation/user-manage-operation-server.js

@@ -5,6 +5,6 @@
 
  export const urlAcount = 'http://118.24.244.213:8808'; // 线上
  // export const urlAcount = 'http://apipre.tjyourong.com.cn'; // 预生产
-//  export const urlAcount = 'http://192.168.1.43:8080'; // 子安
+//  export const urlAcount = 'http://192.168.1.43:'; // 子安
 //  export const urlAcount = 'http://139.186.165.84:8808'; // 测试
-//  export const urlAcount = 'http://192.168.1.8:8080'; // 学超
+//  export const urlAcount = 'http://192.168.1.8:9999'; // 学超

+ 1 - 1
src/views/modules/workBench/placeOrder.vue

@@ -240,7 +240,7 @@
                              <a-form-model-item ref="project"  prop="project">
                                <a-select  style="width: 500px" v-model="form.project" show-search  option-filter-prop="children" placeholder="请选择关联项目">
                                     <a-select-option v-for="item in projectList" :key="item.projectId" :value='item.projectId'>
-                                        {{item.projectName+'_'+ (item.mediaId==1?'头条':'快手')+'_'+ item.userName}}
+                                        {{item.projectName+'_'+ (item.mediaId==1?'头条':'快手')}}
                                     </a-select-option>
                                 </a-select>
                             </a-form-model-item>

+ 4 - 4
src/views/system/modules/PasswordModal.vue

@@ -16,12 +16,12 @@
           <a-input placeholder="请输入用户账号" v-decorator="[ 'username', {}]" :readOnly="true"/>
         </a-form-item>
 
-        <a-form-item label="登密码" :labelCol="labelCol" :wrapperCol="wrapperCol" hasFeedback>
-          <a-input type="password" placeholder="请输入登密码" v-decorator="[ 'password', validatorRules.password]"/>
+        <a-form-item label="登密码" :labelCol="labelCol" :wrapperCol="wrapperCol" hasFeedback>
+          <a-input type="password" placeholder="请输入登密码" v-decorator="[ 'password', validatorRules.password]"/>
         </a-form-item>
 
         <a-form-item label="确认密码" :labelCol="labelCol" :wrapperCol="wrapperCol" hasFeedback>
-          <a-input type="password" @blur="handleConfirmBlur" placeholder="请重新输入登密码"
+          <a-input type="password" @blur="handleConfirmBlur" placeholder="请重新输入登密码"
                    v-decorator="[ 'confirmpassword', validatorRules.confirmpassword]"/>
         </a-form-item>
 
@@ -52,7 +52,7 @@
           },
           confirmpassword: {
             rules: [{
-              required: true, message: '请重新输入登密码!',
+              required: true, message: '请重新输入登密码!',
             }, {
               validator: this.compareToFirstPassword,
             }],

+ 4 - 4
src/views/system/modules/UserModal.vue

@@ -22,14 +22,14 @@
 				<a-input placeholder="请输入用户账号" v-decorator="['username', validatorRules.username]" :disabled="disableSubmit"/>
 				</a-form-item>
 				<template v-if="!model.id">
-				<a-form-item label="登密码" :labelCol="labelCol" :wrapperCol="wrapperCol">
-					<a-input type="password" placeholder="请输入登密码" v-decorator="['password', validatorRules.password]" :disabled="disableSubmit"/>
+				<a-form-item label="登密码" :labelCol="labelCol" :wrapperCol="wrapperCol">
+					<a-input type="password" placeholder="请输入登密码" v-decorator="['password', validatorRules.password]" :disabled="disableSubmit"/>
 				</a-form-item>
 				<a-form-item label="确认密码" :labelCol="labelCol" :wrapperCol="wrapperCol">
 					<a-input
 					type="password"
 					@blur="handleConfirmBlur"
-					placeholder="请重新输入登密码"
+					placeholder="请重新输入登密码"
 					v-decorator="['confirmpassword', validatorRules.confirmpassword]"
 					:disabled="disableSubmit"
 					/>
@@ -191,7 +191,7 @@ export default {
 				rules: [
 					{
 					required: true,
-					message: '请重新输入登密码!',
+					message: '请重新输入登密码!',
 					},
 					{
 					validator: this.compareToFirstPassword,

+ 10 - 7
src/views/user/Login.vue

@@ -15,7 +15,8 @@
           <a-form-item>
             <a-select v-model="creativeTag" @change="setData">
               <a-select-option value="huichuang">北京主公司</a-select-option>
-              <a-select-option value="jiaoyang">北京分公司</a-select-option>
+              <a-select-option value="jiaoyang">北京分公司1</a-select-option>
+              <a-select-option value="juyi">北京分公司2</a-select-option>
             </a-select>
             <div id="wx_reg" style="display: flex; justify-content: center; margin-top: 15px"></div>
             <div style="display: flex; justify-content: center; color: red; font-size: 16px">
@@ -23,7 +24,7 @@
             </div>
           </a-form-item>
         </a-tab-pane>
-        <a-tab-pane key="tab2" tab="账号密码登">
+        <a-tab-pane key="tab2" tab="账号密码登">
           <a-form-item>
             <a-input
               size="large"
@@ -74,7 +75,7 @@
         </a-tab-pane>
       </a-tabs>
       <a-form-item v-if="customActiveKey != 'tab1'">
-        <a-checkbox v-model="formLogin.rememberMe">自动登</a-checkbox>
+        <a-checkbox v-model="formLogin.rememberMe">自动登</a-checkbox>
         <router-link :to="{ name: 'alteration' }" class="forge-password" style="float: right"> 忘记密码 </router-link>
         <!--
         <router-link :to="{ name: 'register'}" class="forge-password" style="float: right;margin-right: 10px" >
@@ -102,7 +103,7 @@
         <span class="FSinfo">使用飞书快捷登录</span>
       </div> -->
       <!-- <div class="user-login-other">
-        <span>其他登方式</span>
+        <span>其他登方式</span>
         <a><a-icon class="item-icon" type="alipay-circle"></a-icon></a>
         <a><a-icon class="item-icon" type="taobao-circle"></a-icon></a>
         <a><a-icon class="item-icon" type="weibo-circle"></a-icon></a>
@@ -289,8 +290,10 @@ export default {
     setData() {
       if (this.creativeTag == 'huichuang') {
         this.appId = 'ww24b8a47826f5875f'
-      } else {
+      } else if (this.creativeTag == 'jiaoyang'){
         this.appId = 'wwef2e51064c0ac897'
+      }else if(this.creativeTag == 'juyi'){
+        this.appId = 'ww460c4ae74efe25c9'
       }
       this.$nextTick(() => {
         var url = ''
@@ -330,7 +333,7 @@ export default {
         remember_me: that.formLogin.rememberMe,
       }
 
-      // 使用账户密码登
+      // 使用账户密码登
       if (that.customActiveKey === 'tab2') {
         that.form.validateFields(
           ['username', 'password', 'inputCode'],
@@ -359,7 +362,7 @@ export default {
             }
           }
         )
-        // 使用手机号登
+        // 使用手机号登
       } else if (that.customActiveKey === 'tab3') {
         that.form.validateFields(
           ['mobile', 'captcha'],

+ 6 - 6
src/views/user/layer.vue

@@ -5,7 +5,7 @@
 <!--        :activeKey="customActiveKey"-->
 <!--        :tabBarStyle="{ textAlign: 'center', borderBottom: 'unset' }"-->
 <!--        @change="handleTabClick">-->
-<!--        <a-tab-pane key="tab1" tab="账号密码登">-->
+<!--        <a-tab-pane key="tab1" tab="账号密码登">-->
 <!--          <a-form-item>-->
 <!--            <a-input-->
 <!--              size="large"-->
@@ -49,7 +49,7 @@
 
 
 <!--        </a-tab-pane>-->
-<!--        <a-tab-pane key="tab2" tab="手机号登">-->
+<!--        <a-tab-pane key="tab2" tab="手机号登">-->
 <!--          <a-form-item>-->
 <!--            <a-input-->
 <!--              v-decorator="['mobile',validatorRules.mobile]"-->
@@ -85,7 +85,7 @@
 <!--      </a-tabs>-->
 
 <!--      <a-form-item>-->
-<!--        <a-checkbox v-model="formLogin.rememberMe">自动登</a-checkbox>-->
+<!--        <a-checkbox v-model="formLogin.rememberMe">自动登</a-checkbox>-->
 <!--        <router-link :to="{ name: 'alteration'}" class="forge-password" style="float: right;">-->
 <!--          忘记密码-->
 <!--        </router-link>-->
@@ -109,7 +109,7 @@
 <!--      </a-form-item>-->
 
 <!--      &lt;!&ndash; <div class="user-login-other">-->
-<!--        <span>其他登方式</span>-->
+<!--        <span>其他登方式</span>-->
 <!--        <a><a-icon class="item-icon" type="alipay-circle"></a-icon></a>-->
 <!--        <a><a-icon class="item-icon" type="taobao-circle"></a-icon></a>-->
 <!--        <a><a-icon class="item-icon" type="weibo-circle"></a-icon></a>-->
@@ -261,7 +261,7 @@
 <!--          remember_me: that.formLogin.rememberMe-->
 <!--        };-->
 
-<!--        // 使用账户密码登-->
+<!--        // 使用账户密码登-->
 <!--        if (that.customActiveKey === 'tab1') {-->
 <!--          that.form.validateFields(['username', 'password', 'inputCode'], {force: true}, (err, values) => {-->
 <!--            if (!err) {-->
@@ -279,7 +279,7 @@
 <!--              });-->
 <!--            }-->
 <!--          })-->
-<!--          // 使用手机号登-->
+<!--          // 使用手机号登-->
 <!--        } else {-->
 <!--          that.form.validateFields(['mobile', 'captcha'], {force: true}, (err, values) => {-->
 <!--            if (!err) {-->

+ 80 - 49
vue.config.js

@@ -1,5 +1,6 @@
 const path = require('path')
-
+const CompressionPlugin = require('compression-webpack-plugin')
+const TerserPlugin = require("terser-webpack-plugin");
 function resolve(dir) {
   return path.join(__dirname, dir)
 }
@@ -22,7 +23,32 @@ module.exports = {
     }
   },
   */
-  configureWebpack: {},
+  configureWebpack: config => {
+    if (process.env.NODE_ENV === 'production') {
+      return {
+        plugins: [new CompressionPlugin({
+          test: /\.js$|\.html$|\.css/,
+          threshold: 10240,
+          deleteOriginalAssets: false
+        }), new TerserPlugin({
+          cache: true,//降版本后添加
+          sourceMap: false,//降版本后添加
+          // 多进程
+          parallel: true,//降版本后添加
+          terserOptions: {
+            ecma: undefined,
+            warnings: false,
+            parse: {},
+            compress: {
+              drop_console: true,
+              drop_debugger: false,
+              pure_funcs: ['console.log'], // 移除console
+            },
+          },
+        }),]
+      }
+    }
+  },
 
   chainWebpack: (config) => {
     config.resolve.alias
@@ -33,7 +59,8 @@ module.exports = {
       .set('@comp', resolve('src/components'))
       .set('@views', resolve('src/views'))
       .set('@layout', resolve('src/layout'))
-      .set('@static', resolve('src/static'))
+      .set('@static', resolve('src/static'));
+    config.plugins.delete('prefetch')
   },
   pluginOptions: {
     'style-resources-loader': {
@@ -61,54 +88,58 @@ module.exports = {
     }
   },
 
-	devServer: {
-		hot:true,
-		// inline: true,
-		port: 8080,
-		open : true,
-		proxy: {
-			'/jeecg-boot': {
-				// target: 'http://192.168.1.8:8080', //请求本地 需要jeecg-boot后台项目  蒙蒙
-				// target: 'http://192.168.1.3:8080', //请求本地 需要jeecg-boot后台项目  蒙蒙
-				// target: 'http://192.168.0.59:8088', //请求本地 需要jeecg-boot后台项目  英豪
-				// target: 'http://192.168.1.62:7001', //请求本地 需要jeecg-boot后台项目  英豪
-				// target: 'http://192.168.6.162:9806', //请求本地 需要jeecg-boot后台项目  祚云
-				// target: 'http://192.168.1.43:8098', //请求本地 需要jeecg-boot后台项目  毕洁泉
-				// target: 'http://192.168.1.43:8088', //请求本地 需要jeecg-boot后台项目  毕洁泉
-				// target: 'http://192.168.1.43:8806', //请求本地 需要jeecg-boot后台项目  毕洁泉
-				// target: 'http://192.168.0.252:8098', //请求本地 需要jeecg-boot后台项目  毕洁泉
-				// target: 'http://192.168.1.219:8081', //请求本地 需要jeecg-boot后台项目  赵西安
-				// target: 'http://192.168.1.193:8080', //请求本地 需要jeecg-boot后台项目  李煜一
-				// target: 'http://192.168.1.193:31012', //请求本地 需要jeecg-boot后台项目  李煜一
-				//  target: 'http://api.tjyourong.com.cn', //请求本地 需要jeecg-boot后台项目
-				// target: 'https://trac.tjyourong.com.cn', //请求本地 需要jeecg-boot后台项目
-				// target: 'http://39.106.184.70:8088/', //请求本地 需要jeecg-boot后台项目
-				//  target: 'http://adsp.tjyourong.com.cn/', //请求本地 需要jeecg-boot后台项目
-				// target: 'http://192.168.1.251/', //请求本地 需要jeecg-boot后台项目
-				// target:'http://118.24.244.213:8804',
-				// target: 'http://192.168.1.43:9090', // 子安
-				target: 'http://192.168.1.8:9999', // 学超
-				// target:'http://gateway.tjyourong.com.cn', //测试
-				// target:'http://apipre.tjyourong.com.cn', //预生产
+  devServer: {
+    hot: true,
+    // inline: true,
+    port: 3000,
+    open: true,
+    proxy: {
+      '/jeecg-boot': {
+        // target: 'http://192.168.1.8:8080', //请求本地 需要jeecg-boot后台项目  蒙蒙
+        // target: 'http://192.168.1.3:8080', //请求本地 需要jeecg-boot后台项目  蒙蒙
+        // target: 'http://192.168.1.3:7001', //请求本地 需要jeecg-boot后台项目  蒙蒙
+        // target: 'http://192.168.0.59:8088', //请求本地 需要jeecg-boot后台项目  英豪
+        // target: 'http://192.168.1.62:7001', //请求本地 需要jeecg-boot后台项目  英豪
+        // target: 'http://192.168.6.162:9806', //请求本地 需要jeecg-boot后台项目  祚云
+        // target: 'http://192.168.1.43:8098', //请求本地 需要jeecg-boot后台项目  毕洁泉
+        // target: 'http://192.168.1.43:8088', //请求本地 需要jeecg-boot后台项目  毕洁泉
+        // target: 'http://192.168.1.43:8806', //请求本地 需要jeecg-boot后台项目  毕洁泉
+        // target: 'http://192.168.0.252:8098', //请求本地 需要jeecg-boot后台项目  毕洁泉
+        // target: 'http://192.168.1.219:8081', //请求本地 需要jeecg-boot后台项目  赵西安
+        // target: 'http://192.168.1.193:8080', //请求本地 需要jeecg-boot后台项目  李煜一
+        // target: 'http://192.168.1.193:31012', //请求本地 需要jeecg-boot后台项目  李煜一
+        // target: 'http://api.tjyourong.com.cn', //请求本地 需要jeecg-boot后台项目
+        // target: 'https://trac.tjyourong.com.cn', //请求本地 需要jeecg-boot后台项目
+        // target: 'http://39.106.184.70:8088/', //请求本地 需要jeecg-boot后台项目
+        //  target: 'http://adsp.tjyourong.com.cn/', //请求本地 需要jeecg-boot后台项目
+        // target: 'http://192.168.1.251/', //请求本地 需要jeecg-boot后台项目
+        // target:'http://118.24.244.213:8804',
+        target: 'http://192.168.1.43:9999', // 子安
+        // target: 'http://192.168.1.8:8806', // 学超
+        // target:'http://gateway.tjyourong.com.cn', //测试
+        // target:'http://apipre.tjyourong.com.cn', //预生产
+        // target: 'http://192.168.1.134:8080', //请求本地 需要jeecg-boot后台项目  周泽宇
+
+        // target:'http://gateway.tjyourong.com.cn/',//测试
 
-				ws: false,
+        ws: false,
 
-				// changeOrigin: true,
-				// pathRewrite: {
-				//     '/jeecg-boot': ''  //默认所有请求都加了jeecg-boot前缀,需要去掉
-				// }
-			},
-		},
-		// before(app) {
-		//     app.get('/seller', (req, res) => {
-		//         res.json({
-		//           errno: 0,
-		//           data: appData
-		//         })//接口返回json数据,上面配置的数据seller就赋值给data请求后调用
-		//     })
-		// }
-	},
+        // changeOrigin: true,
+        // pathRewrite: {
+        //     '/jeecg-boot': ''  //默认所有请求都加了jeecg-boot前缀,需要去掉
+        // }
+      },
+    },
+    // before(app) {
+    //     app.get('/seller', (req, res) => {
+    //         res.json({
+    //           errno: 0,
+    //           data: appData
+    //         })//接口返回json数据,上面配置的数据seller就赋值给data请求后调用
+    //     })
+    // }
+  },
 
   lintOnSave: undefined,
-//   publicPath:'./',
+  //   publicPath:'./',
 }