mo 4 éve
szülő
commit
cb67dfda4c
87 módosított fájl, 2394 hozzáadás és 937 törlés
  1. 0 0
      dist/index.html
  2. 0 0
      dist/static/css/app.939af1dd.css
  3. 0 0
      dist/static/css/chunk-00bbf359.6127d66d.css
  4. 1 0
      dist/static/css/chunk-053cc0f4.c2c17723.css
  5. 0 0
      dist/static/css/chunk-08036b87.753ee7da.css
  6. 0 1
      dist/static/css/chunk-2928a062.ed85bd95.css
  7. 0 0
      dist/static/css/chunk-332df63f.0246ee66.css
  8. 0 0
      dist/static/css/chunk-3bc574e4.06cf5e65.css
  9. 0 0
      dist/static/css/chunk-3ca72746.36a10612.css
  10. 0 0
      dist/static/css/chunk-4b815175.80f14b06.css
  11. 0 1
      dist/static/css/chunk-5a16ff9d.ef0673e3.css
  12. 0 1
      dist/static/css/chunk-5b96ae80.a9332e3e.css
  13. 0 1
      dist/static/css/chunk-60aeb093.a93bcaf5.css
  14. 1 0
      dist/static/css/chunk-68c14758.85a0f69b.css
  15. 1 0
      dist/static/css/chunk-73def078.065d01ba.css
  16. 1 0
      dist/static/css/chunk-92f8ad10.0fcbe2d0.css
  17. 0 0
      dist/static/css/chunk-bba048e0.74b3f337.css
  18. 0 0
      dist/static/css/chunk-c7aca304.2ca677c6.css
  19. 1 0
      dist/static/css/chunk-de072096.d5db26c0.css
  20. 1 0
      dist/static/css/chunk-e74928f0.6992dd43.css
  21. 1 0
      dist/static/css/chunk-fbfb83d8.ffdb4678.css
  22. 0 0
      dist/static/js/app.c508d881.js
  23. 0 0
      dist/static/js/chunk-00bbf359.f4b509ed.js
  24. 0 0
      dist/static/js/chunk-053cc0f4.5735d58e.js
  25. 0 0
      dist/static/js/chunk-08036b87.1212a69e.js
  26. 0 0
      dist/static/js/chunk-259e1df6.7adcc22c.js
  27. 0 0
      dist/static/js/chunk-2928a062.31d6beb7.js
  28. 0 0
      dist/static/js/chunk-332df63f.b3b42931.js
  29. 0 0
      dist/static/js/chunk-37b6e1ba.a88eaded.js
  30. 0 0
      dist/static/js/chunk-3bc574e4.e821cddb.js
  31. 0 0
      dist/static/js/chunk-3ca72746.7b8647ab.js
  32. 0 0
      dist/static/js/chunk-4b815175.d191b0fe.js
  33. 0 0
      dist/static/js/chunk-4d6710e9.5ae30b1f.js
  34. 0 0
      dist/static/js/chunk-4d6710e9.8b171ddf.js
  35. 0 0
      dist/static/js/chunk-573432f8.6cdfaf56.js
  36. 0 0
      dist/static/js/chunk-5a16ff9d.9d637826.js
  37. 0 0
      dist/static/js/chunk-5b96ae80.f831c3da.js
  38. 0 0
      dist/static/js/chunk-60aeb093.aa6b2d35.js
  39. 0 0
      dist/static/js/chunk-68c14758.865e1a85.js
  40. 0 0
      dist/static/js/chunk-6c1eedd5.3e68228f.js
  41. 0 0
      dist/static/js/chunk-73b01aee.6507dfe9.js
  42. 0 0
      dist/static/js/chunk-73def078.f1c0beaf.js
  43. 0 0
      dist/static/js/chunk-8e14da1a.89c4dede.js
  44. 0 0
      dist/static/js/chunk-92f8ad10.42421a30.js
  45. 0 0
      dist/static/js/chunk-bba048e0.e9b5efbb.js
  46. 0 0
      dist/static/js/chunk-c7aca304.39e0bd31.js
  47. 0 0
      dist/static/js/chunk-de072096.8c27dd30.js
  48. 0 0
      dist/static/js/chunk-df096ade.b48df2ce.js
  49. 0 0
      dist/static/js/chunk-e60d0406.63158a9b.js
  50. 0 0
      dist/static/js/chunk-e60d0406.d1296539.js
  51. 0 0
      dist/static/js/chunk-e74928f0.621afbe7.js
  52. 0 0
      dist/static/js/chunk-fb41c584.59feff5d.js
  53. 0 0
      dist/static/js/chunk-fbfb83d8.11fa979e.js
  54. 2 0
      src/App.vue
  55. BIN
      src/assets/images/pay_success.png
  56. 0 1
      src/components/filter-search/index.vue
  57. 5 1
      src/router/index.js
  58. 485 363
      src/views/businessManager/shopManager/shopList.vue
  59. 409 358
      src/views/businessManager/shopManager/shopOperation.vue
  60. 1 1
      src/views/main/abnormal/title.vue
  61. 0 1
      src/views/main/api.js
  62. 109 17
      src/views/main/baseinfo/curriculum.vue
  63. 14 1
      src/views/main/baseinfo/index.vue
  64. 0 1
      src/views/main/baseinfo/management.vue
  65. 1 0
      src/views/main/baseinfo/modals/searchHeader.vue
  66. 2 2
      src/views/main/baseinfo/student.vue
  67. 1 0
      src/views/main/index.vue
  68. 4 1
      src/views/main/teamSchedule/compontent/taskInfo.vue
  69. 2 0
      src/views/main/teamSchedule/compontent/taskList.vue
  70. 2 4
      src/views/main/teamSchedule/scheduleDetail.vue
  71. 13 1
      src/views/operateManager/serverIndexList.vue
  72. 176 0
      src/views/reaplceMusicPlayer/answerList.vue
  73. 14 1
      src/views/reaplceMusicPlayer/api.js
  74. 39 16
      src/views/reaplceMusicPlayer/index.vue
  75. 33 4
      src/views/reaplceMusicPlayer/modals/addUrl.vue
  76. 15 8
      src/views/reaplceMusicPlayer/modals/detail.vue
  77. 32 0
      src/views/setQuestions/api.js
  78. 209 0
      src/views/setQuestions/components/answerList.vue
  79. 103 0
      src/views/setQuestions/components/questionList.vue
  80. 199 0
      src/views/setQuestions/index.vue
  81. 264 0
      src/views/setQuestions/operation.vue
  82. 0 1
      src/views/studentManager/components/teamAndcourse.vue
  83. 90 75
      src/views/studentManager/studentList.vue
  84. 103 43
      src/views/teamBuild/signupList.vue
  85. 1 0
      src/views/teamDetail/componentCourse/teacherList.vue
  86. 54 28
      src/views/teamDetail/teamCourseList.vue
  87. 5 5
      vue.config.js

A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 0 - 0
dist/index.html


A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 0 - 0
dist/static/css/app.939af1dd.css


A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 0 - 0
dist/static/css/chunk-00bbf359.6127d66d.css


+ 1 - 0
dist/static/css/chunk-053cc0f4.c2c17723.css

