吴树波 před 3 týdny
rodič
revize
ab7d5148de

+ 6 - 0
src/api/company/companyConfig.js

@@ -25,6 +25,12 @@ export function updateConfig(data) {
     data: data
   })
 }
+export function getCompanyMiniAppList() {
+  return request({
+    url: '/company/companyConfig/getCompanyMiniAppList',
+    method: 'get'
+  })
+}
 
 //配置公司默认是否开启小黑屋
 export function configUserCheck(data) {

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

@@ -77,3 +77,11 @@ export function addGroupChat(data) {
     data: data
   })
 }
+//修复营期
+export function getShortLink(data) {
+  return request({
+    url: '/qwSop/sopUserLogs/getShortLink',
+    method: 'get',
+    params: data
+  })
+}

+ 121 - 38
src/views/qw/sop/addSop.vue

@@ -29,10 +29,10 @@
               :label="1"
             >标签
             </el-radio>
-<!--            <el-radio-->
-<!--              :label="2"-->
-<!--            >群聊-->
-<!--            </el-radio>-->
+            <el-radio
+              :label="2"
+            >群聊
+            </el-radio>
           </el-radio-group>
           <Tip :title="'标签:根据企微客户的标签筛选客户进入SOP'" />
         </el-form-item>
@@ -70,13 +70,61 @@
           </div>
           <Tip title="企业微信员工账号" />
         </el-form-item>
-        <el-form-item label="群聊" prop="chatIds" v-if="form.filterMode == 2">
+        <el-form-item label="是否自动创建群" prop="autoGroup" v-if="form.filterMode == 2">
+          <el-radio-group v-model="form.autoGroup">
+            <el-radio
+              :label="0"
+            >否
+            </el-radio>
+            <el-radio
+              :label="1"
+            >是
+            </el-radio>
+          </el-radio-group>
+          <div style="color: #999;font-size: 14px;display: flex;align-items: center;">
+            <i class="el-icon-info"></i>
+            选择的企业微信员工下面的群聊
+          </div>
+        </el-form-item>
+        <el-form-item label="是否注册用户" prop="autoGroup" v-if="form.filterMode == 2 && form.autoGroup == 1">
+          <el-radio-group v-model="form.autoUserReg">
+            <el-radio
+              :label="0"
+            >否
+            </el-radio>
+            <el-radio
+              :label="1"
+            >是
+            </el-radio>
+          </el-radio-group>
+          <div style="color: #999;font-size: 14px;display: flex;align-items: center;">
+            <i class="el-icon-info"></i>
+            筛选是否注册的用户
+          </div>
+        </el-form-item>
+        <el-form-item label="创建群聊评级" prop="chatIds" v-if="form.filterMode == 2 && form.autoGroup == 1">
+          <el-select multiple filterable clearable v-model="form.autoGroupLevelArray">
+            <el-option v-for="item in levelList" :key="item.value" :label="item.label" :value="item.value"/>
+          </el-select>
+          <div style="color: #999;font-size: 14px;display: flex;align-items: center;">
+            <i class="el-icon-info"></i>
+            选择需要拉取的客户评级
+          </div>
+        </el-form-item>
+        <el-form-item label="群聊名称" prop="chatIds" v-if="form.filterMode == 2 && form.autoGroup == 1">
+          <el-input v-model="form.groupName" maxlength="10" placeholder="请输入群聊名称" />
+          <div style="color: #999;font-size: 14px;display: flex;align-items: center;">
+            <i class="el-icon-info"></i>
+            创建群聊的名称(如有重复自动加数字区分)
+          </div>
+        </el-form-item>
+        <el-form-item label="群聊" prop="chatIds" v-if="form.filterMode == 2 && form.autoGroup == 0">
           <el-select multiple filterable clearable v-model="form.chatIds">
             <el-option v-for="item in qwGroupList" :key="item.chatId" :label="item.name" :value="item.chatId"/>
           </el-select>
           <Tip title="选择的企业微信员工下面的群聊" />
         </el-form-item>
-        <el-form-item label="客户评级" prop="isRating" style="margin-top: 2%">
+        <el-form-item label="客户评级" prop="isRating" style="margin-top: 2%" v-if="form.filterMode == 1">
           <el-switch
             v-model="form.isRating"
             active-color="#13ce66"
@@ -88,18 +136,18 @@
           <span v-if="form.isRating == '2'" style="margin-left: 10px;color: #ff4949">已关闭</span>
           <Tip title="根据客户的【看课记录】进行评级,新进客户前4天不评级,第5天开始 根据客户近7天的看课记录进行评级 ABCD级" />
         </el-form-item>
+        <el-form-item label="推送方式 ">
+          <el-radio-group v-model="form.sendType" @input="handleSendTypeChange">
+            <el-radio
+              v-for="dict in sysQwSopType"
+              :key="dict.dictValue"
+              :label="parseInt(dict.dictValue)"
+            >{{ dict.dictLabel }}
+            </el-radio>
+          </el-radio-group>
+          <Tip title="选择模板类型" />
+        </el-form-item>
         <div v-if="form.type==2 && form.filterMode == 1">
-          <el-form-item label="推送方式 ">
-            <el-radio-group v-model="form.sendType" @input="handleSendTypeChange">
-              <el-radio
-                v-for="dict in sysQwSopType"
-                :key="dict.dictValue"
-                :label="parseInt(dict.dictValue)"
-              >{{ dict.dictLabel }}
-              </el-radio>
-            </el-radio-group>
-            <Tip title="选择模板类型" />
-          </el-form-item>
           <el-form-item label="选择员工" prop="qwUserIds" style="margin-top: 2%">
             <div>
               <el-button
@@ -162,13 +210,6 @@
             <Tip title="选择进入SOP任务的标签" />
           </el-form-item>
           <el-form-item label="排除的标签" prop="excludeTags">
-            <!--            <el-select v-model="excludeTags" 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="hangleChangeOutTags()"
                  style="cursor: pointer; border: 1px solid #e6e6e6; background-color: white; overflow: hidden; flex-grow: 1;width: 390px">
               <div style="min-height: 35px; max-height: 200px; overflow-y: auto;">
@@ -235,7 +276,7 @@
 
           </el-form-item>
         </div>
-        <el-form-item label="是否固定营期" prop="isFixed" v-if="form.type != 3">
+        <el-form-item label="是否固定营期" prop="isFixed" v-if="form.type != 3 && form.filterMode == 1">
           <el-radio-group v-model="form.isFixed">
             <el-radio
               :label="1"
@@ -265,7 +306,7 @@
           </el-row>
           <Tip title="任务生成的代发送消息,如果超过此设置的时间还未发送,自动作废" />
         </el-form-item>
