zyp 1 tuần trước cách đây
mục cha
commit
6bf7dcec2d
60 tập tin đã thay đổi với 1926 bổ sung3230 xóa
  1. 0 9
      src/api/company/companyUser.js
  2. 0 9
      src/api/course/courseAnswerlogs.js
  3. 0 9
      src/api/course/courseRedPacketLog.js
  4. 0 8
      src/api/course/courseWatchLog.js
  5. 0 9
      src/api/doctor/doctor.js
  6. 2 28
      src/api/qw/QwWorkTask.js
  7. 7 10
      src/api/qw/sopLogs.js
  8. 0 8
      src/api/qw/sopTemp.js
  9. 0 13
      src/api/qw/user.js
  10. 0 18
      src/api/store/package.js
  11. 1 19
      src/api/store/patient.js
  12. 2 2
      src/api/watch/deviceInfo.js
  13. BIN
      src/assets/logo/logo.png
  14. 0 13
      src/directive/select/elSelectLoadMore.js
  15. 0 8
      src/directive/select/index.js
  16. 0 2
      src/main.js
  17. 0 13
      src/router/index.js
  18. 4 2
      src/store/modules/user.js
  19. 13 66
      src/views/company/companyUser/index.vue
  20. 426 0
      src/views/course/Material/index.vue
  21. 2 10
      src/views/course/courseAnswerlogs/myCourseAnswerlogs.vue
  22. 33 148
      src/views/course/courseFinishTemp/index.vue
  23. 2 12
      src/views/course/courseRedPacketLog/myCourseRedPacketLog.vue
  24. 11 90
      src/views/course/courseWatchLog/index.vue
  25. 4 12
      src/views/course/courseWatchLog/myCourseWatchLog.vue
  26. 4 4
      src/views/course/courseWatchLog/watchLog.vue
  27. 1 1
      src/views/course/sop/SopDialog.vue
  28. 1 1
      src/views/course/sop/index.vue
  29. 2 2
      src/views/fastGpt/fastGptRole/fastGptRoleUpdate.vue
  30. 2 2
      src/views/login.vue
  31. 0 276
      src/views/qw/QwWorkTask/allTask.vue
  32. 188 186
      src/views/qw/QwWorkTask/index.vue
  33. 0 367
      src/views/qw/QwWorkTask/qwWorkTask.vue
  34. 73 35
      src/views/qw/autoTags/dayPartingIndex.vue
  35. 9 9
      src/views/qw/autoTags/dayPartingIndexDetails.vue
  36. 60 36
      src/views/qw/autoTags/groupIndex.vue
  37. 0 1
      src/views/qw/autoTags/groupIndexDetails.vue
  38. 288 117
      src/views/qw/externalContact/index.vue
  39. 256 29
      src/views/qw/externalContact/myExternalContact.vue
  40. 3 3
      src/views/qw/friendWelcome/indexNew.vue
  41. 1 1
      src/views/qw/groupMsgUser/groupMsg.vue
  42. 90 98
      src/views/qw/sop/addSop.vue
  43. 4 25
      src/views/qw/sop/sop.vue
  44. 1 1
      src/views/qw/sop/updateSop.vue
  45. 13 10
      src/views/qw/sopLogs/sopLogsList.vue
  46. 2 29
      src/views/qw/sopTemp/index.vue
  47. 1 8
      src/views/qw/sopTemp/sopTemp.vue
  48. 7 8
      src/views/qw/sopTemp/updateSopTemp.vue
  49. 1 0
      src/views/qw/sopUserLogs/sopUserLogsSchedule.vue
  50. 289 34
      src/views/qw/sopUserLogsInfo/sopUserLogsInfoDetails.vue
  51. 8 7
      src/views/qw/tagGroup/tagGroupList.vue
  52. 11 11
      src/views/qw/user/index.vue
  53. 0 206
      src/views/qw/user/qwUserListByCompany.vue
  54. 33 122
      src/views/store/inquiryOrder/list.vue
  55. 18 119
      src/views/store/packageOrder/list.vue
  56. 13 78
      src/views/store/prescribe/list.vue
  57. 29 128
      src/views/store/storeOrder/list.vue
  58. 2 4
      src/views/watch/deviceInfo/details.vue
  59. 9 122
      src/views/watch/deviceInfo/index.vue
  60. 0 632
      src/views/watch/deviceInfo/my.vue

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

@@ -215,12 +215,3 @@ export function updateCompanyUserAreaList(data) {
     data: data
   })
 }
-
- // 根据名称模糊查询用户列表
- export function getCompanyUserListLikeName(params) {
-  return request({
-      url: '/company/user/getCompanyUserListLikeName',
-      method: 'get',
-      params: params
-  })
-}

+ 0 - 9
src/api/course/courseAnswerlogs.js

@@ -60,12 +60,3 @@ export function exportLogs(query) {
     params: query
   })
 }
-
-// 导出答题日志
-export function exportLogsMy(query) {
-  return request({
-    url: '/course/courseAnswerLog/myExport',
-    method: 'get',
-    params: query
-  })
-}

+ 0 - 9
src/api/course/courseRedPacketLog.js

@@ -77,12 +77,3 @@ export function exportCourseRedPacketLog(query) {
     params: query
   })
 }
-
-// 导出短链课程看课记录
-export function exportCourseRedPacketLogMy(query) {
-  return request({
-    url: '/course/courseRedPacketLog/myExport',
-    method: 'get',
-    params: query
-  })
-}

+ 0 - 8
src/api/course/courseWatchLog.js

@@ -105,14 +105,6 @@ export function exportCourseWatchLog(query) {
   })
 }
 
-export function exportCourseWatchLogMy(query) {
-  return request({
-    url: '/course/courseWatchLog/myExport',
-    method: 'get',
-    params: query
-  })
-}
-
 export function watchLogStatisticsExport(query) {
   return request({
     url: '/course/courseWatchLog/watchLogStatisticsExport',

+ 0 - 9
src/api/doctor/doctor.js

@@ -141,12 +141,3 @@ export function exportDoctor(query) {
     params: query
   })
 }
-
-// 根据名称模糊查询医生列表
-export function getDoctorListLikeName(params) {
-  return request({
-    url: '/his/doctor/getDoctorListLikeName',
-    method: 'get',
-    params: params
-  })
-}

+ 2 - 28
src/api/qw/QwWorkTask.js

@@ -8,20 +8,7 @@ export function listQwWorkTask(query) {
     params: query
   })
 }
-export function allListQwWorkTask(query) {
-  return request({
-    url: '/qw/QwWorkTask/allList',
-    method: 'get',
-    params: query
-  })
-}
-export function glList(query) {
-  return request({
-    url: '/qw/QwWorkTask/glList',
-    method: 'get',
-    params: query
-  })
-}
+
 // 查询企微任务看板详细
 export function getQwWorkTask(id) {
   return request({
@@ -47,20 +34,7 @@ export function updateQwWorkTask(data) {
     data: data
   })
 }
-export function updateQwWorkTask2(data) {
-  return request({
-    url: '/qw/QwWorkTask/edit2',
-    method: 'put',
-    data: data
-  })
-}
-export function updateQwWorkTask3(data) {
-  return request({
-    url: '/qw/QwWorkTask/edit3',
-    method: 'put',
-    data: data
-  })
-}
+
 // 删除企微任务看板
 export function delQwWorkTask(id) {
   return request({

+ 7 - 10
src/api/qw/sopLogs.js

@@ -18,6 +18,13 @@ export function listQwSopLogsList(query) {
   })
 }
 
+//修改 执行记录为待发送
+export function editCourseQwSopLogs(id) {
+  return request({
+    url: '/qw/sopLogs/editCourseQwSopLogs/' + id,
+    method: 'put'
+  })
+}
 
 
 // 查询企业微信SOP  定时任务详细
@@ -54,16 +61,6 @@ export function delQwSopLogs(id) {
   })
 }
 
-//修改 执行记录为待发送
-export function editCourseQwSopLogs(id) {
-  return request({
-    url: '/qw/sopLogs/editCourseQwSopLogs/' + id,
-    method: 'put'
-  })
-}
-
-
-
 // 导出企业微信SOP  定时任务
 export function exportQwSopLogs(query) {
   return request({

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

@@ -106,14 +106,6 @@ export function delSopTemp(id) {
     method: 'delete'
   })
 }
-// 删除sop模板
-export function updateImage(id) {
-  return request({
-    url: '/qw/sopTemp/updateImage',
-    method: 'get',
-    params: {id}
-  })
-}
 
 
 export function shareSopTemp(data) {

+ 0 - 13
src/api/qw/user.js

@@ -263,16 +263,3 @@ export function selectCloudAP(data) {
     data: data
   })
 }
-
-/**
- * 模糊查询企微用户列表
- * @param params 参数
- * @returns {*}
- */
-export function getQwUserListLikeName(params) {
-  return request({
-    url: '/qw/user/getQwUserListLikeName',
-    method: 'get',
-    params: params
-  })
-}

+ 0 - 18
src/api/store/package.js

@@ -63,21 +63,3 @@ export function exportPackage(query) {
     params: query
   })
 }
-
-// 根据别名模糊查询列表
-export function getPackageListLikeSecondName(query) {
-  return request({
-    url: '/store/package/getPackageListLikeSecondName',
-    method: 'get',
-    params: query
-  })
-}
-
-// 根据套餐名称模糊查询列表
-export function getPackageListLikeName(query) {
-  return request({
-    url: '/store/package/getPackageListLikeName',
-    method: 'get',
-    params: query
-  })
-}

+ 1 - 19
src/api/store/patient.js

@@ -57,22 +57,4 @@ export function exportPatient(query) {
     method: 'get',
     params: query
   })
-}
-
-// 根据名称模糊查询患者列表
-export function getPatientListLikeName(params) {
-  return request({
-    url: '/store/patient/getPatientListLikeName',
-    method: 'get',
-    params: params
-  })
-}
-
-// 根据电话号码模糊查询患者列表
-export function getPatientListLikeTel(params) {
-  return request({
-    url: '/store/patient/getPatientListLikeTel',
-    method: 'get',
-    params: params
-  })
-}
+}

+ 2 - 2
src/api/watch/deviceInfo.js

@@ -90,11 +90,11 @@ export function exportMy(query) {
 }
 
   // 查询用户信息
-export function getUser(data) {
+export function getUser(deviceId) {
   return request({
     url: '/watch-api/device/set/up/getUserInfo',
     method: 'get',
-    params:data
+    params: { deviceId } 
   })
 }
 

BIN
src/assets/logo/logo.png


+ 0 - 13
src/directive/select/elSelectLoadMore.js

@@ -1,13 +0,0 @@
-
-
-export default {
-  inserted(el, binding, vnode) {
-    const SELECT_WRAP_DOM = el.querySelector('.el-select-dropdown .el-select-dropdown__wrap')
-    SELECT_WRAP_DOM.addEventListener('scroll', function() {
-      const condition = this.scrollHeight - this.scrollTop <= this.clientHeight
-      if (condition) {
-        binding.value()
-      }
-    })
-  }
-}

+ 0 - 8
src/directive/select/index.js

@@ -1,8 +0,0 @@
-
-import elSelectLoadMore from "@/directive/select/elSelectLoadMore";
-
-const install = function(Vue) {
-  Vue.directive("select-load-more", elSelectLoadMore);
-};
-
-export default install

+ 0 - 2
src/main.js

@@ -13,7 +13,6 @@ import App from './App'
 import store from './store'
 import router from './router'
 import permission from './directive/permission'
-import elementDirective from './directive/select'
 
 import VueClipboard from 'vue-clipboard2'
 
@@ -103,7 +102,6 @@ Vue.component('PaginationMore', PaginationMore)
 Vue.component('RightToolbar', RightToolbar)
 Vue.component('DictTag', DictTag)
 Vue.use(permission)
-Vue.use(elementDirective)
 
 /**
  * If you don't want to use mock-server

+ 0 - 13
src/router/index.js

@@ -242,19 +242,6 @@ export const constantRoutes = [
       }
     ]
   },
-  {
-    path: '/watch/deviceInfo/details',
-    component: Layout,
-    hidden: true,
-    children: [
-      {
-        path: ':deviceId(\\d+)',
-        component: (resolve) => require(['@/views/watch/deviceInfo/details'], resolve),
-        name: 'details',
-        meta: { title: '设备详情', activeMenu: '/watch/deviceInfo'}
-      }
-    ]
-  },
 
 
 

+ 4 - 2
src/store/modules/user.js

@@ -37,6 +37,7 @@ const user = {
       state.user = user
     },
     SET_CALL_USER: (state, callUser) => {
+      console.log(callUser)
       state.callUser = callUser
     },
     SET_CALL_REALM: (state, callRealm) => {
@@ -49,6 +50,7 @@ const user = {
       state.isCall = call
     },
     SET_CALL_STATUS: (state, title) => {
+      console.log(title)
       state.callTitle = title
     },
   },
@@ -112,14 +114,14 @@ const user = {
           commit('SET_NAME', user.userName)
           commit('SET_AVATAR', avatar)
           commit('SET_USER', user)
-
+          
           resolve(res)
         }).catch(error => {
           reject(error)
         })
       })
     },
-
+    
     // 退出系统
     LogOut({ commit, state }) {
       return new Promise((resolve, reject) => {

+ 13 - 66
src/views/company/companyUser/index.vue

@@ -64,15 +64,6 @@
              v-hasPermi="['qw:user:sync']"
            >同步企微员工和部门</el-button>
           </el-col>
-		  <el-col :span="1.5">
-		   <el-button
-		     type="primary"
-		     plain
-		     size="mini"
-		     @click="synNameOpen=true"
-		     v-hasPermi="['qw:user:sync']"
-		   >同步企微员工名称</el-button>
-		  </el-col>
           <el-col :span="1.5">
             <el-button
               type="primary"
@@ -166,27 +157,6 @@
         <el-button @click="qwCancel">取 消</el-button>
       </div>
     </el-dialog>
-	
-	<el-dialog title="选择企微主体" :visible.sync="synNameOpen" width="800px" append-to-body>
-	
-	  <el-form   label-width="80px">
-	    <el-form-item label="企微公司" prop="corpId">
-	      <el-select v-model="synNameform.corpId" placeholder="企微公司"  >
-	        <el-option
-	          v-for="dict in myQwCompanyList"
-	          :key="dict.dictValue"
-	          :label="dict.dictLabel"
-	          :value="dict.dictValue"
-	        />
-	      </el-select>
-	    </el-form-item>
-	  </el-form>
-	  <div slot="footer" class="dialog-footer">
-	    <el-button type="primary" @click="synNameSubmitForm">确 定</el-button>
-	    <el-button @click="synNameOpen=false">取 消</el-button>
-	  </div>
-	</el-dialog>
-	
     <el-dialog title="选择企微主体" :visible.sync="synOpen" width="800px" append-to-body>
 
       <el-form   label-width="80px">
@@ -200,6 +170,8 @@
             />
           </el-select>
         </el-form-item>
+
+
       </el-form>
       <div slot="footer" class="dialog-footer">
         <el-button type="primary" @click="synSubmitForm">确 定</el-button>
@@ -308,6 +280,13 @@
             </el-form-item>
           </el-col>
         </el-row>
+        <el-row>
+          <el-col :span="24">
+            <el-form-item label="看课域名">
+              <el-input v-model="form.domain" style="width: 250px" placeholder="请输入域名"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
         <el-row>
           <el-col :span="24">
             <el-form-item label="备注">
@@ -375,12 +354,12 @@ import {
   changeUserStatus,
   importTemplate,
   getCitysAreaList, updateCompanyUserAreaList,
-} from "@/api/company/companyUser";
+} from "../../../api/company/companyUser";
 import { getToken } from "@/utils/auth";
 import { treeselect } from "@/api/company/companyDept";
 import Treeselect from "@riophae/vue-treeselect";
 import "@riophae/vue-treeselect/dist/vue-treeselect.css";
-import {bindQwUser, getQwUserList, addQwUser, getQwUser, getQwUserByIds,addQwUserName} from '@/api/qw/user';
+import {bindQwUser, getQwUserList, addQwUser, getQwUser, getQwUserByIds} from '@/api/qw/user';
 import { syncDept } from '@/api/qw/qwDept';
 import { getMyQwUserList,getMyQwCompanyList } from "@/api/qw/user";
 import  selectUser  from "@/views/company/components/selectQwUser.vue";
@@ -403,8 +382,6 @@ export default {
       ids: [],
       synform:{corpId:null},
       synOpen:false,
-	  synNameform:{corpId:null},
-	  synNameOpen:false,
       // 非单个禁用
       single: true,
       // 非多个禁用
@@ -658,6 +635,7 @@ export default {
         sex: undefined,
         status: "0",
         remark: undefined,
+        domain: null,
         postIds: [],
         roleIds: [],
       };
@@ -807,32 +785,6 @@ export default {
         loadingRock.close();
       });
     },
-	
-	synNameSubmitForm() {
-      this.synNameOpen=false;
-      this.loading=true;
-      this.msgSuccess("");
-
-      let loadingRock = this.$loading({
-        lock: true,
-        text: '同步中.....请等待.....请不要重复点击!!',
-        spinner: 'el-icon-loading',
-        background: 'rgba(0, 0, 0, 0.7)'
-      });
-
-
-      addQwUserName(this.synNameform.corpId).then(response => {
-        this.msgSuccess("同步成功");
-        this.getList();
-        this.synNameOpen=false;
-      }).finally(()=>{
-        this.loading=false;
-        this.synNameOpen=false;
-        loadingRock.close();
-      });
-    },
-	
-	
     /**
     * 同步企业微信部门
     */
@@ -865,16 +817,11 @@ export default {
         loadingRock.close()
       });
     },
-	
-	
-	
-	
-	
     /** 删除按钮操作 */
     handleDelete(row) {
       const userIds = row.userId || this.ids;
       this.$confirm(
-        '是否确认删除员工编号为"' + userIds + '"的数据项?',
+        '是否确认删除员工编号为"' + userIds + '"的数据项?【注意:删除后绑定的企业微信相关信息可能会错乱!!】',
         "警告",
         {
           confirmButtonText: "确定",

+ 426 - 0
src/views/course/Material/index.vue

@@ -0,0 +1,426 @@
+<template>
+  <div v-if="type == 'image'">
+    <ul v-for="(item,index) in value" :key="index" class="el-upload-list el-upload-list--picture-card">
+      <li tabindex="0" class="el-upload-list__item is-ready" :style="'width: '+width+'px;height: '+height+'px'">
+        <div>
+          <img :src="item" alt="" class="el-upload-list__item-thumbnail">
+          <span class="el-upload-list__item-actions">
+            <span v-if="index != 0" class="el-upload-list__item-preview" @click="moveMaterial(index,'up')">
+              <i class="el-icon-back" />
+            </span>
+            <span class="el-upload-list__item-preview" @click="zoomMaterial(index)">
+              <i class="el-icon-view" />
+            </span>
+            <span class="el-upload-list__item-delete" @click="deleteMaterial(index)">
+              <i class="el-icon-delete" />
+            </span>
+            <span v-if="index != value.length-1" class="el-upload-list__item-preview" @click="moveMaterial(index,'down')">
+              <i class="el-icon-right" />
+            </span>
+          </span>
+        </div>
+      </li>
+    </ul>
+    <div v-if="num > value.length" tabindex="0" class="el-upload el-upload--picture-card" :style="'width: '+width+'px;height: '+height+'px;'+'line-height:'+height+'px;'" @click="toSeleteMaterial">
+      <i class="el-icon-plus" />
+    </div>
+    <!-- 查看 -->
+    <el-dialog
+      append-to-body
+      :visible.sync="dialogVisible"
+      width="35%"
+    >
+      <img :src="materialUrl" alt="" style="width: 100%">
+    </el-dialog>
+    <!-- 素材列表 -->
+    <el-dialog
+      title="朋友圈图片素材库"
+      append-to-body
+      :visible.sync="listDialogVisible"
+      width="70%"
+    >
+      <el-container>
+        <el-aside width="unset">
+          <div style="margin-bottom: 10px">
+            <el-button
+              class="el-icon-plus"
+              size="small"
+              @click="materialgroupAdd()"
+            >
+              添加分组
+            </el-button>
+          </div>
+          <div class="group-list">
+            <div class="group-item" v-for="(group) in materialGroupList">
+                <el-button  @click="selectGroup(group)" type="primary" plain >{{group.materialGroupName}}</el-button>
+            </div>
+          </div>
+        </el-aside>
+        <el-main>
+          <el-card>
+            <div slot="header">
+              <el-row>
+                <el-col :span="12">
+                  <span>{{ materialGroup.materialGroupName }}</span>
+                  <span v-if="materialGroup.materialGroupId >0">
+                    <el-button size="small" type="text" class="el-icon-edit" style="margin-left: 10px;" @click="materialgroupEdit(materialGroup)">重命名</el-button>
+                    <el-button size="small" type="text" class="el-icon-delete" style="margin-left: 10px;color: red" @click="materialgroupDelete(materialGroup)">删除</el-button>
+                  </span>
+                </el-col>
+                <el-col :span="12" style="text-align: right;">
+                  <el-upload
+                    :action="uploadUrl"
+                    :file-list="[]"
+                    :on-progress="handleProgress"
+                    :before-upload="beforeUpload"
+                    :on-success="handleSuccess"
+                    :data="{type: 1}"
+                    multiple
+                  >
+                    <el-button size="small" type="primary">批量上传</el-button>
+                  </el-upload>
+                </el-col>
+              </el-row>
+            </div>
+            <div v-loading="tableLoading">
+              <el-alert
+                v-if="tableData.length <= 0"
+                title="暂无数据"
+                type="info"
+                :closable="false"
+                center
+                show-icon
+              />
+              <el-row :gutter="5">
+                <el-checkbox-group v-model="urls" :max="num - value.length">
+                  <el-col v-for="(item,index) in tableData" :key="index" :span="4">
+                    <el-card :body-style="{ padding: '5px' }">
+                      <el-image
+                        style="width: 100%;height: 100px"
+                        :src="item.materialUrl"
+                        fit="contain"
+                        :preview-src-list="[item.materialUrl]"
+                        :z-index="9999"
+                      />
+                      <div>
+                        <el-checkbox class="material-name" :label="item.materialUrl">
+                          选择
+                        </el-checkbox>
+                        <el-row>
+                          <el-col :span="24" class="col-do">
+                            <el-button type="text" size="medium" @click="materialDel(item)">删除</el-button>
+                          </el-col>
+                        </el-row>
+
+                      </div>
+                    </el-card>
+                  </el-col>
+                </el-checkbox-group>
+              </el-row>
+               <pagination
+                  v-show="total>0"
+                  :total="total"
+                  :page.sync="queryParams.pageNum"
+                  :limit.sync="queryParams.pageSize"
+                  @pagination="getMaterialList"
+                />
+
+            </div>
+          </el-card>
+        </el-main>
+      </el-container>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="listDialogVisible = false">取 消</el-button>
+        <el-button type="primary" @click="submit">确 定</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listMaterial, getMaterial, delMaterial, addMaterial, updateMaterial, } from "@/api/qw/material";
+import { listMaterialGroup, getMaterialGroup, delMaterialGroup, addMaterialGroup, updateMaterialGroup } from "@/api/qw/materialGroup";
+export default {
+  name: 'ImageSelect',
+  props: {
+    // 素材数据
+    value: {
+      type: Array,
+      default() {
+        return []
+      }
+    },
+    // 素材类型
+    type: {
+      type: String
+    },
+    // 素材限制选择数量,最多9个
+    num: {
+      type: Number,
+      default() {
+        return 9
+      }
+    },
+    // 宽度
+    width: {
+      type: Number,
+      default() {
+        return 150
+      }
+    },
+    // 宽度
+    height: {
+      type: Number,
+      default() {
+        return 150
+      }
+    }
+  },
+  data() {
+    return {
+      uploadUrl:process.env.VUE_APP_BASE_API+"/common/uploadOSS",
+      dialogVisible: false,
+      materialUrl: '',
+      listDialogVisible: false,
+      //素材组列表
+      materialGroupList: [],
+      materialGroupLoading: false,
+      //选择的某个素材组
+      materialGroup:{},
+      tableData: [],
+      resultNumber: 0,
+      total: 0,
+      //查询素材列表
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        groupType:2,
+        materialGroupName: null,
+        materialGroupId:null,
+        materialUrl: null,
+        createUserId: null,
+      },
+      tableLoading: false,
+      urls: []
+    }
+  },
+  mounted(){
+    this.getAllMaterialGroup();
+  },
+  methods: {
+    //查询素材组下的素材列表
+    selectGroup(item){
+      this.materialGroup=item;
+      this.queryParams.materialGroupId=item.materialGroupId;
+      this.getMaterialList();
+    },
+    //添加分组
+    materialgroupAdd() {
+      const that = this
+      this.$prompt('请输入分组名', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消'
+      }).then(({ value }) => {
+        addMaterialGroup({
+          materialGroupName: value,
+          groupType:2
+        }).then(function() {
+          that.materialGroup={};
+          that.getAllMaterialGroup();
+        })
+      }).catch(() => {
+
+      })
+    },
+    //删除素材组
+    materialgroupDelete(materialgroupObj) {
+      const that = this
+      this.$confirm('是否确认删除该分组?', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      }).then(function() {
+        delMaterialGroup(materialgroupObj.materialGroupId)
+          .then(function() {
+            that.materialGroup={};
+            that.getAllMaterialGroup()
+          })
+      })
+      this.resetGroup();
+      this.getAllMaterialGroup();
+    },
+    //修改素材组名称
+    materialgroupEdit(materialgroupObj) {
+      const that = this
+      this.$prompt('请输入分组名', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        inputValue: materialgroupObj.materialGroupName
+      }).then(({ value }) => {
+        updateMaterialGroup({
+          materialGroupId: materialgroupObj.materialGroupId,
+          materialGroupName: value,
+          groupType:2,
+        }).then(function() {
+          that.materialGroup={};
+          that.getAllMaterialGroup()
+        })
+      }).catch(() => {
+
+      })
+    },
+    //获取所有素材分组
+    getAllMaterialGroup() {
+      this.materialGroupLoading = true;
+      listMaterialGroup({groupType:2}).then(response => {
+        this.materialGroupList = response.rows
+        this.materialGroupLoading = false;
+      });
+    },
+    resetGroup(){
+      this.queryParams= {
+        pageNum: 1,
+          pageSize: 10,
+          groupType:2,
+          materialGroupName: null,
+          materialGroupId:null,
+          materialUrl: null,
+          createUserId: null,
+      };
+    },
+    //查询分组 下的素材
+    getMaterialList() {
+      this.tableLoading = true;
+      listMaterial(this.queryParams).then(response => {
+        this.tableData = response.rows;
+        this.total = response.total;
+        this.tableLoading = false;
+      });
+    },
+    //移动素材
+    moveMaterial(index, type) {
+      if (type == 'up') {
+        const tempOption = this.value[index - 1]
+        this.$set(this.value, index - 1, this.value[index])
+        this.$set(this.value, index, tempOption)
+      }
+      if (type == 'down') {
+        const tempOption = this.value[index + 1]
+        this.$set(this.value, index + 1, this.value[index])
+        this.$set(this.value, index, tempOption)
+      }
+    },
+    //缩小图片
+    zoomMaterial(index) {
+      this.dialogVisible = true
+      this.materialUrl = this.value[index]
+    },
+    //删除素材
+    deleteMaterial(index) {
+      const that = this
+      this.$confirm('是否确认删除?', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      }).then(function() {
+        that.value.splice(index, 1)
+        that.urls = []
+      })
+    },
+
+    toSeleteMaterial() {
+      this.listDialogVisible = true
+      this.getAllMaterialGroup()
+      this.getMaterialList();
+    },
+    //删除素材
+    materialDel(item) {
+      const that = this
+      this.$confirm('是否确认删除该素材?', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      }).then(function() {
+        delMaterial(item.materialId)
+          .then(function() {
+            that.queryParams.pageNum=0;
+            that.getMaterialList();
+          })
+      })
+    },
+
+    //上传进度
+    handleProgress(event, file, fileList) {
+    },
+    //上传成功后
+    handleSuccess(response, file, fileList) {
+      const that = this
+      addMaterial({
+        materialType: 'image',
+        materialGroupId: this.queryParams.materialGroupId,
+        materialName: file.name,
+        materialUrl: response.url,
+        groupType:2,
+      }).then(() => {
+        this.resultNumber++
+        if (fileList.length === this.resultNumber) {
+          that.getMaterialList()
+          this.resultNumber = 0
+        }
+      })
+    },
+    //上传之前
+    beforeUpload(file) {
+      const isPic =
+        file.type === 'image/jpeg' ||
+        file.type === 'image/png' ||
+        file.type === 'image/gif' ||
+        file.type === 'image/jpg'
+      const isLt2M = file.size / 1024 / 1024 < 10
+      if (!isPic) {
+        this.$message.error('上传图片只能是 JPG、JPEG、PNG、GIF 格式!')
+        return false
+      }
+      if (!isLt2M) {
+        this.$message.error('上传图片大小不能超过 10MB!')
+      }
+      return isPic && isLt2M
+    },
+    //提交
+    submit() {
+      this.urls.forEach(item => {
+        console.log("item",item)
+        console.log("this.value",this.value)
+        console.log("this.value.length",this.value.length)
+
+        this.$set(this.value, this.value.length, item)
+      })
+      this.listDialogVisible = false
+    }
+  }
+}
+</script>
+
+<style rel="stylesheet/scss" lang="scss" scoped>
+  ::v-deep .el-icon-circle-close{
+    color: red;
+  }
+  .material-name{
+    padding: 8px 0px;
+  }
+  .col-do{
+    text-align: center;
+  }
+  .button-do{
+    padding: unset!important;
+    font-size: 12px;
+  }
+  .group-list{
+    display: flex;
+    flex-direction:column;
+    align-items: flex-start;
+  }
+  .group-item{
+    margin: 5px;
+  }
+</style>

+ 2 - 10
src/views/course/courseAnswerlogs/myCourseAnswerlogs.vue

