diff --git a/api/login.js b/api/login.js index 38b92b4..f3d0c56 100644 --- a/api/login.js +++ b/api/login.js @@ -25,6 +25,7 @@ export default async function login() { getApp().globalData.name = res.data.data.oapiUser.name; getApp().globalData.userid = res.data.data.oapiUser.userid; getApp().globalData.mwUserId = res.data.data.mwUserId; + dd.setStorageSync({ key: 'mwUserId', data: res.data.data.mwUserId }) getApp().globalData.avatar = res.data.data.oapiUser.avatar; getApp().globalData.userInfo = JSON.stringify({ username: oapiUser.name, diff --git a/api/request.js b/api/request.js index 3d0bdd3..f37ceee 100644 --- a/api/request.js +++ b/api/request.js @@ -281,4 +281,10 @@ export function getDeviceBySn(data) { method: "get", url: `/meet/meeting-room-device/getDeviceBySn?deviceSn=${data}` }); +} +export function setRead(meetingId) { + return $http({ + method: 'get', + url: `/meet/comment/read?meetingId=${meetingId}&platform=dingTalk` + }) } \ No newline at end of file diff --git a/pages/createTask/createTask.js b/pages/createTask/createTask.js index df19ef0..3974937 100644 --- a/pages/createTask/createTask.js +++ b/pages/createTask/createTask.js @@ -76,6 +76,7 @@ create.Page({ this.store.data.affairList.unshift(addData); this.store.data.tasks.unshift(addData); this.store.data.isNeedReloadIndexList = true; + this.store.data.separateIndex += 1; this.update(); dd.navigateBack(); } diff --git a/pages/index/index.acss b/pages/index/index.acss index 9a660d3..ee9b1be 100644 --- a/pages/index/index.acss +++ b/pages/index/index.acss @@ -36,12 +36,13 @@ display: flex; justify-content: space-between; align-items: center; + position: relative; } .unread-message { position: absolute; - top: 48rpx; - right: 48rpx; + top: 0; + right: 0; color: #fff; background: #ea4e6b; font-size: 24rpx; diff --git a/pages/index/index.axml b/pages/index/index.axml index 4976952..a4c548b 100644 --- a/pages/index/index.axml +++ b/pages/index/index.axml @@ -14,9 +14,9 @@ <view class="meetingtitle" data-groupId="{{item.meetingId}}" catchTap="nextDetail" data-item="{{item}}"> <view> {{item.title}} - </view> - <view a:if="{{item.unReadMessageTotal}}" class="unread-message"> - {{item.unReadMessageTotal}} + <view a:if="{{item.unReadMessageCommentIdList.length}}" class="unread-message"> + {{item.unReadMessageCommentIdList.length}} + </view> </view> </view> <block a:for="{{item.commentListDataModelList}}" a:for-item="dynamicItem" key="{{item.id}}"> diff --git a/pages/index/index.js b/pages/index/index.js index e17e968..7bdb854 100644 --- a/pages/index/index.js +++ b/pages/index/index.js @@ -16,11 +16,13 @@ import { getFormatDate, throttle, padZero, - getCreateShowTime + getCreateShowTime, + isJSON } from "../../utils/utils"; import { checkFullScren } from "../../utils/checkFullScren"; import create from "dd-store"; import pageStore from '../meetingDetail/store'; +// const webSocket = require('../../utils/websocket.js'); const currentDate = new Date(); const minYear = currentDate.getFullYear(); @@ -29,6 +31,7 @@ let DateMap = getDateMap(minYear, maxYear); const weekList = ["周日", "周一", "周二", "周三", "周四", "周五", "周六"]; let maxClickCount = 5; +const uuid = Math.random().toString(36).substr(2); create.Page({ store: pageStore, data: { @@ -99,6 +102,19 @@ create.Page({ this.isNeverShowSchedulePage = false; } } + + //webSocket.connectSocket(); + //webSocket.onSocketMessageCallback = this.onSocketMessageCallback.bind(this); + }, + // socket收到的信息回调 + onSocketMessageCallback(event) { + // 返回一个JSON字符串 + if (isJSON(event)) { + const dataFromServer = JSON.parse(event); + if (dataFromServer.reload.indexOf('comment_') !== -1) { + this.getPages(); + } + } }, onLoad(query) { if (query && query.sn) { @@ -133,36 +149,35 @@ create.Page({ await this.addOnceMeeting(content) } this.update(); - this.connect_start(); // 注意: 回调方法的注册在整个小程序启动阶段只要做一次,调多次会有多次回调 dd.onSocketOpen((res) => { - dd.alert({ content: '连接已打开!' }); + console.log('连接已打开!'); dd.sendSocketMessage({ data: 'heartbeat', // 需要发送的内容 success: (res) => { - dd.alert({ content: '数据发送!' + 'heartbeat' }); + console.log('数据发送!' + 'heartbeat'); }, }); }); dd.onSocketError(function (res) { - dd.alert('WebSocket 连接打开失败,请检查!' + res); + console.log('WebSocket 连接打开失败,请检查!' + res); }); // 注意: 回调方法的注册在整个小程序启动阶段只要做一次,调多次会有多次回调 dd.onSocketMessage((res) => { - dd.alert({ content: '收到数据!' + JSON.stringify(res) }); + console.log(res) + this.onSocketMessageCallback(res.data) }); - - //this.WebSocketTest(); }, connect_start() { dd.connectSocket({ - url: `ws://gateway-beta.mingwork.com/meet-websocket/websocket/${getApp().globalData.mwUserId}`, // 开发者服务器接口地址,必须是 wss 协议,且域名必须是后台配置的合法域名 + url: `ws://139.196.213.18:9999/meet-websocket/websocket/${dd.getStorageSync({ key: 'mwUserId' }).data}/${uuid}`, + success: (res) => { }, @@ -173,31 +188,6 @@ create.Page({ } }); }, - WebSocketTest() { - - - // 打开一个 web socket - var ws = new WebSocket(`wss://gateway-beta.mingwork.com/meet-websocket/websocket/1310054599841542146`); - - console.log(ws); - ws.onopen = function () { - // Web Socket 已连接上,使用 send() 方法发送数据 - ws.send("发送数据"); - dd.alert({ content: "数据发送中..." }); - }; - - ws.onmessage = function (evt) { - var received_msg = evt.data; - console.log(received_msg) - dd.alert({ content: "数据已接收..." }); - }; - - ws.onclose = function () { - // 关闭 websocket - dd.alert({ content: "连接已关闭..." }); - }; - - }, //添加单次会议 async addOnceMeeting(content) { await this.getData(true); @@ -293,9 +283,13 @@ create.Page({ }); }, onHide() { + // clearInterval(this.timer); // this.timer = null; }, + onUload() { + dd.closeSocket(); + }, refresh() { this.isNeverShowSchedulePage = true; this.isLoaded = false; diff --git a/pages/meetingDetail/meetingDetail.acss b/pages/meetingDetail/meetingDetail.acss index ce5d817..5877be2 100644 --- a/pages/meetingDetail/meetingDetail.acss +++ b/pages/meetingDetail/meetingDetail.acss @@ -670,4 +670,25 @@ input { .meetingWayShowTop>.icon { color: rgb(216, 216, 216) !important +} + +.separate .line { + margin: 0; + width: 40%; + border-top: 1px solid rgba(10, 10, 10, 0.06); +} + +.separate { + display: flex; + align-items: center; + justify-content: space-between; + padding: 16rpx; + padding-left: 104rpx; +} + +.separate .text { + color: rgba(10, 10, 10, 0.56); + white-space: nowrap; + padding: 0 15px; + font-size: 24rpx; } \ No newline at end of file diff --git a/pages/meetingDetail/meetingDetail.axml b/pages/meetingDetail/meetingDetail.axml index 74f410c..23ce6d5 100644 --- a/pages/meetingDetail/meetingDetail.axml +++ b/pages/meetingDetail/meetingDetail.axml @@ -222,6 +222,11 @@ <view class="compose-column"> <comment a:if="{{item.replyCommentList}}" replyCommentList="{{item.replyCommentList}}" onDeleteComment="deleteComment" parentCommentId="{{item.commentId}}"/> </view> + <view a:if="{{index == separateIndex}}" class="separate"> + <view class="line"></view> + <view class="text">以下是过往动态</view> + <view class="line"></view> + </view> </block> <view class="affair-placeholder" a:if="{{!affairList || affairList.length == 0}}"> <template is="affair-placeholder" data="{{title: '添加文件', tip: '我们不开无准备的会,快来上传会议文件吧。'}}"/> diff --git a/pages/meetingDetail/meetingDetail.js b/pages/meetingDetail/meetingDetail.js index efe1926..d2538c6 100644 --- a/pages/meetingDetail/meetingDetail.js +++ b/pages/meetingDetail/meetingDetail.js @@ -2,7 +2,7 @@ import create from 'dd-store'; import { checkFullScren } from "../../utils/checkFullScren"; import pageStore from './store'; import { saveFileInfo, getMeetingRoomAffairs, createMeetingTask, deleteMeetingTask, updateMeetingTask, uploadPermissions } from '../../api/request'; -import { getOssPermission, getuploadResource, isParticipate, deleteSchedule, getScheduleDetail, getUserScheduleInTime, modifySchedule, getMeetingRoomRepeatAffairs, updateMoment, deleteMoment } from '../../api/request.js' +import { getOssPermission, getuploadResource, isParticipate, deleteSchedule, getScheduleDetail, getUserScheduleInTime, modifySchedule, getMeetingRoomRepeatAffairs, updateMoment, deleteMoment, setRead } from '../../api/request.js' import { selectedelRequired, selectPeople, getShowTime, modifyTimeImpactRepeat, throttle, getCreateShowTime, dealRepeatModal } from './../../utils/utils.js' import { observer } from '/utils/observer.js' import { resolve } from 'path'; @@ -75,6 +75,7 @@ create.Page({ id: '' }, onShow() { + console.log('onshow') this.update() if (this.store.data.isNeedReloadList) { @@ -112,6 +113,7 @@ create.Page({ } }, onLoad(event) { + console.log('onload') const scheduleItem = JSON.parse(decodeURIComponent(event.scheduleItem)); this.reset() this.setData({ @@ -129,6 +131,8 @@ create.Page({ }) } }) + + }, // 获取详情 getDetail() { @@ -950,12 +954,18 @@ create.Page({ getAffairList(id) { getMeetingRoomAffairs(id).then(res => { this.getTaskAndFiles(res.data.data); - const newAffairList = this.dealAffairData(res.data.data || []); + const [newAffairList, separate] = this.dealAffairData(res.data.data || []); this.store.data.affairList = newAffairList; + this.store.data.separateIndex = separate; + this.update(); this.setData({ "loading.dynamic": false }); + // 设置已读 + setRead(id).then(res => { + console.log(res) + }); }) }, @@ -981,18 +991,23 @@ create.Page({ }, //处理会议动态数据 dealAffairData(affairList) { - return affairList.map(it => { + let separate = -1; + affairList.forEach((it, index) => { + if (it.readFlag === 0) { + separate = index; + } if (it.createTime) { it.updateTime = getCreateShowTime(it.updateTime); } if (it.replyCommentList) { it.replyCommentList.map(item => { item.updateTime = getCreateShowTime(item.updateTime); - return item }) } - return it }) + separate = fixSeperateIndex(separate, affairList); + + return [affairList, separate] }, // 上传文件 async handleAddFile() { @@ -1089,6 +1104,11 @@ create.Page({ changeData.updateTime = getCreateShowTime(new Date()); this.store.data.affairList.splice(index, 1); this.store.data.affairList.unshift(changeData); + if (index > this.store.data.separateIndex) { + this.store.data.separateIndex += 1; + this.store.data.separateIndex = fixSeperateIndex(this.store.data.separateIndex, this.store.data.affairList) + } + dd.pageScrollTo({ scrollTop: 0 }) @@ -1219,6 +1239,13 @@ create.Page({ } else { if (index !== -1) { const deleteData = this.store.data.affairList.splice(index, 1); + //删除过往以上的-1 + if (index <= this.store.data.separateIndex) { + this.store.data.separateIndex -= 1; + } else { + this.store.data.separateIndex = fixSeperateIndex(this.store.data.separateIndex, this.store.data.affairList); + } + this.update(); // 如果删除的动态包含文件和任务,需要修改 if (deleteData[0].fileDetailList || deleteData[0].meetingTaskSimpleViewModel) { @@ -1263,6 +1290,11 @@ create.Page({ changeData.updateTime = getCreateShowTime(new Date()); this.store.data.affairList.splice(index, 1); this.store.data.affairList.unshift(changeData); + if (index > this.store.data.separateIndex) { + this.store.data.separateIndex += 1; + this.store.data.separateIndex = fixSeperateIndex(this.store.data.separateIndex, this.store.data.affairList) + } + dd.pageScrollTo({ scrollTop: 0 }) @@ -1314,6 +1346,21 @@ create.Page({ }, goFilesPage() { dd.navigateTo({ url: '/pages/files/files?meetingId=' + this.store.data.scheduleId }) - } + }, + }); + +export function fixSeperateIndex(index, list) { + let separate = index; + + if (separate === list.length - 1) { + separate = -1; + } + if (list[list.length - 1].commentType === 'meeting') { + if (separate === list.length - 2) { + separate = -1; + } + } + return separate; +} \ No newline at end of file diff --git a/pages/meetingDetail/store.js b/pages/meetingDetail/store.js index 1797aee..2b5508a 100644 --- a/pages/meetingDetail/store.js +++ b/pages/meetingDetail/store.js @@ -1,8 +1,10 @@ import { getCreateShowTime, dealRepeatModal } from '../../utils/utils'; import { updateMeetingTask } from '../../api/request'; +import { fixSeperateIndex } from './meetingDetail'; class Store { data = { affairList: [], + separateIndex: -1, currentTask: {}, // 任务 endTime, excutor, title, excutorId notes: null, //{meetingNotes: '', commentId: ''} parentCommentId: '', // 评论的动态Id @@ -37,6 +39,11 @@ class Store { this.data.affairList.splice(index, 1); this.data.affairList.unshift(changeData); + if (index > this.data.separateIndex) { + this.data.separateIndex += 1; + this.data.separateIndex = fixSeperateIndex(this.data.separateIndex, this.data.affairList) + } + this.update(); // 页面定位到最上面 @@ -51,6 +58,8 @@ class Store { this.data.tasks[tasksIndex].processState = taskModifyModel.processState; this.data.tasks[tasksIndex].updateTime = getCreateShowTime(new Date()); } + + updateMeetingTask(data).then(res => { if (res.data.code !== 0) { dd.alert('操作失败,请重试') diff --git a/pages/uploadFile/uploadFile.js b/pages/uploadFile/uploadFile.js index b6794ec..135b844 100644 --- a/pages/uploadFile/uploadFile.js +++ b/pages/uploadFile/uploadFile.js @@ -1,6 +1,6 @@ import create from 'dd-store' import { saveFileInfo, addSchedule, uploadPermissions, previewPermissions, updateMeetingTask } from '../../api/request.js' -import { throttle, debounce } from './../../utils/utils.js' +import { throttle, debounce, getCreateShowTime } from './../../utils/utils.js' import pageStore from '../meetingDetail/store'; import { getFileInfo } from '../meetingDetail/uploadFile'; @@ -88,11 +88,24 @@ create.Page({ } updateMeetingTask(data).then(res => { - this.store.data.isNeedReloadList = true; + this.store.data.fileInfos = [] this.store.data.description = '' this.update(); - dd.navigateBack() + //this.store.data.isNeedReloadList = true; + + if (res.data.data) { + const addData = res.data.data[0].commentListDataModelList[0]; + addData.updateTime = getCreateShowTime(addData.updateTime); + this.store.data.affairList.unshift(addData); + addData.fileDetailList.forEach(it => this.store.data.files.unshift(it)); + this.store.data.isNeedReloadIndexList = true; + this.store.data.separateIndex += 1; + this.update(); + dd.navigateBack(); + } + + }) }, 1000) }); diff --git a/utils/utils.js b/utils/utils.js index 508588d..d941719 100644 --- a/utils/utils.js +++ b/utils/utils.js @@ -297,3 +297,20 @@ export function selectedelRequired(select, require) { }) } + +export function isJSON(str) { + if (typeof str == 'string') { + try { + var obj = JSON.parse(str); + if (typeof obj == 'object' && obj) { + return true; + } else { + return false; + } + + } catch (e) { + return false; + } + } + return false; +} \ No newline at end of file diff --git a/utils/websocket.js b/utils/websocket.js index b5f4b2a..fc84964 100644 --- a/utils/websocket.js +++ b/utils/websocket.js @@ -13,6 +13,8 @@ var heartBeatTimeOut = null; // 终止重新连接 var connectSocketTimeOut = null; +const uuid = Math.random().toString(36).substr(2); + var webSocket = { /** @@ -35,15 +37,13 @@ var webSocket = { socketClose = false socketMsgQueue = [] dd.connectSocket({ - url: `wss://mingpay-websocket.mingwork.com/v1/mingpaywebsocket?param=${dd.corpId}_${dd.getStorageSync({ key: 'userId' }).data}`, - // url: `ws://192.168.1.102:8400/v1/mingpaywebsocket?param=${dd.corpId}_${dd.getStorageSync({ key: 'userId' }).data}`, + url: `ws://139.196.213.18:9999/meet-websocket/websocket/${dd.getStorageSync({ key: 'mwUserId' }).data}/${uuid}`, data: {}, header: { 'content-type': 'application/json' }, method: "GET", success: function (res) { - console.log(res, `wss://gateway.mingwork.com/mingpay-phone/v1/mingpaywebsocket?param=${dd.corpId}_${dd.getStorageSync({ key: 'userId' }).data}`) if (options) { // 成功回调 options.success && options.success(res); @@ -153,11 +153,9 @@ var webSocket = { return; } self.sendSocketMessage({ - msg: JSON.stringify({ - 'msg_type': 'heart' - }), + msg: 'heart', success: function (res) { - console.log('socket心跳成功'); + console.log('socket发送心跳成功'); if (heart) { heartBeatTimeOut = setTimeout(() => { self.heartBeat(); @@ -165,7 +163,7 @@ var webSocket = { } }, fail: function (res) { - console.log('socket心跳失败'); + console.log('socket发送心跳失败'); if (heartBeatFailCount > 2) { // 重连 self.connectSocket();