doum
2025-09-29 1d064aa5ec2556155bbf116cef1d6d0ac5007acc
Merge remote-tracking branch 'origin/wuhuyancao' into wuhuyancao
已添加6个文件
已修改26个文件
1313 ■■■■■ 文件已修改
h5/App.vue 27 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/package-lock.json 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/package.json 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages.json 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/answer/answer.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/appointment/appointment.vue 678 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/driver/notice.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/index/index.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/loading/loading.vue 83 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/login/login.vue 54 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/notice/notice.vue 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/static/ic_fail.png 补丁 | 查看 | 原始文档 | blame | 历史
h5/static/loading.gif 补丁 | 查看 | 原始文档 | blame | 历史
h5/utils/config.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/utils/getCode.js 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/utils/http.interceptor.js 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/utils/service.js 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/dao/system/dto/LoginDTO.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/dao/system/dto/LoginH5DTO.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/dao/system/dto/LoginPhoneDTO.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/dao/system/model/SystemUser.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/service/system/impl/SystemLoginServiceImpl.java 31 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/MemberCloudController.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/web/VisitorWebController.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/core/dingTalk/DingTalk.java 138 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/core/dingTalk/DingTalkStream.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/web/response/DDAuthorizeVO.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/MemberService.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/CompanyServiceImpl.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java 108 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/VisitsServiceImpl.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/thrid/BoardServiceImpl.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/App.vue
@@ -6,20 +6,19 @@
    } from '@/api'
    export default {
        onLaunch: function() {
            window.addEventListener("popstate", (event) => {
                const path = this.$route.fullPath
                // console.log('path', path);
                if (path == '/pages/login/login' || path == '/') {
                    window.location.href = app_url
                }
                if (path == '/pages/wdata/home') {
                    window.location.href = 'https://atwl.ahzyssl.com/zhyq_h5/#/pages/wdata/home'
                }
                if (path == '/pages/waybill/home') {
                    window.location.href = 'https://atwl.ahzyssl.com/zhyq_h5/#/pages/waybill/home'
                }
            })
            uni.setStorageSync('transportList', [])
            // window.addEventListener("popstate", (event) => {
            //     const path = this.$route.fullPath
            //     if (path == '/pages/login/login' || path == '/') {
            //         window.location.href = app_url
            //     }
            //     if (path == '/pages/wdata/home') {
            //         window.location.href = 'https://atwl.ahzyssl.com/zhyq_h5/#/pages/wdata/home'
            //     }
            //     if (path == '/pages/waybill/home') {
            //         window.location.href = 'https://atwl.ahzyssl.com/zhyq_h5/#/pages/waybill/home'
            //     }
            // })
            // uni.setStorageSync('transportList', [])
            console.log('onLaunch')
        },
        onShow: function() {
h5/package-lock.json
@@ -27,11 +27,24 @@
            "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.13.tgz",
            "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg=="
        },
        "dingtalk-jsapi": {
            "version": "3.2.0",
            "resolved": "https://registry.npmmirror.com/dingtalk-jsapi/-/dingtalk-jsapi-3.2.0.tgz",
            "integrity": "sha512-PZhTM1T9ERdaOzjFbyokegVmf/vUVvlg0BKcMiP1bB0e3vBflroPpbW2SjrZEKuvFxFtuFDpvYpk2EhbbKH/6Q==",
            "requires": {
                "promise-polyfill": "^7.1.0"
            }
        },
        "mutation-observer": {
            "version": "1.0.3",
            "resolved": "https://registry.npmmirror.com/mutation-observer/-/mutation-observer-1.0.3.tgz",
            "integrity": "sha512-M/O/4rF2h776hV7qGMZUH3utZLO/jK7p8rnNgGkjKUw8zCGjRQPxB8z6+5l8+VjRUQ3dNYu4vjqXYLr+U8ZVNA=="
        },
        "promise-polyfill": {
            "version": "7.1.2",
            "resolved": "https://registry.npmmirror.com/promise-polyfill/-/promise-polyfill-7.1.2.tgz",
            "integrity": "sha512-FuEc12/eKqqoRYIGBrUptCBRhobL19PS2U31vMNTfyck1FxPyMfgsXyW4Mav85y/ZN1hop3hOwRlUDok23oYfQ=="
        },
        "regenerator-runtime": {
            "version": "0.14.1",
            "resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
h5/package.json
@@ -14,6 +14,7 @@
    },
    "dependencies": {
        "dayjs": "^1.11.13",
        "dingtalk-jsapi": "^3.2.0",
        "uniapp-qrcode": "^1.0.2",
        "uview-ui": "^2.0.37",
        "vconsole": "^3.15.1"
h5/pages.json
@@ -503,6 +503,20 @@
            {
                "navigationBarTitleText" : "选择被访人"
            }
        },
        {
            "path" : "pages/appointment/appointment",
            "style" :
            {
                "navigationBarTitleText" : "预约"
            }
        },
        {
            "path" : "pages/loading/loading",
            "style" :
            {
                "navigationBarTitleText" : "授权"
            }
        }
    ],
    "subPackages": [
h5/pages/answer/answer.vue
@@ -412,7 +412,7 @@
      }).then(res => {
        this.score = 0
        uni.navigateTo({
          url: `/pages/userinfo/userinfo?answerId=${res.data}`
          url: `/pages/appointment/appointment?answerId=${res.data}`
        })
      })
