Просмотр исходного кода

Merge remote-tracking branch 'origin/master'

qt 3 дней назад
Родитель
Сommit
8bcfd9c92d
48 измененных файлов с 526 добавлено и 123 удалено
  1. 8 0
      src/api/course/courseFinishTemp.js
  2. 7 0
      src/api/qw/sopUserLogs.js
  3. 10 0
      src/api/qw/user.js
  4. 15 0
      src/api/statistics/statistics.js
  5. 10 6
      src/views/company/components/userSelect.vue
  6. 1 0
      src/views/components/course/userCourseCatalogDetails.vue
  7. 71 13
      src/views/course/courseFinishTemp/index.vue
  8. 3 3
      src/views/course/courseRedPacketLog/index.vue
  9. 3 3
      src/views/course/courseRedPacketLog/myCourseRedPacketLog.vue
  10. 1 1
      src/views/course/courseWatchLog/deptWatchLog.vue
  11. 3 1
      src/views/course/courseWatchLog/index.vue
  12. 1 0
      src/views/course/courseWatchLog/myCourseWatchLog.vue
  13. 1 1
      src/views/course/courseWatchLog/qw/watchLog.vue
  14. 2 1
      src/views/course/courseWatchLog/watchLog.vue
  15. 1 0
      src/views/course/userCourse/index.vue
  16. 16 11
      src/views/crm/customer/full.vue
  17. 5 0
      src/views/crm/customer/index.vue
  18. 2 0
      src/views/crm/customer/line.vue
  19. 21 15
      src/views/crm/customer/my.vue
  20. 9 7
      src/views/crm/customerVisit/index.vue
  21. 3 0
      src/views/hisStore/storeOrder/allList.vue
  22. 3 0
      src/views/hisStore/storeOrder/list.vue
  23. 3 0
      src/views/hisStore/storeOrder/myList.vue
  24. 115 8
      src/views/index.vue
  25. 1 0
      src/views/qw/autoTags/dayPartingIndex.vue
  26. 1 0
      src/views/qw/autoTags/groupIndex.vue
  27. 1 0
      src/views/qw/contactWay/index.vue
  28. 2 0
      src/views/qw/externalContact/deptIndex.vue
  29. 7 1
      src/views/qw/externalContact/index.vue
  30. 8 2
      src/views/qw/externalContact/myExternalContact.vue
  31. 12 0
      src/views/qw/externalContact/selectUser.vue
  32. 1 0
      src/views/qw/externalContactTransfer/companyTransfer.vue
  33. 1 0
      src/views/qw/externalContactTransfer/deptTransferIndex.vue
  34. 1 0
      src/views/qw/externalContactUnassigned/companyUnassigned.vue
  35. 1 0
      src/views/qw/externalContactUnassigned/deptUnassignedIndex.vue
  36. 1 0
      src/views/qw/externalContactUnassigned/index.vue
  37. 2 2
      src/views/qw/friendWelcome/indexNew.vue
  38. 4 4
      src/views/qw/friendWelcome/myIndexNew.vue
  39. 81 17
      src/views/qw/friendWelcome/myWelcome.vue
  40. 1 0
      src/views/qw/groupMsg/index.vue
  41. 8 5
      src/views/qw/qwUserVoiceLog/index.vue
  42. 8 2
      src/views/qw/qwUserVoiceLogTotal/index.vue
  43. 1 0
      src/views/qw/sopLogs/sopLogsList.vue
  44. 1 1
      src/views/qw/sopTemp/index.vue
  45. 55 12
      src/views/qw/sopUserLogs/sopUserLogsSchedule.vue
  46. 1 1
      src/views/qw/user/cuDeptIdIndex.vue
  47. 4 5
      src/views/qw/user/index.vue
  48. 9 1
      src/views/qw/user/qwUserSelectOne.vue

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

@@ -51,3 +51,11 @@ export function exportCourseFinishTemp(query) {
     params: query
   })
 }
+
+export function updateStatusBatch(data) {
+  return request({
+    url: '/course/courseFinishTemp/updateStatusBatch',
+    method: 'post',
+    data: data
+  })
+}

+ 7 - 0
src/api/qw/sopUserLogs.js

@@ -69,6 +69,13 @@ export function updateLogDate(data) {
     data: data
   })
 }
+export function replaceUser(data) {
+  return request({
+    url: '/qwSop/sopUserLogs/replaceUser',
+    method: 'post',
+    data: data
+  })
+}
 // 修改sopUserLogs
 export function addGroupChat(data) {
   return request({

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

@@ -165,6 +165,16 @@ export function exportUser(query) {
     params: query
   })
 }
+
+// 导出企微员工
+export function exportStaff(query) {
+  return request({
+    url: '/qw/user/exportStaff',
+    method: 'get',
+    params: query
+  })
+}
+
 /**
  * 登录企业微信(发起登录)
  */

+ 15 - 0
src/api/statistics/statistics.js

@@ -309,3 +309,18 @@ export function thisMonthRecvCount(){
     params: {}
   })
 }
+
+
+/**
+ * 课程观看统计 按公司
+ * @param param
+ * @returns {AxiosPromise}
+ */
+export function getWatchCourseStatisticsData(param){
+  const safeParam = JSON.parse(JSON.stringify(param));
+  return request({
+    url: '/index/statistics/getWatchCourseStatisticsData',
+    method: 'post',
+    data: safeParam
+  })
+}

+ 10 - 6
src/views/company/components/userSelect.vue

@@ -51,7 +51,7 @@
           </el-table-column>
         </el-table>
         <pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize" @pagination="getList" />
-        
+
         <div class="btns">
           <el-button type="primary" @click="submit"  >确 定</el-button>
         </div>
