落日与鲸
2025-02-28 573193bb8ba686b06b5132cd233f953cc06d310d
Merge branch 'master' of http://120.76.84.145:10101/gitblit/r/H5/threeSide
37个文件已修改
2个文件已添加
3278 ■■■■■ 已修改文件
.vscode/settings.json 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
H5/App.vue 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
H5/config/index.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
H5/pages/Appeal/Appeal.vue 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
H5/pages/components/certificate/certificate.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
H5/pages/index/index.vue 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
H5/pages/location/location.vue 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
H5/pages/progress/progress.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
H5/pages/result-entry/index.vue 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
H5/pages/work-detail/postpone-apply.vue 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
H5/pages/work-detail/work-detail.vue 1780 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
H5/static/home/img9.png 补丁 | 查看 | 原始文档 | blame | 历史
H5/uni_modules/uview-ui/components/u-skeleton/u-skeleton.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
H5/uni_modules/uview-ui/components/u-slider/nvue.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
H5/uni_modules/uview-ui/libs/config/config.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
H5/uni_modules/uview-ui/libs/util/calendar.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
H5/utils/request.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
management/config/config.ts 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
management/config/env.ts 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
management/config/routes.ts 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
management/src/app.tsx 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
management/src/components/RightContent/AvatarDropdown.tsx 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
management/src/global.less 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
management/src/pages/Login/index.tsx 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
management/src/pages/message-notification/index.jsx 100 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
management/src/pages/message-notification/service.js 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
management/src/pages/setting/career/index.jsx 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
management/src/pages/setting/role/components/addAndEdit.jsx 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
management/src/pages/setting/role/index.jsx 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
management/src/pages/setting/user/components/addAndEdit.jsx 392 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
management/src/pages/setting/user/components/addUnit.jsx 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
management/src/pages/setting/user/index.jsx 402 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
management/src/pages/setting/user/service.js 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
management/src/pages/work-order-setting/index.jsx 104 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
management/src/pages/work-order/banner/components/addAndEdit.jsx 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
management/src/pages/work-order/banner/components/index.jsx 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
management/src/pages/work-order/banner/index.jsx 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
management/src/pages/work-order/problem-type/index.jsx 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
management/src/utils/utils.js 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.vscode/settings.json
New file
@@ -0,0 +1,6 @@
{
    "marscode.codeCompletionPro": {
        "enableCodeCompletionPro": true
    },
    "marscode.enableInlineCommand": true
}
H5/App.vue
@@ -1,13 +1,13 @@
<script>
    export default {
        onLaunch: function() {
            console.log('App Launch')
        },
        onShow: function() {
            console.log('App Show')
        },
        onHide: function() {
            console.log('App Hide')
        }
    }