h5/pages/appointment/appointment.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,678 @@
<template>
    <view class="container">
        <view class="visitor-form">
            <view class="cell">
                <view class="title"><b>*</b>姓名</view>
                <view class="content">
                    <input class="input" @focus="showKeyboard = true" @blur="showKeyboard = false"
                        placeholder-style="color: #999999;" maxlength="30" v-model="visitorData.name" placeholder="请输入您的真实姓名" />
                </view>
            </view>
            <view class="cell">
                <view class="title"><b>*</b>手机号</view>
                <view class="content">
                    <input type="number" @focus="showKeyboard = true" @blur="showKeyboard = false" class="input" maxlength="11"
                        placeholder-style="color: #999999;" v-model="visitorData.phone" placeholder="请输入您的手机号" />
                </view>
            </view>
            <view class="cell">
                <view class="title"><b>*</b>证件类型</view>
                <view class="content" @click="show = true">
                    <text
                        :style="{color: visitorData.idcardTypeName ? '#000000' : ''}">{{visitorData.idcardTypeName ? visitorData.idcardTypeName : '请选择'}}</text>
                    <u-icon name="arrow-right" color="#CCCCCC" size="16" class="ml6"></u-icon>
                </view>
            </view>
            <view class="cell">
                <view class="title">证件号码</view>
                <view class="content">
                    <input class="input" maxlength="18" @focus="showKeyboard = true" @blur="showKeyboard = false"
                        placeholder-style="color: #999999;" v-model="visitorData.idcardNo" placeholder="请输入您的证件号码" />
                </view>
            </view>
            <view class="empty"></view>
            <view class="cell">
                <view class="title"><b>*</b>公司名称</view>
                <view class="content">
                    <input class="input" maxlength="50" @focus="showKeyboard = true" @blur="showKeyboard = false"
                        placeholder-style="color: #999999;" v-model="visitorData.companyName" placeholder="请输入您的公司名称" />
                </view>
            </view>
            <view class="cell">
                <view class="title1">
                    <text class="title1_a"><b>*</b>人脸照片</text>
                    <text class="title1_b">1、请提供五官清晰,人脸居中的正面人脸免冠照片;</text>
                    <text class="title1_b">2、照片无逆光、无PS、无过度美颜处理</text>
                </view>
                <view class="content">
                    <view class="content_uplaod" @click="upload('faceImg')" v-if="!visitorData.faceImgUrl">
                        <u-icon name="plus" color="rgb(153, 153, 153)" size="20"></u-icon>
                    </view>
                    <view class="content_uplaod" @click="upload('faceImg')" v-else>
                        <image :src="visitorData.faceImgUrl" mode="widthFix"></image>
                    </view>
                </view>
            </view>
            <view style="height: 20rpx; background-color: #F7F7F7;"></view>
            <view class="cell">
                <view class="title"><b>*</b>被访人</view>
                <view class="content" @click="selName">
                    <text
                        :style="{ color: form1.receptMemberName ? '#000000' : '' }">{{form1.receptMemberName ? form1.receptMemberName : "请选择"}}</text>
                    <u-icon name="arrow-right" color="#CCCCCC" size="16" class="ml6"></u-icon>
                </view>
            </view>
            <view class="cell">
                <view class="title"><b>*</b>入园时间</view>
                <view class="content" @click="show4 = true">
                    <text
                        :style="{color: form1.starttime ? '#000000' : ''}">{{form1.starttime ? form1.starttime : '请选择'}}</text>
                    <u-icon name="arrow-right" color="#CCCCCC" size="16" class="ml6"></u-icon>
                </view>
            </view>
            <view class="cell">
                <view class="title"><b>*</b>离园时间</view>
                <view class="content" @click="openLC">
                    <text
                        :style="{color: form1.endtime ? '#000000' : ''}">{{form1.endtime ? form1.endtime : '请选择'}}</text>
                    <u-icon name="arrow-right" color="#CCCCCC" size="16" class="ml6"></u-icon>
                </view>
            </view>
            <view class="cell">
                <view class="title"><b>*</b>拜访事由</view>
                <view class="content" @click="showReason = true">
                    <text
                        :style="{color: form1.reason ? '#000000' : ''}">{{form1.reason ? form1.reason : '请选择'}}</text>
                    <u-icon name="arrow-right" color="#CCCCCC" size="16" class="ml6"></u-icon>
                </view>
            </view>
            <view class="cell" v-if="form1.type == 1">
                <view class="title">施工内容</view>
                <view class="content">
                    <input class="input" @focus="showKeyboard = true" @blur="showKeyboard = false"
                        placeholder-style="color: #999999;" maxlength="30" v-model="form1.constructionReason" placeholder="请输入施工内容" />
                </view>
            </view>
            <view class="cell">
                <view class="title">随行车辆</view>
                <view class="content" @click="openInput(1)">
                    <text :style="{color: form1.carNos ? '#000000' : ''}">{{form1.carNos ? form1.carNos : '请输入车牌号码'}}</text>
                </view>
            </view>
            <!-- <view class="cell">
                <view class="title">健康证<b v-if="visit === '1'">*</b></view>
                <view class="content">
                    <view class="content_uplaod" @click="upload('imgurl')" v-if="!visitorData.imgurlUrl">
                        <u-icon name="plus" color="rgb(153, 153, 153)" size="28"></u-icon>
                    </view>
                    <view class="content_uplaod" @click="upload('imgurl')" v-else>
                        <image :src="visitorData.imgurlUrl" mode="widthFix"></image>
                    </view>
                </view>
            </view> -->
        </view>
        <view style="width: 100%; height: 110rpx;" v-if="!showKeyboard"></view>
        <view v-if="!showKeyboard" class="footer-box">
            <view class="submit-button" @click="submit">下一步</view>
        </view>
        <!-- <tly-picture-cut ref="tlyPictureCut" :pictureSrc="photoSrc" @createImg="uploadImg"></tly-picture-cut> -->
        <u-picker :show="show" :columns="columns" keyName="name" @cancel="show = false" @confirm="confirm"></u-picker>
        <qf-image-cropper ref="cropper" :width="280" :height="280" :radius="0" fileType="jpg"
            @crop="uploadImg"></qf-image-cropper>
        <keyboardInput ref="keyboard" @export="setPlate" @close="closeInput" />
        <!-- å…¥å›­æ—¶é—´ -->
        <u-datetime-picker :show="show4" :minDate="new Date().getTime()" :formatter="formatter" mode="datetime"
            @cancel="show4 = false" @confirm="setstarttime"></u-datetime-picker>
        <!-- ç¦»å›­æ—¶é—´  -->
        <u-datetime-picker v-if="form1.starttime" :show="show5" :formatter="formatter"
            :minDate="formatTimeStamp(form1.starttime)" :maxDate="formatTimeStamp(form1.starttime.slice(0,10) + ' 23:59')"
            mode="datetime" @cancel="show5 = false" @confirm="setendtime"></u-datetime-picker>
        <u-picker keyName="title" :show="showReason" :columns="VisitReason" @confirm="selectedReason"
            @cancel="showReason = false"></u-picker>
    </view>
