lex 11 months ago
parent
commit
9a24629142
67 changed files with 7012 additions and 2888 deletions
  1. 1 0
      dist/index.html
  2. 0 1
      dist/static/css/chunk-19eabef7.17d27fe7.css
  3. 0 1
      dist/static/css/chunk-29ef4988.b85c64e0.css
  4. 0 0
      dist/static/css/chunk-3eed6f86.03ba6fd3.css
  5. 0 1
      dist/static/css/chunk-48901791.33d371ff.css
  6. 0 1
      dist/static/css/chunk-62433e04.bec2449d.css
  7. 0 1
      dist/static/css/chunk-6c908e46.615741cc.css
  8. 0 1
      dist/static/css/chunk-70323e86.c19e6b8f.css
  9. 0 1
      dist/static/css/chunk-7c87bbe2.714fccd0.css
  10. 0 0
      dist/static/css/chunk-7eae7740.9165db8b.css
  11. 0 1
      dist/static/css/chunk-bfa1918a.a09928d3.css
  12. 0 1
      dist/static/css/chunk-d1066902.878901a8.css
  13. 0 0
      dist/static/js/app.69c35c01.js
  14. 0 0
      dist/static/js/chunk-19eabef7.70413563.js
  15. 0 0
      dist/static/js/chunk-2d0ac1af.187deb49.js
  16. 0 0
      dist/static/js/chunk-2d0b9f85.d94ac682.js
  17. 0 0
      dist/static/js/chunk-3eed6f86.f6079896.js
  18. 0 0
      dist/static/js/chunk-48901791.56aa8488.js
  19. 0 0
      dist/static/js/chunk-536e0e9c.d8a50e48.js
  20. 0 0
      dist/static/js/chunk-62433e04.b9b681e4.js
  21. 0 0
      dist/static/js/chunk-6a1562ab.78d2321d.js
  22. 0 0
      dist/static/js/chunk-6bc37c35.a67b8a4e.js
  23. 0 0
      dist/static/js/chunk-7c87bbe2.2d860953.js
  24. 0 0
      dist/static/js/chunk-7d91e0e6.12bd47f5.js
  25. 0 0
      dist/static/js/chunk-7eae7740.58a45323.js
  26. 0 0
      dist/static/js/chunk-bfa1918a.7378e26f.js
  27. 119 62
      src/api/businessManager.js
  28. 179 177
      src/api/systemManage.js
  29. 15 3
      src/components/singe-file-upload/index.vue
  30. 6 3
      src/constant/index.js
  31. 28 0
      src/store/modules/permission.js
  32. 4 0
      src/utils/searchArray.js
  33. 72 23
      src/views/auditList/musicGroup.vue
  34. 46 16
      src/views/branchPayManager/payschoolList.vue
  35. 159 125
      src/views/businessManager/orderManager/financeManager-taoqi.vue
  36. 170 126
      src/views/businessManager/orderManager/financeManager.vue
  37. 581 585
      src/views/businessManager/orderManager/orderAudit/orderAuditDetail.vue
  38. 32 35
      src/views/businessManager/orderManager/salesList.vue
  39. 1038 0
      src/views/businessManager/shopManager/model/combinationProducts.vue
  40. 793 0
      src/views/businessManager/shopManager/model/singleProducts.vue
  41. 315 0
      src/views/businessManager/shopManager/model/subShopGoods.vue
  42. 25 26
      src/views/businessManager/shopManager/shopCategory.vue
  43. 116 700
      src/views/businessManager/shopManager/shopList.vue
  44. 21 21
      src/views/reaplceMusicPlayer/modals/detail.vue
  45. 15 0
      src/views/resetTeaming/api.js
  46. 548 0
      src/views/resetTeaming/components/goodsPayInfo.vue
  47. 7 3
      src/views/resetTeaming/components/payInfoDetail.vue
  48. 45 2
      src/views/resetTeaming/components/resetPayList.vue
  49. 424 299
      src/views/resetTeaming/components/resetSound.vue
  50. 277 0
      src/views/resetTeaming/goodsModal/addShopGoods.vue
  51. 298 0
      src/views/resetTeaming/goodsModal/payAddressInfo.vue
  52. 214 0
      src/views/resetTeaming/goodsModal/payBackMoney.vue
  53. 192 0
      src/views/resetTeaming/goodsModal/payFeeInfo.vue
  54. 248 0
      src/views/resetTeaming/goodsModal/payGoodsInfo.vue
  55. 30 14
      src/views/resetTeaming/index.vue
  56. 23 24
      src/views/resetTeaming/modals/paySchoolInfo.vue
  57. 53 0
      src/views/resetTeaming/modals/review-detail.vue
  58. 176 162
      src/views/teamBuild/components/soundSetComponents/chioseMusic.vue
  59. 1 0
      src/views/teamBuild/components/soundSetComponents/soundSetCore.vue
  60. 470 284
      src/views/teamBuild/components/teamSoundMoney.vue
  61. 77 46
      src/views/teamBuild/forecastName.vue
  62. 31 12
      src/views/teamBuild/forecastNameList.vue
  63. 1 1
      src/views/teamBuild/signupList.vue
  64. 26 26
      src/views/teamDetail/components/studentList.vue
  65. 36 26
      src/views/teamDetail/teamDetailedList.vue
  66. 67 54
      src/views/teamDetail/teamListComponent/eidtTeamAddr.vue
  67. 33 24
      src/views/teamDetail/teamListComponent/modals/eidtAddr.vue

File diff suppressed because it is too large
+ 1 - 0
dist/index.html


+ 0 - 1
dist/static/css/chunk-19eabef7.17d27fe7.css

@@ -1 +0,0 @@
-[data-v-50179f16] .el-date-editor.el-input,[data-v-50179f16] .el-select{width:100%!important}

+ 0 - 1
dist/static/css/chunk-29ef4988.b85c64e0.css

@@ -1 +0,0 @@
-.el-button+.el-button[data-v-71d2ef28]{margin-left:0}.hanlderWrap[data-v-71d2ef28]{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:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;align-items:center}

File diff suppressed because it is too large
+ 0 - 0
dist/static/css/chunk-3eed6f86.03ba6fd3.css


+ 0 - 1
dist/static/css/chunk-48901791.33d371ff.css

@@ -1 +0,0 @@
-.dialog-footer[data-v-1caa218f]{margin-top:20px;display:block;text-align:right}.msgP[data-v-3e81a8e3]{line-height:24px;margin-top:10px}.dialog-footer[data-v-213bbf36]{margin-top:20px;display:block;text-align:right}.msgP[data-v-0c1cc214]{line-height:24px;margin-top:10px}

+ 0 - 1
dist/static/css/chunk-62433e04.bec2449d.css

@@ -1 +0,0 @@
-.provinceWrap[data-v-4893a4e8],.provinceWrap[data-v-7824d228]{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-align:center;-ms-flex-align:center;align-items:center}.addBtn[data-v-ae8947fa]{margin-bottom:20px}.teamDetailedList[data-v-1b0e789f]{padding:0 20px}

+ 0 - 1
dist/static/css/chunk-6c908e46.615741cc.css

@@ -1 +0,0 @@
-.newBand[data-v-05c93ed4]{display:inline-block}[data-v-05c93ed4] .el-input-number.is-controls-right .el-input__inner{text-align:left}.setWidth[data-v-05c93ed4]{display:inline-block}.lookTitle[data-v-05c93ed4]{height:40px;line-height:40px;font-weight:700;background-color:#edeef0;padding:0 20px;margin-bottom:20px}.showShop[data-v-05c93ed4]{height:40px;line-height:40px;width:150px;background-color:#f5f7fa;border-color:#e4e7ed;color:#c0c4cc;cursor:not-allowed;color:#333;opacity:1;border-radius:4px;border:1px solid #dcdfe6;padding:0 15px;margin-right:10px}.shopListWrap[data-v-05c93ed4]{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}

+ 0 - 1
dist/static/css/chunk-70323e86.c19e6b8f.css

@@ -1 +0,0 @@
-.newBand[data-v-3a8b1265]{display:inline-block}[data-v-3a8b1265] .el-input-number.is-controls-right .el-input__inner{text-align:left}.setWidth[data-v-3a8b1265]{display:inline-block}.lookTitle[data-v-3a8b1265]{height:40px;line-height:40px;font-weight:700;background-color:#edeef0;padding:0 20px;margin-bottom:20px}.showShop[data-v-3a8b1265]{height:40px;line-height:40px;width:150px;background-color:#f5f7fa;border-color:#e4e7ed;color:#c0c4cc;cursor:not-allowed;color:#333;opacity:1;border-radius:4px;border:1px solid #dcdfe6;padding:0 15px;margin-right:10px}.shopListWrap[data-v-3a8b1265]{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}

+ 0 - 1
dist/static/css/chunk-7c87bbe2.714fccd0.css

@@ -1 +0,0 @@
-.slider-container{background:#fff;padding:20px}.slider-container .el-table{margin-top:20px}

File diff suppressed because it is too large
+ 0 - 0
dist/static/css/chunk-7eae7740.9165db8b.css


+ 0 - 1
dist/static/css/chunk-bfa1918a.a09928d3.css

@@ -1 +0,0 @@
-.w100[data-v-7d68db77]{width:100%}.btnWrap[data-v-7d68db77]{-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.w100[data-v-dd15b0ca]{width:100%}.btnWrap[data-v-dd15b0ca]{-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}

+ 0 - 1
dist/static/css/chunk-d1066902.878901a8.css

@@ -1 +0,0 @@
-.scroll[data-v-57395335]{overflow:auto;max-height:400px}.scroll[data-v-57395335] .container{padding:0}.dialog-footer[data-v-57395335]{display:block;text-align:right;margin-top:20px}.dialog-footer[data-v-6142a3c9]{display:block;text-align:right}[data-v-6142a3c9] .el-dialog__body{padding:10px 10px 20px}.courseMask .el-dialog__body[data-v-25a4eba5]{padding-bottom:0}

File diff suppressed because it is too large
+ 0 - 0
dist/static/js/app.69c35c01.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-19eabef7.70413563.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-2d0ac1af.187deb49.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-2d0b9f85.d94ac682.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-3eed6f86.f6079896.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-48901791.56aa8488.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-536e0e9c.d8a50e48.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-62433e04.b9b681e4.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-6a1562ab.78d2321d.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-6bc37c35.a67b8a4e.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-7c87bbe2.2d860953.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-7d91e0e6.12bd47f5.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-7eae7740.58a45323.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-bfa1918a.7378e26f.js


+ 119 - 62
src/api/businessManager.js

@@ -1,136 +1,193 @@
 // 通用设置api文件
-import request from '@/utils/request'
-import qs from 'qs'
-let api = '/api-web'
+import request from "@/utils/request";
+import request2 from "@/utils/request2";
+import qs from "qs";
+let api = "/api-web";
 // 分页查询商品(教材、辅件)列表
-export function goodsQuery (data) {
+export function goodsQuery(data) {
   return request({
-    url: api + '/goods/queryPage',
-    method: 'get',
+    url: api + "/goods/queryPage",
+    method: "get",
     params: data
-  })
+  });
 }
 
 // 根据商品(教材、辅件)编号查询商品(教材、辅件)
-export function goodsSingleQuery (data) {
+export function goodsSingleQuery(data) {
   return request({
     url: api + `/goods/get/${data}`,
-    method: 'get'
-  })
+    method: "get"
+  });
 }
 
 // 修改上架下架状态
-export function updateGoodsStatus (data) {
+export function updateGoodsStatus(data) {
   return request({
     url: api + `/goods/updateGoodsStatus`,
-    method: 'post',
+    method: "post",
     data: qs.stringify(data)
-  })
+  });
 }
 
 // 新增商品(教材、辅件)
-export function goodsAdd (data) {
+export function goodsAdd(data) {
   return request({
-    url: api + '/goods/add',
-    method: 'post',
-    data: qs.stringify(data)
-  })
+    url: api + "/goods/add",
+    method: "post",
+    data: data
+  });
+}
+
+// 批量新增商品(教材、辅件)
+export function goodsAddBatch(data) {
+  return request({
+    url: api + "/goods/addBatch",
+    method: "post",
+    data: data
+  });
 }
 
 // 修改商品(教材、辅件)
-export function goodsUpdate (data) {
+export function goodsUpdate(data) {
   return request({
-    url: api + '/goods/update',
-    method: 'post',
-    data: qs.stringify(data)
-  })
+    url: api + "/goods/update",
+    method: "post",
+    data: data
+  });
 }
 
 // 删除商品(教材、辅件)
-export function goodsDelete (data) {
+export function goodsDelete(data) {
   return request({
     url: api + `/goods/del/${data}`,
-    method: 'post'
-  })
+    method: "post"
+  });
 }
 
 // 参数列表
-export function categoryListTree (data) {
+export function categoryListTree(data) {
   return request({
-    url: api + '/category/queryPage',
-    method: 'get',
+    url: api + "/category/queryPage",
+    method: "get",
     params: data
-  })
+  });
 }
 
 // 新增、修改商品类型
-export function categoryUpSet (data) {
+export function categoryUpSet(data) {
   return request({
-    url: api + '/category/upset',
-    method: 'post',
+    url: api + "/category/upset",
+    method: "post",
     data: data
-  })
+  });
 }
 
 // 删除商品分类
-export function categoryUpSetDel (data) {
+export function categoryUpSetDel(data) {
   return request({
     url: api + `/category/del`,
-    method: 'post',
+    method: "post",
     data: qs.stringify(data)
-  })
+  });
 }
 
 // 更换列表
-export function getSubjectChangeList (data) {
+export function getSubjectChangeList(data) {
   return request({
-    url: api + '/subjectChange/queryPage',
-    method: 'get',
+    url: api + "/subjectChange/queryPage",
+    method: "get",
     params: data
-  })
+  });
 }
 // 更新成本差
-export function updateCostMargin (data) {
+export function updateCostMargin(data) {
   return request({
     url: api + `/subjectChange/updateCostMargin`,
-    method: 'post',
+    method: "post",
     data: qs.stringify(data)
-  })
+  });
 }
 // 进货清单
-export function getGoodsProcurements (data) {
+export function getGoodsProcurements(data) {
   return request({
-    url: api + '/goodsProcurement/queryGoodsProcurements',
-    method: 'get',
+    url: api + "/goodsProcurement/queryGoodsProcurements",
+    method: "get",
     params: data
-  })
+  });
 }
 // 添加进货清单
 
-export function createGoodsProcurements (data) {
+export function createGoodsProcurements(data) {
   return request({
-    url: api + '/goods/addGoodsProcurement',
-    method: 'post',
+    url: api + "/goods/addGoodsProcurement",
+    method: "post",
     params: data
-  })
+  });
 }
 
-
 // 获取新课表列表
-export function getCourseSchedule (data) {
+export function getCourseSchedule(data) {
   return request({
-    url: api + '/swTempJc/queryPageForCourseSchedule',
-    method: 'get',
+    url: api + "/swTempJc/queryPageForCourseSchedule",
+    method: "get",
     params: data
-  })
+  });
 }
 
-
 // 新订单列表
-export function getOrderPage (data) {
+export function getOrderPage(data) {
   return request({
-    url: api + '/swTempJc/queryPageForExtensionOrder',
-    method: 'get',
+    url: api + "/swTempJc/queryPageForExtensionOrder",
+    method: "get",
     params: data
-  })
+  });
+}
+
+// 查询商城商品
+export function api_queryGoodsSubByPage(data) {
+  return request2({
+    url: api + `/goods/queryGoodsSubByPage`,
+    method: "GET",
+    params: data,
+    data: {}
+  });
+}
+
+// 查询商品类型
+export function api_queryGoodsTypeList(data) {
+  return request2({
+    url: api + `/goods/queryGoodsTypeList`,
+    method: "GET",
+    params: data,
+    data: {}
+  });
+}
+
+// 查询商品分类
+export function api_queryGoodsCategoryList(data) {
+  return request2({
+    url: api + `/goods/queryGoodsCategoryList`,
+    method: "GET",
+    params: data,
+    data: {}
+  });
+}
+
+// 查询商品品牌
+export function api_queryGoodsBrandList(data) {
+  return request2({
+    url: api + `/goods/queryGoodsBrandList`,
+    method: "GET",
+    params: data,
+    data: {}
+  });
+}
+
+// 查询商品详情
+export function api_goodsGet(data) {
+  return request2({
+    url: api + `/goods/get/` + data.id,
+    method: "GET",
+    data: {}
+  });
 }

+ 179 - 177
src/api/systemManage.js

@@ -1,423 +1,425 @@
-import request from '@/utils/request'
-import request2 from '@/utils/request2'
-import qs from 'qs'
-let api = '/api-web'
+import request from "@/utils/request";
+import request2 from "@/utils/request2";
+import qs from "qs";
+let api = "/api-web";
 
 // 新增合作单位(教学点)
-export function cooperationOrganAdd (data) {
+export function cooperationOrganAdd(data) {
   return request({
-    url: api + '/cooperationOrgan/add',
-    method: 'post',
+    url: api + "/cooperationOrgan/add",
+    method: "post",
     data,
     headers: {
-      'Content-Type': 'application/json',
-    },
-  })
+      "Content-Type": "application/json"
+    }
+  });
 }
 
 // 修改合作单位(教学点)
 //     data: qs.stringify(data),    data: qs.stringify(data),
-export function cooperationOrganUpdate (data) {
+export function cooperationOrganUpdate(data) {
   return request({
-    url: api + '/cooperationOrgan/update',
-    method: 'put',
+    url: api + "/cooperationOrgan/update",
+    method: "put",
     data,
     headers: {
-      'Content-Type': 'application/json',
-    },
-  })
+      "Content-Type": "application/json"
+    }
+  });
 }
 
 // 删除合作单位(教学点)
-export function cooperationOrganDel (data) {
+export function cooperationOrganDel(data) {
   return request({
     url: api + `/cooperationOrgan/del/${data}`,
-    method: 'post'
-  })
+    method: "post"
+  });
 }
 
 // 分页查询合作单位(教学点)列表
-export function queryPage (data) {
+export function queryPage(data) {
   return request({
-    url: api + '/cooperationOrgan/queryPage',
-    method: 'get',
+    url: api + "/cooperationOrgan/queryPage",
+    method: "get",
     params: data
-  })
+  });
 }
 
 // 根据机构编号获取合作单位(教学点)列表
-export function queryByOrganId (data) {
+export function queryByOrganId(data) {
   return request({
-    url: api + '/cooperationOrgan/queryByOrganId',
-    method: 'get',
+    url: api + "/cooperationOrgan/queryByOrganId",
+    method: "get",
     params: data,
-    hideLoading:true
-  })
+    hideLoading: true
+  });
 }
 
 // 根据合作单位获取乐团
 
-export function getMusicGroup (data) {
+export function getMusicGroup(data) {
   return request({
-    url: api + '/musicGroup/findByCooperationId',
-    method: 'get',
+    url: api + "/musicGroup/findByCooperationId",
+    method: "get",
     params: data
-  })
+  });
 }
 
 // 分页查询教学点
-export function schoolQueryPage (data) {
+export function schoolQueryPage(data) {
   return request({
-    url: api + '/school/queryPage',
-    method: 'get',
+    url: api + "/school/queryPage",
+    method: "get",
     params: data
-  })
+  });
 }
 // 新增教学点
-export function schoolAdd (data) {
+export function schoolAdd(data) {
   return request({
-    url: api + '/school/add',
-    method: 'post',
+    url: api + "/school/add",
+    method: "post",
     data: qs.stringify(data)
-  })
+  });
 }
 // 修改教学点
-export function schoolUpdate (data) {
+export function schoolUpdate(data) {
   return request({
-    url: api + '/school/update',
-    method: 'post',
+    url: api + "/school/update",
+    method: "post",
     data: qs.stringify(data)
-  })
+  });
 }
 // 修改教学点
-export function schoolDel (data) {
+export function schoolDel(data) {
   return request({
     url: api + `/school/del/${data.id}`,
-    method: 'post'
-  })
+    method: "post"
+  });
 }
 
 // 根据部门获取下面的员工
-export function queryEmployByOrganId (data) {
+export function queryEmployByOrganId(data) {
   return request({
     url: api + `/employee/queryEmployByOrganId`,
-    method: 'get',
+    method: "get",
     params: data
-  })
+  });
 }
 
-export function getPlatEmploy (data) {
+export function getPlatEmploy(data) {
   return request({
     url: api + `/employee/queryPlatformEmploy`,
-    method: 'get',
+    method: "get",
     params: data
-  })
+  });
 }
 // 新增员工
-export function employeeAdd (data) {
+export function employeeAdd(data) {
   return request({
     url: api + `/employee/add`,
-    method: 'post',
+    method: "post",
     data: data
-  })
+  });
 }
 // 修改员工
-export function employeeUpdate (data) {
+export function employeeUpdate(data) {
   return request({
     url: api + `/employee/update`,
-    method: 'post',
+    method: "post",
     data: data
-  })
+  });
 }
 
 // 获取用户角色列表
-export function getUserRole (data) {
+export function getUserRole(data) {
   return request({
     url: `/api-auth/role/queryPage`,
-    method: 'get',
+    method: "get",
     params: data
-  })
+  });
 }
 
 // 获取部门
-export function getDepts (data) {
+export function getDepts(data) {
   return request({
     url: `/api-oa/api/v1/depts`,
-    method: 'get',
+    method: "get",
     params: data
-  })
+  });
 }
 
 // 获取岗位
-export function getPosts (data) {
+export function getPosts(data) {
   return request({
     url: `/api-oa/api/v1/posts`,
-    method: 'get',
+    method: "get",
     params: data
-  })
+  });
 }
 
 // 员工操作
-export function employeeOperate (data) {
+export function employeeOperate(data) {
   return request({
-    url: api + '/employee/employeeOperate',
-    method: 'post',
+    url: api + "/employee/employeeOperate",
+    method: "post",
     data: qs.stringify(data)
-  })
+  });
 }
 
 // 分页查询角色列表
-export function roleQueryPage (data) {
+export function roleQueryPage(data) {
   return request({
     url: `/api-auth/role/queryPage`,
-    method: 'get',
+    method: "get",
     params: data
-  })
+  });
 }
 
 // 根据角色编号查询拥有的菜单列表
-export function roleGetMenus (data) {
+export function roleGetMenus(data) {
   return request({
     url: `/api-auth/role/getMenus`,
-    method: 'get',
+    method: "get",
     params: data
-  })
+  });
 }
 
 // 根据权限id查询角色
-export function getRoleInfo (data) {
+export function getRoleInfo(data) {
   return request({
     url: `/api-auth/role/${data.id}`,
-    method: 'get'
-  })
+    method: "get"
+  });
 }
 
 // 修改角色
-export function roleUpdate (data) {
+export function roleUpdate(data) {
   return request({
     url: `/api-auth/role/update`,
-    method: 'post',
+    method: "post",
     data: data
-  })
+  });
 }
 
 // 添加角色
-export function roleAdd (data) {
+export function roleAdd(data) {
   return request({
     url: `/api-auth/role/add`,
-    method: 'post',
+    method: "post",
     data: data
-  })
+  });
 }
 
 // 查询规则列表
-export function courseScheduleRewards (data) {
+export function courseScheduleRewards(data) {
   return request({
     url: api + `/courseScheduleRewards/queryPage`,
-    method: 'get',
+    method: "get",
     params: data
-  })
+  });
 }
 
 // 单查询
-export function courseScheduleRewardsQuery (data) {
+export function courseScheduleRewardsQuery(data) {
   return request({
     url: api + `/courseScheduleRewards/query`,
-    method: 'get',
+    method: "get",
     params: data
-  })
+  });
 }
 
 // 添加
-export function courseScheduleRewardsAdd (data) {
+export function courseScheduleRewardsAdd(data) {
   return request({
     url: api + `/courseScheduleRewards/add`,
-    method: 'post',
+    method: "post",
     data: qs.stringify(data)
-  })
+  });
 }
 
 // 修改
-export function courseScheduleRewardsUpdate (data) {
+export function courseScheduleRewardsUpdate(data) {
   return request({
     url: api + `/courseScheduleRewards/update`,
-    method: 'post',
+    method: "post",
     data: qs.stringify(data)
-  })
+  });
 }
 
 // 分页查询热词列表
-export function hotWordLabelManage (data) {
+export function hotWordLabelManage(data) {
   return request({
     url: api + `/hotWordLabelManage/queryPage`,
-    method: 'get',
+    method: "get",
     params: data
-  })
+  });
 }
 
 // 新增热词标签
-export function hotWordLabelManageAdd (data) {
+export function hotWordLabelManageAdd(data) {
   return request({
     url: api + `/hotWordLabelManage/add`,
-    method: 'post',
+    method: "post",
     data: qs.stringify(data)
-  })
+  });
 }
 
 // 修改热词标签
-export function hotWordLabelManageUpdate (data) {
+export function hotWordLabelManageUpdate(data) {
   return request({
     url: api + `/hotWordLabelManage/update`,
-    method: 'post',
+    method: "post",
     data: qs.stringify(data)
-  })
+  });
 }
 
 // 删除热词标签
-export function hotWordLabelManageDel (data) {
+export function hotWordLabelManageDel(data) {
   return request({
     url: api + `/hotWordLabelManage/del/${data}`,
-    method: 'post'
-  })
+    method: "post"
+  });
 }
 
 // 根据机构编号获取学校列表
-export function getSchool (data) {
+export function getSchool(data) {
   return request({
     url: api + `/school/queryByOrganId`,
-    method: 'get',
+    method: "get",
     params: data
-  })
+  });
 }
 
 // 分页查询支付配置列表
-export function paymentConfigQueryPage (data) {
+export function paymentConfigQueryPage(data) {
   return request({
-    url: api + '/paymentConfig/queryPage',
-    method: 'get',
+    url: api + "/paymentConfig/queryPage",
+    method: "get",
     params: data
-  })
+  });
 }
 
 // 根据支付配置编号查询支付配置
-export function paymentConfigGet (data) {
+export function paymentConfigGet(data) {
   return request({
-    url: api + '/paymentConfig/get/' + data.id,
-    method: 'get',
-  })
+    url: api + "/paymentConfig/get/" + data.id,
+    method: "get"
+  });
 }
 
 // 新增支付配置
-export function paymentConfigAdd (data) {
+export function paymentConfigAdd(data) {
   return request({
-    url: api + '/paymentConfig/add',
-    method: 'post',
+    url: api + "/paymentConfig/add",
+    method: "post",
     data: qs.stringify(data)
-  })
+  });
 }
 
 // 修改支付配置
-export function paymentConfigUpdate (data) {
+export function paymentConfigUpdate(data) {
   return request({
-    url: api + '/paymentConfig/update',
-    method: 'post',
+    url: api + "/paymentConfig/update",
+    method: "post",
     data: qs.stringify(data)
-  })
+  });
 }
 
 // 删除支付配置
-export function paymentConfigDel (data) {
+export function paymentConfigDel(data) {
   return request({
-    url: api + '/paymentConfig/del/' + data.id,
-    method: 'post'
-  })
+    url: api + "/paymentConfig/del/" + data.id,
+    method: "post"
+  });
 }
 
 // 根据分部查询老师
-export function findTeacherByOrganId (data) {
+export function findTeacherByOrganId(data) {
   return request({
-    url: api + '/teacher/findTeacherByOrganId',
-    method: 'get',
+    url: api + "/teacher/findTeacherByOrganId",
+    method: "get",
     params: data
-  })
+  });
 }
 
 // 获取版本控制列表
-export function appVersionInfo (data) {
+export function appVersionInfo(data) {
   return request({
-    url: api + '/appVersionInfo/list',
-    method: 'get',
+    url: api + "/appVersionInfo/list",
+    method: "get",
     params: data
-  })
+  });
 }
 
 // 新增版本管理
-export function addAppVersionInfo (data) {
+export function addAppVersionInfo(data) {
   return request({
-    url: api + '/appVersionInfo/add',
-    method: 'post',
+    url: api + "/appVersionInfo/add",
+    method: "post",
     data: qs.stringify(data)
-  })
+  });
 }
 
 // 修改版本管理
-export function resetAppVersionInfo (data) {
+export function resetAppVersionInfo(data) {
   return request({
-    url: api + '/appVersionInfo/update',
-    method: 'post',
+    url: api + "/appVersionInfo/update",
+    method: "post",
     data: qs.stringify(data)
-  })
+  });
 }
 
 // 判断该用户是否是乐团主管关联的学生乐团 employee/hasCourseGroupRelation
-export function hasCourseGroupRelation (data) {
+export function hasCourseGroupRelation(data) {
   return request({
-    url: api + '/employee/hasCourseGroupRelation',
-    method: 'post',
+    url: api + "/employee/hasCourseGroupRelation",
+    method: "post",
     data: qs.stringify(data)
-  })
+  });
 }
 
 // 乐团主管转移课程
 
-export function updateEducationTeacherId (data) {
+export function updateEducationTeacherId(data) {
   return request({
-    url: api + '/employee/updateEducationTeacherId',
-    method: 'post',
+    url: api + "/employee/updateEducationTeacherId",
+    method: "post",
     data: qs.stringify(data)
-  })
+  });
 }
 
 // 获取员工所在分部列表(管理员查看所有的分部)
 export function queryEmployeeOrganByUser(data) {
   return request({
-    url: api + '/organization/queryEmployeeOrganByUser',
-    method: 'get',
+    url: api + "/organization/queryEmployeeOrganByUser",
+    method: "get",
     params: data
-  })
+  });
 }
 
 // request2
-export const getPosition = data => request2({
-  url:api +  '/position/findAll',
-  params:data,
-  method: 'get',
-  requestType: 'form'
-})
+export const getPosition = data =>
+  request2({
+    url: api + "/position/findAll",
+    params: data,
+    method: "get",
+    requestType: "form"
+  });
 
 // 修改员工
-export const simpleUpdate = data => request2({
-  url: api +  '/employee/simpleUpdate',
-  method: 'post',
-  data
-})
+export const simpleUpdate = data =>
+  request2({
+    url: api + "/employee/simpleUpdate",
+    method: "post",
+    data
+  });
 
 // 重置密码
 export const resetPassword = data => {
   return request2({
-    url: '/api-web/employee/resetPassword',
-    method: 'post',
+    url: "/api-web/employee/resetPassword",
+    method: "post",
     data,
-    requestType:'form'
-  })
-}
+    requestType: "form"
+  });
+};

+ 15 - 3
src/components/singe-file-upload/index.vue

@@ -10,8 +10,11 @@
     :file-list="filelist"
     :before-upload="beforeUpload"
     :accept="accept"
+    :disabled="disabled"
   >
-    <el-button type="primary" plain>{{ buttonText }}</el-button>
+    <el-button type="primary" plain :disabled="disabled">{{
+      buttonText
+    }}</el-button>
     <div slot="tip" v-if="tips" class="el-upload__tip">{{ tips }}</div>
     <div slot="file" slot-scope="{ file }">
       <div
@@ -32,7 +35,11 @@
           ></i>
           <span class="upload-text" :title="file.url">{{ file.url }}</span>
         </div>
-        <i v-if="!!file.url" class="el-icon-delete" @click="remove"></i>
+        <i
+          v-if="!!file.url && !disabled"
+          class="el-icon-delete"
+          @click="remove"
+        ></i>
       </div>
     </div>
   </el-upload>
