Sfoglia il codice sorgente

同步企微聊天、企微员工代码

Long 3 settimane fa
parent
commit
b0d6835c5b
3 ha cambiato i file con 772 aggiunte e 669 eliminazioni
  1. 87 4
      src/api/qw/user.js
  2. 446 446
      src/views/qw/qwChat/qq.vue
  3. 239 219
      src/views/qw/user/index.vue

+ 87 - 4
src/api/qw/user.js

@@ -81,6 +81,12 @@ export function addQwUser(id) {
     method: 'post',
   })
 }
+export function addQwUserName(id) {
+  return request({
+    url: '/qw/user/syncName/' + id,
+    method: 'post',
+  })
+}
 // 修改企微用户
 export function updateUser(data) {
   return request({
@@ -143,8 +149,23 @@ export function exportUser(query) {
     params: query
   })
 }
-
-
+/**
+ * 登录企业微信(发起登录)
+ */
+export function getQwIpad(data) {
+  return request({
+    url: '/qw/user/getQwIpad',
+    method: 'post',
+    data: data
+  })
+}
+export function delQwIpad(data) {
+  return request({
+    url: '/qw/user/delQwIpad',
+    method: 'post',
+    data: data
+  })
+}
 /**
  * 登录企业微信(发起登录)
  */
@@ -155,6 +176,55 @@ export function loginQwCode(data) {
     data: data
   })
 }
+/**
+ * 登录企业微信(发起登录)
+ */
+export function loginQwIpad(data) {
+  return request({
+    url: '/qw/user/loginQwIpad',
+    method: 'post',
+    data: data
+  })
+}
+
+/**
+ * 获取登录状态
+ */
+export function qrCodeStatus(data) {
+  return request({
+    url: '/qw/user/qrCodeStatus',
+    method: 'post',
+    data: data
+  })
+}
+export function qrCodeVerify(data) {
+  return request({
+    url: '/qw/user/qrCodeVerify',
+    method: 'post',
+    data: data
+  })
+}
+export function outLoginQwIpad(data) {
+  return request({
+    url: '/qw/user/outLoginQwIpad',
+    method: 'post',
+    data: data
+  })
+}
+export function twoCode(data) {
+  return request({
+    url: '/qw/user/twoCode',
+    method: 'post',
+    data: data
+  })
+}
+export function twoCodeStatus(data) {
+  return request({
+    url: '/qw/user/twoCodeStatus',
+    method: 'post',
+    data: data
+  })
+}
 /**
  * 取redis里的登录二维码
  */
