jiangping
2024-09-19 074485f56f073cf11fb29e6aab4ec9a2d4f3f549
Merge remote-tracking branch 'origin/master'
已添加3个文件
已修改23个文件
714 ■■■■ 文件已修改
admin/src/views/meeting/components/OperaRoomsWindow.vue 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/manifest.json 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/staffLogin/login.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/static/redirect.html 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5_meeting/.hbuilderx/launch.json 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5_meeting/manifest.json 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5_meeting/package-lock.json 134 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5_meeting/package.json 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5_meeting/pages/index/index.vue 132 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/meeting/meeting_admin/src/main/java/com/doumee/cloud/admin/MeetingCloudController.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/meeting/meeting_admin/src/main/java/com/doumee/cloud/web/MeetingApi.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/meeting/meeting_service/src/main/java/com/doumee/core/wx/MeetConstants.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/meeting/meeting_service/src/main/java/com/doumee/dao/admin/request/BusinessOverDTO.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/meeting/meeting_service/src/main/java/com/doumee/dao/business/BookingsMapper.java 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/meeting/meeting_service/src/main/java/com/doumee/dao/business/model/Bookings.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/meeting/meeting_service/src/main/java/com/doumee/dao/business/model/Rooms.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/meeting/meeting_service/src/main/java/com/doumee/dao/web/response/MeetingListResponse.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/meeting/meeting_service/src/main/java/com/doumee/dao/web/response/RoomDetailResponse.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/meeting/meeting_service/src/main/java/com/doumee/dao/web/response/RoomsResponse.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/meeting/meeting_service/src/main/java/com/doumee/service/business/BookingsService.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/meeting/meeting_service/src/main/java/com/doumee/service/business/impl/BookingsServiceImpl.java 152 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/meeting/meeting_service/src/main/java/com/doumee/service/business/impl/RoomsServiceImpl.java 75 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/dao/system/model/Multifile.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/admin/response/InterestedListVO.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/admin/response/PCWorkPlatformDataVO.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/HiddenDangerServiceImpl.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/meeting/components/OperaRoomsWindow.vue
@@ -150,9 +150,6 @@
    open(title, target) {
      this.title = title
      this.visible = true
      this.form.imgFullUrl = ''
      // this.timeRange = ['14:34:55', '14:34:55']
      // debugger
      this.timeRange = ['', '']
      // æ–°å»º
      if (target == null) {
@@ -167,13 +164,14 @@
        for (const key in this.form) {
          this.form[key] = target[key]
        }
        if(target.fileType == 1 && target.multifileList && target.multifileList.length > 0){
          this.$set(this.form, 'videoFullUrl', target.multifileList[0].fileurlFull)
          this.$set(this.form, 'videourl', target.multifileList[0].fileurl)
        }
        this.timeRange = [target.startTime, target.endTime]
        this.form.projectList = this.form.projectList ? target.projectList.map(item => item.projectId) : []
        this.form.sysList = this.form.sysList ? this.form.sysList.map(item => item.userId) : []
        // console.log(this.form.imgFullUrl);
        console.log(this.form)
        console.log(this.form.intervalTime)
        console.log(target)
      })
    },
    imgDel(i) {
h5/manifest.json
@@ -91,7 +91,7 @@
            "proxy" : {
                "/admin_interface" : {
                    // è¿™ä¸ªå­—段名需与你配置的basePrefixUrl一致,系统识别到带有/dev-api请求的地址时,会在前面拼接上代理服务器地址
                    "target" : "http://192.168.0.139/admin_interface", // ä»£ç†æœåŠ¡å™¨åŸŸåæˆ–IP地址
                    "target" : "http://192.168.137.1:10010", // ä»£ç†æœåŠ¡å™¨åŸŸåæˆ–IP地址
                    // "target" : "http://192.168.31.42:10010", // ä»£ç†æœåŠ¡å™¨åŸŸåæˆ–IP地址
                    // "target" : "http://10.50.250.178:8088/gateway_interface", // ä»£ç†æœåŠ¡å™¨åŸŸåæˆ–IP地址
                    "changeOrigin" : true, // å…è®¸è·¨åŸŸ 
h5/pages/staffLogin/login.vue
@@ -71,7 +71,7 @@
  data() {
    return {
      form: {
        username: '18056814089',
        username: '13996529050',
        password: '123456',
                code: 1
      },
h5/static/redirect.html
@@ -7,6 +7,7 @@
    var p = location.href.split("?")
    // window.location.href = 'http://192.168.0.173/h5/#/pages/notice/notice?' + 'code=123123'
      window.location.href = 'http://192.168.0.173/h5/#/pages/notice/notice?' + p[1]
      // window.location.href = 'http://192.168.0.173/h5/#/pages/staff/meetingDetail?' + p[1]
      // window.location.href = 'http://192.168.0.173/h5/#/pages/staff/index?' + p[1]
  </script>
</head>
h5_meeting/.hbuilderx/launch.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,9 @@
{
    "version" : "1.0",
    "configurations" : [
        {
            "openVueDevtools" : false,
            "type" : "uni-app:h5"
        }
    ]
}
h5_meeting/manifest.json
@@ -19,7 +19,7 @@
                        "/meetingAdmin": {
                            // è¿™ä¸ªå­—段名需与你配置的basePrefixUrl一致,系统识别到带有/dev-api请求的地址时,会在前面拼接上代理服务器地址
                            // "target" : "http://192.168.0.173/admin_interface", // ä»£ç†æœåŠ¡å™¨åŸŸåæˆ–IP地址
                            "target": "http://192.168.0.139:10010", // ä»£ç†æœåŠ¡å™¨åŸŸåæˆ–IP地址
                            "target": "http://192.168.137.1:10010", // ä»£ç†æœåŠ¡å™¨åŸŸåæˆ–IP地址
                            "changeOrigin": true, // å…è®¸è·¨åŸŸ 
                            "pathRewrite": {
                                "^/meetingAdmin": "" // é‡å†™åœ°å€ï¼Œå¦‚果实际接口中是不带/dev-api,需要将这个前缀置空,因为这个前缀只是为了识别用,识别完之后就没用了
h5_meeting/package-lock.json
@@ -1,17 +1,131 @@
{
  "name": "h5_meeting",
  "lockfileVersion": 3,
  "requires": true,
  "packages": {
    "": {
      "dependencies": {
        "dayjs": "^1.11.13"
  "lockfileVersion": 1,
  "dependencies": {
    "balanced-match": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
      "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
    },
    "brace-expansion": {
      "version": "2.0.1",
      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
      "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
      "requires": {
        "balanced-match": "^1.0.0"
      }
    },
    "node_modules/dayjs": {
      "version": "1.11.13",
      "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz",
      "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg=="
    "dayjs": {
      "version": "1.11.13"
    },
    "decompress-response": {
      "version": "6.0.0",
      "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
      "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
      "requires": {
        "mimic-response": "^3.1.0"
      }
    },
    "fs.realpath": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
      "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
    },
    "glob": {
      "version": "8.1.0",
      "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz",
      "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==",
      "requires": {
        "fs.realpath": "^1.0.0",
        "inflight": "^1.0.4",
        "inherits": "2",
        "minimatch": "^5.0.1",
        "once": "^1.3.0"
      }
    },
    "inflight": {
      "version": "1.0.6",
      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
      "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
      "requires": {
        "once": "^1.3.0",
        "wrappy": "1"
      }
    },
    "inherits": {
      "version": "2.0.4",
      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
    },
    "js-binary-schema-parser": {
      "version": "2.0.3",
      "resolved": "https://registry.npmjs.org/js-binary-schema-parser/-/js-binary-schema-parser-2.0.3.tgz",
      "integrity": "sha512-xezGJmOb4lk/M1ZZLTR/jaBHQ4gG/lqQnJqdIv4721DMggsa1bDVlHXNeHYogaIEHD9vCRv0fcL4hMA+Coarkg=="
    },
    "mimic-response": {
      "version": "3.1.0",
      "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
      "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ=="
    },
    "minimatch": {
      "version": "5.1.6",
      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
      "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
      "requires": {
        "brace-expansion": "^2.0.1"
      }
    },
    "once": {
      "version": "1.4.0",
      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
      "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
      "requires": {
        "wrappy": "1"
      }
    },
    "parenthesis": {
      "version": "3.1.8",
      "resolved": "https://registry.npmjs.org/parenthesis/-/parenthesis-3.1.8.tgz",
      "integrity": "sha512-KF/U8tk54BgQewkJPvB4s/US3VQY68BRDpH638+7O/n58TpnwiwnOtGIOsT2/i+M78s61BBpeC83STB88d8sqw=="
    },
    "simple-concat": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz",
      "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q=="
    },
    "simple-get": {
      "version": "4.0.1",
      "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz",
      "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==",
      "requires": {
        "decompress-response": "^6.0.0",
        "once": "^1.3.1",
        "simple-concat": "^1.0.0"
      }
    },
    "string-split-by": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/string-split-by/-/string-split-by-1.0.0.tgz",
      "integrity": "sha512-KaJKY+hfpzNyet/emP81PJA9hTVSfxNLS9SFTWxdCnnW1/zOOwiV248+EfoX7IQFcBaOp4G5YE6xTJMF+pLg6A==",
      "requires": {
        "parenthesis": "^3.1.5"
      }
    },
    "vue-qr": {
      "version": "4.0.9",
      "resolved": "https://registry.npmjs.org/vue-qr/-/vue-qr-4.0.9.tgz",
      "integrity": "sha512-pAISV94T0MNEYA3NGjykUpsXRE2QfaNxlu9ZhEL6CERgqNc21hJYuP3hRVzAWfBQlgO18DPmZTbrFerJC3+Ikw==",
      "requires": {
        "glob": "^8.0.1",
        "js-binary-schema-parser": "^2.0.2",
        "simple-get": "^4.0.1",
        "string-split-by": "^1.0.0"
      }
    },
    "wrappy": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
      "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
    }
  }
}
h5_meeting/package.json
@@ -1,5 +1,6 @@
{
  "dependencies": {
    "dayjs": "^1.11.13"
    "dayjs": "^1.11.13",
    "vue-qr": "^4.0.9"
  }
}
h5_meeting/pages/index/index.vue
@@ -2,37 +2,44 @@
    <view class="main_app">
        <image src="@/static/bg@2x.png" class="main_bg" mode=""></image>
        <view class="header_wrap">
            <view class="title" @touchend="touchend">会议室</view>
            <view class="title" @touchend="touchend">{{info.roomName}}</view>
            <view class="time_wrap">
                <view class="time">{{time}}</view>
                <view class="date">{{date}}</view>
            </view>
        </view>
        <view class="home_status orange">会议中</view>
        <view class="meeting_name">会议名称</view>
        <view class="home_status">
            <text v-if="!info.meetingListResponseList || info.meetingListResponseList.length == 0">空闲中</text>
            <text v-if="info.meetingListResponseList && info.meetingListResponseList.length > 0 && info.meetingListResponseList[0].meetingStatus == 4">即将开始</text>
            <text class="orange" v-if="info.meetingListResponseList && info.meetingListResponseList.length > 0 && info.meetingListResponseList[0].meetingStatus == 2">会议中</text>
            <text v-if="info.meetingListResponseList && info.meetingListResponseList.length > 0 && info.meetingListResponseList[0].meetingStatus == 1">未开始</text>
            <text v-if="info.meetingListResponseList && info.meetingListResponseList.length > 0 && info.meetingListResponseList[0].meetingStatus == 3">已结束</text>
            <text v-if="info.meetingListResponseList && info.meetingListResponseList.length > 0 && info.meetingListResponseList[0].meetingStatus == 5">已撤销</text>
        </view>
        <view class="meeting_name">{{meetingInfo.meetingName}}</view>
        <view class="meeting_con">
            <view class="content">
                <view class="line">
                    <image src="@/static/ic_time@2x.png"></image>
                    <text>10~12</text>
                    <text>{{meetingInfo.meetingTime }}</text>
                </view>
                <view class="line">
                    <image src="@/static/ic_people@2x.png"></image>
                    <text>10~12</text>
                    <text>预约人:{{meetingInfo.bookingUser }}</text>
                </view>
            </view>
            <view class="qrcode"></view>
            </view>
            <vueQr v-if="meetingInfo.id" :text="meetingInfo.id" class="qrcode" />
        </view>
        <view class="meeting_wrap">
            <view class="title">今日会议(6)</view>
            <view class="title">今日会议({{ info.meetingListResponseList && info.meetingListResponseList.length > 0 ? info.meetingListResponseList.length : 0 }})</view>
            <view class="list">
                <view class="item">
                    <view class="name">开发部会议</view>
                    <view class="line">预约人:李怀英</view>
                    <view class="line">13:30~15:00(即将开始)</view>
                <view class="item" v-for="item in info.meetingListResponseList">
                    <view class="name">{{item.meetingName}}</view>
                    <view class="line">预约人:{{item.bookingUser}}</view>
                    <view class="line">{{item.meetingTime}}({{statusMap[item.meetingStatus]}})</view>
                    <image src="@/static/ic_meeting@2x.png" class="item_bg"></image>
                </view>
                <view class="item empty">
                <view v-if="!info.meetingListResponseList || info.meetingListResponseList.length == 0" class="item empty">
                    <view class="name">暂无会议</view>
                    <view class="line">预约人:-</view>
                    <view class="line">-</view>
@@ -40,38 +47,66 @@
                </view>
            </view>
        </view>
        <!--  -->
        <swiper v-if="info.fileType == 0 && info.multifileList && info.multifileList.length > 0" class="swiper" circular autoplay indicator-dots>
            <swiper-item v-for="item in info.multifileList">
                <image class="swiper_item" :src="item.fileurlFull" mode="aspectFill"></image>
            </swiper-item>
        </swiper>
        <!--  -->
        <template v-if="info.fileType == 1 && info.multifileList && info.multifileList.length > 0">
            <video  :src="info.multifileList[0].fileurlFull" class="app_video" :autoplay="true" loop :controls="false"></video>
        </template>
    </view>
</template>
<script>
    import dayjs from 'dayjs'
    import dayjs from 'dayjs'
    import vueQr from 'vue-qr/src/packages/vue-qr.vue'
    import {
        meetScreenData
    } from '@/api/index.js'
    export default {
    export default {
        components: {vueQr},
        data() {
            return {
                time: '',
                date: '',
                timer: null,
                touchNum: 0,
                param: {}
                touchNum: 0,
                param: {},
                info: {},
                statusMap: {
                    1: '未开始',
                    2: '进行中',
                    3: '已结束',
                    4: '即将开始',
                    5: '已撤销',
                },
                meetingInfo: {}
            }
        },
        onLoad() {
            this.initDatetime()
            this.param = uni.getStorageSync('param') || {}
            if(!this.param.code){
                return uni.navigateTo({
                    url: '/pages/index/config'
                })
            }
        onLoad() {
            this.initDatetime()
            this.param = uni.getStorageSync('param') || {}
            if (!this.param.code) {
                return uni.navigateTo({
                    url: '/pages/index/config'
                })
            }
            this.getData()
        },
        methods: {
            getData() {
                meetScreenData({
                    roomId: this.param.code
                meetScreenData({
                    roomId: this.param.code
                }).then(res => {
                    this.info = res.data
                    if(this.info.meetingListResponseList && this.info.meetingListResponseList.length > 0){
                        this.meetingInfo = this.info.meetingListResponseList[0]
                        this.$forceUpdate()
                    }
                })
            },
            touchend() {
@@ -81,8 +116,8 @@
                        console.log('单击')
                    }
                    if (this.touchNum >= 2) {
                        uni.navigateTo({
                            url: '/pages/index/config'
                        uni.navigateTo({
                            url: '/pages/index/config'
                        })
                    }
                    this.touchNum = 0
@@ -95,13 +130,37 @@
                this.timer = setInterval(() => {
                    this.time = dayjs().format('HH:mm')
                    this.date = dayjs().format('YYYY-MM-DD') + ' ' + weeks[new Date().getDay()]
                }, 1000)
                }, 1000)
                setInterval(() => {
                    this.getData()
                },this.param.time ? this.param.time * 1000 : 60 * 1000)
            }
        }
    }
</script>
<style lang="scss" scoped>
<style lang="scss" scoped>
    .swiper{
        position: fixed;
        top: 0;
        left: 0;
        z-index: 999;
        width: 100%;
        height: 100vh;
        .swiper_item{
            background-color: #0095AC;
            width: 100%;
            height: 100vh;
        }
    }
    .app_video{
        width: 100%;
        height: 100vh;
        position: fixed;
        top: 0;
        left: 0;
        z-index: 999;
    }
    .main_app {
        width: 100%;
        min-height: 100vh;
@@ -112,7 +171,7 @@
        justify-content: space-between;
        padding-bottom: 35rpx;
        color: #fff;
        overflow: hidden;
        .meeting_wrap {
            margin-left: 42rpx;
            margin-top: 85rpx;
@@ -143,12 +202,14 @@
                    flex-shrink: 0;
                    flex-direction: column;
                    width: 403rpx;
                    height: 315rpx;
                    background: linear-gradient(90deg, #0095AC 0%, #00B5D1 100%);
                    height: 315rpx;
                    background: linear-gradient( 90deg, #0080FF 0%, #00B0FF 100%);
                    border-radius: 7rpx;
                    margin-right: 28rpx;
                    position: relative;
                    &:nth-of-type(1){
                        background: linear-gradient(90deg, #0095AC 0%, #00B5D1 100%);
                    }
                    .item_bg {
                        position: absolute;
                        width: 178rpx;
@@ -201,7 +262,6 @@
            .qrcode {
                width: 166rpx;
                height: 166rpx;
                border: 1px solid red;
            }
        }
server/meeting/meeting_admin/src/main/java/com/doumee/cloud/admin/MeetingCloudController.java
@@ -15,6 +15,7 @@
import com.doumee.dao.web.response.MeetingDetailResponse;
import com.doumee.dao.web.response.MeetingListResponse;
import com.doumee.dao.web.response.MonthDataResponse;
import com.doumee.dao.web.response.RoomDetailResponse;
import com.doumee.service.business.BookingsService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
@@ -136,8 +137,28 @@
    @PostMapping("/reservationCancel")
    public ApiResponse reservationCancel(@RequestBody BusinessOverDTO businessOverDTO, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        LoginUserInfo user = getLoginUser(token);
        businessOverDTO.setUserId(user.getId())   ;
        businessOverDTO.setUserId(user.getId());
        bookingsService.reservationCancel(businessOverDTO);
        return ApiResponse.success("操作成功");
    }
    @ApiOperation("提前开始会议")
    @PostMapping("/startEarly")
    public ApiResponse startEarly(@RequestBody BusinessOverDTO businessOverDTO,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        LoginUserInfo user = getLoginUser(token);
        businessOverDTO.setUserId(user.getId());
        businessOverDTO.setStartType(Constants.ZERO);
        bookingsService.startEarly(businessOverDTO);
        return ApiResponse.success("操作成功");
    }
    @ApiOperation("开始会议")
    @PostMapping("/start")
    public ApiResponse start(@RequestBody BusinessOverDTO businessOverDTO,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        LoginUserInfo user = getLoginUser(token);
        businessOverDTO.setUserId(user.getId());
        businessOverDTO.setStartType(Constants.ONE);
        bookingsService.start(businessOverDTO);
        return ApiResponse.success("操作成功");
    }
@@ -152,4 +173,5 @@
}
server/meeting/meeting_admin/src/main/java/com/doumee/cloud/web/MeetingApi.java
@@ -2,6 +2,7 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.doumee.api.BaseController;
import com.doumee.config.annotation.LoginNoRequired;
import com.doumee.core.annotation.trace.Trace;
import com.doumee.core.model.ApiResponse;
import com.doumee.core.model.LoginUserInfo;
@@ -17,6 +18,7 @@
import com.doumee.dao.web.response.MeetingDetailResponse;
import com.doumee.dao.web.response.MeetingListResponse;
import com.doumee.dao.web.response.MonthDataResponse;
import com.doumee.dao.web.response.RoomDetailResponse;
import com.doumee.service.business.BookingsService;
import com.doumee.service.system.SystemUserService;
import io.swagger.annotations.Api;
@@ -162,5 +164,34 @@
        return ApiResponse.success("操作成功");
    }
    @ApiOperation("提前开始会议")
    @PostMapping("/startEarly")
    public ApiResponse startEarly(@RequestBody BusinessOverDTO businessOverDTO,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        LoginUserInfo user = getLoginUser(token);
        businessOverDTO.setUserId(user.getId());
        businessOverDTO.setStartType(Constants.ZERO);
        bookingsService.startEarly(businessOverDTO);
        return ApiResponse.success("操作成功");
    }
    @ApiOperation("开始会议")
    @PostMapping("/start")
    public ApiResponse start(@RequestBody BusinessOverDTO businessOverDTO,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        LoginUserInfo user = getLoginUser(token);
        businessOverDTO.setUserId(user.getId());
        businessOverDTO.setStartType(Constants.ONE);
        bookingsService.start(businessOverDTO);
        return ApiResponse.success("操作成功");
    }
    @LoginNoRequired
    @ApiOperation("会议屏信息")
    @GetMapping("/meetScreenData")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "query", dataType = "Integer", name = "roomId", value = "会议室主键", required = true),
    })
    public ApiResponse<RoomDetailResponse> meetScreenData(@RequestParam Integer roomId) {
        return ApiResponse.success("查询成功",bookingsService.getRoomDetail(roomId));
    }
}
server/meeting/meeting_service/src/main/java/com/doumee/core/wx/MeetConstants.java
@@ -16,6 +16,9 @@
    //发送会议开始  å®šæ—¶æå‰å¤šå°‘分钟发送
    public static final String NOTICE_TIME = "NOTICE_TIME";
    public static final String SYSTEM ="SYSTEM";
    public static final String EARLY_START = "EARLY_START";
    public static final String SOON_START = "SOON_START";
    public static final String MEET_CODE_PREFIX = "MEET_CODE_PREFIX";
server/meeting/meeting_service/src/main/java/com/doumee/dao/admin/request/BusinessOverDTO.java
@@ -18,5 +18,7 @@
    private  String businessRemark;
    @ApiModelProperty(value = "用户主键",required = true)
    private  Integer userId  ;
    @ApiModelProperty(value = "开始类型 0 æå‰å¼€å§‹ 1 æ­£å¸¸å¼€å§‹",required = true)
    private  Integer startType  ;
}
server/meeting/meeting_service/src/main/java/com/doumee/dao/business/BookingsMapper.java
@@ -24,7 +24,8 @@
    @Select(" select a.id , a.START_TIME , a.END_TIME , b.`NAME` as roomName , a.`NAME` as meetingName  ,date_format(a.START_TIME,'%Y-%m-%d') as meetingDate , a.START_TIME as startTime, a.status ," +
            " CONCAT(date_format(a.START_TIME,'%H:%i') , ' ~ ',date_format(a.END_TIME,'%H:%i')) as meetingTime,  c.REALNAME as bookingUser ," +
            " CASE WHEN a.START_TIME > now() AND a.`STATUS` = 0 THEN 1  WHEN ( (a.END_TIME < now()  AND a.`STATUS` = 0 ) or a.`STATUS` = 2 ) THEN 3 WHEN a.`STATUS` = 1 THEN 5 ELSE  2  END meetingStatus ," +
            //" CASE WHEN a.START_TIME > now() AND a.`STATUS` = 0 THEN 1  WHEN ( (a.END_TIME < now()  AND a.`STATUS` = 0 ) or a.`STATUS` = 2 ) THEN 3 WHEN a.`STATUS` = 1 THEN 5 ELSE  2  END meetingStatus ," +
            " CASE WHEN a.START_TIME_REAL IS NULL AND a.`STATUS` = 0 THEN 1  WHEN ( (a.END_TIME < now()  AND a.`STATUS` = 0 ) or a.`STATUS` = 2 ) THEN 3 WHEN a.`STATUS` = 1 THEN 5 ELSE  2  END meetingStatus ," +
            " b.IMGURL as imgUrl ," +
            " a.remark  " +
            " from meeting_book a inner join meeting_rooms b  on a.ROOM_ID = b.ID  " +
@@ -32,11 +33,21 @@
            " ${ew.customSqlSegment} ")
    IPage<MeetingListResponse> myMeetingPage(IPage<MeetingListResponse> page, @Param(Constants.WRAPPER) Wrapper wrapper);
    @Select(" select a.id , a.START_TIME , a.END_TIME , b.`NAME` as roomName , a.`NAME` as meetingName  ,date_format(a.START_TIME,'%Y-%m-%d') as meetingDate , a.START_TIME as startTime, a.status ," +
            " CONCAT(date_format(a.START_TIME,'%H:%i') , ' ~ ',date_format(a.END_TIME,'%H:%i')) as meetingTime,  c.REALNAME as bookingUser ," +
            //" CASE WHEN a.START_TIME > now() AND a.`STATUS` = 0 THEN 1  WHEN ( (a.END_TIME < now()  AND a.`STATUS` = 0 ) or a.`STATUS` = 2 ) THEN 3 WHEN a.`STATUS` = 1 THEN 5 ELSE  2  END meetingStatus ," +
            " CASE WHEN a.START_TIME_REAL IS NULL AND a.`STATUS` = 0 THEN 1  WHEN ( (a.END_TIME < now()  AND a.`STATUS` = 0 ) or a.`STATUS` = 2 ) THEN 3 WHEN a.`STATUS` = 1 THEN 5 ELSE  2  END meetingStatus ," +
            " b.IMGURL as imgUrl ," +
            " a.remark  " +
            " from meeting_book a inner join meeting_rooms b  on a.ROOM_ID = b.ID  " +
            " inner join system_user c on a.CREATOR = c.id  " +
            " ${ew.customSqlSegment} ")
    List<MeetingListResponse> meetingList(@Param(Constants.WRAPPER) Wrapper wrapper);
    @Select(" select a.id , a.START_TIME , a.END_TIME , b.id as roomId,  b.`NAME` as roomName , a.`NAME` as meetingName  ,date_format(a.START_TIME,'%Yå¹´%m月%d日') as meetingDate ," +
            " CONCAT(date_format(a.START_TIME,'%H:%i') , ' ~ ',date_format(a.END_TIME,'%H:%i')) as meetingTime,  c.REALNAME as bookingUserName ," +
            "  CASE WHEN a.START_TIME > now() AND a.`STATUS` = 0 THEN 1  WHEN a.END_TIME < now() AND a.`STATUS` = 0  THEN 3 WHEN a.`STATUS` = 1 THEN 5 ELSE  2  END meetingStatus ," +
            //"  CASE WHEN a.START_TIME > now() AND a.`STATUS` = 0 THEN 1  WHEN a.END_TIME < now() AND a.`STATUS` = 0  THEN 3 WHEN a.`STATUS` = 1 THEN 5 ELSE  2  END meetingStatus ," +
            "  CASE WHEN a.START_TIME_REAL IS NULL AND a.`STATUS` = 0 THEN 1  WHEN a.END_TIME < now() AND a.`STATUS` = 0  THEN 3 WHEN a.`STATUS` = 1 THEN 5 ELSE  2  END meetingStatus ," +
            " a.CONTENT as meetingContent, c.MOBILE as bookingUserMobile , e.`NAME` as bookingUserDepartment , a.CREATOR as bookingUserId  , a.remark  " +
            " from meeting_book a inner join meeting_rooms b  on a.ROOM_ID = b.ID  " +
            " left join system_user c on a.CREATOR = c.id " +
server/meeting/meeting_service/src/main/java/com/doumee/dao/business/model/Bookings.java
@@ -105,6 +105,9 @@
    @ApiModelProperty(value = "取消备注")
    private String doneInfo;
    @ApiModelProperty(value = "提前开始时间")
    private Date startTimeReal;
    @ApiModelProperty(value = "预约人")
    @TableField(exist = false)
    private String realName ;
server/meeting/meeting_service/src/main/java/com/doumee/dao/business/model/Rooms.java
@@ -1,8 +1,10 @@
package com.doumee.dao.business.model;
import cn.hutool.core.img.Img;
import com.baomidou.mybatisplus.annotation.TableField;
import com.doumee.core.annotation.excel.ExcelColumn;
import com.doumee.core.model.LoginUserModel;
import com.doumee.dao.system.model.Multifile;
import com.doumee.dao.system.model.SystemUser;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
@@ -73,6 +75,9 @@
    @ExcelColumn(name="容纳人数")
    private Integer limitNum;
    @ApiModelProperty(value = "会议室文件类型:0=图片(多图),1=视频,2=无")
    private Integer fileType;
    @ApiModelProperty(value = "会议室图片")
    @ExcelColumn(name="会议室图片")
    private String imgurl;
@@ -111,7 +116,9 @@
    @TableField(exist = false)
    private String imgFullUrl;
    @ApiModelProperty(value = "附件文件")
    @TableField(exist = false)
    private List<Multifile> multifileList;
}
server/meeting/meeting_service/src/main/java/com/doumee/dao/web/response/MeetingListResponse.java
@@ -1,5 +1,6 @@
package com.doumee.dao.web.response;
import com.doumee.dao.system.model.Multifile;
import com.doumee.dao.system.model.SystemUser;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
@@ -7,6 +8,7 @@
import java.io.Serializable;
import java.util.Date;
import java.util.List;
/**
 * Created by IntelliJ IDEA.
@@ -39,7 +41,7 @@
    @ApiModelProperty(value = "会议开始时间",hidden = true)
    private Date startTime;
    @ApiModelProperty(value = "状态 0已预约 1已撤销 ",hidden = true)
    @ApiModelProperty(value = "状态 0已预约 1已撤销 2已结束",hidden = true)
    private Integer status;
    @ApiModelProperty(value = "会议预约人")
@@ -48,6 +50,12 @@
    @ApiModelProperty(value = "会议室图片")
    private String imgUrl;
    @ApiModelProperty(value = "文件类型")
    private Integer fileType;
    @ApiModelProperty(value = "会议室附件信息")
    private List<Multifile> multifileList;
    @ApiModelProperty(value = "前缀")
    private String prefixUrl;
server/meeting/meeting_service/src/main/java/com/doumee/dao/web/response/RoomDetailResponse.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,39 @@
package com.doumee.dao.web.response;
import com.doumee.dao.system.model.Multifile;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
import java.util.List;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2023/3/23 9:25
 */
@Data
@ApiModel("会议室屏信息返回类")
public class RoomDetailResponse {
    @ApiModelProperty(value = "主键")
    private Integer id;
    @ApiModelProperty(value = "会议室名称")
    private String roomName;
    @ApiModelProperty(value = "会议室文件类型:0=图片(多图),1=视频,2=无")
    private Integer fileType;
    @ApiModelProperty(value = "二维码前缀")
    private String prefix;
    @ApiModelProperty(value = "会议室文件")
    private List<Multifile> multifileList;
    @ApiModelProperty(value = "会议列表")
    private List<MeetingListResponse> meetingListResponseList;
}
server/meeting/meeting_service/src/main/java/com/doumee/dao/web/response/RoomsResponse.java
@@ -8,6 +8,7 @@
import com.doumee.dao.business.model.ProjectRel;
import com.doumee.dao.business.model.RoomTime;
import com.doumee.dao.business.model.UserRel;
import com.doumee.dao.system.model.Multifile;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
@@ -52,6 +53,9 @@
    @ApiModelProperty(value = "使用须知")
    private String tips;
    @ApiModelProperty(value = "会议室文件类型:0=图片(多图),1=视频,2=无")
    private Integer fileType;
    @ApiModelProperty(value = "参会人员")
    @TableField(exist = false)
    private List<UserRel> sysList;
@@ -59,4 +63,8 @@
    @ApiModelProperty(value = "服务项目")
    @TableField(exist = false)
    private List<ProjectRel> projectList;
    @ApiModelProperty(value = "附件文件")
    private List<Multifile> multifileList;
}
server/meeting/meeting_service/src/main/java/com/doumee/service/business/BookingsService.java
@@ -17,6 +17,7 @@
import com.doumee.dao.web.response.DateTimeResourceDate;
import com.doumee.dao.web.response.MeetingDetailResponse;
import com.doumee.dao.web.response.MeetingListResponse;
import com.doumee.dao.web.response.RoomDetailResponse;
import org.apache.ibatis.annotations.Param;
import java.time.LocalDateTime;
@@ -166,8 +167,6 @@
    /**
     * ä¼šè®®é¢„约记录取消
     * @param id
     * @param userId
     */
    void reservationCancel(BusinessOverDTO businessOverDTO);
@@ -210,4 +209,10 @@
    IPage<UserResponse> getUserPage(PageWrap<UserPageRequest> pageWrap);
    void reservationOver(BusinessOverDTO businessOverDTO);
    void start(BusinessOverDTO businessOverDTO);
    void startEarly(BusinessOverDTO businessOverDTO);
    RoomDetailResponse getRoomDetail(Integer roomId);
}
server/meeting/meeting_service/src/main/java/com/doumee/service/business/impl/BookingsServiceImpl.java
@@ -841,19 +841,7 @@
                .orderByAsc(Constants.equalsInteger(pageWrap.getModel().getQueryType(),MeetConstants.ONE),"a.START_TIME");
        IPage<MeetingListResponse> page = bookingsMapper.myMeetingPage(pageWrap.toPage(), queryWrapper);
        String path = systemDictDataBiz.queryByCode(MeetConstants.FTP, MeetConstants.FTP_RESOURCE_PATH).getCode() + systemDictDataBiz.queryByCode(MeetConstants.FTP, MeetConstants.PROJECTS).getCode();
        page.getRecords().forEach(i -> {
            i.setPrefixUrl(path);
            if(i.getMeetingStatus().equals(Constants.ZERO)){
                if(i.getMeetingStatus()==Constants.ONE){
                    //开始前120分钟 å¤§äºŽå½“前时间 åˆ™æ˜¾ç¤ºå³å°†å¼€å§‹
                    if(DateUtil.afterMinutesDate(i.getStartTime(),-120).getTime()>System.currentTimeMillis()){
                        i.setMeetingStatus(4);
                    }
                }
            }
        });
        this.dealMeetingStatus(page.getRecords());
        return page;
    }
@@ -904,9 +892,7 @@
                .eq("BOOKING_ID", id)
                .eq("ISDELETED", MeetConstants.ZERO)
        ));
        //参会人员列表
        List<UserResponse> userResponseList = systemUserService.getUserList(id);
        String avatarPath = systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_RESOURCE_PATH).getCode()
                +systemDictDataBiz.queryByCode(Constants.FTP,Constants.MEMBER_IMG).getCode();
@@ -1074,9 +1060,145 @@
                bookingTimeJoinMapper.updateById(bookingTime);
            }
        }
    }
    /**
     * æ­£å¸¸å¼€å§‹
     * @param businessOverDTO
     */
    @Override
    @Transactional(rollbackFor = {Exception.class,BusinessException.class})
    public void start(BusinessOverDTO businessOverDTO) {
        this.startEarly(businessOverDTO);
    }
    /**
     * æå‰å¼€å§‹
     * @param businessOverDTO
     */
    @Override
    @Transactional(rollbackFor = {Exception.class,BusinessException.class})
    public void startEarly(BusinessOverDTO businessOverDTO) {
        if(Objects.isNull(businessOverDTO)
                || Objects.isNull(businessOverDTO.getUserId())
                || Objects.isNull(businessOverDTO.getStartType())
                || Objects.isNull(businessOverDTO.getId())
        ){
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        Bookings bookings = bookingsMapper.selectById(businessOverDTO.getId());
        if (Objects.isNull(bookings)) {
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "未查询到预约记录");
        }
        Long userRelList = userRelMapper.selectCount(new QueryWrapper<UserRel>().lambda()
                .eq(UserRel::getIsdeleted,Constants.ZERO)
                .eq(UserRel::getObjId,bookings.getRoomId())
                .eq(UserRel::getObjType,Constants.ONE)
                .eq(UserRel::getUserId,businessOverDTO.getUserId()));
        if (!bookings.getCreator().equals(businessOverDTO.getUserId()) && userRelList <= 0) {
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "非你的预约记录,无法进行该操作");
        }
        if(!Constants.equalsInteger(bookings.getStatus(),Constants.ZERO)){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "会议状态已流转,无法进行该操作");
        }
        if(Objects.nonNull(bookings.getStartTimeReal())){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "会议已开始,请勿重复操作");
        }
        if (System.currentTimeMillis() > bookings.getEndTime().getTime()) {
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "会议已结束,无法进行该操作");
        }
        if(Constants.equalsInteger(businessOverDTO.getStartType(),Constants.ZERO)){
            //根据配置获取提前开始的分钟数量
            String configMinute = systemDictDataBiz.queryByCode(MeetConstants.SYSTEM, MeetConstants.EARLY_START).getCode();
            Integer beforeMinutes = StringUtils.isNotBlank(configMinute) ? Integer.valueOf(configMinute) : 120;
            if(DateUtil.afterMinutesDate(bookings.getStartTime(),-beforeMinutes).getTime()>System.currentTimeMillis()){
                throw  new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"会议仅可以提前"+beforeMinutes+"分钟开始");
            }
        }else{
            if(bookings.getStartTime().getTime() > System.currentTimeMillis()){
                throw  new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"未到会议申请开始时间,无法进行开启");
            }
        }
        bookings.setStartTimeReal(new Date());
        bookings.setEditDate(new Date());
        bookings.setEditor(businessOverDTO.getUserId());
        bookingsMapper.updateById(bookings);
        //更新已结束但未结束的会议信息为已结束
        bookingsMapper.update(null,new UpdateWrapper<Bookings>()
                .lambda()
                .set(Bookings::getStatus,Constants.TWO)
                .set(Bookings::getDoneDate,new Date())
                .apply(" END_TIME < now() ")
                .eq(Bookings::getStatus,Constants.ZERO)
                .eq(Bookings::getRoomId,bookings.getRoomId())
        );
    }
    @Override
    public RoomDetailResponse getRoomDetail(Integer roomId){
        Rooms rooms =  roomsMapper.selectById(roomId);
        if(Objects.isNull(rooms) ||  !Constants.equalsInteger(rooms.getIsdeleted(),Constants.ZERO)
         || !Constants.equalsInteger(rooms.getStatus(),Constants.ZERO)){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"会议室信息无效,请联系管理员");
        }
        RoomDetailResponse response = new RoomDetailResponse();
        response.setRoomName(rooms.getName());
        response.setFileType(rooms.getFileType());
        List<Multifile> multifileList = multifileJoinMapper.selectList(new QueryWrapper<Multifile>().lambda()
                .eq(Multifile::getObjId,roomId)
                .eq(Multifile::getObjType,Constants.FOUR)
        );
        String prefix = systemDictDataBiz.queryByCode(MeetConstants.SYSTEM, MeetConstants.MEET_CODE_PREFIX).getCode() ;
        response.setPrefix(prefix);
        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(multifileList)){
            String path = systemDictDataBiz.queryByCode(MeetConstants.FTP, MeetConstants.FTP_RESOURCE_PATH).getCode() + systemDictDataBiz.queryByCode(MeetConstants.FTP, MeetConstants.PROJECTS).getCode();
            for (Multifile multifile:multifileList) {
                multifile.setFileurlFull(path + multifile.getFileurl());
            }
            response.setMultifileList(multifileList);
        }
        //查询会议列表
        List<MeetingListResponse> meetingList = bookingsMapper.meetingList(
                new QueryWrapper<Bookings>()
                .eq( "b.id", rooms.getId())
                .eq("b.ISDELETED",MeetConstants.ZERO)
                .eq("b.STATUS",MeetConstants.ZERO)
                .eq("a.ISDELETED",MeetConstants.ZERO)
                .eq("a.status",Constants.ZERO)
                .like("a.start_time",DateUtil.getCurrDate())
                .orderByAsc("a.start_time")
        );
        this.dealMeetingStatus(meetingList);
        response.setMeetingListResponseList(meetingList);
        return response;
    }
    public void dealMeetingStatus(List<MeetingListResponse> meetingResponseList){
        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(meetingResponseList)){
            String path = systemDictDataBiz.queryByCode(MeetConstants.FTP, MeetConstants.FTP_RESOURCE_PATH).getCode() + systemDictDataBiz.queryByCode(MeetConstants.FTP, MeetConstants.PROJECTS).getCode();
            String configMinute = systemDictDataBiz.queryByCode(MeetConstants.SYSTEM, MeetConstants.SOON_START).getCode();
            Integer minute = StringUtils.isNotBlank(configMinute) ? Integer.valueOf(configMinute) : 120;
            for (MeetingListResponse m:meetingResponseList) {
                if(Constants.equalsInteger(m.getStatus(),Constants.ZERO)&&Constants.equalsInteger(m.getMeetingStatus(),Constants.ONE)){
                    //开始前120分钟 å¤§äºŽå½“前时间 åˆ™æ˜¾ç¤ºå³å°†å¼€å§‹
                    if(DateUtil.afterMinutesDate(m.getStartTime(),-minute).getTime()>System.currentTimeMillis()){
                        m.setMeetingStatus(4);
                    }
                }
                m.setPrefixUrl(path);
            }
        }
    }
    /**
     * å®šæ—¶å‘送会议 å³å°†å¼€å§‹é€šçŸ¥
     */
