Browse Source

Merge branch 'master' into 红德堂APP调试

# Conflicts:
#	src/views/system/config/config.vue
Long 1 ngày trước cách đây
mục cha
commit
62718af3f9
97 tập tin đã thay đổi với 8997 bổ sung630 xóa
  1. 7 0
      .env.development
  2. 3 0
      .env.prod-bnkc
  3. 5 2
      .env.prod-drk
  4. 12 2
      .env.prod-fcky
  5. 3 0
      .env.prod-hcl
  6. 3 0
      .env.prod-hdt
  7. 3 0
      .env.prod-hzyy
  8. 37 0
      .env.prod-jkj
  9. 3 0
      .env.prod-jnmy
  10. 3 0
      .env.prod-jzzx
  11. 4 1
      .env.prod-lmjy
  12. 3 0
      .env.prod-myhk
  13. 3 0
      .env.prod-qdtst
  14. 3 0
      .env.prod-sft
  15. 3 0
      .env.prod-sxjz
  16. 3 0
      .env.prod-test
  17. 2 0
      .env.prod-whhm
  18. 6 3
      .env.prod-xfk
  19. 3 0
      .env.prod-yzt
  20. 2 0
      .env.prod-zsjk
  21. 1 0
      package.json
  22. 11 1
      src/api/company/companyMenu.js
  23. 9 0
      src/api/company/companyUser.js
  24. 7 0
      src/api/course/qw/courseWatchLog.js
  25. 9 1
      src/api/course/userCourse.js
  26. 7 7
      src/api/course/userCourseComplaintRecord.js
  27. 25 0
      src/api/course/userCoursePeriod.js
  28. 9 1
      src/api/course/userTalent.js
  29. 38 0
      src/api/his/storeOrder.js
  30. 19 0
      src/api/his/userOperationLog.js
  31. 53 0
      src/api/live/liveAfterSalesItem.js
  32. 53 0
      src/api/live/liveAfterSalesLogs.js
  33. 53 0
      src/api/live/liveAfteraSales.js
  34. 53 0
      src/api/live/liveCart.js
  35. 53 0
      src/api/live/liveOrderItem.js
  36. 53 0
      src/api/live/liveOrderLogs.js
  37. 53 0
      src/api/live/liveOrderStatus.js
  38. 9 1
      src/api/live/liveVideo.js
  39. 1 1
      src/api/qw/externalContact.js
  40. BIN
      src/assets/logo/jkj.png
  41. 7 7
      src/components/ImageUpload/index.vue
  42. 4 4
      src/components/Material/index.vue
  43. 1 1
      src/components/VideoUpload/index.vue
  44. 13 0
      src/router/index.js
  45. 53 47
      src/views/company/companyDomainBind/index.vue
  46. 4 3
      src/views/components/course/userCourseCatalogDetails.vue
  47. 1 1
      src/views/components/his/followMsgDetails.vue
  48. 8 1
      src/views/components/his/inquiryOrderReportDetails.vue
  49. 7 1
      src/views/components/his/msgDetails.vue
  50. 1 1
      src/views/components/his/packageOrderDetails.vue
  51. 9 1
      src/views/components/his/testReportDetails.vue
  52. 2 1
      src/views/components/his/userAddDetails.vue
  53. 9 1
      src/views/components/his/userDetails.vue
  54. 11 10
      src/views/components/his/userPatietDetails.vue
  55. 19 42
      src/views/course/courseWatchLog/index.vue
  56. 46 1
      src/views/course/userCourse/index.vue
  57. 139 37
      src/views/course/userCourseComplaintRecord/index.vue
  58. 70 24
      src/views/course/userCoursePeriod/index.vue
  59. 101 10
      src/views/course/userTalent/index.vue
  60. 75 2
      src/views/course/videoResource/index.vue
  61. 5 5
      src/views/his/company/index.vue
  62. 17 12
      src/views/his/doctor/type1.vue
  63. 3 1
      src/views/his/package/index.vue
  64. 2 1
      src/views/his/patient/index.vue
  65. 751 154
      src/views/his/storeOrder/order1.vue
  66. 77 24
      src/views/his/user/index.vue
  67. 460 0
      src/views/his/user/userBehavior.vue
  68. 173 0
      src/views/his/user/userCourseConversionRecord.vue
  69. 476 0
      src/views/his/user/userCoursePeriod.vue
  70. 222 0
      src/views/his/user/userCoursePeriodDetails.vue
  71. 57 0
      src/views/his/user/userCourseStatic.vue
  72. 71 0
      src/views/his/user/userDetails.vue
  73. 248 0
      src/views/his/user/userStaticAll.vue
  74. 3 2
      src/views/index.vue
  75. 10 1
      src/views/live/live/index.vue
  76. 331 0
      src/views/live/liveAfterSalesItem/index.vue
  77. 358 0
      src/views/live/liveAfterSalesLogs/index.vue
  78. 531 0
      src/views/live/liveAfteraSales/index.vue
  79. 76 68
      src/views/live/liveAnchor/index.vue
  80. 369 0
      src/views/live/liveCart/index.vue
  81. 3 3
      src/views/live/liveData/index.vue
  82. 19 8
      src/views/live/liveGoods/index.vue
  83. 15 7
      src/views/live/liveOrder/index.vue
  84. 391 0
      src/views/live/liveOrderItem/index.vue
  85. 328 0
      src/views/live/liveOrderLogs/index.vue
  86. 313 0
      src/views/live/liveOrderStatus/index.vue
  87. 14 6
      src/views/live/liveOrderitems/index.vue
  88. 15 7
      src/views/live/liveVideo/index.vue
  89. 15 3
      src/views/qw/sopTemp/index.vue
  90. 17 4
      src/views/qw/sopTemp/updateSopTemp.vue
  91. 19 7
      src/views/statistics/section/channel.vue
  92. 18 7
      src/views/statistics/section/index.vue
  93. 18 7
      src/views/statistics/section/inline.vue
  94. 19 7
      src/views/statistics/section/today.vue
  95. 184 0
      src/views/system/config/companyMenuConfig.vue
  96. 273 81
      src/views/system/config/config.vue
  97. 1889 0
      src/views/system/config/config2.vue

+ 7 - 0
.env.development

@@ -33,5 +33,12 @@ ENV = 'production'
 # FS管理系统/开发环境
 VUE_APP_BASE_API = '/prod-api'
 
+#默认 1、会员 2、企微
+VUE_APP_COURSE_DEFAULT = 1
+
 # 路由懒加载
 VUE_CLI_BABEL_TRANSPILE_MODULES = true
+# 患者信息
+VUE_APP_PATIENT_INFO = '客户信息'
+# 添加病人
+VUE_APP_ADD_PATIENT = '添加信息'

+ 3 - 0
.env.prod-bnkc

@@ -33,5 +33,8 @@ ENV = 'production'
 # FS管理系统/开发环境
 VUE_APP_BASE_API = '/prod-api'
 
+#默认 1、会员 2、企微
+VUE_APP_COURSE_DEFAULT = 1
+
 # 路由懒加载
 VUE_CLI_BABEL_TRANSPILE_MODULES = true

+ 5 - 2
.env.prod-drk

@@ -5,9 +5,9 @@ VUE_APP_TITLE_INDEX =德瑞康互联网医院
 # 公司名称
 VUE_APP_COMPANY_NAME =青岛德瑞康医疗管理有限公司市北德瑞康中医医院
 # ICP备案号
-VUE_APP_ICP_RECORD =
+VUE_APP_ICP_RECORD =鲁ICP备2024135071号-3
 # ICP网站访问地址
-VUE_APP_ICP_URL =
+VUE_APP_ICP_URL =https://beian.miit.gov.cn
 # 网站LOG
 VUE_APP_LOG_URL =@/assets/logo/drk.png
 # 存储桶配置
@@ -33,5 +33,8 @@ ENV = 'production'
 # FS管理系统/开发环境
 VUE_APP_BASE_API = '/prod-api'
 
+#默认 1、会员 2、企微
+VUE_APP_COURSE_DEFAULT = 1
+
 # 路由懒加载
 VUE_CLI_BABEL_TRANSPILE_MODULES = true

+ 12 - 2
.env.prod-fcky

@@ -1,7 +1,7 @@
 # 页面标题
-VUE_APP_TITLE =蜂巢快药互联网医院管理系统
+VUE_APP_TITLE =CRM客户管理系统
 # 首页菜单标题
-VUE_APP_TITLE_INDEX =蜂巢快药互联网医院
+VUE_APP_TITLE_INDEX =CRM客户管理系统
 # 公司名称
 VUE_APP_COMPANY_NAME =蜂巢快药(北京)医药连锁有限公司
 # ICP备案号
@@ -26,6 +26,8 @@ VUE_APP_COS_REGION = ap-chongqing
 VUE_APP_VIDEO_LINE_1 = https://fckytcpv.ylrzcloud.com
 # 线路二地址
 VUE_APP_VIDEO_LINE_2 = https://fckyobs.ylrztop.com
+# 默认看课模式 1会员 2企微
+VUE_APP_COURSE_DEFAULT = 1
 
 # 开发环境配置
 ENV = 'development'
@@ -33,5 +35,13 @@ ENV = 'development'
 # FS管理系统/开发环境
 VUE_APP_BASE_API = '/prod-api'
 
+#默认 1、会员 2、企微
+VUE_APP_COURSE_DEFAULT = 1
+
 # 路由懒加载
 VUE_CLI_BABEL_TRANSPILE_MODULES = true
+
+# 患者信息
+VUE_APP_PATIENT_INFO = '客户信息'
+# 添加病人
+VUE_APP_ADD_PATIENT = '添加信息'

+ 3 - 0
.env.prod-hcl

@@ -33,5 +33,8 @@ ENV = 'development'
 # FS管理系统/开发环境
 VUE_APP_BASE_API = '/prod-api'
 
+#默认 1、会员 2、企微
+VUE_APP_COURSE_DEFAULT = 1
+
 # 路由懒加载
 VUE_CLI_BABEL_TRANSPILE_MODULES = true

+ 3 - 0
.env.prod-hdt

@@ -33,5 +33,8 @@ ENV = 'development'
 # FS管理系统/开发环境
 VUE_APP_BASE_API = '/prod-api'
 
+#默认 1、会员 2、企微
+VUE_APP_COURSE_DEFAULT = 2
+
 # 路由懒加载
 VUE_CLI_BABEL_TRANSPILE_MODULES = true

+ 3 - 0
.env.prod-hzyy

@@ -33,5 +33,8 @@ ENV = 'development'
 # FS管理系统/开发环境
 VUE_APP_BASE_API = '/prod-api'
 
+#默认 1、会员 2、企微
+VUE_APP_COURSE_DEFAULT = 1
+
 # 路由懒加载
 VUE_CLI_BABEL_TRANSPILE_MODULES = true

+ 37 - 0
.env.prod-jkj

@@ -0,0 +1,37 @@
+# 页面标题
+VUE_APP_TITLE =金康健互联网医院管理系统
+# 首页菜单标题
+VUE_APP_TITLE_INDEX =金康健互联网医院
+# 公司名称
+VUE_APP_COMPANY_NAME =西安金康健医药有限公司
+# ICP备案号
+VUE_APP_ICP_RECORD =陕ICP备2024035932号-15
+# ICP网站访问地址
+VUE_APP_ICP_URL =https://beian.miit.gov.cn
+# 网站LOG
+VUE_APP_LOG_URL =@/assets/logo/jkj.png
+# 存储桶配置
+VUE_APP_OBS_ACCESS_KEY_ID = K2UTJGIN7UTZJR2XMXYG
+# 存储桶配置
+VUE_APP_OBS_SECRET_ACCESS_KEY = sbyeNJLbcYmH6copxeFP9pAoksM4NIT9Zw4x0SRX
+# 存储桶配置
+VUE_APP_OBS_SERVER = https://obs.cn-north-4.myhuaweicloud.com
+# 存储桶配置
+VUE_APP_OBS_BUCKET = jkj-hw079058881
+# 存储桶配置
+VUE_APP_COS_BUCKET = jkj-1323137866
+# 存储桶配置
+VUE_APP_COS_REGION = ap-chongqing
+# 线路一地址
+VUE_APP_VIDEO_LINE_1 = https://jkjtcpv.ylrzcloud.com
+# 线路二地址
+VUE_APP_VIDEO_LINE_2 = https://jkjobs.ylrztop.com
+
+# 开发环境配置
+ENV = 'production'
+
+# FS管理系统/开发环境
+VUE_APP_BASE_API = '/prod-api'
+
+# 路由懒加载
+VUE_CLI_BABEL_TRANSPILE_MODULES = true

+ 3 - 0
.env.prod-jnmy

@@ -33,5 +33,8 @@ ENV = 'development'
 # FS管理系统/开发环境
 VUE_APP_BASE_API = '/prod-api'
 
+#默认 1、会员 2、企微
+VUE_APP_COURSE_DEFAULT = 1
+
 # 路由懒加载
 VUE_CLI_BABEL_TRANSPILE_MODULES = true

+ 3 - 0
.env.prod-jzzx

@@ -33,5 +33,8 @@ ENV = 'development'
 # FS管理系统/开发环境
 VUE_APP_BASE_API = '/prod-api'
 
+#默认 1、会员 2、企微
+VUE_APP_COURSE_DEFAULT = 1
+
 # 路由懒加载
 VUE_CLI_BABEL_TRANSPILE_MODULES = true

+ 4 - 1
.env.prod-lmjy

@@ -17,7 +17,7 @@ VUE_APP_OBS_SECRET_ACCESS_KEY = sbyeNJLbcYmH6copxeFP9pAoksM4NIT9Zw4x0SRX
 # 存储桶配置
 VUE_APP_OBS_SERVER = https://obs.cn-north-4.myhuaweicloud.com
 # 存储桶配置
-VUE_APP_OBS_BUCKET = lmjy-hw079058881	
+VUE_APP_OBS_BUCKET = lmjy-hw079058881
 # 存储桶配置
 VUE_APP_COS_BUCKET = lm-1323137866
 # 存储桶配置
@@ -33,5 +33,8 @@ ENV = 'development'
 # FS管理系统/开发环境
 VUE_APP_BASE_API = '/prod-api'
 
+#默认 1、会员 2、企微
+VUE_APP_COURSE_DEFAULT = 1
+
 # 路由懒加载
 VUE_CLI_BABEL_TRANSPILE_MODULES = true

+ 3 - 0
.env.prod-myhk

@@ -33,5 +33,8 @@ ENV = 'production'
 # FS管理系统/开发环境
 VUE_APP_BASE_API = '/prod-api'
 
+#默认 1、会员 2、企微
+VUE_APP_COURSE_DEFAULT = 2
+
 # 路由懒加载
 VUE_CLI_BABEL_TRANSPILE_MODULES = true

+ 3 - 0
.env.prod-qdtst

@@ -33,5 +33,8 @@ ENV = 'development'
 # FS管理系统/开发环境
 VUE_APP_BASE_API = '/prod-api'
 
+#默认 1、会员 2、企微
+VUE_APP_COURSE_DEFAULT = 1
+
 # 路由懒加载
 VUE_CLI_BABEL_TRANSPILE_MODULES = true

+ 3 - 0
.env.prod-sft

@@ -33,5 +33,8 @@ ENV = 'development'
 # FS管理系统/开发环境
 VUE_APP_BASE_API = '/prod-api'
 
+#默认 1、会员 2、企微
+VUE_APP_COURSE_DEFAULT = 2
+
 # 路由懒加载
 VUE_CLI_BABEL_TRANSPILE_MODULES = true

+ 3 - 0
.env.prod-sxjz

@@ -33,5 +33,8 @@ ENV = 'development'
 # 今正互联网医院管理系统/开发环境
 VUE_APP_BASE_API = '/prod-api'
 
+#默认 1、会员 2、企微
+VUE_APP_COURSE_DEFAULT = 1
+
 # 路由懒加载
 VUE_CLI_BABEL_TRANSPILE_MODULES = true

+ 3 - 0
.env.prod-test

@@ -31,5 +31,8 @@ ENV = 'development'
 # FS管理系统/开发环境
 VUE_APP_BASE_API = '/prod-api'
 
+#默认 1、会员 2、企微
+VUE_APP_COURSE_DEFAULT = 1
+
 # 路由懒加载
 VUE_CLI_BABEL_TRANSPILE_MODULES = true

+ 2 - 0
.env.prod-whhm

@@ -33,5 +33,7 @@ ENV = 'production'
 # FS管理系统/开发环境
 VUE_APP_BASE_API = '/prod-api'
 
+#默认 1、会员 2、企微
+VUE_APP_COURSE_DEFAULT = 1
 # 路由懒加载
 VUE_CLI_BABEL_TRANSPILE_MODULES = true

+ 6 - 3
.env.prod-xfk

@@ -1,9 +1,9 @@
 # 页面标题
-VUE_APP_TITLE =小访客管理系统
+VUE_APP_TITLE =协和魔丽管理系统
 # 首页菜单标题
-VUE_APP_TITLE_INDEX =小访客
+VUE_APP_TITLE_INDEX =协和魔丽
 # 公司名称
-VUE_APP_COMPANY_NAME =西安小访客网络科技有限公司
+VUE_APP_COMPANY_NAME =西安协和魔丽网络科技有限公司
 # ICP备案号
 VUE_APP_ICP_RECORD =陕ICP备2025066365号-3
 # ICP网站访问地址
@@ -33,5 +33,8 @@ ENV = 'development'
 # FS管理系统/开发环境
 VUE_APP_BASE_API = '/prod-api'
 
+#默认 1、会员 2、企微
+VUE_APP_COURSE_DEFAULT = 2
+
 # 路由懒加载
 VUE_CLI_BABEL_TRANSPILE_MODULES = true

+ 3 - 0
.env.prod-yzt

@@ -33,5 +33,8 @@ ENV = 'development'
 # FS管理系统/开发环境
 VUE_APP_BASE_API = '/prod-api'
 
+#默认 1、会员 2、企微
+VUE_APP_COURSE_DEFAULT = 2
+
 # 路由懒加载
 VUE_CLI_BABEL_TRANSPILE_MODULES = true

+ 2 - 0
.env.prod-zsjk

@@ -33,5 +33,7 @@ ENV = 'production'
 # FS管理系统/开发环境
 VUE_APP_BASE_API = '/prod-api'
 
+#默认 1、会员 2、企微
+VUE_APP_COURSE_DEFAULT = 2
 # 路由懒加载
 VUE_CLI_BABEL_TRANSPILE_MODULES = true

+ 1 - 0
package.json

@@ -25,6 +25,7 @@
     "build:prod-whhm": "vue-cli-service build --mode prod-whhm",
     "build:prod-drk": "vue-cli-service build --mode prod-drk",
     "build:prod-qdtst": "vue-cli-service build --mode prod-qdtst",
+    "build:prod-jkj": "vue-cli-service build --mode prod-jkj",
     "build:stage": "vue-cli-service build --mode staging",
     "preview": "node build/index.js --preview",
     "lint": "eslint --ext .js,.vue src"

+ 11 - 1
src/api/company/companyMenu.js

@@ -50,4 +50,14 @@ export function exportCompanyMenu(query) {
     method: 'get',
     params: query
   })
-}
+}
+
+
+
+// 查询菜单下拉树结构
+export function treeselect() {
+  return request({
+    url: '/company/companyMenu/treeselect',
+    method: 'get'
+  })
+}

+ 9 - 0
src/api/company/companyUser.js

@@ -111,3 +111,12 @@ export function changeCompanyUser(data, params) {
     params: params
   })
 }
+
+// 查询企业员工信息列表
+export function getCompanyUserListPage(query) {
+  return request({
+    url: '/company/companyUser/getCompanyUserListPage',
+    method: 'get',
+    params: query
+  })
+}

+ 7 - 0
src/api/course/qw/courseWatchLog.js

@@ -112,3 +112,10 @@ export function watchLogStatisticsExport(query) {
     params: query
   })
 }
+export function listBytrainingCampId(query) {
+  return request({
+    url: '/qw/course/courseWatchLog/listBytrainingCampId',
+    method: 'get',
+    params: query
+  })
+}

+ 9 - 1
src/api/course/userCourse.js

@@ -43,6 +43,14 @@ export function delUserCourse(courseId) {
   })
 }
 
+// 复制课程
+export function copyUserCourse(courseId) {
+  return request({
+    url: '/course/userCourse/copy/' + courseId,
+    method: 'get'
+  })
+}
+
 // 导出课程
 export function exportUserCourse(query) {
   return request({
@@ -79,4 +87,4 @@ export function pullOff(courseIds) {
     url: '/course/userCourse/pullOff/' + courseIds,
     method: 'post'
   })
-}
+}

+ 7 - 7
src/api/course/userCourseComplaintRecord.js

@@ -9,13 +9,13 @@ export function listUserCourseComplaintRecord(query) {
   })
 }
 
-// // 查询看课投诉记录详细
-// export function getUserCourseComplaintRecord(recordId) {
-//   return request({
-//     url: '/course/userCourseComplaintRecord/' + recordId,
-//     method: 'get'
-//   })
-// }
+// 查询看课投诉记录详细
+export function getUserCourseComplaintRecord(recordId) {
+  return request({
+    url: '/course/userCourseComplaintRecord/' + recordId,
+    method: 'get'
+  })
+}
 //
 // // 新增看课投诉记录
 // export function addUserCourseComplaintRecord(data) {

+ 25 - 0
src/api/course/userCoursePeriod.js

@@ -174,3 +174,28 @@ export function closePeriod(query) {
     params: query
   })
 }
+// 删除会员营期课程
+export function delPeriodDay(periodId) {
+  return request({
+    url: '/course/period/day/' + periodId,
+    method: 'delete'
+  })
+}
+
+
+export function periodCourseStatisticCount(data) {
+  return request({
+    url: '/course/period/periodCourseStatisticCount',
+    method: 'post',
+    data: data
+  })
+}
+
+// 查询该会员下该训练营下操作过的所有营期
+export function periodList(data) {
+  return request({
+    url: '/course/period/periodlist',
+    method: 'post',
+    data: data
+  })
+}

+ 9 - 1
src/api/course/userTalent.js

@@ -66,4 +66,12 @@ export function listBySearch(query) {
     method: 'get',
     params: query
   })
-}
+}
+
+//查询所属销售公司
+export function getCompanies(keyword) {
+  return request({
+    url: '/course/userTalent/listCompanyByKeyword/'+keyword,
+    method: 'get'
+  })
+}

+ 38 - 0
src/api/his/storeOrder.js

@@ -234,3 +234,41 @@ export function exportOrder2(query) {
   })
 }
 
+export function queryErpPhone(query) {
+  return request({
+    url: '/his/storeOrder/queryErpPhone',
+    method: 'get',
+    params: query
+  })
+}
+
+export function saveErpPhone(data) {
+  return request({
+    url: '/his/storeOrder/saveErpPhone',
+    method: 'post',
+    data: data
+  })
+}
+
+export function editErpPhone(data) {
+  return request({
+    url: '/his/storeOrder/editErpPhone',
+    method: 'post',
+    data: data
+  })
+}
+
+export function batchCreateErpOrder(data) {
+  return request({
+    url: '/his/storeOrder/batchCreateErpOrder',
+    method: 'post',
+    data: data
+  })
+}
+
+export function getErpAccount() {
+  return request({
+    url: '/his/storeOrder/getErpAccount',
+    method: 'get'
+  })
+}

+ 19 - 0
src/api/his/userOperationLog.js

@@ -0,0 +1,19 @@
+import request from '@/utils/request'
+
+// 查询用户操作日志对象列表
+export function listUserOperationLog(query) {
+  return request({
+    url: '/his/userOperationLog/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询用户操作日志类型
+export function getOperationType() {
+  return request({
+    url: '/his/userOperationLog/getOperationType',
+    method: 'get'
+  })
+}
+

+ 53 - 0
src/api/live/liveAfterSalesItem.js

@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询售后子列表
+export function listLiveAfterSalesItem(query) {
+  return request({
+    url: '/live/liveAfterSalesItem/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询售后子详细
+export function getLiveAfterSalesItem(id) {
+  return request({
+    url: '/live/liveAfterSalesItem/' + id,
+    method: 'get'
+  })
+}
+
+// 新增售后子
+export function addLiveAfterSalesItem(data) {
+  return request({
+    url: '/live/liveAfterSalesItem',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改售后子
+export function updateLiveAfterSalesItem(data) {
+  return request({
+    url: '/live/liveAfterSalesItem',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除售后子
+export function delLiveAfterSalesItem(id) {
+  return request({
+    url: '/live/liveAfterSalesItem/' + id,
+    method: 'delete'
+  })
+}
+
+// 导出售后子
+export function exportLiveAfterSalesItem(query) {
+  return request({
+    url: '/live/liveAfterSalesItem/export',
+    method: 'get',
+    params: query
+  })
+}

+ 53 - 0
src/api/live/liveAfterSalesLogs.js

@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询售后订单操作列表
+export function listLiveAfterSalesLogs(query) {
+  return request({
+    url: '/live/liveAfterSalesLogs/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询售后订单操作详细
+export function getLiveAfterSalesLogs(logsId) {
+  return request({
+    url: '/live/liveAfterSalesLogs/' + logsId,
+    method: 'get'
+  })
+}
+
+// 新增售后订单操作
+export function addLiveAfterSalesLogs(data) {
+  return request({
+    url: '/live/liveAfterSalesLogs',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改售后订单操作
+export function updateLiveAfterSalesLogs(data) {
+  return request({
+    url: '/live/liveAfterSalesLogs',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除售后订单操作
+export function delLiveAfterSalesLogs(logsId) {
+  return request({
+    url: '/live/liveAfterSalesLogs/' + logsId,
+    method: 'delete'
+  })
+}
+
+// 导出售后订单操作
+export function exportLiveAfterSalesLogs(query) {
+  return request({
+    url: '/live/liveAfterSalesLogs/export',
+    method: 'get',
+    params: query
+  })
+}

+ 53 - 0
src/api/live/liveAfteraSales.js

@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询售后记录列表
+export function listLiveAfteraSales(query) {
+  return request({
+    url: '/live/liveAfteraSales/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询售后记录详细
+export function getLiveAfteraSales(id) {
+  return request({
+    url: '/live/liveAfteraSales/' + id,
+    method: 'get'
+  })
+}
+
+// 新增售后记录
+export function addLiveAfteraSales(data) {
+  return request({
+    url: '/live/liveAfteraSales',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改售后记录
+export function updateLiveAfteraSales(data) {
+  return request({
+    url: '/live/liveAfteraSales',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除售后记录
+export function delLiveAfteraSales(id) {
+  return request({
+    url: '/live/liveAfteraSales/' + id,
+    method: 'delete'
+  })
+}
+
+// 导出售后记录
+export function exportLiveAfteraSales(query) {
+  return request({
+    url: '/live/liveAfteraSales/export',
+    method: 'get',
+    params: query
+  })
+}

+ 53 - 0
src/api/live/liveCart.js

@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询购物车列表
+export function listLiveCart(query) {
+  return request({
+    url: '/live/liveCart/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询购物车详细
+export function getLiveCart(cardId) {
+  return request({
+    url: '/live/liveCart/' + cardId,
+    method: 'get'
+  })
+}
+
+// 新增购物车
+export function addLiveCart(data) {
+  return request({
+    url: '/live/liveCart',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改购物车
+export function updateLiveCart(data) {
+  return request({
+    url: '/live/liveCart',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除购物车
+export function delLiveCart(cardId) {
+  return request({
+    url: '/live/liveCart/' + cardId,
+    method: 'delete'
+  })
+}
+
+// 导出购物车
+export function exportLiveCart(query) {
+  return request({
+    url: '/live/liveCart/export',
+    method: 'get',
+    params: query
+  })
+}

+ 53 - 0
src/api/live/liveOrderItem.js

@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询订单详情列表
+export function listLiveOrderItem(query) {
+  return request({
+    url: '/live/liveOrderItem/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询订单详情详细
+export function getLiveOrderItem(itemId) {
+  return request({
+    url: '/live/liveOrderItem/' + itemId,
+    method: 'get'
+  })
+}
+
+// 新增订单详情
+export function addLiveOrderItem(data) {
+  return request({
+    url: '/live/liveOrderItem',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改订单详情
+export function updateLiveOrderItem(data) {
+  return request({
+    url: '/live/liveOrderItem',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除订单详情
+export function delLiveOrderItem(itemId) {
+  return request({
+    url: '/live/liveOrderItem/' + itemId,
+    method: 'delete'
+  })
+}
+
+// 导出订单详情
+export function exportLiveOrderItem(query) {
+  return request({
+    url: '/live/liveOrderItem/export',
+    method: 'get',
+    params: query
+  })
+}

+ 53 - 0
src/api/live/liveOrderLogs.js

@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询订单操作记录列表
+export function listLiveOrderLogs(query) {
+  return request({
+    url: '/live/liveOrderLogs/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询订单操作记录详细
+export function getLiveOrderLogs(logsId) {
+  return request({
+    url: '/live/liveOrderLogs/' + logsId,
+    method: 'get'
+  })
+}
+
+// 新增订单操作记录
+export function addLiveOrderLogs(data) {
+  return request({
+    url: '/live/liveOrderLogs',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改订单操作记录
+export function updateLiveOrderLogs(data) {
+  return request({
+    url: '/live/liveOrderLogs',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除订单操作记录
+export function delLiveOrderLogs(logsId) {
+  return request({
+    url: '/live/liveOrderLogs/' + logsId,
+    method: 'delete'
+  })
+}
+
+// 导出订单操作记录
+export function exportLiveOrderLogs(query) {
+  return request({
+    url: '/live/liveOrderLogs/export',
+    method: 'get',
+    params: query
+  })
+}

+ 53 - 0
src/api/live/liveOrderStatus.js

@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询订单操作记录列表
+export function listLiveOrderStatus(query) {
+  return request({
+    url: '/live/liveOrderStatus/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询订单操作记录详细
+export function getLiveOrderStatus(id) {
+  return request({
+    url: '/live/liveOrderStatus/' + id,
+    method: 'get'
+  })
+}
+
+// 新增订单操作记录
+export function addLiveOrderStatus(data) {
+  return request({
+    url: '/live/liveOrderStatus',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改订单操作记录
+export function updateLiveOrderStatus(data) {
+  return request({
+    url: '/live/liveOrderStatus',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除订单操作记录
+export function delLiveOrderStatus(id) {
+  return request({
+    url: '/live/liveOrderStatus/' + id,
+    method: 'delete'
+  })
+}
+
+// 导出订单操作记录
+export function exportLiveOrderStatus(query) {
+  return request({
+    url: '/live/liveOrderStatus/export',
+    method: 'get',
+    params: query
+  })
+}

+ 9 - 1
src/api/live/liveVideo.js

@@ -17,6 +17,14 @@ export function getLiveVideo(videoId) {
   })
 }
 
+// 查询直播视频详细
+export function getLiveVideoByLiveId(liveId) {
+  return request({
+    url: '/live/liveVideo/liveVideoByLiveId/' + liveId,
+    method: 'get'
+  })
+}
+
 // 新增直播视频
 export function addLiveVideo(data) {
   return request({
@@ -50,4 +58,4 @@ export function exportLiveVideo(query) {
     method: 'get',
     params: query
   })
-}
+}

+ 1 - 1
src/api/qw/externalContact.js

@@ -50,4 +50,4 @@ export function exportExternalContact(query) {
     method: 'get',
     params: query
   })
-}
+}

BIN
src/assets/logo/jkj.png


+ 7 - 7
src/components/ImageUpload/index.vue

@@ -165,8 +165,8 @@ export default {
           // 文件大于1MB时进行压缩
           this.compressImage(file).then((compressedFile) => {
             loadingInstance.close();
-            if (compressedFile.size / 1024 > 500) {
-              this.$message.error('图片压缩后仍大于500KB');
+            if (compressedFile.size / 1024 > 1000) {
+              this.$message.error('图片压缩后仍大于1000KB');
               reject();
             } else {
               // this.$message.success(`图片压缩成功,最终质量为: ${this.finalQuality.toFixed(2)}`);
@@ -195,7 +195,7 @@ export default {
       //     return false;
       //   }
       // }
-      
+
     },
     compressImage(file) {
       return new Promise((resolve, reject) => {
@@ -215,16 +215,16 @@ export default {
 
             let quality = 1; // 初始压缩质量
             let dataURL = canvas.toDataURL('image/jpeg', quality);
-            
+
             // 逐步压缩,直到图片大小小于500KB并且压缩质量不再降低
             while (dataURL.length / 1024 > 500 && quality > 0.1) {
               quality -= 0.01;
               dataURL = canvas.toDataURL('image/jpeg', quality);
             }
             this.finalQuality = quality; // 存储最终的压缩质量
-            
-            if (dataURL.length / 1024 > 500) {
-              reject(new Error('压缩后图片仍然大于500KB'));
+
+            if (dataURL.length / 1024 > 1000) {
+              reject(new Error('压缩后图片仍然大于1000KB'));
               return;
             }
 

+ 4 - 4
src/components/Material/index.vue

@@ -367,8 +367,8 @@ export default {
           // 文件大于1MB时进行压缩
           this.compressImage(file).then((compressedFile) => {
             loadingInstance.close();
-            if (compressedFile.size / 1024 > 500) {
-              this.$message.error('图片压缩后仍大于500KB');
+            if (compressedFile.size / 1024 > 1000) {
+              this.$message.error('图片压缩后仍大于1M');
               reject();
             } else {
               // this.$message.success(`图片压缩成功,最终质量为: ${this.finalQuality.toFixed(2)}`);
@@ -417,8 +417,8 @@ export default {
             }
             this.finalQuality = quality; // 存储最终的压缩质量
 
-            if (dataURL.length / 1024 > 500) {
-              reject(new Error('压缩后图片仍然大于500KB'));
+            if (dataURL.length / 1024 > 1000) {
+              reject(new Error('压缩后图片仍然大于1000KB'));
               return;
             }
 

+ 1 - 1
src/components/VideoUpload/index.vue

@@ -102,7 +102,7 @@
       </el-form>
 
       <!-- 视频列表 -->
-      <el-table v-loading="libraryLoading" :data="libraryList" @row-click="handleLibrarySelect" highlight-current-row>
+      <el-table v-loading="libraryLoading" :data="libraryList" @row-click="handleLibrarySelect" highlight-current-row border>
         <el-table-column label="素材名称" align="center" prop="resourceName" />
         <el-table-column label="文件名称" align="center" prop="fileName" />
         <el-table-column label="缩略图" align="center">

+ 13 - 0
src/router/index.js

@@ -228,6 +228,19 @@ export const constantRoutes = [
       }
     ]
   },
+  {
+    path: '/live',
+    component: Layout,
+    hidden: true,
+    children: [
+      {
+        path: 'LiveConsole/:liveId', // 动态路由参数
+        component: () => import('@/views/live/liveConsole'), // 使用 import 动态加载
+        name: 'LiveConsole',
+        meta: { title: '直播中控台', activeMenu: '/live/liveConsole' }
+      }
+    ]
+  }
 ]
 
 export default new Router({

+ 53 - 47
src/views/company/companyDomainBind/index.vue

@@ -82,7 +82,7 @@
           icon="el-icon-paperclip"
           size="mini"
           @click="handleBindingOpen"
-        >批量分配
+        >批量分配销售
         </el-button>
       </el-col>
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
@@ -178,50 +178,42 @@
       <el-scrollbar style="height: 692px;">
         <h3>选择分配域名:</h3>
         <el-divider></el-divider>
-        <el-form :model="dialog.company.queryParams" ref="companyQueryForm" :inline="true" label-width="68px">
-          <el-form-item label="公司名称" prop="companyName">
-            <el-input
-              v-model="dialog.company.queryParams.companyName"
-              placeholder="请输入销售公司名称"
-              clearable
-              size="small"
-              @keyup.enter.native="handleQuery"
-            />
-          </el-form-item>
-          <el-form-item label="域名" prop="domain">
-            <el-input
-              v-model="dialog.company.queryParams.domain"
-              placeholder="请输入域名名称"
-              clearable
-              size="small"
-              @keyup.enter.native="handleQuery"
-            />
-          </el-form-item>
-          <el-form-item>
-            <el-button type="primary" icon="el-icon-search" size="mini" @click="companyHandleDialogQuery">搜索
-            </el-button>
-            <el-button icon="el-icon-refresh" size="mini" @click="companyResetQuery">重置</el-button>
-          </el-form-item>
-        </el-form>
-        <el-table border v-loading="dialog.company.loading" :data="dialog.company.companyList"
-                  @selection-change="handleCompanySelectionChange"
-        >
-          <el-table-column type="selection" width="55" align="center"/>
-          <el-table-column label="编码" align="center" prop="id"/>
-          <el-table-column label="绑定域名" align="center" prop="domain"/>
-        </el-table>
+<!--        <el-form :model="dialog.company.queryParams" ref="companyQueryForm" :inline="true" label-width="68px">-->
+<!--          <el-form-item label="公司名称" prop="companyName">-->
+<!--            <el-input-->
+<!--              v-model="dialog.company.queryParams.companyName"-->
+<!--              placeholder="请输入销售公司名称"-->
+<!--              clearable-->
+<!--              size="small"-->
+<!--              @keyup.enter.native="handleQuery"-->
+<!--            />-->
+<!--          </el-form-item>-->
+<!--          <el-form-item label="域名" prop="domain">-->
+<!--            <el-input-->
+<!--              v-model="dialog.company.queryParams.domain"-->
+<!--              placeholder="请输入域名名称"-->
+<!--              clearable-->
+<!--              size="small"-->
+<!--              @keyup.enter.native="handleQuery"-->
+<!--            />-->
+<!--          </el-form-item>-->
+<!--          <el-form-item>-->
+<!--            <el-button type="primary" icon="el-icon-search" size="mini" @click="companyHandleDialogQuery">搜索-->
+<!--            </el-button>-->
+<!--            <el-button icon="el-icon-refresh" size="mini" @click="companyResetQuery">重置</el-button>-->
+<!--          </el-form-item>-->
+<!--        </el-form>-->
         <el-row :span="24">
-          <el-col :span="3">
-            <span style="margin-top: 100px">已选中绑定公司:{{ dialog.company.ids.length }}条</span>
-          </el-col>
-          <el-col :span="20">
-            <pagination
-              v-show="dialog.company.total>0"
-              :total="dialog.company.total"
-              :page.sync="dialog.company.queryParams.pageNum"
-              :limit.sync="dialog.company.queryParams.pageSize"
-              @pagination="getCompanyList()"
-            />
+          <el-col :span="24">
+            <span>选择域名:</span>
+            <el-select v-model="dialog.company.domainId" filterable placeholder="请选择" @change="domainChange">
+              <el-option
+                v-for="item in dialog.company.companyList"
+                :key="item.id"
+                :label="item.domain"
+                :value="item.id">
+              </el-option>
+            </el-select>
           </el-col>
         </el-row>
         <el-divider></el-divider>
@@ -299,7 +291,7 @@ import {
   exportCompanyDomainBind,
   domainBatchBinding
 } from '@/api/company/companyDomainBind'
-import { listCompanyUser } from '@/api/company/companyUser'
+import { getCompanyUserListPage } from '@/api/company/companyUser'
 import companyBindUser from '@/views/company/companyBindUser/index.vue'
 
 export default {
@@ -388,7 +380,8 @@ export default {
           // 总条数
           total: 0,
           //选中数组
-          ids: []
+          ids: [],
+          domainId:null,
         }
       },
       bindingDetailsOpen: false,
@@ -420,6 +413,15 @@ export default {
     }
   },
   methods: {
+    domainChange(){
+      if(this.dialog.company.domainId){
+        this.dialog.company.ids.push(this.dialog.company.domainId);
+      }
+    },
+    //判断勾选
+    selectable(row, index) {
+      return this.displayBoolean;
+    },
     handleClose(done) {
       this.$confirm('确认关闭?')
         .then(_ => {
@@ -585,7 +587,7 @@ export default {
     /** 查询域名管路列表 */
     getDialogList() {
       this.dialog.companyUser.loading = true
-      listCompanyUser(this.dialog.companyUser.queryParams).then(response => {
+      getCompanyUserListPage(this.dialog.companyUser.queryParams).then(response => {
         this.dialog.companyUser.companyDomainList = response.rows
         this.dialog.companyUser.total = response.total
         this.dialog.companyUser.loading = false
@@ -598,6 +600,7 @@ export default {
     // 多选框选中数据
     handleCompanySelectionChange(selection) {
       this.dialog.company.ids = selection.map(item => item.id)
+      this.displayBoolean = this.dialog.company.ids.length <= 0;
     },
     /** 查询企业列表 */
     getCompanyList() {
@@ -615,6 +618,7 @@ export default {
       this.dialog.companyUser.queryParams.domain = null
       this.dialog.company.ids = []
       this.dialog.company.queryParams.companyName = null
+      this.dialog.company.domainId = null;
     },
     //绑定提交
     bindSubmission() {
@@ -636,6 +640,8 @@ export default {
     //处理绑定
     handleBindingOpen() {
       this.bindingOpen = !this.bindingOpen
+      this.dialog.company.queryParams.pageNum=null;
+      this.dialog.company.queryParams.pageSize=null;
       this.getDialogList()
       this.getCompanyList()
     },

+ 4 - 3
src/views/components/course/userCourseCatalogDetails.vue

@@ -118,6 +118,7 @@
             type="text"
             icon="el-icon-edit"
             @click="handleComment(scope.row)"
+            v-hasPermi="['course:courseWatchComment:list']"
           >查看评论</el-button>
           <el-button
             size="mini"
@@ -145,9 +146,9 @@
         <el-form-item label="视频描述" prop="description">
           <el-input v-model="form.description" type="textarea" :rows="2"  placeholder="请输入内容" />
         </el-form-item>
-        <el-form-item label="轮次" prop="round">
-          <el-input v-model="form.round"  placeholder="请输入内容" />
-        </el-form-item>
+<!--        <el-form-item label="轮次" prop="round">-->
+<!--          <el-input v-model="form.round"  placeholder="请输入内容" />-->
+<!--        </el-form-item>-->
         <el-form-item label="课程排序" prop="courseSort">
           <el-input-number v-model="form.courseSort" :min="1" ></el-input-number>
         </el-form-item>

+ 1 - 1
src/views/components/his/followMsgDetails.vue

@@ -173,7 +173,7 @@
         <el-descriptions-item label="问诊备注"><span v-if="reportItem!=null">{{reportItem.companyUserRemark}}</span></el-descriptions-item>
       </el-descriptions>
       <div class="desct">
-        患者信息
+        ${process.env.VUE_APP_VIDEO_LINE_1}
       </div>
       <el-descriptions :column="3" border  >
         <el-descriptions-item label="患者姓名" ><span v-if="reportItem.patientJson!=null">{{JSON.parse(reportItem.patientJson).patientName}}</span></el-descriptions-item>

+ 8 - 1
src/views/components/his/inquiryOrderReportDetails.vue

@@ -27,7 +27,13 @@
         </el-descriptions>
   </div>
   <div class="contentx" v-if="item!=null">
-        <div class="desct" > 患者信息</div>
+        <div class="desct" > 
+          <span v-if="patientInfo">
+            {{ patientInfo }}
+          </span>
+          <span v-else>
+            患者信息
+          </span></div>
         <el-descriptions title="" :column="3" border>
           <el-descriptions-item label="患者姓名" ><span v-if="item!=null">{{JSON.parse(item.patientJson).patientName}}</span></el-descriptions-item>
           <el-descriptions-item label="患者年龄" ><span v-if="item!=null">{{JSON.parse(item.patientJson).age}}</span></el-descriptions-item>
@@ -88,6 +94,7 @@ import { listBySearch } from "@/api/his/inquiryDisease";
     props:["data"],
     data() {
       return {
+        patientInfo: process.env.VUE_APP_PATIENT_INFO,
         diseaseParams:{
           diseaseId:null,
           diseaseName:null

+ 7 - 1
src/views/components/his/msgDetails.vue

@@ -173,7 +173,12 @@
         <el-descriptions-item label="问诊备注"><span v-if="reportItem!=null">{{reportItem.companyUserRemark}}</span></el-descriptions-item>
       </el-descriptions>
       <div class="desct">
-        患者信息
+        <span v-if="patientInfo">
+            {{ patientInfo }}
+          </span>
+          <span v-else>
+            患者信息
+          </span>
       </div>
       <el-descriptions :column="3" border  >
        <el-descriptions-item label="患者姓名" ><span v-if="reportItem.patientJson!=null">{{JSON.parse(reportItem.patientJson).patientName}}</span></el-descriptions-item>
@@ -263,6 +268,7 @@ import {getPrescribe,getDrugInfo} from "@/api/his/prescribe";
     name: "MsgList",
     data() {
       return {
+        patientInfo: process.env.VUE_APP_PATIENT_INFO,
         usageJson:{},
         prescribeItem:{},
         statusDrugReportOptions:[],

+ 1 - 1
src/views/components/his/packageOrderDetails.vue

@@ -22,7 +22,7 @@
                      <el-button size="mini" @click="orderRefund()" v-hasPermi="['his:packageOrder:refund']">全部退款 </el-button>
                   </div> -->
 
-                  <div class="operate-button-container" v-if="item.status==2 &&item.packageSubType==1 && item.inquiryRefundStatus==0" >
+                  <div class="operate-button-container" v-if="item.status==2 &&item.packageSubType==1 && (item.inquiryRefundStatus==0 || item.inquiryRefundStatus == null)" >
                      <el-button size="mini" @click="inquiryOrderRefund()" v-hasPermi="['his:packageOrder:inquiryRefund']">问诊退款</el-button>
                   </div>
 

+ 9 - 1
src/views/components/his/testReportDetails.vue

@@ -17,7 +17,14 @@
         </el-descriptions>
   </div>
   <div class="contentx" v-if="patientJson!=null">
-        <div class="desct" > 患者信息</div>
+        <div class="desct" > 
+          <span v-if="patientInfo">
+            {{ patientInfo }}
+          </span>
+          <span v-else>
+            患者信息
+          </span>
+        </div>
         <el-descriptions title="" :column="3" border >
             <el-descriptions-item label="患者名称"><span >{{patientJson.name}}</span></el-descriptions-item>
             <el-descriptions-item label="患者性别">
@@ -48,6 +55,7 @@ import { listTestReport, getTestReport, delTestReport, addTestReport, updateTest
     props:["data"],
     data() {
       return {
+        patientInfo: process.env.VUE_APP_PATIENT_INFO,
         item:null,
         formJson:null,
         conditioningPlanJson:null,

+ 2 - 1
src/views/components/his/userAddDetails.vue

@@ -115,6 +115,8 @@ export default {
       open: false,
       cityIds:null,
       address:null,
+      citys:[],
+
       // 查询参数
       queryParams: {
         pageNum: 1,
@@ -179,7 +181,6 @@ export default {
     });
   },
   methods: {
-     citys:[],
     /** 查询用户地址列表 */
     getList() {
       this.loading = true;

+ 9 - 1
src/views/components/his/userDetails.vue

@@ -1,9 +1,11 @@
 <template>
 
 <div style="background-color: #f0f2f5; padding-bottom: 20px; min-height: 100%; " >
+<!--
   <div style="padding: 20px; background-color: #fff;">
     会员详情
   </div>
+-->
 
   <div class="contentx" v-if="item!=null" >
     <div class="desct">
@@ -101,7 +103,12 @@
 
   <div class="contentx" v-if="item!=null">
         <div class="desct">
-          患者信息
+          <span v-if="patientInfo">
+            {{ patientInfo }}
+          </span>
+          <span v-else>
+            患者信息
+          </span>
         </div>
     <userPatietDetails  ref="userPatietDetail" />
 
@@ -145,6 +152,7 @@ import userAddDetails from "../his/userAddDetails.vue";
      components: { userStorerDetails ,userInquiryOrderDetails,userPatietDetails,userAddDetails},
     data() {
       return {
+        patientInfo: process.env.VUE_APP_PATIENT_INFO,
         addr:[],
         patient:[],
         userOptions: [],

+ 11 - 10
src/views/components/his/userPatietDetails.vue

@@ -176,6 +176,7 @@ export default {
   name: "Patient",
   data() {
     return {
+      addPatientInfo: process.env.VUE_APP_ADD_PATIENT,
       show:{
          title:"患者详情",
          open:false,
@@ -235,20 +236,20 @@ export default {
         patientName: [
           { required: true, message: "名称不能为空", trigger: "blur" }
         ],
-        idCard: [
-          { required: true, message: "身份证号不能为空", trigger: "blur" },
+        // idCard: [
+        //   { required: true, message: "身份证号不能为空", trigger: "blur" },
 
-        ],
+        // ],
         sex: [
           { required: true, message: "性别不能为空", trigger: "blur" }
 
         ],
-        birthday: [
-          { required: true, message: "生日不能为空", trigger: "blur" }
-        ],
-        mobile:[
-          { required: true, message: "手机号不能为空", trigger: "blur" },
-        ],
+        // birthday: [
+        //   { required: true, message: "生日不能为空", trigger: "blur" }
+        // ],
+        // mobile:[
+        //   { required: true, message: "手机号不能为空", trigger: "blur" },
+        // ],
         status: [
           { required: true, message: "状态不能为空", trigger: "blur" }
         ],
@@ -355,7 +356,7 @@ export default {
     handleAdd() {
       this.reset();
       this.open = true;
-      this.title = "添加病人";
+      this.title = this.addPatientInfo||"添加病人";
     },
     /** 修改按钮操作 */
     handleUpdate(row) {

+ 19 - 42
src/views/course/courseWatchLog/index.vue

@@ -1,31 +1,6 @@
 <template>
   <div class="app-container">
     <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="100px">
-      <el-form-item label="用户" prop="userId">
-        <el-select v-model="queryParams.userId" remote placeholder="用户名/手机号" filterable clearable  style="width: 100%;"
-                   @keyup.enter.native="handleQuery"
-                   :remote-method="remoteGetFsUserList"
-                   @clear="handleClear"
-                   :loading="queryUserLoading"
-        >
-          <el-option
-            v-for="dict in fsUserList"
-            :key="`${dict.nickname} - ${dict.phone}`"
-            :label="`${dict.nickname} - ${dict.phone}`"
-            :value="dict.userId">
-          </el-option>
-        </el-select>
-      </el-form-item>
-      <el-form-item label="所属销售" prop="companyUserName">
-        <el-select v-model="queryParams.companyUserId" remote placeholder="请选择" filterable clearable  style="width: 100%;" @keyup.enter.native="handleQuery">
-          <el-option
-            v-for="dict in companyUserList"
-            :key="`${dict.nickName} - ${dict.userName}`"
-            :label="`${dict.nickName} - ${dict.userName}`"
-            :value="dict.userId">
-          </el-option>
-        </el-select>
-      </el-form-item>
       <el-form-item label="课程" prop="courseId">
         <el-select filterable  v-model="queryParams.courseId" placeholder="请选择课程"  clearable size="small" @change="courseChange(queryParams.courseId)">
           <el-option
@@ -68,16 +43,7 @@
                         range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期" @change="updateChange"></el-date-picker>
       </el-form-item>
 
-      <el-form-item label="类型" prop="type">
-        <el-select filterable  v-model="sourceTypeModel" placeholder="请选择小节"  clearable size="small">
-          <el-option
-            v-for="dict in userSourceTypeOptions"
-            :key="dict.dictValue"
-            :label="dict.dictLabel"
-            :value="dict.dictValue"
-          />
-        </el-select>
-      </el-form-item>
+
       <el-form-item>
         <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
@@ -106,8 +72,23 @@
     <el-table border v-loading="loading" :data="courseWatchLogList" @selection-change="handleSelectionChange">
       <el-table-column type="selection" width="55" align="center" />
       <el-table-column label="记录编号" align="center" prop="logId" />
-      <el-table-column label="用户账号" align="center" prop="userName" />
-      <el-table-column label="企微客户" align="center" prop="externalUserName" v-if="queryParams.sourceType == 2"/>
+      <el-table-column label="用户账号" align="center" prop="qwUserName" />
+      <el-table-column label="企微客户" align="center" prop="externalUserName">
+        <template slot-scope="scope">
+          <div style="display: flex;white-space: nowrap">
+            <div style="margin: auto">
+              {{scope.row.externalUserName}}
+            </div>
+            <el-popover
+              placement="right"
+              title=""
+              trigger="hover">
+              <img slot="reference" :src="scope.row.externalUserAvatar" style="width: 30px;height: 30px">
+              <img :src="scope.row.externalUserAvatar" style="max-width: 200px;max-height: 200px">
+            </el-popover>
+          </div>
+        </template>
+      </el-table-column>
       <el-table-column label="会员昵称" align="center" prop="fsNickName">
         <template slot-scope="scope">
           <div style="display: flex;white-space: nowrap">
@@ -235,11 +216,7 @@ export default {
     this.getDicts("sys_course_watch_log_type").then(response => {
       this.logTypeOptions = response.data;
     });
-    getUserList().then(res=>{
-      if(res.code === 200) {
-        this.companyUserList = res.data
-      }
-    })
+
 
     this.getDicts('user_source_type').then(response => {
       this.userSourceTypeOptions = response.data;

+ 46 - 1
src/views/course/userCourse/index.vue

@@ -31,6 +31,16 @@
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
+      <el-form-item label="关联的公司" prop="companyIds">
+        <el-select v-model="queryParams.companyIdsList" multiple placeholder="请选择公司" filterable clearable style="width: 90%;">
+          <el-option
+            v-for="dict in companyOptions"
+            :key="dict.dictValue"
+            :label="dict.dictLabel"
+            :value="dict.dictValue"
+          />
+        </el-select>
+      </el-form-item>
       <el-form-item label="课堂类型" prop="isPrivate" style="display: none">
         <el-select v-model="queryParams.isPrivate" placeholder="请选择" clearable size="small">
           <el-option
@@ -135,6 +145,14 @@
             v-hasPermi="['course:userCourse:edit']"
           >修改
           </el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleCopy(scope.row)"
+            v-hasPermi="['course:userCourse:copy']"
+          >复制
+          </el-button>
           <el-button
             size="mini"
             type="text"
@@ -202,6 +220,13 @@
             </el-form-item>
           </el-col>
         </el-row>
+        <el-row>
+          <el-col :span="24">
+            <el-form-item label="排序" prop="sort">
+                          <el-input-number v-model="form.sort"  :min="0"  label="排序"></el-input-number>
+            </el-form-item>
+          </el-col>
+        </el-row>
         <el-row>
           <el-col :span="24">
             <el-form-item label="课堂简介" prop="description">
@@ -209,6 +234,9 @@
             </el-form-item>
           </el-col>
         </el-row>
+        <el-form-item label="排序" prop="sort">
+          <el-input-number v-model="form.sort"  :min="0" label="请输入排序"></el-input-number>
+        </el-form-item>
         <el-form-item label="课程封面" prop="imgUrl">
           <ImageUpload v-model="form.imgUrl" type="image" :num="10" :width="150" :height="150"/>
         </el-form-item>
@@ -246,6 +274,7 @@ import {
   updateUserCourse,
   exportUserCourse,
   updateIsShow,
+  copyUserCourse,
   putOn,
   pullOff
 } from "@/api/course/userCourse";
@@ -331,7 +360,8 @@ export default {
         hotRanking: null,
         integral: null,
         price: null,
-        isPrivate: 1
+        isPrivate: 1,
+        companyIdsList:[],
       },
       // 表单参数
       form: {},
@@ -627,6 +657,21 @@ export default {
         }
       });
     },
+    /** 复制按钮操作 */
+    handleCopy(row) {
+      const courseId = row.courseId;
+      this.$confirm('是否确认复制课程编号为"' + courseId + '"的数据项?', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(function () {
+        return copyUserCourse(courseId);
+      }).then(() => {
+        this.getList();
+        this.msgSuccess("复制成功");
+      }).catch(() => {
+      });
+    },
     /** 删除按钮操作 */
     handleDelete(row) {
       const courseIds = row.courseId || this.ids;

+ 139 - 37
src/views/course/userCourseComplaintRecord/index.vue

@@ -87,6 +87,13 @@
 <!--            @click="handleDelete(scope.row)"-->
 <!--            v-hasPermi="['course:userCourseComplaintRecord:remove']"-->
 <!--          >删除</el-button>-->
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-info"
+            @click="handleDetails(scope.row)"
+            v-hasPermi="['course:userCourseComplaintRecord:edit']"
+          >详情</el-button>
           <el-button
             size="mini"
             type="text"
@@ -106,32 +113,55 @@
       @pagination="getList"
     />
 
-    <!-- 添加或修改看课投诉记录对话框 -->
-<!--    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>-->
-<!--      <el-form ref="form" :model="form" :rules="rules" label-width="80px">-->
-<!--        <el-form-item label="用户昵称" prop="nickName">-->
-<!--          <el-input v-model="form.nickName" placeholder="请输入用户昵称" />-->
-<!--        </el-form-item>-->
-<!--        <el-form-item label="投诉类型" prop="complaintTypeName">-->
-<!--          <el-input v-model="form.complaintTypeName" placeholder="请输入投诉类型" />-->
+<!--     投诉记录详情对话框-->
+    <el-dialog :title="title" :visible.sync="open" width="600px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="100px">
+        <el-form-item label="用户昵称" prop="nickName">
+          <el-input v-model="form.nickName" readonly />
+        </el-form-item>
+        <el-form-item label="投诉类型" prop="complaintTypeName">
+          <el-input v-model="form.complaintTypeName" readonly />
+        </el-form-item>
+        <el-form-item label="投诉内容" prop="complaintContent">
+          <el-input v-model="form.complaintContent" type="textarea" :rows="4" readonly />
+        </el-form-item>
+        <el-form-item label="投诉上传图片">
+          <div v-if="imageList.length > 0" class="image-preview-container">
+            <div v-for="(imageUrl, index) in imageList" :key="index" class="image-item">
+              <el-image
+                :src="imageUrl"
+                :preview-src-list="imageList"
+                fit="cover"
+                class="preview-image"
+                @click="previewImage(index)"
+              >
+                <div slot="error" class="image-slot">
+                  <i class="el-icon-picture-outline"></i>
+                </div>
+              </el-image>
+            </div>
+          </div>
+          <span v-else class="no-image-text">暂无图片</span>
+        </el-form-item>
+        <el-form-item label="所属课程" prop="courseName">
+          <el-input v-model="form.courseName" readonly />
+        </el-form-item>
+        <el-form-item label="所属小节" prop="title">
+          <el-input v-model="form.title" readonly />
+        </el-form-item>
+<!--        <el-form-item label="创建时间" prop="createTime">-->
+<!--          <el-input v-model="form.createTime" readonly />-->
 <!--        </el-form-item>-->
-<!--        <el-form-item label="所属课程" prop="courseName">-->
-<!--          <el-input v-model="form.courseName" placeholder="请输入所属课程" />-->
-<!--        </el-form-item>-->
-<!--        <el-form-item label="所属小节" prop="title">-->
-<!--          <el-input v-model="form.title" placeholder="请输入所属小节" />-->
-<!--        </el-form-item>-->
-<!--      </el-form>-->
-<!--      <div slot="footer" class="dialog-footer">-->
-<!--        <el-button type="primary" @click="submitForm">确 定</el-button>-->
-<!--        <el-button @click="cancel">取 消</el-button>-->
-<!--      </div>-->
-<!--    </el-dialog>-->
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="cancel">关 闭</el-button>
+      </div>
+    </el-dialog>
   </div>
 </template>
 
 <script>
-import { listUserCourseComplaintRecord, delUserCourseComplaintRecord, exportUserCourseComplaintRecord } from "@/api/course/userCourseComplaintRecord";
+import { listUserCourseComplaintRecord, delUserCourseComplaintRecord, exportUserCourseComplaintRecord, getUserCourseComplaintRecord } from "@/api/course/userCourseComplaintRecord";
 import { addBlack } from "@/api/course/courseWatchComment";
 export default {
   name: "UserCourseComplaintRecord",
@@ -157,6 +187,8 @@ export default {
       title: "",
       // 是否显示弹出层
       open: false,
+      // 图片列表
+      imageList: [],
       // 查询参数
       queryParams: {
         pageNum: 1,
@@ -199,15 +231,17 @@ export default {
         recordId: null,
         nickName: null,
         complaintTypeName: null,
+        complaintContent: null,
+        complaintUrl: null,
         courseName: null,
         title: null,
-        createTime: null
-        // userId: null,
-        // complaintTypeId: null,
-        // complaintContent: null,
-        // courseId: null,
-        // videoId: null,
+        createTime: null,
+        userId: null,
+        complaintTypeId: null,
+        courseId: null,
+        videoId: null,
       };
+      this.imageList = [];
       this.resetForm("form");
     },
     /** 搜索按钮操作 */
@@ -232,16 +266,29 @@ export default {
     //   this.open = true;
     //   this.title = "添加看课投诉记录";
     // },
-    // /** 修改按钮操作 */
-    // handleUpdate(row) {
-    //   this.reset();
-    //   const recordId = row.recordId || this.ids
-    //   getUserCourseComplaintRecord(recordId).then(response => {
-    //     this.form = response.data;
-    //     this.open = true;
-    //     this.title = "修改看课投诉记录";
-    //   });
-    // },
+    /** 详情按钮操作 */
+    handleDetails(row) {
+      this.reset();
+      const recordId = row.recordId || this.ids
+      getUserCourseComplaintRecord(recordId).then(response => {
+        this.form = response.data;
+        // 处理多个图片URL,通过逗号分割
+        if (this.form.complaintUrl) {
+          this.imageList = this.form.complaintUrl.split(',').filter(url => url.trim() !== '');
+        } else {
+          this.imageList = [];
+        }
+        this.open = true;
+        this.title = "看课投诉记录详情";
+      }).catch(error => {
+        console.error('获取详情失败:', error);
+        this.msgError("获取详情失败,请稍后重试");
+      });
+    },
+    /** 预览图片 */
+    previewImage(index) {
+      // Element UI的图片组件会自动处理预览
+    },
     // /** 提交按钮 */
     // submitForm() {
     //   this.$refs["form"].validate(valid => {
@@ -315,3 +362,58 @@ export default {
   }
 };
 </script>
+
+<style scoped>
+.image-preview-container {
+  display: flex;
+  flex-wrap: wrap;
+  gap: 10px;
+}
+
+.image-item {
+  width: 100px;
+  height: 100px;
+  border: 1px solid #dcdfe6;
+  border-radius: 6px;
+  overflow: hidden;
+  cursor: pointer;
+}
+
+.preview-image {
+  width: 100%;
+  height: 100%;
+}
+
+.image-slot {
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  width: 100%;
+  height: 100%;
+  background: #f5f7fa;
+  color: #909399;
+  font-size: 20px;
+}
+
+.no-image-text {
+  color: #909399;
+  font-size: 14px;
+}
+
+/* 只读表单样式优化 */
+.el-input.is-disabled .el-input__inner,
+.el-input__inner[readonly] {
+  background-color: #f5f7fa;
+  border-color: #e4e7ed;
+  color: #606266;
+  cursor: not-allowed;
+}
+
+.el-textarea.is-disabled .el-textarea__inner,
+.el-textarea__inner[readonly] {
+  background-color: #f5f7fa;
+  border-color: #e4e7ed;
+  color: #606266;
+  cursor: not-allowed;
+}
+</style>

+ 70 - 24
src/views/course/userCoursePeriod/index.vue

@@ -266,7 +266,6 @@
         </el-form-item>
         <el-form-item label="开营日期" prop="periodStartingTime">
           <el-date-picker
-            :disabled = "isDisabledDateRange"
             :style="{display: form.periodType == 1 ? '' : 'none !important'}"
             v-model="form.dateRange"
             @change="timeChange(1)"
@@ -497,6 +496,17 @@
                 v-hasPermi="['course:period:updateCourseTime']"
               >修改看课时间</el-button>
             </el-col>
+
+            <el-col :span="1.5">
+              <el-button
+                type="warning"
+                size="mini"
+                icon="el-icon-delete"
+                :disabled="updateCourse.ids.length <= 0"
+                @click="handleDeleteCourse"
+                v-hasPermi="['course:period:dayRemove']"
+              >删除课程</el-button>
+            </el-col>
           </el-row>
           <el-table ref="courseTable" v-loading="course.loading" :data="course.list" @selection-change="handleSelectionCourseChange" border>
             <el-table-column type="selection" width="55" align="center" />
@@ -541,6 +551,13 @@
                 icon="el-icon-edit"
                 @click="handleUpdateDate(scope.row)"
               >修改营期时间</el-button>
+                <el-button
+                  size="mini"
+                  type="text"
+                  icon="el-icon-delete"
+                  @click="handleDeleteCourse(scope.row)"
+                  v-hasPermi="['course:period:dayRemove']"
+                >删除课程</el-button>
               </template>
             </el-table-column>
           </el-table>
@@ -581,7 +598,7 @@
 </template>
 
 <script>
-import {addPeriod, delPeriod, exportPeriod, getPeriod, pagePeriod, updatePeriod, getDays, addCourse, updateCourseTime, updateCourseDate, updateListCourseData, periodCourseMove, closePeriod} from "@/api/course/userCoursePeriod";
+import {addPeriod, delPeriod, exportPeriod, getPeriod, pagePeriod, updatePeriod, getDays, addCourse,delPeriodDay,  updateCourseTime, updateCourseDate, updateListCourseData, periodCourseMove, closePeriod} from "@/api/course/userCoursePeriod";
 import {getCompanyList} from "@/api/company/company";
 import { listCamp, addCamp, editCamp, delCamp, copyCamp } from "@/api/course/userCourseCamp";
 import { courseList,videoList } from '@/api/course/courseRedPacketLog'
@@ -821,6 +838,28 @@ export default {
 
   },
   methods: {
+    /** 删除按钮操作 */
+    async handleDeleteCourse(row) {
+      const periodDayIds = row.id || this.updateCourse.ids;
+      try {
+        await this.$confirm('是否确认删除该课程?', "提示", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        });
+
+        const res = await delPeriodDay(periodDayIds);
+
+        if (res && res.code === 200) {
+          this.getCourseList();// 刷新列表
+          this.$message.success('删除成功');
+        } else {
+          this.$message.error(res.msg);
+        }
+      } catch (error) {
+
+      }
+    },
     /** 查询会员营期列表 */
     getList() {
       this.loading = true;
@@ -917,10 +956,10 @@ export default {
           this.form.timeRange = [this.form.viewStartTime, this.form.viewEndTime];
         }
         if(this.form.periodType == 1){
-          this.form.dateRange = [this.form.periodStartingTime, this.form.periodEndTime];
+          this.$set(this.form,'dateRange',[this.form.periodStartingTime, this.form.periodEndTime])
         }
         if(this.form.periodType == 2){
-          this.form.date = this.form.periodStartingTime;
+          this.$set(this.form,'date',this.form.periodStartingTime)
         }
         this.open = true;
         this.title = "修改会员营期";
@@ -960,24 +999,27 @@ export default {
       });
     },
     /** 删除按钮操作 */
-    handleDelete(row) {
-      //添加删除判断,只能删除未开始的营期
-      console.log(row.periodStatus)
-      if(row.periodStatus !== 1){
-        this.$message.error('营期处于进行中或者结束,不能删除');
-        return;
-      }
+    async handleDelete(row) {
       const periodIds = row.periodId || this.ids;
-      this.$confirm('是否确认删除该营期?', "提示", {
+
+      try {
+        await this.$confirm('是否确认删除该营期?', "提示", {
           confirmButtonText: "确定",
           cancelButtonText: "取消",
           type: "warning"
-        }).then(function() {
-          return delPeriod(periodIds);
-        }).then(() => {
-          this.getList();
-          this.msgSuccess("删除成功");
-        }).catch(function() {});
+        });
+
+        const res = await delPeriod(periodIds);
+
+        if (res && res.code === 200) {
+          this.getList(); // 刷新列表
+          this.$message.success('删除成功');
+        } else {
+          this.$message.error(res.msg);
+        }
+      } catch (error) {
+
+      }
     },
     /** 导出按钮操作 */
     handleExport() {
@@ -1091,7 +1133,7 @@ export default {
           }
           this.leftLoading = false;
         }).catch(error => {
-          this.$message.error('删除失败: ' + error.message);
+          // this.$message.error('删除失败: ' + error.message);
           this.leftLoading = false;
         });
       }).catch(() => {
@@ -1294,19 +1336,23 @@ export default {
         this.loadingMore = false;
       });
     },
-    timeChange(type){
-      if(type == 1){
+    timeChange(type) {
+      if (type == 1) {
         this.form.periodStartingTime = this.form.dateRange[0];
         this.form.periodEndTime = this.form.dateRange[1];
-         // 转换为天数
+        if (!Array.isArray(this.form.days)) {
+          this.form.days = [];
+        }
+        this.form.days = [];
         let days = this.getDiff(this.form.periodStartingTime, this.form.periodEndTime);
         for (let i = 0; i < days; i++) {
-          this.form.days.push({lesson: i + 1});
+          this.form.days.push({ lesson: i + 1 });
         }
       }
-      if(type == 2){
+      if (type == 2) {
         this.form.periodStartingTime = this.form.date;
         this.form.periodEndTime = this.form.date;
+        this.form.days = [];
       }
     },
     getDiff(start, end) {

+ 101 - 10
src/views/course/userTalent/index.vue

@@ -19,6 +19,28 @@
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
+      <el-form-item label="所属公司" prop="companyIds" >
+        <el-select
+          v-model="companyIds"
+          filterable
+          multiple
+          remote
+          reserve-keyword
+          placeholder="请输入关键字搜索"
+          :remote-method="fetchCompanies"
+          :loading="loadingCompanies"
+          size="small"
+          @change="formatCompanies"
+          style="width: 180px"
+        >
+          <el-option
+            v-for="company in companyOptions"
+            :key="company.companyId"
+            :label="company.companyName"
+            :value="company.companyId"
+          />
+        </el-select>
+      </el-form-item>
 
       <el-form-item>
         <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
@@ -141,7 +163,7 @@
         </template>
       </el-table-column>
     </el-table>
-    
+
     <pagination
       v-show="total>0"
       :total="total"
@@ -151,15 +173,15 @@
     />
 
     <!-- 添加或修改达人对话框 -->
-    <el-dialog :title="title" :visible.sync="open" width="1000px" append-to-body>
+    <el-dialog :title="title" :visible.sync="open" width="1000px" append-to-body @close="handleClose">>
       <el-form ref="form" :model="form" :rules="rules" label-width="80px">
-        <el-row>
-          <el-col :span="8">
+        <el-row :gutter="20">
+          <el-col :span="12">
             <el-form-item label="昵称" prop="nickName">
               <el-input v-model="form.nickName" placeholder="请输入昵称" />
             </el-form-item>
           </el-col>
-          <el-col :span="8">
+          <el-col :span="12">
             <el-form-item label="性别" prop="sex">
               <el-select v-model="form.sex" placeholder="性别" clearable size="small">
                 <el-option
@@ -171,7 +193,9 @@
               </el-select>
             </el-form-item>
           </el-col>
-          <el-col :span="8">
+        </el-row>
+        <el-row :gutter="20">
+          <el-col :span="12">
             <el-form-item label="关联用户" prop="userId" >
               <el-select v-model="form.userId" remote filterable reserve-keyword placeholder="输入手机号搜索" @change="selectUser" :remote-method="userMethod" >
                 <el-option
@@ -186,6 +210,25 @@
               </el-select>
             </el-form-item>
           </el-col>
+          <el-col :span="12">
+            <el-form-item label="关联公司" prop="companyId" >
+              <el-select v-model="form.companyId"
+                         remote
+                         filterable
+                         reserve-keyword
+                         placeholder="输入公司名称搜索"
+                         :remote-method="fetchCompanies" >
+                <el-option
+                  v-for="item in companyOptions"
+                  :key="item.companyId"
+                  :label="item.companyId"
+                  :value="item.companyId">
+                  <span style="float: left">{{ item.companyId }}</span>
+                  <span style="margin-left: 30px ;">{{item.companyName}}</span>
+                </el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
         </el-row>
 
         <el-form-item label="头像" prop="avatar">
@@ -194,8 +237,8 @@
         <el-form-item label="标题" prop="title">
           <el-input v-model="form.title" type="textarea" placeholder="请输入内容" />
         </el-form-item>
-        
-        
+
+
         <el-row>
           <el-col :span="8">
             <el-form-item label="获赞数" prop="likes">
@@ -262,7 +305,16 @@
 </template>
 
 <script>
-import { listUserTalent, getUserTalent, delUserTalent, addUserTalent, updateUserTalent, exportUserTalent,auditUserTalent } from "@/api/course/userTalent";
+import {
+  listUserTalent,
+  getUserTalent,
+  delUserTalent,
+  addUserTalent,
+  updateUserTalent,
+  exportUserTalent,
+  auditUserTalent,
+  getCompanies
+} from '@/api/course/userTalent'
 import { listBySearch} from "@/api/his/user";
 import ImageUpload from '@/components/ImageUpload/index';
 import VideoUpload from '@/components/VideoUpload/index';
@@ -302,6 +354,8 @@ export default {
       },
       userList:[],
       tagsOptions:[],
+      companyOptions:[],
+      loadingCompanies: false, // 加载状态
       tags:[],
       sexOptions:[],
       // 遮罩层
@@ -339,8 +393,11 @@ export default {
         fans: null,
         likes: null,
         isDel: null,
-        isAudit:0
+        isAudit:0,
+        //销售公司
+        companyIdStr: null
       },
+      companyIds: [],
       // 表单参数
       form: {},
       // 表单校验
@@ -359,6 +416,9 @@ export default {
         ],
         title: [
           { required: true, message: "标题不能为空", trigger: "blur" }
+        ],
+        companyId: [
+          { required: true, message: "关联公司不能为空", trigger: "change" }
         ]
       }
     };
@@ -379,6 +439,27 @@ export default {
     handleVideoDuration(duration) {
       this.form.videoDuration = duration;
     },
+    async fetchCompanies(query) {
+      if (!query) {
+        this.companyOptions = [];
+        return;
+      }
+      this.loadingCompanies = true;
+      try {
+        getCompanies(query).then(response => {
+          this.companyOptions = response.data;
+        })
+      } catch (err) {
+        console.error('查询销售公司失败:', err);
+        this.companyOptions = [];
+      } finally {
+        this.loadingCompanies = false;
+      }
+    },
+    formatCompanies(){
+      if(this.companyIds)
+      this.queryParams.companyIdStr = this.companyIds.join(',');
+    },
     submitAuditForm(){
       this.$refs["auditForm"].validate(valid => {
         if(valid){
@@ -464,8 +545,14 @@ export default {
     /** 重置按钮操作 */
     resetQuery() {
       this.resetForm("queryForm");
+      this.resetCompany();
       this.handleQuery();
     },
+    resetCompany() {
+      this.companyOptions =  [];
+      this.companyIds = [];
+      this.queryParams.companyIdStr=null;
+    },
     // 多选框选中数据
     handleSelectionChange(selection) {
       this.ids = selection.map(item => item.talentId)
@@ -494,6 +581,10 @@ export default {
         this.title = "修改达人";
       });
     },
+    /**修改页面关闭方法*/
+    handleClose(){
+        this.resetCompany();
+    },
     /** 提交按钮 */
     submitForm() {
       this.$refs["form"].validate(valid => {

+ 75 - 2
src/views/course/videoResource/index.vue

@@ -1046,9 +1046,82 @@ export default {
     },
     //获取第一帧封面
     async getFirstThumbnail(file, form){
-      getThumbnail(file).then(response => {
+      try {
+        //截取小文件
+        const clippedBlob = await this.clipVideoFirstTwoSeconds(file);
+
+        const clippedFile = new File([clippedBlob], 'clipped_video.mp4', {
+          type: 'video/mp4',
+          lastModified: Date.now()
+        });
+        console.log("调用请请求---------------》",response)
+        // 3. 调用接口获取封面
+        const response = await getThumbnail(clippedFile);
+        console.log("获取封面请求---------------》",response)
         form.thumbnail = response.url;
-      })
+      } catch (error) {
+        console.error('获取封面失败:', error);
+      }
+    },
+    //截取大文件视频
+    clipVideoFirstTwoSeconds(file) {
+      return new Promise((resolve, reject) => {
+        // 创建视频元素用于处理
+        const video = document.createElement('video');
+        video.src = URL.createObjectURL(file);
+        video.crossOrigin = 'anonymous';
+        video.preload = 'metadata';
+
+        // 视频元数据加载完成后开始处理
+        video.onloadedmetadata = async () => {
+          try {
+            // 计算截取时长
+            const duration = Math.min(2, video.duration);
+
+            // 直接从视频元素捕获流
+            const stream = video.captureStream();
+
+            // 创建 MediaRecorder 录制截取的片段
+            const mediaRecorder = new MediaRecorder(stream);
+            const chunks = [];
+
+            // 收集录制的视频数据
+            mediaRecorder.ondataavailable = (e) => chunks.push(e.data);
+
+            // 录制结束后处理结果
+            mediaRecorder.onstop = () => {
+              // 合并数据为 Blob(MP4 格式)
+              const blob = new Blob(chunks, { type: 'video/mp4' });
+              resolve(blob);
+
+              // 清理资源
+              URL.revokeObjectURL(video.src);
+              stream.getTracks().forEach(track => track.stop());
+            };
+
+            // 开始录制
+            mediaRecorder.start();
+
+            // 播放视频并在指定时间后停止录制
+            video.currentTime = 0; // 从开头开始
+            video.play();
+
+            // 到达截取时长后停止录制
+            setTimeout(() => {
+              video.pause();
+              mediaRecorder.stop();
+            }, duration * 1000); // 转换为毫秒
+
+          } catch (error) {
+            reject(new Error('视频截取失败: ' + error.message));
+          }
+        };
+
+        // 视频加载错误处理
+        video.onerror = () => {
+          reject(new Error('视频加载失败,请检查文件格式'));
+        };
+      });
     },
     //上传腾讯云Pcdn
     async uploadVideoToTxPcdn(file, form, onProgress) {

+ 5 - 5
src/views/his/company/index.vue

@@ -279,10 +279,10 @@
 <!--                              end: '24:00'-->
 <!--                            }"></el-time-select>-->
 <!--      </el-form-item>-->
-        <el-form-item label="公众号点播配置" prop="courseMaAppId">
+        <el-form-item label="服务号点播配置" prop="courseMaAppId">
           <el-select
             v-model="form.courseMaAppId"
-            placeholder="请选择公众号"
+            placeholder="请选择服务号"
             clearable
             size="small"
           >
@@ -297,7 +297,7 @@
       <el-form-item label="小程序点播配置" prop="courseMiniAppId">
         <el-select
           v-model="form.courseMiniAppId"
-          placeholder="请选择公众号"
+          placeholder="请选择小程序"
           clearable
           size="small"
         >
@@ -692,10 +692,10 @@ export default {
           let value = data?.configValue
           if (value) {
             const appList = JSON.parse(value);
-            this.maAppList = appList.filter(v => v.type === '1').map(v => {
+            this.maAppList = appList.filter(v => v.type === '2').map(v => {
               return { appId: v.appid, appName: v.name }
             })
-            this.miniAppList = appList.filter(v => v.type === '2').map(v => {
+            this.miniAppList = appList.filter(v => v.type === '1').map(v => {
               return { appId: v.appid, appName: v.name }
             })
           }

+ 17 - 12
src/views/his/doctor/type1.vue

@@ -315,7 +315,7 @@
         <el-row>
               <el-col :span="12">
                 <el-form-item label="科室" prop="deptId">
-                <el-select v-model="form.deptId" placeholder="请选择所属科室">
+                <el-select v-model="form.deptId"  placeholder="请选择所属科室">
                       <el-option
                           v-for="dict in depList"
                           :key="dict.dictValue"
@@ -950,9 +950,9 @@ export default {
       this.sexOptions = response.data;
     });
     this.getdeplist();
-	listStore().then(response => {
-	  this.storeOPtions = response.rows;
-	});
+    listStore().then(response => {
+      this.storeOPtions = response.rows;
+    });
     this.getHospitaldeplist();
     getAllFollowDoctorList().then(response => {
 
@@ -1298,9 +1298,9 @@ export default {
         if(this.form.packageIds!=null){
            this.form.packageIds= ((this.form.packageIds).split(",")).map(Number)
         }
-		if(this.form.storeIds!=null){
-		   this.form.storeIds= ((this.form.storeIds).split(",")).map(Number)
-		}
+        if(this.form.storeIds!=null){
+          this.form.storeIds= ((this.form.storeIds).split(",")).map(Number)
+        }
         if(this.form.isSelf!=null){
           this.form.isSelf = String(this.form.isSelf)
         }
@@ -1316,7 +1316,10 @@ export default {
         if(this.form.isPrescribeDoctor!=null){
           this.form.isPrescribeDoctor = String(this.form.isPrescribeDoctor)
         }
-        this.form.cityIds=((this.form.cityIds).split(",")).map(Number)
+        if(this.form.cityIds){
+          this.form.cityIds=((this.form.cityIds).split(",")).map(Number)
+        }
+        
         if(this.form.prescribeDoctorName!=null){
               this.doctorName.name=this.form.prescribeDoctorName;
               this.getlistdocuser();
@@ -1366,15 +1369,17 @@ export default {
     },
     /** 提交按钮 */
     submitForm() {
+      if(this.form.isPrescribeDoctor!=null){
+          this.form.isPrescribeDoctor = String(this.form.isPrescribeDoctor)
+        }
       this.$refs["form"].validate(valid => {
         if (valid) {
           if(this.form.packageIds!=null){
             this.form.packageIds=(this.form.packageIds).toString()
           }
-		  if(this.form.storeIds!=null){
-		    this.form.storeIds=(this.form.storeIds).toString()
-		  }
-	
+          if(this.form.storeIds!=null){
+            this.form.storeIds=(this.form.storeIds).toString()
+          }
           this.form.cityIds=(this.form.cityIds).toString()
           if (this.form.doctorId != null) {
             this.form.doctorType=1;

+ 3 - 1
src/views/his/package/index.vue

@@ -241,7 +241,9 @@
          </el-form-item>
         <el-form-item label="套餐包子类型" prop="packageSubType">
               <el-radio-group v-model="form.packageSubType">
-                <el-radio  label="1" v-if="form.packageType==1">咨询包</el-radio>
+                <el-tooltip content="咨询包不能推ERP" placement="top" :open-delay="100" v-if="form.packageType == 1">
+                  <el-radio label="1">咨询包</el-radio>
+                </el-tooltip>
                 <el-radio  label="2" v-if="form.packageType==1">治疗包</el-radio>
                 <el-radio  label="3" v-if="form.packageType==2">产品包</el-radio>
               </el-radio-group>

+ 2 - 1
src/views/his/patient/index.vue

@@ -262,6 +262,7 @@ export default {
   components: {patientDetails},
   data() {
     return {
+      addPatientInfo: process.env.VUE_APP_ADD_PATIENT,
       show:{
               title:"患者详情",
               open:false,
@@ -431,7 +432,7 @@ export default {
     handleAdd() {
       this.reset();
       this.open = true;
-      this.title = "添加病人";
+      this.title = this.addPatientInfo||"添加病人";
     },
     /** 修改按钮操作 */
     handleUpdate(row) {

+ 751 - 154
src/views/his/storeOrder/order1.vue

@@ -235,16 +235,16 @@
               />
         </el-select>
       </el-form-item>
-	<el-form-item label="订单来源" prop="source">
-	  <el-select v-model="queryParams.source" placeholder="请选择是否支付" clearable size="small">
-	    <el-option
-	      v-for="dict in sourceOptions"
-	      :key="dict.dictValue"
-	      :label="dict.dictLabel"
-	      :value="dict.dictValue"
-	    />
-	  </el-select>
-	</el-form-item>
+      <el-form-item label="订单来源" prop="source">
+        <el-select v-model="queryParams.source" placeholder="请选择是否支付" clearable size="small">
+          <el-option
+            v-for="dict in sourceOptions"
+            :key="dict.dictValue"
+            :label="dict.dictLabel"
+            :value="dict.dictValue"
+          />
+        </el-select>
+      </el-form-item>
 
       <el-form-item label="下单时间" prop="createTime">
             <el-date-picker v-model="createTime" size="small" style="width: 220px" value-format="yyyy-MM-dd" type="daterange" range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期" @change="changeTime"></el-date-picker>
@@ -265,123 +265,173 @@
         <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
       </el-form-item>
-    </el-form>
-    <el-row :gutter="10" class="mb8">
-      <el-col :span="1.5">
-        <el-button
-          type="warning"
-          plain
-          icon="el-icon-download"
-          size="mini"
-          :loading="exportLoading"
-          @click="handleExport"
-          v-hasPermi="['his:storeOrder:export']"
-        >财务导出</el-button>
-      </el-col>
-      <el-col :span="1.5">
-        <el-button
-          type="warning"
-          plain
-          icon="el-icon-download"
-          size="mini"
-          :loading="exportLoading"
-          @click="handleOrderExport"
-          v-hasPermi="['store:storeOrder:export']"
-        >导出订单</el-button>
+      </el-form>
+      <el-row :gutter="10" class="mb8">
+        <el-col :span="1.5">
+          <el-button
+            type="warning"
+            plain
+            icon="el-icon-download"
+            size="mini"
+            :loading="exportLoading"
+            @click="handleExport"
+            v-hasPermi="['his:storeOrder:export']"
+          >财务导出</el-button>
         </el-col>
-      <el-col :span="1.5">
-        <el-button
-          type="info"
-          plain
-          icon="el-icon-upload2"
-          size="mini"
-          @click="handleImport"
-          v-hasPermi="['his:storeOrder:exportDeliver']"
-        >导入发货</el-button>
-      </el-col>
-      <el-col :span="1.5">
-        <el-button
-          type="info"
-          plain
-          icon="el-icon-upload2"
-          size="mini"
-          @click="handleImportExpress"
-          v-hasPermi="['store:storeOrder:importExpress']"
-        >导入银行回单</el-button>
-      </el-col>
-      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
-    </el-row>
-    <el-tabs type="card" v-model="actName" @tab-click="handleClickX">
-      <el-tab-pane label="全部订单" name="10"></el-tab-pane>
-      <el-tab-pane v-for="(item,index) in orderOptions" :label="item.dictLabel" :name="item.dictValue"></el-tab-pane>
-    </el-tabs>
-    <el-table height="500" v-loading="loading" border :data="orderList" @selection-change="handleSelectionChange" >
-      <el-table-column type="selection" width="55" align="center" />
-      <el-table-column label="处方单编号" align="center" prop="prescribeCode" width="180px"/>
-      <el-table-column label="药品订单号" align="center" prop="orderCode" width="180px"/>
-      <el-table-column label="所属公司" align="center" prop="companyName" />
-      <el-table-column label="员工" align="center" prop="companyUserName" />
-      <el-table-column label="店铺名称" align="center" prop="storeName" />
-      <el-table-column label="就诊人" align="center" prop="patientName" />
-      <el-table-column label="收货人" align="center" prop="userName" />
-      <el-table-column label="套餐名称" align="center" prop="packageName" />
-      <el-table-column label="套餐别名" align="center" prop="packageSecondName" width="100px"/>
-      <el-table-column label="应收金额" align="center" prop="payPrice" />
-      <el-table-column label="实收金额" align="center" prop="payMoney" />
-      <el-table-column label="支付方式" align="center" prop="payType" >
-       <template slot-scope="scope">
-              <dict-tag :options="PayOptions" :value="scope.row.payType"/>
-         </template>
-       </el-table-column>
-        <el-table-column label="下单时间" align="center" prop="createTime" width="180" />
-        <el-table-column label="支付时间" align="center" prop="payTime" width="180" />
-        <el-table-column label="订单状态" align="center" prop="status" >
-          <template slot-scope="scope">
-                <dict-tag :options="orderOptions" :value="scope.row.status"/>
-           </template>
-        </el-table-column>
-		<el-table-column label="订单来源" align="center" prop="source" >
-		  <template slot-scope="scope">
-		     <dict-tag :options="sourceOptions" :value="scope.row.source"/>
-		  </template>
-		</el-table-column>
-     <el-table-column label="物流状态" align="center" prop="deliveryStatus" >
-       <template slot-scope="scope">
-             <dict-tag :options="deliveryStatusOptions" :value="scope.row.deliveryStatus"/>
-        </template>
-     </el-table-column>
-	 <el-table-column label="结算状态" align="center" prop="deliveryPayStatus" >
-      <template slot-scope="scope">
-            <dict-tag :options="deliveryPayStatusOptions" :value="scope.row.deliveryPayStatus"/>
-       </template>
-      </el-table-column>
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" fixed="right" width="100px">
-      <template slot-scope="scope">
+        <el-col :span="1.5">
+          <el-button
+            type="warning"
+            plain
+            icon="el-icon-download"
+            size="mini"
+            :loading="exportLoading"
+            @click="handleOrderExport"
+            v-hasPermi="['store:storeOrder:export']"
+          >导出订单</el-button>
+          </el-col>
+        <el-col :span="1.5">
           <el-button
+            type="info"
+            plain
+            icon="el-icon-upload2"
+            size="mini"
+            @click="handleImport"
+            v-hasPermi="['his:storeOrder:exportDeliver']"
+          >导入发货</el-button>
+        </el-col>
+        <el-col :span="1.5">
+          <el-button
+            type="info"
+            plain
+            icon="el-icon-upload2"
+            size="mini"
+            @click="handleImportExpress"
+            v-hasPermi="['store:storeOrder:importExpress']"
+          >导入银行回单</el-button>
+        </el-col>
+        <el-col :span="1.5" v-if="orderStatus == 5"> <!--待推送erp-->
+          <el-tooltip content="默认erp推送手机号" placement="top">
+            <el-button
+              type="warning"
+              plain
+              icon="el-icon-phone"
+              size="mini"
+              @click="handleErpPhone"
+              v-hasPermi="['store:storeOrder:erpphone']"
+            >推送手机号码</el-button>
+          </el-tooltip>
+        </el-col>
+        <el-col :span="1.5" v-if="orderStatus == 5">
+          <el-tooltip content="批量设置erp推送手机号" placement="top">
+            <el-button
+              type="warning"
+              plain
+              icon="el-icon-phone"
+              size="mini"
+              
+              @click="setErpPhone"
+              v-hasPermi="['his:storeOrder:createErpOrder']"
+            >设置推送手机</el-button>
+          </el-tooltip>
+        </el-col>
+        <!-- <el-col :span="1.5" v-if="orderStatus == 5">
+          <el-tooltip content="批量推送erp" placement="top">
+            <el-button
+              type="warning"
+              plain
+              icon="el-icon-s-cooperation"
               size="mini"
-              type="text"
-              @click="handledetails(scope.row)"
-            >查看
-            </el-button>
-      </template>
-      </el-table-column>
-    </el-table>
-    <pagination
-      v-show="total>0"
-      :total="total"
-      :page.sync="queryParams.pageNum"
-      :limit.sync="queryParams.pageSize"
-      @pagination="getList"
-    />
-   <el-drawer
-        :with-header="false"
-        size="75%"
-         :title="show.title" :visible.sync="show.open">
-     <storeOrderDetails  ref="Details" />
-   </el-drawer>
-  <!-- 用户导入对话框 -->
+              @click="createErpOrder"
+              v-hasPermi="['his:storeOrder:createErpOrder']"
+            >创建erp</el-button>
+          </el-tooltip>
+        </el-col> -->
+        <el-col :span="1.5" v-if="orderStatus == 5">
+          <el-tooltip content="批量推送erp" placement="top">
+            <el-button
+              type="warning"
+              plain
+              icon="el-icon-s-cooperation"
+              size="mini"
+              @click="showErpAccountDialog"
+              v-hasPermi="['his:storeOrder:createErpOrder']"
+            >创建erp</el-button>
+          </el-tooltip>
+        </el-col>
+        <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+      </el-row>
+      <el-tabs type="card" v-model="actName" @tab-click="handleClickX">
+        <el-tab-pane label="全部订单" name="10"></el-tab-pane>
+        <el-tab-pane v-for="(item,index) in orderOptions" :label="item.dictLabel" :name="item.dictValue"></el-tab-pane>
+      </el-tabs>
+      <el-table height="500" v-loading="loading" border :data="orderList" @selection-change="handleSelectionChange" >
+        <el-table-column type="selection" width="55" align="center" />
+        <el-table-column label="处方单编号" align="center" prop="prescribeCode" width="180px"/>
+        <el-table-column label="药品订单号" align="center" prop="orderCode" width="180px"/>
+        <el-table-column label="所属公司" align="center" prop="companyName" />
+        <el-table-column label="员工" align="center" prop="companyUserName" />
+        <el-table-column label="店铺名称" align="center" prop="storeName" />
+        <el-table-column label="就诊人" align="center" prop="patientName" />
+        <el-table-column label="收货人" align="center" prop="userName" />
+        <el-table-column label="套餐名称" align="center" prop="packageName" />
+        <el-table-column label="套餐别名" align="center" prop="packageSecondName" width="100px"/>
+        <el-table-column label="应收金额" align="center" prop="payPrice" />
+        <el-table-column label="实收金额" align="center" prop="payMoney" />
+        <el-table-column label="支付方式" align="center" prop="payType" >
+        <template slot-scope="scope">
+                <dict-tag :options="PayOptions" :value="scope.row.payType"/>
+          </template>
+        </el-table-column>
+          <el-table-column label="下单时间" align="center" prop="createTime" width="180" />
+          <el-table-column label="支付时间" align="center" prop="payTime" width="180" />
+          <el-table-column label="订单状态" align="center" prop="status" >
+            <template slot-scope="scope">
+                  <dict-tag :options="orderOptions" :value="scope.row.status"/>
+            </template>
+          </el-table-column>
+        <el-table-column label="订单来源" align="center" prop="source" >
+          <template slot-scope="scope">
+            <dict-tag :options="sourceOptions" :value="scope.row.source"/>
+          </template>
+        </el-table-column>
+        <el-table-column label="物流状态" align="center" prop="deliveryStatus" >
+          <template slot-scope="scope">
+                <dict-tag :options="deliveryStatusOptions" :value="scope.row.deliveryStatus"/>
+            </template>
+        </el-table-column>
+        <el-table-column label="结算状态" align="center" prop="deliveryPayStatus" >
+          <template slot-scope="scope">
+                <dict-tag :options="deliveryPayStatusOptions" :value="scope.row.deliveryPayStatus"/>
+          </template>
+        </el-table-column>
+        <el-table-column label="ERP电话" align="center" prop="erpPhone" v-if="orderStatus == 5"/>
+        <el-table-column label="操作" align="center" class-name="small-padding fixed-width" fixed="right">
+          <template slot-scope="scope">
+              <el-button
+                  size="mini"
+                  type="text"
+                  @click="handledetails(scope.row)"
+                >查看
+                </el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination
+        v-show="total>0"
+        :total="total"
+        :page.sync="queryParams.pageNum"
+        :limit.sync="queryParams.pageSize"
+        @pagination="getList"
+      />
+      <el-drawer
+            :with-header="false"
+            size="75%"
+            :title="show.title" :visible.sync="show.open">
+        <storeOrderDetails  ref="Details" />
+      </el-drawer>
+      <!-- 用户导入对话框 -->
 
-  <el-dialog :title="importExpress.title" :visible.sync="importExpress.open" width="400px" append-to-body>
+      <el-dialog :title="importExpress.title" :visible.sync="importExpress.open" width="400px" append-to-body>
         <el-upload
           ref="importExpress"
           :limit="1"
@@ -398,7 +448,7 @@
           <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
           <div class="el-upload__tip text-center" slot="tip">
             <div class="el-upload__tip" slot="tip">
-         <!--     <el-checkbox v-model="upload.updateSupport" /> 是否更新已经存在的数据 -->
+        <!--     <el-checkbox v-model="upload.updateSupport" /> 是否更新已经存在的数据 -->
             </div>
             <span>仅允许导入xls、xlsx格式文件。</span>
             <el-link type="primary" :underline="false" style="font-size:12px;vertical-align: baseline;" @click="importTemplateExpress">下载模板</el-link>
@@ -410,41 +460,178 @@
         </div>
       </el-dialog>
 
-
-
-
-<el-dialog :title="upload.title" :visible.sync="upload.open" width="400px" append-to-body>
-      <el-upload
-        ref="upload"
-        :limit="1"
-        accept=".xlsx, .xls"
-        :headers="upload.headers"
-        :action="upload.url + '?updateSupport=' + upload.updateSupport"
-        :disabled="upload.isUploading"
-        :on-progress="handleFileUploadProgress"
-        :on-success="handleFileSuccess"
-        :auto-upload="false"
-        drag
-      >
-        <i class="el-icon-upload"></i>
-        <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
-        <div class="el-upload__tip text-center" slot="tip">
-          <div class="el-upload__tip" slot="tip">
+      <el-dialog :title="upload.title" :visible.sync="upload.open" width="400px" append-to-body>
+        <el-upload
+          ref="upload"
+          :limit="1"
+          accept=".xlsx, .xls"
+          :headers="upload.headers"
+          :action="upload.url + '?updateSupport=' + upload.updateSupport"
+          :disabled="upload.isUploading"
+          :on-progress="handleFileUploadProgress"
+          :on-success="handleFileSuccess"
+          :auto-upload="false"
+          drag
+        >
+          <i class="el-icon-upload"></i>
+          <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
+          <div class="el-upload__tip text-center" slot="tip">
+            <div class="el-upload__tip" slot="tip">
+            </div>
+            <span>仅允许导入xls、xlsx格式文件。</span>
+            <el-link type="primary" :underline="false" style="font-size:12px;vertical-align: baseline;" @click="importTemplate">下载模板</el-link>
           </div>
-          <span>仅允许导入xls、xlsx格式文件。</span>
-          <el-link type="primary" :underline="false" style="font-size:12px;vertical-align: baseline;" @click="importTemplate">下载模板</el-link>
+        </el-upload>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitFileForm">确 定</el-button>
+        <el-button @click="upload.open = false">取 消</el-button>
+      </div>
+    </el-dialog>
+    
+    <!-- 设置推送手机对话框 -->
+    <el-dialog :title="erpPhone.title" :visible.sync="erpPhone.open" width="600px" append-to-body>
+      <div style="margin-bottom: 20px;">
+        <el-button type="primary" size="small" @click="handleAddPhone">新增手机号</el-button>
+      </div>
+      <el-table :data="phoneList" border style="width: 100%">
+        <el-table-column prop="phone" label="手机号" align="center">
+          <template slot-scope="scope">
+            <el-input 
+              v-if="scope.row.editing" 
+              v-model="scope.row.phone" 
+              placeholder="请输入手机号"
+              @blur="validatePhone(scope.row)"
+              @keyup.enter.native="handleSavePhone(scope.$index)"
+            />
+            <span v-else>{{ scope.row.phone }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="操作" align="center" width="300">
+          <template slot-scope="scope">
+            <el-button 
+              v-if="scope.row.editing" 
+              type="success" 
+              size="mini" 
+              @click="handleSavePhone(scope.$index)"
+            >保存</el-button>
+            <el-button 
+              v-if="scope.row.editing" 
+              type="info" 
+              size="mini" 
+              @click="handleCancelEdit(scope.$index)"
+            >取消</el-button>
+            <el-button 
+              v-if="!scope.row.editing" 
+              type="primary" 
+              size="mini" 
+              @click="handleEditPhone(scope.$index)"
+            >修改</el-button>
+            <el-button 
+              type="danger" 
+              size="mini" 
+              @click="handleDeletePhone(scope.$index)"
+            >删除</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="handleSavePhoneList">确 定</el-button>
+        <el-button @click="handleCancelPhoneDialog">取 消</el-button>
+      </div>
+    </el-dialog>
+    <el-dialog :title="erpPhone.title" :visible.sync="setPhoneOpen" width="600px" append-to-body>
+      <el-select v-model="erpPhoneValue" multiple placeholder="请选择">
+        <el-option
+          v-for="item in phoneList"
+          :key="item.phone"
+          :label="item.phone"
+          :value="item.phone">
+        </el-option>
+      </el-select>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitErpPhone">确 定</el-button>
+        <el-button @click="handleCancelErpPhone">取 消</el-button>
+      </div>
+    </el-dialog>
+
+    <!-- ERP账户选择对话框 -->
+    <el-dialog :title="erpAccountDialog.title" :visible.sync="erpAccountDialog.open" width="600px" append-to-body>
+      <div v-loading="erpAccountDialog.loading">
+        <el-form :model="erpAccountForm" label-width="100px">
+          <el-form-item label="ERP账户" required>
+            <el-select 
+              v-model="erpAccountForm.selectedAccount" 
+              placeholder="请选择ERP账户" 
+              style="width: 100%"
+              filterable
+            >
+              <el-option
+                v-for="account in erpAccountList"
+                :key="account"
+                :label="account"
+                :value="account"
+              >
+                <span style="float: left">{{ account}}</span>
+                <span style="float: right; color: #8492a6; font-size: 13px">{{ account.accountCode }}</span>
+              </el-option>
+            </el-select>
+          </el-form-item>
+          <!-- <el-form-item label="账户信息" v-if="selectedAccountInfo">
+            <div class="account-info">
+              <p><strong>账户名称:</strong>{{ selectedAccountInfo.accountName }}</p>
+              <p><strong>账户编码:</strong>{{ selectedAccountInfo.accountCode }}</p>
+              <p><strong>账户状态:</strong>
+                <el-tag :type="selectedAccountInfo.status === 1 ? 'success' : 'danger'">
+                  {{ selectedAccountInfo.status === 1 ? '正常' : '禁用' }}
+                </el-tag>
+              </p>
+              <p v-if="selectedAccountInfo.description"><strong>描述:</strong>{{ selectedAccountInfo.description }}</p>
+            </div>
+          </el-form-item> -->
+        </el-form>
+        
+        <!-- 订单统计信息 -->
+        <div class="order-summary" v-if="orderSummary">
+          <el-divider content-position="left">订单统计</el-divider>
+          <el-row :gutter="20">
+            <el-col :span="8">
+              <div class="summary-item">
+                <span class="label">选中订单数:</span>
+                <span class="value">{{ orderSummary.selectedCount }}</span>
+              </div>
+            </el-col>
+            <el-col :span="8">
+              <div class="summary-item">
+                <span class="label">总金额:</span>
+                <span class="value">¥{{ orderSummary.totalAmount }}</span>
+              </div>
+            </el-col>
+            <el-col :span="8">
+              <div class="summary-item">
+                <span class="label">查询条件订单:</span>
+                <span class="value">{{ orderSummary.queryCount }}</span>
+              </div>
+            </el-col>
+          </el-row>
         </div>
-      </el-upload>
-    <div slot="footer" class="dialog-footer">
-      <el-button type="primary" @click="submitFileForm">确 定</el-button>
-      <el-button @click="upload.open = false">取 消</el-button>
-    </div>
-  </el-dialog>
+      </div>
+      
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="cancelErpAccountDialog">取 消</el-button>
+        <el-button 
+          type="primary" 
+          @click="confirmCreateErpOrder"
+          :disabled="!erpAccountForm.selectedAccount"
+          :loading="erpAccountDialog.submitting"
+        >确认推送</el-button>
+      </div>
+    </el-dialog>
   </div>
 </template>
 
 <script>
-import { listOrder, getOrder, delOrder, addOrder,importExpressTemplate, updateOrder, exportOrder,importTemplate,exportOrder2 } from "@/api/his/storeOrder";
+import { listOrder, getOrder, delOrder, addOrder,importExpressTemplate, updateOrder, exportOrder,importTemplate,exportOrder2,queryErpPhone,
+  saveErpPhone,editErpPhone,batchCreateErpOrder,getErpAccount } from "@/api/his/storeOrder";
 import storeOrderDetails from '../../components/his/storeOrderDetails.vue';
 import { getToken } from "@/utils/auth";
 import {listStore} from "@/api/his/storeProduct";
@@ -461,8 +648,36 @@ export default {
     // 监听deptId
     'deptId': 'currDeptChange'
   },
+  // computed: {
+  //   // 计算选中账户的详细信息
+  //   selectedAccountInfo() {
+  //     if (!this.erpAccountForm.selectedAccount) return null;
+  //     return this.erpAccountList.find(account => account.id === this.erpAccountForm.selectedAccount);
+  //   }
+  // },
   data() {
     return {
+      // ERP账户相关数据
+      erpAccountDialog: {
+        open: false,
+        title: "选择ERP账户",
+        loading: false,
+        submitting: false
+      },
+      erpAccountList: [], // ERP账户列表
+      erpAccountForm: {
+        selectedAccount: null // 选中的账户ID
+      },
+      orderSummary: null, // 订单统计信息
+      erpPhoneValue:[],
+      setPhoneOpen:false,
+      erpPhone:{
+        open:false,
+        title:"设置推送手机号"
+      },
+      phoneList: [], // 手机号列表
+      originalPhoneList: [], // 原始手机号列表,用于取消时恢复
+      orderStatus:null,
       scheduleOptions:[],
       companys:[],
       deptOptions:[],
@@ -673,6 +888,387 @@ export default {
 
   },
   methods: {
+    // 修改:显示ERP账户选择对话框
+    showErpAccountDialog() {
+      this.erpAccountDialog.open = true;
+      this.erpAccountDialog.loading = true;
+      this.getErpAccountList();
+      this.calculateOrderSummary();
+    },
+    
+    // 新增:获取ERP账户列表
+    async getErpAccountList() {
+      try {
+        const response = await getErpAccount();
+        if (response.code === 200) {
+          this.erpAccountList = response.data || [];
+        } else {
+          this.$message.error(response.msg || '获取ERP账户列表失败');
+          this.erpAccountList = [];
+        }
+      } catch (error) {
+        console.error('获取ERP账户列表失败:', error);
+        this.$message.error('获取ERP账户列表失败');
+        this.erpAccountList = [];
+      } finally {
+        this.erpAccountDialog.loading = false;
+      }
+    },
+    
+    // 新增:计算订单统计信息
+    calculateOrderSummary() {
+      let selectedCount = 0;
+      let totalAmount = 0;
+      let queryCount = this.total || 0;
+      
+      if (this.ids.length > 0) {
+        // 如果有选中的订单,统计选中的订单
+        selectedCount = this.ids.length;
+        this.orderList.forEach(order => {
+          if (this.ids.includes(order.orderId)) {
+            totalAmount += parseFloat(order.payMoney || 0);
+          }
+        });
+      } else {
+        // 如果没有选中订单,统计当前查询条件下的所有订单
+        selectedCount = queryCount;
+        this.orderList.forEach(order => {
+          totalAmount += parseFloat(order.payMoney || 0);
+        });
+      }
+      
+      this.orderSummary = {
+        selectedCount,
+        totalAmount: totalAmount.toFixed(2),
+        queryCount
+      };
+    },
+    
+    //确认创建ERP订单
+    confirmCreateErpOrder() {
+      if (!this.erpAccountForm.selectedAccount) {
+        this.$message.warning('请选择ERP账户');
+        return;
+      }
+      
+      // const selectedAccount = this.selectedAccountInfo;
+      // if (selectedAccount.status !== 1) {
+      //   this.$message.error('选中的ERP账户状态异常,无法推送');
+      //   return;
+      // }
+      
+      this.$confirm(
+        `确认将订单推送到ERP账户"${this.erpAccountForm.selectedAccount}"吗?`, 
+        '确认推送', 
+        {
+          confirmButtonText: '确定推送',
+          cancelButtonText: '取消',
+          type: 'warning'
+        }
+      ).then(() => {
+        this.executeCreateErpOrder();
+      });
+    },
+    
+    //执行创建ERP订单
+    async executeCreateErpOrder() {
+      this.erpAccountDialog.submitting = true;
+      
+      try {
+        let param = {
+          loginAccount: this.erpAccountForm.selectedAccount
+        };
+        
+        if (this.ids.length > 0) {
+          // 如果有选中的订单,只推送选中的
+          param.orderIds = this.ids;
+        } else {
+          // 如果没有选中订单,推送查询条件下的所有订单
+          if (this.payTypeArr.length > 0) {
+            this.queryParams.payType = this.payTypeArr.toString();
+          } else {
+            this.queryParams.payType = null;
+          }
+          if (this.scheduleIdArr.length > 0) {
+            this.queryParams.scheduleId = this.scheduleIdArr.toString();
+          } else {
+            this.queryParams.scheduleId = null;
+          }
+          if (this.buyTypeArr.length > 0) {
+            this.queryParams.orderBuyType = this.buyTypeArr.toString();
+          } else {
+            this.queryParams.orderBuyType = null;
+          }
+          if (this.channelArr.length > 0) {
+            this.queryParams.orderChannel = this.channelArr.toString();
+          } else {
+            this.queryParams.orderChannel = null;
+          }
+          if (this.qwSubjectArr.length > 0) {
+            this.queryParams.qwSubject = this.qwSubjectArr.toString();
+          } else {
+            this.queryParams.qwSubject = null;
+          }
+          
+          // 合并查询参数
+          param = { ...param, ...this.queryParams };
+        }
+        
+        const response = await batchCreateErpOrder(param);
+        if (response.code === 200) {
+          this.$message.success('ERP订单创建成功');
+          this.cancelErpAccountDialog();
+          this.getList(); // 刷新列表
+        } else {
+          this.$message.error(response.msg || 'ERP订单创建失败');
+        }
+      } catch (error) {
+        console.error('创建ERP订单失败:', error);
+        this.$message.error('创建ERP订单失败');
+      } finally {
+        this.erpAccountDialog.submitting = false;
+      }
+    },
+    
+    // 新增:取消ERP账户选择对话框
+    cancelErpAccountDialog() {
+      this.erpAccountDialog.open = false;
+      this.erpAccountForm.selectedAccount = null;
+      this.orderSummary = null;
+      this.erpAccountList = [];
+    },
+    createErpOrder(){
+      this.$confirm('确认创建erp?', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      }).then(() => {
+        let param = {};
+        if(this.ids.length>0){
+          param = {orderIds:this.ids};
+        } else {
+          if(this.payTypeArr.length>0){
+            this.queryParams.payType=this.payTypeArr.toString();
+          }
+          else{
+            this.queryParams.payType=null
+          }
+          if(this.scheduleIdArr.length>0){
+            this.queryParams.scheduleId=this.scheduleIdArr.toString();
+          }
+          else{
+            this.queryParams.scheduleId=null
+          }
+          if(this.buyTypeArr.length>0){
+            this.queryParams.orderBuyType=this.buyTypeArr.toString();
+          }
+          else{
+            this.queryParams.orderbuyType=null
+          }
+          if(this.channelArr.length>0){
+            this.queryParams.orderChannel=this.channelArr.toString();
+          }
+          else{
+            this.queryParams.orderChannel=null
+          }
+          if(this.qwSubjectArr.length>0){
+            this.queryParams.qwSubject=this.qwSubjectArr.toString();
+          }
+          else{
+            this.queryParams.qwSubject=null
+          }
+          param = this.queryParams;
+        }
+        batchCreateErpOrder(param).then(response=>{
+          if(response.code == 200){
+            this.$message.success('创建成功');
+            this.getList();
+          }
+        })
+        
+      });
+    },
+    handleCancelErpPhone(){
+      this.erpPhoneValue = [];
+      this.setPhoneOpen = false;
+    },
+    submitErpPhone(){
+      let param = {};
+      if(this.ids.length>0){
+        param = {orderIds:this.ids,erpPhone:this.erpPhoneValue};
+      } else {
+        if(this.payTypeArr.length>0){
+          this.queryParams.payType=this.payTypeArr.toString();
+        }
+        else{
+          this.queryParams.payType=null
+        }
+        if(this.scheduleIdArr.length>0){
+          this.queryParams.scheduleId=this.scheduleIdArr.toString();
+        }
+        else{
+          this.queryParams.scheduleId=null
+        }
+        if(this.buyTypeArr.length>0){
+          this.queryParams.orderBuyType=this.buyTypeArr.toString();
+        }
+        else{
+          this.queryParams.orderbuyType=null
+        }
+        if(this.channelArr.length>0){
+          this.queryParams.orderChannel=this.channelArr.toString();
+        }
+        else{
+          this.queryParams.orderChannel=null
+        }
+        if(this.qwSubjectArr.length>0){
+          this.queryParams.qwSubject=this.qwSubjectArr.toString();
+        }
+        else{
+          this.queryParams.qwSubject=null
+        }
+        param = this.queryParams;
+        param.erpPhone=this.erpPhoneValue;
+      }
+      
+      editErpPhone(param).then(response=>{
+        this.msgSuccess("修改成功");
+        this.setPhoneOpen = false;
+        this.getList();
+      })
+    },
+    setErpPhone(){
+      this.getErpPhoneList();
+      this.setPhoneOpen = true;
+    },
+    // 设置推送手机相关方法
+    handleErpPhone(){
+      //查询配置手机号
+      this.getErpPhoneList();
+      this.erpPhone.open = true
+    },
+    getErpPhoneList(){
+      queryErpPhone().then(response =>{
+        if(response.data && response.data != null && response.data.length >0){
+          const phones = response.data.filter(phone => phone.trim());
+          this.phoneList = phones.map(phone => ({
+            phone: phone.trim(),
+            editing: false,
+            originalPhone: phone.trim()
+          }));
+        }
+        
+        // 保存原始数据用于取消操作
+        this.originalPhoneList = this.phoneList;
+      });
+    },
+    // 新增手机号
+    handleAddPhone() {
+      this.phoneList.push({
+        phone: '',
+        editing: true,
+        originalPhone: '',
+        isNew: true
+      });
+    },
+    // 编辑手机号
+    handleEditPhone(index) {
+      this.$set(this.phoneList[index], 'editing', true);
+      this.$set(this.phoneList[index], 'originalPhone', this.phoneList[index].phone);
+    },
+    // 保存手机号
+    handleSavePhone(index) {
+      const phone = this.phoneList[index].phone.trim();
+      if (!phone) {
+        this.$message.error('手机号不能为空');
+        return;
+      }
+      if (!this.validatePhoneFormat(phone)) {
+        this.$message.error('请输入正确的手机号格式');
+        return;
+      }
+      // 检查是否重复
+      const duplicateIndex = this.phoneList.findIndex((item, idx) => 
+        idx !== index && item.phone === phone
+      );
+      if (duplicateIndex !== -1) {
+        this.$message.error('手机号已存在');
+        return;
+      }
+      this.$set(this.phoneList[index], 'editing', false);
+      this.$set(this.phoneList[index], 'isNew', false);
+    },
+    // 取消编辑
+    handleCancelEdit(index) {
+      if (this.phoneList[index].isNew) {
+        // 如果是新增的,直接删除
+        this.phoneList.splice(index, 1);
+      } else {
+        // 如果是编辑的,恢复原值
+        this.$set(this.phoneList[index], 'phone', this.phoneList[index].originalPhone);
+        this.$set(this.phoneList[index], 'editing', false);
+      }
+    },
+    // 删除手机号
+    handleDeletePhone(index) {
+      this.$confirm('确认删除该手机号?', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      }).then(() => {
+        this.phoneList.splice(index, 1);
+        this.$message.success('删除成功');
+      });
+    },
+    // 验证手机号格式
+    validatePhoneFormat(phone) {
+      const phoneRegex = /^1[3-9]\d{9}$/;
+      return phoneRegex.test(phone);
+    },
+    // 验证手机号
+    validatePhone(row) {
+      if (row.phone && !this.validatePhoneFormat(row.phone)) {
+        this.$message.error('请输入正确的手机号格式');
+      }
+    },
+    // 保存手机号列表
+    handleSavePhoneList() {
+      // 检查是否有正在编辑的项
+      const editingItem = this.phoneList.find(item => item.editing);
+      if (editingItem) {
+        this.$message.error('请先保存正在编辑的手机号');
+        return;
+      }
+      
+      // 检查是否有空的手机号
+      const emptyPhone = this.phoneList.find(item => !item.phone.trim());
+      if (emptyPhone) {
+        this.$message.error('存在空的手机号,请删除或填写完整');
+        return;
+      }
+      
+      // 构造手机号列表
+      const phoneList = this.phoneList.map(item => item.phone);
+      
+      // 调用保存接口
+      saveErpPhone(phoneList).then(response => {
+        if (response.code === 200) {
+          this.$message.success('保存成功');
+          this.erpPhone.open = false;
+        } else {
+          this.$message.error(response.msg || '保存失败');
+        }
+      }).catch(() => {
+        this.$message.error('保存失败');
+      });
+    },
+    // 取消手机号对话框
+    handleCancelPhoneDialog() {
+      // 恢复原始数据
+      this.phoneList = JSON.parse(JSON.stringify(this.originalPhoneList));
+      this.erpPhone.open = false;
+    },
+    
     handleImportExpress() {
           this.importExpress.title = "导入";
           this.importExpress.open = true;
@@ -843,6 +1439,7 @@ export default {
       this.getList();
     },
    handleClickX(tab, event) {
+    this.orderStatus = tab.name;
     if(tab.name=="10"){
       this.queryParams.status=null;
     }else{
@@ -1114,4 +1711,4 @@ export default {
     },
   }
 };
-</script>
+</script>

+ 77 - 24
src/views/his/user/index.vue

@@ -1,6 +1,40 @@
 <template>
   <div class="app-container">
     <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="所属公司" prop="companyName">
+        <el-select
+          v-model="queryCompanyId"
+          placeholder="请选择所属公司"
+          clearable
+          filterable
+          size="small"
+          @change="handleQueryCompanyChange"
+        >
+          <el-option
+            v-for="item in companyQueryOptions"
+            :key="item.companyId"
+            :label="item.companyName"
+            :value="item.companyId">
+          </el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="所属销售" prop="companyUserId">
+
+        <el-select
+          v-model="queryCompanyUserId"
+          placeholder="请选择所属销售"
+          clearable
+          filterable
+          size="small"
+        >
+          <el-option
+            v-for="item in companyQueryUserOptions"
+            :key="item.userId"
+            :label="item.nickName"
+            :value="item.userId">
+          </el-option>
+        </el-select>
+      </el-form-item>
       <el-form-item label="会员ID" prop="userId">
         <el-input
           v-model="queryParams.userId"
@@ -66,31 +100,15 @@
                  />
         </el-select>
       </el-form-item>
-       <el-form-item label="注册时间" prop="createTime">
-                 <el-date-picker v-model="createTime" size="small" style="width: 220px" value-format="yyyy-MM-dd" type="daterange" range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期" @change="change"></el-date-picker>
-              </el-form-item>
+      <el-form-item label="注册时间" prop="createTime">
+                <el-date-picker v-model="createTime" size="small" style="width: 230px" value-format="yyyy-MM-dd" type="daterange" range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期" @change="change"></el-date-picker>
+      </el-form-item>
+
       <el-form-item>
         <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
       </el-form-item>
-      <el-form-item label="所属公司" prop="companyName">
-        <el-input
-          v-model="queryParams.companyName"
-          placeholder="请输入所属公司"
-          clearable
-          size="small"
-          @keyup.enter.native="handleQuery"
-        />
-      </el-form-item>
-      <el-form-item label="所属销售" prop="companyUserNickName">
-        <el-input
-          v-model="queryParams.companyUserNickName"
-          placeholder="请输入所属销售"
-          clearable
-          size="small"
-          @keyup.enter.native="handleQuery"
-        />
-      </el-form-item>
+
     </el-form>
 
     <el-row :gutter="10" class="mb8">
@@ -212,7 +230,8 @@
            :with-header="false"
             size="75%"
              :title="show.title" :visible.sync="show.open">
-         <userDetails  ref="userDetails" />
+<!--         <userDetails  ref="userDetails" />-->
+         <userDetailsByNew  ref="userDetailsByNew" />
        </el-drawer>
 
     <!-- 更换会员归属对话框 -->
@@ -251,11 +270,17 @@
 import { listUser, getUser, delUser, addUser, updateUser, exportUser } from "@/api/his/user";
 import { getCompanyUserList, changeCompanyUser, getCompanyList } from '@/api/company/companyUser';
 import userDetails from '../../components/his/userDetails.vue';
+import userDetailsByNew from './userDetails.vue';
+
 export default {
   name: "User",
-  components: {userDetails},
+  components: {userDetails,userDetailsByNew},
   data() {
     return {
+      companyQueryOptions:[],
+      companyQueryUserOptions:[],
+      queryCompanyId:null,
+      queryCompanyUserId:null,
       companyName: null,
       companyUserNickName: null,
       // 更换会员归属表单校验
@@ -353,6 +378,10 @@ export default {
     this.getDicts("sys_company_or").then(response => {
       this.orOptions = response.data;
     });
+    getCompanyList().then(response => {
+        if (response.code === 200) {
+          this.companyQueryOptions = response.data;
+        }});
   },
   methods: {
     /** 销售选择变化 */
@@ -375,9 +404,29 @@ export default {
     handledetails(row){
             this.show.open=true;
             setTimeout(() => {
-                 this.$refs.userDetails.getDetails(row.userId);
+                 this.$refs.userDetailsByNew.getDetails(row.userId);
             }, 1);
      },
+     handleQueryCompanyChange(companyId){
+      // 清空已选择的销售
+      this.queryCompanyUserId = null;
+      // 根据公司ID获取对应的销售列表
+      if (companyId) {
+        getCompanyUserList({ companyId: companyId }).then(response => {
+          if (response.code === 200) {
+            this.companyQueryUserOptions = response.data;
+          } else {
+            this.$message.error(response.msg || '获取销售列表失败');
+            this.companyQueryUserOptions = [];
+          }
+        }).catch(() => {
+          this.$message.error('获取销售列表失败');
+          this.companyQueryUserOptions = [];
+        });
+      } else {
+        this.companyQueryUserOptions = [];
+      }
+     },
     handleCompanyChange(companyId) {
       // 清空已选择的销售
       this.changeCompanyUserForm.companyUserId = null;
@@ -440,6 +489,8 @@ export default {
     /** 搜索按钮操作 */
     handleQuery() {
       this.queryParams.pageNum = 1;
+      this.queryParams.companyId = this.queryCompanyId;
+      this.queryParams.companyUserId = this.queryCompanyUserId;
       this.getList();
     },
     /** 重置按钮操作 */
@@ -450,6 +501,8 @@ export default {
       this.queryParams.eTime=null;
       this.queryParams.companyName = null;
       this.queryParams.companyUserNickName = null;
+      this.queryParams.companyId = null;
+      this.queryParams.companyUserId = null;
       this.handleQuery();
     },
     // 多选框选中数据

+ 460 - 0
src/views/his/user/userBehavior.vue

@@ -0,0 +1,460 @@
+<template>
+  <div class="behavior-track-container">
+    <!-- 筛选区域 -->
+    <div class="filter-section">
+      <div class="filter-item">
+        <label>操作类型:</label>
+        <el-select
+          v-model="queryParams.operationType"
+          class="type-select"
+          @change="handleTypeChange"
+          placeholder="请选择行为类型"
+          clearable
+        >
+          <el-option
+            v-for="item in typeList"
+            :key="item"
+            :label="item"
+            :value="item"
+          ></el-option>
+        </el-select>
+      </div>
+    </div>
+    <div v-if="steps.length === 0" class="no-data">
+      <p>暂无数据</p>
+    </div>
+    <!-- 按日期分组展示(分页后的数据) -->
+    <div v-if="steps.length != 0" v-for="(records, date) in groupedPaginatedSteps" :key="date" class="date-group">
+      <!-- 日期标题(如果是今天,显示“今天”,否则显示具体日期) -->
+      <div class="date-title">
+        {{ isToday(date) ? '今天' : date }}
+      </div>
+      <div class="date-divider"></div>
+
+      <!-- 当前日期下的记录 -->
+      <el-steps
+        direction="vertical"
+        :space="120"
+        process-status="process"
+        finish-status="success"
+        class="custom-steps"
+      >
+        <el-step
+          v-for="(step, index) in records"
+          :key="index"
+          :icon="index === 0 ? 'el-icon-s-help' : 'el-icon-bangzhu'"
+        >
+          <template #title>
+            <div class="step-title">
+              {{ step.operationType }}
+              <span class="step-time">{{ step.createTime }}</span> <!-- 每个步骤的时间 -->
+            </div>
+          </template>
+          <template #description>
+            <!-- 答题 -->
+            <div v-if="step.operationType == '答题'" class="step-content">
+              <!-- 第一行 -->
+              <div class="step-row first-row">
+                <div v-if="step.paramVo" class="detail-item">
+                  <span class="detail-label"><i class="el-icon-notebook-2"></i> 课节名称:</span>
+                  <span class="detail-value">{{ step.paramVo.courseName }}</span>
+                </div>
+              </div>
+
+              <!-- 第二行 -->
+              <div v-if="step.details" class="step-row second-row">
+                <div class="detail-item">
+                  <span class="detail-label"><i class="el-icon-chat-dot-round"></i> 备注:</span>
+                  <span class="detail-value">{{ step.details }}</span>
+                </div>
+              </div>
+            </div>
+
+            <!-- 发放奖励 -->
+            <div v-else-if="step.operationType == '发送奖励'" class="step-content">
+              <!-- 第一行 -->
+              <div class="step-row first-row">
+                <div v-if="step.paramVo" class="detail-item">
+                  <span class="detail-label"><i class="el-icon-gift"></i> 课程名称:</span>
+                  <span class="detail-value">{{ step.paramVo.courseName }}</span>
+                </div>
+                <div v-if="step.paramVo" class="detail-item">
+                  <span class="detail-label"><i class="el-icon-coin"></i> 小节名称:</span>
+                  <span class="detail-value">{{ step.paramVo.title }}</span>
+                </div>
+                <div v-if="step.fsCourseRedPacketLog" class="detail-item">
+                  <span class="detail-label"><i class="el-icon-coin"></i> 发放金额:</span>
+                  <span class="detail-value">{{ step.fsCourseRedPacketLog.amount }} 元</span>
+                </div>
+              </div>
+
+              <!-- 第二行 -->
+              <div v-if="step.details" class="step-row second-row">
+                <div class="detail-item">
+                  <span class="detail-label"><i class="el-icon-chat-dot-round"></i> 备注:</span>
+                  <span class="detail-value">{{ step.details }}</span>
+                </div>
+              </div>
+            </div>
+
+            <!-- 其他类型 -->
+            <div v-else class="step-content">
+              <!-- 第一行 -->
+              <div class="step-row first-row">
+                <div v-if="step.paramVo" class="detail-item">
+                  <span class="detail-label"><i class="el-icon-office-building"></i> 训练营:</span>
+                  <span class="detail-value">{{ step.paramVo.trainingCampName }}</span>
+                </div>
+                <div v-if="step.paramVo" class="detail-item">
+                  <span class="detail-label"><i class="el-icon-collection-tag"></i> 营期名称:</span>
+                  <span class="detail-value">{{ step.paramVo.periodName }}</span>
+                </div>
+                <div v-if="step.paramVo" class="detail-item">
+                  <span class="detail-label"><i class="el-icon-notebook-2"></i> 课节名称:</span>
+                  <span class="detail-value">{{ step.paramVo.courseName }}</span>
+                </div>
+              </div>
+
+              <!-- 第二行 -->
+              <div v-if="step.details" class="step-row second-row">
+                <div class="detail-item">
+                  <span class="detail-label"><i class="el-icon-chat-dot-round"></i> 备注:</span>
+                  <span class="detail-value">{{ step.details }}</span>
+                </div>
+              </div>
+            </div>
+          </template>
+
+        </el-step>
+      </el-steps>
+    </div>
+
+    <!-- 分页 -->
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+  </div>
+
+
+</template>
+
+<script>
+import { listUserOperationLog,getOperationType} from "@/api/his/userOperationLog";
+
+export default {
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      typeList: [],
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        operationType:null,
+        userId:null,
+      },
+      total: 0,
+      steps: [
+      ]
+    };
+  },
+  created() {
+    getOperationType().then(response => {
+      this.typeList = response.data;
+    });
+  },
+  computed: {
+    // 删除这个属性,直接在 getList 中使用后端的操作类型
+    groupedPaginatedSteps() {
+      const groups = {};
+      this.steps.forEach((step) => {
+        const date = step.createTime ?
+          (step.createTime instanceof Date ? step.createTime.toISOString().substr(0, 10) : new Date(step.createTime).toISOString().substr(0, 10))
+          : null;
+        if (!groups[date]) {
+          groups[date] = [];
+        }
+        groups[date].push(step);
+      });
+      return groups;
+    },
+
+  },
+  methods: {
+    getList() {
+      this.loading = true;
+      listUserOperationLog(this.queryParams).then(response => {
+        this.steps = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 判断是否为今天
+    isToday(date) {
+      const today = new Date();
+      const formattedDate = `${today.getFullYear()}-${(today.getMonth() + 1).toString().padStart(2, '0')}-${today.getDate().toString().padStart(2, '0')}`;
+      return date === formattedDate;
+    },
+    getDetails(orderId) {
+      this.queryParams.userId=orderId;
+      this.getList();
+
+    },
+    handleTypeChange() {
+      this.queryParams.pageNum = 1;  // 重置分页为第一页
+      this.getList();  // 重新获取数据
+    }
+  },
+};
+</script>
+
+<style scoped>
+.behavior-track-container {
+  width: 100%;
+  padding: 24px;
+  font-family: "Helvetica Neue", Helvetica, "PingFang SC", "Hiragino Sans GB", Arial, sans-serif;
+  background-color: #f9fbfd;
+  border-radius: 12px;
+  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);
+}
+
+.filter-section {
+  margin-bottom: 24px;
+  background: #ffffff;
+  border-radius: 8px;
+  padding: 16px 20px;
+  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
+  display: flex;
+  align-items: center;
+}
+
+.filter-item {
+  display: flex;
+  align-items: center;
+}
+
+.filter-item label {
+  font-weight: 600;
+  color: #333;
+  margin-right: 12px;
+  font-size: 14px;
+}
+
+.type-select {
+  width: 240px;
+}
+
+.custom-steps {
+  padding: 0 16px;
+}
+
+.step-title {
+  font-size: 16px;
+  font-weight: 600;
+  color: #333;
+}
+
+.step-detail p {
+  margin: 8px 0;
+  line-height: 1.6;
+  font-size: 14px;
+  color: #555;
+}
+
+/* 步骤条样式优化 - 移除图标边框 */
+.custom-steps >>> .el-step__head {
+  padding-right: 16px;
+}
+
+.custom-steps >>> .el-step__icon {
+  width: 24px;
+  height: 24px;
+  font-size: 18px;
+}
+
+.custom-steps >>> .el-step__icon.is-icon {
+  color: #52c41a;
+}
+
+.custom-steps >>> .el-step__line {
+  top: 36px;
+  left: 11px;
+  background-color: #e8e8e8;
+}
+
+/* 分页样式优化 */
+.pagination-wrapper {
+  margin-top: 32px;
+  text-align: center;
+  padding: 16px 0;
+}
+
+.custom-pagination >>> .el-pager li {
+  border-radius: 4px;
+  margin: 0 4px;
+}
+
+.custom-pagination >>> .el-pager li.active {
+  background-color: #52c41a;
+  color: #fff;
+}
+
+.custom-pagination >>> .el-pagination__jump {
+  margin-left: 12px;
+}
+
+.custom-pagination >>> .el-input__inner {
+  border-radius: 4px;
+}
+
+/* 新增和修改的样式 */
+.step-content {
+  margin-top: 8px;
+  padding: 16px;
+  background: #ffffff;
+  border-radius: 8px;
+  border: 1px solid #ebeef5;
+  box-shadow: 0 1px 6px rgba(0, 0, 0, 0.06);
+  transition: all 0.3s ease;
+}
+
+.step-content:hover {
+  box-shadow: 0 2px 12px rgba(0, 0, 0, 0.1);
+  transform: translateY(-1px);
+}
+
+.detail-label {
+  display: inline-flex;
+  align-items: center;
+  width: 100px;
+  color: #606266;
+  font-weight: 500;
+  flex-shrink: 0;
+}
+
+.detail-label i {
+  margin-right: 6px;
+  font-size: 14px;
+  color: #909399;
+}
+
+.detail-value {
+  flex: 1;
+  color: #303133;
+  word-break: break-word;
+  padding-left: 4px;
+}
+
+.step-row {
+  display: flex;
+  flex-wrap: wrap;
+  justify-content: space-between;
+  margin-bottom: 8px;
+}
+
+.first-row .detail-item {
+  flex: 1 1 30%; /* 平均分布 */
+  display: flex;
+  align-items: center;
+  margin-right: 16px;
+}
+
+.second-row .detail-item {
+  display: flex;
+  align-items: center;
+}
+
+.time-item {
+  margin-left: auto; /* 时间靠右 */
+}
+
+.detail-label {
+  font-weight: 500;
+  color: #606266;
+  margin-right: 6px;
+}
+
+.detail-value {
+  color: #303133;
+  word-break: break-word;
+}
+
+@media (max-width: 768px) {
+  .first-row,
+  .second-row {
+    flex-direction: column;
+  }
+  .time-item {
+    margin-left: 0;
+  }
+}
+/* 完全重置步骤描述区域的样式 */
+.custom-steps >>> .el-step__description {
+  width: 100% !important;
+  max-width: 100% !important;
+  padding: 0 !important;
+  margin: 0 !important;
+}
+
+/* 确保步骤内容使用弹性布局 */
+.step-content {
+  display: flex;
+  flex-direction: column;
+  width: 100%;
+}
+
+/* 调整时间项 */
+.time-item {
+  align-self: flex-end; /* 替代 margin-left: auto */
+  margin-top: 8px; /* 如果需要与上方的间距 */
+}
+/* 日期标题样式 */
+.date-title {
+  font-size: 16px;
+  font-weight: bold;
+  color: #333;
+  margin-top: 16px;
+}
+
+.date-divider {
+  height: 1px;
+  background: #e8e8e8;
+  margin: 4px 0 12px;
+}
+
+/* 在步骤条标题旁边显示时间 */
+.step-title {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+}
+
+.step-time {
+  font-size: 12px;
+  color: #999;
+  margin-left: 10px;
+}
+
+/* 第二行的备注 */
+.second-row {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+}
+
+.second-row .detail-item {
+  display: flex;
+  align-items: center;
+}
+
+.no-data {
+  text-align: center;
+  color: #999;
+  font-size: 18px;
+  padding: 20px;
+}
+</style>

+ 173 - 0
src/views/his/user/userCourseConversionRecord.vue

@@ -0,0 +1,173 @@
+<template>
+
+  <div style="background-color: #f0f2f5; padding-bottom: 20px; min-height: 100%; " >
+    <div class="contentx" v-if="item!=null">
+      <div class="desct"> 优惠劵领取信息</div>
+      <el-tabs type="card" v-model="actName" @tab-click="handleClickX">
+        <el-tab-pane label="全部" name="10"></el-tab-pane>
+        <el-tab-pane v-for="(item,index) in couponStatusOptions" :label="item.dictLabel" :name="item.dictValue"></el-tab-pane>
+      </el-tabs>
+      <el-table v-loading="loading" :data="userCouponList">
+        <el-table-column label="优惠劵标题" align="center" prop="title" />
+        <el-table-column label="券号" align="center" prop="couponCode" />
+        <el-table-column label="会员昵称" align="center" prop="nickName" />
+        <el-table-column label="会员电话" align="center" prop="phone" />
+        <el-table-column label="关联订单ID" align="center" prop="businessId" />
+        <el-table-column label="订单类型" align="center" prop="businessType">
+          <template slot-scope="scope">
+            <dict-tag :options="businessTypeOptions" :value="scope.row.businessType"/>
+          </template>
+        </el-table-column>
+        <el-table-column label="状态" align="center" prop="status">
+          <template slot-scope="scope">
+            <dict-tag :options="couponStatusOptions" :value="scope.row.status"/>
+          </template>
+        </el-table-column>
+        <el-table-column label="领取时间" align="center" prop="createTime" width="180"/>
+        <el-table-column label="使用时间" align="center" prop="useTime" width="180"/>
+      </el-table>
+      <pagination
+        v-show="total>0"
+        :total="total"
+        :page.sync="queryParams.pageNum"
+        :limit.sync="queryParams.pageSize"
+        @pagination="getList"
+      />
+    </div>
+
+    <div class="contentx" v-if="item!=null" >
+      <div class="desct">
+        用户药品订单
+      </div>
+      <userStorerDetails  ref="userDetails" />
+    </div>
+  </div>
+</template>
+
+
+
+<script>
+import { getPatientByUserId} from "@/api/his/patient";
+import { getUser ,getUserAddr} from "@/api/his/user";
+import { getListUserCoupon } from "@/api/his/userCoupon";
+import userStorerDetails from "../../components/his/userStorerDetails.vue";
+import userPatietDetails from "../../components/his/userPatietDetails.vue";
+import userInquiryOrderDetails from "../../components/his/userInquiryOrderDetails.vue";
+import userAddDetails from "../../components/his/userAddDetails.vue";
+export default {
+  name: "storedet",
+  props:["data"],
+  components: { userStorerDetails ,userInquiryOrderDetails,userPatietDetails,userAddDetails},
+  data() {
+    return {
+      patientInfo: process.env.VUE_APP_PATIENT_INFO,
+      addr:[],
+      patient:[],
+      userOptions: [],
+      statusOptions: [],
+      sexOptions: [],
+      pOptions: [],
+      item:null,
+      total: 0,
+      loading: true,
+      // 会员优惠券表格数据
+      userCouponList: [],
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        userId: null,
+        couponId: null,
+      },
+      actName:"10",
+      businessTypeOptions:[],
+      couponStatusOptions:[],
+    }
+  },
+  created() {
+    this.getDicts("sys_user_status").then(response => {
+      this.userOptions = response.data;
+    });
+    this.getDicts("sys_company_status").then(response => {
+      this.statusOptions = response.data;
+    });
+    this.getDicts("sys_patient_status").then(response => {
+      this.pOptions = response.data;
+    });
+    this.getDicts("sys_patient_sex").then(response => {
+      this.sexOptions = response.data;
+    });
+    this.getDicts("sys_coupon_business_type").then(response => {
+      this.businessTypeOptions = response.data;
+    });
+
+    this.getDicts("sys_coupon_status").then(response => {
+      this.couponStatusOptions = response.data;
+    });
+  },
+  methods: {
+    handleClickX(tab, event) {
+      if(tab.name=="10"){
+        this.queryParams.status=null;
+      }else{
+        this.queryParams.status=tab.name;
+      }
+      this.queryParams.pageNum = 1;
+      this.getList();
+
+    },
+    getList() {
+      this.loading = true;
+      getListUserCoupon(this.queryParams).then(response => {
+        this.userCouponList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+
+    getDetails(orderId) {
+      this.item=null;
+      getUser(orderId).then(response => {
+        this.item = response.data;
+        setTimeout(() => {
+          this.$refs.userDetails.getUserDetails(orderId);
+        }, 1);
+
+      });
+      this.patient=null;
+      getPatientByUserId(orderId).then(response => {
+        this.patient = response.data;
+      });
+      getUserAddr(orderId).then(response => {
+        this.addr = response.data;
+      });
+      this.queryParams.userId=orderId;
+      this.getList();
+
+    },
+  }
+}
+</script>
+<style>
+
+.contentx{
+  height: 100%;
+  background-color: #fff;
+  padding: 0px 20px 20px;
+
+
+  margin: 20px;
+}
+.el-descriptions-item__label.is-bordered-label{
+  font-weight: normal;
+}
+.el-descriptions-item__content {
+  max-width: 150px;
+  min-width: 100px;
+}
+.desct{
+  padding-top: 20px;
+  padding-bottom: 20px;
+  color: #524b4a;
+  font-weight: bold;
+}
+</style>

+ 476 - 0
src/views/his/user/userCoursePeriod.vue

@@ -0,0 +1,476 @@
+<template>
+  <div class="app-container">
+    <!-- 没有数据提示 -->
+    <div v-if="campList.length === 0 && !leftLoading" class="no-data">
+      <span>—— 没有数据 ——</span>
+    </div>
+
+    <el-container v-else>
+      <!-- 左侧区域 -->
+      <el-aside width="360px" class="left-aside">
+        <!-- 顶部区域 -->
+        <!-- 训练营列表 -->
+        <div class="camp-list" ref="campList" @scroll="handleScroll" v-loading="leftLoading">
+          <div
+            v-for="(item, index) in campList"
+            :key="index"
+            class="camp-item"
+            :class="{ 'active': activeCampIndex === index }"
+            @click="selectCamp(index)"
+          >
+            <div class="camp-content">
+              <div class="camp-title">
+                <i class="el-icon-s-flag camp-icon"></i>
+                {{ item.trainingCampName }}
+              </div>
+              <div class="camp-info">
+                <span>序号:{{ item.orderNumber }}</span>
+                <span>最新营期开课:{{ item.recentDate || '-' }}</span>
+              </div>
+            </div>
+          </div>
+          <!-- 底部加载更多提示 -->
+          <div v-if="loadingMore" class="loading-more">
+            <i class="el-icon-loading"></i>
+            <span>加载中...</span>
+          </div>
+
+          <!-- 所有数据加载完毕提示 -->
+          <div v-if="campList.length > 0 && !loadingMore" class="no-more-data">
+            <span>—— 已加载全部训练营 ——</span>
+          </div>
+        </div>
+      </el-aside>
+
+      <!-- 右侧区域 -->
+      <el-main><userCourseStatic  ref="userCourseStatic" /></el-main>
+    </el-container>
+
+  </div>
+</template>
+
+<script>
+import { listCamp} from "@/api/course/userCourseCamp";
+import userCourseStatic from './userCourseStatic.vue';
+export default {
+  name: "userCoursePeriod",
+  components: {
+    userCourseStatic
+  },
+  data() {
+    return {
+      // 加载更多状态
+      loadingMore: false,
+      // 激活的训练营索引
+      activeCampIndex: null,
+      // 训练营列表
+      campList: [],
+      // 遮罩层
+      loading: true,
+      updateDateOpen: false,
+      // 左侧遮罩层
+      leftLoading: true,
+      // 左侧查询参数
+      leftQueryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        hasNextPage: false,
+        scs: 'order_number(desc),training_camp_id(desc)',
+        trainingCampName: null,
+        userId:null,
+      },
+    };
+  },
+  created() {
+    // this.getLeftList();
+  },
+  methods: {
+    getDetails(orderId) {
+      this.userId=orderId;
+      this.leftQueryParams.userId=orderId;
+      this.getLeftList();
+    },
+    /** 查询左侧列表 */
+    getLeftList() {
+      this.leftLoading = true;
+      // 重置页码和加载更多状态
+      this.leftQueryParams.pageNum = 1;
+      this.loadingMore = false;
+
+      // 训练营数据
+      listCamp(this.leftQueryParams).then(response => {
+        if (response && response.code === 200) {
+          this.campList = response.data.list || [];
+          this.leftQueryParams.hasNextPage = response.data.hasNextPage;
+          this.activeCampIndex = this.campList.length > 0 ? 0 : null;
+          this.selectCamp(this.activeCampIndex);
+          // 如果当前显示的列表高度不足以触发滚动,但还有更多数据,自动加载下一页
+          this.$nextTick(() => {
+            const scrollEl = this.$refs.campList;
+            if (scrollEl && this.leftQueryParams.hasNextPage && scrollEl.scrollHeight <= scrollEl.clientHeight) {
+              this.loadMoreCamps();
+            }
+          });
+        } else {
+          this.$message.error(response.msg || '获取训练营列表失败');
+          this.campList = [];
+          this.leftQueryParams.hasNextPage = false;
+        }
+        this.leftLoading = false;
+      }).catch(error => {
+        console.error('获取训练营列表失败:', error);
+        this.$message.error('获取训练营列表失败');
+        this.campList = [];
+        this.leftQueryParams.hasNextPage = false;
+        this.leftLoading = false;
+      });
+    },
+    /** 选中训练营 */
+    selectCamp(index) {
+      if(index == null || index == undefined) return;
+      this.activeCampIndex = index;
+      // 加载对应的训练营营期数据
+      const selectedCamp = this.campList[index];
+      console.log(this.userId)
+      this.$refs.userCourseStatic.getDetails(selectedCamp,this.userId);
+      // this.queryParams.trainingCampId = selectedCamp.trainingCampId;
+      // this.getList();
+    },
+    /** 处理滚动事件,实现滚动到底部加载更多 */
+    handleScroll() {
+      // 如果正在节流中或者正在加载中,则不处理
+      if (this.scrollThrottle || this.loadingMore) return;
+
+      // 设置节流,200ms内不再处理滚动事件
+      this.scrollThrottle = true;
+      setTimeout(() => {
+        this.scrollThrottle = false;
+      }, 200);
+
+      const scrollEl = this.$refs.campList;
+      if (!scrollEl) return;
+
+      // 判断是否滚动到底部:滚动高度 + 可视高度 >= 总高度 - 30(添加30px的容差,提前触发加载)
+      const isBottom = scrollEl.scrollTop + scrollEl.clientHeight >= scrollEl.scrollHeight - 30;
+
+      // 如果滚动到底部,且有下一页数据,且当前不在加载中,则加载更多
+      if (isBottom && this.leftQueryParams.hasNextPage && !this.leftLoading && !this.loadingMore) {
+        this.loadMoreCamps();
+      }
+    },
+    /** 加载更多训练营数据 */
+    loadMoreCamps() {
+      // 已在加载中,防止重复加载
+      if (this.leftLoading || this.loadingMore) return;
+
+      // 设置加载状态
+      this.loadingMore = true;
+
+      // 页码加1
+      this.leftQueryParams.pageNum += 1;
+
+      // 加载下一页数据
+      listCamp(this.leftQueryParams).then(response => {
+        if (response && response.code === 200) {
+          // 将新数据追加到列表中
+          const newList = response.data.list || [];
+          if (newList.length > 0) {
+            this.campList = [...this.campList, ...newList];
+          }
+
+          // 更新是否有下一页的标志
+          this.leftQueryParams.hasNextPage = response.data.hasNextPage;
+
+          // 如果当前显示的列表高度不足以触发滚动,但还有更多数据,自动加载下一页
+          this.$nextTick(() => {
+            const scrollEl = this.$refs.campList;
+            if (scrollEl && this.leftQueryParams.hasNextPage && scrollEl.scrollHeight <= scrollEl.clientHeight) {
+              // 延迟一点再加载下一页,避免过快加载
+              setTimeout(() => {
+                this.loadMoreCamps();
+              }, 300);
+            }
+          });
+        } else {
+          this.$message.error(response.msg || '加载更多训练营失败');
+        }
+        this.loadingMore = false;
+      }).catch(error => {
+        console.error('加载更多训练营失败:', error);
+        this.$message.error('加载更多训练营失败');
+        this.loadingMore = false;
+      });
+    },
+
+  },
+};
+</script>
+
+<style scoped>
+.left-aside {
+  background-color: #fff;
+  border-right: 1px solid #EBEEF5;
+  padding: 0;
+  display: flex;
+  flex-direction: column;
+  height: 800px;
+}
+
+.left-header {
+  padding: 10px;
+  border-bottom: 1px solid #EBEEF5;
+}
+
+.left-header-top {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  margin-bottom: 10px;
+}
+
+.search-btn {
+  width: 50%;
+  height: 36px;
+  background-color: #409EFF;
+  color: white;
+  border: none;
+}
+
+.search-input-wrapper {
+  margin-bottom: 10px;
+}
+
+.sort-wrapper {
+  display: flex;
+  align-items: center;
+  margin-bottom: 10px;
+}
+
+.sort-label {
+  width: 70px;
+  font-size: 14px;
+  font-weight: 600;
+  color: #909399;
+}
+
+.sort-select {
+  margin-left: 10px;
+  width: 280px;
+}
+
+.color-wrapper {
+  display: flex;
+  align-items: center;
+  margin-bottom: 10px;
+}
+
+.color-label {
+  width: 70px;
+  color: #606266;
+}
+
+.color-hint {
+  margin-left: 10px;
+  color: #606266;
+  font-size: 12px;
+}
+
+.color-help {
+  margin-left: 5px;
+  color: #909399;
+  cursor: pointer;
+}
+
+.hint-text {
+  color: #606266;
+  font-size: 12px;
+  margin-top: 5px;
+}
+
+.camp-list {
+  flex: 1;
+  overflow-y: auto;
+  padding: 3px;
+}
+
+.camp-item {
+  margin-bottom: 5px;
+  padding: 15px;
+  background-color: #ffffff;
+  position: relative;
+  cursor: pointer;
+  display: flex;
+  justify-content: space-between;
+  border: 1px solid #eaedf2;
+}
+
+.camp-item:last-child {
+  margin-bottom: 0;
+}
+
+.camp-item:hover {
+  background-color: #f5f9ff;
+}
+
+.camp-item.active {
+  background-color: #eaf4ff;
+  border-left: 1px solid #75b8fc;
+}
+
+.camp-content {
+  flex: 1;
+  padding-right: 10px;
+}
+
+.camp-title {
+  font-weight: bold;
+  font-size: 16px;
+  margin-bottom: 8px;
+  color: #333;
+  display: flex;
+  align-items: center;
+}
+
+.camp-icon {
+  font-size: 16px;
+  margin-right: 6px;
+  color: #409EFF;
+}
+
+.camp-info {
+  display: flex;
+  justify-content: space-between;
+  margin-bottom: 8px;
+  font-size: 12px;
+  color: #c4c1c1;
+  line-height: 1.5;
+}
+
+.camp-stats {
+  display: flex;
+  justify-content: space-between;
+  font-size: 12px;
+  color: #666;
+  background-color: #f5f9ff;
+  padding: 6px 10px;
+  border-radius: 4px;
+  line-height: 1.5;
+}
+
+.stat-item {
+  display: flex;
+  align-items: center;
+}
+
+.stat-item i {
+  margin-right: 4px;
+  font-size: 14px;
+  color: #409EFF;
+}
+
+.camp-actions {
+  display: flex;
+  flex-direction: column;
+  justify-content: center;
+  align-items: flex-end;
+  gap: 8px;
+  border-left: 1px dashed #eaedf2;
+  padding-left: 12px;
+  min-width: 50px;
+}
+
+.action-btn {
+  padding: 2px 5px;
+  font-size: 12px;
+  border-radius: 4px;
+  transition: all 0.2s;
+}
+
+.action-btn:hover {
+  background-color: rgba(255, 255, 255, 0.8);
+}
+
+.delete-btn {
+  color: #f56c6c;
+}
+
+.delete-btn:hover {
+  background-color: rgba(245, 108, 108, 0.1);
+}
+
+.copy-btn {
+  color: #409EFF;
+}
+
+.copy-btn:hover {
+  background-color: rgba(64, 158, 255, 0.1);
+}
+
+.warning-icon {
+  color: #E6A23C;
+  font-size: 16px;
+  margin-left: 5px;
+}
+
+.el-main {
+  padding: 10px;
+}
+
+/* 添加训练营表单样式 */
+.drawer-footer {
+  /* position: absolute; */
+  bottom: 0;
+  left: 0;
+  right: 0;
+  padding: 20px;
+  background: #fff;
+  text-align: right;
+  border-top: 1px solid #e8e8e8;
+}
+
+.el-input-number {
+  width: 100%;
+}
+
+/* 加载更多样式 */
+.loading-more {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  padding: 12px 0;
+  color: #909399;
+  font-size: 14px;
+}
+
+.loading-more i {
+  margin-right: 5px;
+  font-size: 16px;
+}
+
+/* 无更多数据提示 */
+.no-more-data {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  padding: 12px 0;
+  color: #c0c4cc;
+  font-size: 13px;
+}
+
+.no-more-data span {
+  position: relative;
+  display: flex;
+  align-items: center;
+}
+/* 添加没有数据提示的样式 */
+.no-data {
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  height: 100vh;  /* 让提示居中,覆盖整个页面 */
+  font-size: 18px;
+  color: #c0c4cc;
+  background-color: #f5f5f5;
+}
+
+</style>

+ 222 - 0
src/views/his/user/userCoursePeriodDetails.vue

@@ -0,0 +1,222 @@
+<template>
+  <div class="statistics-container">
+    <!-- 营期课程选择 -->
+    <div class="fixed-header">
+      <el-form :inline="true" :model="queryParams" class="demo-form-inline">
+        <el-form-item label="营期课程">
+          <el-select
+            v-model="queryParams.periodId"
+            placeholder="请选择营期课程"
+            style="width: 400px"
+            clearable
+          >
+            <el-option
+              v-for="item in courseOptions"
+              :key="item.periodId"
+              :label="item.periodName"
+              :value="item.periodId"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item>
+          <el-button type="primary" @click="handleQuery">查询</el-button>
+        </el-form-item>
+      </el-form>
+
+      <!-- 统计数据展示 -->
+      <el-row :gutter="20" class="statistics-row">
+        <el-col :span="4">
+          <div class="statistics-item">
+            <div class="statistics-title">到课数</div>
+            <div class="statistics-value">{{ statistics.courseCompleteNum || 0 }}次</div>
+          </div>
+        </el-col>
+        <el-col :span="4">
+          <div class="statistics-item">
+            <div class="statistics-title">总学习时长</div>
+            <div class="statistics-value">{{ statistics.courseWatchNum || 0 }}分钟</div>
+          </div>
+        </el-col>
+        <el-col :span="4">
+          <div class="statistics-item">
+            <div class="statistics-title">正确答题数</div>
+            <div class="statistics-value">{{ statistics.correctAnswerNum || 0 }}次</div>
+          </div>
+        </el-col>
+        <el-col :span="4">
+          <div class="statistics-item">
+            <div class="statistics-title">获得红包数</div>
+            <div class="statistics-value">{{ statistics.redPacketCount || 0 }}次</div>
+          </div>
+        </el-col>
+        <el-col :span="4">
+          <div class="statistics-item">
+            <div class="statistics-title">红包总金额</div>
+            <div class="statistics-value">{{ statistics.redPacketAmount || 0 }}元</div>
+          </div>
+        </el-col>
+      </el-row>
+    </div>
+
+  </div>
+</template>
+
+<script>
+import {getDays, periodCourseStatisticCount,periodList} from "@/api/course/userCoursePeriod";
+
+export default {
+  name: "userCoursePeriodDetails",
+  props: {
+    periodId: {
+      type: [String, Number],
+      default: ''
+    },
+    active: {
+      type: Boolean,
+      default: false
+    }
+  },
+  data() {
+    return {
+      // 遮罩层
+      loading: false,
+      // 总条数
+      total: 0,
+      // 课程选项
+      courseOptions: [],
+      // 统计数据
+      statistics: {
+        courseCompleteNum: 0,
+        courseWatchNum: 0,
+        redPacketCount: 0,
+        correctAnswerNum: 0,
+        redPacketAmount: 0
+      },
+      // 列表数据
+      list: [],
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        // videoId: '',
+        periodId: '',
+        trainingCampId:null,
+        userId:null,
+      },
+      // 是否已初始化
+      initialized: false
+    };
+  },
+  created() {
+  },
+  methods: {
+    getDetails(camp,userid) {
+      this.queryParams.trainingCampId = camp.trainingCampId;
+      this.camp = camp;
+      this.userId=userid;
+      this.queryParams.userId=userid;
+      this.user=null;
+      this.courseOptions = []
+      this.queryParams.periodId = null;
+      this.getCourseOptions();
+      this.calculateTotalStatistics();
+    },
+    /** 查询按钮操作 */
+    handleQuery() {
+      this.calculateTotalStatistics();
+    },
+    /** 获取课程选项 */
+    getCourseOptions() {
+
+      this.loading = true;
+      periodList(this.queryParams).then(r => {
+        if (r.code === 200) {
+          this.courseOptions = r.data;
+          this.loading = false;
+        } else {
+          this.$message.error(r.msg || '获取数据失败');
+        }
+        this.loading = false;
+      }).catch(() => {
+        this.loading = false;
+      });
+    },
+
+    /** 计算总统计数据 */
+    calculateTotalStatistics() {
+      console.log("this.queryParams:",this.queryParams)
+      periodCourseStatisticCount(this.queryParams).then(response => {
+        if (response.code === 200) {
+          // 设置列表数据
+          this.statistics.courseCompleteNum = response.data.courseCompleteNum || 0;
+          this.statistics.courseWatchNum = response.data.courseWatchNum || 0;
+          this.statistics.courseWatchTimes = response.data.courseWatchTimes || 0;
+          this.statistics.redPacketCount = response.data.redPacketCount || 0;
+          this.statistics.correctAnswerNum = response.data.correctAnswerNum || 0;
+          this.statistics.redPacketAmount = response.data.redPacketAmount || 0;
+
+        } else {
+          this.$message.error(response.msg || '获取数据失败');
+        }
+        this.loading = false;
+      }).catch(error => {
+        console.error('获取数据失败:', error);
+        this.$message.error('获取数据失败');
+        this.loading = false;
+      });
+
+    }
+  }
+};
+</script>
+
+<style scoped>
+.statistics-container {
+  height: 100%;
+  overflow: hidden;
+  position: relative;
+}
+
+.fixed-header {
+  position: sticky;
+  top: 0;
+  z-index: 10;
+  background-color: #fff;
+  padding: 10px 0;
+  border-bottom: 1px solid #EBEEF5;
+}
+/* 覆盖原有的pagination-container样式 */
+:deep(.pagination-container) {
+  height: auto !important;
+  margin-bottom: 0 !important;
+  margin-top: 0 !important;
+  padding: 0 !important;
+}
+
+.statistics-row {
+  margin: 20px 0;
+}
+
+.statistics-item {
+  background-color: #f5f7fa;
+  border-radius: 4px;
+  padding: 15px;
+  text-align: center;
+  height: 100px;
+  display: flex;
+  flex-direction: column;
+  justify-content: center;
+}
+
+.statistics-title {
+  font-size: 14px;
+  color: #606266;
+  margin-bottom: 10px;
+}
+
+.statistics-value {
+  font-size: 20px;
+  font-weight: bold;
+  color: #303133;
+}
+</style>

+ 57 - 0
src/views/his/user/userCourseStatic.vue

@@ -0,0 +1,57 @@
+<template>
+  <el-tabs v-model="activeName" type="card" @tab-click="handleClick">
+    <el-tab-pane label="数据总览" name="first"><userStaticAll  ref="userStaticAll" /></el-tab-pane>
+    <el-tab-pane label="课节详情" name="second"><userCoursePeriodDetails  ref="userCoursePeriodDetails" /></el-tab-pane>
+    <el-tab-pane label="转化记录" name="third"><userCourseConversionRecord  ref="userCourseConversionRecord" /></el-tab-pane>
+
+  </el-tabs>
+</template>
+<script>
+import userStaticAll from './userStaticAll.vue';
+import userCoursePeriodDetails from './userCoursePeriodDetails.vue';
+import userCourseConversionRecord from './userCourseConversionRecord.vue';
+
+export default {
+  name: "userCourseStatic",
+  components: {
+    userStaticAll,userCoursePeriodDetails,userCourseConversionRecord
+  },
+  data() {
+
+    return {
+      camp:{},
+      userId:null,
+      activeName: 'first'
+    };
+  },
+  methods: {
+    handleClick(tab, event) {
+      if (tab.name === "first"){
+        setTimeout(() => {
+          this.$refs.userStaticAll.getDetails(this.camp,this.userId);
+        }, 1);
+      }else if (tab.name === "second"){
+        setTimeout(() => {
+          this.$refs.userCoursePeriodDetails.getDetails(this.camp,this.userId);
+        }, 1);
+      }else {
+        setTimeout(() => {
+          this.$refs.userCourseConversionRecord.getDetails(this.userId);
+        }, 1);
+      }
+
+    },
+
+    getDetails(camp,userid) {
+      this.camp = camp;
+      this.userId=userid;
+      this.activeName = 'first';
+      // 默认加载“数据总览”接口
+      this.$nextTick(() => {
+        this.$refs.userStaticAll.getDetails(this.camp, this.userId);
+      });
+
+    },
+  }
+};
+</script>

+ 71 - 0
src/views/his/user/userDetails.vue

@@ -0,0 +1,71 @@
+<template>
+  <div>
+    <div style="background-color: #f0f2f5; padding-bottom: 20px; min-height: 100%; " >
+      <div style="padding: 20px; background-color: #fff;">
+        会员详情
+      </div>
+    </div>
+    <template>
+      <el-tabs v-model="activeName"  :tab-position="tabPosition" style="height: 200px;margin: 40px">
+        <el-tab-pane label="基本信息" name="basic"><userDetails  ref="userDetails" /></el-tab-pane>
+        <el-tab-pane label="行为轨迹" name="behavior"><userBehavior  ref="userBehavior" /></el-tab-pane>
+        <el-tab-pane label="训练营"  name="course"><userCoursePeriod  ref="userCoursePeriod" /></el-tab-pane>
+      </el-tabs>
+    </template>
+  </div>
+
+</template>
+
+
+
+<script>
+import userDetails from '../../components/his/userDetails.vue';
+import userBehavior from './userBehavior.vue';
+import userCoursePeriod from './userCoursePeriod.vue';
+
+export default {
+  name: "userDetailsByNew",
+  props:["data"],
+  components: { userDetails,userBehavior,userCoursePeriod},
+  data() {
+    return {
+      activeName: 'basic',
+      // 左侧遮罩层
+      leftLoading: true,
+      // 左侧查询参数
+      leftQueryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        hasNextPage: false,
+        scs: 'order_number(desc),training_camp_id(desc)',
+        trainingCampName: null,
+        userId:null,
+      },
+      tabPosition: 'top',
+    }
+  },
+  created() {
+
+  },
+  methods: {
+    handleClick(tab, event) {
+      console.log(tab, event);
+    },
+    getDetails(userId) {
+      this. activeName='basic';
+      setTimeout(() => {
+        this.$refs.userDetails.getDetails(userId);
+      }, 1);
+      setTimeout(() => {
+        this.$refs.userBehavior.getDetails(userId);
+      }, 1);
+      setTimeout(() => {
+        this.$refs.userCoursePeriod.getDetails(userId);
+      }, 1);
+    },
+  }
+}
+</script>
+<style>
+
+</style>

+ 248 - 0
src/views/his/user/userStaticAll.vue

@@ -0,0 +1,248 @@
+<template>
+  <div class="statistics-container">
+    <!-- 营期课程选择 -->
+    <div class="fixed-header">
+      <!-- 统计数据展示 -->
+      <el-row :gutter="20" class="statistics-row">
+        <el-col :span="4">
+          <div class="statistics-item">
+            <div class="statistics-title">到课数</div>
+            <div class="statistics-value">{{ statistics.courseCompleteNum || 0 }}次</div>
+          </div>
+        </el-col>
+        <el-col :span="4">
+          <div class="statistics-item">
+            <div class="statistics-title">总学习时长</div>
+            <div class="statistics-value">{{ statistics.courseWatchNum || 0 }}分钟</div>
+          </div>
+        </el-col>
+        <el-col :span="4">
+          <div class="statistics-item">
+            <div class="statistics-title">正确答题数</div>
+            <div class="statistics-value">{{ statistics.correctAnswerNum || 0 }}次</div>
+          </div>
+        </el-col>
+        <el-col :span="4">
+          <div class="statistics-item">
+            <div class="statistics-title">获得红包数</div>
+            <div class="statistics-value">{{ statistics.redPacketCount || 0 }}次</div>
+          </div>
+        </el-col>
+        <el-col :span="4">
+          <div class="statistics-item">
+            <div class="statistics-title">红包总金额</div>
+            <div class="statistics-value">{{ statistics.redPacketAmount || 0 }}元</div>
+          </div>
+        </el-col>
+      </el-row>
+    </div>
+
+    <!-- 列表统计展示 -->
+    <div class="table-wrapper">
+      <el-table v-loading="loading" :data="list">
+        <el-table-column type="index" label="序号" width="50" align="center" fixed/>
+        <el-table-column prop="courseName" label="课程名称" align="center" min-width="100" fixed/>
+        <el-table-column prop="videoName" label="课节名称" align="center" min-width="100" fixed/>
+        <el-table-column label="记录类型" align="center" prop="logType">
+          <template slot-scope="scope">
+            <el-tag prop="type" v-for="(item, index) in typeOptions" v-if="scope.row.logType==item.dictValue">{{item.dictLabel}}</el-tag>
+          </template>
+        </el-table-column>
+        <el-table-column prop="duration" label="播放时长" align="center" min-width="100"/>
+        <el-table-column prop="finishTime" label="完课时间" align="center" min-width="120"/>
+      </el-table>
+
+      <!-- 分页 -->
+      <div class="custom-pagination-container">
+        <pagination
+          v-show="total > 0"
+          :total="total"
+          :page.sync="queryParams.pageNum"
+          :limit.sync="queryParams.pageSize"
+          @pagination="getCountList"
+        />
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import {periodCourseStatisticCount} from "@/api/course/userCoursePeriod";
+import { listBytrainingCampId } from "@/api/course/qw/courseWatchLog";
+
+
+export default {
+  name: "userStaticAll",
+  props: {
+    periodId: {
+      type: [String, Number],
+      default: ''
+    },
+    active: {
+      type: Boolean,
+      default: false
+    }
+  },
+  data() {
+    return {
+      typeOptions: [],
+      // 遮罩层
+      loading: false,
+      // 总条数
+      total: 0,
+      // 统计数据
+      statistics: {
+        courseCompleteNum: 0,
+        courseWatchNum: 0,
+        redPacketCount: 0,
+        correctAnswerNum: 0,
+        redPacketAmount: 0
+      },
+      // 列表数据
+      list: [],
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        // videoId: '',
+        periodId: '',
+        trainingCampId:null,
+        userId:null,
+      },
+    };
+  },
+  created() {
+    this.getDicts("sys_course_watch_log_type").then((response) => {
+      this.typeOptions = response.data;
+    });
+  },
+  methods: {
+    getDetails(camp,userid) {
+    this.queryParams.trainingCampId = camp.trainingCampId;
+      this.camp = camp;
+      this.userId=userid;
+      this.queryParams.userId=userid;
+      this.user=null;
+      if (this.queryParams.trainingCampId){
+        this.getCountList();
+        this.calculateTotalStatistics();
+      }
+
+    },
+    /** 获取列表数据 */
+    getCountList() {
+      this.loading = true;
+      if (!this.queryParams.trainingCampId || !this.queryParams.userId){
+        return
+      }
+      listBytrainingCampId(this.queryParams).then(response => {
+        if (response.code === 200) {
+          // 设置列表数据
+          this.list = response.rows;
+          this.total = response.total || 0;
+
+
+        } else {
+          this.$message.error(response.msg || '获取数据失败');
+        }
+        this.loading = false;
+      }).catch(error => {
+        console.error('获取数据失败:', error);
+        this.$message.error('获取数据失败');
+        this.loading = false;
+      });
+    },
+    /** 计算总统计数据 */
+    calculateTotalStatistics() {
+
+      console.log("this.queryParams:",this.queryParams)
+      periodCourseStatisticCount(this.queryParams).then(response => {
+        if (response.code === 200) {
+          // 设置列表数据
+          this.statistics.courseCompleteNum = response.data.courseCompleteNum || 0;
+          this.statistics.courseWatchNum = response.data.courseWatchNum || 0;
+          this.statistics.courseWatchTimes = response.data.courseWatchTimes || 0;
+          this.statistics.redPacketCount = response.data.redPacketCount || 0;
+          this.statistics.correctAnswerNum = response.data.correctAnswerNum || 0;
+          this.statistics.redPacketAmount = response.data.redPacketAmount || 0;
+
+        } else {
+          this.$message.error(response.msg || '获取数据失败');
+        }
+        this.loading = false;
+      }).catch(error => {
+        console.error('获取数据失败:', error);
+        this.$message.error('获取数据失败');
+        this.loading = false;
+      });
+
+    }
+  }
+};
+</script>
+
+<style scoped>
+.statistics-container {
+  height: 100%;
+  overflow: hidden;
+  position: relative;
+}
+
+.fixed-header {
+  position: sticky;
+  top: 0;
+  z-index: 10;
+  background-color: #fff;
+  padding: 10px 0;
+  border-bottom: 1px solid #EBEEF5;
+}
+
+.table-wrapper {
+  height: calc(100% - 220px);
+  overflow: visible;
+  position: relative;
+}
+
+.custom-pagination-container {
+  padding: 10px 0 12px 0;
+  text-align: right;
+  background-color: #fff;
+  position: relative;
+  z-index: 1;
+}
+
+/* 覆盖原有的pagination-container样式 */
+:deep(.pagination-container) {
+  height: auto !important;
+  margin-bottom: 0 !important;
+  margin-top: 0 !important;
+  padding: 0 !important;
+}
+
+.statistics-row {
+  margin: 20px 0;
+}
+
+.statistics-item {
+  background-color: #f5f7fa;
+  border-radius: 4px;
+  padding: 15px;
+  text-align: center;
+  height: 100px;
+  display: flex;
+  flex-direction: column;
+  justify-content: center;
+}
+
+.statistics-title {
+  font-size: 14px;
+  color: #606266;
+  margin-bottom: 10px;
+}
+
+.statistics-value {
+  font-size: 20px;
+  font-weight: bold;
+  color: #303133;
+}
+</style>

+ 3 - 2
src/views/index.vue

@@ -219,6 +219,7 @@
 
         <div class="action-group">
           <el-radio-group v-model="userTypeText" @change="handleUserType">
+            <el-radio-button label="会员"></el-radio-button>
             <el-radio-button label="企微"></el-radio-button>
           </el-radio-group>
 
@@ -857,8 +858,8 @@ export default {
       smsRemainCount: 0,
       viewerType: '0',
       viewerChart: null,
-      userTypeText: '企微',
-      userType: 2,
+      userTypeText: process.env.VUE_APP_COURSE_DEFAULT==1?"会员":"企微",
+      userType: process.env.VUE_APP_COURSE_DEFAULT,
       dealerChart: null,
       // 分公司数量
       dealderCount: 0,

+ 10 - 1
src/views/live/live/index.vue

@@ -103,6 +103,13 @@
             @click="handleDelete(scope.row)"
             v-hasPermi="['live:live:remove']"
           >删除</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-monitor"
+            @click="handleManage(scope.row)"
+            v-hasPermi="['live:live:remove']"
+          >管理</el-button>
         </template>
       </el-table-column>
     </el-table>
@@ -181,7 +188,6 @@
 <script>
 import { listLive, getLive, delLive, addLive, updateLive, exportLive } from "@/api/live/live";
 import Editor from '@/components/Editor/wang';
-import articleDetails from "@/views/components/his/doctorArticleDetails.vue";
 
 export default {
   name: "Live",
@@ -420,6 +426,9 @@ export default {
           this.msgSuccess("删除成功");
         }).catch(() => {});
     },
+    handleManage(row) {
+      this.$router.push('/live/liveConsole/' + row.liveId)
+    },
     /** 导出按钮操作 */
     handleExport() {
       const queryParams = this.queryParams;

+ 331 - 0
src/views/live/liveAfterSalesItem/index.vue

@@ -0,0 +1,331 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="售后id" prop="afterSalesId">
+        <el-input
+          v-model="queryParams.afterSalesId"
+          placeholder="请输入售后id"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="直播商品ID" prop="goodsId">
+        <el-input
+          v-model="queryParams.goodsId"
+          placeholder="请输入直播商品ID"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="商品id" prop="productId">
+        <el-input
+          v-model="queryParams.productId"
+          placeholder="请输入商品id"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="逻辑删除" prop="isDel">
+        <el-input
+          v-model="queryParams.isDel"
+          placeholder="请输入逻辑删除"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="逻辑删除" prop="productAttrValueId">
+        <el-input
+          v-model="queryParams.productAttrValueId"
+          placeholder="请输入逻辑删除"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['live:liveAfterSalesItem:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['live:liveAfterSalesItem:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['live:liveAfterSalesItem:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          :loading="exportLoading"
+          @click="handleExport"
+          v-hasPermi="['live:liveAfterSalesItem:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table border v-loading="loading" :data="liveAfterSalesItemList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="主键id" align="center" prop="id" />
+      <el-table-column label="售后id" align="center" prop="afterSalesId" />
+      <el-table-column label="直播商品ID" align="center" prop="goodsId" />
+      <el-table-column label="商品id" align="center" prop="productId" />
+      <el-table-column label="退货东西的详情信息" align="center" prop="jsonInfo" />
+      <el-table-column label="逻辑删除" align="center" prop="isDel" />
+      <el-table-column label="逻辑删除" align="center" prop="productAttrValueId" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['live:liveAfterSalesItem:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['live:liveAfterSalesItem:remove']"
+          >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改售后子对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="售后id" prop="afterSalesId">
+          <el-input v-model="form.afterSalesId" placeholder="请输入售后id" />
+        </el-form-item>
+        <el-form-item label="直播商品ID" prop="goodsId">
+          <el-input v-model="form.goodsId" placeholder="请输入直播商品ID" />
+        </el-form-item>
+        <el-form-item label="商品id" prop="productId">
+          <el-input v-model="form.productId" placeholder="请输入商品id" />
+        </el-form-item>
+        <el-form-item label="退货东西的详情信息" prop="jsonInfo">
+          <el-input v-model="form.jsonInfo" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="逻辑删除" prop="isDel">
+          <el-input v-model="form.isDel" placeholder="请输入逻辑删除" />
+        </el-form-item>
+        <el-form-item label="逻辑删除" prop="productAttrValueId">
+          <el-input v-model="form.productAttrValueId" placeholder="请输入逻辑删除" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listLiveAfterSalesItem, getLiveAfterSalesItem, delLiveAfterSalesItem, addLiveAfterSalesItem, updateLiveAfterSalesItem, exportLiveAfterSalesItem } from "@/api/live/liveAfterSalesItem";
+
+export default {
+  name: "LiveAfterSalesItem",
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 导出遮罩层
+      exportLoading: false,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 售后子表格数据
+      liveAfterSalesItemList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        afterSalesId: null,
+        goodsId: null,
+        productId: null,
+        jsonInfo: null,
+        isDel: null,
+        productAttrValueId: null
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        jsonInfo: [
+          { required: true, message: "退货东西的详情信息不能为空", trigger: "blur" }
+        ],
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 查询售后子列表 */
+    getList() {
+      this.loading = true;
+      listLiveAfterSalesItem(this.queryParams).then(response => {
+        this.liveAfterSalesItemList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        afterSalesId: null,
+        goodsId: null,
+        productId: null,
+        jsonInfo: null,
+        isDel: null,
+        productAttrValueId: null
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加售后子";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getLiveAfterSalesItem(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改售后子";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateLiveAfterSalesItem(this.form).then(response => {
+              this.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addLiveAfterSalesItem(this.form).then(response => {
+              this.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$confirm('是否确认删除售后子编号为"' + ids + '"的数据项?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(function() {
+          return delLiveAfterSalesItem(ids);
+        }).then(() => {
+          this.getList();
+          this.msgSuccess("删除成功");
+        }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('是否确认导出所有售后子数据项?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(() => {
+          this.exportLoading = true;
+          return exportLiveAfterSalesItem(queryParams);
+        }).then(response => {
+          this.download(response.msg);
+          this.exportLoading = false;
+        }).catch(() => {});
+    }
+  }
+};
+</script>

+ 358 - 0
src/views/live/liveAfterSalesLogs/index.vue

@@ -0,0 +1,358 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="售后id" prop="storeAfterSalesId">
+        <el-input
+          v-model="queryParams.storeAfterSalesId"
+          placeholder="请输入售后id"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="操作类型" prop="changeType">
+        <el-select v-model="queryParams.changeType" placeholder="请选择操作类型" clearable size="small">
+          <el-option label="请选择字典生成" value="" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="操作备注" prop="changeMessage">
+        <el-input
+          v-model="queryParams.changeMessage"
+          placeholder="请输入操作备注"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="操作时间" prop="changeTime">
+        <el-date-picker clearable size="small"
+          v-model="queryParams.changeTime"
+          type="date"
+          value-format="yyyy-MM-dd"
+          placeholder="选择操作时间">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item label="操作人" prop="operator">
+        <el-input
+          v-model="queryParams.operator"
+          placeholder="请输入操作人"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="公司id" prop="companyId">
+        <el-input
+          v-model="queryParams.companyId"
+          placeholder="请输入公司id"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="店铺id" prop="storeId">
+        <el-input
+          v-model="queryParams.storeId"
+          placeholder="请输入店铺id"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['live:liveAfterSalesLogs:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['live:liveAfterSalesLogs:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['live:liveAfterSalesLogs:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          :loading="exportLoading"
+          @click="handleExport"
+          v-hasPermi="['live:liveAfterSalesLogs:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table border v-loading="loading" :data="liveAfterSalesLogsList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="店铺id" align="center" prop="logsId" />
+      <el-table-column label="售后id" align="center" prop="storeAfterSalesId" />
+      <el-table-column label="操作类型" align="center" prop="changeType" />
+      <el-table-column label="操作备注" align="center" prop="changeMessage" />
+      <el-table-column label="操作时间" align="center" prop="changeTime" width="180">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.changeTime, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作人" align="center" prop="operator" />
+      <el-table-column label="公司id" align="center" prop="companyId" />
+      <el-table-column label="店铺id" align="center" prop="storeId" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['live:liveAfterSalesLogs:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['live:liveAfterSalesLogs:remove']"
+          >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改售后订单操作对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="售后id" prop="storeAfterSalesId">
+          <el-input v-model="form.storeAfterSalesId" placeholder="请输入售后id" />
+        </el-form-item>
+        <el-form-item label="操作类型" prop="changeType">
+          <el-select v-model="form.changeType" placeholder="请选择操作类型">
+            <el-option label="请选择字典生成" value="" />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="操作备注" prop="changeMessage">
+          <el-input v-model="form.changeMessage" placeholder="请输入操作备注" />
+        </el-form-item>
+        <el-form-item label="操作时间" prop="changeTime">
+          <el-date-picker clearable size="small"
+            v-model="form.changeTime"
+            type="date"
+            value-format="yyyy-MM-dd"
+            placeholder="选择操作时间">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="操作人" prop="operator">
+          <el-input v-model="form.operator" placeholder="请输入操作人" />
+        </el-form-item>
+        <el-form-item label="公司id" prop="companyId">
+          <el-input v-model="form.companyId" placeholder="请输入公司id" />
+        </el-form-item>
+        <el-form-item label="店铺id" prop="storeId">
+          <el-input v-model="form.storeId" placeholder="请输入店铺id" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listLiveAfterSalesLogs, getLiveAfterSalesLogs, delLiveAfterSalesLogs, addLiveAfterSalesLogs, updateLiveAfterSalesLogs, exportLiveAfterSalesLogs } from "@/api/live/liveAfterSalesLogs";
+
+export default {
+  name: "LiveAfterSalesLogs",
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 导出遮罩层
+      exportLoading: false,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 售后订单操作表格数据
+      liveAfterSalesLogsList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        storeAfterSalesId: null,
+        changeType: null,
+        changeMessage: null,
+        changeTime: null,
+        operator: null,
+        companyId: null,
+        storeId: null
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 查询售后订单操作列表 */
+    getList() {
+      this.loading = true;
+      listLiveAfterSalesLogs(this.queryParams).then(response => {
+        this.liveAfterSalesLogsList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        logsId: null,
+        storeAfterSalesId: null,
+        changeType: null,
+        changeMessage: null,
+        changeTime: null,
+        operator: null,
+        companyId: null,
+        storeId: null
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.logsId)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加售后订单操作";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const logsId = row.logsId || this.ids
+      getLiveAfterSalesLogs(logsId).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改售后订单操作";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.logsId != null) {
+            updateLiveAfterSalesLogs(this.form).then(response => {
+              this.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addLiveAfterSalesLogs(this.form).then(response => {
+              this.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const logsIds = row.logsId || this.ids;
+      this.$confirm('是否确认删除售后订单操作编号为"' + logsIds + '"的数据项?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(function() {
+          return delLiveAfterSalesLogs(logsIds);
+        }).then(() => {
+          this.getList();
+          this.msgSuccess("删除成功");
+        }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('是否确认导出所有售后订单操作数据项?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(() => {
+          this.exportLoading = true;
+          return exportLiveAfterSalesLogs(queryParams);
+        }).then(response => {
+          this.download(response.msg);
+          this.exportLoading = false;
+        }).catch(() => {});
+    }
+  }
+};
+</script>

+ 531 - 0
src/views/live/liveAfteraSales/index.vue

@@ -0,0 +1,531 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="直播ID" prop="liveId">
+        <el-input
+          v-model="queryParams.liveId"
+          placeholder="请输入直播ID"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="店铺ID" prop="storeId">
+        <el-input
+          v-model="queryParams.storeId"
+          placeholder="请输入店铺ID"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="订单ID" prop="orderId">
+        <el-input
+          v-model="queryParams.orderId"
+          placeholder="请输入订单ID"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="退款金额" prop="refundAmount">
+        <el-input
+          v-model="queryParams.refundAmount"
+          placeholder="请输入退款金额"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="服务类型0仅退款1退货退款" prop="refundType">
+        <el-select v-model="queryParams.refundType" placeholder="请选择服务类型0仅退款1退货退款" clearable size="small">
+          <el-option label="请选择字典生成" value="" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="物流公司编码" prop="deliveryCode">
+        <el-input
+          v-model="queryParams.deliveryCode"
+          placeholder="请输入物流公司编码"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="物流单号" prop="deliverySn">
+        <el-input
+          v-model="queryParams.deliverySn"
+          placeholder="请输入物流单号"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="物流名称" prop="deliveryName">
+        <el-input
+          v-model="queryParams.deliveryName"
+          placeholder="请输入物流名称"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="状态 0已提交等待平台审核 1平台已审核 等待用户发货 2 用户已发货待仓库审核 3财务审核 4退款成功" prop="status">
+        <el-select v-model="queryParams.status" placeholder="请选择状态 0已提交等待平台审核 1平台已审核 等待用户发货 2 用户已发货待仓库审核 3财务审核 4退款成功" clearable size="small">
+          <el-option label="请选择字典生成" value="" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="售后状态 0售后中 1用户取消2商家拒绝 3已完成" prop="salesStatus">
+        <el-select v-model="queryParams.salesStatus" placeholder="请选择售后状态 0售后中 1用户取消2商家拒绝 3已完成" clearable size="small">
+          <el-option label="请选择字典生成" value="" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="订单状态" prop="orderStatus">
+        <el-select v-model="queryParams.orderStatus" placeholder="请选择订单状态" clearable size="small">
+          <el-option label="请选择字典生成" value="" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="用户id" prop="userId">
+        <el-input
+          v-model="queryParams.userId"
+          placeholder="请输入用户id"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="商家收货人" prop="consignee">
+        <el-input
+          v-model="queryParams.consignee"
+          placeholder="请输入商家收货人"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="商家手机号" prop="phoneNumber">
+        <el-input
+          v-model="queryParams.phoneNumber"
+          placeholder="请输入商家手机号"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="商家地址" prop="address">
+        <el-input
+          v-model="queryParams.address"
+          placeholder="请输入商家地址"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="商家地址" prop="companyId">
+        <el-input
+          v-model="queryParams.companyId"
+          placeholder="请输入商家地址"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="商家地址" prop="companyUserId">
+        <el-input
+          v-model="queryParams.companyUserId"
+          placeholder="请输入商家地址"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="部门id" prop="deptId">
+        <el-input
+          v-model="queryParams.deptId"
+          placeholder="请输入部门id"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['live:liveAfteraSales:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['live:liveAfteraSales:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['live:liveAfteraSales:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          :loading="exportLoading"
+          @click="handleExport"
+          v-hasPermi="['live:liveAfteraSales:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table border v-loading="loading" :data="liveAfteraSalesList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="部门id" align="center" prop="id" />
+      <el-table-column label="直播ID" align="center" prop="liveId" />
+      <el-table-column label="店铺ID" align="center" prop="storeId" />
+      <el-table-column label="订单ID" align="center" prop="orderId" />
+      <el-table-column label="退款金额" align="center" prop="refundAmount" />
+      <el-table-column label="服务类型0仅退款1退货退款" align="center" prop="refundType" />
+      <el-table-column label="申请原因" align="center" prop="reasons" />
+      <el-table-column label="说明" align="center" prop="explains" />
+      <el-table-column label="说明图片-&gt;多个用逗号分割" align="center" prop="explainImg" />
+      <el-table-column label="物流公司编码" align="center" prop="deliveryCode" />
+      <el-table-column label="物流单号" align="center" prop="deliverySn" />
+      <el-table-column label="物流名称" align="center" prop="deliveryName" />
+      <el-table-column label="状态 0已提交等待平台审核 1平台已审核 等待用户发货 2 用户已发货待仓库审核 3财务审核 4退款成功" align="center" prop="status" />
+      <el-table-column label="售后状态 0售后中 1用户取消2商家拒绝 3已完成" align="center" prop="salesStatus" />
+      <el-table-column label="订单状态" align="center" prop="orderStatus" />
+      <el-table-column label="逻辑删除" align="center" prop="isDel" />
+      <el-table-column label="用户id" align="center" prop="userId" />
+      <el-table-column label="商家收货人" align="center" prop="consignee" />
+      <el-table-column label="商家手机号" align="center" prop="phoneNumber" />
+      <el-table-column label="商家地址" align="center" prop="address" />
+      <el-table-column label="商家地址" align="center" prop="companyId" />
+      <el-table-column label="商家地址" align="center" prop="companyUserId" />
+      <el-table-column label="部门id" align="center" prop="deptId" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['live:liveAfteraSales:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['live:liveAfteraSales:remove']"
+          >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改售后记录对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="直播ID" prop="liveId">
+          <el-input v-model="form.liveId" placeholder="请输入直播ID" />
+        </el-form-item>
+        <el-form-item label="店铺ID" prop="storeId">
+          <el-input v-model="form.storeId" placeholder="请输入店铺ID" />
+        </el-form-item>
+        <el-form-item label="订单ID" prop="orderId">
+          <el-input v-model="form.orderId" placeholder="请输入订单ID" />
+        </el-form-item>
+        <el-form-item label="退款金额" prop="refundAmount">
+          <el-input v-model="form.refundAmount" placeholder="请输入退款金额" />
+        </el-form-item>
+        <el-form-item label="服务类型0仅退款1退货退款" prop="refundType">
+          <el-select v-model="form.refundType" placeholder="请选择服务类型0仅退款1退货退款">
+            <el-option label="请选择字典生成" value="" />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="申请原因" prop="reasons">
+          <el-input v-model="form.reasons" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="说明" prop="explains">
+          <el-input v-model="form.explains" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="说明图片-&gt;多个用逗号分割" prop="explainImg">
+          <el-input v-model="form.explainImg" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="物流公司编码" prop="deliveryCode">
+          <el-input v-model="form.deliveryCode" placeholder="请输入物流公司编码" />
+        </el-form-item>
+        <el-form-item label="物流单号" prop="deliverySn">
+          <el-input v-model="form.deliverySn" placeholder="请输入物流单号" />
+        </el-form-item>
+        <el-form-item label="物流名称" prop="deliveryName">
+          <el-input v-model="form.deliveryName" placeholder="请输入物流名称" />
+        </el-form-item>
+        <el-form-item label="状态 0已提交等待平台审核 1平台已审核 等待用户发货 2 用户已发货待仓库审核 3财务审核 4退款成功">
+          <el-radio-group v-model="form.status">
+            <el-radio label="1">请选择字典生成</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="售后状态 0售后中 1用户取消2商家拒绝 3已完成">
+          <el-radio-group v-model="form.salesStatus">
+            <el-radio label="1">请选择字典生成</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="订单状态">
+          <el-radio-group v-model="form.orderStatus">
+            <el-radio label="1">请选择字典生成</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="用户id" prop="userId">
+          <el-input v-model="form.userId" placeholder="请输入用户id" />
+        </el-form-item>
+        <el-form-item label="商家收货人" prop="consignee">
+          <el-input v-model="form.consignee" placeholder="请输入商家收货人" />
+        </el-form-item>
+        <el-form-item label="商家手机号" prop="phoneNumber">
+          <el-input v-model="form.phoneNumber" placeholder="请输入商家手机号" />
+        </el-form-item>
+        <el-form-item label="商家地址" prop="address">
+          <el-input v-model="form.address" placeholder="请输入商家地址" />
+        </el-form-item>
+        <el-form-item label="商家地址" prop="companyId">
+          <el-input v-model="form.companyId" placeholder="请输入商家地址" />
+        </el-form-item>
+        <el-form-item label="商家地址" prop="companyUserId">
+          <el-input v-model="form.companyUserId" placeholder="请输入商家地址" />
+        </el-form-item>
+        <el-form-item label="部门id" prop="deptId">
+          <el-input v-model="form.deptId" placeholder="请输入部门id" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listLiveAfteraSales, getLiveAfteraSales, delLiveAfteraSales, addLiveAfteraSales, updateLiveAfteraSales, exportLiveAfteraSales } from "@/api/live/liveAfteraSales";
+
+export default {
+  name: "LiveAfteraSales",
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 导出遮罩层
+      exportLoading: false,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 售后记录表格数据
+      liveAfteraSalesList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        liveId: null,
+        storeId: null,
+        orderId: null,
+        refundAmount: null,
+        refundType: null,
+        reasons: null,
+        explains: null,
+        explainImg: null,
+        deliveryCode: null,
+        deliverySn: null,
+        deliveryName: null,
+        status: null,
+        salesStatus: null,
+        orderStatus: null,
+        isDel: null,
+        userId: null,
+        consignee: null,
+        phoneNumber: null,
+        address: null,
+        companyId: null,
+        companyUserId: null,
+        deptId: null
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 查询售后记录列表 */
+    getList() {
+      this.loading = true;
+      listLiveAfteraSales(this.queryParams).then(response => {
+        this.liveAfteraSalesList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        liveId: null,
+        storeId: null,
+        orderId: null,
+        refundAmount: null,
+        refundType: null,
+        reasons: null,
+        explains: null,
+        explainImg: null,
+        deliveryCode: null,
+        deliverySn: null,
+        deliveryName: null,
+        status: 0,
+        salesStatus: 0,
+        orderStatus: 0,
+        createTime: null,
+        isDel: null,
+        userId: null,
+        consignee: null,
+        phoneNumber: null,
+        address: null,
+        companyId: null,
+        companyUserId: null,
+        deptId: null
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加售后记录";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getLiveAfteraSales(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改售后记录";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateLiveAfteraSales(this.form).then(response => {
+              this.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addLiveAfteraSales(this.form).then(response => {
+              this.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$confirm('是否确认删除售后记录编号为"' + ids + '"的数据项?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(function() {
+          return delLiveAfteraSales(ids);
+        }).then(() => {
+          this.getList();
+          this.msgSuccess("删除成功");
+        }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('是否确认导出所有售后记录数据项?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(() => {
+          this.exportLoading = true;
+          return exportLiveAfteraSales(queryParams);
+        }).then(response => {
+          this.download(response.msg);
+          this.exportLoading = false;
+        }).catch(() => {});
+    }
+  }
+};
+</script>

+ 76 - 68
src/views/live/liveAnchor/index.vue

@@ -1,69 +1,57 @@
 <template>
   <div class="app-container">
     <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
-      <el-form-item label="昵称" prop="nickName">
-        <el-input
-          v-model="queryParams.nickName"
-          placeholder="请输入昵称"
-          clearable
-          size="small"
-          @keyup.enter.native="handleQuery"
-        />
-      </el-form-item>
-      <el-form-item label="密码" prop="password">
-        <el-input
-          v-model="queryParams.password"
-          placeholder="请输入密码"
-          clearable
-          size="small"
-          @keyup.enter.native="handleQuery"
-        />
-      </el-form-item>
-      <el-form-item label="手机号" prop="mobile">
-        <el-input
-          v-model="queryParams.mobile"
-          placeholder="请输入手机号"
-          clearable
-          size="small"
-          @keyup.enter.native="handleQuery"
-        />
-      </el-form-item>
-      <el-form-item label="微信OPENID" prop="openId">
-        <el-input
-          v-model="queryParams.openId"
-          placeholder="请输入微信OPENID"
-          clearable
-          size="small"
-          @keyup.enter.native="handleQuery"
-        />
-      </el-form-item>
-      <el-form-item label="身份证反面" prop="idCardBackUrl">
-        <el-input
-          v-model="queryParams.idCardBackUrl"
-          placeholder="请输入身份证反面"
-          clearable
-          size="small"
-          @keyup.enter.native="handleQuery"
-        />
-      </el-form-item>
-      <el-form-item label="身份证正面" prop="idCardFrontUrl">
-        <el-input
-          v-model="queryParams.idCardFrontUrl"
-          placeholder="请输入身份证正面"
-          clearable
-          size="small"
-          @keyup.enter.native="handleQuery"
-        />
-      </el-form-item>
-      <el-form-item label="状态  1正常 0禁用" prop="status">
-        <el-select v-model="queryParams.status" placeholder="请选择状态  1正常 0禁用" clearable size="small">
-          <el-option label="请选择字典生成" value="" />
-        </el-select>
-      </el-form-item>
-      <el-form-item>
-        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
-        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
-      </el-form-item>
+      <el-row :gutter="10">
+        <el-col :span="6">
+          <el-form-item label="昵称" prop="nickName">
+            <el-input
+              v-model="queryParams.nickName"
+              placeholder="请输入昵称"
+              clearable
+              size="small"
+              @keyup.enter.native="handleQuery"
+            />
+          </el-form-item>
+        </el-col>
+        <el-col :span="6">
+          <el-form-item label="手机号" prop="mobile">
+            <el-input
+              v-model="queryParams.mobile"
+              placeholder="请输入手机号"
+              clearable
+              size="small"
+              @keyup.enter.native="handleQuery"
+            />
+          </el-form-item>
+        </el-col>
+        <el-col :span="6">
+          <el-form-item label="微信OPENID" prop="openId">
+            <el-input
+              v-model="queryParams.openId"
+              placeholder="请输入微信OPENID"
+              clearable
+              size="small"
+              @keyup.enter.native="handleQuery"
+            />
+          </el-form-item>
+        </el-col>
+        <el-col :span="6">
+          <el-form-item label="状态" prop="status">
+            <el-select v-model="queryParams.status" placeholder="请选择状态" clearable size="small">
+              <el-option
+                v-for="dict in statusOptions"
+                :key="dict.dictValue"
+                :label="dict.dictLabel"
+                :value="dict.dictValue"
+              ></el-option>
+            </el-select>
+          </el-form-item>
+        </el-col>
+      </el-row>
+        <el-form-item>
+          <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+          <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+        </el-form-item>
     </el-form>
 
     <el-row :gutter="10" class="mb8">
@@ -122,7 +110,7 @@
       <el-table-column label="微信OPENID" align="center" prop="openId" />
       <el-table-column label="身份证反面" align="center" prop="idCardBackUrl" />
       <el-table-column label="身份证正面" align="center" prop="idCardFrontUrl" />
-      <el-table-column label="状态  1正常 0禁用" align="center" prop="status" />
+      <el-table-column label="状态" align="center" prop="status" :formatter="anchorStatusFormatter"/>
       <el-table-column label="备注" align="center" prop="remark" />
       <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
         <template slot-scope="scope">
@@ -168,14 +156,17 @@
           <el-input v-model="form.openId" placeholder="请输入微信OPENID" />
         </el-form-item>
         <el-form-item label="身份证反面" prop="idCardBackUrl">
-          <el-input v-model="form.idCardBackUrl" placeholder="请输入身份证反面" />
+          <ImageUpload  v-model="form.idCardBackUrl" type="image" :limit=2 :width="150"
+                        :height="150"/>
         </el-form-item>
         <el-form-item label="身份证正面" prop="idCardFrontUrl">
-          <el-input v-model="form.idCardFrontUrl" placeholder="请输入身份证正面" />
+          <ImageUpload  v-model="form.idCardFrontUrl" type="image" :limit=1 :width="150"
+                       :height="150"/>
+<!--          示例图片-->
         </el-form-item>
-        <el-form-item label="状态  1正常 0禁用">
+        <el-form-item label="状态">
           <el-radio-group v-model="form.status">
-            <el-radio label="1">请选择字典生成</el-radio>
+            <el-radio :label="item.dictValue" v-for="item in statusOptions" >{{item.dictLabel}}</el-radio>
           </el-radio-group>
         </el-form-item>
         <el-form-item label="备注" prop="remark">
@@ -197,6 +188,8 @@ export default {
   name: "LiveAnchor",
   data() {
     return {
+      //字典
+      statusOptions: [],
       // 遮罩层
       loading: true,
       // 导出遮罩层
@@ -238,6 +231,9 @@ export default {
   },
   created() {
     this.getList();
+    this.getDicts("sys_live_anchor_status").then(response => {
+      this.statusOptions = response.data;
+    });
   },
   methods: {
     /** 查询主播列表 */
@@ -249,6 +245,9 @@ export default {
         this.loading = false;
       });
     },
+    anchorStatusFormatter(row, column) {
+      return this.selectDictLabel(this.statusOptions, row.status);
+    },
     // 取消按钮
     cancel() {
       this.open = false;
@@ -357,3 +356,12 @@ export default {
   }
 };
 </script>
+<style >
+.el-form-item__label {
+  width: 120px !important;
+}
+.el-input {
+  width: 80% !important;
+}
+
+</style>

+ 369 - 0
src/views/live/liveCart/index.vue

@@ -0,0 +1,369 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="直播间ID" prop="liveId">
+        <el-input
+          v-model="queryParams.liveId"
+          placeholder="请输入直播间ID"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="直播商品ID" prop="goodsId">
+        <el-input
+          v-model="queryParams.goodsId"
+          placeholder="请输入直播商品ID"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="商品ID" prop="productAttrValueId">
+        <el-input
+          v-model="queryParams.productAttrValueId"
+          placeholder="请输入商品ID"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="0 = 未购买 1 = 已购买" prop="isPay">
+        <el-input
+          v-model="queryParams.isPay"
+          placeholder="请输入0 = 未购买 1 = 已购买"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="是否删除" prop="isDel">
+        <el-input
+          v-model="queryParams.isDel"
+          placeholder="请输入是否删除"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="是否为立即购买" prop="isBuy">
+        <el-input
+          v-model="queryParams.isBuy"
+          placeholder="请输入是否为立即购买"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['live:liveCart:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['live:liveCart:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['live:liveCart:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          :loading="exportLoading"
+          @click="handleExport"
+          v-hasPermi="['live:liveCart:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table border v-loading="loading" :data="liveCartList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="购物车表ID" align="center" prop="cardId" />
+      <el-table-column label="直播间ID" align="center" prop="liveId" />
+      <el-table-column label="用户ID" align="center" prop="userId" />
+      <el-table-column label="直播商品ID" align="center" prop="goodsId" />
+      <el-table-column label="商品ID" align="center" prop="productId" />
+      <el-table-column label="商品ID" align="center" prop="productAttrValueId" />
+      <el-table-column label="商品数量" align="center" prop="cartNum" />
+      <el-table-column label="0 = 未购买 1 = 已购买" align="center" prop="isPay" />
+      <el-table-column label="是否删除" align="center" prop="isDel" />
+      <el-table-column label="是否为立即购买" align="center" prop="isBuy" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['live:liveCart:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['live:liveCart:remove']"
+          >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改购物车对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="直播间ID" prop="liveId">
+          <el-input v-model="form.liveId" placeholder="请输入直播间ID" />
+        </el-form-item>
+        <el-form-item label="直播商品ID" prop="goodsId">
+          <el-input v-model="form.goodsId" placeholder="请输入直播商品ID" />
+        </el-form-item>
+        <el-form-item label="商品ID" prop="productAttrValueId">
+          <el-input v-model="form.productAttrValueId" placeholder="请输入商品ID" />
+        </el-form-item>
+        <el-form-item label="0 = 未购买 1 = 已购买" prop="isPay">
+          <el-input v-model="form.isPay" placeholder="请输入0 = 未购买 1 = 已购买" />
+        </el-form-item>
+        <el-form-item label="是否删除" prop="isDel">
+          <el-input v-model="form.isDel" placeholder="请输入是否删除" />
+        </el-form-item>
+        <el-form-item label="是否为立即购买" prop="isBuy">
+          <el-input v-model="form.isBuy" placeholder="请输入是否为立即购买" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listLiveCart, getLiveCart, delLiveCart, addLiveCart, updateLiveCart, exportLiveCart } from "@/api/live/liveCart";
+
+export default {
+  name: "LiveCart",
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 导出遮罩层
+      exportLoading: false,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 购物车表格数据
+      liveCartList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        liveId: null,
+        userId: null,
+        goodsId: null,
+        productId: null,
+        productAttrValueId: null,
+        cartNum: null,
+        isPay: null,
+        isDel: null,
+        isBuy: null
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        userId: [
+          { required: true, message: "用户ID不能为空", trigger: "blur" }
+        ],
+        productId: [
+          { required: true, message: "商品ID不能为空", trigger: "blur" }
+        ],
+        cartNum: [
+          { required: true, message: "商品数量不能为空", trigger: "blur" }
+        ],
+        createTime: [
+          { required: true, message: "添加时间不能为空", trigger: "blur" }
+        ],
+        isPay: [
+          { required: true, message: "0 = 未购买 1 = 已购买不能为空", trigger: "blur" }
+        ],
+        isDel: [
+          { required: true, message: "是否删除不能为空", trigger: "blur" }
+        ],
+        isBuy: [
+          { required: true, message: "是否为立即购买不能为空", trigger: "blur" }
+        ]
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 查询购物车列表 */
+    getList() {
+      this.loading = true;
+      listLiveCart(this.queryParams).then(response => {
+        this.liveCartList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        cardId: null,
+        liveId: null,
+        userId: null,
+        goodsId: null,
+        productId: null,
+        productAttrValueId: null,
+        cartNum: null,
+        createTime: null,
+        updateTime: null,
+        isPay: null,
+        isDel: null,
+        isBuy: null
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.cardId)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加购物车";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const cardId = row.cardId || this.ids
+      getLiveCart(cardId).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改购物车";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.cardId != null) {
+            updateLiveCart(this.form).then(response => {
+              this.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addLiveCart(this.form).then(response => {
+              this.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const cardIds = row.cardId || this.ids;
+      this.$confirm('是否确认删除购物车编号为"' + cardIds + '"的数据项?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(function() {
+          return delLiveCart(cardIds);
+        }).then(() => {
+          this.getList();
+          this.msgSuccess("删除成功");
+        }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('是否确认导出所有购物车数据项?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(() => {
+          this.exportLoading = true;
+          return exportLiveCart(queryParams);
+        }).then(response => {
+          this.download(response.msg);
+          this.exportLoading = false;
+        }).catch(() => {});
+    }
+  }
+};
+</script>

+ 3 - 3
src/views/live/liveData/index.vue

@@ -148,7 +148,7 @@
         top10List: [
           {
             rank: 1,
-            name: "弘珍医药年末会员福利专场!",
+            name: "御君方年末会员福利专场!",
             cover:"https://cos.his.cdwjyyh.com/fs/20250304/710ea5b1896749b58438b76baf881d05.jpeg",
             pv: 88332,
             uv: 32674,
@@ -351,7 +351,7 @@
     methods: {
       changeDate(value) {
         if (this.selectedTimeRange === "week" && value) {
-          /*console.log("?? 监听到 selectedWeek 变化:", newVal);*/
+          /*console.log("🟢 监听到 selectedWeek 变化:", newVal);*/
           this.weekRange = this.getWeekRange(value);
         } else {
           this.weekRange = "";
@@ -359,7 +359,7 @@
         console.log("选择的时间:", value, "筛选方式:", this.selectedTimeRange);
       },
       getWeekRange(selectedWeek) {
-        console.log("?? selectedWeek 输入值:", selectedWeek); // 检查传入值
+        console.log("🔹 selectedWeek 输入值:", selectedWeek); // 检查传入值
         let date = new Date(selectedWeek);
 
         if (isNaN(date.getTime())) {

+ 19 - 8
src/views/live/liveGoods/index.vue

@@ -55,9 +55,10 @@
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
-      <el-form-item label="状态 1上架 0下架" prop="status">
-        <el-select v-model="queryParams.status" placeholder="请选择状态 1上架 0下架" clearable size="small">
-          <el-option label="请选择字典生成" value="" />
+      <el-form-item label="状态" prop="status">
+        <el-select v-model="queryParams.status" placeholder="请选择状态" clearable size="small">
+<!--          <el-option label="请选择字典生成" value="" />-->
+          <el-option v-for="(item,index) in goodsStatusOptions" :key="item.dictValue+index" :label="item.dictLabel" :value="item.dictValue" />
         </el-select>
       </el-form-item>
       <el-form-item label="库存表" prop="stock">
@@ -141,7 +142,7 @@
       <el-table-column label="组图" align="center" prop="images" />
       <el-table-column label="单价" align="center" prop="price" />
       <el-table-column label="原价" align="center" prop="opPrice" />
-      <el-table-column label="状态 1上架 0下架" align="center" prop="status" />
+      <el-table-column label="状态" align="center" prop="status" :formatter="goodsStatusFormatter"/>
       <el-table-column label="库存表" align="center" prop="stock" />
       <el-table-column label="排序号" align="center" prop="sort" />
       <el-table-column label="备注" align="center" prop="remark" />
@@ -186,10 +187,12 @@
           <el-input v-model="form.goodsDesc" placeholder="请输入描述" />
         </el-form-item>
         <el-form-item label="封图" prop="imgUrl">
-          <el-input v-model="form.imgUrl" placeholder="请输入封图" />
+          <ImageUpload  v-model="form.imgUrl" type="image" :limit=1 :width="150"
+                        :height="150"/>
         </el-form-item>
         <el-form-item label="组图" prop="images">
-          <el-input v-model="form.images" type="textarea" placeholder="请输入内容" />
+          <ImageUpload  v-model="form.images" type="image" :limit=10 :width="150"
+                        :height="150"/>
         </el-form-item>
         <el-form-item label="单价" prop="price">
           <el-input v-model="form.price" placeholder="请输入单价" />
@@ -197,9 +200,9 @@
         <el-form-item label="原价" prop="opPrice">
           <el-input v-model="form.opPrice" placeholder="请输入原价" />
         </el-form-item>
-        <el-form-item label="状态 1上架 0下架">
+        <el-form-item label="状态">
           <el-radio-group v-model="form.status">
-            <el-radio label="1">请选择字典生成</el-radio>
+            <el-radio :label="item.dictValue" v-for="item in goodsStatusOptions" >{{item.dictLabel}}</el-radio>
           </el-radio-group>
         </el-form-item>
         <el-form-item label="库存表" prop="stock">
@@ -227,6 +230,8 @@ export default {
   name: "LiveGoods",
   data() {
     return {
+      //字典
+      goodsStatusOptions: [],
       // 遮罩层
       loading: true,
       // 导出遮罩层
@@ -271,6 +276,9 @@ export default {
   },
   created() {
     this.getList();
+    this.getDicts("sys_live_goods_show").then(response => {
+      this.goodsStatusOptions = response.data;
+    });
   },
   methods: {
     /** 查询直播商品列表 */
@@ -282,6 +290,9 @@ export default {
         this.loading = false;
       });
     },
+    goodsStatusFormatter(row, column) {
+        return this.selectDictLabel(this.statusOptions, row.status);
+    },
     // 取消按钮
     cancel() {
       this.open = false;

+ 15 - 7
src/views/live/liveOrder/index.vue

@@ -107,9 +107,9 @@
           placeholder="选择完成时间">
         </el-date-picker>
       </el-form-item>
-      <el-form-item label="状态 1待支付 2已支付 3已发货 4已完成 -1已取消 -2已退款" prop="status">
-        <el-select v-model="queryParams.status" placeholder="请选择状态 1待支付 2已支付 3已发货 4已完成 -1已取消 -2已退款" clearable size="small">
-          <el-option label="请选择字典生成" value="" />
+      <el-form-item label="状态" prop="status">
+        <el-select v-model="queryParams.status" placeholder="请选择状态" clearable size="small">
+          <el-option v-for="(item,index) in orderStatusOptions" :key="item.dictValue+index" :label="item.dictLabel" :value="item.dictValue" />
         </el-select>
       </el-form-item>
       <el-form-item>
@@ -167,7 +167,7 @@
 
     <el-table border v-loading="loading" :data="liveOrderList" @selection-change="handleSelectionChange">
       <el-table-column type="selection" width="55" align="center" />
-      <el-table-column label="状态 1待支付 2已支付 3已发货 4已完成 -1已取消 -2已退款" align="center" prop="orderId" />
+      <el-table-column label="订单ID" align="center" prop="orderId"/>
       <el-table-column label="订单号" align="center" prop="orderSn" />
       <el-table-column label="用户ID" align="center" prop="userId" />
       <el-table-column label="收货人" align="center" prop="userName" />
@@ -188,7 +188,7 @@
           <span>{{ parseTime(scope.row.finishTime, '{y}-{m}-{d}') }}</span>
         </template>
       </el-table-column>
-      <el-table-column label="状态 1待支付 2已支付 3已发货 4已完成 -1已取消 -2已退款" align="center" prop="status" />
+      <el-table-column label="状态" align="center" prop="status" :formatter="orderStatusFormatter"/>
       <el-table-column label="备注" align="center" prop="remark" />
       <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
         <template slot-scope="scope">
@@ -267,9 +267,9 @@
             placeholder="选择完成时间">
           </el-date-picker>
         </el-form-item>
-        <el-form-item label="状态 1待支付 2已支付 3已发货 4已完成 -1已取消 -2已退款">
+        <el-form-item label="状态">
           <el-radio-group v-model="form.status">
-            <el-radio label="1">请选择字典生成</el-radio>
+            <el-radio :label="item.dictValue" v-for="item in orderStatusOptions" >{{item.dictLabel}}</el-radio>
           </el-radio-group>
         </el-form-item>
         <el-form-item label="备注" prop="remark">
@@ -291,6 +291,8 @@ export default {
   name: "LiveOrder",
   data() {
     return {
+      //字典
+      orderStatusOptions: [],
       // 遮罩层
       loading: true,
       // 导出遮罩层
@@ -338,6 +340,9 @@ export default {
   },
   created() {
     this.getList();
+    this.getDicts("sys_live_order_status").then(response => {
+      this.orderStatusOptions = response.data;
+    });
   },
   methods: {
     /** 查询订单列表 */
@@ -349,6 +354,9 @@ export default {
         this.loading = false;
       });
     },
+    orderStatusFormatter(row, column) {
+      return this.selectDictLabel(this.orderStatusOptions, row.status);
+    },
     // 取消按钮
     cancel() {
       this.open = false;

+ 391 - 0
src/views/live/liveOrderItem/index.vue

@@ -0,0 +1,391 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="订单号" prop="orderCode">
+        <el-input
+          v-model="queryParams.orderCode"
+          placeholder="请输入订单号"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="直播商品ID" prop="goodsId">
+        <el-input
+          v-model="queryParams.goodsId"
+          placeholder="请输入直播商品ID"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="商品规格ID" prop="productAttrValueId">
+        <el-input
+          v-model="queryParams.productAttrValueId"
+          placeholder="请输入商品规格ID"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="数量" prop="num">
+        <el-input
+          v-model="queryParams.num"
+          placeholder="请输入数量"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="是否申请售后 0否1是" prop="isAfterSales">
+        <el-input
+          v-model="queryParams.isAfterSales"
+          placeholder="请输入是否申请售后 0否1是"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="是否为处方药" prop="isPrescribe">
+        <el-input
+          v-model="queryParams.isPrescribe"
+          placeholder="请输入是否为处方药"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="店铺ID" prop="storeId">
+        <el-input
+          v-model="queryParams.storeId"
+          placeholder="请输入店铺ID"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="是否赠品" prop="isGift">
+        <el-input
+          v-model="queryParams.isGift"
+          placeholder="请输入是否赠品"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['live:liveOrderItem:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['live:liveOrderItem:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['live:liveOrderItem:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          :loading="exportLoading"
+          @click="handleExport"
+          v-hasPermi="['live:liveOrderItem:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table border v-loading="loading" :data="liveOrderItemList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="是否赠品" align="center" prop="itemId" />
+      <el-table-column label="订单id" align="center" prop="orderId" />
+      <el-table-column label="订单号" align="center" prop="orderCode" />
+      <el-table-column label="购物车ID" align="center" prop="cartId" />
+      <el-table-column label="直播商品ID" align="center" prop="goodsId" />
+      <el-table-column label="商品ID" align="center" prop="productId" />
+      <el-table-column label="商品规格ID" align="center" prop="productAttrValueId" />
+      <el-table-column label="JSON" align="center" prop="jsonInfo" />
+      <el-table-column label="数量" align="center" prop="num" />
+      <el-table-column label="是否申请售后 0否1是" align="center" prop="isAfterSales" />
+      <el-table-column label="是否为处方药" align="center" prop="isPrescribe" />
+      <el-table-column label="店铺ID" align="center" prop="storeId" />
+      <el-table-column label="是否赠品" align="center" prop="isGift" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['live:liveOrderItem:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['live:liveOrderItem:remove']"
+          >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改订单详情对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="订单号" prop="orderCode">
+          <el-input v-model="form.orderCode" placeholder="请输入订单号" />
+        </el-form-item>
+        <el-form-item label="直播商品ID" prop="goodsId">
+          <el-input v-model="form.goodsId" placeholder="请输入直播商品ID" />
+        </el-form-item>
+        <el-form-item label="商品规格ID" prop="productAttrValueId">
+          <el-input v-model="form.productAttrValueId" placeholder="请输入商品规格ID" />
+        </el-form-item>
+        <el-form-item label="JSON" prop="jsonInfo">
+          <el-input v-model="form.jsonInfo" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="数量" prop="num">
+          <el-input v-model="form.num" placeholder="请输入数量" />
+        </el-form-item>
+        <el-form-item label="是否申请售后 0否1是" prop="isAfterSales">
+          <el-input v-model="form.isAfterSales" placeholder="请输入是否申请售后 0否1是" />
+        </el-form-item>
+        <el-form-item label="是否为处方药" prop="isPrescribe">
+          <el-input v-model="form.isPrescribe" placeholder="请输入是否为处方药" />
+        </el-form-item>
+        <el-form-item label="店铺ID" prop="storeId">
+          <el-input v-model="form.storeId" placeholder="请输入店铺ID" />
+        </el-form-item>
+        <el-form-item label="是否赠品" prop="isGift">
+          <el-input v-model="form.isGift" placeholder="请输入是否赠品" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listLiveOrderItem, getLiveOrderItem, delLiveOrderItem, addLiveOrderItem, updateLiveOrderItem, exportLiveOrderItem } from "@/api/live/liveOrderItem";
+
+export default {
+  name: "LiveOrderItem",
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 导出遮罩层
+      exportLoading: false,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 订单详情表格数据
+      liveOrderItemList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        orderId: null,
+        orderCode: null,
+        cartId: null,
+        goodsId: null,
+        productId: null,
+        productAttrValueId: null,
+        jsonInfo: null,
+        num: null,
+        isAfterSales: null,
+        isPrescribe: null,
+        storeId: null,
+        isGift: null
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        orderId: [
+          { required: true, message: "订单id不能为空", trigger: "blur" }
+        ],
+        cartId: [
+          { required: true, message: "购物车ID不能为空", trigger: "blur" }
+        ],
+        productId: [
+          { required: true, message: "商品ID不能为空", trigger: "blur" }
+        ],
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 查询订单详情列表 */
+    getList() {
+      this.loading = true;
+      listLiveOrderItem(this.queryParams).then(response => {
+        this.liveOrderItemList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        itemId: null,
+        orderId: null,
+        orderCode: null,
+        cartId: null,
+        goodsId: null,
+        productId: null,
+        productAttrValueId: null,
+        jsonInfo: null,
+        num: null,
+        isAfterSales: null,
+        isPrescribe: null,
+        storeId: null,
+        isGift: null
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.itemId)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加订单详情";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const itemId = row.itemId || this.ids
+      getLiveOrderItem(itemId).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改订单详情";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.itemId != null) {
+            updateLiveOrderItem(this.form).then(response => {
+              this.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addLiveOrderItem(this.form).then(response => {
+              this.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const itemIds = row.itemId || this.ids;
+      this.$confirm('是否确认删除订单详情编号为"' + itemIds + '"的数据项?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(function() {
+          return delLiveOrderItem(itemIds);
+        }).then(() => {
+          this.getList();
+          this.msgSuccess("删除成功");
+        }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('是否确认导出所有订单详情数据项?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(() => {
+          this.exportLoading = true;
+          return exportLiveOrderItem(queryParams);
+        }).then(response => {
+          this.download(response.msg);
+          this.exportLoading = false;
+        }).catch(() => {});
+    }
+  }
+};
+</script>

+ 328 - 0
src/views/live/liveOrderLogs/index.vue

@@ -0,0 +1,328 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="操作类型" prop="changeType">
+        <el-select v-model="queryParams.changeType" placeholder="请选择操作类型" clearable size="small">
+          <el-option label="请选择字典生成" value="" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="操作备注" prop="changeMessage">
+        <el-input
+          v-model="queryParams.changeMessage"
+          placeholder="请输入操作备注"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="操作时间" prop="changeTime">
+        <el-date-picker clearable size="small"
+          v-model="queryParams.changeTime"
+          type="date"
+          value-format="yyyy-MM-dd"
+          placeholder="选择操作时间">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item label="操作员" prop="operator">
+        <el-input
+          v-model="queryParams.operator"
+          placeholder="请输入操作员"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['live:liveOrderLogs:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['live:liveOrderLogs:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['live:liveOrderLogs:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          :loading="exportLoading"
+          @click="handleExport"
+          v-hasPermi="['live:liveOrderLogs:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table border v-loading="loading" :data="liveOrderLogsList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="操作员" align="center" prop="logsId" />
+      <el-table-column label="订单id" align="center" prop="orderId" />
+      <el-table-column label="操作类型" align="center" prop="changeType" />
+      <el-table-column label="操作备注" align="center" prop="changeMessage" />
+      <el-table-column label="操作时间" align="center" prop="changeTime" width="180">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.changeTime, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作员" align="center" prop="operator" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['live:liveOrderLogs:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['live:liveOrderLogs:remove']"
+          >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改订单操作记录对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="操作类型" prop="changeType">
+          <el-select v-model="form.changeType" placeholder="请选择操作类型">
+            <el-option label="请选择字典生成" value="" />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="操作备注" prop="changeMessage">
+          <el-input v-model="form.changeMessage" placeholder="请输入操作备注" />
+        </el-form-item>
+        <el-form-item label="操作时间" prop="changeTime">
+          <el-date-picker clearable size="small"
+            v-model="form.changeTime"
+            type="date"
+            value-format="yyyy-MM-dd"
+            placeholder="选择操作时间">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="操作员" prop="operator">
+          <el-input v-model="form.operator" placeholder="请输入操作员" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listLiveOrderLogs, getLiveOrderLogs, delLiveOrderLogs, addLiveOrderLogs, updateLiveOrderLogs, exportLiveOrderLogs } from "@/api/live/liveOrderLogs";
+
+export default {
+  name: "LiveOrderLogs",
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 导出遮罩层
+      exportLoading: false,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 订单操作记录表格数据
+      liveOrderLogsList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        orderId: null,
+        changeType: null,
+        changeMessage: null,
+        changeTime: null,
+        operator: null
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        orderId: [
+          { required: true, message: "订单id不能为空", trigger: "blur" }
+        ],
+        changeType: [
+          { required: true, message: "操作类型不能为空", trigger: "change" }
+        ],
+        changeMessage: [
+          { required: true, message: "操作备注不能为空", trigger: "blur" }
+        ],
+        changeTime: [
+          { required: true, message: "操作时间不能为空", trigger: "blur" }
+        ],
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 查询订单操作记录列表 */
+    getList() {
+      this.loading = true;
+      listLiveOrderLogs(this.queryParams).then(response => {
+        this.liveOrderLogsList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        logsId: null,
+        orderId: null,
+        changeType: null,
+        changeMessage: null,
+        changeTime: null,
+        operator: null
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.logsId)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加订单操作记录";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const logsId = row.logsId || this.ids
+      getLiveOrderLogs(logsId).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改订单操作记录";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.logsId != null) {
+            updateLiveOrderLogs(this.form).then(response => {
+              this.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addLiveOrderLogs(this.form).then(response => {
+              this.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const logsIds = row.logsId || this.ids;
+      this.$confirm('是否确认删除订单操作记录编号为"' + logsIds + '"的数据项?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(function() {
+          return delLiveOrderLogs(logsIds);
+        }).then(() => {
+          this.getList();
+          this.msgSuccess("删除成功");
+        }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('是否确认导出所有订单操作记录数据项?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(() => {
+          this.exportLoading = true;
+          return exportLiveOrderLogs(queryParams);
+        }).then(response => {
+          this.download(response.msg);
+          this.exportLoading = false;
+        }).catch(() => {});
+    }
+  }
+};
+</script>

+ 313 - 0
src/views/live/liveOrderStatus/index.vue

@@ -0,0 +1,313 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="操作类型" prop="changeType">
+        <el-select v-model="queryParams.changeType" placeholder="请选择操作类型" clearable size="small">
+          <el-option label="请选择字典生成" value="" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="操作备注" prop="changeMessage">
+        <el-input
+          v-model="queryParams.changeMessage"
+          placeholder="请输入操作备注"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="操作时间" prop="changeTime">
+        <el-date-picker clearable size="small"
+          v-model="queryParams.changeTime"
+          type="date"
+          value-format="yyyy-MM-dd"
+          placeholder="选择操作时间">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['live:liveOrderStatus:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['live:liveOrderStatus:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['live:liveOrderStatus:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          :loading="exportLoading"
+          @click="handleExport"
+          v-hasPermi="['live:liveOrderStatus:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table border v-loading="loading" :data="liveOrderStatusList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="操作时间" align="center" prop="id" />
+      <el-table-column label="订单id" align="center" prop="orderId" />
+      <el-table-column label="操作类型" align="center" prop="changeType" />
+      <el-table-column label="操作备注" align="center" prop="changeMessage" />
+      <el-table-column label="操作时间" align="center" prop="changeTime" width="180">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.changeTime, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['live:liveOrderStatus:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['live:liveOrderStatus:remove']"
+          >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改订单操作记录对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="操作类型" prop="changeType">
+          <el-select v-model="form.changeType" placeholder="请选择操作类型">
+            <el-option label="请选择字典生成" value="" />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="操作备注" prop="changeMessage">
+          <el-input v-model="form.changeMessage" placeholder="请输入操作备注" />
+        </el-form-item>
+        <el-form-item label="操作时间" prop="changeTime">
+          <el-date-picker clearable size="small"
+            v-model="form.changeTime"
+            type="date"
+            value-format="yyyy-MM-dd"
+            placeholder="选择操作时间">
+          </el-date-picker>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listLiveOrderStatus, getLiveOrderStatus, delLiveOrderStatus, addLiveOrderStatus, updateLiveOrderStatus, exportLiveOrderStatus } from "@/api/live/liveOrderStatus";
+
+export default {
+  name: "LiveOrderStatus",
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 导出遮罩层
+      exportLoading: false,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 订单操作记录表格数据
+      liveOrderStatusList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        orderId: null,
+        changeType: null,
+        changeMessage: null,
+        changeTime: null
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        orderId: [
+          { required: true, message: "订单id不能为空", trigger: "blur" }
+        ],
+        changeType: [
+          { required: true, message: "操作类型不能为空", trigger: "change" }
+        ],
+        changeMessage: [
+          { required: true, message: "操作备注不能为空", trigger: "blur" }
+        ],
+        changeTime: [
+          { required: true, message: "操作时间不能为空", trigger: "blur" }
+        ]
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 查询订单操作记录列表 */
+    getList() {
+      this.loading = true;
+      listLiveOrderStatus(this.queryParams).then(response => {
+        this.liveOrderStatusList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        orderId: null,
+        changeType: null,
+        changeMessage: null,
+        changeTime: null
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加订单操作记录";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getLiveOrderStatus(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改订单操作记录";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateLiveOrderStatus(this.form).then(response => {
+              this.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addLiveOrderStatus(this.form).then(response => {
+              this.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$confirm('是否确认删除订单操作记录编号为"' + ids + '"的数据项?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(function() {
+          return delLiveOrderStatus(ids);
+        }).then(() => {
+          this.getList();
+          this.msgSuccess("删除成功");
+        }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('是否确认导出所有订单操作记录数据项?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(() => {
+          this.exportLoading = true;
+          return exportLiveOrderStatus(queryParams);
+        }).then(response => {
+          this.download(response.msg);
+          this.exportLoading = false;
+        }).catch(() => {});
+    }
+  }
+};
+</script>

+ 14 - 6
src/views/live/liveOrderitems/index.vue

@@ -46,9 +46,9 @@
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
-      <el-form-item label="状态 1正常 2已退款" prop="status">
-        <el-select v-model="queryParams.status" placeholder="请选择状态 1正常 2已退款" clearable size="small">
-          <el-option label="请选择字典生成" value="" />
+      <el-form-item label="状态" prop="status">
+        <el-select v-model="queryParams.status" placeholder="请选择状态" clearable size="small">
+          <el-option v-for="(item,index) in orderGoodsStatusOptions" :key="item.dictValue+index" :label="item.dictLabel" :value="item.dictValue" />
         </el-select>
       </el-form-item>
       <el-form-item>
@@ -113,7 +113,7 @@
       <el-table-column label="商品名" align="center" prop="goodsName" />
       <el-table-column label="单价" align="center" prop="price" />
       <el-table-column label="数量" align="center" prop="num" />
-      <el-table-column label="状态 1正常 2已退款" align="center" prop="status" />
+      <el-table-column label="状态" align="center" prop="status" :formatter="orderGoodsStatusFormatter"/>
       <el-table-column label="备注" align="center" prop="remark" />
       <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
         <template slot-scope="scope">
@@ -164,9 +164,9 @@
         <el-form-item label="数量" prop="num">
           <el-input v-model="form.num" placeholder="请输入数量" />
         </el-form-item>
-        <el-form-item label="状态 1正常 2已退款">
+        <el-form-item label="状态">
           <el-radio-group v-model="form.status">
-            <el-radio label="1">请选择字典生成</el-radio>
+            <el-radio :label="item.dictValue" v-for="item in orderGoodsStatusOptions" >{{item.dictLabel}}</el-radio>
           </el-radio-group>
         </el-form-item>
         <el-form-item label="备注" prop="remark">
@@ -188,6 +188,8 @@ export default {
   name: "LiveOrderitems",
   data() {
     return {
+      //字典
+      orderGoodsStatusOptions: [],
       // 遮罩层
       loading: true,
       // 导出遮罩层
@@ -229,6 +231,9 @@ export default {
   },
   created() {
     this.getList();
+    this.getDicts("sys_live_order_goods_status").then(response => {
+      this.orderGoodsStatusOptions = response.data;
+    });
   },
   methods: {
     /** 查询订单商品列表 */
@@ -240,6 +245,9 @@ export default {
         this.loading = false;
       });
     },
+    orderGoodsStatusFormatter(row, column) {
+      return this.selectDictLabel(this.orderGoodsStatusOptions, row.status);
+    },
     // 取消按钮
     cancel() {
       this.open = false;

+ 15 - 7
src/views/live/liveVideo/index.vue

@@ -19,9 +19,9 @@
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
-      <el-form-item label="类型 1录播 2回放" prop="videoType">
-        <el-select v-model="queryParams.videoType" placeholder="请选择类型 1录播 2回放" clearable size="small">
-          <el-option label="请选择字典生成" value="" />
+      <el-form-item label="类型" prop="videoType">
+        <el-select v-model="queryParams.videoType" placeholder="请选择类型" clearable size="small">
+          <el-option v-for="(item,index) in videoTypeOptions" :key="item.dictValue+index" :label="item.dictLabel" :value="item.dictValue" />
         </el-select>
       </el-form-item>
       <el-form-item label="排序号" prop="sort">
@@ -91,7 +91,7 @@
       <el-table-column label="ID" align="center" prop="videoId" />
       <el-table-column label="直播ID" align="center" prop="liveId" />
       <el-table-column label="视频地址" align="center" prop="videoUrl" />
-      <el-table-column label="类型 1录播 2回放" align="center" prop="videoType" />
+      <el-table-column label="类型" align="center" prop="videoType" :formatter="videoTypeFormatter"/>
       <el-table-column label="排序号" align="center" prop="sort" />
       <el-table-column label="备注" align="center" prop="remark" />
       <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
@@ -131,9 +131,9 @@
         <el-form-item label="视频地址" prop="videoUrl">
           <el-input v-model="form.videoUrl" placeholder="请输入视频地址" />
         </el-form-item>
-        <el-form-item label="类型 1录播 2回放" prop="videoType">
-          <el-select v-model="form.videoType" placeholder="请选择类型 1录播 2回放">
-            <el-option label="请选择字典生成" value="" />
+        <el-form-item label="类型" prop="videoType">
+          <el-select v-model="form.videoType" placeholder="请选择类型">
+            <el-option v-for="(item,index) in videoTypeOptions" :key="item.dictValue+index" :label="item.dictLabel" :value="item.dictValue" />
           </el-select>
         </el-form-item>
         <el-form-item label="排序号" prop="sort">
@@ -158,6 +158,8 @@ export default {
   name: "LiveVideo",
   data() {
     return {
+      //字典
+      videoTypeOptions: [],
       // 遮罩层
       loading: true,
       // 导出遮罩层
@@ -196,6 +198,9 @@ export default {
   },
   created() {
     this.getList();
+    this.getDicts("sys_live_video_type").then(response => {
+      this.videoTypeOptions = response.data;
+    });
   },
   methods: {
     /** 查询直播视频列表 */
@@ -207,6 +212,9 @@ export default {
         this.loading = false;
       });
     },
+    videoTypeFormatter(row, column) {
+      return this.selectDictLabel(this.videoTypeOptions, row.status);
+    },
     // 取消按钮
     cancel() {
       this.open = false;

+ 15 - 3
src/views/qw/sopTemp/index.vue

@@ -263,7 +263,7 @@
             value-format="HH:mm"
             format="HH:mm"
             placeholder="时间"
-            style="width: 100px;height: 20px;margin-left: 10px;margin-top: 10px">
+            style="width: 200px;height: 20px;margin-left: 10px;margin-top: 10px">
           </el-time-picker>
         </el-form-item>
         <el-form-item label="每天催课次数" prop="num" v-if="form.sendType == 11 && !form.id">
@@ -278,7 +278,7 @@
             format="HH:mm"
             :picker-options="{ selectableRange: startTimeRange }"
             placeholder="时间"
-            style="width: 100px;height: 20px;margin-left: 10px;margin-top: 10px">
+            style="width: 200px;height: 20px;margin-left: 10px;margin-top: 10px">
           </el-time-picker>
         </el-form-item>
       </el-form>
@@ -403,10 +403,22 @@ export default {
         gap: [
           {required: true, message: '间隔天数不能为空', trigger: 'blur'}
         ],
+        time:[{
+          required: true, message: '发课时间不能为空', trigger: 'blur'
+        }],
+        courseId:[{
+          required: true, message: '课程不能为空', trigger: 'blur'
+        }],
+        companyId:[{
+          required: true, message: '销售公司不能为空', trigger: 'blur'
+        }],
+        project:[{
+          required: true, message: '所属项目不能为空', trigger: 'blur'
+        }],
       },
       contentRules: {
         time: [{required: true, message: '时间不能为空', trigger: 'blur'}],
-      }
+      },
     };
   },
   created() {

+ 17 - 4
src/views/qw/sopTemp/updateSopTemp.vue

@@ -1219,8 +1219,18 @@ export default {
       if (this.setting[index].content.length > 0 && this.form.sendType == 1) {
         return this.$message.error("因为企微接口限制,企微模板一天只能设置一条消息~")
       } else {
-        this.setting[index].content.push({type: this.defaultContentType, contentType: 1, setting: [{contentType: '1', value: "",}]})
-        this.videoList.push([])
+        const sourceContent = this.setting[index].content[0];
+        const newContent = {
+          type: this.defaultContentType,
+          contentType: 1,
+          setting: [{contentType: '1', value: ""}],
+          // 复制课程相关字段,如 courseId、videoId,根据实际数据结构补充
+          courseId: sourceContent.courseId,
+          videoId: sourceContent.videoId,
+          courseType: sourceContent.courseType
+        };
+        this.setting[index].content.push(newContent);
+        this.videoList.push([]);
         this.addTag.push({
           addTag: [],
           inputVisible: false,
@@ -1228,9 +1238,12 @@ export default {
           delTag: [],
           delTagVisible: false,
           delTagValue: ''
-        })
+        });
+        // 如果有视频列表关联,也可同步处理 videoList,根据 courseId 重新请求或复制已有视频数据
+        if (sourceContent.courseId) {
+          this.courseUpdate(newContent, index, this.setting[index].content.length - 1);
+        }
       }
-
     },
     delContent(index, contentIndex) {
       this.setting[index].content.splice(contentIndex, 1)

+ 19 - 7
src/views/statistics/section/channel.vue

@@ -83,13 +83,25 @@
     </el-row>
 
     <!-- 警告提示 -->
-    <el-alert
-      title="待激活人数依赖进粉时的自动标记和员工手动标记是可变的,相应的目标人数和进线完播率受此影响;为了不受进粉期人数变化影响,第二天新进报名产生的观后数据不做统计;辅助工作台人数不一致可能是受进粉影响,也有可能是员工删除了好友或者取消了客户频道报名。"
-      type="warning"
-      :closable="false"
-      show-icon
-      class="mb8">
-    </el-alert>
+<!--    <el-alert-->
+<!--      title="待激活人数依赖进粉时的自动标记和员工手动标记是可变的,相应的目标人数和进线完播率受此影响;为了不受进粉期人数变化影响,第二天新进报名产生的观后数据不做统计;辅助工作台人数不一致可能是受进粉影响,也有可能是员工删除了好友或者取消了客户频道报名。"-->
+<!--      type="warning"-->
+<!--      :closable="false"-->
+<!--      show-icon-->
+<!--      class="mb8">-->
+<!--    </el-alert>-->
+
+    <div style="background-color: #fdf6ec">
+      <div style="color: #E6A23C;font-size: 14px;display: flex;align-items: center;margin-bottom: 5px">
+        <i class="el-icon-info"></i>
+        查看数据 请先选择 【时间范围】
+      </div>
+      <div style="color: #E6A23C;font-size: 14px;display: flex;align-items: center;margin-bottom: 5px">
+        <i class="el-icon-info"></i>
+        待激活人数依赖进粉时的自动标记和员工手动标记是可变的,相应的目标人数和进线完播率受此影响;为了不受进粉期人数变化影响,第二天新进报名产生的观后数据不做统计;辅助工作台人数不一致可能是受进粉影响,也有可能是员工删除了好友或者取消了客户频道报名
+      </div>
+    </div>
+
 
     <el-table border v-loading="loading" :data="statsList" @selection-change="handleSelectionChange" show-summary :summary-method="getSummaries">
       <!-- 未上线部分 -->

+ 18 - 7
src/views/statistics/section/index.vue

@@ -67,13 +67,24 @@
     </el-row>
 
     <!-- 警告提示 -->
-    <el-alert
-      title="待激活人数依赖进粉时的自动标记和员工手动标记是可变的,相应的目标人数和进线完播率受此影响;为了不受进粉期人数变化影响,第二天新进报名产生的观后数据不做统计;辅助工作台人数不一致可能是受进粉影响,也有可能是员工删除了好友或者取消了客户频道报名。"
-      type="warning"
-      :closable="false"
-      show-icon
-      class="mb8">
-    </el-alert>
+<!--    <el-alert-->
+<!--      title="待激活人数依赖进粉时的自动标记和员工手动标记是可变的,相应的目标人数和进线完播率受此影响;为了不受进粉期人数变化影响,第二天新进报名产生的观后数据不做统计;辅助工作台人数不一致可能是受进粉影响,也有可能是员工删除了好友或者取消了客户频道报名。"-->
+<!--      type="warning"-->
+<!--      :closable="false"-->
+<!--      show-icon-->
+<!--      class="mb8">-->
+<!--    </el-alert>-->
+    <div style="background-color: #fdf6ec">
+      <div style="color: #E6A23C;font-size: 14px;display: flex;align-items: center;margin-bottom: 5px">
+        <i class="el-icon-info"></i>
+        查看数据 请先选择 【时间范围】
+      </div>
+      <div style="color: #E6A23C;font-size: 14px;display: flex;align-items: center;margin-bottom: 5px">
+        <i class="el-icon-info"></i>
+        待激活人数依赖进粉时的自动标记和员工手动标记是可变的,相应的目标人数和进线完播率受此影响;为了不受进粉期人数变化影响,第二天新进报名产生的观后数据不做统计;辅助工作台人数不一致可能是受进粉影响,也有可能是员工删除了好友或者取消了客户频道报名。
+      </div>
+    </div>
+
 
     <el-table border v-loading="loading" :data="statsList" @selection-change="handleSelectionChange" show-summary :summary-method="getSummaries">
       <!-- 未上线部分 -->

+ 18 - 7
src/views/statistics/section/inline.vue

@@ -47,13 +47,24 @@
     </el-row>
 
     <!-- 警告提示 -->
-    <el-alert
-      title="待激活人数依赖进粉时的自动标记和员工手动标记是可变的,相应的目标人数和进线完播率受此影响;为了不受进粉期人数变化影响,第二天新进报名产生的观后数据不做统计;辅助工作台人数不一致可能是受进粉影响,也有可能是员工删除了好友或者取消了客户频道报名。"
-      type="warning"
-      :closable="false"
-      show-icon
-      class="mb8">
-    </el-alert>
+<!--    <el-alert-->
+<!--      title="待激活人数依赖进粉时的自动标记和员工手动标记是可变的,相应的目标人数和进线完播率受此影响;为了不受进粉期人数变化影响,第二天新进报名产生的观后数据不做统计;辅助工作台人数不一致可能是受进粉影响,也有可能是员工删除了好友或者取消了客户频道报名。"-->
+<!--      type="warning"-->
+<!--      :closable="false"-->
+<!--      show-icon-->
+<!--      class="mb8">-->
+<!--    </el-alert>-->
+    <div style="background-color: #fdf6ec">
+      <div style="color: #E6A23C;font-size: 14px;display: flex;align-items: center;margin-bottom: 5px">
+        <i class="el-icon-info"></i>
+        查看数据 请先选择 【时间范围】
+      </div>
+      <div style="color: #E6A23C;font-size: 14px;display: flex;align-items: center;margin-bottom: 5px">
+        <i class="el-icon-info"></i>
+        待激活人数依赖进粉时的自动标记和员工手动标记是可变的,相应的目标人数和进线完播率受此影响;为了不受进粉期人数变化影响,第二天新进报名产生的观后数据不做统计;辅助工作台人数不一致可能是受进粉影响,也有可能是员工删除了好友或者取消了客户频道报名。
+      </div>
+    </div>
+
 
     <el-table border v-loading="loading" :data="statsList" @selection-change="handleSelectionChange" show-summary :summary-method="getSummaries">
       <!-- 未上线部分 -->

+ 19 - 7
src/views/statistics/section/today.vue

@@ -83,13 +83,25 @@
     </el-row>
 
     <!-- 警告提示 -->
-    <el-alert
-      title="待激活人数依赖进粉时的自动标记和员工手动标记是可变的,相应的目标人数和进线完播率受此影响;为了不受进粉期人数变化影响,第二天新进报名产生的观后数据不做统计;辅助工作台人数不一致可能是受进粉影响,也有可能是员工删除了好友或者取消了客户频道报名。"
-      type="warning"
-      :closable="false"
-      show-icon
-      class="mb8">
-    </el-alert>
+<!--    <el-alert-->
+<!--      title="待激活人数依赖进粉时的自动标记和员工手动标记是可变的,相应的目标人数和进线完播率受此影响;为了不受进粉期人数变化影响,第二天新进报名产生的观后数据不做统计;辅助工作台人数不一致可能是受进粉影响,也有可能是员工删除了好友或者取消了客户频道报名。"-->
+<!--      type="warning"-->
+<!--      :closable="false"-->
+<!--      show-icon-->
+<!--      class="mb8">-->
+<!--    </el-alert>-->
+
+    <div style="background-color: #fdf6ec">
+      <div style="color: #E6A23C;font-size: 14px;display: flex;align-items: center;margin-bottom: 5px">
+        <i class="el-icon-info"></i>
+        查看数据 请先选择 【时间范围】
+      </div>
+      <div style="color: #E6A23C;font-size: 14px;display: flex;align-items: center;margin-bottom: 5px">
+        <i class="el-icon-info"></i>
+        待激活人数依赖进粉时的自动标记和员工手动标记是可变的,相应的目标人数和进线完播率受此影响;为了不受进粉期人数变化影响,第二天新进报名产生的观后数据不做统计;辅助工作台人数不一致可能是受进粉影响,也有可能是员工删除了好友或者取消了客户频道报名。
+      </div>
+    </div>
+
 
     <el-table border v-loading="loading" :data="statsList" @selection-change="handleSelectionChange" show-summary :summary-method="getSummaries">
       <!-- 未上线部分 -->

+ 184 - 0
src/views/system/config/companyMenuConfig.vue

@@ -0,0 +1,184 @@
+<template>
+  <div class="app-container">
+    <el-tabs v-model="activeName" @tab-click="handleClick" >
+      <el-form ref="form14" :model="form14" :rules="rules14" label-width="180px">
+
+        <el-form-item label="菜单权限">
+          <el-checkbox v-model="menuExpand" @change="handleCheckedTreeExpand($event, 'menu')">展开/折叠</el-checkbox>
+          <el-checkbox v-model="menuNodeAll" @change="handleCheckedTreeNodeAll($event, 'menu')">全选/全不选</el-checkbox>
+          <el-checkbox v-model="menuCheckStrictly" @change="handleCheckedTreeConnect($event, 'menu')">父子联动</el-checkbox>
+          <el-tree
+            class="tree-border"
+            :data="menuOptions"
+            show-checkbox
+            ref="menu"
+            node-key="id"
+            :check-strictly="!menuCheckStrictly"
+            empty-text="加载中,请稍后"
+            :props="defaultProps"
+          ></el-tree>
+        </el-form-item>
+
+        <div   class="footer">
+          <el-button type="primary" @click="submitForm14">提  交</el-button>
+        </div>
+      </el-form>
+    </el-tabs>
+  </div>
+</template>
+
+<script>
+import Editor from '@/components/Editor/wang';
+import {   getConfigByKey,updateConfigByKey, clearCache } from "@/api/system/config";
+import {   listCompany } from "@/api/company/company";
+import Material from '@/components/Material'
+import {treeselect as menuTreeselect} from "@/api/company/companyMenu";
+export default {
+  name: "Config",
+  components: {
+    Material,
+    Editor
+  },
+  watch: {
+    photoArr: function(val) {
+      this.form1.certs = val.join(',')
+    },
+    images: function(val) {
+      this.form7.images = val.join(',')
+    }
+  },
+  data() {
+    return {
+      menuCheckStrictly: true,
+      defaultProps: {
+        children: "children",
+        label: "label"
+      },
+      // 菜单列表
+      menuOptions: [],
+      menuExpand: false,
+      menuNodeAll: false,
+      companyOptions:[],
+      activeName:"companymenu.config",
+      configId:null,
+      configKey:null,
+      form14:{},
+      rules14:{}
+    };
+  },
+  created() {
+    this.getConfigByKey(this.activeName);
+    this.getMenuTreeselect();
+  },
+  methods: {
+    handleClick(tab, event){
+      console.log(tab.name)
+      this.getConfigByKey(tab.name);
+    },
+    /** 查询菜单树结构 */
+    getMenuTreeselect() {
+      menuTreeselect().then(response => {
+        this.menuOptions = response.data;
+      });
+    },
+    // 树权限(展开/折叠)
+    handleCheckedTreeExpand(value, type) {
+      if (type == 'menu') {
+        let treeList = this.menuOptions;
+        for (let i = 0; i < treeList.length; i++) {
+          this.$refs.menu.store.nodesMap[treeList[i].id].expanded = value;
+        }
+      } else if (type == 'dept') {
+        let treeList = this.deptOptions;
+        for (let i = 0; i < treeList.length; i++) {
+          this.$refs.dept.store.nodesMap[treeList[i].id].expanded = value;
+        }
+      }
+    },
+    // 树权限(全选/全不选)
+    handleCheckedTreeNodeAll(value, type) {
+      if (type == 'menu') {
+        this.$refs.menu.setCheckedNodes(value ? this.menuOptions: []);
+      } else if (type == 'dept') {
+        this.$refs.dept.setCheckedNodes(value ? this.deptOptions: []);
+      }
+    },
+    // 树权限(父子联动)
+    handleCheckedTreeConnect(value, type) {
+      if (type == 'menu') {
+        this.menuCheckStrictly = value ? true: false;
+      } else if (type == 'dept') {
+        this.deptCheckStrictly = value ? true: false;
+      }
+    },
+    getCompanyOptions() {
+      listCompany().then(response=>{
+        this.companyOptions = response.rows
+      })
+    },
+    handleSuccess(response, file) {
+      // 上传成功后的回调函数
+      this.myloading.close();
+      this.form7.videoUrl = response.url;
+      this.$refs.upload.clearFiles();
+    },
+
+    getConfigByKey(key){
+      getConfigByKey(key).then(response => {
+        if(key == "companymenu.config"){
+          this.getCompanyOptions();
+          console.log(response.data.configId)
+          this.configId=response.data.configId;
+          this.configKey=response.data.configKey;
+          if(response.data.configValue != null) {
+            this.form14 = JSON.parse(response.data.configValue);
+            // 回显选中的菜单
+            this.$nextTick(() => {
+              if (this.form14.menuIds && this.form14.menuIds.length > 0) {
+                this.$refs.menu.setCheckedKeys(this.form14.menuIds);
+              }
+            });
+          } else {
+            this.form14 = { menuIds: [] };
+          }
+        }
+      });
+    },
+
+    submitForm14(){
+      this.form14.menuIds = this.getMenuAllCheckedKeys();
+      var param={configId:this.configId,configKey:this.configKey,configValue:JSON.stringify(this.form14)}
+      updateConfigByKey(param).then(response => {
+        if (response.code === 200) {
+          this.msgSuccess("修改成功");
+        }
+      });
+    },
+    // 所有菜单节点数据
+    getMenuAllCheckedKeys() {
+      // 目前被选中的菜单节点
+      let checkedKeys = this.$refs.menu.getHalfCheckedKeys();
+      // 半选中的菜单节点
+      let halfCheckedKeys = this.$refs.menu.getCheckedKeys();
+      checkedKeys.unshift.apply(checkedKeys, halfCheckedKeys);
+      return checkedKeys;
+    },
+    /** 清理缓存按钮操作 */
+    handleClearCache() {
+      clearCache().then(response => {
+        if (response.code === 200) {
+          this.msgSuccess("清理成功");
+        }
+      });
+    },
+  }
+};
+</script>
+<style scoped>
+.footer{
+  width: 100%;
+  display: flex;
+  align-items: flex-end;
+  justify-content: flex-end;
+}
+</style>

+ 273 - 81
src/views/system/config/config.vue

@@ -1,73 +1,73 @@
 <template>
   <div class="app-container">
-     <el-tabs v-model="activeName" @tab-click="handleClick" >
+    <el-tabs v-model="activeName" @tab-click="handleClick" >
       <el-tab-pane label="OSS配置" name="sys.oss.cloudStorage">
-          <el-form ref="form1" :model="form1" :rules="rules1" label-width="160px">
-            <el-form-item label="类型" prop="type">
-               <el-radio-group v-model="form1.type">
-                <el-radio :label="1">七牛云</el-radio>
-                <el-radio :label="2">阿里云</el-radio>
-                <el-radio :label="3">腾讯云</el-radio>
-                <el-radio :label="4">华为云</el-radio>
-              </el-radio-group>
-            </el-form-item>
-            <el-form-item v-if="form1.type==1" label="七牛绑定的域名" prop="qiniuDomain">
-                <el-input  v-model="form1.qiniuDomain"  label="请输入七牛绑定的域名"></el-input>
-            </el-form-item>
-             <el-form-item v-if="form1.type==1" label="七牛路径前缀" prop="qiniuPrefix">
-                <el-input  v-model="form1.qiniuPrefix" label="请输入七牛路径前缀"></el-input>
-            </el-form-item>
-             <el-form-item v-if="form1.type==1" label="七牛ACCESS_KEY" prop="qiniuAccessKey">
-                <el-input  v-model="form1.qiniuAccessKey" label="请输入七牛ACCESS_KEY"></el-input>
-            </el-form-item>
-            <el-form-item v-if="form1.type==1" label="七牛SecretKey" prop="qiniuSecretKey">
-                <el-input  v-model="form1.qiniuSecretKey" label="七牛SecretKey不能为空"></el-input>
-            </el-form-item>
-            <el-form-item v-if="form1.type==1" label="七牛空间名" prop="qiniuBucketName">
-                <el-input  v-model="form1.qiniuBucketName" label="七牛空间名不能为空"></el-input>
-            </el-form-item>
-             <el-form-item v-if="form1.type==2" label="阿里云绑定的域名" prop="aliyunDomain">
-                <el-input  v-model="form1.aliyunDomain" label="阿里云绑定的域名不能为空"></el-input>
-            </el-form-item>
-             <el-form-item v-if="form1.type==2" label="阿里云路径前缀" prop="aliyunPrefix">
-                <el-input  v-model="form1.aliyunPrefix" label="阿里云路径前缀不能为空"></el-input>
-            </el-form-item>
-             <el-form-item v-if="form1.type==2" label="阿里云EndPoint" prop="aliyunEndPoint">
-                <el-input  v-model="form1.aliyunEndPoint" label="阿里云EndPoint不能为空"></el-input>
-            </el-form-item>
-             <el-form-item v-if="form1.type==2" label="阿里云AccessKeyId" prop="aliyunAccessKeyId">
-                <el-input  v-model="form1.aliyunAccessKeyId" label="阿里云AccessKeyId不能为空"></el-input>
-            </el-form-item>
-            <el-form-item v-if="form1.type==2" label="阿里云AccessKeySecret" prop="aliyunAccessKeySecret">
-                <el-input  v-model="form1.aliyunAccessKeySecret" label="阿里云AccessKeySecret不能为空"></el-input>
-            </el-form-item>
-             <el-form-item v-if="form1.type==2" label="阿里云BucketName" prop="aliyunBucketName">
-                <el-input  v-model="form1.aliyunBucketName" label="阿里云BucketName不能为空"></el-input>
-            </el-form-item>
-              <el-form-item v-if="form1.type==3" label="腾讯云绑定的域名" prop="qcloudDomain">
-                <el-input  v-model="form1.qcloudDomain" label="腾讯云绑定的域名格式不正确"></el-input>
-            </el-form-item>
-              <el-form-item v-if="form1.type==3" label="腾讯云前缀" prop="qcloudPrefix">
-                <el-input  v-model="form1.qcloudPrefix" label="腾讯云前缀不能为空"></el-input>
-            </el-form-item>
-             <el-form-item v-if="form1.type==3" label="腾讯云SecretId" prop="qcloudSecretId">
-                <el-input  v-model="form1.qcloudSecretId" label="腾讯云SecretId不能为空"></el-input>
-            </el-form-item>
-             <el-form-item v-if="form1.type==3" label="腾讯云SecretKey" prop="qcloudSecretKey">
-                <el-input  v-model="form1.qcloudSecretKey" label="腾讯云SecretKey不能为空"></el-input>
-            </el-form-item>
-             <el-form-item v-if="form1.type==3" label="腾讯云BucketName" prop="qcloudBucketName">
-                <el-input  v-model="form1.qcloudBucketName" label="腾讯云BucketName不能为空"></el-input>
-            </el-form-item>
-             <el-form-item v-if="form1.type==3" label="所属地区" prop="qcloudRegion">
-                <el-input  v-model="form1.qcloudRegion" label="所属地区不能为空"></el-input>
-            </el-form-item>
-            <el-form-item v-if="form1.type==4" label="华为云绑定的域名" prop="huaweiDomain">
-              <el-input  v-model="form1.huaweiDomain" label="华为云绑定的域名格式不正确"></el-input>
-            </el-form-item>
-            <el-form-item v-if="form1.type==4" label="华为云Endpoint" prop="huaweiBucketName">
-              <el-input  v-model="form1.huaweiEndpoint" label="华为云Endpoint不能为空"></el-input>
-            </el-form-item>
+        <el-form ref="form1" :model="form1" :rules="rules1" label-width="160px">
+          <el-form-item label="类型" prop="type">
+            <el-radio-group v-model="form1.type">
+              <el-radio :label="1">七牛云</el-radio>
+              <el-radio :label="2">阿里云</el-radio>
+              <el-radio :label="3">腾讯云</el-radio>
+              <el-radio :label="4">华为云</el-radio>
+            </el-radio-group>
+          </el-form-item>
+          <el-form-item v-if="form1.type==1" label="七牛绑定的域名" prop="qiniuDomain">
+            <el-input  v-model="form1.qiniuDomain"  label="请输入七牛绑定的域名"></el-input>
+          </el-form-item>
+          <el-form-item v-if="form1.type==1" label="七牛路径前缀" prop="qiniuPrefix">
+            <el-input  v-model="form1.qiniuPrefix" label="请输入七牛路径前缀"></el-input>
+          </el-form-item>
+          <el-form-item v-if="form1.type==1" label="七牛ACCESS_KEY" prop="qiniuAccessKey">
+            <el-input  v-model="form1.qiniuAccessKey" label="请输入七牛ACCESS_KEY"></el-input>
+          </el-form-item>
+          <el-form-item v-if="form1.type==1" label="七牛SecretKey" prop="qiniuSecretKey">
+            <el-input  v-model="form1.qiniuSecretKey" label="七牛SecretKey不能为空"></el-input>
+          </el-form-item>
+          <el-form-item v-if="form1.type==1" label="七牛空间名" prop="qiniuBucketName">
+            <el-input  v-model="form1.qiniuBucketName" label="七牛空间名不能为空"></el-input>
+          </el-form-item>
+          <el-form-item v-if="form1.type==2" label="阿里云绑定的域名" prop="aliyunDomain">
+            <el-input  v-model="form1.aliyunDomain" label="阿里云绑定的域名不能为空"></el-input>
+          </el-form-item>
+          <el-form-item v-if="form1.type==2" label="阿里云路径前缀" prop="aliyunPrefix">
+            <el-input  v-model="form1.aliyunPrefix" label="阿里云路径前缀不能为空"></el-input>
+          </el-form-item>
+          <el-form-item v-if="form1.type==2" label="阿里云EndPoint" prop="aliyunEndPoint">
+            <el-input  v-model="form1.aliyunEndPoint" label="阿里云EndPoint不能为空"></el-input>
+          </el-form-item>
+          <el-form-item v-if="form1.type==2" label="阿里云AccessKeyId" prop="aliyunAccessKeyId">
+            <el-input  v-model="form1.aliyunAccessKeyId" label="阿里云AccessKeyId不能为空"></el-input>
+          </el-form-item>
+          <el-form-item v-if="form1.type==2" label="阿里云AccessKeySecret" prop="aliyunAccessKeySecret">
+            <el-input  v-model="form1.aliyunAccessKeySecret" label="阿里云AccessKeySecret不能为空"></el-input>
+          </el-form-item>
+          <el-form-item v-if="form1.type==2" label="阿里云BucketName" prop="aliyunBucketName">
+            <el-input  v-model="form1.aliyunBucketName" label="阿里云BucketName不能为空"></el-input>
+          </el-form-item>
+          <el-form-item v-if="form1.type==3" label="腾讯云绑定的域名" prop="qcloudDomain">
+            <el-input  v-model="form1.qcloudDomain" label="腾讯云绑定的域名格式不正确"></el-input>
+          </el-form-item>
+          <el-form-item v-if="form1.type==3" label="腾讯云前缀" prop="qcloudPrefix">
+            <el-input  v-model="form1.qcloudPrefix" label="腾讯云前缀不能为空"></el-input>
+          </el-form-item>
+          <el-form-item v-if="form1.type==3" label="腾讯云SecretId" prop="qcloudSecretId">
+            <el-input  v-model="form1.qcloudSecretId" label="腾讯云SecretId不能为空"></el-input>
+          </el-form-item>
+          <el-form-item v-if="form1.type==3" label="腾讯云SecretKey" prop="qcloudSecretKey">
+            <el-input  v-model="form1.qcloudSecretKey" label="腾讯云SecretKey不能为空"></el-input>
+          </el-form-item>
+          <el-form-item v-if="form1.type==3" label="腾讯云BucketName" prop="qcloudBucketName">
+            <el-input  v-model="form1.qcloudBucketName" label="腾讯云BucketName不能为空"></el-input>
+          </el-form-item>
+          <el-form-item v-if="form1.type==3" label="所属地区" prop="qcloudRegion">
+            <el-input  v-model="form1.qcloudRegion" label="所属地区不能为空"></el-input>
+          </el-form-item>
+          <el-form-item v-if="form1.type==4" label="华为云绑定的域名" prop="huaweiDomain">
+            <el-input  v-model="form1.huaweiDomain" label="华为云绑定的域名格式不正确"></el-input>
+          </el-form-item>
+          <el-form-item v-if="form1.type==4" label="华为云Endpoint" prop="huaweiBucketName">
+            <el-input  v-model="form1.huaweiEndpoint" label="华为云Endpoint不能为空"></el-input>
+          </el-form-item>
 
             <el-form-item v-if="form1.type==4" label="华为云AK" prop="huaweiAK">
               <el-input  v-model="form1.huaweiAK" label="华为云AK不能为空"></el-input>
@@ -719,6 +719,8 @@
       <el-form-item   label="erp类型" v-if="form13.erpOpen == 1">
         <el-radio v-model="form13.erpType" label=1>管易</el-radio>
         <el-radio v-model="form13.erpType" label=2>旺店通</el-radio>
+        <el-radio v-model="form13.erpType" label=3>瀚智OMS</el-radio>
+        <el-radio v-model="form13.erpType" label=4>代服管家</el-radio>
       </el-form-item>
       <el-form-item   label="erpAppKey" v-if="form13.erpOpen == 1 && form13.erpType == 1 " prop="erpAppKey">
           <el-input   v-model="form13.erpAppKey"  label="请输入erpAppKey"></el-input>
@@ -735,25 +737,94 @@
       <el-form-item   label="erpShopCode" v-if="form13.erpOpen == 1 && form13.erpType == 1 " prop="erpShopCode">
           <el-input   v-model="form13.erpShopCode"  label="请输入erpShopCode"></el-input>
       </el-form-item>
-
       <el-form-item   label="erpWdAppKey" v-if="form13.erpOpen == 1 && form13.erpType == 2 " prop="erpWdAppKey">
-          <el-input   v-model="form13.erpWdAppKey"  label="请输入erpAppKey"></el-input>
+        <el-input   v-model="form13.erpWdAppKey"  label="请输入erpAppKey"></el-input>
       </el-form-item>
       <el-form-item   label="erpWdAppsecret" v-if="form13.erpOpen == 1 && form13.erpType == 2 " prop="erpWdAppsecret">
-          <el-input   v-model="form13.erpWdAppsecret"  label="erpWdAppsecret"></el-input>
+        <el-input   v-model="form13.erpWdAppsecret"  label="erpWdAppsecret"></el-input>
       </el-form-item>
       <el-form-item   label="erpWdSid" v-if="form13.erpOpen == 1 && form13.erpType == 2 " prop="erpWdSid">
-          <el-input   v-model="form13.erpWdSid"  label="请输入erpWdSid"></el-input>
+        <el-input   v-model="form13.erpWdSid"  label="请输入erpWdSid"></el-input>
       </el-form-item>
       <el-form-item   label="erpWdShopCode" v-if="form13.erpOpen == 1 && form13.erpType == 2 " prop="erpWdShopCode">
-          <el-input   v-model="form13.erpWdShopCode"  label="请输入erpWdShopCode"></el-input>
+        <el-input   v-model="form13.erpWdShopCode"  label="请输入erpWdShopCode"></el-input>
       </el-form-item>
       <el-form-item   label="erpWdBaseUrl" v-if="form13.erpOpen == 1 && form13.erpType == 2 " prop="erpWdBaseUrl">
-          <el-input   v-model="form13.erpWdBaseUrl"  label="请输入erpWdBaseUrl"></el-input>
+        <el-input   v-model="form13.erpWdBaseUrl"  label="请输入erpWdBaseUrl"></el-input>
       </el-form-item>
       <el-form-item   label="erpWarehouseCode" v-if="form13.erpOpen == 1 && form13.erpType == 2 " prop="erpWarehouseCode">
-          <el-input   v-model="form13.erpWarehouseCode"  label="请输入erpWarehouseCode"></el-input>
+        <el-input   v-model="form13.erpWarehouseCode"  label="请输入erpWarehouseCode"></el-input>
       </el-form-item>
+      <!-- erpHzOMSid -->
+      <el-form-item   label="erpHzOMSAppKey" v-if="form13.erpOpen == 1 && form13.erpType == 3 " prop="erpHzOMSAppKey">
+        <el-input   v-model="form13.erpHzOMSAppKey"  label="请输入erpAppKey"></el-input>
+      </el-form-item>
+      <el-form-item   label="erpHzOMSAppsecret" v-if="form13.erpOpen == 1 && form13.erpType == 3 " prop="erpHzOMSAppsecret">
+        <el-input   v-model="form13.erpHzOMSAppsecret"  label="erpWdAppsecret"></el-input>
+      </el-form-item>
+      <el-form-item   label="erpHzOMSItenantid" v-if="form13.erpOpen == 1 && form13.erpType == 3 " prop="erpHzOMSItenantid">
+        <el-input   v-model="form13.erpHzOMSItenantid"  label="请输入erpHzOMSItenantid"></el-input>
+      </el-form-item>
+      <el-form-item   label="erpHzOMTokenUrl" v-if="form13.erpOpen == 1 && form13.erpType == 3 " prop="erpHzOMTokenUrl">
+        <el-input   v-model="form13.erpHzOMTokenUrl"  label="请输入erpHzOMTokenUrl"></el-input>
+      </el-form-item>
+      <el-form-item   label="erpHzOMBaseUrl" v-if="form13.erpOpen == 1 && form13.erpType == 3 " prop="erpHzOMBaseUrl">
+        <el-input   v-model="form13.erpHzOMBaseUrl"  label="请输入erpHzOMBaseUrl"></el-input>
+      </el-form-item>
+
+      <!-- 代付管家 - 修改为支持多账户 -->
+      <div v-if="form13.erpOpen == 1 && form13.erpType == 4">
+        <el-form-item label="代付管家账户配置">
+          <el-button type="primary" icon="el-icon-plus" @click="addDfAccount" style="margin-bottom: 10px;">添加新账号</el-button>
+        </el-form-item>
+
+        <div v-for="(account, index) in form13.dfAccounts" :key="index" style="border: 1px solid #dcdfe6; padding: 20px; margin-bottom: 20px; border-radius: 4px;">
+          <div style="display: flex; justify-content: between; align-items: center; margin-bottom: 15px;">
+            <div style="margin: 0; color: #409eff;">账户 {{ index + 1 }}</div>
+            <el-button
+              type="danger"
+              icon="el-icon-delete"
+              size="mini"
+              @click="removeDfAccount(index)"
+              v-if="form13.dfAccounts.length > 1">
+              删除账户
+            </el-button>
+          </div>
+
+          <el-form-item label="dfAppKey" :prop="`dfAccounts.${index}.dfAppKey`">
+            <el-input v-model="account.dfAppKey" placeholder="请输入dfAppKey"></el-input>
+          </el-form-item>
+          <el-form-item label="dfAppsecret" :prop="`dfAccounts.${index}.dfAppsecret`">
+            <el-input v-model="account.dfAppsecret" placeholder="请输入dfAppsecret"></el-input>
+          </el-form-item>
+          <el-form-item label="登录账号" :prop="`dfAccounts.${index}.loginAccount`">
+            <el-input v-model="account.loginAccount" placeholder="登录账号"></el-input>
+          </el-form-item>
+          <el-form-item label="回调地址" :prop="`dfAccounts.${index}.callBackUrl`">
+            <el-input v-model="account.callBackUrl" placeholder="回调地址"></el-input>
+          </el-form-item>
+          <el-form-item label="月结账号" :prop="`dfAccounts.${index}.monthlyCard`">
+            <el-input v-model="account.monthlyCard" placeholder="月结账号"></el-input>
+          </el-form-item>
+          <el-form-item label="寄件人姓名" :prop="`dfAccounts.${index}.senderName`">
+            <el-input v-model="account.senderName" placeholder="寄件人姓名"></el-input>
+          </el-form-item>
+          <el-form-item label="寄件人手机" :prop="`dfAccounts.${index}.senderPhone`">
+            <el-input v-model="account.senderPhone" placeholder="寄件人手机"></el-input>
+          </el-form-item>
+          <el-form-item label="寄件人省市区" prop="`cityIds`">
+               <el-cascader
+                         ref="citySelect"
+                         v-model="account.cityIds"
+                         :options="citys"
+                         @change="handleCityChange(index)">
+                         </el-cascader>
+               </el-form-item>
+          <el-form-item label="寄件人详细地址" :prop="`dfAccounts.${index}.senderAddress`">
+            <el-input v-model="account.senderAddress" placeholder="寄件人详细地址"></el-input>
+          </el-form-item>
+        </div>
+      </div>
 
       <el-form-item   label="appid" prop="appid">
           <el-input   v-model="form13.appid"  label="请输入appid"></el-input>
@@ -930,12 +1001,27 @@
                <el-input-number  v-model="form18.answerIntegral" :min="1"    ></el-input-number>
              </el-tooltip>
            </el-form-item>
+           <el-form-item label="ipad发送延迟">
+             <el-tooltip class="item" effect="dark" content="ipad发送消息延迟时间(ms)" placement="top-end">
+               <el-input-number  v-model="form18.delayStart" :min="100"></el-input-number>
+             </el-tooltip>
+           </el-form-item>
+           <el-form-item label="ipad发送延迟">
+             <el-tooltip class="item" effect="dark" content="ipad发送消息延迟时间(ms)" placement="top-end">
+               <el-input-number  v-model="form18.delayEnd" :min="100"></el-input-number>
+             </el-tooltip>
+           </el-form-item>
            <el-form-item label="看课默认线路" prop="defaultLine">
              <el-radio-group v-model="form18.defaultLine">
                <el-radio label="0">线路一</el-radio>
                <el-radio label="1">线路二</el-radio>
              </el-radio-group>
            </el-form-item>
+           <el-form-item label="一级域名">
+             <el-tooltip class="item" effect="dark" content="顶级域名" placement="top-end">
+               <el-input  v-model="form18.courseDomainName"     ></el-input>
+             </el-tooltip>
+           </el-form-item>
            <el-form-item label="通用看课域名">
              <el-tooltip class="item" effect="dark" content="真链域名" placement="top-end">
                <el-input  v-model="form18.realLinkDomainName"     ></el-input>
@@ -1014,6 +1100,11 @@
              <image-upload v-model="form18.courseLogo" :limit="1" />
            </el-form-item>
 
+           <el-form-item label="侧边栏公共图" prop="sidebarImageUrl">
+             <image-upload v-model="form18.sidebarImageUrl" :limit="1" />
+           </el-form-item>
+
+
            <el-form-item label="开启评论/弹幕" prop="openCommentStatus">
              <el-radio-group v-model="form18.openCommentStatus">
                <el-radio :label="1" >开启评论</el-radio>
@@ -1025,7 +1116,7 @@
           :rules="rulesDelay"
               >
   <el-tooltip class="item" effect="dark" content="请输入延时时间,范围在1000毫秒-2000毫秒之间" placement="top-end">
-    <el-input 
+    <el-input
       v-model.number="form18.sendDelayTime"
       type="number"
       :min="1000"
@@ -1061,11 +1152,22 @@
                  v-model="scope.row.type"
                   placeholder="请选择类型"
                  :disabled="!scope.row.editing">
-                 <el-option label="公众号" value="1"></el-option>
-                 <el-option label="小程序" value="2"></el-option>
+                 <el-option label="小程序" value="1"></el-option>
+                 <el-option label="服务号" value="2"></el-option>
                </el-select>
              </template>
            </el-table-column>
+           <el-table-column label="小程序原始ID" align="center" prop="username">
+             <template slot-scope="scope" v-if="scope.row.type == 1">
+               <el-input v-model="scope.row.username" placeholder="请输入原始ID" :disabled="!scope.row.editing" />
+             </template>
+           </el-table-column>
+           <el-table-column label="小程序图标" align="center" prop="log">
+             <template slot-scope="scope" v-if="scope.row.type == 1">
+               <el-image v-if="!scope.row.editing && scope.row.log" :src="scope.row.log" :preview-src-list="[scope.row.log]" />
+               <image-upload v-if="scope.row.editing" v-model="scope.row.log" :file-type='["png", "jpg", "jpeg"]' :limit="1"/>
+             </template>
+           </el-table-column>
            <el-table-column label="AppId" align="center" prop="appid">
              <template slot-scope="scope">
                <el-input v-model="scope.row.appid" placeholder="请输入AppId" :disabled="!scope.row.editing" />
@@ -1246,6 +1348,22 @@
            </div>
          </el-form>
        </el-tab-pane>
+      <el-tab-pane label="注册配置" name="his.login" >
+        <el-form ref="form22" :model="form22"  label-width="150px">
+          <el-form-item   label="注册初始密码" prop="loginPassword">
+            <el-input   v-model="form22.loginPassword"  label="请输入初始密码"></el-input>
+          </el-form-item>
+          <el-form-item label="首次登录是否修改密码">
+            <el-row>
+              <el-switch v-model="form22.disabled"></el-switch>
+            </el-row>
+          </el-form-item>
+          <div class="footer">
+            <el-button type="primary" @click="submitForm22">提  交</el-button>
+          </div>
+        </el-form>
+
+      </el-tab-pane>
        <el-tab-pane label="企业理念" name="store.concept">
          <el-form ref="form21" :model="form21" :rules="rules21" label-width="160px">
            <el-form-item   label="企业理念图片" prop="images">
@@ -1269,9 +1387,9 @@
            </el-form-item>
            <div  class="footer">
              <el-button type="primary" @click="submitForm21">提  交</el-button>
-           </div>
-         </el-form>
-       </el-tab-pane>
+        </div>
+      </el-form>
+    </el-tab-pane>
     </el-tabs>
 
 
@@ -1296,13 +1414,17 @@ import {getAllFollowTempName } from "@/api/his/followTemp";
 import productAttrValueSelect from "../../components/his/productGiftValueSelect.vue";
 import productDeliveryGiftValueSelect from "../../components/his/productDeliveryGiftValueSelect.vue";
 import { Col } from "element-ui";
+import companyMenuConfig from "./companyMenuConfig";
+import {getCitys} from "@/api/store/city";
 export default {
   name: "Config",
   components: {
+    companyMenuConfig,
     Material,productAttrValueSelect,productDeliveryGiftValueSelect
   },
   data() {
     return {
+      citys:[],
       images:[],
       uploadUrl:process.env.VUE_APP_BASE_API+"/common/uploadOSS",
       videoAccept:"video/*",
@@ -1344,6 +1466,7 @@ export default {
       },
       form12:[],
       form13:{
+        dfAccounts: [] // 初始化代付管家账户数组
       },
       form14:{
       },
@@ -1371,6 +1494,9 @@ export default {
       },
       form21: {
 
+      },
+      form22: {
+
       },
       photoArr:[],
       couponList:[],
@@ -1381,7 +1507,7 @@ export default {
       rules3: {
       },
       rulesDelay:[
-                { 
+                {
                   validator: (rule, value, callback) => {
                     if (value === '' || value == null) {
                       callback(); // 允许为空,不校验范围
@@ -1430,6 +1556,49 @@ export default {
    }
   },
   methods: {
+    handleCityChange(value) {
+      // console.log(this.$refs.citySelect,this.$refs.citySelect[0])
+      var nodes=this.$refs.citySelect[0].getCheckedNodes();
+      // console.log(nodes[0])
+      // this.account[value].cityIds=value.toString();
+      this.form13.dfAccounts[value].senderProvince=nodes[0].pathLabels[0];
+      this.form13.dfAccounts[value].senderCity=nodes[0].pathLabels[1];
+      this.form13.dfAccounts[value].senderDistrict=nodes[0].pathLabels[2];
+    },
+    getCitys(){
+        getCitys().then(res => {
+          this.loading = false;
+          this.citys=res.data;
+        })
+    },
+    // 添加代付管家账户
+    addDfAccount() {
+      this.form13.dfAccounts.push({
+        dfAppKey: '',
+        dfAppsecret: '',
+        loginAccount: '',
+        callBackUrl: '',
+        monthlyCard: '',
+        senderName: '',
+        senderPhone: '',
+        cityIds: '',
+        senderProvince: '',
+        senderCity: '',
+        senderDistrict: '',
+        senderAddress: '',
+      });
+    },
+    // 删除代付管家账户
+    removeDfAccount(index) {
+      this.$confirm('确认删除该账户?', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      }).then(() => {
+        this.form13.dfAccounts.splice(index, 1);
+        this.$message.success('删除成功');
+      }).catch(() => {});
+    },
     handleSuccess(response, file) {
       // 上传成功后的回调函数
       this.myloading.close();
@@ -1573,7 +1742,16 @@ export default {
               this.form12 =JSON.parse(response.data.configValue);
           }
           if(key=="his.config"){
+              this.getCitys();
               this.form13 =JSON.parse(response.data.configValue);
+              // 确保代付管家账户数组存在
+              if (!this.form13.dfAccounts || !Array.isArray(this.form13.dfAccounts)) {
+                this.form13.dfAccounts = [];
+              }
+              // 如果没有账户,添加一个默认账户
+              if (this.form13.dfAccounts.length === 0) {
+                this.addDfAccount();
+              }
           }
           if(key=="store.config"){
              this.form17 =JSON.parse(response.data.configValue);
@@ -1609,6 +1787,9 @@ export default {
             }
             this.courseMaConfigLoading = false;
           }
+          if(key=="his.login"){
+            this.form22 =JSON.parse(response.data.configValue);
+          }
           else if(key=="store.concept"){
             this.configId=response.data.configId;
             this.configKey=response.data.configKey;
@@ -1717,6 +1898,9 @@ export default {
      });
   },
   submitForm13(){
+    const accounts =  this.form13.dfAccounts
+
+    console.log(accounts)
     var param={configId:this.configId,configValue:JSON.stringify(this.form13)}
     updateConfigByKey(param).then(response => {
        if (response.code === 200) {
@@ -1756,6 +1940,14 @@ export default {
         }
       });
     },
+    submitForm22(){
+      var param={configId:this.configId,configValue:JSON.stringify(this.form22)}
+      updateConfigByKey(param).then(response => {
+        if (response.code === 200) {
+          this.msgSuccess("修改成功");
+        }
+      });
+    },
     submitForm18(){
       var param={configId:this.configId,configValue:JSON.stringify(this.form18)}
       updateConfigByKey(param).then(response => {

+ 1889 - 0
src/views/system/config/config2.vue

@@ -0,0 +1,1889 @@
+<template>
+  <div class="app-container">
+     <el-tabs v-model="activeName" @tab-click="handleClick" >
+      <el-tab-pane label="OSS配置" name="sys.oss.cloudStorage">
+          <el-form ref="form1" :model="form1" :rules="rules1" label-width="160px">
+            <el-form-item label="类型" prop="type">
+               <el-radio-group v-model="form1.type">
+                <el-radio :label="1">七牛云</el-radio>
+                <el-radio :label="2">阿里云</el-radio>
+                <el-radio :label="3">腾讯云</el-radio>
+                <el-radio :label="4">华为云</el-radio>
+              </el-radio-group>
+            </el-form-item>
+            <el-form-item v-if="form1.type==1" label="七牛绑定的域名" prop="qiniuDomain">
+                <el-input  v-model="form1.qiniuDomain"  label="请输入七牛绑定的域名"></el-input>
+            </el-form-item>
+             <el-form-item v-if="form1.type==1" label="七牛路径前缀" prop="qiniuPrefix">
+                <el-input  v-model="form1.qiniuPrefix" label="请输入七牛路径前缀"></el-input>
+            </el-form-item>
+             <el-form-item v-if="form1.type==1" label="七牛ACCESS_KEY" prop="qiniuAccessKey">
+                <el-input  v-model="form1.qiniuAccessKey" label="请输入七牛ACCESS_KEY"></el-input>
+            </el-form-item>
+            <el-form-item v-if="form1.type==1" label="七牛SecretKey" prop="qiniuSecretKey">
+                <el-input  v-model="form1.qiniuSecretKey" label="七牛SecretKey不能为空"></el-input>
+            </el-form-item>
+            <el-form-item v-if="form1.type==1" label="七牛空间名" prop="qiniuBucketName">
+                <el-input  v-model="form1.qiniuBucketName" label="七牛空间名不能为空"></el-input>
+            </el-form-item>
+             <el-form-item v-if="form1.type==2" label="阿里云绑定的域名" prop="aliyunDomain">
+                <el-input  v-model="form1.aliyunDomain" label="阿里云绑定的域名不能为空"></el-input>
+            </el-form-item>
+             <el-form-item v-if="form1.type==2" label="阿里云路径前缀" prop="aliyunPrefix">
+                <el-input  v-model="form1.aliyunPrefix" label="阿里云路径前缀不能为空"></el-input>
+            </el-form-item>
+             <el-form-item v-if="form1.type==2" label="阿里云EndPoint" prop="aliyunEndPoint">
+                <el-input  v-model="form1.aliyunEndPoint" label="阿里云EndPoint不能为空"></el-input>
+            </el-form-item>
+             <el-form-item v-if="form1.type==2" label="阿里云AccessKeyId" prop="aliyunAccessKeyId">
+                <el-input  v-model="form1.aliyunAccessKeyId" label="阿里云AccessKeyId不能为空"></el-input>
+            </el-form-item>
+            <el-form-item v-if="form1.type==2" label="阿里云AccessKeySecret" prop="aliyunAccessKeySecret">
+                <el-input  v-model="form1.aliyunAccessKeySecret" label="阿里云AccessKeySecret不能为空"></el-input>
+            </el-form-item>
+             <el-form-item v-if="form1.type==2" label="阿里云BucketName" prop="aliyunBucketName">
+                <el-input  v-model="form1.aliyunBucketName" label="阿里云BucketName不能为空"></el-input>
+            </el-form-item>
+              <el-form-item v-if="form1.type==3" label="腾讯云绑定的域名" prop="qcloudDomain">
+                <el-input  v-model="form1.qcloudDomain" label="腾讯云绑定的域名格式不正确"></el-input>
+            </el-form-item>
+              <el-form-item v-if="form1.type==3" label="腾讯云前缀" prop="qcloudPrefix">
+                <el-input  v-model="form1.qcloudPrefix" label="腾讯云前缀不能为空"></el-input>
+            </el-form-item>
+             <el-form-item v-if="form1.type==3" label="腾讯云SecretId" prop="qcloudSecretId">
+                <el-input  v-model="form1.qcloudSecretId" label="腾讯云SecretId不能为空"></el-input>
+            </el-form-item>
+             <el-form-item v-if="form1.type==3" label="腾讯云SecretKey" prop="qcloudSecretKey">
+                <el-input  v-model="form1.qcloudSecretKey" label="腾讯云SecretKey不能为空"></el-input>
+            </el-form-item>
+             <el-form-item v-if="form1.type==3" label="腾讯云BucketName" prop="qcloudBucketName">
+                <el-input  v-model="form1.qcloudBucketName" label="腾讯云BucketName不能为空"></el-input>
+            </el-form-item>
+             <el-form-item v-if="form1.type==3" label="所属地区" prop="qcloudRegion">
+                <el-input  v-model="form1.qcloudRegion" label="所属地区不能为空"></el-input>
+            </el-form-item>
+            <el-form-item v-if="form1.type==4" label="华为云绑定的域名" prop="huaweiDomain">
+              <el-input  v-model="form1.huaweiDomain" label="华为云绑定的域名格式不正确"></el-input>
+            </el-form-item>
+            <el-form-item v-if="form1.type==4" label="华为云Endpoint" prop="huaweiBucketName">
+              <el-input  v-model="form1.huaweiEndpoint" label="华为云Endpoint不能为空"></el-input>
+            </el-form-item>
+
+            <el-form-item v-if="form1.type==4" label="华为云AK" prop="huaweiAK">
+              <el-input  v-model="form1.huaweiAK" label="华为云AK不能为空"></el-input>
+            </el-form-item>
+            <el-form-item v-if="form1.type==4" label="华为云SK" prop="huaweiSK">
+              <el-input  v-model="form1.huaweiSK" label="华为云SK不能为空"></el-input>
+            </el-form-item>
+            <el-form-item v-if="form1.type==4" label="华为云BucketName" prop="huaweiBucketName">
+              <el-input  v-model="form1.huaweiBucketName" label="华为云BucketName不能为空"></el-input>
+            </el-form-item>
+            <div   class="footer">
+              <el-button type="primary" @click="submitForm1">提  交</el-button>
+            </div>
+          </el-form>
+      </el-tab-pane>
+
+
+      <el-tab-pane label="问诊配置" name="his.inquiryConfig">
+          <el-form   label-width="180px">
+            <el-form-item  :label="item.type==1?'图文问诊价格':'视频问诊价格'" prop="price" v-for="item in form2.prices">
+                  <el-input-number v-model="item.price" :precision="2" :step="0.1"></el-input-number>
+            </el-form-item>
+            <el-form-item  label="问诊费扣款" prop="companyPrice">
+                  <el-input-number v-model="form2.companyPrice" :precision="2" :step="0.1"></el-input-number>
+            </el-form-item>
+            <el-form-item  label="开药问诊费扣款" prop="companyPrescribePrice">
+                  <el-input-number v-model="form2.companyPrescribePrice" :precision="2" :step="0.1"></el-input-number>
+            </el-form-item>
+            <el-form-item label="待支付订单取消时间(分钟)" prop="unPayCancelTime">
+              <el-tooltip class="item" effect="dark" content="待支付订单取消时间(分钟)" placement="top-end">
+                   <el-input-number v-model="form2.unPayCancelTime" :min="0"  ></el-input-number>
+              </el-tooltip>
+            </el-form-item>
+            <el-form-item label="问诊未接单取消时间(分钟)" prop="unReceiveCancelTime">
+              <el-tooltip class="item" effect="dark" content="问诊未接单取消时间(分钟)" placement="top-end">
+                   <el-input-number v-model="form2.unReceiveCancelTime" :min="0"  ></el-input-number>
+              </el-tooltip>
+            </el-form-item>
+            <el-form-item label="是否自动审方" prop="doctorRegister">
+              <el-switch
+                v-model="form2.isAutoPrescribeAudit"
+                active-color="#13ce66"
+                  inactive-color="#ff4949">
+              </el-switch>
+            </el-form-item>
+            <el-form-item label="会诊类型" prop="inquirySubType">
+                <div>
+                  <el-button plain  type="primary" icon="el-icon-plus" @click="addInquirySubType" style="margin-bottom: 5px;">添加会诊类型</el-button>
+                  <el-table border :data="form2.inquirySubType"  style="width: 701px;">
+
+                    <el-table-column prop="lable"label="名称" width="300px">
+                      <template slot-scope="scope"><el-input  v-model="scope.row.lable"    ></el-input>  </template>
+                    </el-table-column>
+                    <el-table-column prop="value"label="类型" width="300px">
+
+                      <template slot-scope="scope">
+                        <el-select v-model="scope.row.value" placeholder="类型" clearable size="small">
+                             <el-option
+                               v-for="dict in inquirySubTypeOptions"
+                               :key="dict.dictValue"
+                               :label="dict.dictLabel"
+                               :value="dict.dictValue"
+                             />
+                         </el-select>
+                      </template>
+                    </el-table-column>
+                    <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="100px" fixed="right">
+                      <template slot-scope="scope">
+                        <el-button
+                          size="mini"
+                          type="text"
+                          icon="el-icon-delete"
+                          @click="deleteInquirySubType(scope.$index, scope.row)"
+                        >删除</el-button>
+                      </template>
+                    </el-table-column>
+                  </el-table>
+                </div>
+            </el-form-item>
+
+
+             <div   class="footer">
+              <el-button type="primary" @click="submitform2">提  交</el-button>
+            </div>
+          </el-form>
+      </el-tab-pane>
+
+      <el-tab-pane label="协议配置" name="his.agreementConfig" :rules="rules3">
+          <el-form ref="form3" :model="form3"  label-width="150px">
+            <el-form-item label="医生注册协议" prop="doctorRegister">
+              <editor v-model="form3.doctorRegister" :min-height="292"/>
+            </el-form-item>
+            <el-form-item label="医生多机构备案协议" prop="doctorFiling">
+              <editor v-model="form3.doctorFiling" :min-height="292"/>
+            </el-form-item>
+            <el-form-item label="用户协议" prop="userRegister">
+              <editor v-model="form3.userRegister" :min-height="292"/>
+            </el-form-item>
+            <el-form-item label="隐私协议" prop="userPrivacy">
+              <editor v-model="form3.userPrivacy" :min-height="292"/>
+            </el-form-item>
+            <el-form-item label="健康客服协议" prop="userHealth">
+              <editor v-model="form3.userHealth" :min-height="292"/>
+            </el-form-item>
+            <el-form-item label="会员服务协议" prop="vipService">
+              <editor v-model="form3.vipService" :min-height="292"/>
+            </el-form-item>
+
+            <div class="footer">
+              <el-button type="primary" @click="submitForm3">提  交</el-button>
+            </div>
+          </el-form>
+      </el-tab-pane>
+
+    <el-tab-pane label="资质证明" name="his.certs" >
+        <el-form ref="form4" :model="form4"  label-width="150px">
+         <el-form-item   label="资质证明" prop="certs">
+             <Material v-model="photoArr" type="image" :num="10" :width="150" :height="150" />
+         </el-form-item>
+
+          <div class="footer">
+            <el-button type="primary" @click="submitForm4">提  交</el-button>
+          </div>
+        </el-form>
+    </el-tab-pane>
+     <el-tab-pane label="品牌介绍" name="his.brand" >
+       <el-form ref="form16" :model="form16"  label-width="150px">
+         <el-form-item   label="品牌介绍" prop="brandInfo">
+           <ImageUpload v-model="form16.brandInfo" type="image" :num="10" :width="150" :height="150" />
+         </el-form-item>
+
+         <div class="footer">
+           <el-button type="primary" @click="submitForm16">提  交</el-button>
+         </div>
+       </el-form>
+     </el-tab-pane>
+    <el-tab-pane label="佣金配置" name="his.brokerage" style="width: 100%;">
+
+      <div  >
+        <el-table border :data="form5"  style="width: 100%;">
+          <el-table-column prop="type" label="类型" width="300px"/>
+          <el-table-column prop="doctorMedicineBrokerage"label="医生中药佣金%" width="300px">
+            <template slot-scope="scope"><el-input-number  v-model="scope.row.doctorMedicineBrokerage" :min="0" :max="100"    ></el-input-number>  </template>
+          </el-table-column>
+          <el-table-column prop="doctorInquiryBrokerage"label="医生服务佣金%" width="300px">
+            <template slot-scope="scope"><el-input-number  v-model="scope.row.doctorInquiryBrokerage" :min="0" :max="100"    ></el-input-number>  </template>
+          </el-table-column>
+          <el-table-column prop="tuiMedicineBrokerage" label="推广人员中药佣金%" width="300px">
+            <template slot-scope="scope">  <el-input-number  v-model="scope.row.tuiMedicineBrokerage" :min="0" :max="100"    > </el-input-number> </template>
+          </el-table-column>
+        </el-table>
+        <div style="float: right;"  class="footer">
+          <el-button type="primary" @click="submitForm5">提  交</el-button>
+        </div>
+      </div>
+    </el-tab-pane>
+
+    <el-tab-pane label="优惠券" name="his.coupon" >
+        <el-form ref="form6" :model="form6"  label-width="150px">
+        <el-form-item label="用户注册优惠券" prop="inquiryBrokerage">
+           <el-select v-model="form6.registerCoupon" multiple placeholder="请选择" style="width: 300px;">
+             <el-option
+               v-for="item in couponList"
+               :key="item.couponId"
+               :label="item.title"
+               :value="item.couponId"
+             ></el-option>
+           </el-select>
+        </el-form-item>
+        <el-form-item label="新手任务优惠券" prop="userTaskCoupon">
+          <el-select v-model="form6.userTaskCoupon" placeholder="请选择" style="width: 300px;">
+            <el-option
+              v-for="item in couponList"
+              :key="item.couponId"
+              :label="item.title"
+              :value="item.couponId"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+          <div class="footer">
+            <el-button type="primary" @click="submitForm6">提  交</el-button>
+          </div>
+        </el-form>
+    </el-tab-pane>
+
+    <el-tab-pane label="商城配置" name="his.store" >
+        <el-form ref="form1" :model="form7"  label-width="180px">
+
+          <el-form-item  label="货到付款支付比例" prop="payRate">
+            <el-tooltip class="item" effect="dark" content="货到付款支付比例(%)" placement="top-end">
+              <el-input-number  v-model="form7.payRate"   ></el-input-number>
+            </el-tooltip>
+          </el-form-item>
+          <el-form-item  label="待支付订单取消时间" prop="unPayTime">
+            <el-tooltip class="item" effect="dark" content="待支付订单取消时间(分钟)" placement="top-end">
+              <el-input-number  v-model="form7.unPayTime" :min="1"    ></el-input-number>
+            </el-tooltip>
+
+          </el-form-item>
+          <el-form-item  label="公司推广佣金比例" prop="tuiMoneyRate">
+            <el-tooltip class="item" effect="dark" content="公司推广佣金比例(%)" placement="top-end">
+              <el-input-number  v-model="form7.tuiMoneyRate" :min="1" :max="100"    ></el-input-number>
+            </el-tooltip>
+          </el-form-item>
+          <el-form-item  label="公司发货扣除成本比例" prop="deductMoneyRate">
+            <el-tooltip class="item" effect="dark" content="公司发货扣除成本比例(%)" placement="top-end">
+              <el-input-number  v-model="form7.deductMoneyRate" :min="1" :max="100"    ></el-input-number>
+            </el-tooltip>
+          </el-form-item>
+          <el-form-item  label="申请售后有效天数" prop="storeAfterSalesDay">
+            <el-tooltip class="item" effect="dark" content="确认收货后申请售后天数" placement="top-end">
+              <el-input-number  v-model="form7.storeAfterSalesDay" :min="0" :max="100"    ></el-input-number>
+            </el-tooltip>
+          </el-form-item>
+          <el-form-item  label="坐席自动回收天数" prop="storeCall">
+            <el-tooltip class="item" effect="dark" content="坐席自动回收天数" placement="top-end">
+              <el-input-number  v-model="form7.storeCall" :min="0" :max="100"    ></el-input-number>
+            </el-tooltip>
+          </el-form-item>
+          <el-form-item  label="退货收货人" prop="refundConsignee">
+            <el-tooltip class="item" effect="dark" content="退货收货人" placement="top-end">
+              <el-input style="width:200px"  v-model="form7.refundConsignee"   ></el-input>
+            </el-tooltip>
+          </el-form-item>
+          <el-form-item  label="退货手机号" prop="refundPhoneNumber">
+            <el-tooltip class="item" effect="dark" content="退货手机号" placement="top-end">
+              <el-input  style="width:200px"  v-model="form7.refundPhoneNumber"   ></el-input>
+            </el-tooltip>
+          </el-form-item>
+          <el-form-item  label="退货地址" prop="refundAddress">
+            <el-tooltip class="item" effect="dark" content="退货地址" placement="top-end">
+              <el-input    v-model="form7.refundAddress"   ></el-input>
+            </el-tooltip>
+          </el-form-item>
+          <el-form-item label="随访模板" prop="followTempId">
+            <el-select v-model="form7.followTempId" placeholder="请选择模板" clearable size="small">
+                    <el-option
+                      v-for="dict in tempOptions"
+                      :key="dict.dictValue"
+                      :label="dict.dictLabel"
+                      :value="dict.dictValue"
+                    />
+            </el-select>
+          </el-form-item>
+          <el-form-item label="基础疾病随访" prop="oneFollowTempId">
+            <el-select v-model="form7.oneFollowTempId" placeholder="请选择模板" clearable size="small">
+                    <el-option
+                      v-for="dict in tempOptions"
+                      :key="dict.dictValue"
+                      :label="dict.dictLabel"
+                      :value="dict.dictValue"
+                    />
+            </el-select>
+          </el-form-item>
+          <el-form-item  label="随访频率(天)" prop="followRate">
+            <el-tooltip class="item" effect="dark" content="followRate" placement="top-end">
+              <el-input-number  v-model="form7.followRate" :min="0" :max="1000"    ></el-input-number>
+            </el-tooltip>
+          </el-form-item>
+         <div   class="footer">
+            <el-button type="primary" @click="submitForm7">提  交</el-button>
+          </div>
+        </el-form>
+    </el-tab-pane>
+    <el-tab-pane label="套餐包" name="his.package" >
+        <el-form ref="form8" :model="form8"  label-width="150px">
+          <el-form-item  label="物流代收定金比例(%)" prop="payRate">
+            <el-tooltip class="item" effect="dark" content="公司推广佣金比例(%)" placement="top-end">
+              <el-input-number  v-model="form8.payRate" :min="1" :max="100"    ></el-input-number>
+            </el-tooltip>
+          </el-form-item>
+
+          <el-form-item  label="货到付款加收运费(元)" prop="payDelivery">
+            <el-tooltip class="item" effect="dark" content="货到付款加收运费" placement="top-end">
+              <el-input-number  v-model="form8.payDelivery" :min="0" :max="1000"    ></el-input-number>
+            </el-tooltip>
+          </el-form-item>
+          <el-form-item  label="随访频率(天)" prop="followRate">
+            <el-tooltip class="item" effect="dark" content="followRate" placement="top-end">
+              <el-input-number  v-model="form8.followRate" :min="0" :max="1000"    ></el-input-number>
+            </el-tooltip>
+          </el-form-item>
+          <el-form-item  label="全款支付赠品" prop="gift">
+            <div ><el-button plain  type="primary" icon="el-icon-plus" @click="handleAddProduct">添加商品</el-button></div>
+           <el-table border width="100%" style="margin-top:5px;"  :data="form8.gift">
+             <el-table-column label="商品图片" align="center" width="100">
+               <template slot-scope="scope">
+                 <el-popover
+                   placement="right"
+                   title=""
+                   trigger="hover">
+                   <img slot="reference" :src="scope.row.image" width="50">
+                   <img :src="scope.row.image" style="max-width: 50px;">
+                 </el-popover>
+               </template>
+             </el-table-column>
+             <el-table-column label="商品名称" show-overflow-tooltip align="center" prop="productName" />
+             <el-table-column label="商品编号" align="center" prop="barCode" />
+             <el-table-column label="商品规格" align="center" prop="sku" />
+             <el-table-column label="店铺名称" align="center" prop="storeName" />
+             <el-table-column label="售价" align="center"  prop="price"  />
+           </el-table>
+          </el-form-item>
+          <el-form-item  label="物流代收赠品" prop="gift">
+            <div ><el-button plain  type="primary" icon="el-icon-plus" @click="handleDeliveryGift">添加商品</el-button></div>
+           <el-table border width="100%" style="margin-top:5px;"  :data="form8.deliveryGift">
+             <el-table-column label="商品图片" align="center" width="100">
+               <template slot-scope="scope">
+                 <el-popover
+                   placement="right"
+                   title=""
+                   trigger="hover">
+                   <img slot="reference" :src="scope.row.image" width="50">
+                   <img :src="scope.row.image" style="max-width: 50px;">
+                 </el-popover>
+               </template>
+             </el-table-column>
+             <el-table-column label="商品名称" show-overflow-tooltip align="center" prop="productName" />
+             <el-table-column label="商品编号" align="center" prop="barCode" />
+             <el-table-column label="商品规格" align="center" prop="sku" />
+             <el-table-column label="店铺名称" align="center" prop="storeName" />
+             <el-table-column label="售价" align="center"  prop="price"  />
+           </el-table>
+          </el-form-item>
+          <el-form-item label="赠品店铺" prop="giftStoreId">
+            <el-select v-model="form8.giftStoreId" placeholder="赠品店铺" clearable size="small">
+                    <el-option
+                      v-for="dict in storeOPtions"
+                      :key="dict.dictValue"
+                      :label="dict.dictLabel"
+                      :value="dict.dictValue"
+                    />
+                  </el-select>
+          </el-form-item>
+          <el-form-item  label="赠品起送金额(元)" prop="giftPrice">
+            <el-tooltip class="item" effect="dark" content="赠品起送金额" placement="top-end">
+              <el-input-number  v-model="form8.giftPrice" :min="0" :max="10000"    ></el-input-number>
+            </el-tooltip>
+          </el-form-item>
+          <div class="footer">
+            <el-button type="primary" @click="submitForm8">提  交</el-button>
+          </div>
+        </el-form>
+    </el-tab-pane>
+    <el-tab-pane label="支付配置" name="his.pay">
+        <el-form ref="form9" :model="form9"  label-width="160px">
+          <el-form-item label="支付类型" prop="type">
+             <el-radio-group v-model="form9.type">
+              <el-radio label="yb">易宝</el-radio>
+              <el-radio label="tz">台州银行</el-radio>
+              <el-radio label="wx">微信</el-radio>
+               <el-radio label="hf">汇付</el-radio>
+            </el-radio-group>
+          </el-form-item>
+          <el-form-item   label="appId" prop="appId">
+              <el-input   v-model="form9.appId"  label="请输入appId"></el-input>
+          </el-form-item>
+          <el-form-item  v-if="form9.type=='yb'" label="易宝商户号" prop="ybAccount">
+              <el-input   v-model="form9.ybAccount"  label="请输入易宝商户号"></el-input>
+          </el-form-item>
+           <el-form-item v-if="form9.type=='yb'" label="易宝Key" prop="ybKey">
+              <el-input  v-model="form9.ybKey" label="请输入易宝Key"></el-input>
+          </el-form-item>
+          <el-form-item v-if="form9.type=='yb'" label="易宝回调地址" prop="ybNotifyUrl">
+              <el-input  v-model="form9.ybNotifyUrl" label="易宝回调地址"></el-input>
+          </el-form-item>
+          <el-form-item  v-if="form9.type=='tz'" label="台州商户号" prop="tzPlatMerCstNo">
+              <el-input   v-model="form9.tzPlatMerCstNo"  label="请输入台州商户号"></el-input>
+          </el-form-item>
+           <el-form-item v-if="form9.type=='tz'" label="台州appSecret" prop="tzAppSecret">
+              <el-input  v-model="form9.tzAppSecret" label="请输入台州appSecret"></el-input>
+          </el-form-item>
+          <el-form-item v-if="form9.type=='tz'" label="台州私钥" prop="tzPrivateKey">
+              <el-input  v-model="form9.tzPrivateKey" label="请输入台州私钥"></el-input>
+          </el-form-item>
+          <el-form-item v-if="form9.type=='tz'" label="台州平台公钥" prop="tzPlatformPublicKey">
+              <el-input  v-model="form9.tzPlatformPublicKey" label="请输入台州平台公钥"></el-input>
+          </el-form-item>
+          <el-form-item v-if="form9.type=='tz'" label="台州appKey" prop="tzAppKey">
+              <el-input  v-model="form9.tzAppKey" label="请输入台州appKey"></el-input>
+          </el-form-item>
+          <el-form-item v-if="form9.type=='tz'" label="台州支付回调地址" prop="tzPayDecrypt">
+              <el-input  v-model="form9.tzPayDecrypt" label="请输入台州支付回调地址"></el-input>
+          </el-form-item>
+          <el-form-item v-if="form9.type=='tz'" label="退款回调地址" prop="tzRefundDecrypt">
+              <el-input  v-model="form9.tzRefundDecrypt" label="请输入退款回调地址"></el-input>
+          </el-form-item>
+          <el-form-item v-if="form9.type=='tz'" label="分账回调地址" prop="tzOrderShareDecrypt">
+              <el-input  v-model="form9.tzOrderShareDecrypt" label="请输入台州分账回调地址"></el-input>
+          </el-form-item>
+          <el-form-item  v-if="form9.type=='wx'" label="微信商户号" prop="wxMchId">
+              <el-input   v-model="form9.wxMchId"  label="请输入微信商户号"></el-input>
+          </el-form-item>
+           <el-form-item v-if="form9.type=='wx'" label="微信Key" prop="wxMchKey">
+              <el-input  v-model="form9.wxMchKey" label="请输入微信Key"></el-input>
+          </el-form-item>
+
+
+          <el-form-item  v-if="form9.type=='hf'" label="汇付产品号" prop="hfProductId">
+              <el-input   v-model="form9.hfProductId"  label="汇付产品号"></el-input>
+          </el-form-item>
+           <el-form-item v-if="form9.type=='hf'" label="系统号" prop="hfSysId">
+              <el-input  v-model="form9.hfSysId" label="系统号Key"></el-input>
+          </el-form-item>
+          <el-form-item v-if="form9.type=='hf'" label="商户号" prop="huifuId">
+              <el-input  v-model="form9.huifuId" label="商户号"></el-input>
+          </el-form-item>
+          <el-form-item v-if="form9.type=='hf'" label="商户私钥" prop="hfRsaPrivateKey">
+              <el-input  v-model="form9.hfRsaPrivateKey" label="商户私钥"></el-input>
+          </el-form-item>
+          <el-form-item v-if="form9.type=='hf'" label="汇付公钥" prop="hfRsaPublicKey">
+              <el-input  v-model="form9.hfRsaPublicKey" label="汇付公钥"></el-input>
+          </el-form-item>
+          <el-form-item v-if="form9.type=='hf'" label="汇付支付回调地址" prop="hfPayNotifyUrl">
+              <el-input  v-model="form9.hfPayNotifyUrl" label="汇付支付回调地址"></el-input>
+          </el-form-item>
+          <el-form-item v-if="form9.type=='hf'" label="大额支付回调地址" prop="hfPayOnlineNotifyUrl">
+              <el-input  v-model="form9.hfPayOnlineNotifyUrl" label="汇付支付回调地址"></el-input>
+          </el-form-item>
+          <el-form-item v-if="form9.type=='hf'" label="汇付退款回调地址" prop="hfRefundNotifyUrl">
+              <el-input  v-model="form9.hfRefundNotifyUrl" label="汇付退款回调地址"></el-input>
+          </el-form-item>
+          <el-form-item v-if="form9.type=='hf'" label="汇付大额退款回调地址" prop="hfOnlineRefundNotifyUrl">
+              <el-input  v-model="form9.hfOnlineRefundNotifyUrl" label="汇付分账回调地址"></el-input>
+          </el-form-item>
+           <div   class="footer">
+            <el-button type="primary" @click="submitForm9">提  交</el-button>
+          </div>
+        </el-form>
+    </el-tab-pane>
+    <el-tab-pane label="布局配置" name="his.appShow" >
+        <div >
+          <el-table border :data="form10">
+            <el-table-column prop="name" label="模块名称" width="300">
+             <template slot-scope="scope"> <el-input    v-model="scope.row.name"   ></el-input></template>
+            </el-table-column>
+            <el-table-column prop="sort"label="排序号" width="300">
+              <template slot-scope="scope"><el-input-number  v-model="scope.row.sort" :min="0" :max="100"    ></el-input-number>  </template>
+            </el-table-column>
+            <el-table-column prop="isShow" label="是否展示" width="100">
+              <template slot-scope="scope">  <el-switch
+              v-model="scope.row.isShow"
+              active-color="#13ce66"
+                inactive-color="#ff4949">
+            </el-switch> </template>
+            </el-table-column>
+          </el-table>
+          <div style="float: right;" class="footer">
+            <el-button type="primary" @click="submitForm10">提  交</el-button>
+          </div>
+        </div>
+    </el-tab-pane>
+    <el-tab-pane label="积分配置" name="his.integral">
+        <el-form ref="form11" :model="form11" :rules="rules3" label-width="180px">
+          <el-row>
+            <el-col :span="12">
+              <el-form-item  label="新手任务积分" prop="integralNewTask">
+                <el-tooltip class="item" effect="dark" content="首次app内下单公域疗法,赠送多少积分" placement="top-end">
+                  <el-input-number  v-model="form11.integralNewTask"   ></el-input-number>
+                </el-tooltip>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item  label="购买消费" prop="integralRatio">
+                <el-tooltip class="item" effect="dark" content="实付多少元得1积分" placement="top-end">
+                  <el-input-number  v-model="form11.integralRatio"   ></el-input-number>
+                </el-tooltip>
+              </el-form-item>
+            </el-col>
+          </el-row>
+          <el-row>
+            <el-col :span="12">
+              <el-form-item  label="分享获得积分" prop="integralShare">
+                <el-tooltip class="item" effect="dark" content="分享获得多少积分" placement="top-end">
+                  <el-input-number  v-model="form11.integralShare"   ></el-input-number>
+                </el-tooltip>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item  label="完成随访获得积分" prop="integralFollow">
+                <el-tooltip class="item" effect="dark" content="完成随访获得多少积分" placement="top-end">
+                  <el-input-number  v-model="form11.integralFollow"   ></el-input-number>
+                </el-tooltip>
+              </el-form-item>
+            </el-col>
+          </el-row>
+
+          <el-row>
+            <el-col :span="12">
+              <el-form-item  label="观看课程获得积分" prop="integralCourse">
+                <el-tooltip class="item" effect="dark" content="每小节观看>=50%获得多少积分" placement="top-end">
+                  <el-input-number  v-model="form11.integralCourse"   ></el-input-number>
+                </el-tooltip>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item  label="浏览商品获得积分" prop="integralProduct">
+                <el-tooltip class="item" effect="dark" content="浏览商品每30秒获得多少积分" placement="top-end">
+                  <el-input-number  v-model="form11.integralProduct"   ></el-input-number>
+                </el-tooltip>
+              </el-form-item>
+            </el-col>
+          </el-row>
+          <el-row>
+            <el-col :span="12">
+              <el-form-item  label="短视频/直播 获得积分" prop="integralFirstVideo">
+                <el-tooltip class="item" effect="dark" content="首次浏览每10秒获得多少积分" placement="top-end">
+                  <el-input-number  v-model="form11.integralFirstVideo"   ></el-input-number>
+                </el-tooltip>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item  label="短视频/直播 获得积分" prop="integralFinishVideo">
+                <el-tooltip class="item" effect="dark" content="每10秒获得最低多少积分" placement="top-end">
+                  <el-input-number  v-model="form11.integralFinishVideo"   ></el-input-number>
+                </el-tooltip>
+              </el-form-item>
+            </el-col>
+          </el-row>
+          <el-form-item  label="单日可获总积分" prop="integralByOneDay">
+            <el-tooltip class="item" effect="dark" content="每天最多可获得多少积分" placement="top-end">
+              <el-input-number  v-model="form11.integralByOneDay"   ></el-input-number>
+            </el-tooltip>
+          </el-form-item>
+          <el-form-item label="单日可获总积分类型" prop="integralTypeByOneDay">
+            <el-select v-model="form11.integralTypeByOneDay" multiple placeholder="请选择类型" filterable clearable size="small">
+              <el-option
+                v-for="dict in integralLogTypeOptions"
+                :key="dict.dictValue"
+                :label="dict.dictLabel"
+                :value="dict.dictValue"
+              />
+            </el-select>
+          </el-form-item>
+
+         <div   class="footer">
+            <el-button type="primary" @click="submitForm11">提  交</el-button>
+          </div>
+        </el-form>
+    </el-tab-pane>
+    <el-tab-pane label="签到配置" name="his.sign">
+    <el-table border :data="form12">
+      <el-table-column prop="day" label="名称" width="300">
+       <template slot-scope="scope"> <el-input    v-model="scope.row.day"   ></el-input></template>
+      </el-table-column>
+      <el-table-column prop="signNum"label="获得积分" width="300">
+        <template slot-scope="scope"><el-input-number  v-model="scope.row.signNum" :min="0" :max="100"    ></el-input-number>  </template>
+      </el-table-column>
+      <el-table-column prop="sort"label="排序" width="300">
+        <template slot-scope="scope"><el-input-number  v-model="scope.row.sort" :min="0" :max="100"    ></el-input-number>  </template>
+      </el-table-column>
+    </el-table>
+    <div style="float: right;" class="footer">
+      <el-button type="primary" @click="submitForm12">提  交</el-button>
+    </div>
+    </el-tab-pane>
+    <el-tab-pane label="短信配置" name="his.sms" >
+
+        <el-form ref="form14" :model="form14"  label-width="150px">
+          <el-form-item label="短信服务商" prop="type">
+             <el-radio-group v-model="form14.type">
+              <el-radio label="rf">重庆润芳</el-radio>
+              <el-radio label="dh">重庆大汉</el-radio>
+            </el-radio-group>
+          </el-form-item>
+          <el-form-item  v-if="form14.type=='rf'" label="润芳通知账号" prop="rfAccount1">
+              <el-input   v-model="form14.rfAccount1"  label="请输入润芳通知账号"></el-input>
+          </el-form-item>
+          <el-form-item  v-if="form14.type=='rf'" label="润芳通知code" prop="rfCode1">
+              <el-input   v-model="form14.rfCode1"  label="请输入润芳通知code"></el-input>
+          </el-form-item>
+          <el-form-item  v-if="form14.type=='rf'" label="润芳通知密码" prop="rfPassword1">
+              <el-input   v-model="form14.rfPassword1"  label="请输入润芳通知密码"></el-input>
+          </el-form-item>
+          <el-form-item  v-if="form14.type=='rf'" label="润芳通知地址" prop="rfUrl1">
+              <el-input   v-model="form14.rfUrl1"  label="请输入润芳通知地址"></el-input>
+          </el-form-item>
+          <el-form-item  v-if="form14.type=='rf'" label="润芳营销账号" prop="rfAccount2">
+              <el-input   v-model="form14.rfAccount2"  label="请输入润芳营销账号"></el-input>
+          </el-form-item>
+          <el-form-item  v-if="form14.type=='rf'" label="润芳营销code" prop="rfCode2">
+              <el-input   v-model="form14.rfCode2"  label="请输入润芳营销code"></el-input>
+          </el-form-item>
+          <el-form-item  v-if="form14.type=='rf'" label="润芳通知密码" prop="rfPassword2">
+              <el-input   v-model="form14.rfPassword2"  label="请输入润芳通知密码"></el-input>
+          </el-form-item>
+          <el-form-item  v-if="form14.type=='rf'" label="润芳通知地址" prop="rfUrl2">
+              <el-input   v-model="form14.rfUrl2"  label="请输入润芳营销地址"></el-input>
+          </el-form-item>
+          <el-form-item  v-if="form14.type=='rf'" label="润芳签名" prop="rfSign">
+              <el-input   v-model="form14.rfSign"  label="请输入润芳签名"></el-input>
+          </el-form-item>
+
+          <el-form-item  v-if="form14.type=='dh'" label="大汉通知账号" prop="dhAccount1">
+              <el-input   v-model="form14.dhAccount1"  label="请输入大汉通知账号"></el-input>
+          </el-form-item>
+          <el-form-item  v-if="form14.type=='dh'" label="大汉通知密码" prop="dhPassword1">
+              <el-input   v-model="form14.dhPassword1"  label="请输入大汉通知密码"></el-input>
+          </el-form-item>
+          <el-form-item  v-if="form14.type=='dh'" label="大汉营销账号" prop="dhAccount2">
+              <el-input   v-model="form14.dhAccount2"  label="请输入大汉营销账号"></el-input>
+          </el-form-item>
+          <el-form-item  v-if="form14.type=='dh'" label="大汉通知密码" prop="dhPassword2">
+              <el-input   v-model="form14.dhPassword2"  label="请输入大汉通知密码"></el-input>
+          </el-form-item>
+          <el-form-item  v-if="form14.type=='dh'" label="大汉签名" prop="dhSign">
+              <el-input   v-model="form14.dhSign"  label="请输入大汉签名"></el-input>
+          </el-form-item>
+          <div class="footer">
+            <el-button type="primary" @click="submitForm14">提  交</el-button>
+          </div>
+        </el-form>
+    </el-tab-pane>
+
+
+
+    <el-tab-pane label="系统配置" name="his.config">
+     <el-form ref="form11" :model="form13"  label-width="160px">
+      <el-form-item   label="腾讯云sdkAppId" prop="sdkAppId">
+          <el-input   v-model="form13.sdkAppId"  label="请输入sdkAppId"></el-input>
+      </el-form-item>
+      <el-form-item   label="腾讯云sdkAppKey" prop="sdkAppKey">
+          <el-input   v-model="form13.sdkAppKey"  label="请输入sdkAppKey"></el-input>
+      </el-form-item>
+      <el-form-item   label="快递鸟Id" prop="kdnId">
+          <el-input   v-model="form13.kdnId"  label="请输入kdnId"></el-input>
+      </el-form-item>
+      <el-form-item   label="快递鸟Key" prop="kdnKeyId">
+          <el-input   v-model="form13.kdnKeyId"  label="请输入kdnKeyId"></el-input>
+      </el-form-item>
+      <el-form-item   label="快递鸟Url" prop="kdnUrl">
+          <el-input   v-model="form13.kdnUrl"  label="请输入kdnUrl"></el-input>
+      </el-form-item>
+      <el-form-item   label="快递鸟订阅url" prop="kdnSubscribeUrl">
+          <el-input   v-model="form13.kdnSubscribeUrl"  label="请输入kdnSubscribeUrl"></el-input>
+      </el-form-item>
+      <el-form-item   label="快递鸟地址url" prop="kdnAddressUrl">
+          <el-input   v-model="form13.kdnAddressUrl"  label="请输入kdnAddressUrl"></el-input>
+      </el-form-item>
+      <el-form-item   label="是否开启erp">
+          <el-switch
+            v-model="form13.erpOpen"
+            active-color="#13ce66"
+            inactive-color="#ff4949"
+            active-value=1
+            inactive-value=0>
+          </el-switch>
+      </el-form-item>
+      <el-form-item   label="erp类型" v-if="form13.erpOpen == 1">
+        <el-radio v-model="form13.erpType" label=1>管易</el-radio>
+        <el-radio v-model="form13.erpType" label=2>旺店通</el-radio>
+      </el-form-item>
+      <el-form-item   label="erpAppKey" v-if="form13.erpOpen == 1 && form13.erpType == 1 " prop="erpAppKey">
+          <el-input   v-model="form13.erpAppKey"  label="请输入erpAppKey"></el-input>
+      </el-form-item>
+      <el-form-item   label="erpSessionKey" v-if="form13.erpOpen == 1 && form13.erpType == 1 " prop="erpSessionKey">
+          <el-input   v-model="form13.erpSessionKey"  label="请输入erpSessionKey"></el-input>
+      </el-form-item>
+      <el-form-item   label="erpSecret" v-if="form13.erpOpen == 1 && form13.erpType == 1 " prop="erpSecret">
+          <el-input   v-model="form13.erpSecret"  label="请输入erpSecret"></el-input>
+      </el-form-item>
+      <el-form-item   label="erpUrl" v-if="form13.erpOpen == 1 && form13.erpType == 1 " prop="erpUrl">
+          <el-input   v-model="form13.erpUrl"  label="请输入erpUrl"></el-input>
+      </el-form-item>
+      <el-form-item   label="erpShopCode" v-if="form13.erpOpen == 1 && form13.erpType == 1 " prop="erpShopCode">
+          <el-input   v-model="form13.erpShopCode"  label="请输入erpShopCode"></el-input>
+      </el-form-item>
+
+      <el-form-item   label="erpWdAppKey" v-if="form13.erpOpen == 1 && form13.erpType == 2 " prop="erpWdAppKey">
+          <el-input   v-model="form13.erpWdAppKey"  label="请输入erpAppKey"></el-input>
+      </el-form-item>
+      <el-form-item   label="erpWdAppsecret" v-if="form13.erpOpen == 1 && form13.erpType == 2 " prop="erpWdAppsecret">
+          <el-input   v-model="form13.erpWdAppsecret"  label="erpWdAppsecret"></el-input>
+      </el-form-item>
+      <el-form-item   label="erpWdSid" v-if="form13.erpOpen == 1 && form13.erpType == 2 " prop="erpWdSid">
+          <el-input   v-model="form13.erpWdSid"  label="请输入erpWdSid"></el-input>
+      </el-form-item>
+      <el-form-item   label="erpWdShopCode" v-if="form13.erpOpen == 1 && form13.erpType == 2 " prop="erpWdShopCode">
+          <el-input   v-model="form13.erpWdShopCode"  label="请输入erpWdShopCode"></el-input>
+      </el-form-item>
+      <el-form-item   label="erpWdBaseUrl" v-if="form13.erpOpen == 1 && form13.erpType == 2 " prop="erpWdBaseUrl">
+          <el-input   v-model="form13.erpWdBaseUrl"  label="请输入erpWdBaseUrl"></el-input>
+      </el-form-item>
+      <el-form-item   label="erpWarehouseCode" v-if="form13.erpOpen == 1 && form13.erpType == 2 " prop="erpWarehouseCode">
+          <el-input   v-model="form13.erpWarehouseCode"  label="请输入erpWarehouseCode"></el-input>
+      </el-form-item>
+
+      <el-form-item   label="appid" prop="appid">
+          <el-input   v-model="form13.appid"  label="请输入appid"></el-input>
+      </el-form-item>
+      <el-form-item   label="secret" prop="secret">
+          <el-input   v-model="form13.secret"  label="请输入secret"></el-input>
+      </el-form-item>
+      <el-form-item   label="token" prop="token">
+          <el-input   v-model="form13.token"  label="请输入token"></el-input>
+      </el-form-item>
+      <el-form-item   label="aesKey" prop="aesKey">
+          <el-input   v-model="form13.aesKey"  label="请输入aesKey"></el-input>
+      </el-form-item>
+      <el-form-item   label="msgDataFormat" prop="msgDataFormat">
+          <el-input   v-model="form13.msgDataFormat"  label="请输入msgDataFormat"></el-input>
+      </el-form-item>
+      <el-form-item   label="极光appKey" prop="appKey">
+          <el-input   v-model="form13.appKey"  label="请输入appKey"></el-input>
+      </el-form-item>
+      <el-form-item   label="极光secret" prop="masterSecret">
+          <el-input   v-model="form13.masterSecret"  label="请输入masterSecret"></el-input>
+      </el-form-item>
+      <el-form-item   label="极光过期时间" prop="liveTime">
+          <el-input   v-model="form13.liveTime"  label="请输入liveTime"></el-input>
+      </el-form-item>
+      <el-form-item   label="处方上传token" prop="prescribeToken">
+          <el-input   v-model="form13.prescribeToken"  label="请输入masterSecret"></el-input>
+      </el-form-item>
+      <el-form-item   label="处方上传地址" prop="prescribeUrl">
+          <el-input   v-model="form13.prescribeUrl"  label="请输入masterSecret"></el-input>
+      </el-form-item>
+      <el-form-item   label="二维码地址" prop="codeUrl">
+          <el-input   v-model="form13.codeUrl"  label="请输入masterSecret"></el-input>
+      </el-form-item>
+       <el-form-item   label="hook地址" prop="hookUrl">
+         <el-input   v-model="form13.hookUrl"  label="请输入hook域名"></el-input>
+       </el-form-item>
+      <div   class="footer">
+         <el-button type="primary" @click="submitForm13">提  交</el-button>
+       </div>
+     </el-form>
+
+    </el-tab-pane>
+    <el-tab-pane label="企微客服配置" name="qw:config">
+      <el-form ref="form15" :model="form15" label-width="120px">
+        <el-form-item label="企业CoripID">
+          <el-input v-model="form15.corpId" style="width:400px"   ></el-input>
+        </el-form-item>
+        <el-form-item label="Secret">
+          <el-input v-model="form15.secret" style="width:400px"   ></el-input>
+        </el-form-item>
+        <el-form-item label="Token">
+          <el-input v-model="form15.token" style="width:400px"   ></el-input>
+        </el-form-item>
+        <el-form-item label="EncodingAESKey">
+          <el-input v-model="form15.encodingAESKey" style="width:400px"   ></el-input>
+        </el-form-item>
+        <el-form-item label="回调地接">
+          <el-input disabled v-model="form15.notifyUrl" style="width:600px"   ></el-input>
+        </el-form-item>
+        <div class="line"></div>
+        <div style="float:right;margin-right:20px">
+          <el-button type="primary" @click="submitForm15">提交</el-button>
+        </div>
+      </el-form>
+    </el-tab-pane>
+    <el-tab-pane label="商城配置小程序" name="store.config" >
+      <el-form ref="form17" :model="form17"  label-width="150px">
+
+
+        <el-form-item   label="erpOpen" prop="erpOpen">
+            <el-input   v-model="form17.erpOpen"  label="请输入erpOpen"></el-input>
+        </el-form-item>
+        <el-form-item   label="erpAppKey" prop="erpAppKey">
+            <el-input   v-model="form17.erpAppKey"  label="请输入erpAppKey"></el-input>
+        </el-form-item>
+        <el-form-item   label="erpSessionKey" prop="erpSessionKey">
+            <el-input   v-model="form17.erpSessionKey"  label="请输入erpSessionKey"></el-input>
+        </el-form-item>
+        <el-form-item   label="erpSecret" prop="erpSecret">
+            <el-input   v-model="form17.erpSecret"  label="请输入erpSecret"></el-input>
+        </el-form-item>
+        <el-form-item   label="erpUrl" prop="erpUrl">
+            <el-input   v-model="form17.erpUrl"  label="请输入erpUrl"></el-input>
+        </el-form-item>
+        <el-form-item   label="erpShopCode" prop="erpShopCode">
+            <el-input   v-model="form17.erpShopCode"  label="请输入erpShopCode"></el-input>
+        </el-form-item>
+        <el-form-item   label="appid" prop="appid">
+            <el-input   v-model="form17.appid"  label="请输入appid"></el-input>
+        </el-form-item>
+        <el-form-item   label="secret" prop="secret">
+            <el-input   v-model="form17.secret"  label="请输入secret"></el-input>
+        </el-form-item>
+        <el-form-item   label="token" prop="token">
+            <el-input   v-model="form17.token"  label="请输入token"></el-input>
+        </el-form-item>
+        <el-form-item   label="aesKey" prop="aesKey">
+            <el-input   v-model="form17.aesKey"  label="请输入aesKey"></el-input>
+        </el-form-item>
+
+        <el-form-item   label="msgDataFormat" prop="msgDataFormat">
+            <el-input   v-model="form17.msgDataFormat"  label="请输入msgDataFormat"></el-input>
+        </el-form-item>
+
+        <el-form-item   label="汇付产品号" prop="hfProductId">
+            <el-input   v-model="form17.hfProductId"  label="汇付产品号"></el-input>
+        </el-form-item>
+         <el-form-item v label="系统号" prop="hfSysId">
+            <el-input  v-model="form17.hfSysId" label="系统号Key"></el-input>
+        </el-form-item>
+        <el-form-item  label="商户号" prop="huifuId">
+            <el-input  v-model="form17.huifuId" label="商户号"></el-input>
+        </el-form-item>
+        <el-form-item  label="服务商私钥" prop="hfRsaPrivateKey">
+            <el-input  v-model="form17.hfRsaPrivateKey" label="服务商私钥"></el-input>
+        </el-form-item>
+        <el-form-item  label="汇付公钥" prop="hfRsaPublicKey">
+            <el-input  v-model="form17.hfRsaPublicKey" label="汇付公钥"></el-input>
+        </el-form-item>
+        <el-form-item  label="汇付支付回调地址" prop="hfPayNotifyUrl">
+            <el-input  v-model="form17.hfPayNotifyUrl" label="汇付支付回调地址"></el-input>
+        </el-form-item>
+        <el-form-item  label="大额支付回调地址" prop="hfPayOnlineNotifyUrl">
+            <el-input  v-model="form17.hfPayOnlineNotifyUrl" label="汇付支付回调地址"></el-input>
+        </el-form-item>
+        <el-form-item  label="汇付退款回调地址" prop="hfRefundNotifyUrl">
+            <el-input  v-model="form17.hfRefundNotifyUrl" label="汇付退款回调地址"></el-input>
+        </el-form-item>
+        <el-form-item  label="汇付大额退款回调地址" prop="hfOnlineRefundNotifyUrl">
+            <el-input  v-model="form17.hfOnlineRefundNotifyUrl" label="汇付大额退款回调地址"></el-input>
+        </el-form-item>
+
+        <div class="footer">
+          <el-button type="primary" @click="submitForm17">提  交</el-button>
+        </div>
+      </el-form>
+    </el-tab-pane>
+       <el-tab-pane label="点播配置" name="course.config">
+         <el-form ref="form18" :model="form18" label-width="120px">
+           <el-form-item label="完课模式">
+             <el-radio-group v-model="form18.completionMode">
+               <el-radio label="1">百分比</el-radio>
+               <el-radio label="2">分钟数</el-radio>
+             </el-radio-group>
+           </el-form-item>
+           <el-form-item label="完课进度(分)" v-if="form18.completionMode == 2">
+             <el-tooltip class="item" effect="dark" content="看多少分钟算完课" placement="top-end">
+               <el-input-number  v-model="form18.minutesNum" :min="1"></el-input-number>
+             </el-tooltip>
+           </el-form-item>
+           <el-form-item label="完课进度(%)" v-if="form18.completionMode == 1">
+             <el-tooltip class="item" effect="dark" content="看多少百分比算完课" placement="top-end">
+               <el-input-number  v-model="form18.answerRate" :min="1" :max="100"    ></el-input-number>
+             </el-tooltip>
+           </el-form-item>
+           <el-form-item label="短链有效期(天)">
+             <el-tooltip class="item" effect="dark" content="短链有效期(天)" placement="top-end">
+               <el-input-number  v-model="form18.videoLinkExpireDate" :min="1"    ></el-input-number>
+             </el-tooltip>
+           </el-form-item>
+           <el-form-item label="答题允许错误次数(次)">
+             <el-tooltip class="item" effect="dark" content="课程答题允许错误次数(次)" placement="top-end">
+               <el-input-number  v-model="form18.answerErrorCount" :min="1"     ></el-input-number>
+             </el-tooltip>
+           </el-form-item>
+           <el-form-item label="每十分钟获取积分">
+             <el-tooltip class="item" effect="dark" content="每十分钟获取多少积分" placement="top-end">
+               <el-input-number  v-model="form18.videoIntegral" :min="1"    ></el-input-number>
+             </el-tooltip>
+           </el-form-item>
+           <el-form-item label="答题获得积分">
+             <el-tooltip class="item" effect="dark" content="答题获得积分" placement="top-end">
+               <el-input-number  v-model="form18.answerIntegral" :min="1"    ></el-input-number>
+             </el-tooltip>
+           </el-form-item>
+           <el-form-item label="看课默认线路" prop="defaultLine">
+             <el-radio-group v-model="form18.defaultLine">
+               <el-radio label="0">线路一</el-radio>
+               <el-radio label="1">线路二</el-radio>
+             </el-radio-group>
+           </el-form-item>
+           <el-form-item label="通用看课域名">
+             <el-tooltip class="item" effect="dark" content="真链域名" placement="top-end">
+               <el-input  v-model="form18.realLinkDomainName"     ></el-input>
+             </el-tooltip>
+           </el-form-item>
+           <el-form-item label="网页授权域名">
+             <el-tooltip class="item" effect="dark" content="公众号网页授权域名" placement="top-end">
+               <el-input  v-model="form18.authDomainName"  ></el-input>
+             </el-tooltip>
+           </el-form-item>
+           <el-form-item label="公众号appId">
+             <el-tooltip class="item" effect="dark" content="授权公众号appId" placement="top-end">
+               <el-input  v-model="form18.mpAppId"  ></el-input>
+             </el-tooltip>
+           </el-form-item>
+
+           <el-form-item label="小程序appid">
+             <el-tooltip class="item" effect="dark" content="小程序appid" placement="top-end">
+               <el-input  v-model="form18.miniprogramAppid"  ></el-input>
+             </el-tooltip>
+           </el-form-item>
+           <el-form-item label="小程序page路径">
+             <el-tooltip class="item" effect="dark" content="小程序消息打开后的路径" placement="top-end">
+               <el-input  v-model="form18.miniprogramPage"  ></el-input>
+             </el-tooltip>
+           </el-form-item>
+
+           <el-form-item label="奖励类型">
+             <el-radio-group v-model="form18.rewardType">
+               <el-radio label="1">红包</el-radio>
+               <el-radio label="2">积分</el-radio>
+             </el-radio-group>
+           </el-form-item>
+
+           <el-form-item label="红包金额" v-if="form18.rewardType == 1">
+             <el-tooltip class="item" effect="dark" content="课程默认红包金额" placement="top-end">
+               <el-input-number  v-model="form18.redPackageMoney" :min="0.01" ></el-input-number>
+             </el-tooltip>
+           </el-form-item>
+
+
+           <el-form-item label="禁止发送时间段">
+             <el-row v-for="(item, index) in form18.disabledTimeList" style="margin-top: 10px">
+               <el-time-picker
+                 class="custom-input"
+                 v-model="item.startDisabledTime"
+                 value-format="HH:mm"
+                 format="HH:mm"
+                 placeholder="开始时间"
+                 style="width: 130px;height: 20px;">
+               </el-time-picker>
+               <el-time-picker
+                 class="custom-input"
+                 v-model="item.endDisabledTime"
+                 value-format="HH:mm"
+                 format="HH:mm"
+                 placeholder="结束时间"
+                 style="width: 130px;height: 20px;margin-left: 10px">
+               </el-time-picker>
+               <el-button type="danger" icon="el-icon-delete" circle style="margin-left: 20px" @click="removeDisabledTime(index)"></el-button>
+             </el-row>
+             <el-button @click="addDisabledTime" style="margin-top: 10px">添加时间段</el-button>
+           </el-form-item>
+
+           <el-form-item label="红包模式" v-if="form18.rewardType==1">
+             <el-radio-group v-model="form18.redPacketMode">
+               <el-radio label="1">总公司</el-radio>
+               <el-radio label="2">分公司</el-radio>
+             </el-radio-group>
+           </el-form-item>
+
+           <el-form-item label="默认客服二维码图片" prop="companyUserQRCode">
+             <ImageUpload v-model="form18.companyUserQRCode" type="image" :num="10" :width="150" :height="150" :limit="1"/>
+           </el-form-item>
+           <el-form-item label="课程LOGO" prop="courseLogo">
+             <image-upload v-model="form18.courseLogo" :limit="1" />
+           </el-form-item>
+
+           <el-form-item label="开启评论/弹幕" prop="openCommentStatus">
+             <el-radio-group v-model="form18.openCommentStatus">
+               <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="sendDelayTime"
+          :rules="rulesDelay"
+              >
+  <el-tooltip class="item" effect="dark" content="请输入延时时间,范围在1000毫秒-2000毫秒之间" placement="top-end">
+    <el-input
+      v-model.number="form18.sendDelayTime"
+      type="number"
+      :min="1000"
+      :max="2000"
+      placeholder="请输入1000-2000之间的数值">
+      <template slot="append">毫秒</template>
+    </el-input>
+  </el-tooltip>
+</el-form-item>
+           <el-form-item label="可查看评论条数" v-if="false">
+             <el-tooltip class="item" effect="dark" content="在评论区可以查看的历史评论条数,默认200" placement="top-end">
+               <el-input-number  v-model="form18.viewCommentNum" :min="1"></el-input-number>
+             </el-tooltip>
+           </el-form-item>
+
+           <div class="line"></div>
+           <div style="float:right;margin-right:20px">
+             <el-button type="primary" @click="submitForm18">提交</el-button>
+           </div>
+         </el-form>
+       </el-tab-pane>
+       <el-tab-pane label="点播播放源配置" name="courseMa.config">
+         <el-button type="primary" @click="addCourseMaConfig" style="margin-bottom: 10px">添加配置</el-button>
+         <el-table  height="660" border v-loading="courseMaConfigLoading" :data="courseMaConfigList">
+           <el-table-column label="名称" align="center" prop="name">
+             <template slot-scope="scope">
+               <el-input v-model="scope.row.name" placeholder="请输入名称" :disabled="!scope.row.editing" />
+             </template>
+           </el-table-column>
+           <el-table-column label="类型" align="center" prop="type">
+             <template slot-scope="scope">
+               <el-select
+                 v-model="scope.row.type"
+                  placeholder="请选择类型"
+                 :disabled="!scope.row.editing">
+                 <el-option label="公众号" value="1"></el-option>
+                 <el-option label="小程序" value="2"></el-option>
+               </el-select>
+             </template>
+           </el-table-column>
+           <el-table-column label="AppId" align="center" prop="appid">
+             <template slot-scope="scope">
+               <el-input v-model="scope.row.appid" placeholder="请输入AppId" :disabled="!scope.row.editing" />
+             </template>
+           </el-table-column>
+           <el-table-column label="Secret" align="center" prop="secret">
+             <template slot-scope="scope">
+               <el-input v-model="scope.row.secret" placeholder="请输入Secret" :disabled="!scope.row.editing" />
+             </template>
+           </el-table-column>
+           <el-table-column label="token" align="center" prop="token">
+             <template slot-scope="scope">
+               <el-input v-model="scope.row.token" placeholder="请输入token" :disabled="!scope.row.editing" />
+             </template>
+           </el-table-column>
+           <el-table-column label="aesKey" align="center" prop="aesKey">
+             <template slot-scope="scope">
+               <el-input v-model="scope.row.aesKey" placeholder="请输入aesKey" :disabled="!scope.row.editing" />
+             </template>
+           </el-table-column>
+           <el-table-column label="msgDataFormat" align="center" prop="msgDataFormat">
+             <template slot-scope="scope">
+               <el-input v-model="scope.row.msgDataFormat" placeholder="请输入消息格式" :disabled="!scope.row.editing" />
+             </template>
+           </el-table-column>
+           <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+             <template slot-scope="scope">
+               <el-button
+                 v-if="!scope.row.editing"
+                 size="mini"
+                 type="text"
+                 icon="el-icon-edit"
+                 @click="handleEdit(scope.$index, scope.row)"
+               >编辑</el-button>
+               <el-button
+                 v-if="scope.row.editing"
+                 size="mini"
+                 type="text"
+                 icon="el-icon-check"
+                 @click="handleSave(scope.$index, scope.row)"
+               >保存</el-button>
+               <el-button
+                 size="mini"
+                 type="text"
+                 icon="el-icon-delete"
+                 @click="deleteCourseMaConfig(scope.$index)"
+               >删除</el-button>
+             </template>
+           </el-table-column>
+         </el-table>
+         <div class="footer">
+
+           <el-button type="primary" @click="submitCourseMaConfig">提 交</el-button>
+         </div>
+       </el-tab-pane>
+       <el-tab-pane label="红包商户配置" name="redPacket.config" >
+         <el-form ref="form19" :model="form19"  label-width="150px">
+           <el-form-item   label="红包接口类型" prop="isNew">
+             <el-radio-group v-model="form19.isNew">
+               <el-radio label="0">商家转账到零钱(旧)</el-radio>
+               <el-radio label="1">商家转账(新)</el-radio>
+             </el-radio-group>
+           </el-form-item>
+           <el-form-item   label="公众号appid" prop="appId">
+             <el-input   v-model="form19.appId"  label="请输入appId"></el-input>
+           </el-form-item>
+           <el-form-item   label="小程序appid" prop="appId">
+             <el-input   v-model="form19.miniappId"  label="请输入appId"></el-input>
+           </el-form-item>
+           <el-form-item   label="商户号" prop="mchId">
+             <el-input   v-model="form19.mchId"  label="请输入mchId"></el-input>
+           </el-form-item>
+           <el-form-item   label="商户密钥" prop="mchKey">
+             <el-input   v-model="form19.mchKey"  label="mchKey"></el-input>
+           </el-form-item>
+           <el-form-item   label="p12证书路径" prop="keyPath">
+             <el-input   v-model="form19.keyPath"  label="请输入keyPath"></el-input>
+           </el-form-item>
+           <el-form-item   label="apiV3密钥" prop="apiV3Key">
+             <el-input   v-model="form19.apiV3Key"  label="请输入apiV3Key"></el-input>
+           </el-form-item>
+           <el-form-item   label="公钥ID" prop="publicKeyId" v-if="form19.isNew==1">
+             <el-input   v-model="form19.publicKeyId"  label="请输入公钥ID"></el-input>
+           </el-form-item>
+           <el-form-item   label="公钥证书" prop="publicKeyPath" v-if="form19.isNew==1">
+             <el-input   v-model="form19.publicKeyPath"  label="请输入publicKeyPath"></el-input>
+           </el-form-item>
+           <el-form-item   label="key路径" prop="privateKeyPath">
+             <el-input   v-model="form19.privateKeyPath"  label="请输入"></el-input>
+           </el-form-item>
+           <el-form-item   label="cert路径" prop="privateCertPath">
+             <el-input   v-model="form19.privateCertPath"  label="请输入"></el-input>
+           </el-form-item>
+           <el-form-item   label="回调地址" prop="notifyUrl">
+             <el-input   v-model="form19.notifyUrl"  label="请输入"></el-input>
+           </el-form-item>
+
+           <div class="footer">
+             <el-button type="primary" @click="submitForm19">提  交</el-button>
+           </div>
+         </el-form>
+       </el-tab-pane>
+       <el-tab-pane label="企微Sop客户评级配置" name="qwRating:config">
+         <el-form ref="form20" :model="form20" :rules="rules20" label-width="120px">
+           <el-form-item label="评级天数(天)" prop="levelDay">
+             <el-tooltip class="item" effect="dark" content="最小评级天数(天)" placement="top-end">
+               <el-input-number v-model="form20.levelDay" :min="7" :max="365"></el-input-number>
+             </el-tooltip>
+           </el-form-item>
+
+           <!-- A级范围 -->
+           <el-form-item label="A级范围(%)" prop="aLevelMin">
+             <el-tooltip class="item" effect="dark" content="A级客户范围最小值(%)" placement="top-end">
+               <el-input-number
+                 v-model="form20.aLevelMin"
+                 :min="0"
+                 :max="100"
+               ></el-input-number>
+             </el-tooltip>
+             <span style="margin: 0 10px;">-</span>
+             <span>100</span> <!-- aLevelMax 固定为 100 -->
+           </el-form-item>
+
+           <!-- B级范围 -->
+           <el-form-item label="B级范围(%)" prop="bLevelMin">
+             <el-tooltip class="item" effect="dark" content="B级客户范围最小值(%)" placement="top-end">
+               <el-input-number
+                 v-model="form20.bLevelMin"
+                 :min="0"
+                 :max="100"
+               ></el-input-number>
+             </el-tooltip>
+             <span style="margin: 0 10px;">-</span>
+             <el-tooltip class="item" effect="dark" content="B级客户范围最大值(%)" placement="top-end">
+               <el-input-number
+                 v-model="form20.bLevelMax"
+                 :min="0"
+                 :max="100"
+               ></el-input-number>
+             </el-tooltip>
+           </el-form-item>
+
+           <!-- C级范围 -->
+           <el-form-item label="C级范围(%)" prop="cLevelMin">
+             <el-tooltip class="item" effect="dark" content="C级客户范围最小值(%)" placement="top-end">
+               <el-input-number
+                 v-model="form20.cLevelMin"
+                 :min="0"
+                 :max="100"
+               ></el-input-number>
+             </el-tooltip>
+             <span style="margin: 0 10px;">-</span>
+             <el-tooltip class="item" effect="dark" content="C级客户范围最大值(%)" placement="top-end">
+               <el-input-number
+                 v-model="form20.cLevelMax"
+                 :min="0"
+                 :max="100"
+               ></el-input-number>
+             </el-tooltip>
+           </el-form-item>
+
+           <!-- D级范围 -->
+           <el-form-item label="D级范围(%)" prop="dLevelMin">
+             <span>0</span> <!-- dLevelMin 固定为 0 -->
+             <span style="margin: 0 10px;">-</span>
+             <el-tooltip class="item" effect="dark" content="D级客户范围最大值(%)" placement="top-end">
+               <el-input-number
+                 v-model="form20.dLevelMax"
+                 :min="0"
+                 :max="100"
+               ></el-input-number>
+             </el-tooltip>
+           </el-form-item>
+
+           <div class="line"></div>
+           <div style="float: right; margin-right: 20px">
+             <el-button type="primary" @click="submitForm20">提交</el-button>
+           </div>
+         </el-form>
+       </el-tab-pane>
+       <el-tab-pane label="企业理念" name="store.concept">
+         <el-form ref="form21" :model="form21" :rules="rules21" label-width="160px">
+           <el-form-item   label="企业理念图片" prop="images">
+             <Material v-model="images" type="image" :num="10" :width="150" :height="150" />
+           </el-form-item>
+           <el-form-item label="企业理念视频" prop="videoUrl">
+             <div>
+               <el-upload
+                 ref="upload"
+                 class="upload-demo"
+                 :action="uploadUrl"
+                 :on-success="handleSuccess"
+                 :before-upload="beforeUpload"
+                 :limit="1"
+                 :accept="videoAccept"
+               >
+                 <el-button size="small" type="primary">点击上传视频</el-button>
+               </el-upload>
+               <video :src="form21.videoUrl" controls style="max-width: 400px; max-height: 400px;"></video>
+             </div>
+           </el-form-item>
+           <div  class="footer">
+             <el-button type="primary" @click="submitForm21">提  交</el-button>
+           </div>
+         </el-form>
+       </el-tab-pane>
+    </el-tabs>
+
+
+
+
+    <el-dialog :title="product.title" v-if="product.open"  :visible.sync="product.open" width="1000px" append-to-body>
+        <product-attr-value-select  ref="Details"  @selectProduct="selectProduct" />
+    </el-dialog>
+    <el-dialog :title="deliveryGift.title" v-if="deliveryGift.open"  :visible.sync="deliveryGift.open" width="1000px" append-to-body>
+        <productDeliveryGiftValueSelect  ref="DeliveryGiftDetails"  @selectDeliveryGift="selectDeliveryGift" />
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {   getConfigByKey,updateConfigByKey, clearCache } from "@/api/system/config";
+import {listStore} from "@/api/his/storeProduct";
+import { js } from "js-beautify";
+import Material from '@/components/Material'
+import { allList} from "@/api/his/coupon";
+import {getAllFollowTempName } from "@/api/his/followTemp";
+import productAttrValueSelect from "../../components/his/productGiftValueSelect.vue";
+import productDeliveryGiftValueSelect from "../../components/his/productDeliveryGiftValueSelect.vue";
+import { Col } from "element-ui";
+import Editor from '@/components/Editor/wang';
+export default {
+  name: "Config",
+  components: {
+    Material,productAttrValueSelect,productDeliveryGiftValueSelect,Editor
+  },
+  data() {
+    return {
+      images:[],
+      uploadUrl:process.env.VUE_APP_BASE_API+"/common/uploadOSS",
+      videoAccept:"video/*",
+      courseMaConfigLoading:false,
+      courseMaConfigList:[],
+      deliveryGift:{
+        open:false,
+        title:"商品选择"
+      },
+      product:{
+        open:false,
+        title:"商品选择"
+      },
+      tempOptions:[],
+      integralLogTypeOptions:[],
+      activeName:"sys.oss.cloudStorage",
+      configId:null,
+      storeOPtions:[],
+      // 表单参数
+      form1: {
+      },
+      form2:{
+      },
+      form3:{
+      },
+      form4:{
+      },
+      form5:[],
+      form6:{
+      },
+      form7:{
+      },
+      form8:{
+      },
+      form9:{
+      },
+      form10:[],
+      form11:{
+      },
+      form12:[],
+      form13:{
+      },
+      form14:{
+      },
+      form15:{
+      },
+      form16:{
+      },
+      form17:{
+      },
+      form18:{
+        viewCommentNum: 200
+      },
+      form19:{
+      },
+      form20:{
+        levelDay: 7,
+        aLevelMin: 80,
+        aLevelMax: 100,
+        bLevelMin: 40,
+        bLevelMax: 80,
+        cLevelMin: 10,
+        cLevelMax: 40,
+        dLevelMin: 0,
+        dLevelMax: 10,
+      },
+      form21: {
+
+      },
+      photoArr:[],
+      couponList:[],
+      inquirySubTypeOptions:[],
+      // 表单校验
+      rules1: {
+      },
+      rules3: {
+      },
+      rulesDelay:[
+                {
+                  validator: (rule, value, callback) => {
+                    if (value === '' || value == null) {
+                      callback(); // 允许为空,不校验范围
+                    } else if (isNaN(value)) {
+                      callback(new Error('请输入有效数字'));
+                    } else if (value < 1000 || value > 2000) {
+                      callback(new Error('延时时间必须在1000-2000毫秒之间'));
+                    } else {
+                      callback();
+                    }
+                  },
+                  trigger: 'blur'
+                }
+              ],
+      rules20:{
+        levelDay: [{ required: true, message: '请输入评级天数', trigger: 'blur' }],
+        aLevelMin: [{ required: true, message: '请输入A级最小值', trigger: 'blur' }],
+        bLevelMin: [{ required: true, message: '请输入B级最小值', trigger: 'blur' }],
+        bLevelMax: [{ required: true, message: '请输入B级最大值', trigger: 'blur' }],
+        cLevelMin: [{ required: true, message: '请输入C级最小值', trigger: 'blur' }],
+        cLevelMax: [{ required: true, message: '请输入C级最大值', trigger: 'blur' }],
+        dLevelMax: [{ required: true, message: '请输入D级最大值', trigger: 'blur' }],
+      },
+      rules21:{}
+    };
+  },
+  created() {
+
+    this.getConfigByKey(this.activeName);
+    listStore().then(response => {
+      this.storeOPtions = response.rows;
+    });
+    this.getDicts("sys_inquiry_sub_type").then(response => {
+      this.inquirySubTypeOptions = response.data;
+    });
+    this.getDicts("sys_integral_log_type").then(response => {
+      this.integralLogTypeOptions = response.data;
+    });
+  },
+  watch: {
+    photoArr: function(val) {
+      this.form4.certs = val.join(',')
+    },
+    images: function(val) {
+     this.form21.images = val.join(',')
+   }
+  },
+  methods: {
+    handleSuccess(response, file) {
+      // 上传成功后的回调函数
+      this.myloading.close();
+      this.form21.videoUrl = response.url;
+      this.$refs.upload.clearFiles();
+    },
+    beforeUpload(file) {
+      // 上传前的钩子函数,可以在这里对文件进行处理
+      // 返回 false 则取消上传
+
+      // 例如限制文件大小
+      const isLt2M = file.size / 1024 / 1024 < 200;
+      if (!isLt2M) {
+        this.$message.error('上传视频文件大小不能超过 200MB!');
+        return false;
+      }
+      this.myloading = this.$loading({
+        lock: true,
+        text: '上传中',
+        spinner: 'el-icon-loading',
+        background: 'rgba(0, 0, 0, 0.7)'
+      });
+
+    },
+    submitCourseMaConfig() {
+      // 验证所有必填字段
+      const isValid = this.courseMaConfigList.every(item => {
+        return item.name && item.appid && item.secret;
+      });
+
+      if (!isValid) {
+        this.$message.error('请填写所有必填字段');
+        return;
+      }
+
+      var param = {configId: this.configId, configValue: JSON.stringify(this.courseMaConfigList)};
+      updateConfigByKey(param).then(response => {
+        if (response.code === 200) {
+          this.msgSuccess("修改成功");
+        }
+      });
+    },
+      deleteInquirySubType(index,row){
+        this.form2.inquirySubType.splice(index, 1);
+      },
+      handleClick(tab, event){
+        this.getConfigByKey(tab.name);
+
+      },
+      handleAddProduct(){
+          setTimeout(() => {
+               this.$refs.Details.getDetails();
+          }, 1);
+          this.product.open=true;
+
+      },
+      addInquirySubType(){
+
+        this.form2.inquirySubType.push({lable:"名称",value:null})
+      },
+      handleDeliveryGift(){
+          setTimeout(() => {
+               this.$refs.DeliveryGiftDetails.getDetails();
+          }, 1);
+          this.deliveryGift.open=true;
+      },
+
+      selectProduct(row){
+
+        this.form8.gift=[row];
+        this.product.open=false;
+        this.$message({
+                  message: '添加成功',
+                  type: 'success'
+                });
+      },
+
+      selectDeliveryGift(row){
+
+        this.form8.deliveryGift=[row];
+        this.deliveryGift.open=false;
+        this.$message({
+                  message: '添加成功',
+                  type: 'success'
+                });
+      },
+      close(){
+        this.product.open=false;
+      },
+      getConfigByKey(key){
+        getConfigByKey(key).then(response => {
+          this.configId=response.data.configId;
+          this.configKey=response.data.configKey;
+          if(key=="sys.oss.cloudStorage"){
+            this.form1 =JSON.parse(response.data.configValue);
+          }
+          if(key=="his.inquiryConfig"){
+            this.form2 =JSON.parse(response.data.configValue);
+          }
+          if(key=="his.agreementConfig"){
+             this.form3 =JSON.parse(response.data.configValue);
+          }
+          if(key=="his.certs"){
+              this.form4 =JSON.parse(response.data.configValue);
+              if(this.form4.certs!=null){
+                  this.photoArr=this.form4.certs.split(",");
+              }
+          }
+          if(key=="his.brokerage"){
+              this.form5 =JSON.parse(response.data.configValue);
+          }
+          if(key=="his.coupon"){
+                allList().then(response => {
+                  this.couponList = response.data;
+                });
+              this.form6 =JSON.parse(response.data.configValue);
+
+          }
+          if(key=="his.store"){
+              this.form7 =JSON.parse(response.data.configValue);
+              getAllFollowTempName().then(response => {
+                this.tempOptions = response.rows;
+              });
+          }
+          if(key=="his.store"){
+              this.form7 =JSON.parse(response.data.configValue);
+          }
+          if(key=="his.package"){
+              this.form8 =JSON.parse(response.data.configValue);
+          }
+          if(key=="his.pay"){
+              this.form9 =JSON.parse(response.data.configValue);
+          }
+          if(key=="his.appShow"){
+              this.form10 =JSON.parse(response.data.configValue);
+          }
+          if(key=="his.integral"){
+              this.form11 =JSON.parse(response.data.configValue);
+          }
+          if(key=="his.sign"){
+              this.form12 =JSON.parse(response.data.configValue);
+          }
+          if(key=="his.config"){
+              this.form13 =JSON.parse(response.data.configValue);
+          }
+          if(key=="store.config"){
+             this.form17 =JSON.parse(response.data.configValue);
+          }
+          if(key=="his.sms"){
+              this.form14 =JSON.parse(response.data.configValue);
+          }
+          if(key=="qw:config"){
+              this.form15 =JSON.parse(response.data.configValue);
+          }
+          if(key=="his.brand"){
+            this.form16 =JSON.parse(response.data.configValue);
+            console.log(this.form16)
+          }
+          if(key=="course.config"){
+              this.form18 =JSON.parse(response.data.configValue);
+          }
+          if(key=="redPacket.config"){
+            this.form19 =JSON.parse(response.data.configValue);
+          }
+          if(key=="qwRating.config"){
+            this.form20 =JSON.parse(response.data.configValue);
+          }
+          if(key=="courseMa.config"){
+            this.courseMaConfigLoading = true;
+            if(response.data && response.data.configValue) {
+              this.courseMaConfigList = JSON.parse(response.data.configValue).map(item => ({
+                ...item,
+                editing: false
+              }));
+            } else {
+              this.courseMaConfigList = [];
+            }
+            this.courseMaConfigLoading = false;
+          }
+          else if(key=="store.concept"){
+            this.configId=response.data.configId;
+            this.configKey=response.data.configKey;
+            this.form21 =JSON.parse(response.data.configValue);
+            if(this.form21.images!=null){
+              this.images=this.form21.images.split(",");
+            }
+          }
+        });
+     },
+    /** 提交按钮 */
+    submitForm1: function() {
+      this.$refs["form1"].validate(valid => {
+        if (valid) {
+          var param={configId:this.configId,configValue:JSON.stringify(this.form1)}
+           updateConfigByKey(param).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("修改成功");
+              }
+            });
+        }
+      });
+    },
+    submitForm3(){
+      this.$refs["form3"].validate(valid => {
+        if (valid) {
+           var param={configId:this.configId,configValue:JSON.stringify(this.form3)}
+          updateConfigByKey(param).then(response => {
+             if (response.code === 200) {
+               this.msgSuccess("修改成功");
+             }
+           });
+           }
+           });
+        },
+  submitForm4(){
+    var param={configId:this.configId,configValue:JSON.stringify(this.form4)}
+    updateConfigByKey(param).then(response => {
+       if (response.code === 200) {
+         this.msgSuccess("修改成功");
+       }
+     });
+  },
+  submitForm5(){
+    var param={configId:this.configId,configValue:JSON.stringify(this.form5)}
+    updateConfigByKey(param).then(response => {
+       if (response.code === 200) {
+         this.msgSuccess("修改成功");
+       }
+     });
+  },
+  submitForm6(){
+    var param={configId:this.configId,configValue:JSON.stringify(this.form6)}
+    updateConfigByKey(param).then(response => {
+       if (response.code === 200) {
+         this.msgSuccess("修改成功");
+       }
+     });
+  },
+  submitForm7(){
+    var param={configId:this.configId,configValue:JSON.stringify(this.form7)}
+    updateConfigByKey(param).then(response => {
+       if (response.code === 200) {
+         this.msgSuccess("修改成功");
+       }
+     });
+  },
+  submitForm8(){
+    var param={configId:this.configId,configValue:JSON.stringify(this.form8)}
+    updateConfigByKey(param).then(response => {
+       if (response.code === 200) {
+         this.msgSuccess("修改成功");
+       }
+     });
+  },
+  submitForm9(){
+    var param={configId:this.configId,configValue:JSON.stringify(this.form9)}
+    updateConfigByKey(param).then(response => {
+       if (response.code === 200) {
+         this.msgSuccess("修改成功");
+       }
+     });
+  },
+  submitForm10(){
+    var param={configId:this.configId,configValue:JSON.stringify(this.form10)}
+    updateConfigByKey(param).then(response => {
+       if (response.code === 200) {
+         this.msgSuccess("修改成功");
+       }
+     });
+  },
+  submitForm11(){
+    var param={configId:this.configId,configValue:JSON.stringify(this.form11)}
+    updateConfigByKey(param).then(response => {
+       if (response.code === 200) {
+         this.msgSuccess("修改成功");
+       }
+     });
+  },
+  submitForm12(){
+    var param={configId:this.configId,configValue:JSON.stringify(this.form12)}
+    updateConfigByKey(param).then(response => {
+       if (response.code === 200) {
+         this.msgSuccess("修改成功");
+       }
+     });
+  },
+  submitForm13(){
+    var param={configId:this.configId,configValue:JSON.stringify(this.form13)}
+    updateConfigByKey(param).then(response => {
+       if (response.code === 200) {
+         this.msgSuccess("修改成功");
+       }
+     });
+  },
+  submitForm14(){
+    var param={configId:this.configId,configValue:JSON.stringify(this.form14)}
+    updateConfigByKey(param).then(response => {
+       if (response.code === 200) {
+         this.msgSuccess("修改成功");
+       }
+     });
+  },
+  submitForm15(){
+    var param={configId:this.configId,configValue:JSON.stringify(this.form15)}
+    updateConfigByKey(param).then(response => {
+       if (response.code === 200) {
+         this.msgSuccess("修改成功");
+       }
+     });
+  },
+    submitForm16(){
+      var param={configId:this.configId,configValue:JSON.stringify(this.form16)}
+      updateConfigByKey(param).then(response => {
+        if (response.code === 200) {
+          this.msgSuccess("修改成功");
+        }
+      });
+    },
+    submitForm17(){
+      var param={configId:this.configId,configValue:JSON.stringify(this.form17)}
+      updateConfigByKey(param).then(response => {
+        if (response.code === 200) {
+          this.msgSuccess("修改成功");
+        }
+      });
+    },
+    submitForm18(){
+      var param={configId:this.configId,configValue:JSON.stringify(this.form18)}
+      updateConfigByKey(param).then(response => {
+        if (response.code === 200) {
+          this.msgSuccess("修改成功");
+        }
+      });
+    },
+    submitForm19(){
+      var param={configId:this.configId,configValue:JSON.stringify(this.form19)}
+      updateConfigByKey(param).then(response => {
+        if (response.code === 200) {
+          this.msgSuccess("修改成功");
+        }
+      });
+    },
+    submitForm20(){
+
+      this.$refs['form20'].validate((valid) => {
+        if (valid) {
+          const { aLevelMin, aLevelMax, bLevelMin, bLevelMax, cLevelMin, cLevelMax, dLevelMin, dLevelMax } = this.form20;
+
+          // 检查范围是否连续且总长度为100%
+          const totalLength = (100 - aLevelMin) + (bLevelMax - bLevelMin) + (cLevelMax - cLevelMin) + (dLevelMax);
+          console.log("totalLength",totalLength)
+          if (totalLength!==100) {
+            this.$message.error('所有等级范围必须连续且总长度为100%');
+            return;
+          }
+
+          var param={configId:this.configId,configValue:JSON.stringify(this.form20)}
+          updateConfigByKey(param).then(response => {
+            if (response.code === 200) {
+              this.msgSuccess("修改成功");
+            }
+          });
+
+        } else {
+          this.$message.error('请检查输入');
+          return false;
+        }
+      });
+
+    },
+    submitForm21(){
+      var param={configId:this.configId,configKey:this.configKey,configValue:JSON.stringify(this.form21)}
+      updateConfigByKey(param).then(response => {
+        if (response.code === 200) {
+          this.msgSuccess("修改成功");
+        }
+      });
+    },
+    submitform2(){
+      // 将对象转换为JSON字符串并保留两位小数
+      var json_data = JSON.stringify(this.form2, function(key, value) {
+        if ( key == "price") {
+          return value.toFixed(2);
+        }
+        return value;
+      });
+// 将对象转换为 JSON 字符串
+           var param={configId:this.configId,configValue:json_data};
+           updateConfigByKey(param).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("修改成功");
+              }
+            });
+    },
+    /** 清理缓存按钮操作 */
+    handleClearCache() {
+      clearCache().then(response => {
+        if (response.code === 200) {
+          this.msgSuccess("清理成功");
+        }
+      });
+    },
+    deleteCourseMaConfig(index) {
+      this.$confirm('确认删除该配置?', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      }).then(() => {
+        this.courseMaConfigList.splice(index, 1);
+        this.$message.success('删除成功');
+      }).catch(() => {});
+    },
+    addCourseMaConfig() {
+      this.courseMaConfigList.push({
+        name: "",
+        appid: "",
+        secret: "",
+        token: "",
+        aesKey: "",
+        msgDataFormat: "",
+        editing: true
+      });
+    },
+    handleEdit(index, row) {
+      this.$set(this.courseMaConfigList[index], 'editing', true);
+    },
+    handleSave(index, row) {
+      // 验证必填字段
+      if (!row.name || !row.appid || !row.secret) {
+        this.$message.error('请填写所有必填字段');
+        return;
+      }
+      this.$set(this.courseMaConfigList[index], 'editing', false);
+    },
+    addDisabledTime(){
+      if(this.form18.disabledTimeList == null || this.form18.disabledTimeList == undefined){
+        this.form18.disabledTimeList = []
+      }
+      this.form18.disabledTimeList.push({startDisabledTime: "", endDisabledTime: ""});
+      this.$forceUpdate();
+    },
+    removeDisabledTime(index){
+      this.form18.disabledTimeList.splice(index, 1);
+    },
+  }
+};
+</script>
+<style scoped>
+.footer{
+  width: 100%;
+  display: flex;
+  margin-top: 50px;
+  align-items: flex-end;
+  justify-content: flex-end;
+}
+</style>