Browse Source

Merge branch 'master' of http://1.14.104.71:10880/root/ylrz_his_scrm_adminUI

# Conflicts:
#	package.json
caoliqin 2 ngày trước cách đây
mục cha
commit
272d42b7c6
55 tập tin đã thay đổi với 5798 bổ sung202 xóa
  1. 37 0
      .env.prod-jkj
  2. 1 0
      package.json
  3. 7 0
      src/api/course/qw/courseWatchLog.js
  4. 18 0
      src/api/course/userCoursePeriod.js
  5. 9 1
      src/api/course/userTalent.js
  6. 7 0
      src/api/his/storeOrder.js
  7. 19 0
      src/api/his/userOperationLog.js
  8. 53 0
      src/api/live/liveAfterSalesItem.js
  9. 53 0
      src/api/live/liveAfterSalesLogs.js
  10. 53 0
      src/api/live/liveAfteraSales.js
  11. 53 0
      src/api/live/liveCart.js
  12. 53 0
      src/api/live/liveOrderItem.js
  13. 53 0
      src/api/live/liveOrderLogs.js
  14. 53 0
      src/api/live/liveOrderStatus.js
  15. 9 1
      src/api/live/liveVideo.js
  16. 1 1
      src/api/qw/externalContact.js
  17. BIN
      src/assets/logo/jkj.png
  18. 1 1
      src/components/VideoUpload/index.vue
  19. 13 0
      src/router/index.js
  20. 4 3
      src/views/components/course/userCourseCatalogDetails.vue
  21. 1 1
      src/views/components/his/packageOrderDetails.vue
  22. 2 1
      src/views/components/his/userAddDetails.vue
  23. 2 0
      src/views/components/his/userDetails.vue
  24. 17 2
      src/views/course/courseWatchLog/index.vue
  25. 101 10
      src/views/course/userTalent/index.vue
  26. 75 2
      src/views/course/videoResource/index.vue
  27. 3 1
      src/views/his/package/index.vue
  28. 335 9
      src/views/his/storeOrder/order1.vue
  29. 11 9
      src/views/his/user/index.vue
  30. 460 0
      src/views/his/user/userBehavior.vue
  31. 173 0
      src/views/his/user/userCourseConversionRecord.vue
  32. 476 0
      src/views/his/user/userCoursePeriod.vue
  33. 222 0
      src/views/his/user/userCoursePeriodDetails.vue
  34. 57 0
      src/views/his/user/userCourseStatic.vue
  35. 71 0
      src/views/his/user/userDetails.vue
  36. 248 0
      src/views/his/user/userStaticAll.vue
  37. 10 1
      src/views/live/live/index.vue
  38. 331 0
      src/views/live/liveAfterSalesItem/index.vue
  39. 358 0
      src/views/live/liveAfterSalesLogs/index.vue
  40. 531 0
      src/views/live/liveAfteraSales/index.vue
  41. 76 68
      src/views/live/liveAnchor/index.vue
  42. 369 0
      src/views/live/liveCart/index.vue
  43. 3 3
      src/views/live/liveData/index.vue
  44. 19 8
      src/views/live/liveGoods/index.vue
  45. 15 7
      src/views/live/liveOrder/index.vue
  46. 391 0
      src/views/live/liveOrderItem/index.vue
  47. 328 0
      src/views/live/liveOrderLogs/index.vue
  48. 313 0
      src/views/live/liveOrderStatus/index.vue
  49. 14 6
      src/views/live/liveOrderitems/index.vue
  50. 15 7
      src/views/live/liveVideo/index.vue
  51. 19 7
      src/views/statistics/section/channel.vue
  52. 18 7
      src/views/statistics/section/index.vue
  53. 18 7
      src/views/statistics/section/inline.vue
  54. 19 7
      src/views/statistics/section/today.vue
  55. 200 32
      src/views/system/config/config.vue

+ 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

+ 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:prod-kyt": "vue-cli-service build --mode prod-kyt",
     "build:stage": "vue-cli-service build --mode staging",
     "preview": "node build/index.js --preview",

+ 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
+  })
+}

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

@@ -181,3 +181,21 @@ export function delPeriodDay(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'
+  })
+}

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