server/meeting/meeting_service/src/main/java/com/doumee/service/business/impl/RoomsServiceImpl.java
@@ -16,6 +16,7 @@
import com.doumee.dao.business.RoomsMapper;
import com.doumee.dao.business.join.*;
import com.doumee.dao.business.model.*;
import com.doumee.dao.system.model.Multifile;
import com.doumee.dao.system.model.SystemUser;
import com.doumee.dao.web.request.MeetingPageRequest;
import com.doumee.dao.web.request.RoomsRequest;
@@ -56,6 +57,9 @@
    private RoomsMapper roomsMapper;
    @Autowired
    private RoomsJoinMapper roomsJoinMapper;
    @Autowired
    private MultifileJoinMapper multifileJoinMapper;
    @Autowired
    private RoomTimeJoinMapper roomTimeJoinMapper;
@@ -90,7 +94,9 @@
        if (starttime.after(endtime) || starttime.equals(endtime)) {
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "日期区间错误");
        }
        if(!Constants.equalsInteger(rooms.getFileType(),Constants.TWO)&&CollectionUtils.isEmpty(rooms.getMultifileList())){
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"未上传文件图片");
        }
        rooms.setCreateDate(new Date());
        rooms.setIsdeleted(Constants.ZERO);
@@ -98,7 +104,21 @@
        rooms.setStatus(Constants.ZERO);
        rooms.setEditDate(rooms.getCreateDate());
        roomsMapper.insert(rooms);
        if(!Constants.equalsInteger(rooms.getFileType(),Constants.TWO)){
            List<Multifile> multifileList = rooms.getMultifileList();
            for (Multifile multifile:multifileList) {
                if(Objects.isNull(multifile)
                || StringUtils.isBlank(multifile.getFileurl())){
                    throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"附件参数错误");
                }
                multifile.setCreateDate(new Date());
                multifile.setObjId(rooms.getId());
                multifile.setObjType(Constants.FOUR);
                multifile.setIsdeleted(Constants.ZERO);
                multifile.setCreator(user.getId());
            }
            multifileJoinMapper.insert(multifileList);
        }
        rooms.setStartTime(rooms.getStartTime()+":00");
        rooms.setEndTime(rooms.getEndTime()+":00");
        rooms.setStartTime(DateUtil.formatDate(starttime.getTime(), "yyyy-MM-dd HH:mm:ss"));