</template>
<script>
    import tlyPictureCut from "@/components/tly-picture-cut/tlyPictureCut.vue";
    import keyboardInput from "@/components/keyboard-input/keyboard-input.vue"
    import QfImageCropper from '@/uni_modules/qf-image-cropper/components/qf-image-cropper/qf-image-cropper.vue';
    import {
        mapState
    } from 'vuex'
    import {
        uploadAvatar
    } from "@/utils/config"
    import {
        getSystemDictData,
        visitorSub,
        getVisitedVisitReason,
        createFk
    } from '@/api'
    export default {
        data() {
            return {
                photoSrc: "",
                inputType: '',
                show: false,
                showKeyboard: false,
                visit: '',
                type: '',
                show4: false,
                show5: false,
                showReason: false,
                personnel: [],
                VisitReason: [],
                columns: [
                    [{
                        name: '身份证',
                        id: 0
                    }, {
                        name: '港澳证件',
                        id: 1
                    }, {
                        name: '护照',
                        id: 2
                    }]
                ],
                fileList: [],
                visitorData: {
                    userAnswerId: '',
                    name: '',
                    phone: '',
                    idcardType: 0,
                    idcardTypeName: '身份证',
                    idcardNo: '',
                    faceImg: '',
                    faceImgUrl: '',
                    imgurl: '',
                    imgurlUrl: '',
                    companyName: ''
                },
                form1: {
                    phone1: '',
                    receptMemberId: '',
                    receptMemberName: '',
                    starttime: '',
                    endtime: '',
                    doors: '',
                    doorSelectName: '',
                    reason: '',
                    carNos: '',
                    type: 0
                },
                withUserList: {
                    name: '',
                    phone: '',
                    idcardType: '',
                    idcardTypeName: '',
                    companyName: '',
                    idcardNo: '',
                    faceImg: '',
                    faceImgUrl: '',
                    imgurl: '',
                    imgurlUrl: ''
                },
            }
        },
        components: {
            tlyPictureCut,
            QfImageCropper,
            keyboardInput
        },
        onLoad(option) {
            this.getUser()
            const visitorData = uni.getStorageSync('member')
            if (visitorData.faceImg) {
                visitorData.faceImgUrl = visitorData.prefixUrl + visitorData.faceImg
            }
            if (visitorData && visitorData.name) {
                this.visitorData = visitorData
            }
            this.visitorData.companyName = visitorData.visitCompanyName
            this.visitorData.idcardNo = visitorData.idcardDecode
            if (this.visitorData.idcardType === 0) {
                this.visitorData.idcardTypeName = '身份证'
            } else if (this.visitorData.idcardType === 1) {
                this.visitorData.idcardTypeName = '港澳证件'
            } else if (this.visitorData.idcardType === 2) {
                this.visitorData.idcardTypeName = '护照'
            }
            if (this.visitorData.imgurl) {
                    this.visitorData.imgurlUrl = this.visitorData.prefixUrl + this.visitorData.imgurl
                }
            // if (this.member ) {
            //     this.visitorData.name = this.member.name
            //     this.visitorData.phone = this.member.phone
            //     this.visitorData.idcardNo = this.member.idcardDecode
            //     this.visitorData.companyName = this.member.visitCompanyName
            //     this.visitorData.faceImg = this.member.faceImg
            //     if (this.member.faceImg) {
            //         this.visitorData.faceImgUrl = this.member.prefixUrl + this.member.faceImg
            //     }
            //     this.visitorData.imgurl = this.member.imgurl
            //     if (this.member.imgurl) {
            //         this.visitorData.imgurlUrl = this.member.prefixUrl + this.member.imgurl
            //     }
            //     this.visitorData.idcardType = this.member.idcardType
            //     if (this.member.idcardType === 0) {
            //         this.visitorData.idcardTypeName = '身份证'
            //     } else if (this.member.idcardType === 1) {
            //         this.visitorData.idcardTypeName = '港澳证件'
            //     } else if (this.member.idcardType === 2) {
            //         this.visitorData.idcardTypeName = '护照'
            //     }
            // }
            this.visitorData.userAnswerId = option.answerId || ''
            // this.getVisit()
            // uni.$on('update', (data) => {
            //     this.uploadImg(data.tempFilePath)
            // })
        },
        mounted() {
            this.$eventBus.$on('svisitorAppSel', (option) => {
                // this.$set(this.param, 'checkUserId', option.id)
                // this.$set(this.param, 'applyCheckUserId', option.id)
                // this.$set(this.param, 'checkorName', option.name)
                this.form1.receptMemberName = option.name
                this.form1.receptMemberId = option.id
                this.form1.receptMemberDepartment = option.companyName
            })
        },
        methods: {
            selectedReason(e) {
                this.form1.reason = e.value[0].title
                this.form1.type = e.value[0].constructionType
                this.showReason = false
            },
            // æŸ¥è¯¢ç”¨æˆ·
            getUser() {
                getVisitedVisitReason({}).then(res => {
                    this.VisitReason = [res.data || []]
                })
            },
            setendtime(e) {
                this.form1.endtime = uni.$u.timeFormat(e.value, 'yyyy-mm-dd hh:MM')
                this.show5 = false
            },
            formatTimeStamp(date) {
                return Date.parse(new Date(`${date}`)) || Date.parse(new Date(`${date.replace(/-/g, '/')}`))
            },
            openLC() {
                if (!this.form1.starttime) return uni.showToast({
                    title: '请先选择入园时间',
                    icon: 'none'
                })
                this.show5 = true
            },
            setstarttime(e) {
                this.form1.starttime = uni.$u.timeFormat(e.value, 'yyyy-mm-dd hh:MM')
                this.maxTime = this.form1.starttime
                this.show4 = false
            },
            formatter(type, value) {
                if (type === 'year') {
                    return `${value}å¹´`
                }
                if (type === 'month') {
                    return `${value}月`
                }
                if (type === 'day') {
                    return `${value}日`
                }
                if (type === 'hour') {
                    return `${value}时`
                }
                if (type === 'minute') {
                    return `${value}分`
                }
                return value
            },
            closeInput() {
                this.$refs.keyboard.close()
            },
            setPlate(e) {
                if (this.inputType === 1) {
                    this.form1.carNos = e
                } else if (this.inputType === 2) {
                    this.withUserList.carNos = e
                }
                this.$forceUpdate()
                this.closeInput()
            },
            openInput(type) {
                this.inputType = type
                this.$refs.keyboard.open()
            },
            selName() {
                uni.navigateTo({
                    url: '/pages/visitorApplication/memberSel'
                })
            },
            submit() {
                const {
                    visitorData
                } = this
                if (!this.visitorData.name) return uni.showToast({
                    title: '姓名不能为空',
                    icon: 'none'
                })
                if (!this.visitorData.phone) return uni.showToast({
                    title: '手机号不能为空',
                    icon: 'none'
                })
                const regExp = /^1[3456789]\d{9}$/;
                if (!regExp.test(this.visitorData.phone)) return uni.showToast({
                    title: '手机号格式错误',
                    icon: 'none'
                })
                if (!String(this.visitorData.idcardType)) return uni.showToast({
                    title: '证件类型不能为空',
                    icon: 'none'
                })
                // if (!this.visitorData.idcardNo) return uni.showToast({
                //     title: '证件号码不能为空',
                //     icon: 'none'
                // })
                if (this.visitorData.idcardType === 0 && this.visitorData.idcardNo) {
                    const regex = /^[1-9]\d{5}(19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[1-2]\d|3[0-1])\d{3}[\dxX]$/;
                    if (!regex.test(this.visitorData.idcardNo)) return uni.showToast({
                        title: '证件号码格式错误',
                        icon: 'none'
                    })
                }
                if (!this.visitorData.companyName) return uni.showToast({
                    title: '公司不能为空',
                    icon: 'none'
                })
                if (!this.visitorData.faceImg) return uni.showToast({
                    title: '人脸照片不能为空',
                    icon: 'none'
                })
                // if (this.visit === '1') {
                //     if (!this.visitorData.imgurl) return uni.showToast({
                //         title: '健康证不能为空',
                //         icon: 'none'
                //     })
                // }
                if (!this.form1.receptMemberId) return uni.showToast({
                    title: '请填写有效的访问人',
                    icon: 'none'
                })
                if (!this.form1.starttime) return uni.showToast({
                    title: '入园时间不能为空',
                    icon: 'none'
                })
                if (!this.form1.endtime) return uni.showToast({
                    title: '离园时间不能为空',
                    icon: 'none'
                })
                if (!this.form1.doorSelectName && this.accessControl == 1) return uni.showToast({
                    title: '访问门禁不能为空',
                    icon: 'none'
                })
                if (!this.form1.reason) return uni.showToast({
                    title: '拜访事由不能为空',
                    icon: 'none'
                })
                let data = JSON.parse(JSON.stringify(this.form1))
                data.starttime = data.starttime + ':00'
                data.endtime = data.endtime + ':00'
                createFk({
                    ...this.visitorData,
                    ...data,
                    withUserList: this.personnel
                }).then(res => {
                    if (res.code === 200) {
                        uni.navigateTo({
                            url: `/pages/appointmentDetails/appointmentDetails?id=${res.data}`
                        })
                    }
                })
                // uni.setStorageSync('visitorData', this.visitorData)
                // uni.navigateTo({
                //     url: `/pages/visitorApplication/visitorApplication?data=${JSON.stringify(this.visitorData)}`
                // });
            },
            getVisit() {
                // æ˜¯å¦éœ€è¦ å¥åº·è¯
                getSystemDictData({
                    dictCode: 'SYSTEM',
                    label: 'HEALTH_CARD'
                }).then(res => {
                    if (res.code === 200) {
                        this.visit = res.data.code
                    }
                })
            },
            uploadImg(file) {
                var that = this
                that.$refs.cropper.close()
                uni.showLoading({
                    title: '上传中',
                    mask: true
                });
                uni.uploadFile({
                    url: uploadAvatar,
                    filePath: file.tempFilePath,
                    name: 'file',
                    formData: {
                        folderCode: 'MEMBER_IMG',
                        // isFace: 0
                    },
                    success: (uploadFileRes) => {
                        let res = JSON.parse(uploadFileRes.data)
                        if(res.code !== 200){
                            return this.showToast(res.message)
                        }
                        this.visitorData.faceImg = res.data.halfPath
                        this.visitorData.faceImgUrl = res.data.prefixPath + res.data.folder + res.data.halfPath
                    },
                    fail: (err) => {
                        // this.showToast(err)
                    },
                    complete() {
                        uni.hideLoading();
                    }
                });
            },
            deleUser(i) {
                this.personnel.splice(i, 1)
            },
            upload(type) {
                var that = this
                that.type = type
                if (type === 'faceImg') {
                    that.$refs.cropper.chooseImage()
                    return
                }
                uni.chooseImage({
                    count: 1,
                    success: (chooseImageRes) => {
                        // if (type === 'faceImg') {
                        //     that.photoSrc = chooseImageRes.tempFilePaths[0];
                        //     that.$refs.tlyPictureCut.showPop();
                        // }
                        if (type === 'imgurl') {
                            uni.showLoading({
                                title: '上传中',
                                mask: true
                            });
                            uni.uploadFile({
                                url: uploadAvatar,
                                filePath: chooseImageRes.tempFilePaths[0],
                                name: 'file',
                                formData: {
                                    folderCode: 'MEMBER_IMG'
                                },
                                timeout: 60000,
                                success: (uploadFileRes) => {
                                    let res = JSON.parse(uploadFileRes.data)
                                    that.visitorData.imgurl = res.data.halfPath
                                    that.visitorData.imgurlUrl = res.data.prefixPath + res.data.folder + res.data.halfPath
                                },
                                complete() {
                                    uni.hideLoading();
                                }
                            });
                        }
                    },
                    fail(err) {
                        alert('api报错')
                    }
                });
            },
            confirm(e) {
                this.visitorData.idcardType = e.value[0].id
                this.visitorData.idcardTypeName = e.value[0].name
                this.show = false
            }
        }
    }
</script>
<style lang="scss">
    page {
        background-color: #F7F7F7 !important;
    }
    .u-upload__button {
        margin: 0 !important;
    }
    .content_uplaod {
        width: 120rpx;
        height: 120rpx;
        background: #F7F7F7;
        border-radius: 8rpx;
        border: 2rpx solid #E5E5E5;
        display: flex;
        align-items: center;
        justify-content: center;
        overflow: hidden;
    }
    .content_uplaod image {
        width: 100%;
        height: 100%;
    }
    .empty {
        width: 750rpx;
        height: 20rpx;
        margin: 0 -30rpx;
        background-color: #f7f7f7;
        ;
    }
    .title {
        font-size: 30rpx;
        font-weight: 400;
        color: #222222;
        display: flex;
        align-items: center;
    }
    .title b {
        color: #E42D2D;
        margin-right: 4rpx;
    }
    .title1 {
        display: flex;
        flex-direction: column;
        .title1_a {
            font-size: 30rpx !important;
            font-weight: 400;
            color: #222222;
            display: flex;
            align-items: center;
            margin-bottom: 20rpx;
            b {
                color: #E42D2D;
                margin-right: 4rpx;
            }
        }
        .title1_b {
            font-size: 24rpx !important;
            font-weight: 400;
            color: #999999;
        }
    }
    .add-other {
        border: 1rpx solid #4d99a8;
        color: #4d99a8;
        font-size: 11rpx;
        padding: 0 12rpx;
        height: 32rpx;
        line-height: 32rpx;
        width: 120rpx;
        text-align: center;
        border-radius: 24rpx;
        margin: 20rpx auto;
    }
    .footer-box {
        width: 100%;
        position: fixed;
        bottom: 30rpx;
        height: 80rpx;
        display: flex;
        justify-content: center;
        align-items: center;
    }
    .submit-button {
        width: calc(100% - 60rpx);
        height: 88rpx;
        line-height: 88rpx;
        background: #4d99a8;
        border-radius: 4rpx;
        color: #fff;
        border-radius: 44rpx;
        font-size: 32rpx;
        display: flex;
        align-items: center;
        justify-content: center;
    }