@@ -264,4 +264,11 @@ export function batchCreateErpOrder(data) {
     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


+ 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({

+ 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/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>
 

+ 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;

+ 2 - 0
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">

+ 17 - 2
src/views/course/courseWatchLog/index.vue

@@ -72,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">

+ 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) {

+ 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>

+ 335 - 9
src/views/his/storeOrder/order1.vue

@@ -328,24 +328,35 @@
               plain
               icon="el-icon-phone"
               size="mini"
-              :disabled="multiple"
+              
               @click="setErpPhone"
               v-hasPermi="['his:storeOrder:createErpOrder']"
             >设置推送手机</el-button>
           </el-tooltip>
         </el-col>
-        <el-col :span="1.5" v-if="orderStatus == 5">
+        <!-- <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"
-              :disabled="multiple"
               @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>
@@ -529,7 +540,7 @@
       </div>
     </el-dialog>
     <el-dialog :title="erpPhone.title" :visible.sync="setPhoneOpen" width="600px" append-to-body>
-      <el-select v-model="erpPhoneValue" placeholder="请选择">
+      <el-select v-model="erpPhoneValue" multiple placeholder="请选择">
         <el-option
           v-for="item in phoneList"
           :key="item.phone"
@@ -542,11 +553,85 @@
         <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>
+      </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,queryErpPhone,saveErpPhone,editErpPhone,batchCreateErpOrder } 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";
@@ -563,9 +648,28 @@ 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 {
-      erpPhoneValue:null,
+      // ERP账户相关数据
+      erpAccountDialog: {
+        open: false,
+        title: "选择ERP账户",
+        loading: false,
+        submitting: false
+      },
+      erpAccountList: [], // ERP账户列表
+      erpAccountForm: {
+        selectedAccount: null // 选中的账户ID
+      },
+      orderSummary: null, // 订单统计信息
+      erpPhoneValue:[],
       setPhoneOpen:false,
       erpPhone:{
         open:false,
@@ -784,13 +888,198 @@ 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(() => {
-        batchCreateErpOrder(this.ids).then(response=>{
+        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();
@@ -800,11 +1089,48 @@ export default {
       });
     },
     handleCancelErpPhone(){
-      this.erpPhoneValue = null;
+      this.erpPhoneValue = [];
       this.setPhoneOpen = false;
     },
     submitErpPhone(){
-      const param = {orderIds:this.ids,erpPhone:this.erpPhoneValue};
+      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;

+ 11 - 9
src/views/his/user/index.vue

@@ -6,7 +6,7 @@
           v-model="queryCompanyId"
           placeholder="请选择所属公司"
           clearable
-          filterable 
+          filterable
           size="small"
           @change="handleQueryCompanyChange"
         >
@@ -19,12 +19,12 @@
         </el-select>
       </el-form-item>
       <el-form-item label="所属销售" prop="companyUserId">
-        
+
         <el-select
           v-model="queryCompanyUserId"
           placeholder="请选择所属销售"
           clearable
-          filterable 
+          filterable
           size="small"
         >
           <el-option
@@ -34,7 +34,7 @@
             :value="item.userId">
           </el-option>
         </el-select>
-      </el-form-item>    
+      </el-form-item>
       <el-form-item label="会员ID" prop="userId">
         <el-input
           v-model="queryParams.userId"
@@ -103,12 +103,12 @@
       <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>
 
     <el-row :gutter="10" class="mb8">
@@ -230,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>
 
     <!-- 更换会员归属对话框 -->
@@ -269,10 +270,11 @@
 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:[],
@@ -402,7 +404,7 @@ export default {
     handledetails(row){
             this.show.open=true;
             setTimeout(() => {
-                 this.$refs.userDetails.getDetails(row.userId);
+                 this.$refs.userDetailsByNew.getDetails(row.userId);
             }, 1);
      },
      handleQueryCompanyChange(companyId){

+ 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>

+ 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;

+ 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">
       <!-- 未上线部分 -->

+ 200 - 32
src/views/system/config/config.vue

@@ -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,43 +737,95 @@
       <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   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>
+      <!-- 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="erpWdBaseUrl" v-if="form13.erpOpen == 1 && form13.erpType == 2 " prop="erpWdBaseUrl">
-            <el-input   v-model="form13.erpWdBaseUrl"  label="请输入erpWdBaseUrl"></el-input>
+          <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="erpWarehouseCode" v-if="form13.erpOpen == 1 && form13.erpType == 2 " prop="erpWarehouseCode">
-            <el-input   v-model="form13.erpWarehouseCode"  label="请输入erpWarehouseCode"></el-input>
+          <el-form-item label="登录账号" :prop="`dfAccounts.${index}.loginAccount`">
+            <el-input v-model="account.loginAccount" placeholder="登录账号"></el-input>
           </el-form-item>
-
-          <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 label="回调地址" :prop="`dfAccounts.${index}.callBackUrl`">
+            <el-input v-model="account.callBackUrl" placeholder="回调地址"></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 label="月结账号" :prop="`dfAccounts.${index}.monthlyCard`">
+            <el-input v-model="account.monthlyCard" placeholder="月结账号"></el-input>
           </el-form-item>
-          <!-- erpHzOMSid -->
-          <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 label="寄件人姓名" :prop="`dfAccounts.${index}.senderName`">
+            <el-input v-model="account.senderName" placeholder="寄件人姓名"></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 label="寄件人手机" :prop="`dfAccounts.${index}.senderPhone`">
+            <el-input v-model="account.senderPhone" placeholder="寄件人手机"></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 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>
       </el-form-item>
@@ -947,6 +1001,16 @@
                <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>
@@ -1036,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>
@@ -1088,6 +1157,17 @@
                </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" />
@@ -1268,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">
@@ -1291,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>
 
 
@@ -1320,6 +1416,7 @@ import productDeliveryGiftValueSelect from "../../components/his/productDelivery
 import { Col } from "element-ui";
 import Editor from '@/components/Editor/wang';
 import companyMenuConfig from "./companyMenuConfig";
+import {getCitys} from "@/api/store/city";
 export default {
   name: "Config",
   components: {
@@ -1328,6 +1425,7 @@ export default {
   },
   data() {
     return {
+      citys:[],
       images:[],
       uploadUrl:process.env.VUE_APP_BASE_API+"/common/uploadOSS",
       videoAccept:"video/*",
@@ -1369,6 +1467,7 @@ export default {
       },
       form12:[],
       form13:{
+        dfAccounts: [] // 初始化代付管家账户数组
       },
       form14:{
       },
@@ -1396,6 +1495,9 @@ export default {
       },
       form21: {
 
+      },
+      form22: {
+
       },
       photoArr:[],
       couponList:[],
@@ -1455,6 +1557,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();
@@ -1598,7 +1743,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);
@@ -1634,6 +1788,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;
@@ -1742,6 +1899,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) {
@@ -1781,6 +1941,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 => {