</script>
H5/config/index.js
@@ -1,5 +1,5 @@
export default {
    // BASE_URL: 'https://huacheng.psciio.com',
    BASE_URL: 'http://192.168.110.188:6194',
    BASE_URL: 'https://huacheng.psciio.com',
    // BASE_URL: 'http://192.168.110.188:6194',
    imageUrl: 'https://huacheng.psciio.com/api/huacheng-applets/common/uploadimages',
}
H5/pages/Appeal/Appeal.vue
@@ -119,7 +119,7 @@
        getproblem
    } from './service.js'
    import config from '@/config/index.js'
    export default {
        data() {
            return {
@@ -159,10 +159,10 @@
                    longPressActions: {
                        itemList: ['发送给朋友', '保存图片', '收藏'],
                        success: function(data) {
                            console.log('选中了第' + (data.tapIndex + 1) + '个按钮,第' + (data.index + 1) + '张图片');
                        },
                        fail: function(err) {
                            console.log(err.errMsg);
                        }
                    }
                });
@@ -181,7 +181,7 @@
            },
            getproblem() {
                getproblem().then((resp => {
                    console.log(resp, '问题类型')
                    this.columns = [resp.data.map(item => {
                        return item.name
                    })]
@@ -260,7 +260,7 @@
                    videos: this.videos.join(','),
                }
                save(data).then(resp => {
                    console.log(resp, '保存');
                    if (resp.code == 200) {
                        uni.showToast({
                            title: '保存成功',
@@ -273,12 +273,12 @@
                })
            },
            confirmone(e) {
                console.log(e, 'eeee');
                this.time = dayjs(e.value).format('YYYY-MM-DD')
                this.showDate = false
            },
            confirmtwo(e) {
                console.log(e, 'eeee');
                this.problemType = e.value[0]
                this.showList = false
            },
@@ -291,7 +291,7 @@
                this.showList = false
            },
            goTopagelocation() {
                console.log('0000000000000000');
                uni.navigateTo({
                    url: '/pages/location/location'
                })
@@ -302,7 +302,7 @@
                    sizeType: ['original', 'compressed'], //可以指定是原图还是压缩图,默认二者都有
                    sourceType: ['album'], //从相册选择
                    success: (res) => {
                        console.log(res, 'res');
                        uni.showLoading()
                        uni.uploadFile({
                            url: config.imageUrl,
@@ -312,7 +312,7 @@
                                'Authorization': uni.getStorageSync('token')
                            },
                            success: (uploadFileRes) => {
                                console.log(JSON.parse(uploadFileRes.data), 'uploadFileRes');
                                this.images = [...this.images, JSON.parse(uploadFileRes.data).data]
                                uni.hideLoading()
                            },
@@ -332,7 +332,15 @@
                    count: 1, //默认9
                    sourceType: ['camera', 'album'],
                    success: (res) => {
                        console.log(res, 'res');
                        const videoExtensions = /\.(mp4|avi|rmvb)$/i;
                        if (!videoExtensions.test(res.name)) {
                            uni.showToast({
                                title: '请上传mp4, avi, rmvb格式的视频',
                                icon: 'none',
                                duration: 3000
                            })
                            return
                        }
                        uni.showLoading()
                        uni.uploadFile({
                            url: config.imageUrl,
@@ -342,7 +350,7 @@
                                'Authorization': uni.getStorageSync('token')
                            },
                            success: (uploadFileRes) => {
                                console.log(JSON.parse(uploadFileRes.data).data, 'uploadFileRes');
                                this.videos = [...this.videos, JSON.parse(uploadFileRes.data).data]
                                uni.hideLoading()
                            },
H5/pages/components/certificate/certificate.vue
@@ -53,7 +53,7 @@
        methods: {
            open() {
                getInfo().then(resp => {
                    console.log(resp, '党员信息');
                    if(resp.code==200){
                        this.info =resp.data
                    }
H5/pages/index/index.vue
@@ -3,10 +3,10 @@
        <view class="top_content">
            <image src="/static/home/bg@2x.png" class="bg-img vw100" style="z-index: 1;" mode=""></image>
            <view class="main">
                <image src="/static/home/img6.png" class="h-85" mode=""></image>
                <image class="w-275 h-28 mt-15" src="/static/home/img3.png" mode=""></image>
                <image src="/static/home/img6.png" mode="widthFix"></image>
                <image class="w-275 mt-15" src="/static/home/img3.png" mode="widthFix"></image>
                <view class="flex a-center mt-17   mb-31">
                    <image class="h-32" src="/static/home/img5.png" mode=""></image>
                    <image src="/static/home/img5.png" mode="widthFix"></image>
                </view>
                <swiper class="swiper " :indicator-dots="false" :autoplay="true" :interval="3000">
                    <swiper-item v-for="item,index in bannerlist" :key="index">
@@ -163,19 +163,19 @@
        methods: {
            Allread() {
                getread().then(resp => {
                    console.log(resp, '=====');
                    this.getMessagelist()
                })
            },
            getBanner() {
                getBanner().then(resp => {
                    console.log(resp, '获取banner');
                    this.bannerlist = resp.data
                })
            },
            getappletcinfo() {
                getappletcinfo().then(resp => {
                    console.log(resp, '-----判断角色');
                    this.userInfo = resp.data
                    this.member = resp.data ? 2 : 1
                    uni.setStorageSync('userInfo', resp.data)
@@ -188,7 +188,7 @@
                    pageSize: 5
                }
                getMessagelist(data).then(resp => {
                    console.log(resp, '获取消息列表');
                    if (resp.data.records.length < 5 && this.pageNum == 1) {
                        this.msgListTotal = resp.data.records
                        this.isLoading = true
@@ -232,7 +232,7 @@
                        1)
                    this.noreadlists = this.msgLists.filter(item => item.readStatus === 0)
                    this.noreadlist = this.msgList.filter(item => item.readStatus === 0)
                    console.log(this.msgListTotal, 'this.msgListTotal');
                })
            },
            changeActive(value) {
@@ -251,12 +251,12 @@
            },
            change() {
                console.log('1111');
            },
            onClick() {
                this.isClick = true
                console.log('this.isClick', this.isClick);
            },
            goTopage() {
                uni.navigateTo({
H5/pages/location/location.vue
@@ -96,7 +96,7 @@
                            result.id = index + 1
                            return result
                        });
                        console.log(this.locationList);
                    }
                })
                return
@@ -111,7 +111,7 @@
                        ak: '3mHKIXMArjgIkgADzOlTYp4XssNSNkwr' // 替换为你自己的 AK
                    },
                    success: (res) => {
                        console.log(res, '-------');
                        if (res.data.status === 0) {
                            this.searchResults = res.data.results;
                            this.latitude = res.data.results[0].location.lat
@@ -135,7 +135,7 @@
        },
        onReady() {
            this.map = new BMapGL.Map("container"); // 创建地图实例 
            console.log(this.map);
            // uni.getLocation({
            //     type: 'wgs84',
            //     success: (res) => {
@@ -146,12 +146,12 @@
                const longitude = position.coords.longitude;
                const accuracy = position.coords.accuracy; // 精度,单位米
                console.log(`纬度: ${latitude}, 经度: ${longitude}, 精度: ${accuracy}`);
                //  在这里可以使用获取到的经纬度信息,例如在地图上显示位置等。
            }
            function error(err) {
                console.log(err);
                switch (err.code) {
                    case err.PERMISSION_DENIED:
                        console.error("用户拒绝了位置请求。");
@@ -191,7 +191,7 @@
                    item.id = index + 1
                    return item
                })
                console.log(this.locationList);
            })
            this.map.addEventListener('click', (e) => {
                this.clearMarkers()
@@ -203,7 +203,7 @@
                var myGeo = new BMapGL.Geocoder();
                // 根据坐标得到地址描述    
                myGeo.getLocation(new BMapGL.Point(e.latlng.lng, e.latlng.lat), (result) => {
                    console.log(result, 'result');
                    this.locationList = result.surroundingPois.map((item, index) => {
                        item.id = index + 1
                        return item
@@ -216,7 +216,7 @@
            });
            // },
            // error:err=>{
            //     console.log(err,'err');
            //
            // }
            // });
H5/pages/progress/progress.vue
@@ -103,7 +103,7 @@
                return dayjs(val).format('YYYY-MM-DD HH:mm:ss')
            }
        },
        onLoad(params) {
        onShow(params) {
            this.id = params.id
            if (params.type) {
                this.type = false
@@ -114,7 +114,7 @@
            getComplaintDetail({
                id: params.id
            }).then(res => {
                console.log('res', res)
                this.info = {
                    ...res.data
                }
H5/pages/result-entry/index.vue
@@ -285,14 +285,11 @@
                })
            },
            uploadImg(type) {
                // if (!this.againCklicFlag) return
                this.againCklicFlag = false
                if (type == 1) {
                    uni.chooseImage({
                        count: 1,
                        success: (chooseImageRes) => {
                            this.completionImages.push('loading')
                            this.againCklicFlag = true
                            let imgPathList = chooseImageRes.tempFilePaths;
                            if (imgPathList.length > 0) {
                                uni.uploadFile({
@@ -315,7 +312,6 @@
                                                this.localImageUrls.push(imgPathList[0])
                                            })
                                        } else {
                                            this.againCklicFlag = true
                                            this.completionImages = this.completionImages.filter(
                                                item => item != 'loading')
                                            uni.showToast({
@@ -326,7 +322,6 @@
                                        }
                                    },
                                    fail: (err) => {
                                        this.againCklicFlag = true
                                        this.completionImages = this.completionImages.filter(
                                            item => item != 'loading')
                                        uni.showToast({
@@ -337,14 +332,22 @@
                                    }
                                })
                            }
                        },
                        }
                    })
                } else {
                    uni.chooseVideo({
                        camera: 'back',
                        count: 1, //默认9
                        success: (res) => {
                            const videoExtensions = /\.(mp4|avi|rmvb)$/i;
                            if (!videoExtensions.test(res.name)) {
                                uni.showToast({
                                    title: '请上传mp4, avi, rmvb格式的视频',
                                    icon: 'none',
                                    duration: 3000
                                })
                                return
                            }
                            this.completionVideos.push('loading')
                            this.againCklicFlag = true
                            const tempFilePath = res.tempFilePath;
                            uni.uploadFile({
                                url: config.imageUrl,
@@ -364,7 +367,6 @@
                                                .data)
                                        })
                                    } else {
                                        this.againCklicFlag = true
                                        this.completionVideos = this.completionVideos.filter(
                                            item => item != 'loading')
                                        uni.showToast({
@@ -375,7 +377,6 @@
                                    }
                                },
                                fail: (err) => {
                                    this.againCklicFlag = true
                                    this.completionVideos = this.completionVideos.filter(
                                        item => item != 'loading')
                                    uni.showToast({
H5/pages/work-detail/postpone-apply.vue
@@ -240,6 +240,15 @@
                    uni.chooseVideo({
                        camera: 'back',
                        success: (res) => {
                            const videoExtensions = /\.(mp4|avi|rmvb)$/i;
                            if (!videoExtensions.test(res.name)) {
                                uni.showToast({
                                    title: '请上传mp4, avi, rmvb格式的视频',
                                    icon: 'none',
                                    duration: 3000
                                })
                                return
                            }
                            this.video.push('loading')
                            this.againCklicFlag = true
                            const tempFilePath = res.tempFilePath;
H5/pages/work-detail/work-detail.vue
@@ -5,27 +5,27 @@
        <view class="allContent">
            <view class="topStatus">
                <view class="status">
                    {{['正在办理','延期办理','超时办理','已办结 ','群众撤销','上报待审核','上级驳回','延期待审核'][orderInfo.status] ||''}}
                    {{ ['正在办理', '延期办理', '超时办理', '已办结 ', '群众撤销', '上报待审核', '上级驳回', '延期待审核'][orderInfo.status] || '' }}
                </view>
                <view class="flex a-center j-between mb-17">
                    <view class="tit">当前状态</view>
                    <!-- 延期状态 -->
                    <view v-if="orderInfo.status==1" class="flex a-center" @click.stop="toDelayDetail()">
                    <view v-if="orderInfo.status == 1" class="flex a-center" @click.stop="toDelayDetail()">
                        <image src="../../static/detailImg/explain.png" class="plainIcon shrink0"></image>
                        <view class="explain">延期情况说明</view>
                    </view>
                    <!-- 超时状态 -->
                    <view v-if="orderInfo.status==2" class="flex a-center">
                    <view v-if="orderInfo.status == 2" class="flex a-center">
                        <image src="../../static/detailImg/notice.png" class="overTimeIcon shrink0"></image>
                        <view class="overTime">已超时</view>
                        <view class="day">{{orderInfo.createByName||0}}</view>
                        <view class="day">{{ orderInfo.createByName || 0 }}</view>
                        <view class="overTime">天</view>
                    </view>
                </view>
            </view>
            <!-- 已完结诉求信息   已办结-->
            <view class="mt-19 flex a-center j-between topMore" v-if="orderInfo.status==3">
            <view class="mt-19 flex a-center j-between topMore" v-if="orderInfo.status == 3">
                <view class="name">诉求信息</view>
                <view class="flex a-center" @click.stop="toProgressDetail">
                    <view class="more">办理进度</view>
@@ -34,14 +34,14 @@
            </view>
            <!-- 上级驳回   -->
            <view class="mt-19 flex a-center j-between topMore" v-if="orderInfo.status==6">
            <view class="mt-19 flex a-center j-between topMore" v-if="orderInfo.status == 6">
                <view class="name">上报情况</view>
            </view>
            <!-- 上报后的状态 -->
            <view class="card1" v-if="[6,7,5].includes(orderInfo.status)">
            <view class="card1" v-if="[6, 7, 5].includes(orderInfo.status)">
                <!-- 上报上级上级驳回-->
                <view class="flex j-between" v-if="orderInfo.status==6">
                <view class="flex j-between" v-if="orderInfo.status == 6">
                    <view class="flex flex-column a-center  mr-46">
                        <image src="../../static/detailImg/Ovaled.png" class="topIcon shrink0"></image>
                        <view class="proLine">
@@ -50,19 +50,19 @@
                    <view class="infoCard mb-46">
                        <view class="flex j-between">
                            <view class="label">审核时间</view>
                            <view class="value">{{orderInfo.auditTime|formatTime}}</view>
                            <view class="value">{{ orderInfo.auditTime | formatTime }}</view>
                        </view>
                        <view class="flex j-between">
                            <view class="label">审核人</view>
                            <view class="value">{{orderInfo.auditorName||''}}</view>
                            <view class="value">{{ orderInfo.auditorName || '' }}</view>
                        </view>
                        <view class="flex j-between">
                            <view class="label">联系电话</view>
                            <view class="value">{{orderInfo.auditorPhone||''}}</view>
                            <view class="value">{{ orderInfo.auditorPhone || '' }}</view>
                        </view>
                        <view class="flex j-between">
                            <view class="label">驳回原因</view>
                            <view class="value">{{orderInfo.rejectReason||''}}</view>
                            <view class="value">{{ orderInfo.rejectReason || '' }}</view>
                        </view>
                    </view>
                </view>
@@ -74,23 +74,23 @@
                    <view class="infoCard">
                        <view class="flex j-between">
                            <view class="label">上报人</view>
                            <view class="value">{{orderInfo.reporter||''}}</view>
                            <view class="value">{{ orderInfo.reporter || '' }}</view>
                        </view>
                        <view class="flex j-between">
                            <view class="label">联系电话</view>
                            <view class="value">{{orderInfo.contactNumber||''}}</view>
                            <view class="value">{{ orderInfo.contactNumber || '' }}</view>
                        </view>
                        <view class="flex j-between" v-if="!isParty">
                            <view class="label">所属部门</view>
                            <view class="value">{{orderInfo.departmentName||""}}</view>
                            <view class="value">{{ orderInfo.departmentName || "" }}</view>
                        </view>
                        <view class="flex j-between">
                            <view class="label">上报时间</view>
                            <view class="value">{{orderInfo.reportTime|formatTime}}</view>
                            <view class="value">{{ orderInfo.reportTime | formatTime }}</view>
                        </view>
                        <view class="flex j-between">
                            <view class="label">上报说明</view>
                            <view class="value">{{orderInfo.comment||''}}</view>
                            <view class="value">{{ orderInfo.comment || '' }}</view>
                        </view>
                    </view>
                </view>
@@ -99,45 +99,45 @@
            <!--  -->
            <view class="cardInfo">
                <view class="flex j-between a-center">
                    <view class="title">诉求号:{{orderInfo.serialNumber||''}}</view>
                    <view class="flex a-center" v-if="orderInfo.status==0" @click.stop="applyOverTime">
                    <view class="title">诉求号:{{ orderInfo.serialNumber || '' }}</view>
                    <view class="flex a-center" v-if="orderInfo.status == 0" @click.stop="applyOverTime">
                        <view class="apply">延期申请</view>
                        <image src="../../static/detailImg/right.png" class="rightIcon shrink0"></image>
                    </view>
                </view>
                <view class="addressCard">
                    <view class="address">{{orderInfo.location||""}}</view>
                    <view class="address">{{ orderInfo.location || "" }}</view>
                    <image src="../../static/detailImg/dwei.png" class="addressIcon shrink0" mode="aspectFill"></image>
                </view>
                <view class="flex j-between">
                    <view class="label">创建时间</view>
                    <view class="value">{{orderInfo.createTime|formatTime}}</view>
                    <view class="value">{{ orderInfo.createTime | formatTime }}</view>
                </view>
                <view class="flex j-between">
                    <view class="label">问题类型</view>
                    <view class="value">{{orderInfo.problemType||''}}</view>
                    <view class="value">{{ orderInfo.problemType || '' }}</view>
                </view>
                <view class="flex j-between">
                    <view class="label">群众姓名</view>
                    <view class="value">{{orderInfo.name||''}}</view>
                    <view class="value">{{ orderInfo.name || '' }}</view>
                </view>
                <view class="flex j-between">
                    <view class="label"> 联系电话</view>
                    <view class="value">{{orderInfo.contactNumber||""}}</view>
                    <view class="value">{{ orderInfo.contactNumber || "" }}</view>
                </view>
                <view class="flex j-between">
                    <view class="label">详细地址</view>
                    <view class="value">{{orderInfo.detailedAddress||''}}</view>
                    <view class="value">{{ orderInfo.detailedAddress || '' }}</view>
                </view>
                <!-- 上级端需要的字段 -->
                <view v-if="!isParty">
                    <view class="flex j-between">
                        <view class="label">录入人</view>
                        <view class="value">{{orderInfo.nickname||''}}</view>
                        <view class="value">{{ orderInfo.nickname || '' }}</view>
                    </view>
                    <view class="flex j-between">
                        <view class="label">录入人联系方式</view>
                        <view class="value">{{orderInfo.contactNumber||''}}</view>
                        <view class="value">{{ orderInfo.contactNumber || '' }}</view>
                    </view>
                </view>
@@ -148,22 +148,22 @@
            <view class="problem">
                <view class="title">问题描述</view>
                <view class="desc">
                    <view class="top">{{orderInfo.descriptionTitle||""}}</view>
                    <view class="top">{{ orderInfo.descriptionTitle || "" }}</view>
                    <view class="line1"></view>
                    <view class="context">{{orderInfo.descriptionContent||''}}</view>
                    <view class="context">{{ orderInfo.descriptionContent || '' }}</view>
                </view>
                <view class="title">描述图片</view>
                <view class="descPic" v-if="problemImg.length>0">
                    <view class="picItem" v-for="(item,index) in problemImg" @click.stop="viewImage(item)">
                <view class="descPic" v-if="problemImg.length > 0">
                    <view class="picItem" v-for="(item, index) in problemImg" @click.stop="viewImage(item)">
                        <image :src="item" class="img shrink0" mode="aspectFill">
                        </image>
                    </view>
                </view>
                <view v-else class="noData">暂无数据</view>
                <view class="title">描述视频</view>
                <view class="descPic" v-if="problemVideos.length>0">
                    <view class="picItem relative" v-for="(item,index) in problemVideos">
                <view class="descPic" v-if="problemVideos.length > 0">
                    <view class="picItem relative" v-for="(item, index) in problemVideos">
                        <video id="myVideo" class="videoImg shrink0" disabled :controls="false"
                            :show-center-play-btn="false" :src="item">
                        </video>
@@ -177,43 +177,43 @@
            </view>
            <!-- 办结情况 -->
            <view class=" flex a-center j-between topMore topMore1" v-if="orderInfo.status==3">
            <view class=" flex a-center j-between topMore topMore1" v-if="orderInfo.status == 3">
                <view class="name">办结情况</view>
                <view class="flex a-center">
                </view>
            </view>
            <!-- 办结结果描述 -->
            <view class="resultDesc" v-if="orderInfo.status==3">
            <view class="resultDesc" v-if="orderInfo.status == 3">
                <view class="topInfo">
                    <view class="flex a-center j-between mb-15">
                        <view class="flex a-center">
                            <view class="name">办结人员:</view>
                            <view class="value">{{orderInfo.completionUsername||''}}</view>
                            <view class="value">{{ orderInfo.completionUsername || '' }}</view>
                        </view>
                        <view class="flex a-center">
                            <view class="name">联系电话:</view>
                            <view class="value">{{orderInfo.completionUserPhone||''}}</view>
                            <view class="value">{{ orderInfo.completionUserPhone || '' }}</view>
                        </view>
                    </view>
                    <view class="flex a-center">
                        <view class="name">办结时间:</view>
                        <view class="value">{{orderInfo.completionTime|formatTime}}</view>
                        <view class="value">{{ orderInfo.completionTime | formatTime }}</view>
                    </view>
                </view>
                <view class="title">办结结果描述</view>
                <view class="context">{{orderInfo.completionDescription||''}}
                <view class="context">{{ orderInfo.completionDescription || '' }}
                </view>
                <view class="title">描述图片</view>
                <view class="descPic" v-if="resultImg.length>0">
                    <view class="picItem" v-for="(item,index) in resultImg" @click.stop="viewImage(item)">
                <view class="descPic" v-if="resultImg.length > 0">
                    <view class="picItem" v-for="(item, index) in resultImg" @click.stop="viewImage(item)">
                        <image :src="item" class="img shrink0" mode="aspectFill">
                        </image>
                    </view>
                </view>
                <view v-else class="noData">暂无数据</view>
                <view class="title">描述视频</view>
                <view class="descPic" v-if="resultVideos.length>0">
                    <view class="picItem relative" v-for="(item,index) in resultVideos">
                <view class="descPic" v-if="resultVideos.length > 0">
                    <view class="picItem relative" v-for="(item, index) in resultVideos">
                        <video id="myVideo" class="videoImg shrink0" disabled :controls="false"
                            :show-center-play-btn="false" :src="item">
                        </video>
@@ -227,10 +227,10 @@
            </view>
            <!-- 详情/办理进度 --正在办理-延期-超时  显示-->
            <view class="progress" v-if="[0,1,2].includes(orderInfo.status) &&progressesList.length>0">
            <view class="progress" v-if="[0, 1, 2].includes(orderInfo.status) && progressesList.length > 0">
                <view class="title">当前办理进度</view>
                <view class="proCard">
                    <view class="proItem" v-for="(item,index) in progressesList">
                    <view class="proItem" v-for="(item, index) in progressesList">
                        <view class="mr-31 flex flex-column a-center">
                            <image src="../../static/detailImg/Ovaled.png" class="proIcon shrink0" mode="aspectFill">
                            </image>
@@ -239,16 +239,16 @@
                        </view>
                        <view class="flex1">
                            <view class="flex a-center j-between mb-10">
                                <view class="name">{{item.createByName||''}}</view>
                                <view class="time">{{item.createTime | formatTime}}</view>
                                <view class="name">{{ item.createByName || '' }}</view>
                                <view class="time">{{ item.createTime | formatTime }}</view>
                            </view>
                            <view class="context">{{item.describe||''}}</view>
                            <view class="context">{{ item.describe || '' }}</view>
                            <view class="proImg">
                                <view class="imgOrVedio" v-for="(ite,ind) in item.imgList" @click.stop="viewImage(ite)">
                                <view class="imgOrVedio" v-for="(ite, ind) in item.imgList" @click.stop="viewImage(ite)">
                                    <image :src="ite" class="img shrink0" mode="aspectFill">
                                    </image>
                                </view>
                                <view class="imgOrVedio" v-for="(ite,ind) in item.videoList ">
                                <view class="imgOrVedio" v-for="(ite, ind) in item.videoList">
                                    <video id="myVideo" class="videoImg shrink0" disabled :controls="false"
                                        :show-center-play-btn="false" :src="ite">
                                    </video>
@@ -265,30 +265,30 @@
            </view>
            <!-- 详情/诉求流转 --正在办理显示-->
            <view class="careRequire" v-if="orderInfo.status==0 &&flowsList.length>0">
            <view class="careRequire" v-if="orderInfo.status == 0 && flowsList.length > 0">
                <view class="title">诉求流转</view>
                <view class="proCard">
                    <view class="proItem" v-for="(item,index) in flowsList">
                    <view class="proItem" v-for="(item, index) in flowsList">
                        <view class="mr-34 flex flex-column a-center">
                            <image v-if="index==flowsList.length-1" src="../../static/detailImg/Ovaled.png"
                            <image v-if="index == flowsList.length - 1" src="../../static/detailImg/Ovaled.png"
                                class="proIcon shrink0" mode="aspectFill">
                            </image>
                            <image v-else src="../../static/detailImg/Ovaled.png" class="proIcon shrink0"
                                mode="aspectFill">
                            </image>
                            <view v-if="index!=flowsList.length-1" class="proLine">
                            <view v-if="index != flowsList.length - 1" class="proLine">
                            </view>
                        </view>
                        <view class="requireItem">
                            <view class="flex a-center j-between mb-23">
                                <view class="name">{{item.name||''}}</view>
                                <view class="name">{{ item.name || '' }}</view>
                                <view class="time">
                                    {{item.createTime|formatTime}}
                                    {{ item.createTime | formatTime }}
                                </view>
                            </view>
                            <view class="name fs-23">
                                {{item.type==0?"上报":'下派'}}
                                {{ item.type == 0 ? "上报" : '下派' }}
                            </view>
                        </view>
@@ -299,22 +299,22 @@
        </view>
        <!-- 上级显示 -->
        <view class="btnButtom" v-if="[0,1,2,6].includes(orderInfo.status) && !isParty">
            <view class="btnDown" @click.stop="toUp" v-if="userInfo.accountLevel>1"
                :class="[2,3].includes(userInfo.accountLevel)?'':'partyUp'">问题上报</view>
            <view class="btnDown" @click.stop="toDown" v-if="userInfo.accountLevel<4"
                :class="[2,3].includes(userInfo.accountLevel)?'':'partyDown'">诉求下派</view>
        <view class="btnButtom" v-if="[0, 1, 2, 6].includes(orderInfo.status) && !isParty && orderInfo.auditButtonStatus == 1">
            <view class="btnDown" @click.stop="toUp" v-if="userInfo.accountLevel > 1"
                :class="[2, 3].includes(userInfo.accountLevel) ? '' : 'partyUp'">问题上报</view>
            <view class="btnDown" @click.stop="toDown" v-if="userInfo.accountLevel < 4"
                :class="[2, 3].includes(userInfo.accountLevel) ? '' : 'partyDown'">诉求下派</view>
            <view class="btnAdd" @click="addProgress">添加办理进度</view>
            <view class="btnAdd" @click="resultEntery">办理结果录入</view>
        </view>
        <view class="btnButtom" v-if="[5,7].includes(orderInfo.status) && !isParty">
            <view class="cancel" @click.stop="showPop=true">驳回</view>
        <view class="btnButtom" v-if="[5, 7].includes(orderInfo.status) && !isParty && orderInfo.auditButtonStatus == 0">
            <view class="cancel" @click.stop="showPop = true">驳回</view>
            <view class="sure" @click.stop="submitReSolve">审核通过</view>
        </view>
        <!-- 上级显示 -->
        <!-- 党员显示 -->
        <view class="btnButtom" v-if="[0,1,2,6].includes(orderInfo.status) && isParty">
        <view class="btnButtom" v-if="[0, 1, 2, 6].includes(orderInfo.status) && isParty">
            <view class="btnDown partyUp" @click.stop="toUp">问题上报</view>
            <view class="btnAdd partyDown" @click="addProgress">添加办理进度</view>
            <view class="btnAdd partyDown" @click="resultEntery">办理结果录入</view>
@@ -331,7 +331,7 @@
                    <u--textarea v-model="rejectText" placeholder="请输入驳回原因"></u--textarea>
                </view>
                <view class="botton-btn">
                    <view class="cancle" @click.stop="showPop=false">取消</view>
                    <view class="cancle" @click.stop="showPop = false">取消</view>
                    <view class="sure" @click.stop="submitReject">确定</view>
                </view>
            </view>
@@ -340,435 +340,365 @@
</template>
<script>
    import dayjs from '@/uni_modules/uview-ui/libs/util/dayjs.js'
    import {
        workOrderDetail,
        getUserInfo,
        reportAudit,
        delayAudit
    } from './service.js'
    export default {
        data() {
            return {
                id: "1", //工单详情ID
                orderInfo: {}, //工单详情
                problemVideos: [], //描述视频
                problemImg: [], //描述图片
                resultVideos: [], //结果描述视频
                resultImg: [], //结果描述图片
                progressesList: [], //诉求流转记录
                flowsList: [], //办理进度
import dayjs from '@/uni_modules/uview-ui/libs/util/dayjs.js'
import {
    workOrderDetail,
    getUserInfo,
    reportAudit,
    delayAudit
} from './service.js'
export default {
    data() {
        return {
            id: "1", //工单详情ID
            orderInfo: {}, //工单详情
            problemVideos: [], //描述视频
            problemImg: [], //描述图片
            resultVideos: [], //结果描述视频
            resultImg: [], //结果描述图片
            progressesList: [], //诉求流转记录
            flowsList: [], //办理进度
                showPop: false, //弹窗驳回
                rejectText: "", //驳回原因
            showPop: false, //弹窗驳回
            rejectText: "", //驳回原因
                scoreTopHeight: 0, //距离顶部多高
            scoreTopHeight: 0, //距离顶部多高
                userInfo: {}, //个人信息
                isParty: false, //这是党员
            };
        },
        onPageScroll(e) {
            this.scoreTopHeight = e.scrollTop
            userInfo: {}, //个人信息
            isParty: false, //这是党员
        };
    },
    onPageScroll(e) {
        this.scoreTopHeight = e.scrollTop
        },
        filters: {
            formatTime(val) {
                if (!val) return ''
                return dayjs(val).format('YYYY-MM-DD HH:mm:ss')
    },
    filters: {
        formatTime(val) {
            if (!val) return ''
            return dayjs(val).format('YYYY-MM-DD HH:mm:ss')
        }
    },
    onShow() {
        // alert(uni.getStorageSync('token'))
        this.getDetailInfo()
    },
    onLoad(params) {
        if (params.id) {
            this.id = params.id
        }
        getUserInfo().then(res => {
            if (res.data == null || res.data.accountLevel == 5) {
                this.isParty = true
            }
        },
        onShow() {
            // alert(uni.getStorageSync('token'))
            this.getDetailInfo()
        },
        onLoad(params) {
            if (params.id) {
                this.id = params.id
            this.userInfo = {
                ...res.data
            }
            getUserInfo().then(res => {
                if (res.data == null) {
                    this.isParty = true
                }
                this.userInfo = {
                    ...res.data
                }
        })
    },
    methods: {
        open() { },
        close() { },
        viewImage(item) {
            uni.previewImage({
                urls: [item]
            })
        },
        methods: {
            open() {},
            close() {},
            viewImage(item) {
                uni.previewImage({
                    urls: [item]
        // 去大屏播放视频
        openVideo(url) {
            uni.navigateTo({
                url: `/pages/work-detail/maxVideo?url=${url}`
            })
        },
        // 获取订单详情信息
        getDetailInfo() {
            workOrderDetail({
                id: this.id
            }).then(res => {
                if (res.data.images) {
                    this.problemImg = res.data.images.split(',')
                }
                if (res.data.videos) {
                    this.problemVideos = res.data.videos.split(',')
                }
                if (res.data.completionImages) {
                    this.resultImg = res.data.completionImages.split(',')
                }
                if (res.data.completionVideos) {
                    this.resultVideos = res.data.completionVideos.split(',')
                }
                // 办理进度
                if (res.data.complaintProgresses && res.data.complaintProgresses.length > 0) {
                    this.progressesList = res.data.complaintProgresses.map((item) => {
                        return {
                            ...item,
                            imgList: item.imgUrl ? item.imgUrl.split(',') : [],
                            videoList: item.video ? item.video.split(',') : [],
                        }
                    })
                }
                // 诉求流转记录
                if (res.data.complaintFlows && res.data.complaintFlows.length > 0) {
                    this.flowsList = res.data.complaintFlows
                }
                this.orderInfo = {
                    ...res.data
                }
            })
        },
        // 确认驳回
        submitReject() {
            if (!this.rejectText) {
                return uni.showToast({
                    duration: 1500,
                    title: '请输入驳回原因',
                    mask: true,
                    icon: 'none'
                })
            },
            // 去大屏播放视频
            openVideo(url) {
                uni.navigateTo({
                    url: `/pages/work-detail/maxVideo?url=${url}`
                })
            },
            // 获取订单详情信息
            getDetailInfo() {
                workOrderDetail({
                    id: this.id
            }
            if (this.orderInfo.status == 5) { //上报
                reportAudit({
                    id: this.id,
                    auditResult: 2,
                    rejectReason: this.rejectText
                }).then(res => {
                    if (res.data.images) {
                        this.problemImg = res.data.images.split(',')
                    }
                    if (res.data.videos) {
                        this.problemVideos = res.data.videos.split(',')
                    }
                    if (res.data.completionImages) {
                        this.resultImg = res.data.completionImages.split(',')
                    }
                    if (res.data.completionVideos) {
                        this.resultVideos = res.data.completionVideos.split(',')
                    }
                    // 办理进度
                    if (res.data.complaintProgresses && res.data.complaintProgresses.length > 0) {
                        this.progressesList = res.data.complaintProgresses.map((item) => {
                            return {
                                ...item,
                                imgList: item.imgUrl ? item.imgUrl.split(',') : [],
                                videoList: item.video ? item.video.split(',') : [],
                            }
                        })
                    }
                    // 诉求流转记录
                    if (res.data.complaintFlows && res.data.complaintFlows.length > 0) {
                        this.flowsList = res.data.complaintFlows
                    }
                    this.orderInfo = {
                        ...res.data
                    }
                    this.showPop = false
                    // this.getDetailInfo()
                    uni.showToast({
                        title: '操作成功',
                        icon: 'success',
                        mask: true
                    })
                    setTimeout(() => {
                        uni.navigateBack()
                    }, 1500)
                })
            },
            // 确认驳回
            submitReject() {
                if (!this.rejectText) {
                    return uni.showToast({
                        duration: 1500,
                        title: '请输入驳回原因',
                        mask: true,
                        icon: 'none'
            } else { //延期
                delayAudit({
                    complaintId: this.id,
                    auditResult: 2,
                    rejectReason: this.rejectText
                }).then(res => {
                    this.showPop = false
                    uni.showToast({
                        title: '操作成功',
                        icon: 'success',
                        mask: true
                    })
                }
                if (this.orderInfo.status == 5) { //上报
                    reportAudit({
                        id: this.id,
                        auditResult: 2,
                        rejectReason: this.rejectText
                    }).then(res => {
                        this.showPop = false
                        // this.getDetailInfo()
                        uni.showToast({
                            title: '操作成功',
                            icon: 'success',
                            mask: true
                        })
                        setTimeout(() => {
                            uni.navigateBack()
                        }, 1500)
                    // this.getDetailInfo()
                    setTimeout(() => {
                        uni.navigateBack()
                    }, 1500)
                })
            }
        },
        // 确认通过审批
        submitReSolve() {
            if (this.orderInfo.status == 5) { //上报
                reportAudit({
                    id: this.id,
                    auditResult: 1,
                }).then(res => {
                    // this.getDetailInfo()
                    uni.showToast({
                        title: '操作成功',
                        icon: 'success',
                        mask: true
                    })
                } else { //延期
                    delayAudit({
                        complaintId: this.id,
                        auditResult: 2,
                        rejectReason: this.rejectText
                    }).then(res => {
                        this.showPop = false
                        uni.showToast({
                            title: '操作成功',
                            icon: 'success',
                            mask: true
                        })
                        // this.getDetailInfo()
                        setTimeout(() => {
                            uni.navigateBack()
                        }, 1500)
                    setTimeout(() => {
                        uni.navigateBack()
                    }, 1500)
                })
            } else { //延期
                delayAudit({
                    complaintId: this.id,
                    auditResult: 1,
                }).then(res => {
                    uni.showToast({
                        title: '操作成功',
                        icon: 'success',
                        mask: true
                    })
                }
            },
            // 确认通过审批
            submitReSolve() {
                if (this.orderInfo.status == 5) { //上报
                    reportAudit({
                        id: this.id,
                        auditResult: 1,
                    }).then(res => {
                        // this.getDetailInfo()
                        uni.showToast({
                            title: '操作成功',
                            icon: 'success',
                            mask: true
                        })
                        setTimeout(() => {
                            uni.navigateBack()
                        }, 1500)
                    })
                } else { //延期
                    delayAudit({
                        complaintId: this.id,
                        auditResult: 1,
                    }).then(res => {
                        uni.showToast({
                            title: '操作成功',
                            icon: 'success',
                            mask: true
                        })
                        // this.getDetailInfo()
                        setTimeout(() => {
                            uni.navigateBack()
                        }, 1500)
                    })
                }
            },
            //延期申请
            applyOverTime() {
                uni.navigateTo({
                    url: `/pages/work-detail/postpone-apply?id=${this.id}`
                    // this.getDetailInfo()
                    setTimeout(() => {
                        uni.navigateBack()
                    }, 1500)
                })
            },
            // 问题上报
            toUp() {
                uni.navigateTo({
                    url: `/pages/problemReporting/problemReporting?id=${this.id}`
                })
            },
            // 问题下派
            toDown() {
                uni.navigateTo({
                    url: `/pages/dispatchWorkOrder/dispatchWorkOrder?id=${this.id}`
                })
            },
            addProgress() {
                uni.navigateTo({
                    url: `/pages/progress/progress?id=${this.id}`
                })
            },
            resultEntery() {
                uni.navigateTo({
                    url: `/pages/result-entry/index?id=${this.id}`
                })
            },
            toProgressDetail() {
                uni.navigateTo({
                    url: '/pages/progress/progress?type=1&id=' + this.id
                })
            },
            toDelayDetail() {
                uni.navigateTo({
                    url: '/pages/delay/delay?type=1&id=' + this.id
                })
            },
        }
            }
        },
        //延期申请
        applyOverTime() {
            uni.navigateTo({
                url: `/pages/work-detail/postpone-apply?id=${this.id}`
            })
        },
        // 问题上报
        toUp() {
            uni.navigateTo({
                url: `/pages/problemReporting/problemReporting?id=${this.id}`
            })
        },
        // 问题下派
        toDown() {
            uni.navigateTo({
                url: `/pages/dispatchWorkOrder/dispatchWorkOrder?id=${this.id}`
            })
        },
        addProgress() {
            uni.navigateTo({
                url: `/pages/progress/progress?id=${this.id}`
            })
        },
        resultEntery() {
            uni.navigateTo({
                url: `/pages/result-entry/index?id=${this.id}`
            })
        },
        toProgressDetail() {
            uni.navigateTo({
                url: '/pages/progress/progress?type=1&id=' + this.id
            })
        },
        toDelayDetail() {
            uni.navigateTo({
                url: '/pages/delay/delay?type=1&id=' + this.id
            })
        },
    }
}
</script>
<style>
    page {
        background: linear-gradient(180deg, #FFFFFF 0%, #F9F9F9 6%, #F8F8F8 100%);
    }
page {
    background: linear-gradient(180deg, #FFFFFF 0%, #F9F9F9 6%, #F8F8F8 100%);
}
</style>
<style lang="scss" scoped>
    .topColor {
        height: 346rpx;
        background: linear-gradient(180deg, #FFDCDB 0%, rgba(255, 255, 255, 0) 100%);
        // padding: 176rpx 27rpx 17rpx 27rpx;
.topColor {
    height: 346rpx;
    background: linear-gradient(180deg, #FFDCDB 0%, rgba(255, 255, 255, 0) 100%);
    // padding: 176rpx 27rpx 17rpx 27rpx;
}
.allContent {
    margin-top: -243rpx;
    padding: 0 31rpx 178rpx 31rpx;
    .topStatus {
        .status {
            font-weight: 600;
            font-size: 44rpx;
            color: #000000;
            line-height: 62rpx;
            margin-bottom: 15rpx;
        }
        .tit {
            font-size: 27rpx;
            color: rgba(0, 0, 0, 0.8);
            line-height: 38rpx;
            // margin-bottom: 17rpx;
        }
        .plainIcon {
            width: 36rpx;
            height: 36rpx;
        }
        .explain {
            font-weight: 600;
            font-size: 23rpx;
            color: rgba(0, 0, 0, 0.6);
            line-height: 33rpx;
            margin-left: 8rpx;
        }
        .overTimeIcon {
            width: 30.77rpx;
            height: 30.77rpx;
            margin-right: 15rpx;
        }
        .overTime {
            font-weight: 400;
            font-size: 23rpx;
            color: #FF4948;
            line-height: 33rpx;
        }
        .day {
            margin: -11rpx 12rpx 0 9rpx;
            background: #FFEAEA;
            border-radius: 19rpx;
            border: 2rpx solid #FF4948;
            padding: 4rpx 24rpx;
            font-weight: 600;
            font-size: 42rpx;
            color: #FF4948;
            line-height: 42rpx;
        }
    }
    .allContent {
        margin-top: -243rpx;
        padding: 0 31rpx 178rpx 31rpx;
    .topMore {
        padding: 8rpx 31rpx;
        margin: 19rpx -31rpx 0 -31rpx;
        background: linear-gradient(270deg, rgba(102, 102, 102, 0) 0%, rgba(102, 102, 102, 0.14) 100%);
        .topStatus {
            .status {
                font-weight: 600;
                font-size: 44rpx;
                color: #000000;
                line-height: 62rpx;
                margin-bottom: 15rpx;
            }
            .tit {
                font-size: 27rpx;
                color: rgba(0, 0, 0, 0.8);
                line-height: 38rpx;
                // margin-bottom: 17rpx;
            }
            .plainIcon {
                width: 36rpx;
                height: 36rpx;
            }
            .explain {
                font-weight: 600;
                font-size: 23rpx;
                color: rgba(0, 0, 0, 0.6);
                line-height: 33rpx;
                margin-left: 8rpx;
            }
            .overTimeIcon {
                width: 30.77rpx;
                height: 30.77rpx;
                margin-right: 15rpx;
            }
            .overTime {
                font-weight: 400;
                font-size: 23rpx;
                color: #FF4948;
                line-height: 33rpx;
            }
            .day {
                margin: -11rpx 12rpx 0 9rpx;
                background: #FFEAEA;
                border-radius: 19rpx;
                border: 2rpx solid #FF4948;
                padding: 4rpx 24rpx;
                font-weight: 600;
                font-size: 42rpx;
                color: #FF4948;
                line-height: 42rpx;
            }
        .name {
            font-weight: 600;
            font-size: 23rpx;
            color: rgba(0, 0, 0, 0.8);
            line-height: 33rpx;
        }
        .topMore {
            padding: 8rpx 31rpx;
            margin: 19rpx -31rpx 0 -31rpx;
            background: linear-gradient(270deg, rgba(102, 102, 102, 0) 0%, rgba(102, 102, 102, 0.14) 100%);
            .name {
                font-weight: 600;
                font-size: 23rpx;
                color: rgba(0, 0, 0, 0.8);
                line-height: 33rpx;
            }
            .more {
                font-weight: 600;
                font-size: 23rpx;
                color: rgba(0, 0, 0, 0.6);
                line-height: 33rpx;
            }
            .moreIcon {
                width: 19.23rpx;
                height: 19.23rpx;
                margin-left: 15rpx;
            }
        .more {
            font-weight: 600;
            font-size: 23rpx;
            color: rgba(0, 0, 0, 0.6);
            line-height: 33rpx;
        }
        .topMore1 {
            margin-top: 38rpx !important;
        .moreIcon {
            width: 19.23rpx;
            height: 19.23rpx;
            margin-left: 15rpx;
        }
    }
        .card1 {
            margin-top: 21rpx;
    .topMore1 {
        margin-top: 38rpx !important;
    }
    .card1 {
        margin-top: 21rpx;
            .topIcon {
                margin-top: 17rpx;
                width: 26.23rpx;
                height: 26.23rpx;
            }
            .proLine {
                flex: 1;
                width: 4rpx;
                min-height: 50rpx;
                background: rgba(0, 0, 0, 0.06);
                border-radius: 3rpx;
            }
            .infoCard {
                flex: 1;
                background: #FFFFFF;
                box-shadow: 0rpx 4rpx 12rpx 0rpx rgba(0, 0, 0, 0.06);
                padding: 13rpx 30.77rpx 19rpx 31rpx;
                border-radius: 27rpx;
                .label {
                    font-weight: 400;
                    font-size: 27rpx;
                    color: rgba(0, 0, 0, 0.88);
                    line-height: 77rpx;
                }
                .value {
                    max-width: 403rpx;
                    font-weight: 500;
                    font-size: 27rpx;
                    color: rgba(0, 0, 0, 0.88);
                    line-height: 77rpx;
                }
            }
        .topIcon {
            margin-top: 17rpx;
            width: 26.23rpx;
            height: 26.23rpx;
        }
        .cardInfo {
            margin-top: 38.46rpx;
        .proLine {
            flex: 1;
            width: 4rpx;
            min-height: 50rpx;
            background: rgba(0, 0, 0, 0.06);
            border-radius: 3rpx;
        }
        .infoCard {
            flex: 1;
            background: #FFFFFF;
            box-shadow: 0rpx 0rpx 27rpx 0rpx rgba(0, 0, 0, 0.1);
            border-radius: 8rpx;
            padding: 21rpx 31rpx 38rpx 31rpx;
            box-shadow: 0rpx 4rpx 12rpx 0rpx rgba(0, 0, 0, 0.06);
            padding: 13rpx 30.77rpx 19rpx 31rpx;
            border-radius: 27rpx;
            background: linear-gradient(180deg, #FFDCDB 0%, rgba(255, 255, 255, 0) 20%, rgba(255, 255, 255, 0) 100%);
            .title {
                font-weight: 600;
                font-size: 23rpx;
                color: rgba(0, 0, 0, 0.88);
                line-height: 33rpx;
                text-shadow: 0px 0px 27px rgba(0, 0, 0, 0.1);
            }
            .apply {
                font-weight: 600;
                font-size: 23rpx;
                color: #FF4948;
                line-height: 33rpx;
                margin-right: 15rpx;
            }
            .rightIcon {
                width: 19.23rpx;
                height: 19.23rpx;
            }
            .addressCard {
                margin: 33rpx 10rpx;
                padding: 33rpx 27rpx;
                background: linear-gradient(270deg, rgba(255, 241, 0, 0.5) 0%, rgba(255, 249, 172, 0.25) 48%, rgba(255, 255, 255, 0.2) 100%, #FFFFFF 100%);
                border-radius: 19rpx;
                display: flex;
                justify-content: space-between;
                .address {
                    font-weight: 500;
                    font-size: 27rpx;
                    color: #000000;
                    line-height: 38rpx;
                    text-shadow: 0px 0px 27px rgba(0, 0, 0, 0.1);
                }
                .addressIcon {
                    width: 23.08rpx;
                    height: 25.64rpx;
                }
            }
            .label {
                font-weight: 400;
@@ -784,104 +714,290 @@
                color: rgba(0, 0, 0, 0.88);
                line-height: 77rpx;
            }
        }
        .problem {
            border-radius: 27rpx;
            margin-top: 38.46rpx;
            background: #FFFFFF;
            box-shadow: 0rpx 0rpx 27rpx 0rpx rgba(0, 0, 0, 0.1);
            padding: 0 31rpx 34rpx 31rpx;
    }
            .title {
                padding-top: 34rpx;
                font-weight: 600;
    .cardInfo {
        margin-top: 38.46rpx;
        background: #FFFFFF;
        box-shadow: 0rpx 0rpx 27rpx 0rpx rgba(0, 0, 0, 0.1);
        border-radius: 8rpx;
        padding: 21rpx 31rpx 38rpx 31rpx;
        border-radius: 27rpx;
        background: linear-gradient(180deg, #FFDCDB 0%, rgba(255, 255, 255, 0) 20%, rgba(255, 255, 255, 0) 100%);
        .title {
            font-weight: 600;
            font-size: 23rpx;
            color: rgba(0, 0, 0, 0.88);
            line-height: 33rpx;
            text-shadow: 0px 0px 27px rgba(0, 0, 0, 0.1);
        }
        .apply {
            font-weight: 600;
            font-size: 23rpx;
            color: #FF4948;
            line-height: 33rpx;
            margin-right: 15rpx;
        }
        .rightIcon {
            width: 19.23rpx;
            height: 19.23rpx;
        }
        .addressCard {
            margin: 33rpx 10rpx;
            padding: 33rpx 27rpx;
            background: linear-gradient(270deg, rgba(255, 241, 0, 0.5) 0%, rgba(255, 249, 172, 0.25) 48%, rgba(255, 255, 255, 0.2) 100%, #FFFFFF 100%);
            border-radius: 19rpx;
            display: flex;
            justify-content: space-between;
            .address {
                font-weight: 500;
                font-size: 27rpx;
                color: rgba(0, 0, 0, 0.88);
                color: #000000;
                line-height: 38rpx;
                text-shadow: 0px 0px 27px rgba(0, 0, 0, 0.1);
                margin-bottom: 27rpx;
            }
            .desc {
                background: #F8F8F8;
                // box-shadow: 0rpx 0rpx 27rpx 0rpx rgba(0, 0, 0, 0.1);
                border-radius: 8rpx;
                padding: 29rpx 0 121rpx 0;
            .addressIcon {
                width: 23.08rpx;
                height: 25.64rpx;
            }
        }
                .top {
                    padding: 0 31rpx;
        .label {
            font-weight: 400;
            font-size: 27rpx;
            color: rgba(0, 0, 0, 0.88);
            line-height: 77rpx;
        }
        .value {
            max-width: 403rpx;
            font-weight: 500;
            font-size: 27rpx;
            color: rgba(0, 0, 0, 0.88);
            line-height: 77rpx;
        }
    }
    .problem {
        border-radius: 27rpx;
        margin-top: 38.46rpx;
        background: #FFFFFF;
        box-shadow: 0rpx 0rpx 27rpx 0rpx rgba(0, 0, 0, 0.1);
        padding: 0 31rpx 34rpx 31rpx;
        .title {
            padding-top: 34rpx;
            font-weight: 600;
            font-size: 27rpx;
            color: rgba(0, 0, 0, 0.88);
            line-height: 38rpx;
            text-shadow: 0px 0px 27px rgba(0, 0, 0, 0.1);
            margin-bottom: 27rpx;
        }
        .desc {
            background: #F8F8F8;
            // box-shadow: 0rpx 0rpx 27rpx 0rpx rgba(0, 0, 0, 0.1);
            border-radius: 8rpx;
            padding: 29rpx 0 121rpx 0;
            .top {
                padding: 0 31rpx;
                font-size: 27rpx;
                color: rgba(0, 0, 0, 0.8);
                line-height: 38rpx;
            }
            .line1 {
                margin: 27rpx 0;
                height: 2rpx;
                background: rgba(0, 10, 26, 0.07);
            }
            .context {
                padding: 0 31rpx;
                font-size: 27rpx;
                color: rgba(0, 0, 0, 0.8);
                line-height: 38rpx;
            }
        }
        .descPic {
            display: flex;
            flex-wrap: wrap;
            .picItem {
                margin-right: 15rpx;
                .img {
                    width: 140.38rpx;
                    height: 140.38rpx;
                    border-radius: 7.69rpx;
                }
            }
        }
    }
    .progress {
        border-radius: 27rpx;
        margin-top: 38.46rpx;
        background: #FFFFFF;
        box-shadow: 0rpx 0rpx 27rpx 0rpx rgba(0, 0, 0, 0.1);
        padding: 34rpx 31rpx;
        .title {
            font-weight: 600;
            font-size: 27rpx;
            color: rgba(0, 0, 0, 0.88);
            line-height: 38rpx;
            text-shadow: 0px 0px 27px rgba(0, 0, 0, 0.1);
            margin-bottom: 48rpx;
        }
        .proCard {
            .proItem {
                display: flex;
                padding-bottom: 46rpx;
                .proIcon {
                    width: 26.23rpx;
                    height: 26.23rpx;
                    margin: 10rpx 0;
                }
                .proLine {
                    flex: 1;
                    width: 4rpx;
                    min-height: 50rpx;
                    background: rgba(0, 0, 0, 0.06);
                    border-radius: 3rpx;
                }
                .name {
                    font-weight: 400;
                    font-size: 27rpx;
                    color: rgba(0, 0, 0, 0.8);
                    line-height: 38rpx;
                }
                .line1 {
                    margin: 27rpx 0;
                    height: 2rpx;
                    background: rgba(0, 10, 26, 0.07);
                .time {
                    font-weight: 400;
                    font-size: 23rpx;
                    color: rgba(0, 0, 0, 0.4);
                    line-height: 33rpx;
                }
                .context {
                    padding: 0 31rpx;
                    font-size: 27rpx;
                    color: rgba(0, 0, 0, 0.8);
                    line-height: 38rpx;
                }
            }
            .descPic {
                display: flex;
                flex-wrap: wrap;
                .proImg {
                    display: flex;
                    flex-wrap: wrap;
                .picItem {
                    margin-right: 15rpx;
                    .imgOrVedio {
                        margin-right: 17rpx;
                        position: relative;
                    .img {
                        width: 140.38rpx;
                        height: 140.38rpx;
                        border-radius: 7.69rpx;
                        .videoImg {
                            width: 140.38rpx;
                            height: 140.38rpx;
                            border-radius: 7.69rpx;
                            margin-top: 19rpx;
                            position: relative;
                        }
                        .img {
                            width: 140rpx;
                            height: 140rpx;
                            border-radius: 8rpx;
                            margin-top: 19rpx;
                        }
                        .videoOpen {
                            position: absolute;
                            top: 10rpx;
                            left: 0;
                            z-index: 99;
                            width: 140rpx;
                            height: 140rpx;
                            border-radius: 8rpx;
                            display: flex;
                            align-items: center;
                            justify-content: center;
                            .video {
                                z-index: 999;
                                width: 140rpx;
                                height: 140rpx;
                            }
                        }
                    }
                }
            }
            .proItem:last-child {
                .proLine {
                    display: none;
                }
            }
        }
    }
    .careRequire {
        border-radius: 27rpx;
        margin-top: 38.46rpx;
        background: #FFFFFF;
        box-shadow: 0rpx 0rpx 27rpx 0rpx rgba(0, 0, 0, 0.1);
        padding: 34rpx 31rpx;
        .title {
            font-weight: 600;
            font-size: 27rpx;
            color: rgba(0, 0, 0, 0.88);
            line-height: 38rpx;
            text-shadow: 0px 0px 27px rgba(0, 0, 0, 0.1);
            margin-bottom: 38rpx;
        }
        .progress {
            border-radius: 27rpx;
            margin-top: 38.46rpx;
            background: #FFFFFF;
            box-shadow: 0rpx 0rpx 27rpx 0rpx rgba(0, 0, 0, 0.1);
            padding: 34rpx 31rpx;
        .proCard {
            .proItem {
                display: flex;
            .title {
                font-weight: 600;
                font-size: 27rpx;
                color: rgba(0, 0, 0, 0.88);
                line-height: 38rpx;
                text-shadow: 0px 0px 27px rgba(0, 0, 0, 0.1);
                margin-bottom: 48rpx;
            }
            .proCard {
                .proItem {
                    display: flex;
                    padding-bottom: 46rpx;
                .proIcon {
                    width: 26.23rpx;
                    height: 26.23rpx;
                    margin: 23rpx 0 19rpx 0;
                }
                    .proIcon {
                        width: 26.23rpx;
                        height: 26.23rpx;
                        margin: 10rpx 0;
                    }
                .proLine {
                    flex: 1;
                    width: 4rpx;
                    min-height: 50rpx;
                    background: rgba(0, 0, 0, 0.06);
                    border-radius: 3rpx;
                }
                    .proLine {
                        flex: 1;
                        width: 4rpx;
                        min-height: 50rpx;
                        background: rgba(0, 0, 0, 0.06);
                        border-radius: 3rpx;
                    }
                .requireItem {
                    flex: 1;
                    background: #F9F9F9;
                    box-shadow: 0rpx 0rpx 27rpx 0rpx rgba(0, 0, 0, 0.1);
                    border-radius: 8rpx;
                    padding: 31rpx;
                    margin-bottom: 46rpx;
                    .name {
                        font-weight: 400;
@@ -897,402 +1013,286 @@
                        line-height: 33rpx;
                    }
                    .context {
                        font-size: 27rpx;
                        color: rgba(0, 0, 0, 0.8);
                        line-height: 38rpx;
                    }
                    .proImg {
                        display: flex;
                        flex-wrap: wrap;
                        .imgOrVedio {
                            margin-right: 17rpx;
                            position: relative;
                            .videoImg {
                                width: 140.38rpx;
                                height: 140.38rpx;
                                border-radius: 7.69rpx;
                                margin-top: 19rpx;
                                position: relative;
                            }
                            .img {
                                width: 140rpx;
                                height: 140rpx;
                                border-radius: 8rpx;
                                margin-top: 19rpx;
                            }
                            .videoOpen {
                                position: absolute;
                                top: 10rpx;
                                left: 0;
                                z-index: 99;
                                width: 140rpx;
                                height: 140rpx;
                                border-radius: 8rpx;
                                display: flex;
                                align-items: center;
                                justify-content: center;
                                .video {
                                    z-index: 999;
                                    width: 140rpx;
                                    height: 140rpx;
                                }
                            }
                        }
                    .opt1 {
                        color: rgba(0, 0, 0, 0.10) !important;
                    }
                }
                .proItem:last-child {
                    .proLine {
                        display: none;
                    }
            }
            .proItem:last-child {
                .proLine {
                    display: none;
                }
            }
        }
        .careRequire {
            border-radius: 27rpx;
            margin-top: 38.46rpx;
            background: #FFFFFF;
            box-shadow: 0rpx 0rpx 27rpx 0rpx rgba(0, 0, 0, 0.1);
            padding: 34rpx 31rpx;
            .title {
                font-weight: 600;
                font-size: 27rpx;
                color: rgba(0, 0, 0, 0.88);
                line-height: 38rpx;
                text-shadow: 0px 0px 27px rgba(0, 0, 0, 0.1);
                margin-bottom: 38rpx;
            }
            .proCard {
                .proItem {
                    display: flex;
                    .proIcon {
                        width: 26.23rpx;
                        height: 26.23rpx;
                        margin: 23rpx 0 19rpx 0;
                    }
                    .proLine {
                        flex: 1;
                        width: 4rpx;
                        min-height: 50rpx;
                        background: rgba(0, 0, 0, 0.06);
                        border-radius: 3rpx;
                    }
                    .requireItem {
                        flex: 1;
                        background: #F9F9F9;
                        box-shadow: 0rpx 0rpx 27rpx 0rpx rgba(0, 0, 0, 0.1);
                        border-radius: 8rpx;
                        padding: 31rpx;
                        margin-bottom: 46rpx;
                        .name {
                            font-weight: 400;
                            font-size: 27rpx;
                            color: rgba(0, 0, 0, 0.8);
                            line-height: 38rpx;
                        }
                        .time {
                            font-weight: 400;
                            font-size: 23rpx;
                            color: rgba(0, 0, 0, 0.4);
                            line-height: 33rpx;
                        }
                        .opt1 {
                            color: rgba(0, 0, 0, 0.10) !important;
                        }
                    }
                }
                .proItem:last-child {
                    .proLine {
                        display: none;
                    }
                }
            }
        }
        .resultDesc {
            background: #FFFFFF;
            box-shadow: 0rpx 0rpx 27rpx 0rpx rgba(0, 0, 0, 0.1);
            margin-top: 27rpx;
            padding: 31rpx 31rpx 31rpx 27rpx;
            border-radius: 27rpx;
            .topInfo {
                background: rgba(252, 141, 85, 0.1);
                border-radius: 8rpx;
                padding: 19rpx 27rpx;
                .name {
                    font-size: 23rpx;
                    color: #000000;
                    line-height: 33rpx;
                    margin-right: 8rpx;
                }
                .value {
                    font-size: 23rpx;
                    color: #000000;
                    line-height: 33rpx;
                }
            }
            .title {
                font-weight: 600;
                font-size: 27rpx;
                color: rgba(0, 0, 0, 0.88);
                line-height: 38rpx;
                margin-top: 38rpx;
                margin-bottom: 27rpx;
            }
            .context {
                padding: 25rpx 30rpx 29rpx 31rpx;
                font-size: 27rpx;
                color: rgba(0, 0, 0, 0.8);
                line-height: 38rpx;
            }
        }
    }
    .descPic {
        display: flex;
        flex-wrap: wrap;
    .resultDesc {
        background: #FFFFFF;
        box-shadow: 0rpx 0rpx 27rpx 0rpx rgba(0, 0, 0, 0.1);
        margin-top: 27rpx;
        padding: 31rpx 31rpx 31rpx 27rpx;
        border-radius: 27rpx;
        .picItem {
            margin-right: 15rpx;
        .topInfo {
            background: rgba(252, 141, 85, 0.1);
            border-radius: 8rpx;
            padding: 19rpx 27rpx;
            .name {
                font-size: 23rpx;
                color: #000000;
                line-height: 33rpx;
                margin-right: 8rpx;
            }
            .img {
                width: 140.38rpx;
                height: 140.38rpx;
                border-radius: 7.69rpx;
            .value {
                font-size: 23rpx;
                color: #000000;
                line-height: 33rpx;
            }
        }
        .videoImg {
        .title {
            font-weight: 600;
            font-size: 27rpx;
            color: rgba(0, 0, 0, 0.88);
            line-height: 38rpx;
            margin-top: 38rpx;
            margin-bottom: 27rpx;
        }
        .context {
            padding: 25rpx 30rpx 29rpx 31rpx;
            font-size: 27rpx;
            color: rgba(0, 0, 0, 0.8);
            line-height: 38rpx;
        }
    }
}
.descPic {
    display: flex;
    flex-wrap: wrap;
    .picItem {
        margin-right: 15rpx;
        .img {
            width: 140.38rpx;
            height: 140.38rpx;
            border-radius: 7.69rpx;
            position: relative;
        }
        .videoOpen {
            position: absolute;
            top: 10rpx;
            left: 0;
            z-index: 99;
            width: 140rpx;
            height: 140rpx;
            border-radius: 8rpx;
            display: flex;
            align-items: center;
            justify-content: center;
            .video {
                z-index: 999;
                width: 140rpx;
                height: 140rpx;
            }
        }
    }
    .noData {
        font-size: 27rpx;
        color: rgba(0, 0, 0, 0.40);
        line-height: 38rpx;
    .videoImg {
        width: 140.38rpx;
        height: 140.38rpx;
        border-radius: 7.69rpx;
        position: relative;
    }
    #myVideo {
        z-index: 1;
    }
    .btnButtom {
    .videoOpen {
        position: absolute;
        top: 10rpx;
        left: 0;
        z-index: 99;
        position: fixed;
        bottom: 0;
        width: 100vw;
        box-sizing: border-box;
        padding: 33rpx 31rpx;
        width: 140rpx;
        height: 140rpx;
        border-radius: 8rpx;
        display: flex;
        background-color: #ffffff;
        justify-content: space-between;
        .cancel {
            background: #FFFFFF;
            border: 2rpx solid;
            box-shadow: 0 0 0 5px linear-gradient(270deg, rgba(252, 141, 85, 1), rgba(255, 73, 72, 1));
            border-image-slice: 1;
            border-radius: 38rpx;
            font-size: 27rpx;
            color: #FF4948;
            line-height: 38rpx;
            padding: 19rpx 138rpx;
        }
        .sure {
            background: linear-gradient(270deg, #FC8D55 0%, #FF4948 100%);
            border-radius: 38rpx;
            font-size: 27rpx;
            color: #FFFFFF;
            line-height: 38rpx;
            padding: 19rpx 119rpx 19rpx 119rpx;
        }
        .btnDown {
            background: #FFFFFF;
            border: 2rpx solid;
            box-shadow: 0 0 0 5px linear-gradient(270deg, rgba(252, 141, 85, 1), rgba(255, 73, 72, 1));
            border-image-slice: 1;
            border-radius: 38rpx;
            font-size: 27rpx;
            color: #FF4948;
            line-height: 38rpx;
            padding: 19rpx 13rpx;
        }
        .btnAdd {
            background: linear-gradient(270deg, #FC8D55 0%, #FF4948 100%);
            border-radius: 38rpx;
            font-size: 27rpx;
            color: #FFFFFF;
            line-height: 38rpx;
            padding: 19rpx 15rpx 19rpx 15rpx;
        }
        .partyUp {
            padding: 19rpx 52rpx !important;
        }
        .partyDown {
            padding: 19rpx 25rpx 19rpx 25rpx !important;
        }
    }
    .popup-content {
        background: url('/static/pop@2x.png') no-repeat center center;
        width: 576.92rpx;
        // height: 425rpx;
        border-radius: 19rpx;
        .title-pop {
            font-family: PingFangSC, PingFang SC;
            font-weight: 600;
            font-size: 35rpx;
            color: rgba(0, 0, 0, 0.8);
            line-height: 35rpx;
            text-align: center;
            margin-top: 46.15rpx;
        }
        .pop-textArea {
            padding: 34rpx 44rpx 0 44rpx;
            ::v-deep .u-textarea {}
        }
        .pop-label {
            font-family: PingFang-SC, PingFang-SC;
            font-weight: 500;
            font-size: 31rpx;
            color: rgba(0, 0, 0, 0.6);
            margin-top: 46.15rpx;
            margin-left: 64.54rpx;
        }
        .pop-select {
            height: 77rpx;
            background: #FFFFFF;
            border-radius: 15rpx;
            border: 2rpx solid rgba(0, 0, 0, 0.15);
            margin-left: 61.54rpx;
            margin-top: 19.23rpx;
            margin-right: 61.54rpx;
            display: flex;
            align-items: center;
            padding-left: 30.77rpx;
            font-family: PingFangSC, PingFang SC;
            font-weight: 400;
            font-size: 31rpx;
            color: rgba(0, 0, 0, 0.24);
            cursor: pointer;
        }
        .botton-btn {
            display: flex;
            margin-top: 44.23rpx;
            justify-content: center;
            padding-bottom: 55rpx;
        }
        .cancle {
            width: 212rpx;
            height: 77rpx;
            border-radius: 48rpx;
            border: 2rpx solid rgba(0, 0, 0, 0.8);
            font-family: PingFangSC, PingFang SC;
            font-weight: 500;
            font-size: 27rpx;
            color: rgba(0, 0, 0, 0.8);
            display: flex;
            justify-content: center;
            align-items: center;
            margin-right: 32.69rpx;
            cursor: pointer;
        }
        .sure {
            width: 212rpx;
            height: 77rpx;
            background: linear-gradient(270deg, #FC8D55 0%, #FF4948 100%);
            border-radius: 48rpx;
            display: flex;
            justify-content: center;
            align-items: center;
            font-family: PingFangSC, PingFang SC;
            font-weight: 600;
            font-size: 27rpx;
            color: #FFFFFF;
            cursor: pointer;
        }
    }
    .preview-full {
        width: 100vw;
        height: 100vh;
        display: flex;
        flex-direction: column;
        align-items: center;
        justify-content: center;
        background-color: #000000;
        .maxVideo {
            width: 100%;
        .video {
            z-index: 999;
            width: 140rpx;
            height: 140rpx;
        }
    }
}
.noData {
    font-size: 27rpx;
    color: rgba(0, 0, 0, 0.40);
    line-height: 38rpx;
}
#myVideo {
    z-index: 1;
}
.btnButtom {
    z-index: 99;
    position: fixed;
    bottom: 0;
    width: 100vw;
    box-sizing: border-box;
    padding: 33rpx 31rpx;
    display: flex;
    background-color: #ffffff;
    justify-content: space-between;
    .cancel {
        background: #FFFFFF;
        border: 2rpx solid;
        box-shadow: 0 0 0 5px linear-gradient(270deg, rgba(252, 141, 85, 1), rgba(255, 73, 72, 1));
        border-image-slice: 1;
        border-radius: 38rpx;
        font-size: 27rpx;
        color: #FF4948;
        line-height: 38rpx;
        padding: 19rpx 138rpx;
    }
    .sure {
        background: linear-gradient(270deg, #FC8D55 0%, #FF4948 100%);
        border-radius: 38rpx;
        font-size: 27rpx;
        color: #FFFFFF;
        line-height: 38rpx;
        padding: 19rpx 119rpx 19rpx 119rpx;
    }
    .btnDown {
        background: #FFFFFF;
        border: 2rpx solid;
        box-shadow: 0 0 0 5px linear-gradient(270deg, rgba(252, 141, 85, 1), rgba(255, 73, 72, 1));
        border-image-slice: 1;
        border-radius: 38rpx;
        font-size: 27rpx;
        color: #FF4948;
        line-height: 38rpx;
        padding: 19rpx 13rpx;
    }
    .btnAdd {
        background: linear-gradient(270deg, #FC8D55 0%, #FF4948 100%);
        border-radius: 38rpx;
        font-size: 27rpx;
        color: #FFFFFF;
        line-height: 38rpx;
        padding: 19rpx 15rpx 19rpx 15rpx;
    }
    .partyUp {
        padding: 19rpx 52rpx !important;
    }
    .partyDown {
        padding: 19rpx 25rpx 19rpx 25rpx !important;
    }
}
.popup-content {
    background: url('/static/pop@2x.png') no-repeat center center;
    width: 576.92rpx;
    // height: 425rpx;
    border-radius: 19rpx;
    .title-pop {
        font-family: PingFangSC, PingFang SC;
        font-weight: 600;
        font-size: 35rpx;
        color: rgba(0, 0, 0, 0.8);
        line-height: 35rpx;
        text-align: center;
        margin-top: 46.15rpx;
    }
    .pop-textArea {
        padding: 34rpx 44rpx 0 44rpx;
        ::v-deep .u-textarea {}
    }
    .pop-label {
        font-family: PingFang-SC, PingFang-SC;
        font-weight: 500;
        font-size: 31rpx;
        color: rgba(0, 0, 0, 0.6);
        margin-top: 46.15rpx;
        margin-left: 64.54rpx;
    }
    .pop-select {
        height: 77rpx;
        background: #FFFFFF;
        border-radius: 15rpx;
        border: 2rpx solid rgba(0, 0, 0, 0.15);
        margin-left: 61.54rpx;
        margin-top: 19.23rpx;
        margin-right: 61.54rpx;
        display: flex;
        align-items: center;
        padding-left: 30.77rpx;
        font-family: PingFangSC, PingFang SC;
        font-weight: 400;
        font-size: 31rpx;
        color: rgba(0, 0, 0, 0.24);
        cursor: pointer;
    }
    .botton-btn {
        display: flex;
        margin-top: 44.23rpx;
        justify-content: center;
        padding-bottom: 55rpx;
    }
    .cancle {
        width: 212rpx;
        height: 77rpx;
        border-radius: 48rpx;
        border: 2rpx solid rgba(0, 0, 0, 0.8);
        font-family: PingFangSC, PingFang SC;
        font-weight: 500;
        font-size: 27rpx;
        color: rgba(0, 0, 0, 0.8);
        display: flex;
        justify-content: center;
        align-items: center;
        margin-right: 32.69rpx;
        cursor: pointer;
    }
    .sure {
        width: 212rpx;
        height: 77rpx;
        background: linear-gradient(270deg, #FC8D55 0%, #FF4948 100%);
        border-radius: 48rpx;
        display: flex;
        justify-content: center;
        align-items: center;
        font-family: PingFangSC, PingFang SC;
        font-weight: 600;
        font-size: 27rpx;
        color: #FFFFFF;
        cursor: pointer;
    }
}
.preview-full {
    width: 100vw;
    height: 100vh;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    background-color: #000000;
    .maxVideo {
        width: 100%;
    }
}
</style>
H5/static/home/img9.png

H5/uni_modules/uview-ui/components/u-skeleton/u-skeleton.vue
@@ -110,7 +110,7 @@
                    item.height = uni.$u.addUnit(rowHeight)
                    rows.push(item)
                }
                // console.log(rows);
                //
                return rows
            },
            uTitleWidth() {
H5/uni_modules/uview-ui/components/u-slider/nvue.js
@@ -105,7 +105,7 @@
            //                  width: `${this.startX + this.deltaX}px`
            //     }
            // })
            // // console.log(this.startX + this.deltaX);
            // //
            // animation.transition(button, {
            //     styles: {
            //         transform: `translateX(${this.startX + this.deltaX}px)`
@@ -141,7 +141,7 @@
            this.barStyle = {
                width: `${width}px`
            }
            // console.log('width', width);
            //
            if (drag) {
                this.$emit('drag', {
                    value
H5/uni_modules/uview-ui/libs/config/config.js
@@ -3,7 +3,7 @@
// 开发环境才提示,生产环境不会提示
if (process.env.NODE_ENV === 'development') {
    console.log(`\n %c uView V${version} %c https://uviewui.com/ \n\n`, 'color: #ffffff; background: #3c9cff; padding:5px 0; border-radius: 5px;');
}
export default {
H5/uni_modules/uview-ui/libs/util/calendar.js
@@ -378,7 +378,7 @@
        * @param m  solar month
        * @param d  solar day
        * @return JSON object
        * @eg:console.log(calendar.solar2lunar(1987,11,01));
        * @eg:
        */
    solar2lunar: function (y, m, d) { // 参数区间1900.1.31~2100.12.31
        // 年份限定、上限
@@ -497,7 +497,7 @@
        * @param d  lunar day
        * @param isLeapMonth  lunar month is leap or not.[如果是农历闰月第四个参数赋值true即可]
        * @return JSON object
        * @eg:console.log(calendar.lunar2solar(1987,9,10));
        * @eg:
        */
    lunar2solar: function (y, m, d, isLeapMonth) { // 参数区间1900.1.31~2100.12.1
        var isLeapMonth = !!isLeapMonth
H5/utils/request.js
@@ -17,7 +17,7 @@
        })
    }
    return new Promise(function(resolve, reject) {
    return new Promise(function (resolve, reject) {
        let token = 'Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOjE4OTI0MjE4MjgwODU4Mzc4MjYsInR5cGUiOjEsImV4cCI6MTc0MTY5ODg0OCwiY3JlYXRlZCI6MTc0MDQwMjg0ODMzN30.7IYRD37yTkhqcnKyXWcqKk_iTisMp3ar_ByfuVR7Go9rK8ZnGJrlwC3z4NF_ly7IIoBHgE2E4IAvfm3ccam8wg'
        let header = {
@@ -134,7 +134,7 @@
            title: '提示',
            content: str,
            showCancel: false,
            success: function(res) {
            success: function (res) {
                if (res.confirm) {
                    // if (routeStr == 'pages/login/index') {
                    //     uni.reLaunch({
management/config/config.ts
@@ -139,5 +139,5 @@
  },
  favicons: [],
  requestRecord: {},
  publicPath: REACT_APP_ENV === 'prod' ? '/admin/' : '/',
  publicPath: REACT_APP_ENV === 'prod' ? './' : '/',
});
management/config/env.ts
@@ -1,11 +1,12 @@
export default {
  dev: {
    SERVER_URL: 'http://192.168.110.188:6194',
    // SERVER_URL: 'https://huacheng.psciio.com',
  },
  test: {
    SERVER_URL: '',
  },
  prod: {
    SERVER_URL: '',
    SERVER_URL: 'https://huacheng.psciio.com',
  },
};
management/config/routes.ts
@@ -55,7 +55,7 @@
        name: '人员管理',
        path: '/setting/user',
        component: './setting/user',
        // access: '/system_setting/user_management',
        access: '/system_setting/people_management',
      }
    ],
  },
management/src/app.tsx
@@ -89,6 +89,7 @@
      );
    },
    ...initialState?.settings,
    pageTitleRender: () => '“三个身边”群众工作机制平台'
  };
};
management/src/components/RightContent/AvatarDropdown.tsx
@@ -16,6 +16,7 @@
  // 
  const { currentUser } = initialState || {};
  console.log('currentUser currentUser currentUser currentUser',currentUser)
  return <span className="anticon">{currentUser?.userName || '超级管理员'}</span>;
};
@@ -24,20 +25,22 @@
  const { initialState, setInitialState } = useModel('@@initialState');
  const [unreadCount, setUnreadCount] = useState(0);
  const { currentUser } = initialState || {};
  useEffect(() => {
    // const timer = setInterval(() => {
    //   getUnreadCount().then((res: any) => {
    //     setUnreadCount(res.data || 0);
    //   });
    // }, 1000 * 5)
    const timer = setInterval(() => {
      getUnreadCount().then((res: any) => {
        setUnreadCount(res.data || 0);
      });
    }, 1000 * 5)
    // return () => clearInterval(timer);
    return () => clearInterval(timer);
  }, []);
  const onMenuClick = async () => {
    await outLogin();
    localStorage.clear();
    history.push('/login');
    flushSync(() => {
      setInitialState((s) => ({ ...s, currentUser: undefined }));
    });
@@ -52,6 +55,7 @@
        <div style={{ border: '1px solid red', borderRadius: '50%', width: '18px', lineHeight: '16px', marginLeft: '5px', textAlign: 'center', color: 'red', flexShrink: 0 }}>{unreadCount}</div>
      </div>
    }
    <div style={{ marginRight: '25px' }} >{currentUser?.userName || '超级管理员'}</div>
    <div className="logoOut" onClick={onMenuClick}>退出登录<LogoutOutlined style={{ marginLeft: '5px' }} /></div>
  </div>
};
management/src/global.less
@@ -63,4 +63,30 @@
:where(.css-dev-only-do-not-override-17md30i).ant-menu-light .ant-menu-submenu-selected>.ant-menu-submenu-title,
:where(.css-dev-only-do-not-override-17md30i).ant-menu-light>.ant-menu .ant-menu-submenu-selected>.ant-menu-submenu-title{
  color: rgba(0, 0, 0, 0.95);
}
.del-confirm {
  .del-icon {
    margin-right: 5px;
    width: 22px;
    height: 22px;
    background-color: rgba(233, 157, 66, 1);
    color: #fff;
    border-radius: 50%;
    align-content: center;
    text-align: center;
  }
  .ant-modal-confirm-btns {
    .ant-btn-default:last-child {
      border-color: red !important;
      color: #fff !important;
      background-color: red !important;
    }
    .ant-btn-default {
      color: #000 !important;
      border-color: #d9d9d9 !important;
    }
  }
}
management/src/pages/Login/index.tsx
@@ -72,7 +72,7 @@
      id: 'pages.login.success',
      defaultMessage: '登录成功!',
    });
    const userInfo = { userName: data.name };
    const userInfo = { userName: data.name,...data };
    localStorage.setItem('userInfo', JSON.stringify(userInfo));
    let permissionList: any[] = [
      "/work_order_transaction_management/work_order_item_configuration",
@@ -94,6 +94,8 @@
      "/system_setting/people_management/edit",
      "/work_order_transaction_management/problem_type_management/add",
      "/system_setting/unit_management/add",
      "/system_setting/people_management/detail",
      "/system_setting/role_management/detail",
      "/system_setting/unit_management",
      "/message_notification",
      "/system_setting/role_management/add",
@@ -105,6 +107,7 @@
      "/system_setting/position_management",
      "/system_setting",
      "/system_setting/people_management",
      "/work_order_transaction_management/work_order_item_configuration/save",
    ];
    let accessObj: any = {};
    permissionList.map((item) => {
@@ -114,11 +117,12 @@
        accessObj[item] = data.menu.includes(item);
      }
    });
    setInitialState((s: any) => ({
      ...s,
      token: data.token,
      userName:data.name,
      permission: accessObj,
      currentUser: userInfo,
      settings: Settings,
@@ -167,7 +171,7 @@
        >
          <div style={{ width: '787px', fontSize: '26px', textAlign: 'center' }}>
            <h1>
              “三个身边”群众工作机制问题化解
              “三个身边”群众工作机制
            </h1>
            <h1>平台</h1>
          </div>
management/src/pages/message-notification/index.jsx
@@ -1,13 +1,16 @@
import { PageContainer, ProTable } from '@ant-design/pro-components';
import { buildProTableDataSource, sendRequest, showDelConfirm } from '@/utils/antdUtils';
import { Button, message, Space, Select } from 'antd';
import { useRef, useState } from 'react';
import { Button, message, Space, Select, Cascader } from 'antd';
import { useRef, useState, useEffect } from 'react';
import { Access, history, useAccess } from 'umi';
import { getList, setStatus } from './service'
import { getList, setStatus, getUnitList,systemPostList } from './service'
import { render } from 'react-dom';
const Banner = () => {
  const actionRef = useRef();
  const access = useAccess();
  const [items, setItems] = useState([]);
  const [positionList, setPositionList] = useState([]);
  const columns = [
    {
@@ -24,18 +27,17 @@
    },
    {
      title: '所在单位',
      dataIndex: 'department',
      renderFormItem: (_, { type, defaultRender, ...rest }, form) => {
      dataIndex: 'departmentId',
      renderFormItem: () => {
        return (
          <Select
            key="searchSelect"
            allowClear
          <Cascader
            options={items}
            fieldNames={{ value: 'key', label: 'name' }}
            placeholder="请选择"
            filterOption={false}
            options={[{ label: '市级', value: '1' }, { label: '区县', value: '2' }, { label: '街道', value: '3' }, { label: '社区', value: '4' }, { label: '党员', value: '5' }]}
          >
          </Select >
        )
            displayRender={(label) => label[label.length - 1]}
            changeOnSelect={true}
          />
        );
      },
      render: (_, record) => {
        return record.department
@@ -51,7 +53,8 @@
            allowClear
            placeholder="请选择"
            filterOption={false}
            options={[{ label: '市级', value: '1' }, { label: '区县', value: '2' }, { label: '街道', value: '3' }, { label: '社区', value: '4' }, { label: '党员', value: '5' }]}
            fieldNames={{ label: 'name', value: 'id' }}
            options={positionList}
          >
          </Select >
        )
@@ -64,6 +67,10 @@
      title: '诉求应处理时间',
      dataIndex: 'responseTime',
      hideInSearch: true,
      render: (_, record) => {
        return record.responseTime.split('T')[0]
      }
    },
    {
      title: '提示类型',
@@ -90,29 +97,58 @@
      render: (text, record) => {
        return (
          <Space>
            <Access accessible={access['/message_notification/mark_read']}>
              <Button
                type="link"
                onClick={() => {
                  showDelConfirm(async () => {
                    let status = await sendRequest(setStatus, record.id)
                    if (status) {
                      actionRef.current.reload();
                    }
                  }, '确认将所选信息标记为已读吗?');
                }}
              >
                标记已读
              </Button>
            </Access>
            {record.readStatus == 0 && (
              <Access accessible={access['/message_notification/mark_read']}>
                <Button
                  type="link"
                  onClick={() => {
                    showDelConfirm(async () => {
                      let status = await sendRequest(setStatus, record.id)
                      if (status) {
                        actionRef.current.reload();
                      }
                    }, '确认将所选信息标记为已读吗?', '确定', '取消', '操作提示');
                  }}
                >
                  标记已读
                </Button>
              </Access>
            )}
          </Space >
        );
      },
    },
  ]
  useEffect(() => {
    fetchUnit();
    systemPostList({ pageNum: 1, pageSize: 10000 }).then(res => {
      setPositionList(() => res.data.records)
    })
  }, []);
  const fetchUnit = () => {
    getUnitList().then((res) => {
      if (res.code == 200 && res.data) {
        const traverseItems = (items) => {
          return items.map((item) => {
            item.key = item.id;
            item.title = '1';
            if (item.child && item.child.length > 0) {
              item.children = traverseItems(item.child);
            }
            return item;
          });
        };
        setItems(traverseItems(res.data));
      }
    });
  };
  return <div>
    <PageContainer title='消息通知'>
    <PageContainer title='消息通知' header={{
        breadcrumb: {},
      }}>
      <ProTable
        rowKey='id'
        actionRef={actionRef}
@@ -124,7 +160,9 @@
        }}
        search={{ labelWidth: 140 }}
        request={(params) => {
          params.bannerType = Number(params.bannerType)
          if (params.departmentId) {
            params.departmentId = params.departmentId[params.departmentId.length - 1];
          }
          return buildProTableDataSource(getList, params)
        }}
        toolBarRender={false}
management/src/pages/message-notification/service.js
@@ -4,7 +4,7 @@
export const getList = async (data) => {
    return request(`/api/huacheng-sangeshenbian/messageNotification/list`, {
        method: 'GET',
        data
        params:data
    });
}
// 设置已读
@@ -15,6 +15,25 @@
    });
}
// 单位列表
export const getUnitList = async (params) => {
    return request(`/api/huacheng-sangeshenbian/department/list`, {
        method: 'GET',
        params
    });
}
// 获取职位列表数据
export const systemPostList = async (params) => {
    return request(`/api/huacheng-sangeshenbian/systemPost/list`, {
        method: 'GET',params
    });
}
// 详情列表
export const getDetailList = async (data) => {
management/src/pages/setting/career/index.jsx
@@ -38,12 +38,12 @@
            }
            {
              !record.admin &&
              <Access accessible={access['/position_management/del']}>
              <Access accessible={access['/system_setting/position_management/del']}>
                <Button
                  type="link"
                  onClick={() => {
                    showDelConfirm(async () => {
                      let status = await sendRequest(del, record.deptId);
                      let status = await sendRequest(del, record);
                      if (status) {
                        actionRef.current.reload();
                      }
management/src/pages/setting/role/components/addAndEdit.jsx
@@ -46,7 +46,7 @@
    const okHandle = () => {
        form.validateFields().then((values) => {
            setSpinning(true)
            values.menuIds = treeSeletKeys
            values.systemMenuIds = treeSeletKeys
            delete values.tree
            if (data.id) {
                values.id = data.id
management/src/pages/setting/role/index.jsx
@@ -24,7 +24,7 @@
                return (
                    <Space>
                        {
                            record.roleId != 1 &&
                            record.id != 1 &&
                            <Access accessible={access['/system_setting/role_management/edit']}>
                                <Button
                                    type="link"
@@ -38,7 +38,7 @@
                            </Access>
                        }
                        {
                            record.roleId != 1 &&
                            record.id != 1 &&
                            <Access accessible={access['/system_setting/role_management/del']}>
                                <Button
                                    type="link"
@@ -56,7 +56,7 @@
                                </Button>
                            </Access>
                        }
                        <Access accessible={access['/system_setting/role_management/detail'] || false}>
                        <Access accessible={access['/system_setting/role_management/detail']}>
                            <Button
                                type="link"
                                onClick={() => {
@@ -73,7 +73,9 @@
        },
    ]
    return <PageContainer title='角色管理'>
    return <PageContainer title='角色管理' header={{
        breadcrumb: {},
      }}>
        <ProTable
            rowKey='id'
            actionRef={actionRef}
management/src/pages/setting/user/components/addAndEdit.jsx
@@ -1,8 +1,8 @@
import { Form, Input, Modal, Tree, Button, Spin, Row, Col, Select, Radio } from 'antd';
import { Form, Input, Modal, Tree, Button, Spin, Row, Col, Select, Radio, Cascader } from 'antd';
import { forwardRef, useImperativeHandle, useState } from 'react';
import { useEffect } from 'react';
import { getDepartmentList } from '../service';
import { Color } from 'antd/es/color-picker';
import { getDepartmentList, systemPostList, systemRoleList, getSystemUserInfo, getCityList, addSystemUserInfo, editSystemUserInfo } from '../service';
import CryptoJS from 'crypto-js';
const formItemLayout = {
    labelCol: { span: 8 },
    wrapperCol: { span: 16 },
@@ -12,15 +12,15 @@
const AddAndEdit = ({ visible, onSave, onUpdate, onCancel }, ref) => {
    const [form] = Form.useForm();
    const [data, setData] = useState({})
    const [treeData, setTreeData] = useState([]);//权限树
    const [treeSeletKeys, setTreeSeletKeys] = useState([]); //勾选权限
    const [detailType, setDetailType] = useState(false);//是否详情
    const [spinning, setSpinning] = useState(false);
    const [oneCompanyList, setOneCompanyList] = useState([])
    const [twoCompanyList, setTwoCompanyList] = useState([])
    const [threeCompanyList, setThreeCompanyList] = useState([])
    const [fourCompanyList, setFourCompanyList] = useState([])
    const [adminLevel, setAdminLevel] = useState(1)
    //所属职位
    const [positionList, setPositionList] = useState([])
@@ -28,44 +28,96 @@
    const [roleList, setRoleList] = useState([])
    //账号层级
    const [levelList, setLevelList] = useState([{ name: '市级账号', value: 1 }, { name: '区县账号', value: 2 }, { name: '街道账号', value: 3 }, { name: '社区账号', value: 4 }, { name: '党员账号', value: 5 }])
    //选择的层级
    const [activeLevel, setActiveLevel] = useState('')
    //所属区县
    const [countyList, setCountyList] = useState([])
    const [activeCounty, setActiveCounty] = useState({})
    //所属街道
    const [streetList, setStreetList] = useState([])
    const [activeStreet, setActiveStreet] = useState({})
    //所属社区
    const [communityList, setCommunityList] = useState([])
    const [activeCommunity, setActiveCommunity] = useState({})
    useEffect(() => {
        // 获取单位
        getDepartmentList(1).then(res => {
            setOneCompanyList(() => res.data)
        })
        getDepartmentList(2).then(res => {
            setTwoCompanyList(() => res.data)
        })
        getDepartmentList(3).then(res => {
            setThreeCompanyList(() => res.data)
        })
        getDepartmentList(4).then(res => {
            setThreeCompanyList(() => res.data)
        })
    }, [])
    useImperativeHandle(ref, () => {
        return {
            refreshData: (data, type) => {
                setDetailType(type || false)
                if (data.id) {
                    // 获取角色的权限树
                    getTree(data.id).then(res => {
                        setTreeSeletKeys(res.data.systemMenuIds || []);
                    })
            refreshData: (data, companyList) => {
                getCountyList()
                setOneCompanyList(() => companyList)
                console.log('companyList', companyList)
                systemPostList({ pageNum: 1, pageSize: 10000 }).then(res => {
                    setPositionList(() => res.data.records)
                })
                systemRoleList({ pageNum: 1, pageSize: 10000 }).then(res => {
                    setRoleList(() => res.data.records)
                })
                // 权限判断
                let adminInfo = JSON.parse(localStorage.getItem('userInfo'))
                setAdminLevel(() => adminInfo.accountLevel)
                switch (adminInfo.accountLevel) {
                    case 1:
                        setLevelList(() => [{ name: '市级账号', value: 1 }, { name: '区县账号', value: 2 }, { name: '街道账号', value: 3 }, { name: '社区账号', value: 4 }, { name: '党员账号', value: 5 }])
                        break;
                    case 2:
                        getStreetList(adminInfo.districtsCode)
                        setLevelList(() => [{ name: '区县账号', value: 2 }, { name: '街道账号', value: 3 }, { name: '社区账号', value: 4 }, { name: '党员账号', value: 5 }])
                        this.$nextTick(() => {
                            form.setFieldsValue({ districtsCode: adminInfo.districtsCode })
                        })
                        break;
                    case 3:
                        getStreetList(adminInfo.districtsCode)
                        getcommunityList(adminInfo.streetId)
                        setLevelList(() => [{ name: '街道账号', value: 3 }, { name: '社区账号', value: 4 }, { name: '党员账号', value: 5 }])
                        form.setFieldsValue({ districtsCode: adminInfo.districtsCode })
                        form.setFieldsValue({ streetId: adminInfo.streetId })
                        break;
                    case 4:
                        getStreetList(adminInfo.districtsCode)
                        getcommunityList(adminInfo.streetId)
                        setLevelList(() => [{ name: '社区账号', value: 4 }, { name: '党员账号', value: 5 }])
                        // this.$nextTick(() => {
                        form.setFieldsValue({ districtsCode: adminInfo.districtsCode })
                        form.setFieldsValue({ streetId: adminInfo.streetId })
                        form.setFieldsValue({ communityId: adminInfo.communityId * 1 })
                        // })
                        break;
                    case 5:
                        getStreetList(adminInfo.districtsCode)
                        getcommunityList(adminInfo.streetId)
                        setLevelList(() => [{ name: '党员账号', value: 5 }])
                        form.setFieldsValue({ districtsCode: adminInfo.districtsCode })
                        form.setFieldsValue({ streetId: adminInfo.streetId })
                        form.setFieldsValue({ communityId: adminInfo.communityId * 1 })
                        break;
                    default:
                        break;
                }
                setData(data)
                form.setFieldsValue(data);
                if (data.id) {
                    getInfo(data.id)
                }
                setData(() => data)
                if (data.unitId) {
                    let result = []
                    findParent(companyList, data.unitId * 1, result)
                    form.setFieldsValue({ DepartmentId: result })
                }
            },
            clean: () => {
                setSpinning(false)
@@ -76,9 +128,13 @@
    // 保存
    const okHandle = () => {
        form.validateFields().then((values) => {
            setSpinning(true)
            values.menuIds = treeSeletKeys
            delete values.tree
            values.password = CryptoJS.MD5(values.password).toString();
            if (values.DepartmentId) {
                values.oneDepartmentId = values.DepartmentId.length > 0 ? values.DepartmentId[0] : null
                values.twoDepartmentId = values.DepartmentId.length > 1 ? values.DepartmentId[1] : null
                values.threeDepartmentId = values.DepartmentId.length > 2 ? values.DepartmentId[2] : null
                values.fourDepartmentId = values.DepartmentId.length > 3 ? values.DepartmentId[3] : null
            }
            if (data.id) {
                values.id = data.id
                onUpdate(values)
@@ -87,22 +143,107 @@
            }
        });
    };
    const getCountyList = (id) => {
        getCityList({ id: '510400', tier: 2 }).then(res => {
            setCountyList(() => res.data)
        })
    }
    const getStreetList = (id) => {
        getCityList({ id: id, tier: 3 }).then(res => {
            setStreetList(() => res.data)
        })
    }
    const getcommunityList = (id) => {
        getCityList({ id: id, tier: 4 }).then(res => {
            setCommunityList(() => res.data)
        })
    }
    const changeCountry = (value, label) => {
        setActiveCounty(label)
        getStreetList(value)
        form.setFieldsValue({ streetId: '', communityId: '' })
        setActiveCommunity({ name: '', id: '' })
        setActiveStreet({ name: '', id: '' })
    }
    const changeStreet = (value, label) => {
        setActiveStreet(label)
        getcommunityList(value)
        form.setFieldsValue({ communityId: '' })
        setActiveCommunity({ name: '', id: '' })
    }
    const changeCommunity = (value, label) => {
        setActiveCommunity(label)
    }
    const getInfo = (id) => {
        getSystemUserInfo(id).then(res => {
            if (res.data.districtsCode) {
                setActiveStreet({ name: res.data.districts, id: res.data.districtsCode })
                getStreetList(res.data.districtsCode)
            }
            if (res.data.streetId) {
                setActiveCounty({ name: res.data.street, id: res.data.streetId })
                getcommunityList(res.data.streetId)
            }
            if (res.data.communityId) {
                setActiveCommunity({ name: res.data.community, id: res.data.communityId })
            }
            // delete res.data.password
            let departmentId = []
            if (res.data.oneDepartmentId) {
                departmentId.push(res.data.oneDepartmentId)
            }
            if (res.data.twoDepartmentId) {
                departmentId.push(res.data.twoDepartmentId)
            }
            if (res.data.threeDepartmentId) {
                departmentId.push(res.data.threeDepartmentId)
            }
            if (res.data.fourDepartmentId) {
                departmentId.push(res.data.fourDepartmentId)
            }
            res.data.DepartmentId = departmentId
            console.log('departmentId', departmentId)
            setActiveLevel(() => res.data.accountLevel)
            form.setFieldsValue({ ...res.data, password: '' })
        })
    }
    const findParent = (data, target, result) => {
        for (let item of data) {
            if (item.id === target) {
                //将查找到的目标数据加入结果数组中
                //可根据需求unshift(item.id)或unshift(item)
                result.unshift(item.id)
                return true
            }
            if (item.children && item.children.length > 0) {
                //根据查找到的结果往上找父级节点
                let isFind = findParent(item.children, target, result)
                if (isFind) {
                    result.unshift(item.id)
                    return true
                }
            }
        }
        //走到这说明没找到目标
        return false
    }
    return (
        <Modal
            getContainer={false}
            width="65%"
            destroyOnClose
            title={detailType ? '人员详情' : data.id ? '编辑人员' : '添加人员'}
            title={data.type == 'detail' ? '人员详情' : data.type == 'edit' ? '编辑人员' : '添加人员'}
            open={visible}
            onCancel={() => onCancel(false)}
            afterClose={() => {
                form.resetFields()
                setTreeSeletKeys([])
            }}
            footer={
                !detailType ?
                (data.type == 'edit' || data.type == 'add') ?
                    [
                        <Button key="back" onClick={() => onCancel(false)}>取消</Button>,
                        <Button key="submit" type="primary" onClick={okHandle}>
@@ -121,29 +262,39 @@
                            label="姓名"
                            rules={[{ required: true, message: '请输入人员姓名' }]}
                        >
                            <Input disabled={detailType} placeholder='请输入人员姓名' />
                            <Input disabled={data.type == 'detail'} placeholder='请输入人员姓名' />
                        </Form.Item>
                    </Col>
                </Row>
                <Row>
                    <Col span={8}>
                    <Col span={16}>
                        <Form.Item
                            name="oneDepartmentId"
                            label="所属一级单位"
                            rules={[{ required: true, message: '请选择所属一级单位' }]}
                            name="DepartmentId"
                            label="所属单位"
                            labelCol={{ span: 4 }}
                            rules={[{ required: true, message: '请选择所属单位' }]}
                        >
                            <Select
                            {/* <Select
                                key="searchSelect"
                                allowClear
                                disabled={data.type == 'detail'}
                                placeholder="请选择"
                                options={oneCompanyList}
                                fieldNames={{ label: 'name', value: 'id' }}
                                filterOption={false}
                            >
                            </Select >
                            </Select > */}
                            <Cascader
                                changeSelect
                                options={oneCompanyList}
                                fieldNames={{ value: 'key', label: 'name' }}
                                placeholder="请选择"
                                // displayRender={(label) => label[label.length - 1]}
                                changeOnSelect={true}
                            />
                        </Form.Item>
                    </Col>
                    <Col span={8}>
                    {/* <Col span={8}>
                        <Form.Item
                            name="twoDepartmentId"
                            label="所属二级单位"
@@ -151,6 +302,7 @@
                            <Select
                                key="searchSelect"
                                allowClear
                                disabled={data.type == 'detail'}
                                placeholder="请选择"
                                options={twoCompanyList}
                                fieldNames={{ label: 'name', value: 'id' }}
@@ -167,6 +319,7 @@
                            <Select
                                key="searchSelect"
                                allowClear
                                disabled={data.type == 'detail'}
                                placeholder="请选择"
                                options={threeCompanyList}
                                fieldNames={{ label: 'name', value: 'id' }}
@@ -174,9 +327,9 @@
                            >
                            </Select >
                        </Form.Item>
                    </Col>
                    </Col> */}
                </Row>
                <Row>
                {/* <Row>
                    <Col span={8}>
                        <Form.Item
                            name="fourDepartmentId"
@@ -185,6 +338,7 @@
                            <Select
                                key="searchSelect"
                                allowClear
                                disabled={data.type == 'detail'}
                                placeholder="请选择"
                                options={fourCompanyList}
                                fieldNames={{ label: 'name', value: 'id' }}
@@ -193,7 +347,7 @@
                            </Select >
                        </Form.Item>
                    </Col>
                </Row>
                </Row> */}
                <Row>
                    <Col span={8}>
                        <Form.Item
@@ -204,6 +358,7 @@
                            <Select
                                key="searchSelect"
                                allowClear
                                disabled={data.type == 'detail'}
                                placeholder="请选择"
                                options={positionList}
                                fieldNames={{ label: 'name', value: 'id' }}
@@ -221,6 +376,7 @@
                            <Select
                                key="searchSelect"
                                allowClear
                                disabled={data.type == 'detail'}
                                placeholder="请选择"
                                options={roleList}
                                fieldNames={{ label: 'name', value: 'id' }}
@@ -240,6 +396,8 @@
                            <Select
                                key="searchSelect"
                                allowClear
                                onChange={(e) => setActiveLevel(e)}
                                disabled={data.type == 'detail'}
                                placeholder="请选择"
                                options={levelList}
                                fieldNames={{ label: 'name', value: 'value' }}
@@ -261,6 +419,7 @@
                                    rules={[{ required: true, message: '是否管理员' }]}
                                >
                                    <Radio.Group
                                        disabled={data.type == 'detail'}
                                        // style={style}
                                        // onChange={onChange}
                                        // value={value}
@@ -274,63 +433,89 @@
                        </Form.Item>
                    </Col>
                </Row>
                <Row>
                    <Col span={8}>
                        <Form.Item
                            name="districts"
                            label="所属区县"
                            rules={[{ required: true, message: '请选择所属区县' }]}
                        >
                            <Select
                                key="searchSelect"
                                allowClear
                {activeLevel != 1 && (
                    <Row>
                        {[2, 3, 4, 5].includes(activeLevel) && (
                            <Col span={8}>
                                <Form.Item
                                    name="districtsCode"
                                    label="所属区县"
                                    rules={[{ required: true, message: '请选择所属区县' }]}
                                >
                                    {/* <Select
                                // onChange={changeCountry}
                                // value={activeCounty}
                                placeholder="请选择"
                                options={oneCompanyList}
                                options={levelList}
                                fieldNames={{ label: 'name', value: 'id' }}
                                filterOption={false}
                            >
                            </Select >
                        </Form.Item>
                    </Col>
                    <Col span={8}>
                        <Form.Item
                            name="street"
                            label="所属街道"
                            rules={[{ required: true, message: '请选择所属街道' }]}
                        >
                            <Select
                                key="searchSelect"
                                allowClear
                                placeholder="请选择"
                                options={twoCompanyList}
                                fieldNames={{ label: 'name', value: 'id' }}
                                filterOption={false}
                            >
                            </Select >
                        </Form.Item>
                    </Col>
                    <Col span={8}>
                        <Form.Item
                            name="community"
                            label="所属社区"
                            rules={[{ required: true, message: '请选择所属社区' }]}
                        >
                            <Select
                                key="searchSelect"
                                allowClear
                                placeholder="请选择"
                                options={threeCompanyList}
                                fieldNames={{ label: 'name', value: 'id' }}
                                filterOption={false}
                            >
                            </Select >
                        </Form.Item>
                    </Col>
                </Row>
                            </Select > */}
                                    <Select
                                        key="searchSelect"
                                        allowClear
                                        disabled={data.type == 'detail' || [2, 3, 4, 5].includes(adminLevel)}
                                        onChange={changeCountry}
                                        value={activeCounty.id}
                                        placeholder="请选择"
                                        options={countyList}
                                        fieldNames={{ label: 'name', value: 'id' }}
                                    // filterOption={false}
                                    >
                                    </Select >
                                </Form.Item>
                            </Col>
                        )}
                        {[3, 4, 5].includes(activeLevel) && (
                            <Col span={8}>
                                <Form.Item
                                    name="streetId"
                                    label="所属街道"
                                    rules={[{ required: true, message: '请选择所属街道' }]}
                                >
                                    <Select
                                        onChange={changeStreet}
                                        disabled={!activeCounty || data.type == 'detail' || [3, 4, 5].includes(adminLevel)}
                                        key="searchSelect"
                                        allowClear
                                        value={activeStreet.id}
                                        placeholder="请选择"
                                        options={streetList}
                                        fieldNames={{ label: 'name', value: 'id' }}
                                    >
                                    </Select >
                                </Form.Item>
                            </Col>
                        )}
                        {[4, 5].includes(activeLevel) && (
                            <Col span={8}>
                                <Form.Item
                                    name="communityId"
                                    label="所属社区"
                                    rules={[{ required: true, message: '请选择所属社区' }]}
                                >
                                    <Select
                                        onChange={changeCommunity}
                                        disabled={!activeStreet || data.type == 'detail' || [4, 5].includes(adminLevel)}
                                        key="searchSelect"
                                        allowClear
                                        value={activeCommunity.id}
                                        placeholder="请选择"
                                        options={communityList}
                                        fieldNames={{ label: 'name', value: 'id' }}
                                    >
                                    </Select >
                                </Form.Item>
                            </Col>
                        )}
                    </Row>
                )}
                <Row>
                    <Col span={16}>
                        <Form.Item
                            label="联系方式"
                            required
                            labelCol={{ span: 4 }}
                            wrapperCol={{ span: 20 }}
                            style={{ marginBottom: 0 }}
@@ -338,6 +523,7 @@
                            <div style={{ display: "flex", flex: 1 }}>
                                <Form.Item
                                    name="phone"
                                    rules={[{
                                        validator: (rule, value) => {
                                            return new Promise((resolve, reject) => {
@@ -353,7 +539,7 @@
                                        },
                                    }]}
                                >
                                    <Input disabled={detailType} placeholder='请输入联系方式' />
                                    <Input disabled={data.type == 'detail'} placeholder='请输入联系方式' />
                                </Form.Item>
                                <div style={{ fontSize: '12px', color: "rgba(0,0,0,0.5)", marginLeft: "10px" }}>联系方式将作为登录账号使用</div>
                            </div>
@@ -363,17 +549,17 @@
                <Row>
                    <Col span={8}>
                        <Form.Item
                            required
                            required={data.type == 'add'}
                            name="password"
                            label="登录密码"
                            rules={[{
                                validator: (rule, value) => {
                                    return new Promise((resolve, reject) => {
                                        if (!value) {
                                        if (!value && data.type == 'add') {
                                            reject('请输入新密码');
                                        }
                                        const passwordRegex = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$/;
                                        if (!passwordRegex.test(value)) {
                                        if (!passwordRegex.test(value) && data.type == 'add') {
                                            reject('密码需要包含大小写字母,数字和特殊符号,且长度为8位以上');
                                        }
                                        resolve('');
@@ -381,13 +567,13 @@
                                },
                            }]}
                        >
                            <Input.Password disabled={detailType} placeholder='请输入' />
                            <Input.Password disabled={data.type == 'detail'} placeholder='请输入' />
                        </Form.Item>
                    </Col>
                    <Col span={16}>
                        <Form.Item
                            label="确认密码"
                            required
                            required={data.type == 'add'}
                            labelCol={{ span: 4 }}
                            wrapperCol={{ span: 20 }}
                            style={{ marginBottom: 0 }}
@@ -398,10 +584,10 @@
                                    rules={[{
                                        validator: (rule, value) => {
                                            return new Promise((resolve, reject) => {
                                                if (!value) {
                                                if (!value && data.type == 'add') {
                                                    reject('请再次输入新密码');
                                                }
                                                if (value != form.getFieldValue('password')) {
                                                if (value != form.getFieldValue('password') && data.type == 'add') {
                                                    reject('两次密码请保持一致');
                                                }
                                                resolve('');
@@ -409,7 +595,7 @@
                                        },
                                    },]}
                                >
                                    <Input.Password disabled={detailType} placeholder='请输入' />
                                    <Input.Password disabled={data.type == 'detail'} placeholder='请输入' />
                                </Form.Item>
                                <div style={{ fontSize: '12px', color: "rgba(0,0,0,0.5)", marginLeft: "10px" }}>密码需要包含大小写字母,数字和特殊符号,且长度为8位以上</div>
                            </div>
management/src/pages/setting/user/components/addUnit.jsx
New file
@@ -0,0 +1,80 @@
import { Button, Form, Input, Modal } from 'antd';
import { forwardRef, useImperativeHandle, useState } from 'react';
const formItemLayout = {
  labelCol: { span: 7 },
  wrapperCol: { span: 12 },
};
const AddEditView = ({ visible, onSave, onUpdate, onCancel }, ref) => {
  const [form] = Form.useForm();
  const [editData, setEditData] = useState({});
  const [rolesList, setRolesList] = useState();
  /**
   * 确定按钮事件
   */
  const okHandle = () => {
    form.validateFields().then((values) => {
      if (editData.id && editData.type === 'edit') {
        values.id = editData.id;
        if (editData.pid) {
          values.pid = editData.pid;
        }
        onUpdate(values);
      } else {
        if (editData.type === 'add') {
          values.pid = editData.id;
        }
        onSave(values);
      }
    });
  };
  useImperativeHandle(ref, () => {
    return {
      refreshData: (data) => {
        form.resetFields();
        if (data.id && data.type === 'edit') {
          form.setFieldsValue(data);
        }
        setEditData(data);
      },
      clean: () => {
        form.resetFields();
      },
    };
  });
  return (
    <Modal
      getContainer={false}
      width="25%"
      destroyOnClose
      title={editData.type === 'edit' ? '编辑单位' : '添加单位'}
      open={visible}
      onCancel={() => onCancel(false)}
      footer={[
        <Button key="back" onClick={() => onCancel(false)}>
          关闭
        </Button>,
        <Button key="submit" type="primary" onClick={okHandle}>
          确认
        </Button>,
      ]}
    >
      <Form layout="horizontal" {...formItemLayout} form={form} initialValues={{ isAuctioneer: 1 }}>
        <Form.Item
          name="name"
          required
          label="单位名称"
          rules={[{ required: true, message: '请输入单位名称' }]}
        >
          <Input placeholder="请输入单位名称" />
        </Form.Item>
      </Form>
    </Modal>
  );
};
export default forwardRef(AddEditView);
management/src/pages/setting/user/index.jsx
@@ -1,81 +1,259 @@
import { buildProTableDataSource, sendRequest, showDelConfirm } from '@/utils/antdUtils';
import { buildProTableDataSource, sendRequest, showDelConfirm, showConfirm } from '@/utils/antdUtils';
import { DeleteOutlined, EditOutlined, PlusOutlined } from '@ant-design/icons';
import { PageContainer, ProFormText, ProTable, QueryFilter } from '@ant-design/pro-components';
import { Button, Col, Menu, Row, Space } from 'antd';
import { Button, Cascader, Col, Menu, Row, Select, Space } from 'antd';
import { useEffect, useRef, useState } from 'react';
import { Access, useAccess } from 'umi';
import AddAndEdit from './components/addAndEdit';
import { add, del, edit, getList, getUnitList } from './service';
import AddUnit from './components/addUnit';
import {
  addSystemUserInfo,
  addUnit,
  del,
  delUnit,
  editSystemUserInfo,
  editUnit,
  getList,
  getUnitList,
  systemRoleList,
  unfreezeApi,
  freezeApi,
} from './service';
const Role = () => {
  const actionRef = useRef();
  const addViewRef = useRef();
  const [modalVisible, handleModalVisibles] = useState(true);
  const addViewRef1 = useRef();
  const [modalVisible, handleModalVisibles] = useState(false);
  const [modalVisible1, handleModalVisibles1] = useState(false);
  const [roleList, setRoleList] = useState([]);
  const [unitId, setUnitId] = useState('');
  const access = useAccess();
  const [items, setItems] = useState([]);
  const { SubMenu } = Menu;
  useEffect(() => {
    getUnitList().then((res) => {
      console.log(res);
    fetchUnit();
    systemRoleList({ pageNum: 1, pageSize: 10000 }).then((res) => {
      setRoleList(() => res.data.records);
    });
  }, []);
  const items = [
    {
      key: '1',
      icon: (
        <div
          style={{
            display: 'flex',
            alignItems: 'center',
            justifyContent: 'space-between',
            width: '100%',
          }}
        >
          <span>组织部</span>
          <div>
            <PlusOutlined
              onClick={(e) => {
                e.stopPropagation();
                console.log(e);
              }}
            />
  const node = (item) => {
    return (
      <div
        style={{
          display: 'flex',
          alignItems: 'center',
          justifyContent: 'space-between',
          width: '100%',
        }}
      >
        <span>{item.name}</span>
        <div>
          {item.tier < 4 && (
            <Access accessible={access['/system_setting/unit_management/add']}>
              <PlusOutlined
                onClick={(e) => {
                  e.stopPropagation();
                  addViewRef1.current.refreshData({ ...item, type: 'add' });
                  handleModalVisibles1(true);
                }}
              />
            </Access>
          )}
          <Access accessible={access['/system_setting/unit_management/edit']}>
            <EditOutlined
              onClick={(e) => {
                e.stopPropagation();
                console.log(e);
                addViewRef1.current.refreshData({ ...item, type: 'edit' });
                handleModalVisibles1(true);
              }}
            />
          </Access>
          <Access accessible={access['/system_setting/unit_management/del']}>
            <DeleteOutlined
              onClick={(e) => {
                e.stopPropagation();
                console.log(e);
                showDelConfirm(async () => {
                  let status = await sendRequest(delUnit, item.id);
                  if (status) {
                    fetchUnit();
                  }
                }, '确认删除该单位吗?');
              }}
            />
          </div>
          </Access>
        </div>
      ),
      children: [
        {
          key: '11',
          label: 'Option 1',
        },
        {
          key: '12',
          label: 'Option 2',
        },
        {
          key: '13',
          label: 'Option 3',
        },
        {
          key: '14',
          label: 'Option 4',
        },
      ],
    },
  ];
      </div >
    );
  };
  const renderMenuItems = (items) => {
    return items.map((item) => {
      if (item.children && item.children.length > 0) {
        return (
          <SubMenu
            key={item.key}
            title={node(item)}
            onTitleClick={(item) => {
              setUnitId(item.key);
              actionRef.current.reload();
            }}
          >
            {renderMenuItems(item.children)}
          </SubMenu>
        );
      }
      return (
        <Menu.Item
          onClick={(item) => {
            setUnitId(item.key);
            actionRef.current.reload();
          }}
          key={item.key}
        >
          {node(item)}
        </Menu.Item>
      );
    });
  };
  const fetchUnit = (params) => {
    getUnitList(params).then((res) => {
      if (res.code == 200 && res.data) {
        const traverseItems = (items) => {
          return items.map((item) => {
            item.key = item.id;
            item.title = '1';
            if (item.child && item.child.length > 0) {
              item.children = traverseItems(item.child);
            }
            return item;
          });
        };
        setItems(traverseItems(res.data));
      }
    });
  };
  const columns = [
    {
      title: '角色名称',
      title: '姓名',
      dataIndex: 'name',
    },
    {
      title: '联系方式',
      dataIndex: 'phone',
    },
    {
      title: '所在单位',
      dataIndex: 'departmentName',
      hideInSearch: true,
      renderFormItem: () => {
        return (
          <Cascader
            options={items}
            fieldNames={{ value: 'key', label: 'name' }}
            placeholder="请选择"
            displayRender={(label) => label[label.length - 1]}
            changeOnSelect={true}
          />
        );
      },
    },
    {
      hideInTable: true,
      title: '所在单位',
      dataIndex: 'departmentId',
      renderFormItem: () => {
        return (
          <Cascader
            options={items}
            fieldNames={{ value: 'key', label: 'name' }}
            placeholder="请选择"
            displayRender={(label) => label[label.length - 1]}
            changeOnSelect={true}
          />
        );
      },
    },
    {
      title: '所属职位',
      dataIndex: 'systemPostName',
      hideInSearch: true,
    },
    {
      title: '所属角色',
      dataIndex: 'systemRoleName',
      hideInSearch: true,
    },
    {
      title: '所属角色',
      dataIndex: 'systemRoleId',
      hideInTable: true,
      renderFormItem: () => {
        return (
          <Select
            key="searchSelect"
            allowClear
            placeholder="请选择"
            options={roleList}
            fieldNames={{ label: 'name', value: 'id' }}
            filterOption={false}
          ></Select>
        );
      },
    },
    {
      title: '账号层级',
      dataIndex: 'accountLevel',
      // (1=市级账号,2=区县账号,3=街道账号,4=社区账号)
      render: (text, record) => {
        let role = '';
        switch (record.accountLevel) {
          case 1:
            role = '市';
            break;
          case 2:
            role = '区县';
            break;
          case 3:
            role = '街道';
            break;
          case 4:
            role = '社区';
            break;
          case 5:
            role = '党员';
            break;
          default:
            role = '';
        }
        return role;
      },
      valueEnum: {
        1: '市',
        2: '区县',
        3: '街道',
        4: '社区',
        5: '党员',
      },
    },
    {
      title: '状态',
      dataIndex: 'status',
      // (1=使用中,2=已冻结)
      hideInSearch: true,
      render: (text, record) => {
        let status = '';
        switch (record.status) {
          case 1:
            status = '使用中';
            break;
          case 2:
            status = '已冻结';
            break;
          default:
            status = '';
        }
        return status;
      },
    },
    {
      title: '操作',
@@ -84,22 +262,20 @@
        return (
          <Space>
            {record.roleId != 1 && (
              <Access accessible={access['/system_setting/role_management/edit']}>
                <Button
                  type="link"
              <Access accessible={access['/system_setting/people_management/edit']}>
                <a
                  onClick={() => {
                    addViewRef.current.refreshData(record);
                    addViewRef.current.refreshData({ ...record, type: 'edit' },items);
                    handleModalVisibles(true);
                  }}
                >
                  编辑
                </Button>
                </a>
              </Access>
            )}
            {record.roleId != 1 && (
              <Access accessible={access['/system_setting/role_management/del']}>
                <Button
                  type="link"
              <Access accessible={access['/system_setting/people_management/del']}>
                <a
                  onClick={() => {
                    showDelConfirm(async () => {
                      let status = await sendRequest(del, record.id);
@@ -110,19 +286,35 @@
                  }}
                >
                  删除
                </Button>
                </a>
              </Access>
            )}
            <Access accessible={access['/system_setting/role_management/detail'] || false}>
              <Button
                type="link"
            <Access accessible={access['/system_setting/people_management/detail']}>
              <a
                onClick={() => {
                  addViewRef.current.refreshData(record, true);
                  addViewRef.current.refreshData({ ...record, type: 'detail' },items);
                  handleModalVisibles(true);
                }}
              >
                查看详情
              </Button>
              </a>
            </Access>
            <Access accessible={access['/system_setting/people_management/freeze']}>
              <a
                onClick={() => {
                  showConfirm(`确认${record.status === 1 ? '冻结' : '解冻'}该人员吗?`,'', async () => {
                    let status = await sendRequest(
                      record.status === 1 ? freezeApi : unfreezeApi,
                      record.id,
                    );
                    if (status) {
                      actionRef.current.reload();
                    }
                  });
                }}
              >
                {record.status === 1 ? '冻结' : '解冻'}
              </a>
            </Access>
          </Space>
        );
@@ -134,24 +326,41 @@
    <PageContainer
      header={{
        breadcrumb: {},
        title: '人员管理',
      }}
    >
      <div style={{ background: '#fff' }}>
        <QueryFilter>
        <QueryFilter
          onReset={(values) => {
            fetchUnit(values);
            setUnitId('');
            actionRef.current.reload();
          }}
          onFinish={(values) => {
            fetchUnit(values);
            setUnitId('');
            actionRef.current.reload();
          }}
        >
          <ProFormText name="name" label="单位名称" />
        </QueryFilter>
      </div>
      <Row style={{ marginTop: 20, background: '#fff' }}>
        <Col span={4}>
          <Menu
            mode="inline"
            defaultSelectedKeys={['231']}
            style={{
              //   width: 256,
              height: '100%',
            }}
            items={items}
          />
          <Space style={{ margin: '10px 0' }}>
            <span style={{ margin: '0 27px' }}>单位管理</span>
            <Button
              type="primary"
              onClick={() => {
                addViewRef1.current.refreshData({});
                handleModalVisibles1(true);
              }}
            >
              添加
            </Button>
          </Space>
          <Menu mode="inline">{renderMenuItems(items)}</Menu>
        </Col>
        <Col span={20} style={{ minHeight: 650 }}>
          <ProTable
@@ -163,14 +372,28 @@
              showQuickJumper: true,
              defaultPageSize: 10,
            }}
            // request={(params) => buildProTableDataSource(getList, params)}
            search={{
              labelWidth: 'auto',
              span: 6,
              defaultCollapsed: false, // 默认是否收起
            }}
            request={(params) => {
              let obj = { ...params };
              if (unitId) {
                obj.departmentId = unitId;
              }
              if (params.departmentId) {
                obj.departmentId = params.departmentId[params.departmentId.length - 1];
              }
              return buildProTableDataSource(getList, obj);
            }}
            toolBarRender={(action, selectRows) => [
              <Access accessible={access['/system_setting/role_management/add']}>
              <Access accessible={access['/system_setting/people_management/add']}>
                <Space>
                  <Button
                    type="primary"
                    onClick={() => {
                      addViewRef.current.refreshData({});
                      addViewRef.current.refreshData({ type: 'add', unitId : unitId  },items);
                      handleModalVisibles(true);
                    }}
                  >
@@ -187,7 +410,7 @@
        ref={addViewRef}
        visible={modalVisible}
        onSave={async (fileds) => {
          let success = await sendRequest(add, fileds);
          let success = await sendRequest(addSystemUserInfo, fileds);
          if (success) {
            handleModalVisibles(false);
            actionRef.current.reload();
@@ -195,7 +418,7 @@
          addViewRef.current.clean();
        }}
        onUpdate={async (fileds) => {
          let success = await sendRequest(edit, fileds);
          let success = await sendRequest(editSystemUserInfo, fileds);
          if (success) {
            handleModalVisibles(false);
            actionRef.current.reload();
@@ -204,6 +427,25 @@
        }}
        onCancel={() => handleModalVisibles(false)}
      />
      <AddUnit
        ref={addViewRef1}
        visible={modalVisible1}
        onSave={async (fileds) => {
          let success = await sendRequest(addUnit, fileds);
          if (success) {
            handleModalVisibles1(false);
            fetchUnit();
          }
        }}
        onUpdate={async (fileds) => {
          let success = await sendRequest(editUnit, fileds);
          if (success) {
            handleModalVisibles1(false);
            fetchUnit();
          }
        }}
        onCancel={() => handleModalVisibles1(false)}
      />
    </PageContainer>
  );
};
management/src/pages/setting/user/service.js
@@ -2,7 +2,7 @@
// 列表
export const getList = async (params) => {
    return request(`/api/huacheng-sangeshenbian/systemRole/list`, {
    return request(`/api/huacheng-sangeshenbian/systemUser/list`, {
        method: 'GET',
        params
    });
@@ -39,6 +39,22 @@
    });
}
// 新增单位
export const addUnit = async (data) => {
    return request('/api/huacheng-sangeshenbian/department/add', {
        method: 'POST',
        data,
    });
}
// 编辑单位
export const editUnit = async (data) => {
    return request('/api/huacheng-sangeshenbian/department/edit', {
        method: 'POST',
        data,
    });
}
// 编辑
export const edit = async (data) => {
    return request('/api/huacheng-sangeshenbian/systemRole/edit', {
@@ -49,7 +65,14 @@
// 删除 
export const del = async (id) => {
    return request(`/api/huacheng-sangeshenbian/systemRole/delete/${id}`, {
    return request(`/api/huacheng-sangeshenbian/systemUser/delete/${id}`, {
        method: 'DELETE',
    });
}
// 删除单位
export const delUnit = async (id) => {
    return request(`/api/huacheng-sangeshenbian/department/delete/${id}`, {
        method: 'DELETE',
    });
}
@@ -61,15 +84,54 @@
    });
}
// 获取职位列表数据
export const systemPostList = async (tier) => {
export const systemPostList = async (params) => {
    return request(`/api/huacheng-sangeshenbian/systemPost/list`, {
        method: 'GET',
        method: 'GET',params
    });
}
// 获取角色列表数据
export const systemRoleList = async (tier) => {
export const systemRoleList = async (params) => {
    return request(`/api/huacheng-sangeshenbian/systemRole/list`, {
        method: 'GET',params
    });
}
// 获取人员详情数据
export const getSystemUserInfo = async (id) => {
    return request(`/api/huacheng-sangeshenbian/systemUser/getSystemUserInfo/${id}`, {
        method: 'GET',
    });
}// 添加人员数据
export const addSystemUserInfo = async (data) => {
    return request(`/api/huacheng-sangeshenbian/systemUser/add`, {
        method: 'POST',
        data
    });
}
// 编辑人员数据
export const editSystemUserInfo = async (data) => {
    return request(`/api/huacheng-sangeshenbian/systemUser/edit`, {
        method: 'POST',
        data
    });
}
// 获取省市区
export const getCityList = async (data) => {
    return request(`/api/huacheng-sangeshenbian/systemUser/getAdministrativeDivision/${data.id}/${data.tier}`, {
        method: 'GET',
    });
}
// 冻结
export const freezeApi = async (id) => {
    return request(`/api/huacheng-sangeshenbian/systemUser/freeze/${id}`, {
        method: 'PUT',
    });
}
// 解冻
export const unfreezeApi = async (id) => {
    return request(`/api/huacheng-sangeshenbian/systemUser/unfreeze/${id}`, {
        method: 'PUT',
    });
}
management/src/pages/work-order-setting/index.jsx
@@ -29,12 +29,12 @@
    const save = () => {
        form.validateFields().then(async (values) => {
                values.id = 1
                sendRequest(addSetting, values).then(res => {
                    if (res.code === 200) {
                    }
                })
            values.id = 1
            sendRequest(addSetting, values).then(res => {
                if (res.code === 200) {
                }
            })
        });
    };
@@ -50,6 +50,51 @@
            >
                <Card>
                    <Form scrollToFirstError form={form}>
                        <Card>
                            <div style={{ marginBottom: 20 }}><span style={{ fontSize: '14px', fontWeight: 600 }}>*诉求处理时间:
                            </span><span style={{ marginLeft: 8, color: '#a5a5a5' }}>超过时间未处理诉求,系统自动对该事件承办者发送短信提醒,并知会至上一级管理层进行督办。
                                </span></div>
                            <Form.Item label="添加后处理时间" name="demandProcessingTime" rules={
                                [{ required: true, message: '请输入添加后处理时间' }]
                            }>
                                <InputNumber precision={0} min={0} addonAfter="天内" controls={false}></InputNumber>
                            </Form.Item>
                        </Card>
                        <Card>
                            <div><span style={{ fontSize: '14px', fontWeight: 600 }}>*时限临期提醒配置:
                            </span><span style={{ marginLeft: 8, color: '#a5a5a5' }}>当事件处理时限即将到达时,系统将自动通过微信消息以及短信的方式提醒单位管理员。
                                </span></div>
                            <Space style={{ marginTop: 20, display: 'flex', flexWrap: 'wrap' }}>
                                <Form.Item label="市级账号" name="cityDeadlineReminder" rules={
                                    [{ required: true, message: '请输入市级账号' }]
                                }>
                                    <InputNumber precision={0} max={form.getFieldValue('demandProcessingTime')} min={0} addonAfter="天前" controls={false}></InputNumber>
                                </Form.Item>
                                <Form.Item label="区县账号" name="districtDeadlineReminder" rules={
                                    [{ required: true, message: '请输入区县账号' }]
                                }>
                                    <InputNumber precision={0} max={form.getFieldValue('demandProcessingTime')} min={0} addonAfter="天前" controls={false}></InputNumber>
                                </Form.Item>
                                <Form.Item label="街道账号" name="streetDeadlineReminder" rules={
                                    [{ required: true, message: '请输入街道账号' }]
                                }>
                                    <InputNumber precision={0} max={form.getFieldValue('demandProcessingTime')} min={0} addonAfter="天前" controls={false}></InputNumber>
                                </Form.Item>
                                <Form.Item label="社区账号" name="communityDeadlineReminder" rules={
                                    [{ required: true, message: '请输入社区账号' }]
                                }>
                                    <InputNumber precision={0} max={form.getFieldValue('demandProcessingTime')} min={0} addonAfter="天前" controls={false}></InputNumber>
                                </Form.Item>
                                <Form.Item label="党员账号" name="partyMemberDeadlineReminder" rules={
                                    [{ required: true, message: '请输入党员账号' }]
                                }>
                                    <InputNumber precision={0} max={form.getFieldValue('demandProcessingTime')} min={0} addonAfter="天前" controls={false}></InputNumber>
                                </Form.Item>
                            </Space>
                        </Card>
                        <Card>
                            <div><span style={{ fontSize: '14px', fontWeight: 600 }}>*诉求处理时间配置:
                            </span><span style={{ marginLeft: 8, color: '#a5a5a5' }}>超过时间未处理诉求,系统自动对该事件承办者发送短信提醒,并知会至上一级管理层进行督办。
@@ -84,54 +129,11 @@
                                </Form.Item>
                            </Space>
                        </Card>
                        <Card>
                            <div><span style={{ fontSize: '14px', fontWeight: 600 }}>*时限临期提醒配置:
                            </span><span style={{ marginLeft: 8, color: '#a5a5a5' }}>超过时间未处理诉求,系统自动对该事件承办者发送短信提醒,并知会至上一级管理层进行督办。
                                </span></div>
                            <Space style={{ marginTop: 20, display: 'flex', flexWrap: 'wrap' }}>
                                <Form.Item label="市级账号" name="cityDeadlineReminder" rules={
                                    [{ required: true, message: '请输入市级账号' }]
                                }>
                                    <InputNumber precision={0} min={0} addonAfter="天内" controls={false}></InputNumber>
                                </Form.Item>
                                <Form.Item label="区县账号" name="districtDeadlineReminder" rules={
                                    [{ required: true, message: '请输入区县账号' }]
                                }>
                                    <InputNumber precision={0} min={0} addonAfter="天内" controls={false}></InputNumber>
                                </Form.Item>
                                <Form.Item label="街道账号" name="streetDeadlineReminder" rules={
                                    [{ required: true, message: '请输入街道账号' }]
                                }>
                                    <InputNumber precision={0} min={0} addonAfter="天内" controls={false}></InputNumber>
                                </Form.Item>
                                <Form.Item label="社区账号" name="communityDeadlineReminder" rules={
                                    [{ required: true, message: '请输入社区账号' }]
                                }>
                                    <InputNumber precision={0} min={0} addonAfter="天内" controls={false}></InputNumber>
                                </Form.Item>
                                <Form.Item label="党员账号" name="partyMemberDeadlineReminder" rules={
                                    [{ required: true, message: '请输入党员账号' }]
                                }>
                                    <InputNumber precision={0} min={0} addonAfter="天内" controls={false}></InputNumber>
                                </Form.Item>
                            </Space>
                        </Card>
                        <Card>
                            <div style={{ marginBottom: 20 }}><span style={{ fontSize: '14px', fontWeight: 600 }}>*诉求处理时间:
                            </span><span style={{ marginLeft: 8, color: '#a5a5a5' }}>超过时间未处理诉求,系统自动对该事件承办者发送短信提醒,并知会至上一级管理层进行督办。
                                </span></div>
                            <Form.Item label="添加后处理时间" name="demandProcessingTime" rules={
                                [{ required: true, message: '请输入添加后处理时间' }]
                            }>
                                <InputNumber precision={0} min={0} addonAfter="天内" controls={false}></InputNumber>
                            </Form.Item>
                        </Card>
                        <Access accessible={access['/work_order_transaction_management/work_order_item_configuration/save'] || false}>
                        <Access accessible={access['/work_order_transaction_management/work_order_item_configuration/save']}>
                            <div style={{ marginTop: 20, display: 'flex', justifyContent: 'center' }}>
                                <Button type="primary" htmlType="submit" style={{ marginRight: 20 }} onClick={() => {save()}} >
                                <Button type="primary" htmlType="submit" style={{ marginRight: 20 }} onClick={() => { save() }} >
                                    保存
                                </Button>
                            </div>
management/src/pages/work-order/banner/components/addAndEdit.jsx
@@ -8,6 +8,13 @@
import { customRequest } from '@/utils/utils';
const AddOrEditOrDetail = () => {
  const config = {
    name: 'file',
    action: 'https://huacheng.psciio.com/api/huacheng-communitybackstage/communitypartybuilding/uploadimage',
    headers: {
      Authorization: 'Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOjE4OTI0MjE4MjgwODU4Mzc4MjYsInR5cGUiOjEsImV4cCI6MTc0MTY1OTg5MywiY3JlYXRlZCI6MTc0MDM2Mzg5MzE2MH0.o3Gc0g1LAo_kkL3X3QrC6qKwztxsp6psoTcpTreDzQUXGqPzUXw89fNSR5YKz8gzhtSuSKI2d6TJJYPX1IQCgw',
    },
};
 
@@ -40,7 +47,7 @@
                  }
                  rules={[
                    {
                      required: fileList.length == 0 ? true : false,
                      required: true,
                      message: '请上传banner图片',
                    },
                  ]}
@@ -54,8 +61,8 @@
                    showUploadList={{
                      showPreviewIcon: false,
                    }}
                    customRequest={customRequest}
                    // accept="image/png, image/jpeg, image/jpg"
                    // customRequest={customRequest}
                    accept="image/png, image/jpeg, image/jpg"
                    fileList={fileList}
                    disabled={searchParams.get('detail')}
                  >
management/src/pages/work-order/banner/components/index.jsx
@@ -3,6 +3,7 @@
import { LoadingOutlined, PlusOutlined } from '@ant-design/icons';
import { forwardRef, useEffect, useImperativeHandle, useState } from 'react';
import { customRequest } from '@/utils/utils';
import { add, Edit, getDetail } from '../service'
const formItemLayout = {
  labelCol: { span: 7 },
@@ -19,7 +20,7 @@
    name: 'file',
    action: 'https://huacheng.psciio.com/api/huacheng-communitybackstage/communitypartybuilding/uploadimage',
    headers: {
      authorization: localStorage.getItem('token'),
      Authorization: 'Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOjE4OTI0MjE4MjgwODU4Mzc4MjYsInR5cGUiOjEsImV4cCI6MTc0MTY1OTg5MywiY3JlYXRlZCI6MTc0MDM2Mzg5MzE2MH0.o3Gc0g1LAo_kkL3X3QrC6qKwztxsp6psoTcpTreDzQUXGqPzUXw89fNSR5YKz8gzhtSuSKI2d6TJJYPX1IQCgw',
    },
  };
  const formItemLayout = {
@@ -53,13 +54,15 @@
                url: res.data.url
              }]
              setFileList(obj)
              form.setFieldsValue({ image: obj })
            }
            form.setFieldsValue(res.data)
            form.setFieldsValue({name: res.data.name})
          })
        }
      },
      clean: () => {
        form.resetFields();
        setFileList([])
      },
    };
  });
@@ -104,16 +107,10 @@
      delete values.image
      if (editData.id) {
        values.id = editData.id
        let state = await sendRequest(add, values)
        if (state) {
          history.back()
        }
        onUpdate(values)
        return
      }
      let state = await sendRequest(Edit, values)
      if (state) {
        history.back()
      }
      onSave(values)
    })
  }
@@ -151,7 +148,7 @@
          }
          rules={[
            {
              required: fileList.length == 0 ? true : false,
              required: true,
              message: '请上传banner图片',
            },
          ]}
@@ -166,7 +163,7 @@
              showPreviewIcon: false,
            }}
            // customRequest={customRequest}
            // accept="image/png, image/jpeg, image/jpg"
            accept="image/png, image/jpeg, image/jpg"
            fileList={fileList}
            disabled={editData.type == 'detail'}
          >
management/src/pages/work-order/banner/index.jsx
@@ -4,7 +4,7 @@
import { useRef, useState } from 'react';
import { Access, history, useAccess } from 'umi';
import AddAndEdit from './components/index';
import { getList, updateStatus, deleteBanner } from './service'
import { getList, updateStatus, deleteBanner, add, Edit } from './service'
const Banner = () => {
  const actionRef = useRef();
@@ -27,7 +27,9 @@
              <Button
                type="link"
                onClick={() => {
                  history.push(`/marketing/banner/add?id=${record.id}&edit=true`);
                  addViewRef.current.clean();
                  addViewRef.current.refreshData({ ...record, type: 'edit' });
                  handleModalVisible(true);
                }}
              >
                编辑
@@ -55,7 +57,9 @@
  ]
  return <div>
    <PageContainer title='banner管理'>
    <PageContainer title='banner管理' header={{
        breadcrumb: {},
      }}>
      <ProTable
        rowKey='id'
        actionRef={actionRef}
@@ -74,6 +78,7 @@
              <Button
                type="primary"
                onClick={() => {
                  addViewRef.current.clean();
                  addViewRef.current.refreshData({});
                  handleModalVisible(true);
                }}
@@ -85,24 +90,24 @@
        ]}
      />
      <AddAndEdit
                ref={addViewRef}
                visible={modalVisible}
                onCancel={() => handleModalVisible(false)}
                onSave={async (fileds) => {
                  const success = await sendRequest(add, fileds);
                  if (success) {
                    handleModalVisible(false);
                    actionRef.current.reload();
                  }
                }}
                onUpdate={async (fileds) => {
                  const success = await sendRequest(Edit, fileds);
                  if (success) {
                    handleModalVisible(false);
                    actionRef.current.reload();
                  }
                }}
              />
        ref={addViewRef}
        visible={modalVisible}
        onCancel={() => handleModalVisible(false)}
        onSave={async (fileds) => {
          const success = await sendRequest(add, fileds);
          if (success) {
            handleModalVisible(false);
            actionRef.current.reload();
          }
        }}
        onUpdate={async (fileds) => {
          const success = await sendRequest(Edit, fileds);
          if (success) {
            handleModalVisible(false);
            actionRef.current.reload();
          }
        }}
      />
    </PageContainer>
  </div>;
};
management/src/pages/work-order/problem-type/index.jsx
@@ -56,7 +56,9 @@
  ];
  return (
    <div>
      <PageContainer>
      <PageContainer title="问题类型管理" header={{
        breadcrumb: {},
      }}>
        <ProTable
          rowKey="id"
          actionRef={actionRef}
management/src/utils/utils.js
@@ -1,5 +1,4 @@
// import { getToken } from '@/utils/authority';
import pathRegexp from 'path-to-regexp';
import { parse } from 'querystring';
import { uploadFile } from './service'
/* eslint no-useless-escape:0 import/prefer-default-export:0 */
@@ -120,32 +119,3 @@
    })
    .catch(error => console.error('Error downloading file:', error));
}
export const getAuthorityFromRouter = (router = [], pathname) => {
  const authority = router.find(
    ({ routes, path = '/' }) =>
      (path && pathRegexp(path).exec(pathname)) ||
      (routes && getAuthorityFromRouter(routes, pathname)),
  );
  if (authority) return authority;
  return undefined;
};
export const getRouteAuthority = (path, routeData) => {
  let authorities;
  routeData.forEach((route) => {
    // match prefix
    if (pathRegexp(`${route.path}/(.*)`).test(`${path}/`)) {
      if (route.authority) {
        authorities = route.authority;
      } // exact match
      if (route.path === path) {
        authorities = route.authority || authorities;
      } // get children authority recursively
      if (route.routes) {
        authorities = getRouteAuthority(path, route.routes) || authorities;
      }
    }
  });
  return authorities;
};