</style>
<style lang="scss" scoped>
    .popup-content {
        padding: 20rpx;
        height: 100%;
        overflow: hidden;
        display: flex;
        flex-flow: column;
        .input {
            border: 1rpx solid #ccc;
            border-radius: 4rpx;
            padding: 4rpx 12rpx;
            font-size: 28rpx;
            font-weight: 400;
            color: #333333;
        }
        .respondent-item {
            padding: 10rpx;
            border-bottom: 1rpx solid #eee;
            cursor: pointer;
            &:hover {
                background-color: #eee;
            }
        }
        .van-list {
            flex: 1;
            overflow: auto;
        }
    }
</style>
h5/pages/driver/notice.vue
@@ -30,9 +30,9 @@
  },
  onLoad() {
    this.getInfo()
    if (!this.$store.state.openId) {
    // if (!this.$store.state.openId) {
      // this.initToken()
    }
    // }
  },
  methods: {
    initToken() {
h5/pages/index/index.vue
@@ -58,6 +58,7 @@
            jump(type) {
                switch (type) {
                    case 1:
                        console.log('1')
                        uni.navigateTo({
                            url: '/pages/notice/notice'
                        })
h5/pages/loading/loading.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,83 @@
<template>
    <view class="box">
        <!-- åŠ è½½ä¸­ -->
        <view class="loading" v-if="loading === 'loading'">
            <image src="/static/loading.gif" mode="widthFix"></image>
            <text>身份校验中,请稍后~</text>
        </view>
        <!-- å¤±è´¥ -->
        <view class="error" v-if="loading === 'error'">
            <image src="/static/ic_fail.png" mode="widthFix"></image>
            <text class="title">授权失败</text>
            <text class="desc">您的账号暂未绑定系统,请联系管理员</text>
            <button>重新验证</button>
        </view>
    </view>
</template>
<script>
    export default {
        data() {
            return {
                loading: 'error'
            };
        }
    }
</script>
<style lang="scss" scoped>
    .box {
        width: 100%;
        .error {
            width: 100%;
            display: flex;
            align-items: center;
            flex-direction: column;
            image {
                width: 180rpx;
                height: 180rpx;
                margin-top: 160rpx;
            }
            .title {
                font-weight: 500;
                font-size: 36rpx;
                color: #333333;
                margin-top: 32rpx;
            }
            .desc {
                font-weight: 400;
                font-size: 26rpx;
                color: #999999;
                margin-top: 20rpx;
            }
            button {
                width: 224rpx;
                height: 76rpx;
                font-weight: 400;
                font-size: 28rpx;
                color: #279BAA;
                border-radius: 38rpx;
                border: 1rpx solid #279BAA;
                margin-top: 68rpx;
                background-color: #ffffff;
            }
        }
        .loading {
            width: 100%;
            display: flex;
            align-items: center;
            flex-direction: column;
            image {
                width: 200rpx;
                height: 200rpx;
                margin-top: 202rpx;
            }
            text {
                font-weight: 500;
                font-size: 36rpx;
                color: #333333;
                margin-top: 40rpx;
            }
        }
    }
</style>
h5/pages/login/login.vue
@@ -46,37 +46,37 @@
        },
        onLoad(option) {
            console.log('onLoad');
            if (option.ywid) {
                uni.setStorageSync('ywinfo', {
                    type: option.type,
                    yw: option.yw,
                    ywid: option.ywid
                })
            }
            // if (option.ywid) {
            //     uni.setStorageSync('ywinfo', {
            //         type: option.type,
            //         yw: option.yw,
            //         ywid: option.ywid
            //     })
            // }
            // https://atwl.ahzyssl.com/zhyq_h5/#/pages/login/login?type=2&yw=5&ywid=b3db2072-a453-470d-8c0d-ba3b8b256530
        },
        onShow() {
            var that = this
            let url = 'https://atwl.ahzyssl.com/zhyq_h5/#/'
            let code = ''
            if (window.location.href.indexOf('code=') !== -1 || this.code) {
                // if(window.location.href.indexOf('wdata') !== -1){
                //     uni.redirectTo({
                //         url: '/pages/wdata/home?code=' +
                //     })
            // var that = this
            // let url = 'https://atwl.ahzyssl.com/zhyq_h5/#/'
            // let code = ''
            // if (window.location.href.indexOf('code=') !== -1 || this.code) {
            //     // if(window.location.href.indexOf('wdata') !== -1){
            //     //     uni.redirectTo({
            //     //         url: '/pages/wdata/home?code=' +
            //     //     })
            //     // }
            //     const ywinfo = uni.getStorageSync('ywinfo') || {}
            //     if (ywinfo.ywid && (ywinfo.type || ywinfo.type == 0)) {
            //         this.userAuth(ywinfo.type)
                // }
                const ywinfo = uni.getStorageSync('ywinfo') || {}
                if (ywinfo.ywid && (ywinfo.type || ywinfo.type == 0)) {
                    this.userAuth(ywinfo.type)
                }
            } else {
                // let url = window.location.href
                const appID = 'wx173e6caf5abc718a'
                let uri = encodeURIComponent(url)
                let authURL =
                    `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${appID}&redirect_uri=${uri}&response_type=code&scope=snsapi_base#wechat_redirect`
                window.location.href = authURL
            }
            // } else {
            //     // let url = window.location.href
            //     const appID = 'wx173e6caf5abc718a'
            //     let uri = encodeURIComponent(url)
            //     let authURL =
            //         `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${appID}&redirect_uri=${uri}&response_type=code&scope=snsapi_base#wechat_redirect`
            //     window.location.href = authURL
            // }
        },
        methods: {
h5/pages/notice/notice.vue
@@ -16,6 +16,7 @@
<script>
let timer
import { getSystemDictData } from "@/api"
import { getCode } from "@/utils/getCode.js";
export default {
  name: 'Index',
  data() {
@@ -27,9 +28,12 @@
  },
  onLoad() {
    this.getInfo()
    if (!this.$store.state.openId) {
    getCode(code => {
        console.log('code', code)
    });
    // if (!this.$store.state.openId) {
      // this.initToken()
    }
    // }
  },
  methods: {
    initToken() {
h5/static/ic_fail.png
h5/static/loading.gif
h5/utils/config.js
@@ -1,8 +1,8 @@
// export const baseUrl = 'zhyq_interface/'
// export const baseUrl = 'http://192.168.0.173/gateway_interface/'
export const baseUrl = 'http://192.168.1.54:10010/'
// export const baseUrl = 'http://10.50.250.253:8088/gateway_interface/'
export const baseUrl = 'https://atwl.ahzyssl.com/zhyq_interface/'
// export const baseUrl = 'https://atwl.ahzyssl.com/zhyq_interface/'
export const app_url = 'https://atwl.ahzyssl.com/zhyq_h5/#/'
h5/utils/getCode.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
import * as dd from 'dingtalk-jsapi';
export function getCode(callback) {
    let corpId = 'dingb14b7554444efe0a';
    console.log(dd.env.platform)
    if (dd.env.platform !== "notInDingTalk") {
        dd.ready(() => {
            //使用SDK èŽ·å–å…ç™»æŽˆæƒç 
            dd.runtime.permission.requestAuthCode({
                corpId: corpId,
                onSuccess: (info) => {
                    // æ ¹æ®é’‰é’‰æä¾›çš„api èŽ·å¾—code后,再次调用这个callback方法
                    // ç”±äºŽæ˜¯é’‰é’‰èŽ·å–code是异步操作,不知道什么时候执行完毕
                    // callback å‡½æ•°ä¼šç­‰ä»–执行完毕后在自己调用自己
                    callback(info.code)
                },
                onFail: (err) => {
                    alert('fail');
                    alert(JSON.stringify(err));
                },
            });
        });
    }
}
h5/utils/http.interceptor.js
@@ -18,11 +18,11 @@
    uni.$u.http.interceptors.response.use((response) => {
        uni.hideLoading();
        // ç™»å½•过期
        if (response.data.code === 401) {
            uni.navigateTo({
                url: '/packageA/loginAgain/loginAgain'
            });
        }
        // if (response.data.code === 401) {
        //     uni.navigateTo({
        //         url: '/packageA/loginAgain/loginAgain'
        //     });
        // }
        if (response.data.code !== 200) {
            uni.showToast({
                title: response.data.message,
h5/utils/service.js
@@ -39,10 +39,10 @@
                                'title': '服务器异常',icon:'none'
                            })
                        }
                        if (data.code === 5112) {
                            uni.clearStorageSync()
                            window.location.href = app_url
                        }
                        // if (data.code === 5112) {
                        //     uni.clearStorageSync()
                        //     window.location.href = app_url
                        // }
                        return resolve(data)
                    }
                    resolve(data)
server/system_service/src/main/java/com/doumee/dao/system/dto/LoginDTO.java
@@ -22,6 +22,9 @@
    @ApiModelProperty(value = "微信openId")
    private String openid;
    @ApiModelProperty(value = "钉钉 unionId")
    private String ddUnionId;
    @NotBlank(message = "密码不能为空")
    @ApiModelProperty(value = "密码")
    private String password;
server/system_service/src/main/java/com/doumee/dao/system/dto/LoginH5DTO.java
@@ -22,6 +22,9 @@
    @ApiModelProperty(value = "微信openId")
    private String openid;
    @ApiModelProperty(value = "钉钉 unionId")
    private String ddUnionId;
    @NotBlank(message = "密码不能为空")
    @ApiModelProperty(value = "密码")
    private String password;
server/system_service/src/main/java/com/doumee/dao/system/dto/LoginPhoneDTO.java
@@ -23,6 +23,8 @@
    private String code;
    @ApiModelProperty(value = "openid")
    private String openid;
    @ApiModelProperty(value = "钉钉 unionId")
    private String ddUnionId;
    @ApiModelProperty(value = "用户类型:0=司机;1=访客;2=内部员工")
    private Integer userType;
}
server/system_service/src/main/java/com/doumee/dao/system/model/SystemUser.java
@@ -98,6 +98,8 @@
    private String openidHkInfo;
    @ApiModelProperty(value = "微信openid推送海康时间", example = "1", hidden = true)
    private Date openidHkDate;
    @ApiModelProperty(value = "钉钉 unionId", example = "1", hidden = true)
    private String ddUnionId;
    //2024å¹´12月6日11:00:30 ç±»åž‹ 0司机人员 1普通访客  2内部人员 3tms管控人员
    @ApiModelProperty(value = "类型 0司机人员 1普通访客  2内部人员 3tms管控人员", example = "0")
server/system_service/src/main/java/com/doumee/service/system/impl/SystemLoginServiceImpl.java
@@ -156,7 +156,7 @@
            }
        }
        try {
            LoginUserInfo user = dealLoginByPwdNewBiz(dto.getUsername(),dto.getPassword(),null,dto.getOpenid(),request);
            LoginUserInfo user = dealLoginByPwdNewBiz(dto.getUsername(),dto.getPassword(),null,dto.getOpenid(),dto.getDdUnionId(),request);
            systemLoginLogService.create(loginLog);
            return  user;
        }catch (BusinessException e){
@@ -186,7 +186,7 @@
                throw e;
            }
        }
        LoginUserInfo user = dealLoginByPwdNewBiz(dto.getUsername(),dto.getPassword(),null,dto.getOpenid(),request);
        LoginUserInfo user = dealLoginByPwdNewBiz(dto.getUsername(),dto.getPassword(),null,dto.getOpenid(),dto.getDdUnionId(),request);
        systemLoginLogService.create(loginLog);
        return  user;
    }
@@ -213,7 +213,7 @@
        isCaptcheValide(dto.getPhone(),dto.getCode());//检查验证码
        SystemLoginLog loginLog = getInitLoginlog(dto.getPhone(),request);
        try{
            LoginUserInfo userInfo = dealLoginByPwdNewBiz(null,null,dto.getPhone(),dto.getOpenid(), request );
            LoginUserInfo userInfo = dealLoginByPwdNewBiz(null,null,dto.getPhone(),dto.getOpenid(),dto.getDdUnionId(), request );
            systemLoginLogService.create(loginLog);
            return userInfo;
        }catch (BusinessException e){
@@ -227,7 +227,7 @@
            throw e;
        }
    }
    private LoginUserInfo dealLoginByPwdNewBiz(String username,String pwd, String phone, String openid, ServerHttpRequest request) {
    private LoginUserInfo dealLoginByPwdNewBiz(String username,String pwd, String phone, String openid, String ddUnionId, ServerHttpRequest request) {
        // æ ¹æ®ç”¨æˆ·åæŸ¥è¯¢ç”¨æˆ·å¯¹è±¡
        SystemUser queryDto = new SystemUser();
        queryDto.setMobile(phone);
@@ -248,7 +248,12 @@
                throw new BusinessException(ResponseStatus.ACCOUNT_INCORRECT);
            }
        }
        if(StringUtils.isNotBlank(openid)){
        dealOpenIdBiz(user,openid);
        }
        if(StringUtils.isNotBlank(ddUnionId)){
            dealDDUnionIdBiz(user,ddUnionId);
        }
        Company company = new Company();
        if(Objects.nonNull(user.getCompanyId())){
            company = companyMapper.selectById(user.getCompanyId());
@@ -320,6 +325,24 @@
                    .eq(SystemUser::getId,user.getId()));
        }
    }
    private void dealDDUnionIdBiz(SystemUser user, String ddUnionId) {
        if(StringUtils.isNotBlank(ddUnionId)){
            //如果openId不为空,绑定该用户openid
            systemUserMapper.update(null,new UpdateWrapper<SystemUser>().lambda()
                    .set(SystemUser::getDdUnionId,null)
                    .set(SystemUser::getOpenidHkStatus,Constants.ZERO)
                    .ne(SystemUser::getType,Constants.memberType.gkuser)
                    .eq(SystemUser::getDdUnionId,ddUnionId)
            );
            systemUserMapper.update(null,new UpdateWrapper<SystemUser>().lambda()
                    .set(SystemUser::getDdUnionId,ddUnionId)
                    .set(SystemUser::getOpenidHkStatus,Constants.ZERO)
                    .set(SystemUser::getOpenidHkDate,null)
                    .set(SystemUser::getOpenidHkInfo,null)
                    .eq(SystemUser::getId,user.getId()));
        }
    }
    private void dealOpenIdBizForGk(SystemUser user, String openid) {
        if(StringUtils.isNotBlank(openid)){
            //如果openId不为空,绑定该用户openid
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/MemberCloudController.java
@@ -21,6 +21,7 @@
import com.doumee.service.business.ext.ERPSyncService;
import com.doumee.service.business.impl.hksync.fhk.HkSyncOrgUserFromHKServiceImpl;
import com.doumee.service.business.impl.hksync.fhk.HkSyncOrgUserFromSelfServiceImpl;
import com.taobao.api.ApiException;
import io.swagger.annotations.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
@@ -367,4 +368,14 @@
        return ApiResponse.success(null);
    }
    @ApiOperation("全量人员信息同步 - é’‰é’‰")
    @PostMapping("/syncAllDingding")
//    @CloudRequiredPermission("business:company:sync")
    public ApiResponse syncAllDingding() throws ApiException {
        memberService.syncDDUserInfo();
        return ApiResponse.success("同步成功");
    }
}
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/web/VisitorWebController.java
@@ -3,6 +3,7 @@
import com.doumee.api.BaseController;
import com.doumee.config.annotation.LoginNoRequired;
import com.doumee.core.annotation.trace.Trace;
import com.doumee.dao.web.response.DDAuthorizeVO;
import com.doumee.service.business.third.model.ApiResponse;
import com.doumee.service.business.third.model.LoginUserInfo;
import com.doumee.service.business.third.model.PageData;
@@ -17,6 +18,7 @@
import com.doumee.service.business.MemberService;
import com.doumee.service.business.VisitReasonService;
import com.doumee.service.business.VisitsService;
import com.taobao.api.ApiException;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
@@ -65,6 +67,18 @@
        return ApiResponse.success("查询成功",wxAuthorizeVO);
    }
    @ApiOperation(value = "钉钉微信授权", notes = "访客微信授权获取openId")
    @GetMapping("/ddAuthorize")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "query", dataType = "String", name = "code", value = "授权码", required = true),
            @ApiImplicitParam(paramType = "query", dataType = "Integer", name = "source", value = "来源:0=司机;1=访客;2=内部员工", required = true)
    })
    public ApiResponse<DDAuthorizeVO> ddAuthorize(@RequestParam String code, @RequestParam Integer source) throws ApiException {
        DDAuthorizeVO ddAuthorizeVO =  memberService.ddAuthorize(code,source);
        return ApiResponse.success("查询成功",ddAuthorizeVO);
    }
    @ApiOperation(value = "查询被访问人信息", notes = "查询被访问人信息")
    @PostMapping("/getVisitedMember")
    public ApiResponse<List<MemberVO>> getVisitedMember(@Valid @RequestBody CheckVisitedDTO checkVisitedDTO) {
@@ -78,6 +92,8 @@
        visits.setSourceType(Constants.ZERO);
        return ApiResponse.success("查询成功", visitsService.createFk(visits,false,Constants.ZERO));
    }
    @ApiOperation(value = "来访事由", notes = "来访事由")
    @PostMapping("/visitReason")
    public ApiResponse<List<VisitReason>> visitReason() {
server/visits/dmvisit_service/src/main/java/com/doumee/core/dingTalk/DingTalk.java
@@ -14,16 +14,21 @@
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.exception.BusinessException;
import com.doumee.core.utils.Constants;
import com.doumee.core.utils.DateUtil;
import com.doumee.dao.business.dao.CompanyMapper;
import com.doumee.dao.business.model.CarUseBook;
import com.doumee.dao.business.model.Company;
import com.doumee.dao.business.model.Visits;
import com.doumee.dao.system.model.SystemDictData;
import com.doumee.service.business.CompanyService;
import com.github.xiaoymin.knife4j.core.util.CollectionUtils;
import com.taobao.api.ApiException;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.text.DateFormat;
import java.util.*;
import java.util.stream.Collectors;
@@ -102,6 +107,19 @@
    public String getToken(){
        String accessToken  =  systemDictDataBiz.queryByCode(Constants.DD_TALK,Constants.ACCESS_TOKEN).getCode();
        return accessToken;
    }
    public OapiV2UserGetuserinfoResponse.UserGetByCodeResponse  getDDUserByCode(String code) throws ApiException {
        DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/user/getuserinfo");
        OapiV2UserGetuserinfoRequest req = new OapiV2UserGetuserinfoRequest();
        req.setCode(code);
        OapiV2UserGetuserinfoResponse rsp = client.execute(req, getToken());
        if(rsp.getErrcode().equals(Constants.DD_ERR_CODE)){
           return  rsp.getResult();
        }else{
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),rsp.getMessage());
        }
    }
