Bladeren bron

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

lmx 1 maand geleden
bovenliggende
commit
e6a070366f

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

@@ -39,6 +39,15 @@ export function addUserCourseVideo(data) {
   })
 }
 
+// 更新课程小节
+export function updateUserCourseVideoUpdate(data) {
+  return request({
+    url: '/course/userCourseVideo/update',
+    method: 'post',
+    data: data
+  })
+}
+
 // 修改课堂视频
 export function updateUserCourseVideo(data) {
   return request({

+ 181 - 22
src/views/components/course/userCourseCatalogDetails.vue

@@ -33,6 +33,9 @@
       <el-table-column label="上传时间" align="center" prop="createTime" />
       <el-table-column label="默认红包" align="center" prop="redPacketMoney" />
       <el-table-column label="公司红包" align="center" prop="companyRedPacketMoney" />
+      <el-table-column label="标签组名称" align="center" prop="tagGroupName" />
+      <el-table-column label="看课标签" align="center" prop="watchingTagName" />
+      <el-table-column label="完课标签" align="center" prop="watchedTagName" />
 
       <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
         <template slot-scope="scope">
@@ -49,12 +52,10 @@
             @click="updateMoney(scope.row)"
           >设置红包金额</el-button>
 
-<!--          <el-button-->
-<!--            size="mini"-->
-<!--            type="text"-->
-<!--            @click="openDialog(scope.row)"-->
-<!--            v-hasPermi="['course:courseLink:create']"-->
-<!--          >生成应急短链</el-button>-->
+          <el-button size="mini"
+                     type="text" @click="openTagDialog(scope.row)">
+            绑定看课标签
+          </el-button>
         </template>
       </el-table-column>
     </el-table>
@@ -72,6 +73,7 @@
       :visible.sync="open" append-to-body>
       <userCourseVideoDetails  ref="userCourseVideoDetails" />
     </el-drawer>
+
     <el-dialog title="设置红包金额" :visible.sync="moneyOpen" width="600px" append-to-body>
       <el-form ref="form"  label-width="100px">
         <el-form-item label="红包金额" prop="corpId">
@@ -108,34 +110,107 @@
         <el-button type="primary" @click="confirm">确认</el-button>
       </div>
     </el-dialog>
-<!--    <el-dialog title="设置红包金额" :visible.sync="moneyOpen" width="600px" append-to-body>-->
-<!--      <el-form ref="form"  label-width="100px">-->
-<!--        <el-form-item label="红包金额" prop="corpId">-->
-<!--          <el-input-number v-model="redPacketMoneyForm.redPacketMoney" :min="0.1" :max="200" :step="0.1" ></el-input-number>-->
-<!--        </el-form-item>-->
-<!--      </el-form>-->
-<!--      <div slot="footer" class="dialog-footer">-->
-<!--        <el-button @click="cancel">取 消</el-button>-->
-<!--      </div>-->
-<!--    </el-dialog>-->
+
+    <!-- 弹框 -->
+    <el-dialog
+      title="绑定看课标签"
+      :visible.sync="tagDialogVisible"
+      width="500px"
+      @closed="resetDialog"
+      append-to-body
+    >
+      <el-form :model="tagDialog" label-width="120px">
+        <!-- 标签组选择 -->
+        <el-form-item label="标签组" required>
+          <el-select
+            v-model="tagDialog.groupId"
+            placeholder="请选择标签组"
+            @change="onGroupChange"
+            filterable
+          >
+            <el-option
+              v-for="group in tagGroups"
+              :key="group.groupId"
+              :label="group.name"
+              :value="group.groupId"
+            />
+          </el-select>
+        </el-form-item>
+        <!-- 看课标签选择 -->
+        <el-form-item label="看课标签" required>
+          <el-select
+            v-model="tagDialog.watchTagId"
+            placeholder="请选择看课标签"
+            :disabled="!tagDialog.groupId"
+            @change="handleWatchingChange"
+            filterable
+          >
+            <el-option
+              v-for="tag in tagsInGroup"
+              :key="tag.tagId"
+              :label="tag.name"
+              :value="tag.tagId"
+            />
+          </el-select>
+        </el-form-item>
+        <!-- 完课标签选择 -->
+        <el-form-item label="完课标签" required>
+          <el-select
+            v-model="tagDialog.finishTagId"
+            placeholder="请选择完课标签"
+            :disabled="!tagDialog.groupId"
+            @change="handleWatchedChange"
+            filterable>
+            <el-option
+              v-for="tag in tagsInGroup"
+              :key="tag.tagId"
+              :label="tag.name"
+              :value="tag.tagId"
+            />
+          </el-select>
+        </el-form-item>
+      </el-form>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="cancelDialog">取消</el-button>
+        <el-button type="primary" @click="submitTagBinding">确定</el-button>
+      </span>
+    </el-dialog>
   </div>
 </template>
 
 <script>
-import { updatePacketMoney,getSort,getVideoListByCourseId,delUserCourseVideo,getUserCourseVideo,addUserCourseVideo,updateUserCourseVideo } from "@/api/course/userCourseVideo";
+import {getVideoListByCourseId, updatePacketMoney, updateUserCourseVideoUpdate} from "@/api/course/userCourseVideo";
 import userCourseVideoDetails from '../../components/course/userCourseVideoDetails.vue';
-import { createLinkUrl } from "@/api/course/sopCourseLink";
-import { userList } from "@/api/qw/user";
+import {createLinkUrl} from "@/api/course/sopCourseLink";
+import {listTagGroup} from "@/api/qw/tagGroup";
 
-import request from '@/utils/request'
-
-  export default {
+export default {
     name: "userCourseCatalog",
     components: {
       userCourseVideoDetails
     },
+    props: {
+      video: {
+        type: Object,
+        required: true,
+      },
+    },
     data() {
       return {
+        currentRow: null,
+        // 假设这里有当前课程小节的数据传入,里面含id等
+        tagDialogVisible: false,
+        tagGroups: [],
+        tagsInGroup: [],
+        tagDialog: {
+          videoId: null,
+          groupId: null,
+          watchTagId: null,
+          finishTagId: null,
+          tgId: null,
+          watchingTgId: null,
+          watchedTgId: null
+        },
         linkForm:{
           days:null,
           courseId:null,
@@ -218,6 +293,90 @@ import request from '@/utils/request'
       });
     },
     methods: {
+      handleWatchingChange(tagId){
+        this.tagDialog.watchingTgId = this.tagsInGroup.find(e => e.tagId === tagId)?.id;
+      },
+      handleWatchedChange(tagId){
+        this.tagDialog.watchedTgId = this.tagsInGroup.find(e => e.tagId === tagId)?.id;
+      },
+      openTagDialog(row) {
+        this.currentRow = row;
+        this.tagDialogVisible = true;
+        this.tagDialog.videoId = row.videoId;
+        this.tagDialog.groupId = this.currentRow.tagGroupId;
+        this.tagDialog.watchTagId = this.currentRow.watchingTagId;
+        this.tagDialog.finishTagId = this.currentRow.watchedTagId;
+
+
+        // 查询所有的标签组
+        listTagGroup({
+          pageNum: 1,
+          pageSize: 1000
+        }).then((res) => {
+          if(res.code === 200) {
+            this.tagGroups = res.rows;
+
+            let tagGroup = this.tagGroups.find(e=>e.groupId === this.currentRow.tagGroupId);
+            this.tagsInGroup = tagGroup.tag || [];
+          }
+        });
+      },
+      updateTagsInGroup(groupId) {
+        let tagGroup = this.tagGroups.find(e=> e.groupId === groupId);
+
+        this.tagsInGroup = tagGroup.tag || [];
+        // 切换组时清空标签选择
+        this.tagDialog.watchTagId = null;
+        this.tagDialog.finishTagId = null;
+        this.tagDialog.tgId = tagGroup.id;
+      },
+      onGroupChange(groupId) {
+        this.updateTagsInGroup(groupId);
+      },
+      cancelDialog() {
+        this.tagDialogVisible = false;
+        this.resetDialog();
+      },
+      resetDialog() {
+        this.tagDialog = {
+          videoId: null,
+          groupId: null,
+          watchTagId: null,
+          finishTagId: null,
+        };
+        this.tagGroups = [];
+        this.tagsInGroup = [];
+      },
+      submitTagBinding() {
+        // 使用表单校验
+        if(!this.tagDialog.groupId){
+          this.$message.warning("标签组必选!");
+          return;
+        }
+        if(!this.tagDialog.watchTagId){
+          this.$message.warning("看课标签必选!");
+          return;
+        }
+        if(!this.tagDialog.finishTagId){
+          this.$message.warning("完课标签必选!");
+          return;
+        }
+        this.currentRow.tagGroupId = this.tagDialog.groupId;
+        this.currentRow.watchingTagId = this.tagDialog.watchTagId;
+        this.currentRow.watchedTagId = this.tagDialog.finishTagId;
+
+        this.currentRow.watchingTgId = this.tagDialog.watchingTgId;
+        this.currentRow.watchedTgId = this.tagDialog.watchedTgId;
+        this.currentRow.tgId = this.tagDialog.tgId;
+
+        updateUserCourseVideoUpdate(this.currentRow).then(res=>{
+          this.$message.success("绑定成功");
+          this.resetDialog();
+          this.currentRow = null;
+          this.tagDialogVisible = false;
+          this.getList();
+        })
+      },
       // 打开弹框
       openDialog(row) {
         this.linkForm.courseId = row.courseId;

+ 120 - 38
src/views/qw/sop/deptSop.vue

@@ -104,6 +104,18 @@
         >删除
         </el-button>
       </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleSopLogsDelete"
+          v-hasPermi="['qw:sopLogs:removeAll']"
+        >批量删除执行任务
+        </el-button>
+      </el-col>
       <el-col :span="1.5">
         <el-button
           type="success"
@@ -128,6 +140,18 @@
         >批量执行SOP
         </el-button>
       </el-col>
+      <el-col :span="1.5">
+        <el-tooltip class="item" effect="dark" content="此功能用于给 选中的 SOP任务营期 内【所有的】客户发送 消息【或者发送草稿-/-清楚草稿】" placement="top">
+          <el-button
+            type="warning"
+            icon="el-icon-s-promotion"
+            size="mini"
+            :disabled="multiple"
+            @click="handleCampSendMsg"
+            v-hasPermi="['qw:sopUserLogsInfo:msgSop']"
+          >SOP营期一键群发(或草稿)</el-button>
+        </el-tooltip>
+      </el-col>
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
     <el-table v-loading="loading" border :data="sopList" @selection-change="handleSelectionChange">
@@ -313,6 +337,7 @@
       @pagination="getList"
     />
 
+    <send-msg-sop-open-tool ref="sendMsgSopOpenTool" ></send-msg-sop-open-tool>
     <!-- 添加或修改企微sop对话框 -->
     <el-dialog :title="title" :visible.sync="open" width="1000px" append-to-body>
       <el-form ref="form" :model="form" :rules="rules" label-width="100px">
@@ -734,7 +759,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 ">
 
@@ -853,7 +891,7 @@
 import {
   addSop,
   courseList,
-  delSop,
+  delSop, delSopLogs,
   exportSop,
   getSopVoiceList, listDeptSop,
   listSop,
@@ -873,10 +911,11 @@ import sopLogsDetails from '@/views/qw/sopLogs/sopLogsList.vue'
 import {listTag,} from "@/api/qw/tag";
 import {getMyQwCompanyList} from "@/api/qw/user";
 import {allList} from "@/api/qw/groupChat";
+import SendMsgSopOpenTool from '@/views/qw/sopUserLogsInfo/sendMsgSopOpenTool.vue'
 
 export default {
   name: "Sop",
-  components: {CustomerGroupDetails, qwUserList, ImageUpload, sopLogsDetails},
+  components: {CustomerGroupDetails, qwUserList, ImageUpload, sopLogsDetails, SendMsgSopOpenTool},
   data() {
     return {
       // 存储每一行的展开状态
@@ -1071,6 +1110,16 @@ export default {
     }
   },
   methods: {
+    /**
+     * SOP任务营期一键群发
+     */
+    handleCampSendMsg(){
+
+      setTimeout(() => {
+        this.$refs.sendMsgSopOpenTool.oneClickGroupSending(this.ids,2,this.queryParams.corpId);
+      }, 500);
+
+    },
     voice(id) {
       this.voiceForm.queryParams.id = id;
       getSopVoiceList(this.voiceForm.queryParams).then(res => {
@@ -1342,9 +1391,9 @@ export default {
       });
     },
 
-    addSetList() {
+    addSetList(){
       const newSetting = {
-        contentType: '1',
+        contentType:'1',
         value: '',
       };
       // 将新设置项添加到 content.setting 数组中
@@ -1355,7 +1404,7 @@ export default {
     handleContentTypeChange() {
 
       //如果是链接的才上
-      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++) {
           //响应式直接给链接的标题/封面上值
@@ -1363,6 +1412,9 @@ 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);
+          }
 
         }
 
@@ -1373,12 +1425,20 @@ export default {
 
         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);
+            }
+
           }
         }
       }
 
+
     },
     videoIdChange() {
       if (this.msgForm.videoId != null) {
@@ -1387,8 +1447,16 @@ export default {
 
         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);
+            }
+
+
           }
         }
       }
@@ -1420,7 +1488,7 @@ export default {
         createBy: null,
         createTime: null,
         isAutoSop: null,
-        autoSopTime: { autoSopType: 2, autoStartTime: '00:00', autoEndTime: '24:00', autoSopSend: 2 },
+        autoSopTime: {autoSopType: 2, autoStartTime: '00:00', autoEndTime: '24:00', autoSopSend: 2},
       };
       this.resetForm("form");
       this.tags = null;
@@ -1469,7 +1537,7 @@ export default {
         tempId: row.tempId,
         filterMode: row.filterMode,
         corpId: row.corpId,
-        type:1,
+        type: 1,
       }
       // 使用 params 传递参数
       this.$router.push({
@@ -1496,7 +1564,7 @@ export default {
         this.msgError(res.msg);
       }
     },
-    beforeAvatarUploadFile(file) {
+    beforeAvatarUploadFile(file){
       const isLt1M = file.size / 1024 / 1024 < 10;
       if (!isLt1M) {
         this.$message.error('上传大小不能超过 10MB!');
@@ -1510,7 +1578,7 @@ export default {
     },
 
     handleAvatarSuccessVideo(res, file, item) {
-      if (res.code == 200) {
+      if(res.code==200){
         // 使用 $set 确保响应式更新
         this.$set(item, 'videoUrl', res.url);
       } else {
@@ -1518,7 +1586,7 @@ export default {
       }
     },
 
-    beforeAvatarUploadVideo(file) {
+    beforeAvatarUploadVideo(file){
       const isLt30M = file.size / 1024 / 1024 < 10;
       const isMP4 = file.type === 'video/mp4';
 
@@ -1535,7 +1603,7 @@ export default {
       return true;
     },
 
-    handleInputVideoText(value, content) {
+    handleInputVideoText(value,content){
       // 允许的字符:中文、英文(大小写)、数字和指定标点符号(,。!?)
       const regex = /^[\u4e00-\u9fa5,。!?,!?]+$/;
 
@@ -1626,7 +1694,7 @@ export default {
         confirmButtonText: "确定",
         cancelButtonText: "取消",
         type: "warning"
-      }).then(function() {
+      }).then(function () {
         return delSop(ids);
       }).then(() => {
         this.getList();
@@ -1634,6 +1702,17 @@ export default {
       }).catch(() => {
       });
     },
+    /** 删除按钮操作 */
+    handleSopLogsDelete() {
+      this.$confirm('是否确认删除企微sop编号为"' + this.ids + '"的所有发送任务(执行记录)数据项?', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => delSopLogs(this.ids)).then(() => {
+        this.msgSuccess("删除成功");
+      }).catch(() => {
+      });
+    },
     /**
      * 批量执行SOP任务
      */
@@ -1706,32 +1785,32 @@ export default {
     /**
      * 一键群发
      */
-    handleSendMsg(row) {
+    handleSendMsg(row){
       this.sendMsgOpen.open = true;
       this.sendMsgOpen.id = row.id;
       this.sendMsgOpen.row = row;
       this.msgForm.chatIds = row.chatId.split(",");
     },
-    submitMsgForm() {
+    submitMsgForm(){
       this.$refs["msgForm"].validate(valid => {
         if (valid) {
-          this.msgForm.setting = JSON.stringify(this.setting)
-          this.msgForm.sopId = this.sendMsgOpen.row.id;
-          this.msgForm.corpId = this.sendMsgOpen.row.corpId;
-          this.msgForm.filterMode = this.sendMsgOpen.row.filterMode;
+          this.msgForm.setting=JSON.stringify(this.setting)
+          this.msgForm.sopId=this.sendMsgOpen.row.id;
+          this.msgForm.corpId=this.sendMsgOpen.row.corpId;
+          this.msgForm.filterMode=this.sendMsgOpen.row.filterMode;
 
           if (this.setting.length <= 0) {
             return this.$message.error("请添加规则")
           }
-          if (this.msgForm.courseId === null || this.msgForm.courseId === '') {
+          if (this.msgForm.courseId===null || this.msgForm.courseId===''){
             return this.$message.error("课程不能为空")
           }
 
-          if (this.msgForm.videoId === null || this.msgForm.videoId === '') {
+          if (this.msgForm.videoId===null || this.msgForm.videoId===''){
             return this.$message.error("课节不能为空")
           }
 
-          if (this.msgForm.courseType === null || this.msgForm.courseType === '') {
+          if (this.msgForm.courseType===null || this.msgForm.courseType===''){
             return this.$message.error("消息类型不能为空")
           }
 
@@ -1777,19 +1856,19 @@ export default {
           sendMsgSop(this.msgForm).then(response => {
             this.msgSuccess("一键群发成功");
             loading.close();
-            this.setting = [];
+            this.setting=[];
             this.msgForm = {
-              videoId: null,
-              courseId: null,
-              courseType: null,
-              setting: null,
-              isRegister: 2,
-              sendType: 1,
-              filterMode: 2,
+              videoId:null,
+              courseId:null,
+              courseType:null,
+              setting:null,
+              isRegister:2,
+              sendType:1,
+              filterMode:2,
 
             }
             this.getList();
-          }).finally(() => {
+          }).finally(()=>{
             loading.close();
           });
 
@@ -1805,6 +1884,9 @@ 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);
+          }
 
         }
 
@@ -1813,12 +1895,12 @@ export default {
         this.videoList = response.list;
       });
     },
-    cancelMsgForm() {
+    cancelMsgForm(){
       this.sendMsgOpen.open = false;
       this.resetSendMsgSop();
     },
-    delSetList(index) {
-      this.setting.splice(index, 1)
+    delSetList(index){
+      this.setting.splice(index,1)
     },
   }
 };

+ 107 - 25
src/views/qw/sop/mySop.vue

@@ -104,6 +104,18 @@
         >删除
         </el-button>
       </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleSopLogsDelete"
+          v-hasPermi="['qw:sopLogs:removeAll']"
+        >批量删除执行任务
+        </el-button>
+      </el-col>
       <el-col :span="1.5">
         <el-button
           type="success"
@@ -128,6 +140,18 @@
         >批量执行SOP
         </el-button>
       </el-col>
+      <el-col :span="1.5">
+        <el-tooltip class="item" effect="dark" content="此功能用于给 选中的 SOP任务营期 内【所有的】客户发送 消息【或者发送草稿-/-清楚草稿】" placement="top">
+          <el-button
+            type="warning"
+            icon="el-icon-s-promotion"
+            size="mini"
+            :disabled="multiple"
+            @click="handleCampSendMsg"
+            v-hasPermi="['qw:sopUserLogsInfo:msgSop']"
+          >SOP营期一键群发(或草稿)</el-button>
+        </el-tooltip>
+      </el-col>
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
     <el-table v-loading="loading" border :data="sopList" @selection-change="handleSelectionChange">
@@ -313,6 +337,7 @@
       @pagination="getList"
     />
 
+    <send-msg-sop-open-tool ref="sendMsgSopOpenTool" ></send-msg-sop-open-tool>
     <!-- 添加或修改企微sop对话框 -->
     <el-dialog :title="title" :visible.sync="open" width="1000px" append-to-body>
       <el-form ref="form" :model="form" :rules="rules" label-width="100px">
@@ -734,7 +759,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 ">
 
@@ -853,7 +891,7 @@
 import {
   addSop,
   courseList,
-  delSop,
+  delSop, delSopLogs,
   exportSop,
   getSopVoiceList, listMySop,
   listSop,
@@ -873,10 +911,11 @@ import sopLogsDetails from '@/views/qw/sopLogs/sopLogsList.vue'
 import {listTag,} from "@/api/qw/tag";
 import {getMyQwCompanyList} from "@/api/qw/user";
 import {allList} from "@/api/qw/groupChat";
+import SendMsgSopOpenTool from '@/views/qw/sopUserLogsInfo/sendMsgSopOpenTool.vue'
 
 export default {
   name: "Sop",
-  components: {CustomerGroupDetails, qwUserList, ImageUpload, sopLogsDetails},
+  components: {CustomerGroupDetails, qwUserList, ImageUpload, sopLogsDetails, SendMsgSopOpenTool},
   data() {
     return {
       // 存储每一行的展开状态
@@ -1071,6 +1110,16 @@ export default {
     }
   },
   methods: {
+    /**
+     * SOP任务营期一键群发
+     */
+    handleCampSendMsg(){
+
+      setTimeout(() => {
+        this.$refs.sendMsgSopOpenTool.oneClickGroupSending(this.ids,2,this.queryParams.corpId);
+      }, 500);
+
+    },
     voice(id) {
       this.voiceForm.queryParams.id = id;
       getSopVoiceList(this.voiceForm.queryParams).then(res => {
@@ -1342,9 +1391,9 @@ export default {
       });
     },
 
-    addSetList() {
+    addSetList(){
       const newSetting = {
-        contentType: '1',
+        contentType:'1',
         value: '',
       };
       // 将新设置项添加到 content.setting 数组中
@@ -1355,7 +1404,7 @@ export default {
     handleContentTypeChange() {
 
       //如果是链接的才上
-      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++) {
           //响应式直接给链接的标题/封面上值
@@ -1363,6 +1412,9 @@ 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);
+          }
 
         }
 
@@ -1373,12 +1425,20 @@ export default {
 
         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);
+            }
+
           }
         }
       }
 
+
     },
     videoIdChange() {
       if (this.msgForm.videoId != null) {
@@ -1387,8 +1447,16 @@ export default {
 
         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);
+            }
+
+
           }
         }
       }
@@ -1420,7 +1488,7 @@ export default {
         createBy: null,
         createTime: null,
         isAutoSop: null,
-        autoSopTime: { autoSopType: 2, autoStartTime: '00:00', autoEndTime: '24:00', autoSopSend: 2 },
+        autoSopTime: {autoSopType: 2, autoStartTime: '00:00', autoEndTime: '24:00', autoSopSend: 2},
       };
       this.resetForm("form");
       this.tags = null;
@@ -1496,7 +1564,7 @@ export default {
         this.msgError(res.msg);
       }
     },
-    beforeAvatarUploadFile(file) {
+    beforeAvatarUploadFile(file){
       const isLt1M = file.size / 1024 / 1024 < 10;
       if (!isLt1M) {
         this.$message.error('上传大小不能超过 10MB!');
@@ -1510,7 +1578,7 @@ export default {
     },
 
     handleAvatarSuccessVideo(res, file, item) {
-      if (res.code == 200) {
+      if(res.code==200){
         // 使用 $set 确保响应式更新
         this.$set(item, 'videoUrl', res.url);
       } else {
@@ -1518,7 +1586,7 @@ export default {
       }
     },
 
-    beforeAvatarUploadVideo(file) {
+    beforeAvatarUploadVideo(file){
       const isLt30M = file.size / 1024 / 1024 < 10;
       const isMP4 = file.type === 'video/mp4';
 
@@ -1535,7 +1603,7 @@ export default {
       return true;
     },
 
-    handleInputVideoText(value, content) {
+    handleInputVideoText(value,content){
       // 允许的字符:中文、英文(大小写)、数字和指定标点符号(,。!?)
       const regex = /^[\u4e00-\u9fa5,。!?,!?]+$/;
 
@@ -1626,7 +1694,7 @@ export default {
         confirmButtonText: "确定",
         cancelButtonText: "取消",
         type: "warning"
-      }).then(function() {
+      }).then(function () {
         return delSop(ids);
       }).then(() => {
         this.getList();
@@ -1634,6 +1702,17 @@ export default {
       }).catch(() => {
       });
     },
+    /** 删除按钮操作 */
+    handleSopLogsDelete() {
+      this.$confirm('是否确认删除企微sop编号为"' + this.ids + '"的所有发送任务(执行记录)数据项?', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => delSopLogs(this.ids)).then(() => {
+        this.msgSuccess("删除成功");
+      }).catch(() => {
+      });
+    },
     /**
      * 批量执行SOP任务
      */
@@ -1706,32 +1785,32 @@ export default {
     /**
      * 一键群发
      */
-    handleSendMsg(row) {
+    handleSendMsg(row){
       this.sendMsgOpen.open = true;
       this.sendMsgOpen.id = row.id;
       this.sendMsgOpen.row = row;
       this.msgForm.chatIds = row.chatId.split(",");
     },
-    submitMsgForm() {
+    submitMsgForm(){
       this.$refs["msgForm"].validate(valid => {
         if (valid) {
-          this.msgForm.setting = JSON.stringify(this.setting)
-          this.msgForm.sopId = this.sendMsgOpen.row.id;
-          this.msgForm.corpId = this.sendMsgOpen.row.corpId;
-          this.msgForm.filterMode = this.sendMsgOpen.row.filterMode;
+          this.msgForm.setting=JSON.stringify(this.setting)
+          this.msgForm.sopId=this.sendMsgOpen.row.id;
+          this.msgForm.corpId=this.sendMsgOpen.row.corpId;
+          this.msgForm.filterMode=this.sendMsgOpen.row.filterMode;
 
           if (this.setting.length <= 0) {
             return this.$message.error("请添加规则")
           }
-          if (this.msgForm.courseId === null || this.msgForm.courseId === '') {
+          if (this.msgForm.courseId===null || this.msgForm.courseId===''){
             return this.$message.error("课程不能为空")
           }
 
-          if (this.msgForm.videoId === null || this.msgForm.videoId === '') {
+          if (this.msgForm.videoId===null || this.msgForm.videoId===''){
             return this.$message.error("课节不能为空")
           }
 
-          if (this.msgForm.courseType === null || this.msgForm.courseType === '') {
+          if (this.msgForm.courseType===null || this.msgForm.courseType===''){
             return this.$message.error("消息类型不能为空")
           }
 
@@ -1805,6 +1884,9 @@ 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);
+          }
 
         }