@@ -75,7 +75,7 @@ import {
 import { treeselect } from "@/api/company/companyDept";
 export default {
   name: "User",
-  
+
   data() {
     return {
       selectUser:[],
@@ -180,8 +180,8 @@ export default {
       this.queryParams.deptId = data.id;
       this.getList();
     },
-     
-     
+
+
     /** 搜索按钮操作 */
     handleQuery() {
       this.queryParams.page = 1;
@@ -199,6 +199,10 @@ export default {
       this.ids = selection.map((item) => item.userId);
     },
     addUser(){
+      if(this.selectUser.length < 1) {
+        this.$message.warning("请选择员工")
+        return
+      }
       var that=this;
       this.selectUser.forEach(element => {
         var flag= that.users.some(item => item.userId === element.userId)
@@ -215,11 +219,11 @@ export default {
 };
 </script>
 <style >
- 
+
 .btns{
   padding-top: 15px;
   display: flex;
   align-content: center;
   justify-content: flex-end;
 }
-</style>
+</style>

+ 1 - 0
src/views/components/course/userCourseCatalogDetails.vue

@@ -385,6 +385,7 @@ import request from '@/utils/request'
       /** 重置按钮操作 */
       resetQuery() {
         this.resetForm("queryForm");
+        this.queryParams.title = null;
         this.handleQuery();
       },
       // 多选框选中数据

+ 71 - 13
src/views/course/courseFinishTemp/index.vue

@@ -56,18 +56,18 @@
         >新增
         </el-button>
       </el-col>
-<!--      <el-col :span="1.5">-->
-<!--        <el-button-->
-<!--          type="success"-->
-<!--          plain-->
-<!--          icon="el-icon-edit"-->
-<!--          size="mini"-->
-<!--          :disabled="multiple"-->
-<!--          @click="handleUpdate"-->
-<!--          v-hasPermi="['courseFinishTemp:course:edit']"-->
-<!--        >修改状态-->
-<!--        </el-button>-->
-<!--      </el-col>-->
+     <el-col :span="1.5">
+       <el-button
+         type="success"
+         plain
+         icon="el-icon-edit"
+         size="mini"
+         :disabled="multiple"
+         @click="handleUpdateStatusBatch"
+         v-hasPermi="['courseFinishTemp:course:edit']"
+       >批量修改状态
+       </el-button>
+     </el-col>
       <el-col :span="1.5">
         <el-button
           type="danger"
@@ -578,6 +578,25 @@
         <el-button @click="cancel">取 消</el-button>
       </div>
     </el-dialog>
+
+    <el-dialog title="批量修改状态" :visible.sync="batchOpen" width="400px" append-to-body>
+      <el-form ref="form" :model="statusForm">
+         <el-form-item label="状态">
+          <el-radio-group v-model="statusForm.status">
+            <el-radio
+              v-for="dict in statusOptions"
+              :key="dict.dictValue"
+              :label="parseInt(dict.dictValue)"
+            >{{ dict.dictLabel }}
+            </el-radio>
+          </el-radio-group>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer" v-if="formType==1">
+        <el-button type="primary" @click="submitFormBatchStatus" :loading="submitFormBatchStatusLoading">确 定</el-button>
+        <el-button @click="batchOpen = false">取 消</el-button>
+      </div>
+    </el-dialog>
     <el-dialog :title="videoNumOptions.title" :visible.sync="videoNumOptions.open" width="1500px" append-to-body>
       <userVideo ref="QwUserVideo" @videoResult="qwUserVideoResult"></userVideo>
     </el-dialog>
@@ -591,7 +610,8 @@ import {
   exportCourseFinishTemp,
   getCourseFinishTemp,
   listCourseFinishTemp,
-  updateCourseFinishTemp
+  updateCourseFinishTemp,
+  updateStatusBatch
 } from '@/api/course/courseFinishTemp'
 import { getUserList } from '@/api/company/companyUser'
 import { courseList, videoList } from '@/api/qw/sop'
@@ -649,6 +669,8 @@ export default {
       title: "",
       // 是否显示弹出层
       open: false,
+      batchOpen:false,
+      submitFormBatchStatusLoading:false,
       // 查询参数
       queryParams: {
         pageNum: 1,
@@ -675,6 +697,9 @@ export default {
         videoIdSet: null,
         courseIdSet: null,
       },
+      statusForm:{
+        status:null
+      },
       // 表单校验
       rules: {}
     };
@@ -980,6 +1005,15 @@ export default {
 
       });
     },
+    // 批量修改状态
+    handleUpdateStatusBatch(){
+      console.log(this.ids);
+      if(this.ids == null || this.ids == undefined || this.ids.length == 0 ){
+        return this.$message.error("请选择数据")
+      }
+      this.statusForm.status = null;
+      this.batchOpen = true;
+    },
     /** 修改按钮操作 */
     handleUpdate(row) {
       this.reset();
@@ -1015,6 +1049,30 @@ export default {
         this.formType = 1;
       });
     },
+    submitFormBatchStatus(){
+      if(this.statusForm.status==null){
+        return this.$message.error("状态不能为空,请选择状态")
+      }
+      if(this.ids == null || this.ids == undefined || this.ids.length == 0 ){
+        return this.$message.error("请选择数据")
+      }
+      let _this = this;
+      _this.submitFormBatchStatusLoading = true;
+      let param ={
+        ids:_this.ids,
+        status:_this.statusForm.status
+      }
+      updateStatusBatch(param).then(res=>{
+        _this.submitFormBatchStatusLoading = false;
+        _this.msgSuccess("修改成功");
+        _this.batchOpen = false;
+        _this.getList();
+      }).catch(res=>{
+        console.log(res);
+        _this.submitFormBatchStatusLoading = false;
+      })
+
+    },
     /** 提交按钮 */
     submitForm() {
       this.$refs["form"].validate(valid => {

+ 3 - 3
src/views/course/courseRedPacketLog/index.vue

@@ -136,7 +136,7 @@
       <el-table-column label="所属销售" align="center" prop="companyUserName" />
       <el-table-column label="所属公司" align="center" prop="companyName" />
       <el-table-column label="企微员工名称" align="center" prop="qwUserName" />
-      <el-table-column label="转金额" align="center" prop="amount" />
+      <el-table-column label="转金额" align="center" prop="amount" />
       <el-table-column label="状态" align="center" prop="status" >
         <template slot-scope="scope">
           <el-tag>{{ scope.row.status === 0 ? "发送中" : scope.row.status === 1 ? "已完成" : "待补发" }}</el-tag>
@@ -181,8 +181,8 @@
         <el-form-item label="公司id" prop="companyId">
           <el-input v-model="form.companyId" placeholder="请输入公司id" />
         </el-form-item>
-        <el-form-item label="转金额" prop="amount">
-          <el-input v-model="form.amount" placeholder="请输入转金额" />
+        <el-form-item label="转金额" prop="amount">
+          <el-input v-model="form.amount" placeholder="请输入转金额" />
         </el-form-item>
         <el-form-item label="企微userid" prop="qwUserId">
           <el-input v-model="form.qwUserId" placeholder="请输入分享企微userid" />

+ 3 - 3
src/views/course/courseRedPacketLog/myCourseRedPacketLog.vue

@@ -126,7 +126,7 @@
       <el-table-column label="会员电话" align="center" prop="phone" />
       <el-table-column label="所属销售" align="center" prop="companyUserName" />
       <el-table-column label="所属公司" align="center" prop="companyName" />
-      <el-table-column label="转金额" align="center" prop="amount" />
+      <el-table-column label="转金额" align="center" prop="amount" />
       <el-table-column label="状态" align="center" prop="status" >
         <template slot-scope="scope">
           <el-tag>{{ scope.row.status === 0 ? "发送中" : scope.row.status === 1 ? "已完成" : "待补发" }}</el-tag>
@@ -171,8 +171,8 @@
         <el-form-item label="公司id" prop="companyId">
           <el-input v-model="form.companyId" placeholder="请输入公司id" />
         </el-form-item>
-        <el-form-item label="转金额" prop="amount">
-          <el-input v-model="form.amount" placeholder="请输入转金额" />
+        <el-form-item label="转金额" prop="amount">
+          <el-input v-model="form.amount" placeholder="请输入转金额" />
         </el-form-item>
         <el-form-item label="企微userid" prop="qwUserId">
           <el-input v-model="form.qwUserId" placeholder="请输入分享企微userid" />

+ 1 - 1
src/views/course/courseWatchLog/deptWatchLog.vue

@@ -434,7 +434,7 @@
 <!--        <el-table-column label="会员电话" align="center" prop="phone" />-->
 <!--        <el-table-column label="所属销售" align="center" prop="companyUserName" />-->
 <!--        <el-table-column label="所属公司" align="center" prop="companyName" />-->
-        <el-table-column label="转金额" align="center" prop="amount" />
+        <el-table-column label="转金额" align="center" prop="amount" />
         <el-table-column label="状态" align="center" prop="status" >
           <template slot-scope="scope">
             <el-tag>

+ 3 - 1
src/views/course/courseWatchLog/index.vue

@@ -472,7 +472,7 @@
 <!--        <el-table-column label="会员电话" align="center" prop="phone" />-->
 <!--        <el-table-column label="所属销售" align="center" prop="companyUserName" />-->
 <!--        <el-table-column label="所属公司" align="center" prop="companyName" />-->
-        <el-table-column label="转金额" align="center" prop="amount" />
+        <el-table-column label="转金额" align="center" prop="amount" />
         <el-table-column label="状态" align="center" prop="status" >
           <template slot-scope="scope">
             <el-tag>
@@ -1401,6 +1401,7 @@ export default {
 
       searchTags(this.queryTagParams).then(response => {
         this.tagGroupList = response.rows;
+        this.tagTotal = response.total;
       });
 
       // searchTags({name:name,corpId:this.queryParams.corpId}).then(response => {
@@ -1417,6 +1418,7 @@ export default {
     },
 
     resetSearchQueryTag(){
+      this.tagChange.tagName=null;
 
       this.queryTagParams= {
         pageNum: 1,

+ 1 - 0
src/views/course/courseWatchLog/myCourseWatchLog.vue

@@ -632,6 +632,7 @@ export default {
 
       searchTags(this.queryTagParams).then(response => {
         this.tagGroupList = response.rows;
+        this.tagTotal = response.total;
       });
 
       // searchTags({name:name,corpId:this.queryParams.corpId}).then(response => {

+ 1 - 1
src/views/course/courseWatchLog/qw/watchLog.vue

@@ -247,7 +247,7 @@
         <el-table-column label="会员电话" align="center" prop="phone" />
         <el-table-column label="所属销售" align="center" prop="companyUserName" />
         <el-table-column label="所属公司" align="center" prop="companyName" />
-        <el-table-column label="转金额" align="center" prop="amount" />
+        <el-table-column label="转金额" align="center" prop="amount" />
         <el-table-column label="状态" align="center" prop="status" >
           <template slot-scope="scope">
             <el-tag>{{ scope.row.status === 0 ? "发送中" : "已完成" }}</el-tag>

+ 2 - 1
src/views/course/courseWatchLog/watchLog.vue

@@ -472,7 +472,7 @@
 <!--        <el-table-column label="会员电话" align="center" prop="phone" />-->
 <!--        <el-table-column label="所属销售" align="center" prop="companyUserName" />-->
 <!--        <el-table-column label="所属公司" align="center" prop="companyName" />-->
-        <el-table-column label="转金额" align="center" prop="amount" />
+        <el-table-column label="转金额" align="center" prop="amount" />
         <el-table-column label="状态" align="center" prop="status" >
           <template slot-scope="scope">
             <el-tag>
@@ -1268,6 +1268,7 @@ export default {
 
       searchTags(this.queryTagParams).then(response => {
         this.tagGroupList = response.rows;
+        this.tagTotal = response.total;
       });
 
       // searchTags({name:name,corpId:this.queryParams.corpId}).then(response => {

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

@@ -407,6 +407,7 @@ export default {
     /** 重置按钮操作 */
     resetQuery() {
       this.resetForm("queryForm");
+      this.queryParams.companyIdsList=null;
       this.queryParams.isShow=this.activeName
       this.handleQuery();
     },

+ 16 - 11
src/views/crm/customer/full.vue

@@ -54,7 +54,7 @@
                   />
             </el-select>
           </el-form-item>
-          
+
           <el-form-item label="客户类型" prop="customerType">
             <el-select multiple filterable v-model="ctsTypeArr" placeholder="请选择客户类型" clearable size="small">
               <el-option
@@ -65,7 +65,7 @@
                   />
             </el-select>
           </el-form-item>
-          
+
           <el-form-item label="客户标签" prop="tags">
             <el-select multiple  filterable v-model="tagIds" placeholder="请选择客户标签" clearable size="small">
               <el-option
@@ -76,7 +76,7 @@
                   />
             </el-select>
           </el-form-item>
-          
+
           <!-- <el-form-item label="是否认领" prop="isReceive">
             <el-select v-model="queryParams.isReceive" placeholder="请选择是否认领" clearable size="small">
               <el-option
@@ -87,7 +87,7 @@
                   />
             </el-select>
           </el-form-item> -->
-          
+
           <el-form-item label="创建时间" prop="createTime">
             <el-date-picker
               style="width:205.4px"
@@ -215,7 +215,7 @@
             </template>
           </el-table-column>
         </el-table>
-        
+
         <pagination
           v-show="total>0"
           :total="total"
@@ -224,8 +224,8 @@
           @pagination="getList"
         />
 
-    
- 
+
+
     <el-drawer
       size="75%"
       :title="show.title" :visible.sync="show.open"
@@ -238,13 +238,13 @@
     <el-dialog :title="assign.title" :visible.sync="assign.open" width="800px" append-to-body>
         <assign-user  ref="assignUser" @close="closeAssign"   />
     </el-dialog>
-   
- 
+
+
   </div>
 </template>
 
 <script>
- 
+
 import { assignToUser,receive,getFullCustomerList,addCustomer,updateCustomer,getCustomerDetails,exportCustomer  } from "@/api/crm/customer";
 import customerDetails from '../components/customerDetails.vue';
 import {getCitys} from "@/api/store/city";
@@ -434,7 +434,7 @@ export default {
           else if(that.queryParams.isReceive=="1"){
             that.$refs.assignUser.init(ids,3);
           }
-          
+
       }, 200);
     },
     closeAssign(){
@@ -582,6 +582,11 @@ export default {
     /** 重置按钮操作 */
     resetQuery() {
       this.resetForm("queryForm");
+      this.visitStatusArr =  [];
+      this.tagIds =  [];
+      this.dateRange = [];
+      this.sourceArr  =  [];
+      this.ctsTypeArr =  [];
       this.handleQuery();
     },
     // 多选框选中数据

+ 5 - 0
src/views/crm/customer/index.vue

@@ -752,6 +752,11 @@ export default {
     /** 重置按钮操作 */
     resetQuery() {
       this.resetForm("queryForm");
+      this.sourceArr =  [];
+      this.visitStatusArr =  [];
+      this.tagIds =  [];
+      this.ctsTypeArr =  [];
+      this.dateRange = [];
       this.handleQuery();
     },
     // 多选框选中数据

+ 2 - 0
src/views/crm/customer/line.vue

@@ -583,6 +583,8 @@ export default {
     /** 重置按钮操作 */
     resetQuery() {
       this.resetForm("queryForm");
+      this.tagIds = [];
+      this.dateRange = null;
       this.handleQuery();
     },
     // 多选框选中数据

+ 21 - 15
src/views/crm/customer/my.vue

@@ -154,7 +154,7 @@
       </el-col>
 	  <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
-    
+
     <el-table  height="500" border v-loading="loading" :data="customerList" @selection-change="handleSelectionChange">
       <el-table-column type="selection" width="55" align="center" />
       <el-table-column label="客户编码" align="center" prop="customerCode" />
@@ -220,7 +220,7 @@
             v-hasPermi="['crm:customer:recover']"
           >回收公海</el-button>
           <!-- <el-button
-         
+
             size="mini"
             type="text"
             @click="handleAssign(scope.row)"
@@ -242,13 +242,13 @@
     <el-dialog :title="addSms.title" :visible.sync="addSms.open" width="1000px" append-to-body>
        <add-batch-sms ref="sms" @close="closeSms()"></add-batch-sms>
     </el-dialog>
- 
- 
+
+
     <el-dialog :title="source.title" :visible.sync="source.open" width="1000px" append-to-body>
        <edit-source ref="editSource" @close="closeSource()"></edit-source>
     </el-dialog>
- 
-    <el-dialog :title="visit.title" :visible.sync="visit.open" width="600px" append-to-body> 
+
+    <el-dialog :title="visit.title" :visible.sync="visit.open" width="600px" append-to-body>
       <add-visit @closeVisit="closeVisit"   ref="addVisit" />
     </el-dialog>
     <el-dialog :title="customer.title" :visible.sync="customer.open" width="1000px" append-to-body>
@@ -462,7 +462,7 @@ export default {
         setTimeout(() => {
             that.$refs.visitStatus.reset(row);
         }, 500);
-        
+
     },
     closeCustomerType(){
         this.addCustomerType.open=false;
@@ -474,7 +474,7 @@ export default {
         setTimeout(() => {
             that.$refs.customerType.reset(row);
         }, 500);
-        
+
     },
     closeRemark(){
         this.addRemark.open=false;
@@ -486,7 +486,7 @@ export default {
         setTimeout(() => {
             that.$refs.remark.reset(row);
         }, 500);
-        
+
     },
     closeTag(){
         this.addTag.open=false;
@@ -498,7 +498,7 @@ export default {
         setTimeout(() => {
             that.$refs.tag.reset(row);
         }, 500);
-        
+
     },
     handleShow(row){
       this.show.open=true;
@@ -549,7 +549,7 @@ export default {
       setTimeout(() => {
         that.$refs.editSource.handleEdit(that.ids);
       }, 200);
-      
+
     },
     closeSource(){
         this.source.open=false;
@@ -593,7 +593,7 @@ export default {
           this.citys=res.data;
         })
     },
-    
+
     /** 查询客户列表 */
     getList() {
       this.loading = true;
@@ -649,6 +649,12 @@ export default {
     /** 重置按钮操作 */
     resetQuery() {
       this.resetForm("queryForm");
+      this.statusArr=[];
+      this.ctsTypeArr=[];
+      this.tagIds=[];
+      this.sourceArr=[];
+      this.createTimeRange=null;
+      this.dateRange = null;
       this.handleQuery();
     },
     // 多选框选中数据
@@ -657,9 +663,9 @@ export default {
       this.single = selection.length!==1
       this.multiple = !selection.length
     },
-    
-    
-     
+
+
+
     /** 删除按钮操作 */
     handleDelete(row) {
       const customerIds = row.customerId || this.ids;

+ 9 - 7
src/views/crm/customerVisit/index.vue

@@ -1,6 +1,6 @@
 <template>
     <div class="app-container">
- 
+
         <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
           <el-form-item label="客户编码" prop="customerCode">
             <el-input
@@ -133,13 +133,13 @@
             <template slot-scope="scope">
               <el-image  v-for="(img) in parsePhoto(scope.row.photos)"
                 style="width: 30px; height: 30px;margin-right:5px"
-                :src="img" 
+                :src="img"
                 :preview-src-list="parsePhoto(scope.row.photos)">
               </el-image>
             </template>
           </el-table-column>
           <el-table-column label="跟进时间" align="center" prop="createTime" />
-          
+
           <el-table-column label="下次联系时间" align="center" prop="nextTime" width="180">
             <template slot-scope="scope">
               <span>{{ parseTime(scope.row.nextTime, '{y}-{m}-{d}') }}</span>
@@ -164,7 +164,7 @@
             </template>
           </el-table-column>
         </el-table>
-        
+
         <pagination
           v-show="total>0"
           :total="total"
@@ -172,7 +172,7 @@
           :limit.sync="queryParams.pageSize"
           @pagination="getList"
         />
-  
+
       <el-drawer
        size="75%"
         :title="show.title" :visible.sync="show.open"
@@ -181,7 +181,7 @@
       </el-drawer>
     </div>
   </template>
-  
+
   <script>
   import { listCustomerVisit, getCustomerVisit, delCustomerVisit, addCustomerVisit, updateCustomerVisit, exportCustomerVisit } from "@/api/crm/customerVisit";
   import customerDetails from '../components/customerDetails.vue';
@@ -358,6 +358,9 @@
       /** 重置按钮操作 */
       resetQuery() {
         this.resetForm("queryForm");
+        this.dateRange = [];
+        this.createTimeRange=[];
+        this.receiveTimeRange=[];
         this.handleQuery();
       },
       // 多选框选中数据
@@ -436,4 +439,3 @@
     }
   };
   </script>
-  

+ 3 - 0
src/views/hisStore/storeOrder/allList.vue

@@ -679,6 +679,9 @@ export default {
     /** 重置按钮操作 */
     resetQuery() {
       this.resetForm("queryForm");
+      this.createTimeRange = null;
+      this.payTimeRange = null;
+      this.deliveryImportTimeRange = null;
       this.handleQuery();
     },
     // 多选框选中数据

+ 3 - 0
src/views/hisStore/storeOrder/list.vue

@@ -837,6 +837,9 @@ export default {
     /** 重置按钮操作 */
     resetQuery() {
       this.resetForm("queryForm");
+      this.createTimeRange = null;
+      this.payTimeRange = null;
+      this.deliveryImportTimeRange = null;
       this.handleQuery();
     },
     // 多选框选中数据

+ 3 - 0
src/views/hisStore/storeOrder/myList.vue

@@ -573,6 +573,9 @@ export default {
     /** 重置按钮操作 */
     resetQuery() {
       this.resetForm("queryForm");
+      this.createTimeRange = null;
+      this.payTimeRange = null;
+      this.deliveryImportTimeRange = null;
       this.handleQuery();
     },
     // 多选框选中数据

+ 115 - 8
src/views/index.vue

@@ -364,21 +364,40 @@
           </el-card>
         </el-col>
 
+
         <el-col :span="12">
           <el-card shadow="never">
             <div slot="header" class="chart-header">
-              <span>经销商会员观看TOP10</span>
+              <span>经销商看客统计</span>
               <div class="legend">
-                <el-radio-group v-model="viewerType" size="small" @change="handleDealerChartData">
-                  <el-radio-button label="0">按观看人数</el-radio-button>
-                  <el-radio-button label="1">按完播人数</el-radio-button>
-                </el-radio-group>
+                <div class="legend-item">
+                  <span class="dot viewer-dot"></span>
+                  <span>观看人数</span>
+                </div>
+                <div class="legend-item">
+                  <span class="dot complete-dot"></span>
+                  <span>完播人数</span>
+                </div>
               </div>
-              <!--              <el-button size="small" plain class="view-more">经销商统计 <i class="el-icon-arrow-right"></i></el-button>-->
             </div>
-            <div ref="dealerChart" class="chart-container"></div>
+            <div ref="dealerChartNew" class="chart-container"></div>
           </el-card>
         </el-col>
+<!--        <el-col :span="12">-->
+<!--          <el-card shadow="never">-->
+<!--            <div slot="header" class="chart-header">-->
+<!--              <span>经销商会员观看TOP10</span>-->
+<!--              <div class="legend">-->
+<!--                <el-radio-group v-model="viewerType" size="small" @change="handleDealerChartData">-->
+<!--                  <el-radio-button label="0">按观看人数</el-radio-button>-->
+<!--                  <el-radio-button label="1">按完播人数</el-radio-button>-->
+<!--                </el-radio-group>-->
+<!--              </div>-->
+<!--              &lt;!&ndash;              <el-button size="small" plain class="view-more">经销商统计 <i class="el-icon-arrow-right"></i></el-button>&ndash;&gt;-->
+<!--            </div>-->
+<!--            <div ref="dealerChart" class="chart-container"></div>-->
+<!--          </el-card>-->
+<!--        </el-col>-->
       </el-row>
     </transition>
     <transition name="fade">
@@ -509,7 +528,7 @@ import {
   authorizationInfo,
   dealerAggregated, deaMemberTopTen, rechargeComsumption, rewardMoneyTopTen, rewardMoneyTrend,
   smsBalance, thisMonthOrderCount, thisMonthRecvCount, trafficLog,
-  watchCourseTopTen, watchEndPlayTrend
+  watchCourseTopTen, watchEndPlayTrend,getWatchCourseStatisticsData
 } from "@/api/statistics/statistics";
 import dayjs from 'dayjs';
 
@@ -554,6 +573,56 @@ const viewCharOption = {
   ]
 }
 
+const dealerOptionNew = {
+  tooltip: {
+    trigger: 'axis',
+    axisPointer: {
+      type: 'shadow'
+    }
+  },
+  grid: {
+    left: '3%',
+    right: '4%',
+    bottom: '3%',
+    containLabel: true
+  },
+  xAxis: {
+    type: 'category',
+    axisLabel: {
+      rotate: 30, // 设置标签倾斜45度
+      // fontSize: 12, // 减小字体大小
+      interval: 0, // 显示所有标签
+      // 可选:限制标签宽度并截断
+      width: 80,
+      overflow: 'truncate',
+      // 可选:设置标签的对齐方式
+      margin: 20,
+      fontWeight: 'bold' // 设置字体加粗
+    }
+  },
+  yAxis: {
+    type: 'value'
+  },
+  series: [
+    {
+      name: '观看人数',
+      type: 'bar',
+      data: [],
+      itemStyle: {
+        color: '#409EFF'
+      }
+    },
+    {
+      name: '完播人数',
+      type: 'bar',
+      data: [],
+      itemStyle: {
+        color: '#67C23A'
+      }
+    }
+  ]
+}
+
 const thisMonthOrderCountOption = {
   tooltip: {
     trigger: 'axis',
@@ -858,6 +927,7 @@ export default {
       smsRemainCount: 0,
       viewerType: '0',
       viewerChart: null,
+      dealerChartNew: null,
       userTypeText: process.env.VUE_APP_COURSE_DEFAULT==1?"会员":"企微",
       userType: process.env.VUE_APP_COURSE_DEFAULT,
       dealerChart: null,
@@ -925,6 +995,7 @@ export default {
   mounted() {
     this.$nextTick(() => {
       this.initViewerChart()
+      this.initDealerChartNew();
       this.initDealerChart()
       this.initCourseWatchChart();
       this.initAnswerRedPackViewerChart();
@@ -936,6 +1007,8 @@ export default {
       window.addEventListener('resize', () => {
         this.viewerChart && this.viewerChart.resize()
         this.dealerChart && this.dealerChart.resize()
+        this.dealerChartNew && this.dealerChartNew.resize()
+
       })
     })
   },
@@ -1130,6 +1203,7 @@ export default {
 
       this.handleCourseWatchChart()
       this.handleViewChartData()
+      this.handleDealerChartDataNew()
 
       // 经销商会员观看TOP10
       this.handleDealerChartData()
@@ -1192,6 +1266,7 @@ export default {
       if (this.selectedDiv === 0) {
         this.handleViewChartData()
         this.handleDealerChartData()
+        this.handleDealerChartDataNew()
       } else if (this.selectedDiv === 1) {
         this.handleCourseWatchChart()
       } else if (this.selectedDiv === 2) {
@@ -1267,6 +1342,7 @@ export default {
       if (this.selectedDiv === 0) {
         this.handleViewChartData()
         this.handleDealerChartData()
+        this.handleDealerChartDataNew()
       } else if (this.selectedDiv === 1) {
         this.handleCourseWatchChart()
       } else if (this.selectedDiv === 2) {
@@ -1344,6 +1420,35 @@ export default {
       })
 
     },
+    handleDealerChartDataNew() {
+      let param = this.getParam();
+
+      getWatchCourseStatisticsData({ ...param }).then(res => {
+        if (res.code === 200) {
+          console.log(res.data);
+          // 根据实际数据结构调整
+          let data = res.data;
+          let watchUserCountList = data.map(e => e.watchCount);     // 观看次数
+          let completedUserCountList = data.map(e => e.finishCount); // 完播次数
+          let xAxis = data.map(e => e.companyName);                 // X轴使用公司名称
+
+          // 更新图表配置
+          dealerOptionNew.series[0].data = watchUserCountList;
+          dealerOptionNew.series[1].data = completedUserCountList;
+          dealerOptionNew.xAxis.data = xAxis;
+
+          this.dealerChartNew.setOption(dealerOptionNew);
+
+        }
+      })
+
+    },
+    initDealerChartNew() {
+      console.log("初始化 initDealerChartNew");
+      this.dealerChartNew = echarts.init(this.$refs.dealerChartNew)
+      this.dealerChartNew.setOption(dealerOptionNew)
+      console.log("初始化结束 initDealerChartNew");
+    },
     handleThisMonthOrderCount(){
       thisMonthOrderCount().then(res=>{
         if(res.code === 200){
@@ -1434,6 +1539,8 @@ export default {
     // window.removeEventListener('resize', this.resizeHandler)
     this.viewerChart && this.viewerChart.dispose()
     this.dealerChart && this.dealerChart.dispose()
+    this.dealerChartNew && this.dealerChartNew.dispose()
+
   }
 }
 </script>

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

@@ -667,6 +667,7 @@ export default {
       this.queryTagParams.corpId=this.queryParams.corpId;
       searchTags(this.queryTagParams).then(response => {
         this.tagGroupList = response.rows;
+        this.tagTotal = response.total;
       });
 
     },

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

@@ -518,6 +518,7 @@ export default {
       this.queryTagParams.corpId=this.queryParams.corpId;
       searchTags(this.queryTagParams).then(response => {
         this.tagGroupList = response.rows;
+        this.tagTotal = response.total;
       });
 
     },

+ 1 - 0
src/views/qw/contactWay/index.vue

@@ -933,6 +933,7 @@ export default {
 
       searchTags(this.queryTagParams).then(response => {
         this.tagGroupList = response.rows;
+        this.tagTotal = response.total;
       });
       // searchTags({name:name,corpId:this.queryParams.corpId}).then(response => {
       //   this.tagGroupList = response.rows;

+ 2 - 0
src/views/qw/externalContact/deptIndex.vue

@@ -1602,6 +1602,7 @@ export default {
 
       searchTags(this.queryTagParams).then(response => {
         this.tagGroupList = response.rows;
+        this.tagTotal = response.total;
       });
 
       // searchTags({name:name,corpId:this.queryParams.corpId}).then(response => {
@@ -1700,6 +1701,7 @@ export default {
     resetQuery() {
       this.resetForm("queryForm");
       this.queryParams.corpId= this.myQwCompanyList[0].dictValue;
+      this.queryParams.transferStatus = null;
       this.selectTags=[];
       this.createTime=null;
       this.queryParams.sTime=null;

+ 7 - 1
src/views/qw/externalContact/index.vue

@@ -524,7 +524,7 @@
              size="mini"
              type="text"
              @click="handleInfoCollection(scope.row)"
-             v-if="scope.row.fsUserId"
+             v-if="false"
              >
              <span>信息采集</span>
           </el-button>
@@ -805,6 +805,7 @@
               />
             </el-select>
           </el-form-item>
+
           <el-form-item label="课程" prop="courseId">
             <el-select filterable v-model="log.queryParams.courseId" placeholder="请选择课程" clearable size="small"
                        @change="courseChange(log.queryParams.courseId)">
@@ -831,6 +832,9 @@
           </el-form-item>
         </el-form>
         <el-table v-loading="log.loading" :data="log.list">
+          <el-table-column label="编号" align="center" prop="id"/>
+          <el-table-column label="所属企微主体" align="center" prop="corpName"/>
+          <el-table-column label="所属企微" align="center" prop="qwUserName"/>
           <!--          <el-table-column label="企微" align="center" prop="qwUserName"/>-->
           <el-table-column label="项目" align="center" prop="projectName"/>
           <el-table-column label="课程" align="center" prop="courseName"/>
@@ -1750,6 +1754,7 @@ export default {
 
       searchTags(this.queryTagParams).then(response => {
         this.tagGroupList = response.rows;
+        this.tagTotal = response.total;
       });
 
     },
@@ -1807,6 +1812,7 @@ export default {
     /** 重置按钮操作 */
     resetQuery() {
       this.resetForm("queryForm");
+      this.queryParams.transferStatus=null;
       this.queryParams.corpId= this.myQwCompanyList[0].dictValue;
       this.selectTags=[];
 	   this.createTime=null;

+ 8 - 2
src/views/qw/externalContact/myExternalContact.vue

@@ -493,10 +493,11 @@
              <span>会员详情</span>
           </el-button>
           <el-button
+
              size="mini"
              type="text"
              @click="handleInfoCollection(scope.row)"
-             v-if="scope.row.fsUserId"
+          v-if="false"
              >
              <span>信息采集</span>
           </el-button>
@@ -898,7 +899,9 @@
           </el-form-item>
         </el-form>
         <el-table v-loading="log.loading" :data="log.list">
-          <!--          <el-table-column label="企微" align="center" prop="qwUserName"/>-->
+          <el-table-column label="编号" align="center" prop="id"/>
+          <el-table-column label="所属企微主体" align="center" prop="corpName"/>
+          <el-table-column label="所属企微" align="center" prop="qwUserName"/>
           <el-table-column label="项目" align="center" prop="projectName"/>
           <el-table-column label="课程" align="center" prop="courseName"/>
           <el-table-column label="小节" align="aligner" prop="videoName"/>
@@ -1280,6 +1283,7 @@ export default {
       this.log.loading = true;
       courseList().then(response => {
         this.courseLists = response.list;
+        this.log.queryParams.externalUserId = row.id;
         this.logList();
       })
     },
@@ -1548,6 +1552,7 @@ export default {
 
       searchTags(this.queryTagParams).then(response => {
         this.tagGroupList = response.rows;
+        this.tagTotal = response.total;
       });
 
       // searchTags({name:name,corpId:this.queryParams.corpId}).then(response => {
@@ -1887,6 +1892,7 @@ export default {
       this.resetForm("queryForm");
       this.queryParams.qwUserId=this.myQwUserList[0].dictValue;
       this.queryParams.corpId=this.myQwUserList[0].corpId;
+      this.queryParams.transferStatus = null;
       this.selectTags=[];
 	   this.createTime=null;
 	  this.queryParams.sTime=null;

+ 12 - 0
src/views/qw/externalContact/selectUser.vue

@@ -28,6 +28,18 @@
     </el-form>
 
     <el-table  height="500" border v-loading="loading" :data="customerList" ref="customerList" >
+      <el-table-column label="用户ID" align="center" prop="userId" />
+      <el-table-column label="企微客户头像" align="center" prop="avatar" width="100px">
+        <template slot-scope="scope">
+          <el-popover
+            placement="right"
+            title=""
+            trigger="hover">
+            <img slot="reference" :src="scope.row.avatar" width="60px">
+            <img :src="scope.row.avatar" style="max-width: 200px;">
+          </el-popover>
+        </template>
+      </el-table-column>
       <el-table-column label="用户昵称" align="center" prop="nickName" />
       <el-table-column label="手机号码" align="center" prop="phone" />
       <el-table-column label="操作"   align="center" fixed="right" width="120px" class-name="small-padding fixed-width">

+ 1 - 0
src/views/qw/externalContactTransfer/companyTransfer.vue

@@ -349,6 +349,7 @@ export default {
       };
       this.selectTags=[];
       this.resetForm("queryForm");
+      this.queryParams.transferStatus = null;
       this.queryParams.corpId = this.myQwCompanyList?.[0]?.dictValue || null
       this.getList();
     },

+ 1 - 0
src/views/qw/externalContactTransfer/deptTransferIndex.vue

@@ -455,6 +455,7 @@ export default {
     resetQuery() {
       this.selectTags=[];
       this.resetForm("queryForm");
+      this.queryParams.transferStatus = null;
       this.handleQuery();
     },
     // 多选框选中数据

+ 1 - 0
src/views/qw/externalContactUnassigned/companyUnassigned.vue

@@ -332,6 +332,7 @@ export default {
       this.qwUserNameList = null
       this.isQwUserISNull = false
       this.resetForm("queryForm")
+      this.queryParams.transferStatus = null;
       this.queryParams.corpId = this.myQwCompanyList?.[0]?.dictValue || null
       this.getList()
     },

+ 1 - 0
src/views/qw/externalContactUnassigned/deptUnassignedIndex.vue

@@ -405,6 +405,7 @@ export default {
     /** 重置按钮操作 */
     resetQuery() {
       this.resetForm("queryForm");
+      this.queryParams.transferStatus = null;
       this.queryParams.corpId= this.myQwCompanyList[0].dictValue
       this.handleQuery();
     },

+ 1 - 0
src/views/qw/externalContactUnassigned/index.vue

@@ -436,6 +436,7 @@ export default {
        this.isQwUserISNull = false;
       this.resetForm("queryForm");
       this.queryParams.corpId= this.myQwCompanyList[0].dictValue
+      this.queryParams.transferStatus = null;
       this.handleQuery();
     },
     // 多选框选中数据

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

@@ -28,7 +28,7 @@
       </el-form-item>
       <el-form-item label="创建时间" prop="createdTime">
         <el-date-picker clearable size="small"
-          v-model="queryParams.createdTime"
+          v-model="queryParams.createTime"
           type="date"
           value-format="yyyy-MM-dd"
           placeholder="选择创建时间">
@@ -36,7 +36,7 @@
       </el-form-item>
       <el-form-item label="更新时间" prop="updateTieme">
         <el-date-picker clearable size="small"
-          v-model="queryParams.updateTieme"
+          v-model="queryParams.updateTime"
           type="date"
           value-format="yyyy-MM-dd"
           placeholder="选择更新时间">

+ 4 - 4
src/views/qw/friendWelcome/myIndexNew.vue

@@ -27,17 +27,17 @@
                      :value="dict.dictValue"/>
         </el-select>
       </el-form-item>
-      <el-form-item label="创建时间" prop="createdTime">
+      <el-form-item label="创建时间" prop="createTime">
         <el-date-picker clearable size="small"
-                        v-model="queryParams.createdTime"
+                        v-model="queryParams.createTime"
                         type="date"
                         value-format="yyyy-MM-dd"
                         placeholder="选择创建时间">
         </el-date-picker>
       </el-form-item>
-      <el-form-item label="更新时间" prop="updateTieme">
+      <el-form-item label="更新时间" prop="updateTime">
         <el-date-picker clearable size="small"
-                        v-model="queryParams.updateTieme"
+                        v-model="queryParams.updateTime"
                         type="date"
                         value-format="yyyy-MM-dd"
                         placeholder="选择更新时间">

+ 81 - 17
src/views/qw/friendWelcome/myWelcome.vue

@@ -26,22 +26,22 @@
           <el-option v-for="dict in allowSelectOptions" :key="dict.dictValue" :label="dict.dictLabel"  :value="dict.dictValue"/>
         </el-select>
       </el-form-item>
-      <el-form-item label="创建时间" prop="createdTime">
-        <el-date-picker clearable size="small"
-          v-model="queryParams.createdTime"
-          type="date"
-          value-format="yyyy-MM-dd"
-          placeholder="选择创建时间">
-        </el-date-picker>
-      </el-form-item>
-      <el-form-item label="更新时间" prop="updateTieme">
-        <el-date-picker clearable size="small"
-          v-model="queryParams.updateTieme"
-          type="date"
-          value-format="yyyy-MM-dd"
-          placeholder="选择更新时间">
-        </el-date-picker>
-      </el-form-item>
+<!--      <el-form-item label="创建时间" prop="createTime">-->
+<!--        <el-date-picker clearable size="small"-->
+<!--          v-model="queryParams.createTime"-->
+<!--          type="date"-->
+<!--          value-format="yyyy-MM-dd"-->
+<!--          placeholder="选择创建时间">-->
+<!--        </el-date-picker>-->
+<!--      </el-form-item>-->
+<!--      <el-form-item label="更新时间" prop="updateTime">-->
+<!--        <el-date-picker clearable size="small"-->
+<!--          v-model="queryParams.updateTime"-->
+<!--          type="date"-->
+<!--          value-format="yyyy-MM-dd"-->
+<!--          placeholder="选择更新时间">-->
+<!--        </el-date-picker>-->
+<!--      </el-form-item>-->
       <el-form-item label="是否发送欢迎语" prop="isSendMsg">
         <el-select v-model="queryParams.isSendMsg" placeholder="请选择" clearable size="small" >
           <el-option v-for="dict in allowSelectOptions" :key="dict.dictValue" :label="dict.dictLabel"  :value="dict.dictValue"/>
@@ -196,6 +196,7 @@
                   <div slot="header" style="display: flex;justify-content: space-between;align-items: center; ">
                     <div style="flex: 1;">
                     <span v-if="item.msgtype === 'image'">【图片】: {{ item.image.pic_url }}</span>
+                     <span v-if="item.msgtype === 'video'">【视频】: {{ item.video.url }}</span>
                     <span v-if="item.msgtype === 'link'">【链接】: {{ item.link.title }}-{{item.link.desc}}</span>
                     <span v-if="item.msgtype === 'miniprogram'">【小程序】: {{ item.miniprogram.title }}</span>
                     </div>
@@ -225,6 +226,9 @@
                 <el-dropdown-item command="image">
                   <i class="el-icon-picture" style="margin-right: 10px;"></i>图片
                 </el-dropdown-item>
+                <el-dropdown-item command="video">
+                  <i class="el-icon-video-camera" style="margin-right: 10px;"></i>视频
+                </el-dropdown-item>
                 <el-dropdown-item command="link">
                   <i class="el-icon-link" style="margin-right: 10px;"></i>链接
                 </el-dropdown-item>
@@ -349,6 +353,9 @@
                               <el-dropdown-item command="image">
                                 <i class="el-icon-picture" style="margin-right: 10px;"></i>图片
                               </el-dropdown-item>
+                              <el-dropdown-item command="video">
+                                <i class="el-icon-video-camera" style="margin-right: 10px;"></i>视频
+                              </el-dropdown-item>
                               <el-dropdown-item command="link">
                                 <i class="el-icon-link" style="margin-right: 10px;"></i>链接
                               </el-dropdown-item>
@@ -397,6 +404,25 @@
           <el-form-item label="图片:" prop="imagePicUrl">
             <ImageUpload v-model="fileFrom.imagePicUrl"  type="image" :num="10" :width="150" :height="150"  disabled/>
           </el-form-item>
+        </div>
+          <div v-if="welcomeItem.type==='video'">
+          <el-form-item label="视频:" prop="videoUrl">
+
+            <el-upload
+              v-model="fileFrom.videoUrl"
+              class="avatar-uploader"
+              :action="uploadUrl"
+              :show-file-list="false"
+              :on-success="(res, file) => handleAvatarSuccessVideo(res, file, fileFrom)"
+              :before-upload="beforeAvatarUploadVideo">
+              <i class="el-icon-plus avatar-uploader-icon"></i>
+            </el-upload>
+            {{fileFrom.videoUrl}}
+            <video v-if="fileFrom.videoUrl"
+                   :src="fileFrom.videoUrl"
+                   controls style="width: 200px;height: 100px">
+            </video>
+          </el-form-item>
         </div>
         <div v-if="welcomeItem.type==='link'">
 
@@ -524,6 +550,8 @@ export default {
   components: { ImageUpload, qwUserList,ImageUploadWeclome},
   data() {
     return {
+      
+      uploadUrl: process.env.VUE_APP_BASE_API + "/common/uploadOSS2",
       // 遮罩层
       loading: true,
       // 导出遮罩层
@@ -798,6 +826,8 @@ export default {
       switch (command) {
         case 'image':
           return '添加图片';
+        case 'video':
+          return '添加视频';
         case 'link':
           return '添加链接';
         case 'miniprogram':
@@ -899,6 +929,8 @@ export default {
       };
       if (item.msgtype === 'image') {
         this.fileFrom.imagePicUrl = item.image.pic_url;
+      } else if (item.msgtype === 'video') {
+        this.fileFrom.videoUrl = item.video.url;
       } else if (item.msgtype === 'link') {
         this.fileFrom.linkTitle = item.link.title;
         this.fileFrom.linkPicUrl = item.link.picurl;
@@ -977,6 +1009,13 @@ export default {
             pic_url: this.fileFrom.imagePicUrl
           }
         };
+      } else if (type === 'video') {
+        attachment = {
+          msgtype: 'video',
+          video: {
+            url:this.fileFrom.videoUrl,
+          }
+        };
       } else if (type === 'link') {
         attachment = {
           msgtype: 'link',
@@ -1275,7 +1314,32 @@ export default {
           this.download(response.msg);
           this.exportLoading = false;
         }).catch(() => {});
-    }
+    },
+     handleAvatarSuccessVideo(res, file, content) {
+      if (res.code == 200) {
+        // 使用 $set 确保响应式更新
+        this.$set(content, 'videoUrl', res.url);
+      } else {
+        this.msgError(res.msg);
+      }
+
+    },
+    beforeAvatarUploadVideo(file) {
+      const isLt30M = file.size / 1024 / 1024 < 10;
+      const isMP4 = file.type === 'video/mp4';
+
+      if (!isMP4) {
+        this.$message.error('仅支持上传 MP4 格式的视频文件!');
+        return false;
+      }
+
+      if (!isLt30M) {
+        this.$message.error('上传大小不能超过 10MB!');
+        return false;
+      }
+
+      return true;
+    },
   }
 };
 </script>

+ 1 - 0
src/views/qw/groupMsg/index.vue

@@ -918,6 +918,7 @@ export default {
 
       searchTags(this.queryTagParams).then(response => {
         this.tagGroupList = response.rows;
+        this.tagTotal = response.total;
       });
       // searchTags({name:name,corpId:this.queryParams.corpId}).then(response => {
       //   this.tagGroupList = response.rows;

+ 8 - 5
src/views/qw/qwUserVoiceLog/index.vue

@@ -77,7 +77,7 @@
 
       <el-form-item label="标签" prop="tagIds">
         <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;">
+          <div style="min-height: 35px; max-height: 200px; overflow-y: auto;" :key="selectTags.length">
             <el-tag type="success"
                     closable
                     :disable-transitions="false"
@@ -415,7 +415,6 @@ export default {
       this.$forceUpdate();
     },
     handleSearchTags(name){
-
       if (!name){
         return this.$message.error("请输入要搜索的标签")
       }
@@ -424,6 +423,7 @@ export default {
 
       searchTags(this.queryTagParams).then(response => {
         this.tagGroupList = response.rows;
+        this.tagTotal = response.total;
       });
 
       // searchTags({name:name,corpId:this.queryParams.corpId}).then(response => {
@@ -560,20 +560,23 @@ export default {
       }else {
         this.queryParams.tagIds=null;
       }
-
-
       this.queryParams.pageNum = 1;
       this.getList();
     },
     /** 重置按钮操作 */
     resetQuery() {
       this.resetForm("queryForm");
-      this.queryParams.corpId= this.myQwCompanyList[0].dictValue;
+      if (this.myQwCompanyList && this.myQwCompanyList.length > 0) {
+        this.queryParams.corpId = this.myQwCompanyList[0].dictValue;
+      } else {
+        this.queryParams.corpId = null; // 或设置默认值
+      }
       this.selectTags=[];
       this.createTime=null;
       this.queryParams.sTime=null;
       this.queryParams.eTime=null;
       this.queryParams.tagIds=null;
+      this.$forceUpdate();
       this.handleQuery();
     },
     // 多选框选中数据

+ 8 - 2
src/views/qw/qwUserVoiceLogTotal/index.vue

@@ -83,7 +83,7 @@
             </el-form-item>-->
       <el-form-item label="标签" prop="tagIds">
         <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;">
+          <div style="min-height: 35px; max-height: 200px; overflow-y: auto;" :key="selectTags.length">
             <el-tag type="success"
                     closable
                     :disable-transitions="false"
@@ -431,6 +431,7 @@ export default {
 
       searchTags(this.queryTagParams).then(response => {
         this.tagGroupList = response.rows;
+        this.tagTotal = response.total;
       });
 
       // searchTags({name:name,corpId:this.queryParams.corpId}).then(response => {
@@ -635,12 +636,17 @@ export default {
       this.queryParams.beginTime = null;
       this.queryParams.endTime = null;
       this.queryParams.deptId = null;
-      this.queryParams.corpId= this.myQwCompanyList[0].dictValue;
+      if (this.myQwCompanyList && this.myQwCompanyList.length > 0) {
+        this.queryParams.corpId= this.myQwCompanyList[0].dictValue;
+      } else {
+        this.queryParams.corpId = null; // 或设置默认值
+      }
       this.selectTags=[];
       this.createTime=null;
       this.queryParams.sTime=null;
       this.queryParams.eTime=null;
       this.queryParams.tagIds=null;
+      this.$forceUpdate();
       this.handleQuery();
     },
     // 多选框选中数据

+ 1 - 0
src/views/qw/sopLogs/sopLogsList.vue

@@ -569,6 +569,7 @@ export default {
       this.resetForm("queryForm");
       this.queryParams.scheduleStartTime=null;
       this.queryParams.scheduleEndTime=null;
+      this.scheduleTime = null;
       this.handleQuery();
     },
     // 多选框选中数据

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

@@ -111,7 +111,7 @@
     <el-table v-loading="loading" border :data="sopTempList" @selection-change="handleSelectionChange">
       <el-table-column type="selection" width="55" align="center"/>
       <el-table-column label="模板编号" align="center" prop="id"/>
-      <el-table-column label="模板编号" align="center">
+      <el-table-column label="公司名称" align="center">
         <template slot-scope="scope">
           <el-tag v-for="item in companys" v-if="scope.row.companyId == item.companyId">{{item.companyName}}</el-tag>
         </template>

+ 55 - 12
src/views/qw/sopUserLogs/sopUserLogsSchedule.vue

@@ -35,16 +35,16 @@
                         placeholder="选择营期时间">
         </el-date-picker>
       </el-form-item>
-      <el-form-item label="状态" prop="status">
-        <el-select v-model="queryParams.status" placeholder="请选择状态" clearable size="small">
-          <el-option
-            v-for="dict in sopUserLogsDelStatus"
-            :key="dict.dictValue"
-            :label="dict.dictLabel"
-            :value="dict.dictValue"
-          />
-        </el-select>
-      </el-form-item>
+<!--      <el-form-item label="状态" prop="status">-->
+<!--        <el-select v-model="queryParams.status" placeholder="请选择状态" clearable size="small">-->
+<!--          <el-option-->
+<!--            v-for="dict in sopUserLogsDelStatus"-->
+<!--            :key="dict.dictValue"-->
+<!--            :label="dict.dictLabel"-->
+<!--            :value="dict.dictValue"-->
+<!--          />-->
+<!--        </el-select>-->
+<!--      </el-form-item>-->
       <el-form-item label="客户名称" prop="externalUserName">
         <el-input
           v-model="queryParams.externalUserName"
@@ -133,6 +133,17 @@
             v-hasPermi="['qw:sopUserLogs:remove']"
           >批量删除营期</el-button>
         </el-tooltip>
+      </el-col>
+                  <el-col :span="1.5">
+        <el-tooltip class="item" effect="dark" content="批量更换实际发送人" placement="top" >
+          <el-button
+            type="primary"
+            icon="el-icon-s-custom"
+            size="medium"
+            :disabled="multiple"
+            @click="handleUpdateSender"
+          >批量更换实际发送人</el-button>
+        </el-tooltip>
       </el-col>
     </el-row>
     <div style="color: #999;font-size: 14px;display: flex;align-items: center;margin-bottom: 5px" v-if="filterMode == 1">
@@ -152,6 +163,7 @@
       <el-table-column label="营期编号" align="center" prop="id" />
       <el-table-column label="企微员工账号" align="center" prop="qwUserId" />
       <el-table-column label="企微员工名称" align="center" prop="qwUserName" />
+      <el-table-column label="实际发送人" align="center" prop="actualQwUserName" />
       <el-table-column label="群聊" align="center" prop="chatName" v-if="filterMode == 2" />
       <el-table-column label="营期时间" align="center" prop="startTime" width="180">
         <template slot-scope="scope">
@@ -239,6 +251,10 @@
       <qwUserList ref="QwUserList" @selectUserList="selectUserList"></qwUserList>
     </el-dialog>
 
+        <el-dialog :title="listUser.title" :visible.sync="listUser.open" width="1300px"   append-to-body>
+      <qwUserSelectOne ref="QwUserListSender" @selectUser="selectSenderSingle"></qwUserSelectOne>
+    </el-dialog>
+
     <el-dialog title="追加群聊" :visible.sync="addGroupData.open"  width="800px" append-to-body>
       <el-form ref="msgForm" :model="addGroupData.form" label-width="100px">
         <el-form-item label="选择员工" prop="qwUserIds" style="margin-top: 2%">
@@ -292,7 +308,7 @@ import {
   repairSopUserLogs,
   getSelectChat,
   addGroupChat,
-  updateLogDate
+  updateLogDate,UpdateTimeSopUserLogs,replaceUser
 } from "../../../api/qw/sopUserLogs";
 import sopLogsDetails from "@/views/qw/sopLogs/sopLogsList.vue";
 import SopUserLogsInfoDetails from "@/views/qw/sopUserLogsInfo/sopUserLogsInfoDetails.vue";
@@ -300,11 +316,12 @@ import sendMsgOpenTool from "../../../views/qw/sopUserLogsInfo/sendMsgOpenTool.v
 import {listAll as chatListAll} from "@/api/qw/groupChat";
 import companyUserList from "@/views/company/companyUser/companyUserList.vue";
 import qwUserList from "@/views/qw/user/qwUserList.vue";
+import qwUserSelectOne from "@/views/qw/user/qwUserSelectOne.vue";
 import {getQwAllUserList, listUser} from "@/api/company/companyUser";
 
 export default {
   name: "sopUserLogsSchedule",
-  components: {qwUserList, companyUserList, SopUserLogsInfoDetails, sopLogsDetails,sendMsgOpenTool},
+  components: {qwUserList, qwUserSelectOne, companyUserList, SopUserLogsInfoDetails, sopLogsDetails,sendMsgOpenTool},
   props:{
     rowDetailFrom:{},
   },
@@ -316,6 +333,10 @@ export default {
       companyUserLists:[],
       sopName:'',
       tempId:'',
+      listUser: {
+        title: '选择发送人',
+        open: false
+      },
       // 遮罩层
       loading: true,
       // 导出遮罩层
@@ -420,6 +441,19 @@ export default {
 
   },
   methods: {
+        selectSenderSingle(user){
+      this.listUser.open=false;
+      const data = { ids: this.ids };
+      // 仅在选中员工时携带 actualQwUserId 与 actualQwId,否则两字段均不传,后端按清空处理
+      if (user && user.qwUserId) {
+        data.actualQwUserId = user.qwUserId;
+        data.actualQwId     = user.id;
+      }
+      replaceUser(data).then(res => {
+        this.msgSuccess(user && user.qwUserId ? "修改成功" : "已清空实际发送人");
+        this.getList();
+      })
+    },
     /** 查询sopUserLogs列表 */
     getList() {
       this.loading = true;
@@ -470,6 +504,15 @@ export default {
 
     },
 
+        /**
+     * 批量更换实际发送人
+     */
+    handleUpdateSender() {
+      this.listUser.open = true;
+      this.$nextTick(() => {
+        this.$refs.QwUserListSender.getDetails(this.queryParams.corpId);
+      })
+    },
     /**
      *  删除营期
      */

+ 1 - 1
src/views/qw/user/cuDeptIdIndex.vue

@@ -77,7 +77,7 @@
       <el-table-column label="企微账号" align="center" prop="qwUserId" />
       <el-table-column label="企微昵称" align="center" prop="qwUserName" />
       <el-table-column label="员工称呼" align="center" prop="welcomeText" />
-      <el-table-column label="所属部门" align="center" prop="isDel">
+      <el-table-column label="员工状态" align="center" prop="isDel">
         <template slot-scope="scope">
           <el-tag v-if="scope.row.isDel == 0" type="success">正常</el-tag>
           <el-tag v-else type="error">离职</el-tag>

+ 4 - 5
src/views/qw/user/index.vue

@@ -89,7 +89,7 @@
       <el-table-column label="企微账号" align="center" prop="qwUserId" />
       <el-table-column label="企微昵称" align="center" prop="qwUserName" />
       <el-table-column label="员工称呼" align="center" prop="welcomeText" />
-      <el-table-column label="所属部门" align="center" prop="isDel">
+      <el-table-column label="员工状态" align="center" prop="isDel">
         <template slot-scope="scope">
           <el-tag v-if="scope.row.isDel == 0" type="success">正常</el-tag>
           <el-tag v-else type="error">离职</el-tag>
@@ -538,7 +538,6 @@
 import {
   updateIsAuto,
   updateUser,
-  exportUser,
   getMyQwCompanyList,
   relieveFastGptRoleById,
   loginQwIpad,
@@ -553,7 +552,7 @@ import {
   outLoginQwIpad,
   changeVideoStatus,
   handleAllocateRemoteHost,
-  qwBindCloudHost, qwUnbindCloudHost, handleAuthAppKey, handleInputAuthAppKey, selectCloudAP, staffListUser
+  qwBindCloudHost, qwUnbindCloudHost, handleAuthAppKey, handleInputAuthAppKey, selectCloudAP, staffListUser, exportStaff
 } from '../../../api/qw/user'
 import fastGptRole from "@/views/fastGpt/fastGptRole/fastGptRole";
 
@@ -1204,13 +1203,13 @@ export default {
     /** 导出按钮操作 */
     handleExport() {
       const queryParams = this.queryParams;
-      this.$confirm('是否确认导出所有企微用户数据项?', "警告", {
+      this.$confirm('是否确认导出所有企微员工数据项?', "警告", {
         confirmButtonText: "确定",
         cancelButtonText: "取消",
         type: "warning"
       }).then(() => {
         this.exportLoading = true;
-        return exportUser(queryParams);
+        return exportStaff(queryParams);
       }).then(response => {
         this.download(response.msg);
         this.exportLoading = false;

+ 9 - 1
src/views/qw/user/qwUserSelectOne.vue

@@ -41,6 +41,11 @@
       @pagination="handlePaginationChange"
     />
 
+        <div style="margin-top: 30px;display: flex;justify-content: center;gap: 12px">
+      <el-button plain @click="handleClear">不选(清空发送人)</el-button>
+      <el-button type="warning" icon="el-icon-check" @click="confirmSelect">确定选择</el-button>
+    </div>
+
   </div>
 </template>
 
@@ -167,7 +172,10 @@ export default {
     handleSelectionChange(selection) {
       this.$emit("selectUser",selection);
     },
-
+    // 用户点击“不选”
+    handleClear() {
+      this.$emit("selectUser",{});   // 传空对象,表示清空
+    },
   }
 };
 </script>