-        <el-form-item v-if="(form.sendType==2 || form.sendType==4 || form.sendType==11) && form.type != 3 && form.isFixed == 0" label="自动添加SOP"
+        <el-form-item v-if="(form.sendType==2 || form.sendType==4 || form.sendType==11) && form.type != 3 && form.isFixed == 0 && form.filterMode == 1" label="自动添加SOP"
                       prop="autoSopTime.autoSopType">
           <el-radio-group v-model="form.autoSopTime.autoSopType">
             <el-radio
@@ -332,7 +373,7 @@
 <!--        </el-form-item>-->
 
 
-        <el-form-item label="是否只发送注册用户" prop="isRegister" v-if="form.type != 3">
+        <el-form-item label="是否只发送注册用户" prop="isRegister" v-if="form.type != 3 && form.filterMode == 1">
           <el-radio-group v-model="form.isRegister">
             <el-radio
               :label="1"
@@ -347,7 +388,7 @@
         </el-form-item>
 
         <el-form-item label="模板" prop="tempId">
-          <div @click="selectListSopTemp(form.sendType)"
+          <div @click="selectListSopTemp(form.sendType,formType)"
                style="cursor: pointer; border: 1px solid #e6e6e6; background-color: white; overflow: hidden; flex-grow: 1;">
             <el-tag v-if="form.tempId" type="success" style="margin: 3px;">
               {{ form.tempName }}
@@ -526,7 +567,14 @@ export default {
       companyUserLists: [],
       // 状态字典
       statusOptions: [],
-
+      levelList: [
+        {value: 1, label: "A"},
+        {value: 2, label: "B"},
+        {value: 3, label: "C"},
+        {value: 4, label: "D"},
+        {value: 5, label: "E"},
+        {value: -1, label: "未评级"}
+      ],
       //企微SOP发送类型
       sysQwSopType: [],
       projectOptions: [],
@@ -544,11 +592,14 @@ export default {
         isFixed: 0,
         isRegister: 0,
         type: 2,
+        autoGroup:0,
+        autoUserReg:0,
+        autoGroupLevelArray:[],
+        autoGroupLevel:null,
+        groupName:null,
         filterType: 2,
         expiryTime: 4,
         isAutoSop: 1,
-        isRating:process.env.VUE_APP_SOP_TASK_DEFAULT_RATING ?
-          parseInt(process.env.VUE_APP_SOP_TASK_DEFAULT_RATING) : 2,
         autoSopTime: {autoSopType: 2, autoStartTime: '00:00', autoEndTime: '24:00', autoSopSend: 2},
       },
       userSelectList: [],
@@ -573,12 +624,15 @@ export default {
         startTime: [{required: true, message: "开始时间不能为空", trigger: "submit"}],
         tempId: [{required: true, message: "模板不能为空", trigger: "submit"}],
         openCommentStatus:[{ required: true, message: '开启评论/弹幕不能为空', trigger: 'change' }]
-      }
+      },
+      //1 总 2 我的 3 部门
+      formType: null,
     };
   },
   created() {
 
     this.form.corpId = this.$route.params && this.$route.params.corpId;
+    this.formType = this.$route.params && this.$route.params.type;
 
     this.queryTagParams.corpId = this.$route.params && this.$route.params.corpId;
 
@@ -788,13 +842,13 @@ export default {
       }
     },
     //查询模板