@@ -117,6 +137,7 @@
        if (StringUtils.isBlank(rooms.getName()) ||
                StringUtils.isBlank(rooms.getStartTime()) ||
                StringUtils.isBlank(rooms.getEndTime()) ||
                Objects.isNull(rooms.getFileType()) ||
                rooms.getIntervalTime() == null
        ) {
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), ResponseStatus.BAD_REQUEST.getMessage());
@@ -352,15 +373,43 @@
            rooms.setIntervalTime(null);
        }
        rooms.setEditDate(new Date());
        rooms.setEditor(user.getId());
//        if(!Constants.equalsInteger(rooms.getFileType(),Constants.TWO)&&StringUtils.isBlank(rooms.getImgurl())){
//            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"未上传文件图片");
//        }
//        if(Constants.equalsInteger(rooms.getFileType(),Constants.TWO)){
//            rooms.setImgurl(null);
//        }
        roomsMapper.update(rooms, Wrappers.<Rooms>lambdaUpdate()
                .set(Rooms::getFileType, rooms.getFileType())
                .set(Rooms::getLimitNum, rooms.getLimitNum())
                .set(Rooms::getTips, rooms.getTips())
                .set(Rooms::getImgurl, rooms.getImgurl())
                .eq(Rooms::getId, rooms.getId()));
        multifileJoinMapper.delete(new QueryWrapper<Multifile>().lambda()
                .eq(Multifile::getObjId,rooms.getId())
                .eq(Multifile::getObjType,Constants.FOUR)
        );
        if(!Constants.equalsInteger(rooms.getFileType(),Constants.TWO)){
            List<Multifile> multifileList = rooms.getMultifileList();
            for (Multifile multifile:multifileList) {
                if(Objects.isNull(multifile)
                        || StringUtils.isBlank(multifile.getFileurl())){
                    throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"附件参数错误");
                }
                multifile.setCreateDate(new Date());
                multifile.setObjId(rooms.getId());
                multifile.setObjType(Constants.FOUR);
                multifile.setIsdeleted(Constants.ZERO);
                multifile.setCreator(user.getId());
            }
            multifileJoinMapper.insert(multifileList);
        }
        rooms.setStartTime(rooms.getStartTime()+":00");
        rooms.setEndTime(rooms.getEndTime()+":00");