@@ -364,6 +382,126 @@
        }
    }
    public void workInfoOANotice(Long agentId,String userIds,OapiMessageCorpconversationAsyncsendV2Request.Msg msg)throws ApiException {
        DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2");
        OapiMessageCorpconversationAsyncsendV2Request request = new OapiMessageCorpconversationAsyncsendV2Request();
        request.setAgentId(agentId);
        request.setUseridList(userIds);
        request.setToAllUser(false);
        request.setMsg(msg);
        OapiMessageCorpconversationAsyncsendV2Response rsp = client.execute(request, getToken());
        if(rsp.getErrcode().equals(Constants.DD_ERR_CODE)){
        }else{
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),rsp.getMessage());
        }
    }
    /**
     * è®¿å®¢ç”³è¯·/报备 OA å·¥ä½œé€šçŸ¥ å†…容
     * @param visits
     * @param title
     * @return
     */
    public OapiMessageCorpconversationAsyncsendV2Request.Msg getVisitNoticeMsg(Visits visits,String title){
        OapiMessageCorpconversationAsyncsendV2Request.Msg msg = new OapiMessageCorpconversationAsyncsendV2Request.Msg();
        msg.setMsgtype("oa");
        OapiMessageCorpconversationAsyncsendV2Request.OA oa = new OapiMessageCorpconversationAsyncsendV2Request.OA();
        oa.setMessageUrl("");
        OapiMessageCorpconversationAsyncsendV2Request.Head head = new OapiMessageCorpconversationAsyncsendV2Request.Head();
        head.setText(title);
        head.setBgcolor("#279BAA");
        oa.setHead(head);
        OapiMessageCorpconversationAsyncsendV2Request.Body body = new OapiMessageCorpconversationAsyncsendV2Request.Body();
        body.setTitle(!Constants.equalsInteger(visits.getType(),Constants.TWO)?visits.getName()+"的访客申请":"的访客报备");
        List<OapiMessageCorpconversationAsyncsendV2Request.Form> formList = new ArrayList<>();
        OapiMessageCorpconversationAsyncsendV2Request.Form visitUser = new OapiMessageCorpconversationAsyncsendV2Request.Form();
        visitUser.setKey("来访人");
        visitUser.setValue(visits.getName());
        formList.add(visitUser);
        OapiMessageCorpconversationAsyncsendV2Request.Form inDate = new OapiMessageCorpconversationAsyncsendV2Request.Form();
        inDate.setKey("入园时间");
        inDate.setValue(DateUtil.formatDate(visits.getStarttime(),"MM-dd HH:mm"));
        formList.add(inDate);
        OapiMessageCorpconversationAsyncsendV2Request.Form outDate = new OapiMessageCorpconversationAsyncsendV2Request.Form();
        outDate.setKey("离园时间");
        outDate.setValue(DateUtil.formatDate(visits.getEndtime(),"MM-dd HH:mm"));
        formList.add(outDate);
        OapiMessageCorpconversationAsyncsendV2Request.Form inReason = new OapiMessageCorpconversationAsyncsendV2Request.Form();
        inReason.setKey("来访事由");
        inReason.setValue(visits.getReason());
        formList.add(inReason);
        if(StringUtils.isNotBlank(visits.getCarNos())){
            OapiMessageCorpconversationAsyncsendV2Request.Form carNos = new OapiMessageCorpconversationAsyncsendV2Request.Form();
            carNos.setKey("随访车辆");
            carNos.setValue(visits.getCarNos());
            formList.add(visitUser);
        }
        body.setForm(formList);
        oa.setBody(body);
        msg.setOa(oa);
        return msg;
    }
   /* public OapiMessageCorpconversationAsyncsendV2Request.Msg getCarUseNoticeMsg(CarUseBook carUseBook,String title){
        OapiMessageCorpconversationAsyncsendV2Request.Msg msg = new OapiMessageCorpconversationAsyncsendV2Request.Msg();
        msg.setMsgtype("oa");
        OapiMessageCorpconversationAsyncsendV2Request.OA oa = new OapiMessageCorpconversationAsyncsendV2Request.OA();
        oa.setMessageUrl("");
        OapiMessageCorpconversationAsyncsendV2Request.Head head = new OapiMessageCorpconversationAsyncsendV2Request.Head();
        head.setText(title);
        head.setBgcolor("#279BAA");
        oa.setHead(head);
        OapiMessageCorpconversationAsyncsendV2Request.Body body = new OapiMessageCorpconversationAsyncsendV2Request.Body();
        body.setTitle("公务用车");
        List<OapiMessageCorpconversationAsyncsendV2Request.Form> formList = new ArrayList<>();
        OapiMessageCorpconversationAsyncsendV2Request.Form startDate = new OapiMessageCorpconversationAsyncsendV2Request.Form();
        startDate.setKey("开始时间");
        startDate.setValue(DateUtil.formatDate(carUseBook.getStartTime(),"MM-dd HH:mm"));
        formList.add(startDate);
        OapiMessageCorpconversationAsyncsendV2Request.Form endDate = new OapiMessageCorpconversationAsyncsendV2Request.Form();
        endDate.setKey("结束时间");
        endDate.setValue(DateUtil.formatDate(carUseBook.getEndTime(),"MM-dd HH:mm"));
        formList.add(endDate);
        OapiMessageCorpconversationAsyncsendV2Request.Form userNum = new OapiMessageCorpconversationAsyncsendV2Request.Form();
        userNum.setKey("乘车人数");
        userNum.setValue(DateUtil.formatDate(carUseBook.getEndTime(),"MM-dd HH:mm"));
        formList.add(userNum);
        OapiMessageCorpconversationAsyncsendV2Request.Form inReason = new OapiMessageCorpconversationAsyncsendV2Request.Form();
        inReason.setKey("来访事由");
        inReason.setValue(visits.getReason());
        formList.add(inReason);
        if(StringUtils.isNotBlank(visits.getCarNos())){
            OapiMessageCorpconversationAsyncsendV2Request.Form carNos = new OapiMessageCorpconversationAsyncsendV2Request.Form();
            carNos.setKey("随访车辆");
            carNos.setValue(visits.getCarNos());
            formList.add(visitUser);
        }
        body.setForm(formList);
        oa.setBody(body);
        msg.setOa(oa);
        return msg;
    }*/
}
server/visits/dmvisit_service/src/main/java/com/doumee/core/dingTalk/DingTalkStream.java
@@ -76,7 +76,7 @@
                            if(eventType.startsWith("org")){
                                companyService.ddPushCompanyInfo(eventType,bizData);
                            }else if(eventType.startsWith("user")){
                                memberService.ddPushMemberInfo(eventType,bizData);
                            }
                            //处理事件