@@ -146,15 +146,7 @@
 </template>
 
 <script>
-import {
-  myListLogs,
-  getLogs,
-  delLogs,
-  addLogs,
-  updateLogs,
-  exportLogs,
-  exportLogsMy
-} from "@/api/course/courseAnswerlogs";
+import { myListLogs, getLogs, delLogs, addLogs, updateLogs, exportLogs } from "@/api/course/courseAnswerlogs";
 import { courseList, videoList } from '@/api/course/courseRedPacketLog'
 import {allListTagGroup} from "@/api/qw/tagGroup";
 import {listTag} from "@/api/qw/tag";
@@ -371,7 +363,7 @@ export default {
           type: "warning"
         }).then(() => {
           this.exportLoading = true;
-          return exportLogsMy(queryParams);
+          return exportLogs(queryParams);
         }).then(response => {
           this.download(response.msg);
           this.exportLoading = false;

+ 33 - 148
src/views/course/courseFinishTemp/index.vue

@@ -104,11 +104,6 @@
       <el-table-column label="小节名称" align="center" prop="videoName" />
       <el-table-column label="创建时间" align="center" prop="createTime" />
       <el-table-column label="修改时间" align="center" prop="updateTime" />
-      <el-table-column label="全选销售" align="center" prop="isAllCompanyUser">
-        <template slot-scope="scope">
-          <dict-tag :options="allowSelect" :value="scope.row.isAllCompanyUser"/>
-        </template>
-      </el-table-column>
       <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
         <template slot-scope="scope">
           <el-button
@@ -207,6 +202,9 @@
                         <el-input v-model="item.linkUrl" placeholder="请输入链接地址" style="width: 90%;"/>
                       </el-form-item>
                     </el-card>
+                  </div>
+                  <div v-if="item.contentType == 4">
+
                   </div>
                   <div v-if="item.contentType == 5 ">
 
@@ -244,6 +242,16 @@
                       </video>
                     </el-form-item>
                   </div>
+                  <div v-if="item.contentType == 7 ">
+                      <el-input
+                        v-model="item.value"
+                        type="textarea" :rows="3" maxlength="66" show-word-limit
+                        placeholder="输入要转为语音的内容" style="width: 90%;margin-top: 10px;"
+                        @input="handleInputVideoText(item.value,item)"/>
+                  </div>
+                  <div v-if="item.contentType == 8">
+
+                  </div>
 
                 </el-form-item>
               </el-form>
@@ -254,46 +262,17 @@
           </el-row>
           </div>
         <el-link type="primary" class="el-icon-plus" :underline="false" @click='addSetList()' v-if="formType==1" >添加内容</el-link>
+
         </el-form-item>
-        <el-form-item label="全选销售" prop="isAllCompanyUser">
-          <el-switch
-            v-model="form.isAllCompanyUser"
-            active-color="#13ce66"
-            inactive-color="#ff4949"
-            :active-value="1"
-            :inactive-value="2">
-          </el-switch>
-          <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" label-width="100px" v-if="form.isAllCompanyUser != 1 ">
-<!--          <el-select v-model="companyUserIds" remote multiple placeholder="请选择" filterable  style="width: 100%;">-->
-<!--            <el-option-->
-<!--              v-for="dict in userList"-->
-<!--              :key="dict.userId"-->
-<!--              :label="dict.nickName"-->
-<!--              :value="dict.userId.toString()">-->
-<!--            </el-option>-->
-<!--          </el-select>-->
-          <div>
-            <el-button
-              size="medium"
-              icon="el-icon-circle-plus-outline"
-              plain
-              @click="handlelistUser">请选择使用成员</el-button>
-          </div>
-          <div>
-            <el-tag
-              style="margin-left: 5px"
-              size="medium"
-              :key="list.id"
-              v-for="list in userSelectList"
-              closable
-              :disable-transitions="false"
-              @close="handleClosegroupUser(list)">
-              {{list.qwUserId}}({{list.qwUserName}})({{list.nickName}})
-            </el-tag>
-          </div>
+        <el-form-item label="所属销售" prop="companyUserIds">
+          <el-select v-model="companyUserIds" remote multiple placeholder="请选择" filterable  style="width: 100%;">
+            <el-option
+              v-for="dict in userList"
+              :key="dict.userId"
+              :label="dict.nickName"
+              :value="dict.userId.toString()">
+            </el-option>
+          </el-select>
         </el-form-item>
       </el-form>
       <div slot="footer" class="dialog-footer" v-if="formType==1">
@@ -301,11 +280,6 @@
         <el-button @click="cancel">取 消</el-button>
       </div>
     </el-dialog>
-
-    <!-- 选择成员账号弹窗   -->
-    <el-dialog :title="listUser.title" :visible.sync="listUser.open" width="800px" append-to-body>
-      <qwUserListByCompany ref="QwUserList" @selectUserList="selectUserList"></qwUserListByCompany>
-    </el-dialog>
   </div>
 </template>
 
@@ -314,27 +288,20 @@ import { listCourseFinishTemp, getCourseFinishTemp, addCourseFinishTemp, updateC
 import { getUserList } from '@/api/company/companyUser'
 import {courseList, videoList} from '@/api/qw/sop'
 import ImageUpload from "@/views/qw/sop/ImageUpload.vue";
-import qwUserList from "@/views/qw/user/qwUserList.vue";
-import QwUserListByCompany from "@/views/qw/user/qwUserListByCompany.vue";
 
 export default {
   name: "CourseFinishTemp",
-  components: {QwUserListByCompany, qwUserList, ImageUpload},
+  components: {ImageUpload},
   data() {
     return {
       //上传语音的遮罩层
       voiceLoading :false,
       uploadUrl:process.env.VUE_APP_BASE_API+"/common/uploadOSS2",
       uploadUrlByVoice:process.env.VUE_APP_BASE_API+"/common/uploadOSSByHOOKVoice",
-
-      // 存储每一行的展开状态
-      expandedRows: {},
-
       companyUserIds:[],
       userList:[],
       // 状态字典
       statusOptions: [],
-      allowSelect: [],
       courseList:[],
       videoList:[],
       // 遮罩层
@@ -359,14 +326,6 @@ export default {
 
       sysFsSopWatchStatus: [],
 
-      //选择企业微信成员列表
-      userSelectList:[],
-      //选择成员列表
-      listUser:{
-        title:"",
-        open:false
-      },
-
       // 弹出层标题
       title: "",
       // 是否显示弹出层
@@ -401,72 +360,24 @@ export default {
     this.getList();
     getUserList().then(response => {
       this.userList =  response.data;
+      console.log("this.userList",this.userList)
     });
     this.getDicts("sys_company_status").then(response => {
       this.statusOptions = response.data;
     });
 
-    //复用一下
-    this.getDicts("sys_qw_allow_select").then(response => {
-      this.allowSelect = response.data;
-    });
-
     this.getDicts("sys_fs_sop_watch_status").then(response => {
       this.sysFsSopWatchStatus = response.data;
     });
 
-    this.getDicts("sys_qwSopCourse_contentType").then(response => {
+    this.getDicts("sys_qwSopAi_contentType").then(response => {
       this.sysQwSopAiContentType = response.data;
     });
     courseList().then(response => {
       this.courseList = response.list;
     });
   },
-  watch:{
-    userSelectList(newList) {
-      this.form.companyUserIds =newList.map(item =>item.id);
-    }
-  },
   methods: {
-
-
-    // 切换某一行的展开状态
-    toggleRow(row) {
-      this.$set(this.expandedRows, row.id, !this.expandedRows[row.id]);
-    },
-
-    //选择群发的企业成员账号
-    handlelistUser(){
-      this.listUser.title="选择企业成员"
-      this.listUser.open=true;
-    },
-    //删除一些选择了的账号
-    handleClosegroupUser(list){
-
-      // 假设 list 对象具有一个 id 属性
-      const index = this.userSelectList.findIndex(t => t.id === list.id);
-      if (index !== -1) {
-        this.userSelectList.splice(index,1);
-      }
-    },
-
-    //选择的成员账号列表
-    selectUserList(list){
-
-      this.listUser.open=false;
-
-      // 3. 遍历要添加的 list,逐条判断是否存在重复
-      list.forEach(newItem => {
-        // some() 判断是否存在相同 id
-        const isExist = this.userSelectList.some(oldItem => oldItem.id === newItem.id);
-        if (!isExist) {
-          // 不存在重复的,才添加
-          this.userSelectList.push(newItem);
-        }
-      });
-
-    },
-
     courseChange() {
 
       videoList(this.form.courseId).then(response => {
@@ -628,10 +539,9 @@ export default {
         videoId: null,
         companyUserIds: null,
         updateTime: null,
-        isDel: null,
-        isAllCompanyUser:null,
+        isDel: null
       };
-      this.userSelectList=[]
+      this.companyUserIds=[]
       this.setting=[]
       this.resetForm("form");
     },
@@ -666,13 +576,10 @@ export default {
       this.reset();
       const id = row.id || this.ids
       getCourseFinishTemp(id).then(response => {
-        console.log("this.form222 ",response.data )
         this.form = response.data;
-
         this.setting=JSON.parse(this.form.setting)
-
         if (response.data.companyUserIds!=null){
-          this.userSelectList = this.form.companyUserIds;
+          this.companyUserIds = this.form.companyUserIds.split(",");
         }
 
         videoList(this.form.courseId).then(response => {
@@ -690,19 +597,16 @@ export default {
       this.reset();
       const id = row.id || this.ids
       getCourseFinishTemp(id).then(response => {
-
         this.form = response.data;
-
         this.setting=JSON.parse(this.form.setting)
-        if (response.data.userSelectList!=null){
-          this.userSelectList =  this.form.userSelectList
+        if (response.data.companyUserIds!=null){
+          this.companyUserIds = this.form.companyUserIds.split(",");
         }
 
         videoList(this.form.courseId).then(response => {
           this.videoList=response.list;
         });
 
-
         this.open = true;
         this.title = "修改完课模板";
 
@@ -712,24 +616,7 @@ export default {
     submitForm() {
       this.$refs["form"].validate(valid => {
         if (valid) {
-
-          if (this.form.isAllCompanyUser==null){
-            this.form.isAllCompanyUser=2;
-          }
-
-          if ((this.form.isAllCompanyUser==2 || this.form.isAllCompanyUser==null)  && (this.form.companyUserIds==null || this.form.companyUserIds.length==0) ){
-            return  this.$message.error("请选择企业微信员工")
-          }
-
-          console.log("sout",this.form)
-
-          if (this.form.companyUserIds!=null && this.form.companyUserIds.length>0){
-            this.form.companyUserIds = this.form.companyUserIds.join(",")
-          }else {
-            this.form.companyUserIds=null;
-          }
-
-
+          this.form.companyUserIds = this.companyUserIds.toString()
 
           this.form.setting=JSON.stringify(this.setting)
 
@@ -770,16 +657,14 @@ export default {
             updateCourseFinishTemp(this.form).then(response => {
               this.msgSuccess("修改成功");
               this.open = false;
-              this.setting=[];
-              this.userSelectList=[]
               this.getList();
+              this.setting=[];
             });
           } else {
             addCourseFinishTemp(this.form).then(response => {
               this.msgSuccess("新增成功");
               this.open = false;
               this.setting=[];
-              this.userSelectList=[]
               this.getList();
             });
           }

+ 2 - 12
src/views/course/courseRedPacketLog/myCourseRedPacketLog.vue

@@ -182,17 +182,7 @@
 </template>
 
 <script>
-import {
-  courseList,
-  videoList,
-  myListCourseRedPacketLog,
-  getCourseRedPacketLog,
-  delCourseRedPacketLog,
-  addCourseRedPacketLog,
-  updateCourseRedPacketLog,
-  exportCourseRedPacketLog,
-  exportCourseRedPacketLogMy
-} from "@/api/course/courseRedPacketLog";
+import { courseList,videoList,myListCourseRedPacketLog, getCourseRedPacketLog, delCourseRedPacketLog, addCourseRedPacketLog, updateCourseRedPacketLog, exportCourseRedPacketLog } from "@/api/course/courseRedPacketLog";
 import {getMyQwUserList} from "@/api/qw/user";
 
 export default {
@@ -419,7 +409,7 @@ export default {
         type: "warning"
       }).then(() => {
         this.exportLoading = true;
-        return exportCourseRedPacketLogMy(queryParams);
+        return exportCourseRedPacketLog(queryParams);
       }).then(response => {
         this.download(response.msg);
         this.exportLoading = false;

+ 11 - 90
src/views/course/courseWatchLog/index.vue

@@ -28,18 +28,14 @@
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
-      <el-form-item label="所属销售" prop="companyUserId">
-        <el-select v-model="queryParams.companyUserId" clearable filterable remote
-                   placeholder="请输入关键词" :remote-method="loadCompanyUserOptions"
-                   v-select-load-more="loadMoreCompanyUserOptions"
-                   :loading="companyUserOptionsLoading">
-          <el-option
-            v-for="item in companyUserOptions"
-            :key="item.value"
-            :label="item.label"
-            :value="item.value">
-          </el-option>
-        </el-select>
+      <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="courseId">
         <el-select filterable  v-model="queryParams.courseId" placeholder="请选择课程"  clearable size="small" @change="courseChange(queryParams.courseId)">
@@ -61,33 +57,6 @@
           />
         </el-select>
       </el-form-item>
-      <el-form-item label="企微ID" prop="qwUserUserId">
-        <el-input
-          v-model="queryParams.qwUserUserId"
-          placeholder="请输入所属企微ID"
-          clearable
-          size="small"
-          @keyup.enter.native="handleQuery"
-        />
-      </el-form-item>
-      <el-form-item label="企微员工名称" prop="qwUserName">
-        <el-input
-          v-model="queryParams.qwUserName"
-          placeholder="请输入所属企微员工名称"
-          clearable
-          size="small"
-          @keyup.enter.native="handleQuery"
-        />
-      </el-form-item>
-      <el-form-item label="部门名称" prop="deptName">
-        <el-input
-          v-model="queryParams.deptName"
-          placeholder="请输入部门名称"
-          clearable
-          size="small"
-          @keyup.enter.native="handleQuery"
-        />
-      </el-form-item>
       <el-form-item label="营期时间" prop="scheduleTime">
         <el-date-picker
           v-model="scheduleTime"
@@ -164,9 +133,9 @@
       </el-table-column>
       <el-table-column label="播放时长" align="center" prop="duration" />
       <el-table-column label="所属销售" align="center" prop="companyUserName" />
-<!--      <el-table-column label="所属公司" align="center" prop="companyName" />-->
+      <el-table-column label="所属公司" align="center" prop="companyName" />
       <el-table-column label="企微员工名称" align="center" prop="qwUserName" />
-<!--      <el-table-column label="所属发送方式" align="center" prop="sendType" />-->
+      <el-table-column label="所属发送方式" align="center" prop="sendType" />
       <el-table-column label="创建时间" align="center" prop="createTime" />
       <el-table-column label="更新时间" align="center" prop="updateTime" />
       <el-table-column label="完课时间" align="center" prop="finishTime" />
@@ -186,8 +155,8 @@
 
 <script>
 import { listCourseWatchLog, getCourseWatchLog, delCourseWatchLog, addCourseWatchLog, updateCourseWatchLog, exportCourseWatchLog } from "@/api/course/courseWatchLog";
+import {allList}from "@/api/company/company";
 import { courseList,videoList } from '@/api/course/courseRedPacketLog'
-import { getCompanyUserListLikeName } from "@/api/company/companyUser";
 export default {
   name: "CourseWatchLog",
   data() {
@@ -230,9 +199,6 @@ export default {
         externalUserName:null,
         duration: null,
         qwUserId: null,
-        qwUserName: null, //企微名称
-        qwUserUserId: null, //企微id
-        deptName: null, //部门名称
         companyUserId: null,
         companyId: null,
         courseId: null,
@@ -249,15 +215,6 @@ export default {
       rules: {
       },
       scheduleTime: null,
-      // 员工选项列表
-      companyUserOptionsParams: {
-        name: undefined,
-        hasNextPage: false,
-        pageNum: 1,
-        pageSize: 10
-      },
-      companyUserOptionsLoading: false,
-      companyUserOptions: [],
     };
   },
   created() {
@@ -448,42 +405,6 @@ export default {
         this.queryParams.scheduleEndTime = null;
       }
     },
-    /**
-     * 根据名称模糊查询用户列表
-     * @param query 参数
-     */
-    loadCompanyUserOptions(query) {
-      this.companyUserOptions = [];
-      if (query === '') {
-        return;
-      }
-
-      this.companyUserOptionsParams.pageNum = 1
-      this.companyUserOptionsParams.name = query
-      this.companyUserOptionsLoading = true;
-      this.getCompanyUserListLikeName()
-    },
-    /**
-     * 获取员工列表
-     */
-    getCompanyUserListLikeName() {
-      getCompanyUserListLikeName(this.companyUserOptionsParams).then(response => {
-        this.companyUserOptions = [...this.companyUserOptions, ...response.data.list]
-        this.companyUserOptionsParams.hasNextPage = response.data.hasNextPage
-        this.companyUserOptionsLoading = false;
-      });
-    },
-    /**
-     * 加载更多员工选项
-     */
-    loadMoreCompanyUserOptions() {
-      if (!this.companyUserOptionsParams.hasNextPage) {
-        return;
-      }
-
-      this.companyUserOptionsParams.pageNum += 1
-      this.getCompanyUserListLikeName()
-    },
   }
 };
 </script>

+ 4 - 12
src/views/course/courseWatchLog/myCourseWatchLog.vue

@@ -127,10 +127,10 @@
       </el-table-column>
       <el-table-column label="播放时长" align="center" prop="duration" />
       <el-table-column label="所属销售" align="center" prop="companyUserName" />
-<!--      <el-table-column label="所属公司" align="center" prop="companyName" />-->
+      <el-table-column label="所属公司" align="center" prop="companyName" />
       <el-table-column label="企微员工名称" align="center" prop="qwUserName" />
       <el-table-column label="企微账号" align="center" prop="qwUserName" />
-<!--      <el-table-column label="所属发送方式" align="center" prop="sendType" />-->
+      <el-table-column label="所属发送方式" align="center" prop="sendType" />
       <el-table-column label="创建时间" align="center" prop="createTime" />
 <!--      <el-table-column label="更新时间" align="center" prop="updateTime" />-->
       <el-table-column label="完课时间" align="center" prop="lastHeartbeatTime" />
@@ -148,15 +148,7 @@
 </template>
 
 <script>
-import {
-  myListCourseWatchLog,
-  getCourseWatchLog,
-  delCourseWatchLog,
-  addCourseWatchLog,
-  updateCourseWatchLog,
-  exportCourseWatchLog,
-  exportCourseWatchLogMy
-} from "@/api/course/courseWatchLog";
+import { myListCourseWatchLog, getCourseWatchLog, delCourseWatchLog, addCourseWatchLog, updateCourseWatchLog, exportCourseWatchLog } from "@/api/course/courseWatchLog";
 import { courseList,videoList } from '@/api/course/courseRedPacketLog'
 import {getMyQwUserList} from "@/api/qw/user";
 import {allListTagGroup} from "@/api/qw/tagGroup";
@@ -385,7 +377,7 @@ export default {
           type: "warning"
         }).then(() => {
           this.exportLoading = true;
-          return exportCourseWatchLogMy(queryParams);
+          return exportCourseWatchLog(queryParams);
         }).then(response => {
           this.download(response.msg);
           this.exportLoading = false;

+ 4 - 4
src/views/course/courseWatchLog/watchLog.vue

@@ -148,10 +148,10 @@
       </el-table-column>
       <el-table-column label="播放时长" align="center" prop="duration"/>
       <el-table-column label="所属销售" align="center" prop="companyUserName"/>
-<!--      <el-table-column label="所属公司" align="center" prop="companyName"/>-->
+      <el-table-column label="所属公司" align="center" prop="companyName"/>
       <el-table-column label="企微员工名称" align="center" prop="qwUserName"/>
       <el-table-column label="企微账号" align="center" prop="qwUserName"/>
-<!--      <el-table-column label="所属发送方式" align="center" prop="sendType"/>-->
+      <el-table-column label="所属发送方式" align="center" prop="sendType"/>
       <el-table-column label="创建时间" align="center" prop="createTime" width="100px"/>
       <el-table-column label="更新时间" align="center" prop="updateTime" width="100px" />
       <el-table-column label="完课时间" align="center" prop="finishTime" width="100px" />
@@ -273,7 +273,7 @@
 import {
   addCourseWatchLog,
   delCourseWatchLog,
-  exportCourseWatchLog, exportCourseWatchLogMy,
+  exportCourseWatchLog,
   getCourseWatchLog,
   myListCourseWatchLog,
   updateCourseWatchLog
@@ -563,7 +563,7 @@ export default {
         type: "warning"
       }).then(() => {
         this.exportLoading = true;
-        return exportCourseWatchLogMy(queryParams);
+        return exportCourseWatchLog(queryParams);
       }).then(response => {
         this.download(response.msg);
         this.exportLoading = false;

+ 1 - 1
src/views/course/sop/SopDialog.vue

@@ -104,7 +104,7 @@
 
 <script>
 import { listSop, getSop, delSop, addSop, updateSop, exportSop } from "@/api/course/sop";
-import  Material  from "@/views/qw/materialQw/index.vue";
+import  Material  from "@/views/course/Material/index.vue";
 import sopLogsDetails from '@/views/course/sopLogs/sopLogsList.vue'
 import userCourseVideo from '@/views/course/sop/userCourseVideo.vue';
 export default {

+ 1 - 1
src/views/course/sop/index.vue

@@ -317,7 +317,7 @@
 
 <script>
 import { listSop, getSop, delSop, addSop, updateSop, exportSop } from "@/api/course/sop";
-import  Material  from "@/views/qw/materialQw/index.vue";
+import  Material  from "@/views/course/Material/index.vue";
 import sopLogsDetails from '@/views/course/sopLogs/sopLogsList.vue'
 import { listUserCourse } from '@/api/course/userCourse'
 import userCourseVideo from '@/views/course/sop/userCourseVideo.vue';

+ 2 - 2
src/views/fastGpt/fastGptRole/fastGptRoleUpdate.vue

@@ -21,10 +21,10 @@
                 <ImageUpload v-model="form.avatar" type="image" :num="1" :width="150" :height="150" style="margin-top: 1%;" />
               </el-form-item>
               <el-form-item label="APPKey"  >
-                <el-input type="textarea" v-model="form.modeConfigJson.APPKey" placeholder="请输入APPKey(特定key)" />
+                <el-input type="textarea" v-model="form.modeConfigJson.APPKey" placeholder="请输入FastGPT的APPKey(特定key)" />
               </el-form-item>
               <el-form-item  label="提示词"  >
-                <el-input type="textarea" :rows="3" v-model="form.reminderWords" placeholder="请输入提示词" />
+                <el-input type="textarea" :rows="3" v-model="form.reminderWords" placeholder="请输入FastGPT的提示词" />
               </el-form-item>
 <!--              <el-form-item  label="标签人设"  >
                 <div v-if="tagsFormList.length > 0" style="display: flex; align-items: center; flex-wrap: wrap; width: 100%;">

+ 2 - 2
src/views/login.vue

@@ -53,8 +53,8 @@
     </div>
     <!--  底部  -->
     <div class="el-login-footer">
-      <a href="https://beian.miit.gov.cn" target="_bank">蜀ICP备2023036719号-2</a>
-    </div>
+      <span> </span>
+      <a href="https://beian.miit.gov.cn" target="_bank">闽ICP备2020016609号-3</a>    </div>
   </div>
 </template>
 

+ 0 - 276
src/views/qw/QwWorkTask/allTask.vue

@@ -1,276 +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="qwUserName">
-             <el-input
-               v-model="queryParams.qwUserName"
-               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>
-
-      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
-    </el-row>
-
-    <el-table border v-loading="loading" :data="QwWorkTaskList" @selection-change="handleSelectionChange">
-    <el-table-column type="selection" width="55" align="center" />
-    <el-table-column label="企微账号" align="center" prop="qwUserName" />
-	<el-table-column label="销售昵称" align="center" prop="companyUserName" />
-	<el-table-column label="待处理" align="center" prop="status0" />
-	<el-table-column label="已处理" align="center" prop="status1" />
-	<el-table-column label="待处理完课" align="center" prop="status2" />
-	<el-table-column label="已处理完课" align="center" prop="status3" />
-    </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="remark">
-          <el-input  v-model="form.remark" placeholder="请输入备注"  type="textarea" :rows="3"/>
-        </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 { listQwWorkTask, getQwWorkTask, delQwWorkTask, addQwWorkTask, updateQwWorkTask, exportQwWorkTask,allListQwWorkTask } from "@/api/qw/QwWorkTask";
-import {getMyQwUserList, getMyQwCompanyList, handleInputAuthAppKey, updateUser} from "@/api/qw/user";
-export default {
-  name: "QwWorkTask",
-  data() {
-    return {
-	  actName:"0",
-      // 遮罩层
-      loading: true,
-      // 导出遮罩层
-      exportLoading: false,
-      // 选中数组
-      ids: [],
-	  myQwUserList:[],
-      // 非单个禁用
-      single: true,
-      // 非多个禁用
-      multiple: true,
-      // 显示搜索条件
-      showSearch: true,
-      // 总条数
-      total: 0,
-      // 企微任务看板表格数据
-      QwWorkTaskList: [],
-      // 弹出层标题
-      title: "",
-      // 是否显示弹出层
-      open: false,
-      // 状态 0 待处理 1 已处理 3 过期字典
-      statusOptions: [],
-      // 类别 1先导 2 课程 3 大小转 4 转人工字典
-      typeOptions: [],
-      // 查询参数
-      queryParams: {
-        pageNum: 1,
-        pageSize: 10,
-        extId: null,
-        qwUserId: null,
-        status: 0,
-        type: null,
-        title: null,
-        score: null,
-        sopId: null,
-        companyId: null,
-        companyUserId: null,
-		qwUserId: null,
-      },
-      // 表单参数
-      form: {},
-      // 表单校验
-      rules: {
-      }
-    };
-  },
-  created() {
-	this.handleGetMyQwUserList();
-    this.getDicts("sys_qw_work_task_status").then(response => {
-      this.statusOptions = response.data;
-    });
-    this.getDicts("sys_qw_work_task_type").then(response => {
-      this.typeOptions = response.data;
-    });
-  },
-  methods: {
-	getScoreStyle(score) {
-	let backgroundColor = '';
-	  if (score >= 15) {
-		backgroundColor = '#ff4d4f';    // 红色
-	  } else if (score >= 9) {
-		backgroundColor = '#ff7d45';    // 橘红
-	  } else if (score >= 4) {
-		backgroundColor = '#ffec3d';    // 黄色
-	  } else {
-		backgroundColor = '#ffffff';    // 白色
-	  }
-	  return { 
-		'background-color': backgroundColor,
-		'padding': '5px 10px',
-		'border-radius': '4px'
-	  };
-	},
-	formatTime(timeStr) {
-	      if (!timeStr && timeStr !== 0) return '';
-	      
-	      // 处理数字和字符串输入
-	      const str = String(timeStr).padStart(4, '0');
-	      
-	      // 提取有效部分
-	      const hours = str.substring(0, 2);
-	      const minutes = str.substring(2, 4);
-	      
-	      // 简单验证
-	      if (hours > 23 || minutes > 59) return '无效时间';
-	      
-	      return `${hours}:${minutes}`;
-	    },
-    /** 查询企微任务看板列表 */
-    getList() {
-      this.loading = true;
-      allListQwWorkTask(this.queryParams).then(response => {
-        this.QwWorkTaskList = response.rows;
-        this.total = response.total;
-        this.loading = false;
-      });
-    },
-	handleClickX(tab, event) {
-	  this.queryParams.status=tab.name;
-	  this.handleQuery();
-	},
-    // 取消按钮
-    cancel() {
-      this.open = false;
-      this.reset();
-    },
-    // 表单重置
-    reset() {
-      this.form = {
-        id: null,
-        extId: null,
-        qwUserId: null,
-        status: 0,
-        type: null,
-        title: null,
-        remark: null,
-        score: null,
-        sopId: null,
-        companyId: null,
-        companyUserId: null,
-        createTime: null,
-        updateTime: null
-      };
-      this.resetForm("form");
-    },
-    /** 搜索按钮操作 */
-    handleQuery() {
-      this.queryParams.pageNum = 1;
-      this.getList();
-    },
-	handleGetMyQwUserList(){
-	 this.getList();
-	},
-    /** 重置按钮操作 */
-    resetQuery() {
-      this.resetForm("queryForm");
-      this.handleQuery();
-    },
-    // 多选框选中数据
-    handleSelectionChange(selection) {
-      this.ids = selection.map(item => item.id)
-      this.single = selection.length!==1
-      this.multiple = !selection.length
-    },
-    /** 新增按钮操作 */
-    handleAdd() {
-      this.reset();
-      this.open = true;
-      this.title = "添加企微任务看板";
-    },
-    /** 修改按钮操作 */
-    handleUpdate(row) {
-      this.reset();
-      const id = row.id || this.ids
-        this.form = row;
-        this.open = true;
-        this.title = "处理任务";
-
-    },
-    /** 提交按钮 */
-    submitForm() {
-      this.$refs["form"].validate(valid => {
-        if (valid) {
-          if (this.form.id != null) {
-            updateQwWorkTask(this.form).then(response => {
-              this.msgSuccess("修改成功");
-              this.open = false;
-              this.getList();
-            });
-          } else {
-            addQwWorkTask(this.form).then(response => {
-              this.msgSuccess("新增成功");
-              this.open = false;
-              this.getList();
-            });
-          }
-        }
-      });
-    },
-    /** 删除按钮操作 */
-    handleDelete(row) {
-      const ids = row.id || this.ids;
-      this.$confirm('是否确认删除企微任务看板编号为"' + ids + '"的数据项?', "警告", {
-          confirmButtonText: "确定",
-          cancelButtonText: "取消",
-          type: "warning"
-        }).then(function() {
-          return delQwWorkTask(ids);
-        }).then(() => {
-          this.getList();
-          this.msgSuccess("删除成功");
-        }).catch(() => {});
-    },
-    /** 导出按钮操作 */
-    handleExport() {
-      const queryParams = this.queryParams;
-      this.$confirm('是否确认导出所有企微任务看板数据项?', "警告", {
-          confirmButtonText: "确定",
-          cancelButtonText: "取消",
-          type: "warning"
-        }).then(() => {
-          this.exportLoading = true;
-          return exportQwWorkTask(queryParams);
-        }).then(response => {
-          this.download(response.msg);
-          this.exportLoading = false;
-        }).catch(() => {});
-    }
-  }
-};
-</script>

+ 188 - 186
src/views/qw/QwWorkTask/index.vue

@@ -1,18 +1,36 @@
 <template>
   <div class="app-container">
     <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
-      <el-form-item label="企微账号" prop="qwUserId">
-              <el-select v-model="queryParams.qwUserId" placeholder="企微账号"  size="small" @change="updateQwuser()">
-                <el-option
-                  v-for="dict in myQwUserList"
-                  :key="dict.dictValue"
-                  :label="dict.dictLabel+'('+dict.corpName+')'"
-                  :value="dict.dictValue"
-                />
-              </el-select>
+      <el-form-item label="外部联系人id" prop="extId">
+        <el-input
+          v-model="queryParams.extId"
+          placeholder="请输入外部联系人id"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="企微用户id" prop="qwUserId">
+        <el-input
+          v-model="queryParams.qwUserId"
+          placeholder="请输入企微用户id"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="状态 0 待处理 1 已处理 3 过期" prop="status">
+        <el-select v-model="queryParams.status" placeholder="请选择状态 0 待处理 1 已处理 3 过期" clearable size="small">
+          <el-option
+            v-for="dict in statusOptions"
+            :key="dict.dictValue"
+            :label="dict.dictLabel"
+            :value="dict.dictValue"
+          />
+        </el-select>
       </el-form-item>
-      <el-form-item label="类别" prop="type">
-        <el-select v-model="queryParams.type" placeholder="请选择类别" clearable size="small">
+      <el-form-item label="类别 1先导 2 课程 3 大小转 4 转人工" prop="type">
+        <el-select v-model="queryParams.type" placeholder="请选择类别 1先导 2 课程 3 大小转 4 转人工" clearable size="small">
           <el-option
             v-for="dict in typeOptions"
             :key="dict.dictValue"
@@ -21,19 +39,25 @@
           />
         </el-select>
       </el-form-item>
-	  
-	  <el-form-item label="处理状态" prop="trackType">
-	    <el-select v-model="queryParams.trackType" placeholder="处理状态" clearable size="small">
-	      <el-option
-	        v-for="dict in trackTypeOptions"
-	        :key="dict.dictValue"
-	        :label="dict.dictLabel"
-	        :value="dict.dictValue"
-	      />
-	    </el-select>
-	  </el-form-item>
-	  
-      <el-form-item label="sop编号" prop="sopId">
+      <el-form-item label="标题" prop="title">
+        <el-input
+          v-model="queryParams.title"
+          placeholder="请输入标题"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="分值" prop="score">
+        <el-input
+          v-model="queryParams.score"
+          placeholder="请输入分值"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="sopid" prop="sopId">
         <el-input
           v-model="queryParams.sopId"
           placeholder="请输入sopid"
@@ -42,91 +66,114 @@
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
+      <el-form-item label="公司id" prop="companyId">
+        <el-input
+          v-model="queryParams.companyId"
+          placeholder="请输入公司id"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="用户id" prop="companyUserId">
+        <el-input
+          v-model="queryParams.companyUserId"
+          placeholder="请输入用户id"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
       <el-form-item>
         <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
       </el-form-item>
     </el-form>
 
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['qw:QwWorkTask:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['qw:QwWorkTask:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['qw:QwWorkTask:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          :loading="exportLoading"
+          @click="handleExport"
+          v-hasPermi="['qw:QwWorkTask:export']"
+        >导出</el-button>
+      </el-col>
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
-	<el-tabs type="card" v-model="actName" @tab-click="handleClickX">
-	  <el-tab-pane v-for="(item,index) in statusOptions" :label="item.dictLabel" :name="item.dictValue"></el-tab-pane>
-	</el-tabs>
+
     <el-table border v-loading="loading" :data="QwWorkTaskList" @selection-change="handleSelectionChange">
       <el-table-column type="selection" width="55" align="center" />
-      <el-table-column label="客户昵称" align="center" prop="name" />
-      <el-table-column label="企微账号" align="center" prop="qwUserName" />
-      <el-table-column label="状态" align="center" prop="status">
-		 <template slot-scope="scope">
-		   <dict-tag :options="statusOptions" :value="scope.row.status"/>
-		 </template>
-      </el-table-column>
-      <el-table-column label="类别" align="center" prop="type">
+      <el-table-column label="id" align="center" prop="id" />
+      <el-table-column label="外部联系人id" align="center" prop="extId" />
+      <el-table-column label="企微用户id" align="center" prop="qwUserId" />
+      <el-table-column label="状态 0 待处理 1 已处理 3 过期" align="center" prop="status">
         <template slot-scope="scope">
-          <dict-tag :options="typeOptions" :value="scope.row.type"/>
+          <dict-tag :options="statusOptions" :value="scope.row.status"/>
         </template>
       </el-table-column>
-	  <el-table-column label="处理状态" align="center" prop="trackType">
-	    <template slot-scope="scope">
-	      <dict-tag :options="trackTypeOptions" :value="scope.row.trackType"/>
-	    </template>
-	  </el-table-column>
-      <el-table-column label="标题" align="center" prop="title" />
-      <el-table-column label="描述" align="center" prop="description" />
-      <el-table-column label="分值" align="center" prop="score">
+      <el-table-column label="类别 1先导 2 课程 3 大小转 4 转人工" align="center" prop="type">
         <template slot-scope="scope">
-          <span :style="getScoreStyle(scope.row.score)">{{ scope.row.score }}</span>
+          <dict-tag :options="typeOptions" :value="scope.row.type"/>
         </template>
       </el-table-column>
-	  <el-table-column label="用户过往看课记录" align="center" width="200px">
-	    <template slot-scope="scope">
-	      <div style="display: flex; gap: 4px; justify-content: center;">
-	        <span 
-	          v-for="(log, index) in scope.row.logs" 
-	          :key="index"
-	          :style="{
-	            display: 'inline-block',
-	            width: '16px',
-	            height: '16px',
-	            borderRadius: '2px',
-	            backgroundColor: 
-	              log === 2 ? '#67C23A' : 
-				  log === 3 ? '#f55a4f' : 
-				  log === 4 ? '#FFD700' : 
-				  '#909399'
-	          }"
-	        ></span>
-	      </div>
-	    </template>
-	  </el-table-column>
-	    <el-table-column label="最晚看课时间" align="center">
-	        <template slot-scope="scope">
-	          {{ formatTime(scope.row.lastWatchTime) }}
-	        </template>
-	      </el-table-column>
-	  
-      <el-table-column label="sopId" align="center" prop="sopId" />
-      <el-table-column label="创建时间" align="center" prop="createTime" />
-      <el-table-column label="修改时间" align="center" prop="updateTime" />
+      <el-table-column label="标题" align="center" prop="title" />
+      <el-table-column label="备注" align="center" prop="remark" />
+      <el-table-column label="分值" align="center" prop="score" />
+      <el-table-column label="sopid" align="center" prop="sopId" />
+      <el-table-column label="公司id" align="center" prop="companyId" />
+      <el-table-column label="用户id" align="center" prop="companyUserId" />
       <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
         <template slot-scope="scope">
-          <el-button v-if="scope.row.status==0"
+          <el-button
             size="mini"
             type="text"
             icon="el-icon-edit"
             @click="handleUpdate(scope.row)"
-          >处理</el-button>
-		  <el-button v-if="scope.row.status==0"
-		    size="mini"
-		    type="text"
-		    @click="handleUpdate2(scope.row)"
-		  >未接通</el-button>
-		  <el-button v-if="scope.row.status==0"
-		    size="mini"
-		    type="text"
-		    @click="handleUpdate3(scope.row)"
-		  >接通</el-button>
+            v-hasPermi="['qw:QwWorkTask:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['qw:QwWorkTask:remove']"
+          >删除</el-button>
         </template>
       </el-table-column>
     </el-table>
@@ -142,18 +189,49 @@
     <!-- 添加或修改企微任务看板对话框 -->
     <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="trackType">
-		  <el-select v-model="form.trackType" placeholder="状态" clearable size="small">
-			  <el-option
-				v-for="dict in trackTypeOptions"
-				:key="dict.dictValue"
-				:label="dict.dictLabel"
-				:value="dict.dictValue"
-			  />
-		  </el-select>
-		</el-form-item> 
-        <el-form-item label="描述" prop="description">
-          <el-input  v-model="form.description" placeholder="请输入描述"  type="textarea" :rows="3"/>
+        <el-form-item label="外部联系人id" prop="extId">
+          <el-input v-model="form.extId" placeholder="请输入外部联系人id" />
+        </el-form-item>
+        <el-form-item label="企微用户id" prop="qwUserId">
+          <el-input v-model="form.qwUserId" placeholder="请输入企微用户id" />
+        </el-form-item>
+        <el-form-item label="状态 0 待处理 1 已处理 3 过期" prop="status">
+          <el-select v-model="form.status" placeholder="请选择状态 0 待处理 1 已处理 3 过期">
+            <el-option
+              v-for="dict in statusOptions"
+              :key="dict.dictValue"
+              :label="dict.dictLabel"
+              :value="parseInt(dict.dictValue)"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="类别 1先导 2 课程 3 大小转 4 转人工" prop="type">
+          <el-select v-model="form.type" placeholder="请选择类别 1先导 2 课程 3 大小转 4 转人工">
+            <el-option
+              v-for="dict in typeOptions"
+              :key="dict.dictValue"
+              :label="dict.dictLabel"
+              :value="parseInt(dict.dictValue)"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="标题" prop="title">
+          <el-input v-model="form.title" placeholder="请输入标题" />
+        </el-form-item>
+        <el-form-item label="备注" prop="remark">
+          <el-input v-model="form.remark" placeholder="请输入备注" />
+        </el-form-item>
+        <el-form-item label="分值" prop="score">
+          <el-input v-model="form.score" placeholder="请输入分值" />
+        </el-form-item>
+        <el-form-item label="sopid" prop="sopId">
+          <el-input v-model="form.sopId" placeholder="请输入sopid" />
+        </el-form-item>
+        <el-form-item label="公司id" prop="companyId">
+          <el-input v-model="form.companyId" placeholder="请输入公司id" />
+        </el-form-item>
+        <el-form-item label="用户id" prop="companyUserId">
+          <el-input v-model="form.companyUserId" placeholder="请输入用户id" />
         </el-form-item>
       </el-form>
       <div slot="footer" class="dialog-footer">
@@ -165,20 +243,18 @@
 </template>
 
 <script>
-import { listQwWorkTask, getQwWorkTask, delQwWorkTask, addQwWorkTask, updateQwWorkTask, exportQwWorkTask,updateQwWorkTask2,updateQwWorkTask3 } from "@/api/qw/QwWorkTask";
-import {getMyQwUserList, getMyQwCompanyList, handleInputAuthAppKey, updateUser} from "@/api/qw/user";
+import { listQwWorkTask, getQwWorkTask, delQwWorkTask, addQwWorkTask, updateQwWorkTask, exportQwWorkTask } from "@/api/qw/QwWorkTask";
+
 export default {
   name: "QwWorkTask",
   data() {
     return {
-	  actName:"0",
       // 遮罩层
       loading: true,
       // 导出遮罩层
       exportLoading: false,
       // 选中数组
       ids: [],
-	  myQwUserList:[],
       // 非单个禁用
       single: true,
       // 非多个禁用
@@ -195,7 +271,6 @@ export default {
       open: false,
       // 状态 0 待处理 1 已处理 3 过期字典
       statusOptions: [],
-	  trackTypeOptions:[],
       // 类别 1先导 2 课程 3 大小转 4 转人工字典
       typeOptions: [],
       // 查询参数
@@ -204,7 +279,7 @@ export default {
         pageSize: 10,
         extId: null,
         qwUserId: null,
-        status: 0,
+        status: null,
         type: null,
         title: null,
         score: null,
@@ -216,59 +291,19 @@ export default {
       form: {},
       // 表单校验
       rules: {
-		   trackType: [
-		      { required: true, message: '请选择处理类型', trigger: 'change' }
-		    ]
       }
     };
   },
   created() {
-	this.handleGetMyQwUserList();
-    this.getDicts("sys_qw_work_task_status").then(response => {
+    this.getList();
+    this.getDicts("sys_company_status").then(response => {
       this.statusOptions = response.data;
     });
-    this.getDicts("sys_qw_work_task_type").then(response => {
+    this.getDicts("sys_company_status").then(response => {
       this.typeOptions = response.data;
     });
-	this.getDicts("sys_qw_work_task_track_type").then(response => {
-	  this.trackTypeOptions = response.data;
-	});
-	
-
   },
   methods: {
-	getScoreStyle(score) {
-	let backgroundColor = '';
-	  if (score >= 15) {
-		backgroundColor = '#ff4d4f';    // 红色
-	  } else if (score >= 9) {
-		backgroundColor = '#ff7d45';    // 橘红
-	  } else if (score >= 4) {
-		backgroundColor = '#ffec3d';    // 黄色
-	  } else {
-		backgroundColor = '#ffffff';    // 白色
-	  }
-	  return { 
-		'background-color': backgroundColor,
-		'padding': '5px 10px',
-		'border-radius': '4px'
-	  };
-	},
-	formatTime(timeStr) {
-	      if (!timeStr && timeStr !== 0) return '';
-	      
-	      // 处理数字和字符串输入
-	      const str = String(timeStr).padStart(4, '0');
-	      
-	      // 提取有效部分
-	      const hours = str.substring(0, 2);
-	      const minutes = str.substring(2, 4);
-	      
-	      // 简单验证
-	      if (hours > 23 || minutes > 59) return '无效时间';
-	      
-	      return `${hours}:${minutes}`;
-	    },
     /** 查询企微任务看板列表 */
     getList() {
       this.loading = true;
@@ -278,10 +313,6 @@ export default {
         this.loading = false;
       });
     },
-	handleClickX(tab, event) {
-	  this.queryParams.status=tab.name;
-	  this.handleQuery();
-	},
     // 取消按钮
     cancel() {
       this.open = false;
@@ -293,7 +324,7 @@ export default {
         id: null,
         extId: null,
         qwUserId: null,
-        status: 0,
+        status: null,
         type: null,
         title: null,
         remark: null,
@@ -311,18 +342,6 @@ export default {
       this.queryParams.pageNum = 1;
       this.getList();
     },
-	handleGetMyQwUserList(){
-	
-	  getMyQwUserList().then(response => {
-	    this.myQwUserList = response.data;
-	    if(this.myQwUserList!=null){
-	      this.queryParams.qwUserId=this.myQwUserList[0].dictValue
-	      this.queryParams.corpId=this.myQwUserList[0].corpId
-	      this.getList();
-	    }
-	  });
-	
-	},
     /** 重置按钮操作 */
     resetQuery() {
       this.resetForm("queryForm");
@@ -344,29 +363,12 @@ export default {
     handleUpdate(row) {
       this.reset();
       const id = row.id || this.ids
-        this.form = row;
+      getQwWorkTask(id).then(response => {
+        this.form = response.data;
         this.open = true;
-        this.title = "处理任务";
-
+        this.title = "修改企微任务看板";
+      });
     },
-	
-	handleUpdate2(row) {
-	  var from={id:row.id }
-	  	updateQwWorkTask2(from).then(response => {
-	    this.msgSuccess("修改成功");
-
-	    this.getList();
-	  });
-	
-	},
-	handleUpdate3(row) {
-	  var from={id:row.id }
-		updateQwWorkTask3(from).then(response => {
-	  this.msgSuccess("修改成功");
-	
-	  this.getList();
-	});
-	},
     /** 提交按钮 */
     submitForm() {
       this.$refs["form"].validate(valid => {

+ 0 - 367
src/views/qw/QwWorkTask/qwWorkTask.vue

@@ -1,367 +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="qwUserName">
-             <el-input
-               v-model="queryParams.qwUserName"
-               placeholder="请输入企微昵称"
-               clearable
-               size="small"
-               @keyup.enter.native="handleQuery"
-             />
-      </el-form-item>
-      <el-form-item label="类别" prop="type">
-        <el-select v-model="queryParams.type" placeholder="请选择类别" clearable size="small">
-          <el-option
-            v-for="dict in typeOptions"
-            :key="dict.dictValue"
-            :label="dict.dictLabel"
-            :value="dict.dictValue"
-          />
-        </el-select>
-      </el-form-item>
-	  <el-form-item label="处理状态" prop="trackType">
-	    <el-select v-model="queryParams.trackType" placeholder="处理状态" clearable size="small">
-	      <el-option
-	        v-for="dict in trackTypeOptions"
-	        :key="dict.dictValue"
-	        :label="dict.dictLabel"
-	        :value="dict.dictValue"
-	      />
-	    </el-select>
-	  </el-form-item>
-      <el-form-item label="sop编号" prop="sopId">
-        <el-input
-          v-model="queryParams.sopId"
-          placeholder="请输入sopid"
-          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>
-
-      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
-    </el-row>
-	<el-tabs type="card" v-model="actName" @tab-click="handleClickX">
-	  <el-tab-pane v-for="(item,index) in statusOptions" :label="item.dictLabel" :name="item.dictValue"></el-tab-pane>
-	</el-tabs>
-    <el-table border v-loading="loading" :data="QwWorkTaskList" @selection-change="handleSelectionChange">
-      <el-table-column type="selection" width="55" align="center" />
-      <el-table-column label="客户昵称" align="center" prop="name" />
-      <el-table-column label="企微账号" align="center" prop="qwUserName" />
-      <el-table-column label="状态" align="center" prop="status">
-		 <template slot-scope="scope">
-		   <dict-tag :options="statusOptions" :value="scope.row.status"/>
-		 </template>
-      </el-table-column>
-      <el-table-column label="类别" align="center" prop="type">
-        <template slot-scope="scope">
-          <dict-tag :options="typeOptions" :value="scope.row.type"/>
-        </template>
-      </el-table-column>
-	  <el-table-column label="处理状态" align="center" prop="trackType">
-	    <template slot-scope="scope">
-	      <dict-tag :options="trackTypeOptions" :value="scope.row.trackType"/>
-	    </template>
-	  </el-table-column>
-      <el-table-column label="标题" align="center" prop="title" />
-      <el-table-column label="备注" align="center" prop="remark" />
-      <el-table-column label="分值" align="center" prop="score">
-        <template slot-scope="scope">
-          <span :style="getScoreStyle(scope.row.score)">{{ scope.row.score }}</span>
-        </template>
-      </el-table-column>
-	  <el-table-column label="用户过往看课记录" align="center" width="200px">
-	    <template slot-scope="scope">
-	      <div style="display: flex; gap: 4px; justify-content: center;">
-	        <span 
-	          v-for="(log, index) in scope.row.logs" 
-	          :key="index"
-	          :style="{
-	            display: 'inline-block',
-	            width: '16px',
-	            height: '16px',
-	            borderRadius: '2px',
-	            backgroundColor: 
-	              log === 2 ? '#67C23A' : 
-				  log === 3 ? '#f55a4f' : 
-				  log === 4 ? '#FFD700' : 
-				  '#909399'
-	          }"
-	        ></span>
-	      </div>
-	    </template>
-	  </el-table-column>
-	    <el-table-column label="最晚看课时间" align="center">
-	        <template slot-scope="scope">
-	          {{ formatTime(scope.row.lastWatchTime) }}
-	        </template>
-	      </el-table-column>
-	  
-      <el-table-column label="sopId" align="center" prop="sopId" />
-      <el-table-column label="创建时间" align="center" prop="createTime" />
-      <el-table-column label="修改时间" align="center" prop="updateTime" />
-<!--      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
-        <template slot-scope="scope">
-          <el-button v-if="scope.row.status==0"
-            size="mini"
-            type="text"
-            icon="el-icon-edit"
-            @click="handleUpdate(scope.row)"
-          >处理</el-button>
-        </template>
-      </el-table-column> -->
-    </el-table>
-
-    <pagination
-      v-show="total>0"
-      :total="total"
-      :page.sync="queryParams.pageNum"
-      :limit.sync="queryParams.pageSize"
-      @pagination="getList"
-    />
-
-    <!-- 添加或修改企微任务看板对话框 -->
-    <el-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="remark">
-          <el-input  v-model="form.remark" placeholder="请输入备注"  type="textarea" :rows="3"/>
-        </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 { listQwWorkTask, getQwWorkTask, delQwWorkTask, addQwWorkTask, updateQwWorkTask, exportQwWorkTask,glList} from "@/api/qw/QwWorkTask";
-import {getMyQwUserList, getMyQwCompanyList, handleInputAuthAppKey, updateUser} from "@/api/qw/user";
-export default {
-  name: "QwWorkTask",
-  data() {
-    return {
-	  actName:"0",
-      // 遮罩层
-      loading: true,
-      // 导出遮罩层
-      exportLoading: false,
-      // 选中数组
-      ids: [],
-	  myQwUserList:[],
-      // 非单个禁用
-      single: true,
-      // 非多个禁用
-      multiple: true,
-      // 显示搜索条件
-      showSearch: true,
-      // 总条数
-      total: 0,
-      // 企微任务看板表格数据
-      QwWorkTaskList: [],
-      // 弹出层标题
-      title: "",
-      // 是否显示弹出层
-      open: false,
-      // 状态 0 待处理 1 已处理 3 过期字典
-      statusOptions: [],
-      // 类别 1先导 2 课程 3 大小转 4 转人工字典
-      typeOptions: [],
-	  trackTypeOptions:[],
-      // 查询参数
-      queryParams: {
-        pageNum: 1,
-        pageSize: 10,
-        extId: null,
-        qwUserId: null,
-        status: 0,
-        type: null,
-        title: null,
-        score: null,
-        sopId: null,
-        companyId: null,
-        companyUserId: null,
-      },
-      // 表单参数
-      form: {},
-      // 表单校验
-      rules: {
-      }
-    };
-  },
-  created() {
-	this.handleGetMyQwUserList();
-    this.getDicts("sys_qw_work_task_status").then(response => {
-      this.statusOptions = response.data;
-    });
-    this.getDicts("sys_qw_work_task_type").then(response => {
-      this.typeOptions = response.data;
-    });
-	this.getDicts("sys_qw_work_task_track_type").then(response => {
-	  this.trackTypeOptions = response.data;
-	});
-  },
-  methods: {
-	getScoreStyle(score) {
-	let backgroundColor = '';
-	  if (score >= 15) {
-		backgroundColor = '#ff4d4f';    // 红色
-	  } else if (score >= 9) {
-		backgroundColor = '#ff7d45';    // 橘红
-	  } else if (score >= 4) {
-		backgroundColor = '#ffec3d';    // 黄色
-	  } else {
-		backgroundColor = '#ffffff';    // 白色
-	  }
-	  return { 
-		'background-color': backgroundColor,
-		'padding': '5px 10px',
-		'border-radius': '4px'
-	  };
-	},
-	formatTime(timeStr) {
-	      if (!timeStr && timeStr !== 0) return '';
-	      
-	      // 处理数字和字符串输入
-	      const str = String(timeStr).padStart(4, '0');
-	      
-	      // 提取有效部分
-	      const hours = str.substring(0, 2);
-	      const minutes = str.substring(2, 4);
-	      
-	      // 简单验证
-	      if (hours > 23 || minutes > 59) return '无效时间';
-	      
-	      return `${hours}:${minutes}`;
-	    },
-    /** 查询企微任务看板列表 */
-    getList() {
-      this.loading = true;
-      glList(this.queryParams).then(response => {
-        this.QwWorkTaskList = response.rows;
-        this.total = response.total;
-        this.loading = false;
-      });
-    },
-	handleClickX(tab, event) {
-	  this.queryParams.status=tab.name;
-	  this.handleQuery();
-	},
-    // 取消按钮
-    cancel() {
-      this.open = false;
-      this.reset();
-    },
-    // 表单重置
-    reset() {
-      this.form = {
-        id: null,
-        extId: null,
-        qwUserId: null,
-        status: 0,
-        type: null,
-        title: null,
-        remark: null,
-        score: null,
-        sopId: null,
-        companyId: null,
-        companyUserId: null,
-        createTime: null,
-        updateTime: null
-      };
-      this.resetForm("form");
-    },
-    /** 搜索按钮操作 */
-    handleQuery() {
-      this.queryParams.pageNum = 1;
-      this.getList();
-    },
-	handleGetMyQwUserList(){
-
-		this.getList();
-	},
-    /** 重置按钮操作 */
-    resetQuery() {
-      this.resetForm("queryForm");
-      this.handleQuery();
-    },
-    // 多选框选中数据
-    handleSelectionChange(selection) {
-      this.ids = selection.map(item => item.id)
-      this.single = selection.length!==1
-      this.multiple = !selection.length
-    },
-    /** 新增按钮操作 */
-    handleAdd() {
-      this.reset();
-      this.open = true;
-      this.title = "添加企微任务看板";
-    },
-    /** 修改按钮操作 */
-    handleUpdate(row) {
-      this.reset();
-      const id = row.id || this.ids
-        this.form = row;
-        this.open = true;
-        this.title = "处理任务";
-
-    },
-    /** 提交按钮 */
-    submitForm() {
-      this.$refs["form"].validate(valid => {
-        if (valid) {
-          if (this.form.id != null) {
-            updateQwWorkTask(this.form).then(response => {
-              this.msgSuccess("修改成功");
-              this.open = false;
-              this.getList();
-            });
-          } else {
-            addQwWorkTask(this.form).then(response => {
-              this.msgSuccess("新增成功");
-              this.open = false;
-              this.getList();
-            });
-          }
-        }
-      });
-    },
-    /** 删除按钮操作 */
-    handleDelete(row) {
-      const ids = row.id || this.ids;
-      this.$confirm('是否确认删除企微任务看板编号为"' + ids + '"的数据项?', "警告", {
-          confirmButtonText: "确定",
-          cancelButtonText: "取消",
-          type: "warning"
-        }).then(function() {
-          return delQwWorkTask(ids);
-        }).then(() => {
-          this.getList();
-          this.msgSuccess("删除成功");
-        }).catch(() => {});
-    },
-    /** 导出按钮操作 */
-    handleExport() {
-      const queryParams = this.queryParams;
-      this.$confirm('是否确认导出所有企微任务看板数据项?', "警告", {
-          confirmButtonText: "确定",
-          cancelButtonText: "取消",
-          type: "warning"
-        }).then(() => {
-          this.exportLoading = true;
-          return exportQwWorkTask(queryParams);
-        }).then(response => {
-          this.download(response.msg);
-          this.exportLoading = false;
-        }).catch(() => {});
-    }
-  }
-};
-</script>

+ 73 - 35
src/views/qw/autoTags/dayPartingIndex.vue

@@ -64,12 +64,10 @@
               </span>
           </template>
         </el-table-column>
-        <el-table-column label="添加的标签" align="center" prop="rulesTags">
+        <el-table-column label="添加的标签" align="center" prop="tagIdsName">
           <template slot-scope="scope">
-            <div>
-              <div v-for="tagId in scope.row.tagsSet" :key="tagId" style="display: inline;">
-                <el-tag :disable-transitions="false"  v-for="list in tagList" :key="list.id" style="margin: 3px;" v-if="list.tagId==tagId">{{list.name}}</el-tag>
-              </div>
+            <div v-for="name in scope.row.tagIdsName" style="display: inline;">
+              <el-tag type="success">{{ name }}</el-tag>
             </div>
           </template>
         </el-table-column>
@@ -258,8 +256,8 @@
 
       <el-dialog title="添加标签" :visible.sync="tagChange.open" width="800px" append-to-body>
         <div>搜索标签:
-          <el-input v-model="tagChange.tagName" placeholder="请输入标签名称" clearable size="small" style="width: 200px;margin-right: 10px" />
-          <el-button type="primary" icon="el-icon-search" size="mini" @click="handleSearchTags(tagChange.tagName)">搜索</el-button>
+          <el-input v-model="queryTagParams.name" placeholder="请输入标签名称" clearable size="small" style="width: 200px;margin-right: 10px" />
+          <el-button type="primary" icon="el-icon-search" size="mini" @click="handleSearchTags">搜索</el-button>
           <el-button type="primary" icon="el-icon-plus" size="mini" @click="cancelSearchTags">重置</el-button>
         </div>
         <div v-for="item in tagGroupList" :key="item.id" >
@@ -277,6 +275,13 @@
             </a>
           </div>
         </div>
+        <pagination
+          v-show="tagTotal>0"
+          :total="tagTotal"
+          :page.sync="queryTagParams.pageNum"
+          :limit.sync="queryTagParams.pageSize"
+          @pagination="getPageListTagGroup"
+        />
         <div slot="footer" class="dialog-footer">
           <el-button type="primary" @click="addTagSubmitForm(tagChange.index)">确 定</el-button>
           <el-button @click="addTagCancel(tagChange.index)">重 置</el-button>
@@ -294,13 +299,13 @@
 </template>
 
 <script>
-import { listTags,delTags, addTags, updateTags } from "@/api/qw/autoTags";
+import { listTags,delTags, addTags, updateTags } from "../../../api/qw/autoTags";
 import qwUserList from '@/views/qw/user/qwUserList.vue'
 import {listTag, searchTags} from '@/api/qw/tag'
 import dayPartingIndexDetails from '@/views/qw/autoTags/dayPartingIndexDetails.vue'
 import { allListTagGroup } from '@/api/qw/tagGroup'
 import { listUser } from '@/api/qw/user'
-import { getMyQwUserList,getMyQwCompanyList } from "@/api/qw/user";
+import { getMyQwUserList,getMyQwCompanyList } from "../../../api/qw/user";
 export default {
   name: "autoTags",
   components: { dayPartingIndexDetails, qwUserList },
@@ -315,6 +320,7 @@ export default {
       showSearch: true,
       // 总条数
       total: 0,
+      tagTotal:0,
       // 自动打标签主表格数据
       dayPartingIndexList: [],
       // 弹出层标题
@@ -340,6 +346,13 @@ export default {
         index:null,
       },
 
+      queryTagParams: {
+        pageNum: 1,
+        pageSize: 10,
+        total:0,
+        name:null,
+        corpId:null,
+      },
       //选择成员列表
       listUser:{
         title:"",
@@ -478,6 +491,14 @@ export default {
       this.reset();
       this.open = true;
       this.title = "添加规则";
+
+      this.getPageListTagGroup()
+
+      //所有的标签
+      listTag(this.queryTagParams).then(response => {
+        this.tagList = response.rows;
+      });
+
     },
 
     /**
@@ -485,20 +506,24 @@ export default {
     */
     afreshData(value){
 
-      //所有的标签分组
-      allListTagGroup({corpId:value}).then(response => {
-        this.tagGroupList = response.rows;
-      });
-
-      //所有的标签
-      listTag({corpId:value}).then(response => {
-        this.tagList = response.rows;
-      });
+      this.resetSearchQueryTag()
+      this.queryTagParams.corpId=value;
 
       //所有的员工
       listUser({corpId:value}).then(res=>{
         this.userList=res.rows;
       })
+
+    },
+
+    resetSearchQueryTag(){
+
+      this.queryTagParams= {
+        pageNum: 1,
+        pageSize: 10,
+        total:0,
+        name:null,
+      };
     },
 
     //选择群发的企业成员账号
@@ -524,13 +549,27 @@ export default {
 
 
     },
-    handleSearchTags(name){
+    handleSearchTags(){
 
-      searchTags({name:name,corpId:this.queryParams.corpId}).then(response => {
+      this.queryTagParams.corpId=this.queryParams.corpId;
+      searchTags(this.queryTagParams).then(response => {
         this.tagGroupList = response.rows;
       });
 
     },
+
+    getPageListTagGroup(){
+
+      this.queryTagParams.corpId=this.queryParams.corpId;
+
+      allListTagGroup(this.queryTagParams).then(response => {
+        this.tagGroupList = response.rows;
+        this.tagTotal = response.total;
+      });
+    },
+
+
+
     cancelSearchTags(){
       this.afreshData(this.queryParams.corpId)
     },
@@ -550,20 +589,20 @@ export default {
       listTags(this.queryParams).then(response => {
 
         this.dayPartingIndexList = response.rows;
-        this.dayPartingIndexList.forEach(item => {
-          const tagsSet = new Set(); // 为每个项目创建一个新的 Set
-          try {
-            const data = JSON.parse(item.rulesTags); // 将每个 rulesTags JSON 字符串解析为 JavaScript 对象
-            data.forEach(entry => {
-              entry.tags.forEach(tag => {
-                tagsSet.add(tag); // 将每个 tag 添加到 Set 中
-              });
-            });
-          } catch (error) {
-            this.$message.error("Error parsing JSON:",error)
-          }
-          item.tagsSet = Array.from(tagsSet); // 将 Set 转换为数组并添加到当前项目
-        });
+        // this.dayPartingIndexList.forEach(item => {
+        //   const tagsSet = new Set(); // 为每个项目创建一个新的 Set
+        //   try {
+        //     const data = JSON.parse(item.rulesTags); // 将每个 rulesTags JSON 字符串解析为 JavaScript 对象
+        //     data.forEach(entry => {
+        //       entry.tags.forEach(tag => {
+        //         tagsSet.add(tag); // 将每个 tag 添加到 Set 中
+        //       });
+        //     });
+        //   } catch (error) {
+        //     this.$message.error("Error parsing JSON:",error)
+        //   }
+        //   item.tagsSet = Array.from(tagsSet); // 将 Set 转换为数组并添加到当前项目
+        // });
 
         this.total = response.total;
         this.loading = false;
@@ -702,7 +741,6 @@ export default {
     /** 详情按钮操作 */
     handleDetails(row) {
 
-      console.log("this.row",row)
       this.reset();
 
       // 深拷贝表单数据

+ 9 - 9
src/views/qw/autoTags/dayPartingIndexDetails.vue

@@ -24,11 +24,11 @@
                       <el-tag :disable-transitions="false"  v-for="list in userList" :key="list.id" style="margin: 3px;" v-if="list.id==userId">{{list.nickName}}</el-tag>
                 </span>
               </el-descriptions-item>
-              <el-descriptions-item label="添加的标签" labelStyle="width: 80px">
-                <span v-for="tagId in groupIndexFrom.tagsSet" :key="tagId" style="display: inline;width: 300px">
-                      <el-tag :disable-transitions="false"  v-for="list in tagList" :key="list.id" style="margin: 3px;" v-if="list.tagId==tagId">{{list.name}}</el-tag>
-                </span>
-              </el-descriptions-item>
+<!--              <el-descriptions-item label="添加的标签" labelStyle="width: 80px">-->
+<!--                <span v-for="tagId in groupIndexFrom.tagsSet" :key="tagId" style="display: inline;width: 300px">-->
+<!--                      <el-tag :disable-transitions="false"  v-for="list in tagList" :key="list.id" style="margin: 3px;" v-if="list.tagId==tagId">{{list.name}}</el-tag>-->
+<!--                </span>-->
+<!--              </el-descriptions-item>-->
               <el-descriptions-item label="创建时间">{{groupIndexFrom.createTime}}</el-descriptions-item>
               <el-descriptions-item label="规则状态">
                 <el-switch
@@ -145,11 +145,11 @@
             <el-table-column label="客户名称" align="center" prop="externalUserName" />
             <el-table-column label="所属企微员工" align="center" prop="qwUsername" />
             <el-table-column label="所属销售" align="center" prop="companyName" />
-            <el-table-column label="添加的标签" align="center" prop="effectiveRules" >
+            <el-table-column label="添加的标签" align="center" prop="tagIdsName" >
               <template slot-scope="scope">
-                   <span v-for="tagId in JSON.parse(scope.row.effectiveRules)" :key="tagId" style="display: inline;">
-                    <el-tag :disable-transitions="false"  v-for="list in tagList" :key="list.id" style="margin: 3px;" v-if="list.tagId==tagId">{{list.name}}</el-tag>
-                  </span>
+                <div v-for="name in scope.row.tagIdsName" style="display: inline;">
+                  <el-tag type="success">{{ name }}</el-tag>
+                </div>
               </template>
             </el-table-column>
             <el-table-column label="添加好友时间" align="center" prop="addTime" width="180"/>

+ 60 - 36
src/views/qw/autoTags/groupIndex.vue

@@ -59,12 +59,10 @@
 
         <el-table v-loading="loading" :data="groupIndexList" border  height="550px">
           <el-table-column label="规则名称" align="center" prop="ruleName" />
-          <el-table-column label="添加的标签" align="center" prop="rulesTags" width="300px">
+          <el-table-column label="添加的标签" align="center" prop="tagIdsName" width="300px">
             <template slot-scope="scope">
-              <div>
-                <div v-for="tagId in scope.row.tagsSet" :key="tagId" style="display: inline;">
-                  <el-tag :disable-transitions="false"  v-for="list in tagList" :key="list.id" style="margin: 3px;" v-if="list.tagId==tagId">{{list.name}}</el-tag>
-                </div>
+              <div v-for="name in scope.row.tagIdsName" style="display: inline;">
+                <el-tag type="success">{{ name }}</el-tag>
               </div>
             </template>
           </el-table-column>
@@ -216,8 +214,8 @@
 
     <el-dialog title="添加标签" :visible.sync="tagChange.open" width="800px" append-to-body>
       <div>搜索标签:
-        <el-input v-model="tagChange.tagName" placeholder="请输入标签名称" clearable size="small" style="width: 200px;margin-right: 10px" />
-        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleSearchTags(tagChange.tagName)">搜索</el-button>
+        <el-input v-model="queryTagParams.name" placeholder="请输入标签名称" clearable size="small" style="width: 200px;margin-right: 10px" />
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleSearchTags">搜索</el-button>
         <el-button type="primary" icon="el-icon-plus" size="mini" @click="cancelSearchTags">重置</el-button>
       </div>
       <div v-for="item in tagGroupList" :key="item.id" >
@@ -235,6 +233,13 @@
           </a>
         </div>
       </div>
+      <pagination
+        v-show="tagTotal>0"
+        :total="tagTotal"
+        :page.sync="queryTagParams.pageNum"
+        :limit.sync="queryTagParams.pageSize"
+        @pagination="getPageListTagGroup"
+      />
       <div slot="footer" class="dialog-footer">
         <el-button type="primary" @click="addTagSubmitForm(tagChange.index)">确 定</el-button>
         <el-button @click="addTagCancel(tagChange.index)">重 置</el-button>
@@ -275,6 +280,7 @@ export default {
       showSearch: true,
       // 总条数
       total: 0,
+      tagTotal:0,
       // 自动打标签主表格数据
       groupIndexList: [],
       // 弹出层标题
@@ -295,7 +301,7 @@ export default {
       tagGroupList:[],
 
       //所有的标签
-      tagList:[],
+      // tagList:[],
 
       //选择的标签
       tagListFormIndex:[],
@@ -310,6 +316,14 @@ export default {
         open:false,
         title:'',
       },
+
+      queryTagParams: {
+        pageNum: 1,
+        pageSize: 10,
+        total:0,
+        name:null,
+        corpId:null,
+      },
       // 查询参数
       queryParams: {
         pageNum: 1,
@@ -407,16 +421,22 @@ export default {
      * 重新获取 部分数据
      */
     afreshData(value){
-      //所有的标签组
-      allListTagGroup({corpId:value}).then(response => {
-        this.tagGroupList = response.rows;
-      });
 
-      //所有的标签
-      listTag({corpId:value}).then(response => {
-        this.tagList = response.rows;
-      });
+      this.resetSearchQueryTag()
+      this.queryTagParams.corpId=value;
+
     },
+
+    resetSearchQueryTag(){
+
+      this.queryTagParams= {
+        pageNum: 1,
+        pageSize: 10,
+        total:0,
+        name:null,
+      };
+    },
+
     //选择的标签页
     handleClick(tab, event) {
       this.queryParams.type=tab.name
@@ -485,13 +505,25 @@ export default {
 
     },
 
-    handleSearchTags(name){
-
-      searchTags({name:name,corpId:this.queryParams.corpId}).then(response => {
+    handleSearchTags(){
+      this.queryTagParams.corpId=this.queryParams.corpId;
+      searchTags(this.queryTagParams).then(response => {
         this.tagGroupList = response.rows;
       });
 
     },
+
+    getPageListTagGroup(){
+
+      this.queryTagParams.corpId=this.queryParams.corpId;
+
+      allListTagGroup(this.queryTagParams).then(response => {
+        this.tagGroupList = response.rows;
+        this.tagTotal = response.total;
+      });
+    },
+
+
     cancelSearchTags(){
       this.afreshData(this.queryParams.corpId)
     },
@@ -559,9 +591,6 @@ export default {
       if (this.form.rulesTags.length >=5) {
         return this.$message.error('当前规则已达上限,无法添加规则');
       }
-
-
-
       this.form.rulesTags.push({rules:[],tags:[]})
     },
 
@@ -572,20 +601,6 @@ export default {
       listTags(this.queryParams).then(response => {
 
         this.groupIndexList = response.rows;
-        this.groupIndexList.forEach(item => {
-          const tagsSet = new Set(); // 为每个项目创建一个新的 Set
-          try {
-            const data = JSON.parse(item.rulesTags); // 将每个 rulesTags JSON 字符串解析为 JavaScript 对象
-            data.forEach(entry => {
-              entry.tags.forEach(tag => {
-                tagsSet.add(tag); // 将每个 tag 添加到 Set 中
-              });
-            });
-          } catch (error) {
-            this.$message.error("Error parsing JSON:",error)
-          }
-          item.tagsSet = Array.from(tagsSet); // 将 Set 转换为数组并添加到当前项目
-        });
 
         this.total = response.total;
         this.loading = false;
@@ -638,6 +653,15 @@ export default {
       this.reset();
       this.open = true;
       this.title = "添加规则";
+
+
+      this.getPageListTagGroup();
+
+      //所有的标签
+      listTag({corpId:this.queryParams.corpId}).then(response => {
+        this.tagList = response.rows;
+      });
+
     },
     handleAddThree(){
 

+ 0 - 1
src/views/qw/autoTags/groupIndexDetails.vue

@@ -335,7 +335,6 @@ export default {
       listAutoTagsLogs(this.queryParams).then(response => {
 
         this.autoTagsLogsList = response.rows;
-        console.log("群-",this.autoTagsLogsList)
 
         this.total = response.total;
         this.loading = false;

+ 288 - 117
src/views/qw/externalContact/index.vue

@@ -21,25 +21,14 @@
         />
       </el-form-item>
 
-      <el-form-item label="销售企微昵称" prop="qwUserId">
-        <el-select v-model="queryParams.qwUserId" clearable filterable remote
-                   placeholder="请输入销售企微昵称" :remote-method="loadQwUserOptions"
-                   v-select-load-more="loadMoreQwUserOptions"
-                   :loading="qwUserOptionsLoading">
-          <el-option
-            v-for="item in qwUserOptions"
-            :key="item.value"
-            :label="item.label"
-            :value="item.value">
-          </el-option>
-        </el-select>
-<!--        <el-input-->
-<!--          v-model="queryParams.qwUserName"-->
-<!--          placeholder="请输入销售企微昵称"-->
-<!--          clearable-->
-<!--          size="small"-->
-<!--          @keyup.enter.native="handleQuery"-->
-<!--        />-->
+      <el-form-item label="销售企微昵称" prop="qwUserName">
+        <el-input
+          v-model="queryParams.qwUserName"
+          placeholder="请输入销售企微昵称"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
       </el-form-item>
       <el-form-item label="用户类别" prop="type">
         <el-select v-model="queryParams.type" placeholder="请选择用户类别" clearable size="small">
@@ -138,13 +127,28 @@
         </el-select>
       </el-form-item>
       <el-form-item label="标签" prop="tagIds">
-        <el-select v-model="selectTags" remote multiple placeholder="请选择" filterable  style="width: 100%;">
-          <el-option
-            v-for="dict in tagList"
-            :label="dict.name"
-            :value="dict.tagId">
-          </el-option>
-        </el-select>
+<!--        <el-select v-model="selectTags" remote multiple placeholder="请选择" filterable  style="width: 100%;">-->
+<!--          <el-option-->
+<!--            v-for="dict in tagList"-->
+<!--            :label="dict.name"-->
+<!--            :value="dict.tagId">-->
+<!--          </el-option>-->
+<!--        </el-select>-->
+
+        <div @click="hangleChangeTags()" style="cursor: pointer; border: 1px solid #e6e6e6; background-color: white; overflow: hidden; flex-grow: 1;width: 250px">
+          <div style="min-height: 35px; max-height: 200px; overflow-y: auto;">
+            <el-tag type="success"
+                    closable
+                    :disable-transitions="false"
+                    v-for="list in this.selectTags"
+                    :key="list.tagId"
+                    @close="handleCloseTags(list)"
+                    style="margin: 3px;"
+            >{{list.name}}
+            </el-tag>
+          </div>
+        </div>
+
 
       </el-form-item>
       <el-form-item label="备注" prop="remark">
@@ -259,8 +263,8 @@
 
     <el-tabs type="card" v-model="isBindActiveName" @tab-click="handleClickX">
       <el-tab-pane label="全部" name="all"></el-tab-pane>
-      <el-tab-pane label="已绑定CRM" name="isBind"></el-tab-pane>
-      <el-tab-pane label="未绑定CRM" name="noBind"></el-tab-pane>
+<!--      <el-tab-pane label="已绑定CRM" name="isBind"></el-tab-pane>-->
+<!--      <el-tab-pane label="未绑定CRM" name="noBind"></el-tab-pane>-->
     </el-tabs>
 
     <el-table v-loading="loading" :data="externalContactList" @selection-change="handleSelectionChange" border>
@@ -293,10 +297,10 @@
       </el-table-column>
       <el-table-column label="备注" align="center" prop="remark" />
       <el-table-column label="描述信息" align="center" prop="description" />
-      <el-table-column label="标签" align="center" prop="tagIds" width="250px">
+      <el-table-column label="标签" align="center" prop="tagIdsName" width="250px">
         <template slot-scope="scope">
-          <div v-for="i in JSON.parse(scope.row.tagIds)" :key="i" style="display: inline;">
-          <el-tag type="success" v-for="ii in tagList" :key="ii.id" style="margin: 3px;" v-if="ii.tagId==i">{{ii.name}}</el-tag>
+          <div v-for="name in scope.row.tagIdsName"  style="display: inline;">
+          <el-tag type="success">{{ name }}</el-tag>
           </div>
         </template>
       </el-table-column>
@@ -364,15 +368,15 @@
       </el-table-column>
       <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="120px" fixed="right">
         <template slot-scope="scope">
-          <el-button
-            size="mini"
-            type="text"
-            icon="el-icon-edit-outline"
-            @click="handleUpdateCustomer(scope.row)"
-            >
-            <span v-if="scope.row.customerId">换绑CRM</span>
-            <span v-else>绑定CRM</span>
-          </el-button>
+<!--          <el-button-->
+<!--            size="mini"-->
+<!--            type="text"-->
+<!--            icon="el-icon-edit-outline"-->
+<!--            @click="handleUpdateCustomer(scope.row)"-->
+<!--            >-->
+<!--            <span v-if="scope.row.customerId">换绑CRM</span>-->
+<!--            <span v-else>绑定CRM</span>-->
+<!--          </el-button>-->
 
           <el-button
             size="mini"
@@ -380,8 +384,8 @@
             icon="el-icon-edit-outline"
             @click="handleUpdateUser(scope.row)"
             >
-            <span v-if="scope.row.fsUserId">换绑小程序用户</span>
-            <span v-else>绑定小程序用户</span>
+            <span v-if="scope.row.fsUserId">换绑会员</span>
+            <span v-else>绑定会员</span>
           </el-button>
 
           <el-button
@@ -391,22 +395,22 @@
             @click="handleUnBindUserId(scope.row)"
             v-hasPermi="['qw:externalContact:unBindUserId']"
           >
-            <span v-if="scope.row.fsUserId">解除小程序用户绑定</span>
+            <span v-if="scope.row.fsUserId">解除会员绑定</span>
           </el-button>
 
 
-          <el-button v-if="scope.row.customerId"
-            size="mini"
-            type="text"
-            icon="el-icon-paperclip"
-            @click="handleShow(scope.row)"
-          >CRM客户详情</el-button>
-		  <el-button
-		     size="mini"
-		     type="text"
-		     @click="handledetails(scope.row)"
-		     >用户信息
-		  </el-button>
+<!--          <el-button v-if="scope.row.customerId"-->
+<!--            size="mini"-->
+<!--            type="text"-->
+<!--            icon="el-icon-paperclip"-->
+<!--            @click="handleShow(scope.row)"-->
+<!--          >CRM客户详情</el-button>-->
+          <el-button
+             size="mini"
+             type="text"
+             @click="handledetails(scope.row)"
+             >AI获取用户信息
+          </el-button>
         </template>
       </el-table-column>
     </el-table>
@@ -423,6 +427,44 @@
       <customer-details  ref="customerDetails" @refreshList="refreshList"/>
     </el-drawer>
 
+
+    <!--  搜索标签   -->
+    <el-dialog :title="changeTagDialog.title" :visible.sync="changeTagDialog.open" style="width:100%;height: 100%" append-to-body>
+
+      <div>搜索标签:
+        <el-input v-model="queryTagParams.name" placeholder="请输入标签名称" clearable size="small" style="width: 200px;margin-right: 10px" />
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleSearchTags(queryTagParams.name)">搜索</el-button>
+        <el-button type="primary" icon="el-icon-plus" size="mini" @click="cancelSearchTags">重置</el-button>
+      </div>
+      <div v-for="item in tagGroupList" :key="item.id"  >
+        <div style="font-size: 20px;margin-top: 20px;margin-bottom: 20px;">
+          <span class="name-background">{{ item.name }}</span>
+        </div>
+        <div class="tag-container">
+          <a
+            v-for="tagItem in item.tag"
+            class="tag-box"
+            @click="tagSelection(tagItem)"
+            :class="{ 'tag-selected': tagItem.isSelected }"
+          >
+            {{ tagItem.name }}
+          </a>
+        </div>
+      </div>
+
+      <pagination
+        v-show="tagTotal>0"
+        :total="tagTotal"
+        :page.sync="queryTagParams.pageNum"
+        :limit.sync="queryTagParams.pageSize"
+        @pagination="getPageListTagGroup"
+      />
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="tagSubmitForm()">确 定</el-button>
+        <el-button @click="tagCancel()">取消</el-button>
+      </div>
+    </el-dialog>
+
     <el-dialog title="批量添加标签" :visible.sync="tagOpen" width="800px" append-to-body>
       <div>搜索标签:
         <el-input v-model="tagChange.tagName" placeholder="请输入标签名称" clearable size="small" style="width: 200px;margin-right: 10px" />
@@ -446,6 +488,13 @@
           </div>
         </div>
       </el-form>
+      <pagination
+        v-show="tagTotal>0"
+        :total="tagTotal"
+        :page.sync="queryTagParams.pageNum"
+        :limit.sync="queryTagParams.pageSize"
+        @pagination="getPageListTagGroup"
+      />
       <div slot="footer" class="dialog-footer">
         <el-button type="primary" @click="addTagSubmitForm()">确 定</el-button>
         <el-button @click="addTagCancel">取 消</el-button>
@@ -475,11 +524,19 @@
           </div>
         </div>
       </el-form>
+      <pagination
+        v-show="tagTotal>0"
+        :total="tagTotal"
+        :page.sync="queryTagParams.pageNum"
+        :limit.sync="queryTagParams.pageSize"
+        @pagination="getPageListTagGroup"
+      />
       <div slot="footer" class="dialog-footer">
         <el-button type="primary" @click="tagDelSubmitForm()">确 定</el-button>
         <el-button @click="DelTagCancel">取 消</el-button>
       </div>
     </el-dialog>
+
     <!-- 添加或修改企业微信客户对话框 -->
     <el-dialog :title="title" :visible.sync="open" width="700px" append-to-body>
       <el-form ref="form" :model="form" :rules="rules" label-width="100px">
@@ -577,8 +634,8 @@ import {
   setCustomerCourseSopList,
   unBindUserId, updateExternalContactCall
 } from '@/api/qw/externalContact'
-import { getMyQwCompanyList, getQwUserListLikeName} from "@/api/qw/user";
-import {listTag, searchTags,} from "@/api/qw/tag";
+import {getMyQwUserList, getMyQwCompanyList, updateUser} from "@/api/qw/user";
+import {listTag, getTag, searchTags,} from "@/api/qw/tag";
 import { allListTagGroup} from "@/api/qw/tagGroup";
 import mycustomer from '@/views/qw/externalContact/mycustomer'
 import customerDetails from '@/views/qw/externalContact/customerDetails'
@@ -698,6 +755,23 @@ export default {
       },
       // 来源字典
       addWayOptions: [],
+
+      //标签
+      changeTagDialog:{
+        title:"",
+        open:false,
+      },
+
+      queryTagParams:{
+        pageNum: 1,
+        pageSize: 10,
+        total:0,
+        name:null,
+        corpId:null,
+      },
+
+      tagTotal:0,
+
       // 查询参数
       queryParams: {
         pageNum: 1,
@@ -738,16 +812,7 @@ export default {
       statusOptions:[],
       // 表单校验
       rules: {
-      },
-      // 企微用户选项
-      qwUserOptionsParams: {
-        name: undefined,
-        hasNextPage: false,
-        pageNum: 1,
-        pageSize: 10
-      },
-      qwUserOptionsLoading: false,
-      qwUserOptions: [],
+      }
     };
   },
   created() {
@@ -768,14 +833,13 @@ export default {
             this.myQwCompanyList = response.data;
             if(this.myQwCompanyList!=null){
               this.queryParams.corpId=this.myQwCompanyList[0].dictValue
+
               var listTagFrom={corpId:this.queryParams.corpId}
-              allListTagGroup(listTagFrom).then(response => {
-                  this.tagGroupList = response.rows;
-              });
               listTag(listTagFrom).then(response => {
                 this.tagList = response.rows;
               });
               this.getList();
+
             }
     });
 
@@ -810,9 +874,6 @@ export default {
 		  },
     updateCorpId(){
       var listTagFrom={corpId:this.queryParams.corpId}
-        allListTagGroup(listTagFrom).then(response => {
-            this.tagGroupList = response.rows;
-        });
         listTag(listTagFrom).then(response => {
           this.tagList = response.rows;
         });
@@ -892,29 +953,106 @@ export default {
         return  this.$message('请选择需要添加标签的客户');
       }
 
-      for (let i = 0; i < this.tagGroupList.length; i++) {
-        for (let x = 0; x < this.tagGroupList[i].tag.length; x++) {
-          this.tagGroupList[i].tag[x].isSelected=false;
+      this.getPageListTagGroup();
+
+      setTimeout(() => {
+
+        for (let i = 0; i < this.tagGroupList.length; i++) {
+          for (let x = 0; x < this.tagGroupList[i].tag.length; x++) {
+            this.tagGroupList[i].tag[x].isSelected=false;
+          }
         }
-      }
+      }, 200);
+
+
       this.tagOpen = true;
 
     },
 
+
+    getPageListTagGroup(){
+      this.queryTagParams.corpId=this.queryParams.corpId
+      allListTagGroup(this.queryTagParams).then(response => {
+        this.tagGroupList = response.rows;
+        this.tagTotal = response.total;
+      });
+    },
+
     delUserTag(){
 
       if(this.ids==null||this.ids==""){
         return  this.$message('请选择需要移除标签的客户');
       }
-      for (let i = 0; i < this.tagGroupList.length; i++) {
-        for (let x = 0; x < this.tagGroupList[i].tag.length; x++) {
-          this.tagGroupList[i].tag[x].isSelected=false;
+      this.getPageListTagGroup();
+
+      setTimeout(() => {
+        for (let i = 0; i < this.tagGroupList.length; i++) {
+          for (let x = 0; x < this.tagGroupList[i].tag.length; x++) {
+            this.tagGroupList[i].tag[x].isSelected=false;
+          }
         }
-      }
+      }, 200);
+
       this.tagDelOpen = true;
 
     },
 
+
+    //搜索的标签
+    hangleChangeTags(){
+
+      this.changeTagDialog.title="搜索的标签"
+      this.changeTagDialog.open=true;
+
+      // 获取 tagListFormIndex 中的所有 tagId,用于快速查找
+      const selectedTagIds = new Set(
+        (this.selectTags || []).map(tagItem => tagItem?.tagId)
+      );
+
+      this.queryTagParams.name=null;
+
+      this.getPageListTagGroup();
+
+      setTimeout(() => {
+        for (let i = 0; i < this.tagGroupList.length; i++) {
+          for (let x = 0; x < this.tagGroupList[i].tag.length; x++) {
+            this.tagGroupList[i].tag[x].isSelected = selectedTagIds.has(this.tagGroupList[i].tag[x].tagId);
+          }
+        }
+      }, 200);
+
+
+    },
+
+    //删除一些选择的标签
+    handleCloseTags(list){
+      const ls = this.selectTags.findIndex(t => t.tagId === list.tagId);
+      if (ls !== -1) {
+        this.selectTags.splice(ls, 1);
+        this.selectTags = [...this.selectTags];
+      }
+
+      if (this.selectTags!=null && this.selectTags.length>0){
+        // 确保 this.form.tags 是数组
+        if (!this.queryParams.tagIds) {
+          this.queryParams.tagIds = []; // 如果未定义,初始化
+        } else {
+          this.queryParams.tagIds = []; // 清空已有数据
+        }
+
+        // 遍历并添加 tagId
+        this.selectTags.forEach(tag => {
+          if (tag.tagId) { // 确保 tagId 存在
+            this.queryParams.tagIds.push(tag.tagId);
+          }
+        });
+        this.queryParams.tagIds=this.queryParams.tagIds.join(",");
+      }else {
+        this.queryParams.tagIds=null;
+      }
+
+    },
+
     //重新获取页面数据
     refreshList(){
       this.getList();
@@ -1085,7 +1223,27 @@ export default {
     },
     /** 搜索按钮操作 */
     handleQuery() {
-      this.queryParams.tagIds=this.selectTags.join(',')
+
+      if (this.selectTags!=null && this.selectTags.length>0){
+        // 确保 this.form.tags 是数组
+        if (!this.queryParams.tagIds) {
+          this.queryParams.tagIds = []; // 如果未定义,初始化
+        } else {
+          this.queryParams.tagIds = []; // 清空已有数据
+        }
+
+        // 遍历并添加 tagId
+        this.selectTags.forEach(tag => {
+          if (tag.tagId) { // 确保 tagId 存在
+            this.queryParams.tagIds.push(tag.tagId);
+          }
+        });
+        this.queryParams.tagIds=this.queryParams.tagIds.join(",");
+      }else {
+        this.queryParams.tagIds=null;
+      }
+
+
       this.queryParams.pageNum = 1;
       this.getList();
     },
@@ -1098,7 +1256,54 @@ export default {
     },
 
     cancelSearchTags(){
-      this.updateCorpId()
+      this.resetSearchQueryTag()
+
+      this.getPageListTagGroup();
+    },
+    //确定选择标签
+    tagSubmitForm(){
+
+      for (let i = 0; i < this.tagGroupList.length; i++) {
+        for (let x = 0; x < this.tagGroupList[i].tag.length; x++) {
+          if (this.tagGroupList[i].tag[x].isSelected === true) {
+
+            if (!this.selectTags) {
+              this.selectTags = [];
+            }
+
+            // 检查当前 tag 是否已经存在于 tagListFormIndex[index] 中
+            let tagExists = this.selectTags.some(
+              tag => tag.id === this.tagGroupList[i].tag[x].id
+            );
+
+            // 如果 tag 不存在于 tagListFormIndex[index] 中,则新增
+            if (!tagExists) {
+              this.selectTags.push(this.tagGroupList[i].tag[x]);
+            }
+          }
+        }
+      }
+      if (!this.selectTags || this.selectTags.length === 0) {
+        return this.$message('请选择标签');
+      }
+
+      this.changeTagDialog.open = false;
+    },
+
+    //取消选择标签
+    tagCancel(){
+      this.changeTagDialog.open = false;
+    },
+
+
+    resetSearchQueryTag(){
+
+      this.queryTagParams= {
+        pageNum: 1,
+        pageSize: 10,
+        total:0,
+        name:null,
+      };
     },
     /** 重置按钮操作 */
     resetQuery() {
@@ -1393,40 +1598,6 @@ export default {
           this.download(response.msg);
           this.exportLoading = false;
         }).catch(() => {});
-    },
-    /**
-     * 加载企业微信用户下拉框数据
-     * @param query
-     */
-    loadQwUserOptions(query) {
-        this.qwUserOptions = [];
-        if (query === '') {
-          return
-        }
-
-        this.qwUserOptionsParams.pageNum = 1
-        this.qwUserOptionsParams.name = query
-        this.qwUserOptionsLoading = true
-        this.getQwUserListLikeName()
-    },
-    /**
-     * 获取企业微信用户下拉框数据
-     */
-    getQwUserListLikeName() {
-      getQwUserListLikeName(this.qwUserOptionsParams).then(response => {
-        this.qwUserOptions = [...this.qwUserOptions, ...response.data.list]
-        this.qwUserOptionsParams.hasNextPage = response.data.hasNextPage
-        this.qwUserOptionsLoading = false
-      })
-    },
-    /**
-     * 加载更多企业微信用户下拉框数据
-     */
-    loadMoreQwUserOptions() {
-      if (this.qwUserOptionsParams.hasNextPage) {
-        this.qwUserOptionsParams.pageNum++
-        this.getQwUserListLikeName()
-      }
     }
   }
 };

+ 256 - 29
src/views/qw/externalContact/myExternalContact.vue

@@ -120,13 +120,28 @@
         </el-select>
       </el-form-item>
       <el-form-item label="标签" prop="tagIds">
-        <el-select v-model="selectTags" remote multiple placeholder="请选择" filterable  style="width: 100%;">
-          <el-option
-            v-for="dict in tagList"
-            :label="dict.name"
-            :value="dict.tagId">
-          </el-option>
-          </el-select>
+<!--        <el-select v-model="selectTags" remote multiple placeholder="请选择" filterable  style="width: 100%;">-->
+<!--          <el-option-->
+<!--            v-for="dict in tagList"-->
+<!--            :label="dict.name"-->
+<!--            :value="dict.tagId">-->
+<!--          </el-option>-->
+<!--          </el-select>-->
+
+        <div @click="hangleChangeTags()" style="cursor: pointer; border: 1px solid #e6e6e6; background-color: white; overflow: hidden; flex-grow: 1;width: 250px">
+          <div style="min-height: 35px; max-height: 200px; overflow-y: auto;">
+            <el-tag type="success"
+                    closable
+                    :disable-transitions="false"
+                    v-for="list in this.selectTags"
+                    :key="list.tagId"
+                    @close="handleCloseTags(list)"
+                    style="margin: 3px;"
+            >{{list.name}}
+            </el-tag>
+          </div>
+        </div>
+
       </el-form-item>
       <el-form-item label="备注" prop="remark">
         <el-input
@@ -297,10 +312,10 @@
       </el-table-column>
       <el-table-column label="备注" align="center" prop="remark" />
       <el-table-column label="描述信息" align="center" prop="description" />
-      <el-table-column label="标签" align="center" prop="tagIds" width="250px">
+      <el-table-column label="标签" align="center" prop="tagIdsName" width="250px">
         <template slot-scope="scope">
-          <div v-for="i in JSON.parse(scope.row.tagIds)" :key="i" style="display: inline;">
-          <el-tag type="success" v-for="ii in tagList" :key="ii.id" style="margin: 3px;" v-if="ii.tagId==i">{{ii.name}}</el-tag>
+          <div v-for="name in scope.row.tagIdsName" style="display: inline;">
+            <el-tag type="success">{{ name }}</el-tag>
           </div>
         </template>
       </el-table-column>
@@ -430,6 +445,44 @@
       <customer-details  ref="customerDetails" @refreshList="refreshList"/>
     </el-drawer>
 
+
+    <!--  搜索标签   -->
+    <el-dialog :title="changeTagDialog.title" :visible.sync="changeTagDialog.open" style="width:100%;height: 100%" append-to-body>
+
+      <div>搜索标签:
+        <el-input v-model="queryTagParams.name" placeholder="请输入标签名称" clearable size="small" style="width: 200px;margin-right: 10px" />
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleSearchTags(queryTagParams.name)">搜索</el-button>
+        <el-button type="primary" icon="el-icon-plus" size="mini" @click="cancelSearchTags">重置</el-button>
+      </div>
+      <div v-for="item in tagGroupList" :key="item.id"  >
+        <div style="font-size: 20px;margin-top: 20px;margin-bottom: 20px;">
+          <span class="name-background">{{ item.name }}</span>
+        </div>
+        <div class="tag-container">
+          <a
+            v-for="tagItem in item.tag"
+            class="tag-box"
+            @click="tagSelection(tagItem)"
+            :class="{ 'tag-selected': tagItem.isSelected }"
+          >
+            {{ tagItem.name }}
+          </a>
+        </div>
+      </div>
+
+      <pagination
+        v-show="tagTotal>0"
+        :total="tagTotal"
+        :page.sync="queryTagParams.pageNum"
+        :limit.sync="queryTagParams.pageSize"
+        @pagination="getPageListTagGroup"
+      />
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="tagSubmitForm()">确 定</el-button>
+        <el-button @click="tagCancel()">取消</el-button>
+      </div>
+    </el-dialog>
+
     <el-dialog title="批量添加标签" :visible.sync="tagOpen" width="800px" append-to-body>
       <div>搜索标签:
         <el-input v-model="tagChange.tagName" placeholder="请输入标签名称" clearable size="small" style="width: 200px;margin-right: 10px" />
@@ -453,6 +506,13 @@
           </div>
         </div>
       </el-form>
+      <pagination
+        v-show="tagTotal>0"
+        :total="tagTotal"
+        :page.sync="queryTagParams.pageNum"
+        :limit.sync="queryTagParams.pageSize"
+        @pagination="getPageListTagGroup"
+      />
       <div slot="footer" class="dialog-footer">
         <el-button type="primary" @click="addTagSubmitForm()">确 定</el-button>
         <el-button @click="addTagCancel">取 消</el-button>
@@ -482,6 +542,13 @@
           </div>
         </div>
       </el-form>
+      <pagination
+        v-show="tagTotal>0"
+        :total="tagTotal"
+        :page.sync="queryTagParams.pageNum"
+        :limit.sync="queryTagParams.pageSize"
+        @pagination="getPageListTagGroup"
+      />
       <div slot="footer" class="dialog-footer">
         <el-button type="primary" @click="tagDelSubmitForm()">确 定</el-button>
         <el-button @click="DelTagCancel">取 消</el-button>
@@ -590,7 +657,7 @@ import {
 import info from "@/views/qw/externalContact/info.vue";
 import {getMyQwUserList, getMyQwCompanyList, handleInputAuthAppKey, updateUser} from "@/api/qw/user";
 import {listTag, getTag, searchTags,} from "@/api/qw/tag";
-import { allListTagGroup} from "@/api/qw/tagGroup";
+import { allListTagGroup} from "../../../api/qw/tagGroup";
 import mycustomer from '@/views/qw/externalContact/mycustomer'
 import customerDetails from '@/views/qw/externalContact/customerDetails'
 import SopDialog from '@/views/course/sop/SopDialog.vue'
@@ -644,6 +711,7 @@ export default {
       showSearch: true,
       // 总条数
       total: 0,
+
       // 企业微信客户表格数据
       externalContactList: [],
       // 弹出层标题
@@ -742,6 +810,22 @@ export default {
         level:null,
         levelType:null
       },
+
+      queryTagParams:{
+        pageNum: 1,
+        pageSize: 10,
+        total:0,
+        name:null,
+        corpId:null,
+      },
+
+      tagTotal:0,
+
+      //标签
+      changeTagDialog:{
+        title:"",
+        open:false,
+      },
       selectTags:[],
       // 表单参数
       form: {},
@@ -812,14 +896,103 @@ export default {
           }
       }
       var listTagFrom={corpId:this.queryParams.corpId}
-        allListTagGroup(listTagFrom).then(response => {
-            this.tagGroupList = response.rows;
-        });
+
         listTag(listTagFrom).then(response => {
           this.tagList = response.rows;
         });
+
         this.getList();
      },
+
+    //搜索的标签
+    hangleChangeTags(){
+
+      this.changeTagDialog.title="搜索的标签"
+      this.changeTagDialog.open=true;
+
+      // 获取 tagListFormIndex 中的所有 tagId,用于快速查找
+      const selectedTagIds = new Set(
+        (this.selectTags || []).map(tagItem => tagItem?.tagId)
+      );
+
+      this.queryTagParams.name=null;
+      this.getPageListTagGroup();
+
+      setTimeout(() => {
+        for (let i = 0; i < this.tagGroupList.length; i++) {
+          for (let x = 0; x < this.tagGroupList[i].tag.length; x++) {
+            this.tagGroupList[i].tag[x].isSelected = selectedTagIds.has(this.tagGroupList[i].tag[x].tagId);
+          }
+        }
+      }, 200);
+
+
+    },
+
+    //确定选择标签
+    tagSubmitForm(){
+
+        for (let i = 0; i < this.tagGroupList.length; i++) {
+          for (let x = 0; x < this.tagGroupList[i].tag.length; x++) {
+            if (this.tagGroupList[i].tag[x].isSelected === true) {
+
+              if (!this.selectTags) {
+                this.selectTags = [];
+              }
+
+              // 检查当前 tag 是否已经存在于 tagListFormIndex[index] 中
+              let tagExists = this.selectTags.some(
+                tag => tag.id === this.tagGroupList[i].tag[x].id
+              );
+
+              // 如果 tag 不存在于 tagListFormIndex[index] 中,则新增
+              if (!tagExists) {
+                this.selectTags.push(this.tagGroupList[i].tag[x]);
+              }
+            }
+          }
+        }
+        if (!this.selectTags || this.selectTags.length === 0) {
+          return this.$message('请选择标签');
+        }
+
+      this.changeTagDialog.open = false;
+    },
+
+    //取消选择标签
+    tagCancel(){
+      this.changeTagDialog.open = false;
+    },
+
+    //删除一些选择的标签
+    handleCloseTags(list){
+      const ls = this.selectTags.findIndex(t => t.tagId === list.tagId);
+      if (ls !== -1) {
+        this.selectTags.splice(ls, 1);
+        this.selectTags = [...this.selectTags];
+      }
+
+      if (this.selectTags!=null && this.selectTags.length>0){
+        // 确保 this.form.tags 是数组
+        if (!this.queryParams.tagIds) {
+          this.queryParams.tagIds = []; // 如果未定义,初始化
+        } else {
+          this.queryParams.tagIds = []; // 清空已有数据
+        }
+
+        // 遍历并添加 tagId
+        this.selectTags.forEach(tag => {
+          if (tag.tagId) { // 确保 tagId 存在
+            this.queryParams.tagIds.push(tag.tagId);
+          }
+        });
+        this.queryParams.tagIds=this.queryParams.tagIds.join(",");
+      }else {
+        this.queryParams.tagIds=null;
+      }
+
+    },
+
     /** 查询企业微信客户列表 */
     getList() {
       this.loading = true;
@@ -829,6 +1002,15 @@ export default {
         this.loading = false;
       });
     },
+
+    getPageListTagGroup(){
+      this.queryTagParams.corpId=this.queryParams.corpId
+      allListTagGroup(this.queryTagParams).then(response => {
+        this.tagGroupList = response.rows;
+        this.tagTotal = response.total;
+      });
+    },
+
     handleSearchTags(name){
 
       searchTags({name:name,corpId:this.queryParams.corpId}).then(response => {
@@ -852,18 +1034,31 @@ export default {
     },
 
     cancelSearchTags(){
-      this.handleGetTagsList()
+
+      this.resetSearchQueryTag()
+
+      this.getPageListTagGroup();
+
+    },
+
+    resetSearchQueryTag(){
+
+      this.queryTagParams= {
+        pageNum: 1,
+        pageSize: 10,
+        total:0,
+        name:null,
+      };
     },
 
+
     handleGetTagsList(){
       var listTagFrom={corpId:this.queryParams.corpId}
-      allListTagGroup(listTagFrom).then(response => {
-        this.tagGroupList = response.rows;
-      });
       listTag(listTagFrom).then(response => {
         this.tagList = response.rows;
       });
     },
+
     bindMiniCustomerId(row){
 
       this.userForm.fsUserId=row;
@@ -917,18 +1112,23 @@ export default {
 
     addUserTag(){
 
+
       if(this.ids==null||this.ids==""){
         return  this.$message('请选择需要添加标签的客户');
       }
 
-      for (let i = 0; i < this.tagGroupList.length; i++) {
-        for (let x = 0; x < this.tagGroupList[i].tag.length; x++) {
-          this.tagGroupList[i].tag[x].isSelected=false;
-        }
-      }
-      this.tagOpen = true;
+      this.getPageListTagGroup();
 
+      setTimeout(() => {
+
+        for (let i = 0; i < this.tagGroupList.length; i++) {
+          for (let x = 0; x < this.tagGroupList[i].tag.length; x++) {
+            this.tagGroupList[i].tag[x].isSelected=false;
+          }
+        }
+      }, 200);
 
+      this.tagOpen = true;
 
     },
 
@@ -937,11 +1137,17 @@ export default {
       if(this.ids==null||this.ids==""){
         return  this.$message('请选择需要移除标签的客户');
       }
-      for (let i = 0; i < this.tagGroupList.length; i++) {
-        for (let x = 0; x < this.tagGroupList[i].tag.length; x++) {
-          this.tagGroupList[i].tag[x].isSelected=false;
+
+      this.getPageListTagGroup();
+
+      setTimeout(() => {
+        for (let i = 0; i < this.tagGroupList.length; i++) {
+          for (let x = 0; x < this.tagGroupList[i].tag.length; x++) {
+            this.tagGroupList[i].tag[x].isSelected=false;
+          }
         }
-      }
+      }, 200);
+
       this.tagDelOpen = true;
 
     },
@@ -1114,7 +1320,28 @@ export default {
     },
     /** 搜索按钮操作 */
     handleQuery() {
-      this.queryParams.tagIds=this.selectTags.join(',')
+
+
+      if (this.selectTags!=null && this.selectTags.length>0){
+        // 确保 this.form.tags 是数组
+        if (!this.queryParams.tagIds) {
+          this.queryParams.tagIds = []; // 如果未定义,初始化
+        } else {
+          this.queryParams.tagIds = []; // 清空已有数据
+        }
+
+        // 遍历并添加 tagId
+        this.selectTags.forEach(tag => {
+          if (tag.tagId) { // 确保 tagId 存在
+            this.queryParams.tagIds.push(tag.tagId);
+          }
+        });
+        this.queryParams.tagIds=this.queryParams.tagIds.join(",");
+      }else {
+        this.queryParams.tagIds=null;
+      }
+
+
       this.queryParams.pageNum = 1;
       this.getList();
     },

+ 3 - 3
src/views/qw/friendWelcome/indexNew.vue

@@ -342,9 +342,9 @@
                               <el-dropdown-item command="link">
                                 <i class="el-icon-link" style="margin-right: 10px;"></i>链接
                               </el-dropdown-item>
-                              <el-dropdown-item command="miniprogram">
-                                <i class="el-icon-link" style="margin-right: 10px;"></i>小程序
-                              </el-dropdown-item>
+<!--                              <el-dropdown-item command="miniprogram">-->
+<!--                                <i class="el-icon-link" style="margin-right: 10px;"></i>小程序-->
+<!--                              </el-dropdown-item>-->
                             </el-dropdown-menu>
 
                             <span class="el-dropdown-link">

+ 1 - 1
src/views/qw/groupMsgUser/groupMsg.vue

@@ -220,7 +220,7 @@
     </el-dialog>
 
     <!--  选择的标签   -->
-    <el-dialog :title="changeTagDialog.title" :visible.sync="changeTagDialog.open" style="width: 1300px;height: 100%" append-to-body>
+    <el-dialog :title="changeTagDialog.title" :visible.sync="changeTagDialog.open"style="width: 1300px;height: 100%" append-to-body>
       <tag-group-list ref="TagGroupList" :change-type="changeTagDialog.type" @selectTagsList="selectTagsList"></tag-group-list>
     </el-dialog>
 

+ 90 - 98
src/views/qw/sop/addSop.vue

@@ -318,7 +318,7 @@
           :total="total"
           :page.sync="queryTagParams.pageNum"
           :limit.sync="queryTagParams.pageSize"
-          @pagination="selectAllListTagGroup"
+          @pagination="getPageListTagGroup"
         />
         <div slot="footer" class="dialog-footer">
           <el-button type="primary" @click="tagSubmitForm(changeTagDialog.type)">确 定</el-button>
@@ -330,21 +330,22 @@
 </template>
 
 <script>
-import { listSop, getSop, delSop, addSop, updateSop, exportSop,courseList,videoList } from "@/api/qw/sop";
+import { listSop, getSop, delSop, addSop, updateSop, exportSop,courseList,videoList } from "../../../api/qw/sop";
 import { listSopTemp, getSopTemp, delSopTemp, addSopTemp, updateSopTemp, exportSopTemp } from "@/api/qw/sopTemp";
-import {getQwAllUserList, listUser, qwList} from '@/api/company/companyUser'
-import qwUserList from '@/views/qw/user/qwUserList.vue'
-import companyUserList from '@/views/company/companyUser/companyUserList.vue'
-import ImageUpload from "@/views/qw/sop/ImageUpload";
-import CustomerGroupDetails from '@/views/qw/groupMsg/customerGroupDetails.vue'
-import sopLogsDetails from '@/views/qw/sopLogs/sopLogsList.vue'
-import {listTag, getTag, searchTags,} from "@/api/qw/tag";
-import {listWxUserGroup, sopListWxUserGroup} from "@/api/wxUser/wxUserGroup";
-import SopTemp from "@/views/qw/sopTemp/sopTemp.vue";
-import {allListTagGroup} from "@/api/qw/tagGroup";
+import {getQwAllUserList, listUser, qwList} from '../../../api/company/companyUser'
+import qwUserList from '../../../views/qw/user/qwUserList.vue'
+import companyUserList from '../../../views/company/companyUser/companyUserList.vue'
+import ImageUpload from "../../../views/qw/sop/ImageUpload";
+import CustomerGroupDetails from '../../../views/qw/groupMsg/customerGroupDetails.vue'
+import sopLogsDetails from '../../../views/qw/sopLogs/sopLogsList.vue'
+import { listTag, getTag, } from "../../../api/qw/tag";
+import {listWxUserGroup, sopListWxUserGroup} from "../../../api/wxUser/wxUserGroup";
+import SopTemp from "../../../views/qw/sopTemp/sopTemp.vue";
+import {allListTagGroup} from "../../../api/qw/tagGroup";
+import {searchTags} from "../../../api/qw/tag";
 export default {
   name: "addSop",
-  components: {SopTemp, CustomerGroupDetails, qwUserList,companyUserList,ImageUpload,sopLogsDetails},
+  components: { SopTemp, CustomerGroupDetails, qwUserList,companyUserList,ImageUpload,sopLogsDetails},
   data() {
     return {
       //模板查询
@@ -364,10 +365,8 @@ export default {
       // 非单个禁用
       single: true,
       setting:[],
-
       //标签组
       tagGroupList:[],
-
       tagList:[],
 
       //标签
@@ -386,15 +385,6 @@ export default {
         index:null,
       },
 
-      queryTagParams: {
-        pageNum: 1,
-        pageSize: 10,
-        total:0,
-        name:null,
-        corpId:null,
-      },
-
-
       // 非多个禁用
       multiple: true,
       // 显示搜索条件
@@ -423,6 +413,13 @@ export default {
         open:false,
         sopLogsForm:[],
       },
+      queryTagParams: {
+        pageNum: 1,
+        pageSize: 10,
+        total:0,
+        name:null,
+        corpId:null,
+      },
       // 表单参数
       form: {
         status: 1,
@@ -500,11 +497,8 @@ export default {
       });
 
       this.cancelSearchTags();
-
     },
-
     handleSearchTags(){
-		this.queryTagParams.corpId=this.form.corpId
 
       searchTags(this.queryTagParams).then(response => {
         this.tagGroupList = response.rows;
@@ -512,26 +506,37 @@ export default {
       });
 
     },
+
     cancelSearchTags(){
 
       this.resetSearchQueryTag()
 
-      this.selectAllListTagGroup()
+      this.getPageListTagGroup();
 
       listTag(this.queryTagParams).then(response => {
         this.tagList = response.rows;
       });
-
     },
 
-    selectAllListTagGroup(){
-      this.queryTagParams.corpId=this.form.corpId
+
+    getPageListTagGroup(){
       allListTagGroup(this.queryTagParams).then(response => {
         this.tagGroupList = response.rows;
         this.total = response.total;
       });
 
     },
+
+    resetSearchQueryTag(){
+
+      this.queryTagParams= {
+        pageNum: 1,
+        pageSize: 10,
+        total:0,
+        name:null,
+      };
+    },
+
     //标签的选择
     tagSelection(row){
       row.isSelected= !row.isSelected;
@@ -600,61 +605,6 @@ export default {
     tagCancel(){
       this.changeTagDialog.open = false;
     },
-
-    //选择标签
-    hangleChangeTags(){
-
-      this.changeTagDialog.title="选择标签"
-      this.changeTagDialog.open=true;
-      this.changeTagDialog.type=1;
-
-      // 获取 tagListFormIndex 中的所有 tagId,用于快速查找
-      const selectedTagIds = new Set(
-        (this.tagsIdsChangeSelectList || []).map(tagItem => tagItem?.tagId)
-      );
-      for (let i = 0; i < this.tagGroupList.length; i++) {
-        for (let x = 0; x < this.tagGroupList[i].tag.length; x++) {
-          this.tagGroupList[i].tag[x].isSelected = selectedTagIds.has(this.tagGroupList[i].tag[x].tagId);
-        }
-      }
-
-    },
-
-
-    //选择排除标签
-    hangleChangeOutTags(){
-      this.changeTagDialog.title="选择排除的标签"
-      this.changeTagDialog.open=true;
-      this.changeTagDialog.type=2;
-
-      // 获取 tagListFormIndex 中的所有 tagId,用于快速查找
-      const selectedTagIds = new Set(
-        (this.outTagsIdsChangeSelectList || []).map(tagItem => tagItem?.tagId)
-      );
-      for (let i = 0; i < this.tagGroupList.length; i++) {
-        for (let x = 0; x < this.tagGroupList[i].tag.length; x++) {
-          this.tagGroupList[i].tag[x].isSelected = selectedTagIds.has(this.tagGroupList[i].tag[x].tagId);
-        }
-      }
-    },
-
-    //删除一些选择的标签
-    handleCloseTags(list){
-      const ls = this.tagsIdsChangeSelectList.findIndex(t => t.tagId === list.tagId);
-      if (ls !== -1) {
-        this.tagsIdsChangeSelectList.splice(ls, 1);
-        this.tagsIdsChangeSelectList = [...this.tagsIdsChangeSelectList];
-      }
-    },
-
-    //删除一些排除的标签
-    handleCloseOutTags(list){
-      const ls = this.outTagsIdsChangeSelectList.findIndex(t => t.tagId === list.tagId);
-      if (ls !== -1) {
-        this.outTagsIdsChangeSelectList.splice(ls, 1);
-        this.outTagsIdsChangeSelectList = [...this.outTagsIdsChangeSelectList];
-      }
-    },
     //查询模板
     selectListSopTemp(type){
       this.tempOpen = true;
@@ -713,6 +663,60 @@ export default {
       });
     },
 
+    //选择标签
+    hangleChangeTags(){
+
+      this.changeTagDialog.title="选择标签"
+      this.changeTagDialog.open=true;
+      this.changeTagDialog.type=1;
+
+      // 获取 tagListFormIndex 中的所有 tagId,用于快速查找
+      const selectedTagIds = new Set(
+        (this.tagsIdsChangeSelectList || []).map(tagItem => tagItem?.tagId)
+      );
+      for (let i = 0; i < this.tagGroupList.length; i++) {
+        for (let x = 0; x < this.tagGroupList[i].tag.length; x++) {
+          this.tagGroupList[i].tag[x].isSelected = selectedTagIds.has(this.tagGroupList[i].tag[x].tagId);
+        }
+      }
+
+    },
+
+
+    //选择排除标签
+    hangleChangeOutTags(){
+      this.changeTagDialog.title="选择排除的标签"
+      this.changeTagDialog.open=true;
+      this.changeTagDialog.type=2;
+
+      // 获取 tagListFormIndex 中的所有 tagId,用于快速查找
+      const selectedTagIds = new Set(
+        (this.outTagsIdsChangeSelectList || []).map(tagItem => tagItem?.tagId)
+      );
+      for (let i = 0; i < this.tagGroupList.length; i++) {
+        for (let x = 0; x < this.tagGroupList[i].tag.length; x++) {
+          this.tagGroupList[i].tag[x].isSelected = selectedTagIds.has(this.tagGroupList[i].tag[x].tagId);
+        }
+      }
+    },
+
+    //删除一些选择的标签
+    handleCloseTags(list){
+      const ls = this.tagsIdsChangeSelectList.findIndex(t => t.tagId === list.tagId);
+      if (ls !== -1) {
+        this.tagsIdsChangeSelectList.splice(ls, 1);
+        this.tagsIdsChangeSelectList = [...this.tagsIdsChangeSelectList];
+      }
+    },
+
+    //删除一些排除的标签
+    handleCloseOutTags(list){
+      const ls = this.outTagsIdsChangeSelectList.findIndex(t => t.tagId === list.tagId);
+      if (ls !== -1) {
+        this.outTagsIdsChangeSelectList.splice(ls, 1);
+        this.outTagsIdsChangeSelectList = [...this.outTagsIdsChangeSelectList];
+      }
+    },
     //选择变动时的变动
     handleSendTypeChange(val){
       this.userSelectList=[];
@@ -739,17 +743,6 @@ export default {
       this.reset();
     },
 
-    resetSearchQueryTag(){
-
-      this.queryTagParams= {
-        pageNum: 1,
-        pageSize: 10,
-        total:0,
-        name:null,
-        corpId:this.form.corpId
-      };
-    },
-
     // 表单重置
     reset() {
       this.form = {
@@ -812,7 +805,6 @@ export default {
           }
           this.form.qwUserIds = this.userSelectList.join(",");
 
-
           if (this.tagsIdsChangeSelectList!=null && this.tagsIdsChangeSelectList.length>0){
 
             // 确保 this.form.tags 是数组

+ 4 - 25
src/views/qw/sop/sop.vue

@@ -238,7 +238,7 @@
 
       <el-table-column label="模板" align="center" prop="tempId" >
         <template slot-scope="scope">
-            <div v-for="id in tempList" v-if="id.id==scope.row.tempId">{{id.name}}{{id.status}}}</div>
+            <div v-for="id in tempList" v-if="id.id==scope.row.tempId">{{id.name}}</div>
         </template>
       </el-table-column>
 
@@ -312,7 +312,7 @@
             size="mini"
             type="text"
             @click="handleUpdateOutTime(scope.row)"
-          >修改时间/评级/大小转</el-button>
+          >修改时间/评级</el-button>
           <el-button
             v-if="scope.row.status == 1  "
             size="mini"
@@ -484,21 +484,6 @@
              <span v-if="outTimeOpen.isRating == '1'" style="margin-left: 10px;color: #13ce66">已开启</span>
              <span v-if="outTimeOpen.isRating == '2'" style="margin-left: 10px;color: #ff4949">已关闭</span>
          </el-row>
-         <el-row>
-           <span>小转天数:</span>
-           <el-input-number  v-model="outTimeOpen.minConversionDay"></el-input-number>
-           (天)
-         </el-row>
-         <el-row>
-           <span>大转天数:</span>
-           <el-input-number  v-model="outTimeOpen.maxConversionDay"></el-input-number>
-           (天)
-         </el-row>
-         <el-row>
-           <span>发课开始天数:</span>
-           <el-input-number  v-model="outTimeOpen.courseDay"  :min="1" :max="100" ></el-input-number>
-           (天)
-         </el-row>
          <el-row style="margin-top: 3%">
 
            <el-button type="primary" icon="el-icon-search" size="mini" @click="handleUpdateExpiryTime">确定修改</el-button>
@@ -618,7 +603,7 @@
         </div>
     </el-dialog>
     <!--  执行详情  -->
-    <el-drawer :title="sopLogsDialog.title" :visible.sync="sopLogsDialog.open" size="70%" style="font-weight: bolder">
+    <el-drawer :title="sopLogsDialog.title" :visible.sync="sopLogsDialog.open" size="85%" style="font-weight: bolder">
       <sopLogsDetails ref="sopLogsDetails" :rowDetailFrom="sopLogsDialog.sopLogsForm"></sopLogsDetails>
     </el-drawer>
 
@@ -958,14 +943,11 @@ export default {
         this.outTimeOpen.tempId=val.tempId;
         this.outTimeOpen.expiryTime=val.expiryTime;
         this.outTimeOpen.isRating=val.isRating;
-        this.outTimeOpen.minConversionDay=val.minConversionDay;
-        this.outTimeOpen.maxConversionDay=val.maxConversionDay;
-        this.outTimeOpen.courseDay=val.courseDay;
         this.outTimeOpen.open=true;
     },
 
     handleUpdateExpiryTime(){
-      updateSop({id:this.outTimeOpen.id,tempId:this.outTimeOpen.tempId,expiryTime:this.outTimeOpen.expiryTime,isRating: this.outTimeOpen.isRating,minConversionDay: this.outTimeOpen.minConversionDay,maxConversionDay: this.outTimeOpen.maxConversionDay,courseDay: this.outTimeOpen.courseDay}).then(response => {
+      updateSop({id:this.outTimeOpen.id,tempId:this.outTimeOpen.tempId,expiryTime:this.outTimeOpen.expiryTime,isRating: this.outTimeOpen.isRating}).then(response => {
         this.msgSuccess("修改成功");
         this.resetUpdateExpiryTime()
         this.getList();
@@ -977,9 +959,6 @@ export default {
           open:false,
           id:null,
           expiryTime:null,
-        courseDay:null,
-          minConversionDay:null,
-          maxConversionDay:null,
           isRating:null,
       }
     },

+ 1 - 1
src/views/qw/sop/updateSop.vue

@@ -465,7 +465,7 @@ export default {
     //查询模板
     selectListSopTemp(type,isUpdate){
       this.tempListLoading = true; // 开始查询,显示加载提示
-      listSopTemp({sendType:type,status: 1}).then(response => {
+      listSopTemp({sendType:type}).then(response => {
         this.tempList = response.rows;
         this.tempListLoading = false;
       });

+ 13 - 10
src/views/qw/sopLogs/sopLogsList.vue

@@ -30,7 +30,7 @@
         />
       </el-form-item>
       <el-form-item label="发送类型" prop="sendType" >
-        <el-select v-model="queryParams.sendType" placeholder="请选择发送类型" clearable size="small"   @change="handleQuery">
+        <el-select v-model="queryParams.sendType" placeholder="请选择发送类型" clearable size="small">
           <el-option
             v-for="dict in sysQwSopType"
             :key="dict.dictValue"
@@ -105,9 +105,7 @@
           @click="handleDelete"
           v-hasPermi="['qw:sopLogs:remove']"
         >批量删除</el-button>
-
         <el-button
-          v-if="queryParams.sendType==3"
           type="success"
           plain
           icon="el-icon-edit"
@@ -115,7 +113,7 @@
           :disabled="multiple"
           @click="handleEditCourse"
           v-hasPermi="['qw:sopLogs:editCourse']"
-        >再次补发完课</el-button>
+        >再次发送记录</el-button>
       </el-col>
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
@@ -294,7 +292,13 @@
 </template>
 
 <script>
-import {listQwSopLogs, exportQwSopLogs, listQwSopLogsList, delQwSopLogs, editCourseQwSopLogs} from '@/api/qw/sopLogs'
+import {
+  listQwSopLogs,
+  exportQwSopLogs,
+  listQwSopLogsList,
+  delQwSopLogs,
+  editCourseQwSopLogs
+} from '../../../api/qw/sopLogs'
 import {delSopUserLogsInfo} from "@/api/qw/sopUserLogsInfo";
 
 export default {
@@ -526,13 +530,12 @@ export default {
         this.msgSuccess("删除成功");
       }).catch(() => {});
     },
-
     /**
-    * 批量修改完课的发送
-    */
+     * 批量修改发送记录
+     */
     handleEditCourse(row){
       const ids = row.id || this.ids;
-      this.$confirm('确认要再次发送【执行详情】编号为"【' + ids + '】"的【完课】记录?', "警告", {
+      this.$confirm('确认要再次发送【执行详情】编号为"【' + ids + '】"的记录?', "警告", {
         confirmButtonText: "确定",
         cancelButtonText: "取消",
         type: "warning"
@@ -540,7 +543,7 @@ export default {
         return editCourseQwSopLogs(ids);
       }).then(() => {
         this.getList(this.rowDetailFrom);
-        this.msgSuccess("已经 修改完课记录为 待发送~");
+        this.msgSuccess("已经 修改记录为 待发送~");
       }).catch(() => {});
     },
     /** 导出按钮操作 */

+ 2 - 29
src/views/qw/sopTemp/index.vue

@@ -171,13 +171,6 @@
             @click="handleUpdate2(scope.row)"
             v-hasPermi="['qw:sopTemp:edit']"
           >管理规则</el-button>
-          <el-button
-            size="mini"
-            type="text"
-            icon="el-icon-edit"
-            @click="updateImageFun(scope.row.id)"
-            v-hasPermi="['qw:sopTemp:edit']"
-          >更新图片</el-button>
           <el-button
             size="mini"
             type="text"
@@ -269,8 +262,8 @@
       <el-table v-loading="companysloading" border :data="companyList" @selection-change="handleSelectionCompany">
         <el-table-column type="selection" width="55" align="center" />
         <el-table-column label="公司编号" align="center" prop="companyId" />
-<!--        <el-table-column label="企业名" align="center" prop="companyName" />-->
-<!--        <el-table-column label="备注" align="center" prop="remark"/>-->
+        <el-table-column label="企业名" align="center" prop="companyName" />
+        <el-table-column label="备注" align="center" prop="remark"/>
         <el-table-column label="状态" align="center" prop="status" >
           <template slot-scope="scope">
             <el-tag prop="status" v-for="(item, index) in statusOptions"  :type="scope.row.status==1?'success':'danger'"  v-if="scope.row.status==item.dictValue">{{item.dictLabel}}</el-tag>
@@ -296,7 +289,6 @@ import {
   updateTemp,
   copyTemplate,
   addTemp,
-  updateImage,
   exportSopTemp,
   shareSopTemp
 } from "@/api/qw/sopTemp";
@@ -392,7 +384,6 @@ export default {
     });
   },
   methods: {
-    updateImage,
 
     handleCompanyQuery(){
       this.queryCompanyParams.pageNum = 1;
@@ -446,24 +437,6 @@ export default {
       this.handleQuery();
     },
 
-    updateImageFun(id){
-
-      let loadingRock = this.$loading({
-        lock: true,
-        text: '正在执行中请稍后~~请不要刷新页面!!',
-        spinner: 'el-icon-loading',
-        background: 'rgba(0, 0, 0, 0.7)'
-      });
-
-      updateImage(id).then(response => {
-        this.getList();
-        this.$message.success("更新图片 完成!");
-      }).finally(res=>{
-        loadingRock.close();
-      })
-
-
-    },
     handleCommand(command){
       // if (command==4) {
       //   this.$router.push('/qw/sopTemp/addAiChatTemp')

+ 1 - 8
src/views/qw/sopTemp/sopTemp.vue

@@ -19,12 +19,7 @@
     <el-table v-loading="loading" :data="sopTempList" ref="sopTempList" >
       <el-table-column label="id" align="center" prop="id" />
       <el-table-column label="模板标题" align="center" prop="name" />
-      <el-table-column label="模板状态" align="center" prop="status">
-        <template slot-scope="scope">
-          <el-tag v-if="scope.row.status == 1" type="success">启用</el-tag>
-          <el-tag v-else type="danger">停用</el-tag>
-        </template>
-      </el-table-column>
+
       <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
         <template slot-scope="scope">
           <el-button
@@ -108,11 +103,9 @@ export default {
   methods: {
     /** 查询sop模板列表 */
     getList(sendType,isUpdate) {
-      console.log(isUpdate)
       this.isUpdateSop = isUpdate;
       this.loading = true;
       this.queryParams.sendType= sendType;
-      this.queryParams.status=1;
       listSopTemp(this.queryParams).then(response => {
         this.sopTempList = response.rows;
         this.total = response.total;

+ 7 - 8
src/views/qw/sopTemp/updateSopTemp.vue

@@ -16,8 +16,7 @@
         </el-form-item>
 
         <el-form-item label="状态">
-          <dict-tag :options="statusOptions" :value="form.status"/>
-<!--          <el-tag v-for="dict in statusOptions" v-if="dict.dictValue == form.status">{{ dict.dictLabel }}</el-tag>-->
+          <el-tag v-for="dict in statusOptions" v-if="dict.dictValue == form.status">{{ dict.dictLabel }}</el-tag>
         </el-form-item>
         <el-form-item label="间隔天数" prop="gap">
           {{ form.gap }}天
@@ -66,7 +65,7 @@
                                         v-model="content.time"
                                         value-format="HH:mm"
                                         format="HH:mm"
-                                        :picker-options="{ selectableRange: ['01:01:00 - 01:59:59','06:00:00 - 23:59:59'] }"
+                                        :picker-options="{ selectableRange: '01:01:00 - 23:59:59' }"
                                         placeholder="时间"
                                         style="width: 100px;height: 20px;">
                                       </el-time-picker>
@@ -80,7 +79,6 @@
                                         v-model="content.time"
                                         value-format="HH:mm"
                                         format="HH:mm"
-                                        :picker-options="{ selectableRange: ['00:00:00 - 01:59:59','06:00:00 - 23:59:59']}"
                                         placeholder="时间"
                                         style="width: 100px;height: 20px;">
                                       </el-time-picker>
@@ -271,7 +269,7 @@
                                                 <el-form-item label="链接封面:" label-width="100px" required>
                                                   <ImageUpload :disabled="formType == 3" v-model="setList.linkImageUrl"
                                                                type="image" :num="1"
-                                                               :file-size="1" :width="150" :height="150"
+                                                               :file-size="2" :width="150" :height="150"
                                                                style="margin-top: 1%;"/>
                                                 </el-form-item>
                                                 <div v-if="content.type != 2 " style="margin-top: 1%">
@@ -297,7 +295,7 @@
                                                   <el-input v-model="setList.miniprogramTitle" placeholder="请输入小程序消息标题,最长为64字节" :rows="2" maxlength="64"  type="textarea" @input="checkByteLength(content,setList.contentType,content.isOfficial)"   />
                                                 </el-form-item>
                                                 <el-form-item label="封面" prop="miniprogramPicUrl">
-                                                  <ImageUpload v-model="setList.miniprogramPicUrl" type="image" :num="10" :width="150" :height="150" />
+                                                  <ImageUpload v-if="content.isOfficial !== '1'" v-model="setList.miniprogramPicUrl" type="image" :num="10" :width="150" :height="150" />
                                                 </el-form-item>
                                                 <el-form-item label="appid" prop="miniprogramAppid" v-show="false">
                                                   <el-input v-model="setList.miniprogramAppid='wx73f85f8d62769119' " disabled />
@@ -1017,7 +1015,7 @@ export default {
                 this.$message.error("小程序消息标题不能为空")
                 return false;
               }
-              if (data.content[j].setting[k].contentType == 4  && (data.content[j].setting[k].miniprogramPicUrl == null || data.content[j].setting[k].miniprogramPicUrl == "")) {
+              if (data.content[j].setting[k].contentType == 4 && data.content[j].isOfficial !== '1' && (data.content[j].setting[k].miniprogramPicUrl == null || data.content[j].setting[k].miniprogramPicUrl == "")) {
                 this.$message.error("小程序封面地址不能为空")
                 return false;
               }
@@ -1341,7 +1339,8 @@ export default {
               this.$set(content.setting[i], 'linkTitle', selectedCourse.dictLabel);
               this.$set(content.setting[i], 'linkImageUrl', selectedCourse.dictImgUrl);
             }
-            if (content.setting[i].contentType == 4 ){
+            if (content.setting[i].contentType == 4 && (content.isOfficial == '0' || content.isOfficial == null)){
+              console.log(content.isOfficial);
               this.$set(content.setting[i], 'miniprogramPicUrl', selectedCourse.dictImgUrl);
             }
 

+ 1 - 0
src/views/qw/sopUserLogs/sopUserLogsSchedule.vue

@@ -56,6 +56,7 @@
       <el-table-column label="营期编号" align="center" prop="id" />
 <!--      <el-table-column label="模板编号" align="center" prop="sopTempId" />-->
       <el-table-column label="企微员工账号" align="center" prop="qwUserId" />
+      <el-table-column label="企微员工名称" align="center" prop="qwUserName" />
       <el-table-column label="营期时间" align="center" prop="startTime" width="180">
         <template slot-scope="scope">
           <span>{{ parseTime(scope.row.startTime, '{y}-{m}-{d}') }}</span>

+ 289 - 34
src/views/qw/sopUserLogsInfo/sopUserLogsInfoDetails.vue

@@ -36,13 +36,28 @@
         />
       </el-form-item>
       <el-form-item label="标签" prop="tagIds">
-        <el-select v-model="selectTags" remote multiple placeholder="请选择" filterable  style="width: 100%;">
-          <el-option
-            v-for="dict in tagList"
-            :label="dict.name"
-            :value="dict.tagId">
-          </el-option>
-        </el-select>
+<!--        <el-select v-model="selectTags" remote multiple placeholder="请选择" filterable  style="width: 100%;">-->
+<!--          <el-option-->
+<!--            v-for="dict in tagList"-->
+<!--            :label="dict.name"-->
+<!--            :value="dict.tagId">-->
+<!--          </el-option>-->
+<!--        </el-select>-->
+
+        <div @click="hangleChangeTags()" style="cursor: pointer; border: 1px solid #e6e6e6; background-color: white; overflow: hidden; flex-grow: 1;width: 250px">
+          <div style="min-height: 35px; max-height: 200px; overflow-y: auto;">
+            <el-tag type="success"
+                    closable
+                    :disable-transitions="false"
+                    v-for="list in this.selectTags"
+                    :key="list.tagId"
+                    @close="handleCloseTags(list)"
+                    style="margin: 3px;"
+            >{{list.name}}
+            </el-tag>
+          </div>
+        </div>
+
       </el-form-item>
       <el-form-item>
         <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
@@ -90,7 +105,7 @@
       <el-table-column type="selection" width="55" align="center" />
       <el-table-column label="编号" align="center" prop="id" width="100"/>
 <!--      <el-table-column label="企微员工账号" align="center" prop="qwUserId" width="100"/>-->
-      <el-table-column label="客户账号" align="center" prop="externalId" width="100"/>
+      <el-table-column label="客户ID" align="center" prop="externalId" width="100"/>
 <!--      <el-table-column label="客户小程序id" align="center" prop="fsUserId" width="100">-->
 <!--        <template slot-scope="scope">-->
 <!--          <el-tag type="success">-->
@@ -100,23 +115,10 @@
 <!--      </el-table-column>-->
       <el-table-column label="客户名称" align="center" prop="externalUserName" />
       <el-table-column label="备注" align="center" prop="remark" />
-      <el-table-column label="客户标签" align="center" prop="tagIds" width="240">
+      <el-table-column label="客户标签" align="center" prop="tagIdsName" width="250px">
         <template slot-scope="scope">
-          <div v-if="scope.row.tagIds && scope.row.tagIds !== '无标签'">
-            <div v-for="i in JSON.parse(scope.row.tagIds)" :key="i" style="display: inline;">
-              <el-tag
-                type="success"
-                v-for="ii in tagList"
-                :key="ii.id"
-                style="margin: 3px;"
-                v-if="ii.tagId == i"
-              >
-                {{ ii.name }}
-              </el-tag>
-            </div>
-          </div>
-          <div v-else>
-            <span style="color: red;">无标签</span>
+          <div v-for="name in scope.row.tagIdsName" style="display: inline;">
+            <el-tag type="success">{{ name }}</el-tag>
           </div>
         </template>
       </el-table-column>
@@ -155,7 +157,7 @@
     <el-dialog :title="sendMsgOpen.title" :visible.sync="sendMsgOpen.open"  width="1000px" append-to-body>
         <el-form ref="msgForm" :model="msgForm" :rules="msgRules" label-width="100px">
           <el-form-item label="选择课程">
-            <el-select  v-model="msgForm.courseId" placeholder="请选择课程" style=" margin-right: 10px;" size="mini"  @change="courseChange()">
+            <el-select  v-model="msgForm.courseId" placeholder="请选择课程" style=" margin-right: 10px;" size="mini" remote  filterable  @change="courseChange()">
               <el-option
                 v-for="dict in courseList"
                 :key="dict.dictValue"
@@ -163,7 +165,7 @@
                 :value="parseInt(dict.dictValue)"
               />
             </el-select>
-            <el-select  v-model="msgForm.videoId" placeholder="请选择小节" size="mini" style=" margin-right: 10px;" @change="videoIdChange()"  >
+            <el-select  v-model="msgForm.videoId" placeholder="请选择小节" size="mini" style=" margin-right: 10px;" remote  filterable @change="videoIdChange()"  >
               <el-option
                 v-for="dict in videoList"
                 :key="dict.dictValue"
@@ -366,6 +368,45 @@
         <el-button @click="cancel">取 消</el-button>
       </div>
     </el-dialog>
+
+
+    <!--  搜索标签   -->
+    <el-dialog :title="changeTagDialog.title" :visible.sync="changeTagDialog.open" style="width:100%;height: 100%" append-to-body>
+
+      <div>搜索标签:
+        <el-input v-model="queryTagParams.name" placeholder="请输入标签名称" clearable size="small" style="width: 200px;margin-right: 10px" />
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleSearchTags(queryTagParams.name)">搜索</el-button>
+        <el-button type="primary" icon="el-icon-plus" size="mini" @click="cancelSearchTags">重置</el-button>
+      </div>
+      <div v-for="item in tagGroupList" :key="item.id"  >
+        <div style="font-size: 20px;margin-top: 20px;margin-bottom: 20px;">
+          <span class="name-background">{{ item.name }}</span>
+        </div>
+        <div class="tag-container">
+          <a
+            v-for="tagItem in item.tag"
+            class="tag-box"
+            @click="tagSelection(tagItem)"
+            :class="{ 'tag-selected': tagItem.isSelected }"
+          >
+            {{ tagItem.name }}
+          </a>
+        </div>
+      </div>
+
+      <pagination
+        v-show="tagTotal>0"
+        :total="tagTotal"
+        :page.sync="queryTagParams.pageNum"
+        :limit.sync="queryTagParams.pageSize"
+        @pagination="getPageListTagGroup"
+      />
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="tagSubmitForm()">确 定</el-button>
+        <el-button @click="tagCancel()">取消</el-button>
+      </div>
+    </el-dialog>
+
   </div>
 </template>
 
@@ -383,6 +424,7 @@ import {courseList, videoList} from "@/api/qw/sop";
 import {addCourseFinishTemp, updateCourseFinishTemp} from "@/api/course/courseFinishTemp";
 import {allListTagGroup} from "@/api/qw/tagGroup";
 import {listTag} from "@/api/qw/tag";
+import {searchTags} from "../../../api/qw/tag";
 
 export default {
   name: "sopUserLogsInfoDetails",
@@ -412,7 +454,6 @@ export default {
       sysFsSopWatchStatus: [],
       isSalesCallAdded:false,
       isSalesCallCustomerAdded:false,
-      tagList:[],
       selectTags:[],
       // 弹出层标题
       title: "",
@@ -438,6 +479,24 @@ export default {
         createTime: null,
       },
 
+      tagGroupList: [],
+
+      tagTotal:0,
+
+      //标签
+      changeTagDialog:{
+        title:"",
+        open:false,
+      },
+
+      queryTagParams:{
+        pageNum: 1,
+        pageSize: 10,
+        total:0,
+        name:null,
+        corpId:null,
+      },
+
       courseList:[],
       videoList:[],
       //插件版
@@ -503,12 +562,6 @@ export default {
       });
 
 
-      //标签
-      const listTagFrom = {corpId: val.corpId};
-      listTag(listTagFrom).then(response => {
-        this.tagList = response.rows;
-      });
-
       this.queryParams.qwUserId=val.qwUserId;
       this.queryParams.corpId=val.corpId;
       //用于一键群发
@@ -517,6 +570,139 @@ export default {
       this.queryParams.corpIdParam=val.corpId;
 
     },
+
+    //搜索的标签
+    hangleChangeTags(){
+
+      this.changeTagDialog.title="搜索的标签"
+      this.changeTagDialog.open=true;
+
+      // 获取 tagListFormIndex 中的所有 tagId,用于快速查找
+      const selectedTagIds = new Set(
+        (this.selectTags || []).map(tagItem => tagItem?.tagId)
+      );
+
+      this.queryTagParams.name=null;
+      this.getPageListTagGroup();
+
+      setTimeout(() => {
+        for (let i = 0; i < this.tagGroupList.length; i++) {
+          for (let x = 0; x < this.tagGroupList[i].tag.length; x++) {
+            this.tagGroupList[i].tag[x].isSelected = selectedTagIds.has(this.tagGroupList[i].tag[x].tagId);
+          }
+        }
+      }, 200);
+
+
+    },
+
+    tagSelection(row){
+
+      row.isSelected= !row.isSelected;
+      this.$forceUpdate();
+    },
+
+
+    //确定选择标签
+    tagSubmitForm(){
+
+      for (let i = 0; i < this.tagGroupList.length; i++) {
+        for (let x = 0; x < this.tagGroupList[i].tag.length; x++) {
+          if (this.tagGroupList[i].tag[x].isSelected === true) {
+
+            if (!this.selectTags) {
+              this.selectTags = [];
+            }
+
+            // 检查当前 tag 是否已经存在于 tagListFormIndex[index] 中
+            let tagExists = this.selectTags.some(
+              tag => tag.id === this.tagGroupList[i].tag[x].id
+            );
+
+            // 如果 tag 不存在于 tagListFormIndex[index] 中,则新增
+            if (!tagExists) {
+              this.selectTags.push(this.tagGroupList[i].tag[x]);
+            }
+          }
+        }
+      }
+      if (!this.selectTags || this.selectTags.length === 0) {
+        return this.$message('请选择标签');
+      }
+
+      this.changeTagDialog.open = false;
+    },
+
+    //取消选择标签
+    tagCancel(){
+      this.changeTagDialog.open = false;
+    },
+
+    //删除一些选择的标签
+    handleCloseTags(list){
+      const ls = this.selectTags.findIndex(t => t.tagId === list.tagId);
+      if (ls !== -1) {
+        this.selectTags.splice(ls, 1);
+        this.selectTags = [...this.selectTags];
+      }
+
+      if (this.selectTags!=null && this.selectTags.length>0){
+        // 确保 this.form.tags 是数组
+        if (!this.queryParams.tagIds) {
+          this.queryParams.tagIds = []; // 如果未定义,初始化
+        } else {
+          this.queryParams.tagIds = []; // 清空已有数据
+        }
+
+        // 遍历并添加 tagId
+        this.selectTags.forEach(tag => {
+          if (tag.tagId) { // 确保 tagId 存在
+            this.queryParams.tagIds.push(tag.tagId);
+          }
+        });
+        this.queryParams.tagIds=this.queryParams.tagIds.join(",");
+      }else {
+        this.queryParams.tagIds=null;
+      }
+
+    },
+
+    handleSearchTags(name){
+
+      searchTags({name:name,corpId:this.queryParams.corpId}).then(response => {
+        this.tagGroupList = response.rows;
+      });
+
+    },
+
+
+    cancelSearchTags(){
+
+      this.resetSearchQueryTag()
+
+      this.getPageListTagGroup();
+
+    },
+
+    getPageListTagGroup(){
+      this.queryTagParams.corpId=this.queryParams.corpId
+      allListTagGroup(this.queryTagParams).then(response => {
+        this.tagGroupList = response.rows;
+        this.tagTotal = response.total;
+      });
+    },
+
+    resetSearchQueryTag(){
+
+      this.queryTagParams= {
+        pageNum: 1,
+        pageSize: 10,
+        total:0,
+        name:null,
+      };
+    },
+
+
     courseChange() {
       if (this.msgForm.courseId != null ) {
         const selectedCourse = this.courseList.find(course => parseInt(course.dictValue) === this.msgForm.courseId);
@@ -848,7 +1034,27 @@ export default {
 
     /** 搜索按钮操作 */
     handleQuery() {
-      this.queryParams.tagIds=this.selectTags.join(',')
+
+      if (this.selectTags!=null && this.selectTags.length>0){
+        // 确保 this.form.tags 是数组
+        if (!this.queryParams.tagIds) {
+          this.queryParams.tagIds = []; // 如果未定义,初始化
+        } else {
+          this.queryParams.tagIds = []; // 清空已有数据
+        }
+
+        // 遍历并添加 tagId
+        this.selectTags.forEach(tag => {
+          if (tag.tagId) { // 确保 tagId 存在
+            this.queryParams.tagIds.push(tag.tagId);
+          }
+        });
+        this.queryParams.tagIds=this.queryParams.tagIds.join(",");
+      }else {
+        this.queryParams.tagIds=null;
+      }
+
+
       this.getList();
     },
     /** 重置按钮操作 */
@@ -986,6 +1192,7 @@ export default {
           this.updateLogsInfoFrom.qwUserId=this.queryParams.qwUserId
           this.updateLogsInfoFrom.corpId= this.queryParams.corpId
 
+
           let loadingRock = this.$loading({
             lock: true,
             text: '正在执行中请稍后~~请不要刷新页面!!',
@@ -993,6 +1200,7 @@ export default {
             background: 'rgba(0, 0, 0, 0.7)'
           });
 
+
           batchUpdateSopUserLogsInfoToTime(this.updateLogsInfoFrom).then(response => {
             this.msgSuccess("修改成功");
             this.open = false;
@@ -1003,6 +1211,7 @@ export default {
           }).finally(res=>{
             loadingRock.close();
           })
+
         }
       });
     },
@@ -1038,3 +1247,49 @@ export default {
   }
 };
 </script>
+
+<style scoped>
+/* CSS 样式 */
+.tag-container {
+  display: flex;
+  flex-wrap: wrap; /* 超出宽度时自动换行 */
+  gap: 8px; /* 设置标签之间的间距 */
+}
+.name-background {
+  display: inline-block;
+  background-color: #abece6; /* 背景颜色 */
+  padding: 4px 8px; /* 调整内边距,让背景包裹文字 */
+  border-radius: 4px; /* 可选:设置圆角 */
+}
+.tag-box {
+  padding: 8px 12px;
+  border: 1px solid #989797;
+  border-radius: 4px;
+  cursor: pointer;
+  display: inline-block;
+}
+
+.tag-selected {
+  background-color: #00bc98;
+  color: #fff;
+  border-color: #00bc98;
+}
+
+.el-tag + .el-tag {
+  margin-left: 10px;
+}
+
+
+.button-new-tag {
+  margin-left: 10px;
+  height: 32px;
+  line-height: 30px;
+  padding-top: 0;
+  padding-bottom: 0;
+}
+.input-new-tag {
+  width: 90px;
+  margin-left: 10px;
+  vertical-align: bottom;
+}
+</style>

+ 8 - 7
src/views/qw/tagGroup/tagGroupList.vue

@@ -1,7 +1,7 @@
 <template>
   <div class="app-container">
     <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="90px">
-      <el-form-item label="标签组名称" prop="name">
+      <el-form-item label="标签组名称111" prop="name">
         <el-input
           v-model="queryParams.name"
           placeholder="请输入标签组名称"
@@ -11,7 +11,7 @@
         />
       </el-form-item>
 
-      <el-form-item label="标签名称" prop="name">
+      <el-form-item label="标签名称111" prop="name">
         <el-input
           v-model="queryParams.tagName"
           placeholder="请输入标签名称"
@@ -211,7 +211,7 @@ export default {
   methods: {
 
     getTagGroupList(row) {
-      this.queryParams.corpId=row;
+      this.queryParams.corpId = row;
       this.getList();
     },
     /** 查询企微客户标签组列表 */
@@ -260,7 +260,7 @@ export default {
       this.getList();
     },
     addRow() {
-      this.form.tag.push({ name: "标签", order: 0 });
+      this.form.tag.push({name: "标签", order: 0});
     },
     deleteRow(index) {
       this.form.tag.splice(index, 1);
@@ -302,7 +302,7 @@ export default {
       this.reset();
       this.open = true;
       this.form.tag = [
-        { name: "标签", order: 0 },
+        {name: "标签", order: 0},
       ];
       this.title = "添加企微客户标签组";
     },
@@ -349,12 +349,13 @@ export default {
         confirmButtonText: "确定",
         cancelButtonText: "取消",
         type: "warning"
-      }).then(function() {
+      }).then(function () {
         return delTagGroup(ids);
       }).then(() => {
         this.getList();
         this.msgSuccess("删除成功");
-      }).catch(() => {});
+      }).catch(() => {
+      });
     },
   }
 };

+ 11 - 11
src/views/qw/user/index.vue

@@ -163,17 +163,17 @@
           >
             绑定主机
           </el-button>
-<!--          <el-button-->
-<!--            v-if="scope.row.loginCodeUrl!=null"-->
-<!--            size="mini"-->
-<!--            type="text"-->
-<!--            icon="el-icon-video-camera-solid"-->
-<!--            plain-->
-<!--            @click="handleCloudAP(scope.row.loginCodeUrl)"-->
-<!--            v-hasPermi="['qw:user:cloudAP']"-->
-<!--          >-->
-<!--            获取主机帐密-->
-<!--          </el-button>-->
+          <el-button
+            v-if="scope.row.loginCodeUrl!=null"
+            size="mini"
+            type="text"
+            icon="el-icon-video-camera-solid"
+            plain
+            @click="handleCloudAP(scope.row.loginCodeUrl)"
+            v-hasPermi="['qw:user:cloudAP']"
+          >
+            获取主机帐密
+          </el-button>
           <el-button
             v-if="scope.row.loginCodeUrl!=null"
             size="mini"

+ 0 - 206
src/views/qw/user/qwUserListByCompany.vue

@@ -1,206 +0,0 @@
-<template>
-  <div class="app-container">
-    <el-alert
-              title="注意事项"
-              type="warning"
-              description="此处 显示了 所有销售绑定 的企业微信账号信息"
-              :closable="false"
-              center
-              show-icon>
-    </el-alert>
-    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="100px" @submit.prevent="handleQuery">
-
-      <el-form-item label="企微员工账号" prop="qwUserId">
-        <el-input
-          v-model="queryParams.qwUserId"
-          placeholder="请输入企微员工账号"
-          clearable
-          size="small"
-          @keydown.enter.native="handleQueryEnter"
-        />
-      </el-form-item>
-      <el-form-item label="后台员工昵称" prop="nickName">
-        <el-input
-          v-model="queryParams.nickName"
-          placeholder="请输入后台员工昵称"
-          clearable
-          size="small"
-          @keydown.enter.native="handleQueryEnter"
-        />
-      </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-table v-loading="loading" :data="userList" ref="userList"  @selection-change="handleSelectionChange">
-        <el-table-column type="selection" width="55" align="center" />
-        <el-table-column label="企微员工账号" align="center" prop="qwUserId" />
-        <el-table-column label="企微员工昵称" align="center" prop="qwUserName"/>
-        <el-table-column label="企微员工部门" align="center" prop="departmentName"/>
-        <el-table-column label="后台员工昵称" align="center" prop="nickName"/>
-        <el-table-column label="后台员工用户名" align="center" prop="userName" />
-
-    </el-table>
-    <div style="margin-top: 30px;display: flex;justify-content: center">
-      <el-button type="warning" icon="el-icon-search" @click="confirmSelect">确定选择</el-button>
-    </div>
-
-    <pagination
-      v-show="total>0"
-      :total="total"
-      :page.sync="queryParams.pageNum"
-      :limit.sync="queryParams.pageSize"
-      @pagination="handlePaginationChange"
-    />
-  </div>
-</template>
-
-<script>
-import { listUser} from "@/api/qw/user";
-
-
-export default {
-  name: "qwUserListByCompany",
-  data() {
-    return {
-      type:null,
-      sendType:null,
-      // 遮罩层
-      loading: true,
-      // 导出遮罩层
-      exportLoading: false,
-      // 选中数组
-      selectUsers: [],
-      // 非单个禁用
-      single: true,
-      // 非多个禁用
-      multiple: true,
-      // 显示搜索条件
-      showSearch: true,
-      // 总条数
-      total: 0,
-      // 企微用户表格数据
-      userList: [],
-      // 弹出层标题
-      title: "",
-      // 是否显示弹出层
-      open: false,
-      // 查询参数
-      queryParams: {
-        pageNum: 1,
-        pageSize: 5,
-        qwUserId: null,
-        companyId: null,
-        companyUserId: null,
-        corpId: null,
-        nickName: null
-      },
-      // 表单参数
-      form: {},
-
-      // 表单校验
-      rules: {
-      }
-    };
-  },
-  created() {
-    this.getList();
-  },
-  methods: {
-
-    /** 查询企微用户列表 */
-    getList() {
-      this.loading = true;
-      listUser(this.queryParams).then(response => {
-        // 如果 companyUserId 为 null,移除列
-
-        this.userList = response.rows;
-        this.total =   response.total;
-        this.loading = false;
-
-      });
-    },
-    handlePaginationChange(row) {
-      this.queryParams.pageNum = row.page;
-      this.queryParams.pageSize = row.limit;
-      this.getList();
-    },
-    // 取消按钮
-    cancel() {
-      this.open = false;
-      this.reset();
-    },
-    // 表单重置
-    reset() {
-      this.form = {
-        id: null,
-        qwUserId: null,
-        companyId: null,
-        companyUserId: null,
-        corpId: null
-      };
-      this.resetForm("form");
-    },
-    //确定选择
-    confirmSelect(){
-      this.$emit("selectUserList",this.selectUsers);
-      this.resetSelect();
-    },
-    //重置选择
-    resetSelect(){
-      this.$refs.userList.clearSelection();
-
-      this.selectUsers=[];
-      //重置
-      this.queryParams={
-        pageNum: 1,
-        pageSize: 5,
-        qwUserId: null,
-        companyId: null,
-        companyUserId: null,
-        corpId: null,
-        nickName: null
-      },
-        this.getList();
-    },
-    /** 搜索按钮操作 */
-    handleQuery() {
-      this.queryParams.pageNum = 1;
-      this.getList();
-    },
-    handleQueryEnter(event){
-      // 确保事件对象存在
-      if (event && event.preventDefault) {
-        event.preventDefault(); // 阻止默认提交行为
-      }
-      this.handleQuery();
-    },
-    /** 重置按钮操作 */
-    resetQuery() {
-      this.resetForm("queryForm");
-      this.handleQuery();
-    },
-
-    // 多选框选中数据
-    handleSelectionChange(selection) {
-
-      // 保存当前页的选中项
-      const currentPageSelections = selection.map(item => item.id);
-
-      // 合并选中项
-      this.selectUsers = this.selectUsers.filter(item =>
-        this.userList.some(tag => tag.id === item.id) ? currentPageSelections.includes(item.id) : true
-      ).concat(selection.filter(item => !this.selectUsers.some(selected => selected.id === item.id)));
-
-      // 更新 single 和 multiple
-      this.single = this.selectUsers.length !== 1;
-      this.multiple = !this.selectUsers.length;
-
-    },
-
-  }
-};
-</script>

+ 33 - 122
src/views/store/inquiryOrder/list.vue

@@ -13,40 +13,42 @@
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
-      <el-form-item label="病人名称" prop="patientName">
+     <el-form-item label="病人名称" prop="patientName">
+          <el-input
+            v-model="queryParams.patientName"
+            placeholder="请输入病人名称"
+            clearable
+            size="small"
+            @keyup.enter.native="handleQuery"
+          />
+      </el-form-item>
+      <el-form-item label="员工姓名" prop="companyUserNickName">
         <el-input
-          v-model="queryParams.patientName"
-          placeholder="请输入病人名称"
+        style="width:220px"
+          v-model="queryParams.companyUserNickName"
+          placeholder="请输入员工姓名"
           clearable
           size="small"
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
-      <el-form-item label="员工姓名" prop="companyUserId">
-        <el-select v-model="queryParams.companyUserId" clearable filterable remote
-                   placeholder="请输入关键词" :remote-method="loadCompanyUserOptions"
-                   v-select-load-more="loadMoreCompanyUserOptions"
-                   :loading="companyUserOptionsLoading">
-          <el-option
-            v-for="item in companyUserOptions"
-            :key="item.value"
-            :label="item.label"
-            :value="item.value">
-          </el-option>
-        </el-select>
+           <el-form-item label="医生" prop="doctorName">
+                <el-input
+                  v-model="queryParams.doctorName"
+                  placeholder="请输入医生名称"
+                  clearable
+                  size="small"
+                  @keyup.enter.native="handleQuery"
+                />
       </el-form-item>
-      <el-form-item label="医生" prop="doctorId">
-        <el-select v-model="queryParams.doctorId" clearable filterable remote
-                   placeholder="请输入关键词" :remote-method="loadDoctorOptions"
-                   v-select-load-more="loadMoreDoctorOptions"
-                   :loading="doctorOptionsLoading">
-          <el-option
-            v-for="item in doctorOptions"
-            :key="item.value"
-            :label="item.label"
-            :value="item.value">
-          </el-option>
-        </el-select>
+      <el-form-item label="发卷人" prop="sendName">
+           <el-input
+             v-model="queryParams.sendName"
+             placeholder="请输入发卷人"
+             clearable
+             size="small"
+             @keyup.enter.native="handleQuery"
+           />
       </el-form-item>
       <el-form-item label="订单类型" prop="orderType">
          <el-select v-model="queryParams.orderType" placeholder="请选择" clearable size="small">
@@ -91,7 +93,7 @@
       <el-form-item label="支付时间" prop="payTimeRange">
         <el-date-picker style="width:205.4px" clearable size="small" v-model="payTimeRange" type="daterange" value-format="yyyy-MM-dd"  start-placeholder="开始日期"  end-placeholder="结束日期"> </el-date-picker>
       </el-form-item>
-
+	
       <el-form-item>
         <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
@@ -164,6 +166,7 @@
       <el-table-column label="订单金额" align="center" prop="money" />
       <el-table-column label="支付金额" align="center" prop="payMoney" />
       <el-table-column label="优惠金额" align="center" prop="discountMoney" />
+      <el-table-column label="优惠卷发送人" align="center" prop="sendName" width="120px"/>
       <el-table-column label="支付时间" align="center" prop="payTime" width="180"/>
       <el-table-column label="审核时间" align="center" prop="auditTime" width="180"/>
       <el-table-column label="审核人" align="center" prop="userName" width="180"/>
@@ -226,8 +229,6 @@ import { treeselect } from "@/api/company/companyDept";
 import Treeselect from "@riophae/vue-treeselect";
 import { getTask } from "@/api/common";
 import "@riophae/vue-treeselect/dist/vue-treeselect.css";
-import { getCompanyUserListLikeName } from "@/api/company/companyUser";
-import { getDoctorListLikeName } from "@/api/doctor/doctor";
 export default {
   watch: {
     // 根据名称筛选部门树
@@ -299,8 +300,8 @@ export default {
         inquiryType: null,
         doctorName:null,
         patientName:null,
+        sendName:null,
         phone:null,
-        companyUserId: null
       },
       // 表单参数
       form: {},
@@ -313,24 +314,6 @@ export default {
       inquiryOrderOptions:[],
       inquirySubTypeOptions:[],
       orOptions:[],
-      // 员工选项列表
-      companyUserOptionsParams: {
-        name: undefined,
-        hasNextPage: false,
-        pageNum: 1,
-        pageSize: 10
-      },
-      companyUserOptionsLoading: false,
-      companyUserOptions: [],
-      // 医生选项列表
-      doctorOptionsParams: {
-        name: undefined,
-        hasNextPage: false,
-        pageNum: 1,
-        pageSize: 10
-      },
-      doctorOptionsLoading: false,
-      doctorOptions: []
     };
   },
   created() {
@@ -606,79 +589,7 @@ export default {
           },10000);
         }
         }).catch(() => {});
-    },
-    /**
-     * 根据名称模糊查询用户列表
-     * @param query 参数
-     */
-    loadCompanyUserOptions(query) {
-      this.companyUserOptions = [];
-      if (query === '') {
-        return;
-      }
-
-      this.companyUserOptionsParams.pageNum = 1
-      this.companyUserOptionsParams.name = query
-      this.companyUserOptionsLoading = true;
-      this.getCompanyUserListLikeName()
-    },
-    /**
-     * 获取员工列表
-     */
-    getCompanyUserListLikeName() {
-      getCompanyUserListLikeName(this.companyUserOptionsParams).then(response => {
-        this.companyUserOptions = [...this.companyUserOptions, ...response.data.list]
-        this.companyUserOptionsParams.hasNextPage = response.data.hasNextPage
-        this.companyUserOptionsLoading = false;
-      });
-    },
-    /**
-     * 加载更多员工选项
-     */
-    loadMoreCompanyUserOptions() {
-      if (!this.companyUserOptionsParams.hasNextPage) {
-        return;
-      }
-
-      this.companyUserOptionsParams.pageNum += 1
-      this.getCompanyUserListLikeName()
-    },
-    /**
-     * 根据名称模糊查询医生列表选项
-     * @param query 参数
-     */
-    loadDoctorOptions(query) {
-      this.doctorOptions = [];
-      if (query === '') {
-        return;
-      }
-
-      this.doctorOptionsParams.pageNum = 1
-      this.doctorOptionsParams.name = query
-      this.doctorOptionsLoading = true;
-      this.getDoctorListLikeName()
-    },
-    /**
-     * 获取医生列表选项
-     */
-    getDoctorListLikeName() {
-      getDoctorListLikeName(this.doctorOptionsParams).then(response => {
-        this.doctorOptions = [...this.doctorOptions, ...response.data.list]
-        this.doctorOptionsParams.hasNextPage = response.data.hasNextPage
-        this.doctorOptionsLoading = false;
-      });
-    },
-    /**
-     * 加载更多医生选项
-     */
-    loadMoreDoctorOptions() {
-      if (!this.doctorOptionsParams.hasNextPage) {
-        return;
-      }
-
-      this.doctorOptionsParams.pageNum += 1
-      this.getDoctorListLikeName()
-    },
+    }
   }
 };
 </script>

+ 18 - 119
src/views/store/packageOrder/list.vue

@@ -31,31 +31,23 @@
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
-      <el-form-item label="医生名称" prop="doctorId">
-        <el-select v-model="queryParams.doctorId" clearable filterable remote
-                   placeholder="请输入关键词" :remote-method="loadDoctorOptions"
-                   v-select-load-more="loadMoreDoctorOptions"
-                   :loading="doctorOptionsLoading">
-          <el-option
-            v-for="item in doctorOptions"
-            :key="item.value"
-            :label="item.label"
-            :value="item.value">
-          </el-option>
-        </el-select>
+      <el-form-item label="医生名称" prop="doctorName">
+        <el-input
+          v-model="queryParams.doctorName"
+          placeholder="请输入医生名称"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
       </el-form-item>
-      <el-form-item label="员工" prop="companyUserId">
-        <el-select v-model="queryParams.companyUserId" clearable filterable remote
-                   placeholder="请输入关键词" :remote-method="loadCompanyUserOptions"
-                   v-select-load-more="loadMoreCompanyUserOptions"
-                   :loading="companyUserOptionsLoading">
-          <el-option
-            v-for="item in companyUserOptions"
-            :key="item.value"
-            :label="item.label"
-            :value="item.value">
-          </el-option>
-        </el-select>
+      <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="userName">
         <el-input
@@ -407,9 +399,6 @@ import addUser from "../components/addUser";
 import addUserAddress from "../components/addUserAddress";
 import addPatient from "../components/addPatient";
 import { getTask } from "@/api/common";
-import { getCompanyUserListLikeName } from "@/api/company/companyUser";
-import { getDoctorListLikeName } from "@/api/doctor/doctor";
-import { getPackageListLikeName } from "@/api/store/package"
 export default {
   name: "PackageOrder",
   components: {packageOrderDetails ,Treeselect,addUser,addUserAddress ,addPatient },
@@ -424,24 +413,6 @@ export default {
 	  sourceOptions:[],
       package:[],
       packageTypeOptions:[],
-      // 员工选项列表
-      companyUserOptionsParams: {
-        name: undefined,
-        hasNextPage: false,
-        pageNum: 1,
-        pageSize: 10
-      },
-      companyUserOptionsLoading: false,
-      companyUserOptions: [],
-      // 医生选项列表
-      doctorOptionsParams: {
-        name: undefined,
-        hasNextPage: false,
-        pageNum: 1,
-        pageSize: 10
-      },
-      doctorOptionsLoading: false,
-      doctorOptions: [],
       actName:"10",
       // 遮罩层
       loading: true,
@@ -510,7 +481,7 @@ export default {
         endTime:null,
         endStartTime:null,
         endEndTime:null,
-        companyUserId:null,
+        companyUserName:null,
         companyName:null,
 		source:null,
       },
@@ -877,79 +848,7 @@ export default {
           },10000);
         }
         }).catch(() => {});
-    },
-    /**
-     * 根据名称模糊查询用户列表
-     * @param query 参数
-     */
-    loadCompanyUserOptions(query) {
-      this.companyUserOptions = [];
-      if (query === '') {
-        return;
-      }
-
-      this.companyUserOptionsParams.pageNum = 1
-      this.companyUserOptionsParams.name = query
-      this.companyUserOptionsLoading = true;
-      this.getCompanyUserListLikeName()
-    },
-    /**
-     * 获取员工列表
-     */
-    getCompanyUserListLikeName() {
-      getCompanyUserListLikeName(this.companyUserOptionsParams).then(response => {
-        this.companyUserOptions = [...this.companyUserOptions, ...response.data.list]
-        this.companyUserOptionsParams.hasNextPage = response.data.hasNextPage
-        this.companyUserOptionsLoading = false;
-      });
-    },
-    /**
-     * 加载更多员工选项
-     */
-    loadMoreCompanyUserOptions() {
-      if (!this.companyUserOptionsParams.hasNextPage) {
-        return;
-      }
-
-      this.companyUserOptionsParams.pageNum += 1
-      this.getCompanyUserListLikeName()
-    },
-    /**
-     * 根据名称模糊查询医生列表选项
-     * @param query 参数
-     */
-    loadDoctorOptions(query) {
-      this.doctorOptions = [];
-      if (query === '') {
-        return;
-      }
-
-      this.doctorOptionsParams.pageNum = 1
-      this.doctorOptionsParams.name = query
-      this.doctorOptionsLoading = true;
-      this.getDoctorListLikeName()
-    },
-    /**
-     * 获取医生列表选项
-     */
-    getDoctorListLikeName() {
-      getDoctorListLikeName(this.doctorOptionsParams).then(response => {
-        this.doctorOptions = [...this.doctorOptions, ...response.data.list]
-        this.doctorOptionsParams.hasNextPage = response.data.hasNextPage
-        this.doctorOptionsLoading = false;
-      });
-    },
-    /**
-     * 加载更多医生选项
-     */
-    loadMoreDoctorOptions() {
-      if (!this.doctorOptionsParams.hasNextPage) {
-        return;
-      }
-
-      this.doctorOptionsParams.pageNum += 1
-      this.getDoctorListLikeName()
-    },
+    }
   }
 };
 </script>

+ 13 - 78
src/views/store/prescribe/list.vue

@@ -23,18 +23,14 @@
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
-      <el-form-item label="医生姓名" prop="doctorId">
-        <el-select v-model="queryParams.doctorId" clearable filterable remote
-                   placeholder="请输入关键词" :remote-method="loadDoctorOptions"
-                   v-select-load-more="loadMoreDoctorOptions"
-                   :loading="doctorOptionsLoading">
-          <el-option
-            v-for="item in doctorOptions"
-            :key="item.value"
-            :label="item.label"
-            :value="item.value">
-          </el-option>
-        </el-select>
+      <el-form-item label="医生姓名" prop="doctorName">
+        <el-input
+          v-model="queryParams.doctorName"
+          placeholder="请输入医生姓名"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
       </el-form-item>
       <el-form-item label="药品订单编号" prop="orderCode">
         <el-input
@@ -181,8 +177,6 @@
 <script>
 import { listPrescribe, getPrescribe, delPrescribe, addPrescribe, updatePrescribe, exportPrescribe,messageFeedbackExport } from "@/api/store/prescribe";
 import prescribeDetails from '../components/prescribeDetails.vue';
-import { getDoctorListLikeName } from "@/api/doctor/doctor";
-import { getTask } from "@/api/common";
 export default {
   name: "Prescribe",
   components: { prescribeDetails },
@@ -251,7 +245,7 @@ export default {
         auditSTime:null,
         auditETime:null,
         doctorName:null,
-        orderStatus:null,
+        orderStatus:null
       },
        actName:"10",
       // 表单参数
@@ -263,15 +257,6 @@ export default {
       prescribeType:[],
       orOptions:[],
       sexOptions:[],
-      // 医生选项列表
-      doctorOptionsParams: {
-        name: undefined,
-        hasNextPage: false,
-        pageNum: 1,
-        pageSize: 10
-      },
-      doctorOptionsLoading: false,
-      doctorOptions: [],
     };
   },
   created() {
@@ -371,7 +356,7 @@ export default {
         doctorId: null,
         createTime: null,
         status: 0,
-        auditTime: null,
+        auditTime: null
       };
       this.resetForm("form");
     },
@@ -449,7 +434,6 @@ export default {
     },
     /** 导出按钮操作 */
     handleExport() {
-      const that = this;
       const queryParams = this.queryParams;
       this.$confirm('是否确认导出所有处方数据项?', "警告", {
           confirmButtonText: "确定",
@@ -459,21 +443,8 @@ export default {
           this.exportLoading = true;
           return exportPrescribe(queryParams);
         }).then(response => {
-          if(response.code === 200){
-            that.msgSuccess(response.msg);
-            that.taskId = response.data;
-            that.time = setInterval(function(){
-              //查订单
-              getTask(that.taskId).then(res => {
-                if(res.data.status === 1) {
-                  that.exportLoading = false;
-                  clearTimeout(that.time)
-                  that.time = null;
-                  that.download(res.data.fileUrl);
-                }
-              });
-            },10000);
-          }
+          this.download(response.msg);
+          this.exportLoading = false;
         }).catch(() => {});
     },
      /** 导出按钮操作 */
@@ -490,43 +461,7 @@ export default {
           this.download(response.msg);
           this.exportLoading = false;
         }).catch(() => {});
-    },
-    /**
-     * 根据名称模糊查询医生列表选项
-     * @param query 参数
-     */
-    loadDoctorOptions(query) {
-      this.doctorOptions = [];
-      if (query === '') {
-        return;
-      }
-
-      this.doctorOptionsParams.pageNum = 1
-      this.doctorOptionsParams.name = query
-      this.doctorOptionsLoading = true;
-      this.getDoctorListLikeName()
-    },
-    /**
-     * 获取医生列表选项
-     */
-    getDoctorListLikeName() {
-      getDoctorListLikeName(this.doctorOptionsParams).then(response => {
-        this.doctorOptions = [...this.doctorOptions, ...response.data.list]
-        this.doctorOptionsParams.hasNextPage = response.data.hasNextPage
-        this.doctorOptionsLoading = false;
-      });
-    },
-    /**
-     * 加载更多医生选项
-     */
-    loadMoreDoctorOptions() {
-      if (!this.doctorOptionsParams.hasNextPage) {
-        return;
-      }
-
-      this.doctorOptionsParams.pageNum += 1
-      this.getDoctorListLikeName()
-    },
+    }
   }
 };
 </script>

+ 29 - 128
src/views/store/storeOrder/list.vue

@@ -32,18 +32,15 @@
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
-      <el-form-item label="员工姓名" prop="companyUserId">
-        <el-select v-model="queryParams.companyUserId" clearable filterable remote
-                   placeholder="请输入关键词" :remote-method="loadCompanyUserOptions"
-                   v-select-load-more="loadMoreCompanyUserOptions"
-                   :loading="companyUserOptionsLoading">
-          <el-option
-            v-for="item in companyUserOptions"
-            :key="item.value"
-            :label="item.label"
-            :value="item.value">
-          </el-option>
-        </el-select>
+      <el-form-item label="员工姓名" prop="companyUserNickName">
+        <el-input
+        style="width:220px"
+          v-model="queryParams.companyUserNickName"
+          placeholder="请输入员工姓名"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
       </el-form-item>
       <el-form-item label="物流状态" prop="deliveryStatus">
         <el-select  style="width:220px" v-model="queryParams.deliveryStatus" placeholder="请选择物流状态" clearable size="small" >
@@ -55,7 +52,7 @@
               />
         </el-select>
       </el-form-item>
-
+		
       <el-form-item label="结算状态" prop="deliveryPayStatus">
         <el-select style="width:220px" v-model="queryParams.deliveryPayStatus" placeholder="请选择物流结算状态" clearable size="small" >
         <el-option
@@ -117,8 +114,8 @@
       <el-form-item label="渠道" prop="channel">
          <el-select multiple filterable style="width: 200px" v-model="channelArr" placeholder="请选择渠道" clearable size="small" >
           <el-option
-            v-for="(item,index) in channelOptions"
-            :key="'channel' + index +item.dictValue"
+            v-for="item in channelOptions"
+            :key="'channel'+item.dictValue"
             :label="item.dictLabel"
             :value="item.dictValue"
           />
@@ -143,7 +140,7 @@
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
-
+	
       <el-form-item label="加密电话" prop="userPhoneMk">
         <el-input
           v-model="queryParams.userPhoneMk"
@@ -153,18 +150,14 @@
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
-      <el-form-item label="医生姓名" prop="doctorId">
-        <el-select v-model="queryParams.doctorId" clearable filterable remote
-                   placeholder="请输入关键词" :remote-method="loadDoctorOptions"
-                   v-select-load-more="loadMoreDoctorOptions"
-                   :loading="doctorOptionsLoading">
-          <el-option
-            v-for="item in doctorOptions"
-            :key="item.value"
-            :label="item.label"
-            :value="item.value">
-          </el-option>
-        </el-select>
+      <el-form-item label="医生姓名" prop="doctorName">
+        <el-input
+          v-model="queryParams.doctorName"
+          placeholder="请输入医生姓名"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
       </el-form-item>
       <el-form-item label="患者姓名" prop="patientName">
         <el-input
@@ -228,8 +221,8 @@
 	<el-form-item label="入账时间" prop="tuiMoneyTime">
 	      <el-date-picker v-model="tuiMoneyTime" size="small" style="width: 220px" value-format="yyyy-MM-dd" type="daterange" range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期" @change="changeTime"></el-date-picker>
 	</el-form-item>
-
-
+	
+	
       <el-form-item>
         <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
@@ -325,13 +318,12 @@
 import { listOrder, getOrder, delOrder, addOrder, updateOrder, exportOrder,importTemplate } from "@/api/store/storeOrder";
 import storeOrderDetails from '../components/storeOrderDetails.vue';
 import { getTcmScheduleList } from "@/api/company/tcmScheduleReport";
+import { getToken } from "@/utils/auth";
 import {listStore} from "@/api/store/storeProduct";
 import { treeselect } from "@/api/company/companyDept";
 import Treeselect from "@riophae/vue-treeselect";
 import { getTask } from "@/api/common";
 import "@riophae/vue-treeselect/dist/vue-treeselect.css";
-import { getCompanyUserListLikeName } from "@/api/company/companyUser";
-import { getDoctorListLikeName } from "@/api/doctor/doctor";
 export default {
   name: "Order",
   components: { storeOrderDetails ,Treeselect},
@@ -344,24 +336,6 @@ export default {
       qwSubjectArr:[],
       // 部门树选项
       deptOptions: [],
-      // 员工选项列表
-      companyUserOptionsParams: {
-        name: undefined,
-        hasNextPage: false,
-        pageNum: 1,
-        pageSize: 10
-      },
-      companyUserOptionsLoading: false,
-      companyUserOptions: [],
-      // 医生选项列表
-      doctorOptionsParams: {
-        name: undefined,
-        hasNextPage: false,
-        pageNum: 1,
-        pageSize: 10
-      },
-      doctorOptionsLoading: false,
-      doctorOptions: [],
       deptName:undefined,
       actName:"10",
       show:{
@@ -432,7 +406,7 @@ export default {
         prescribeId: null,
         finishTime: null,
         patientName: null,
-        doctorId: null,
+        doctorName: null,
         sTime:null,
         eTime:null,
         paysTime:null,
@@ -444,11 +418,11 @@ export default {
         tuieTime:null,
         tuiUserId: null,
         orderCreateType: null,
-        companyUserId:null,
+        companyUserName:null,
         companyName:null,
+        packageSecondName:null,
         isFirst:null,
       		source:null,
-        packageSecondName:null
       },
       // 表单参数
       form: {},
@@ -677,8 +651,7 @@ export default {
         tuiMoney: null,
         tuiMoneyStatus: 0,
         tuiUserId: null,
-        orderCreateType: null,
-        packageSecondName: null
+        orderCreateType: null
       };
       this.resetForm("form");
     },
@@ -870,79 +843,7 @@ export default {
           },10000);
         }
         }).catch(() => {});
-    },
-    /**
-   * 根据名称模糊查询用户列表
-   * @param query 参数
-   */
-    loadCompanyUserOptions(query) {
-      this.companyUserOptions = [];
-      if (query === '') {
-        return;
-      }
-
-      this.companyUserOptionsParams.pageNum = 1
-      this.companyUserOptionsParams.name = query
-      this.companyUserOptionsLoading = true;
-      this.getCompanyUserListLikeName()
-    },
-    /**
-     * 获取员工列表
-     */
-    getCompanyUserListLikeName() {
-      getCompanyUserListLikeName(this.companyUserOptionsParams).then(response => {
-        this.companyUserOptions = [...this.companyUserOptions, ...response.data.list]
-        this.companyUserOptionsParams.hasNextPage = response.data.hasNextPage
-        this.companyUserOptionsLoading = false;
-      });
-    },
-    /**
-     * 加载更多员工选项
-     */
-    loadMoreCompanyUserOptions() {
-      if (!this.companyUserOptionsParams.hasNextPage) {
-        return;
-      }
-
-      this.companyUserOptionsParams.pageNum += 1
-      this.getCompanyUserListLikeName()
-    },
-    /**
-     * 根据名称模糊查询医生列表选项
-     * @param query 参数
-     */
-    loadDoctorOptions(query) {
-      this.doctorOptions = [];
-      if (query === '') {
-        return;
-      }
-
-      this.doctorOptionsParams.pageNum = 1
-      this.doctorOptionsParams.name = query
-      this.doctorOptionsLoading = true;
-      this.getDoctorListLikeName()
-    },
-    /**
-     * 获取医生列表选项
-     */
-    getDoctorListLikeName() {
-      getDoctorListLikeName(this.doctorOptionsParams).then(response => {
-        this.doctorOptions = [...this.doctorOptions, ...response.data.list]
-        this.doctorOptionsParams.hasNextPage = response.data.hasNextPage
-        this.doctorOptionsLoading = false;
-      });
-    },
-    /**
-     * 加载更多医生选项
-     */
-    loadMoreDoctorOptions() {
-      if (!this.doctorOptionsParams.hasNextPage) {
-        return;
-      }
-
-      this.doctorOptionsParams.pageNum += 1
-      this.getDoctorListLikeName()
-    },
+    }
   }
 };
 </script>

+ 2 - 4
src/views/watch/deviceInfo/details.vue

@@ -64,7 +64,7 @@
           </div>
         </div>
         <div class="equipment-day">
-          <!-- 已绑定 <span>400</span> 天, 佩戴 <span>4365</span> 天 -->
+          已绑定 <span>400</span> 天, 佩戴 <span>4365</span> 天
         </div>
         <div class="equipment-btn">
           <el-button type="primary" size="small">一键上传</el-button>
@@ -342,9 +342,7 @@ export default {
      */
     async getUserinfo(deviceId) {
       try {
-        const userId = this.$route.params.userId;
-        const selectType = this.$route.params.selectType;
-        const response = await getUser({deviceId:deviceId,userId:userId,selectType});
+        const response = await getUser(deviceId);
         if (response && response.data) {
           this.userInfo = response.data; // 确保数据被正确赋值
           // console.log("用户信息:", this.userInfo);

+ 9 - 122
src/views/watch/deviceInfo/index.vue

@@ -5,17 +5,10 @@
         <el-input v-model="queryParams.doctorName" placeholder="请输入所属医生" clearable size="small"
           @keyup.enter.native="handleQuery" />
       </el-form-item>
-      <el-form-item label="所属员工" prop="companyUserId">
-        <el-select v-model="queryParams.companyUserId" placeholder="请选择所属员工" clearable size="small">
-          <el-option v-for="item in companyUserList" :key="item.userId" :label="item.nickName"
-            :value="item.userId">
-          </el-option>
-        </el-select>
-      </el-form-item>
-      <!-- <el-form-item label="绑定用户" prop="watchUserName">
+      <el-form-item label="绑定用户" prop="watchUserName">
         <el-input v-model="queryParams.watchUserName" placeholder="请输入绑定用户" clearable size="small"
           @keyup.enter.native="handleQuery" />
-      </el-form-item> -->
+      </el-form-item>
       <el-form-item label="设备编号" prop="deviceNumber">
         <el-input v-model="queryParams.deviceNumber" placeholder="请输入设备编号" clearable size="small"
           @keyup.enter.native="handleQuery" />
@@ -89,18 +82,8 @@
     <el-table v-loading="loading" :data="deviceInfoList" @selection-change="handleSelectionChange">
       <el-table-column type="selection" width="55" align="center" />
       <el-table-column label="设备id" align="center" prop="deviceId" />
-      <el-table-column label="所属员工" align="center" prop="companyUserName" />
       <el-table-column label="所属医生" align="center" prop="doctorName" />
-      <el-table-column  label="绑定用户"  align="center">
-          <template slot-scope="scope">
-              <el-link :underline="false" prop="item.userId" v-for="(item, index) in scope.row.users"  v-if="scope.row.users"  @click="handleDetails(scope.row.deviceId,item.userId,0)">{{item.nickName}}</el-link>
-          </template>
-      </el-table-column>
-      <el-table-column  label="绑定家人用户"  align="center">
-          <template slot-scope="scope">
-              <el-link :underline="false" prop="item.userId" v-for="(item, index) in scope.row.familyUsers"  v-if="scope.row.familyUsers"  @click="handleDetails(scope.row.deviceId,item.userId,1)">{{item.nickName}}</el-link>
-          </template>
-      </el-table-column>
+      <el-table-column label="绑定用户" align="center" prop="watchUserName" />
       <el-table-column label="设备编号" align="center" prop="deviceNumber" width="150"/>
       <el-table-column label="电量" align="center" prop="battery" />
       <el-table-column label="信号" align="center" prop="rssi" />
@@ -120,65 +103,14 @@
       </el-table-column>
       <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
         <template slot-scope="scope">
-          <el-button size="mini" type="text" icon="el-icon-view" @click="handleDetails(scope.row.deviceId,null,0)"
+          <el-button size="mini" type="text" icon="el-icon-view" @click="handleDetails(scope.row.deviceId)"
             v-hasPermi="['watchApi:deviceInfo:query']">查询详情</el-button>
           <el-button size="mini" type="text" icon="el-icon-phone-outline" @click="handleSoSPeople(scope.row.deviceNumber)"
             v-hasPermi="['watchApi:deviceInfo:query']">查看紧急联系人</el-button>
-          <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
-            v-hasPermi="['watchApi:deviceInfo:edit']">修改</el-button>  
         </template>
       </el-table-column>
     </el-table>
 
-    <!-- 添加或修改设备信息对话框 -->
-    <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="companyUserId">
-          <template #label>
-            <span class="required-label">所属员工</span>
-          </template>
-          <el-select v-model="form.companyUserId" placeholder="请选择所属员工" clearable size="small">
-            <el-option v-for="item in companyUserList" :key="item.userId" :label="item.nickName"
-              :value="item.userId">
-            </el-option>
-          </el-select>
-        </el-form-item>
-        <el-form-item label="所属医生" prop="doctorId">
-          <template #label>
-            <span class="required-label">所属医生</span>
-          </template>
-          <el-select v-model="form.doctorId" placeholder="请选择所属医生" clearable size="small">
-            <el-option v-for="item in doctorList" :key="item.doctorId" :label="item.doctorName"
-              :value="item.doctorId">
-            </el-option>
-          </el-select>
-        </el-form-item>
-        <el-form-item label="设备编号" prop="deviceNumber">
-          <el-input v-model="form.deviceNumber" placeholder="请输入设备编号" disabled/>
-        </el-form-item>
-        <el-form-item label="电量" prop="battery">
-          <el-input v-model="form.battery" placeholder="请输入电量" disabled/>
-        </el-form-item>
-        <el-form-item label="信号" prop="rssi">
-          <el-input v-model="form.rssi" placeholder="请输入信号" disabled/>
-        </el-form-item>
-        <el-form-item label="设备状态">
-          <el-radio-group v-model="form.status">
-            <el-radio :label="0">OFFLINE</el-radio>
-            <el-radio :label="1">ONLINE</el-radio>
-            <el-radio :label="2">UNACTIVE</el-radio>
-            <el-radio :label="3">DISABLE</el-radio>
-            <el-radio :label="4">NOT EXIST</el-radio>
-          </el-radio-group>
-        </el-form-item>
-      </el-form>
-      <div slot="footer" class="dialog-footer">
-        <el-button type="primary" @click="submitForm">确 定</el-button>
-        <el-button @click="cancel">取 消</el-button>
-      </div>
-    </el-dialog>
-
     <!-- 弹窗展示紧急联系人列表 -->
     <el-dialog :visible.sync="sosVisible" title="紧急联系人" width="50%">
         <el-table v-loading="sosLoading" :data="sosPeopleList">
@@ -237,14 +169,14 @@
 
 <script>
 import { listDeviceInfo, getDeviceInfo, delDeviceInfo, addDeviceInfo, updateDeviceInfo, exportDeviceInfo, queryAlarm, setStatus, queryPageAlarm,queryLastHealthData,querySos} from "@/api/watch/deviceInfo";
-import { getSelectUserList } from "@/api/company/companyUser";
+import { getAllUserlist } from "@/api/company/companyUser";
 import { messageSend } from "@/api/watch/deviceInfoSet.js";
-import { listDoctor } from "@/api/doctor/doctor";
 import setUpUserInfoDialog from "@/components/DeviceInfo/SettingDialog/setUpUserInfoDialog.vue";
 import SetInfoDialog from "@/components/DeviceInfo/SettingDialog/SetInfoDialog.vue";
 import Phonebook from "@/components/DeviceInfo/SettingDialog/Phonebook.vue";
 import Clockalarm from "@/components/DeviceInfo/SettingDialog/Clockalarm.vue";
 import Sedentary from "@/components/DeviceInfo/SettingDialog/Sedentary.vue";
+// import {getInfo} from "@/api/login"
 
 export default {
   name: "DeviceInfo",
@@ -379,8 +311,6 @@ export default {
   },
   created() {
     this.getList();
-    this.getCompanyUserList();
-    this.getDoctorList();
   },
   computed: {
     // 计算属性来控制按钮的disabled状态
@@ -389,51 +319,8 @@ export default {
     }
   },
   methods: {
-    getDoctorList(){
-      listDoctor({ doctorType:1,isAudit:1 }).then(response => {
-        this.doctorList = response.rows;
-      });
-    },
-    getCompanyUserList(){
-      getSelectUserList().then(response => {
-          this.companyUserList = response.rows;
-        }).catch(error => {
-          console.error("获取员工列表失败:", error);
-        });
-    },
-    /** 修改按钮操作 */
-    handleUpdate(row) {
-      this.reset();
-      const deviceId = row.deviceId || this.ids
-      getDeviceInfo(deviceId).then(response => {
-        this.form = response.data;
-        this.open = true;
-        this.title = "修改设备信息";
-      });
-    },
-    /** 提交按钮 */
-    submitForm() {
-      this.$refs["form"].validate(valid => {
-        if (valid) {
-          if (this.form.deviceId != null) {
-            console.log("===============================" + JSON.stringify(this.form, null, 2))
-            updateDeviceInfo(this.form).then(response => {
-              this.msgSuccess("修改成功");
-              this.open = false;
-              this.getList();
-            });
-          } else {
-            addDeviceInfo(this.form).then(response => {
-              this.msgSuccess("新增成功");
-              this.open = false;
-              this.getList();
-            });
-          }
-        }
-      });
-    },
     rowClassName({row}) {
-      if (row.status && (row.status.includes('偏') || row.status.includes('重'))) {
+      if (row.status && row.status.includes('偏')) {
         // console.log("=============================" + JSON.stringify(row.status, null, 2))
         return 'text-red';
         // return true
@@ -517,8 +404,8 @@ export default {
       }
     },
     /** 处理查询详情按钮点击事件 */
-    handleDetails(deviceId,userId,type) {
-      this.$router.push({ name: 'details', params: { deviceId:deviceId,userId:userId,selectType:type } });
+    handleDetails(deviceId) {
+      this.$router.push({ name: 'details', params: { deviceId } });
     },
 
     /** 查询设备信息列表 */

+ 0 - 632
src/views/watch/deviceInfo/my.vue

@@ -1,632 +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="doctorId">
-          <el-input v-model="queryParams.doctorName" placeholder="请输入所属医生" clearable size="small"
-            @keyup.enter.native="handleQuery" />
-        </el-form-item>
-        <!-- <el-form-item label="绑定用户" prop="watchUserName">
-          <el-input v-model="queryParams.watchUserName" placeholder="请输入绑定用户" clearable size="small"
-            @keyup.enter.native="handleQuery" />
-        </el-form-item> -->
-        <el-form-item label="设备编号" prop="deviceNumber">
-          <el-input v-model="queryParams.deviceNumber" placeholder="请输入设备编号" clearable size="small"
-            @keyup.enter.native="handleQuery" />
-        </el-form-item>
-        <el-form-item label="绑定状态" prop="lifeStatus">
-          <el-select v-model="queryParams.lifeStatus" placeholder="请选择绑定状态" clearable size="small">
-            <!-- <el-option label="请选择字典生成" value="" /> -->
-            <el-option v-for="item in lifeStatusOptions" :key="item.value" :label="item.label" :value="item.value">
-            </el-option>
-          </el-select>
-        </el-form-item>
-        <el-form-item label="设备状态" prop="status">
-          <el-select v-model="queryParams.status" placeholder="请选择设备状态" clearable size="small">
-            <!-- <el-option label="请选择字典生成" value="" /> -->
-            <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value">
-            </el-option>
-          </el-select>
-        </el-form-item>
-        <el-form-item>
-          <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
-          <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
-        </el-form-item>
-      </el-form>
-  
-      <el-row :gutter="10" class="mb8">
-        <el-col :span="1.5">
-          <el-button type="warning" plain icon="el-icon-download" size="mini" :loading="exportLoading"
-            @click="handleExport" v-hasPermi="['watchApi:deviceInfo:export']">导出</el-button>
-        </el-col>
-  
-        <el-col :span="1.5">
-          <el-popover placement="right" width="400" trigger="click" @show="refreshPageAlarm">
-            <div>
-              <div class="clearfix" style="padding: 10px; border-bottom: 1px solid #ebeef5;">
-                <span>预警通知</span>
-                <el-button style="float: right; padding: 3px 0" type="text" @click="markAllAsRead"
-                  v-if="alarmData && alarmData.length > 0">一键已读</el-button>
-              </div>
-              <div class="notification-container" v-infinite-scroll="load">
-                <el-card v-for="(notification, index) in alarmData" :key="index" class="notification-card">
-                  <!-- 红点标记 -->
-                  <div v-if="notification.status === 0" class="red-dot"></div>
-                  <el-row @click="goDetailPage(notification)">
-                    <el-col :span="20" :style="{ opacity: notification.status == 1 ? 0.6 : 1 }">
-                      <div class="notification-title">{{ notification.title }}</div>
-                      <div class="notification-desc">{{ notification.description }}</div>
-                      <div class="notification-time">{{ notification.dateTime }}</div>
-                    </el-col>
-                    <el-col :span="4" class="notification-status">
-                      <el-button style="float: right; padding: 3px 0" type="text" size="mini"
-                        @click="readItem(notification)">阅读</el-button>
-                    </el-col>
-                  </el-row>
-                </el-card>
-  
-              </div>
-            </div>
-            <!-- 触发弹出框的按钮 -->
-            <el-button type="info" plain icon="el-icon-bell" size="mini" slot="reference">预警通知</el-button>
-          </el-popover>
-        </el-col>
-  
-        <el-col :span="1.5">
-          <el-button plain icon="el-icon-setting" size="mini" @click="sendMsg" :disabled="sendMsgButtonDisabled"
-            v-hasPermi="['watchApi:deviceInfo:edit']">看课提醒</el-button>
-        </el-col>
-  
-        <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
-      </el-row>
-  
-      <el-table v-loading="loading" :data="deviceInfoList" @selection-change="handleSelectionChange">
-        <el-table-column type="selection" width="55" align="center" />
-        <el-table-column label="设备id" align="center" prop="deviceId" />
-        <el-table-column label="所属医生" align="center" prop="doctorName" />
-        <el-table-column  label="绑定用户"  align="center">
-          <template slot-scope="scope">
-              <el-link :underline="false" prop="item.userId" v-for="(item, index) in scope.row.users"  v-if="scope.row.users"  @click="handleDetails(scope.row.deviceId,item.userId,0)">{{item.nickName}}</el-link>
-          </template>
-        </el-table-column>
-        <el-table-column  label="绑定家人用户"  align="center">
-            <template slot-scope="scope">
-                <el-link :underline="false" prop="item.userId" v-for="(item, index) in scope.row.familyUsers"  v-if="scope.row.familyUsers"  @click="handleDetails(scope.row.deviceId,item.userId,1)">{{item.nickName}}</el-link>
-            </template>
-        </el-table-column>
-        <el-table-column label="设备编号" align="center" prop="deviceNumber" width="150"/>
-        <el-table-column label="电量" align="center" prop="battery" />
-        <el-table-column label="信号" align="center" prop="rssi" />
-        <el-table-column label="绑定状态" align="center" prop="lifeStatusOut" />
-        <el-table-column label="设备状态" align="center" prop="statusOut" />
-        <el-table-column label="最新健康数据" align="center" width="120" >
-          <template slot-scope="scope">
-            <span 
-              @click="showHealthData(scope.row.deviceNumber)"
-              style="cursor: pointer; color: #409EFF;"
-            >
-              最新数据
-            </span>
-            <el-tag size="mini" :type="scope.row.isNormal == '异常'?'danger':'primary'">{{scope.row.isNormal}}</el-tag>
-  
-          </template>
-        </el-table-column>
-        <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
-          <template slot-scope="scope">
-            <el-button size="mini" type="text" icon="el-icon-view" @click="handleDetails(scope.row.deviceId,null,0)"
-              v-hasPermi="['watchApi:deviceInfo:query']">查询详情</el-button>
-            <el-button size="mini" type="text" icon="el-icon-phone-outline" @click="handleSoSPeople(scope.row.deviceNumber)"
-              v-hasPermi="['watchApi:deviceInfo:query']">查看紧急联系人</el-button>
-          </template>
-        </el-table-column>
-      </el-table>
-  
-      <!-- 弹窗展示紧急联系人列表 -->
-      <el-dialog :visible.sync="sosVisible" title="紧急联系人" width="50%">
-          <el-table v-loading="sosLoading" :data="sosPeopleList">
-            <el-table-column prop="name" label="联系人" align="center" />
-            <el-table-column prop="number" label="电话" align="center" />
-          </el-table>
-          <div slot="footer" class="dialog-footer">
-            <el-button @click="sosVisible = false">关闭</el-button>
-          </div>
-      </el-dialog>
-      <!-- 弹窗展示最新健康数据列表 -->
-      <el-dialog :visible.sync="healthDataDialogVisible" title="最新健康数据" width="50%">
-          <el-table :data="selectedHealthData" :row-class-name="rowClassName">
-            <el-table-column prop="type" label="类型" align="center" />
-            <el-table-column prop="data" label="数值" align="center" />
-            <el-table-column prop="status" label="状态" align="center" />
-            <el-table-column prop="date" label="时间" align="center" />
-          </el-table>
-          <div slot="footer" class="dialog-footer">
-            <el-button @click="healthDataDialogVisible = false">关闭</el-button>
-          </div>
-        </el-dialog>
-        
-        
-      <!-- 消息发送弹窗 -->
-      <el-dialog :visible.sync="showSend" :title="senFormTitle" width="40%">
-        <el-form :model="sendForm" :rules="sendRules" label-width="100px" ref="sendForm">
-          <el-form-item label="标题" prop="title">
-            <el-input  v-model="sendForm.title"></el-input>
-          </el-form-item>
-          <el-form-item label="详情" prop="description">
-            <el-input type="textarea" v-model="sendForm.description"></el-input>
-          </el-form-item>
-        
-        </el-form>      
-        <div slot="footer" class="dialog-footer">
-          <el-button type="primary" @click="submitSendForm">确 定</el-button>
-          <el-button @click="cancel">取 消</el-button>
-        </div>
-      </el-dialog>
-  
-      <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize"
-        @pagination="getList" />
-  
-      <setUpUserInfoDialog ref="setUpUserInfoDialog" />
-      <!-- 其他设置弹窗 -->
-      <SetInfoDialog ref="setInfoDialog" @refreshList="getList" />
-      <!-- 下发通讯录弹窗 -->
-      <Phonebook ref="phonebook" />
-      <!-- 设置闹钟 -->
-      <Clockalarm ref="clockalarm" />
-      <!-- 设置久坐 -->
-      <Sedentary ref="sedentary" />
-    </div>
-  </template>
-  
-  <script>
-  import { myDeviceInfo, getDeviceInfo, delDeviceInfo, addDeviceInfo, updateDeviceInfo, exportMy, queryAlarm, setStatus, queryPageAlarm,queryLastHealthData,querySos} from "@/api/watch/deviceInfo";
-  import { getAllUserlist } from "@/api/company/companyUser";
-  import { messageSend } from "@/api/watch/deviceInfoSet.js";
-  import setUpUserInfoDialog from "@/components/DeviceInfo/SettingDialog/setUpUserInfoDialog.vue";
-  import SetInfoDialog from "@/components/DeviceInfo/SettingDialog/SetInfoDialog.vue";
-  import Phonebook from "@/components/DeviceInfo/SettingDialog/Phonebook.vue";
-  import Clockalarm from "@/components/DeviceInfo/SettingDialog/Clockalarm.vue";
-  import Sedentary from "@/components/DeviceInfo/SettingDialog/Sedentary.vue";
-  // import {getInfo} from "@/api/login"
-  
-  export default {
-    name: "my",
-    components: {
-      setUpUserInfoDialog,
-      SetInfoDialog,
-      Phonebook,
-      Clockalarm,
-      Sedentary
-    },
-    data() {
-      return {
-        sosVisible: false,
-        sosLoading: false,
-        sosPeopleList: [],
-        // healthDataloading: false,
-        deviceInfoList: [],  // 设备信息列表
-        healthDataDialogVisible: false,  // 控制弹窗显示
-        selectedHealthData: [],  // 选中设备的健康数据列表
-        roles: null, // 登录用户信息
-        // 查询参数
-        queryAlarmParams: {
-          pageNum: 1,
-          pageSize: 10
-        },
-        alarmTotal: 0,
-        alarmData: [],
-        hasMore: true,
-        // 遮罩层
-        loading: true,
-        // 导出遮罩层
-        exportLoading: false,
-        // 选中数组
-        ids: [],
-        // 选中编号数组
-        deviceNumbers: [],
-        // 非单个禁用
-        single: true,
-        // 非多个禁用
-        multiple: true,
-        // 显示搜索条件
-        showSearch: true,
-        // 总条数
-        total: 0,
-        // 设备信息表格数据
-        deviceInfoList: [],
-        // 公司信息表格数据
-        companyList: [],
-        // 公司员工信息表格数据
-        companyUserList: [],
-        doctorList:[],
-        // 弹出层标题
-        title: "",
-        // 是否显示弹出层
-        open: false,
-        // 查询参数
-        queryParams: {
-          pageNum: 1,
-          pageSize: 10,
-          companyId: null,
-          deviceNumber: null,
-          battery: null,
-          rssi: null,
-          status: null,
-          lifeStatus: undefined
-        },
-        // 表单参数
-        form: {
-          companyId: '',
-          companyUserId:"",
-          doctorId:"",
-          deviceNumber: '',
-          battery: '',
-          rssi: '',
-          status: 1,
-        },
-        // 表单校验
-        rules: {
-          // companyId: [
-          //   { required: true, message: "请选择所属公司", trigger: "change" }
-          // ],
-          deviceNumber: [
-            { required: true, message: "设备编号不能为空", trigger: "blur" },
-            { pattern: /^\d{15}$/, message: "设备编号必须是15位数字", trigger: "blur" }
-          ],
-        },
-        sendRules:{
-          title: [
-            { required: true, message: '标题不能为空', trigger: 'blur' },
-            { max: 15, message: '标题最多15个字节', trigger: 'blur' }
-          ],
-          description: [
-            { required: true, message: '详情不能为空', trigger: 'blur' },
-            { max: 240, message: '详情最多240个字节', trigger: 'blur' }
-          ]
-        },
-        options: [{
-          value: '0',
-          label: 'OFFLINE'
-        }, {
-          value: '1',
-          label: 'ONLINE'
-        }, {
-          value: '2',
-          label: 'UNACTIVE'
-        }, {
-          value: '3',
-          label: 'DISABLE'
-        }, {
-          value: '4',
-          label: 'NOT EXIST'
-        }],
-        lifeStatusOptions:[{
-          value: '0',
-          label: '空置'
-        },{
-          value: '1',
-          label: '已送出'
-        },{
-          value: '2',
-          label: '已激活'
-        }],
-        // 是否展示设置按钮面板
-        // showSettingBtn: true,
-        showSend:false,
-        senFormTitle:'',
-        sendForm:{
-          title:'',
-          description:''
-        },
-      };
-    },
-    created() {
-      this.getList();
-    },
-    computed: {
-      // 计算属性来控制按钮的disabled状态
-      sendMsgButtonDisabled() {
-        return this.deviceNumbers.length === 0;
-      }
-    },
-    methods: {
-      rowClassName({row}) {
-        if (row.status && row.status.includes('偏')) {
-          // console.log("=============================" + JSON.stringify(row.status, null, 2))
-          return 'text-red';
-          // return true
-        }
-        return '';
-      },
-      showHealthData(deviceId) {
-        // 模拟获取最新健康数据,实际应用中可能需要通过 API 获取数据
-        queryLastHealthData({deviceId}).then(response => {
-          this.selectedHealthData = response.data;
-        });
-        this.healthDataDialogVisible = true;  // 显示弹窗
-      },
-      shouldShowCompanySelect() {
-        // 根据登录用户信息判断是否显示所属公司选择框
-        const roles = this.$store.getters.roles; // 获取角色信息
-        // 只有包含 'admin' 或 'common' 才返回 true
-        return (roles.includes('admin') || roles.includes('common'));
-      },
-      load() {
-        if (this.hasMore) this.refreshPageAlarm()
-      },
-      markAllAsRead() {
-        // 提取所有通知的 ID
-        const ids = this.alarmData.map(notification => notification.id);
-        // 调用 setStatus 方法将这些通知标记为已读
-        setStatus(ids).then(response => {
-          if (response.code == 200) {
-            this.alarmData = this.alarmData.map(item => ({
-              ...item,
-              status: 1
-            }))
-          }
-        })
-          .catch(error => {
-            console.error('一键已读操作失败:', error);
-          });
-      },
-      //设置已读
-      readItem(notification) {
-        if (notification.status == 1) return
-        setStatus([notification.id]).then(response => {
-          if (response.code == 200) {
-            notification.status = 1
-          }
-        })
-          .catch(error => {
-            console.error('更新状态失败:', error);
-          });
-      },
-      getAlarm() {
-        queryAlarm(null).then(response => {
-          this.alarmData = response.data
-        });
-      },
-      refreshPageAlarm() {
-        this.alarmData = []
-        this.queryAlarmParams.pageNum = 1
-        this.hasMore = true
-        this.getPageAlarm()
-      },
-      // 获取分页预警通知
-      getPageAlarm() {
-        queryPageAlarm(this.queryAlarmParams).then(response => {
-          if (response.code == 200) {
-            const list = response.rows
-            this.alarmTotal = response.total
-            this.alarmData = this.alarmData.concat(list)
-            this.queryAlarmParams.pageNum++
-            if (this.alarmData.length == this.alarmTotal) {
-              this.hasMore = false
-            }
-          }
-        });
-      },
-      // 查看预警通知详情
-      goDetailPage(row) {
-        // 如果sos跳转地图
-        if (row.extra == "sos") {
-  
-        }
-      },
-      /** 处理查询详情按钮点击事件 */
-      handleDetails(deviceId,userId,type) {
-        this.$router.push({ name: 'details', params: { deviceId:deviceId,userId:userId,selectType:type } });
-      },
-  
-      /** 查询设备信息列表 */
-      getList() {
-        this.loading = true;
-        myDeviceInfo(this.queryParams).then(response => {
-          this.deviceInfoList = response.rows;
-          this.total = response.total;
-          this.loading = false;
-        });
-      },
-      // 取消按钮
-      cancel() {
-        this.open = false;
-        this.reset();
-      },
-      // 表单重置
-      reset() {
-        this.form = {
-          deviceId: null,
-          createTime: null,
-          createBy: null,
-          updateTime: null,
-          updateBy: null,
-          companyName: null,
-          companyId: '',
-          companyUserId: '',
-          deviceNumber: null,
-          battery: null,
-          rssi: null,
-          status: 0
-        };
-        this.resetForm("form");
-      },
-  
-      /** 搜索按钮操作 */
-      handleQuery() {
-        this.queryParams.pageNum = 1;
-        this.getList();
-      },
-      /** 重置按钮操作 */
-      resetQuery() {
-        this.resetForm("queryForm");
-        this.handleQuery();
-      },
-      // 多选框选中数据
-      handleSelectionChange(selection) {
-        this.ids = selection.map(item => item.deviceId)
-        this.deviceNumbers = selection.map(item => item.deviceNumber)
-        this.single = selection.length !== 1
-        this.multiple = !selection.length
-      },
-      /** 发送消息 */
-      sendMsg() {
-        console.log("点击事件触发,item 为:", this.deviceNumbers);
-          this.showSend=true;
-          this.senFormTitle = "看课提醒";
-          this.sendForm.title ="看课提醒";
-      },
-      submitSendForm(){
-        // 首先调用表单验证方法
-        this.$refs.sendForm.validate((valid) => {
-          if (valid) {
-            // 如果验证通过,则发送消息
-            console.log("=============================2" +JSON.stringify( this.sendForm, null, 2));
-            messageSend({
-              deviceNumber: this.deviceNumbers.join(","),
-              title: this.sendForm.title,
-              description: this.sendForm.description,
-              type: 'study'
-            }).then(response => {
-                if(response.code === 200){
-                  this.msgSuccess("发送成功");
-                  this.showSend = false;
-                }
-              });
-          } else {
-            // 如果验证失败,则提示用户
-            console.log('表单验证失败');
-            this.$message.error('请检查表单内容');
-            return false;
-          }
-        });
-      },
-      /** 导出按钮操作 */
-      handleExport() {
-        const queryParams = this.queryParams;
-        this.$confirm('是否确认导出所有设备信息数据项?', "警告", {
-          confirmButtonText: "确定",
-          cancelButtonText: "取消",
-          type: "warning"
-        }).then(() => {
-          this.exportLoading = true;
-          return exportMy(queryParams);
-        }).then(response => {
-          this.download(response.msg);
-          this.exportLoading = false;
-        }).catch(() => { });
-      },
-      // 查询紧急联系人
-      handleSoSPeople(deviceId) {
-        this.sosLoading = true;
-        querySos({deviceId: deviceId}).then(res=>{
-          this.sosLoading = false
-          this.sosPeopleList = res.data || []
-          this.sosVisible = true
-        }).catch(()=>{
-          this.sosLoading = false
-        })
-      }
-    }
-  };
-  </script>
-  <style>
-  .text-red {
-    color: red;
-  }
-  </style>
-  <style lang="scss" scoped>
-  .notification-container {
-    padding: 10px 0;
-    height: 80vh;
-    overflow-y: auto;
-  }
-  
-  .notification-container::-webkit-scrollbar {
-    width: 4px;
-    /*  设置纵轴(y轴)轴滚动条 */
-    height: 4px;
-    /*  设置横轴(x轴)轴滚动条 */
-  }
-  
-  /* 滚动条滑块(里面小方块) */
-  .notification-container::-webkit-scrollbar-thumb {
-    border-radius: 10px;
-    background: rgba(144, 147, 153, 0.3);
-  }
-  
-  /* 滚动条轨道 */
-  .notification-container::-webkit-scrollbar-track {
-    border-radius: 0;
-  }
-  
-  .notification-card {
-    position: relative;
-    padding-right: 10px;
-    margin-bottom: 10px;
-    cursor: pointer;
-  
-    &:hover {
-      background: #edf8ff;
-    }
-  }
-  
-  .red-dot {
-    position: absolute;
-    top: 10px;
-    right: 10px;
-    width: 8px;
-    height: 8px;
-    background-color: red;
-    border-radius: 50%;
-  }
-  
-  .notification-title {
-    font-weight: bold;
-    font-size: 16px;
-  }
-  
-  .notification-desc {
-    margin-top: 5px;
-    color: #666;
-  }
-  
-  .notification-time {
-    margin-top: 10px;
-    font-size: 12px;
-    color: #999;
-  }
-  
-  .notification-status {
-    display: flex;
-    align-items: center;
-    justify-content: flex-end;
-  }
-  
-  .clearfix::after {
-    content: "";
-    display: table;
-    clear: both;
-  }
-  
-  .text {
-    font-size: 14px;
-  }
-  
-  .item {
-    margin-bottom: 18px;
-  }
-  
-  .clearfix:before,
-  .clearfix:after {
-    display: table;
-    content: "";
-  }
-  
-  .clearfix:after {
-    clear: both
-  }
-  
-  .box-card {
-    width: 480px;
-  }
-  </style>
-