-    selectListSopTemp(type) {
+    selectListSopTemp(type,formType) {
       if(this.form.filterMode == 2){
         type = 11;
       }
       this.tempOpen = true;
       setTimeout(() => {
-        this.$refs.SopTempComments.getList(type, undefined, this.form.type == 3);
+        this.$refs.SopTempComments.getList(type, undefined, this.form.type == 3,formType);
       }, 200);
 
     },
@@ -890,6 +944,11 @@ export default {
         filterType: 2,
         expiryTime: 4,
         qwUserIds: null,
+        autoGroup:0,
+        autoGroupLevelArray:[],
+        autoGroupLevel:null,
+        groupName:null,
+        autoUserReg:0,
         corpId: null,
         setting: null,
         createBy: null,
@@ -944,10 +1003,21 @@ export default {
         if (valid) {
           if (this.form.type == 2 && this.form.filterMode == 2) {
             this.form.sendType = 11;
-            if (this.form.chatIds.length <= 0) {
-              return this.$message.error("请选择群聊")
+            if(this.form.autoGroup == 0){
+              if (this.form.chatIds.length <= 0) {
+                return this.$message.error("请选择群聊")
+              }
+            }
+            if(this.form.autoGroup == 1){
+              if (this.form.autoGroupLevelArray.length <= 0) {
+                return this.$message.error("请选择评级")
+              }
+              if (this.form.groupName == null) {
+                return this.$message.error("请输入群聊名称")
+              }
             }
             this.form.chatId = this.form.chatIds.join();
+            this.form.autoGroupLevel = this.form.autoGroupLevelArray.join();
           } else {
             if (this.userSelectList.length <= 0) {
               return this.$message.error("请选择员工")
@@ -1002,7 +1072,14 @@ export default {
               this.msgSuccess("修改成功");
               this.$store.dispatch("tagsView/delView", this.$route);
               // this.$router.replace('/qw/conversion/sop')
-              window.location.replace('/qw/conversion/sop')
+              if (this.formType==1){
+                window.location.replace('/qw/conversion/sop')
+              }else if (this.formType==2){
+                window.location.replace('/qw/conversion/mySop')
+              }else if (this.formType==3){
+                window.location.replace('/qw/conversion/deptSop')
+              }
+
               this.reset();
             });
           } else {
@@ -1010,7 +1087,13 @@ export default {
               this.msgSuccess("新增成功");
               this.$store.dispatch("tagsView/delView", this.$route);
               // this.$router.replace('/qw/conversion/sop')
-              window.location.replace('/qw/conversion/sop')
+              if (this.formType==1){
+                window.location.replace('/qw/conversion/sop')
+              }else if (this.formType==2){
+                window.location.replace('/qw/conversion/mySop')
+              }else if (this.formType==3){
+                window.location.replace('/qw/conversion/deptSop')
+              }
               this.reset();
             });
           }

+ 46 - 11
src/views/qw/sop/sop.vue

@@ -288,7 +288,7 @@
             type="text"
             style="color: green;"
             @click="handleQueryDetails(scope.row)"
-            v-hasPermi="['qw:sopTemp:info']"
+            v-hasPermi="['qw:sop:list']"
           >查看模板
           </el-button>
         </template>
@@ -760,7 +760,20 @@
                       </el-card>
                     </div>
                     <div v-if="item.contentType == 4">
-
+                      <el-card class="box-card">
+                        <el-form-item label="标题" prop="miniprogramTitle">
+                          <el-input v-model="item.miniprogramTitle" placeholder="请输入小程序消息标题,最长为64字"  />
+                        </el-form-item>
+                        <el-form-item label="封面" prop="miniprogramPicUrl">
+                          <ImageUpload v-model="item.miniprogramPicUrl"  type="image" :num="10" :width="150" :height="150" />
+                        </el-form-item>
+                        <el-form-item label="appid" prop="miniprogramAppid" v-show="false" >
+                          <el-input v-model="item.miniprogramAppid" disabled />
+                        </el-form-item>
+                        <el-form-item label="page路径" prop="miniprogramPage" v-show="false" label-width="100px" style="margin-left: -30px" >
+                          <el-input v-model="item.miniprogramPage" placeholder="小程序消息打开后的路径"  disabled />
+                        </el-form-item>
+                      </el-card>
                     </div>
                     <div v-if="item.contentType == 5 ">
 
@@ -1098,13 +1111,14 @@ export default {
     }
   },
   methods: {
+
     /**
      * SOP任务营期一键群发
      */
     handleCampSendMsg(){
 
       setTimeout(() => {
-        this.$refs.sendMsgSopOpenTool.oneClickGroupSending(this.ids,2,this.queryParams.corpId);
+        this.$refs.sendMsgSopOpenTool.oneClickGroupSending(this.ids,2,this.queryParams.corpId,0);
       }, 500);
 
     },
@@ -1401,18 +1415,28 @@ export default {
             this.$set(this.setting[i], 'linkTitle', selectedCourse.dictLabel);
             this.$set(this.setting[i], 'linkImageUrl', selectedCourse.dictImgUrl);
           }
+          if (selectedCourse && this.setting[i].contentType == 4 && this.msgForm.courseId != null) {
+            this.$set(this.setting[i], 'miniprogramPicUrl', selectedCourse.dictImgUrl);
+          }
 
         }
 
       }
-      if (this.msgForm.videoId != null ) {
+      if (this.msgForm.videoId != null) {
         // 查找选中的课节对应的 label
         const selectedVideo = this.videoList.find(course => parseInt(course.dictValue) === this.msgForm.videoId);
 
         for (let i = 0; i < this.setting.length; i++) {
           //响应式直接给链接的描述上值
-          if (selectedVideo && this.setting[i].contentType == 3  && this.msgForm.videoId != null) {
-            this.$set(this.setting[i], 'linkDescribe', selectedVideo.dictLabel);
+          if (selectedVideo && this.msgForm.videoId != null) {
+            console.log(2, this.setting[i].contentType)
+            if (this.setting[i].contentType == 3 || this.setting[i].contentType == 9) {
+              this.$set(this.setting[i], 'linkDescribe', selectedVideo.dictLabel);
+            }
+            if (this.setting[i].contentType == 4) {
+              this.$set(this.setting[i], 'miniprogramTitle', selectedVideo.dictLabel);
+            }
+
           }
         }
       }
@@ -1420,14 +1444,22 @@ export default {
 
     },
     videoIdChange() {
-      if (this.msgForm.videoId != null ) {
+      if (this.msgForm.videoId != null) {
         // 查找选中的课节对应的 label
         const selectedVideo = this.videoList.find(course => parseInt(course.dictValue) === this.msgForm.videoId);
 
         for (let i = 0; i < this.setting.length; i++) {
           //响应式直接给链接的描述上值
-          if (selectedVideo && this.setting[i].contentType == 3  && this.msgForm.videoId != null) {
-            this.$set(this.setting[i], 'linkDescribe', selectedVideo.dictLabel);
+          if (selectedVideo && this.msgForm.videoId != null) {
+            if (this.setting[i].contentType == 3 || this.setting[i].contentType == 9) {
+              this.$set(this.setting[i], 'linkDescribe', selectedVideo.dictLabel);
+            }
+
+            if (this.setting[i].contentType == 4) {
+              this.$set(this.setting[i], 'miniprogramTitle', selectedVideo.dictLabel);
+            }
+
+
           }
         }
       }
@@ -1851,7 +1883,7 @@ export default {
       });
     },
     courseChange() {
-      if (this.msgForm.courseId != null ) {
+      if (this.msgForm.courseId != null) {
         const selectedCourse = this.courseList.find(course => parseInt(course.dictValue) === this.msgForm.courseId);
         for (let i = 0; i < this.setting.length; i++) {
           //响应式直接给链接的标题/封面上值
@@ -1859,12 +1891,15 @@ export default {
             this.$set(this.setting[i], 'linkTitle', selectedCourse.dictLabel);
             this.$set(this.setting[i], 'linkImageUrl', selectedCourse.dictImgUrl);
           }
+          if (selectedCourse && this.setting[i].contentType == 4 && this.msgForm.courseId != null) {
+            this.$set(this.setting[i], 'miniprogramPicUrl', selectedCourse.dictImgUrl);
+          }
 
         }
 
       }
       videoList(this.msgForm.courseId).then(response => {
-        this.videoList=response.list;
+        this.videoList = response.list;
       });
     },
     cancelMsgForm(){

+ 95 - 28
src/views/qw/sop/updateSop.vue

@@ -3,11 +3,11 @@
     <div style="margin: 30px;" v-if="handleType==1"> 修改sop任务</div>
     <div style="margin: 30px;" v-if="handleType==2"> 查看sop任务
       <div style="float: right">
-<!--        <el-button-->
-<!--          type="primary"-->
-<!--          @click="handleUpdateTags()"-->
-<!--          v-hasPermi="['qw:sop:remove']"-->
-<!--        >修改标签</el-button>-->
+        <!--        <el-button-->
+        <!--          type="primary"-->
+        <!--          @click="handleUpdateTags()"-->
+        <!--          v-hasPermi="['qw:sop:remove']"-->
+        <!--        >修改标签</el-button>-->
         <el-button
           type="primary"
           @click="handleUpdateQwUser()"
@@ -37,16 +37,16 @@
           <el-input v-model="form.name" placeholder="请输入规则名称" />
         </el-form-item>
         <el-form-item label="状态" prop="status">
-            <dict-tag :options="statusOptions" :value="form.status"></dict-tag>
+          <dict-tag :options="statusOptions" :value="form.status"></dict-tag>
         </el-form-item>
-<!--        <el-form-item label="状态">-->
-<!--          <el-radio-group v-model="form.status">-->
-<!--            <el-radio-->
-<!--              v-for="dict in statusOptions"-->
-<!--              :label="dict.dictValue"-->
-<!--            >{{dict.dictLabel}}</el-radio>-->
-<!--          </el-radio-group>-->
-<!--        </el-form-item>-->
+        <!--        <el-form-item label="状态">-->
+        <!--          <el-radio-group v-model="form.status">-->
+        <!--            <el-radio-->
+        <!--              v-for="dict in statusOptions"-->
+        <!--              :label="dict.dictValue"-->
+        <!--            >{{dict.dictLabel}}</el-radio>-->
+        <!--          </el-radio-group>-->
+        <!--        </el-form-item>-->
         <el-form-item label="类别" prop="type">
           <el-radio-group v-model="form.type">
             <el-radio
@@ -103,6 +103,54 @@
               </el-tag>
             </div>
           </el-form-item>
+          <el-form-item label="是否自动创建群" prop="autoGroup" v-if="form.filterMode == 2">
+            <el-radio-group v-model="form.autoGroup">
+              <el-radio
+                :label="0"
+              >否
+              </el-radio>
+              <el-radio
+                :label="1"
+              >是
+              </el-radio>
+            </el-radio-group>
+            <div style="color: #999;font-size: 14px;display: flex;align-items: center;">
+              <i class="el-icon-info"></i>
+              选择的企业微信员工下面的群聊
+            </div>
+          </el-form-item>
+          <el-form-item label="是否注册用户" prop="autoGroup" v-if="form.filterMode == 2 && form.autoGroup == 1">
+            <el-radio-group v-model="form.autoUserReg">
+              <el-radio
+                :label="0"
+              >否
+              </el-radio>
+              <el-radio
+                :label="1"
+              >是
+              </el-radio>
+            </el-radio-group>
+            <div style="color: #999;font-size: 14px;display: flex;align-items: center;">
+              <i class="el-icon-info"></i>
+              筛选是否注册的用户
+            </div>
+          </el-form-item>
+          <el-form-item label="创建群聊评级" prop="chatIds" v-if="form.filterMode == 2 && form.autoGroup == 1">
+            <el-select multiple filterable clearable v-model="form.autoGroupLevelArray">
+              <el-option v-for="item in levelList" :key="item.value" :label="item.label" :value="item.value"/>
+            </el-select>
+            <div style="color: #999;font-size: 14px;display: flex;align-items: center;">
+              <i class="el-icon-info"></i>
+              选择需要拉取的客户评级
+            </div>
+          </el-form-item>
+          <el-form-item label="群聊名称" prop="chatIds" v-if="form.filterMode == 2 && form.autoGroup == 1">
+            <el-input v-model="form.groupName" maxlength="10" placeholder="请输入群聊名称" />
+            <div style="color: #999;font-size: 14px;display: flex;align-items: center;">
+              <i class="el-icon-info"></i>
+              创建群聊的名称(如有重复自动加数字区分)
+            </div>
+          </el-form-item>
           <el-form-item label="标签规则" prop="filterType">
             <el-radio-group v-model="form.filterType">
               <el-radio
@@ -268,14 +316,14 @@
             <!-- 如果 form.tempId 没有值,显示 '请选择模板' -->
             <span v-if="!form.tempId" style="margin: 3px; color: #999;">请选择模板</span>
           </div>
-<!--          <el-select v-model="form.tempId"  @focus="selectListSopTemp(form.sendType)" placeholder="请选择模板" v-loading="tempListLoading"   >-->
-<!--            <el-option-->
-<!--              v-for="dict in tempList"-->
-<!--              :label="dict.name"-->
-<!--              :value="dict.id">-->
-<!--            </el-option>-->
-<!--            <div v-if="tempListLoading" slot="prefix" class="select-prefix">正在查询相应模板...</div>-->
-<!--          </el-select>-->
+          <!--          <el-select v-model="form.tempId"  @focus="selectListSopTemp(form.sendType)" placeholder="请选择模板" v-loading="tempListLoading"   >-->
+          <!--            <el-option-->
+          <!--              v-for="dict in tempList"-->
+          <!--              :label="dict.name"-->
+          <!--              :value="dict.id">-->
+          <!--            </el-option>-->
+          <!--            <div v-if="tempListLoading" slot="prefix" class="select-prefix">正在查询相应模板...</div>-->
+          <!--          </el-select>-->
         </el-form-item>
 
         <el-form-item label="开启评论/弹幕" prop="openCommentStatus">
@@ -342,7 +390,7 @@ 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 { getMyQwUserList,getMyQwCompanyList } from "@/api/qw/user";
+import {getMyQwUserList, getMyQwCompanyList, getQwUserByIds} from "@/api/qw/user";
 import {sopListWxUserGroup} from "@/api/wxUser/wxUserGroup";
 import source from "echarts/src/data/Source";
 import SopTemp from "@/views/qw/sopTemp/sopTemp.vue";
@@ -353,6 +401,14 @@ export default {
   components: {Tip, SopTemp, CustomerGroupDetails, qwUserList,ImageUpload,sopLogsDetails},
   data() {
     return {
+      levelList: [
+        {value: 1, label: "A"},
+        {value: 2, label: "B"},
+        {value: 3, label: "C"},
+        {value: 4, label: "D"},
+        {value: 5, label: "E"},
+        {value: -1, label: "未评级"},
+      ],
       updateQwUserDialog:{
         title:"修改成员",
         open:false
@@ -410,6 +466,7 @@ export default {
         status: 1,
         sendType:2,
         type: 2,
+        autoGroupLevelArray:[],
         filterType:2,
         autoSopTime:{},
       },
@@ -473,11 +530,11 @@ export default {
         '<span style="color: red;">(如有删除员工,对应的【营期也会删除】且【不可恢复】,请谨慎操作)</span>',
         "警告",
         {
-        confirmButtonText: "确定",
-        cancelButtonText: "取消",
-        type: "warning",
-        dangerouslyUseHTMLString: true // 允许使用 HTML 字符串
-      }).then(() => {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning",
+          dangerouslyUseHTMLString: true // 允许使用 HTML 字符串
+        }).then(() => {
         this.updateQwUserDialog.open=false;
         return updateSopQwUser(data);
       }).then(response => {
@@ -588,6 +645,7 @@ export default {
     //删除员工
     handleClosegroupUser(id){
       // const index = this.userSelectList.findIndex(t => t === list);
+      console.log(id)
       // if (index !== -1) {
       //   this.userSelectList.splice(index, 1);
       // }
@@ -644,6 +702,14 @@ export default {
         if (this.form.setting!=null){
           this.setting=JSON.parse(this.form.setting);
         }
+        if(this.form.autoGroupLevel != null){
+          this.form.autoGroupLevelArray = this.form.autoGroupLevel.split(",").map(Number);
+        }
+        if(this.form.qwUserIds != null){
+          getQwUserByIds(this.form.qwUserIds).then(res => {
+            this.companyQwUserList = res.data;
+          })
+        }
 
         listSopTemp({id:this.form.tempId}).then(response => {
           this.tempList = response.rows;
@@ -666,6 +732,7 @@ export default {
         type: 2,
         filterType:2,
         qwUserIds: null,
+        autoGroupLevelArray:[],
         corpId: null,
         setting: null,
         createBy: null,

+ 349 - 194
src/views/qw/sopUserLogs/sopUserLogsSchedule.vue

@@ -2,9 +2,10 @@
   <div class="app-container">
     <div style="margin-bottom: 10px">
       <el-card>
-        <span class="custom-style" style="display: block; margin-bottom: 10px">自动化规则名称:{{sopName}}</span>
-        <span class="custom-style" style="display: block; margin-bottom: 10px">自动化规则编号:{{queryParams.sopId}}</span>
-        <span class="custom-style" style="display: block;">模板编号:{{tempId}}</span>
+        <span class="custom-style" style="display: block; margin-bottom: 10px">自动化规则名称:{{ sopName }}</span>
+        <span class="custom-style" style="display: block; margin-bottom: 10px"
+        >自动化规则编号:{{ queryParams.sopId }}</span>
+        <span class="custom-style" style="display: block;">模板编号:{{ tempId }}</span>
       </el-card>
     </div>
 
@@ -32,19 +33,20 @@
                         v-model="queryParams.startTime"
                         type="date"
                         value-format="yyyy-MM-dd"
-                        placeholder="选择营期时间">
+                        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"
@@ -72,7 +74,9 @@
     <el-row :gutter="10" class="mb8" v-if="filterMode == 1">
 
       <el-col :span="1.5">
-        <el-tooltip class="item" effect="dark" content="此功能用于给 选中的 营期 内【所有的】客户发送 消息【或者发送草稿-/-清楚草稿】" placement="top">
+        <el-tooltip class="item" effect="dark"
+                    content="此功能用于给 选中的 营期 内【所有的】客户发送 消息【或者发送草稿-/-清楚草稿】" placement="top"
+        >
           <el-button
             type="warning"
             icon="el-icon-s-promotion"
@@ -80,12 +84,27 @@
             :disabled="multiple"
             @click="handleCampSendMsg"
             v-hasPermi="['qw:sopUserLogsInfo:msgSchedule']"
-          >营期一键群发(或草稿)</el-button>
+          >营期一键群发(或草稿)
+          </el-button>
         </el-tooltip>
       </el-col>
 
+      <!--      <el-col :span="1.5">-->
+      <!--        <el-tooltip class="item" effect="dark" content="修改选择的群聊营期时间" placement="top">-->
+      <!--          <el-button-->
+      <!--            type="danger"-->
+      <!--            icon="el-icon-edit"-->
+      <!--            size="medium"-->
+      <!--            :disabled="multiple"-->
+      <!--            @click="updateGroupTime"-->
+      <!--          >批量修改营期时间</el-button>-->
+      <!--        </el-tooltip>-->
+      <!--      </el-col>-->
+
       <el-col :span="1.5">
-        <el-tooltip class="item" effect="dark" content="删除营期之后,将不会在给原营期的客户发送消息,ps:删除之后不可恢复" placement="top">
+        <el-tooltip class="item" effect="dark" content="删除营期之后,将不会在给原营期的客户发送消息,ps:删除之后不可恢复"
+                    placement="top"
+        >
           <el-button
             type="danger"
             icon="el-icon-s-promotion"
@@ -93,7 +112,8 @@
             :disabled="multiple"
             @click="handleDeleteUserLogs"
             v-hasPermi="['qw:sopUserLogs:remove']"
-          >批量删除营期</el-button>
+          >批量删除营期
+          </el-button>
 
         </el-tooltip>
       </el-col>
@@ -107,7 +127,8 @@
             icon="el-icon-plus"
             size="medium"
             @click="addGroup"
-          >追加群聊</el-button>
+          >追加群聊
+          </el-button>
         </el-tooltip>
       </el-col>
 
@@ -119,11 +140,14 @@
             size="medium"
             :disabled="multiple"
             @click="updateGroupTime"
-          >批量修改营期时间</el-button>
+          >批量修改营期时间
+          </el-button>
         </el-tooltip>
       </el-col>
       <el-col :span="1.5">
-        <el-tooltip class="item" effect="dark" content="删除营期之后,将不会在给原营期的群发送消息,ps:删除之后不可恢复" placement="top">
+        <el-tooltip class="item" effect="dark" content="删除营期之后,将不会在给原营期的群发送消息,ps:删除之后不可恢复"
+                    placement="top"
+        >
           <el-button
             type="danger"
             icon="el-icon-s-promotion"
@@ -131,35 +155,55 @@
             :disabled="multiple"
             @click="handleDeleteUserLogs"
             v-hasPermi="['qw:sopUserLogs:remove']"
-          >批量删除营期</el-button>
+          >批量删除营期
+          </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">
+    <div style="color: #999;font-size: 14px;display: flex;align-items: center;margin-bottom: 5px"
+         v-if="filterMode == 1"
+    >
       <i class="el-icon-info"></i>
       【营期一键群发】:此功能用于给 选中的 营期 内【所有的】客户发送 消息【或者发送草稿-/-清楚草稿】
     </div>
-    <div style="color: #999;font-size: 14px;display: flex;align-items: center;margin-bottom: 5px" v-if="filterMode == 1">
+    <div style="color: #999;font-size: 14px;display: flex;align-items: center;margin-bottom: 5px"
+         v-if="filterMode == 1"
+    >
       <i class="el-icon-info"></i>
       【批量删除营期】:此功能用于删除选中的【整个营期】,删除之后将不会在给原营期的客户发送消息,ps:删除之后不可恢复
     </div>
-    <div style="color: #999;font-size: 14px;display: flex;align-items: center;margin-bottom: 5px" v-if="filterMode == 1">
+    <div style="color: #999;font-size: 14px;display: flex;align-items: center;margin-bottom: 5px"
+         v-if="filterMode == 1"
+    >
       <i class="el-icon-info"></i>
       【天数】:【列表:营期时间】对应列表中的天数是几 就代表着 插件助手 会发送【任务模板】里的第几天的消息
     </div>
     <el-table border v-loading="loading" :data="sopUserLogsList" @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" prop="qwUserId" />
-      <el-table-column label="企微员工名称" align="center" prop="qwUserName" />
-      <el-table-column label="群聊" align="center" prop="chatName" v-if="filterMode == 2" />
+      <el-table-column type="selection" width="55" align="center"/>
+      <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">
           <span>{{ parseTime(scope.row.startTime, '{y}-{m}-{d}') }}</span>
         </template>
       </el-table-column>
-      <el-table-column label="天数" align="center" prop="countDays" />
-      <el-table-column label="状态" align="center" prop="status" >
+      <el-table-column label="天数" align="center" prop="countDays"/>
+      <el-table-column label="状态" align="center" prop="status">
         <template slot-scope="scope">
           <div v-if="scope.row.userId && scope.row.userId.includes('null')">
             <span style="color: orange;">营期异常</span>
@@ -180,7 +224,8 @@
             icon="el-icon-edit"
             @click="handleSelect(scope.row)"
             v-hasPermi="['qw:sop:list']"
-          >营期详情</el-button>
+          >营期详情
+          </el-button>
           <el-button
             v-if="scope.row.userId && scope.row.userId.includes('null')"
             size="mini"
@@ -188,7 +233,8 @@
             icon="el-icon-s-check"
             @click="handleRepairLogs(scope.row)"
             v-hasPermi="['qw:sop:list']"
-          >修复营期</el-button>
+          >修复营期
+          </el-button>
           <!--          <el-button-->
           <!--            size="mini"-->
           <!--            type="text"-->
@@ -198,6 +244,17 @@
         </template>
       </el-table-column>
 
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" v-if="filterMode == 2">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            @click="getLink(scope.row)"
+          >获取当天群链接
+          </el-button>
+        </template>
+      </el-table-column>
+
     </el-table>
 
     <pagination
@@ -210,15 +267,19 @@
 
 
     <!--  执行详情  -->
-    <el-drawer :title="logsInfoDetailsOpen.title" :visible.sync="logsInfoDetailsOpen.open" size="88%" style="font-weight: bolder">
-      <sop-user-logs-info-details ref="SopUserLogsInfoDetails" :rowDetailFrom="logsInfoDetailsOpen.item" @flashNotify="flashNotify"></sop-user-logs-info-details>
+    <el-drawer :title="logsInfoDetailsOpen.title" :visible.sync="logsInfoDetailsOpen.open" size="88%"
+               style="font-weight: bolder"
+    >
+      <sop-user-logs-info-details ref="SopUserLogsInfoDetails" :rowDetailFrom="logsInfoDetailsOpen.item"
+                                  @flashNotify="flashNotify"
+      ></sop-user-logs-info-details>
     </el-drawer>
 
-    <send-msg-open-tool ref="sendMsgOpenTool" ></send-msg-open-tool>
-    <el-dialog title="修改营期时间" :visible.sync="updateTimeData.open"  width="800px" append-to-body>
+    <send-msg-open-tool ref="sendMsgOpenTool"></send-msg-open-tool>
+    <el-dialog title="修改营期时间" :visible.sync="updateTimeData.open" width="800px" append-to-body>
       <p>
         <span>选择群聊:</span>
-        <el-tag v-for="name in chatNames">{{name}}</el-tag>
+        <el-tag v-for="name in chatNames">{{ name }}</el-tag>
       </p>
       <el-form ref="msgForm" :model="updateTimeData.form" label-width="100px">
         <el-form-item label="日期">
@@ -226,7 +287,8 @@
             v-model="updateTimeData.form.date"
             type="date"
             value-format="yyyy-MM-dd"
-            placeholder="选择日期">
+            placeholder="选择日期"
+          >
           </el-date-picker>
         </el-form-item>
       </el-form>
@@ -235,11 +297,15 @@
         <el-button @click="updateTimeData.open = false">取 消</el-button>
       </div>
     </el-dialog>
-    <el-dialog title="选择企微" :visible.sync="addGroupData.userOpen" width="1300px"   append-to-body>
+    <el-dialog title="选择企微" :visible.sync="addGroupData.userOpen" width="1300px" append-to-body>
       <qwUserList ref="QwUserList" @selectUserList="selectUserList"></qwUserList>
     </el-dialog>
 
-    <el-dialog title="追加群聊" :visible.sync="addGroupData.open"  width="800px" append-to-body>
+    <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%">
           <div>
@@ -247,7 +313,9 @@
               size="medium"
               icon="el-icon-circle-plus-outline"
               plain
-              @click="handleCompanyUser">请选择使用员工</el-button>
+              @click="handleCompanyUser"
+            >请选择使用员工
+            </el-button>
           </div>
           <div>
             <el-tag
@@ -257,14 +325,18 @@
               v-for="id in userSelectList"
               closable
               :disable-transitions="false"
-              @close="handleClosegroupUser(id)">
-              <span v-for="list in companyUserLists " :key="list.userId" v-if="list.id == id">{{list.qwUserName}}</span>
+              @close="handleClosegroupUser(id)"
+            >
+              <span v-for="list in companyUserLists " :key="list.userId" v-if="list.id == id"
+              >{{ list.qwUserName }}</span>
             </el-tag>
           </div>
         </el-form-item>
         <el-form-item label="群聊">
           <el-select multiple filterable clearable v-model="addGroupData.form.chatIds">
-            <el-option v-for="item in addGroupData.selectChat" :key="item.chatId" :label="item.name" :value="item.chatId"/>
+            <el-option v-for="item in addGroupData.selectChat" :key="item.chatId" :label="item.name"
+                       :value="item.chatId"
+            />
           </el-select>
         </el-form-item>
         <el-form-item label="日期">
@@ -272,7 +344,8 @@
             v-model="addGroupData.form.date"
             type="date"
             value-format="yyyy-MM-dd"
-            placeholder="选择日期">
+            placeholder="选择日期"
+          >
           </el-date-picker>
         </el-form-item>
       </el-form>
@@ -281,6 +354,29 @@
         <el-button @click="addGroupData.open = false">取 消</el-button>
       </div>
     </el-dialog>
+
+    <el-dialog title="链接" :visible.sync="mini.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%">
+          <el-select v-model="mini.appId" placeholder="选择小程序" size="small">
+            <el-option
+              v-for="miniApp in companyMiniAppList"
+              :key="miniApp.appid"
+              :label="miniApp.name"
+              :value="miniApp.appid"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="链接" prop="qwUserIds" style="margin-top: 2%" :loading="mini.loading">
+          {{ mini.link || "无" }}
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="genMiniLink">生 成</el-button>
+        <el-button @click="mini.open = false">取 消</el-button>
+      </div>
+    </el-dialog>
   </div>
 </template>
 
@@ -290,32 +386,46 @@ import {
   exportSopUserLogs,
   listSopUserLogs,
   repairSopUserLogs,
+  getShortLink,
   getSelectChat,
   addGroupChat,
-  updateLogDate
-} from "../../../api/qw/sopUserLogs";
-import sopLogsDetails from "@/views/qw/sopLogs/sopLogsList.vue";
-import SopUserLogsInfoDetails from "@/views/qw/sopUserLogsInfo/sopUserLogsInfoDetails.vue";
-import sendMsgOpenTool from "../../../views/qw/sopUserLogsInfo/sendMsgOpenTool.vue";
-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 {getQwAllUserList, listUser} from "@/api/company/companyUser";
+  updateLogDate, UpdateTimeSopUserLogs, replaceUser
+} from '@/api/qw/sopUserLogs'
+import {
+  getCompanyMiniAppList
+} from '@/api/company/companyConfig'
+import sopLogsDetails from '@/views/qw/sopLogs/sopLogsList.vue'
+import SopUserLogsInfoDetails from '@/views/qw/sopUserLogsInfo/sopUserLogsInfoDetails.vue'
+import sendMsgOpenTool from '../../../views/qw/sopUserLogsInfo/sendMsgOpenTool.vue'
+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},
-  props:{
-    rowDetailFrom:{},
+  name: 'sopUserLogsSchedule',
+  components: { qwUserList, qwUserSelectOne, companyUserList, SopUserLogsInfoDetails, sopLogsDetails, sendMsgOpenTool },
+  props: {
+    rowDetailFrom: {}
   },
 
   data() {
     return {
       qwUserIds: [],
-      sopUserLogId:null,
-      companyUserLists:[],
-      sopName:'',
-      tempId:'',
+      sopUserLogId: null,
+      companyUserLists: [],
+      sopName: '',
+      tempId: '',
+      listUser: {
+        title: '选择发送人',
+        open: false
+      },
+      mini: {
+        open: false,
+        loading: false,
+        row: {},
+      },
       // 遮罩层
       loading: true,
       // 导出遮罩层
@@ -333,17 +443,17 @@ export default {
       showSearch: true,
       // 总条数
       total: 0,
-      logsInfoDetailsOpen:{
-        title:"",
-        open:false,
+      logsInfoDetailsOpen: {
+        title: '',
+        open: false
       },
-      sysQwSopAiContentType:[],
-      userSelectList:[],
+      sysQwSopAiContentType: [],
+      userSelectList: [],
       // sopUserLogs表格数据
       sopUserLogsList: [],
-      sopUserLogsDelStatus:[],
+      sopUserLogsDelStatus: [],
       // 弹出层标题
-      title: "",
+      title: '',
       // 是否显示弹出层
       open: false,
       // 查询参数
@@ -352,22 +462,22 @@ export default {
         userOpen: false,
         selectChat: [],
         form: {
-          chatIds: [],
-        },
+          chatIds: []
+        }
       },
       updateTimeData: {
         open: false,
         form: {
-          date: null,
-        },
+          date: null
+        }
       },
       queryParams: {
         pageNum: 1,
         pageSize: 10,
         sopId: null,
-        userLogsId:null,
-        externalUserName:null,
-        externalId:null,
+        userLogsId: null,
+        externalUserName: null,
+        externalId: null,
         sopTempId: null,
         qwUserId: null,
         qwUserName: null,
@@ -375,72 +485,103 @@ export default {
         startTime: null,
         status: null,
         userId: null,
-        type:null,
+        type: null
       },
-      sendMsgOpen:{
-        title:'营期一键批量群发',
-        open:false,
-        ids:null,
+      sendMsgOpen: {
+        title: '营期一键批量群发',
+        open: false,
+        ids: null
       },
-      setting:[],
+      setting: [],
+      companyMiniAppList: [],
       // 表单参数
       form: {},
       tempForm: {
-        setting:null,
-        videoIdSet:null,
-        courseIdSet:null,
+        setting: null,
+        videoIdSet: null,
+        courseIdSet: null
       },
       // 表单校验
-      rules: {
-      }
-    };
+      rules: {}
+    }
   },
   created() {
 
-    this.getDicts("sys_company_status").then(response => {
-      this.statusOptions = response.data;
-    });
-
-    this.getDicts("sop_user_logs_del_status").then(response => {
-      this.sopUserLogsDelStatus = response.data;
-    });
-    this.getDicts("sys_qwSopAi_contentType").then(response => {
-      this.sysQwSopAiContentType = response.data;
-    });
-    this.queryParams.sopId = this.$route.params.id;
-    this.sopName = this.$route.query.name;
-    this.filterMode = this.$route.query.filterMode;
-    this.tempId = this.$route.query.tempId;
-    this.queryParams.corpId= this.$route.query.corpId;
-    this.queryParams.type= this.$route.query.type;
+    this.getDicts('sys_company_status').then(response => {
+      this.statusOptions = response.data
+    })
+
+    this.getDicts('sop_user_logs_del_status').then(response => {
+      this.sopUserLogsDelStatus = response.data
+    })
+    this.getDicts('sys_qwSopAi_contentType').then(response => {
+      this.sysQwSopAiContentType = response.data
+    })
+    this.queryParams.sopId = this.$route.params.id
+    this.sopName = this.$route.query.name
+    this.filterMode = this.$route.query.filterMode
+    this.tempId = this.$route.query.tempId
+    this.queryParams.corpId = this.$route.query.corpId
+    this.queryParams.type = this.$route.query.type
     getQwAllUserList(this.queryParams.corpId).then(response => {
-      this.companyUserLists = response.data;
-    });
+      this.companyUserLists = response.data
+    })
     this.getList()
 
   },
   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()
+      })
+    },
+    getLink(row) {
+      getCompanyMiniAppList().then(res => {
+        this.companyMiniAppList = res.data
+        this.mini.open = true;
+        this.mini.row = row;
+      }).catch(res => {
+        console.log(res)
+      })
+    },
+    genMiniLink() {
+      this.mini.loading = true;
+      getShortLink({ id: this.mini.row.id, sopId: this.mini.row.sopId, appId: this.mini.appId }).then(response => {
+        this.mini.link = response.urlLink;
+        this.$forceUpdate();
+      }).finally(e =>{
+        this.mini.loading = false;
+      })
+    },
     /** 查询sopUserLogs列表 */
     getList() {
-      this.loading = true;
+      this.loading = true
       listSopUserLogs(this.queryParams).then(response => {
-        this.sopUserLogsList = response.rows;
-        this.total = response.total;
-        this.loading = false;
-      });
+        this.sopUserLogsList = response.rows
+        this.total = response.total
+        this.loading = false
+      })
     },
     // 取消按钮
     cancel() {
-      this.open = false;
-      this.reset();
+      this.open = false
+      this.reset()
     },
-    addSetList(){
+    addSetList() {
       const newSetting = {
-        contentType:'1',
-        value: '',
-      };
+        contentType: '1',
+        value: ''
+      }
       // 将新设置项添加到 content.setting 数组中
-      this.setting.push(newSetting);
+      this.setting.push(newSetting)
 
     },
     // 表单重置
@@ -450,176 +591,190 @@ export default {
         sopId: null,
         sopTempId: null,
         qwUserId: null,
-        externalId:null,
+        externalId: null,
         corpId: null,
         startTime: null,
         status: 0,
         userId: null
-      };
-      this.resetForm("form");
+      }
+      this.resetForm('form')
     },
 
     /**
      * 营期一键群发
      */
-    handleCampSendMsg(){
+    handleCampSendMsg() {
 
       setTimeout(() => {
-        this.$refs.sendMsgOpenTool.oneClickGroupSending(this.ids,2,this.queryParams.corpId);
-      }, 500);
+        this.$refs.sendMsgOpenTool.oneClickGroupSending(this.ids, 2, this.queryParams.corpId)
+      }, 500)
 
     },
 
+    /**
+     * 批量更换实际发送人
+     */
+    handleUpdateSender() {
+      this.listUser.open = true
+      this.$nextTick(() => {
+        this.$refs.QwUserListSender.getDetails(this.queryParams.corpId)
+      })
+    },
     /**
      *  删除营期
      */
-    handleDeleteUserLogs(){
-      const ids =  this.ids;
-      this.$confirm('是否确认删除编号为"' + ids + '"的数据项【注意!!删除后不可恢复,请谨慎操作】?', "警告", {
-        confirmButtonText: "确定",
-        cancelButtonText: "取消",
-        type: "warning"
+    handleDeleteUserLogs() {
+      const ids = this.ids
+      this.$confirm('是否确认删除编号为"' + ids + '"的数据项【注意!!删除后不可恢复,请谨慎操作】?', '警告', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
       }).then(function() {
-        return delSopUserLogs(ids);
+        return delSopUserLogs(ids)
       }).then(() => {
-        this.getList();
-        this.msgSuccess("删除成功");
-      }).catch(() => {});
+        this.getList()
+        this.msgSuccess('删除成功')
+      }).catch(() => {
+      })
     },
 
     /** 搜索按钮操作 */
     handleQuery() {
-      this.queryParams.pageNum = 1;
-      this.getList();
+      this.queryParams.pageNum = 1
+      this.getList()
     },
     /** 重置按钮操作 */
     resetQuery() {
-      this.resetForm("queryForm");
-      this.handleQuery();
+      this.resetForm('queryForm')
+      this.handleQuery()
     },
 
-    flashNotify(){
-      this.getList();
+    flashNotify() {
+      this.getList()
     },
     // 多选框选中数据
     handleSelectionChange(selection) {
       this.ids = selection.map(item => item.id)
-      if(this.filterMode == 2){
-        this.chatNames = selection.map(item => item.chatName);
+      if (this.filterMode == 2) {
+        this.chatNames = selection.map(item => item.chatName)
       }
-      this.single = selection.length!==1
+      this.single = selection.length !== 1
       this.multiple = !selection.length
     },
 
-    handleSelect(val){
-      val.filterMode = this.filterMode;
-      this.logsInfoDetailsOpen.title='企微账号:'+val.qwUserId+'  '+'营期时间:'+val.startTime+'  '+'天数:' + val.countDays;
-      this.logsInfoDetailsOpen.open=true;
-      const externalUserName = this.queryParams.externalUserName;
+    handleSelect(val) {
+      val.filterMode = this.filterMode
+      this.logsInfoDetailsOpen.title = '企微账号:' + val.qwUserId + '  ' + '营期时间:' + val.startTime + '  ' + '天数:' + val.countDays
+      this.logsInfoDetailsOpen.open = true
+      const externalUserName = this.queryParams.externalUserName
       setTimeout(() => {
-        this.$refs.SopUserLogsInfoDetails.selectSopUserLogsInfo(val, externalUserName);
-      }, 500);
+        this.$refs.SopUserLogsInfoDetails.selectSopUserLogsInfo(val, externalUserName)
+      }, 500)
 
     },
 
     handleRepairLogs(val) {
-      this.loading = true;
+      this.loading = true
       let loadingRock = this.$loading({
         lock: true,
         text: '正在修复中请稍后~~!!',
         spinner: 'el-icon-loading',
         background: 'rgba(0, 0, 0, 0.7)'
-      });
+      })
 
       repairSopUserLogs(val).then(res => {
-        this.msgSuccess("修复成功成功");
+        this.msgSuccess('修复成功成功')
       }).catch(res => {
       }).finally(res => {
-        loadingRock.close();
-        this.loading = false;
-        this.getList();
+        loadingRock.close()
+        this.loading = false
+        this.getList()
       })
 
     },
     /** 导出按钮操作 */
     handleExport() {
-      const queryParams = this.queryParams;
-      this.$confirm('是否确认导出所有sopUserLogs数据项?', "警告", {
-        confirmButtonText: "确定",
-        cancelButtonText: "取消",
-        type: "warning"
+      const queryParams = this.queryParams
+      this.$confirm('是否确认导出所有sopUserLogs数据项?', '警告', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
       }).then(() => {
-        this.exportLoading = true;
-        return exportSopUserLogs(queryParams);
+        this.exportLoading = true
+        return exportSopUserLogs(queryParams)
       }).then(response => {
-        this.download(response.msg);
-        this.exportLoading = false;
+        this.download(response.msg)
+        this.exportLoading = false
       }).catch(() => {
-      });
+      })
     },
     addGroup() {
-      this.addGroupData.open = true;
-      this.addGroupData.form = {date: new Date(), chatIds: []};
+      this.addGroupData.open = true
+      this.addGroupData.form = { date: new Date(), chatIds: [] }
     },
     updateGroupTime() {
-      this.updateTimeData.open = true;
-      this.updateTimeData.form = {date: new Date()};
+      this.updateTimeData.open = true
+      this.updateTimeData.form = { date: new Date() }
     },
     submitUpdateTimeForm() {
       let form = {
         date: this.updateTimeData.form.date,
-        ids: this.ids,
+        ids: this.ids
       }
-      updateLogDate(form).then(e => {
-        this.updateTimeData.open = false;
-        this.getList();
-      });
+      updateLogDate(form).then(response => {
+        if (response.data != null) {
+          this.msgInfo('部分时间已有营期:' + response.data)
+        }
+
+        this.updateTimeData.open = false
+        this.getList()
+      })
     },
     submitAddGroupForm() {
       let form = {
         id: this.queryParams.sopId,
         qwUserIds: this.userSelectList.join(),
         chatIds: this.addGroupData.form.chatIds.join(),
-        date: this.addGroupData.form.date,
+        date: this.addGroupData.form.date
       }
       addGroupChat(form).then(e => {
-        this.addGroupData.open = false;
-        this.getList();
-      });
+        this.addGroupData.open = false
+        this.getList()
+      })
     },
     handleCompanyUser() {
       setTimeout(() => {
-        this.$refs.QwUserList.getDetails(this.queryParams.corpId, this.queryParams.type, 2);
-      }, 1);
-      this.addGroupData.userOpen = true;
+        this.$refs.QwUserList.getDetails(this.queryParams.corpId, this.queryParams.type, 2)
+      }, 1)
+      this.addGroupData.userOpen = true
     },
     handleClosegroupUser(list) {
-      const index = this.userSelectList.findIndex(t => t === list);
+      const index = this.userSelectList.findIndex(t => t === list)
       if (index !== -1) {
-        this.userSelectList.splice(index, 1);
-        this.qwUserIds.splice(index, 1);
+        this.userSelectList.splice(index, 1)
+        this.qwUserIds.splice(index, 1)
         this.loadChatList()
       }
     },
     loadChatList() {
       chatListAll(this.qwUserIds.join(), this.queryParams.corpId, this.queryParams.sopId).then(e => {
-        this.addGroupData.selectChat = e.data;
+        this.addGroupData.selectChat = e.data
       })
     },
     selectUserList(list) {
-      this.addGroupData.userOpen = false;
+      this.addGroupData.userOpen = false
       list.forEach(obj => {
         if (!this.userSelectList.some(item => item == obj.id)) {
           console.info(this.userSelectList)
-          this.userSelectList.push(obj.id);
-          this.qwUserIds.push(obj.qwUserId);
+          this.userSelectList.push(obj.id)
+          this.qwUserIds.push(obj.qwUserId)
         }
-      });
+      })
       this.loadChatList()
 
-    },
+    }
   }
-};
+}
 </script>
 
 <style>