//                            process(bizData);
server/visits/dmvisit_service/src/main/java/com/doumee/dao/web/response/DDAuthorizeVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,24 @@
package com.doumee.dao.web.response;
import com.doumee.dao.business.model.Member;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2023/12/7 11:19
 */
@Data
public class DDAuthorizeVO {
    @ApiModelProperty(value = "授权 unionId ")
    private String unionId;
    @ApiModelProperty(value = "用户token")
    private String token;
    @ApiModelProperty(value = "用户信息")
    private Member member;
}
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/MemberService.java
@@ -1,5 +1,6 @@
package com.doumee.service.business;
import com.doumee.dao.web.response.DDAuthorizeVO;
import com.doumee.service.business.third.model.LoginUserInfo;
import com.doumee.service.business.third.model.PageData;
import com.doumee.service.business.third.model.PageWrap;
@@ -13,6 +14,7 @@
import com.doumee.dao.web.reqeust.VisitMemberDTO;
import com.doumee.dao.web.response.MemberVO;
import com.doumee.dao.web.response.WxAuthorizeVO;
import com.taobao.api.ApiException;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
@@ -172,6 +174,7 @@
     */
    WxAuthorizeVO wxAuthorize(String code,Integer source);
    DDAuthorizeVO ddAuthorize(String code, Integer source) throws ApiException;
    List<MemberVO> getVisitedMember(CheckVisitedDTO checkVisitedDTO);