@@ -0,0 +1 @@
+.el-button--primary[data-v-2a80fc1b],.el-button--primary[data-v-2a80fc1b]:active,.el-button--primary[data-v-2a80fc1b]:focus,.el-button--primary[data-v-2a80fc1b]:hover{background:#14928a;border-color:#14928a;color:#fff}.el-row[data-v-2a80fc1b]{margin-top:40px}.el-col[data-v-2a80fc1b]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-bottom:20px;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;margin-right:50%}.el-input-group[data-v-2a80fc1b]{width:200px;margin:0 20px}[data-v-2a80fc1b] .el-tree-node__content{height:40px!important}[data-v-2a80fc1b] .avatar-uploader .el-upload{border:1px dashed #d9d9d9;border-radius:6px;cursor:pointer;position:relative;overflow:hidden}.avatar-uploader .el-upload[data-v-2a80fc1b]:hover{border-color:#409eff}.avatar-uploader-icon[data-v-2a80fc1b]{font-size:28px;color:#8c939d;width:120px;height:120px;line-height:120px;text-align:center}.avatar[data-v-2a80fc1b]{width:120px;height:120px;display:block}

+ 0 - 0
dist/static/css/chunk-573432f8.753ee7da.css → dist/static/css/chunk-08036b87.753ee7da.css


+ 0 - 1
dist/static/css/chunk-2928a062.ed85bd95.css

@@ -1 +0,0 @@
-.el-button--primary[data-v-6d8ea27e],.el-button--primary[data-v-6d8ea27e]:active,.el-button--primary[data-v-6d8ea27e]:focus,.el-button--primary[data-v-6d8ea27e]:hover{background:#14928a;border-color:#14928a;color:#fff}.el-row[data-v-6d8ea27e]{margin-top:40px}.el-col[data-v-6d8ea27e]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-bottom:20px;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;margin-right:50%}.el-input-group[data-v-6d8ea27e]{width:200px;margin:0 20px}[data-v-6d8ea27e] .el-tree-node__content{height:40px!important}[data-v-6d8ea27e] .avatar-uploader .el-upload{border:1px dashed #d9d9d9;border-radius:6px;cursor:pointer;position:relative;overflow:hidden}.avatar-uploader .el-upload[data-v-6d8ea27e]:hover{border-color:#409eff}.avatar-uploader-icon[data-v-6d8ea27e]{font-size:28px;color:#8c939d;width:120px;height:120px;line-height:120px;text-align:center}.avatar[data-v-6d8ea27e]{width:120px;height:120px;display:block}

A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 0 - 0
dist/static/css/chunk-332df63f.0246ee66.css


A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 0 - 0
dist/static/css/chunk-3bc574e4.06cf5e65.css


A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 0 - 0
dist/static/css/chunk-3ca72746.36a10612.css


A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 0 - 0
dist/static/css/chunk-4b815175.80f14b06.css


+ 0 - 1
dist/static/css/chunk-5a16ff9d.ef0673e3.css

@@ -1 +0,0 @@
-.micon[data-v-9f957fa0]{position:absolute;top:3px;right:2px}.serverInfo[data-v-9f957fa0]{line-height:30px}.serverInfo span[data-v-9f957fa0]{color:#333;font-weight:700}.infoWrap[data-v-9f957fa0]{margin-top:30px}.infoWrap span[data-v-9f957fa0]{color:red;font-weight:400}.titleWrap[data-v-9f957fa0]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.m-container h2[data-v-9f957fa0]{-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}

+ 0 - 1
dist/static/css/chunk-5b96ae80.a9332e3e.css

@@ -1 +0,0 @@
-.newBand[data-v-344c6baa]{display:inline-block;margin-right:10px}.right-code .title[data-v-344c6baa]{font-size:18px;text-align:center;padding-bottom:8px}[data-v-344c6baa] .studentInfo .multiple.el-select{width:185px!important}

+ 0 - 1
dist/static/css/chunk-60aeb093.a93bcaf5.css

@@ -1 +0,0 @@
-.btnList[data-v-6079d03f]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.code-url[data-v-6079d03f]{margin-top:10px}

+ 1 - 0
dist/static/css/chunk-68c14758.85a0f69b.css

@@ -0,0 +1 @@
+.box-card[data-v-5481e2b6]{margin-bottom:10px}[data-v-5481e2b6] .el-collapse-item__header{background:#edeef0;color:#444;padding:0 10px}[data-v-5481e2b6] .el-collapse-item__wrap{border:0}[data-v-5481e2b6] .el-collapse-item__content{padding-bottom:0}.demo-table-expand[data-v-5481e2b6]{font-size:0}.demo-table-expand label[data-v-5481e2b6]{width:90px;color:#99a9bf}.demo-table-expand .el-form-item[data-v-5481e2b6]{margin-right:0;margin-bottom:0;width:100%}

+ 1 - 0
dist/static/css/chunk-73def078.065d01ba.css

@@ -0,0 +1 @@
+.question .el-select[data-v-4f1623fc]{width:100%!important}.top-tips[data-v-1b023cce]{color:grey;font-size:14px;padding:0 0 10px}.btn-submit[data-v-1b023cce]{width:90%;margin:20px 5%}.form-info[data-v-1b023cce]{margin:10px;width:auto;border-radius:5px}.questionName[data-v-1b023cce]{padding-top:5px;font-size:16px;color:#444;font-weight:500;line-height:1.5}[data-v-1b023cce] .el-checkbox-group,[data-v-1b023cce] .el-radio-group{width:100%}[data-v-1b023cce] .el-radio__input.is-checked+.el-radio__label{color:#606266}[data-v-1b023cce] .el-checkbox,[data-v-1b023cce] .el-radio{width:100%;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse;padding:10px 0}[data-v-1b023cce] .el-checkbox .el-checkbox__label,[data-v-1b023cce] .el-checkbox .el-radio__label,[data-v-1b023cce] .el-radio .el-checkbox__label,[data-v-1b023cce] .el-radio .el-radio__label{padding-left:0}[data-v-1b023cce] .el-button--primary{background:#01c1b5!important;border-color:#01c1b5!important}.resultModel .img[data-v-1b023cce]{width:145px;margin:0 auto;display:block}.resultModel .content[data-v-1b023cce]{font-size:20px;color:#1a1a1a;text-align:center;font-weight:500;padding-bottom:30px}[data-v-5c78edcf] .el-button--primary,[data-v-5c78edcf] .el-button--primary:active,[data-v-5c78edcf] .el-button--primary:focus,[data-v-5c78edcf] .el-button--primary:hover{background:#14928a;border-color:#14928a;color:#fff}[data-v-5c78edcf] .el-date-editor.el-input{width:100%!important}[data-v-5c78edcf] .el-select{width:98%!important}[data-v-5c78edcf] .el-collapse{border:0}[data-v-5c78edcf] .el-collapse-item__header,[data-v-5c78edcf] .el-collapse-item__wrap{background-color:#eef4f9}

+ 1 - 0
dist/static/css/chunk-92f8ad10.0fcbe2d0.css

@@ -0,0 +1 @@
+[data-v-61639206] .el-button--primary,[data-v-61639206] .el-button--primary:active,[data-v-61639206] .el-button--primary:focus,[data-v-61639206] .el-button--primary:hover{background:#14928a;border-color:#14928a;color:#fff}[data-v-61639206] .el-date-editor.el-input{width:100%!important}[data-v-61639206] .el-select{width:98%!important}

A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 0 - 0
dist/static/css/chunk-bba048e0.74b3f337.css


A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 0 - 0
dist/static/css/chunk-c7aca304.2ca677c6.css


+ 1 - 0
dist/static/css/chunk-de072096.d5db26c0.css

@@ -0,0 +1 @@
+[data-v-53a06626] .el-select{width:100%!important}[data-v-1fd47426] .el-table th{background:#edeef0}.btnList[data-v-cedc1522]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.code-url[data-v-cedc1522]{margin-top:10px}

+ 1 - 0
dist/static/css/chunk-e74928f0.6992dd43.css

@@ -0,0 +1 @@
+.micon[data-v-60b26d9a]{position:absolute;top:3px;right:2px}.serverInfo[data-v-60b26d9a]{line-height:30px}.serverInfo span[data-v-60b26d9a]{color:#333;font-weight:700}.infoWrap[data-v-60b26d9a]{margin-top:30px}.infoWrap span[data-v-60b26d9a]{color:red;font-weight:400}.titleWrap[data-v-60b26d9a]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.m-container h2[data-v-60b26d9a]{-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}

+ 1 - 0
dist/static/css/chunk-fbfb83d8.ffdb4678.css

@@ -0,0 +1 @@
+.newBand[data-v-2d1081da]{display:inline-block;margin-right:10px}.right-code .title[data-v-2d1081da]{font-size:18px;text-align:center;padding-bottom:8px}[data-v-2d1081da] .studentInfo .multiple.el-select{width:185px!important}

A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 0 - 0
dist/static/js/app.c508d881.js


A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 0 - 0
dist/static/js/chunk-00bbf359.f4b509ed.js


A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 0 - 0
dist/static/js/chunk-053cc0f4.5735d58e.js


A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 0 - 0
dist/static/js/chunk-08036b87.1212a69e.js


A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 0 - 0
dist/static/js/chunk-259e1df6.7adcc22c.js


A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 0 - 0
dist/static/js/chunk-2928a062.31d6beb7.js


A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 0 - 0
dist/static/js/chunk-332df63f.b3b42931.js


A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 0 - 0
dist/static/js/chunk-37b6e1ba.a88eaded.js


A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 0 - 0
dist/static/js/chunk-3bc574e4.e821cddb.js


A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 0 - 0
dist/static/js/chunk-3ca72746.7b8647ab.js


A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 0 - 0
dist/static/js/chunk-4b815175.d191b0fe.js


A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 0 - 0
dist/static/js/chunk-4d6710e9.5ae30b1f.js


A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 0 - 0
dist/static/js/chunk-4d6710e9.8b171ddf.js


A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 0 - 0
dist/static/js/chunk-573432f8.6cdfaf56.js


A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 0 - 0
dist/static/js/chunk-5a16ff9d.9d637826.js


A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 0 - 0
dist/static/js/chunk-5b96ae80.f831c3da.js


A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 0 - 0
dist/static/js/chunk-60aeb093.aa6b2d35.js


A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 0 - 0
dist/static/js/chunk-68c14758.865e1a85.js


A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 0 - 0
dist/static/js/chunk-6c1eedd5.3e68228f.js


A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 0 - 0
dist/static/js/chunk-73b01aee.6507dfe9.js


A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 0 - 0
dist/static/js/chunk-73def078.f1c0beaf.js


A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 0 - 0
dist/static/js/chunk-8e14da1a.89c4dede.js


A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 0 - 0
dist/static/js/chunk-92f8ad10.42421a30.js


A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 0 - 0
dist/static/js/chunk-bba048e0.e9b5efbb.js


A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 0 - 0
dist/static/js/chunk-c7aca304.39e0bd31.js


A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 0 - 0
dist/static/js/chunk-de072096.8c27dd30.js


A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 0 - 0
dist/static/js/chunk-df096ade.b48df2ce.js


A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 0 - 0
dist/static/js/chunk-e60d0406.63158a9b.js


A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 0 - 0
dist/static/js/chunk-e60d0406.d1296539.js


A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 0 - 0
dist/static/js/chunk-e74928f0.621afbe7.js


A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 0 - 0
dist/static/js/chunk-fb41c584.59feff5d.js


A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 0 - 0
dist/static/js/chunk-fbfb83d8.11fa979e.js


+ 2 - 0
src/App.vue

@@ -355,6 +355,8 @@ input[type="number"] {
 .horizontal-scrollbar {
   .el-scrollbar__wrap {
     overflow-x: hidden;
+    margin-bottom: -8px !important;
+    margin-right: -8px !important;
     .el-scrollbar__view {
       white-space: nowrap;
     }

BIN
src/assets/images/pay_success.png


+ 0 - 1
src/components/filter-search/index.vue

@@ -84,7 +84,6 @@ export default {
   },
   mounted() {
     this.initSearch = this.$route.query
-    // console.log(this.activeItems)
   },
   watch: {
     $route() {

+ 5 - 1
src/router/index.js

@@ -438,7 +438,11 @@ export const asyncRoutes = {
   // 报表中心 下载列表
   downList:()=>import('@/views/reportForm/downList'),
   // 乐器置换
-  reaplceMusicPlayer:()=>import('@/views/reaplceMusicPlayer')
+  reaplceMusicPlayer:()=>import('@/views/reaplceMusicPlayer'),
+  answerList:()=>import('@/views/reaplceMusicPlayer/answerList'),
+  // 问卷管理
+  setQuestions: () => import('@/views/setQuestions'),
+  questionOperation: () => import('@/views/setQuestions/operation'),
 }
 
 export default router

A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 485 - 363
src/views/businessManager/shopManager/shopList.vue


+ 409 - 358
src/views/businessManager/shopManager/shopOperation.vue

@@ -1,71 +1,80 @@
 <template>
   <div class="m-container">
     <h2>
-      <el-page-header @back="onCancel"
-                      :content="(pageTitle[pageType]) + '商品'"></el-page-header>
+      <el-page-header
+        @back="onCancel"
+        :content="pageTitle[pageType] + '商品'"
+      ></el-page-header>
     </h2>
 
     <div class="m-core">
-      <el-form :model="form"
-               :rules="rules"
-               ref="form"
-               label-width="120px">
-        <el-form-item label="货号"
-                      prop="sn">
-          <el-input v-model.trim="form.sn"
-                    :disabled="pageDisabled"
-                    placeholder="请输入货号"
-                    style="width: 400px"></el-input>
+      <el-form :model="form" :rules="rules" ref="form" label-width="120px">
+        <el-form-item label="货号" prop="sn">
+          <el-input
+            v-model.trim="form.sn"
+            :disabled="pageDisabled"
+            placeholder="请输入货号"
+            style="width: 400px"
+          ></el-input>
         </el-form-item>
-        <el-form-item label="品牌"
-                      prop="brand">
-          <el-input v-model.trim="form.brand"
-                    :disabled="pageDisabled"
-                    placeholder="请输入品牌"
-                    style="width: 400px"></el-input>
+        <el-form-item label="品牌" prop="brand">
+          <el-input
+            v-model.trim="form.brand"
+            :disabled="pageDisabled"
+            placeholder="请输入品牌"
+            style="width: 400px"
+          ></el-input>
         </el-form-item>
         <!-- <el-form-item label="备查货号" prop="supplyChannel" v-if="pageType == 'create'">
           <el-input v-model.trim="form.supplyChannel" placeholder="请输入备查货号" style="width: 400px"></el-input>
         </el-form-item> -->
-        <el-form-item label="商品名称"
-                      prop="name">
-          <el-input v-model.trim="form.name"
-                    placeholder="请输入商品名称"
-                    :disabled="pageDisabled"
-                    style="width: 400px"></el-input>
+        <el-form-item label="商品名称" prop="name">
+          <el-input
+            v-model.trim="form.name"
+            placeholder="请输入商品名称"
+            :disabled="pageDisabled"
+            style="width: 400px"
+          ></el-input>
         </el-form-item>
-        <el-form-item label="商品类型"
-                      prop="type">
-          <el-select v-model.trim="form.type"
-                     placeholder="请选择商品类型"
-                     :disabled="pageDisabled"
-                     style="width: 400px !important;">
-            <el-option v-for="(item, index) in goodsType"
-                       :key="index"
-                       :label="item.label"
-                       :value="item.value"></el-option>
+        <el-form-item label="商品类型" prop="type">
+          <el-select
+            v-model.trim="form.type"
+            placeholder="请选择商品类型"
+            :disabled="pageDisabled"
+            style="width: 400px !important"
+          >
+            <el-option
+              v-for="(item, index) in goodsType"
+              :key="index"
+              :label="item.label"
+              :value="item.value"
+            ></el-option>
           </el-select>
         </el-form-item>
-        <el-form-item label="商品分类"
-                      prop="goodsCategoryId">
-          <el-select v-model.trim="form.goodsCategoryId"
-                     placeholder="请选择商品分类"
-                     :disabled="pageDisabled"
-                     style="width: 400px !important;"
-                     filterable>
-            <el-option v-for="item in categoryList"
-                       :key="item.value"
-                       :label="item.label"
-                       :value="item.value">
+        <el-form-item label="商品分类" prop="goodsCategoryId">
+          <el-select
+            v-model.trim="form.goodsCategoryId"
+            placeholder="请选择商品分类"
+            :disabled="pageDisabled"
+            style="width: 400px !important"
+            filterable
+          >
+            <el-option
+              v-for="item in categoryList"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+            >
             </el-option>
           </el-select>
         </el-form-item>
-        <el-form-item label="商品型号"
-                      prop="specification">
-          <el-input v-model.trim="form.specification"
-                    placeholder="请输入商品型号"
-                    :disabled="pageDisabled"
-                    style="width: 400px"></el-input>
+        <el-form-item label="商品型号" prop="specification">
+          <el-input
+            v-model.trim="form.specification"
+            placeholder="请输入商品型号"
+            :disabled="pageDisabled"
+            style="width: 400px"
+          ></el-input>
         </el-form-item>
         <!-- <el-form-item label="内部库存" prop="stockCount">
           <el-input type="number" :disabled="pageType != 'create'" v-model.trim="form.stockCount" placeholder="请输入内部库存" style="width: 400px"></el-input>
@@ -73,124 +82,138 @@
         <el-form-item label="税务库存" prop="taxStockCount">
           <el-input type="number" :disabled="pageType != 'create'" v-model.trim="form.taxStockCount" placeholder="请输入税务库存" style="width: 400px"></el-input>
         </el-form-item> -->
-        <el-form-item label="库存类型"
-                      prop="stockType">
-          <el-select v-model="form.stockType"
-                     placeholder="请选择库存类型"
-                     :disabled="pageDisabled"
-                     style="width: 400px !important;">
-            <el-option v-for="(item, index) in stockType"
-                       :key="index"
-                       :label="item.label"
-                       :value="item.value"></el-option>
+        <el-form-item label="库存类型" prop="stockType">
+          <el-select
+            v-model="form.stockType"
+            placeholder="请选择库存类型"
+            :disabled="pageDisabled"
+            style="width: 400px !important"
+          >
+            <el-option
+              v-for="(item, index) in stockType"
+              :key="index"
+              :label="item.label"
+              :value="item.value"
+            ></el-option>
           </el-select>
         </el-form-item>
-        <el-form-item label="市场价"
-                      prop="marketPrice">
-          <el-input type="number"
-                    placeholder="请输入市场价"
-                    :disabled="pageDisabled"
-                    @mousewheel.native.prevent
-                    v-model.trim="form.marketPrice"
-                    style="width: 400px"></el-input>
+        <el-form-item label="市场价" prop="marketPrice">
+          <el-input
+            type="number"
+            placeholder="请输入市场价"
+            :disabled="pageDisabled"
+            @mousewheel.native.prevent
+            v-model.trim="form.marketPrice"
+            style="width: 400px"
+          ></el-input>
         </el-form-item>
-        <el-form-item label="零售价"
-                      prop="discountPrice">
-          <el-input type="number"
-                    placeholder="请输入零售价"
-                    @mousewheel.native.prevent
-                    :disabled="pageDisabled"
-                    v-model.trim="form.discountPrice"
-                    style="width: 400px"></el-input>
+        <el-form-item label="零售价" prop="discountPrice">
+          <el-input
+            type="number"
+            placeholder="请输入零售价"
+            @mousewheel.native.prevent
+            :disabled="pageDisabled"
+            v-model.trim="form.discountPrice"
+            style="width: 400px"
+          ></el-input>
         </el-form-item>
-        <el-form-item label="商品团购价"
-                      prop="groupPurchasePrice">
-          <el-input type="number"
-                    placeholder="请输入商品团购价"
-                    @mousewheel.native.prevent
-                    :disabled="pageDisabled"
-                    v-model.trim="form.groupPurchasePrice"
-                    style="width: 400px"></el-input>
+        <el-form-item label="商品团购价" prop="groupPurchasePrice">
+          <el-input
+            type="number"
+            placeholder="请输入商品团购价"
+            @mousewheel.native.prevent
+            :disabled="pageDisabled"
+            v-model.trim="form.groupPurchasePrice"
+            style="width: 400px"
+          ></el-input>
         </el-form-item>
-        <el-form-item label="学员是否展示"
-                      prop="clientShow">
-          <el-select v-model="form.clientShow"
-                     placeholder="请选择学员是否展示"
-                     style="width: 400px !important;">
-            <el-option label="是"
-                       :value="1"></el-option>
-            <el-option label="否"
-                       :value="0"></el-option>
+        <el-form-item label="学员是否展示" prop="clientShow">
+          <el-select
+            v-model="form.clientShow"
+            placeholder="请选择学员是否展示"
+            style="width: 400px !important"
+          >
+            <el-option label="是" :value="1"></el-option>
+            <el-option label="否" :value="0"></el-option>
           </el-select>
         </el-form-item>
-        <el-form-item label="教务端是否展示"
-                      prop="educationalShow">
-          <el-select v-model="form.educationalShow"
-                     placeholder="请选择教务端是否展示"
-                     style="width: 400px !important;">
-            <el-option label="是"
-                       :value="1"></el-option>
-            <el-option label="否"
-                       :value="0"></el-option>
+        <el-form-item label="教务端是否展示" prop="educationalShow">
+          <el-select
+            v-model="form.educationalShow"
+            placeholder="请选择教务端是否展示"
+            style="width: 400px !important"
+          >
+            <el-option label="是" :value="1"></el-option>
+            <el-option label="否" :value="0"></el-option>
           </el-select>
         </el-form-item>
-        <el-form-item label="乐团是否展示"
-                      prop="musicGroupShow">
-          <el-select v-model="form.musicGroupShow"
-                     placeholder="请选择乐团是否展示"
-                     style="width: 400px !important;">
-            <el-option label="是"
-                       :value="1"></el-option>
-            <el-option label="否"
-                       :value="0"></el-option>
+        <el-form-item label="乐团是否展示" prop="musicGroupShow">
+          <el-select
+            v-model="form.musicGroupShow"
+            placeholder="请选择乐团是否展示"
+            style="width: 400px !important"
+          >
+            <el-option label="是" :value="1"></el-option>
+            <el-option label="否" :value="0"></el-option>
           </el-select>
         </el-form-item>
-        <el-form-item label="是否库存预警"
-                      prop="stockWarning">
-          <el-select v-model="form.stockWarning"
-                     placeholder="请选择库存预警"
-                     :disabled="pageDisabled"
-                     style="width: 400px !important;">
-            <el-option label="是"
-                       :value="1"></el-option>
-            <el-option label="否"
-                       :value="0"></el-option>
+        <el-form-item label="是否库存预警" prop="stockWarning">
+          <el-select
+            v-model="form.stockWarning"
+            placeholder="请选择库存预警"
+            :disabled="pageDisabled"
+            style="width: 400px !important"
+          >
+            <el-option label="是" :value="1"></el-option>
+            <el-option label="否" :value="0"></el-option>
           </el-select>
         </el-form-item>
-        <el-form-item label="商品图片"
-                      prop="image">
-          <el-upload class="avatar-uploader"
-                     action="/api-web/uploadFile"
-                     accept=".jpg, .jpeg, .png"
-                     :headers="headers"
-                     :disabled="pageDisabled"
-                     :show-file-list="false"
-                     :on-success="handleAvatarSuccess"
-                     :before-upload="beforeAvatarUpload">
-            <img v-if="form.image"
-                 :src="form.image"
-                 class="avatar">
-            <i v-else
-               class="el-icon-plus avatar-uploader-icon"></i>
+        <el-form-item label="是否参与置换" prop="replacementShow">
+          <el-select
+            v-model="form.replacementShow"
+            placeholder="请选择库存预警"
+            :disabled="pageDisabled"
+            style="width: 400px !important"
+          >
+            <el-option label="是" :value="1"></el-option>
+            <el-option label="否" :value="0"></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="商品图片" prop="image">
+          <el-upload
+            class="avatar-uploader"
+            action="/api-web/uploadFile"
+            accept=".jpg, .jpeg, .png"
+            :headers="headers"
+            :disabled="pageDisabled"
+            :show-file-list="false"
+            :on-success="handleAvatarSuccess"
+            :before-upload="beforeAvatarUpload"
+          >
+            <img v-if="form.image" :src="form.image" class="avatar" />
+            <i v-else class="el-icon-plus avatar-uploader-icon"></i>
           </el-upload>
         </el-form-item>
-        <el-form-item label="商品描述"
-                      prop="brief">
-          <el-input type="textarea"
-                    v-model.trim="form.brief"
-                    :disabled="pageDisabled"
-                    style="width: 400px"></el-input>
+        <el-form-item label="商品描述" prop="brief">
+          <el-input
+            type="textarea"
+            v-model.trim="form.brief"
+            :disabled="pageDisabled"
+            style="width: 400px"
+          ></el-input>
         </el-form-item>
-        <el-form-item label="商品详情"
-                      prop="desc">
-          <el-input type="textarea"
-                    v-model.trim="form.desc"
-                    :disabled="pageDisabled"
-                    style="width: 400px"></el-input>
+        <el-form-item label="商品详情" prop="desc">
+          <el-input
+            type="textarea"
+            v-model.trim="form.desc"
+            :disabled="pageDisabled"
+            style="width: 400px"
+          ></el-input>
         </el-form-item>
         <el-form-item v-if="!pageDisabled">
-          <el-button @click="onSubmit('form')"
-                     type="primary">立即{{ pageType == "create" ? '创建' : '修改' }}</el-button>
+          <el-button @click="onSubmit('form')" type="primary"
+            >立即{{ pageType == "create" ? "创建" : "修改" }}</el-button
+          >
           <el-button @click="onReSet('form')">重置</el-button>
         </el-form-item>
       </el-form>
@@ -202,48 +225,46 @@ import {
   categoryListTree,
   goodsAdd,
   goodsUpdate,
-  goodsSingleQuery
-} from '@/api/businessManager'
-import {
-  getToken
-} from '@/utils/auth'
-import { goodsType, stockType } from '@/utils/searchArray'
+  goodsSingleQuery,
+} from "@/api/businessManager";
+import { getToken } from "@/utils/auth";
+import { goodsType, stockType } from "@/utils/searchArray";
 let validPrice = (rule, value, callback) => {
-  if (value == '' && typeof value == 'string' || value == null) {
-    callback(new Error('请输入金额'))
+  if ((value == "" && typeof value == "string") || value == null) {
+    callback(new Error("请输入金额"));
   } else if (value < 0) {
-    callback(new Error('输入金额必须大于或等于0'))
+    callback(new Error("输入金额必须大于或等于0"));
   } else if (value >= 100000) {
-    callback(new Error('输入金额必须小于100000'))
+    callback(new Error("输入金额必须小于100000"));
   } else {
-    callback()
+    callback();
   }
-}
+};
 let validStock = (rule, value, callback) => {
-  if (value == '' && typeof value == 'string' || value == null) {
-    callback(new Error('请输入库存'))
+  if ((value == "" && typeof value == "string") || value == null) {
+    callback(new Error("请输入库存"));
   } else if (value < 0) {
-    callback(new Error('库存数量必须大于或等于0'))
+    callback(new Error("库存数量必须大于或等于0"));
   } else {
-    callback()
+    callback();
   }
-}
+};
 export default {
-  name: 'shopOperation',
-  data () {
+  name: "shopOperation",
+  data() {
     return {
       goodsType: goodsType,
       stockType: stockType,
       categoryList: [],
       pageType: null,
       pageTitle: {
-        'create': '添加',
-        'update': '修改',
-        'look': '查看',
+        create: "添加",
+        update: "修改",
+        look: "查看",
       },
       pageDisabled: false,
       headers: {
-        Authorization: getToken()
+        Authorization: getToken(),
       },
       form: {
         sn: null,
@@ -265,186 +286,215 @@ export default {
         stockWarning: null,
         image: null,
         brief: null,
-        desc: null
+        desc: null,
+        replacementShow:null
+
       },
       rules: {
-        sn: [{ required: true, message: '请输入商品货号', trigger: 'blur' }],
-        brand: [{
-          required: true,
-          message: '请输入品牌',
-          trigger: 'blur'
-        },
-        {
-          min: 2,
-          max: 30,
-          message: '长度在 2 到 30 个字符',
-          trigger: 'blur'
-        }
+        sn: [{ required: true, message: "请输入商品货号", trigger: "blur" }],
+        brand: [
+          {
+            required: true,
+            message: "请输入品牌",
+            trigger: "blur",
+          },
+          {
+            min: 2,
+            max: 30,
+            message: "长度在 2 到 30 个字符",
+            trigger: "blur",
+          },
         ],
         supplyChannel: [
-          { required: true, message: '请输入备查货号', trigger: 'blur' }
+          { required: true, message: "请输入备查货号", trigger: "blur" },
         ],
-        name: [{
-          required: true,
-          message: '请输入商品名称',
-          trigger: 'blur'
-        },
-        {
-          min: 2,
-          max: 30,
-          message: '长度在 2 到 30 个字符',
-          trigger: 'blur'
-        }
+        name: [
+          {
+            required: true,
+            message: "请输入商品名称",
+            trigger: "blur",
+          },
+          {
+            min: 2,
+            max: 30,
+            message: "长度在 2 到 30 个字符",
+            trigger: "blur",
+          },
         ],
-        type: [{
-          required: true,
-          message: '请选择商品分类',
-          trigger: 'change'
-        }],
-        goodsCategoryId: [{
-          required: true,
-          message: '请选择商品类型',
-          trigger: 'change'
-        }],
-        specification: [{
-          required: true,
-          message: '请输入商品型号',
-          trigger: 'blur'
-        },
-        {
-          min: 2,
-          max: 30,
-          message: '长度在 2 到 30 个字符',
-          trigger: 'blur'
-        }
+        type: [
+          {
+            required: true,
+            message: "请选择商品分类",
+            trigger: "change",
+          },
+        ],
+        goodsCategoryId: [
+          {
+            required: true,
+            message: "请选择商品类型",
+            trigger: "change",
+          },
+        ],
+        specification: [
+          {
+            required: true,
+            message: "请输入商品型号",
+            trigger: "blur",
+          },
+          {
+            min: 2,
+            max: 30,
+            message: "长度在 2 到 30 个字符",
+            trigger: "blur",
+          },
         ],
         stockCount: [
-          { required: true, validator: validStock, trigger: 'blur' }
+          { required: true, validator: validStock, trigger: "blur" },
         ],
         taxStockCount: [
-          { required: true, validator: validStock, trigger: 'blur' }
+          { required: true, validator: validStock, trigger: "blur" },
         ],
         stockType: [
-          { required: true, message: '请选择库存类型', trigger: 'change' }
+          { required: true, message: "请选择库存类型", trigger: "change" },
+        ],
+        marketPrice: [
+          {
+            required: true,
+            validator: validPrice,
+            trigger: "blur",
+          },
+        ],
+        discountPrice: [
+          {
+            required: true,
+            validator: validPrice,
+            trigger: "blur",
+          },
+        ],
+        groupPurchasePrice: [
+          {
+            required: true,
+            validator: validPrice,
+            trigger: "blur",
+          },
         ],
-        marketPrice: [{
-          required: true,
-          validator: validPrice,
-          trigger: 'blur'
-        }],
-        discountPrice: [{
-          required: true,
-          validator: validPrice,
-          trigger: 'blur'
-        }],
-        groupPurchasePrice: [{
-          required: true,
-          validator: validPrice,
-          trigger: 'blur'
-        }],
         clientShow: [
-          { required: true, message: '请选择学员是否展示', trigger: 'change' }
+          { required: true, message: "请选择学员是否展示", trigger: "change" },
+        ],
+        replacementShow:[
+          { required: true, message: "是否参与乐器置换", trigger: "change" },
         ],
         educationalShow: [
-          { required: true, message: '请选择教务端是否展示', trigger: 'change' }
+          {
+            required: true,
+            message: "请选择教务端是否展示",
+            trigger: "change",
+          },
         ],
         musicGroupShow: [
-          { required: true, message: '请选择乐团是否展示', trigger: 'change' }
+          { required: true, message: "请选择乐团是否展示", trigger: "change" },
         ],
         stockWarning: [
-          { required: true, message: '请选择是否库存预警', trigger: 'change' }
+          { required: true, message: "请选择是否库存预警", trigger: "change" },
+        ],
+        image: [
+          {
+            required: true,
+            message: "请选择图片",
+            trigger: "blur",
+          },
+        ],
+        brief: [
+          {
+            required: true,
+            message: "请输入商品描述",
+            trigger: "blur",
+          },
+        ],
+        desc: [
+          {
+            required: true,
+            message: "请输入商品详情",
+            trigger: "blur",
+          },
         ],
-        image: [{
-          required: true,
-          message: '请选择图片',
-          trigger: 'blur'
-        }],
-        brief: [{
-          required: true,
-          message: '请输入商品描述',
-          trigger: 'blur'
-        }],
-        desc: [{
-          required: true,
-          message: '请输入商品详情',
-          trigger: 'blur'
-        }]
       },
       Fsearch: null,
       Frules: null,
       imageWidthM: 400,
-      imageHeightM: 400
-    }
+      imageHeightM: 400,
+    };
   },
-  mounted () {
-    this.init()
+  mounted() {
+    this.init();
   },
   methods: {
-    init () {
-      let query = this.$route.query
+    init() {
+      let query = this.$route.query;
       if (query.paramInfo) {
-        let paramInfo = JSON.parse(query.paramInfo)
-        this.pageType = paramInfo.type
-        this.id = paramInfo.id
+        let paramInfo = JSON.parse(query.paramInfo);
+        this.pageType = paramInfo.type;
+        this.id = paramInfo.id;
       }
-      this.pageDisabled = this.pageType == 'look' ? true : false
-      this.getList()
-      this.getCatagory()
+      this.pageDisabled = this.pageType == "look" ? true : false;
+      this.getList();
+      this.getCatagory();
     },
-    onSubmit (formName) {
+    onSubmit(formName) {
       this.$refs[formName].validate((valid) => {
         if (valid) {
-          if (this.pageType == 'create') {
-            if (this.form.id) { // 判断有没有Id,如果有则删除
-              delete this.form.id
+          if (this.pageType == "create") {
+            if (this.form.id) {
+              // 判断有没有Id,如果有则删除
+              delete this.form.id;
             }
-            this.form.status = 'NO' // 默认上架
-            goodsAdd(this.form).then(res => {
-              this.messageTips('添加', res)
-            })
-          } else if (this.pageType == 'update') {
-            goodsUpdate(this.form).then(res => {
-              this.messageTips('修改', res)
-            })
+            this.form.status = "NO"; // 默认上架
+            goodsAdd(this.form).then((res) => {
+              this.messageTips("添加", res);
+            });
+          } else if (this.pageType == "update") {
+            goodsUpdate(this.form).then((res) => {
+              this.messageTips("修改", res);
+            });
           }
         } else {
           this.$nextTick(() => {
-            let isError = document.getElementsByClassName('is-error')
+            let isError = document.getElementsByClassName("is-error");
             isError[0].scrollIntoView({
-              block: 'center',
-              behavior: 'smooth',
-            })
-          })
-          return false
+              block: "center",
+              behavior: "smooth",
+            });
+          });
+          return false;
         }
-      })
+      });
     },
-    messageTips (title, res) {
+    messageTips(title, res) {
       if (res.code == 200) {
-        this.$message.success(title + '成功')
-        this.$store.dispatch('delVisitedViews', this.$route)
+        this.$message.success(title + "成功");
+        this.$store.dispatch("delVisitedViews", this.$route);
         this.$router.push({
-          path: '/shopManager/shopManager',
+          path: "/shopManager/shopManager",
           query: {
             pageInfo: this.Frules,
-            searchForm: this.Fsearch
-          }
-        })
+            searchForm: this.Fsearch,
+          },
+        });
       } else {
-        this.$message.error(res.msg)
+        this.$message.error(res.msg);
       }
     },
-    onCancel () {
-      this.$store.dispatch('delVisitedViews', this.$route)
+    onCancel() {
+      this.$store.dispatch("delVisitedViews", this.$route);
       this.$router.push({
-        path: '/shopManager/shopManager'
-      })
+        path: "/shopManager/shopManager",
+      });
     },
-    onReSet (formName) {
-      this.$refs[formName].resetFields()
+    onReSet(formName) {
+      this.$refs[formName].resetFields();
     },
-    getList () {
-      if (this.pageType == 'create') {
+    getList() {
+      if (this.pageType == "create") {
         this.form = {
           sn: null,
           brand: null,
@@ -465,16 +515,15 @@ export default {
           stockWarning: null,
           image: null,
           brief: null,
-          desc: null
-        }
-        if (this.$refs['form']) {
-          this.$refs['form'].resetFields();
+          desc: null,
+        };
+        if (this.$refs["form"]) {
+          this.$refs["form"].resetFields();
         }
-
       } else {
-        goodsSingleQuery(this.id).then(res => {
+        goodsSingleQuery(this.id).then((res) => {
           if (res.code == 200) {
-            let result = res.data
+            let result = res.data;
             this.form = {
               id: result.id,
               sn: result.sn,
@@ -496,83 +545,85 @@ export default {
               stockWarning: result.stockWarning,
               image: result.image,
               brief: result.brief,
-              desc: result.desc
-            }
+              desc: result.desc,
+              replacementShow:result.replacementShow
+            };
           }
-        })
+        });
       }
-
     },
-    getCatagory () {
+    getCatagory() {
       categoryListTree({
         delFlag: 0,
-        rows: 9999
-      }).then(res => {
-        let result = res.data
+        rows: 9999,
+      }).then((res) => {
+        let result = res.data;
         if (res.code == 200) {
-          let tempArray = []
-          result.rows.forEach(row => {
+          let tempArray = [];
+          result.rows.forEach((row) => {
             tempArray.push({
               label: row.name,
-              value: row.id
-            })
-          })
-          this.categoryList = tempArray
+              value: row.id,
+            });
+          });
+          this.categoryList = tempArray;
         }
-      })
+      });
     },
-    handleAvatarSuccess (res, file) {
-      this.form.image = res.data.url
-
+    handleAvatarSuccess(res, file) {
+      this.form.image = res.data.url;
     },
-    beforeAvatarUpload (file) {
+    beforeAvatarUpload(file) {
       const imageType = {
-        'image/png': true,
-        'image/jpeg': true
-      }
-      const isImage = imageType[file.type]
-      const isLt2M = file.size / 1024 / 1024 < 2
-      const imageWidth = this.imageWidthM
-      const imageHeigh = this.imageHeightM
-      const _URL = window.URL || window.webkitURL
+        "image/png": true,
+        "image/jpeg": true,
+      };
+      const isImage = imageType[file.type];
+      const isLt2M = file.size / 1024 / 1024 < 2;
+      const imageWidth = this.imageWidthM;
+      const imageHeigh = this.imageHeightM;
+      const _URL = window.URL || window.webkitURL;
       const isSize = new Promise((resolve, reject) => {
-        const img = new Image()
+        const img = new Image();
         img.onload = function () {
-
           if (imageWidth && imageHeigh) {
-            this.width === imageWidth && this.height === imageHeigh ? resolve() : reject(`请上传${imageWidth}x${imageHeigh}尺寸图片`)
+            this.width === imageWidth && this.height === imageHeigh
+              ? resolve()
+              : reject(`请上传${imageWidth}x${imageHeigh}尺寸图片`);
           } else if (imageWidth && !imageHeigh) {
-            this.width === imageWidth ? resolve() : reject(`请上传宽为${imageWidth}的图片`)
+            this.width === imageWidth
+              ? resolve()
+              : reject(`请上传宽为${imageWidth}的图片`);
           } else if (!imageWidth && imageHeigh) {
-            this.height === imageHeigh ? resolve() : reject(`请上传高为${imageHeigh}的图片`)
+            this.height === imageHeigh
+              ? resolve()
+              : reject(`请上传高为${imageHeigh}的图片`);
+          } else {
+            resolve();
           }
-          else {
-            resolve()
-          }
-
-        }
-        img.src = _URL.createObjectURL(file)
+        };
+        img.src = _URL.createObjectURL(file);
       }).then(
         () => {
-          return file
+          return file;
         },
         (src) => {
           this.$message.error(src);
-          this.uploadImgLoading = false
-          return Promise.reject()
+          this.uploadImgLoading = false;
+          return Promise.reject();
         }
-      )
-      console.log(isSize)
+      );
+      console.log(isSize);
       if (!isImage) {
-        this.$message.error('只能上传图片格式!')
+        this.$message.error("只能上传图片格式!");
       }
       if (!isLt2M) {
-        this.$message.error('上传头像图片大小不能超过 2MB!')
+        this.$message.error("上传头像图片大小不能超过 2MB!");
       }
       return isImage && isLt2M && isSize;
     },
-  }
-}
+  },
+};
 </script>
 <style lang="scss" scoped>
 .el-button--primary {

+ 1 - 1
src/views/main/abnormal/title.vue

@@ -63,7 +63,7 @@ export default {
   overflow: hidden;
   display: flex;
   justify-content: space-between;
-  padding-right: 10px;
+  // padding-right: 10px;
   font-weight: bold;
   transition: all 0.3s;
   width: 100%;

+ 0 - 1
src/views/main/api.js

@@ -4,7 +4,6 @@ import request2 from '@/utils/request2'
 export const getIndex = data => request2({
   url: '/api-web/newIndex',
   params: data,
-  loading: false,
   method: 'get',
 })
 export const getInspectionItem = data => request2({

+ 109 - 17
src/views/main/baseinfo/curriculum.vue

@@ -10,7 +10,7 @@
         :isShowQuert="true"
       />
     </div>
-    <statistic class="statistic" :cols="0">
+    <statistic class="statistic" :cols="0" :col="5">
       <statistic-item
         v-for="(item, key) in items"
         :key="key"
@@ -77,6 +77,8 @@ export default {
       return {
         MUSIC_GROUP_COURSE: this.data["MUSIC_GROUP_COURSE"] || {},
         VIP_GROUP_COURSE: this.data["VIP_GROUP_COURSE"] || {},
+        VIP_GROUP_ONLINE_COURSE: this.data["VIP_GROUP_ONLINE_COURSE"] || {},
+        VIP_GROUP_OFFLINE_COURSE: this.data["VIP_GROUP_OFFLINE_COURSE"] || {},
         PRACTICE_GROUP_COURSE: this.data["PRACTICE_GROUP_COURSE"] || {},
       };
     },
@@ -110,11 +112,15 @@ export default {
     },
     chartDataForMoth() {
       const values = Object.values(this.items);
+      //   console.log(values)
+      // values['VIP_GROUP_COURSE'].forEach(item=>{
+      //     console.log(item.month)
+      //   })
       const months = {};
+
       for (const item of values) {
         for (const row of item.indexMonthData || []) {
           const key = this.$helpers.dayjs(row.month).format("YYYY-MM");
-
           if (!months[key]) {
             months[key] = {
               月份: key,
@@ -129,7 +135,7 @@ export default {
           }
         }
       }
-
+      console.log(Object.values(months));
       return {
         columns: ["月份", ...values.map((item) => item.title)],
         rows: Object.values(months),
@@ -145,13 +151,13 @@ export default {
         },
         yAxis: {
           //纵轴标尺固定
-          minInterval:1,
+          minInterval: 1,
           type: "value",
           scale: true,
           min: 0,
-            axisLabel:{
-            formatter:'{value}节'
-          }
+          axisLabel: {
+            formatter: "{value}节",
+          },
         },
         tooltip: {
           axisPointer: {
@@ -160,14 +166,42 @@ export default {
               color: "rgba(150,150,150,0.2)",
             },
           },
-
           formatter: (item) => {
-            return [
-              item[0].axisValueLabel,
+            let strArr = [];
+            let dotStr =
+              '<span style="display:inline-block;margin-right:5px;border-radius:10px;width:10px;height:10px;opacity:0;"></span>';
+            let array = [
               ...item.map(
                 (d) => `<br/>${d.marker}${d.seriesName}: ${d.value[1]}节`
               ),
-            ].join("");
+            ];
+            if (this.timer == "day") {
+              strArr = this.setVipDayDetail(item);
+            } else {
+              let vipDEtail = this.setVipMonthDetail();
+              item.forEach((i) => {
+                if (i.seriesName == "VIP课") {
+                  for (let items in vipDEtail[i.name]) {
+                    strArr.push({ name: items, num: vipDEtail[i.name][items] });
+                  }
+                }
+              });
+              strArr.sort(function (item1, item2) {
+                return item1.name.localeCompare(item2.name, "zh-CN");
+              });
+            }
+            let vipIndex = 0;
+            item.forEach((i, indx) => {
+              if (i.seriesName == "VIP课") {
+                vipIndex = indx;
+              }
+            });
+            array.splice(
+              vipIndex + 1,
+              0,
+              ...strArr.map((d) => `<br/>${dotStr}${d.name}: ${d.num}节`)
+            );
+            return [item[0].axisValueLabel, ...array].join("");
           },
         },
       };
@@ -181,28 +215,29 @@ export default {
       loading: false,
     };
   },
+  watch: {},
   methods: {
     changeValue(date) {
       // 请求更改数据
       this.mdate = date;
       this.isDayOrMoth(date);
+
       this.FetchDetail();
     },
     async FetchDetail() {
       this.loading = true;
-      const data = this.data;
+      let data = [];
       try {
         const { dates, ...rest } = this.search;
         const res = await getIndex({
           ...rest,
           ...getTimes(this.mdate, ["startDate", "endDate"]),
           dataTypes:
-            "MUSIC_GROUP_COURSE,VIP_GROUP_COURSE,PRACTICE_GROUP_COURSE",
+            "MUSIC_GROUP_COURSE,VIP_GROUP_COURSE,PRACTICE_GROUP_COURSE,VIP_GROUP_OFFLINE_COURSE,VIP_GROUP_ONLINE_COURSE",
         });
         for (const item of res.data) {
           // 再循环一遍
           for (const key in this.items) {
-
             if (item.dataType == key) {
               data[item.dataType] = {
                 ...item,
@@ -214,13 +249,10 @@ export default {
       } catch (error) {
         console.log(error);
       }
-
       this.loading = false;
-      this.dataInfo = data;
       this.$emit("resetDate", data);
     },
     isDayOrMoth(arr) {
-
       if (!arr || arr.length < 1) {
         this.timer = "day";
       } else {
@@ -232,6 +264,66 @@ export default {
           : (this.timer = "day");
       }
     },
+    setVipMonthDetail() {
+      console.log("调用");
+      const vipdetail = {};
+      let datas = this.items["VIP_GROUP_COURSE"]["indexMonthData"];
+      datas.forEach((item) => {
+        let str = item.extendInfo;
+        let strArr = [];
+        let strObj = {};
+        str.replace("/", "");
+        if (str) {
+          try {
+            strObj = JSON.parse(str);
+            // for (let item in strObj) {
+            //   strArr.push({ name: item, num: parseFloat(strObj[item]) });
+            // }
+          } catch (e) {
+            console.log(e);
+            str = "";
+          }
+        }
+        const key = this.$helpers.dayjs(item.month).format("YYYY-MM");
+        if (!vipdetail[key]) {
+          vipdetail[key] = strObj;
+        } else {
+          for (let element in strObj) {
+            if (vipdetail[key].hasOwnProperty(element)) {
+              vipdetail[key][element] += strObj[element];
+            } else {
+              vipdetail[key][element] = strObj[element];
+            }
+          }
+        }
+      });
+      return vipdetail;
+    },
+    setVipDayDetail(item) {
+      let strArr = [];
+      let str = "";
+      if (
+        this.items["VIP_GROUP_COURSE"]["indexMonthData"][item[0].dataIndex]
+          ?.extendInfo
+      ) {
+        str = this.items["VIP_GROUP_COURSE"]["indexMonthData"][
+          item[0].dataIndex
+        ]?.extendInfo;
+        str.replace("/", "");
+        try {
+          let strObj = JSON.parse(str);
+          for (let item in strObj) {
+            strArr.push({ name: item, num: strObj[item] });
+          }
+          // console.log(strArr)
+        } catch (e) {
+          console.log(e);
+          str = "";
+        }
+        // console.log(lodash.valuesIn(str))
+      }
+      return strArr;
+    },
   },
 };
 </script>

+ 14 - 1
src/views/main/baseinfo/index.vue

@@ -221,7 +221,20 @@ export default {
       }
     },
     resetDate(data) {
-      this.dataInfo = {...this.dataInfo,...data};
+      let arr = null
+      for(let item in data){
+        // console.log(item)
+        if(item =='VIP_GROUP_COURSE'){
+          console.log(data[item])
+          arr = data[item].indexMonthData
+        }
+        this.dataInfo[item] = data[item]
+
+      }
+
+
+      // console.log(this.dataInfo)
+      // this.dataInfo = {...this.dataInfo,...data};
     },
   },
 };

+ 0 - 1
src/views/main/baseinfo/management.vue

@@ -250,7 +250,6 @@ export default {
       } catch (error) {
         console.log(error);
       }
-      console.log(data)
       this.loading = false;
       this.$emit("resetDate", data);
     },

+ 1 - 0
src/views/main/baseinfo/modals/searchHeader.vue

@@ -75,6 +75,7 @@ export default {
       this.submitDate(this.date);
     },
     changeQuick(val) {
+
       let startDate;
       let endDate;
       if (val == "month") {

+ 2 - 2
src/views/main/baseinfo/student.vue

@@ -164,7 +164,7 @@ export default {
             };
             months[key][item.title] = row.percent;
           } else {
-            if (months[key][item.title]) {
+            if (months[key][item.title]&&item.dataType!='MUSIC_GROUP_STUDENT'&&item.dataType!='VIP_PRACTICE_STUDENT_NUM') {
               months[key][item.title] += parseFloat(row.percent);
             } else {
               months[key][item.title] = row.percent;
@@ -210,7 +210,7 @@ export default {
     },
     async FetchDetail() {
       this.loading = true;
-      const data = this.data;
+      let data = [];
       try {
         const { dates, ...rest } = this.search;
         const res = await getIndex({

+ 1 - 0
src/views/main/index.vue

@@ -138,6 +138,7 @@ export default {
       });
     },
     reloadItem() {
+      console.log('调用')
       if (this.$refs.teamSchedule) {
         this.$refs.teamSchedule.getList();
       }

+ 4 - 1
src/views/main/teamSchedule/compontent/taskInfo.vue

@@ -90,13 +90,14 @@ export default {
         endTimer:'',
         startTimer: '',
         musicGroupId: "",
+        userId:''
       },
       timerStr:''
     };
   },
   mounted() {
     this.checkTimes()
-
+        this.userId = this.$route.query.teacher;
     if (this.taskInfo) {
       this.taskForm.date = this.taskInfo.planStart;
       this.taskForm.startTimer = dayjs(this.taskInfo.planStart).format('HH:mm:ss')
@@ -151,6 +152,7 @@ export default {
                 planEnd,
                 itemId: this.itemId,
                 id: this.taskInfo.id,
+                userId:this.userId
               });
                 this.$message.success("提交成功");
               this.$emit("refreshList", this.taskForm.date);
@@ -166,6 +168,7 @@ export default {
                 planStart,
                 planEnd,
                 itemId: this.itemId,
+                userId:this.userId
               });
               this.$message.success("提交成功");
               this.$emit("refreshList", this.taskForm.date);

+ 2 - 0
src/views/main/teamSchedule/compontent/taskList.vue

@@ -82,6 +82,7 @@ export default {
     this.rangeStart = this.$route.query.startTime;
     this.rangeEnd = this.$route.query.endTime;
     this.userId = this.$route.query.teacher;
+     this.itemId = this.$route.query.itemId;
     this.getList();
   },
   methods: {
@@ -93,6 +94,7 @@ export default {
           userId: this.userId,
           page: this.rules.page,
           rows: this.rules.limit,
+          itemId:this.itemId
         });
         this.tableList = result.data.rows;
         this.rules.total = result.data.total;

+ 2 - 4
src/views/main/teamSchedule/scheduleDetail.vue

@@ -124,11 +124,10 @@ export default {
     };
   },
   async mounted() {
-    console.log('加载页面')
     this.init();
     // 获取乐团
     try {
-      const ruselt = await getMusicGroup({ organId: this.organId });
+      const ruselt = await getMusicGroup({ organId: this.organId,userId:this.userId });
       this.MusicGroupList = ruselt.data;
     } catch (e) {}
   },
@@ -164,6 +163,7 @@ export default {
           startTime: this.startTime,
           endTime: this.endTime,
           userId: this.userId,
+          itemId: this.itemId,
           page: 1,
           rows: 9999,
         });
@@ -230,7 +230,6 @@ export default {
     },
 
     drop(e) {
-      console.log(e)
       this.isNew = true;
       this.activeTask = null;
       this.taskStatus = true;
@@ -239,7 +238,6 @@ export default {
       event.preventDefault();
     },
     dragstart(e){
-      console.log(e)
     },
     submitInfo(val) {
       // 新增修改提交

+ 13 - 1
src/views/operateManager/serverIndexList.vue

@@ -56,7 +56,7 @@
 
         <el-form-item>
           <el-button
-            type="primary"
+             :type="isSearch ? 'primary' : 'info'"
             icon="el-icon-circle-plus-outline"
             @click="showMove = true"
             >更多选项</el-button
@@ -762,6 +762,18 @@ export default {
       }
     },
   },
+  computed:{
+    isSearch(){
+      return  this.searchForm.organIdList ||
+        this.searchForm.actualExercisesNumIsAchieve ||
+        this.searchForm.exercisesReplyNumIsAchieve ||
+        this.searchForm.exercisesMessageNumIsAchieve ||
+        this.searchForm.exercisesMessageTimelyNumIsAchieve ||
+        this.searchForm.existVipCourse||
+        this.searchForm.existPracticeCourse||
+        this.searchForm.workTimer?.length>0
+    }
+  }
 };
 </script>
 <style lang='scss' scoped>

+ 176 - 0
src/views/reaplceMusicPlayer/answerList.vue

@@ -0,0 +1,176 @@
+<template>
+<div class='m-container'>
+    <h2>
+      <el-page-header @back="onCancel" :content="titleName"></el-page-header>
+    </h2>
+    <div class="m-core">
+      <save-form
+        :inline="true"
+        ref="searchForm"
+        :model="searchForm"
+        @submit="search"
+        @reset="onReSet"
+      >
+        <el-form-item prop="search">
+          <el-input
+            v-model.trim="searchForm.search"
+            clearable
+            @keyup.enter.native="search"
+            placeholder="编号/姓名/手机号"
+          ></el-input>
+        </el-form-item>
+        <el-form-item>
+          <el-button native-type="submit" type="primary">搜索</el-button>
+          <el-button native-type="reset" type="danger">重置</el-button>
+          <el-button type="primary" @click="onExport" v-if="$helpers.permission('questionnaireUserResult/export')">导出</el-button>
+        </el-form-item>
+      </save-form>
+      <el-card class="box-card" v-for="item in tableList" :key="item.id">
+          <el-row>
+            <el-col :xs="24" :sm="24" :md="6" :lg="5" :xl="5">
+              <el-form label-position="left" inline label-width="90px" class="demo-table-expand">
+                <el-form-item label="学生编号">
+                  <span><copy-text>{{ item.userId}}</copy-text></span>
+                </el-form-item>
+                <el-form-item label="学生姓名">
+                  <span><copy-text>{{ item.username}}</copy-text></span>
+                </el-form-item>
+                <el-form-item label="学生手机号">
+                  <span><copy-text>{{ item.phone}}</copy-text></span>
+                </el-form-item>
+              </el-form>
+              <!-- <el-row :gutter="10" style="font-size: 14px">
+                <el-col :span="24" style="padding-bottom: 8px"><>学生编号:<copy-text>{{ item.userId}}</copy-text></el-col>
+                <el-col :span="24" style="padding-bottom: 8px">学生姓名:<copy-text>{{ item.username}}</copy-text></el-col>
+                <el-col :span="24" style="padding-bottom: 8px">学生手机号:<copy-text>{{ item.phone}}</copy-text></el-col>
+              </el-row> -->
+            </el-col>
+            <el-col :xs="24" :sm="24" :md="18" :lg="19" :xl="19">
+              <el-collapse>
+                <el-collapse-item title="查看答案" name="1">
+                  <div v-for="(o, index) in item.questionnaireResultDtoList" :key="index" class="text item">
+                    <el-alert :title="o.content" type="info" :closable="false"></el-alert>
+                    <div style="padding: 8px 20px; font-size: 14px;" v-if="o.answerValue || o.additionalValue">{{ o.answerValue ? o.answerValue : o.additionalValue }}</div>
+                    <!-- <div style="padding: 8px 20px; font-size: 14px;" v-else>未答题</div> -->
+                    <el-tag style="margin: 8px 20px; font-size: 14px;" type="danger" v-else>未答题</el-tag>
+                  </div>
+                </el-collapse-item>
+              </el-collapse>
+              <!-- <div v-for="(o, index) in item.questionnaireResultDtoList" :key="index" class="text item">
+                <el-alert :title="o.content" type="info" :closable="false"></el-alert>
+                <div style="padding: 8px 20px; font-size: 14px;">{{ o.answerValue }}</div>
+              </div> -->
+            </el-col>
+          </el-row>
+      </el-card>
+      <empty v-if="tableList.length <= 0" />
+      <pagination
+          sync
+          :total.sync="pageInfo.total"
+          :page.sync="pageInfo.page"
+          :limit.sync="pageInfo.limit"
+          :page-sizes="pageInfo.page_size"
+          @pagination="getList"
+        />
+    </div>
+</div>
+</template>
+<script>
+import { questionnaireUserResultQueryPage } from './api'
+import { Export } from '@/utils/downLoadFile'
+import pagination from "@/components/Pagination/index";
+export default {
+    name: 'operationQuestion',
+    components: { pagination },
+    data () {
+        let query = this.$route.query
+        let titleName = '问答详情'
+        return {
+            titleName: titleName,
+            id: query.id,
+            topicId: query.topicId,
+            searchForm: {
+              search: null,
+            },
+            tableList: [],
+            pageInfo: {
+              // 分页规则
+              limit: 10, // 限制显示条数
+              page: 1, // 当前页
+              total: 0, // 总条数
+              page_size: [10, 20, 40, 50], // 选择限制显示条数
+            },
+        }
+    },
+    async mounted () {
+      this.getList()
+    },
+    methods: {
+      search() {
+        this.pageInfo.page = 1;
+        this.getList();
+      },
+      onReSet() {
+        this.$refs.searchForm.resetFields();
+        this.search();
+      },
+      async getList() {
+        try {
+          let params = {
+            activeId: this.id,
+            activeType: 'REPLACEMENT',
+            page: this.pageInfo.page,
+            rows: this.pageInfo.limit,
+            ...this.searchForm
+          }
+          let result = await questionnaireUserResultQueryPage(params)
+          this.tableList = result.data.rows
+          this.pageInfo.total = result.data.total
+        } catch {
+
+        }
+      },
+      onCancel() {
+        this.$store.dispatch('delVisitedViews', this.$route)
+        this.$router.push({ path: '/otherManager/reaplceMusicPlayer' })
+      },
+      onExport() {
+        Export(this, {
+          url: '/api-web/questionnaireUserResult/export',
+          fileName: '问答详情.xls',
+          method: 'get',
+          params: { cooperationId: this.id }
+        }, '您确定导出问答详情?')
+      }
+    }
+}
+</script>
+<style lang="scss" scoped>
+.box-card {
+  margin-bottom: 10px;
+}
+/deep/.el-collapse-item__header {
+  background: #EDEEF0;
+  color: #444;
+  padding: 0 10px;
+}
+/deep/.el-collapse-item__wrap {
+  border: 0;
+}
+/deep/.el-collapse-item__content {
+  padding-bottom: 0;
+}
+
+.demo-table-expand {
+    font-size: 0;
+}
+.demo-table-expand label {
+  width: 90px;
+  color: #99a9bf;
+}
+.demo-table-expand .el-form-item {
+  margin-right: 0;
+  margin-bottom: 0;
+  width: 100%;
+}
+</style>

+ 14 - 1
src/views/reaplceMusicPlayer/api.js

@@ -67,6 +67,19 @@ export function updateInstrumentActivity (data) {
   })
 }
 
-// 导出
+export function questionnaireUserResultQueryPage (data) {
+  return request2({
+    url: api + `/questionnaireUserResult/queryPage`,
+    method: 'get',
+    params: data,
+  })
+}
 
+export function questionnaireQuestionQueryPage (data) {
+  return request2({
+    url: api + `/questionnaireQuestion/queryPage`,
+    method: 'get',
+    params: data,
+  })
+}
 

+ 39 - 16
src/views/reaplceMusicPlayer/index.vue

@@ -75,6 +75,11 @@
         >
           <el-table-column
             align="center"
+            prop="id"
+            label="编号"
+          ></el-table-column>
+          <el-table-column
+            align="center"
             prop="organName"
             label="分部"
           ></el-table-column>
@@ -90,7 +95,13 @@
               </div>
             </template>
           </el-table-column>
-          <el-table-column
+          <el-table-column align="center" label="问卷名称">
+            <template slot-scope="scope">
+              <span v-if="scope.row.topicTitle">{{ scope.row.topicTitle }}</span>
+              <el-tag style="margin: 8px 20px; font-size: 14px;" type="danger" v-else>无问卷</el-tag>
+            </template>
+          </el-table-column>
+          <!-- <el-table-column
             align="center"
             prop="showQuestion"
             label="是否参加问卷调查"
@@ -98,7 +109,7 @@
             <template slot-scope="scope">
               {{ scope.row.showQuestion ? '是' : '否' }}
             </template>
-          </el-table-column>
+          </el-table-column> -->
           <el-table-column
             align="center"
             prop="activeNum"
@@ -124,12 +135,11 @@
               <div>{{ scope.row.openPay ? "是" : "否" }}</div>
             </template>
           </el-table-column>
-          <el-table-column align="center" width="180px" label="操作">
+          <el-table-column align="center" width="250px" label="操作">
             <template slot-scope="scope">
               <div>
-                <el-button type="text" @click="lookDetail(scope.row)" v-if="permission('replacementInstrumentActivity/queryPage')"
-                  >详情</el-button
-                >
+                <el-button type="text" @click="lookDetail(scope.row)" v-if="permission('replacementInstrumentActivity/queryPage')">问卷详情</el-button>
+                <el-button type="text" @click="lookDetail(scope.row, 'answer')" v-if="permission('/reaplceMusicPlayer/answer')">问答详情</el-button>
                 <el-button
                   type="text"
                   @click="onCreateQRCode(scope.row, '调查链接')"
@@ -184,11 +194,12 @@
       title="详情"
       :visible.sync="detailVisible"
       width="1200px"
+      @close="getClose"
       v-if="detailVisible"
     >
       <detail ref="detail" @close="close" :detail="activeRow" />
       <div slot="footer">
-        <el-button type="primary" @click="detailVisible = false"
+        <el-button type="primary" @click="getClose"
           >确定</el-button
         >
       </div>
@@ -210,14 +221,11 @@
 </template>
 
 <script>
-import axios from "axios";
-import { getToken } from "@/utils/auth";
 import { permission } from "@/utils/directivePage";
 import { vaildStudentUrl, vaildTeachingUrl } from "@/utils/validate";
 import pagination from "@/components/Pagination/index";
 import addUrl from "./modals/addUrl";
 import detail from "./modals/detail";
-import load from "@/utils/loading";
 import { getReplacementList, openPayReplacement } from "./api";
 import { Export } from '@/utils/downLoadFile'
 import cleanDeep from 'clean-deep'
@@ -298,10 +306,15 @@ export default {
       this.makeUrlVisible = false;
       this.detailVisible = false;
     },
+    getClose() {
+      this.detailVisible = false
+      this.getList()
+    },
     async onExport() {
       const { search, ...rest } = this.searchForm;
       let obj = {
         ...rest,
+        // activeType: 'REPLACEMENT',
         page: this.rules.page,
         rows: this.rules.limit,
         cooperationOrganIdOrName:search
@@ -317,9 +330,19 @@ export default {
         "您确定导出乐器置换列表"
       );
     },
-    lookDetail(row) {
-      this.activeRow = row;
-      this.detailVisible = true;
+    lookDetail(row, type) {
+      if(type == 'answer') {
+        this.$router.push({
+          path: '/reaplceMusicPlayer/answer',
+          query: {
+            id: row.id,
+            topicId: row.topicId
+          }
+        })
+      } else {
+        this.activeRow = row;
+        this.detailVisible = true;
+      }
     },
     onCreateQRCode(row, name) {
       // 生成链接
@@ -341,7 +364,7 @@ export default {
         //   });
         let str;
         if (name == "调查链接") {
-          let returnUrl = vaildStudentUrl() + `/#/questionnaire?` + encodeURIComponent(encode(`o=${row.organId}&c=${row.cooperationOrganId}`));
+          let returnUrl = vaildStudentUrl() + `/#/questionnaire?` + encodeURIComponent(encode(`id=${row.id}`));
           // console.log(returnUrl)
           // let tempUrl =
           //   vaildStudentUrl() +
@@ -350,9 +373,9 @@ export default {
         } else if (name == "统计链接") {
           str =
             vaildTeachingUrl() +
-            `/#/questionStatistics?o=${row.organId}&c=${row.cooperationOrganId}`;
+            `/#/questionStatistics?o=${row.organId}&c=${row.cooperationOrganId}&id=${row.id}`;
         } else if(name == '缴费链接') {
-          str = vaildStudentUrl() + `/#/questionGoodsSale?` + encodeURIComponent(encode(`cid=${row.cooperationOrganId}`));
+          str = vaildStudentUrl() + `/#/questionGoodsSale?` + encodeURIComponent(encode(`rid=${row.id}`));
         }
         // vaildTeachingUrl
         // this.qrcode.makeCode(

+ 33 - 4
src/views/reaplceMusicPlayer/modals/addUrl.vue

@@ -1,6 +1,6 @@
 <template>
   <div>
-    <el-form :model="form" label-width="120px" ref="form">
+    <el-form :model="form" label-width="80px" ref="form">
       <el-form-item
         label="分部"
         prop="organId"
@@ -42,6 +42,22 @@
         </el-select>
       </el-form-item>
       <el-form-item
+        label="选择问卷"
+      >
+        <el-select
+          v-model.trim="form.topicId"
+          filterable
+          clearable
+        >
+          <el-option v-for="item in topicList" :key="item.id" :label="item.title" :value="item.id"></el-option>
+        </el-select>
+      </el-form-item>
+      <el-alert
+        title="若不选择问卷,则直接跳转乐器选购页面"
+        :closable="false"
+        type="error">
+      </el-alert>
+      <!-- <el-form-item
         label="是否参与调查"
         prop="showQuestion"
         :rules="[{ required: true, message: '请选择是否参与调查' }]"
@@ -54,24 +70,34 @@
           <el-option label="是" :value="1"></el-option>
           <el-option label="否" :value="0"></el-option>
         </el-select>
-      </el-form-item>
+      </el-form-item> -->
     </el-form>
   </div>
 </template>
 <script>
 import { queryByOrganId } from "@/api/systemManage";
 import { addReplacement } from "../api"
+import { questionnaireTopicQueryPage } from '../../setQuestions/api'
 export default {
   data() {
     return {
       form: {
         organId: "",
         school: "",
-        showQuestion: 1,
+        topicId: null,
       },
       cooperationList: [],
+      topicList: []
     };
   },
+  async mounted() {
+    try {
+      let res = await questionnaireTopicQueryPage({ page: 1, rows: 999, status: 1 })
+      this.topicList = res.data.rows
+    } catch {
+      //
+    }
+  },
   methods: {
     changeSection(val) {
       this.form.school = "";
@@ -85,7 +111,7 @@ export default {
       this.$refs.form.validate( async(res) => {
         if (res) {
           try{
-          const res = await addReplacement({cooperationOrganId:this.form.school,organId:this.form.organId, showQuestion: this.form.showQuestion})
+          const res = await addReplacement({cooperationOrganId:this.form.school,organId:this.form.organId, topicId: this.form.topicId})
           this.$message.success('生成链接成功')
            this.$emit('getList')
           this.$emit('close')
@@ -100,4 +126,7 @@ export default {
 };
 </script>
 <style lang="scss" scoped>
+/deep/.el-select {
+  width: 100% !important;
+}
 </style>

+ 15 - 8
src/views/reaplceMusicPlayer/modals/detail.vue

@@ -47,7 +47,7 @@
           ></el-option>
         </el-select>
       </el-form-item>
-      <el-form-item prop="hasYesFirstAnswer">
+      <!-- <el-form-item prop="hasYesFirstAnswer">
         <el-select
           v-model.trim="searchForm.hasYesFirstAnswer"
           filterable
@@ -57,7 +57,7 @@
           <el-option label="是" :value="1"></el-option>
           <el-option label="否" :value="0"></el-option>
         </el-select>
-      </el-form-item>
+      </el-form-item> -->
       <el-form-item prop="hasInstrumentsId">
         <el-select
           v-model.trim="searchForm.hasInstrumentsId"
@@ -76,9 +76,10 @@
     </el-form>
     <div class="tableWrap">
       <el-table
-        style="width: 100%"
+        style="width: 100% !important"
         :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
         :data="tableList"
+        max-height="500"
       >
         <el-table-column
           align="center"
@@ -95,12 +96,12 @@
           prop="mobileNo"
           label="联系电话"
         ></el-table-column>
-        <el-table-column
+        <!-- <el-table-column
           align="center"
           prop="question1"
           label="是否参加市赛"
         >
-        </el-table-column>
+        </el-table-column> -->
         <el-table-column
           align="center"
           label="是否置换"
@@ -204,7 +205,7 @@ export default {
   data() {
     return {
       searchForm: {
-        cooperationOrganId: "",
+        cooperationId: "",
         specification: "",
         search: "",
         subjectId: "",
@@ -230,7 +231,7 @@ export default {
   },
   methods: {
     async init() {
-      this.searchForm.cooperationOrganId = this.detail.cooperationOrganId;
+      this.searchForm.cooperationId = this.detail.id;
       await this.$store.dispatch("setSubjects");
       this.getList();
     },
@@ -256,7 +257,7 @@ export default {
     },
     onReSet() {
       this.$refs.searchForm.resetFields();
-      this.searchForm.cooperationOrganId = this.detail.cooperationOrganId;
+      this.searchForm.cooperationId = this.detail.id;
       this.search();
     },
     resetMusic(row) {
@@ -296,3 +297,9 @@ export default {
   },
 };
 </script>
+
+<style lang="less" scoped>
+/deep/.el-table th {
+  background: #edeef0;
+}
+</style>

+ 32 - 0
src/views/setQuestions/api.js

@@ -0,0 +1,32 @@
+import request2 from '@/utils/request2'
+
+export const questionnaireTopicQueryPage = data => request2({
+    url: '/api-web/questionnaireTopic/queryPage',
+    params: data,
+    method: 'get',
+})
+
+export const questionnaireTopicGetDetail = data => request2({
+    url: '/api-web/questionnaireTopic/getDetail',
+    params: data,
+    method: 'get',
+})
+
+export const questionnaireTopicAdd = data => request2({
+    url: '/api-web/questionnaireTopic/add',
+    data,
+    method: 'post'
+})
+
+export const questionnaireTopicUpdate = data => request2({
+    url: '/api-web/questionnaireTopic/update',
+    data,
+    method: 'post'
+})
+
+export const questionnaireTopicUpdateStatus = data => request2({
+    url: '/api-web/questionnaireTopic/updateStatus',
+    data,
+    method: 'post',
+    requestType: 'form'
+})

+ 209 - 0
src/views/setQuestions/components/answerList.vue

@@ -0,0 +1,209 @@
+<template>
+	<div>
+        <div class="questions" v-if="questionList.length > 0"  v-show="!resultStatus">
+            <div class="top-tips">{{ form.title }}</div>
+            <el-card class="box-card">
+                <div slot="header" class="clearfix">
+                    <span class="questionName">{{ questionList[currentIndex - 1]['content'] }}</span>
+                </div>
+                <el-radio-group v-model="check" v-if="questionList[currentIndex - 1]['type'] == 'radio'">
+                    <div class="" v-for="(item) in questionList[currentIndex - 1]['questionnaireQuestionItemList']" :key="item.id">
+                        <el-radio :label="item.id">{{item.answerValue}}</el-radio>
+                    </div>
+                </el-radio-group>
+                <el-checkbox-group v-model="checkBox" v-if="questionList[currentIndex - 1]['type'] == 'checkbox'">
+                    <el-checkbox  v-for="(item) in questionList[currentIndex - 1]['questionnaireQuestionItemList']" :key="item.id" :label="item.id">{{ item.answerValue }}</el-checkbox>
+                </el-checkbox-group>
+                <el-input
+                    v-if="questionList[currentIndex - 1]['type'] == 'textarea'"
+                    type="textarea"
+                    style="border: 0;"
+                    :autosize="{ minRows: 3, maxRows: 6}"
+                    placeholder="请输入其它意见"
+                    v-model="textarea">
+                </el-input>
+            </el-card>
+            <el-button size="large" type="primary" v-if="questionList[currentIndex - 1]['type'] == 'radio'" block round class="btn-submit" color="#01C1B5" :disabled="!check && !!isRequire" @click="onSubmit">提交</el-button>
+            <el-button size="large" type="primary" v-if="questionList[currentIndex - 1]['type'] == 'checkbox'" block round class="btn-submit" color="#01C1B5" :disabled="checkBox.length <= 0 && !!isRequire" @click="onSubmit">提交</el-button>
+            <el-button size="large" type="primary" v-if="questionList[currentIndex - 1]['type'] == 'textarea'" block round class="btn-submit" color="#01C1B5" :disabled="!textarea && !!isRequire" @click="onSubmit">提交</el-button>
+        </div>
+
+        <div class="resultModel" v-show="resultStatus">
+            <img src="@/assets/images/pay_success.png" class="img" alt="">
+            <p class="content">感谢您的参与!</p>
+            <el-button size="large" type="primary" round class="btn-submit" @click="onSubmitClose">确认</el-button>
+        </div>
+
+	</div>
+</template>
+
+<script>
+	export default {
+		name: 'question',
+        props: ['form', 'close'],
+		data() {
+			return {
+                currentIndex: 1,
+                questionList: [],
+                check: null,
+                isRequire: 1,
+                checkBox: [],
+                textarea: null,
+                checkList: [],
+                resultStatus: false
+			}
+		},
+		async mounted() {
+            try {
+                this.questionList = this.form.questionnaireQuestionList || []
+                console.log(this.questionList)
+                this.isRequire = this.questionList[this.currentIndex - 1].isRequire
+            } catch {
+                //
+            }
+		},
+		methods: {
+            toggle(index) {
+                let selectList = this.questionList[this.currentIndex - 1]
+                if(selectList.type == 'radio') {
+                    this.check = index
+                } else if(selectList.type == 'checkbox') {
+                    this.$refs.checkboxes[index].toggle()
+                }
+            },
+            onSubmit() {
+                let selectList = this.questionList[this.currentIndex - 1]
+                if(selectList.type == 'radio' && selectList.isRequire && !this.check) {
+                    this.$message.error('请回答当前问题')
+                    return
+                } else if(selectList.type == 'checkbox' && selectList.isRequire && this.checkBox.length <= 0) {
+                    this.$message.error('请回答当前问题')
+                    return
+                } else if(selectList.type == 'textarea' && selectList.isRequire && !this.textarea) {
+                    this.$message.error('请回答当前问题')
+                    return
+                }
+
+                let answerList = selectList.questionnaireQuestionItemList || [] //当前题的选项
+                let currentIsOver = 0 // 是否终止答题
+                answerList.forEach(item => {
+                    if(selectList.type == 'radio' && this.check == item.id) {
+                        currentIsOver = item.isOver
+                    } else if(selectList.type == 'checkbox' && this.checkBox.includes(item.id) && !currentIsOver) {
+                        currentIsOver = item.isOver
+                    }
+                })
+
+                // 判断是否在题目列表里面
+                if(this.currentIndex <= this.questionList.length) {
+                    if(selectList.type == 'radio') {
+                        this.checkList[this.currentIndex - 1] = {
+                            questionnaireQuestionId: selectList.id,
+                            questionnaireQuestionItemIdList: this.check
+                        }
+                        this.check = null
+                    } else if(selectList.type == 'checkbox') {
+                        this.checkList[this.currentIndex - 1] = {
+                            questionnaireQuestionId: selectList.id,
+                            questionnaireQuestionItemIdList: this.checkBox.join(',')
+                        }
+                        this.checkBox = []
+                    } else if(selectList.type == 'textarea') {
+                        this.checkList[this.currentIndex - 1] = {
+                            questionnaireQuestionId: selectList.id,
+                            additionalValue: this.textarea
+                        }
+                        this.textarea = null
+                    }
+
+                    // 1 为终止答题
+                    if(currentIsOver) {
+                        this.onConfirm()
+                        return
+                    }
+
+                    this.check = null
+                    if(this.currentIndex == this.questionList.length) {
+                        this.saveKey()
+                        return
+                    }
+
+                    this.currentIndex++
+                }
+            },
+            saveKey() {
+                // this.$message.info('谢谢参与')
+                this.resultStatus = true
+            },
+            async onConfirm() {
+                // this.$message.info('谢谢参与')
+                this.resultStatus = true
+            },
+            onSubmitClose() {
+                this.close()
+            }
+		}
+	}
+</script>
+
+<style lang="less" scoped>
+.top-tips {
+    color: #808080;
+    font-size: 14px;
+    padding: 0 0 10px;
+}
+
+.btn-submit {
+    width: 90%;
+    margin: 20px 5%;
+}
+
+.form-info {
+    margin: 10px;
+    width: auto;
+    border-radius: 5px;
+}
+.questionName {
+    padding-top: 5px;
+    font-size: 16px;
+    color: #444;
+    font-weight: 500;
+    line-height: 1.5;
+}
+/deep/.el-radio-group, /deep/.el-checkbox-group {
+    width: 100%;
+}
+/deep/.el-radio__input.is-checked+.el-radio__label {
+    color: #606266;
+}
+/deep/.el-radio, /deep/.el-checkbox {
+    width: 100%;
+    display: flex;
+    justify-content: space-between;
+    flex-direction: row-reverse;
+    padding: 10px 0;
+    .el-radio__label, .el-checkbox__label {
+        padding-left: 0;
+    }
+}
+/deep/.el-button--primary {
+    background: #01c1b5 !important;
+    border-color: #01c1b5 !important;
+}
+
+.resultModel {
+    .img {
+        width: 145px;
+        margin: 0 auto;
+        display: block;
+        // padding-top: 50px;
+    }
+    .content {
+        font-size: 20px;
+        color: #1A1A1A;
+        text-align: center;
+        font-weight: 500;
+        padding-bottom: 30px;
+    }
+}
+</style>

+ 103 - 0
src/views/setQuestions/components/questionList.vue

@@ -0,0 +1,103 @@
+<template>
+<el-form :model="form" ref="form" label-width="100px" class="question">
+    <el-row>
+        <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
+            <el-form-item label="题目类型" prop="type" :rules="[{ required: true, message: '请选择题目类型', trigger: 'change' }]">
+                <el-select v-model="form.type" placeholder="请选择题目类型" :disabled="disabled">
+                    <el-option label="单选" value="radio"></el-option>
+                    <el-option label="多选" value="checkbox"></el-option>
+                    <el-option label="问答" value="textarea"></el-option>
+                </el-select>
+            </el-form-item>
+        </el-col>
+        <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
+            <el-form-item label="是否必填" prop="isRequire" :rules="[{ required: true, message: '请选择是否必填', trigger: 'change' }]">
+                <el-select v-model="form.isRequire" placeholder="请选择是否必填" :disabled="disabled">
+                    <el-option label="是" :value="1"></el-option>
+                    <el-option label="否" :value="0"></el-option>
+                </el-select>
+            </el-form-item>
+        </el-col>
+    </el-row>
+    <el-form-item label="题目" prop="content" :rules="[{ required: true, message: '请输入题目', trigger: 'blur' }]">
+        <el-input type="textarea" placeholder="请输入题目" :disabled="disabled" v-model="form.content" show-word-limit maxlength="200" :autosize="{ minRows: 2, maxRows: 4}"></el-input>
+    </el-form-item>
+
+    <template v-if="form.type != 'textarea'">
+        <div v-for="(questionnaireQuestionItemList, index) in form.questionnaireQuestionItemList" :key="index">
+            <el-form-item :label="'选项' + (index + 1)"
+                style="display: inline-block;"
+                :prop="'questionnaireQuestionItemList.' + index + '.answerValue'"
+                :rules="[{ required: true, message: '请输入选项内容', trigger: 'change' }]">
+                <el-input type="text" placeholder="请输入选项内容" :disabled="disabled" maxlength="100" v-model="questionnaireQuestionItemList.answerValue"></el-input>
+            </el-form-item>
+            <el-form-item label="是否终止答题"
+                style="display: inline-block;"
+                label-width="120px"
+                :prop="'questionnaireQuestionItemList.' + index + '.isOver'"
+                :rules="[{ required: true, message: '请选择是否终止答题', trigger: 'change' }]">
+                <el-radio-group v-model="questionnaireQuestionItemList.isOver" :disabled="disabled" style="margin-right: 20px">
+                    <el-radio :label="1">是</el-radio>
+                    <el-radio :label="0">否</el-radio>
+                </el-radio-group>
+            </el-form-item>
+            <div style="display: inline-block;">
+                <el-tooltip class="item" effect="dark" content="向下移动" placement="top">
+                    <el-button icon="el-icon-top" circle size="small" @click="moveDown(form.questionnaireQuestionItemList, index)" :disabled="index == 0 || disabled"></el-button>
+                </el-tooltip>
+                <el-tooltip class="item" effect="dark" content="向下移动" placement="top">
+                    <el-button icon="el-icon-bottom" circle size="small" @click="moveUp(form.questionnaireQuestionItemList, index)" :disabled="form.questionnaireQuestionItemList.length <= 1 || form.questionnaireQuestionItemList.length == (index + 1) || disabled"></el-button>
+                </el-tooltip>
+                <el-tooltip class="item" effect="dark" content="删除" placement="top">
+                    <el-button icon="el-icon-delete" circle size="small" @click="onDelete(form.questionnaireQuestionItemList, index)" :disabled="form.questionnaireQuestionItemList.length <= 1 || disabled"></el-button>
+                </el-tooltip>
+            </div>
+        </div>
+        <el-form-item>
+            <el-button style="width: 200px" type="default" icon="el-icon-plus" :disabled="form.questionnaireQuestionItemList.length >= 10 || disabled" @click="addQuestionItem(form.questionnaireQuestionItemList)">新增选项</el-button>
+        </el-form-item>
+    </template>
+</el-form>
+</template>
+<script>
+export default {
+    props: ['form', 'type', 'disabled'],
+    data () {
+        return {
+        }
+    },
+    mounted () {
+    },
+    methods: {
+        // 添加题目选项
+        addQuestionItem(questionnaireQuestionItemLists) {
+            questionnaireQuestionItemLists.push({})
+        },
+        // 向上移动
+        moveUp(arr, index) {
+            arr.splice(index, 1, ...arr.splice(index + 1, 1, arr[index]));
+        },
+        // 向下移动
+        moveDown(arr, index) {
+            arr.splice(index - 1, 1, ...arr.splice(index, 1, arr[index - 1]));
+
+        },
+        // 删除选项
+        onDelete(arr, index) {
+            if(this.type == 'update') {
+                if(this.form.delQuestionnaireQuestionItemIdList) {
+                    this.form.delQuestionnaireQuestionItemIdList.push(arr[index].id)
+                } else {
+                    this.form.delQuestionnaireQuestionItemIdList = [arr[index].id]
+                }
+            }
+            arr.splice(index, 1)
+        }
+    }
+}
+</script>
+<style lang="scss" scoped>
+.question .el-select {
+    width: 100% !important;
+}
+</style>

+ 199 - 0
src/views/setQuestions/index.vue

@@ -0,0 +1,199 @@
+<template>
+  <div class='m-container'>
+    <h2>
+      <div class="squrt"></div>问卷管理
+    </h2>
+    <div class="m-core">
+        <el-button type="primary" @click="onQuestionOperation('create')"
+           v-if="$helpers.permission('/operateManager/questionOperation/create')"
+           class='newBand'>添加问卷</el-button>
+        <save-form :inline="true"
+               @submit="search"
+               @reset="onReSet"
+               ref="searchForm"
+               :model="searchForm">
+        <el-form-item prop="search">
+            <el-input
+                type="text"
+                clearable
+                v-model="searchForm.search"
+                placeholder="问卷编号或名称"
+            ></el-input>
+        </el-form-item>
+        <el-form-item prop="status">
+          <el-select v-model="searchForm.status"
+                     filterable
+                     placeholder="请选择问卷状态"
+                     clearable>
+            <el-option label="启用" :value="1"></el-option>
+            <el-option label="停用" :value="0"></el-option>
+          </el-select>
+        </el-form-item>
+
+        <el-form-item>
+          <el-button type="danger" native-type="submit">搜索</el-button>
+          <el-button native-type="reset" type="primary">重置</el-button>
+        </el-form-item>
+      </save-form>
+      <!-- 列表 -->
+      <div class="tableWrap">
+        <el-table :data='tableList'
+                  :header-cell-style="{background:'#EDEEF0',color:'#444'}">
+          <el-table-column align='center'
+                           prop="id"
+                           label="问卷编号">
+            <template slot-scope="scope">
+              <copy-text>{{ scope.row.id }}</copy-text>
+            </template>
+          </el-table-column>
+          <el-table-column align='center'
+                           prop="title"
+                           label="问卷名称">
+            <template slot-scope="scope">
+              <!-- <copy-text>{{ scope.row.title }}</copy-text> -->
+              <overflow-text :text="scope.row.title" ></overflow-text>
+            </template>
+          </el-table-column>
+          <el-table-column align='center'
+                           prop="status"
+                           label="状态">
+            <template slot-scope="scope">
+              {{ scope.row.status ? '开启' : '关闭' }}
+            </template>
+          </el-table-column>
+          <el-table-column align='center'
+                           label="操作">
+            <template slot-scope="scope">
+              <el-button @click="onQuestionOperation('look', scope.row)"
+                         v-if="$helpers.permission('/operateManager/questionOperation/detail')"
+                         type="text">详情</el-button>
+              <el-button @click="onOperation(scope.row)"
+                         v-if="$helpers.permission(scope.row.status ? 'questionnaireTopic/updateStatus/stop' : 'questionnaireTopic/updateStatus/start')"
+                         type="text">{{ scope.row.status ? '停用' : '启用' }}</el-button>
+              <!-- 启用的问卷不能修改 -->
+              <el-button @click="onQuestionOperation('update', scope.row)"
+                         v-if="$helpers.permission('/operateManager/questionOperation/update') && !scope.row.status"
+                         type="text">修改</el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+        <pagination sync :total.sync="pageInfo.total"
+                    :page.sync="pageInfo.page"
+                    :limit.sync="pageInfo.limit"
+                    :page-sizes="pageInfo.page_size"
+                    @pagination="getList" />
+      </div>
+    </div>
+
+  </div>
+</template>
+<script>
+import pagination from '@/components/Pagination/index'
+import { questionnaireTopicQueryPage, questionnaireTopicUpdateStatus } from './api'
+export default {
+  name: 'branchSetting',
+  components: { pagination },
+  data () {
+    return {
+        searchForm: {
+            search: null,
+            status: null
+        },
+        tableList: [],
+        pageInfo: {
+            // 分页规则
+            limit: 10, // 限制显示条数
+            page: 1, // 当前页
+            total: 0, // 总条数
+            page_size: [10, 20, 40, 50] // 选择限制显示条数
+        },
+        organId: null,
+    }
+  },
+  mounted () {
+    this.getList()
+  },
+  methods: {
+    getList () {
+      questionnaireTopicQueryPage({
+        rows: this.pageInfo.limit,
+        page: this.pageInfo.page,
+        ...this.searchForm
+      }).then(res => {
+        if (res.code == 200 && res.data) {
+          this.tableList = res.data.rows
+          this.pageInfo.total = res.data.total
+        }
+      })
+    },
+    onQuestionOperation(type, row) {
+        let str = '问卷'
+        if(type == 'create') {
+          str = '添加' + str
+        } else if(type == 'update') {
+          str = '修改' + str
+        } else if(type == 'look') {
+          str = '查看' + str
+        }
+        let params = {
+          type
+        }
+        if(type == 'update' || type == 'look') {
+          params.id = row.id
+        }
+        this.$router.push({
+            path: '/operateManager/questionOperation',
+            query: params
+        }, (router) => {
+            router.meta.title = str;
+        })
+    },
+    async onOperation(row, type) {
+      let str = row.status ? '停用' : '启用'
+      this.$confirm(`是否${str}该问卷?`, '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      }).then(async () => {
+        try {
+            let status = row.status ? 0 : 1
+            await questionnaireTopicUpdateStatus({ topicId: row.id, status: status })
+            this.$message.success(str + '成功')
+            this.getList()
+        } catch {
+          //
+        }
+      })
+    },
+    search() {
+      this.pageInfo.page = 1;
+      this.getList();
+    },
+    onReSet() {
+      this.$refs['searchForm'].resetFields();
+      this.search();
+    },
+
+  }
+}
+</script>
+<style lang="scss" scoped>
+/deep/.el-button--primary {
+  background: #14928a;
+  border-color: #14928a;
+  color: #fff;
+  &:hover,
+  &:active,
+  &:focus {
+    background: #14928a;
+    border-color: #14928a;
+    color: #fff;
+  }
+}
+/deep/.el-date-editor.el-input {
+  width: 100% !important;
+}
+/deep/.el-select {
+  width: 98% !important;
+}
+</style>

+ 264 - 0
src/views/setQuestions/operation.vue

@@ -0,0 +1,264 @@
+<template>
+<div class='m-container'>
+    <h2>
+      <el-page-header @back="onCancel" :content="titleName"></el-page-header>
+    </h2>
+    <div class="m-core">
+        <el-row>
+            <el-col :xs="24" :sm="24" :md="24" :lg="18" :xl="18">
+                <el-form ref="form" :model="form" label-width="80px">
+                    <el-form-item label="问卷名称" prop="title" :rules="[{ required: true, message: '请输入问卷名称', trigger: 'blur' }]">
+                        <el-input v-model="form.title" placeholder="请输入问卷名称" :disabled="disabled"></el-input>
+                    </el-form-item>
+                </el-form>
+            </el-col>
+        </el-row>
+        <el-row>
+            <el-col :xs="24" :sm="24" :md="24" :lg="18" :xl="18" v-for="(item, index) in form.questionnaireQuestionList" :key="index" style="padding: 15px 22px; background-color: #eef4f9; margin-bottom: 10px;">
+                <el-row type="flex" align="middle" style="flex: 1 auto; padding-bottom: 15px;">
+                    <el-col :span="12">
+                        <span style="font-size: 18px;width: 80px; text-align: right;display: inline-block;">问题{{ index + 1 }}</span>
+                    </el-col>
+                    <el-col :span="12" style="text-align: right; padding-right: 15px;">
+                        <el-tooltip class="item" effect="dark" content="向下移动" placement="top">
+                            <el-button icon="el-icon-top" circle size="small" @click.stop="moveDown(form.questionnaireQuestionList, index)" :disabled="index == 0 || disabled"></el-button>
+                        </el-tooltip>
+                        <el-tooltip class="item" effect="dark" content="向下移动" placement="top">
+                            <el-button icon="el-icon-bottom" circle size="small" @click.stop="moveUp(form.questionnaireQuestionList, index)" :disabled="form.questionnaireQuestionList.length <= 1 || form.questionnaireQuestionList.length == (index + 1) || disabled"></el-button>
+                        </el-tooltip>
+                        <el-tooltip class="item" effect="dark" content="删除" placement="top">
+                            <el-button icon="el-icon-delete" circle size="small" @click.stop="onDelete(form.questionnaireQuestionList, index)" :disabled="form.questionnaireQuestionList.length <= 1 || disabled"></el-button>
+                        </el-tooltip>
+                    </el-col>
+                </el-row>
+                <question-list ref="questions" :type="type" :form="item" :disabled="disabled" />
+            </el-col>
+            <!-- <el-collapse v-model="activeName">
+                <el-col :xs="24" :sm="24" :md="24" :lg="18" :xl="18" v-for="(item, index) in form.questionnaireQuestionList" :key="index" style="padding: 15px 22px; background-color: #eef4f9; margin-bottom: 10px;">
+                <el-collapse-item style="background-color: #eef4f9;" :name="index">
+                    <template slot="title">
+                        <el-row type="flex" align="middle" style="flex: 1 auto;">
+                            <el-col :span="12">
+                                <span style="font-size: 18px;width: 80px; text-align: right;display: inline-block;">问题{{ index + 1 }}</span>
+                            </el-col>
+                            <el-col :span="12" style="text-align: right; padding-right: 15px;">
+                                <el-tooltip class="item" effect="dark" content="向下移动" placement="top">
+                                    <el-button icon="el-icon-top" circle size="small" @click.stop="moveDown(form.questionnaireQuestionList, index)" :disabled="index == 0"></el-button>
+                                </el-tooltip>
+                                <el-tooltip class="item" effect="dark" content="向下移动" placement="top">
+                                    <el-button icon="el-icon-bottom" circle size="small" @click.stop="moveUp(form.questionnaireQuestionList, index)" :disabled="form.questionnaireQuestionList.length <= 1 || form.questionnaireQuestionList.length == (index + 1)"></el-button>
+                                </el-tooltip>
+                                <el-tooltip class="item" effect="dark" content="删除" placement="top">
+                                    <el-button icon="el-icon-delete" circle size="small" @click.stop="onDelete(form.questionnaireQuestionList, index)" :disabled="form.questionnaireQuestionList.length <= 1"></el-button>
+                                </el-tooltip>
+                            </el-col>
+                        </el-row>
+                    </template>
+                    <question-list ref="questions" :type="type" :form="item" />
+                </el-collapse-item>
+                </el-col>
+            </el-collapse> -->
+        </el-row>
+        <el-row style="padding-bottom: 15px;">
+            <el-col :xs="24" :sm="24" :md="24" :lg="18" :xl="18" style="text-align: center;">
+                <el-button style="width: 100%" type="default" :disabled="disabled" @click="addQuestionItem(form.questionnaireQuestionList)" icon="el-icon-plus">新增问题</el-button>
+            </el-col>
+        </el-row>
+        <el-button type="primary" :disabled="disabled" @click="onSubmit">{{ type == 'create' ? '生成问卷' : '修改问卷' }}</el-button>
+        <el-button @click="onReset" :disabled="disabled">重置</el-button>
+        <el-button @click="onPreview">预览</el-button>
+
+        <el-dialog title="问卷题目"
+               :close-on-click-modal="false"
+               :visible.sync="questionStatus"
+               v-if="questionStatus"
+               width="375px">
+            <answer-list :form="form" :close="() => {questionStatus = false}" />
+        </el-dialog>
+    </div>
+</div>
+</template>
+<script>
+import questionList from './components/questionList'
+import { questionnaireTopicAdd, questionnaireTopicGetDetail, questionnaireTopicUpdate } from './api'
+import AnswerList from './components/answerList'
+export default {
+    name: 'operationQuestion',
+    components: { questionList, AnswerList },
+    data () {
+        let query = this.$route.query
+        let titleName = '问卷'
+        if(query.type == 'create') {
+          titleName = '添加' + titleName
+        } else if(query.type == 'update') {
+          titleName = '修改' + titleName
+        } else if(query.type == 'look') {
+          titleName = '查看' + titleName
+        }
+        return {
+            type: query.type,
+            titleName: titleName,
+            id: query.id,
+            questionList: [],
+            activeName: [],
+            form: {
+                title: null,
+                questionnaireQuestionList: [{questionnaireQuestionItemList: [{ }]}],
+            },
+            disabled: query.type == 'look' ? true : false,
+            questionStatus: false
+        }
+    },
+    async mounted () {
+        if(this.type == 'update' || this.type == 'look') {
+            try {
+                let res = await questionnaireTopicGetDetail({ id: this.id })
+                this.form = res.data
+                this.questionList = res.data
+                // let list = res.data.questionnaireQuestionList || []
+                // list.forEach((item, index) => {
+                //     this.activeName.push(index)
+                // })
+            } catch {
+                //
+            }
+        }
+    },
+    methods: {
+        getForms() {
+            const { $refs: refs } = this;
+            return [
+                refs.form,
+                ...(refs.questions || []),
+            ].filter((item) => !!item).map((item) => item.$refs.form || item);
+        },
+        setResultSort() { // 给问答结果排序
+            let form = this.form
+            form.questionnaireQuestionList.forEach((item, index) => {
+                item.sort = index
+                let itemList = item.questionnaireQuestionItemList
+                if(item.type != 'textarea') {
+                    itemList.forEach((child, index) => {
+                        child.sort = index
+                    })
+                } else {
+                    itemList = []
+                }
+            })
+        },
+        onSubmit() {
+            const forms = this.getForms();
+            Promise.all(forms.map(this.getFormPromise)).then(async (res) => {
+                const validateResult = res.every(item => !!item)
+                console.log(validateResult)
+                if(validateResult) {
+                    this.setResultSort()
+                    try {
+                        if(this.type == 'create') {
+                            await questionnaireTopicAdd(this.form)
+                            this.$message.success('添加成功')
+                        } else {
+                            await questionnaireTopicUpdate(this.form)
+                            this.$message.success('修改成功')
+                        }
+                        this.onCancel()
+                    } catch {
+                        //
+                    }
+                } else {
+                    this.$nextTick(() => {
+                        let isError = document.getElementsByClassName('is-error')
+                        isError[0].scrollIntoView({
+                            block: 'center',
+                            behavior: 'smooth',
+                        })
+                    })
+                    return false
+                }
+            })
+        },
+        getFormPromise(form) {
+            return new Promise(resolve => {
+                form.validate(res => {
+                    resolve(res);
+                })
+            })
+        },
+        onPreview() {
+            const forms = this.getForms();
+            Promise.all(forms.map(this.getFormPromise)).then(async (res) => {
+                const validateResult = res.every(item => !!item)
+                if(validateResult) {
+                    this.questionStatus = true
+                }
+            })
+        },
+        onReset() {
+            this.form = {
+                title: null,
+                questionnaireQuestionList: [{questionnaireQuestionItemList: [{ }]}],
+            }
+            setTimeout(() => {
+                const forms = this.getForms();
+                for(let form of forms) {
+                    form.clearValidate()
+                }
+            }, 30)
+        },
+        // 添加题目选项
+        addQuestionItem(questionnaireQuestionList) {
+            questionnaireQuestionList.push({questionnaireQuestionItemList: [{}]})
+        },
+        // 向上移动
+        moveUp(arr, index) {
+            arr.splice(index, 1, ...arr.splice(index + 1, 1, arr[index]));
+        },
+        // 向下移动
+        moveDown(arr, index) {
+            arr.splice(index - 1, 1, ...arr.splice(index, 1, arr[index - 1]));
+
+        },
+        // 删除选项
+        onDelete(arr, index) {
+            if(this.type == 'update') {
+                if(this.form.delQuestionnaireQuestionIdList) {
+                    this.form.delQuestionnaireQuestionIdList.push(arr[index].id)
+                } else {
+                    this.form.delQuestionnaireQuestionIdList = [arr[index].id]
+                }
+            }
+            arr.splice(index, 1)
+        },
+        onCancel () {
+            this.$store.dispatch('delVisitedViews', this.$route)
+            this.$router.push({ path: '/operateManager/setQuestions' })
+        },
+    }
+}
+</script>
+<style lang="scss" scoped>
+/deep/.el-button--primary {
+  background: #14928a;
+  border-color: #14928a;
+  color: #fff;
+  &:hover,
+  &:active,
+  &:focus {
+    background: #14928a;
+    border-color: #14928a;
+    color: #fff;
+  }
+}
+/deep/.el-date-editor.el-input {
+  width: 100% !important;
+}
+/deep/.el-select {
+  width: 98% !important;
+}
+/deep/.el-collapse {
+    border: 0;
+}
+/deep/.el-collapse-item__wrap, /deep/.el-collapse-item__header {
+    background-color: #eef4f9;
+}
+</style>

+ 0 - 1
src/views/studentManager/components/teamAndcourse.vue

@@ -258,7 +258,6 @@ export default {
       let params = this.searchForm;
       params.rows = this.pageInfo.limit;
       params.page = this.pageInfo.page;
-      console.log(params)
       findStudentAttendance(params).then(res => {
         if (res.code == 200) {
           this.coursesInfo = res.data.rows;

+ 90 - 75
src/views/studentManager/studentList.vue

@@ -22,7 +22,8 @@
         :model.sync="searchForm"
       >
         <el-form-item>
-          <el-input clearable
+          <el-input
+            clearable
             placeholder="学生姓名或电话"
             @keyup.enter.native="onSearch"
             v-model.trim="searchForm.search"
@@ -46,7 +47,10 @@
         </el-form-item>
 
         <el-form-item>
-            <remote-search :commit="'setTeachers'" v-model="searchForm.teacherId" />
+          <remote-search
+            :commit="'setTeachers'"
+            v-model="searchForm.teacherId"
+          />
           <!-- <el-select
             placeholder="指导老师"
             v-model="searchForm.teacherId"
@@ -136,44 +140,33 @@
           :data="tableList"
           :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
         >
-          <el-table-column
-            align="center"
-            prop="userId"
-            label="学员编号"
-          >
-             <template slot-scope="scope">
+          <el-table-column align="center" prop="userId" label="学员编号">
+            <template slot-scope="scope">
               <copy-text>{{ scope.row.userId }}</copy-text>
             </template>
           </el-table-column>
-          <el-table-column
-            align="center"
-            prop="username"
-            label="学员姓名"
-          >
-           <template slot-scope="scope">
+          <el-table-column align="center" prop="username" label="学员姓名">
+            <template slot-scope="scope">
               <copy-text>{{ scope.row.username }}</copy-text>
             </template>
           </el-table-column>
-          <el-table-column
-            align="center"
-            prop="organName"
-            label="所属分部"
-          >
-          <template slot-scope="scope">
+          <el-table-column align="center" prop="organName" label="所属分部">
+            <template slot-scope="scope">
               <copy-text>{{ scope.row.organName }}</copy-text>
             </template>
           </el-table-column>
           <el-table-column
             align="center"
-            prop="subjectName"
-            label="声部"
+            prop="cooperationOrganName"
+            label="所属学校"
           ></el-table-column>
           <el-table-column
             align="center"
-            prop="teacherName"
-            label="指导老师"
-          >
-             <template slot-scope="scope">
+            prop="subjectName"
+            label="声部"
+          ></el-table-column>
+          <el-table-column align="center" prop="teacherName" label="指导老师">
+            <template slot-scope="scope">
               <copy-text>{{ scope.row.teacherName }}</copy-text>
             </template>
           </el-table-column>
@@ -193,14 +186,12 @@
             prop="parentsPhone"
             label="家长联系电话"
           ></el-table-column>
-          <el-table-column align="center" >
+          <el-table-column align="center">
             <template slot="header">
               <p style="position: relative">
                 是否激活
                 <el-tooltip placement="top" popper-class="mTooltip">
-                  <div slot="content">
-                    学员是否设置密码
-                  </div>
+                  <div slot="content">学员是否设置密码</div>
                   <i
                     class="el-icon-question"
                     style="font-size: 18px; color: #f56c6c"
@@ -288,12 +279,10 @@
           >
             <template slot-scope="scope">{{ scope.row.carePackage | studentPackage }}</template>
           </el-table-column>
-          <el-table-column
-            align="center"
-            prop="comeOnPackage"
-            label="加油包"
-          >
-            <template slot-scope="scope">{{ scope.row.comeOnPackage | studentPackage }}</template>
+          <el-table-column align="center" prop="comeOnPackage" label="加油包">
+            <template slot-scope="scope">{{
+              scope.row.comeOnPackage | studentPackage
+            }}</template>
           </el-table-column>
           <el-table-column
             align="center"
@@ -309,10 +298,11 @@
                   path: `/studentManager/studentDetail`,
                   query: { ...scope.row },
                 }"
-                >查看</router-link>
+                >查看</router-link
+              >
               <el-button
                 type="text"
-                style="padding-left: 10px;"
+                style="padding-left: 10px"
                 v-permission="'studentManage/studentUpdate'"
                 @click="resetStudent(scope.row)"
                 >修改</el-button
@@ -325,7 +315,7 @@
                 >修改密码</el-button
               >
               <el-button
-              v-if="scope.row.isSignedContract"
+                v-if="scope.row.isSignedContract"
                 type="text"
                 @click="lookContracts(scope.row)"
                 v-permission="'sysUserContracts/getLatest'"
@@ -365,7 +355,7 @@
           title="课程信息"
           type="info"
           :closable="false"
-          style="margin-bottom: 15px;"
+          style="margin-bottom: 15px"
         ></el-alert>
         <el-form-item label="学生姓名" prop="name">
           <el-input v-model.trim="studentForm.name"></el-input>
@@ -441,6 +431,7 @@
             clearable
             placeholder="请选择分部"
             @change="changeStudentOrgan"
+
           >
             <el-option
               v-for="(item, index) in selects.branchs"
@@ -450,6 +441,17 @@
             ></el-option>
           </el-select>
         </el-form-item>
+        <el-form-item prop="school" label="所属学校">
+          <el-select v-model.trim="studentForm.school" filterable clearable  :disabled='!studentForm.organId'   class="multiple">
+            <el-option
+              v-for="(item, index) in cooperationList"
+              :key="index"
+              :label="item.name"
+              :value="item.id"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+
         <el-form-item label="指导老师" prop="teacherId">
           <el-select
             class="multiple"
@@ -469,7 +471,7 @@
           title="课程信息"
           type="info"
           :closable="false"
-          style="margin-bottom: 15px;"
+          style="margin-bottom: 15px"
         ></el-alert>
         <el-form-item label="是否运营" prop="operatingTag">
           <el-select
@@ -575,14 +577,14 @@
             },
           ]"
         >
-          <copy-text>{{passwrodForm.phone}}</copy-text>
+          <copy-text>{{ passwrodForm.phone }}</copy-text>
         </el-form-item>
         <el-form-item
           label="输入密码"
           prop="password"
           label-width="120px"
           :rules="[
-             { required: true, message: '密码不能为空', trigger: 'blur' },
+            { required: true, message: '密码不能为空', trigger: 'blur' },
             {
               pattern: /^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,20}$/,
               message: '密码为6-20位数字和字母组合',
@@ -614,11 +616,7 @@
       </span>
     </el-dialog>
 
-    <el-dialog
-      title="协议下载"
-      :visible.sync="protocolVisible"
-      width="600px"
-    >
+    <el-dialog title="协议下载" :visible.sync="protocolVisible" width="600px">
       <div v-if="protocolVisible">
         <!-- <el-alert
           title="点击下载"
@@ -635,18 +633,19 @@
         >
           <el-table-column align="center" prop="studentId" label="协议名称">
             <template slot-scope="scope">
-              产品与服务协议{{ scope.row.version == 2 ? "(含课程)" : "(含系统)" }}
+              产品与服务协议{{
+                scope.row.version == 2 ? "(含课程)" : "(含系统)"
+              }}
             </template>
           </el-table-column>
           <el-table-column align="center" label="签署时间" prop="createTime">
           </el-table-column>
-          <el-table-column align="center"
-                           width="150px"
-                           label="操作">
+          <el-table-column align="center" width="150px" label="操作">
             <template slot-scope="scope">
               <div>
-                <el-button type="text"
-                           @click="onDownloadProtocol(scope.row)">下载</el-button>
+                <el-button type="text" @click="onDownloadProtocol(scope.row)"
+                  >下载</el-button
+                >
               </div>
             </template>
           </el-table-column>
@@ -668,14 +667,15 @@ import {
   studentHasCourse,
   getLatest,
 } from "@/api/studentManager";
-import qrCode from '@/components/QrCode/index';
+import { queryByOrganId } from "@/api/systemManage";
+import qrCode from "@/components/QrCode/index";
 import cleanDeep from "clean-deep";
 import { vaildStudentUrl } from "@/utils/validate";
 import { getEmployeeOrgan, resetPassword2, getTeacher } from "@/api/buildTeam";
 import { subjectListTree } from "@/api/specialSetting";
 import axios from "axios";
 import qs from "qs";
-import { packageStatus } from '@/constant/index'
+import { packageStatus } from "@/constant/index";
 import { getToken } from "@/utils/auth";
 import load from "@/utils/loading";
 import { permission } from "@/utils/directivePage";
@@ -726,10 +726,11 @@ export default {
         isNewUser: null,
         carePackage: 0,
         comeOnPackage: 0,
+        school:null
       },
       studentUpdatePackage: {
         carePackage: 0,
-        comeOnPackage: 0
+        comeOnPackage: 0,
       },
       studentRules: {
         name: [{ required: true, message: "请输入学生姓名" }],
@@ -756,7 +757,8 @@ export default {
       },
       activatedRow: null,
       protocolVisible: false,
-      protocolVersions: []
+      protocolVersions: [],
+      cooperationList: [],
     };
   },
   mounted() {
@@ -772,7 +774,7 @@ export default {
     onCreateQRCode() {
       // 生成报名二维码
       this.qrcodeStatus = true;
-      this.qrcodeUrl = vaildStudentUrl() + `/#/queryStudentPer`
+      this.qrcodeUrl = vaildStudentUrl() + `/#/queryStudentPer`;
     },
     getList() {
       let params = this.searchForm;
@@ -799,7 +801,7 @@ export default {
         serviceTag: null,
         teacherId: null,
       };
-      this.getList()
+      this.getList();
     },
     downLoadStudent() {
       let url = "/api-web/export/studentHasCourse";
@@ -912,7 +914,8 @@ export default {
             isNewUser: studentForm.isNewUser,
             subjectIdList: studentForm.subjectIdList,
             carePackage: studentForm.carePackage,
-            comeOnPackage: studentForm.comeOnPackage
+            comeOnPackage: studentForm.comeOnPackage,
+            cooperationOrganId:studentForm.school
           };
           registerStudent(obj).then((res) => {
             if (res.code == 200) {
@@ -943,7 +946,8 @@ export default {
             isNewUser: studentForm.isNewUser,
             subjectIdList: studentForm.subjectIdList,
             carePackage: studentForm.carePackage,
-            comeOnPackage: studentForm.comeOnPackage
+            comeOnPackage: studentForm.comeOnPackage,
+              cooperationOrganId:studentForm.school
           };
           updateStudent(obj).then((res) => {
             if (res.code == 200) {
@@ -1010,12 +1014,13 @@ export default {
           isNewUser: row.isNewUser,
           subjectIdList: Number(row.subjectIdList) || null,
           carePackage: row.carePackage,
-          comeOnPackage: row.comeOnPackage
+          comeOnPackage: row.comeOnPackage,
+          school:row.cooperationOrganId
         };
         this.studentUpdatePackage = {
           carePackage: row.carePackage,
-          comeOnPackage: row.comeOnPackage
-        }
+          comeOnPackage: row.comeOnPackage,
+        };
       });
     },
     onMaskClose(formName) {
@@ -1060,25 +1065,35 @@ export default {
     },
     async changeStudentOrgan(val) {
       this.studentForm.teacherId = null;
-      await getTeacher({ organId: val }).then((res) => {
-        if (res.code == 200) {
-          this.maskTeacherList = res.data;
-        }
-      });
+      this.studentForm.school=null;
+      if (val) {
+        await getTeacher({ organId: val }).then((res) => {
+          if (res.code == 200) {
+            this.maskTeacherList = res.data;
+          }
+        });
+        queryByOrganId({ organId: val }).then((res) => {
+          if (res.code == 200) {
+            this.cooperationList = res.data;
+          }
+        });
+      } else {
+        this.maskTeacherList = [];
+      }
     },
     async lookContracts(row) {
       await getLatest({ userId: row.userId }).then((res) => {
         if (res.code == 200) {
-          if(res.data) {
-            this.protocolVersions = res.data
-            this.protocolVisible = true
+          if (res.data) {
+            this.protocolVersions = res.data;
+            this.protocolVisible = true;
           }
         }
       });
     },
     onDownloadProtocol(item) {
-      window.location.href = item.url
-    }
+      window.location.href = item.url;
+    },
   },
 };
 </script>

+ 103 - 43
src/views/teamBuild/signupList.vue

@@ -3,13 +3,20 @@
     <div class="topWrap">
       <div>
         <div style="display: flex; justify-content: space-between">
-          <div style="display:flex;margin-bottom: 15px; font-size: 18px; font-weight: 400">
-            <p style="margin-right:10px" v-if="applyExpireDate">
+          <div
+            style="
+              display: flex;
+              margin-bottom: 15px;
+              font-size: 18px;
+              font-weight: 400;
+            "
+          >
+            <p style="margin-right: 10px" v-if="applyExpireDate">
               报名截止时间:{{ applyExpireDate | formatTimer }}
             </p>
-            <p v-if="paymentExpireDate">缴费截止时间:{{
-                paymentExpireDate | formatTimer
-              }}</p>
+            <p v-if="paymentExpireDate">
+              缴费截止时间:{{ paymentExpireDate | formatTimer }}
+            </p>
           </div>
         </div>
 
@@ -57,12 +64,19 @@
           >
             延长报名
           </div>
-          <div class="newBand" @click="onCreateQRCode('payment')"   v-show="
+          <div
+            class="newBand"
+            @click="onCreateQRCode('payment')"
+            v-show="
               (status == 'PAY' ||
-              status == 'APPLY' ||
-              status == 'PROGRESS' ||
-              status == 'PREPARE')&&ischeckCanReg
-            ">报名链接</div>
+                status == 'APPLY' ||
+                status == 'PROGRESS' ||
+                status == 'PREPARE') &&
+              ischeckCanReg
+            "
+          >
+            报名链接
+          </div>
           <div class="newBand" @click="onCreateQRCode('detail')">缴费详情</div>
           <div
             class="newBand"
@@ -86,11 +100,12 @@
             class="newBand"
             v-permission="'musicGroup/addMusicGroupRegs'"
             @click="mergeVisible = true"
-             v-show="
+            v-show="
               (status == 'PAY' ||
-              status == 'APPLY' ||
-              status == 'PROGRESS' ||
-              status == 'PREPARE')&&ischeckCanReg
+                status == 'APPLY' ||
+                status == 'PROGRESS' ||
+                status == 'PREPARE') &&
+              ischeckCanReg
             "
           >
             合并学员
@@ -99,11 +114,12 @@
             class="newBand"
             style="background-color: #f97215; border: 1px solid #f97215"
             @click="onCreateQRCode('rePayment')"
-             v-show="
+            v-show="
               (status == 'PAY' ||
-              status == 'APPLY' ||
-              status == 'PROGRESS' ||
-              status == 'PREPARE')&&ischeckCanReg
+                status == 'APPLY' ||
+                status == 'PROGRESS' ||
+                status == 'PREPARE') &&
+              ischeckCanReg
             "
           >
             报名链接(无乐器)
@@ -192,6 +208,29 @@
             ></el-option>
           </el-select>
         </el-form-item>
+        <el-form-item>
+          <el-select
+            v-model.trim="searchFrom.paymentStatus"
+            clearable
+            filterable
+            placeholder="报名缴费"
+          >
+            <el-option label="未开启缴费" value="0"></el-option>
+            <el-option label="开启缴费" value="1"></el-option>
+            <el-option label="已缴费" value="2"></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item>
+          <el-select
+            v-model.trim="searchFrom.visited"
+            clearable
+            filterable
+            placeholder="是否回访"
+          >
+            <el-option label="否" value="false"></el-option>
+            <el-option label="是" value="true"></el-option>
+          </el-select>
+        </el-form-item>
         <!-- 专业actualSubjectId 调剂isAllowAdjust 手机号name -->
         <el-form-item>
           <el-button type="danger" native-type="search">搜索</el-button>
@@ -234,12 +273,17 @@
           v-permission="'musicGroup/updateExpectedStudentNum'"
           style="margin-right: 20px; margin-top: 20px"
         >
-          <el-button v-show="!isEdit&&(
-              status == 'PAY' ||
-              status == 'APPLY' ||
-              status == 'PROGRESS' ||
-              status == 'PREPARE')
-            " @click="isEdit = true">编辑</el-button>
+          <el-button
+            v-show="
+              !isEdit &&
+              (status == 'PAY' ||
+                status == 'APPLY' ||
+                status == 'PROGRESS' ||
+                status == 'PREPARE')
+            "
+            @click="isEdit = true"
+            >编辑</el-button
+          >
           <el-button v-show="isEdit" @click="saveIsEdit">保存</el-button>
         </div>
       </div>
@@ -298,6 +342,15 @@
           </el-table-column>
           <el-table-column label="联系电话" prop="parentsPhone" align="center">
           </el-table-column>
+
+          <el-table-column label="是否回访" prop="paymentStatus" align="center">
+            <template slot-scope="scope">
+              <div>
+                {{ scope.row.visitNum ? "是" : "否" }}
+              </div>
+            </template>
+          </el-table-column>
+          <!-- visited -->
           <!-- v-show='status == "PAY"' -->
           <el-table-column
             label="报名缴费状态"
@@ -311,23 +364,24 @@
               </div>
             </template>
           </el-table-column>
+
           <el-table-column
             label="操作"
             fixed="right"
             width="240"
             align="center"
-             v-if="
+            v-if="
               status == 'PAY' ||
               status == 'APPLY' ||
               status == 'PROGRESS' ||
               status == 'PREPARE'
             "
           >
-          <!--  v-show="
+            <!--  v-show="
               status == 'PAY' || status == 'PROGRESS' || status == 'PREPARE' || status=='APPLY'
             " -->
             <template slot-scope="scope">
-              <div  >
+              <div>
                 <auth :auths="'studentRegistration/batchUpdateSubject'">
                   <el-button
                     type="text"
@@ -374,7 +428,7 @@
                     >退团</el-button
                   >
                 </auth>
-                <auth :auths="'visit/add/teamSignupList'">
+                <auth :auths="'visit/add/teamSignupList'" v-if=" scope.row.visitNum<=0">
                   <el-button type="text" @click="addVisit(scope.row)"
                     >新增回访</el-button
                   >
@@ -703,7 +757,7 @@ import {
   studentApplyDetailExport,
   StudentQuit,
   getMusicGroupGradeList,
-  checkCanReg
+  checkCanReg,
 } from "@/api/buildTeam";
 import mergeMusic from "./components/merge-music";
 import forecastList from "./components/forecast-list";
@@ -748,6 +802,8 @@ export default {
         subject: "", // 专业
         isAllowAdjust: "", // 是否允许调剂
         currentGrade: null, // 入学年级
+        paymentStatus: "",
+        visited: "",
       },
       quitForm: {
         // 退团信息确认
@@ -856,7 +912,7 @@ export default {
       applyDates: this.applyDate(),
       detail: null,
       gradeList: [],
-      ischeckCanReg:false
+      ischeckCanReg: false,
     };
   },
   created() {},
@@ -871,7 +927,7 @@ export default {
     permission(str) {
       return permission(str);
     },
-   async init() {
+    async init() {
       this.status = this.$route.query.team_status;
       // 通过乐团id 获取乐团招生状态
       this.id = this.$route.query.id;
@@ -879,14 +935,15 @@ export default {
       // 判断是否带缓存参数
       this.pickerOptions = this.beginDate(new Date());
       // checkCanReg
-      try{
-       this.ischeckCanReg = await (await checkCanReg({musicGroupId:this.id})).data
-       console.log(this.ischeckCanReg)
-      }catch(e){
-        console.log(e)
+      try {
+        this.ischeckCanReg = await (
+          await checkCanReg({ musicGroupId: this.id })
+        ).data;
+        console.log(this.ischeckCanReg);
+      } catch (e) {
+        console.log(e);
       }
 
-
       getMusicGroupGradeList({ musicGroupId: this.id }).then((res) => {
         let result = res.data;
         if (res.code == 200 && result) {
@@ -928,6 +985,8 @@ export default {
         subject: null, // 专业
         isAllowAdjust: null, // 是否允许调剂
         currentGrade: null,
+        paymentStatus: null,
+        visited: null,
       };
       this.getList();
     },
@@ -951,6 +1010,8 @@ export default {
         isAllowAdjust: this.searchFrom.isAllowAdjust || null,
         name: this.searchFrom.name || null,
         currentGrade: this.searchFrom.currentGrade || null,
+        paymentStatus: this.searchFrom.paymentStatus || null,
+        visited: this.searchFrom.visited || null,
         page: this.rules.page,
         rows: this.rules.limit,
       };
@@ -1215,9 +1276,9 @@ export default {
     },
     // 修改专业
     resetSubject(row) {
-      console.log(row)
+      console.log(row);
       this.activeId = row.studentId;
-      this.maskForm.subject = row.actualSubjectId
+      this.maskForm.subject = row.actualSubjectId;
       this.subjectVisible = true;
       //   resetStudentSubject().then(res=>{]})
     },
@@ -1424,10 +1485,9 @@ export default {
       this.getList().then((res) => {
         for (const item of res.data.rows) {
           if (item.id === row.id) {
-            this.rowDetail = { ...item,userId:item.studentId };
+            this.rowDetail = { ...item, userId: item.studentId };
             // console.log(this.rowDetail)
             this.changeVoiceVisible = true;
-
           }
         }
       });
@@ -1480,7 +1540,7 @@ export default {
       return {
         firstDayOfWeek: 1,
         disabledDate(time) {
-         return time.getTime()+ 86400000 < new Date().getTime();
+          return time.getTime() + 86400000 < new Date().getTime();
         },
       };
     },
@@ -1489,7 +1549,7 @@ export default {
       return {
         firstDayOfWeek: 1,
         disabledDate(time) {
-          return time.getTime()+ 86400000 < new Date().getTime();
+          return time.getTime() + 86400000 < new Date().getTime();
         },
       };
     },

+ 1 - 0
src/views/teamDetail/componentCourse/teacherList.vue

@@ -372,6 +372,7 @@ export default {
             if (res.code == 200) {
               this.$message.success("补卡成功");
               this.getList();
+              this.$emit('syncTeacherAttend')
             } else {
               this.$message.error(res.msg);
             }

+ 54 - 28
src/views/teamDetail/teamCourseList.vue

@@ -195,25 +195,24 @@
         </el-form-item> -->
 
         <el-form-item>
-             <el-button
-          type="primary"
-          icon="el-icon-circle-plus-outline"
-          @click="showMove = true"
-          >更多选项</el-button
-        >
+          <el-button
+            :type="isSearch ? 'primary' : 'info'"
+            icon="el-icon-circle-plus-outline"
+            @click="showMove = true"
+            >更多选项</el-button
+          >
         </el-form-item>
         <el-form-item>
-               <el-button native-type="submit" type="primary">搜索</el-button>
-        <el-button native-type="reset" type="danger">重置</el-button>
+          <el-button native-type="submit" type="primary">搜索</el-button>
+          <el-button native-type="reset" type="danger">重置</el-button>
 
-        <el-button
-          v-permission="'export/superFindCourseSchedules'"
-          @click="onCourseExport"
-          type="primary"
-          >导出课表</el-button
-        >
+          <el-button
+            v-permission="'export/superFindCourseSchedules'"
+            @click="onCourseExport"
+            type="primary"
+            >导出课表</el-button
+          >
         </el-form-item>
-
       </save-form>
       <!-- 列表 -->
       <div class="tableWrap">
@@ -588,6 +587,7 @@
               :courseScheduleId="maskForm.id"
               :teachMode="maskForm.teachMode"
               :courseStatus="maskForm.status"
+              @syncTeacherAttend="syncTeacherAttend"
             ></teacherList>
           </div>
         </el-tab-pane>
@@ -656,7 +656,7 @@
       >
         <el-form-item label="课程组编号/名称" prop="search">
           <el-input
-          style="width:180px"
+            style="width: 180px"
             v-model.trim="searchForm.search"
             clearable
             placeholder="课程组编号/课程名称"
@@ -664,7 +664,7 @@
         </el-form-item>
         <el-form-item label="教学点" prop="schoolId">
           <el-select
-             style="width:180px"
+            style="width: 180px"
             v-model.trim="searchForm.schoolId"
             clearable
             filterable
@@ -680,7 +680,7 @@
         </el-form-item>
         <el-form-item label="分部" prop="organIdList">
           <el-select
-             style="width:180px"
+            style="width: 180px"
             class="multiple"
             v-model.trim="searchForm.organIdList"
             filterable
@@ -697,7 +697,7 @@
         </el-form-item>
         <el-form-item label="课程组类型" prop="groupType">
           <el-select
-             style="width:180px"
+            style="width: 180px"
             v-model.trim="searchForm.groupType"
             clearable
             filterable
@@ -713,7 +713,7 @@
         </el-form-item>
         <el-form-item label="教学模式" prop="teachMode">
           <el-select
-             style="width:180px"
+            style="width: 180px"
             v-model.trim="searchForm.teachMode"
             clearable
             filterable
@@ -738,7 +738,7 @@
         </el-form-item> -->
         <el-form-item label="合并课类型" prop="mergeCourseType">
           <el-select
-             style="width:180px"
+            style="width: 180px"
             v-model.trim="searchForm.mergeCourseType"
             clearable
             filterable
@@ -754,7 +754,7 @@
         </el-form-item>
         <el-form-item label="老师类型" prop="teachType">
           <el-select
-             style="width:180px"
+            style="width: 180px"
             v-model.trim="searchForm.teachType"
             clearable
             filterable
@@ -770,7 +770,7 @@
         </el-form-item>
         <el-form-item label="是否点名" prop="isCallNames">
           <el-select
-             style="width:180px"
+            style="width: 180px"
             v-model.trim="searchForm.isCallNames"
             clearable
             filterable
@@ -919,6 +919,19 @@ export default {
     mergeCourseTypeOptions() {
       return objectToOptions(mergeCourseType);
     },
+    isSearch() {
+      return (
+        this.searchForm.search ||
+        this.searchForm.schoolId ||
+        this.searchForm.organIdList ||
+        this.searchForm.groupType ||
+        this.searchForm.teachMode ||
+        this.searchForm.mergeCourseType||
+        this.searchForm.teachType||
+        this.searchForm.isCallNames||
+        this.searchForm.creatTimer?.length>0
+      );
+    },
   },
   mounted() {
     const { query } = this.$route;
@@ -1172,6 +1185,19 @@ export default {
         }
       );
     },
+    syncTeacherAttend() {
+      if (this.maskForm.id) {
+        getTeacherPersonalAttendanceDetail({
+          courseScheduleId: this.maskForm.id,
+        }).then((res) => {
+          if (res.code == 200) {
+            this.maskForm = { ...this.maskForm, ...res.data };
+            this.isMainGo = this.$refs.filterSearch?.show;
+          }
+        });
+      }
+    },
+
     handleClick(tab, event) {
       // console.log(tab, event);
     },
@@ -1201,13 +1227,13 @@ export default {
         })
         .catch(() => {});
     },
-    cancleMore(){
+    cancleMore() {
       // this.$refs.searchForm2.resetFields()
-      this.showMove = false
+      this.showMove = false;
     },
-    okMore(){
-      this.getList()
-      this.showMove = false
+    okMore() {
+      this.getList();
+      this.showMove = false;
     },
     // addCompound(row) {
     //   this.compoundList.push(row);

+ 5 - 5
vue.config.js

@@ -18,10 +18,10 @@ const name = defaultSettings.title || '管乐迷后台管理系统' // page titl
 // //  https://online.dayaedu.com
 // let target = 'https://online.dayaedu.com' //线上
 // let target = 'http://192.168.3.139:8000' // 箭河
-// let target = 'http://192.168.3.38:8000' //邹璇
+// let target = 'http://192.168.3.148:8000' //邹璇
 // let target = 'http://192.168.3.57:8000' //勇哥
-let target = 'http://dev.dayaedu.com' // 开发环境
-// let target = 'https://test.dayaedu.com' //测试环境
+// let target = 'http://dev.dayaedu.com' // 开发环境
+let target = 'https://test.dayaedu.com' //测试环境
 // let target = 'http://192.168.3.134' // 乔
 // All configuration item explanations can be find in https://cli.vuejs.org/config/
 module.exports = {
@@ -66,8 +66,8 @@ module.exports = {
       // let target = 'http://dev.dayaedu.com'
       // 'http://dev.dayaedu.com'
       '/api-auth': {
-        // target: 'https://test.dayaedu.com',
-        target : target,
+        target: target,
+        // target : target,
         changeOrigin: true,
         pathRewrite: {
           '^api-auth': ''

Nem az összes módosított fájl került megjelenítésre, mert túl sok fájl változott