@@ -66,6 +73,10 @@ export default {
     bucket_name: {
       type: String,
       default: "daya"
+    },
+    disabled: {
+      type: Boolean,
+      default: false
     }
   },
   watch: {
@@ -244,7 +255,8 @@ export default {
 <style lang="less" scoped>
 .upload-text {
   display: inline-block;
-  width: 100%;
+  width: 90%;
+  max-width: 400px;
   overflow: hidden;
   white-space: nowrap;
   text-overflow: ellipsis;

+ 6 - 3
src/constant/index.js

@@ -84,7 +84,8 @@ export const userPaymentType = {
   ADD_COURSE: "临时加课",
   MUSIC_APPLY: "乐团报名",
   MUSIC_RENEW: "乐团续费",
-  SPAN_GROUP_CLASS_ADJUST: "跨团合班"
+  SPAN_GROUP_CLASS_ADJUST: "跨团合班",
+  GOODS_PURCHASE: "商品采购"
 };
 
 export const payStatus = {
@@ -116,7 +117,8 @@ export const auditPaymentType = {
   ADD_COURSE: "临时加课",
   MUSIC_APPLY: "乐团报名",
   MUSIC_RENEW: "乐团续费",
-  SPAN_GROUP_CLASS_ADJUST: "合班缴费"
+  SPAN_GROUP_CLASS_ADJUST: "合班缴费",
+  GOODS_PURCHASE: "商品采购"
 };
 
 export const orderServerType = {
@@ -391,7 +393,8 @@ export const orderType = {
   OTHER: "其他",
   ACTIVITY: "活动购买",
   LIVE_BUY: "直播购物",
-  LIVE_GROUP_BUY: "直播课购买"
+  LIVE_GROUP_BUY: "直播课购买",
+  SCHOOL_GOODS_PURCHASE: "商品采购"
 };
 
 export const backType = {

+ 28 - 0
src/store/modules/permission.js

@@ -347,6 +347,34 @@ function setDetailRoute(accessedRoutes) {
           }
         },
         {
+          name: "缴费设置",
+          path: "goodsPaySet",
+          component: () =>
+            import("@/views/resetTeaming/components/goodsPayInfo"),
+          hidden: true,
+          meta: {
+            noCache: "1",
+            title: "缴费设置",
+            belongTopMenu: "/business",
+            activeMenu: "/teamList",
+            id: "xx3"
+          }
+        },
+        {
+          name: "商品采购设置",
+          path: "goodsPaySet2",
+          component: () =>
+            import("@/views/resetTeaming/components/goodsPayInfo"),
+          hidden: true,
+          meta: {
+            noCache: "1",
+            title: "商品采购设置",
+            belongTopMenu: "/financialManager",
+            activeMenu: "/payschoolList",
+            id: "xx3"
+          }
+        },
+        {
           name: "乐团详情",
           path: "resetTeaming",
           component: () => import("@/views/resetTeaming/index"),

+ 4 - 0
src/utils/searchArray.js

@@ -431,6 +431,10 @@ export const orderStatus = [
   {
     value: "LIVE_GROUP_BUY",
     label: "直播课购买"
+  },
+  {
+    value: "SCHOOL_GOODS_PURCHASE",
+    label: "商品采购"
   }
 ];
 

+ 72 - 23
src/views/auditList/musicGroup.vue

@@ -17,7 +17,7 @@
             v-model.trim="searchForm.search"
             clearable
             @keyup.enter.native="
-              (e) => {
+              e => {
                 e.target.blur();
                 $refs.searchForm.save();
                 search();
@@ -93,7 +93,10 @@
         <el-form-item>
           <el-button @click="search" type="primary">搜索</el-button>
           <el-button @click="reset" type="danger">重置</el-button>
-          <auth auths="musicGroupPaymentCalender/batchAuditing" style="margin-left: 10px">
+          <auth
+            auths="musicGroupPaymentCalender/batchAuditing"
+            style="margin-left: 10px"
+          >
             <el-button
               @click="typesStatus = true"
               :disabled="!selList.length > 0"
@@ -120,7 +123,12 @@
               <copy-text>{{ scope.row.organName }}</copy-text>
             </template>
           </el-table-column>
-          <el-table-column align="left" width="200px" prop="musicGroupName" label="乐团">
+          <el-table-column
+            align="left"
+            width="200px"
+            prop="musicGroupName"
+            label="乐团"
+          >
             <template slot-scope="scope">
               <div>
                 <Tooltip :content="scope.row.musicGroupName" />
@@ -146,7 +154,12 @@
               </div>
             </template>
           </el-table-column>
-          <el-table-column align="left" prop="paymentType" label="类型" width="150px">
+          <el-table-column
+            align="left"
+            prop="paymentType"
+            label="类型"
+            width="150px"
+          >
             <template slot-scope="scope">
               <div>
                 <p>申请类型: {{ scope.row.paymentType | auditPaymentType }}</p>
@@ -166,7 +179,11 @@
             prop="addCourseTotalTime"
             label="加课总时长(分钟)"
           ></el-table-column> -->
-          <el-table-column align="left" prop="originalTotalAmount" label="价格(元)">
+          <el-table-column
+            align="left"
+            prop="originalTotalAmount"
+            label="价格(元)"
+          >
             <template slot-scope="scope">
               <div>
                 <p>总原价:{{ scope.row.originalTotalAmount }}</p>
@@ -181,32 +198,56 @@
               <overflow-text width="80px" :text="scope.row.memo" />
             </template>
           </el-table-column>
-          <el-table-column align="left" prop="auditMemo" width="100px" label="审核意见">
+          <el-table-column
+            align="left"
+            prop="auditMemo"
+            width="100px"
+            label="审核意见"
+          >
             <template slot-scope="scope">
               <overflow-text width="80px" :text="scope.row.auditMemo" />
             </template>
           </el-table-column>
-          <el-table-column align="left" prop="operatorName" label="申请人" width="150px">
+          <el-table-column
+            align="left"
+            prop="operatorName"
+            label="申请人"
+            width="150px"
+          >
             <template slot-scope="scope">
               <div>
-                <p>{{ scope.row.operatorName ? scope.row.operatorName : "--" }}</p>
+                <p>
+                  {{ scope.row.operatorName ? scope.row.operatorName : "--" }}
+                </p>
                 <p>{{ scope.row.createTime | dateForMinFormat }}</p>
               </div>
             </template>
           </el-table-column>
-          <el-table-column align="left" prop="operatorName" label="审核人" width="150px">
+          <el-table-column
+            align="left"
+            prop="operatorName"
+            label="审核人"
+            width="150px"
+          >
             <template slot-scope="scope">
               <div>
                 <p>{{ scope.row.auditName ? scope.row.auditName : "--" }}</p>
                 <p>
                   {{
-                    scope.row.auditTime ? scope.row.auditTime : "--" | dateForMinFormat
+                    scope.row.auditTime
+                      ? scope.row.auditTime
+                      : "--" | dateForMinFormat
                   }}
                 </p>
               </div>
             </template>
           </el-table-column>
-          <el-table-column align="left" prop="status" label="状态" width="100px">
+          <el-table-column
+            align="left"
+            prop="status"
+            label="状态"
+            width="100px"
+          >
             <template slot-scope="scope">
               <div>
                 {{ scope.row.status | auditType }}
@@ -230,7 +271,9 @@
                 type="text"
                 v-if="
                   scope.row.status == 'AUDITING' &&
-                  $helpers.permission('musicGroupPaymentCalender/auditListDetail/update')
+                    $helpers.permission(
+                      'musicGroupPaymentCalender/auditListDetail/update'
+                    )
                 "
               >
                 审核
@@ -240,7 +283,9 @@
                 type="text"
                 v-if="
                   scope.row.status != 'AUDITING' &&
-                  $helpers.permission('musicGroupPaymentCalender/getDetail/look')
+                    $helpers.permission(
+                      'musicGroupPaymentCalender/getDetail/look'
+                    )
                 "
               >
                 查看
@@ -272,7 +317,11 @@
       :visible.sync="typesStatus"
       v-if="typesStatus"
     >
-      <audit :selList="selList" @close="typesStatus = false" @submited="submited" />
+      <audit
+        :selList="selList"
+        @close="typesStatus = false"
+        @submited="submited"
+      />
     </el-dialog>
   </div>
 </template>
@@ -291,7 +340,7 @@ const initSearch = {
   paymentType: null,
   status: "AUDITING",
   organId: null,
-  audit: null,
+  audit: null
 };
 export default {
   components: { pagination, Tooltip, review, audit },
@@ -311,10 +360,10 @@ export default {
         limit: 10, // 限制显示条数
         page: 1, // 当前页
         total: 0, // 总条数
-        page_size: [10, 20, 40, 50], // 选择限制显示条数
+        page_size: [10, 20, 40, 50] // 选择限制显示条数
       },
       detail: null,
-      typeStatus: false,
+      typeStatus: false
     };
   },
   mounted() {
@@ -343,9 +392,9 @@ export default {
       let params = {
         page: this.pageInfo.page,
         rows: this.pageInfo.limit,
-        ...this.searchForm,
+        ...this.searchForm
       };
-      getAuditList(params).then((res) => {
+      getAuditList(params).then(res => {
         let result = res.data;
         if (res.code == 200) {
           this.tableList = result.rows;
@@ -368,7 +417,7 @@ export default {
         id: row.id,
         musicGroupId: row.musicGroupId,
         status: row.status,
-        batchNo: row.batchNo,
+        batchNo: row.batchNo
       };
       this.typeStatus = true;
     },
@@ -379,15 +428,15 @@ export default {
     close() {
       this.typeStatus = false;
       this.getList();
-    },
+    }
   },
   watch: {
     typeStatus(val) {
       if (!val) {
         this.detail = null;
       }
-    },
-  },
+    }
+  }
 };
 </script>
 <style lang="scss" scoped>

+ 46 - 16
src/views/branchPayManager/payschoolList.vue

@@ -14,7 +14,7 @@
             v-model.trim="searchForm.search"
             clearable
             @keyup.enter.native="
-              (e) => {
+              e => {
                 e.target.blur();
                 $refs.saveForm.save();
                 search();
@@ -43,7 +43,7 @@
             end-placeholder="缴费结束日期"
             value-format="yyyy-MM-dd"
             :picker-options="{
-              firstDayOfWeek: 1,
+              firstDayOfWeek: 1
             }"
           ></el-date-picker>
         </el-form-item>
@@ -129,6 +129,13 @@
               </div>
             </template>
           </el-table-column>
+          <el-table-column align="center" prop="memo" label="备注内容">
+            <template slot-scope="scope">
+              <div>
+                <tooltip :content="scope.row.memo" />
+              </div>
+            </template>
+          </el-table-column>
           <el-table-column align="center" prop="studentId" label="操作">
             <template slot-scope="scope">
               <div>
@@ -144,6 +151,15 @@
                   @click="downLoad(scope.row)"
                   >下载合同</el-button
                 >
+
+                <auth
+                  auths="musicGroupCalenderRefundPeriod/batchUpdate"
+                  v-if="scope.row.paymentType === 'GOODS_PURCHASE'"
+                >
+                  <el-button type="text" @click="onChangeTime(scope.row)"
+                    >修改账期</el-button
+                  >
+                </auth>
               </div>
             </template>
           </el-table-column>
@@ -197,7 +213,8 @@ export default {
     return {
       searchForm: {
         cooperationId: this.$route.query.id,
-        refundStatus:''
+        refundStatus: "",
+        payTime: []
       },
       name: this.$route.query.name,
       backTypeList,
@@ -209,13 +226,13 @@ export default {
         limit: 10, // 限制显示条数
         page: 1, // 当前页
         total: 0, // 总条数
-        page_size: [10, 20, 40, 50], // 选择限制显示条数
+        page_size: [10, 20, 40, 50] // 选择限制显示条数
       },
       form: {
-        id: null,
+        id: null
       },
       reviewVisible: false,
-      viewDetail: null,
+      viewDetail: null
     };
   },
   //生命周期 - 创建完成(可以访问当前this实例)
@@ -236,7 +253,7 @@ export default {
         ...rest,
         ...getTimes(payTime, ["refundStartDate", "refundEndDate"]),
         page: this.rules.page,
-        rows: this.rules.limit,
+        rows: this.rules.limit
       };
       try {
         const res = await getCoopCalenderList(params);
@@ -252,22 +269,35 @@ export default {
     },
     onReSet() {
       this.$refs["searchForm"].resetFields();
+      this.searchForm.payTime = []
       this.searchForm.cooperationId = this.$route.query.id;
       this.search();
     },
     goBack() {
-      this.$store.dispatch('delVisitedViews', this.$route)
-      this.$router.push('/branchPayManager')
+      this.$store.dispatch("delVisitedViews", this.$route);
+      this.$router.push("/branchPayManager");
     },
     lookList(row) {
       this.viewDetail = row;
       this.viewDetail.id = row.calenderId;
       this.reviewVisible = true;
     },
+    onChangeTime(row) {
+      let query = this.$route.query;
+      this.$router.push({
+        path: "/business/goodsPaySet",
+        query: {
+          calenderId: row.calenderId,
+          musicGroupId: row.musicGroupId,
+          type: "payschoolList",
+          ...query
+        }
+      });
+    },
     async downLoad(row) {
       try {
         await this.$confirm(`是否下载批次号为${row.batchNo}合同`, "提示", {
-          type: "warning",
+          type: "warning"
         });
         window.open(row.contractUrl);
       } catch (e) {
@@ -280,7 +310,7 @@ export default {
       this.resetVisible = true;
     },
     resetRorm() {
-      this.$refs.form.validate(async (flag) => {
+      this.$refs.form.validate(async flag => {
         if (flag) {
           try {
             if (!this.form.transNo) {
@@ -304,7 +334,7 @@ export default {
         rows: this.rules.limit,
         organId: organId.join(","),
         ...getTimes(backTime, ["createStartTime", "createEndTime"]),
-        ...getTimes(payTime, ["payStartTime", "payEndTime"]),
+        ...getTimes(payTime, ["payStartTime", "payEndTime"])
       };
       Export(
         this,
@@ -312,14 +342,14 @@ export default {
           url: "/api-web/export/userCashAccountLog",
           fileName: "退费列表.xls",
           method: "post",
-          params: qs.stringify(params),
+          params: qs.stringify(params)
         },
         "您确定导出退费列表?"
       );
     },
     changeOrgan(val) {
       this.searchForm.cooperationId = null;
-    },
+    }
   },
   watch: {
     // "searchForm.organId"(val) {
@@ -338,10 +368,10 @@ export default {
     //     });
     //   }
     // },
-  },
+  }
 };
 </script>
-<style lang='scss' scoped>
+<style lang="scss" scoped>
 .search {
   ::v-deep .el-input__inner {
     width: 260px !important;

+ 159 - 125
src/views/businessManager/orderManager/financeManager-taoqi.vue

@@ -451,6 +451,7 @@
               :disabled="!isAdd"
               @change="checkSchool"
               style="width: 100% !important"
+              filterable
             >
               <el-option
                 v-for="(item, index) in cooperationList"
@@ -466,7 +467,11 @@
             prop="insertOrderType"
             :label-width="formLabelWidth"
           >
-            <el-radio-group v-model="insertOrderType" :disabled="!isAdd">
+            <el-radio-group
+              v-model="insertOrderType"
+              :disabled="!isAdd"
+              @change="form.calenderId = null"
+            >
               <el-radio :label="1">个人订单</el-radio>
               <el-radio :label="2">学校订单</el-radio>
               <el-radio :label="3">其它订单</el-radio>
@@ -558,134 +563,153 @@
             >
             </el-date-picker>
           </el-form-item>
-          <el-form-item
-            label="收入类型"
-            v-if="isAdd"
-            :label-width="formLabelWidth"
-            prop="applyType"
-          >
-            <el-select
-              class="multiple"
-              style="width: 100% !important"
-              v-model.trim="form.applyType"
-              @change="changeApplyType"
-              filterable
-              clearable
-              :disabled="!isAdd"
-              placeholder="请选择收入类型"
+          <div v-if="!form.calenderId">
+            <el-form-item
+              label="收入类型"
+              v-if="isAdd"
+              :label-width="formLabelWidth"
+              prop="applyType"
             >
-              <el-option
-                v-for="(item, index) in orderServerList"
+              <el-select
+                class="multiple"
+                style="width: 100% !important"
+                v-model.trim="form.applyType"
+                @change="changeApplyType"
+                filterable
+                clearable
+                :disabled="!isAdd"
+                placeholder="请选择收入类型"
+              >
+                <el-option
+                  v-for="(item, index) in orderServerList"
+                  :key="index"
+                  :label="item.label"
+                  :value="item.value"
+                ></el-option>
+              </el-select>
+            </el-form-item>
+            <div v-if="form.applyType == 'SELL'">
+              <div
+                v-for="(goodsList, index) in form.goodsList"
                 :key="index"
-                :label="item.label"
-                :value="item.value"
-              ></el-option>
-            </el-select>
-          </el-form-item>
-          <div v-if="form.applyType == 'SELL'">
-            <div
-              v-for="(goodsList, index) in form.goodsList"
-              :key="index"
-              class="shopListWrap"
-            >
-              <el-form-item
-                :label="'商品名称' + (index + 1)"
-                :label-width="formLabelWidth"
-                class="setWidth"
-                :prop="'goodsList.' + index + '.id'"
-                :rules="[
-                  { required: true, message: '请选择商品', trigger: 'change' }
-                ]"
+                class="shopListWrap"
               >
-                <el-select
-                  v-if="isAdd"
-                  v-model.trim="goodsList.id"
-                  filterable
-                  :disabled="!isAdd || !form.routeOrganId"
-                  @change="checkgoods"
-                  placeholder="请选择商品"
+                <el-form-item
+                  :label="'商品名称' + (index + 1)"
+                  :label-width="formLabelWidth"
+                  class="setWidth"
+                  :prop="'goodsList.' + index + '.id'"
+                  :rules="[
+                    { required: true, message: '请选择商品', trigger: 'change' }
+                  ]"
                 >
-                  <el-option
-                    v-for="(item, index) in shopList"
-                    :key="index"
-                    :label="item.name"
-                    :value="item.id"
+                  <el-select
+                    v-if="isAdd"
+                    v-model.trim="goodsList.id"
+                    filterable
+                    :disabled="!isAdd || !form.routeOrganId"
+                    @change="checkgoods"
+                    placeholder="请选择商品"
                   >
-                    <span style="float: left"
-                      >{{ item.name
-                      }}<span v-if="item.sn">({{ item.sn }})</span></span
-                    >
-                    <span style="float: right; color: #8492a6; font-size: 13px"
-                      >{{ item.groupPurchasePrice || 0 }}元</span
+                    <el-option
+                      v-for="(item, index) in shopList"
+                      :key="index"
+                      :label="item.name"
+                      :value="item.id"
                     >
-                  </el-option>
-                </el-select>
-                <p class="showShop" v-else>
-                  <Tooltip :content="goodsList.id | filterShopId" />
-                </p>
-              </el-form-item>
-              <el-form-item
-                class="setWidth"
-                style="margin: 0 10px"
-                :prop="'goodsList.' + index + '.number'"
-                :rules="validAmount"
-              >
-                <!-- <el-input-number style="width: 160px;" v-model="goodsList.number" placeholder="商品数量"></el-input-number> -->
-                <el-input
-                  type="age"
-                  style="width: 160px"
+                      <span style="float: left"
+                        >{{ item.name
+                        }}<span v-if="item.sn">({{ item.sn }})</span></span
+                      >
+                      <span
+                        style="float: right; color: #8492a6; font-size: 13px"
+                        >{{ item.discountPrice || 0 }}元</span
+                      >
+                    </el-option>
+                  </el-select>
+                  <p class="showShop" v-else>
+                    <Tooltip :content="goodsList.id | filterShopId" />
+                  </p>
+                </el-form-item>
+                <el-form-item
+                  class="setWidth"
+                  style="margin: 0 10px"
+                  :prop="'goodsList.' + index + '.number'"
+                  :rules="validAmount"
+                >
+                  <!-- <el-input-number style="width: 160px;" v-model="goodsList.number" placeholder="商品数量"></el-input-number> -->
+                  <el-input
+                    type="age"
+                    style="width: 160px"
+                    :disabled="!isAdd || !form.routeOrganId"
+                    clearable
+                    placeholder="请输入商品数量"
+                    @mousewheel.native.prevent
+                    v-model.number="goodsList.number"
+                  ></el-input>
+                </el-form-item>
+                <el-button
+                  icon="el-icon-minus"
+                  :disabled="!isAdd || !form.routeOrganId"
+                  v-if="form.goodsList.length > 1"
+                  circle
+                  style="height: 40px"
+                  @click.prevent="removeGoodsList(goodsList)"
+                ></el-button>
+                <el-button
+                  icon="el-icon-plus"
                   :disabled="!isAdd || !form.routeOrganId"
-                  clearable
-                  placeholder="请输入商品数量"
-                  @mousewheel.native.prevent
-                  v-model.number="goodsList.number"
-                ></el-input>
-              </el-form-item>
-              <el-button
-                icon="el-icon-minus"
-                :disabled="!isAdd || !form.routeOrganId"
-                v-if="form.goodsList.length > 1"
-                circle
-                style="height: 40px"
-                @click.prevent="removeGoodsList(goodsList)"
-              ></el-button>
-              <el-button
-                icon="el-icon-plus"
-                :disabled="!isAdd || !form.routeOrganId"
-                @click.prevent="addGoodsList"
-                circle
-                style="margin-left: 5px; height: 40px"
-              ></el-button>
+                  @click.prevent="addGoodsList"
+                  circle
+                  style="margin-left: 5px; height: 40px"
+                ></el-button>
+              </div>
             </div>
+            <el-form-item
+              label="销售金额"
+              v-if="form.applyType == 'SELL' || !isAdd"
+              prop="saleAmount"
+              :label-width="formLabelWidth"
+            >
+              <el-input
+                v-model="form.saleAmount"
+                @mousewheel.native.prevent
+                type="number"
+                :disabled="!isAdd"
+                placeholder="请输入销售金额"
+              />
+            </el-form-item>
+            <el-form-item
+              label="服务金额"
+              v-if="form.applyType == 'SERVICE' || !isAdd"
+              prop="serviceAmount"
+              :label-width="formLabelWidth"
+            >
+              <el-input
+                type="number"
+                @mousewheel.native.prevent
+                :disabled="!isAdd"
+                v-model="form.serviceAmount"
+                placeholder="请输入收入金额"
+              />
+            </el-form-item>
+          </div>
+          <div v-if="form.calenderId">
+            <el-form-item
+              label="回款金额"
+              prop="routeAmount"
+              :label-width="formLabelWidth"
+              :rules="[{ required: true, message: '请输入回款金额' }]"
+            >
+              <el-input
+                type="number"
+                @mousewheel.native.prevent
+                :disabled="!isAdd"
+                v-model="form.routeAmount"
+                placeholder="请输入回款金额"
+              />
+            </el-form-item>
           </div>
-          <el-form-item
-            label="销售金额"
-            v-if="form.applyType == 'SELL' || !isAdd"
-            prop="saleAmount"
-            :label-width="formLabelWidth"
-          >
-            <el-input
-              v-model="form.saleAmount"
-              @mousewheel.native.prevent
-              type="number"
-              :disabled="!isAdd"
-              placeholder="请输入销售金额"
-            />
-          </el-form-item>
-          <el-form-item
-            label="服务金额"
-            v-if="form.applyType == 'SERVICE' || !isAdd"
-            prop="serviceAmount"
-            :label-width="formLabelWidth"
-          >
-            <el-input
-              type="number"
-              @mousewheel.native.prevent
-              :disabled="!isAdd"
-              v-model="form.serviceAmount"
-              placeholder="请输入收入金额"
-            />
-          </el-form-item>
           <div class="lookTitle">其它</div>
           <el-form-item label="备注" prop="memo" :label-width="formLabelWidth">
             <el-input
@@ -810,6 +834,7 @@ export default {
         payTime: null,
         serviceAmount: null,
         saleAmount: null,
+        routeAmount: null, // 回款金额
         schoolId: null,
         goodsList: [
           {
@@ -899,19 +924,27 @@ export default {
       this.$refs[formName].validate(valid => {
         if (valid) {
           let form = JSON.parse(JSON.stringify(this.form));
-          if (!form.saleAmount && !form.serviceAmount) {
+          if (!form.calenderId && !form.saleAmount && !form.serviceAmount) {
             this.$message.error("请输入销售收入或服务收入");
             return;
           }
           if (!form.saleAmount) {
             form.goodsList = null;
           }
+          if (form.calenderId) {
+            form.goodsList = null;
+            form.saleAmount = null;
+            form.serviceAmount = null;
+            form.applyType = null;
+          }
           let goodsJson = {};
           for (let i in form.goodsList) {
             goodsJson[form.goodsList[i]["id"]] = form.goodsList[i]["number"];
           }
           form.goodsJson =
-            form.applyType == "SERVICE" ? null : JSON.stringify(goodsJson);
+            form.applyType == "SERVICE" || form.calenderId
+              ? null
+              : JSON.stringify(goodsJson);
           if (this.insertOrderType == 1) {
             form.calenderId = null;
             form.type = "PERSONAL";
@@ -1237,15 +1270,16 @@ export default {
               payTime: orderInfo.payTime,
               serviceAmount: res.data.serviceAmount,
               saleAmount: res.data.goodsAmount,
-              schoolId: parseInt(orderInfo.musicGroupId) || "    ",
+              schoolId:
+                parseInt(orderInfo.musicGroupId) || res.data.coopName || "    ",
               applyType: "SELL",
               calenderId: res.data.calenderId ? res.data.calenderId : ""
             }),
               this.$set(
                 this.form,
                 "goodsList",
-                res.data.sellOrders.map(item => {
-                  return { id: item.goodsId, number: item.num };
+                res.data.goodsSellDtos?.map(item => {
+                  return { id: item.goodsId, number: item.goodsNum };
                 })
               );
             if (orderInfo.userId && !res.data.calenderId) {

+ 170 - 126
src/views/businessManager/orderManager/financeManager.vue

@@ -493,6 +493,7 @@
               :disabled="!isAdd"
               @change="checkSchool"
               style="width: 100% !important"
+              filterable
             >
               <el-option
                 v-for="(item, index) in cooperationList"
@@ -508,7 +509,11 @@
             prop="insertOrderType"
             :label-width="formLabelWidth"
           >
-            <el-radio-group v-model="insertOrderType" :disabled="!isAdd">
+            <el-radio-group
+              v-model="insertOrderType"
+              :disabled="!isAdd"
+              @change="form.calenderId = null"
+            >
               <el-radio :label="1">个人订单</el-radio>
               <el-radio :label="2">学校订单</el-radio>
               <el-radio :label="3">其它订单</el-radio>
@@ -538,6 +543,7 @@
               placeholder="请选择缴费单号"
               style="width: 100% !important"
               filterable
+              clearable
             >
               <el-option
                 v-for="(item, index) in getCalenderList"
@@ -600,134 +606,159 @@
             >
             </el-date-picker>
           </el-form-item>
-          <el-form-item
-            label="收入类型"
-            v-if="isAdd"
-            :label-width="formLabelWidth"
-            prop="applyType"
-          >
-            <el-select
-              class="multiple"
-              style="width: 100% !important"
-              v-model.trim="form.applyType"
-              @change="changeApplyType"
-              filterable
-              clearable
-              :disabled="!isAdd"
-              placeholder="请选择收入类型"
+          <div v-if="!form.calenderId || !isAdd">
+            <el-form-item
+              label="收入类型"
+              v-if="isAdd"
+              :label-width="formLabelWidth"
+              prop="applyType"
             >
-              <el-option
-                v-for="(item, index) in orderServerList"
+              <el-select
+                class="multiple"
+                style="width: 100% !important"
+                v-model.trim="form.applyType"
+                @change="changeApplyType"
+                filterable
+                clearable
+                :disabled="!isAdd"
+                placeholder="请选择收入类型"
+              >
+                <el-option
+                  v-for="(item, index) in orderServerList"
+                  :key="index"
+                  :label="item.label"
+                  :value="item.value"
+                ></el-option>
+              </el-select>
+            </el-form-item>
+            <div v-if="form.applyType == 'SELL'">
+              <div
+                v-for="(goodsList, index) in form.goodsList"
                 :key="index"
-                :label="item.label"
-                :value="item.value"
-              ></el-option>
-            </el-select>
-          </el-form-item>
-          <div v-if="form.applyType == 'SELL'">
-            <div
-              v-for="(goodsList, index) in form.goodsList"
-              :key="index"
-              class="shopListWrap"
-            >
-              <el-form-item
-                :label="'商品名称' + (index + 1)"
-                :label-width="formLabelWidth"
-                class="setWidth"
-                :prop="'goodsList.' + index + '.id'"
-                :rules="[
-                  { required: true, message: '请选择商品', trigger: 'change' }
-                ]"
+                class="shopListWrap"
               >
-                <el-select
-                  v-if="isAdd"
-                  v-model.trim="goodsList.id"
-                  filterable
-                  :disabled="!isAdd || !form.routeOrganId"
-                  @change="checkgoods"
-                  placeholder="请选择商品"
+                <el-form-item
+                  :label="'商品名称' + (index + 1)"
+                  :label-width="formLabelWidth"
+                  class="setWidth"
+                  :prop="'goodsList.' + index + '.id'"
+                  :rules="[
+                    { required: true, message: '请选择商品', trigger: 'change' }
+                  ]"
                 >
-                  <el-option
-                    v-for="(item, index) in shopList"
-                    :key="index"
-                    :label="item.name"
-                    :value="item.id"
+                  <el-select
+                    v-if="isAdd"
+                    v-model.trim="goodsList.id"
+                    filterable
+                    :disabled="!isAdd || !form.routeOrganId"
+                    @change="checkgoods"
+                    placeholder="请选择商品"
                   >
-                    <span style="float: left"
-                      >{{ item.name
-                      }}<span v-if="item.sn">({{ item.sn }})</span></span
+                    <el-option
+                      v-for="(item, index) in shopList"
+                      :key="index"
+                      :label="item.name"
+                      :value="item.id"
                     >
-                    <span style="float: right; color: #8492a6; font-size: 13px"
-                      >{{ item.groupPurchasePrice || 0 }}元</span
-                    >
-                  </el-option>
-                </el-select>
-                <p class="showShop" v-else>
-                  <Tooltip :content="goodsList.id | filterShopId" />
-                </p>
-              </el-form-item>
-              <el-form-item
-                class="setWidth"
-                style="margin: 0 10px"
-                :prop="'goodsList.' + index + '.number'"
-                :rules="validAmount"
-              >
-                <!-- <el-input-number style="width: 160px;" v-model="goodsList.number" placeholder="商品数量"></el-input-number> -->
-                <el-input
-                  type="age"
-                  style="width: 160px"
+                      <span style="float: left"
+                        >{{ item.name
+                        }}<span v-if="item.sn">({{ item.sn }})</span></span
+                      >
+                      <span
+                        style="float: right; color: #8492a6; font-size: 13px"
+                        >{{ item.discountPrice || 0 }}元</span
+                      >
+                    </el-option>
+                  </el-select>
+                  <p class="showShop" v-else>
+                    <Tooltip :content="goodsList.id | filterShopId" />
+                  </p>
+                </el-form-item>
+                <el-form-item
+                  class="setWidth"
+                  style="margin: 0 10px"
+                  :prop="'goodsList.' + index + '.number'"
+                  :rules="validAmount"
+                >
+                  <!-- <el-input-number style="width: 160px;" v-model="goodsList.number" placeholder="商品数量"></el-input-number> -->
+                  <el-input
+                    type="age"
+                    style="width: 160px"
+                    :disabled="!isAdd || !form.routeOrganId"
+                    clearable
+                    placeholder="请输入商品数量"
+                    @mousewheel.native.prevent
+                    v-model.number="goodsList.number"
+                  ></el-input>
+                </el-form-item>
+                <el-button
+                  icon="el-icon-minus"
+                  :disabled="!isAdd || !form.routeOrganId"
+                  v-if="form.goodsList.length > 1"
+                  circle
+                  style="height: 40px"
+                  @click.prevent="removeGoodsList(goodsList)"
+                ></el-button>
+                <el-button
+                  icon="el-icon-plus"
                   :disabled="!isAdd || !form.routeOrganId"
-                  clearable
-                  placeholder="请输入商品数量"
-                  @mousewheel.native.prevent
-                  v-model.number="goodsList.number"
-                ></el-input>
-              </el-form-item>
-              <el-button
-                icon="el-icon-minus"
-                :disabled="!isAdd || !form.routeOrganId"
-                v-if="form.goodsList.length > 1"
-                circle
-                style="height: 40px"
-                @click.prevent="removeGoodsList(goodsList)"
-              ></el-button>
-              <el-button
-                icon="el-icon-plus"
-                :disabled="!isAdd || !form.routeOrganId"
-                @click.prevent="addGoodsList"
-                circle
-                style="margin-left: 5px; height: 40px"
-              ></el-button>
+                  @click.prevent="addGoodsList"
+                  circle
+                  style="margin-left: 5px; height: 40px"
+                ></el-button>
+              </div>
             </div>
+            <el-form-item
+              label="销售金额"
+              v-if="
+                form.applyType == 'SELL' ||
+                  (!isAdd && form.saleAmount && !form.calenderId)
+              "
+              prop="saleAmount"
+              :label-width="formLabelWidth"
+            >
+              <el-input
+                v-model="form.saleAmount"
+                @mousewheel.native.prevent
+                type="number"
+                :disabled="!isAdd"
+                placeholder="请输入销售金额"
+              />
+            </el-form-item>
+            <el-form-item
+              label="服务金额"
+              v-if="
+                form.applyType == 'SERVICE' ||
+                  (!isAdd && form.serviceAmount && !form.calenderId)
+              "
+              prop="serviceAmount"
+              :label-width="formLabelWidth"
+            >
+              <el-input
+                type="number"
+                @mousewheel.native.prevent
+                :disabled="!isAdd"
+                v-model="form.serviceAmount"
+                placeholder="请输入收入金额"
+              />
+            </el-form-item>
+          </div>
+          <div v-if="form.calenderId">
+            <el-form-item
+              label="回款金额"
+              prop="routeAmount"
+              :label-width="formLabelWidth"
+              :rules="[{ required: true, message: '请输入回款金额' }]"
+            >
+              <el-input
+                type="number"
+                @mousewheel.native.prevent
+                :disabled="!isAdd"
+                v-model="form.routeAmount"
+                placeholder="请输入回款金额"
+              />
+            </el-form-item>
           </div>
-          <el-form-item
-            label="销售金额"
-            v-if="form.applyType == 'SELL' || !isAdd"
-            prop="saleAmount"
-            :label-width="formLabelWidth"
-          >
-            <el-input
-              v-model="form.saleAmount"
-              @mousewheel.native.prevent
-              type="number"
-              :disabled="!isAdd"
-              placeholder="请输入销售金额"
-            />
-          </el-form-item>
-          <el-form-item
-            label="服务金额"
-            v-if="form.applyType == 'SERVICE' || !isAdd"
-            prop="serviceAmount"
-            :label-width="formLabelWidth"
-          >
-            <el-input
-              type="number"
-              @mousewheel.native.prevent
-              :disabled="!isAdd"
-              v-model="form.serviceAmount"
-              placeholder="请输入收入金额"
-            />
-          </el-form-item>
           <div class="lookTitle">其它</div>
           <el-form-item label="备注" prop="memo" :label-width="formLabelWidth">
             <el-input
@@ -852,6 +883,7 @@ export default {
         payTime: null,
         serviceAmount: null,
         saleAmount: null,
+        routeAmount: null, // 回款金额
         schoolId: null,
         goodsList: [
           {
@@ -941,19 +973,27 @@ export default {
       this.$refs[formName].validate(valid => {
         if (valid) {
           let form = JSON.parse(JSON.stringify(this.form));
-          if (!form.saleAmount && !form.serviceAmount) {
+          if (!form.calenderId && !form.saleAmount && !form.serviceAmount) {
             this.$message.error("请输入销售收入或服务收入");
             return;
           }
           if (!form.saleAmount) {
             form.goodsList = null;
           }
+          if (form.calenderId) {
+            form.goodsList = null;
+            form.saleAmount = null;
+            form.serviceAmount = null;
+            form.applyType = null;
+          }
           let goodsJson = {};
           for (let i in form.goodsList) {
             goodsJson[form.goodsList[i]["id"]] = form.goodsList[i]["number"];
           }
           form.goodsJson =
-            form.applyType == "SERVICE" ? null : JSON.stringify(goodsJson);
+            form.applyType == "SERVICE" || form.calenderId
+              ? null
+              : JSON.stringify(goodsJson);
           if (this.insertOrderType == 1) {
             form.calenderId = null;
             form.type = "PERSONAL";
@@ -1281,15 +1321,19 @@ export default {
               payTime: orderInfo.payTime,
               serviceAmount: res.data.serviceAmount,
               saleAmount: res.data.goodsAmount,
-              schoolId: parseInt(orderInfo.musicGroupId) || "    ",
-              applyType: "SELL",
+              schoolId:
+                parseInt(orderInfo.musicGroupId) || res.data.coopName || "",
+              applyType: "",
               calenderId: res.data.calenderId ? res.data.calenderId : ""
             }),
               this.$set(
                 this.form,
                 "goodsList",
-                res.data.sellOrders.map(item => {
-                  return { id: item.goodsId, number: item.num };
+                res.data.goodsSellDtos?.map(item => {
+                  return {
+                    id: item.goodsId,
+                    number: item.goodsNum
+                  };
                 })
               );
 

+ 581 - 585
src/views/businessManager/orderManager/orderAudit/orderAuditDetail.vue

@@ -1,585 +1,581 @@
-<template>
-  <div>
-    <el-form :inline="true" ref="ruleForm">
-      <div class="lookTitle">申请信息</div>
-      <el-form-item label="申请人" label-width="80px">
-        <div style="width: 180px">
-          <p v-if="form.operator && form.operator.username">
-            {{ form.operator.username }}
-          </p>
-        </div>
-      </el-form-item>
-      <el-form-item label="申请时间" label-width="80px">
-        <div style="width: 180px">{{ form.createTime }}</div>
-      </el-form-item>
-    </el-form>
-    <el-form :model="form" ref="ruleForm">
-      <div class="lookTitle">基本信息</div>
-      <el-form-item
-        label="所属分部"
-        :rules="[{ required: true, message: '请选择分部', trigger: 'change' }]"
-        prop="routeOrganId"
-        :label-width="formLabelWidth"
-      >
-        <!--    -->
-        <el-select
-          v-model.trim="form.routeOrganId"
-          :disabled="!isAdd"
-          @change="changeOrgin"
-          style="width: 100% !important"
-        >
-          <el-option
-            v-for="(item, index) in selects.branchs"
-            :key="index"
-            :label="item.name"
-            :value="item.id"
-          ></el-option>
-        </el-select>
-      </el-form-item>
-      <el-form-item
-        label="所属学校"
-        prop="schoolId"
-        :label-width="formLabelWidth"
-      >
-        <!--    @change="checkSchool" -->
-        <el-select
-          v-model="form.schoolId"
-          :disabled="!isAdd"
-          style="width: 100% !important"
-        >
-          <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="insertOrderType"
-        :label-width="formLabelWidth"
-      >
-        <el-radio-group v-model="insertOrderType" :disabled="!isAdd">
-          <el-radio :label="1">个人订单</el-radio>
-          <el-radio :label="2">学校订单</el-radio>
-          <el-radio :label="3">其它订单</el-radio>
-        </el-radio-group>
-      </el-form-item>
-      <el-form-item
-        label="缴费单号"
-        prop="calenderId"
-        v-if="insertOrderType == 2 || insertOrderType == 3"
-        :label-width="formLabelWidth"
-         :rules="[{pattern:/^[0-9]*$/,message:'请输入正确的缴费单号',trigger: 'blur'}]"
-      >
-        <el-input
-          v-model.trim="form.calenderId"
-          :disabled="!isAdd"
-          placeholder="请输入缴费单号"
-        ></el-input>
-      </el-form-item>
-      <el-form-item
-        label="学员编号"
-        prop="userId"
-        v-if="insertOrderType == 1 || insertOrderType == 3"
-        :label-width="formLabelWidth"
-      >
-        <el-input
-          v-model.trim="form.userId"
-          :disabled="!isAdd"
-          placeholder="请输入学员编号"
-        ></el-input>
-      </el-form-item>
-      <div class="lookTitle">交易信息</div>
-      <el-form-item
-        label="交易流水号"
-        :rules="[
-          { required: true, message: '请输入流水号', trigger: 'change' },
-        ]"
-        prop="transNo"
-        :label-width="formLabelWidth"
-      >
-        <el-input
-          placeholder="请输入交易流水号"
-          type="text"
-          :disabled="!isAdd"
-          v-model.trim="form.transNo"
-        ></el-input>
-      </el-form-item>
-      <el-form-item
-        label="收款账户"
-        prop="merNo"
-        :rules="[
-          { required: true, message: '请输入收款账户', trigger: 'change' },
-        ]"
-        :label-width="formLabelWidth"
-      >
-        <el-input
-          placeholder="请输入收款账户"
-          type="text"
-          :disabled="!isAdd"
-          v-model.trim="form.merNo"
-        ></el-input>
-      </el-form-item>
-      <el-form-item
-        label="交易日期"
-        :rules="[
-          { required: true, message: '请选择交易日期', trigger: 'change' },
-        ]"
-        prop="payTime"
-        :label-width="formLabelWidth"
-      >
-        <el-date-picker
-          style="width: 100%"
-          :disabled="!isAdd"
-          v-model="form.payTime"
-          type="datetime"
-          format="yyyy-MM-dd HH:mm:ss"
-          value-format="yyyy-MM-dd HH:mm:ss"
-          placeholder="选择交易日期"
-        >
-        </el-date-picker>
-      </el-form-item>
-      <el-form-item
-        label="收入类型"
-        :label-width="formLabelWidth"
-        :rules="[
-          { required: true, message: '请选收入类型', trigger: 'change' },
-        ]"
-        prop="applyType"
-      >
-        <el-select
-          class="multiple"
-          style="width: 100% !important"
-          v-model.trim="form.applyType"
-          filterable
-          clearable
-          :disabled="!isAdd"
-          placeholder="请选择收入类型"
-        >
-          <el-option
-            v-for="(item, index) in orderServerList"
-            :key="index"
-            :label="item.label"
-            :value="item.value"
-          ></el-option>
-        </el-select>
-      </el-form-item>
-      <el-form-item
-        label="销售金额"
-        prop="saleAmount"
-        :rules="[
-          { required: true, message: '请输入销售金额', trigger: 'change' },
-        ]"
-        v-if="form.applyType == 'SELL'"
-        :label-width="formLabelWidth"
-      >
-        <el-input
-          v-model="form.saleAmount"
-          @mousewheel.native.prevent
-          type="number"
-          :disabled="!isAdd"
-          placeholder="请输入销售金额"
-        />
-      </el-form-item>
-      <el-form-item
-        label="服务金额"
-        v-if="form.applyType == 'SERVICE'"
-        :rules="[
-          { required: true, message: '请输入服务金额', trigger: 'change' },
-        ]"
-        prop="serviceAmount"
-        :label-width="formLabelWidth"
-      >
-        <el-input
-          type="number"
-          @mousewheel.native.prevent
-          :disabled="!isAdd"
-          v-model="form.serviceAmount"
-          placeholder="请输入收入金额"
-        />
-      </el-form-item>
-
-      <div v-if="form.applyType == 'SELL'">
-        <div
-          v-for="(goodsList, index) in form.goodsList"
-          :key="index"
-          class="shopListWrap"
-        >
-          <el-form-item
-            :label="'商品名称' + (index + 1)"
-            :label-width="formLabelWidth"
-            class="setWidth"
-            :prop="'goodsList.' + index + '.id'"
-            :rules="[
-              { required: true, message: '请选择商品', trigger: 'change' },
-            ]"
-          >
-            <el-select
-              v-if="isAdd"
-              v-model.trim="goodsList.id"
-              filterable
-              :disabled="!isAdd"
-              placeholder="请选择商品"
-              :popper-append-to-body="false"
-            >
-              <el-option
-                :title="item.name"
-                v-for="(item, index) in shopList"
-                :key="index"
-                :label="item.name"
-                :value="item.id"
-              ></el-option>
-            </el-select>
-            <p class="showShop" v-else>
-              <Tooltip :content="goodsList.id | filterShopId" />
-            </p>
-          </el-form-item>
-          <el-form-item
-            class="setWidth"
-            style="margin-right: 10px;margin-left: 10px;"
-            :prop="'goodsList.' + index + '.number'"
-          >
-            <!--  :rules="validAmount" <el-input-number style="width: 160px;" v-model="goodsList.number" placeholder="商品数量"></el-input-number> -->
-            <el-input
-              type="age"
-              style="width: 160px"
-              :disabled="!isAdd"
-              clearable
-              placeholder="请输入商品数量"
-              @mousewheel.native.prevent
-              v-model.number="goodsList.number"
-            ></el-input>
-          </el-form-item>
-          <el-button
-            icon="el-icon-minus"
-            :disabled="!isAdd"
-            v-if="form.goodsList.length > 1 && auditStatus == 'REJECT'"
-            style="margin-bottom: 22px;"
-            circle
-            @click.prevent="removeGoodsList(goodsList)"
-          ></el-button>
-          <el-button
-            icon="el-icon-plus"
-            :disabled="!isAdd"
-            v-if="auditStatus == 'REJECT'"
-            @click.prevent="addGoodsList"
-            circle
-            style="margin-left: 5px; margin-bottom: 22px;"
-          ></el-button>
-        </div>
-      </div>
-      <div class="lookTitle">其它</div>
-      <el-form-item
-        label="提交备注"
-        :label-width="formLabelWidth"
-        :rules="[
-          { required: true, message: '请输入提交备注', trigger: 'change' },
-        ]"
-      >
-        <el-input
-          placeholder="请输入备注"
-          :disabled="!isAdd"
-          v-model.trim="form.memo"
-          type="textarea"
-          :rows="3"
-        ></el-input>
-      </el-form-item>
-      <!-- &&auditStatus != 'REJECT' -->
-      <el-form-item
-        label="审核备注"
-        v-if="auditStatus != 'ING'"
-        :label-width="formLabelWidth"
-      >
-        <el-input
-          placeholder="请输入备注"
-          :disabled="true"
-          v-model.trim="form.auditComment"
-          type="textarea"
-          :rows="3"
-        ></el-input>
-      </el-form-item>
-    </el-form>
-    <div
-      class="lookTitle"
-      v-if="auditStatus == 'ING'"
-    >
-      审核意见
-    </div>
-    <el-form
-      :model="submitForm"
-      v-if="auditStatus == 'ING'"
-      ref="submitForm"
-    >
-      <el-form-item
-        prop="memo"
-        :rules="[
-          { required: true, message: '请输入审核意见', trigger: 'blur' },
-        ]"
-      >
-        <el-input
-          type="textarea"
-          :rows="4"
-          v-model="submitForm.memo"
-        ></el-input>
-      </el-form-item>
-    </el-form>
-  </div>
-</template>
-<script>
-import {
-  getRouteOrderInfo,
-  auditOutOrder,
-  updateRouteOrder,
-} from "@/api/orderManager";
-import { orderServerList } from "@/utils/searchArray";
-import { getCooperation } from "@/api/buildTeam";
-import Tooltip from "@/components/Tooltip/index";
-let that;
-export default {
-  components: { Tooltip },
-  props: ["orderId", "shopList", "isLook"],
-  data() {
-    return {
-      formLabelWidth: "100px",
-      form: {
-        routeOrganId: null,
-        transNo: null,
-        type: "OTHER",
-        merNo: null,
-        actualAmount: null,
-        memo: null,
-        payTime: null,
-        serviceAmount: null,
-        goodsAmount: null,
-        schoolId: null,
-        goodsList: [
-          {
-            id: null,
-            number: null,
-          },
-        ],
-        applyType: null,
-        userId: "",
-        auditComment: "",
-        calenderId: "",
-      },
-      isAdd: !this.isLook,
-      insertOrderType: 1, // 订单类型  1 个人订单 2 学校订单 2 其它订单
-      cooperationList: [],
-      submitForm: {
-        memo: "",
-      },
-      auditStatus: "",
-      orderServerList: orderServerList,
-      clearSchool: false,
-    };
-  },
-  created() {
-    that = this;
-  },
-  mounted() {
-    if (this.orderId) {
-      getRouteOrderInfo({ id: this.orderId }).then((res) => {
-        if (res.code == 200) {
-          let orderInfo = res.data;
-          this.form = {
-            createTime: orderInfo.createTime,
-            operator: orderInfo.operator,
-            routeOrganId: orderInfo.routeOrganId,
-            transNo: orderInfo.transNo,
-            type: "OTHER",
-            merNo: orderInfo.merNo,
-            actualAmount: orderInfo.actualAmount,
-            memo: orderInfo.memo,
-            payTime: orderInfo.payTime,
-            serviceAmount: orderInfo.serviceAmount,
-            saleAmount: orderInfo.saleAmount,
-            schoolId: orderInfo.schoolId,
-            userId: orderInfo.userId ? orderInfo.userId : "",
-            auditComment: orderInfo.auditComment,
-            applyType: orderInfo.saleAmount ? "SELL" : "SERVICE",
-            calenderId: orderInfo.calenderId ? orderInfo.calenderId : "",
-          };
-          this.auditStatus = orderInfo.auditStatus;
-          this.$set(
-            this.form,
-            "goodsList",
-            this.getShopList(orderInfo.goodsJson)
-          );
-          this.changeOrgin(orderInfo.routeOrganId);
-
-          if(orderInfo.userId && !res.data.calenderId) {
-            this.insertOrderType = 1
-          } else if(res.data.calenderId && !orderInfo.userId) {
-            this.insertOrderType = 2
-          } else {
-            this.insertOrderType = 3
-          }
-
-          // 添加类型判断
-          // SCHOOL("SCHOOL", "学校订单"),
-          // PERSONAL("PERSONAL", "个人订单"),
-          // OTHER("OTHER", "其他")
-          if(orderInfo.type !== 'OUTORDER'){
-            if(orderInfo.type === 'OTHER') {
-              this.insertOrderType = 3
-            } else if(orderInfo.type === 'SCHOOL') {
-              this.insertOrderType = 2
-            } else if(orderInfo.type === 'PERSONAL') {
-              this.insertOrderType = 1
-            }
-          }
-          this.clearSchool = true;
-        }
-      });
-    }
-    // 获取分部
-     this.$store.dispatch("setBranchs");
-  },
-  methods: {
-    changeOrgin(val) {
-      if (val) {
-        if (this.clearSchool) {
-          this.$set(this.form, "schoolId", null);
-        }
-        getCooperation({ rows: 9999, organId: val }).then((res) => {
-          if (res.code === 200) {
-            this.cooperationList = res.data.rows;
-          }
-        });
-      }
-    },
-    getShopList(str) {
-      let arr = [];
-      try {
-        const obj = JSON.parse(str);
-
-        // id: item.goodsId, number: item.num
-        for (let i in obj) {
-          arr.push({ id: parseInt(i), number: obj[i] });
-        }
-      } catch {}
-      return arr.length > 0
-        ? arr
-        : [
-            {
-              id: null,
-              number: null,
-            },
-          ];
-    },
-    auditOutOrder(status) {
-      const that = this;
-      this.$refs.submitForm.validate((res) => {
-        if (res) {
-          auditOutOrder({
-            auditStatus: status,
-            memo: this.submitForm.memo,
-            studentPaymentRouteOrderId: this.orderId,
-          }).then((res) => {
-            if (res.code == 200) {
-              this.$message.success("审核成功");
-              that.$emit("getList");
-              return;
-            }
-          });
-        }
-      });
-    },
-    removeGoodsList(item) {
-      const index = this.form.goodsList.indexOf(item);
-      if (index !== -1) {
-        this.form.goodsList.splice(index, 1);
-      }
-    },
-    addGoodsList() {
-      this.form.goodsList.push({
-        id: null,
-        number: null,
-      });
-    },
-    submitReaet() {
-      this.$refs.ruleForm.validate((valid) => {
-        if (valid) {
-          let form = JSON.parse(JSON.stringify(this.form));
-          if (!form.saleAmount && !form.serviceAmount) {
-            this.$message.error("请输入销售收入或服务收入");
-            return;
-          }
-          form.applyType == "SELL"
-            ? (form.serviceAmount = 0)
-            : (form.saleAmount = 0);
-          if (!form.saleAmount) {
-            form.goodsList = null;
-          }
-          let goodsJson = {};
-          for (let i in form.goodsList) {
-            goodsJson[form.goodsList[i]["id"]] = form.goodsList[i]["number"];
-          }
-          form.goodsJson =
-            form.applyType == "SERVICE" ? null : JSON.stringify(goodsJson);
-          form.id = this.orderId;
-          form.auditStatus = "ING";
-          if(this.insertOrderType == 1) {
-            form.calenderId = null
-          } else if(this.insertOrderType == 2) {
-            form.userId = null
-          }
-          updateRouteOrder(form).then((res) => {
-            if (res.code == 200) {
-              this.$message.success("修改成功");
-              this.$emit("getList");
-              return;
-            } else {
-              this.$message.error(res.msg);
-            }
-          });
-        }
-      });
-    },
-  },
-  filters: {
-    filterShopId(val) {
-      let str = "";
-      that.shopList.forEach((shop) => {
-        if (shop.id == val) {
-          str = shop.name;
-        }
-      });
-      return str;
-    },
-  },
-};
-</script>
-<style lang="scss" scoped>
-.lookTitle {
-  height: 40px;
-  line-height: 40px;
-  font-weight: bold;
-  background-color: rgb(237, 238, 240);
-  padding: 0 20px;
-  margin-bottom: 20px;
-}
-.setWidth {
-  display: inline-block;
-}
-.showShop {
-  height: 40px;
-  line-height: 40px;
-  width: 150px;
-  background-color: #f5f7fa;
-  border-color: #e4e7ed;
-  color: #c0c4cc;
-  cursor: not-allowed;
-  color: #333;
-  opacity: 1;
-  border-radius: 4px;
-  border: 1px solid #dcdfe6;
-  padding: 0 15px;
-  margin-right: 10px;
-}
-.shopListWrap { display: flex; flex-direction: row; justify-content: flex-start;}
-</style>
+<template>
+  <div>
+    <el-form :inline="true" ref="ruleForm">
+      <div class="lookTitle">申请信息</div>
+      <el-form-item label="申请人" label-width="80px">
+        <div style="width: 180px">
+          <p v-if="form.operator && form.operator.username">
+            {{ form.operator.username }}
+          </p>
+        </div>
+      </el-form-item>
+      <el-form-item label="申请时间" label-width="80px">
+        <div style="width: 180px">{{ form.createTime }}</div>
+      </el-form-item>
+    </el-form>
+    <el-form :model="form" ref="ruleForm">
+      <div class="lookTitle">基本信息</div>
+      <el-form-item
+        label="所属分部"
+        :rules="[{ required: true, message: '请选择分部', trigger: 'change' }]"
+        prop="routeOrganId"
+        :label-width="formLabelWidth"
+      >
+        <!--    -->
+        <el-select
+          v-model.trim="form.routeOrganId"
+          :disabled="!isAdd"
+          @change="changeOrgin"
+          style="width: 100% !important"
+        >
+          <el-option
+            v-for="(item, index) in selects.branchs"
+            :key="index"
+            :label="item.name"
+            :value="item.id"
+          ></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item
+        label="所属学校"
+        prop="schoolId"
+        :label-width="formLabelWidth"
+      >
+        <!--    @change="checkSchool" -->
+        <el-select
+          v-model="form.schoolId"
+          :disabled="!isAdd"
+          style="width: 100% !important"
+        >
+          <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="insertOrderType"
+        :label-width="formLabelWidth"
+      >
+        <el-radio-group v-model="insertOrderType" :disabled="!isAdd">
+          <el-radio :label="1">个人订单</el-radio>
+          <el-radio :label="2">学校订单</el-radio>
+          <el-radio :label="3">其它订单</el-radio>
+        </el-radio-group>
+      </el-form-item>
+      <el-form-item
+        label="缴费单号"
+        prop="calenderId"
+        v-if="insertOrderType == 2 || insertOrderType == 3"
+        :label-width="formLabelWidth"
+        :rules="[
+          {
+            pattern: /^[0-9]*$/,
+            message: '请输入正确的缴费单号',
+            trigger: 'blur'
+          }
+        ]"
+      >
+        <el-input
+          v-model.trim="form.calenderId"
+          :disabled="!isAdd"
+          placeholder="请输入缴费单号"
+        ></el-input>
+      </el-form-item>
+      <el-form-item
+        label="学员编号"
+        prop="userId"
+        v-if="insertOrderType == 1 || insertOrderType == 3"
+        :label-width="formLabelWidth"
+      >
+        <el-input
+          v-model.trim="form.userId"
+          :disabled="!isAdd"
+          placeholder="请输入学员编号"
+        ></el-input>
+      </el-form-item>
+      <div class="lookTitle">交易信息</div>
+      <el-form-item
+        label="交易流水号"
+        :rules="[
+          { required: true, message: '请输入流水号', trigger: 'change' }
+        ]"
+        prop="transNo"
+        :label-width="formLabelWidth"
+      >
+        <el-input
+          placeholder="请输入交易流水号"
+          type="text"
+          :disabled="!isAdd"
+          v-model.trim="form.transNo"
+        ></el-input>
+      </el-form-item>
+      <el-form-item
+        label="收款账户"
+        prop="merNo"
+        :rules="[
+          { required: true, message: '请输入收款账户', trigger: 'change' }
+        ]"
+        :label-width="formLabelWidth"
+      >
+        <el-input
+          placeholder="请输入收款账户"
+          type="text"
+          :disabled="!isAdd"
+          v-model.trim="form.merNo"
+        ></el-input>
+      </el-form-item>
+      <el-form-item
+        label="交易日期"
+        :rules="[
+          { required: true, message: '请选择交易日期', trigger: 'change' }
+        ]"
+        prop="payTime"
+        :label-width="formLabelWidth"
+      >
+        <el-date-picker
+          style="width: 100%"
+          :disabled="!isAdd"
+          v-model="form.payTime"
+          type="datetime"
+          format="yyyy-MM-dd HH:mm:ss"
+          value-format="yyyy-MM-dd HH:mm:ss"
+          placeholder="选择交易日期"
+        >
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item
+        label="收入类型"
+        :label-width="formLabelWidth"
+        :rules="[
+          { required: true, message: '请选收入类型', trigger: 'change' }
+        ]"
+        prop="applyType"
+      >
+        <el-select
+          class="multiple"
+          style="width: 100% !important"
+          v-model.trim="form.applyType"
+          filterable
+          clearable
+          :disabled="!isAdd"
+          placeholder="请选择收入类型"
+        >
+          <el-option
+            v-for="(item, index) in orderServerList"
+            :key="index"
+            :label="item.label"
+            :value="item.value"
+          ></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item
+        label="销售金额"
+        prop="saleAmount"
+        :rules="[
+          { required: true, message: '请输入销售金额', trigger: 'change' }
+        ]"
+        v-if="form.applyType == 'SELL'"
+        :label-width="formLabelWidth"
+      >
+        <el-input
+          v-model="form.saleAmount"
+          @mousewheel.native.prevent
+          type="number"
+          :disabled="!isAdd"
+          placeholder="请输入销售金额"
+        />
+      </el-form-item>
+      <el-form-item
+        label="服务金额"
+        v-if="form.applyType == 'SERVICE'"
+        :rules="[
+          { required: true, message: '请输入服务金额', trigger: 'change' }
+        ]"
+        prop="serviceAmount"
+        :label-width="formLabelWidth"
+      >
+        <el-input
+          type="number"
+          @mousewheel.native.prevent
+          :disabled="!isAdd"
+          v-model="form.serviceAmount"
+          placeholder="请输入收入金额"
+        />
+      </el-form-item>
+
+      <div v-if="form.applyType == 'SELL'">
+        <div
+          v-for="(goodsList, index) in form.goodsList"
+          :key="index"
+          class="shopListWrap"
+        >
+          <el-form-item
+            :label="'商品名称' + (index + 1)"
+            :label-width="formLabelWidth"
+            class="setWidth"
+            :prop="'goodsList.' + index + '.id'"
+            :rules="[
+              { required: true, message: '请选择商品', trigger: 'change' }
+            ]"
+          >
+            <el-select
+              v-if="isAdd"
+              v-model.trim="goodsList.id"
+              filterable
+              :disabled="!isAdd"
+              placeholder="请选择商品"
+              :popper-append-to-body="false"
+            >
+              <el-option
+                :title="item.name"
+                v-for="(item, index) in shopList"
+                :key="index"
+                :label="item.name"
+                :value="item.id"
+              ></el-option>
+            </el-select>
+            <p class="showShop" v-else>
+              <Tooltip :content="goodsList.id | filterShopId" />
+            </p>
+          </el-form-item>
+          <el-form-item
+            class="setWidth"
+            style="margin-right: 10px;margin-left: 10px;"
+            :prop="'goodsList.' + index + '.number'"
+          >
+            <!--  :rules="validAmount" <el-input-number style="width: 160px;" v-model="goodsList.number" placeholder="商品数量"></el-input-number> -->
+            <el-input
+              type="age"
+              style="width: 160px"
+              :disabled="!isAdd"
+              clearable
+              placeholder="请输入商品数量"
+              @mousewheel.native.prevent
+              v-model.number="goodsList.number"
+            ></el-input>
+          </el-form-item>
+          <el-button
+            icon="el-icon-minus"
+            :disabled="!isAdd"
+            v-if="form.goodsList.length > 1 && auditStatus == 'REJECT'"
+            style="margin-bottom: 22px;"
+            circle
+            @click.prevent="removeGoodsList(goodsList)"
+          ></el-button>
+          <el-button
+            icon="el-icon-plus"
+            :disabled="!isAdd"
+            v-if="auditStatus == 'REJECT'"
+            @click.prevent="addGoodsList"
+            circle
+            style="margin-left: 5px; margin-bottom: 22px;"
+          ></el-button>
+        </div>
+      </div>
+      <div class="lookTitle">其它</div>
+      <el-form-item
+        label="提交备注"
+        :label-width="formLabelWidth"
+        :rules="[
+          { required: true, message: '请输入提交备注', trigger: 'change' }
+        ]"
+      >
+        <el-input
+          placeholder="请输入备注"
+          :disabled="!isAdd"
+          v-model.trim="form.memo"
+          type="textarea"
+          :rows="3"
+        ></el-input>
+      </el-form-item>
+      <!-- &&auditStatus != 'REJECT' -->
+      <el-form-item
+        label="审核备注"
+        v-if="auditStatus != 'ING'"
+        :label-width="formLabelWidth"
+      >
+        <el-input
+          placeholder="请输入备注"
+          :disabled="true"
+          v-model.trim="form.auditComment"
+          type="textarea"
+          :rows="3"
+        ></el-input>
+      </el-form-item>
+    </el-form>
+    <div class="lookTitle" v-if="auditStatus == 'ING'">
+      审核意见
+    </div>
+    <el-form :model="submitForm" v-if="auditStatus == 'ING'" ref="submitForm">
+      <el-form-item
+        prop="memo"
+        :rules="[
+          { required: true, message: '请输入审核意见', trigger: 'blur' }
+        ]"
+      >
+        <el-input
+          type="textarea"
+          :rows="4"
+          v-model="submitForm.memo"
+        ></el-input>
+      </el-form-item>
+    </el-form>
+  </div>
+</template>
+<script>
+import {
+  getRouteOrderInfo,
+  auditOutOrder,
+  updateRouteOrder
+} from "@/api/orderManager";
+import { orderServerList } from "@/utils/searchArray";
+import { getCooperation } from "@/api/buildTeam";
+import Tooltip from "@/components/Tooltip/index";
+let that;
+export default {
+  components: { Tooltip },
+  props: ["orderId", "shopList", "isLook"],
+  data() {
+    return {
+      formLabelWidth: "100px",
+      form: {
+        routeOrganId: null,
+        transNo: null,
+        type: "OTHER",
+        merNo: null,
+        actualAmount: null,
+        memo: null,
+        payTime: null,
+        serviceAmount: null,
+        goodsAmount: null,
+        schoolId: null,
+        goodsList: [
+          {
+            id: null,
+            number: null
+          }
+        ],
+        applyType: null,
+        userId: "",
+        auditComment: "",
+        calenderId: ""
+      },
+      isAdd: !this.isLook,
+      insertOrderType: 1, // 订单类型  1 个人订单 2 学校订单 2 其它订单
+      cooperationList: [],
+      submitForm: {
+        memo: ""
+      },
+      auditStatus: "",
+      orderServerList: orderServerList,
+      clearSchool: false
+    };
+  },
+  created() {
+    that = this;
+  },
+  mounted() {
+    if (this.orderId) {
+      getRouteOrderInfo({ id: this.orderId }).then(res => {
+        if (res.code == 200) {
+          let orderInfo = res.data;
+          this.form = {
+            createTime: orderInfo.createTime,
+            operator: orderInfo.operator,
+            routeOrganId: orderInfo.routeOrganId,
+            transNo: orderInfo.transNo,
+            type: "OTHER",
+            merNo: orderInfo.merNo,
+            actualAmount: orderInfo.actualAmount,
+            memo: orderInfo.memo,
+            payTime: orderInfo.payTime,
+            serviceAmount: orderInfo.serviceAmount,
+            saleAmount: orderInfo.saleAmount,
+            schoolId: orderInfo.schoolId,
+            userId: orderInfo.userId ? orderInfo.userId : "",
+            auditComment: orderInfo.auditComment,
+            applyType: orderInfo.saleAmount ? "SELL" : "SERVICE",
+            calenderId: orderInfo.calenderId ? orderInfo.calenderId : ""
+          };
+          this.auditStatus = orderInfo.auditStatus;
+          this.$set(
+            this.form,
+            "goodsList",
+            this.getShopList(orderInfo.goodsJson)
+          );
+          this.changeOrgin(orderInfo.routeOrganId);
+
+          if (orderInfo.userId && !res.data.calenderId) {
+            this.insertOrderType = 1;
+          } else if (res.data.calenderId && !orderInfo.userId) {
+            this.insertOrderType = 2;
+          } else {
+            this.insertOrderType = 3;
+          }
+
+          // 添加类型判断
+          // SCHOOL("SCHOOL", "学校订单"),
+          // PERSONAL("PERSONAL", "个人订单"),
+          // OTHER("OTHER", "其他")
+          if (orderInfo.type !== "OUTORDER") {
+            if (orderInfo.type === "OTHER") {
+              this.insertOrderType = 3;
+            } else if (orderInfo.type === "SCHOOL") {
+              this.insertOrderType = 2;
+            } else if (orderInfo.type === "PERSONAL") {
+              this.insertOrderType = 1;
+            }
+          }
+          this.clearSchool = true;
+        }
+      });
+    }
+    // 获取分部
+    this.$store.dispatch("setBranchs");
+  },
+  methods: {
+    changeOrgin(val) {
+      if (val) {
+        if (this.clearSchool) {
+          this.$set(this.form, "schoolId", null);
+        }
+        getCooperation({ rows: 9999, organId: val }).then(res => {
+          if (res.code === 200) {
+            this.cooperationList = res.data.rows;
+          }
+        });
+      }
+    },
+    getShopList(str) {
+      let arr = [];
+      try {
+        const obj = JSON.parse(str);
+
+        // id: item.goodsId, number: item.num
+        for (let i in obj) {
+          arr.push({ id: parseInt(i), number: obj[i] });
+        }
+      } catch {}
+      return arr.length > 0 ? arr : [];
+    },
+    auditOutOrder(status) {
+      const that = this;
+      this.$refs.submitForm.validate(res => {
+        if (res) {
+          auditOutOrder({
+            auditStatus: status,
+            memo: this.submitForm.memo,
+            studentPaymentRouteOrderId: this.orderId
+          }).then(res => {
+            if (res.code == 200) {
+              this.$message.success("审核成功");
+              that.$emit("getList");
+              return;
+            }
+          });
+        }
+      });
+    },
+    removeGoodsList(item) {
+      const index = this.form.goodsList.indexOf(item);
+      if (index !== -1) {
+        this.form.goodsList.splice(index, 1);
+      }
+    },
+    addGoodsList() {
+      this.form.goodsList.push({
+        id: null,
+        number: null
+      });
+    },
+    submitReaet() {
+      this.$refs.ruleForm.validate(valid => {
+        if (valid) {
+          let form = JSON.parse(JSON.stringify(this.form));
+          if (!form.saleAmount && !form.serviceAmount) {
+            this.$message.error("请输入销售收入或服务收入");
+            return;
+          }
+          form.applyType == "SELL"
+            ? (form.serviceAmount = 0)
+            : (form.saleAmount = 0);
+          if (!form.saleAmount) {
+            form.goodsList = null;
+          }
+          let goodsJson = {};
+          for (let i in form.goodsList) {
+            goodsJson[form.goodsList[i]["id"]] = form.goodsList[i]["number"];
+          }
+          form.goodsJson =
+            form.applyType == "SERVICE" ? null : JSON.stringify(goodsJson);
+          form.id = this.orderId;
+          form.auditStatus = "ING";
+          if (this.insertOrderType == 1) {
+            form.calenderId = null;
+          } else if (this.insertOrderType == 2) {
+            form.userId = null;
+          }
+          updateRouteOrder(form).then(res => {
+            if (res.code == 200) {
+              this.$message.success("修改成功");
+              this.$emit("getList");
+              return;
+            } else {
+              this.$message.error(res.msg);
+            }
+          });
+        }
+      });
+    }
+  },
+  filters: {
+    filterShopId(val) {
+      let str = "";
+      that.shopList.forEach(shop => {
+        if (shop.id == val) {
+          str = shop.name;
+        }
+      });
+      return str;
+    }
+  }
+};
+</script>
+<style lang="scss" scoped>
+.lookTitle {
+  height: 40px;
+  line-height: 40px;
+  font-weight: bold;
+  background-color: rgb(237, 238, 240);
+  padding: 0 20px;
+  margin-bottom: 20px;
+}
+.setWidth {
+  display: inline-block;
+}
+.showShop {
+  height: 40px;
+  line-height: 40px;
+  width: 150px;
+  background-color: #f5f7fa;
+  border-color: #e4e7ed;
+  color: #c0c4cc;
+  cursor: not-allowed;
+  color: #333;
+  opacity: 1;
+  border-radius: 4px;
+  border: 1px solid #dcdfe6;
+  padding: 0 15px;
+  margin-right: 10px;
+}
+.shopListWrap {
+  display: flex;
+  flex-direction: row;
+  justify-content: flex-start;
+}
+</style>

+ 32 - 35
src/views/businessManager/orderManager/salesList.vue

@@ -61,7 +61,7 @@
         </el-form-item>
         <el-form-item>
           <el-select
-          :disabled="!searchForm.organIdList.length>0"
+            :disabled="!searchForm.organIdList.length > 0"
             clearable
             filterable
             placeholder="请选择所属学校"
@@ -239,7 +239,7 @@
             align="center"
             width="100"
             prop="sellCost"
-            label="销售成本(元)"
+            label="采购价(元)"
           >
             <template slot-scope="scope">{{
               (scope.row.sellCost * scope.row.num) | moneyFormat
@@ -430,12 +430,10 @@ import pagination from "@/components/Pagination/index";
 import {
   getSellOrder,
   updateSellOrder,
-  refundSellOrder,
+  refundSellOrder
 } from "@/api/orderManager";
 import { queryByOrganId } from "@/api/systemManage";
-import {
-  getCooperation
-} from "@/api/buildTeam";
+import { getCooperation } from "@/api/buildTeam";
 import { paymentChannelStatus } from "@/utils/searchArray";
 import { Export } from "@/utils/downLoadFile";
 import dayjs from "dayjs";
@@ -458,7 +456,7 @@ export default {
         userName: "",
         orderDate: [],
         /** 发货日期 */
-        deliveryDate: [],
+        deliveryDate: []
       },
       tableList: [],
       organList: [],
@@ -468,31 +466,31 @@ export default {
         limit: 10, // 限制显示条数
         page: 1, // 当前页
         total: 0, // 总条数
-        page_size: [10, 20, 40, 50], // 选择限制显示条数
+        page_size: [10, 20, 40, 50] // 选择限制显示条数
       },
       backStatus: false,
       formLabelWidth: "150px",
       form: {
         id: null,
         sellCost: null,
-        eduTeacherId: null,
+        eduTeacherId: null
       },
       rules: {
-        sellCost: [{ required: true, message: "请输入金额", trigger: "input" }],
+        sellCost: [{ required: true, message: "请输入金额", trigger: "input" }]
       },
       refundForm: {
-        money: null,
+        money: null
       },
       refundRules: {
-        money: [{ required: true, message: "请输入退费金额", trigger: "blur" }],
+        money: [{ required: true, message: "请输入退费金额", trigger: "blur" }]
       },
       cooperations: [],
-      restaurants: [],
+      restaurants: []
     };
   },
   mounted() {
     this.$store.dispatch("setBranchs");
-    getCooperation({ rows: 1000 }).then((res) => {
+    getCooperation({ rows: 1000 }).then(res => {
       if (res.code == 200) {
         this.cooperations = res.data.rows;
       }
@@ -516,9 +514,9 @@ export default {
     },
     onTeachingSubmit(formName, status) {
       // 添加数据
-      this.$refs[formName].validate((valid) => {
+      this.$refs[formName].validate(valid => {
         if (valid) {
-          updateSellOrder(this.form).then((res) => {
+          updateSellOrder(this.form).then(res => {
             if (res.code == 200) {
               this.$message.success("操作成功");
               this.backStatus = false;
@@ -539,13 +537,13 @@ export default {
         page: this.pageInfo.page,
         rows: this.pageInfo.limit,
         ...getTimes(orderDate, ["startTime", "endTime"]),
-        ...getTimes(deliveryDate, ["deliveryStartTime", "deliveryEndTime"]),
+        ...getTimes(deliveryDate, ["deliveryStartTime", "deliveryEndTime"])
       };
 
       getSellOrder({
         ...params,
-        organIdList: [...this.searchForm.organIdList].join(),
-      }).then((res) => {
+        organIdList: [...this.searchForm.organIdList].join()
+      }).then(res => {
         let result = res.data;
         if (res.code == 200) {
           this.tableList = result.rows;
@@ -573,8 +571,8 @@ export default {
         const json = JSON.parse(this.detail.sellCost2);
         restaurants = [
           { value: String(json.sellCost || "") },
-          { value: String(json.SellCost2 || "") },
-        ].filter((item) => !!item);
+          { value: String(json.SellCost2 || "") }
+        ].filter(item => !!item);
       } catch (error) {}
       // this.createFilter(queryString)
       // let results = queryString ? restaurants.filter((restaurant) => {
@@ -589,20 +587,20 @@ export default {
     },
     refund(data) {
       refundSellOrder(data)
-        .then((res) => {
+        .then(res => {
           this.getList();
           this.$message.success("退费成功");
         })
-        .catch((res) => {
+        .catch(res => {
           if (res.code === 100) {
             this.$confirm(res.msg, "提示", {
               confirmButtonText: "确定",
               cancelButtonText: "取消",
-              type: "warning",
+              type: "warning"
             }).then(() => {
               this.refund({
                 ...data,
-                reTry: true,
+                reTry: true
               });
             });
           } else {
@@ -622,7 +620,7 @@ export default {
       this.form = {
         id: row.id,
         sellCost: String(row.sellCost),
-        eduTeacherId: row.eduTeacherId ? row.eduTeacherId : null,
+        eduTeacherId: row.eduTeacherId ? row.eduTeacherId : null
       };
       // applyRefundAudit()
     },
@@ -633,7 +631,7 @@ export default {
         page: this.pageInfo.page,
         rows: this.pageInfo.limit,
         ...getTimes(orderDate, ["startTime", "endTime"]),
-        ...getTimes(deliveryDate, ["deliveryStartTime", "deliveryEndTime"]),
+        ...getTimes(deliveryDate, ["deliveryStartTime", "deliveryEndTime"])
       };
       Export(
         this,
@@ -642,28 +640,27 @@ export default {
           fileName: `销售列表导出.xls`,
           params: cleanDeep({
             ...params,
-            organIdList: [...this.searchForm.organIdList].join(),
-          }),
+            organIdList: [...this.searchForm.organIdList].join()
+          })
         },
         "是否确认导出报表?"
       );
     },
-   async changeOrgan(value){
-       if (!value) {
+    async changeOrgan(value) {
+      if (!value) {
         this.cooperations = [];
         this.searchForm.cooperationOrganId = null;
         return;
       }
       // 合作单位
-      await queryByOrganId({ organId: value.join(',') }).then((res) => {
+      await queryByOrganId({ organId: value.join(",") }).then(res => {
         if (res.code == 200) {
           this.cooperations = res.data;
           this.searchForm.cooperationOrganId = null;
         }
       });
     }
-  },
+  }
 };
 </script>
-<style lang="scss">
-</style>
+<style lang="scss"></style>

+ 1038 - 0
src/views/businessManager/shopManager/model/combinationProducts.vue

@@ -0,0 +1,1038 @@
+<template>
+  <div>
+    <el-form :model="form" :rules="rules" ref="ruleForm" :inline="true">
+      <el-alert
+        title="子商品信息"
+        :closable="false"
+        class="alert"
+        type="info"
+      />
+      <el-table
+        :data="form.goodsList"
+        :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
+        style="width:100%!important"
+      >
+        <el-table-column align="center" prop="name" label="商品名称">
+          <template slot-scope="scope">
+            <tooltip :content="scope.row.name" />
+          </template>
+        </el-table-column>
+        <el-table-column align="center" prop="productSn" label="商品货号">
+        </el-table-column>
+        <el-table-column align="center" prop="price" label="销售价格">
+        </el-table-column>
+        <el-table-column align="center" prop="skuCode" label="sku编号">
+        </el-table-column>
+        <el-table-column align="center" prop="sn" label="成本">
+          <template slot-scope="scope">
+            <el-form-item
+              :show-message="false"
+              class="tableItem"
+              :prop="'goodsList.' + scope.$index + '.goodsPrice'"
+              :rules="[
+                {
+                  required: true,
+                  message: '请输入成本',
+                  trigger: 'blur'
+                }
+              ]"
+            >
+              <el-input-number
+                style="width: 100%!important;"
+                class="number-input"
+                v-model="form.goodsList[scope.$index].goodsPrice"
+                :controls="false"
+                :precision="0"
+                :min="0"
+                placeholder="请输入成本"
+                :disabled="addDisabled"
+              />
+            </el-form-item>
+          </template>
+        </el-table-column>
+        <el-table-column align="center" prop="sn" label="商城状态">
+          <template slot-scope="scope">
+            <el-tag :type="scope.row.publishStatus == 1 ? '' : 'danger'">
+              {{ scope.row.publishStatus ? "上架" : "下架" }}
+            </el-tag>
+          </template>
+        </el-table-column>
+        <el-table-column align="center" prop="sn" label="操作">
+          <template slot-scope="scope">
+            <el-button
+              type="text"
+              @click.prevent="removeGoodsList(scope.row)"
+              :disabled="addDisabled"
+              >删除</el-button
+            >
+          </template>
+        </el-table-column>
+      </el-table>
+      <el-button
+        icon="el-icon-circle-plus-outline"
+        plain
+        type="info"
+        style="width: 100%;margin: 20px 0;"
+        @click="addGoodsList"
+        :disabled="addDisabled"
+        >添加子商品</el-button
+      >
+      <el-alert title="基础信息" :closable="false" class="alert" type="info" />
+      <el-form-item label="商品名称" prop="name" :label-width="formLabelWidth">
+        <el-input
+          style="width: 220px !important"
+          placeholder="请输入商品名称"
+          type="text"
+          :disabled="addDisabled"
+          v-model.trim="form.name"
+        ></el-input>
+      </el-form-item>
+      <el-form-item label="货号" prop="sn" :label-width="formLabelWidth">
+        <el-input
+          style="width: 220px !important"
+          placeholder="请输入货号"
+          type="text"
+          :disabled="addDisabled"
+          v-model.trim="form.sn"
+        ></el-input>
+      </el-form-item>
+      <el-form-item label="品牌" prop="brand" :label-width="formLabelWidth">
+        <el-select
+          v-model.trim="form.brand"
+          :disabled="addDisabled"
+          style="width: 220px !important"
+          placeholder="请选择品牌"
+        >
+          <el-option
+            v-for="(item, index) in goodsCategoryList"
+            :key="index"
+            :label="item.label"
+            :value="item.value"
+          ></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="商品类型" prop="type" :label-width="formLabelWidth">
+        <el-select
+          v-model.trim="form.type"
+          :disabled="addDisabled"
+          style="width: 220px !important"
+          placeholder="请选择商品类型"
+        >
+          <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"
+        :label-width="formLabelWidth"
+      >
+        <!-- <el-cascader
+          v-model.trim="form.goodsCategoryId"
+          style="width: 220px !important"
+          placeholder="请选择商品分类"
+          :disabled="addDisabled"
+          :options="categoryList"
+          filterable
+          :props="{ expandTrigger: 'hover' }"
+        ></el-cascader> -->
+        <el-select
+          v-model.trim="form.goodsCategoryId"
+          clearable
+          style="width: 220px !important"
+          placeholder="请选择商品分类"
+          :disabled="addDisabled"
+        >
+          <el-option
+            v-for="(item, index) in categoryList"
+            :key="index"
+            :label="item.label"
+            :value="item.value"
+          ></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item
+        label="商品型号"
+        prop="specification"
+        :label-width="formLabelWidth"
+      >
+        <el-input
+          v-model.trim="form.specification"
+          :disabled="addDisabled"
+          style="width: 220px !important"
+          placeholder="请输入商品型号"
+        ></el-input>
+      </el-form-item>
+
+      <!-- <div v-for="(goodsList, index) in form.goodsList" :key="index">
+        <el-form-item
+          :label="'商品' + (index + 1)"
+          :label-width="formLabelWidth"
+          style="display: inline-block; width: 80% !important"
+          :prop="'goodsList.' + index + '.id'"
+          :rules="[
+            { required: true, message: '请选择商品', trigger: 'change' }
+          ]"
+        >
+          <el-select
+            v-model.trim="goodsList.id"
+            @change="onGoodsChange"
+            filterable
+            style="width: 220px !important"
+            :disabled="addDisabled"
+            placeholder="请选择商品"
+          >
+            <el-option
+              v-for="(item, index) in selectGoodsList"
+              :key="index"
+              :disabled="item.disabled"
+              :label="item.name"
+              :value="item.id"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <div v-if="!addDisabled" style="display: inline-block">
+          <el-button
+            icon="el-icon-minus"
+            v-if="form.goodsList.length > 1"
+            @click.prevent="removeGoodsList(goodsList)"
+            circle
+          ></el-button>
+          <el-button
+            icon="el-icon-plus"
+            @click.prevent="addGoodsList"
+            circle
+            style="margin-left: 5px"
+          ></el-button>
+        </div>
+      </div> -->
+      <el-alert title="价格信息" :closable="false" class="alert" type="info" />
+      <el-form-item
+        label="市场价"
+        class="hiddenStart"
+        prop="marketPrice"
+        :label-width="formLabelWidth"
+      >
+        <template slot="label">
+          <p style="position: relative">
+            <span style="color: #f56c6c; margin-right: 4px">*</span>
+            市场价
+            <el-tooltip placement="top" popper-class="mTooltip">
+              <div slot="content">
+                商品标价,仅在商品购买时做展示,不以该价格向学员销售商品
+              </div>
+              <i
+                class="el-icon-question"
+                style="
+                    font-size: 18px;
+                    color: #f56c6c;
+                    position: relative;
+                    top: 2px;
+                  "
+              ></i>
+            </el-tooltip>
+          </p>
+        </template>
+        <el-input
+          type="number"
+          placeholder="请输入市场价"
+          :disabled="addDisabled"
+          @mousewheel.native.prevent
+          v-model.trim="form.marketPrice"
+          style="width: 220px !important"
+        ></el-input>
+      </el-form-item>
+      <el-form-item
+        label="零售价"
+        class="hiddenStart"
+        prop="discountPrice"
+        :label-width="formLabelWidth"
+      >
+        <template slot="label">
+          <p style="position: relative">
+            <span style="color: #f56c6c; margin-right: 4px">*</span>
+            零售价
+            <el-tooltip placement="top" popper-class="mTooltip">
+              <div slot="content">
+                管理端APP、乐器维修时学员购买该商品的价格
+              </div>
+              <i
+                class="el-icon-question"
+                style="
+                    font-size: 18px;
+                    color: #f56c6c;
+                    position: relative;
+                    top: 2px;
+                  "
+              ></i>
+            </el-tooltip>
+          </p>
+        </template>
+        <el-input
+          type="number"
+          placeholder="请输入零售价"
+          :disabled="addDisabled"
+          @mousewheel.native.prevent
+          v-model.trim="form.discountPrice"
+          style="width: 220px !important"
+        ></el-input>
+      </el-form-item>
+      <el-form-item
+        label="商品团购价"
+        prop="groupPurchasePrice"
+        class="hiddenStart"
+        :label-width="formLabelWidth"
+      >
+        <template slot="label">
+          <p style="position: relative">
+            <span style="color: #f56c6c; margin-right: 4px">*</span>
+            团购价
+            <el-tooltip placement="top" popper-class="mTooltip">
+              <div slot="content">乐团报名缴费时学员购买该商品的价格</div>
+              <i
+                class="el-icon-question"
+                style="
+                    font-size: 18px;
+                    color: #f56c6c;
+                    position: relative;
+                    top: 2px;
+                  "
+              ></i>
+            </el-tooltip>
+          </p>
+        </template>
+        <el-input
+          type="number"
+          placeholder="请输入商品团购价"
+          :disabled="addDisabled"
+          @mousewheel.native.prevent
+          v-model.trim="form.groupPurchasePrice"
+          style="width: 220px !important"
+        ></el-input>
+      </el-form-item>
+      <el-alert title="销售渠道" :closable="false" class="alert" type="info" />
+      <el-form-item
+        label="移动端可售分部"
+        prop="educationShowOrganId"
+        :label-width="formLabelWidth"
+      >
+        <select-all
+          v-model.trim="form.educationShowOrganId"
+          filterable
+          placeholder="移动端可售分部"
+          style="width: 400px !important"
+          multiple
+          clearable
+          :disabled="addDisabled"
+        >
+          <el-option
+            v-for="item in selects.branchs"
+            :key="item.id"
+            :label="item.name"
+            :value="item.id.toString()"
+          ></el-option>
+        </select-all>
+      </el-form-item>
+      <!--   :disabled="pageDisabled || pageType == 'update'" -->
+      <el-form-item
+        label="课程收费乐团可售分部"
+        prop="courseFeeShowOrganId"
+        :label-width="formLabelWidth"
+      >
+        <select-all
+          v-model.trim="form.courseFeeShowOrganId"
+          filterable
+          placeholder="课程收费乐团可售分部"
+          style="width: 400px !important"
+          multiple
+          clearable
+          :disabled="addDisabled"
+        >
+          <el-option
+            v-for="item in selects.branchs"
+            :key="item.id"
+            :label="item.name"
+            :value="item.id.toString()"
+          ></el-option>
+        </select-all>
+      </el-form-item>
+      <!--  :disabled="pageDisabled || pageType == 'update'" -->
+      <el-form-item
+        label="会员收费乐团可售分部"
+        prop="memberFeeShowOrganId"
+        :label-width="formLabelWidth"
+      >
+        <select-all
+          v-model.trim="form.memberFeeShowOrganId"
+          filterable
+          placeholder="请选择会员收费团可见分部"
+          style="width: 400px !important"
+          multiple
+          clearable
+          :disabled="addDisabled"
+        >
+          <el-option
+            v-for="item in selects.branchs"
+            :key="item.id"
+            :label="item.name"
+            :value="item.id.toString()"
+          ></el-option>
+        </select-all>
+      </el-form-item>
+      <el-form-item
+        label="免费乐团可售分部"
+        prop="freeFeeShowOrganId"
+        :label-width="formLabelWidth"
+      >
+        <select-all
+          v-model.trim="form.freeFeeShowOrganId"
+          filterable
+          placeholder="请选择会员收费团可见分部"
+          style="width: 400px !important"
+          multiple
+          clearable
+          :disabled="addDisabled"
+        >
+          <el-option
+            v-for="item in selects.branchs"
+            :key="item.id"
+            :label="item.name"
+            :value="item.id.toString()"
+          ></el-option>
+        </select-all>
+      </el-form-item>
+      <!--  :disabled="pageDisabled || pageType == 'update'"  -->
+      <el-form-item
+        v-if="tenantId == 1"
+        label="乐器置换可售分部"
+        prop="replacementShowOrganId"
+        :label-width="formLabelWidth"
+      >
+        <select-all
+          v-model.trim="form.replacementShowOrganId"
+          filterable
+          placeholder="请选择乐器置换可售分部"
+          style="width: 400px !important"
+          multiple
+          clearable
+          :disabled="addDisabled"
+        >
+          <el-option
+            v-for="item in selects.branchs"
+            :key="item.id"
+            :label="item.name"
+            :value="item.id.toString()"
+          ></el-option>
+        </select-all>
+      </el-form-item>
+      <el-alert title="商品信息" :closable="false" class="alert" type="info" />
+      <el-form-item label="商品图片" prop="image" :label-width="formLabelWidth">
+        <image-cropper
+          :options="cropperOptions"
+          :disabled="addDisabled"
+          :imgSize="2"
+          :imageUrl="form.image"
+          @crop-upload-success="cropSuccess"
+          bucket_name="mall"
+        />
+        <p style="color: red">请上传大小2M以内,格式为jpg、png、gif图片</p>
+      </el-form-item>
+      <br />
+      <el-form-item label="商品描述" prop="brief" :label-width="formLabelWidth">
+        <el-input
+          type="textarea"
+          :disabled="addDisabled"
+          v-model.trim="form.brief"
+          style="width: 400px"
+        ></el-input>
+      </el-form-item>
+      <el-form-item label="商品详情" prop="desc" :label-width="formLabelWidth">
+        <el-input
+          type="textarea"
+          :disabled="addDisabled"
+          v-model.trim="form.desc"
+          style="width: 400px"
+        ></el-input>
+      </el-form-item>
+    </el-form>
+    <span slot="footer" v-if="!addDisabled" class="dialog-footer">
+      <el-button @click="$listeners.close()">取 消</el-button>
+      <el-button @click="onShopSubmit('ruleForm')" type="primary"
+        >确 定</el-button
+      >
+    </span>
+
+    <el-dialog
+      title="添加子商品"
+      :visible.sync="recordStatus"
+      :close-on-click-modal="false"
+      width="1200px"
+      append-to-body
+      v-if="recordStatus"
+    >
+      <subShopGoods
+        :disabledIds="disabledIds"
+        @close="recordStatus = false"
+        @comfirm="onConfirm"
+        :goodsBrand="goodsBrand"
+      />
+    </el-dialog>
+  </div>
+</template>
+<script>
+import {
+  categoryListTree,
+  goodsQuery,
+  goodsAdd,
+  goodsUpdate,
+  api_goodsGet,
+  goodsDelete,
+  updateGoodsStatus
+} from "@/api/businessManager";
+import cleanDeep from "clean-deep";
+import ImageCropper from "@/components/ImageCropper";
+import subShopGoods from "./subShopGoods.vue";
+let validPrice = (rule, value, callback) => {
+  if ((value == "" && typeof value == "string") || value == null) {
+    callback(new Error("请输入金额"));
+  } else if (value < 0) {
+    callback(new Error("输入金额必须大于或等于0"));
+  } else if (value >= 100000) {
+    callback(new Error("输入金额必须小于100000"));
+  } else {
+    callback();
+  }
+};
+let validStock = (rule, value, callback) => {
+  if ((value == "" && typeof value == "string") || value == null) {
+    callback(new Error("请输入库存"));
+  } else if (value < 0) {
+    callback(new Error("库存数量必须大于或等于0"));
+  } else {
+    callback();
+  }
+};
+export default {
+  props: [
+    "activeRow",
+    "addType",
+    "addDisabled",
+    "categoryList",
+    "selectGoodsList",
+    "tenantId",
+    "goodsBrand",
+    "goodsType"
+  ],
+  components: {
+    ImageCropper,
+    subShopGoods
+  },
+  data() {
+    return {
+      formLabelWidth: "160px",
+      goodsCategoryList: [],
+      form: {
+        sn: null,
+        brand: null,
+        supplyChannel: null,
+        name: null,
+        type: null,
+        organIdList: [],
+        goodsCategoryId: null,
+        specification: null,
+        marketPrice: null,
+        discountPrice: null,
+        groupPurchasePrice: null,
+        clientShow: null,
+        educationalShow: null,
+        musicGroupShow: null,
+        courseViewType: [],
+        stockWarning: null,
+        image: null,
+        complementGoodsIdList: null,
+        groupGoods: 1, // 是否组合商品
+        goodsList: [],
+        brief: null,
+        desc: null,
+        replacementShow: null,
+        studentShowOrganId: null,
+        educationShowOrganId: null,
+        courseFeeShowOrganId: null,
+        memberFeeShowOrganId: null,
+        freeFeeShowOrganId: null,
+        replacementShowOrganId: null
+      },
+      goodsTree: [], // 选择商品列表
+      rules: {
+        sn: [
+          {
+            required: true,
+            message: "请输入商品货号",
+            trigger: "blur"
+          }
+        ],
+        brand: [
+          {
+            required: true,
+            message: "请输入品牌",
+            trigger: "blur"
+          }
+        ],
+        supplyChannel: [
+          {
+            required: true,
+            message: "请输入备查货号",
+            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"
+          }
+        ],
+
+        organIdList: [
+          {
+            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"
+          }
+        ],
+        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"
+          }
+        ],
+        educationalShow: [
+          {
+            required: true,
+            message: "请选择教务端是否展示",
+            trigger: "change"
+          }
+        ],
+        musicGroupShow: [
+          {
+            required: true,
+            message: "请选择乐团是否展示",
+            trigger: "change"
+          }
+        ],
+        courseViewType: [
+          { required: true, message: "请选乐团收费模式", trigger: "change" }
+        ],
+        replacementShow: [
+          {
+            required: true,
+            message: "请选择是否参与置换",
+            trigger: "change"
+          }
+        ],
+        stockWarning: [
+          {
+            required: true,
+            message: "请选择是否库存预警",
+            trigger: "change"
+          }
+        ],
+        image: [
+          {
+            required: true,
+            message: "请选择图片",
+            trigger: "blur"
+          }
+        ]
+        // brief: [
+        //   {
+        //     required: true,
+        //     message: "请输入商品描述",
+        //     trigger: "blur"
+        //   }
+        // ],
+        // desc: [
+        //   {
+        //     required: true,
+        //     message: "请输入商品详情",
+        //     trigger: "blur"
+        //   }
+        // ]
+      },
+      goodsDetail: {},
+      cropperOptions: {
+        autoCrop: true, //是否默认生成截图框
+        autoCropWidth: 300, //默认生成截图框宽度
+        autoCropHeight: 300, //默认生成截图框高度
+        fixedBox: true, //是否固定截图框大小 不允许改变
+        previewsCircle: false, //预览图是否是圆形
+        title: "商品图片" //模态框上显示的标题
+      },
+      recordStatus: false,
+      disabledIds: [] // 选中商品的编号
+    };
+  },
+  async mounted() {
+    if (this.addType !== "create") {
+      try {
+        const { data } = await api_goodsGet({ id: this.activeRow.id });
+        this.goodsDetail = data || {};
+        const row = this.goodsDetail;
+        let form = this.form;
+        for (let i in form) {
+          if (i === "brand") {
+            form[i] = Number(row[i]);
+          } else {
+            form[i] = row[i];
+          }
+        }
+        // if (row.goodsCategoryId) {
+        //   form.goodsCategoryId = this.formatParentId(
+        //     row.goodsCategoryId,
+        //     this.categoryList
+        //   );
+        // }
+        let ids = row.goodsSubList;
+        let goodsList = [];
+        ids.forEach(item => {
+          goodsList.push({
+            name: item.mallGoodsName,
+            goodsId: item.mallGoodsId,
+            skuStockId: item.sku,
+            skuCode: item.skuCode,
+            brandId: item.brandId,
+            brandName: item.brandName,
+            price: item.price,
+            publishStatus: item.goodsStatus,
+            productSn: item.productSn,
+            goodsPrice: item.goodsPrice // 成本
+          });
+        });
+        form.goodsList = goodsList;
+        form.id = row.id;
+
+        if (row.courseViewType) {
+          form.courseViewType = row.courseViewType.split(",");
+        }
+
+        if (row.studentShowOrganId) {
+          form.studentShowOrganId = row.studentShowOrganId.split(",");
+        }
+
+        if (row.educationShowOrganId) {
+          form.educationShowOrganId = row.educationShowOrganId.split(",");
+        }
+
+        if (row.courseFeeShowOrganId) {
+          form.courseFeeShowOrganId = row.courseFeeShowOrganId.split(",");
+        }
+
+        if (row.memberFeeShowOrganId) {
+          form.memberFeeShowOrganId = row.memberFeeShowOrganId.split(",");
+        }
+        if (row.freeFeeShowOrganId) {
+          form.freeFeeShowOrganId = row.freeFeeShowOrganId.split(",");
+        }
+
+        if (row.replacementShowOrganId) {
+          form.replacementShowOrganId = row.replacementShowOrganId.split(",");
+        }
+
+        if (row.organIdList) {
+          form.organIdList = row.organIdList.split(",");
+        }
+
+        this.getBrandCatatory();
+      } catch (e) {
+        //
+        console.log(e, "1212");
+      }
+    }
+  },
+  methods: {
+    formatParentId(id, list, ids = []) {
+      for (const item of list) {
+        if (item.children) {
+          const cIds = this.formatParentId(id, item.children, [
+            ...ids,
+            item.value
+          ]);
+          if (cIds.includes(id)) {
+            return cIds;
+          }
+        }
+        if (item.value === id) {
+          return [...ids, id];
+        }
+      }
+      return ids;
+    },
+    getBrandCatatory() {
+      const goodsList = this.form.goodsList;
+      const tempList = [];
+      goodsList.forEach(item => {
+        const index = tempList.findIndex(temp => temp.value == item.brandId);
+        if (index === -1) {
+          tempList.push({
+            label: item.brandName,
+            value: item.brandId
+          });
+        }
+      });
+
+      this.goodsCategoryList = tempList;
+    },
+    onShopSubmit(formName) {
+      if (this.form.goodsList.length <= 0) {
+        this.$message.error("请至少添加一个子商品");
+        return;
+      }
+      this.$refs[formName].validate(valid => {
+        if (valid) {
+          let form = Object.assign({}, this.form);
+          let temps = [];
+          form.goodsList.forEach(item => {
+            if (item.skuStockId) {
+              temps.push({
+                mallGoodsId: item.goodsId,
+                sku: item.skuStockId,
+                goodsStatus: item.publishStatus,
+                goodsPrice: item.goodsPrice
+              });
+            }
+          });
+          form.goodsSubList = temps;
+          if (form.studentShowOrganId) {
+            form.studentShowOrganId = form.studentShowOrganId.join(",");
+          }
+          if (form.educationShowOrganId) {
+            form.educationShowOrganId = form.educationShowOrganId.join(",");
+          }
+
+          if (form.courseFeeShowOrganId) {
+            form.courseFeeShowOrganId = form.courseFeeShowOrganId.join(",");
+          }
+          if (form.memberFeeShowOrganId) {
+            form.memberFeeShowOrganId = form.memberFeeShowOrganId.join(",");
+          }
+          if (form.freeFeeShowOrganId) {
+            form.freeFeeShowOrganId = form.freeFeeShowOrganId.join(",");
+          }
+          if (form.replacementShowOrganId) {
+            form.replacementShowOrganId = form.replacementShowOrganId.join(",");
+          }
+          if (
+            !form.studentShowOrganId &&
+            !form.educationShowOrganId &&
+            !form.courseFeeShowOrganId &&
+            !form.freeFeeShowOrganId &&
+            !form.replacementShowOrganId
+          ) {
+            this.$message.error("请至少选择一个可见分部");
+            return;
+          }
+          form.goodsList = null;
+          form.groupGoods = 1;
+          console.log(form, "1221");
+          if (this.addType == "create" || this.addType == "copy") {
+            if (this.form.id) {
+              // 判断有没有Id,如果有则删除
+              delete this.form.id;
+            }
+            form.status = "NO"; // 默认上架
+            goodsAdd(cleanDeep(form)).then(res => {
+              this.messageTips("保存", res);
+            });
+          } else if (this.addType == "update") {
+            goodsUpdate(cleanDeep(form)).then(res => {
+              this.messageTips("保存", res);
+            });
+          }
+        } else {
+          this.$nextTick(() => {
+            let isError = document.getElementsByClassName("is-error");
+            isError[0].scrollIntoView({
+              block: "center",
+              behavior: "smooth"
+            });
+          });
+          return false;
+        }
+      });
+    },
+    messageTips(title, res) {
+      if (res.code == 200) {
+        this.$message.success(title + "成功");
+        this.$listeners.close();
+        this.$listeners.confirm();
+      } else {
+        this.$message.error(res.msg);
+      }
+    },
+    removeGoodsList(item) {
+      this.$confirm("是否删除该商品?", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      })
+        .then(() => {
+          const index = this.form.goodsList.indexOf(item);
+          if (index !== -1) {
+            this.form.goodsList.splice(index, 1);
+          }
+
+          this.getBrandCatatory();
+          this.form.brand = null;
+        })
+        .catch(() => {});
+    },
+    addGoodsList() {
+      const ids = [];
+      this.form.goodsList.forEach(goods => {
+        ids.push(goods.skuStockId);
+      });
+      this.disabledIds = ids;
+      this.recordStatus = true;
+    },
+    onFormClose(formName) {
+      // 关闭弹窗重置验证
+      this.$refs[formName].resetFields();
+    },
+    cropSuccess(data) {
+      this.form.image = data.data.url;
+    },
+    onConfirm(list) {
+      // 添加子商品
+      console.log(list);
+      const goodsList = [];
+      (list || []).forEach(item => {
+        const index = this.form.goodsList.findIndex(
+          goods => goods.skuStockId == item.skuStockId
+        );
+        if (index == -1) {
+          goodsList.push({
+            name: item.name,
+            goodsId: item.goodsId,
+            brandId: item.brandId,
+            brandName: item.brandName,
+            skuStockId: item.skuStockId,
+            skuCode: item.skuCode,
+            price: item.price,
+            publishStatus: item.publishStatus,
+            productSn: item.productSn,
+            goodsPrice: null // 成本
+          });
+        }
+      });
+      this.form.goodsList.push(...goodsList);
+
+      this.getBrandCatatory();
+    }
+  }
+};
+</script>
+<style lang="scss" scoped>
+.alert {
+  margin-bottom: 16px;
+}
+.shopImage {
+  width: 60px;
+  height: 60px;
+}
+.shopDesc {
+  max-height: 70px;
+  overflow: hidden;
+}
+
+.el-select__tags .el-tag.el-tag--info.el-tag--small.el-tag--light {
+  max-width: 95px;
+}
+.hiddenStart {
+  ::v-deep .el-form-item__label:before {
+    content: "" !important;
+    position: absolute;
+    color: transparent;
+    margin-right: 4px;
+  }
+}
+
+.dialog-footer {
+  display: block;
+  text-align: right;
+}
+
+.number-input {
+  ::v-deep .el-input__inner {
+    text-align: left;
+  }
+}
+.tableItem {
+  margin-bottom: 0 !important;
+}
+</style>

+ 793 - 0
src/views/businessManager/shopManager/model/singleProducts.vue

@@ -0,0 +1,793 @@
+<template>
+  <div>
+    <el-button type="primary" @click="addGoodsList" style="margin-bottom: 20px"
+      >添加</el-button
+    >
+    <el-form :model="form" :rules="rules" ref="ruleForm" :inline="true">
+      <el-alert title="销售渠道" :closable="false" class="alert" type="info" />
+      <el-form-item
+        label="移动端可售分部"
+        prop="educationShowOrganId"
+        :label-width="formLabelWidth"
+      >
+        <select-all
+          v-model.trim="form.educationShowOrganId"
+          filterable
+          placeholder="移动端可售分部"
+          style="width: 400px !important"
+          multiple
+          clearable
+          :disabled="addDisabled"
+        >
+          <el-option
+            v-for="item in selects.branchs"
+            :key="item.id"
+            :label="item.name"
+            :value="item.id.toString()"
+          ></el-option>
+        </select-all>
+      </el-form-item>
+      <el-form-item
+        label="课程收费乐团可售分部"
+        prop="courseFeeShowOrganId"
+        :label-width="formLabelWidth"
+      >
+        <select-all
+          v-model.trim="form.courseFeeShowOrganId"
+          filterable
+          placeholder="课程收费乐团可售分部"
+          style="width: 400px !important"
+          multiple
+          clearable
+          :disabled="addDisabled"
+        >
+          <el-option
+            v-for="item in selects.branchs"
+            :key="item.id"
+            :label="item.name"
+            :value="item.id.toString()"
+          ></el-option>
+        </select-all>
+      </el-form-item>
+      <el-form-item
+        label="会员收费乐团可售分部"
+        prop="memberFeeShowOrganId"
+        :label-width="formLabelWidth"
+      >
+        <select-all
+          v-model.trim="form.memberFeeShowOrganId"
+          filterable
+          placeholder="请选择会员收费团可见分部"
+          style="width: 400px !important"
+          multiple
+          clearable
+          :disabled="addDisabled"
+        >
+          <el-option
+            v-for="item in selects.branchs"
+            :key="item.id"
+            :label="item.name"
+            :value="item.id.toString()"
+          ></el-option>
+        </select-all>
+      </el-form-item>
+      <el-form-item
+        label="免费乐团可售分部"
+        prop="freeFeeShowOrganId"
+        :label-width="formLabelWidth"
+      >
+        <select-all
+          v-model.trim="form.freeFeeShowOrganId"
+          filterable
+          placeholder="请选择会员收费团可见分部"
+          style="width: 400px !important"
+          multiple
+          clearable
+          :disabled="addDisabled"
+        >
+          <el-option
+            v-for="item in selects.branchs"
+            :key="item.id"
+            :label="item.name"
+            :value="item.id.toString()"
+          ></el-option>
+        </select-all>
+      </el-form-item>
+      <el-form-item
+        v-if="tenantId == 1"
+        label="乐器置换可售分部"
+        prop="replacementShowOrganId"
+        :label-width="formLabelWidth"
+      >
+        <select-all
+          v-model.trim="form.replacementShowOrganId"
+          filterable
+          placeholder="请选择乐器置换可售分部"
+          style="width: 400px !important"
+          multiple
+          clearable
+          :disabled="addDisabled"
+        >
+          <el-option
+            v-for="item in selects.branchs"
+            :key="item.id"
+            :label="item.name"
+            :value="item.id.toString()"
+          ></el-option>
+        </select-all>
+      </el-form-item>
+
+      <el-table
+        :data="form.goodsList"
+        :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
+        style="width:100%!important"
+      >
+        <el-table-column align="center" prop="name" label="商品名称">
+          <template slot-scope="scope">
+            <tooltip :content="scope.row.name" />
+          </template>
+        </el-table-column>
+        <el-table-column align="center" prop="sn" label="商品货号">
+        </el-table-column>
+        <el-table-column align="center" prop="brandName" label="品牌">
+        </el-table-column>
+        <el-table-column align="center" prop="skuCode" label="sku编号">
+        </el-table-column>
+        <el-table-column
+          align="center"
+          prop="marketPrice"
+          label="市场价"
+          width="160"
+        >
+          <template slot-scope="scope">
+            <el-form-item
+              :show-message="false"
+              class="tableItem"
+              :prop="'goodsList.' + scope.$index + '.marketPrice'"
+              :rules="[
+                {
+                  required: true,
+                  validator: validPrice,
+                  trigger: 'blur'
+                }
+              ]"
+            >
+              <el-input-number
+                style="width: 100%!important;"
+                class="number-input"
+                v-model="form.goodsList[scope.$index].marketPrice"
+                :controls="false"
+                :precision="0"
+                :min="0"
+                placeholder="请选择市场价"
+                :disabled="addDisabled"
+              />
+            </el-form-item>
+          </template>
+        </el-table-column>
+        <el-table-column
+          align="center"
+          prop="discountPrice"
+          label="零售价"
+          width="160"
+        >
+          <template slot-scope="scope">
+            <el-form-item
+              :show-message="false"
+              class="tableItem"
+              :prop="'goodsList.' + scope.$index + '.discountPrice'"
+              :rules="[
+                {
+                  required: true,
+                  validator: validPrice,
+                  trigger: 'blur'
+                }
+              ]"
+            >
+              <el-input-number
+                style="width: 100%!important;"
+                class="number-input"
+                v-model="form.goodsList[scope.$index].discountPrice"
+                :controls="false"
+                :precision="0"
+                :min="0"
+                placeholder="请选择零售价"
+                :disabled="addDisabled"
+              />
+            </el-form-item>
+          </template>
+        </el-table-column>
+        <el-table-column
+          align="center"
+          prop="groupPurchasePrice"
+          label="团购价"
+          width="160"
+        >
+          <template slot-scope="scope">
+            <el-form-item
+              :show-message="false"
+              class="tableItem"
+              :prop="'goodsList.' + scope.$index + '.groupPurchasePrice'"
+              :rules="[
+                {
+                  required: true,
+                  validator: validPrice,
+                  trigger: 'blur'
+                }
+              ]"
+            >
+              <el-input-number
+                style="width: 100%!important;"
+                class="number-input"
+                v-model="form.goodsList[scope.$index].groupPurchasePrice"
+                :controls="false"
+                :precision="0"
+                :min="0"
+                placeholder="请选择团购价"
+                :disabled="addDisabled"
+              />
+            </el-form-item>
+          </template>
+        </el-table-column>
+        <el-table-column
+          align="center"
+          prop="goodsPrice"
+          label="成本"
+          width="160"
+        >
+          <template slot-scope="scope">
+            <el-form-item
+              :show-message="false"
+              class="tableItem"
+              :prop="'goodsList.' + scope.$index + '.goodsPrice'"
+              :rules="[
+                {
+                  required: true,
+                  validator: validPrice,
+                  trigger: 'blur'
+                }
+              ]"
+            >
+              <el-input-number
+                style="width: 100%!important;"
+                class="number-input"
+                v-model="form.goodsList[scope.$index].goodsPrice"
+                :controls="false"
+                :precision="0"
+                :min="0"
+                placeholder="请选择成本"
+                :disabled="addDisabled"
+              />
+            </el-form-item>
+          </template>
+        </el-table-column>
+        <el-table-column
+          align="center"
+          prop="type"
+          label="商品类型"
+          width="160"
+        >
+          <template slot-scope="scope">
+            <el-form-item
+              :show-message="false"
+              class="tableItem"
+              :prop="'goodsList.' + scope.$index + '.type'"
+              :rules="[
+                {
+                  required: true,
+                  message: '请选择商品类型',
+                  trigger: 'change'
+                }
+              ]"
+            >
+              <el-select
+                v-model.trim="form.goodsList[scope.$index].type"
+                style="width: 100%!important;"
+                clearable
+                placeholder="商品类型"
+              >
+                <el-option
+                  v-for="(item, index) in goodsType"
+                  :key="index"
+                  :label="item.label"
+                  :value="item.value"
+                ></el-option>
+              </el-select>
+            </el-form-item>
+          </template>
+        </el-table-column>
+        <el-table-column
+          align="center"
+          prop="goodsCategoryId"
+          label="商品分类"
+          width="160"
+        >
+          <template slot-scope="scope">
+            <el-form-item
+              :show-message="false"
+              class="tableItem"
+              :prop="'goodsList.' + scope.$index + '.goodsCategoryId'"
+              :rules="[
+                {
+                  required: true,
+                  message: '请选择商品分类',
+                  trigger: 'change'
+                }
+              ]"
+            >
+              <el-select
+                v-model.trim="form.goodsList[scope.$index].goodsCategoryId"
+                style="width: 100%!important;"
+                clearable
+                placeholder="商品分类"
+              >
+                <el-option
+                  v-for="(item, index) in categoryList"
+                  :key="index"
+                  :label="item.label"
+                  :value="item.value"
+                ></el-option>
+              </el-select>
+            </el-form-item>
+          </template>
+        </el-table-column>
+        <el-table-column align="center" prop="publishStatus" label="状态">
+          <template slot-scope="scope">
+            <el-tag :type="scope.row.publishStatus == 1 ? '' : 'danger'">
+              {{ scope.row.publishStatus ? "上架" : "下架" }}
+            </el-tag>
+          </template>
+        </el-table-column>
+        <el-table-column align="center" prop="sn" label="操作" fixed="right">
+          <template slot-scope="scope">
+            <el-button
+              type="text"
+              @click.prevent="removeGoodsList(scope.row)"
+              :disabled="addDisabled"
+              >删除</el-button
+            >
+          </template>
+        </el-table-column>
+      </el-table>
+    </el-form>
+    <span
+      slot="footer"
+      v-if="!addDisabled"
+      class="dialog-footer"
+      style="padding-top: 12px;"
+    >
+      <el-button @click="$listeners.close()">取 消</el-button>
+      <el-button @click="onShopSubmit('ruleForm')" type="primary"
+        >确 定</el-button
+      >
+    </span>
+
+    <el-dialog
+      title="添加子商品"
+      :visible.sync="recordStatus"
+      :close-on-click-modal="false"
+      width="1200px"
+      append-to-body
+      v-if="recordStatus"
+    >
+      <subShopGoods
+        :disabledIds="disabledIds"
+        @close="recordStatus = false"
+        @comfirm="onConfirm"
+        :goodsBrand="goodsBrand"
+      />
+    </el-dialog>
+  </div>
+</template>
+<script>
+import {
+  goodsAddBatch,
+  goodsUpdate,
+  api_goodsGet
+} from "@/api/businessManager";
+import cleanDeep from "clean-deep";
+import subShopGoods from "./subShopGoods.vue";
+let validPrice = (rule, value, callback) => {
+  if ((value == "" && typeof value == "string") || value == null) {
+    callback(new Error("请输入金额"));
+  } else if (value < 0) {
+    callback(new Error("输入金额必须大于或等于0"));
+  } else if (value >= 100000) {
+    callback(new Error("输入金额必须小于100000"));
+  } else {
+    callback();
+  }
+};
+let validStock = (rule, value, callback) => {
+  if ((value == "" && typeof value == "string") || value == null) {
+    callback(new Error("请输入库存"));
+  } else if (value < 0) {
+    callback(new Error("库存数量必须大于或等于0"));
+  } else {
+    callback();
+  }
+};
+export default {
+  props: [
+    "activeRow",
+    "addType",
+    "addDisabled",
+    "categoryList",
+    "selectGoodsList",
+    "tenantId",
+    "goodsBrand",
+    "goodsType"
+  ],
+  components: {
+    subShopGoods
+  },
+  data() {
+    return {
+      formLabelWidth: "160px",
+      form: {
+        goodsList: [],
+        studentShowOrganId: null,
+        educationShowOrganId: null,
+        courseFeeShowOrganId: null,
+        memberFeeShowOrganId: null,
+        freeFeeShowOrganId: null,
+        replacementShowOrganId: null
+      },
+      goodsTree: [], // 选择商品列表
+      rules: {
+        // replacementShow: [
+        //   {
+        //     required: true,
+        //     message: "请选择是否参与置换",
+        //     trigger: "change"
+        //   }
+        // ],
+      },
+      goodsDetail: {},
+      recordStatus: false,
+      disabledIds: [] // 选中商品的编号
+    };
+  },
+  async mounted() {
+    if (this.addType !== "create") {
+      try {
+        const { data } = await api_goodsGet({ id: this.activeRow.id });
+        this.goodsDetail = data || {};
+        const row = this.goodsDetail;
+        let form = this.form;
+        for (let i in form) {
+          if (i === "brand") {
+            form[i] = Number(row[i]);
+          } else {
+            form[i] = row[i];
+          }
+        }
+        const goodsSub =
+          row.goodsSubList && row.goodsSubList.length > 0
+            ? row.goodsSubList[0]
+            : {};
+        form.goodsList = [
+          {
+            name: row.name,
+            sn: row.sn,
+            brandId: row.brand,
+            brandName: row.brandName,
+            type: row.type,
+            goodsCategoryId: row.goodsCategoryId,
+            specification: row.specification,
+            marketPrice: row.marketPrice,
+            discountPrice: row.discountPrice,
+            groupPurchasePrice: row.groupPurchasePrice,
+            groupGoods: row.groupGoods ? 1 : 0,
+            pic: row.image,
+            skuStockId: goodsSub.sku,
+            skuCode: goodsSub.skuCode,
+            goodsPrice: goodsSub.goodsPrice,
+            goodsId: goodsSub.mallGoodsId,
+            publishStatus: goodsSub.goodsStatus
+          }
+        ];
+        console.log(form);
+        form.id = row.id;
+
+        if (row.studentShowOrganId) {
+          form.studentShowOrganId = row.studentShowOrganId.split(",");
+        }
+
+        if (row.educationShowOrganId) {
+          form.educationShowOrganId = row.educationShowOrganId.split(",");
+        }
+
+        if (row.courseFeeShowOrganId) {
+          form.courseFeeShowOrganId = row.courseFeeShowOrganId.split(",");
+        }
+
+        if (row.memberFeeShowOrganId) {
+          form.memberFeeShowOrganId = row.memberFeeShowOrganId.split(",");
+        }
+        if (row.freeFeeShowOrganId) {
+          form.freeFeeShowOrganId = row.freeFeeShowOrganId.split(",");
+        }
+
+        if (row.replacementShowOrganId) {
+          form.replacementShowOrganId = row.replacementShowOrganId.split(",");
+        }
+
+        if (row.organIdList) {
+          form.organIdList = row.organIdList.split(",");
+        }
+      } catch (e) {
+        //
+      }
+    }
+  },
+  methods: {
+    validPrice,
+    async __init() {
+      let params = {
+        delFlag: 0,
+        rows: 9999
+      };
+      try {
+        const { data } = await api_queryGoodsCategoryList(params);
+        const result = data || [];
+        let tempArray = [];
+        result.forEach(row => {
+          let children = [];
+          if (row.children && row.children.length > 0) {
+            row.children.forEach(child => {
+              children.push({
+                label: child.name,
+                value: child.id
+              });
+            });
+          }
+          tempArray.push({
+            label: row.name,
+            value: row.id,
+            children
+          });
+        });
+        this.categoryList = tempArray;
+      } catch {}
+    },
+    formatParentId(id, list, ids = []) {
+      for (const item of list) {
+        if (item.children) {
+          const cIds = this.formatParentId(id, item.children, [
+            ...ids,
+            item.value
+          ]);
+          if (cIds.includes(id)) {
+            return cIds;
+          }
+        }
+        if (item.value === id) {
+          return [...ids, id];
+        }
+      }
+      return ids;
+    },
+    onShopSubmit(formName) {
+      let form = Object.assign({}, this.form);
+      if (form.studentShowOrganId) {
+        form.studentShowOrganId = form.studentShowOrganId.join(",");
+      }
+      if (form.educationShowOrganId) {
+        form.educationShowOrganId = form.educationShowOrganId.join(",");
+      }
+
+      if (form.courseFeeShowOrganId) {
+        form.courseFeeShowOrganId = form.courseFeeShowOrganId.join(",");
+      }
+      if (form.memberFeeShowOrganId) {
+        form.memberFeeShowOrganId = form.memberFeeShowOrganId.join(",");
+      }
+      if (form.freeFeeShowOrganId) {
+        form.freeFeeShowOrganId = form.freeFeeShowOrganId.join(",");
+      }
+      if (form.replacementShowOrganId) {
+        form.replacementShowOrganId = form.replacementShowOrganId.join(",");
+      }
+      if (
+        !form.studentShowOrganId &&
+        !form.educationShowOrganId &&
+        !form.courseFeeShowOrganId &&
+        !form.freeFeeShowOrganId &&
+        !form.memberFeeShowOrganId &&
+        !form.replacementShowOrganId
+      ) {
+        this.$message.error("请至少选择一个可见分部");
+        return;
+      }
+      if (this.form.goodsList.length <= 0) {
+        this.$message.error("请至少添加一个商品");
+        return;
+      }
+      this.$refs[formName].validate(valid => {
+        if (valid) {
+          let temps = [];
+          form.goodsList.forEach(item => {
+            if (item.skuStockId) {
+              temps.push({
+                name: item.name,
+                sn: item.sn,
+                brand: item.brandId,
+                type: item.type,
+                goodsCategoryId: item.goodsCategoryId,
+                specification: item.specification,
+                marketPrice: item.marketPrice,
+                discountPrice: item.discountPrice,
+                groupPurchasePrice: item.groupPurchasePrice,
+                groupGoods: 0,
+                studentShowOrganId: form.studentShowOrganId,
+                educationShowOrganId: form.educationShowOrganId,
+                memberFeeShowOrganId: form.memberFeeShowOrganId,
+                courseFeeShowOrganId: form.courseFeeShowOrganId,
+                freeFeeShowOrganId: form.freeFeeShowOrganId,
+                replacementShowOrganId: form.replacementShowOrganId,
+                image: item.pic,
+                goodsSubList: [
+                  {
+                    mallGoodsId: item.goodsId,
+                    sku: item.skuStockId,
+                    goodsStatus: item.publishStatus,
+                    goodsPrice: item.goodsPrice
+                  }
+                ]
+                // brief: item.detailHtml,
+                // desc: ""
+              });
+            }
+          });
+
+          console.log(temps, "temps");
+          if (this.addType == "create" || this.addType == "copy") {
+            if (this.form.id) {
+              // 判断有没有Id,如果有则删除
+              delete this.form.id;
+            }
+            // form.status = "NO"; // 默认下架
+            temps.forEach(temp => {
+              temp.status = "NO";
+            });
+            goodsAddBatch(cleanDeep(temps)).then(res => {
+              this.messageTips("保存", res);
+            });
+          } else if (this.addType == "update") {
+            const goods = temps[0];
+            goods.id = this.form.id;
+            goodsUpdate(cleanDeep(goods)).then(res => {
+              this.messageTips("保存", res);
+            });
+          }
+        } else {
+          this.$nextTick(() => {
+            let isError = document.getElementsByClassName("is-error");
+            isError[0].scrollIntoView({
+              block: "center",
+              behavior: "smooth"
+            });
+          });
+          return false;
+        }
+      });
+    },
+    messageTips(title, res) {
+      if (res.code == 200) {
+        this.$message.success(title + "成功");
+        this.$listeners.close();
+        this.$listeners.confirm();
+      } else {
+        this.$message.error(res.msg);
+      }
+    },
+    removeGoodsList(item) {
+      this.$confirm("是否删除该商品?", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      })
+        .then(() => {
+          const index = this.form.goodsList.indexOf(item);
+          if (index !== -1) {
+            this.form.goodsList.splice(index, 1);
+          }
+        })
+        .catch(() => {});
+    },
+    addGoodsList() {
+      const ids = [];
+      this.form.goodsList.forEach(goods => {
+        ids.push(goods.skuStockId);
+      });
+      this.disabledIds = ids;
+      this.recordStatus = true;
+    },
+    onFormClose(formName) {
+      // 关闭弹窗重置验证
+      this.$refs[formName].resetFields();
+    },
+    onConfirm(list) {
+      // 添加子商品
+      console.log(list);
+      const goodsList = [];
+      (list || []).forEach(item => {
+        const index = this.form.goodsList.findIndex(
+          goods => goods.skuStockId == item.skuStockId
+        );
+
+        if (index == -1) {
+          // 商品型号
+          const spData = item.spData
+            ? JSON.parse(item.spData)
+            : [{ key: "默认" }];
+          let spText = "";
+          spData.forEach(sp => {
+            spText += sp.key + (sp.value ? ":" + sp.value : "");
+          });
+
+          goodsList.push({
+            name: item.name,
+            goodsId: item.goodsId,
+            brandId: item.brandId,
+            brandName: item.brandName,
+            skuStockId: item.skuStockId,
+            skuCode: item.skuCode,
+            pic: item.pic,
+            specification: spText,
+            detailHtml: item.detailHtml,
+            price: item.price,
+            publishStatus: item.publishStatus,
+            sn: item.productSn,
+            marketPrice: null,
+            discountPrice: null,
+            groupPurchasePrice: null,
+            goodsPrice: null
+          });
+        }
+      });
+      this.form.goodsList.push(...goodsList);
+    }
+  }
+};
+</script>
+<style lang="scss" scoped>
+.alert {
+  margin-bottom: 16px;
+}
+.shopImage {
+  width: 60px;
+  height: 60px;
+}
+.shopDesc {
+  max-height: 70px;
+  overflow: hidden;
+}
+
+.el-select__tags .el-tag.el-tag--info.el-tag--small.el-tag--light {
+  max-width: 95px;
+}
+.hiddenStart {
+  ::v-deep .el-form-item__label:before {
+    content: "" !important;
+    position: absolute;
+    color: transparent;
+    margin-right: 4px;
+  }
+}
+
+.dialog-footer {
+  display: block;
+  text-align: right;
+}
+
+.number-input {
+  ::v-deep .el-input__inner {
+    text-align: left;
+  }
+}
+.tableItem {
+  margin-bottom: 0 !important;
+}
+</style>

+ 315 - 0
src/views/businessManager/shopManager/model/subShopGoods.vue

@@ -0,0 +1,315 @@
+<!--  -->
+<template>
+  <div>
+    <save-form
+      :inline="true"
+      class="searchForm"
+      ref="searchForm"
+      @submit="onSearch"
+      @reset="onReset"
+      :model="searchForm"
+      save-key="subShopGoods"
+    >
+      <el-form-item prop="keyword">
+        <el-input
+          v-model.trim="searchForm.keyword"
+          clearable
+          placeholder="商品名称"
+        ></el-input>
+      </el-form-item>
+      <el-form-item prop="productSn">
+        <el-input
+          v-model.trim="searchForm.productSn"
+          clearable
+          placeholder="商品货号"
+        ></el-input>
+      </el-form-item>
+      <el-form-item prop="productCategoryId">
+        <!-- <el-select
+          v-model.trim="searchForm.productCategoryId"
+          clearable
+          placeholder="商品分类"
+        >
+          <el-option
+            v-for="item in categoryList"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value"
+          >
+          </el-option>
+        </el-select> -->
+        <el-cascader
+          v-model.trim="searchForm.productCategoryId"
+          :options="categoryList"
+          placeholder="商品分类"
+          :props="{ expandTrigger: 'hover' }"
+        ></el-cascader>
+        <!-- checkStrictly: true, -->
+      </el-form-item>
+      <el-form-item prop="brandId">
+        <el-select
+          v-model.trim="searchForm.brandId"
+          clearable
+          placeholder="商品品牌"
+        >
+          <el-option
+            v-for="(item, index) in goodsBrand"
+            :key="index"
+            :label="item.label"
+            :value="item.value"
+          ></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item prop="publishStatus">
+        <el-select
+          v-model.trim="searchForm.publishStatus"
+          clearable
+          placeholder="上架状态"
+        >
+          <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 type="primary" native-type="reset">重置</el-button>
+      </el-form-item>
+    </save-form>
+    <div class="tableWrap">
+      <el-table
+        :data="tableList"
+        :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
+        @selection-change="handleSelectionChange"
+        @select="onTableSelect"
+        ref="multipleSelection"
+      >
+        <el-table-column
+          type="selection"
+          width="55"
+          :selectable="onSelectable"
+        ></el-table-column>
+        <el-table-column
+          align="center"
+          prop="name"
+          label="商品名称"
+          width="200px"
+        >
+          <template slot-scope="scope">
+            <tooltip :content="scope.row.name" />
+          </template>
+        </el-table-column>
+        <el-table-column align="center" prop="productSn" label="商品货号">
+        </el-table-column>
+        <el-table-column align="center" prop="brandName" label="品牌">
+        </el-table-column>
+        <el-table-column align="center" prop="skuCode" label="sku编号">
+        </el-table-column>
+        <el-table-column align="center" prop="price" label="销售价格">
+        </el-table-column>
+        <el-table-column align="center" prop="stock" label="剩余库存">
+        </el-table-column>
+        <!-- <el-table-column align="center" prop="price" label="采购价">
+        </el-table-column> -->
+        <el-table-column align="center" prop="publishStatus" label="状态">
+          <template slot-scope="scope">
+            <el-tag :type="scope.row.publishStatus == 1 ? '' : 'danger'">
+              {{ scope.row.publishStatus ? "上架" : "下架" }}
+            </el-tag>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination
+        sync
+        save-key="subShopGoods"
+        :total.sync="pageInfo.total"
+        :page.sync="pageInfo.page"
+        :limit.sync="pageInfo.limit"
+        :page-sizes="pageInfo.page_size"
+        @pagination="getList"
+      />
+    </div>
+    <div class="dialog-footer">
+      <el-button @click="onClose()">取 消</el-button>
+      <el-button type="primary" @click="onSubmit()">确 定</el-button>
+    </div>
+  </div>
+</template>
+
+<script>
+import pagination from "@/components/Pagination/index";
+import {
+  api_queryGoodsSubByPage,
+  api_queryGoodsCategoryList
+} from "@/api/businessManager";
+export default {
+  props: ["disabledIds", "goodsBrand"],
+  components: {
+    pagination
+  },
+  data() {
+    return {
+      categoryList: [],
+      pageInfo: {
+        // 分页规则
+        limit: 10, // 限制显示条数
+        page: 1, // 当前页
+        total: 0, // 总条数
+        page_size: [10, 20, 40, 50] // 选择限制显示条数
+      },
+      searchForm: {
+        keyword: null,
+        productSn: null,
+        publishStatus: null,
+        productCategoryId: null,
+        brandId: null
+      },
+      tableList: [],
+      isNewPage: false,
+      selectList: []
+    };
+  },
+  //生命周期 - 挂载完成(可以访问DOM元素)
+  mounted() {
+    this.__init();
+    this.getList();
+  },
+  methods: {
+    async __init() {
+      let params = {
+        delFlag: 0,
+        rows: 9999
+      };
+      try {
+        const { data } = await api_queryGoodsCategoryList(params);
+        const result = data || [];
+        let tempArray = [];
+        result.forEach(row => {
+          let children = [];
+          if (row.children && row.children.length > 0) {
+            row.children.forEach(child => {
+              children.push({
+                label: child.name,
+                value: child.id
+              });
+            });
+          }
+          tempArray.push({
+            label: row.name,
+            value: row.id,
+            children
+          });
+        });
+        this.categoryList = tempArray;
+      } catch {}
+    },
+    getList() {
+      let params = Object.assign({}, this.searchForm);
+      // params.organId = this.organId;
+      params.rows = this.pageInfo.limit;
+      params.page = this.pageInfo.page;
+      params.productCategoryId = params.productCategoryId
+        ? params.productCategoryId[params.productCategoryId.length - 1]
+        : null;
+      api_queryGoodsSubByPage(params).then(res => {
+        if (res.code == 200 && res.data) {
+          this.tableList = res.data.rows;
+          this.pageInfo.total = res.data.total;
+
+          let idList = this.selectList.map(group => {
+            return group.skuStockId;
+          });
+          this.isNewPage = true;
+          this.$nextTick(() => {
+            this.tableList.forEach(course => {
+              if (idList.indexOf(course.skuStockId) != -1) {
+                this.$refs.multipleSelection.toggleRowSelection(course, true);
+              }
+            });
+            this.isNewPage = false;
+          });
+        }
+      });
+    },
+    onSearch() {
+      this.pageInfo.page = 1;
+      this.getList();
+    },
+    onReset() {
+      // 重置
+      this.$refs.searchForm.resetFields();
+      this.getList();
+    },
+    onClose() {
+      this.$listeners.close();
+    },
+    onSubmit() {
+      this.$listeners.comfirm(this.selectList);
+      this.onClose();
+    },
+    onSelectable(row) {
+      return !this.disabledIds.includes(row.skuStockId);
+    },
+    handleSelectionChange(arr) {
+      if (arr.length > 0) {
+        // 有可能加 有可能减
+        this.selectList = this.selectList.concat(arr);
+        // 去重
+        this.selectList = this.$helpers.lodash.uniqBy(
+          this.selectList,
+          "skuStockId"
+        );
+      }
+      // else if(){}
+      else {
+        if (this.isNewPage) return;
+        // 有2种 1是新页
+        // 2是点击反选
+        let idList = this.selectList.map(course => {
+          return course.skuStockId;
+        });
+        this.$nextTick(() => {
+          let tableIdList = [];
+          this.tableList.forEach(course => {
+            tableIdList.push(course.skuStockId);
+            if (idList.indexOf(course.skuStockId) != -1) {
+              this.$refs.tableList.toggleRowSelection(course, false);
+              // 删除这个元素
+            }
+          });
+          this.selectList = this.$helpers.lodash.remove(
+            this.selectList,
+            function(item) {
+              return tableIdList.indexOf(item.skuStockId) == -1;
+            }
+          );
+          if (this.selectList.length <= 0) {
+            this.clearCom();
+          }
+        });
+      }
+    },
+    onTableSelect(rows, row) {
+      let idList = this.selectList.map(course => {
+        return course.skuStockId;
+      });
+      if (idList.indexOf(row.skuStockId) != -1) {
+        this.selectList.splice(idList.indexOf(row.skuStockId), 1);
+        if (this.selectList.length <= 0) {
+          this.clearCom();
+        }
+      }
+    },
+    clearCom() {
+      // this.selectList = [];
+      // this.$refs.multipleSelection.clearSelection();
+    }
+  }
+};
+</script>
+<style lang="less" scoped>
+.dialog-footer {
+  padding-top: 20px;
+  width: 100%;
+  text-align: center;
+}
+</style>

+ 25 - 26
src/views/businessManager/shopManager/shopCategory.vue

@@ -1,4 +1,3 @@
-
 <template>
   <div class="m-container">
     <h2>
@@ -117,7 +116,7 @@ import { subjectListTree } from "@/api/specialSetting";
 import {
   categoryListTree,
   categoryUpSet,
-  categoryUpSetDel,
+  categoryUpSetDel
 } from "@/api/businessManager";
 export default {
   components: { pagination },
@@ -129,27 +128,27 @@ export default {
       formActionTitle: "create",
       formTitle: {
         create: "添加商品分类",
-        update: "修改商品分类",
+        update: "修改商品分类"
       },
       typeStatus: false, // 添加教学点
       formLabelWidth: "120px",
       form: {
         name: null, // 训练模块名称
-        subjectIds: [],
+        subjectIds: []
       },
       rules: {
         name: [{ required: true, message: "请输入类型名称", trigger: "blur" }],
         subjectIds: [
-          { required: true, message: "请选择声部组合", trigger: "change" },
-        ],
+          { required: true, message: "请选择声部组合", trigger: "change" }
+        ]
       },
       pageInfo: {
         // 分页规则
         limit: 10, // 限制显示条数
         page: 1, // 当前页
         total: 0, // 总条数
-        page_size: [10, 20, 40, 50], // 选择限制显示条数
-      },
+        page_size: [10, 20, 40, 50] // 选择限制显示条数
+      }
     };
   },
   mounted() {
@@ -161,27 +160,27 @@ export default {
       this.$confirm("您确定删除该分类?", "提示", {
         confirmButtonText: "确定",
         cancelButtonText: "取消",
-        type: "warning",
+        type: "warning"
       }).then(() => {
-        categoryUpSetDel({ id: row.id }).then((res) => {
+        categoryUpSetDel({ id: row.id }).then(res => {
           this.messageTips("删除", res);
         });
       });
     },
     onTypesSubmit(formName) {
       // 添加数据
-      this.$refs[formName].validate((valid) => {
+      this.$refs[formName].validate(valid => {
         if (valid) {
           if (this.formActionTitle == "create") {
             if (this.form.id) {
               // 判断有没有Id,如果有则删除
               delete this.form.id;
             }
-            categoryUpSet(this.form).then((res) => {
+            categoryUpSet(this.form).then(res => {
               this.messageTips("添加", res);
             });
           } else if (this.formActionTitle == "update") {
-            categoryUpSet(this.form).then((res) => {
+            categoryUpSet(this.form).then(res => {
               this.messageTips("修改", res);
             });
           }
@@ -204,14 +203,14 @@ export default {
       categoryListTree({
         delFlag: 0,
         rows: this.pageInfo.limit,
-        page: this.pageInfo.page,
-      }).then((res) => {
+        page: this.pageInfo.page
+      }).then(res => {
         let result = res.data;
         if (res.code == 200) {
-          result.rows.forEach((row) => {
+          result.rows.forEach(row => {
             let subjectname = [],
               subjectIds = [];
-            row.subjects.forEach((item) => {
+            (row.subjects || []).forEach(item => {
               subjectname.push(item.name);
               subjectIds.push(item.id);
             });
@@ -231,7 +230,7 @@ export default {
         this.form = {
           id: row.id,
           name: row.name,
-          subjectIds: row.subjectIds,
+          subjectIds: row.subjectIds
         };
       }
     },
@@ -239,7 +238,7 @@ export default {
       // 关闭弹窗重置验证
       this.form = {
         name: null, // 训练模块名称
-        subjectIds: [],
+        subjectIds: []
       };
       this.$refs[formName].resetFields();
     },
@@ -247,30 +246,30 @@ export default {
       // 获取声部列表
       subjectListTree({
         delFlag: 0,
-        rows: 9999,
-      }).then((res) => {
+        rows: 9999
+      }).then(res => {
         let result = res.data;
         if (res.code == 200) {
           let tempArray = [];
           result.rows.forEach((item, index) => {
             let subject = [];
-            item.subjects.forEach((s) => {
+            (item.subjects || []).forEach(s => {
               subject.push({
                 value: s.id,
-                label: s.name,
+                label: s.name
               });
             });
 
             tempArray[index] = {
               label: item.name,
-              options: subject,
+              options: subject
             };
           });
           this.subjectList = tempArray;
         }
       });
-    },
-  },
+    }
+  }
 };
 </script>
 <style lang="scss" scoped>

File diff suppressed because it is too large
+ 116 - 700
src/views/businessManager/shopManager/shopList.vue


+ 21 - 21
src/views/reaplceMusicPlayer/modals/detail.vue

@@ -123,7 +123,7 @@
         ></el-table-column>
         <el-table-column align="center" prop="studentId" label="品牌型号">
           <template slot-scope="scope">
-            <div>{{ scope.row.brand }}{{ scope.row.specification }}</div>
+            <div>{{ scope.row.brandName }}{{ scope.row.specification }}</div>
           </template>
         </el-table-column>
         <el-table-column align="center" prop="payStatus" label="是否开启缴费">
@@ -163,8 +163,8 @@
                 @click="openFlagMusic(scope.row)"
                 v-if="
                   scope.row.openFlag == 0 &&
-                  scope.row.instrumentsId &&
-                  permission('replacementInstrumentActivity/updateOpenFlag')
+                    scope.row.instrumentsId &&
+                    permission('replacementInstrumentActivity/updateOpenFlag')
                 "
                 >开启缴费</el-button
               >
@@ -173,7 +173,7 @@
                 @click="resetMusic(scope.row)"
                 v-if="
                   permission('replacementInstrumentActivity/update') &&
-                  scope.row.payStatus == 0
+                    scope.row.payStatus == 0
                 "
                 >修改</el-button
               >
@@ -215,7 +215,7 @@ import resetInfo from "./resetInfo";
 import {
   getInstrumentSoundList,
   getInstrumentActivityList,
-  updateOpenFlag,
+  updateOpenFlag
 } from "../api";
 import ItemVue from "@/layout/components/Sidebar/Item.vue";
 import Tooltip from "@/components/Tooltip/index";
@@ -229,7 +229,7 @@ const soundList = [
   { text: "长号", value: 14 },
   { text: "上低音号", value: 15 },
   { text: "大号", value: 17 },
-  { text: "打击乐", value: 23 },
+  { text: "打击乐", value: 23 }
 ];
 export default {
   components: { pagination, resetInfo, Tooltip },
@@ -242,7 +242,7 @@ export default {
         search: "",
         subjectId: "",
         hasYesFirstAnswer: "",
-        hasInstrumentsId: "",
+        hasInstrumentsId: ""
       },
       tableList: [],
       rules: {
@@ -250,12 +250,12 @@ export default {
         limit: 10, // 限制显示条数
         page: 1, // 当前页
         total: 0, // 总条数
-        page_size: [10, 20, 40, 50], // 选择限制显示条数
+        page_size: [10, 20, 40, 50] // 选择限制显示条数
       },
       dialogVisible: false,
       branchList: [],
       resetRow: null,
-      soundList: soundList,
+      soundList: soundList
     };
   },
   mounted() {
@@ -272,10 +272,10 @@ export default {
         const res = await getInstrumentActivityList({
           ...this.searchForm,
           page: this.rules.page,
-          rows: this.rules.limit,
+          rows: this.rules.limit
         });
         let temp = res.data.rows || [];
-        temp.forEach((item) => {
+        temp.forEach(item => {
           let questionResult = item.questionResult.split("");
           item.question1 = questionResult[0] == 1 ? "是" : "否";
         });
@@ -292,12 +292,12 @@ export default {
       this.$confirm("您是否开启缴费?", "提示", {
         confirmButtonText: "确定",
         cancelButtonText: "取消",
-        type: "warning",
+        type: "warning"
       }).then(async () => {
         try {
           await updateOpenFlag({
             Id: row.id,
-            openFlag: 1,
+            openFlag: 1
           });
           this.$message.success("开启成功");
           this.getList();
@@ -312,7 +312,7 @@ export default {
       this.search();
     },
     resetMusic(row) {
-      row.organId = this.detail.organId
+      row.organId = this.detail.organId;
       this.resetRow = row;
       this.dialogVisible = true;
     },
@@ -327,12 +327,12 @@ export default {
             subjectId: val,
             organId: this.detail.organId,
             page: 1,
-            rows: 999,
+            rows: 999
           });
-          this.branchList = res.data.rows.map((item) => {
+          this.branchList = res.data.rows.map(item => {
             return {
-              name: item.brand + item.specification,
-              id: item.specification,
+              name: item.brandName + item.specification,
+              id: item.specification
             };
           });
           console.log(res);
@@ -346,14 +346,14 @@ export default {
     },
     permission(str, parent) {
       return permission(str, parent);
-    },
+    }
   },
   filters: {
     openFlagStatus(val) {
       let template = ["否", "是"];
       return template[val];
-    },
-  },
+    }
+  }
 };
 </script>
 

+ 15 - 0
src/views/resetTeaming/api.js

@@ -21,6 +21,14 @@ export const musicGroupcreateCalender = data =>
     data,
     method: "post"
   });
+
+// musicGroupCalenderRefundPeriod/batchUpdate
+export const musicGroupbatchUpdate = data =>
+  request2({
+    url: "/api-web/musicGroupCalenderRefundPeriod/batchUpdate",
+    data,
+    method: "post"
+  });
 export const musicGroupresetCalender = data =>
   request2({
     url: "/api-web/musicGroupPaymentCalender/updateCalender",
@@ -172,3 +180,10 @@ export const cloudPayCheck = data =>
     hideLoading: true,
     params: data
   });
+
+export const api_goodsQuery = data =>
+  request2({
+    url: "/api-web/goods/queryPage",
+    method: "get",
+    params: data
+  });

+ 548 - 0
src/views/resetTeaming/components/goodsPayInfo.vue

@@ -0,0 +1,548 @@
+<template>
+  <div class="m-container1">
+    <el-page-header @back="goback" style="padding: 20px" :content="'学校缴费'">
+    </el-page-header>
+    <div class="payInfoWrap">
+      <div class="left">
+        <div class="m-core1">
+          <el-form :inline="true" :model="form" label-width="120px" ref="form">
+            <div class="coreList">
+              <payGoodsInfo
+                :form="form"
+                :courseViewType="courseViewType"
+                :organId="organId"
+                :payschoolListStatus="payschoolListStatus"
+              />
+              <payFeeInfo
+                :form="form"
+                @setAllTotal="setAllTotal"
+                :payschoolListStatus="payschoolListStatus"
+              />
+              <payAddressInfo
+                :form="form"
+                :payschoolListStatus="payschoolListStatus"
+              />
+              <payBackMoney
+                :form="form"
+                :educationList="educationList"
+                :payschoolListStatus="payschoolListStatus"
+              />
+            </div>
+          </el-form>
+
+          <div style="text-align: center;padding-bottom: 12px">
+            <el-button class="submitBtn" @click="onSubmit">确认</el-button>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+<script>
+import { getMusicGroupPaymentCalenderDetail } from "@/api/buildTeam";
+import { queryEmployByOrganId } from "@/api/systemManage";
+import {
+  musicGroupcreateCalender,
+  musicGroupresetCalender,
+  musicGroupbatchUpdate
+} from "../api";
+import payGoodsInfo from "../goodsModal/payGoodsInfo";
+import payFeeInfo from "../goodsModal/payFeeInfo";
+import payAddressInfo from "../goodsModal/payAddressInfo";
+import payBackMoney from "../goodsModal/payBackMoney";
+export default {
+  components: {
+    payGoodsInfo,
+    payFeeInfo,
+    payAddressInfo,
+    payBackMoney
+  },
+  data() {
+    return {
+      baseInfo: null,
+      organId: null,
+      courseViewType: null,
+      educationList: [],
+      form: {
+        calenderGoodsList: [], // 添加商品
+        currentTotalAmount: null, // 付款金额
+        calenderFeeJson: {
+          discountTotal: 0 // 优惠金额
+        },
+        contractUrl: "", // 合同链接
+        memo: "", // 备注
+        calenderAddress: {
+          address: "", // 详情地址
+          phone: "", // 手机号
+          name: "", // 收货人
+          province: null,
+          city: null,
+          region: null
+        },
+        responsiblePerson: null, // 责任人
+        responsibleMemo: null, // 备注
+        musicGroupCalenderRefundPeriods: [{ refundDate: "", refundAmount: "" }] // 回款周期
+      }
+    };
+  },
+  mounted() {
+    this.baseInfo = JSON.parse(localStorage.getItem("payMusicBase"));
+
+    this.init();
+  },
+  methods: {
+    async init() {
+      this.organId = this.musicGroup?.organId;
+      this.courseViewType = this.baseInfo?.musicGroup?.courseViewType;
+
+      this.getEmploy();
+
+      if (this.$route.query.calenderId) {
+        // 说明是修改  查缴项目详情
+        this.initDetail = true;
+        await getMusicGroupPaymentCalenderDetail({
+          id: this.$route.query.calenderId
+        }).then(res => {
+          if (res.code == 200) {
+            const result = res.data || {};
+            this.$set(this.form, "calenderGoodsList", result.goods || []);
+
+            this.$set(
+              this.form,
+              "musicGroupCalenderRefundPeriods",
+              result.calenderRefundPeriods
+            );
+            // 设置责任人
+            if (
+              result.calenderRefundPeriods &&
+              result.calenderRefundPeriods.length > 0
+            ) {
+              this.$set(
+                this.form,
+                "responsiblePerson",
+                result.calenderRefundPeriods[0].responsiblePerson
+              );
+              this.$set(
+                this.form,
+                "responsibleMemo",
+                result.calenderRefundPeriods[0].memo
+              );
+            }
+            let calenderFeeJson = result.calender?.calenderFeeJson;
+            if (calenderFeeJson) {
+              calenderFeeJson = JSON.parse(calenderFeeJson);
+              this.$set(this.form, "calenderFeeJson", calenderFeeJson);
+            }
+            this.$set(this.form, "contractUrl", result.calender?.contractUrl);
+            this.$set(this.form, "memo", result.calender?.memo);
+            this.$set(this.form, "calenderAddress", result.address);
+          }
+        });
+      }
+    },
+    setAllTotal(val) {
+      this.form.calenderFeeJson.allTotal = val;
+      if (this.form.calenderFeeJson.discountTotal) {
+        this.form.currentTotalAmount =
+          this.form.calenderFeeJson.allTotal -
+          this.form.calenderFeeJson.discountTotal;
+      } else {
+        this.form.currentTotalAmount = this.form.calenderFeeJson.allTotal;
+      }
+      this.$set(this.form, "currentTotalAmount", this.form.currentTotalAmount);
+    },
+    getEmploy() {
+      try {
+        queryEmployByOrganId({
+          organId: this.organId,
+          rows: 99999,
+          demissionflag: 0
+        }).then(res => {
+          this.educationList = res.data?.rows || [];
+        });
+      } catch (e) {
+        conosle.log(res, "res");
+      }
+    },
+    goback() {
+      let query = { ...this.$route.query };
+      query.calenderId = null;
+      if (query.type == "resetTeam") {
+        this.$store.dispatch("delVisitedViews", this.$route);
+        this.$router.push({
+          path: "/business/resetTeaming",
+          query
+        });
+      } else if (query.type == "look") {
+        this.$store.dispatch("delVisitedViews", this.$route);
+        this.$router.push({
+          path: "/business/resetTeaming",
+          query
+        });
+      } else if (query.type == "payschoolList") {
+        this.$store.dispatch("delVisitedViews", this.$route);
+        this.$router.push({
+          path: "/financialManager/payschoolList",
+          query: {
+            id: query.id,
+            name: query.name
+          }
+        });
+      } else if (
+        query.type == "teamDraft" ||
+        query.type == "feeAudit" ||
+        query.type == "FEE_AUDIT_FAILED"
+      ) {
+        this.$store.dispatch("delVisitedViews", this.$route);
+        this.$router.push({
+          path: "/business/resetTeaming",
+          query
+        });
+      }
+    },
+    onSubmit() {
+      console.log(this.formatData());
+      this.$refs.form.validate(async isok => {
+        if (!isok) return;
+        let obj = this.formatData();
+        if (this.form.calenderGoodsList.length <= 0) {
+          this.$message.error("请至少选择一个采购商品");
+          return;
+        }
+        // 修改账期时,金额可以不一致
+        // if (this.$route.query.type != "payschoolList") {
+        //   let total = 0;
+        //   this.for m.musicGroupCalenderRefundPeriods.forEach(item => {
+        //     total += item.refundAmount * 1;
+        //   });
+        //   if (total != this.form.currentTotalAmount) {
+        //     this.$message.error("付款金额与回款金额不一致,请重新设置");
+        //     return;
+        //   }
+        // }
+
+        if (this.$route.query.calenderId) {
+          obj.calenderId = this.$route.query.calenderId;
+          try {
+            // 账期修改
+            if (this.$route.query.type == "payschoolList") {
+              const res = await musicGroupbatchUpdate(
+                obj.musicGroupCalenderRefundPeriods
+              );
+              if (res.code == 200) {
+                this.$message.success("修改账期成功");
+                this.goback();
+              }
+              return;
+            }
+            // 其它修改
+            const res = await musicGroupresetCalender(obj);
+            if (res.code == 200) {
+              this.$message.success("修改缴费成功");
+              this.goback();
+            }
+            if (res.code == 207) {
+              await this.$confirm(
+                res.msg || `当前乐团存在未排课的缴费项目,请再次确认操作`,
+                "提示",
+                {
+                  type: "warning"
+                }
+              );
+              obj.confirmCreate = true;
+              await musicGroupresetCalender(obj);
+              this.$message.success("修改缴费成功");
+              this.goback();
+            }
+          } catch (e) {
+            console.log(e);
+          }
+        } else {
+          try {
+            const res = await musicGroupcreateCalender(obj);
+            if (res.code == 200) {
+              this.$message.success("创建缴费成功");
+              this.goback();
+            }
+            if (res.code == 207) {
+              await this.$confirm(
+                res.msg || `当前乐团存在未排课的缴费项目,请再次确认操作`,
+                "提示",
+                {
+                  type: "warning"
+                }
+              );
+              obj.confirmCreate = true;
+              await musicGroupcreateCalender(obj);
+              this.$message.success("创建缴费成功");
+              this.goback();
+            }
+          } catch (e) {
+            console.log(e);
+          }
+        }
+      });
+    },
+    formatData() {
+      const query = this.$route.query;
+      let calenderFeeJson = this.form.calenderFeeJson;
+      const musicGroupCalenderRefundPeriods =
+        this.form.musicGroupCalenderRefundPeriods || [];
+      musicGroupCalenderRefundPeriods.forEach(period => {
+        period.responsiblePerson = this.form.responsiblePerson;
+        period.memo = this.form.responsibleMemo;
+      });
+
+      return {
+        payUserType: "SCHOOL",
+        memo: this.form.memo,
+        musicGroupId:
+          query.type == "payschoolList" ? query.musicGroupId : query.id,
+        calenderFeeJson: JSON.stringify(calenderFeeJson),
+        musicGroupCalenderRefundPeriods,
+        currentTotalAmount: this.form.currentTotalAmount,
+        contractUrl: this.form.contractUrl,
+        calenderAddress: this.form.calenderAddress,
+        calenderGoodsList: this.form.calenderGoodsList
+      };
+    },
+    scrollView(object) {
+      console.log(object);
+      for (const i in object) {
+        let dom = this.$refs[i];
+        // 这里是针对遍历的情况(多个输入框),取值为数组
+        if (Object.prototype.toString.call(dom) !== "[object Object]") {
+          if (dom) {
+            dom = dom[0];
+          }
+        }
+
+        // 第一种方法(包含动画效果)
+        dom.$el.scrollIntoView({
+          // 滚动到指定节点
+          // 值有start,center,end,nearest,当前显示在视图区域中间
+          block: "center",
+          // 值有auto、instant,smooth,缓动动画(当前是慢速的)
+          behavior: "smooth"
+        });
+        break; // 跳出循环了
+      }
+    }
+  },
+  computed: {
+    musicGroup() {
+      return this.baseInfo?.musicGroup;
+    },
+    payschoolListStatus() {
+      return this.$route.query.type === "payschoolList" ? true : false;
+    }
+  }
+};
+</script>
+<style lang="scss" scoped>
+@import "~@/views/resetTeaming/modals/pay.scss";
+.memoWrap {
+  // width: calc(100% - 860px);
+  width: 860px;
+  .memoWrapItem {
+    display: block;
+    ::v-deep .el-form-item__content {
+      display: inline-block;
+      width: calc(100% - 140px);
+    }
+  }
+}
+.Wall {
+  height: 15px;
+  background-color: #f2f2f2;
+}
+::v-deep .el-form-item__label:before {
+  content: "" !important;
+  position: absolute;
+  color: transparent;
+  margin-right: 4px;
+}
+.payInfoWrap {
+  .submitBtn {
+    // width: 121px;
+    // height: 41px;
+    background: var(--color-primary);
+    border-radius: 7px;
+    // margin: 20px auto;
+    // line-height: 40px;
+    color: #fff;
+    text-align: center;
+    cursor: pointer;
+  }
+  .baseWrap {
+    padding: 20px;
+    background-color: #fff;
+  }
+  .baseWrapFixed {
+    top: 105px;
+    left: 215px; // 205
+    position: fixed;
+    background-color: #fff;
+    width: calc(100% - 220px);
+    z-index: 100;
+    padding: 20px;
+    box-shadow: rgba(0, 0, 0, 0.05) 0px 2px 3px 3px;
+  }
+  .left {
+    ::v-deep .el-checkbox {
+      padding: 8px 10px 7px 10px;
+      border-radius: 4px;
+    }
+    ::v-deep .el-checkbox .el-checkbox__inner {
+      border-radius: 50%;
+      border: 1px solid var(--color-primary);
+      width: 16px;
+      height: 16px;
+      &:after {
+        height: 8px;
+        left: 5px;
+      }
+    }
+    ::v-deep .el-checkbox__inner:hover {
+      background-color: var(--color-primary);
+    }
+    ::v-deep .el-checkbox.is-checked {
+      border-color: #fff;
+      color: #fff;
+    }
+    .payTitle {
+      display: flex;
+      flex-direction: row;
+      align-items: center;
+      font-size: 18px;
+      font-weight: 600;
+      color: #1a1a1a;
+      height: 25px;
+      margin-bottom: 15px;
+      p {
+        line-height: 25px;
+      }
+      .squrt {
+        width: 3px;
+        height: 16px;
+        background: var(--color-primary);
+        margin-right: 8px;
+        position: relative;
+        top: -1px;
+        border-radius: 2px;
+      }
+      .payContext {
+        color: var(--color-primary);
+        border: 1px solid var(--color-primary);
+        font-size: 14px;
+        line-height: 22px;
+        border-radius: 3px;
+        padding: 0 5px;
+        margin-left: 12px;
+      }
+    }
+    .checkWrap {
+      display: flex;
+      flex-direction: row;
+      justify-content: flex-start;
+      align-items: center;
+      .checkBtn.active {
+        border: 1px solid var(--color-primary);
+      }
+      .checkBtn {
+        position: relative;
+        background-color: #fefefe;
+        margin-right: 12px;
+        padding: 0 22px;
+        display: flex;
+        flex-direction: row;
+        align-items: center;
+        border-radius: 6px;
+        border: 1px solid #dfe8ec;
+        cursor: pointer;
+        height: 84px;
+        width: 251px;
+        overflow: hidden;
+        &:hover {
+          border: 1px solid var(--color-primary);
+        }
+        p {
+          height: 41px;
+          line-height: 41px;
+        }
+        .checkLeft {
+          width: 60px;
+          height: 60px;
+          margin-right: 16px;
+          img {
+            width: 100%;
+          }
+        }
+        .checkRight {
+          p {
+            height: 26px;
+            font-size: 19px;
+            font-weight: 600;
+            color: #1a1a1a;
+            line-height: 26px;
+          }
+          .checkSubTitle {
+            font-size: 14px;
+            font-weight: 400;
+            color: var(--color-primary);
+            line-height: 20px;
+          }
+        }
+        .checTriangle {
+          border-bottom: 44px solid var(--color-primary);
+          border-left: 44px solid transparent;
+          position: absolute;
+          right: 0;
+          bottom: 0;
+          width: 0;
+          height: 0;
+          img {
+            width: 19px;
+            height: 16px;
+            position: absolute;
+            top: 22px;
+            right: 5px;
+          }
+        }
+      }
+      // .checkBtn.disabled {
+      //   cursor: not-allowed;
+      //   color: #d9d9d9;
+      //   background-color: #f2f2f2 !important;
+      //   ::v-deep .el-checkbox__inner {
+      //     background-color: #fff !important;
+      //     border-color: #d9d9d9;
+      //     color: #fff;
+      //     &::after {
+      //       border-color: #d9d9d9;
+      //     }
+      //   }
+      //   &:hover {
+      //     background-color: #f2f2f2 !important;
+      //     color: #d9d9d9;
+      //     ::v-deep .el-checkbox__inner {
+      //       background-color: #fff !important;
+      //     }
+      //   }
+      // }
+    }
+  }
+}
+.coreList {
+  // margin: 14px;
+}
+</style>
+<style lang="less" scoped>
+::v-deep .el-dialog__body {
+  padding: 15px 0 0;
+}
+.empty {
+  background-color: #fff;
+  padding-bottom: 20px;
+}
+</style>

+ 7 - 3
src/views/resetTeaming/components/payInfoDetail.vue

@@ -681,7 +681,11 @@ export default {
                 this.teamCourse = true;
 
                 this.$set(this.form, "eclass", res.data?.course);
-                console.log([...res.data?.course], "res.data?.course");
+                console.log(
+                  [...res.data?.course],
+                  "res.data?.course",
+                  this.form
+                );
                 this.initDetail = true;
                 this.$set(
                   this.form,
@@ -1300,7 +1304,7 @@ export default {
               courseCurrentPrice: 0
             });
           });
-
+          console.log("type", newValue, oldValue);
           this.$set(this.form, "teacherFeeList", arr);
         }
       },
@@ -1338,7 +1342,7 @@ export default {
             courseCurrentPrice: 0
           });
         });
-
+        console.log("calenderFeeType", val, oldValue);
         this.$set(this.form, "teacherFeeList", arr);
       }
     },

+ 45 - 2
src/views/resetTeaming/components/resetPayList.vue

@@ -62,6 +62,14 @@
       </div>
       <div
         class="newBand"
+        @click="newGoodsPay"
+        v-if="teamStatus"
+        v-permission="'musicGroupPaymentCalender/createCalender/4459'"
+      >
+        新建商品采购
+      </div>
+      <div
+        class="newBand"
         v-permission="'musicGroup/extensionPayment'"
         @click="extendTime"
       >
@@ -189,7 +197,8 @@
                     teamStatus &&
                     scope.row.paymentType != 'MUSIC_APPLY' &&
                     scope.row.paymentType != 'ADD_STUDENT' &&
-                    scope.row.paymentType != 'SPAN_GROUP_CLASS_ADJUST'
+                    scope.row.paymentType != 'SPAN_GROUP_CLASS_ADJUST' &&
+                    scope.row.paymentType != 'GOODS_PURCHASE'
                 "
               >
                 <!--    &&scope.row.payUserType === 'STUDENT' -->
@@ -199,7 +208,8 @@
               </auth>
               <!-- v-permission="'musicGroupPaymentCalenderDetail/batchAdd/3890'"  v-permission="''" -->
 
-              <auth
+              <template v-if="scope.row.paymentType != 'GOODS_PURCHASE'">
+                <auth
                 auths="musicGroupPaymentCalender/update/4313"
                 v-if="
                   teamStatus &&
@@ -225,6 +235,19 @@
                   >修改</el-button
                 >
               </auth>
+              </template>
+              <template v-else>
+                <auth
+                auths="musicGroupPaymentCalender/update/4313"
+                v-if="
+                  scope.row.status != 'AUDITING'
+                "
+              >
+                <el-button type="text" @click="resetPay(scope.row)"
+                  >修改</el-button
+                >
+              </auth>
+              </template>
               <!--                   scope.row.paymentType != 'SPAN_GROUP_CLASS_ADJUST' &&-->
               <auth
                 auths="musicGroupPaymentCalender/revoke"
@@ -853,6 +876,18 @@ export default {
         }
       );
     },
+    newGoodsPay() {
+      let query = this.$route.query;
+      this.$router.push(
+        {
+          path: "/business/goodsPaySet",
+          query: { ...query, payUserType: "SCHOOL" }
+        },
+        route => {
+          route.meta.title = "商品采购设置";
+        }
+      );
+    },
     getList() {
       let musicGroupId = this.$route.query.id;
       return getAuditList({
@@ -910,6 +945,14 @@ export default {
         });
         // 跳转新接口
         // this.memberVisible = true;
+      } else if (row.paymentType == "GOODS_PURCHASE") {
+        this.isNew = false;
+        this.activeRow = row;
+        let query = this.$route.query;
+        this.$router.push({
+          path: "/business/goodsPaySet",
+          query: { ...query, payUserType: row.payUserType, calenderId: row.id }
+        });
       }
 
       // 判断一下 是不是云收费团 且是乐团报名缴费

File diff suppressed because it is too large
+ 424 - 299
src/views/resetTeaming/components/resetSound.vue


+ 277 - 0
src/views/resetTeaming/goodsModal/addShopGoods.vue

@@ -0,0 +1,277 @@
+<!--  -->
+<template>
+  <div>
+    <save-form
+      :inline="true"
+      class="searchForm"
+      ref="searchForm"
+      @submit="onSearch"
+      @reset="onReset"
+      :model="searchForm"
+      save-key="payGoodsInfo-shopGoods"
+    >
+      <el-form-item prop="name">
+        <el-input
+          v-model.trim="searchForm.name"
+          clearable
+          placeholder="商品名称"
+        ></el-input>
+      </el-form-item>
+      <el-form-item prop="sn">
+        <el-input
+          v-model.trim="searchForm.sn"
+          clearable
+          placeholder="商品货号"
+        ></el-input>
+      </el-form-item>
+      <el-form-item prop="goodsCategoryId">
+        <el-select
+          v-model.trim="searchForm.goodsCategoryId"
+          clearable
+          placeholder="商品分类"
+        >
+          <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 prop="brandId">
+        <el-select
+          v-model.trim="searchForm.brandId"
+          clearable
+          placeholder="商品品牌"
+        >
+          <el-option
+            v-for="(item, index) in goodsBrand"
+            :key="index"
+            :label="item.label"
+            :value="item.value"
+          ></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="danger" native-type="submit">搜索</el-button>
+        <el-button type="primary" native-type="reset">重置</el-button>
+      </el-form-item>
+    </save-form>
+    <div class="tableWrap">
+      <el-table
+        :data="tableList"
+        :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
+        @selection-change="handleSelectionChange"
+        @select="onTableSelect"
+        ref="multipleSelection"
+      >
+        <el-table-column
+          type="selection"
+          width="55"
+          :selectable="onSelectable"
+        ></el-table-column>
+        <el-table-column
+          align="center"
+          prop="name"
+          label="商品名称"
+          width="200px"
+        >
+          <template slot-scope="scope">
+            <tooltip :content="scope.row.name" />
+          </template>
+        </el-table-column>
+        <el-table-column align="center" prop="sn" label="商品货号">
+        </el-table-column>
+        <el-table-column
+          align="center"
+          prop="goodsCategoryName"
+          label="商品分类"
+        >
+        </el-table-column>
+        <el-table-column align="center" prop="brandName" label="商品品牌">
+        </el-table-column>
+        <el-table-column align="center" prop="discountPrice" label="销售价格">
+          <template slot-scope="scope">
+            {{ scope.row.discountPrice | moneyFormat }}
+          </template>
+        </el-table-column>
+        <el-table-column align="center" prop="organCostPrice" label="成本">
+          <template slot-scope="scope">
+            {{ scope.row.organCostPrice | moneyFormat }}
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination
+        sync
+        save-key="payGoodsInfo-shopGoods"
+        :total.sync="pageInfo.total"
+        :page.sync="pageInfo.page"
+        :limit.sync="pageInfo.limit"
+        :page-sizes="pageInfo.page_size"
+        @pagination="getList"
+      />
+    </div>
+    <div class="dialog-footer">
+      <el-button @click="onClose()">取 消</el-button>
+      <el-button type="primary" @click="onSubmit()">确 定</el-button>
+    </div>
+  </div>
+</template>
+
+<script>
+import { api_goodsQuery } from "../api";
+import pagination from "@/components/Pagination/index";
+export default {
+  props: [
+    "disabledIds",
+    "categoryList",
+    "goodsBrand",
+    "courseViewType",
+    "organId"
+  ],
+  components: {
+    pagination
+  },
+  data() {
+    return {
+      pageInfo: {
+        // 分页规则
+        limit: 10, // 限制显示条数
+        page: 1, // 当前页
+        total: 0, // 总条数
+        page_size: [10, 20, 40, 50] // 选择限制显示条数
+      },
+      searchForm: {
+        name: null,
+        sn: null,
+        publishStatus: null,
+        goodsCategoryId: null,
+        brandId: null,
+        status: 1,
+        courseFeeShowOrganId: null,
+        memberFeeShowOrganId: null,
+        freeFeeShowOrganId: null
+      },
+      tableList: [],
+      isNewPage: false,
+      selectList: []
+    };
+  },
+  mounted() {
+    if (this.courseViewType == 0) {
+      this.searchForm.courseFeeShowOrganId = this.organId;
+    } else if (this.courseViewType == 2) {
+      this.searchForm.memberFeeShowOrganId = this.organId;
+    } else if (this.courseViewType == 3) {
+      this.searchForm.freeFeeShowOrganId = this.organId;
+    }
+
+    this.getList();
+  },
+  methods: {
+    getList() {
+      let params = Object.assign({}, this.searchForm);
+      params.rows = this.pageInfo.limit;
+      params.page = this.pageInfo.page;
+      api_goodsQuery(params).then(res => {
+        if (res.code == 200 && res.data) {
+          this.tableList = res.data.rows;
+          this.pageInfo.total = res.data.total;
+
+          let idList = this.selectList.map(group => {
+            return group.id;
+          });
+          this.isNewPage = true;
+          this.$nextTick(() => {
+            this.tableList.forEach(course => {
+              if (idList.indexOf(course.id) != -1) {
+                this.$refs.multipleSelection.toggleRowSelection(course, true);
+              }
+            });
+            this.isNewPage = false;
+          });
+        }
+      });
+    },
+    onSearch() {
+      this.pageInfo.page = 1;
+      this.getList();
+    },
+    onReset() {
+      // 重置
+      this.$refs.searchForm.resetFields();
+      this.getList();
+    },
+    onClose() {
+      this.$listeners.close();
+    },
+    onSubmit() {
+      // debugger;
+      this.$listeners.confirm(this.selectList);
+      this.onClose();
+    },
+    onSelectable(row) {
+      return !this.disabledIds.includes(row.id);
+    },
+    handleSelectionChange(arr) {
+      if (arr.length > 0) {
+        // 有可能加 有可能减
+        this.selectList = this.selectList.concat(arr);
+        // 去重
+        this.selectList = this.$helpers.lodash.uniqBy(this.selectList, "id");
+      }
+      // else if(){}
+      else {
+        if (this.isNewPage) return;
+        // 有2种 1是新页
+        // 2是点击反选
+        let idList = this.selectList.map(course => {
+          return course.id;
+        });
+        this.$nextTick(() => {
+          let tableIdList = [];
+          this.tableList.forEach(course => {
+            tableIdList.push(course.id);
+            if (idList.indexOf(course.id) != -1) {
+              this.$refs.tableList.toggleRowSelection(course, false);
+              // 删除这个元素
+            }
+          });
+          this.selectList = this.$helpers.lodash.remove(
+            this.selectList,
+            function(item) {
+              return tableIdList.indexOf(item.id) == -1;
+            }
+          );
+          if (this.selectList.length <= 0) {
+            this.clearCom();
+          }
+        });
+      }
+    },
+    onTableSelect(rows, row) {
+      let idList = this.selectList.map(course => {
+        return course.id;
+      });
+      if (idList.indexOf(row.id) != -1) {
+        this.selectList.splice(idList.indexOf(row.id), 1);
+        if (this.selectList.length <= 0) {
+          this.clearCom();
+        }
+      }
+    },
+    clearCom() {
+      // this.selectList = [];
+      // this.$refs.multipleSelection.clearSelection();
+    }
+  }
+};
+</script>
+<style lang="less" scoped>
+.dialog-footer {
+  padding-top: 20px;
+  width: 100%;
+  text-align: center;
+}
+</style>

+ 298 - 0
src/views/resetTeaming/goodsModal/payAddressInfo.vue

@@ -0,0 +1,298 @@
+<template>
+  <div class="teamCourseList">
+    <p class="coreTitle">
+      收货信息
+    </p>
+    <div class="infoWrap">
+      <div>
+        <el-form-item
+          class="vertical"
+          label="收货人"
+          prop="calenderAddress.name"
+          :rules="[
+            {
+              required: true,
+              message: '请输入备注',
+              trigger: 'blur'
+            }
+          ]"
+        >
+          <template slot="label">
+            <p style="position: relative">
+              <span style="color: #f56c6c; margin-right: 4px">*</span>
+              收货人
+            </p>
+          </template>
+          <el-input
+            type="text"
+            placeholder="请输入收货人姓名"
+            v-model="form.calenderAddress.name"
+            :maxlength="12"
+            :disabled="payschoolListStatus"
+          ></el-input>
+        </el-form-item>
+        <el-form-item
+          class="vertical"
+          label="手机号"
+          prop="calenderAddress.phone"
+          :rules="[
+            { required: true, message: '请输入收货人手机号' },
+            {
+              pattern: /^1[3456789]\d{9}$/,
+              message: '请输入正确的手机号',
+              trigger: 'blur'
+            }
+          ]"
+        >
+          <template slot="label">
+            <p style="position: relative">
+              <span style="color: #f56c6c; margin-right: 4px">*</span>
+              手机号
+            </p>
+          </template>
+          <el-input
+            type="text"
+            placeholder="请输入收货人手机号"
+            v-model="form.calenderAddress.phone"
+            :maxlength="11"
+            :disabled="payschoolListStatus"
+          ></el-input>
+        </el-form-item>
+      </div>
+      <el-row>
+        <el-col>
+          <el-form-item label="所在城市" required>
+            <template slot="label">
+              <p style="position: relative">
+                <span style="color: #f56c6c; margin-right: 4px">*</span>
+                所在城市
+              </p>
+            </template>
+            <div class="provinceWrap">
+              <el-form-item
+                prop="calenderAddress.province"
+                :rules="[
+                  { required: true, message: '请选择省', trigger: 'change' }
+                ]"
+                style="margin: 0;"
+              >
+                <el-select
+                  v-model.trim="form.calenderAddress.province"
+                  filterable
+                  placeholder="请选择省"
+                  clearable
+                  style="width: 148px !important; margin-right: 5px"
+                  @change="onChangeProvince"
+                  :disabled="payschoolListStatus"
+                >
+                  <el-option
+                    v-for="item in provinceList"
+                    :key="item.value"
+                    :label="item.label"
+                    :value="item.value"
+                  ></el-option>
+                </el-select>
+              </el-form-item>
+              <el-form-item
+                prop="calenderAddress.city"
+                :rules="[
+                  { required: true, message: '请选择市', trigger: 'change' }
+                ]"
+                style="margin: 0;"
+              >
+                <el-select
+                  v-model.trim="form.calenderAddress.city"
+                  filterable
+                  :disabled="
+                    !form.calenderAddress.province || payschoolListStatus
+                  "
+                  style="width: 148px !important; margin-right: 5px"
+                  placeholder="请选择市"
+                  @change="onChangeCity"
+                  clearable
+                >
+                  <el-option
+                    v-for="item in cityList"
+                    :key="item.value"
+                    :label="item.label"
+                    :value="item.value"
+                  ></el-option>
+                </el-select>
+              </el-form-item>
+              <el-form-item
+                prop="calenderAddress.region"
+                :rules="[
+                  { required: true, message: '请选择地区', trigger: 'change' }
+                ]"
+                style="margin: 0;"
+              >
+                <el-select
+                  v-model.trim="form.calenderAddress.region"
+                  filterable
+                  :disabled="!form.calenderAddress.city || payschoolListStatus"
+                  style="width: 148px !important"
+                  placeholder="请选择地区"
+                  clearable
+                >
+                  <el-option
+                    v-for="item in countyList"
+                    :key="item.value"
+                    :label="item.label"
+                    :value="item.value"
+                  ></el-option>
+                </el-select>
+              </el-form-item>
+            </div>
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-row>
+        <el-col class="memoWrap">
+          <el-form-item
+            class="memoWrapItem"
+            prop="calenderAddress.address"
+            label="详细地址"
+            :rules="[
+              {
+                required: true,
+                message: '请输入详细地址',
+                trigger: 'blur'
+              }
+            ]"
+            ref="memo"
+          >
+            <template slot="label">
+              <p style="position: relative">
+                <span style="color: #f56c6c; margin-right: 4px">*</span>
+                详细地址
+              </p>
+            </template>
+            <el-input
+              style="width: 100%"
+              :rows="3"
+              v-model="form.calenderAddress.address"
+              type="textarea"
+              maxlength="50"
+              show-word-limit
+              :disabled="payschoolListStatus"
+            ></el-input>
+          </el-form-item>
+        </el-col>
+      </el-row>
+    </div>
+  </div>
+</template>
+<script>
+import { areaQueryChild, getParentArea } from "@/api/specialSetting";
+// import { courseType, boolOptions } from "@/constant";
+export default {
+  props: ["form", "payschoolListStatus"],
+  data() {
+    return {
+      charges: [],
+      clearable: false,
+      isDisabled: false,
+      // boolOptionsOptions: [],
+      // courseType,
+      provinceList: [],
+      cityList: [],
+      countyList: []
+    };
+  },
+  async mounted() {
+    await this.getAreaList();
+
+    // if (this.form.calenderAddress.province) {
+    //   this.getAreaList(this.form.calenderAddress.province + "", "");
+    // }
+    // if (this.form.calenderAddress.city) {
+    //   this.getAreaList(this.form.calenderAddress.city + "", "region");
+    // }
+  },
+  watch: {
+    "form.calenderAddress.province"() {
+      if (this.form.calenderAddress.province && this.cityList.length <= 0) {
+        this.getAreaList(this.form.calenderAddress.province + "", "");
+      }
+    },
+    "form.calenderAddress.city"() {
+      if (this.form.calenderAddress.city && this.countyList.length <= 0) {
+        this.getAreaList(this.form.calenderAddress.city + "", "region");
+      }
+    }
+  },
+  methods: {
+    checkType() {
+      this.$emit("checkType");
+    },
+    onChangeProvince(val) {
+      this.form.city = null;
+      this.form.region = null;
+      this.getAreaList(val + "", "");
+    },
+    onChangeCity(val) {
+      this.form.region = null;
+      this.getAreaList(val + "", "region");
+    },
+    getAreaList(parentId, type, callback) {
+      parentId = parentId ? parentId : 0;
+      areaQueryChild({ parentId: parentId }).then(res => {
+        if (res.code == 200 && res.data) {
+          let tempData = [];
+          res.data.forEach(item => {
+            tempData.push({
+              label: item.name,
+              value: item.id + ""
+            });
+          });
+          if (parentId) {
+            if (type == "region") {
+              this.countyList = tempData;
+            } else {
+              this.cityList = tempData;
+            }
+          } else {
+            this.provinceList = tempData;
+          }
+
+          if (callback && typeof callback == "function") {
+            callback();
+          }
+        }
+      });
+    }
+  }
+};
+</script>
+<style lang="scss" scoped>
+@import "~@/views/resetTeaming/modals/pay.scss";
+::v-deep .infoWrap {
+  padding: 10px 10px 25px;
+  .el-form-item__label {
+    display: block !important;
+    text-align: left;
+    padding-left: 10px;
+  }
+  .vertical {
+    margin-top: 0px !important;
+  }
+  .el-input-number {
+    width: 180px;
+    .el-input__inner {
+      text-align: left;
+    }
+  }
+}
+.memoWrap {
+  // width: calc(100% - 860px);
+  width: 860px;
+  .memoWrapItem {
+    display: block;
+    margin: 0;
+    ::v-deep .el-form-item__content {
+      display: inline-block;
+      width: calc(100% - 140px);
+    }
+  }
+}
+</style>

+ 214 - 0
src/views/resetTeaming/goodsModal/payBackMoney.vue

@@ -0,0 +1,214 @@
+<template>
+  <div class="teamCourseList">
+    <p class="coreTitle">回款设置</p>
+    <div class="infoWrap">
+      <el-form-item
+        label="责任人"
+        prop="responsiblePerson"
+        :rules="[
+          { required: true, message: '请选择责任人', trigger: 'change' }
+        ]"
+      >
+        <template slot="label">
+          <p style="position: relative">
+            <span style="color: #f56c6c; margin-right: 4px">*</span>
+            责任人
+          </p>
+        </template>
+        <el-select
+          placeholder="请选择责任人"
+          v-model="form.responsiblePerson"
+          clearable
+          filterable
+        >
+          <el-option
+            v-for="(item, index) in educationList"
+            :key="index"
+            :label="item.realName"
+            :value="item.id"
+          >
+            <span style="float: left">{{ item.realName }}</span>
+            <span
+              style="float: right; color: #8492a6; font-size: 13px; padding-left: 12px"
+              >{{ item.phone }}</span
+            >
+          </el-option>
+        </el-select>
+      </el-form-item>
+      <div class="payList">
+        <div
+          class="payRow"
+          v-for="(item, index) in form.musicGroupCalenderRefundPeriods"
+          :key="index"
+        >
+          <p class="subTitle">回款周期{{ index + 1 }}</p>
+          <el-form-item
+            label="回款金额"
+            :prop="'musicGroupCalenderRefundPeriods.' + index + '.refundAmount'"
+            :rules="[
+              { required: true, message: '请输入回款金额', trigger: 'blur' }
+            ]"
+            ><template slot="label">
+              <p style="position: relative">
+                <span style="color: #f56c6c; margin-right: 4px">*</span>
+                回款金额
+              </p>
+            </template>
+            <el-input
+              v-model.trim="item.refundAmount"
+              type="number"
+              autocomplete="off"
+              placeholder="请输入回款金额"
+            >
+              <i slot="suffix" class="el-input__icon" style="padding-right: 5px"
+                >元</i
+              >
+            </el-input>
+          </el-form-item>
+
+          <el-form-item
+            label="回款时间"
+            :prop="'musicGroupCalenderRefundPeriods.' + index + '.refundDate'"
+            :rules="[
+              {
+                required: true,
+                trigger: 'blur',
+                message: '请选择回款金额'
+              }
+            ]"
+          >
+            <template slot="label">
+              <p style="position: relative">
+                <span style="color: #f56c6c; margin-right: 4px">*</span>
+                回款时间
+              </p>
+            </template>
+            <el-date-picker
+              v-model="item.refundDate"
+              type="date"
+              placeholder="回款时间"
+              format="yyyy-MM-dd"
+              value-format="yyyy-MM-dd"
+            >
+            </el-date-picker>
+          </el-form-item>
+
+          <i
+            class="el-icon-delete delete"
+            v-if="
+              !(form.musicGroupCalenderRefundPeriods.length <= 1) &&
+                !payschoolListStatus
+            "
+            @click="deteleRow(item, index)"
+          ></i>
+        </div>
+        <el-row v-if="!payschoolListStatus">
+          <el-button class="addBackBtn" @click="addBack">+添加</el-button>
+        </el-row>
+      </div>
+      <el-row v-if="payschoolListStatus">
+        <el-col class="memoWrap">
+          <el-form-item
+            label="备注"
+            prop="responsibleMemo"
+            :rules="[
+              { required: true, message: '请输入备注', trigger: 'change' }
+            ]"
+          >
+            <template slot="label">
+              <p style="position: relative">
+                <span style="color: #f56c6c; margin-right: 4px">*</span>
+                备注
+              </p>
+            </template>
+            <el-input
+              style="width: 423px;"
+              placeholder="请输入备注"
+              :rows="3"
+              v-model="form.responsibleMemo"
+              type="textarea"
+              maxlength="500"
+              show-word-limit
+            ></el-input>
+          </el-form-item>
+        </el-col>
+      </el-row>
+    </div>
+  </div>
+</template>
+<script>
+// import { getToken, getTenantId } from "@/utils/auth";
+// import { courseType, boolOptions } from "@/constant";
+export default {
+  props: ["form", "educationList", "payschoolListStatus"],
+  data() {
+    return {
+      charges: [],
+      clearable: false,
+      isDisabled: false
+    };
+  },
+  methods: {
+    deteleRow(item, index) {
+      this.form.musicGroupCalenderRefundPeriods.splice(index, 1);
+    },
+    addBack() {
+      this.form.musicGroupCalenderRefundPeriods.push({
+        refundDate: "",
+        refundAmount: ""
+      });
+    }
+  },
+  computed: {}
+};
+</script>
+<style lang="scss" scoped>
+@import "~@/views/resetTeaming/modals/pay.scss";
+::v-deep .infoWrap {
+  padding: 0 20px 20px;
+  .el-form-item {
+    margin: 0 0 20px;
+  }
+  .el-form-item__label {
+    display: block !important;
+    text-align: left;
+    padding-left: 10px;
+  }
+  .el-input-number {
+    width: 180px;
+    .el-input__inner {
+      text-align: left;
+    }
+  }
+}
+.memoWrap {
+  // width: calc(100% - 860px);
+  width: 860px;
+  .memoWrapItem {
+    display: block;
+    ::v-deep .el-form-item__content {
+      display: inline-block;
+      width: calc(100% - 140px);
+    }
+  }
+}
+.subTitle {
+  margin: 10px 0;
+  padding-left: 10px;
+  font-size: 15px;
+  font-weight: bold;
+  color: #606266;
+}
+.addBackBtn {
+  width: 440px;
+}
+.payRow {
+  position: relative;
+}
+.delete {
+  position: relative;
+  top: 45px;
+  margin-left: 10px;
+  cursor: pointer;
+}
+</style>

+ 192 - 0
src/views/resetTeaming/goodsModal/payFeeInfo.vue

@@ -0,0 +1,192 @@
+<template>
+  <div class="teamCourseList">
+    <p class="coreTitle">
+      费用信息
+    </p>
+    <div class="infoWrap">
+      <div>
+        <el-form-item
+          class="vertical"
+          label="总金额"
+          prop="isShowMusicInsuranceForPay"
+        >
+          <el-input-number
+            :value="allTotal"
+            :controls="false"
+            :min="0"
+            :precision="2"
+            :disabled="true"
+            type="number"
+          >
+          </el-input-number>
+        </el-form-item>
+        <el-form-item
+          class="vertical"
+          label="优惠金额"
+          prop="isShowMusicInsuranceForPay"
+        >
+          <el-input-number
+            v-model="form.calenderFeeJson.discountTotal"
+            :controls="false"
+            :min="0"
+            :max="allTotal"
+            :precision="2"
+            type="number"
+            :disabled="payschoolListStatus"
+          >
+          </el-input-number>
+        </el-form-item>
+        <el-form-item
+          class="vertical"
+          label="付款金额"
+          prop="currentTotalAmount"
+        >
+          <el-input-number
+            v-model="form.currentTotalAmount"
+            :controls="false"
+            :min="0"
+            :precision="2"
+            :disabled="true"
+          >
+          </el-input-number>
+        </el-form-item>
+      </div>
+      <el-row>
+        <el-form-item
+          label="上传合同"
+          prop="contractUrl"
+          :rules="[
+            {
+              required: true,
+              message: '请上传合同',
+              trigger: 'change'
+            }
+          ]"
+        >
+          <template slot="label">
+            <p style="position: relative">
+              <span style="color: #f56c6c; margin-right: 4px">*</span>
+              上传合同
+            </p>
+          </template>
+          <singe-file-upload
+            tips="仅支持上传pdf格式文件"
+            buttonText="上传合同"
+            accept=".pdf"
+            :disabled="payschoolListStatus"
+            v-model="form.contractUrl"
+            bucket_name="contracts"
+            @success="checkType"
+          />
+        </el-form-item>
+      </el-row>
+      <el-row>
+        <el-col class="memoWrap">
+          <el-form-item
+            class="memoWrapItem"
+            prop="memo"
+            :rules="[
+              {
+                required: true,
+                message: '请输入备注',
+                trigger: 'blur'
+              }
+            ]"
+            ref="memo"
+          >
+            <template slot="label">
+              <p style="position: relative">
+                <span style="color: #f56c6c; margin-right: 4px">*</span>
+                备注
+                <el-tooltip placement="top" popper-class="mTooltip">
+                  <div slot="content">本次缴费的内容描述</div>
+                  <i
+                    class="el-icon-question"
+                    style="
+                      font-size: 18px;
+                      color: #f56c6c;
+                      position: relative;
+                      top: 2px;
+                    "
+                  ></i>
+                </el-tooltip>
+              </p>
+            </template>
+
+            <el-input
+              style="width: 100%"
+              :rows="3"
+              v-model="form.memo"
+              type="textarea"
+              maxlength="50"
+              show-word-limit
+              :disabled="payschoolListStatus"
+            ></el-input>
+          </el-form-item>
+        </el-col>
+      </el-row>
+    </div>
+  </div>
+</template>
+<script>
+import { courseType, boolOptions } from "@/constant";
+export default {
+  props: ["form", "payschoolListStatus"],
+  data() {
+    return {
+      charges: [],
+      clearable: false,
+      isDisabled: false,
+      boolOptionsOptions: [],
+      courseType
+    };
+  },
+  methods: {
+    checkType() {
+      this.$emit("checkType");
+    }
+  },
+  computed: {
+    allTotal() {
+      let num = 0;
+      this.form.calenderGoodsList.forEach(item => {
+        num += item.totalPrice;
+      });
+      this.$emit("setAllTotal", num);
+      return num;
+    }
+  }
+};
+</script>
+<style lang="scss" scoped>
+@import "~@/views/resetTeaming/modals/pay.scss";
+::v-deep .infoWrap {
+  padding: 10px 10px 25px;
+  .el-form-item__label {
+    display: block !important;
+    text-align: left;
+    padding-left: 10px;
+  }
+  .vertical {
+    margin-top: 0px !important;
+  }
+  .el-input-number {
+    width: 180px;
+    .el-input__inner {
+      text-align: left;
+    }
+  }
+}
+.memoWrap {
+  // width: calc(100% - 860px);
+  width: 860px;
+  .memoWrapItem {
+    display: block;
+    margin: 0;
+    ::v-deep .el-form-item__content {
+      display: inline-block;
+      width: calc(100% - 140px);
+    }
+  }
+}
+</style>

+ 248 - 0
src/views/resetTeaming/goodsModal/payGoodsInfo.vue

@@ -0,0 +1,248 @@
+<template>
+  <div class="teamCourseList">
+    <p class="coreTitle" style="margin-top: 0">商品采购</p>
+
+    <div style="padding: 10px 20px">
+      <el-table
+        class="courseTable"
+        :data="form.calenderGoodsList"
+        style="width: 100% !important; background: #f9f9f9;"
+        :header-cell-style="{ background: '#F9F9F9', color: '#444' }"
+      >
+        <el-table-column width="170px" label="商品名称">
+          <template slot-scope="scope">
+            <tooltip :content="scope.row.goodsName" />
+          </template>
+        </el-table-column>
+        <el-table-column width="170px" label="商品货号" prop="goodsSn">
+        </el-table-column>
+        <el-table-column width="170px" label="采购价格" prop="singlePrice">
+          <template slot-scope="scope">
+            {{ scope.row.singlePrice | moneyFormat }}
+          </template>
+        </el-table-column>
+        <el-table-column width="170px" label="采购数量">
+          <template slot-scope="scope">
+            <el-form-item
+              :prop="'calenderGoodsList.' + scope.$index + '.num'"
+              :rules="{
+                required: true,
+                message: '请输入采购数量',
+                trigger: 'change'
+              }"
+            >
+              <el-input-number
+                style="width: 90% !important"
+                class="number-input"
+                v-model="form.calenderGoodsList[scope.$index].num"
+                :controls="false"
+                :precision="0"
+                :min="0"
+                placeholder="请输入采购数量"
+                @change="onChangeNum(scope.$index)"
+                :disabled="payschoolListStatus"
+              />
+            </el-form-item>
+          </template>
+        </el-table-column>
+        <el-table-column width="170px" label="总价格" prop="totalPrice">
+          <template slot-scope="scope">
+            {{ scope.row.totalPrice | moneyFormat }}
+          </template>
+        </el-table-column>
+        <el-table-column width="170px" label="操作">
+          <template slot-scope="scope">
+            <el-button
+              type="text"
+              @click.prevent="removeGoodsList(scope.row)"
+              :disabled="payschoolListStatus"
+              >删除</el-button
+            >
+          </template>
+        </el-table-column>
+      </el-table>
+      <el-button
+        icon="el-icon-circle-plus-outline"
+        plain
+        type="info"
+        style="width: 100%;margin: 10px 0 10px;"
+        @click="addGoodsList"
+        :disabled="payschoolListStatus"
+        >添加商品</el-button
+      >
+    </div>
+
+    <el-dialog
+      title="添加商品"
+      :visible.sync="recordStatus"
+      :close-on-click-modal="false"
+      width="1200px"
+      append-to-body
+      v-if="recordStatus"
+    >
+      <addShopGoods
+        :courseViewType="courseViewType"
+        :organId="organId"
+        :disabledIds="disabledIds"
+        @close="recordStatus = false"
+        @confirm="onConfirm"
+        :categoryList="categoryList"
+        :goodsBrand="goodsBrand"
+      />
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  categoryListTree,
+  api_queryGoodsCategoryList,
+  api_queryGoodsBrandList
+} from "@/api/businessManager";
+import addShopGoods from "./addShopGoods";
+export default {
+  components: {
+    addShopGoods
+  },
+  props: ["form", "courseViewType", "organId", "payschoolListStatus"],
+  data() {
+    return {
+      disabledIds: [],
+      recordStatus: false,
+      categoryList: [],
+      goodsBrand: []
+    };
+  },
+  mounted() {
+    this.getCategory();
+    this.getGoodsBrand();
+  },
+  methods: {
+    removeGoodsList(item) {
+      this.$confirm("是否删除该商品?", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      })
+        .then(() => {
+          const index = this.form.calenderGoodsList.indexOf(item);
+          if (index !== -1) {
+            this.form.calenderGoodsList.splice(index, 1);
+          }
+        })
+        .catch(() => {});
+    },
+    onChangeNum(index) {
+      const form = this.form.calenderGoodsList[index];
+      this.form.calenderGoodsList[index].totalPrice =
+        Number(form.singlePrice) * Number(form.num);
+    },
+    /** 商品分类 */
+    async getCategory() {
+      let params = {
+        delFlag: 0,
+        rows: 9999
+      };
+      try {
+        categoryListTree(params).then(res => {
+          let result = res.data;
+          if (res.code == 200) {
+            let tempArray = [];
+            result.rows.forEach(row => {
+              tempArray.push({
+                label: row.name,
+                value: row.id
+              });
+            });
+            this.categoryList = tempArray;
+          }
+        });
+      } catch {}
+    },
+    /** 商品品牌 */
+    async getGoodsBrand() {
+      try {
+        const { data } = await api_queryGoodsBrandList({ rows: 999 });
+
+        const result = data || [];
+        let tempArray = [];
+        result.forEach(row => {
+          tempArray.push({
+            label: row.name,
+            value: row.id
+          });
+        });
+        this.goodsBrand = tempArray;
+      } catch {}
+    },
+    async addGoodsList() {
+      // 添加商品
+      const ids = [];
+      this.form.calenderGoodsList.forEach(goods => {
+        ids.push(goods.id);
+      });
+      this.disabledIds = ids;
+      this.recordStatus = true;
+    },
+    onConfirm(list) {
+      const goodsList = [];
+      console.log(list, this.form.calenderGoodsList, "list");
+      (list || []).forEach(item => {
+        const index = this.form.calenderGoodsList.findIndex(
+          goods => goods.id == item.id
+        );
+        if (index == -1) {
+          goodsList.push({
+            id: item.id,
+            goodsName: item.name,
+            goodsId: item.id,
+            goodsSn: item.sn,
+            num: 0,
+            singlePrice: item.discountPrice,
+            totalPrice: 0
+          });
+        }
+      });
+      this.form.calenderGoodsList.push(...goodsList);
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+@import "~@/views/resetTeaming/modals/pay.scss";
+::v-deep .infoWrap {
+  padding: 10px;
+  .el-form-item__label {
+    display: block !important;
+    text-align: left;
+    padding-left: 10px;
+  }
+  .vertical {
+    margin-top: 0px !important;
+  }
+  .el-input-number {
+    width: 180px;
+    .el-input__inner {
+      text-align: left;
+    }
+  }
+}
+.number-input {
+  ::v-deep .el-input__inner {
+    text-align: left;
+  }
+
+  width: 100%;
+}
+.memoWrap {
+  width: 860px;
+  .memoWrapItem {
+    display: block;
+    ::v-deep .el-form-item__content {
+      display: inline-block;
+      width: calc(100% - 140px);
+    }
+  }
+}
+</style>

+ 30 - 14
src/views/resetTeaming/index.vue

@@ -8,7 +8,11 @@
             <p v-if="teamid" class="page-headers-id">({{ teamid }})</p>
 
             <span class="musicGroupStatus"
-              ><img :src="stepImgs[team_status]" alt="" v-if="stepImgs[team_status]" />
+              ><img
+                :src="stepImgs[team_status]"
+                alt=""
+                v-if="stepImgs[team_status]"
+              />
               {{ musicGroupType[team_status] }}</span
             >
           </div>
@@ -27,8 +31,8 @@
           class="line"
           v-if="
             permission('/musicArchices') &&
-            team_status == 'PROGRESS' &&
-            permission('recharge/findAll')
+              team_status == 'PROGRESS' &&
+              permission('recharge/findAll')
           "
         ></i>
         <span
@@ -83,9 +87,19 @@
       </el-popover> -->
 
       <!-- navMenu    -->
-      <tab-router v-model="activeIndex" type="card" ref="tab" :before-leave="checkGoTo">
+      <tab-router
+        v-model="activeIndex"
+        type="card"
+        ref="tab"
+        :before-leave="checkGoTo"
+      >
         <!--  @tab-click="handleClick" -->
-        <el-tab-pane label="基本信息" lazy v-if="permission('/teamBaseInfo')" name="1">
+        <el-tab-pane
+          label="基本信息"
+          lazy
+          v-if="permission('/teamBaseInfo')"
+          name="1"
+        >
           <!--  v-if="activeIndex == 'teamBaseInfo'" -->
           <teamBaseInfo
             ref="teamBaseInfo"
@@ -133,6 +147,7 @@
           " -->
           <forecastNameList
             v-if="activeIndex == '9'"
+            @changeActive="handleClick"
             :isedit="team_status == 'PRE_APPLY'"
           />
         </el-tab-pane>
@@ -280,7 +295,7 @@ export default {
     musicArchives,
     forecastNameList,
     giveMemberList,
-    convertList,
+    convertList
   },
   name: "resetTeaming",
   data() {
@@ -317,8 +332,8 @@ export default {
         FEE_AUDIT_FAILED: require("./images/6.png"),
         APPLY: require("./images/4.png"),
         PAY: require("./images/12.png"),
-        PREPARE: require("./images/11.png"),
-      },
+        PREPARE: require("./images/11.png")
+      }
     };
   },
   created() {
@@ -359,7 +374,7 @@ export default {
       this.teamid = this.$route.query.id;
       this.team_status = this.$route.query.team_status;
       if (this.$route.query.tabrouter != 1 && this.teamid) {
-        getTeamBaseInfo({ musicGroupId: this.teamid }).then((res) => {
+        getTeamBaseInfo({ musicGroupId: this.teamid }).then(res => {
           if (res.code == 200) {
             this.getBaseInfo(res.data);
           }
@@ -386,8 +401,8 @@ export default {
         this.$router.push({
           query: merge(this.$route.query, {
             ...this.$route.query,
-            team_status: this.musicGroupInfo.status,
-          }),
+            team_status: this.musicGroupInfo.status
+          })
         });
         this.team_status = this.$route.query.team_status;
         // console.log(this.musicGroupInfo.status);
@@ -396,6 +411,7 @@ export default {
       }
     },
     handleClick(val) {
+      console.log(val, "val");
       this.teamid = this.$route.query.id;
       // if (val.name != 1 && this.$refs.teamBaseInfo) {
       //   await this.$refs.teamBaseInfo.setStore();
@@ -440,9 +456,9 @@ export default {
       console.log("跳转");
       this.$router.push({
         path: "/business/musicArchices",
-        query: { ...this.$route.query },
+        query: { ...this.$route.query }
       });
-    },
+    }
   },
   watch: {
     //  async activeIndex(val){
@@ -450,7 +466,7 @@ export default {
     //       await this.$refs.teamBaseInfo.setStore();
     //     }
     //   }
-  },
+  }
 };
 </script>
 <style lang="scss" scoped>

+ 23 - 24
src/views/resetTeaming/modals/paySchoolInfo.vue

@@ -67,7 +67,7 @@
                 :rules="{
                   required: true,
                   message: '请选择课程类型',
-                  trigger: 'change',
+                  trigger: 'change'
                 }"
               >
                 <el-select
@@ -100,8 +100,8 @@
                   {
                     required: true,
                     message: '老师人数',
-                    trigger: 'blur',
-                  },
+                    trigger: 'blur'
+                  }
                 ]"
               >
                 <el-input-number
@@ -132,7 +132,7 @@
                 :rules="{
                   required: true,
                   message: '请输入课时数',
-                  trigger: 'blur',
+                  trigger: 'blur'
                 }"
               >
                 <!-- $listeners.moneyChange -->
@@ -160,7 +160,7 @@
                 :rules="{
                   required: true,
                   message: '单课时售价(元)',
-                  trigger: 'blur',
+                  trigger: 'blur'
                 }"
               >
                 <el-input-number
@@ -232,8 +232,8 @@
             {
               required: true,
               message: '请选择缴费时间',
-              trigger: 'blur',
-            },
+              trigger: 'blur'
+            }
           ]"
           ref="paymentDate"
         >
@@ -276,8 +276,8 @@
             {
               required: true,
               message: '请上传合同',
-              trigger: 'change',
-            },
+              trigger: 'change'
+            }
           ]"
         >
           <template slot="label">
@@ -306,8 +306,8 @@
               {
                 required: true,
                 message: '请输入备注',
-                trigger: 'blur',
-              },
+                trigger: 'blur'
+              }
             ]"
             ref="memo"
           >
@@ -341,7 +341,6 @@
           </el-form-item>
         </el-col>
       </el-row>
-
     </div>
   </div>
 </template>
@@ -355,7 +354,7 @@ export default {
     "teamCourse",
     "member",
     "teamActive",
-    "leBao",
+    "leBao"
   ],
   data() {
     return {
@@ -363,39 +362,39 @@ export default {
       clearable: false,
       isDisabled: false,
       boolOptionsOptions: [],
-      courseType,
+      courseType
     };
   },
   methods: {
-    checkType(){
-      console.log('来了')
-      this.$emit('checkType')
+    checkType() {
+      console.log("来了");
+      this.$emit("checkType");
     }
   },
   computed: {
     allTotal() {
-      console.log(this.form.calenderFeeJson.sutdentNumber)
+      console.log(this.form.calenderFeeJson.sutdentNumber);
       let num = 0;
       if (this.form.calenderFeeType == "STUDENT") {
         if (this.teamCourse) {
-          this.form.eclass.forEach((element) => {
+          this.form.eclass.forEach(element => {
             num += element.courseCurrentPrice;
           });
         }
         if (this.member) {
-          this.form.memberList.forEach((element) => {
+          this.form.memberList.forEach(element => {
             num += element.actualAmount * element.num;
           });
         }
         if (this.teamActive) {
-          this.form.activeList.forEach((element) => {
+          this.form.activeList.forEach(element => {
             num += element.actualAmount * 1;
           });
         }
 
         num *= this.form.calenderFeeJson.sutdentNumber;
       } else {
-        this.form.teacherFeeList.forEach((element) => {
+        this.form.teacherFeeList.forEach(element => {
           num +=
             element.courseCurrentPrice *
             element.courseNumber *
@@ -404,8 +403,8 @@ export default {
       }
       this.$emit("setAllTotal", num);
       return num;
-    },
-  },
+    }
+  }
 };
 </script>
 <style lang="scss" scoped>

+ 53 - 0
src/views/resetTeaming/modals/review-detail.vue

@@ -79,6 +79,7 @@
         >{{ calender.startPaymentDate | dayjsFormat }} -
         {{ calender.deadlinePaymentDate | dayjsFormat }}</descriptions-item
       >
+
       <descriptions-item
         :span="3"
         label="备注:"
@@ -368,6 +369,45 @@
       <el-table-column prop="courseCurrentPrice" label="单课时售价(元)">
       </el-table-column>
     </el-table>
+
+    <el-table
+      :data="goods"
+      stripe
+      v-if="goods && goods.length > 0"
+      style="width: 100%; margin-top: 10px"
+      :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
+    >
+      <el-table-column prop="goodsName" label="商品名称">
+        <template slot-scope="scope">
+          {{ scope.row.goodsName }}
+        </template>
+      </el-table-column>
+      <el-table-column prop="goodsSn" label="商品货号"> </el-table-column>
+      <el-table-column prop="singlePrice" label="采购价格"> </el-table-column>
+      <el-table-column prop="num" label="采购数量"> </el-table-column>
+      <el-table-column prop="totalPrice" label="总价格"> </el-table-column>
+    </el-table>
+
+    <el-alert
+      title="收货信息"
+      :closable="false"
+      class="alert"
+      type="info"
+      v-if="address && address.id"
+    >
+    </el-alert>
+    <descriptions :column="2" v-if="address && address.id">
+      <descriptions-item label="收货人:">{{ address.name }}</descriptions-item>
+      <descriptions-item label="手机号:">{{
+        address.phone
+      }}</descriptions-item>
+      <descriptions-item label="详细地址:" :span="2">
+        {{ address.provinceName }} {{ address.cityName }}
+        {{ address.regionName }}
+        {{ address.address }}
+      </descriptions-item>
+    </descriptions>
+
     <el-alert
       title="缴费周期"
       :closable="false"
@@ -384,6 +424,16 @@
       style="width: 100%; margin-top: 10px"
       :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
     >
+      <el-table-column
+        v-if="calender && calender.paymentType === 'GOODS_PURCHASE'"
+        prop="responsiblePersonName"
+        label="责任人"
+      >
+        <template slot-scope="scope">
+                {{ scope.row.responsiblePersonName }}
+                ({{ scope.row.responsiblePersonPhone }})
+            </template>
+      </el-table-column>
       <el-table-column prop="refundAmount" label="回款金额"> </el-table-column>
       <el-table-column prop="refundDate" label="回款状态">
         <template slot-scope="scope">
@@ -442,6 +492,8 @@ const initData = {
   musicGroupPaymentCalenderStudentDetails: [],
   course: [],
   member: [],
+  goods: [],
+  address: {},
   repair: {},
   musicMerger: [],
   studentNum: 0,
@@ -497,6 +549,7 @@ export default {
             this[key] = res.data[key];
           }
         }
+        consoe.log(this);
       } catch (error) {}
     }
   }

+ 176 - 162
src/views/teamBuild/components/soundSetComponents/chioseMusic.vue

@@ -1,182 +1,197 @@
 <template>
   <div>
     <el-form :model="item">
-    <div v-for="(music, index) in item.chioseMusic" :key="index">
-      <div class="chioseMusic">
-        <div class="flexRow bigFlex">
-          <div class="chioseWrap">
-            <p class="title">可选乐器{{ index + 1 }}:</p>
+      <div v-for="(music, index) in item.chioseMusic" :key="index">
+        <div class="chioseMusic">
+          <div class="flexRow bigFlex">
+            <div class="chioseWrap">
+              <p class="title">可选乐器{{ index + 1 }}:</p>
 
-            <el-select
-              style="width: 180px"
-              :disabled="basdisabled"
-              v-model="music.musical"
-              clearable
-              @change="
-                (val) => {
-                  chioseMusic(val, music);
-                }
-              "
-            >
-              <el-option
-                v-for="(item, index) in item.goodsList"
-                :key="index"
-                :label="item.name"
-                :value="item.id"
-                :disabled="checkDisabled(item)"
-              >
-              </el-option>
-            </el-select>
-          </div>
-          <div class="chioseWrap">
-            <p class="title">乐器提供方式:</p>
-            <el-checkbox-group v-model="music.type" class="marginLeft10">
-              <el-checkbox :disabled="basdisabled" label="GROUP"
-                >团购</el-checkbox
-              >
-              <el-checkbox :disabled="basdisabled" label="LEASE"
-                >租赁</el-checkbox
-              >
-              <el-checkbox :disabled="basdisabled" label="FREE"
-                >免费</el-checkbox
+              <el-select
+                style="width: 180px"
+                :disabled="basdisabled"
+                v-model="music.musical"
+                clearable
+                filterable
+                @change="
+                  val => {
+                    chioseMusic(val, music);
+                  }
+                "
               >
-            </el-checkbox-group>
-          </div>
-          <div class="chioseWrap"     v-show="
-                music.type && music.type.length > 0
-                  ? music.type.includes('GROUP')
-                  : false
-              ">
-            <p
-              class="title"
-
-            >
-              团购价:
-            </p>
-
+                <el-option
+                  v-for="(item, index) in item.goodsList"
+                  :key="index"
+                  :label="item.name"
+                  :value="item.id"
+                  :disabled="checkDisabled(item) || item.delFlag"
+                >
+                </el-option>
+              </el-select>
+            </div>
+            <div class="chioseWrap">
+              <p class="title">乐器提供方式:</p>
+              <el-checkbox-group v-model="music.type" class="marginLeft10">
+                <el-checkbox :disabled="basdisabled" label="GROUP"
+                  >团购</el-checkbox
+                >
+                <el-checkbox :disabled="basdisabled" label="LEASE"
+                  >租赁</el-checkbox
+                >
+                <el-checkbox :disabled="basdisabled" label="FREE"
+                  >免费</el-checkbox
+                >
+              </el-checkbox-group>
+            </div>
             <div
+              class="chioseWrap"
               v-show="
                 music.type && music.type.length > 0
                   ? music.type.includes('GROUP')
                   : false
               "
-              style="width: 180px;margin-top: 20px;"
             >
+              <p class="title">
+                团购价:
+              </p>
 
-                <el-form-item
-                  :prop="'chioseMusic.'+index+'.groupPrice'"
-                >
-                  <el-input type="number" v-model="music.groupPrice" :disabled="true">
-                    <template slot="append">元</template></el-input
+              <div
+                v-show="
+                  music.type && music.type.length > 0
+                    ? music.type.includes('GROUP')
+                    : false
+                "
+                style="width: 180px;margin-top: 20px;"
+              >
+                <el-form-item :prop="'chioseMusic.' + index + '.groupPrice'">
+                  <el-input
+                    type="number"
+                    v-model="music.groupPrice"
+                    :disabled="true"
+                  >
+                    <template slot="append"
+                      >元</template
+                    ></el-input
                   >
                 </el-form-item>
-
+              </div>
             </div>
-          </div>
-          <div class="chioseWrap"     v-show="
-                music.type && music.type.length > 0
-                  ? music.type.includes('GROUP')
-                  : false
-              ">
-            <p
-              class="title"
-
-            >
-              分润金额:
-            </p>
-
             <div
+              class="chioseWrap"
               v-show="
                 music.type && music.type.length > 0
                   ? music.type.includes('GROUP')
                   : false
               "
-              style="width: 180px;margin-top: 20px;"
             >
+              <p class="title">
+                分润金额:
+              </p>
 
+              <div
+                v-show="
+                  music.type && music.type.length > 0
+                    ? music.type.includes('GROUP')
+                    : false
+                "
+                style="width: 180px;margin-top: 20px;"
+              >
                 <el-form-item
-                  :prop="'chioseMusic.'+index+'.organShareProfit'"
-                  :rules="[{ validator:(rule, value, callback)=> checkGroupPrice(rule, value, callback,music), trigger: 'blur' }]"
+                  :prop="'chioseMusic.' + index + '.organShareProfit'"
+                  :rules="[
+                    {
+                      validator: (rule, value, callback) =>
+                        checkGroupPrice(rule, value, callback, music),
+                      trigger: 'blur'
+                    }
+                  ]"
                 >
-                  <el-input type="number" v-model="music.organShareProfit"   :disabled="basdisabled">
-                    <template slot="append">元</template></el-input
+                  <el-input
+                    type="number"
+                    v-model="music.organShareProfit"
+                    :disabled="basdisabled"
+                  >
+                    <template slot="append"
+                      >元</template
+                    ></el-input
                   >
                 </el-form-item>
-
+              </div>
             </div>
-          </div>
-          <div class="chioseWrap">
-            <p
-              class="title"
-              v-show="
-                music.type && music.type.length > 0
-                  ? music.type.includes('LEASE')
-                  : false
-              "
-            >
-              租赁押金:
-            </p>
-            <div
-              v-show="
-                music.type && music.type.length > 0
-                  ? music.type.includes('LEASE')
-                  : false
-              "
-              style="width: 180px"
-            >
-              <el-input
-                type="number"
-                v-model="music.borrowPrice"
-                :disabled="basdisabled"
+            <div class="chioseWrap">
+              <p
+                class="title"
+                v-show="
+                  music.type && music.type.length > 0
+                    ? music.type.includes('LEASE')
+                    : false
+                "
               >
-                <template slot="append">元</template></el-input
+                租赁押金:
+              </p>
+              <div
+                v-show="
+                  music.type && music.type.length > 0
+                    ? music.type.includes('LEASE')
+                    : false
+                "
+                style="width: 180px"
               >
+                <el-input
+                  type="number"
+                  v-model="music.borrowPrice"
+                  :disabled="basdisabled"
+                >
+                  <template slot="append"
+                    >元</template
+                  ></el-input
+                >
+              </div>
+              <i
+                class="el-icon-circle-plus-outline marginLeft10 iconStyle"
+                v-if="!basdisabled && index == 0"
+                @click="addMusic"
+                style="font-size: 20px; cursor: pointer"
+              ></i>
+              <i
+                class="el-icon-remove-outline marginLeft10 iconStyle"
+                v-if="item.chioseMusic.length > 1 && !basdisabled"
+                @click="deleteMusic(music)"
+                style="font-size: 20px; cursor: pointer"
+              ></i>
             </div>
-            <i
-              class="el-icon-circle-plus-outline marginLeft10 iconStyle"
-              v-if="!basdisabled && index == 0"
-              @click="addMusic"
-              style="font-size: 20px; cursor: pointer"
-            ></i>
-            <i
-              class="el-icon-remove-outline marginLeft10 iconStyle"
-              v-if="item.chioseMusic.length > 1 && !basdisabled"
-              @click="deleteMusic(music)"
-              style="font-size: 20px; cursor: pointer"
-            ></i>
           </div>
-        </div>
-        <div
-          style="margin-top: 5px"
-          v-show="
-            music.type && music.type.length > 0
-              ? music.type.includes('GROUP')
-              : false
-          "
-        >
-          <div class="flexRow">
-            <p class="title">团购乐器减免课程费用:</p>
-            <el-radio-group
-              v-model="music.groupRemissionCourseFee"
-              v-show="
-                music.type && music.type.length > 0
-                  ? music.type.includes('GROUP')
-                  : false
-              "
-            >
-              <el-radio :disabled="basdisabled" :label="true">是</el-radio>
-              <el-radio :disabled="basdisabled" :label="false">否</el-radio>
-            </el-radio-group>
+          <div
+            style="margin-top: 5px"
+            v-show="
+              music.type && music.type.length > 0
+                ? music.type.includes('GROUP')
+                : false
+            "
+          >
+            <div class="flexRow">
+              <p class="title">团购乐器减免课程费用:</p>
+              <el-radio-group
+                v-model="music.groupRemissionCourseFee"
+                v-show="
+                  music.type && music.type.length > 0
+                    ? music.type.includes('GROUP')
+                    : false
+                "
+              >
+                <el-radio :disabled="basdisabled" :label="true">是</el-radio>
+                <el-radio :disabled="basdisabled" :label="false">否</el-radio>
+              </el-radio-group>
+            </div>
           </div>
-        </div>
-        <!-- <div class="flexRow"></div> -->
-        <!-- <div class="flexRow">
+          <!-- <div class="flexRow"></div> -->
+          <!-- <div class="flexRow">
 
         </div> -->
+        </div>
+        <el-divider></el-divider>
       </div>
-      <el-divider></el-divider>
-    </div>
-    <!-- <div class="coreItemRow" v-if="!basdisabled">
+      <!-- <div class="coreItemRow" v-if="!basdisabled">
       <p class="title"></p>
       <el-button
         type="info"
@@ -188,29 +203,29 @@
         >新增可选乐器</el-button
       >
     </div> -->
-  </el-form>
+    </el-form>
   </div>
 </template>
 <script>
 export default {
-  props: ["item", "basdisabled", "activeSoundList",'dividend'],
+  props: ["item", "basdisabled", "activeSoundList", "dividend"],
   data() {
     return {
       radio: "",
-      goods: "",
+      goods: ""
     };
   },
   created() {},
   mounted() {
-    console.log(this.dividend,'dividend')
-    if ( this.item.chioseMusic.length < 1) {
+    console.log(this.dividend, "dividend");
+    if (this.item.chioseMusic.length < 1) {
       this.item.chioseMusic.push({
         musical: "",
         type: [],
         groupPrice: 0,
         borrowPrice: 1500,
         groupRemissionCourseFee: false,
-        organShareProfit:0
+        organShareProfit: 0
       });
     }
   },
@@ -230,7 +245,7 @@ export default {
         groupPrice: null,
         borrowPrice: 1500,
         groupRemissionCourseFee: 0,
-        organShareProfit:0
+        organShareProfit: 0
       });
       this.$emit("lookMusic");
     },
@@ -243,8 +258,8 @@ export default {
     },
     checkDisabled(item) {
       let flag = false;
-      this.activeSoundList.forEach((musics) => {
-        musics.chioseMusic.forEach((music) => {
+      this.activeSoundList.forEach(musics => {
+        musics.chioseMusic.forEach(music => {
           if (item.id == music.musical) {
             flag = true;
           }
@@ -255,20 +270,20 @@ export default {
     changeFee(val, music) {
       this.$set(music, "groupRemissionCourseFee", val);
     },
-    checkGroupPrice(rule, value, callback,music) {
-      console.log(rule, value, this.dividend,music);
+    checkGroupPrice(rule, value, callback, music) {
+      console.log(rule, value, this.dividend, music);
       if (!value) {
         callback(new Error("请输入分润金额"));
-      } else if (value*1>this.dividend) {
+      } else if (value * 1 > this.dividend) {
         callback(new Error(`分润金额不得大于${this.dividend}元`));
-      } else if (value*1 <0 ){
-        console.log(rule, value, this.dividend,music,'团购金额不得小于0元');
+      } else if (value * 1 < 0) {
+        console.log(rule, value, this.dividend, music, "团购金额不得小于0元");
         callback(new Error(`分润金额不得小于${0}元`));
-      }else {
+      } else {
         callback();
       }
-    },
-  },
+    }
+  }
   // watch: {
   //   item: {
   //     immediate: true,
@@ -332,9 +347,8 @@ p {
   justify-content: flex-start;
   align-items: center;
   margin-bottom: 10px;
-
 }
 :deep(.el-form-item) {
-    margin-bottom: 0!important;
-  }
+  margin-bottom: 0 !important;
+}
 </style>

+ 1 - 0
src/views/teamBuild/components/soundSetComponents/soundSetCore.vue

@@ -69,6 +69,7 @@
                   :key="index"
                   :label="item.name"
                   :value="item.id"
+                  :disabled="item.delFlag"
                 >
                   <span style="float: left">{{ item.name }}</span>
                   <span

File diff suppressed because it is too large
+ 470 - 284
src/views/teamBuild/components/teamSoundMoney.vue


+ 77 - 46
src/views/teamBuild/forecastName.vue

@@ -9,7 +9,10 @@
         </p> -->
 
     <div class="btnList">
-      <auth :auths="['musicGroup/sendParentMeetingNotice']" v-if="isedit || $route.query.team_status=='DRAFT'">
+      <auth
+        :auths="['musicGroup/sendParentMeetingNotice']"
+        v-if="isedit || $route.query.team_status == 'DRAFT'"
+      >
         <el-button type="primary" @click="extendPaymentStatus = true"
           >预报名家长会通知</el-button
         >
@@ -58,8 +61,8 @@
           <el-input
             v-model.trim="searchForm.name"
             clearable
-                @keyup.enter.native="
-              (e) => {
+            @keyup.enter.native="
+              e => {
                 e.target.blur();
                 $refs.searchForm.save();
                 search();
@@ -355,7 +358,7 @@
     <el-dialog
       title="新增回访"
       width="760px"
-       v-if="visitVisible"
+      v-if="visitVisible"
       :close-on-click-modal="false"
       :visible.sync="visitVisible"
     >
@@ -396,6 +399,7 @@
 </template>
 
 <script>
+import { getMusicGroupAddr } from "../teamDetail/api";
 import pagination from "@/components/Pagination/index";
 import qrCode from "@/components/QrCode/index";
 import { permission } from "@/utils/directivePage";
@@ -403,16 +407,22 @@ import { vaildStudentUrl, vaildTeachingUrl } from "@/utils/validate";
 import { Export } from "@/utils/downLoadFile";
 import visitModel from "@/views/withdrawal-application/modals/visit";
 import intentionModel from "./modals/intention";
-import parentsMeeting from './modals/parentsMeeting'
+import parentsMeeting from "./modals/parentsMeeting";
 import {
   queryPreApplyList,
   finishPreApply,
   sendParentMeetingNotice,
-  getSysMessageConfig,
+  getSysMessageConfig
 } from "./api";
 export default {
   name: "forecastName",
-  components: { pagination, qrCode, visitModel, intentionModel,parentsMeeting },
+  components: {
+    pagination,
+    qrCode,
+    visitModel,
+    intentionModel,
+    parentsMeeting
+  },
   props: ["isedit"],
   data() {
     const query = this.$route.query;
@@ -432,7 +442,7 @@ export default {
         selectionSubjectId: null,
         isAllowAdjust: null,
         cloudTeacherMethod: null,
-        kitPurchaseMethod: null,
+        kitPurchaseMethod: null
       },
       tableList: [],
       pageInfo: {
@@ -440,7 +450,7 @@ export default {
         limit: 10, // 限制显示条数
         page: 1, // 当前页
         total: 0, // 总条数
-        page_size: [10, 20, 40, 50], // 选择限制显示条数
+        page_size: [10, 20, 40, 50] // 选择限制显示条数
       },
       visitVisible: false,
       subjectVisible: false,
@@ -448,33 +458,32 @@ export default {
       extendPaymentStatus: false,
       extendForm: {
         meetingDate: null,
-        address: null,
+        address: null
       },
       extendRule: {
         meetingDate: [
-          { required: true, message: "请选择家长会时间", trigger: "change" },
+          { required: true, message: "请选择家长会时间", trigger: "change" }
         ],
         address: [
-          { required: true, message: "请输入家长会地址", trigger: "blur" },
-        ],
+          { required: true, message: "请输入家长会地址", trigger: "blur" }
+        ]
       },
       preLookVisible: false,
       sysMsg: "",
       subjectList: [],
-      tenantId:null
-
+      tenantId: null
     };
   },
   async mounted() {
-    this.tenantId=   this.$helpers.tenantId
+    this.tenantId = this.$helpers.tenantId;
     await this.$store.dispatch("setSubjects");
     // 获取短信推送模板
     this.subjectList = [...this.selects.subjects];
     this.subjectList.push({ id: -1, name: "无" });
     const rus = await getSysMessageConfig({
-      type: "STUDENT_SMS_IM_MUSIC_GROUP_PARENT_MEETING_NOTICE",
+      type: "STUDENT_SMS_IM_MUSIC_GROUP_PARENT_MEETING_NOTICE"
     });
-    this.sysMsg = rus.data?.content||'';
+    this.sysMsg = rus.data?.content || "";
     this.getList();
   },
   methods: {
@@ -499,9 +508,9 @@ export default {
           url: "/api-web/studentRegistration/preRegisterExport",
           params: {
             ...params,
-            musicGroupId: this.musicGroupId,
+            musicGroupId: this.musicGroupId
           },
-          fileName: "预报名列表.xls",
+          fileName: "预报名列表.xls"
         },
         "是否确认导出报表?"
       );
@@ -512,7 +521,7 @@ export default {
           ...this.searchForm,
           musicGroupId: this.musicGroupId,
           page: this.pageInfo.page,
-          rows: this.pageInfo.limit,
+          rows: this.pageInfo.limit
         });
         this.tableList = result.data.rows;
         this.pageInfo.total = result.data.total;
@@ -520,20 +529,36 @@ export default {
     },
     async onPaymentGroup(type) {
       try {
-        this.$confirm("您是否确定开启乐团缴费?", "提示", {
-          confirmButtonText: "确定",
-          cancelButtonText: "取消",
-          type: "warning",
-        }).then(async () => {
-          const result = await finishPreApply({
-            isCheckStudentNum: type == 1 ? false : true,
-            musicGroupId: this.musicGroupId,
+        const { data } = await getMusicGroupAddr({
+          musicGroupId: this.musicGroupId,
+          page: 1,
+          rows: 10
+        });
+        console.log(data, "data");
+        if (Array.isArray(data.rows) && data.rows.length > 0) {
+          this.$confirm("您是否确定开启乐团缴费?", "提示", {
+            confirmButtonText: "确定",
+            cancelButtonText: "取消",
+            type: "warning"
+          }).then(async () => {
+            const result = await finishPreApply({
+              isCheckStudentNum: type == 1 ? false : true,
+              musicGroupId: this.musicGroupId
+            });
+            this.$store.dispatch("delVisitedViews", this.$route);
+            this.$router.push({
+              path: "/teamList"
+            });
           });
-          this.$store.dispatch("delVisitedViews", this.$route);
-          this.$router.push({
-            path: "/teamList",
+        } else {
+          this.$confirm("请先设置开团商品收货地址?", "提示", {
+            confirmButtonText: "去设置",
+            cancelButtonText: "取消",
+            type: "warning"
+          }).then(async () => {
+            this.$listeners.changeActive("10");
           });
-        });
+        }
       } catch (error) {}
     },
     addVisited(rows) {
@@ -548,32 +573,32 @@ export default {
         visitTime: "",
         visitType: "",
         feedback: "",
-        realName: rows.userName,
+        realName: rows.userName
       };
       // this.visitDetail = rows
     },
     onClose(formName) {
-        this.extendForm= {
+      this.extendForm = {
         meetingDate: null,
-        address: null,
-      }
-    //  this.$refs[formName].$refs[formName].resetFields();
+        address: null
+      };
+      //  this.$refs[formName].$refs[formName].resetFields();
     },
     onExtendPayment(formName) {
       // console.log(formName)
       // console.log(this.$refs)
       // return
-      this.$refs[formName].$refs[formName].validate(async (valid) => {
+      this.$refs[formName].$refs[formName].validate(async valid => {
         if (valid) {
           try {
             await this.$confirm("您是否确定发送家长会通知?", "提示", {
               confirmButtonText: "确定",
               cancelButtonText: "取消",
-              type: "warning",
+              type: "warning"
             });
             await sendParentMeetingNotice({
               ...this.extendForm,
-              musicGroupId: this.musicGroupId,
+              musicGroupId: this.musicGroupId
             });
             this.$message.success("家长会通知已发送");
             this.extendPaymentStatus = false;
@@ -591,12 +616,12 @@ export default {
             return time.getTime() + 86400000 < Date.now();
             //开始时间不选时,结束时间最大值小于等于当天
           }
-        },
+        }
       };
     },
     preLook(val) {
       this.preLookVisible = true;
-    },
+    }
   },
   computed: {
     sysMsgStr() {
@@ -612,10 +637,16 @@ export default {
         return ``;
       }
     },
-    detailUrl(){
-      return  vaildTeachingUrl() + "/#/preApplySubject?musicGroupId=" + this.$route.query.id+'&tenantId='+this.tenantId
+    detailUrl() {
+      return (
+        vaildTeachingUrl() +
+        "/#/preApplySubject?musicGroupId=" +
+        this.$route.query.id +
+        "&tenantId=" +
+        this.tenantId
+      );
     }
-  },
+  }
 };
 </script>
 

+ 31 - 12
src/views/teamBuild/forecastNameList.vue

@@ -1,30 +1,49 @@
 <template>
   <div>
-    <el-tabs v-model="activeName" >
-      <el-tab-pane  label="启蒙课问卷" name="first"  v-if="permission('/initiationList')"><initiationList v-if="activeName=='first'" :isedit="team_status == 'PRE_APPLY'"/></el-tab-pane>
-      <el-tab-pane label="预报名信息" name="second"  v-if="permission('/teamForecastName')"><forecastName v-if="activeName=='second'" :isedit="team_status == 'PRE_APPLY'"/></el-tab-pane>
+    <el-tabs v-model="activeName">
+      <el-tab-pane
+        label="启蒙课问卷"
+        name="first"
+        v-if="permission('/initiationList')"
+        ><initiationList
+          v-if="activeName == 'first'"
+          :isedit="team_status == 'PRE_APPLY'"
+      /></el-tab-pane>
+      <el-tab-pane
+        label="预报名信息"
+        name="second"
+        v-if="permission('/teamForecastName')"
+        ><forecastName
+          v-if="activeName == 'second'"
+          @changeActive="handleClick"
+          :isedit="team_status == 'PRE_APPLY'"
+      /></el-tab-pane>
     </el-tabs>
   </div>
 </template>
 <script>
-import forecastName from './forecastName'
-import initiationList from './initiationList'
+import forecastName from "./forecastName";
+import initiationList from "./initiationList";
 import { permission } from "@/utils/directivePage";
 export default {
-  components:{forecastName,initiationList},
+  components: { forecastName, initiationList },
   data() {
     return {
-      activeName:'first',
-      team_status :this.$route.query.team_status
+      activeName: "first",
+      team_status: this.$route.query.team_status
     };
   },
   mounted() {},
   methods: {
-        permission(str) {
+    permission(str) {
       return permission(str);
     },
-  },
+    handleClick(val) {
+      this.$emit("changeActive", { name: val });
+
+      sessionStorage.setItem("teamDetailedListEidtTeamAddr", "eidtTeamAddr");
+    }
+  }
 };
 </script>
-<style lang="scss" scoped>
-</style>
+<style lang="scss" scoped></style>

+ 1 - 1
src/views/teamBuild/signupList.vue

@@ -2507,7 +2507,7 @@ export default {
 }
 
 .sigup-container {
-  margin-left: 12px;
+  margin-left: 0;
 
   .topWrap {
     padding: 18px 58px 18px 0;

+ 26 - 26
src/views/teamDetail/components/studentList.vue

@@ -997,7 +997,7 @@ import {
   findSound,
   StudentQuit,
   findSubjectPlan,
-  getGoods,
+  // getGoods,
   getMusicGroup,
   getMusicGroupAllClass,
   StudentFeeIsLock,
@@ -1731,31 +1731,31 @@ export default {
         }
       });
     },
-    getGoodsList(subjectId, type) {
-      getGoods({
-        subjectId: subjectId,
-        type: type,
-        organId: this.organId
-      }).then(res => {
-        let result = res.data;
-        if (res.code == 200) {
-          let tempArr = [];
-          result.forEach(item => {
-            tempArr.push({
-              label: item.name,
-              value: item.id,
-              marketPrice: item.marketPrice
-            });
-          });
-          if (type == "ACCESSORIES") {
-            this.ACCESSORIESLIST = tempArr;
-          }
-          if (type == "INSTRUMENT") {
-            this.INSTRUMENTLIST = tempArr;
-          }
-        }
-      });
-    },
+    // getGoodsList(subjectId, type) {
+    //   getGoods({
+    //     subjectId: subjectId,
+    //     type: type,
+    //     organId: this.organId
+    //   }).then(res => {
+    //     let result = res.data;
+    //     if (res.code == 200) {
+    //       let tempArr = [];
+    //       result.forEach(item => {
+    //         tempArr.push({
+    //           label: item.name,
+    //           value: item.id,
+    //           marketPrice: item.marketPrice
+    //         });
+    //       });
+    //       if (type == "ACCESSORIES") {
+    //         this.ACCESSORIESLIST = tempArr;
+    //       }
+    //       if (type == "INSTRUMENT") {
+    //         this.INSTRUMENTLIST = tempArr;
+    //       }
+    //     }
+    //   });
+    // },
     getBranchType(status) {
       let common = {
         FREE: "免费",

+ 36 - 26
src/views/teamDetail/teamDetailedList.vue

@@ -1,58 +1,68 @@
 <template>
   <div class="teamDetailedList">
     <el-tabs v-model="activeName">
-      <el-tab-pane label="已发清单" name="waitTeamList" v-permission="'musicGroupDeliveryRecord/queryPage'">
-        <endTeamList v-if="activeName=='waitTeamList'" />
+      <el-tab-pane
+        label="已发清单"
+        name="waitTeamList"
+        v-permission="'musicGroupDeliveryRecord/queryPage'"
+      >
+        <endTeamList v-if="activeName == 'waitTeamList'" />
       </el-tab-pane>
-      <el-tab-pane label="待发清单" name="endTeamList"  v-permission="'order/getMusicalList/wait'">
-        <waitTeamList v-if="activeName=='endTeamList'"/>
+      <el-tab-pane
+        label="待发清单"
+        name="endTeamList"
+        v-permission="'order/getMusicalList/wait'"
+      >
+        <waitTeamList v-if="activeName == 'endTeamList'" />
       </el-tab-pane>
-      <el-tab-pane label="收货地址" name="eidtTeamAddr" v-permission="'musicGroupShippingAddress/queryPage'">
-        <eidtTeamAddr v-if="activeName=='eidtTeamAddr'"/>
+      <el-tab-pane
+        label="收货地址"
+        name="eidtTeamAddr"
+        v-permission="'musicGroupShippingAddress/queryPage'"
+      >
+        <eidtTeamAddr v-if="activeName == 'eidtTeamAddr'" />
       </el-tab-pane>
-
     </el-tabs>
   </div>
 </template>
 <script>
-import waitTeamList from './teamListComponent/waitTeamList.vue'
-import endTeamList from './teamListComponent/endTeamList.vue'
-import eidtTeamAddr from './teamListComponent/eidtTeamAddr.vue'
+import waitTeamList from "./teamListComponent/waitTeamList.vue";
+import endTeamList from "./teamListComponent/endTeamList.vue";
+import eidtTeamAddr from "./teamListComponent/eidtTeamAddr.vue";
 export default {
   data() {
     return {
-      activeName:'waitTeamList'
+      activeName: "waitTeamList"
     };
   },
-  components:{
+  components: {
     waitTeamList,
     endTeamList,
     eidtTeamAddr
   },
   mounted() {
+    // 显示默认
+    const tabName = sessionStorage.getItem("teamDetailedListEidtTeamAddr");
+    if (["waitTeamList", "endTeamList", "eidtTeamAddr"].includes(tabName)) {
+      this.activeName = tabName;
+      sessionStorage.removeItem("teamDetailedListEidtTeamAddr");
+    }
+
     this.$bus.$on("changeAddrTab", obj => {
       this.activeName = obj;
     });
   },
-  beforeDestroy(){
-    this.$bus.$off("changeAddrTab", obj => {
-
-    });
-  },
-  activated() {
-
-  },
-  computed: {
-
-  },
-  methods: {
-
+  beforeDestroy() {
+    this.$bus.$off("changeAddrTab", obj => {});
   },
+  activated() {},
+  computed: {},
+  methods: {}
 };
 </script>
 
 <style lang="scss" scoped>
 .teamDetailedList {
-  padding: 0 20px;
+  // padding: 0 20px;
 }
 </style>

+ 67 - 54
src/views/teamDetail/teamListComponent/eidtTeamAddr.vue

@@ -2,14 +2,26 @@
   <div class="">
     <div class="">
       <auth auths="musicGroupShippingAddress/add">
-        <el-button type="primary" class="addBtn" @click="addAddr">新建地址</el-button></auth>
+        <el-button
+          type="primary"
+          class="addBtn"
+          @click="addAddr"
+          :disabled="tableList.length >= 1"
+          >新建地址</el-button
+        ></auth
+      >
 
       <div class="tableWrap">
         <el-table
           :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
           :data="tableList"
         >
-          <el-table-column label="地址编号" prop="id" width="100px"  align="center">
+          <el-table-column
+            label="地址编号"
+            prop="id"
+            width="100px"
+            align="center"
+          >
           </el-table-column>
           <el-table-column label="省" align="left" prop="regionProvince">
           </el-table-column>
@@ -19,24 +31,18 @@
           </el-table-column>
           <el-table-column label="详细地址" align="left" prop="detailAddress">
           </el-table-column>
-          <el-table-column label="操作" prop="sn" width="100px"  align="center">
+          <el-table-column label="操作" prop="sn" width="100px" align="center">
             <template slot-scope="scope">
               <auth auths="musicGroupShippingAddress/update">
-              <el-button
-                @click="resetAddr(scope.row)"
-
-                type="text"
-                >修改</el-button
-              >
-            </auth>
-            <auth auths="musicGroupShippingAddress/delete">
-              <el-button
-                @click="deleteAddr(scope.row)"
-
-                type="text"
-                >删除</el-button
-              >
-            </auth>
+                <el-button @click="resetAddr(scope.row)" type="text"
+                  >修改</el-button
+                >
+              </auth>
+              <!-- <auth auths="musicGroupShippingAddress/delete">
+                <el-button @click="deleteAddr(scope.row)" type="text"
+                  >删除</el-button
+                >
+              </auth> -->
             </template>
           </el-table-column>
         </el-table>
@@ -50,25 +56,31 @@
         />
       </div>
     </div>
-    <el-dialog :visible.sync="addrVisiable" :title="activeRow&&activeRow.id?'修改地址':'新增地址'" width="500px">
-      <eidtAddr v-if="addrVisiable" :form="activeRow" ref='eidtAddr' @getList='getList'/>
+    <el-dialog
+      :visible.sync="addrVisiable"
+      :title="activeRow && activeRow.id ? '修改地址' : '新增地址'"
+      width="500px"
+    >
+      <eidtAddr
+        v-if="addrVisiable"
+        :form="activeRow"
+        ref="eidtAddr"
+        @getList="getList"
+      />
       <div slot="footer" class="dialog-footer">
         <el-button @click="addrVisiable = false">取 消</el-button>
-        <el-button type="primary" @click="submitAddr"
-          >确 定</el-button
-        >
+        <el-button type="primary" @click="submitAddr">确 定</el-button>
       </div>
     </el-dialog>
   </div>
 </template>
 <script>
-
-import { getMusicGroupAddr,deleteMusicGroupAddr} from '../api'
+import { getMusicGroupAddr, deleteMusicGroupAddr } from "../api";
 import qs from "qs";
-import eidtAddr from './modals/eidtAddr.vue'
+import eidtAddr from "./modals/eidtAddr.vue";
 import pagination from "@/components/Pagination/index";
 export default {
-  components:{pagination,eidtAddr},
+  components: { pagination, eidtAddr },
   data() {
     return {
       teamid: "",
@@ -77,16 +89,16 @@ export default {
       Frules: null,
       team_status: "",
       musicalInstrumentsProvideStatus: 0, // 是否确认发货  1已发货
-      hasVerifyMusicalList:true,
+      hasVerifyMusicalList: true,
       rules: {
         // 分页规则
         limit: 10, // 限制显示条数
         page: 1, // 当前页
         total: 0, // 总条数
-        page_size: [10, 20, 40, 50], // 选择限制显示条数
+        page_size: [10, 20, 40, 50] // 选择限制显示条数
       },
-      activeRow:null,
-      addrVisiable:false
+      activeRow: null,
+      addrVisiable: false
     };
   },
   mounted() {
@@ -95,25 +107,26 @@ export default {
   activated() {
     // this.init();
   },
-  computed: {
-
-  },
+  computed: {},
   methods: {
     init() {
       this.team_status = this.$route.query.team_status;
       this.teamid = this.$route.query.id;
-      this.getList()
-
+      this.getList();
     },
-    getList(){
-      this.addrVisiable=false;
+    getList() {
+      this.addrVisiable = false;
       if (this.teamid) {
         // getTeamList({ musicGroupId: this.teamid }).then(res=>{
         //   if(res.code == 200){
         //     this.hasVerifyMusicalList = res?.data?.rows[0]?.hasVerifyMusicalList
         //   }
         // })
-        getMusicGroupAddr({ musicGroupId: this.teamid,page:this.rules.page,rows:this.rules.limit }).then((res) => {
+        getMusicGroupAddr({
+          musicGroupId: this.teamid,
+          page: this.rules.page,
+          rows: this.rules.limit
+        }).then(res => {
           if (res.code == 200) {
             this.tableList = res.data.rows ? res.data.rows : [];
             this.rules.total = res.data.total;
@@ -126,30 +139,30 @@ export default {
       this.$store.dispatch("delVisitedViews", this.$route);
       this.$router.push({ path: "/teamList" });
     },
-    resetAddr(row){
+    resetAddr(row) {
       this.activeRow = row;
       this.addrVisiable = true;
     },
-   async deleteAddr(row){
-    try{
-      await this.$confirm("是否确认删除此收货地址?", "提示", {
-          type: "warning",
+    async deleteAddr(row) {
+      try {
+        await this.$confirm("是否确认删除此收货地址?", "提示", {
+          type: "warning"
         });
-      const res = await deleteMusicGroupAddr({id:row.id})
-      this.$message.success('删除成功')
-      this.getList()
-    }catch(e){
-      console.log(e)
-    }
+        const res = await deleteMusicGroupAddr({ id: row.id });
+        this.$message.success("删除成功");
+        this.getList();
+      } catch (e) {
+        console.log(e);
+      }
     },
-    addAddr(){
+    addAddr() {
       this.activeRow = null;
       this.addrVisiable = true;
     },
-    submitAddr(){
-      this.$refs.eidtAddr.submit()
+    submitAddr() {
+      this.$refs.eidtAddr.submit();
     }
-  },
+  }
 };
 </script>
 

+ 33 - 24
src/views/teamDetail/teamListComponent/modals/eidtAddr.vue

@@ -5,7 +5,7 @@
         label="联系人"
         prop="consigneeName"
         :rules="[
-          { required: true, message: '请输入联系人姓名', trigger: 'blur' },
+          { required: true, message: '请输入联系人姓名', trigger: 'blur' }
         ]"
       >
         <el-input
@@ -21,6 +21,7 @@
         <el-input
           v-model.trim="forms.mobile"
           placeholder="请输入手机号"
+          :maxlength="11"
         ></el-input>
       </el-form-item>
       <el-form-item label="所在城市" required>
@@ -29,7 +30,7 @@
           <el-form-item
             prop="regionProvinceId"
             :rules="[
-              { required: true, message: '请选择省', trigger: 'change' },
+              { required: true, message: '请选择省', trigger: 'change' }
             ]"
             style="margin-right: 0"
           >
@@ -52,7 +53,7 @@
           <el-form-item
             prop="regionCityId"
             :rules="[
-              { required: true, message: '请选择市', trigger: 'change' },
+              { required: true, message: '请选择市', trigger: 'change' }
             ]"
             style="margin-right: 0"
           >
@@ -76,7 +77,7 @@
           <el-form-item
             prop="regionCountyId"
             :rules="[
-              { required: true, message: '请选择地区', trigger: 'change' },
+              { required: true, message: '请选择地区', trigger: 'change' }
             ]"
             style="margin-right: 0"
           >
@@ -102,7 +103,7 @@
         label="详细地址"
         prop="detailAddress"
         :rules="[
-          { required: true, message: '请输入详细地址', trigger: 'blur' },
+          { required: true, message: '请输入详细地址', trigger: 'blur' }
         ]"
       >
         <el-input
@@ -117,7 +118,7 @@
 </template>
 <script>
 import { areaQueryChild, getParentArea } from "@/api/specialSetting";
-import { addMusicGroupAddr,resetMusicGroupAddr } from "../../api";
+import { addMusicGroupAddr, resetMusicGroupAddr } from "../../api";
 export default {
   props: ["form"],
   data() {
@@ -127,27 +128,27 @@ export default {
         mobile: "",
         detailAddress: "",
         musicGroupId: "",
-        regionProvinceId: "",
-        regionCityId: "",
-        regionCountyId: "",
-
+        regionProvinceId: null,
+        regionCityId: null,
+        regionCountyId: null
       },
       provinceList: [],
       cityList: [],
       countyList: [],
+      isLock: false
     };
   },
   async mounted() {
-    if(this.form){
-      this.forms = {...this.form}
+    if (this.form) {
+      this.forms = { ...this.form };
     }
     await this.getAreaList();
     if (this.forms.regionCityId) {
-      await getParentArea({ id: this.forms.regionCityId }).then(async (res) => {
+      await getParentArea({ id: this.forms.regionCityId }).then(async res => {
         if (res.code == 200 && res.data) {
           await this.getAreaList(res.data.id, "regionCityId", () => {
-            this.$set(this.forms, "regionProvinceId", res.data.id+'');
-            this.$set(this.forms, "regionCityId", this.forms.regionCityId );
+            this.$set(this.forms, "regionProvinceId", res.data.id + "");
+            this.$set(this.forms, "regionCityId", this.forms.regionCityId);
             this.$set(this.forms, "regionCountyId", this.forms.regionCountyId);
           });
         }
@@ -165,21 +166,21 @@ export default {
     onChangeProvince(val) {
       this.forms.regionCityId = null;
       this.forms.regionCountyId = null;
-      this.getAreaList(val+'', "");
+      this.getAreaList(val + "", "");
     },
     onChangeCity(val) {
       this.forms.regionCountyId = null;
-      this.getAreaList(val+'', "regionCountyId");
+      this.getAreaList(val + "", "regionCountyId");
     },
     getAreaList(parentId, type, callback) {
       parentId = parentId ? parentId : 0;
-      areaQueryChild({ parentId: parentId }).then((res) => {
+      areaQueryChild({ parentId: parentId }).then(res => {
         if (res.code == 200 && res.data) {
           let tempData = [];
-          res.data.forEach((item) => {
+          res.data.forEach(item => {
             tempData.push({
               label: item.name,
-              value: item.id+'',
+              value: item.id + ""
             });
           });
           if (parentId) {
@@ -199,9 +200,13 @@ export default {
       });
     },
     async submit() {
-      this.$refs.form.validate(async (flag) => {
+      this.$refs.form.validate(async flag => {
         if (flag) {
-          this.forms.musicGroupId = this.$route.query.id
+          if (this.isLock) {
+            return;
+          }
+          this.isLock = true;
+          this.forms.musicGroupId = this.$route.query.id;
           if (this.forms.id) {
             // 修改  resetMusicGroupAddr
             try {
@@ -221,10 +226,14 @@ export default {
               console.log(e);
             }
           }
+
+          setTimeout(() => {
+            this.isLock = false;
+          }, 200);
         }
       });
-    },
-  },
+    }
+  }
 };
 </script>
 

Some files were not shown because too many files changed in this diff