@@ -208,4 +211,8 @@
    List<Member>  findDriveList(Member model);
    void initPinyinTool();
    void syncDDUserInfo() throws ApiException;
    void ddPushMemberInfo(String eventType, shade.com.alibaba.fastjson2.JSONObject eventData) throws ApiException;
}
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/CompanyServiceImpl.java
@@ -961,7 +961,7 @@
        company.setCompanyNamePath(company.getName());//名称路径
        company.setHkParentId(rootOrgId);
        String idPath = "";
        if(StringUtils.isNotBlank(company.getErpParentId()) && !StringUtils.equals(company.getErpParentId(),Constants.ONE+"")){
        if(StringUtils.isNotBlank(company.getErpParentId())){
            Company parent = companyMapper.selectOne(new QueryWrapper<Company>().lambda().eq(Company::getErpId,company.getErpParentId())
                    .eq(Company::getIsdeleted,Constants.ZERO).last(" limit 1 "));
            if(parent == null || Constants.equalsInteger(parent.getIsdeleted(),Constants.ONE)){
@@ -981,6 +981,7 @@
            company.setHkParentId(parent.getHkId());
            company.setCompanyPath(parent.getCompanyPath()+company.getId()+"/");
            company.setCompanyNamePath(parent.getCompanyNamePath()+"/"+company.getName());
            company.setParentId(parent.getId());
        }
        company.setHkCompanyPath(company.getCompanyNamePath());
        company.setCreateDate(new Date());
@@ -1009,7 +1010,7 @@
    public Company syncDDEditCompanyModel(OapiV2DepartmentGetResponse.DeptGetResponse deptGetResponse,Company company){
        company.setErpParentId(deptGetResponse.getParentId().toString());
        String idPath = "";
        if(StringUtils.isNotBlank(company.getErpParentId()) && !StringUtils.equals(company.getErpParentId(),Constants.ONE+"")){
        if(StringUtils.isNotBlank(company.getErpParentId())){
            Company parent = companyMapper.selectOne(new QueryWrapper<Company>().lambda().eq(Company::getErpId,company.getErpParentId())
                    .eq(Company::getIsdeleted,Constants.ZERO).last("limit 1 "));
            if(parent == null || Constants.equalsInteger(parent.getIsdeleted(),Constants.ONE)){
@@ -1026,6 +1027,7 @@
            company.setHkParentId(parent.getHkId());
            company.setCompanyPath(parent.getCompanyPath()+company.getId()+"/");
            company.setCompanyNamePath(parent.getCompanyNamePath()+"/"+company.getName());
            company.setParentId(parent.getId());
        }
        company.setName(deptGetResponse.getName());
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
@@ -9,6 +9,7 @@
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.dingtalk.api.response.OapiV2DepartmentGetResponse;
import com.dingtalk.api.response.OapiV2UserGetResponse;
import com.dingtalk.api.response.OapiV2UserGetuserinfoResponse;
import com.doumee.biz.system.SystemDictDataBiz;
import com.doumee.config.DataSyncConfig;
import com.doumee.core.annotation.excel.ExcelImporter;
@@ -22,6 +23,7 @@
import com.doumee.core.haikang.model.param.respose.UserAddResponse;
import com.doumee.core.haikang.model.param.respose.UserDelResponse;
import com.doumee.core.haikang.service.HKService;
import com.doumee.dao.web.response.DDAuthorizeVO;
import com.doumee.service.business.third.TmsService;
import com.doumee.service.business.third.model.LoginUserInfo;
import com.doumee.service.business.third.model.PageData;
@@ -219,9 +221,9 @@
    private Member initAddMemberModel(Member member, LoginUserInfo loginUserInfo) {
        Member insert=  new Member();
        insert.setCreator(Objects.nonNull(loginUserInfo.getId())?loginUserInfo.getId():null);
        insert.setCreator(Objects.nonNull(loginUserInfo)?loginUserInfo.getId():null);
        insert.setCreateDate(new Date());
        insert.setEditor(Objects.nonNull(loginUserInfo.getId())?loginUserInfo.getId():null);
        insert.setEditor(Objects.nonNull(loginUserInfo)?loginUserInfo.getId():null);
        insert.setEditDate(new Date());
        insert.setHkOrgId(member.getHkOrgId());
        insert.setIsdeleted(Constants.ZERO);
@@ -231,6 +233,7 @@
        insert.setCode(member.getCode());
        insert.setType(Constants.TWO);
        insert.setHkDate(new Date());
        insert.setErpId(member.getErpId());
        insert.setWorkStatus(Constants.ZERO);//默认在职
        insert.setCanVisit(Constants.ZERO);//默认不可访问
        insert.setAuthStatus(Constants.ZERO);
@@ -1845,6 +1848,12 @@
        return wxAuthorizeVO;
    }
    /**
     * å¾®ä¿¡æŽˆæƒ å†…部人员登录
     * @param wxAuthorizeVO
     * @param openId
     * @param source
     */
    private void dealSystemUserAuthBiz(WxAuthorizeVO wxAuthorizeVO, String openId, Integer source) {
        SystemUser user = systemUserMapper.selectOne(new QueryWrapper<SystemUser>().lambda()
                .eq(SystemUser::getOpenid,openId)
@@ -1874,6 +1883,44 @@
            wxAuthorizeVO.setToken(token);
        }
    }
    /**
     * é’‰é’‰æŽˆæƒèŽ·å–å†…éƒ¨äººå‘˜ç™»å½•ä¿¡æ¯
     * @param ddAuthorizeVO
     * @param unionId
     * @param source
     */
    private void dealSystemUserAuthBizByDD(DDAuthorizeVO ddAuthorizeVO, String unionId, Integer source) {
        SystemUser user = systemUserMapper.selectOne(new QueryWrapper<SystemUser>().lambda()
                .eq(SystemUser::getDdUnionId,unionId)
                .in(SystemUser::getType,Constants.memberType.internal)
                .eq(SystemUser::getDeleted,Constants.ZERO)
                .last(" limit 1 "));
        //非访客用户 è¿›è¡Œåˆ¤æ–­æ˜¯å¦å­˜åœ¨ç”¨æˆ·
        if(!Objects.isNull(user)){
            Member member = memberMapper.selectById(user.getMemberId());
            if(member == null || member.getIsdeleted() == Constants.ONE){
                return;
//                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"用户已删除,请联系管理员");
            }
            if(member.getStatus() != Constants.ZERO){
                return;
//                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"用户已禁用,请联系管理员");
            }
            if(StringUtils.isNotBlank(member.getIdcardNo())){
                member.setIdcardDecode(DESUtil.decrypt(Constants.EDS_PWD, member.getIdcardNo()));
            }
            String prefixUrl = systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_RESOURCE_PATH).getCode() +
                    systemDictDataBiz.queryByCode(Constants.FTP,Constants.MEMBER_IMG).getCode();
            member.setPrefixUrl(prefixUrl);
            ddAuthorizeVO.setMember(member);
            //司机 ä¸Ž å†…部人员 æä¾›token
            String token = systemLoginService.loginByUserId(user.getId());
            ddAuthorizeVO.setToken(token);
        }
    }
    private void dealDriverUserAuthBiz(WxAuthorizeVO wxAuthorizeVO, String openId, Integer source) {
        SystemUser user = systemUserMapper.selectOne(new QueryWrapper<SystemUser>().lambda()
                .eq(SystemUser::getOpenid,openId)
@@ -2345,6 +2392,7 @@
    /**
     * åŒæ­¥é’‰é’‰å†…部员工信息
     */
    @Override
    public void syncDDUserInfo() throws ApiException {
        List<OapiV2UserGetResponse.UserGetResponse>  list = dingTalk.syncAllUserInfo();
        if(CollectionUtils.isEmpty(list)){
@@ -2410,7 +2458,7 @@
    private Member syncDDAddMemberModel(OapiV2UserGetResponse.UserGetResponse deptGetResponse,Member member) {
        member.setCreateDate(new Date());
        member.setErpId(deptGetResponse.getUserid());
        member.setErpId(deptGetResponse.getUnionid());
        member.setPhone(deptGetResponse.getMobile());
        member.setName(deptGetResponse.getName());
        member.setCode(deptGetResponse.getJobNumber());
@@ -2440,7 +2488,7 @@
        if(Objects.nonNull(deptIdList)){
            List<Company> companyList = companyMapper.selectList(new QueryWrapper<Company>().lambda().in(Company::getErpId,deptIdList)
                    .eq(Company::getType,Constants.ONE).eq(Company::getIsdeleted,Constants.ZERO)
                    .isNotNull(Company::getHkId)
//                    .isNotNull(Company::getHkId) æš‚时无法同步开航 å…ˆæ³¨é‡Š
            );
            if(CollectionUtils.isNotEmpty(companyList)){
                member.setHkOrgId(companyList.get(Constants.ZERO).getHkId());
@@ -2469,7 +2517,7 @@
    
    public Member syncDDEditMemberModel(OapiV2UserGetResponse.UserGetResponse deptGetResponse,Member updateMember) { 
        updateMember.setEditDate(new Date());
        updateMember.setErpId(deptGetResponse.getUserid());
        updateMember.setErpId(deptGetResponse.getUnionid());
        updateMember.setPhone(deptGetResponse.getMobile());
        updateMember.setName(deptGetResponse.getName());
        updateMember.setCode(deptGetResponse.getJobNumber());
@@ -2536,6 +2584,7 @@
    }
    @Override
    public void ddPushMemberInfo(String eventType, shade.com.alibaba.fastjson2.JSONObject eventData) throws ApiException {
        JSONArray jsonArray = eventData.getJSONArray("userId");
        if(jsonArray.isEmpty()){
@@ -2553,20 +2602,61 @@
            }
        }else if(eventType.equals("user_add_org")||eventType.equals("user_modify_org")){
            for (int i = 0; i < jsonArray.size(); i++) {
                OapiV2UserGetResponse.UserGetResponse userGetResponse =  dingTalk.syncUserInfo(jsonArray.getString(i));
                Member member  = memberMapper.selectOne(new QueryWrapper<Member>().lambda()
                        .eq(Member::getIsdeleted,Constants.ZERO)
                        .eq(Member::getErpId,jsonArray.getLong(i))
                        .eq(Member::getErpId,userGetResponse.getUnionid())
                        .last(" limit 1")
                );
                OapiV2UserGetResponse.UserGetResponse deptGetResponse = dingTalk.syncUserInfo(jsonArray.getString(i));
                if(Objects.isNull(member)){
                    getAddMemberModel(deptGetResponse,member);
                    member = new Member();
                    getAddMemberModel(userGetResponse,member);
                }else{
                    getUpdateMemberModel(deptGetResponse,member);
                    getUpdateMemberModel(userGetResponse,member);
                }
            }
        }
    }
    /**
     * é’‰é’‰æŽˆæƒç™»å½•
     * @param code
     * @param source
     * @return
     * @throws ApiException
     */
    @Override
    public DDAuthorizeVO ddAuthorize(String code, Integer source) throws ApiException {
        if(StringUtils.isBlank(code)||Objects.isNull(source)){
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        OapiV2UserGetuserinfoResponse.UserGetByCodeResponse userGetByCodeResponse = dingTalk.getDDUserByCode(code);
        if(Objects.isNull(userGetByCodeResponse)
                || StringUtils.isBlank(userGetByCodeResponse.getUnionid())){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"钉钉授权失败");
        }
        String unionId = userGetByCodeResponse.getUnionid();
        DDAuthorizeVO ddAuthorizeVO = new DDAuthorizeVO();
        if(StringUtils.isBlank(unionId)){
            return ddAuthorizeVO;
        }
        ddAuthorizeVO.setUnionId(unionId);
//        if(source==1){
//            //处理普通访客人员自动授权逻辑
//            dealVisitUserAuthBiz(wxAuthorizeVO,openId,source);
//        }else if(source == 3){
//            //处理tms管控人员自动授权逻辑
//            dealGkUserAuthBiz(wxAuthorizeVO,openId,source);
//        }else if(source == 0){
//            //如果是司机,则从system_user查询
//            dealDriverUserAuthBiz(wxAuthorizeVO,openId,source);
//        }else{
            //如果是内部人员,则从system_user查询
            dealSystemUserAuthBizByDD(ddAuthorizeVO,unionId,source);
//        }
        return ddAuthorizeVO;
    }
}
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/VisitsServiceImpl.java
@@ -239,7 +239,7 @@
        //检查是否必须答题,并且符合答题要求
        ProblemLog problemLog = isValidProblemLog(visits,source);
        //获取申请的海康访问门禁组信息
        getHkDeviceRoles(visits,isERP);
//        getHkDeviceRoles(visits,isERP);
        //检验拜访人是否合法
        Member visitMember = isValideVisitedUser(visits.getReceptMemberId());
        if(StringUtils.isNotBlank(visits.getIdcardNo()) && Constants.equalsInteger(Constants.ZERO, visits.getIdcardType())
@@ -258,24 +258,6 @@
        //初始化访客信息
        initVisitInfo(visits,date);
//        if(StringUtils.isNotBlank(visits.getFaceImg())&&(Constants.equalsInteger(visits.getType(),Constants.ZERO)|| Constants.equalsInteger(visits.getType(),Constants.TWO))){
//            //人脸评分
//            FacePictureCheckRequest param = new FacePictureCheckRequest();
//            String prefixUrl = systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_LOCAL_RESOURCE_PATH).getCode() +
//                    systemDictDataBiz.queryByCode(Constants.FTP,Constants.MEMBER_IMG).getCode();
//            param.setFacePicUrl(prefixUrl + visits.getFaceImg());
//            BaseResponse<FacePictureCheckResponse> response = HKService.facePictureCheck(param);
//            if(response == null || !StringUtils.equals(response.getCode(), HKConstants.RESPONSE_SUCCEE)){
//                throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "对不起,人脸评分获取数据失败~");
//            }
//            FacePictureCheckResponse facePictureCheckResponse = response.getData();
//            if(Objects.isNull(facePictureCheckResponse) || Objects.isNull(facePictureCheckResponse.getCheckResult())){
//                throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "对不起,人脸评分获取数据失败~");
//            }
//            if(!facePictureCheckResponse.getCheckResult()){
//                throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), facePictureCheckResponse.getStatusMessage());
//            }
//        }
        visits.setSendTimeOutNotice(Constants.ZERO);
        visitsMapper.insert(visits);
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/thrid/BoardServiceImpl.java
@@ -1360,12 +1360,18 @@
        List<Long> startTimeList = platformLogList.stream().filter(i->Objects.nonNull(i.getParam1()))
                .filter(i->Objects.nonNull(i.getParam1())&&i.getParam1().indexOf(today)>=0)
                .map(i->DateUtil.fromStringToDate("yyyy-MM-dd HH:mm:ss",i.getParam1()).getTime()).collect(Collectors.toList());
        Long startTime  = Collections.min(startTimeList);
        Long startTime  = null ;
        if(CollectionUtils.isNotEmpty(startTimeList)){
            startTime = Collections.min(startTimeList);
        }
        //获取结束时间
        List<Long> endTimeList = platformLogList.stream()
                .filter(i->Objects.nonNull(i.getParam2())&&i.getParam2().indexOf(today)>=0)
                .map(i->DateUtil.fromStringToDate("yyyy-MM-dd HH:mm:ss",i.getParam2()).getTime()).collect(Collectors.toList());
        Long endTime = Collections.max(endTimeList);
        Long endTime = null ;
        if(CollectionUtils.isNotEmpty(endTimeList)){
            endTime = Collections.max(endTimeList);
        }
        if(Objects.isNull(startTime)
            || Objects.isNull(endTime) || (startTime>=endTime)){
            return BigDecimal.ZERO;