@@ -483,6 +532,19 @@
            findpr.leftJoin(Projects.class,Projects::getId,ProjectRel::getProjectId);
            List<ProjectRel> projectLisr=  projectRelJoinMapper.selectJoinList(ProjectRel.class,findpr);
            s.setProjectList(projectLisr);
            if(!Constants.equalsInteger(s.getFileType(),Constants.TWO)){
                List<Multifile > multifileList = multifileJoinMapper.selectList(new QueryWrapper<Multifile>().lambda()
                        .eq(Multifile::getObjId,s.getId())
                        .eq(Multifile::getObjType,Constants.FOUR)
                );
                if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(multifileList)){
                    for (Multifile multifile:multifileList) {
                        multifile.setFileurlFull(path + multifile.getFileurl());
                    }
                    s.setMultifileList(multifileList);
                }
            }
        });
        return PageData.from(result);
@@ -591,6 +653,13 @@
        List<ProjectRel> projectList=  projectRelJoinMapper.selectJoinList(ProjectRel.class,findProjectRel);
        roomsResponse.setProjectList(projectList);
        if(Objects.nonNull(roomsResponse.getFileType()) && !Constants.equalsInteger(roomsResponse.getFileType(),Constants.TWO)){
            roomsResponse.setMultifileList(
                     multifileJoinMapper.selectList(new QueryWrapper<Multifile>().lambda().eq(Multifile::getObjId,roomsResponse.getId())
                             .eq(Multifile::getObjType,Constants.FOUR))
            );
        }
        return roomsResponse;
    }