@@ -229,8 +299,8 @@ export function handleInputAuthAppKey(data) {
 }
 
 /**
-* 企业微信员工账号 绑定 云主机
-*/
+ * 企业微信员工账号 绑定 云主机
+ */
 export function qwBindCloudHost(appkey) {
   return request({
     url: '/qw/user/qwBindCloudHost/'+appkey,
@@ -257,3 +327,16 @@ export function selectCloudAP(data) {
     data: data
   })
 }
+
+/**
+ * 模糊查询企微用户列表
+ * @param params 参数
+ * @returns {*}
+ */
+export function getQwUserListLikeName(params) {
+  return request({
+    url: '/qw/user/getQwUserListLikeName',
+    method: 'get',
+    params: params
+  })
+}

+ 446 - 446
src/views/qw/qwChat/qq.vue

@@ -1,130 +1,130 @@
 <template>
   <div class="app-container">
 
-      <el-select filterable v-model="qwUserId"  @change="qwUserChange" placeholder="请选择企微账号" clearable size="small">
-        <el-option
-          v-for="item in qwUserList"
-          :key="item.id"
-          :label="item.qwUserId"
-          :value="item.id">
-        </el-option>
-      </el-select>
-
-      <div class="imui-center qq-lemon-imui" v-show="showQW">
-        <lemon-imui  class="lemon-slot"
-          :width="windowWidth"
-          :height="windowHeight"
-          :user="UserData"
-           ref="IMUI"
-          :contact-contextmenu="contactContextmenu"
-          :theme="theme"
-          :hide-menu="hideMenu"
-          :hide-menu-avatar="hideMenuAvatar"
-          :hide-message-name="hideMessageName"
-          :hide-message-time="hideMessageTime"
-          :messageTimeFormat="messageTimeFormat"
-          @change-menu="handleChangeMenu"
-          @pull-messages="handlePullMessages"
-          @change-contact="handleChangeContact"
-          @change-conversation="handleChangeConversation"
-          @message-click="handleMessageClick"
-          @menu-avatar-click="handleMenuAvatarClick"
-          @pick-image="handleImageClick"
-          @send="handleSend">
-          <template #cover>
-                <div class="cover">
-                    <!-- <i class="lemon-icon-message"></i>
-                    <p>
-                        <b>自定义封面 Lemon</b>IMUI
-                    </p> -->
-                </div>
-          </template>
-          <template #message-title="contact">
-            <div>
-                <div style="display:flex;justify-content:space-between">
-                    <span>{{contact.displayName}}</span>
-                    <span style="font-size:12px;">
+    <el-select filterable v-model="qwUserId"  @change="qwUserChange" placeholder="请选择企微账号" clearable size="small">
+      <el-option
+        v-for="item in qwUserList"
+        :key="item.id"
+        :label="item.qwUserId"
+        :value="item.id">
+      </el-option>
+    </el-select>
+
+    <div class="imui-center qq-lemon-imui" v-show="showQW">
+      <lemon-imui  class="lemon-slot"
+                   :width="windowWidth"
+                   :height="windowHeight"
+                   :user="UserData"
+                   ref="IMUI"
+                   :contact-contextmenu="contactContextmenu"
+                   :theme="theme"
+                   :hide-menu="hideMenu"
+                   :hide-menu-avatar="hideMenuAvatar"
+                   :hide-message-name="hideMessageName"
+                   :hide-message-time="hideMessageTime"
+                   :messageTimeFormat="messageTimeFormat"
+                   @change-menu="handleChangeMenu"
+                   @pull-messages="handlePullMessages"
+                   @change-contact="handleChangeContact"
+                   @change-conversation="handleChangeConversation"
+                   @message-click="handleMessageClick"
+                   @menu-avatar-click="handleMenuAvatarClick"
+                   @pick-image="handleImageClick"
+                   @send="handleSend">
+        <template #cover>
+          <div class="cover">
+            <!-- <i class="lemon-icon-message"></i>
+            <p>
+                <b>自定义封面 Lemon</b>IMUI
+            </p> -->
+          </div>
+        </template>
+        <template #message-title="contact">
+          <div>
+            <div style="display:flex;justify-content:space-between">
+              <span>{{contact.displayName}}</span>
+              <span style="font-size:12px;">
                       <el-button size="mini"  @click="openDrawer('right')">侧边栏</el-button>
-<!--                      <span style="cursor:pointer;"  @click="openDrawer('right')">-->
-<!--                        右侧  |-->
-<!--                      </span>-->
-<!--                      <span style="cursor:pointer;" @click="openDrawer('rightInside')">-->
-<!--                        右侧内部  |-->
-<!--                      </span>-->
-<!--                      <span style="cursor:pointer;" @click="openDrawer('center')">-->
-<!--                        居中-->
-<!--                      </span>-->
+                <!--                      <span style="cursor:pointer;"  @click="openDrawer('right')">-->
+                <!--                        右侧  |-->
+                <!--                      </span>-->
+                <!--                      <span style="cursor:pointer;" @click="openDrawer('rightInside')">-->
+                <!--                        右侧内部  |-->
+                <!--                      </span>-->
+                <!--                      <span style="cursor:pointer;" @click="openDrawer('center')">-->
+                <!--                        居中-->
+                <!--                      </span>-->
                     </span>
-                 </div>
-                  <div v-if="contact.isGroup" class="slot-group-menu">
-                      <span>聊天</span>
-                      <span>公告</span>
-                      <span>相册</span>
-                      <span>文件</span>
-                      <span>活动</span>
-                      <span>设置(左键弹出菜单)</span>
-                </div>
             </div>
-          </template>
-
-          <template #sidebar-contact-fixedtop="contact">
-            <div class="slot-contact-fixedtop">
-              <el-input size="mini" class="slot-search" placeholder="搜索通讯录" />
+            <div v-if="contact.isGroup" class="slot-group-menu">
+              <span>聊天</span>
+              <span>公告</span>
+              <span>相册</span>
+              <span>文件</span>
+              <span>活动</span>
+              <span>设置(左键弹出菜单)</span>
+            </div>
+          </div>
+        </template>
+
+        <template #sidebar-contact-fixedtop="contact">
+          <div class="slot-contact-fixedtop">
+            <el-input size="mini" class="slot-search" placeholder="搜索通讯录" />
+          </div>
+        </template>
+
+        <template #sidebar-message-fixedtop="message">
+          <div class="slot-message-fixedtop">
+            <el-input size="mini" v-model="contactName" class="slot-search" placeholder="搜索" />
+          </div>
+        </template>
+
+        <template #message-side="contact">
+          <div v-if="contact.isGroup" class="slot-group">
+            <div class="slot-group-title">群通知</div>
+            <div class="slot-group-notice">
+              进群请改备注,格式,工作地点-姓名,请大家配合谢谢
             </div>
-          </template>
+            <div class="slot-group-title">群成员</div>
+            <div class="slot-group-panel">
+              <input class="slot-search" placeholder="搜索群成员" />
+              <div class="slot-group-member">
+                <div class="avatar"><img src="https://p.qqan.com/up/2020-2/2020022821001845128.jpg"></div>
+                <div class="name">像梦一样自由</div>
+              </div>
+              <div class="slot-group-member">
+                <div class="avatar"><img src="https://p.qqan.com/up/2018-4/15244505348390471.jpg"></div>
+                <div class="name">野火</div>
+              </div>
+              <div class="slot-group-member">
+                <div class="avatar"><img src="https://p.qqan.com/up/2021-1/20211411391666.jpg"></div>
+                <div class="name">霸王花</div>
+              </div>
+              <div class="slot-group-member">
+                <div class="avatar"><img src="https://p.qqan.com/up/2021-1/2021113104111220.jpg"></div>
+                <div class="name">森系Style</div>
+              </div>
 
-          <template #sidebar-message-fixedtop="message">
-            <div class="slot-message-fixedtop">
-              <el-input size="mini" v-model="contactName" class="slot-search" placeholder="搜索" />
             </div>
-          </template>
-
-         <template #message-side="contact">
-              <div v-if="contact.isGroup" class="slot-group">
-                    <div class="slot-group-title">群通知</div>
-                    <div class="slot-group-notice">
-                      进群请改备注,格式,工作地点-姓名,请大家配合谢谢
-                    </div>
-                    <div class="slot-group-title">群成员</div>
-                    <div class="slot-group-panel">
-                      <input class="slot-search" placeholder="搜索群成员" />
-                      <div class="slot-group-member">
-                        <div class="avatar"><img src="https://p.qqan.com/up/2020-2/2020022821001845128.jpg"></div>
-                        <div class="name">像梦一样自由</div>
-                      </div>
-                      <div class="slot-group-member">
-                        <div class="avatar"><img src="https://p.qqan.com/up/2018-4/15244505348390471.jpg"></div>
-                        <div class="name">野火</div>
-                      </div>
-                      <div class="slot-group-member">
-                        <div class="avatar"><img src="https://p.qqan.com/up/2021-1/20211411391666.jpg"></div>
-                        <div class="name">霸王花</div>
-                      </div>
-                       <div class="slot-group-member">
-                        <div class="avatar"><img src="https://p.qqan.com/up/2021-1/2021113104111220.jpg"></div>
-                        <div class="name">森系Style</div>
-                      </div>
-
-                    </div>
-               </div>
-          </template>
-        </lemon-imui>
-      </div>
-
-      <el-dialog :visible.sync="dialogVisible" append-to-body width="35%">
-         <img style="width:100%;height:auto" :src="dialogImageUrl" alt="" />
-      </el-dialog>
-
-       <el-dialog :visible.sync="dialogVideoVisible"
+          </div>
+        </template>
+      </lemon-imui>
+    </div>
+
+    <el-dialog :visible.sync="dialogVisible" append-to-body width="35%">
+      <img style="width:100%;height:auto" :src="dialogImageUrl" alt="" />
+    </el-dialog>
+
+    <el-dialog :visible.sync="dialogVideoVisible"
                :close-on-click-modal="false"
                :destroy-on-close="true"
                :width="aplayer.pWidth"
                :height="aplayer.height"
                @close="dialogVideoVisible=false"
                ref="player">
-          <videoPlayer  :width="aplayer.width" :height="aplayer.height"  :videoWidth="aplayer.videoWidth"  :videoHeight="aplayer.videoHeight"   :vid="aplayer.vid"  :autoplay="true"
-            :source="dialogVideoUrl" :cover="dialogVideoCover" ref="player"></videoPlayer>
-         </el-dialog>
+      <videoPlayer  :width="aplayer.width" :height="aplayer.height"  :videoWidth="aplayer.videoWidth"  :videoHeight="aplayer.videoHeight"   :vid="aplayer.vid"  :autoplay="true"
+                    :source="dialogVideoUrl" :cover="dialogVideoCover" ref="player"></videoPlayer>
+    </el-dialog>
 
 
   </div>
@@ -237,11 +237,11 @@ export default {
       windowWidth: document.documentElement.clientWidth*0.6,  //实时屏幕宽度
       windowHeight: document.documentElement.clientHeight*0.7,   //实时屏幕高度
       queryParams: {
-          pageNum: 1,
-          pageSize: 10,
-          conversationId: null,
-          userId:null
-        },
+        pageNum: 1,
+        pageSize: 10,
+        conversationId: null,
+        userId:null
+      },
     };
   },
   created(){
@@ -273,37 +273,37 @@ export default {
     this.showQW=true;
 
     const contactData1 = {
-            id: "contact-1",
-            displayName: "工作协作群",
-            avatar: "http://upload.qqbodys.com/img/weixin/20170804/ji5qxg1am5ztm.jpg",
-            index: "[1]群组",
-            unread: 0,
-            lastSendTime: 1566047865417,
-            lastContent: "2",
+      id: "contact-1",
+      displayName: "工作协作群",
+      avatar: "http://upload.qqbodys.com/img/weixin/20170804/ji5qxg1am5ztm.jpg",
+      index: "[1]群组",
+      unread: 0,
+      lastSendTime: 1566047865417,
+      lastContent: "2",
     };
     const contactData2 = {
-            id: "contact-2",
-            displayName: "自定义内容",
-            avatar: "http://upload.qqbodys.com/img/weixin/20170807/jibfvfd00npin.jpg",
-            //index: "Z",
-            click(next) {
-                next();
-            },
-            renderContainer: () => {
-                return <h1 style="text-indent:20px">自定义页面</h1>;
-            },
-            lastSendTime: 1345209465000,
-            lastContent: "12312",
-            unread: 2,
+      id: "contact-2",
+      displayName: "自定义内容",
+      avatar: "http://upload.qqbodys.com/img/weixin/20170807/jibfvfd00npin.jpg",
+      //index: "Z",
+      click(next) {
+        next();
+      },
+      renderContainer: () => {
+        return <h1 style="text-indent:20px">自定义页面</h1>;
+      },
+      lastSendTime: 1345209465000,
+      lastContent: "12312",
+      unread: 2,
     };
     const contactData3 = {
-            id: "contact-3",
-            displayName: "铁牛",
-            avatar: "http://upload.qqbodys.com/img/weixin/20170803/jiq4nzrkrnd0e.jpg",
-            index: "T",
-            unread: 32,
-            lastSendTime: 3,
-            lastContent: "你好123",
+      id: "contact-3",
+      displayName: "铁牛",
+      avatar: "http://upload.qqbodys.com/img/weixin/20170803/jiq4nzrkrnd0e.jpg",
+      index: "T",
+      unread: 32,
+      lastSendTime: 3,
+      lastContent: "你好123",
     };
     const IMUI = this.$refs.IMUI;
 
@@ -359,63 +359,63 @@ export default {
 
   methods: {
     initSocket(appKey) {
-         let that=this;
-         if(!!this.qwIm.socket){
-            this.qwIm.initSocket(appKey,true);
-            // 监听socket连接
-            this.qwIm.socket.onopen = function() {
-                console.log("socket 连接成功...");
-            };
-            this.qwIm.socket.onerror = function() {
-                console.log("连接错误")
-            };
-            // 监听socket消息
-            const IMUI = this.$refs.IMUI;
-            this.qwIm.socket.onmessage = function(res) {
-                 var data=JSON.parse(res.data);
-                 console.log("收到服务端内容", JSON.stringify(data));
-                  if(data.cmd=="heartbeat"){ //收到心跳数据不处理
-                      console.log("heartbeat");
-                  }
-                  //接收消息
-                  if(data.cmd=="receiveMsg"){
-                       var msgData=JSON.parse(data.data);
-                        console.log("收到消息:>>>>>",msgData)
-                       if(!IMUI.hasConversation(msgData.toContactId)){  //收到新消息时是最新的会话,添加该会话
-                              let queryParams={conversationId:msgData.toContactId,userId:that.qwUser.userId};
-                              getConversation(queryParams).then(response => {
-                                    if(response.code==200){
-                                        var conversation=response.data;
-                                        IMUI.appendConversation(conversation);
-                                        that.appendMessageAction(msgData);
-                                    }
-                             });
-                       }else{
-                            that.appendMessageAction(msgData);
-                            let conversation=IMUI.findConversation(msgData.toContactId);
-                            IMUI.topPopConversations(conversation);
-                            let queryParams={conversationId:msgData.toContactId,userId:that.qwUser.id};
-                            // getConversation(queryParams).then(response => {
-                            //       if(response.code==200){
-                            //           var conversation=response.data;
-                            //           var unread=conversation.unread;
-                            //           if(!unread){
-                            //              conversation.unread=1;
-                            //           }else{
-                            //             conversation.unread+=1;
-                            //           }
-                            //           IMUI.topPopConversations(conversation);
-                            //
-                            //       }
-                            //  });
-                       }
-                  }
-            };
-            //监听socket重连
-            this.qwIm.socket.onreconnect = function(res) {
-                console.log("socket 断线重连...")
-            };
-        }
+      let that=this;
+      if(!!this.qwIm.socket){
+        this.qwIm.initSocket(appKey,true);
+        // 监听socket连接
+        this.qwIm.socket.onopen = function() {
+          console.log("socket 连接成功...");
+        };
+        this.qwIm.socket.onerror = function() {
+          console.log("连接错误")
+        };
+        // 监听socket消息
+        const IMUI = this.$refs.IMUI;
+        this.qwIm.socket.onmessage = function(res) {
+          var data=JSON.parse(res.data);
+          console.log("收到服务端内容", JSON.stringify(data));
+          if(data.cmd=="heartbeat"){ //收到心跳数据不处理
+            console.log("heartbeat");
+          }
+          //接收消息
+          if(data.cmd=="receiveMsg"){
+            var msgData=JSON.parse(data.data);
+            console.log("收到消息:>>>>>",msgData)
+            if(!IMUI.hasConversation(msgData.toContactId)){  //收到新消息时是最新的会话,添加该会话
+              let queryParams={conversationId:msgData.toContactId,userId:that.qwUser.userId};
+              getConversation(queryParams).then(response => {
+                if(response.code==200){
+                  var conversation=response.data;
+                  IMUI.appendConversation(conversation);
+                  that.appendMessageAction(msgData);
+                }
+              });
+            }else{
+              that.appendMessageAction(msgData);
+              let conversation=IMUI.findConversation(msgData.toContactId);
+              IMUI.topPopConversations(conversation);
+              let queryParams={conversationId:msgData.toContactId,userId:that.qwUser.id};
+              // getConversation(queryParams).then(response => {
+              //       if(response.code==200){
+              //           var conversation=response.data;
+              //           var unread=conversation.unread;
+              //           if(!unread){
+              //              conversation.unread=1;
+              //           }else{
+              //             conversation.unread+=1;
+              //           }
+              //           IMUI.topPopConversations(conversation);
+              //
+              //       }
+              //  });
+            }
+          }
+        };
+        //监听socket重连
+        this.qwIm.socket.onreconnect = function(res) {
+          console.log("socket 断线重连...")
+        };
+      }
 
 
     },
@@ -438,49 +438,49 @@ export default {
 
     getContacts(){
       getContactsByUser(this.qwUser.id).then(response => {
-           this.contactData = response.data;
-           this.$refs.IMUI.initContacts(this.contactData);
-           //console.log("qxj request contactData:"+JSON.stringify(this.contactData));
+        this.contactData = response.data;
+        this.$refs.IMUI.initContacts(this.contactData);
+        //console.log("qxj request contactData:"+JSON.stringify(this.contactData));
       });
     },
     getConversation(){
       let that=this;
       const IMUI = this.$refs.IMUI;
       getConversations(this.qwUser.id).then(response => {
-           this.conversationData = response.data;
-           IMUI.initConversations(response.data);
-           var fstConversation=this.conversationData[0];
-           // console.log("qxj fstConversation:"+JSON.stringify(fstConversation));
-           if(fstConversation) {
-             IMUI.changeContact(fstConversation.conversationId);
-             // setTimeout(() => {
-             //      IMUI.changeContact(1688856679458971);
-             // }, 500);
-           }
-           //console.log("qxj request conversation:"+JSON.stringify(response.data));
+        this.conversationData = response.data;
+        IMUI.initConversations(response.data);
+        var fstConversation=this.conversationData[0];
+        // console.log("qxj fstConversation:"+JSON.stringify(fstConversation));
+        if(fstConversation) {
+          IMUI.changeContact(fstConversation.conversationId);
+          // setTimeout(() => {
+          //      IMUI.changeContact(1688856679458971);
+          // }, 500);
+        }
+        //console.log("qxj request conversation:"+JSON.stringify(response.data));
       });
     },
     messageTimeFormat(time) {
       return this.friendlyDate(time);
     },
     changeTheme() {
-       this.theme = this.theme == "default" ? "blue" : "default";
+      this.theme = this.theme == "default" ? "blue" : "default";
     },
     scrollToTop() {
       document.body.scrollIntoView();
     },
     openDrawer(position) {
-            const IMUI = this.$refs.IMUI;
-            const params = {
-                position,
-                render: contact => {
-                return (
-                    <div style="padding:15px">
-                    <h5>{contact.displayName}</h5>
-                    <span style="cursor:pointer;" on-click={IMUI.closeDrawer}>关闭侧边栏</span>
-                    </div>
-                );
-                },
+      const IMUI = this.$refs.IMUI;
+      const params = {
+        position,
+        render: contact => {
+          return (
+            <div style="padding:15px">
+              <h5>{contact.displayName}</h5>
+              <span style="cursor:pointer;" on-click={IMUI.closeDrawer}>关闭侧边栏</span>
+            </div>
+          );
+        },
       };
       // if (position == "center") {
       //   params.width = "50%";
@@ -492,18 +492,18 @@ export default {
       IMUI.openDrawer(params);
     },
     handlePullMessages(contact, next,instance) {
-       const { IMUI } = this.$refs;
-       let isEnd = false;
-       getMessageList(this.queryParams).then(response => {
-          if(response.code==200){
-            isEnd=response.data.isLastPage;
-            next(response.data.list, isEnd);
-            if(!isEnd){
-              pages[contact.conversationId]++;
-              this.queryParams.pageNum=pages[contact.conversationId];
-              this.queryParams.userId = this.qwUser.id
-            }
+      const { IMUI } = this.$refs;
+      let isEnd = false;
+      getMessageList(this.queryParams).then(response => {
+        if(response.code==200){
+          isEnd=response.data.isLastPage;
+          next(response.data.list, isEnd);
+          if(!isEnd){
+            pages[contact.conversationId]++;
+            this.queryParams.pageNum=pages[contact.conversationId];
+            this.queryParams.userId = this.qwUser.id
           }
+        }
       });
       // setTimeout(() => {
       //       let isEnd = true;
@@ -512,18 +512,18 @@ export default {
 
     },
     handleChangeConversation(conversation, instance) {
-        //console.log("qxj ChangeConversation:"+JSON.stringify(conversation));
-        if (!pages[conversation.conversationId]){
-            pages[conversation.conversationId] =1;
-        }
-       this.queryParams.pageNum=pages[conversation.conversationId];
-       this.queryParams.conversationId=conversation.conversationId;
-       this.queryParams.userId = this.qwUser.id
-       if(conversation.unread>0){
-          conversation.unread=0;
-          instance.updateContact(conversation);
-       }
-       // instance.closeDrawer();
+      //console.log("qxj ChangeConversation:"+JSON.stringify(conversation));
+      if (!pages[conversation.conversationId]){
+        pages[conversation.conversationId] =1;
+      }
+      this.queryParams.pageNum=pages[conversation.conversationId];
+      this.queryParams.conversationId=conversation.conversationId;
+      this.queryParams.userId = this.qwUser.id
+      if(conversation.unread>0){
+        conversation.unread=0;
+        instance.updateContact(conversation);
+      }
+      // instance.closeDrawer();
     },
     handleChangeContact(contact, instance) {
 
@@ -531,62 +531,62 @@ export default {
 
     //收到消息后添加消息显示
     appendMessageAction(msgData){
-          if(msgData.type=="text" || msgData.type=="image" || msgData.type=="voice"){     //文本   text  image  video  voice
-              const message = {
-                    id: msgData.id,
-                    status: msgData.status,
-                    type: msgData.type,
-                    sendTime: msgData.sendTime,
-                    content: msgData.content,
-                    params1: "1",
-                    params2: "2",
-                    toContactId: msgData.toContactId,
-                    fromUser: msgData.fromUser,
-              };
-              this.appendRemoteMessage(message);
-           }
-           else if(msgData.type=="file"){
-               const message = {
-                    id: msgData.id,
-                    status: msgData.status,
-                    type: msgData.type,
-                    sendTime: msgData.sendTime,
-                    content: msgData.content,
-                    toContactId: msgData.toContactId,
-                    fromUser: msgData.fromUser,
-                    fileName:msgData.fileName,
-                    fileSize:msgData.fileSize
-              };
-              this.appendRemoteMessage(message);
-           }
-           else{
-              const message = {
-                    id: msgData.id,
-                    status: msgData.status,
-                    type: msgData.type,
-                    sendTime: msgData.sendTime,
-                    content: msgData.content,
-                    toContactId: msgData.toContactId,
-                    fromUser: msgData.fromUser,
-              };
-              this.appendRemoteMessage(message);
-           }
+      if(msgData.type=="text" || msgData.type=="image" || msgData.type=="voice"){     //文本   text  image  video  voice
+        const message = {
+          id: msgData.id,
+          status: msgData.status,
+          type: msgData.type,
+          sendTime: msgData.sendTime,
+          content: msgData.content,
+          params1: "1",
+          params2: "2",
+          toContactId: msgData.toContactId,
+          fromUser: msgData.fromUser,
+        };
+        this.appendRemoteMessage(message);
+      }
+      else if(msgData.type=="file"){
+        const message = {
+          id: msgData.id,
+          status: msgData.status,
+          type: msgData.type,
+          sendTime: msgData.sendTime,
+          content: msgData.content,
+          toContactId: msgData.toContactId,
+          fromUser: msgData.fromUser,
+          fileName:msgData.fileName,
+          fileSize:msgData.fileSize
+        };
+        this.appendRemoteMessage(message);
+      }
+      else{
+        const message = {
+          id: msgData.id,
+          status: msgData.status,
+          type: msgData.type,
+          sendTime: msgData.sendTime,
+          content: msgData.content,
+          toContactId: msgData.toContactId,
+          fromUser: msgData.fromUser,
+        };
+        this.appendRemoteMessage(message);
+      }
     },
     //发送消息
     handleSend(message, next, file) {
       const IMUI = this.$refs.IMUI;
       var params={};
       if(message.type=="text"){  //text   image   voice   video
-          params={"sessionId":message.toContactId,"appKey":this.qwUser.appKey,"content":message.content};
-          sendMsg(params).then(response => {
-              if(response.code==200){
-                  var conversation=IMUI.findConversation(message.toContactId);
-                  conversation.lastSendTime=message.sendTime;
-                  conversation.lastContent=message.content;
-                  IMUI.topPopConversations(conversation);
-                  next();
-              }
-          });
+        params={"sessionId":message.toContactId,"appKey":this.qwUser.appKey,"content":message.content};
+        sendMsg(params).then(response => {
+          if(response.code==200){
+            var conversation=IMUI.findConversation(message.toContactId);
+            conversation.lastSendTime=message.sendTime;
+            conversation.lastContent=message.content;
+            IMUI.topPopConversations(conversation);
+            next();
+          }
+        });
       }
       // if(message.type=="image"){
       //     params={"conversationId":message.toContactId,"deviceId":this.qwUser.deviceId,"userId":this.qwUser.userId,"materialId":this.pickUploadImgData.id};
@@ -614,27 +614,27 @@ export default {
     },
     //选择图片框确定按钮回调
     handlePickImageDone(data){
-        console.log("handlePickImageDone:"+JSON.stringify(data));
-        this.pickUploadImgData=data;
-        const IMUI = this.$refs.IMUI;
-        IMUI._handleRemoteImage(data.url);
+      console.log("handlePickImageDone:"+JSON.stringify(data));
+      this.pickUploadImgData=data;
+      const IMUI = this.$refs.IMUI;
+      IMUI._handleRemoteImage(data.url);
     },
     tooglePlayVideo(data){
-       this.dialogVideoVisible=true;
-       this.dialogVideoUrl=data.content;
-       this.dialogVideoCover=data.url;
-       const player = this.$refs.player.instance
-       player && player.play()
+      this.dialogVideoVisible=true;
+      this.dialogVideoUrl=data.content;
+      this.dialogVideoCover=data.url;
+      const player = this.$refs.player.instance
+      player && player.play()
     },
     handleMessageClick(e, key, message, instance) {
       // console.log("点击了消息", e, key, message);
       //console.log("qxj message:"+JSON.stringify(message));
       if(message.type=="image"){
-           var url=!!message.url?message.url:message.content;
-           this.handlePicturePreview(url);
+        var url=!!message.url?message.url:message.content;
+        this.handlePicturePreview(url);
       }
       else if(message.type=="video"){
-           this.tooglePlayVideo(message);
+        this.tooglePlayVideo(message);
       }
       else if(message.type=="file"){
 
@@ -668,57 +668,57 @@ export default {
       this.hideMessageTime = !this.hideMessageTime;
     },
     removeMessage() {
-        const { IMUI } = this.$refs;
-        const messages = IMUI.getCurrentMessages();
-        const id = messages[messages.length - 1].id;
-        if (messages.length > 0) {
-            IMUI.removeMessage(id);
-        }
+      const { IMUI } = this.$refs;
+      const messages = IMUI.getCurrentMessages();
+      const id = messages[messages.length - 1].id;
+      if (messages.length > 0) {
+        IMUI.removeMessage(id);
+      }
     },
     updateMessage() {
-        const { IMUI } = this.$refs;
-        const messages = IMUI.getCurrentMessages();
-        const message = messages[messages.length - 1];
-        if (messages.length > 0) {
-            const update = {
-            id: message.id,
-            status: "succeed",
-            type: "file",
-            fileName: "被修改成文件了.txt",
-            fileSize: "4200000",
-            };
-            if (message.type == "event") {
-            update.fromUser = this.user;
-            }
-            IMUI.updateMessage(update);
-            IMUI.messageViewToBottom();
+      const { IMUI } = this.$refs;
+      const messages = IMUI.getCurrentMessages();
+      const message = messages[messages.length - 1];
+      if (messages.length > 0) {
+        const update = {
+          id: message.id,
+          status: "succeed",
+          type: "file",
+          fileName: "被修改成文件了.txt",
+          fileSize: "4200000",
+        };
+        if (message.type == "event") {
+          update.fromUser = this.user;
+        }
+        IMUI.updateMessage(update);
+        IMUI.messageViewToBottom();
       }
     },
     appendCustomMessage() {
-        const { IMUI } = this.$refs;
-        const message = {
-            id: generateRandId(),
-            status: "succeed",
-            type: "voice",
-            sendTime: getTime(),
-            content: "语音消息",
-            params1: "1",
-            params2: "2",
-            toContactId: "contact-1",
-            fromUser: this.user,
-        };
-        IMUI.appendMessage(message, true);
+      const { IMUI } = this.$refs;
+      const message = {
+        id: generateRandId(),
+        status: "succeed",
+        type: "voice",
+        sendTime: getTime(),
+        content: "语音消息",
+        params1: "1",
+        params2: "2",
+        toContactId: "contact-1",
+        fromUser: this.user,
+      };
+      IMUI.appendMessage(message, true);
     },
     appendMessage() {
-        const { IMUI } = this.$refs;
-        const contact = IMUI.currentContact;
-        const message = generateMessage("contact-3");
-        message.fromUser = {
-            ...message.fromUser,
-            ...this.user,
-        };
-        IMUI.appendMessage(message, true);
-        console.log("🚀 ~ file: App.vue ~ line 1508 ~ appendMessage ~ message", message)
+      const { IMUI } = this.$refs;
+      const contact = IMUI.currentContact;
+      const message = generateMessage("contact-3");
+      message.fromUser = {
+        ...message.fromUser,
+        ...this.user,
+      };
+      IMUI.appendMessage(message, true);
+      console.log("🚀 ~ file: App.vue ~ line 1508 ~ appendMessage ~ message", message)
     },
     appendEventMessage() {
       const { IMUI } = this.$refs;
@@ -742,8 +742,8 @@ export default {
       IMUI.appendMessage(message, true);
     },
     appendRemoteMessage(message) {  //从服务端返回的消息
-        const { IMUI } = this.$refs;
-        IMUI.appendMessage(message, true);
+      const { IMUI } = this.$refs;
+      IMUI.appendMessage(message, true);
     },
     updateContact() {
       this.$refs.IMUI.updateContact({
@@ -761,105 +761,105 @@ export default {
 
     },
     handlePicturePreview(url) {
-        this.dialogImageUrl = url;
-        this.dialogVisible = true;
+      this.dialogImageUrl = url;
+      this.dialogVisible = true;
     },
   },
 };
 </script>
 
 <style lang="scss" scoped>
-    .imui-center{
-        margin-top:30px;
-        align-items: center;
-        justify-content: center;
-        height: 80vh;
-    }
-    .lemon-wrapper{
-        border:1px solid #ddd;
-        //height: !important;
-    }
-    .lemon-drawer{
-        border:1px solid #ddd;
-        border-left:0;
-    }
-    .more {
-        font-size: 12px;
-        line-height: 24px;
-        height: 24px;
-        position: absolute;
-        top: 14px;
-        right: 14px;
-        cursor: pointer;
-        -webkit-user-select: none;
-        -moz-user-select: none;
-        -ms-user-select: none;
-        user-select: none;
-        color: #f1f1f1;
-        display: inline-block;
-        border-radius: 4px;
-        background: #111;
-        padding: 0 8px;
-    }
-
-    /deep/.el-dialog__headerbtn{
-         top:10px;
-    }
-
-    /deep/.el-dialog:not(.is-fullscreen) {
-        margin-top: 0 !important;
-    }
+.imui-center{
+  margin-top:30px;
+  align-items: center;
+  justify-content: center;
+  height: 80vh;
+}
+.lemon-wrapper{
+  border:1px solid #ddd;
+  //height: !important;
+}
+.lemon-drawer{
+  border:1px solid #ddd;
+  border-left:0;
+}
+.more {
+  font-size: 12px;
+  line-height: 24px;
+  height: 24px;
+  position: absolute;
+  top: 14px;
+  right: 14px;
+  cursor: pointer;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+  color: #f1f1f1;
+  display: inline-block;
+  border-radius: 4px;
+  background: #111;
+  padding: 0 8px;
+}
+
+/deep/.el-dialog__headerbtn{
+  top:10px;
+}
+
+/deep/.el-dialog:not(.is-fullscreen) {
+  margin-top: 0 !important;
+}
 
 </style>
 
 
 <style lang="stylus">
-    .lemon-container__title{
-     padding-bottom:10px;
-    }
-    .slot-group{
-     width:200px;
-    }
-
-    .slot-group-title{
-      padding:0 0 10px 0;
-    }
-
-    .slot-group-notice{
-      padding: 10px 10px;
-    }
-
-
-    .slot-search{
-      width:calc(100% - 20px) ;
-      margin:5px 10px;
-      padding:3px 0px;
-    }
-
-
-    .slot-group-member{
-      display: flex;
-      padding: 5px 0;
-      flex:1;
-      font-size: 14px;
-      align-items: center;
-    }
-
-    .avatar{
-      width: 30px;
-      height: 30px;
-      line-height: 30px;
-      margin-right:5px;
-    }
-
-    .img{
-      vertical-align: middle;
-      border-style: none;
-      width: 100%;
-      height: 100%;
-      line-height: 30px;
-      border-radius: 50%;
-    }
+.lemon-container__title{
+  padding-bottom:10px;
+}
+.slot-group{
+  width:200px;
+}
+
+.slot-group-title{
+  padding:0 0 10px 0;
+}
+
+.slot-group-notice{
+  padding: 10px 10px;
+}
+
+
+.slot-search{
+  width:calc(100% - 20px) ;
+  margin:5px 10px;
+  padding:3px 0px;
+}
+
+
+.slot-group-member{
+  display: flex;
+  padding: 5px 0;
+  flex:1;
+  font-size: 14px;
+  align-items: center;
+}
+
+.avatar{
+  width: 30px;
+  height: 30px;
+  line-height: 30px;
+  margin-right:5px;
+}
+
+.img{
+  vertical-align: middle;
+  border-style: none;
+  width: 100%;
+  height: 100%;
+  line-height: 30px;
+  border-radius: 50%;
+}
 
 
 

+ 239 - 219
src/views/qw/user/index.vue

@@ -1,4 +1,5 @@
 <template>
+
   <div class="app-container">
     <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="100px">
       <el-form-item label="企微主体" prop="corpId">
@@ -67,7 +68,12 @@
       <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="departmentName" />-->
+      <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>
+        </template>
+      </el-table-column>
       <el-table-column label="联系我二维码" align="center" prop="contactWay" >
         <template slot-scope="scope">
           <el-image
@@ -80,12 +86,12 @@
       </el-table-column>
       <el-table-column label="绑定的AI客服" align="center" prop="fastGptRoleName" />
       <el-table-column label="授权码" align="center" prop="appKey" />
-      <!--      <el-table-column label="企微状态" align="center" prop="loginStatus">-->
-      <!--        <template slot-scope="scope">-->
-      <!--          <el-tag v-if="scope.row.loginStatus == 1 && scope.row.toolStatus==1" type="success">在线</el-tag>-->
-      <!--          <el-tag v-else type="danger">离线</el-tag>-->
-      <!--        </template>-->
-      <!--      </el-table-column>-->
+      <el-table-column label="ai状态" align="center" prop="loginStatus">
+        <template slot-scope="scope">
+          <el-tag v-if="scope.row.ipadStatus == 1" type="success">在线</el-tag>
+          <el-tag v-else type="danger">离线</el-tag>
+        </template>
+      </el-table-column>
       <!--      <el-table-column label="插件状态" align="center" prop="toolStatus">-->
       <!--        <template slot-scope="scope">-->
       <!--          <el-tag v-if="scope.row.toolStatus == 1" type="success">在线</el-tag>-->
@@ -114,29 +120,60 @@
             修改员工称呼
           </el-button>
 
-          <!--          <el-button-->
-          <!--            v-if="scope.row.toolStatus==1"-->
-          <!--            size="mini"-->
-          <!--            type="text"-->
-          <!--            icon="el-icon-sunny"-->
-          <!--            plain-->
-          <!--            @click="handleLoginQwCode(scope.row)"-->
-          <!--            v-hasPermi="['qw:user:login']"-->
-          <!--          >-->
-          <!--            登录企微-->
-          <!--          </el-button>-->
-          <!--          <el-button-->
-          <!--            v-if="scope.row.appKey!=null && scope.row.toolStatus === 1 && scope.row.loginStatus === 1"-->
-          <!--            size="mini"-->
-          <!--            type="text"-->
-          <!--            icon="el-icon-moon"-->
-          <!--            plain-->
-          <!--            @click="handleLoginOutQwStatus(scope.row)"-->
-          <!--            v-hasPermi="['qw:user:login']"-->
-          <!--          >-->
-          <!--            退出企微-->
-          <!--          </el-button>-->
-
+          <el-button
+            v-if="scope.row.serverStatus==1&&scope.row.ipadStatus!=1"
+            size="mini"
+            type="text"
+            icon="el-icon-sunny"
+            plain
+            @click="handleLoginQwCode(scope.row)"
+            v-hasPermi="['qw:user:login']"
+          >
+            登录企微
+          </el-button>
+          <el-button
+            v-if="scope.row.serverStatus==1&&scope.row.ipadStatus==1"
+            size="mini"
+            type="text"
+            icon="el-icon-moon"
+            plain
+            @click="handleLoginOutQwStatus(scope.row)"
+            v-hasPermi="['qw:user:login']"
+          >
+            退出企微
+          </el-button>
+          <el-button
+            v-if="scope.row.ipadStatus==1"
+            size="mini"
+            type="text"
+            icon="el-icon-moon"
+            plain
+            @click="handleTwoCode(scope.row)"
+            v-hasPermi="['qw:user:login']">
+            二次验证
+          </el-button>
+          <el-button
+            v-if="scope.row.serverStatus!=1"
+            size="mini"
+            type="text"
+            icon="el-icon-moon"
+            plain
+            @click="handleGetQwIpad(scope.row)"
+            v-hasPermi="['qw:user:login']"
+          >
+            获取Ai主机
+          </el-button>
+          <el-button
+            v-if="scope.row.serverStatus==1 && scope.row.ipadStatus!=1"
+            size="mini"
+            type="text"
+            icon="el-icon-moon"
+            plain
+            @click="handleDelQwIpad(scope.row)"
+            v-hasPermi="['qw:user:login']"
+          >
+            解绑Ai主机
+          </el-button>
         </template>
       </el-table-column>
       <el-table-column label="主机" align="center" class-name="small-padding fixed-width" width="110px" fixed="right">
@@ -163,17 +200,17 @@
           >
             绑定主机
           </el-button>
-          <el-button
-            v-if="scope.row.loginCodeUrl!=null"
-            size="mini"
-            type="text"
-            icon="el-icon-video-camera-solid"
-            plain
-            @click="handleCloudAP(scope.row.loginCodeUrl)"
-            v-hasPermi="['qw:user:cloudAP']"
-          >
-            获取主机帐密
-          </el-button>
+          <!--          <el-button-->
+          <!--            v-if="scope.row.loginCodeUrl!=null"-->
+          <!--            size="mini"-->
+          <!--            type="text"-->
+          <!--            icon="el-icon-video-camera-solid"-->
+          <!--            plain-->
+          <!--            @click="handleCloudAP(scope.row.loginCodeUrl)"-->
+          <!--            v-hasPermi="['qw:user:cloudAP']"-->
+          <!--          >-->
+          <!--            获取主机帐密-->
+          <!--          </el-button>-->
           <el-button
             v-if="scope.row.loginCodeUrl!=null"
             size="mini"
@@ -274,6 +311,27 @@
       </div>
     </el-dialog>
     <!--二维码   -->
+    <el-dialog
+      title="企微二次认证"
+      :visible.sync="qwLoginTwo.open"
+      width="600px"
+      append-to-body
+      custom-class="qr-login-dialog"
+    >
+      <div class="qr-login-container">
+        <div class="image-wrapper" v-loading="imageLoading" >
+          <el-image
+            :src="'data:image/png;base64,' +qwLoginTwo.codeUrl"
+            style="display: block; margin: 0 auto; width: 300px; height: 300px;"
+          />
+        </div>
+        <p class="qr-login-instructions">二次验证二维码</p>
+      </div>
+      <div slot="footer" class="dialog-footer" >
+        <el-button type="primary" @click="qwLoginTwo.open=false">确 定</el-button>
+      </div>
+    </el-dialog>
+
     <el-dialog
       :title="qwLogin.title"
       :visible.sync="qwLogin.open"
@@ -282,29 +340,35 @@
       custom-class="qr-login-dialog"
     >
       <div class="qr-login-container">
-        <!-- 包裹 el-image 的 div,控制加载状态 -->
-        <div class="image-wrapper" v-loading="imageLoading" element-loading-text="加载中..." element-loading-spinner="el-icon-loading">
-          <!-- 如果图片未加载或加载失败,显示一个占位图 -->
+        <div class="image-wrapper" v-loading="imageLoading" >
           <el-image
-            :src="'data:image/png;base64,' + qwLogin.codeUrl"
+            :src="'data:image/png;base64,' +qwLogin.codeUrl"
             style="display: block; margin: 0 auto; width: 300px; height: 300px;"
-            @click="handleQrCodeClick"
           />
         </div>
         <p class="qr-login-instructions">使用企业微信扫码授权登录</p>
-        <el-input
-          v-model="qwLogin.code"
-          placeholder="请输入六位验证码 按回车"
-          clearable
-          size="small"
-          type="text"
-          maxlength="6"
-          class="verification-code-input"
-          @input="validateCode"
-          @keyup.native.enter="handleLoginQwCodeMsg"
-        />
       </div>
     </el-dialog>
+
+    <el-dialog
+      title="输入企微验证码"
+      :visible.sync="qwCode.open"
+      width="600px"
+      append-to-body>
+      <el-form  :model="qwCode"  label-width="80px" @submit.native.prevent="handleSubmit">
+        <el-form-item label="验证码" prop="companyName">
+          <el-input v-model="qwCode.code" placeholder="输入企微6位验证码" />
+        </el-form-item>
+      </el-form>
+
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitCodeForm">确 定</el-button>
+
+      </div>
+    </el-dialog>
+
+
+
     <!-- 大图预览对话框 -->
     <el-dialog
       :visible.sync="dialogVisible"
@@ -333,10 +397,18 @@ import {
   relieveFastGptRoleById,
   staffListUser,
   loginQwCode,
+  loginQwIpad,
   modifyLoginQwStatus,
   loginQwCodeMsg,
   getQwCodeUrl,
+  twoCode,
+  twoCodeStatus,
+  qrCodeStatus,
+  getQwIpad,
+  delQwIpad,
   logoutQwLogout,
+  qrCodeVerify,
+  outLoginQwIpad,
   loginQwCodeUrl,
   getLoginQwStatus,
   qwBindCloudHost, qwUnbindCloudHost, handleAuthAppKey, handleInputAuthAppKey, selectCloudAP
@@ -371,7 +443,7 @@ export default {
       dialogVisible:false,
 
       // 遮罩层
-      loading: true,
+      loading: false,
       // 导出遮罩层
       exportLoading: false,
       // 选中数组
@@ -399,7 +471,18 @@ export default {
         code:null,
         appKey:null,
       },
-
+      qwLoginTwo:{
+        title:"",
+        open:false,
+        codeUrl:null,
+        code:null,
+        appKey:null,
+      },
+      qwCode:{
+        title:"",
+        open:false,
+        code:null,
+      },
       cloudAPOpen:{
         open:false,
         admin:null,
@@ -414,9 +497,9 @@ export default {
         id:null,
         welcomeText:null,
       },
-      qrCodeInterval:null,
+      twoCodeInterval:null,
       loginQwInterval:null,
-      loginOutQwInterval:null,
+
       imageLoading: true, // 控制加载状态
       // 查询参数
       queryParams: {
@@ -426,6 +509,7 @@ export default {
         corpId: null,
         qwUserName: null,
       },
+      qwUserId:null,
       companyUserList:[],
       // 表单参数
       form: {
@@ -450,7 +534,7 @@ export default {
 
     getMyQwCompanyList().then(response => {
       this.myQwCompanyList = response.data;
-      if(this.myQwCompanyList!=null){
+      if(this.myQwCompanyList!=null && this.myQwCompanyList.length > 0){
         this.queryParams.corpId=this.myQwCompanyList[0].dictValue;
         this.getList();
       }
@@ -463,41 +547,18 @@ export default {
     'qwLogin.open'(newVal) {
       if (!newVal) {
         // 如果弹窗关闭,清除定时器
-        this.beforeDestroy();
+        clearInterval(this.loginQwInterval);
 
       }
     },
   },
   methods: {
-    // handleChangeIP(row){
-    //   this.updateIp.open = true
-    //   this.updateIpForm.id = row.id
-    //   this.updateIpForm.newIp = null;
-    // },
-    // submitUpdateIpForm(){
-    //   if (this.updateIpForm.newIp==null){
-    //     this.$message.warning("请填写IP")
-    //     return
-    //   }
-    //   const data = {
-    //     id : this.updateIpForm.id,
-    //     loginCodeUrl : this.updateIpForm.newIp
-    //   }
-    //
-    //   updateUser(data).then(response => {
-    //     this.msgSuccess("绑定成功");
-    //     this.updateIp.open = false;
-    //     this.getList();
-    //   });
-    // },
-    /** 查询企微用户列表 */
     getList() {
       this.loading = true;
       staffListUser(this.queryParams).then(response => {
         this.userList = response.rows;
         this.total = response.total;
         this.loading = false;
-
       });
 
     },
@@ -523,172 +584,131 @@ export default {
     },
     //登录
     handleLoginQwCode(val){
-
-      // v-if="scope.row.appKey!=null && scope.row.toolStatus === 1 && scope.row.loginStatus === 0"
       if (val.appKey==null || val.appKey===''){
         return this.$message.warning("没有授权码,无法登录企业微信,请授权");
       }
+      loginQwIpad({qwUserId:val.id}).then(res => {
+        this.qwUserId=val.id;
+        this.qwLogin.code=null;
+        this.imageLoading=false;
+        console.log(res)
+        if(res.msg=="success"){
+          this.qwLogin.codeUrl=res.qrCode64
+          this.qwLogin.open=true;
+          this.loginQwPolling();
+        }else{
+          this.$message.success(res.msg);
+          this.getList()
+        }
 
-      if (val.toolStatus===0 || val.toolStatus==null ){
-        return this.$message.warning("插件离线了,无法登录企业微信,请联系管理员~");
-      }
-
-      if (val.loginStatus===1 && val.toolStatus===1){
-        return this.$message.success("已经登录了,无需重复登录");
-      }
-
-      loginQwCode({appKey:val.appKey}).then(res => {
-        this.qwLogin.appKey=val.appKey;
-        this.qwLogin.open=true;
-        this.imageLoading=true;
+      })
+    },
 
-        //定时器 获取登录状态(有自动登录的)
-        this.loginQwPolling();
+    handleTwoCode(val){
 
-        // 调用后台接口获取新的二维码URL
-        loginQwCodeUrl({ appKey: this.qwLogin.appKey }).then(res => {
-          getQwCodeUrl({appKey:this.qwLogin.appKey}).then(res=>{
-            this.qwLogin.codeUrl=res.base64 // 更新二维码URL
-          }).catch(()=>{
-            this.resetQwLogin();
-          }).finally(()=>{
-            this.imageLoading=false;
-          })
+      twoCode({ qwUserId: val.id }).then(res => {
+        console.log(res)
+        this.qwLoginTwo.open=true;
+        this.qwLoginTwo.codeUrl=res.qrCode
 
-        });
+      });
 
-        // setTimeout(()=>{
-        //
-        //     getQwCodeUrl({appKey:val.appKey}).then(res=>{
-        //       this.qwLogin.codeUrl=res.base64
-        //     }).catch(()=>{
-        //       this.resetQwLogin();
-        //     }).finally(()=>{
-        //       this.imageLoading=false;
-        //     })
-        //
-        // },3000)
-
-        // 启动定时器,每隔45秒更新一次二维码
-        this.startQrCodePolling();
 
-      })
     },
+    twoCodePolling() {
+      this.twoCodeInterval = setInterval(() => {
+        twoCodeStatus({ qwUserId: this.qwUserId }).then(res => {
+          console.log(res)
 
-    // 每隔45秒请求一次二维码
-    startQrCodePolling() {
-      this.qrCodeInterval = setInterval(() => {
-        this.refreshQrCode();
-      }, 45000);  // 45秒更新一次
+          if (res.msg==104001) {
+            this.$message.success('登录成功');
+            this.clearDl()
+            clearInterval(this.loginQwInterval);
+          }else if(res.msg==100004){
+            this.clearDl()
+          }
+        });
+      }, 3000);
     },
-
     loginQwPolling() {
-      let elapsedTime = 0;  // 记录已执行的时间(单位:秒)
-
       this.loginQwInterval = setInterval(() => {
-        // 每次轮询后增加已执行的时间
-        elapsedTime += 5;  // 因为每 3 秒执行一次
-
-        // 请求登录状态
-        getLoginQwStatus({ appKey: this.qwLogin.appKey }).then(res => {
-          if (res.status==1) {
-            this.$message.success('登录成功');
-            clearInterval(this.loginQwInterval);  // 登录成功,停止轮询
-            this.resetQwLogin();
+        qrCodeStatus({ qwUserId: this.qwUserId }).then(res => {
+          console.log(res)
+          if (res.msg==22) {
+            this.$message.success('账号企业不一致请重新扫码登录');
+            this.clearDl();
           }
-          // 判断是否超过最大轮询时间(60秒)
-          if (elapsedTime >= 90) {
-            clearInterval(this.loginQwInterval);  // 超过90秒停止轮询
-            this.$message.warning('登录超时,请稍后再试!')
-            this.resetQwLogin();
+          if (res.msg==104001) {
+            this.$message.success('登录成功');
+            this.clearDl()
+
+          }else if(res.msg==100004){
+            this.qwCode.open=true;
+            clearInterval(this.loginQwInterval);
           }
         });
-      }, 3000);  // 每 3 秒更新一次
-    },
-
-    // 退出时清除定时器
-    beforeDestroy() {
-      if (this.qrCodeInterval) {
-        clearInterval(this.qrCodeInterval);  // 清除定时器
-      }
-      if (this.loginQwInterval) {
-        clearInterval(this.loginQwInterval);  // 清除定时器
-      }
-      if (this.loginOutQwInterval){
-        clearInterval(this.loginOutQwInterval);  // 清除定时器
-      }
-      this.resetQwLogin();
+      }, 3000);
     },
-
-    // 刷新二维码
-    refreshQrCode() {
-      // 调用后台接口获取新的二维码URL
-      loginQwCodeUrl({ appKey: this.qwLogin.appKey }).then(res => {
-        getQwCodeUrl({appKey:this.qwLogin.appKey}).then(res=>{
-          this.qwLogin.codeUrl=res.base64 // 更新二维码URL
-        }).catch(()=>{
-          this.resetQwLogin();
-        }).finally(()=>{
-          this.imageLoading=false;
-        })
-
+    submitCodeForm(){
+
+      qrCodeVerify({ code: this.qwCode.code,qwUserId: this.qwUserId }).then(res => {
+        console.log(res)
+
+        this.$message.success('验证成功账号信息确认中。。。。');
+        this.qwCode.open=false;
+        this.loginQwInterval = setTimeout(() => {
+          qrCodeStatus({ qwUserId: this.qwUserId }).then(res => {
+            console.log(res);
+            if (res.msg == 23) {
+              this.$message.error('账号不一致请重新扫码登录');
+              this.clearDl();
+            }
+            if (res.msg == 22) {
+              this.$message.error('账号企业不一致请重新扫码登录');
+              this.clearDl();
+            }
+            if (res.msg == 104001) {
+              this.$message.success('登录成功');
+              this.clearDl();
+            }
+          });
+        }, 4000);
       });
     },
 
-    handleQrCodeClick(){
-      this.imageLoading=true;
-      // 调用后台接口获取新的二维码URL
-      loginQwCodeUrl({ appKey: this.qwLogin.appKey }).then(res => {
-
-        setTimeout(()=>{
-          getQwCodeUrl({appKey:this.qwLogin.appKey}).then(res=>{
-
-            //确保万一再调用一下刷新二维码
-            this.qwLogin.codeUrl=res.base64 // 更新二维码URL
-
-          }).catch(()=>{
-            this.resetQwLogin();
-          }).finally(()=>{
-            this.imageLoading=false;
-          })
+    clearDl(){
+      this.qwCode.open=false;
+      this.qwLogin.open=false;
+      clearInterval(this.loginQwInterval);
+      this.getList()
+    },
 
-        },3000)
 
 
-      });
-    },
     //退出
     handleLoginOutQwStatus(val){
-      this.loading=true;
-      logoutQwLogout({appKey:val.appKey,loginStatus:0}).then(res => {
-
-        let elapsedTime = 0;  // 记录已执行的时间(单位:秒)
+      outLoginQwIpad({qwUserId: val.id}).then(res => {
 
-        this.loginOutQwInterval = setInterval(() => {
-          // 每次轮询后增加已执行的时间
-          elapsedTime += 3;  // 因为每 3 秒执行一次
+        this.$message.success("退出登录成功");
+        this.getList()
+      })
 
-          // 请求登录状态
-          getLoginQwStatus({ appKey: val.appKey }).then(res => {
-            if (res.status==0) {
-              this.$message.success('退出成功');
-              clearInterval(this.loginOutQwInterval);  // 登录成功,停止轮询
-              this.resetQwLogin();
-            }
+    },
 
-            // 判断是否超过最大轮询时间(60秒)
-            if (elapsedTime >= 90) {
-              clearInterval(this.loginOutQwInterval);  // 超过90秒停止轮询
-              this.$message.warning('退出超时,请多等待后刷新页面!')
-              this.resetQwLogin();
 
-            }
-          });
-        }, 3000);  // 每 3 秒更新一次
+    handleGetQwIpad(val){
+      getQwIpad({qwUserId: val.id}).then(res => {
+        this.$message.success("获取主机成功");
+        this.getList()
+      })
 
+    },
+    handleDelQwIpad(val){
+      delQwIpad({qwUserId: val.id}).then(res => {
+        this.$message.success("解绑主机成功");
+        this.getList()
       })
     },
-
     //传验证码
     handleLoginQwCodeMsg(){
       loginQwCodeMsg({appKey: this.qwLogin.appKey,code:this.qwLogin.code}).then(res => {