Sfoglia il codice sorgente

Merge remote-tracking branch 'origin/master'

yys 1 settimana fa
parent
commit
b4bfde6005

+ 4 - 4
src/api/course/courseAnswerlogs.js

@@ -4,8 +4,8 @@ import request from '@/utils/request'
 export function listLogs(query) {
   return request({
     url: '/course/courseAnswerLog/list',
-    method: 'get',
-    params: query
+    method: 'post',
+    data: query
   })
 }
 
@@ -47,7 +47,7 @@ export function delLogs(logId) {
 export function exportLogs(query) {
   return request({
     url: '/course/courseAnswerLog/export',
-    method: 'get',
-    params: query
+    method: 'post',
+    data: query
   })
 }

+ 14 - 0
src/api/crm/customer.js

@@ -151,3 +151,17 @@ export function delCustomer(customerId) {
     method: 'delete'
   })
 }
+
+export function getCustomerDetails1(data) {
+  return request({
+    url: '/crm/customer/query/' + data.customerId,
+    method: 'get'
+  })
+}
+
+export function getCustomer1(customerId) {
+  return request({
+    url: '/crm/customer/query2/' + customerId,
+    method: 'get'
+  })
+}

+ 7 - 7
src/api/hisStore/city.js

@@ -3,7 +3,7 @@ import request from '@/utils/request'
 // 查询城市列表
 export function listCity(query) {
   return request({
-    url: '/store/city/list',
+    url: '/his/city/list',
     method: 'get',
     params: query
   })
@@ -18,7 +18,7 @@ export function getAllList(query) {
 
 export function getCitys() {
   return request({
-    url: '/store/city/getCitys',
+    url: '/his/city/getCitys',
     method: 'get'
   })
 }
@@ -28,7 +28,7 @@ export function getCitys() {
 // 查询城市详细
 export function getCity(id) {
   return request({
-    url: '/store/city/' + id,
+    url: '/his/city/' + id,
     method: 'get'
   })
 }
@@ -36,7 +36,7 @@ export function getCity(id) {
 // 新增城市
 export function addCity(data) {
   return request({
-    url: '/store/city',
+    url: '/his/city',
     method: 'post',
     data: data
   })
@@ -45,7 +45,7 @@ export function addCity(data) {
 // 修改城市
 export function updateCity(data) {
   return request({
-    url: '/store/city',
+    url: '/his/city',
     method: 'put',
     data: data
   })
@@ -54,7 +54,7 @@ export function updateCity(data) {
 // 删除城市
 export function delCity(id) {
   return request({
-    url: '/store/city/' + id,
+    url: '/his/city/' + id,
     method: 'delete'
   })
 }
@@ -62,7 +62,7 @@ export function delCity(id) {
 // 导出城市
 export function exportCity(query) {
   return request({
-    url: '/store/city/export',
+    url: '/his/city/export',
     method: 'get',
     params: query
   })

+ 6 - 6
src/api/hisStore/menu.js

@@ -3,7 +3,7 @@ import request from '@/utils/request'
 // 查询用户端菜单管理列表
 export function listMenu(query) {
   return request({
-    url: '/store/menu/list',
+    url: '/store/store/menu/list',
     method: 'get',
     params: query
   })
@@ -12,7 +12,7 @@ export function listMenu(query) {
 // 查询用户端菜单管理详细
 export function getMenu(menuId) {
   return request({
-    url: '/store/menu/' + menuId,
+    url: '/store/store/menu/' + menuId,
     method: 'get'
   })
 }
@@ -20,7 +20,7 @@ export function getMenu(menuId) {
 // 新增用户端菜单管理
 export function addMenu(data) {
   return request({
-    url: '/store/menu',
+    url: '/store/store/menu',
     method: 'post',
     data: data
   })
@@ -29,7 +29,7 @@ export function addMenu(data) {
 // 修改用户端菜单管理
 export function updateMenu(data) {
   return request({
-    url: '/store/menu',
+    url: '/store/store/menu',
     method: 'put',
     data: data
   })
@@ -38,7 +38,7 @@ export function updateMenu(data) {
 // 删除用户端菜单管理
 export function delMenu(menuId) {
   return request({
-    url: '/store/menu/' + menuId,
+    url: '/store/store/menu/' + menuId,
     method: 'delete'
   })
 }
@@ -46,7 +46,7 @@ export function delMenu(menuId) {
 // 导出用户端菜单管理
 export function exportMenu(query) {
   return request({
-    url: '/store/menu/export',
+    url: '/store/store/menu/export',
     method: 'get',
     params: query
   })

+ 4 - 4
src/api/hisStore/storeActivity.js

@@ -3,7 +3,7 @@ import request from '@/utils/request'
 // 查询活动列表
 export function listStoreActivity(query) {
   return request({
-    url: '/hisStore/fsStoreActivityScrm/list',
+    url: '/store/storeActivity/list',
     method: 'get',
     params: query
   })
@@ -12,7 +12,7 @@ export function listStoreActivity(query) {
 // 查询活动详细
 export function getStoreActivity(activityId) {
   return request({
-    url: '/hisStore/fsStoreActivityScrm/' + activityId,
+    url: '/store/storeActivity/' + activityId,
     method: 'get'
   })
 }
@@ -38,7 +38,7 @@ export function updateStoreActivity(data) {
 // 删除活动
 export function delStoreActivity(activityId) {
   return request({
-    url: '/hisStore/fsStoreActivityScrm/' + activityId,
+    url: '/store/storeActivity/' + activityId,
     method: 'delete'
   })
 }
@@ -46,7 +46,7 @@ export function delStoreActivity(activityId) {
 // 导出活动
 export function exportStoreActivity(query) {
   return request({
-    url: '/hisStore/fsStoreActivityScrm/export',
+    url: '/store/storeActivity/export',
     method: 'get',
     params: query
   })

+ 0 - 8
src/api/qw/qwCompany.js

@@ -56,11 +56,3 @@ export function exportQwCompany(query) {
     params: query
   })
 }
-
-export function setTenant(data) {
-  return request({
-    url: '/qw/qwCompany/setTenant',
-    method: 'post',
-    data: data
-  })
-}

+ 6 - 6
src/api/sop/companySopRole.js

@@ -3,7 +3,7 @@ import request from '@/utils/request'
 // 查询公司SOP权限列表
 export function listCompanySopRole(query) {
   return request({
-    url: '/companySopRole/list',
+    url: '/sop/companySopRole/list',
     method: 'get',
     params: query
   })
@@ -12,7 +12,7 @@ export function listCompanySopRole(query) {
 // 查询公司SOP权限详细
 export function getCompanySopRole(id) {
   return request({
-    url: '/companySopRole/' + id,
+    url: '/sop/companySopRole/' + id,
     method: 'get'
   })
 }
@@ -20,7 +20,7 @@ export function getCompanySopRole(id) {
 // 新增公司SOP权限
 export function addCompanySopRole(data) {
   return request({
-    url: '/companySopRole',
+    url: '/sop/companySopRole',
     method: 'post',
     data: data
   })
@@ -29,7 +29,7 @@ export function addCompanySopRole(data) {
 // 修改公司SOP权限
 export function updateCompanySopRole(data) {
   return request({
-    url: '/companySopRole',
+    url: '/sop/companySopRole',
     method: 'put',
     data: data
   })
@@ -38,7 +38,7 @@ export function updateCompanySopRole(data) {
 // 删除公司SOP权限
 export function delCompanySopRole(id) {
   return request({
-    url: '/companySopRole/' + id,
+    url: '/sop/companySopRole/' + id,
     method: 'delete'
   })
 }
@@ -46,7 +46,7 @@ export function delCompanySopRole(id) {
 // 导出公司SOP权限
 export function exportCompanySopRole(query) {
   return request({
-    url: '/companySopRole/export',
+    url: '/sop/companySopRole/export',
     method: 'get',
     params: query
   })

+ 3 - 3
src/api/store/city.js

@@ -18,7 +18,7 @@ export function getAllList(query) {
 
 export function getCitys() {
   return request({
-    url: '/store/city/getCitys',
+    url: '/his/city/getCitys',
     method: 'get'
   })
 }
@@ -54,7 +54,7 @@ export function updateCity(data) {
 // 删除城市
 export function delCity(id) {
   return request({
-    url: '/his/city' + id,
+    url: '/his/city/' + id,
     method: 'delete'
   })
 }
@@ -62,7 +62,7 @@ export function delCity(id) {
 // 导出城市
 export function exportCity(query) {
   return request({
-    url: '/his/cityexport',
+    url: '/his/city/export',
     method: 'get',
     params: query
   })

+ 5 - 5
src/api/store/menu.js

@@ -3,7 +3,7 @@ import request from '@/utils/request'
 // 查询列表
 export function listApi(query) {
   return request({
-    url: '/store/menu/list',
+    url: '/store/store/menu/list',
     method: 'get',
     params: query
   })
@@ -12,7 +12,7 @@ export function listApi(query) {
 // 查询详细
 export function getApi(id) {
   return request({
-    url: '/store/menu/' + id,
+    url: '/store/store/menu/' + id,
     method: 'get'
   })
 }
@@ -20,7 +20,7 @@ export function getApi(id) {
 // 新增
 export function addApi(data) {
   return request({
-    url: '/store/menu',
+    url: '/store/store/menu',
     method: 'post',
     data: data
   })
@@ -29,7 +29,7 @@ export function addApi(data) {
 // 修改
 export function updateApi(data) {
   return request({
-    url: '/store/menu',
+    url: '/store/store/menu',
     method: 'put',
     data: data
   })
@@ -38,7 +38,7 @@ export function updateApi(data) {
 // 删除
 export function delApi(id) {
   return request({
-    url: '/store/menu/' + id,
+    url: '/store/store/menu/' + id,
     method: 'delete'
   })
 }

+ 8 - 8
src/api/store/store/city.js

@@ -3,14 +3,14 @@ import request from '@/utils/request'
 // 查询城市列表
 export function listCity(query) {
   return request({
-    url: '/store/city/list',
+    url: '/his/city/list',
     method: 'get',
     params: query
   })
 }
 export function getCitys(query) {
   return request({
-    url: '/store/city/getCitys',
+    url: '/his/city/getCitys',
     method: 'get',
     params: query
   })
@@ -21,7 +21,7 @@ export function getCitys(query) {
 // 查询城市详细
 export function getCity(id) {
   return request({
-    url: '/store/city/' + id,
+    url: '/his/city/' + id,
     method: 'get'
   })
 }
@@ -29,7 +29,7 @@ export function getCity(id) {
 // 新增城市
 export function addCity(data) {
   return request({
-    url: '/store/city',
+    url: '/his/city',
     method: 'post',
     data: data
   })
@@ -38,7 +38,7 @@ export function addCity(data) {
 // 修改城市
 export function updateCity(data) {
   return request({
-    url: '/store/city',
+    url: '/his/city',
     method: 'put',
     data: data
   })
@@ -47,7 +47,7 @@ export function updateCity(data) {
 // 删除城市
 export function delCity(id) {
   return request({
-    url: '/store/city/' + id,
+    url: '/his/city/' + id,
     method: 'delete'
   })
 }
@@ -55,8 +55,8 @@ export function delCity(id) {
 // 导出城市
 export function exportCity(query) {
   return request({
-    url: '/store/city/export',
+    url: '/his/city/export',
     method: 'get',
     params: query
   })
-}
+}

+ 3 - 3
src/api/store/storeActivity.js

@@ -3,7 +3,7 @@ import request from '@/utils/request'
 // 查询列表
 export function listApi(query) {
   return request({
-    url: '/hisStore/fsStoreActivityScrm/list',
+    url: '/store/storeActivity/list',
     method: 'get',
     params: query
   })
@@ -12,7 +12,7 @@ export function listApi(query) {
 // 查询详细
 export function getApi(id) {
   return request({
-    url: '/hisStore/fsStoreActivityScrm/' + id,
+    url: '/store/storeActivity/' + id,
     method: 'get'
   })
 }
@@ -38,7 +38,7 @@ export function updateApi(data) {
 // 删除
 export function delApi(id) {
   return request({
-    url: '/hisStore/fsStoreActivityScrm/' + id,
+    url: '/store/storeActivity/' + id,
     method: 'delete'
   })
 }

+ 2 - 2
src/api/store/user.js

@@ -87,7 +87,7 @@ export function getAllUserListLimit(query) {
 // 获取小黑屋用户列表
 export function darkRoomList(query) {
   return request({
-    url: '/store/store/user/darkRoomListList',
+    url: '/his/user/darkRoomList',
     method: 'get',
     params: query
   })
@@ -96,7 +96,7 @@ export function darkRoomList(query) {
 // 批量解禁
 export function enabledUsers(data) {
   return request({
-    url: '/store/user/enabledUsers',
+    url: '/his/user/enabledUsers',
     method: 'post',
     data: data
   })

+ 0 - 39
src/main.js

@@ -30,7 +30,6 @@ import DictTag from '@/components/DictTag'
 // 头部标签组件
 import VueMeta from 'vue-meta'
 import * as echarts from "echarts";
-import { getConfigByKey } from '@/api/system/config'
 import moment from 'moment'
 Vue.prototype.$moment = moment
 Vue.prototype.$runtimeConfig = {}
@@ -95,45 +94,7 @@ Vue.use(Element, {
 })
 
 Vue.config.productionTip = false
-async function initRuntimeConfig() {
-  try {
-    const res = await getConfigByKey('his.adminUi.config')
-
-    const configValue = res?.data?.configValue
-    if (!configValue) return
-
-    // 后端配置 JSON
-    const form = JSON.parse(configValue)
-
-    // 字段映射表(核心优化点)
-    const mapping = {
-      VUE_APP_OBS_ACCESS_KEY_ID: 'obsAccessKeyId',
-      VUE_APP_OBS_SECRET_ACCESS_KEY: 'obsSecretAccessKey',
-      VUE_APP_OBS_SERVER: 'obsServer',
-      VUE_APP_OBS_BUCKET: 'obsBucket',
-      VUE_APP_VIDEO_LINE_1: 'videoLinePrimary',
-      VUE_APP_VIDEO_LINE_2: 'videoLineSecondary',
-      VUE_APP_VIDEO_URL: 'volcanoVideoDomain',
-      VUE_APP_HSY_SPACE: 'volcanoVodSpace',
-      VUE_APP_LIVE_PATH: 'livePath',
-      VUE_APP_COS_BUCKET: 'cosBucket',
-      VUE_APP_LIVE_WS_URL: 'liveWebSocketUrl',
-      VUE_APP_COURSE_DEFAULT: 'courseDefaultType',
-      VUE_APP_COS_REGION: 'cosRegion'
-    }
-
-    // 写入运行时配置
-    Object.keys(mapping).forEach(key => {
-      Vue.prototype.$runtimeConfig[key] = form[mapping[key]] ?? null
-    })
-  } catch (e) {
-    console.error('初始化运行时配置失败', e)
-  }
-}
-
-
 async function bootstrap() {
-  // await initRuntimeConfig()
   new Vue({
     el: '#app',
     router,

+ 2 - 0
src/permission.js

@@ -4,6 +4,7 @@ import { Message } from 'element-ui'
 import NProgress from 'nprogress'
 import 'nprogress/nprogress.css'
 import { getToken } from '@/utils/auth'
+import { loadRuntimeConfig } from '@/utils/runtimeConfig'
 
 NProgress.configure({ showSpinner: false })
 
@@ -22,6 +23,7 @@ router.beforeEach((to, from, next) => {
       if (store.getters.roles.length === 0) {
         // 判断当前用户是否已拉取完user_info信息
         store.dispatch('GetInfo').then(() => {
+          loadRuntimeConfig()
           store.dispatch('GenerateRoutes').then(accessRoutes => {
             // 根据roles权限生成可访问的路由表
             router.addRoutes(accessRoutes) // 动态添加可访问路由表

+ 78 - 0
src/utils/adminUiConfig.js

@@ -0,0 +1,78 @@
+/** 云存储单项配置(与 projectConfig tencent_cloud_config / tmp_secret_config 一致) */
+export function defaultCloudConfig() {
+  return {
+    secret_id: '',
+    secret_key: '',
+    bucket: '',
+    app_id: '',
+    region: '',
+    proxy: ''
+  }
+}
+
+export function defaultAdminUiForm() {
+  return {
+    tencent_cloud_config: defaultCloudConfig(),
+    tmp_secret_config: defaultCloudConfig(),
+    videoLinePrimary: '',
+    videoLineSecondary: '',
+    livePath: '',
+    volcanoVideoDomain: '',
+    volcanoVodSpace: '',
+    liveWebSocketUrl: '',
+    courseDefaultType: '1'
+  }
+}
+
+/** 加载配置:兼容旧版平铺字段(obsAccessKeyId、cosBucket 等) */
+export function normalizeAdminUiConfig(raw) {
+  if (!raw || typeof raw !== 'object') {
+    return defaultAdminUiForm()
+  }
+  const form = defaultAdminUiForm()
+  Object.keys(form).forEach(key => {
+    if (key === 'tencent_cloud_config' || key === 'tmp_secret_config') {
+      return
+    }
+    if (raw[key] !== undefined && raw[key] !== null) {
+      form[key] = raw[key]
+    }
+  })
+  if (raw.tencent_cloud_config && typeof raw.tencent_cloud_config === 'object') {
+    form.tencent_cloud_config = { ...defaultCloudConfig(), ...raw.tencent_cloud_config }
+  }
+  if (raw.tmp_secret_config && typeof raw.tmp_secret_config === 'object') {
+    form.tmp_secret_config = { ...defaultCloudConfig(), ...raw.tmp_secret_config }
+  }
+  const tc = form.tencent_cloud_config
+  if (raw.cosBucket && !tc.bucket) tc.bucket = raw.cosBucket
+  if (raw.cosRegion && !tc.region) tc.region = raw.cosRegion
+  const hw = form.tmp_secret_config
+  if (raw.obsAccessKeyId && !hw.secret_id) hw.secret_id = raw.obsAccessKeyId
+  if (raw.obsSecretAccessKey && !hw.secret_key) hw.secret_key = raw.obsSecretAccessKey
+  if (raw.obsBucket && !hw.bucket) hw.bucket = raw.obsBucket
+  if (raw.obsServer && !hw.proxy) hw.proxy = raw.obsServer.replace(/^https?:\/\//, '')
+  return form
+}
+
+/** 供 main.js / login.vue 写入 $runtimeConfig */
+export function buildRuntimeConfigFromAdminUi(form) {
+  const normalized = normalizeAdminUiConfig(form)
+  const tc = normalized.tencent_cloud_config || defaultCloudConfig()
+  const hw = normalized.tmp_secret_config || defaultCloudConfig()
+  return {
+    VUE_APP_OBS_ACCESS_KEY_ID: hw.secret_id || '',
+    VUE_APP_OBS_SECRET_ACCESS_KEY: hw.secret_key || '',
+    VUE_APP_OBS_SERVER: hw.proxy || '',
+    VUE_APP_OBS_BUCKET: hw.bucket || '',
+    VUE_APP_VIDEO_LINE_1: normalized.videoLinePrimary || '',
+    VUE_APP_VIDEO_LINE_2: normalized.videoLineSecondary || '',
+    VUE_APP_VIDEO_URL: normalized.volcanoVideoDomain || '',
+    VUE_APP_HSY_SPACE: normalized.volcanoVodSpace || '',
+    VUE_APP_LIVE_PATH: normalized.livePath || '/live',
+    VUE_APP_COS_BUCKET: tc.bucket || '',
+    VUE_APP_LIVE_WS_URL: normalized.liveWebSocketUrl || '',
+    VUE_APP_COURSE_DEFAULT: normalized.courseDefaultType || '1',
+    VUE_APP_COS_REGION: tc.region || ''
+  }
+}

+ 6 - 1
src/utils/hsy.js

@@ -1,9 +1,14 @@
 import TTUploader from 'tt-uploader'
 import Vue from "vue";
 import { HsyAssumeRoleService } from '@/api/course/userVideo'
-const  spaceName = Vue.prototype.$runtimeConfig.VUE_APP_HSY_SPACE
+
 export const uploadToHSY = async (file, onProgress, type, callBackUp) => {
   try {
+    const spaceName = Vue.prototype.$runtimeConfig.VUE_APP_HSY_SPACE
+    if (!spaceName) {
+      throw new Error('未配置火山云点播空间名称,请在「系统参数 → 前端配置」中填写「点播空间名称」')
+    }
+
     const res = await HsyAssumeRoleService()
     //console.log('火山云 STS 凭证:', res)
     const credentials = res.data.result.credentials

+ 19 - 0
src/utils/runtimeConfig.js

@@ -0,0 +1,19 @@
+import Vue from 'vue'
+import { getConfigByKey } from '@/api/system/config'
+import { buildRuntimeConfigFromAdminUi } from '@/utils/adminUiConfig'
+
+/** 从租户库 his.adminUi.config 加载运行时配置到 $runtimeConfig */
+export async function loadRuntimeConfig() {
+  try {
+    const res = await getConfigByKey('his.adminUi.config')
+    const configValue = res?.data?.configValue
+    if (!configValue) {
+      console.warn('his.adminUi.config 为空,火山云上传等能力可能不可用')
+      return
+    }
+    const form = JSON.parse(configValue)
+    Vue.prototype.$runtimeConfig = buildRuntimeConfigFromAdminUi(form)
+  } catch (error) {
+    console.error('加载运行时配置失败', error)
+  }
+}

+ 7 - 17
src/views/chat/chatRole/index.vue

@@ -166,15 +166,13 @@
 import { listChatRole, getChatRole, delChatRole, addChatRole, updateChatRole, exportChatRole } from "@/api/chat/chatRole";
 import { getUrl } from "@/api/chat/chatUpload";
 import QRCode from 'qrcodejs2'
-import { getUserProfile } from "@/api/company/companyUser";
 
 export default {
   name: "ChatRole",
   data() {
     return {
-      user:null,
       qrOpen:false,
-      uploadUrl:process.env.VUE_APP_BASE_API+"/chat/upload/uploadFile/",
+      uploadUrl:process.env.VUE_APP_BASE_API+"/common/uploadOSS",
       modeOptions:[],
       typeOptions:[],
       // 遮罩层
@@ -236,14 +234,15 @@ export default {
     this.getDicts("chat_role_mode").then((response) => {
       this.modeOptions = response.data;
     });
-    this.getUser();
     this.getList();
   },
   methods: {
-    getUser() {
-      getUserProfile().then(response => {
-        this.user = response.data;
-        this.uploadUrl=this.uploadUrl+this.user.companyId;
+    getList() {
+      this.loading = true;
+      listChatRole(this.queryParams).then(response => {
+        this.chatRoleList = response.rows;
+        this.total = response.total;
+        this.loading = false;
       });
     },
     handleShowQr(row){
@@ -294,15 +293,6 @@ export default {
       }
       return   isLt1M;
     },
-    /** 查询聊天角色列表 */
-    getList() {
-      this.loading = true;
-      listChatRole(this.queryParams).then(response => {
-        this.chatRoleList = response.rows;
-        this.total = response.total;
-        this.loading = false;
-      });
-    },
     // 取消按钮
     cancel() {
       this.open = false;

+ 0 - 17
src/views/company/companyProfit/index.vue

@@ -1,15 +1,6 @@
 <template>
   <div class="app-container">
     <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="100px">
-      <el-form-item label="" v-if="company!=null" >
-          <span style="font-weight:bold;" >{{company.companyName}}</span>
-      </el-form-item>
-      <el-form-item label="推广佣金" v-if="company!=null" >
-          <span style="font-size:20px;color:red;">{{company.tuiMoney.toFixed(2)}}</span>元
-      </el-form-item>
-      <el-form-item label="可提现金额" v-if="company!=null" >
-          <span style="font-size:20px;color:red;">{{company.money.toFixed(2)}}</span>元
-      </el-form-item>
       <el-form-item label="提现状态" prop="profitStatus">
          <el-select v-model="queryParams.profitStatus" placeholder="请选择状态" clearable size="small">
               <el-option
@@ -130,12 +121,10 @@
 
 <script>
 import { profit,cancel,listCompanyProfit, getCompanyProfit, delCompanyProfit, addCompanyProfit, updateCompanyProfit, exportCompanyProfit } from "@/api/company/companyProfit";
-import { getCompanyInfo } from "@/api/company/company";
 export default {
   name: "CompanyProfit",
   data() {
     return {
-      company:null,
       statusOptions:[],
       // 遮罩层
       loading: true,
@@ -197,16 +186,10 @@ export default {
     this.getDicts("sys_company_profit_status").then((response) => {
       this.statusOptions = response.data;
     });
-    this.getCompanyInfo();
     this.getList();
     
   },
   methods: {
-    getCompanyInfo(){
-      getCompanyInfo().then(response => {
-        this.company = response.data;
-      });
-    },
     /** 查询提现列表 */
     getList() {
       this.loading = true;

+ 0 - 172
src/views/course/courseAnswerLog/index/index.vue

@@ -1,172 +0,0 @@
-<template>
-  <div class="app-container">
-    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
-      <el-form-item label="关键词" prop="keyword">
-        <el-input v-model="queryParams.keyword" 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="['course:courseAnswerLog:add']">新增</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="['course:courseAnswerLog:remove']">删除</el-button>
-      </el-col>
-      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
-    </el-row>
-
-    <el-table border v-loading="loading" :data="list" @selection-change="handleSelectionChange">
-      <el-table-column type="selection" width="55" align="center" />
-      <el-table-column label="ID" align="center" prop="id" width="80" />
-      <el-table-column label="名称" align="center" prop="name" :show-overflow-tooltip="true" />
-      <el-table-column label="创建时间" align="center" prop="createTime" width="160">
-        <template slot-scope="scope">
-          <span>{{ parseTime(scope.row.createTime) }}</span>
-        </template>
-      </el-table-column>
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
-        <template slot-scope="scope">
-          <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
-            v-hasPermi="['course:courseAnswerLog:edit']">修改</el-button>
-          <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
-            v-hasPermi="['course:courseAnswerLog: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="name">
-          <el-input v-model="form.name" 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 { getRequest, postRequest, putRequest, delRequest } from "@/api/common";
-
-export default {
-  name: "CourseCourseanswerlog",
-  data() {
-    return {
-      loading: true,
-      ids: [],
-      multiple: true,
-      showSearch: true,
-      total: 0,
-      list: [],
-      title: "",
-      open: false,
-      queryParams: {
-        pageNum: 1,
-        pageSize: 10,
-        keyword: null
-      },
-      form: {},
-      rules: {
-        name: [{ required: true, message: "名称不能为空", trigger: "blur" }],
-      },
-    };
-  },
-  created() {
-    this.getList();
-  },
-  methods: {
-    getList() {
-      this.loading = true;
-      getRequest("/course/courseAnswerLog/list", this.queryParams).then(response => {
-        this.list = response.rows || [];
-        this.total = response.total || 0;
-        this.loading = false;
-      }).catch(() => {
-        this.list = [];
-        this.total = 0;
-        this.loading = false;
-      });
-    },
-    handleQuery() {
-      this.queryParams.pageNum = 1;
-      this.getList();
-    },
-    resetQuery() {
-      this.resetForm("queryForm");
-      this.handleQuery();
-    },
-    cancel() {
-      this.open = false;
-      this.reset();
-    },
-    reset() {
-      this.form = { id: null, name: null };
-      this.resetForm("form");
-    },
-    handleSelectionChange(selection) {
-      this.ids = selection.map(item => item.id);
-      this.multiple = !selection.length;
-    },
-    handleAdd() {
-      this.reset();
-      this.open = true;
-      this.title = "新增";
-    },
-    handleUpdate(row) {
-      this.reset();
-      const id = row.id || this.ids;
-      getRequest("/course/courseAnswerLog/" + 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) {
-            putRequest("/course/courseAnswerLog", this.form).then(response => {
-              this.$modal.msgSuccess("修改成功");
-              this.open = false;
-              this.getList();
-            });
-          } else {
-            postRequest("/course/courseAnswerLog", this.form).then(response => {
-              this.$modal.msgSuccess("新增成功");
-              this.open = false;
-              this.getList();
-            });
-          }
-        }
-      });
-    },
-    handleDelete(row) {
-      const ids = row.id || this.ids;
-      this.$modal.confirm('是否确认删除选中的数据项?', "警告", {
-        confirmButtonText: "确定",
-        cancelButtonText: "取消",
-        type: "warning"
-      }).then(() => {
-        return delRequest("/course/courseAnswerLog/" + ids);
-      }).then(() => {
-        this.getList();
-        this.$modal.msgSuccess("删除成功");
-      }).catch(() => {});
-    },
-  },
-};
-</script>

+ 91 - 61
src/views/course/courseAnswerlogs/index.vue

@@ -1,15 +1,38 @@
 <template>
   <div class="app-container">
     <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="120px">
-      <el-form-item label="用户ID" prop="userId">
+      <!--      <el-form-item label="销售公司" prop="companyId">-->
+      <!--        <el-select filterable v-model="queryParams.companyId" clearable placeholder="请选择公司名" size="small">-->
+      <!--          <el-option-->
+      <!--            v-for="item in companys"-->
+      <!--            :key="item.companyId"-->
+      <!--            :label="item.companyName"-->
+      <!--            :value="item.companyId"-->
+      <!--          />-->
+      <!--        </el-select>-->
+      <!--      </el-form-item>-->
+      <el-form-item label="会员id" prop="userId">
         <el-input
           v-model="queryParams.userId"
-          placeholder="请输入用户ID"
+          placeholder="请输入会员id"
           clearable
           size="small"
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
+      <el-form-item label="公司名" prop="companyId">
+        <select-tree
+          v-model="selectedCompanyList"
+          :raw-data="deptList"
+          placeholder="请选择销售"
+          :parentSelectable="true"
+          :multiple="true"
+          component-width="300px"
+          :max-display-tags="3"
+          :check-strictly="false"
+          :return-leaf-only="false"
+        ></select-tree>
+      </el-form-item>
       <el-form-item label="客户电话" prop="phone">
         <el-input
           v-model="queryParams.phone"
@@ -19,15 +42,6 @@
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
-      <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="phoneMk">
         <el-input
           v-model="queryParams.phoneMk"
@@ -67,7 +81,7 @@
         />
       </el-form-item>
       <el-form-item label="公司" prop="companyId">
-        <el-select filterable  v-model="queryParams.companyId" placeholder="请输入"  clearable size="small">
+        <el-select filterable  v-model="queryParams.companyId" placeholder="请选择公司名"  clearable size="small">
           <el-option
             v-for="item in companys"
             :key="item.companyId"
@@ -87,8 +101,8 @@
         </el-select>
       </el-form-item>
       <el-form-item label="创建时间" prop="createTime">
-        <el-date-picker v-model="createTime" size="small" style="width: 220px" value-format="yyyy-MM-dd"
-                        type="daterange" range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期" @change="timeChange"></el-date-picker>
+        <el-date-picker v-model="createTime" size="small" style="width: 220px" value-format="yyyy-MM-dd HH:mm:ss"
+                        type="datetimerange" range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期" @change="timeChange"></el-date-picker>
 
       </el-form-item>
       <el-form-item>
@@ -114,22 +128,8 @@
 
     <el-table border v-loading="loading" :data="logsList" @selection-change="handleSelectionChange">
       <el-table-column type="selection" width="55" align="center" />
-      <el-table-column label="小程序用户名" align="center" prop="userName">
-        <template slot-scope="scope">
-          <div style="display: flex;white-space: nowrap">
-            <div style="margin: auto">
-              {{scope.row.userName}}
-            </div>
-            <el-popover
-              placement="right"
-              title=""
-              trigger="hover">
-              <img slot="reference" :src="scope.row.fsAvatar" style="width: 30px;height: 30px">
-              <img :src="scope.row.fsAvatar" style="max-width: 200px;max-height: 200px">
-            </el-popover>
-          </div>
-        </template>
-      </el-table-column>
+      <el-table-column label="小程序会员id" align="center" prop="userId" />
+      <el-table-column label="小程序用户名" align="center" prop="userName" />
       <el-table-column label="课程名称" align="center" prop="courseName" />
       <el-table-column label="小节名称" align="center" prop="videoName" />
       <el-table-column label="是否全部正确" align="center" prop="isRight" >
@@ -158,13 +158,19 @@
 import { listLogs, getLogs, delLogs, addLogs, updateLogs, exportLogs } from "@/api/course/courseAnswerlogs";
 import { courseList, videoList } from '@/api/course/courseRedPacketLog'
 import { getCompanyList } from '@/api/company/company'
+import SelectTree from '@/components/TreeSelect/index.vue'
+import { getDeptData } from '@/api/system/employeeStats'
 
 export default {
   name: "Logs",
+  components: { SelectTree },
   data() {
     return {
+
+      selectedCompanyList: [],
+      deptList: [],
       // 遮罩层
-      loading: true,
+      loading: false,
       // 导出遮罩层
       exportLoading: false,
       // 选中数组
@@ -196,19 +202,19 @@ export default {
       open: false,
       // 查询参数
       queryParams: {
+        logId:null,
         pageNum: 1,
         pageSize: 10,
         phone: null,
+        userId: null,
         phoneMk: null,
         courseId: null,
         videoId: null,
-        userId:null,
         companyUserName: null,
         companyId: null,
         isRight: null,
         sTime:null,
         eTime:null,
-        userName: null,
       },
       //选择时间
       createTime:null,
@@ -221,31 +227,45 @@ export default {
   },
   created() {
 
+
+    getDeptData().then(response => {
+      this.deptList = response.data;
+    })
+
     courseList().then(response => {
       this.courseLists = response.list;
     });
 
     getCompanyList().then(response => {
       this.companys = response.data;
-      if(this.companys!=null&&this.companys.length>0){
-        this.companyId=this.companys[0].companyId;
-        this.getTreeselect();
-      }
+      // if(this.companys!=null&&this.companys.length>0){
+      //   this.companyId=this.companys[0].companyId;
+      //   this.getTreeselect();
+      // }
       this.companys.push({companyId:"-1",companyName:"无"})
     });
     this.getDicts("sys_company_or").then(response => {
       this.sysCompanyOr = response.data;
     });
-    this.getList();
+
+    // this.getList();
 
   },
   methods: {
     /** 查询答题日志列表 */
     getList() {
       this.loading = true;
+
+      if(this.selectedCompanyList != null && this.selectedCompanyList.length > 0) {
+        this.queryParams.companyUserIds = this.selectedCompanyList;
+      }else {
+        this.queryParams.companyUserIds = [];
+      }
+
+
       listLogs(this.queryParams).then(response => {
-        this.logsList = response.rows;
-        this.total = response.total;
+        this.logsList = response.data.list;
+        this.total = response.data.total;
         this.loading = false;
       });
     },
@@ -287,7 +307,6 @@ export default {
         companyId: null,
         sTime:null,
         eTime:null,
-        userName: null,
       };
       this.resetForm("form");
     },
@@ -350,30 +369,41 @@ export default {
     handleDelete(row) {
       const logIds = row.logId || this.ids;
       this.$confirm('是否确认删除答题日志编号为"' + logIds + '"的数据项?', "警告", {
-          confirmButtonText: "确定",
-          cancelButtonText: "取消",
-          type: "warning"
-        }).then(function() {
-          return delLogs(logIds);
-        }).then(() => {
-          this.getList();
-          this.msgSuccess("删除成功");
-        }).catch(() => {});
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(function() {
+        return delLogs(logIds);
+      }).then(() => {
+        this.getList();
+        this.msgSuccess("删除成功");
+      }).catch(() => {});
     },
     /** 导出按钮操作 */
     handleExport() {
       const queryParams = this.queryParams;
-      this.$confirm('是否确认导出当前答题日志数据项?', "警告", {
-          confirmButtonText: "确定",
-          cancelButtonText: "取消",
-          type: "warning"
-        }).then(() => {
-          this.exportLoading = true;
-          return exportLogs(queryParams);
-        }).then(response => {
-          this.download(response.msg);
-          this.exportLoading = false;
-        }).catch(() => {});
+      this.$confirm('是否确认导出所有答题日志数据项?', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+
+        const loadingInstance = this.$loading({
+          lock: true,
+          text: '正在导出数据,请稍候...',
+          background: 'rgba(0, 0, 0, 0.7)'
+        });
+
+        this.exportLoading = true;
+        return exportLogs(queryParams).finally(res=>{
+          loadingInstance.close();
+        });
+      }).then(response => {
+        this.download(response.msg);
+        this.exportLoading = false;
+      }).catch(() => {}).finally(res=>{
+        this.exportLoading = false;
+      });
     }
   }
 };

+ 65 - 330
src/views/course/courseFinishTempParent/index.vue

@@ -1,6 +1,16 @@
 <template>
   <div class="app-container">
     <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="销售公司" prop="companyId">
+        <el-select filterable v-model="queryParams.companyId" clearable placeholder="请选择公司名" size="small">
+          <el-option
+            v-for="item in companyList"
+            :key="item.companyId"
+            :label="item.companyName"
+            :value="item.companyId"
+          />
+        </el-select>
+      </el-form-item>
       <el-form-item label="名称" prop="name">
         <el-input
           v-model="queryParams.name"
@@ -130,7 +140,17 @@
             </el-radio>
           </el-radio-group>
         </el-form-item>
-        <el-form-item label="课程" prop="courseId">
+        <el-form-item label="销售公司" prop="companyId">
+          <el-select filterable v-model="form.companyId" placeholder="请选择公司名" size="small" @change="loadUser">
+            <el-option
+              v-for="item in companyList"
+              :key="item.companyId"
+              :label="item.companyName"
+              :value="item.companyId"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="课程ID" prop="courseId">
           <el-select v-model="form.courseId" :disabled="form.id != null" placeholder="请选择课程" style=" margin-right: 10px;" size="mini">
             <el-option
               v-for="dict in courseList"
@@ -153,13 +173,13 @@
                     </el-radio-group>
                   </el-form-item>
                   <el-form-item label="内容" style="margin-bottom: 2%">
-                    <el-input v-if="item.contentType == 1 ||item.contentType == 15" v-model="item.value" type="textarea" :rows="3"
+                    <el-input v-if="item.contentType == 1 " v-model="item.value" type="textarea" :rows="3"
                               placeholder="内容" style="width: 90%;margin-top: 10px;"/>
 
                     <ImageUpload v-if="item.contentType == 2 " v-model="item.imgUrl" type="image" :num="1" :width="150"
                                  :height="150"/>
 
-                    <div v-if="item.contentType == 3 || item.contentType ==9">
+                    <div v-if="item.contentType == 3 ">
                       <el-card class="box-card">
                         <el-form-item label="链接标题:" label-width="100px">
                           <el-input v-model="item.linkTitle" placeholder="请输入链接标题" style="width: 90%;"/>
@@ -178,52 +198,7 @@
                       </el-card>
                     </div>
                     <div v-if="item.contentType == 4">
-                      <el-card class="box-card">
-
-                        <el-form-item label="选择课程">
-                          <el-select
-                            v-model="item.courseId"
-                            placeholder="请选择课程"
-                            style="margin-right: 10px"
-                            size="mini"
-                            @change="handleRuleCourseChange(item)"
-                          >
-                            <el-option
-                              v-for="dict in courseList"
-                              :key="dict.dictValue"
-                              :label="dict.dictLabel"
-                              :value="parseInt(dict.dictValue)"
-                            />
-                          </el-select>
-                          <el-select
-                            v-model="item.videoId"
-                            placeholder="请选择小节"
-                            size="mini"
-                            style="margin-right: 10px"
-                            filterable
-                            remote
-                            :remote-method="(query) => remoteMethodRuleVideo(query, item)"
-                            :loading="videoOptionsLoading"
-                            @change="handleRuleVideoChange(item)"
-                          >
-                            <el-option
-                              v-for="dict in videoOptions || []"
-                              :key="dict.dictValue"
-                              :label="dict.dictLabel"
-                              :value="parseInt(dict.dictValue)"
-                            />
-                          </el-select>
-                        </el-form-item>
 
-                        <el-card class="box-card" style="margin-top: 10px">
-                          <el-form-item label="标题" prop="miniprogramTitle">
-                            <el-input v-model="item.miniprogramTitle" placeholder="请输入小程序消息标题,最长为64字" />
-                          </el-form-item>
-                          <el-form-item label="封面" prop="miniprogramPicUrl">
-                            <ImageUpload v-model="item.miniprogramPicUrl" type="image" :num="10" :width="150" :height="150" />
-                          </el-form-item>
-                        </el-card>
-                      </el-card>
                     </div>
                     <div v-if="item.contentType == 5 ">
 
@@ -261,7 +236,7 @@
                         </video>
                       </el-form-item>
                     </div>
-                    <div v-if="item.contentType == 7 || item.contentType == 16">
+                    <div v-if="item.contentType == 7 ">
                       <el-input
                         v-model="item.value"
                         type="textarea" :rows="3" maxlength="66" show-word-limit
@@ -269,44 +244,7 @@
                         @input="handleInputVideoText(item.value,item)"/>
                     </div>
                     <div v-if="item.contentType == 8">
-                      <el-button type="primary"
-                                 style="margin-bottom: 1%"
-                                 @click="hanldeSelectVideoNum(setting,index)">
-                        选择视频号
-                      </el-button>
-                      <el-card class="box-card" v-if="item.coverUrl">
-                        <el-form-item label="封面标题:" label-width="100px">
-                          <el-input v-model="item.nickname"
-                                    style="width: 90%;margin-bottom: 1%" disabled/>
-                        </el-form-item>
-                        <el-form-item label="头像:" label-width="100px">
-                          <el-image
-                            v-if="item.avatar != null"
-                            :src="item.avatar"
-                            :preview-src-list="[item.avatar]"
-                            :style="{ width: '50px', height: '50px' }"
-                          ></el-image>
-                        </el-form-item>
-                        <el-form-item label="封面:" label-width="100px">
-                          <el-image
-                            v-if="item.coverUrl != null"
-                            :src="item.coverUrl"
-                            :preview-src-list="[item.coverUrl]"
-                            :style="{ width: '200px', height: '200px' }"
-                          ></el-image>
 
-                        </el-form-item>
-                        <el-form-item label="简介:" label-width="100px">
-                          <el-input type="textarea" :rows="3"
-                                    v-model="item.desc"
-                                    style="width: 90%;margin-top: 1%;" disabled/>
-                        </el-form-item>
-                        <el-form-item label="视频地址:" label-width="100px"
-                                      style="margin-top: 1%">
-                          <el-input v-model="item.url"
-                                    style="width: 90%;" disabled/>
-                        </el-form-item>
-                      </el-card>
                     </div>
 
                   </el-form-item>
@@ -335,13 +273,13 @@
                     </el-radio-group>
                   </el-form-item>
                   <el-form-item label="内容" style="margin-bottom: 2%">
-                    <el-input v-if="item.contentType == 1 ||item.contentType == 15" v-model="item.value" type="textarea" :rows="3"
+                    <el-input v-if="item.contentType == 1 " v-model="item.value" type="textarea" :rows="3"
                               placeholder="内容" style="width: 90%;margin-top: 10px;"/>
 
                     <ImageUpload v-if="item.contentType == 2 " v-model="item.imgUrl" type="image" :num="1" :width="150"
                                  :height="150"/>
 
-                    <div v-if="item.contentType == 3 || item.contentType ==9">
+                    <div v-if="item.contentType == 3 ">
                       <el-card class="box-card">
                         <el-form-item label="链接标题:" label-width="100px">
                           <el-input v-model="item.linkTitle" placeholder="请输入链接标题" style="width: 90%;"/>
@@ -360,52 +298,7 @@
                       </el-card>
                     </div>
                     <div v-if="item.contentType == 4">
-                      <el-card class="box-card">
-
-                        <el-form-item label="选择课程">
-                          <el-select
-                            v-model="item.courseId"
-                            placeholder="请选择课程"
-                            style="margin-right: 10px"
-                            size="mini"
-                            @change="handleRuleCourseChange(item)"
-                          >
-                            <el-option
-                              v-for="dict in courseList"
-                              :key="dict.dictValue"
-                              :label="dict.dictLabel"
-                              :value="parseInt(dict.dictValue)"
-                            />
-                          </el-select>
-                          <el-select
-                            v-model="item.videoId"
-                            placeholder="请选择小节"
-                            size="mini"
-                            style="margin-right: 10px"
-                            filterable
-                            remote
-                            :remote-method="(query) => remoteMethodRuleVideo(query, item)"
-                            :loading="videoOptionsLoading"
-                            @change="handleRuleVideoChange(item)"
-                          >
-                            <el-option
-                              v-for="dict in videoOptions || []"
-                              :key="dict.dictValue"
-                              :label="dict.dictLabel"
-                              :value="parseInt(dict.dictValue)"
-                            />
-                          </el-select>
-                        </el-form-item>
 
-                        <el-card class="box-card" style="margin-top: 10px">
-                          <el-form-item label="标题" prop="miniprogramTitle">
-                            <el-input v-model="item.miniprogramTitle" placeholder="请输入小程序消息标题,最长为64字" />
-                          </el-form-item>
-                          <el-form-item label="封面" prop="miniprogramPicUrl">
-                            <ImageUpload v-model="item.miniprogramPicUrl" type="image" :num="10" :width="150" :height="150" />
-                          </el-form-item>
-                        </el-card>
-                      </el-card>
                     </div>
                     <div v-if="item.contentType == 5 ">
 
@@ -443,7 +336,7 @@
                         </video>
                       </el-form-item>
                     </div>
-                    <div v-if="item.contentType == 7 || item.contentType == 16">
+                    <div v-if="item.contentType == 7 ">
                       <el-input
                         v-model="item.value"
                         type="textarea" :rows="3" maxlength="66" show-word-limit
@@ -451,44 +344,7 @@
                         @input="handleInputVideoText(item.value,item)"/>
                     </div>
                     <div v-if="item.contentType == 8">
-                      <el-button type="primary"
-                                 style="margin-bottom: 1%"
-                                 @click="hanldeSelectVideoNum(setting,index)">
-                        选择视频号
-                      </el-button>
-                      <el-card class="box-card" v-if="item.coverUrl">
-                        <el-form-item label="封面标题:" label-width="100px">
-                          <el-input v-model="item.nickname"
-                                    style="width: 90%;margin-bottom: 1%" disabled/>
-                        </el-form-item>
-                        <el-form-item label="头像:" label-width="100px">
-                          <el-image
-                            v-if="item.avatar != null"
-                            :src="item.avatar"
-                            :preview-src-list="[item.avatar]"
-                            :style="{ width: '50px', height: '50px' }"
-                          ></el-image>
-                        </el-form-item>
-                        <el-form-item label="封面:" label-width="100px">
-                          <el-image
-                            v-if="item.coverUrl != null"
-                            :src="item.coverUrl"
-                            :preview-src-list="[item.coverUrl]"
-                            :style="{ width: '200px', height: '200px' }"
-                          ></el-image>
 
-                        </el-form-item>
-                        <el-form-item label="简介:" label-width="100px">
-                          <el-input type="textarea" :rows="3"
-                                    v-model="item.desc"
-                                    style="width: 90%;margin-top: 1%;" disabled/>
-                        </el-form-item>
-                        <el-form-item label="视频地址:" label-width="100px"
-                                      style="margin-top: 1%">
-                          <el-input v-model="item.url"
-                                    style="width: 90%;" disabled/>
-                        </el-form-item>
-                      </el-card>
                     </div>
 
                   </el-form-item>
@@ -515,7 +371,7 @@
           <span v-if="form.isAllCompanyUser == '1'" style="margin-left: 10px;color: #13ce66">是</span>
           <span v-else style="margin-left: 10px;color: #ff4949">否</span>
         </el-form-item>
-        <el-form-item label="所属销售" prop="companyUserIds" v-if="!form.id && form.isAllCompanyUser == '2'">
+        <el-form-item label="所属销售" prop="companyUserIds" v-if="!form.id">
           <el-select v-model="companyUserIds" remote multiple placeholder="请选择" filterable style="width: 100%;">
             <el-option
               v-for="dict in userList"
@@ -531,34 +387,22 @@
         <el-button @click="cancel">取 消</el-button>
       </div>
     </el-dialog>
-    <el-dialog :title="videoNumOptions.title" :visible.sync="videoNumOptions.open" width="1500px" append-to-body>
-      <userVideo ref="QwUserVideo" @videoResult="qwUserVideoResult"></userVideo>
-    </el-dialog>
   </div>
 </template>
 
 <script>
+import {getCompanyList} from "@/api/company/company";
 import { listCourseFinishTempParent, getCourseFinishTempParent, delCourseFinishTempParent, addCourseFinishTempParent, updateCourseFinishTempParent, exportCourseFinishTempParent } from "@/api/course/courseFinishTempParent";
-import {courseList, videoList} from '@/api/qw/sop'
+import {courseList} from '@/api/qw/sop'
 import ImageUpload from '@/views/qw/sop/ImageUpload.vue'
 import { getUserList } from '@/api/company/companyUser'
-import userVideo from "@/views/qw/userVideo/userVideo.vue";
 
 
 export default {
   name: "CourseFinishTempParent",
-  components: { ImageUpload ,userVideo},
+  components: { ImageUpload },
   data() {
     return {
-      videoOptionsLoading: false,
-      videoOptions: [],
-      videoLoading: false,
-      videoNumOptions: {
-        title: '选择视频号',
-        open: false,
-        content: null,
-        contentIndex: null,
-      },
       voiceLoading: false,
       uploadUrl: process.env.VUE_APP_BASE_API + "/common/uploadOSS2",
       uploadUrlByVoice: process.env.VUE_APP_BASE_API + "/common/uploadOSSByHOOKVoice",
@@ -592,6 +436,7 @@ export default {
       open: false,
       // 模板表格数据
       setting: [],
+      companyList: [],
       chatSetting: [],
       // 查询参数
       queryParams: {
@@ -599,9 +444,10 @@ export default {
         pageSize: 10,
         name: null,
         courseId: null,
+        companyId: null
       },
       // 表单参数
-      form: {companyUserIds: [],},
+      form: {},
       // 表单校验
       rules: {
         name:[
@@ -628,92 +474,15 @@ export default {
     this.getDicts("sys_qwSopAi_contentType").then(response => {
       this.sysQwSopAiContentType = response.data;
     });
-    getUserList().then(response => {
-      this.userList = response.data;
-    });
     courseList().then(response => {
       this.courseList = response.list;
     });
+    getCompanyList().then(response => {
+      this.companyList = response.data;
+    });
     this.getList();
   },
   methods: {
-    // 处理规则中课程变化
-    handleRuleCourseChange(item) {
-      // 为当前规则项单独加载视频列表
-      videoList(item.courseId).then((response) => {
-        // 只保存视频列表,不保存整个响应对象
-        this.videoOptions = response.list;
-
-        this.$set(item, 'videoId', null); // Reset video selection when course changes
-
-        // 自动设置封面为课程封面
-        const selectedCourse = this.courseList.find(
-          course => parseInt(course.dictValue) === item.courseId
-        );
-        if (selectedCourse) {
-          this.$set(item, 'miniprogramPicUrl', selectedCourse.dictImgUrl);
-        }
-      });
-    },
-
-
-    // 处理规则中视频变化
-    handleRuleVideoChange(item) {
-      if (!item.videoId) return;
-
-      // 自动设置标题为视频标题
-      const selectedVideo = (this.videoOptions || []).find(
-        video => parseInt(video.dictValue) === item.videoId
-      );
-      if (selectedVideo) {
-        this.$set(item, 'miniprogramTitle', selectedVideo.dictLabel);
-      }
-    },
-
-    // 远程搜索规则中的视频
-    remoteMethodRuleVideo(query, item) {
-      if (!item.courseId) {
-        this.$message.warning('请先选择课程');
-        this.videoOptions = [];
-        reject();
-        return;
-      }
-
-      this.videoOptionsLoading = true;
-      const data = query ? { title: query } : {};
-
-      videoList(item.courseId, data).then((response) => {
-        this.videoOptions =  response.list;
-        this.videoOptionsLoading =  false;
-        resolve(response);
-      }).catch((error) => {
-        this.videoOptionsLoading = false;
-        reject(error);
-      });
-    },
-    remoteMethodVideo(query) {
-      if (!this.form.courseId) {
-        this.$message.warning('请先选择课程');
-        this.videoList = []; // 清空小节列表
-        return;
-      }
-      if (query !== '') {
-        this.videoLoading = true;
-        // 这里调用接口搜索小节,假设 videoList 方法支持搜索参数
-        var data = {
-          title:query
-        }
-        videoList(this.form.courseId, data).then((response) => {
-          this.videoList = response.list;
-          this.videoLoading = false;
-        });
-      } else {
-        // 如果查询为空,则加载全部
-        videoList(this.form.courseId).then((response) => {
-          this.videoList = response.list;
-        });
-      }
-    },
     /** 查询完课模板列表 */
     getList() {
       this.loading = true;
@@ -723,6 +492,11 @@ export default {
         this.loading = false;
       });
     },
+    loadUser(){
+      getUserList(this.form.companyId).then(response => {
+        this.userList = response.data;
+      });
+    },
     // 取消按钮
     cancel() {
       this.open = false;
@@ -733,6 +507,7 @@ export default {
       this.form = {
         id: null,
         status: 1,
+        companyId: null,
         name: null,
         setting: [],
         chatSetting: [],
@@ -742,10 +517,8 @@ export default {
         updateBy: null,
         updateTime: null,
         companyUserIds: null,
-        remark: null,
-        isAllCompanyUser: 2
+        remark: null
       };
-      this.resetForm("form");
     },
     /** 搜索按钮操作 */
     handleQuery() {
@@ -769,31 +542,6 @@ export default {
       this.open = true;
       this.title = "添加完课模板";
     },
-    //选择视频号
-    hanldeSelectVideoNum(content, index) {
-      this.videoNumOptions.content = content;
-      this.videoNumOptions.contentIndex = index;
-      this.videoNumOptions.open = true;
-    },
-
-    qwUserVideoResult(val) {
-
-      // 根据选中的内容,将返回的数据更新到相应的表单项
-      const content = this.videoNumOptions.content;
-      const setList = content[this.videoNumOptions.contentIndex];
-      setList.nickname = val.nickname;
-      setList.avatar = val.avatar;
-      setList.coverUrl = val.coverUrl;
-      setList.thumbUrl = val.thumbUrl;
-      setList.desc = val.desc;
-      setList.url = val.url;
-      setList.extras = val.extras;
-      setList.videoId = val.id;
-      console.info(setList)
-
-      this.videoNumOptions.open = false;
-
-    },
     /** 修改按钮操作 */
     handleUpdate(row) {
       this.reset();
@@ -820,19 +568,7 @@ export default {
             }
             this.form.companyUserIds = this.companyUserIds.toString()
 
-
-            const processedSetting = this.setting.map(item => {
-              const newItem = {...item};
-              if (newItem.videoOptions) {
-                delete newItem.videoOptions;
-              }
-              if (newItem.videoLoading !== undefined) {
-                delete newItem.videoLoading;
-              }
-              return newItem;
-            });
-
-            this.form.setting = JSON.stringify(processedSetting);
+            this.form.setting = JSON.stringify(this.setting)
             this.form.chatSetting = JSON.stringify(this.chatSetting)
 
             if (this.setting.length <= 0) {
@@ -868,7 +604,6 @@ export default {
               }
             }
             addCourseFinishTempParent(this.form).then(response => {
-              // this.loading = true
               this.msgSuccess("新增成功");
               this.open = false;
               this.getList();
@@ -881,30 +616,30 @@ export default {
     handleDelete(row) {
       const ids = row.id || this.ids;
       this.$confirm('是否确认删除完课模板编号为"' + ids + '"的数据项?', "警告", {
-          confirmButtonText: "确定",
-          cancelButtonText: "取消",
-          type: "warning"
-        }).then(function() {
-          return delCourseFinishTempParent(ids);
-        }).then(() => {
-          this.getList();
-          this.msgSuccess("删除成功");
-        }).catch(() => {});
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(function() {
+        return delCourseFinishTempParent(ids);
+      }).then(() => {
+        this.getList();
+        this.msgSuccess("删除成功");
+      }).catch(() => {});
     },
     /** 导出按钮操作 */
     handleExport() {
       const queryParams = this.queryParams;
       this.$confirm('是否确认导出所有完课模板数据项?', "警告", {
-          confirmButtonText: "确定",
-          cancelButtonText: "取消",
-          type: "warning"
-        }).then(() => {
-          this.exportLoading = true;
-          return exportCourseFinishTempParent(queryParams);
-        }).then(response => {
-          this.download(response.msg);
-          this.exportLoading = false;
-        }).catch(() => {});
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        this.exportLoading = true;
+        return exportCourseFinishTempParent(queryParams);
+      }).then(response => {
+        this.download(response.msg);
+        this.exportLoading = false;
+      }).catch(() => {});
     },
 
 
@@ -985,7 +720,7 @@ export default {
       }
     },
     jump(id){
-      this.$router.push('/qw/conversion/courseFinishTemp/' + id)
+      this.$router.push('/course/courseFinishTemp/' + id)
     },
   },
 };

+ 215 - 198
src/views/course/courseRedPacketLog/index.vue

@@ -1,53 +1,78 @@
 <template>
   <div class="app-container">
     <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+      <!--		<el-form-item label="公司名" prop="companyId">-->
+      <!--		     <el-select filterable  v-model="queryParams.companyId" placeholder="请选择公司名"  clearable size="small">-->
+      <!--		         <el-option-->
+      <!--		           v-for="item in companys"-->
+      <!--		           :key="item.companyId"-->
+      <!--		           :label="item.companyName"-->
+      <!--		           :value="item.companyId"-->
+      <!--		         />-->
+      <!--		   </el-select>-->
+      <!--		 </el-form-item>-->
+      <el-form-item label="公司名" prop="companyId">
+        <select-tree
+          v-model="selectedCompanyList"
+          :raw-data="deptList"
+          placeholder="请选择销售"
+          :parentSelectable="true"
+          :multiple="true"
+          component-width="300px"
+          :max-display-tags="3"
+          :check-strictly="false"
+          :return-leaf-only="false"
+        ></select-tree>
+      </el-form-item>
+      <!--    <el-form-item label="部门" prop="type">-->
+      <!--      <TreeselectVue-->
+      <!--        style="width: 220px"-->
+      <!--        :clearable="false"-->
+      <!--        v-model="queryParams.deptId"-->
+      <!--        :options="deptOptions"-->
+      <!--        clearable-->
+      <!--        :show-count="true"-->
+      <!--        placeholder="请选择归属部门"-->
+      <!--      />-->
+      <!--    </el-form-item>-->
+      <el-form-item label="员工" prop="companyUserName">
+        <el-input
+          v-model="queryParams.companyUserName"
+          placeholder="所属员工"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </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="companyUserName">
-		  <el-input
-		    v-model="queryParams.companyUserName"
-		    placeholder="员工"
-		    clearable
-		    size="small"
-		    @keyup.enter.native="handleQuery"
-		  />
-		</el-form-item>
+      <el-form-item label="电话" prop="phone">
+        <el-input
+          v-model="queryParams.phone"
+          placeholder="请输入电话"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="加密电话" prop="phoneMk">
+        <el-input
+          v-model="queryParams.phoneMk"
+          placeholder="请输入电话"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </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="nickName">
-      <el-input
-        v-model="queryParams.nickName"
-        placeholder="请输入用户昵称"
-        clearable
-        size="small"
-        @keyup.enter.native="handleQuery"
-      />
-    </el-form-item>
-	  <el-form-item label="电话" prop="phone">
-	    <el-input
-	      v-model="queryParams.phone"
-	      placeholder="请输入电话"
-	      clearable
-	      size="small"
-	      @keyup.enter.native="handleQuery"
-	    />
-	  </el-form-item>
-	  <el-form-item label="加密电话" prop="phoneMk">
-	    <el-input
-	      v-model="queryParams.phoneMk"
-	      placeholder="请输入电话"
-	      clearable
-	      size="small"
-	      @keyup.enter.native="handleQuery"
-	    />
-	  </el-form-item>
       <el-form-item label="营期" prop="courseId">
         <el-select
           v-model="queryParams.periodId"
@@ -70,29 +95,29 @@
       </el-form-item>
 
       <el-form-item label="课程" prop="courseId">
-		     <el-select filterable  v-model="queryParams.courseId" placeholder="请选择课程"  clearable size="small" @change="courseChange(queryParams.courseId)">
-		         <el-option
-		           v-for="dict in courseLists"
-		           :key="dict.dictValue"
-		           :label="dict.dictLabel"
-		           :value="parseInt(dict.dictValue)"
-		         />
-		   </el-select>
-		 </el-form-item>
-		<el-form-item label="小节" prop="videoId">
-       <el-select filterable  v-model="queryParams.videoId" placeholder="请选择小节"  clearable size="small">
-           <el-option
-             v-for="dict in videoList"
-             :key="dict.dictValue"
-             :label="dict.dictLabel"
-             :value="parseInt(dict.dictValue)"
-           />
-     </el-select>
-	</el-form-item>
-	 <el-form-item label="创建时间" prop="createTime">
-	           <el-date-picker v-model="createTime" size="small" style="width: 220px" value-format="yyyy-MM-dd" type="daterange"
-                             range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期" @change="change"></el-date-picker>
-	 </el-form-item>
+        <el-select filterable  v-model="queryParams.courseId" placeholder="请选择课程"  clearable size="small" @change="courseChange(queryParams.courseId)">
+          <el-option
+            v-for="dict in courseLists"
+            :key="dict.dictValue"
+            :label="dict.dictLabel"
+            :value="parseInt(dict.dictValue)"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="小节" prop="videoId">
+        <el-select filterable  v-model="queryParams.videoId" placeholder="请选择小节"  clearable size="small">
+          <el-option
+            v-for="dict in videoList"
+            :key="dict.dictValue"
+            :label="dict.dictLabel"
+            :value="parseInt(dict.dictValue)"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="创建时间" prop="createTime">
+        <el-date-picker v-model="createTime" size="small" style="width: 220px" value-format="yyyy-MM-dd HH:mm:ss" 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>
@@ -112,69 +137,39 @@
           v-hasPermi="['course:courseRedPacketLog:export']"
         >导出</el-button>
       </el-col>
-      <el-col :span="1.5">
-        <el-button
-          type="warning"
-          plain
-          icon="el-icon-download"
-          size="mini"
-          :loading="exportLoading"
-          @click="handleRetry"
-        >重新发送</el-button>
-      </el-col>
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
     <el-tabs type="card" v-model="activeName" @tab-click="handleClick">
-      <el-tab-pane label="全部订单" name="00"></el-tab-pane>
+      <el-tab-pane label="全部" name="00"></el-tab-pane>
       <el-tab-pane label="待发送" name="0"></el-tab-pane>
       <el-tab-pane label="已发送" name="1"></el-tab-pane>
-      <el-tab-pane label="待补发" name="2"></el-tab-pane>
     </el-tabs>
     <el-table border v-loading="loading" :data="courseRedPacketLogList" @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="logId" />-->
       <el-table-column label="批次单号" align="center" prop="outBatchNo" />
       <el-table-column label="营期名称" align="center" prop="periodName" />
-      <el-table-column label="课程名称" align="center" prop="courseName" />
-      <el-table-column label="小节名称" align="center" prop="title" />
-      <el-table-column label="会员id" align="center" prop="userId" />
-      <el-table-column label="会员昵称" align="center" prop="fsNickName">
+      <el-table-column label="课程名称" align="center" prop="courseId" >
         <template slot-scope="scope">
-          <div style="display: flex;white-space: nowrap">
-            <div style="margin: auto">
-              {{scope.row.fsNickName}}
-            </div>
-            <el-popover
-              placement="right"
-              title=""
-              trigger="hover">
-              <img slot="reference" :src="scope.row.fsAvatar" style="width: 30px;height: 30px">
-              <img :src="scope.row.fsAvatar" style="max-width: 200px;max-height: 200px">
-            </el-popover>
-          </div>
+          <span prop="status" v-for="(item, index) in courseLists"    v-if="scope.row.courseId==item.dictValue">{{item.dictLabel}}</span>
         </template>
       </el-table-column>
+      <el-table-column label="小节名称" align="center" prop="title" />
+      <el-table-column label="会员id" align="center" prop="userId" />
+      <el-table-column label="会员名称" align="center" prop="fsNickName" />
       <el-table-column label="会员电话" align="center" prop="phone" />
-      <el-table-column label="所属销售" align="center" prop="companyUserName" />
+      <el-table-column label="所属员工" align="center" prop="companyUserName" />
       <el-table-column label="所属公司" align="center" prop="companyName" />
-      <el-table-column label="企微员工名称" align="center" prop="qwUserName" />
-      <el-table-column label="转金额" align="center" prop="amount" />
+      <el-table-column label="员工部门" align="center" prop="deptName" />
+      <el-table-column label="转帐金额" align="center" prop="amount" />
       <el-table-column label="状态" align="center" prop="status" >
         <template slot-scope="scope">
-          <el-tag>{{ scope.row.status === 0 ? "发送中" : scope.row.status === 1 ? "已完成" : "待补发" }}</el-tag>
+          <el-tag>{{ scope.row.status === 0 ? "发送中" : "已完成" }}</el-tag>
         </template>
       </el-table-column>
       <el-table-column label="企微账号" align="center" prop="qwUserName" />
       <el-table-column label="创建时间" align="center" prop="createTime" />
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
-          <template slot-scope="scope">
-            <el-button v-if="scope.row.status==2"
-              size="mini"
-              type="text"
-              @click="handleRetry(scope.row)"
-            >重新发送</el-button>
-          </template>
-        </el-table-column>
+
     </el-table>
 
     <pagination
@@ -197,14 +192,14 @@
         <el-form-item label="小节id" prop="videoId">
           <el-input v-model="form.videoId" placeholder="请输入小节id" />
         </el-form-item>
-        <el-form-item label="公司员工id" prop="companyUserId">
-          <el-input v-model="form.companyUserId" placeholder="请输入公司员工id" />
+        <el-form-item label="员工id" prop="companyUserId">
+          <el-input v-model="form.companyUserId" placeholder="请输入员工id" />
         </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="转金额" prop="amount">
-          <el-input v-model="form.amount" placeholder="请输入转金额" />
+        <el-form-item label="转金额" prop="amount">
+          <el-input v-model="form.amount" placeholder="请输入转金额" />
         </el-form-item>
         <el-form-item label="企微userid" prop="qwUserId">
           <el-input v-model="form.qwUserId" placeholder="请输入分享企微userid" />
@@ -219,15 +214,21 @@
 </template>
 
 <script>
-import { courseList,videoList,listCourseRedPacketLog,retryCourseRedPacketLog, myListCourseRedPacketLogNew, getCourseRedPacketLog, delCourseRedPacketLog, addCourseRedPacketLog, updateCourseRedPacketLog, exportCourseRedPacketLog } from "@/api/course/courseRedPacketLog";
+import { courseList,videoList,getCourseRedPacketLog, delCourseRedPacketLog, addCourseRedPacketLog, updateCourseRedPacketLog, exportCourseRedPacketLog,listCourseRedPacketLogPage } from "@/api/course/courseRedPacketLog";
 import { getCompanyList } from "@/api/company/company";
 import { periodList } from "@/api/course/userCoursePeriod";
+import {treeselect} from "../../../api/company/companyDept";
+import SelectTree from '@/components/TreeSelect/index.vue'
+import { getDeptData } from '@/api/system/employeeStats'
+
 export default {
   name: "CourseRedPacketLog",
+  components: {SelectTree},
   data() {
     return {
-	  companys:[],
-	  deptOptions:[],
+      companys:[],
+      selectedCompanyList: [],
+      deptList: [],
       // 遮罩层
       loading: true,
       loadingPeriod: false,
@@ -253,14 +254,16 @@ export default {
       title: "",
       // 是否显示弹出层
       open: false,
+      queryPeriod: {
+        pageNum: 1,
+        pageSize: 20
+      },
       // 查询参数
       queryParams: {
         pageNum: 1,
         pageSize: 10,
         courseId: null,
-        periodId: null,
         userId: null,
-        nickName:null,
         videoId: null,
         companyUserId: null,
         companyId: null,
@@ -271,12 +274,9 @@ export default {
         phoneMk: null,
         sTime:null,
         eTime:null,
+        userIds: null
       },
-      queryPeriod: {
-        pageNum: 1,
-        pageSize: 20
-      },
-	   createTime:null,
+      createTime:null,
       // 表单参数
       form: {},
       // 表单校验
@@ -286,18 +286,22 @@ export default {
   },
   created() {
     this.getList();
-	    getCompanyList().then(response => {
-	    this.companys = response.data;
-	  });
-	  courseList().then(response => {
-	    this.courseLists = response.list;
-	  });
+    getCompanyList().then(response => {
+      this.companys = response.data;
+    });
+    courseList().then(response => {
+      this.courseLists = response.list;
+    });
+    getDeptData().then(response => {
+      this.deptList = response.data;
+    })
     periodList(this.queryPeriod).then(response => {
       this.periodLists = response.data;
     });
+
+    // this.getList();
   },
   methods: {
-
     // 远程搜索方法
     async remoteMethod(query) {
       this.searchKeyword = query
@@ -336,43 +340,50 @@ export default {
 
 
     handleClick(tab, event) {
-	    this.activeName=tab.name;
-	    this.queryParams.status=tab.name
-	    console.log(this.queryParams.status)
-	    this.getList();
-	  },
+      this.activeName=tab.name;
+      if(tab.name == "00") {
+        this.queryParams.status = null;
+      } else {
+        this.queryParams.status = tab.name;
+      }
+      this.getList();
+    },
     /** 查询短链课程看课记录列表 */
     getList() {
       this.loading = true;
-      listCourseRedPacketLog(this.queryParams).then(response => {
-        this.courseRedPacketLogList = response.rows;
-        this.total = response.total;
+      if(this.selectedCompanyList != null && this.selectedCompanyList.length > 0) {
+        this.queryParams.userIds = this.selectedCompanyList;
+      }else {
+        this.queryParams.userIds = [];
+      }
+      listCourseRedPacketLogPage(this.queryParams).then(response => {
+        this.courseRedPacketLogList = response.data.list;
+        this.total = response.data.total;
         this.loading = false;
-      });
+      })
     },
-	change(){
-	      if(this.createTime!=null){
-	        this.queryParams.sTime=this.createTime[0];
-	        this.queryParams.eTime=this.createTime[1];
-	      }else{
-	        this.queryParams.sTime=null;
-	        this.queryParams.eTime=null;
-	      }
-
-	    },
-	courseChange(row){
+    change(){
+      if(this.createTime!=null){
+        this.queryParams.sTime=this.createTime[0];
+        this.queryParams.eTime=this.createTime[1];
+      }else{
+        this.queryParams.sTime=null;
+        this.queryParams.eTime=null;
+      }
 
-		if(row==""){
-			this.videoList=[]
-			this.queryParams.videoId=null
-		}else{
-			videoList(row).then(response => {
+    },
+    courseChange(row){
+      if(row==""){
+        this.videoList=[]
+        this.queryParams.videoId=null
+      }else{
+        videoList(row).then(response => {
 
-				this.videoList=response.list
-			});
-		}
+          this.videoList=response.list
+        });
+      }
 
-	},
+    },
     // 取消按钮
     cancel() {
       this.open = false;
@@ -383,7 +394,6 @@ export default {
       this.form = {
         logId: null,
         courseId: null,
-        periodId: null,
         userId: null,
         videoId: null,
         companyUserId: null,
@@ -402,10 +412,13 @@ export default {
     /** 重置按钮操作 */
     resetQuery() {
       this.resetForm("queryForm");
-	   this.createTime=null;
-	  this.queryParams.sTime=null;
-	  this.queryParams.eTime=null;
-	  this.queryParams.periodId=null;
+      this.createTime=null;
+      this.queryParams.sTime=null;
+      this.queryParams.eTime=null;
+      this.selectedCompanyList = [];
+      this.queryParams.pageNum = 1;    // Reset to first page
+      this.queryParams.pageSize = 10;  // Reset to default page size
+      this.queryParams.periodId=null;
       this.handleQuery();
     },
     // 多选框选中数据
@@ -451,45 +464,49 @@ export default {
       });
     },
     /** 删除按钮操作 */
-    handleRetry(row) {
+    handleDelete(row) {
       const logIds = row.logId || this.ids;
-      this.$confirm('是否确认重新发送红包?', "警告", {
-          confirmButtonText: "确定",
-          cancelButtonText: "取消",
-          type: "warning"
-        }).then(function() {
-          return retryCourseRedPacketLog(logIds);
-        }).then((response) => {
-          this.getList();
-
-          this.msgSuccess(response.msg); // Fallback message
-
-        }).catch(() => {});
+      this.$confirm('是否确认删除短链课程看课记录编号为"' + logIds + '"的数据项?', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(function() {
+        return delCourseRedPacketLog(logIds);
+      }).then(() => {
+        this.getList();
+        this.msgSuccess("删除成功");
+      }).catch(() => {});
     },
-	getSubCateList(pid){
-	  this.form.subCateId=null;
-	  if(pid == ''){
-	    this.subCategoryOptions=[];
-	    return
-	  }
-	  getCateListByPid(pid).then(response => {
-	    this.subCategoryOptions = response.data;
-	  });
-	},
     /** 导出按钮操作 */
     handleExport() {
+      if(this.selectedCompanyList != null && this.selectedCompanyList.length > 0) {
+        this.queryParams.userIds = this.selectedCompanyList;
+      }else {
+        this.queryParams.userIds = [];
+      }
       const queryParams = this.queryParams;
       this.$confirm('是否确认导出所有短链课程看课记录数据项?', "警告", {
-          confirmButtonText: "确定",
-          cancelButtonText: "取消",
-          type: "warning"
-        }).then(() => {
-          this.exportLoading = true;
-          return exportCourseRedPacketLog(queryParams);
-        }).then(response => {
-          this.download(response.msg);
-          this.exportLoading = false;
-        }).catch(() => {});
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        const loadingInstance = this.$loading({
+          lock: true,
+          text: '正在导出数据,请稍候...',
+          background: 'rgba(0, 0, 0, 0.7)'
+        });
+
+        this.exportLoading = true;
+        // return exportCourseRedPacketLog(queryParams);
+        return exportCourseRedPacketLog(queryParams).finally(res=>{
+          loadingInstance.close();
+        })
+      }).then(response => {
+        this.download(response.msg);
+        this.exportLoading = false;
+      }).catch(() => {}).finally(res=>{
+
+      });
     }
   }
 };

+ 7 - 5
src/views/course/courseUserStatistics/index.vue

@@ -242,11 +242,13 @@ export default {
     this.getDicts("sys_course_project").then(response => {
       this.projectLists = response.data;
     })
-    getUserList().then(res=>{
-      if(res.code === 200) {
-        this.companyUserList = res.data
-      }
-    })
+    if (this.queryParams.companyId != null) {
+      getUserList(this.queryParams.companyId).then(res=>{
+        if(res.code === 200) {
+          this.companyUserList = res.data
+        }
+      })
+    }
   },
   methods: {
     courseChange(row){

File diff suppressed because it is too large
+ 161 - 852
src/views/course/courseWatchLog/index.vue


+ 7 - 5
src/views/crm/components/customerDetails.vue

@@ -564,7 +564,7 @@ export default {
             getCustomerDetails1(data).then(response => {
                 this.item = response.customer
                 this.isReceive = response.isReceive
-                if (this.item.extJson != null) {
+                if (this.item && this.item.extJson != null) {
                     var extList = JSON.parse(this.item.extJson)
                     that.exts.forEach(item => {
                         extList.forEach(element => {
@@ -574,10 +574,12 @@ export default {
                         })
                     })
                 }
-                this.activeName = 'visit'
-                setTimeout(() => {
-                    that.$refs.visit.getData(customerId)
-                }, 500)
+                if (this.item) {
+                    this.activeName = 'visit'
+                    setTimeout(() => {
+                        that.$refs.visit.getData(customerId)
+                    }, 500)
+                }
             })
         },
         initDuplicate(isDuplicate, dCustomerId) {

+ 6 - 4
src/views/fastGpt/fastGptChatReplaceWords/index.vue

@@ -43,7 +43,7 @@
 </template>
 
 <script>
-import { listFastgptFastgptchatreplacewords, getFastgptFastgptchatreplacewords, delFastgptFastgptchatreplacewords, addFastgptFastgptchatreplacewords, updateFastgptFastgptchatreplacewords, exportFastgptFastgptchatreplacewords } from "@/api/fastGpt/fastGptChatReplaceWords";
+import { listFastGptChatReplaceWords, getFastGptChatReplaceWords, delFastGptChatReplaceWords, addFastGptChatReplaceWords, updateFastGptChatReplaceWords, exportFastGptChatReplaceWords } from "@/api/fastGpt/fastGptChatReplaceWords";
 
 export default {
   name: "FastgptFastgptchatreplacewords",
@@ -69,7 +69,7 @@ export default {
   methods: {
     getList() {
       this.loading = true;
-      listFastgptFastgptchatreplacewords(this.queryParams).then(response => {
+      listFastGptChatReplaceWords(this.queryParams).then(response => {
         this.list = response.rows;
         this.total = response.total;
         this.loading = false;
@@ -96,14 +96,16 @@ export default {
     },
     handleDelete(row) {
       this.$modal.confirm("是否确认删除?").then(() => {
-        return delFastgptFastgptchatreplacewords(row.id || this.ids);
+        return delFastGptChatReplaceWords(row.id || this.ids);
       }).then(() => {
         this.getList();
         this.$modal.msgSuccess("删除成功");
       }).catch(() => {});
     },
     handleExport() {
-      this.download("fastGpt/fastGptChatReplaceWords/export", { ...this.queryParams }, `违规词语.xlsx`);
+      exportFastGptChatReplaceWords(this.queryParams).then(response => {
+        this.download(response.msg);
+      });
     }
   }
 };

+ 6 - 4
src/views/fastGpt/fastgptChatArtificialWords/index.vue

@@ -43,7 +43,7 @@
 </template>
 
 <script>
-import { listFastgptFastgptchatartificialwords, getFastgptFastgptchatartificialwords, delFastgptFastgptchatartificialwords, addFastgptFastgptchatartificialwords, updateFastgptFastgptchatartificialwords, exportFastgptFastgptchatartificialwords } from "@/api/fastGpt/fastgptChatArtificialWords";
+import { listFastgptChatArtificialWords, getFastgptChatArtificialWords, delFastgptChatArtificialWords, addFastgptChatArtificialWords, updateFastgptChatArtificialWords, exportFastgptChatArtificialWords } from "@/api/fastGpt/fastgptChatArtificialWords";
 
 export default {
   name: "FastgptFastgptchatartificialwords",
@@ -69,7 +69,7 @@ export default {
   methods: {
     getList() {
       this.loading = true;
-      listFastgptFastgptchatartificialwords(this.queryParams).then(response => {
+      listFastgptChatArtificialWords(this.queryParams).then(response => {
         this.list = response.rows;
         this.total = response.total;
         this.loading = false;
@@ -96,14 +96,16 @@ export default {
     },
     handleDelete(row) {
       this.$modal.confirm("是否确认删除?").then(() => {
-        return delFastgptFastgptchatartificialwords(row.id || this.ids);
+        return delFastgptChatArtificialWords(row.id || this.ids);
       }).then(() => {
         this.getList();
         this.$modal.msgSuccess("删除成功");
       }).catch(() => {});
     },
     handleExport() {
-      this.download("fastGpt/fastgptChatArtificialWords/export", { ...this.queryParams }, `转人工提示词.xlsx`);
+      exportFastgptChatArtificialWords(this.queryParams).then(response => {
+        this.download(response.msg);
+      });
     }
   }
 };

+ 3 - 3
src/views/hisStore/components/productOrder.vue

@@ -759,7 +759,7 @@ export default {
       try {
         const res = await getCitys();
         this.citys = res.data;
-        this.province = res.data.filter(item => item.pid === 0);
+        this.province = res.data.filter(item => item.pid == 0);
         // 可选:返回数据以便链式调用
         return res.data;
       } catch (error) {
@@ -810,7 +810,7 @@ export default {
 
         // 获取城市列表
         if (Array.isArray(province.children)) {
-          this.city = province.children.filter(item => item.pid === province.value);
+          this.city = province.children.filter(item => item.pid == province.value);
 
           // 解析城市
           const cityName = addressParts[1];
@@ -821,7 +821,7 @@ export default {
 
             // 获取区县列表
             if (Array.isArray(city.children)) {
-              this.district = city.children.filter(item => item.pid === city.value);
+              this.district = city.children.filter(item => item.pid == city.value);
 
               // 解析区县
               const districtName = addressParts[2];

+ 3 - 25
src/views/login.vue

@@ -96,8 +96,7 @@ import { encrypt, decrypt } from '@/utils/jsencrypt'
 import { getFirstLogin } from "@/api/login";
 // import WechatLoginDialog from "@/views/WechatLoginDialog";
 import { setToken } from "@/utils/auth";
-import {getConfigByKey} from "@/api/system/config";
-import Vue from 'vue'
+import { loadRuntimeConfig } from '@/utils/runtimeConfig'
 
 export default {
   name: "Login",
@@ -155,29 +154,8 @@ export default {
     this.getCookie();
   },
   methods: {
-    // 重新加载运行时配置
-    async reloadRuntimeConfig() {
-
-      try {
-        const res = await getConfigByKey('his.adminUi.config')
-
-        const configValue = res?.data?.configValue
-        if (!configValue) return
-
-        // 后端配置 JSON
-        const form = JSON.parse(configValue)
-
-        // 直接更新全局配置
-        const config = {
-          VUE_APP_LIVE_WS_URL: form.liveWebSocketUrl || '',
-          VUE_APP_COURSE_DEFAULT: form.courseDefaultType || '1',
-        }
-        // 更新到全局
-        Vue.prototype.$runtimeConfig = config
-
-      } catch (error) {
-        console.error('重新加载运行时配置异常:', error)
-      }
+    reloadRuntimeConfig() {
+      return loadRuntimeConfig()
     },
     checkFirstLogin() {
       getFirstLogin().then(res => {

+ 7 - 5
src/views/qw/externalContact/customerDetails.vue

@@ -465,7 +465,7 @@
                 getCustomerDetails1(data).then(response => {
                     this.item = response.customer;
                     this.isReceive=response.isReceive;
-                    if(this.item.extJson!=null){
+                    if(this.item && this.item.extJson!=null){
                         var extList=JSON.parse(this.item.extJson);
                         that.exts.forEach(item => {
                             extList.forEach(element => {
@@ -476,10 +476,12 @@
 
                         });
                     }
-                    this.activeName="visit"
-                    setTimeout(() => {
-                        that.$refs.visit.getData(customerId);
-                    }, 500);
+                    if (this.item) {
+                        this.activeName="visit"
+                        setTimeout(() => {
+                            that.$refs.visit.getData(customerId);
+                        }, 500);
+                    }
                 });
             },
             initDuplicate(isDuplicate,dCustomerId){

+ 1 - 80
src/views/qw/qwCompany/index.vue

@@ -104,13 +104,6 @@
       <el-table-column label="创建时间" align="center" prop="createTime" width="180"/>
       <el-table-column label="更改时间" align="center" prop="updateTime" width="180"/>
       <el-table-column label="创建人" align="center" prop="createBy" />
-      <el-table-column label="租户" align="center" prop="tenantId" v-if="tenantCode == null">
-        <template slot-scope="scope">
-          <div>
-            <span v-for="item in tenantInfos" v-if="scope.row.tenantId==item.id">{{item.tenantName }} </span>
-          </div>
-        </template>
-      </el-table-column>
       <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
         <template slot-scope="scope">
           <el-button
@@ -127,14 +120,6 @@
             @click="handleDelete(scope.row)"
             v-hasPermi="['qw:qwCompany:remove']"
           >删除</el-button>
-          <el-button
-            size="mini"
-            type="text"
-            icon="el-icon-edit"
-            @click="handleTenant(scope.row)"
-            v-hasPermi="['qw:qwCompany:tenant']"
-            v-if="tenantCode==null"
-          >设置租户</el-button>
         </template>
       </el-table-column>
     </el-table>
@@ -253,33 +238,13 @@
       </div>
     </el-dialog>
 
-    <el-dialog :title="tenantDialog.title" :visible.sync="tenantDialog.open" width="500px" append-to-body>
-      <el-form ref="tenantForm" :model="tenantForm" label-width="200px">
-        <el-form-item label="租户">
-          <el-select filterable v-model="tenantForm.tenantId"  placeholder="请选择租户"  clearable>
-            <el-option
-              v-for="item in tenantInfos"
-              :key="item.id"
-              :label="item.tenantName"
-              :value="item.id"
-            />
-          </el-select>
-        </el-form-item>
-
-      </el-form>
-      <div slot="footer" class="dialog-footer">
-        <el-button type="primary" @click="submitTenantForm">确 定</el-button>
-        <el-button @click="cancelTenant">取 消</el-button>
-      </div>
-    </el-dialog>
   </div>
 </template>
 
 <script>
-import { listQwCompany, getQwCompany, delQwCompany, addQwCompany, updateQwCompany, exportQwCompany ,setTenant} from "@/api/qw/qwCompany";
+import { listQwCompany, getQwCompany, delQwCompany, addQwCompany, updateQwCompany, exportQwCompany } from "@/api/qw/qwCompany";
 import { getCompanyList } from "@/api/company/company";
 import { listAll } from '@/api/course/coursePlaySourceConfig'
-import { tenantList } from "@/api/tenant/tenant";
 export default {
   name: "QwCompany",
   watch: {
@@ -299,14 +264,6 @@ export default {
     },
   data() {
     return {
-      tenantForm:{
-        tenantId:null
-      },
-      tenantInfos:{},
-      tenantDialog:{
-        open: false,
-        title:"设置租户"
-      },
       // 遮罩层
       loading: true,
       // 导出遮罩层
@@ -374,15 +331,6 @@ export default {
         this.companys = response.data;
 
     });
-    tenantList({status:1}).then(response => {
-      this.tenantInfos =  response.rows;
-    });
-  },
-  computed: {
-    tenantCode() {
-      console.log("----------------",this.$store.state.user.tenantCode)
-      return this.$store.state.user.tenantCode
-    }
   },
   methods: {
     /** 查询企微主体列表 */
@@ -395,13 +343,6 @@ export default {
         this.loading = false;
       });
     },
-    cancelTenant(){
-      this.tenantDialog.open = false;
-      this.tenantForm = {
-          tenantId:null,
-          qwCompanyId:null
-      }
-    },
     // 取消按钮
     cancel() {
       this.open = false;
@@ -494,22 +435,6 @@ export default {
         this.title = "修改企微主体";
       });
     },
-    submitTenantForm(){
-      if(this.tenantForm.tenantId == null){
-        this.msgError("租户不能为空");
-        return;
-      }
-      if(this.tenantForm.qwCompanyId == null){
-        this.msgError("企微主体不能为空");
-        return;
-      }
-      console.log("----------------",this.tenantForm);
-      setTenant(this.tenantForm).then(response => {
-        this.msgSuccess("设置成功");
-        this.tenantDialog.open = false;
-        this.getList();
-      });
-    },
     /** 提交按钮 */
     submitForm() {
       this.$refs["form"].validate(valid => {
@@ -532,10 +457,6 @@ export default {
         }
       });
     },
-    handleTenant(row){
-      this.tenantForm.qwCompanyId = row.id
-      this.tenantDialog.open = true;
-    },
     /** 删除按钮操作 */
     handleDelete(row) {
       const ids = row.id || this.ids;

File diff suppressed because it is too large
+ 77 - 882
src/views/qw/sop/sop.vue


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