server/system_service/src/main/java/com/doumee/dao/system/model/Multifile.java
@@ -63,8 +63,8 @@
    @ExcelColumn(name="类型0图片 1视频 2其他")
    private Integer type;
    @ApiModelProperty(value = "关联对象类型 0会议室预定附件", example = "1")
    @ExcelColumn(name="关联对象类型 0会议室预定附件")
    @ApiModelProperty(value = "关联对象类型 0隐患现场情况 1隐患处理前情况 2隐患处理后情况 3隐患退回说明 4会议室文件", example = "1")
    @ExcelColumn(name="关联对象类型 0隐患现场情况 1隐患处理前情况 2隐患处理后情况 3隐患退回说明 4会议室文件")
    private Integer objType;
    @ApiModelProperty(value = "文件地址")
server/visits/dmvisit_service/src/main/java/com/doumee/dao/admin/response/InterestedListVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,26 @@
package com.doumee.dao.admin.response;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
import java.util.Map;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2024/2/26 11:02
 */
@Data
@ApiModel("工作台相关方数据")
public class InterestedListVO {
    @ApiModelProperty(value = "人数")
    private Long userNum;
    @ApiModelProperty(value = "名称")
    private String interestedName;
}
server/visits/dmvisit_service/src/main/java/com/doumee/dao/admin/response/PCWorkPlatformDataVO.java
@@ -56,7 +56,8 @@
    @ApiModelProperty(value = "出园车次")
    private Long todayOutCarNum;
    @ApiModelProperty(value = "相关方数据")
    private List<InterestedListVO> interestedListVOList;
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/HiddenDangerServiceImpl.java
@@ -46,10 +46,13 @@
    @Autowired
    private HiddenDangerMapper hiddenDangerMapper;
    @Autowired
    private MultifileMapper multifileMapper;
    @Autowired
    private SystemDictDataBiz systemDictDataBiz;
    @Autowired
    private MemberMapper memberMapper;
@@ -370,6 +373,7 @@
                .set(Notices::getReaded,Constants.ONE)
                .set(Notices::getStatus,Constants.ONE)
                .set(Notices::getParam2,hiddenDanger.getStatus())
                .set(Notices::getParam4,hiddenDanger.getLoginUserInfo().getMemberId())
                .eq(Notices::getObjId,hiddenDanger.getId())
                .eq(Notices::getObjType,Constants.THREE)
                .eq(Notices::getUserId,hiddenDanger.getLoginUserInfo().getMemberId())