落日与鲸
2025-02-25 b8578617882ddf12c806022b1cee614785c0c7d6
Merge branch 'master' of http://120.76.84.145:10101/gitblit/r/H5/threeSide
24个文件已修改
9个文件已添加
3085 ■■■■■ 已修改文件
H5/manifest.json 154 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
H5/pages/Appeal/Appeal.vue 105 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
H5/pages/add-progress/index.vue 510 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
H5/pages/delay/delay.vue 122 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
H5/pages/delay/service.js 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
H5/pages/dispatchWorkOrder/dispatchWorkOrder.vue 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
H5/pages/index/index.vue 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
H5/pages/list/list.vue 152 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
H5/pages/problemReporting/problemReporting.vue 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
H5/pages/result-entry/index.vue 678 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
H5/pages/work-detail/postpone-apply.vue 311 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
H5/pages/work-detail/service.js 26 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
H5/pages/work-detail/work-detail.vue 188 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
H5/static/packUp.png 补丁 | 查看 | 原始文档 | blame | 历史
H5/static/unfold.png 补丁 | 查看 | 原始文档 | blame | 历史
H5/static/空空如也@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
H5/utils/request.js 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
management/config/routes.ts 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
management/src/app.tsx 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
management/src/components/RightContent/AvatarDropdown.tsx 147 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
management/src/components/RightContent/service.js 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
management/src/components/RightContent/style.less 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
management/src/global.less 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
management/src/pages/message-notification/index.jsx 35 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
management/src/pages/setting/career/index.jsx 76 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
management/src/pages/setting/role/components/addAndEdit.jsx 192 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
management/src/pages/setting/role/index.jsx 127 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
management/src/pages/setting/role/service.js 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
management/src/pages/work-order-setting/index.jsx 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
management/src/pages/work-order/banner/index.jsx 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
management/src/pages/work-order/problem-type/index.jsx 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
management/src/requestErrorConfig.ts 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
management/src/utils/antdUtils.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
H5/manifest.json
@@ -1,75 +1,81 @@
{
    "name" : "ThreeByMySide",
    "appid" : "",
    "description" : "",
    "versionName" : "1.0.0",
    "versionCode" : "100",
    "transformPx" : false,
    /* 5+App特有相关 */
    "app-plus" : {
        "usingComponents" : true,
        "nvueStyleCompiler" : "uni-app",
        "compilerVersion" : 3,
        "splashscreen" : {
            "alwaysShowBeforeRender" : true,
            "waiting" : true,
            "autoclose" : true,
            "delay" : 0
        },
        /* 模块配置 */
        "modules" : {},
        /* 应用发布信息 */
        "distribute" : {
            /* android打包配置 */
            "android" : {
                "permissions" : [
                    "<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
                    "<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
                    "<uses-permission android:name=\"android.permission.VIBRATE\"/>",
                    "<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
                    "<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
                    "<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
                    "<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
                    "<uses-permission android:name=\"android.permission.CAMERA\"/>",
                    "<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
                    "<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
                    "<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
                    "<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
                    "<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
                    "<uses-feature android:name=\"android.hardware.camera\"/>",
                    "<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
                ]
            },
            /* ios打包配置 */
            "ios" : {},
            /* SDK配置 */
            "sdkConfigs" : {}
        }
    },
    /* 快应用特有相关 */
    "quickapp" : {},
    /* 小程序特有相关 */
    "mp-weixin" : {
        "appid" : "",
        "setting" : {
            "urlCheck" : false
        },
        "usingComponents" : true
    },
    "mp-alipay" : {
        "usingComponents" : true
    },
    "mp-baidu" : {
        "usingComponents" : true
    },
    "mp-toutiao" : {
        "usingComponents" : true
    },
    "uniStatistics" : {
        "enable" : false
    },
    "vueVersion" : "2",
    "h5" : {
        "template" : "index.html"
    }
}
    "name": "三个身边",
    "appid": "",
    "description": "",
    "versionName": "1.0.0",
    "versionCode": "100",
    "transformPx": false,
    /* 5+App特有相关 */
    "app-plus": {
        "usingComponents": true,
        "nvueStyleCompiler": "uni-app",
        "compilerVersion": 3,
        "splashscreen": {
            "alwaysShowBeforeRender": true,
            "waiting": true,
            "autoclose": true,
            "delay": 0
        },
        /* 模块配置 */
        "modules": {},
        /* 应用发布信息 */
        "distribute": {
            /* android打包配置 */
            "android": {
                "permissions": [
                    "<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
                    "<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
                    "<uses-permission android:name=\"android.permission.VIBRATE\"/>",
                    "<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
                    "<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
                    "<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
                    "<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
                    "<uses-permission android:name=\"android.permission.CAMERA\"/>",
                    "<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
                    "<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
                    "<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
                    "<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
                    "<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
                    "<uses-feature android:name=\"android.hardware.camera\"/>",
                    "<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
                ]
            },
            /* ios打包配置 */
            "ios": {},
            /* SDK配置 */
            "sdkConfigs": {}
        }
    },
    /* 快应用特有相关 */
    "quickapp": {},
    /* 小程序特有相关 */
    "mp-weixin": {
        "appid": "",
        "setting": {
            "urlCheck": false
        },
        "usingComponents": true
    },
    "mp-alipay": {
        "usingComponents": true
    },
    "mp-baidu": {
        "usingComponents": true
    },
    "mp-toutiao": {
        "usingComponents": true
    },
    "uniStatistics": {
        "enable": false
    },
    "vueVersion": "2",
    "h5": {
        "template": "index.html",
        "title": "三个身边",
        "optimization": {
            "treeShaking": {
                "enable": false
            }
        }
    }
}
H5/pages/Appeal/Appeal.vue
@@ -61,7 +61,8 @@
                        <view class="img-icon">
                            <image class="w-19 h-19" @click="previewImage(index)" src="/static/Appeal/amplify.png"
                                mode=""></image>
                            <image class="w-19 h-19 ml-35" @click="deletimg(item)" src="/static/Appeal/trash.png" mode="">
                            <image class="w-19 h-19 ml-35" @click="deletimg(item)" src="/static/Appeal/trash.png"
                                mode="">
                            </image>
                        </view>
                    </view>
@@ -72,10 +73,13 @@
                <text class="w-108 fs-27 font-bold mr-85">视频</text>
                <view class="mt-27 flex a-center">
                    <view class="img mr-15" v-for="item,index in videos" :key="index">
                        <video :controls="false" :show-center-play-btn="false" :src="item" class="w-140 h-140" mode=""></video>
                        <video :controls="false" :show-center-play-btn="false" :src="item" class="w-140 h-140"
                            mode=""></video>
                        <view class="img-icon">
                            <image class="w-19 h-19" @click="gotoPage(item)"  src="/static/Appeal/amplify.png" mode=""></image>
                            <image class="w-19 h-19 ml-35" @click="deletvideo(item)" src="/static/Appeal/trash.png" mode=""></image>
                            <image class="w-19 h-19" @click="gotoPage(item)" src="/static/Appeal/amplify.png" mode="">
                            </image>
                            <image class="w-19 h-19 ml-35" @click="deletvideo(item)" src="/static/Appeal/trash.png"
                                mode=""></image>
                        </view>
                    </view>
                    <image src="/static/Appeal/add.png" class="w-140 h-140" mode="" @click="uploadVideo"></image>
@@ -116,8 +120,8 @@
                detailedAddress: '',
                descriptionTitle: '',
                descriptionContent: '',
                latitude:'',
                longitude:'',
                latitude: '',
                longitude: '',
                images: [],
                videos: [],
            };
@@ -145,79 +149,79 @@
                this.images = this.images.filter(item => item != e)
            },
            deletvideo(e){
            deletvideo(e) {
                this.videos = this.videos.filter(item => item != e)
            },
            gotoPage(e){
            gotoPage(e) {
                uni.navigateTo({
                    url:`/pages/work-detail/maxVideo?url=${e}`
                    url: `/pages/work-detail/maxVideo?url=${e}`
                })
            },
            getproblem() {
                getproblem().then((resp => {
                    console.log(resp, '问题类型')
                    this.columns =[resp.data.map(item=>{
                    this.columns = [resp.data.map(item => {
                        return item.name
                    })]
                }))
            },
            submit() {
                const preciseRegex = /^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}$/;
                if(!this.time){
                if (!this.time) {
                    uni.showToast({
                        title:'请选择时间',
                        icon:'none'
                        title: '请选择时间',
                        icon: 'none'
                    })
                }else if(!this.problemType){
                } else if (!this.problemType) {
                    uni.showToast({
                        title:'请选择问题类型',
                        icon:'none'
                        title: '请选择问题类型',
                        icon: 'none'
                    })
                }else if(!this.name){
                } else if (!this.name) {
                    uni.showToast({
                        title:'请输入群众姓名',
                        icon:'none'
                        title: '请输入群众姓名',
                        icon: 'none'
                    })
                }else if(!this.contactNumber){
                } else if (!this.contactNumber) {
                    uni.showToast({
                        title:'请输入联系电话',
                        icon:'none'
                        title: '请输入联系电话',
                        icon: 'none'
                    })
                }else if(!preciseRegex.test(this.contactNumber)){
                } else if (!preciseRegex.test(this.contactNumber)) {
                    uni.showToast({
                        title:'请输入正确的手机号',
                        icon:'none'
                        title: '请输入正确的手机号',
                        icon: 'none'
                    })
                }else if(!this.location){
                } else if (!this.location) {
                    uni.showToast({
                        title:'请选择地点',
                        icon:'none'
                        title: '请选择地点',
                        icon: 'none'
                    })
                }else if(!this.detailedAddress){
                } else if (!this.detailedAddress) {
                    uni.showToast({
                        title:'请输入详细地址',
                        icon:'none'
                        title: '请输入详细地址',
                        icon: 'none'
                    })
                }else if(!this.descriptionTitle){
                } else if (!this.descriptionTitle) {
                    uni.showToast({
                        title:'请输入问题标题',
                        icon:'none'
                        title: '请输入问题标题',
                        icon: 'none'
                    })
                }else if(!this.descriptionContent){
                } else if (!this.descriptionContent) {
                    uni.showToast({
                        title:'请输入问题描述',
                        icon:'none'
                        title: '请输入问题描述',
                        icon: 'none'
                    })
                }else if(this.images==0){
                } else if (this.images == 0) {
                    uni.showToast({
                        title:'请上传图片',
                        icon:'none'
                        title: '请上传图片',
                        icon: 'none'
                    })
                }else if(this.videos==0){
                } else if (this.videos == 0) {
                    uni.showToast({
                        title:'请上传视频',
                        icon:'none'
                        title: '请上传视频',
                        icon: 'none'
                    })
                }
                const data = {
@@ -226,8 +230,8 @@
                    name: this.name,
                    contactNumber: this.contactNumber,
                    location: this.location,
                    latitude:this.latitude,
                    longitude:this.longitude,
                    latitude: this.latitude,
                    longitude: this.longitude,
                    detailedAddress: this.detailedAddress,
                    descriptionTitle: this.descriptionTitle,
                    descriptionContent: this.descriptionContent,
@@ -236,11 +240,14 @@
                }
                save(data).then(resp => {
                    console.log(resp, '保存');
                    if(resp.code==200){
                    if (resp.code == 200) {
                        uni.showToast({
                            title:'保存成功',
                            icon:'none'
                            title: '保存成功',
                            icon: 'none'
                        })
                        setTimeout(() => {
                            uni.navigateBack()
                        }, 1500)
                    }
                })
            },
H5/pages/add-progress/index.vue
@@ -6,7 +6,7 @@
                <view class="color1">{{ ["正在办理", "延期办理", "超时办理", "已办结", "群众撤销", "上报待审核", "上级驳回"][info.status] }}</view>
            </view>
            <view class="mx-13 mt-33 pt-35 pb-33 px-27 br-19 flex a-center j-between bgcolor1">
                <view class="fs-27 lh-38 color2">{{ info.detailedAddress }}</view>
                <view class="fs-27 lh-38 color2">{{ info.location }}</view>
                <image src="@/static/detailImg/dwei.png" class="w-31 h-31 shrink0" />
            </view>
            <view class="flex a-center j-between mt-31 mx-13">
@@ -79,104 +79,153 @@
</template>
<script>
import {
    saveProcess,
    getComplaintDetail
} from './service'
import config from '@/config/index.js'
export default {
    data() {
        return {
            complaintId: '', //诉求id
            info: {}, //工单详情
            describe: '', //办理进度描述
            localImageUrls: [], //本地回显的图片
            imgUrls: [], //传给后端的url
            video: [],
            againCklicFlag: true,
            rulsFlag: false,
        }
    },
    onLoad(params) {
        this.complaintId = params.id
        getComplaintDetail({
            id: params.id
        }).then(res => {
            this.info = res.data
        })
    },
    methods: {
        submit() {
            if (!this.describe) {
                this.rulsFlag = true
                return uni.showToast({
                    icon: 'none',
                    title: '请输入办理进度描述'
                })
    import {
        saveProcess,
        getComplaintDetail
    } from './service'
    import config from '@/config/index.js'
    export default {
        data() {
            return {
                complaintId: '', //诉求id
                info: {}, //工单详情
                describe: '', //办理进度描述
                localImageUrls: [], //本地回显的图片
                imgUrls: [], //传给后端的url
                video: [],
                againCklicFlag: true,
                rulsFlag: false,
            }
            if (this.imgUrls.length == 0) {
                return uni.showToast({
                    icon: 'none',
                    title: '请上传图片'
                })
            }
            if (this.video.length == 0) {
                return uni.showToast({
                    icon: 'none',
                    title: '请上传视频'
                })
            }
            let obj = {
                complaintId: this.complaintId,
                describe: this.describe,
                imgUrl: this.imgUrls.join(','),
                video: this.video.join(',')
            }
            saveProcess(obj).then(res => {
                if (res.code == 200) {
                    uni.showToast({
                        title: '提交成功',
                        icon: 'success',
                        mask: true
                    })
                    setTimeout(() => {
                        uni.navigateBack()
                    }, 1500)
                } else {
                    uni.showToast({
                        title: res.msg,
        },
        onLoad(params) {
            this.complaintId = params.id
            getComplaintDetail({
                id: params.id
            }).then(res => {
                this.info = res.data
            })
        },
        methods: {
            submit() {
                if (!this.describe) {
                    this.rulsFlag = true
                    return uni.showToast({
                        icon: 'none',
                        mask: true
                        title: '请输入办理进度描述'
                    })
                }
            })
        },
        delImg(item) {
            this.localImageUrls = this.localImageUrls.filter(i => i != item)
            this.imgUrls = this.imgUrls.filter(i => i != item)
        },
        delVideo(item) {
            this.video = this.video.filter(i => i != item)
        },
        viewImage(item) {
            uni.previewImage({
                urls: [item]
            })
        },
        uploadImg(type) {
            if (!this.againCklicFlag) return
            this.againCklicFlag = false
            if (type == 1) {
                uni.chooseImage({
                    count: 1,
                    success: (chooseImageRes) => {
                        this.imgUrls.push('loading')
                        this.againCklicFlag = true
                        let imgPathList = chooseImageRes.tempFilePaths;
                        if (imgPathList.length > 0) {
                if (this.imgUrls.length == 0) {
                    return uni.showToast({
                        icon: 'none',
                        title: '请上传图片'
                    })
                }
                if (this.video.length == 0) {
                    return uni.showToast({
                        icon: 'none',
                        title: '请上传视频'
                    })
                }
                let obj = {
                    complaintId: this.complaintId,
                    describe: this.describe,
                    imgUrl: this.imgUrls.join(','),
                    video: this.video.join(',')
                }
                saveProcess(obj).then(res => {
                    if (res.code == 200) {
                        uni.showToast({
                            title: '提交成功',
                            icon: 'success',
                            mask: true
                        })
                        setTimeout(() => {
                            uni.navigateBack()
                        }, 1500)
                    } else {
                        uni.showToast({
                            title: res.msg,
                            icon: 'none',
                            mask: true
                        })
                    }
                })
            },
            delImg(item) {
                this.localImageUrls = this.localImageUrls.filter(i => i != item)
                this.imgUrls = this.imgUrls.filter(i => i != item)
            },
            delVideo(item) {
                this.video = this.video.filter(i => i != item)
            },
            viewImage(item) {
                uni.previewImage({
                    urls: [item]
                })
            },
            uploadImg(type) {
                if (!this.againCklicFlag) return
                this.againCklicFlag = false
                if (type == 1) {
                    uni.chooseImage({
                        count: 1,
                        success: (chooseImageRes) => {
                            this.imgUrls.push('loading')
                            this.againCklicFlag = true
                            let imgPathList = chooseImageRes.tempFilePaths;
                            if (imgPathList.length > 0) {
                                uni.uploadFile({
                                    url: config.imageUrl,
                                    filePath: imgPathList[0],
                                    timeout: 1000 * 45,
                                    name: 'file',
                                    header: {
                                        Authorization: config.uploadToken
                                    },
                                    success: (res) => {
                                        if (JSON.parse(res.data).code == 200) {
                                            this.imgUrls = this.imgUrls.filter(item => item !=
                                                'loading')
                                            this.$nextTick(() => {
                                                this.imgUrls.push(JSON.parse(res.data)
                                                    .data)
                                                this.localImageUrls.push(imgPathList[0])
                                            })
                                        } else {
                                            this.againCklicFlag = true
                                            this.imgUrls = this.imgUrls.filter(
                                                item => item != 'loading')
                                            uni.showToast({
                                                title: '上传失败,请重新上传',
                                                icon: 'none',
                                                mask: true
                                            })
                                        }
                                    },
                                    fail: (err) => {
                                        this.againCklicFlag = true
                                        this.imgUrls = this.imgUrls.filter(
                                            item => item != 'loading')
                                        uni.showToast({
                                            title: '上传失败,请重新上传',
                                            icon: 'none',
                                            mask: true
                                        })
                                    }
                                })
                            }
                        },
                    })
                } else {
                    uni.chooseVideo({
                        camera: 'back',
                        success: (res) => {
                            this.video.push('loading')
                            this.againCklicFlag = true
                            const tempFilePath = res.tempFilePath;
                            uni.uploadFile({
                                url: config.imageUrl,
                                filePath: imgPathList[0],
                                filePath: tempFilePath,
                                timeout: 1000 * 45,
                                name: 'file',
                                header: {
@@ -184,16 +233,14 @@
                                },
                                success: (res) => {
                                    if (JSON.parse(res.data).code == 200) {
                                        this.imgUrls = this.imgUrls.filter(item => item !=
                                        this.video = this.video.filter(item => item !=
                                            'loading')
                                        this.$nextTick(() => {
                                            this.imgUrls.push(JSON.parse(res.data)
                                                .data)
                                            this.localImageUrls.push(imgPathList[0])
                                            this.video.push(JSON.parse(res.data).data)
                                        })
                                    } else {
                                        this.againCklicFlag = true
                                        this.imgUrls = this.imgUrls.filter(
                                        this.video = this.video.filter(
                                            item => item != 'loading')
                                        uni.showToast({
                                            title: '上传失败,请重新上传',
@@ -204,7 +251,7 @@
                                },
                                fail: (err) => {
                                    this.againCklicFlag = true
                                    this.imgUrls = this.imgUrls.filter(
                                    this.video = this.video.filter(
                                        item => item != 'loading')
                                    uni.showToast({
                                        title: '上传失败,请重新上传',
@@ -214,175 +261,128 @@
                                }
                            })
                        }
                    },
                    })
                }
            },
            // 去大屏播放视频
            openVideo(url) {
                uni.navigateTo({
                    url: `/pages/work-detail/maxVideo?url=${url}`
                })
            } else {
                uni.chooseVideo({
                    camera: 'back',
                    success: (res) => {
                        this.video.push('loading')
                        this.againCklicFlag = true
                        const tempFilePath = res.tempFilePath;
                        uni.uploadFile({
                            url: config.imageUrl,
                            filePath: tempFilePath,
                            timeout: 1000 * 45,
                            name: 'file',
                            header: {
                                Authorization: config.uploadToken
                            },
                            success: (res) => {
                                if (JSON.parse(res.data).code == 200) {
                                    this.video = this.video.filter(item => item !=
                                        'loading')
                                    this.$nextTick(() => {
                                        this.video.push(JSON.parse(res.data).data)
                                    })
                                } else {
                                    this.againCklicFlag = true
                                    this.video = this.video.filter(
                                        item => item != 'loading')
                                    uni.showToast({
                                        title: '上传失败,请重新上传',
                                        icon: 'none',
                                        mask: true
                                    })
                                }
                            },
                            fail: (err) => {
                                this.againCklicFlag = true
                                this.video = this.video.filter(
                                    item => item != 'loading')
                                uni.showToast({
                                    title: '上传失败,请重新上传',
                                    icon: 'none',
                                    mask: true
                                })
                            }
                        })
                    }
                })
            }
        },
        // 去大屏播放视频
        openVideo(url) {
            uni.navigateTo({
                url: `/pages/work-detail/maxVideo?url=${url}`
            })
        },
            },
        }
    }
}
</script>
<style scoped lang="scss">
.bs-1 {
    box-shadow: 0rpx 0rpx 27rpx 0rpx rgba(0, 0, 0, 0.1);
}
.color1 {
    color: #FF4948;
}
.color2 {
    color: rgba(0, 0, 0, .8);
}
.color3 {
    color: #FAAD14;
}
.color4 {
    color: #FFFFFF;
}
.color99 {
    color: #FB9A0E;
}
.bgcolor-border {
    background: rgba(255, 253, 241, 1) !important;
    border: 2rpx solid #FFE58F;
}
.bgcolor1 {
    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%);
}
.bgcolor2 {
    background: linear-gradient(180deg, #FFDCDB 0%, rgba(255, 255, 255, 0) 25%);
}
.bgcolor3 {
    background: #FFFBE6;
}
.bgcolor4 {
    background: #F8F8F8;
}
.bgcolor5 {
    background: rgba(0, 0, 0, .23);
}
.bgcolor6 {
    background: linear-gradient(270deg, #FC8D55 0%, #FF4948 100%);
}
.border1 {
    border: 2rpx solid #FFF1B8;
}
.border2 {
    border: 2rpx solid #F8F8F8;
}
.safe-box {
    height: env(safe-area-inset-bottom);
}
.imgOrVedio {
    margin-right: 17rpx;
    position: relative;
    .img {
        width: 140rpx;
        height: 140rpx;
        border-radius: 8rpx;
        margin-top: 19rpx;
    .bs-1 {
        box-shadow: 0rpx 0rpx 27rpx 0rpx rgba(0, 0, 0, 0.1);
    }
    .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;
    .color1 {
        color: #FF4948;
    }
        .video {
            z-index: 999;
    .color2 {
        color: rgba(0, 0, 0, .8);
    }
    .color3 {
        color: #FAAD14;
    }
    .color4 {
        color: #FFFFFF;
    }
    .color99 {
        color: #FB9A0E;
    }
    .bgcolor-border {
        background: rgba(255, 253, 241, 1) !important;
        border: 2rpx solid #FFE58F;
    }
    .bgcolor1 {
        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%);
    }
    .bgcolor2 {
        background: linear-gradient(180deg, #FFDCDB 0%, rgba(255, 255, 255, 0) 25%);
    }
    .bgcolor3 {
        background: #FFFBE6;
    }
    .bgcolor4 {
        background: #F8F8F8;
    }
    .bgcolor5 {
        background: rgba(0, 0, 0, .23);
    }
    .bgcolor6 {
        background: linear-gradient(270deg, #FC8D55 0%, #FF4948 100%);
    }
    .border1 {
        border: 2rpx solid #FFF1B8;
    }
    .border2 {
        border: 2rpx solid #F8F8F8;
    }
    .safe-box {
        height: env(safe-area-inset-bottom);
    }
    .imgOrVedio {
        margin-right: 17rpx;
        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;
            }
        }
    }
}
.videoImg {
    width: 140.38rpx;
    height: 140.38rpx;
    border-radius: 7.69rpx;
    position: relative;
}
    .videoImg {
        width: 140.38rpx;
        height: 140.38rpx;
        border-radius: 7.69rpx;
        position: relative;
    }
#myVideo {
    z-index: 1;
}
    #myVideo {
        z-index: 1;
    }
.zIndex999 {
    z-index: 999;
}
    .zIndex999 {
        z-index: 999;
    }
</style>
H5/pages/delay/delay.vue
@@ -1,66 +1,86 @@
<template>
    <view class="pt-38">
<template>
    <view class="pt-38">
        <view class="br-16 shadow1 pl-31 pt-31 pr-31 pb-21 ml-31 mr-31">
            <view class="fs-27 font-bold">
                说明内容
            </view>
            <view class="mt-27 bgColor1 pt-25 pl-31 pr-31 pb-29 lh-38 fs-27">
                <view class="">
                    1、处理措施:记录为解决该问题所采取的具体措施,包括政策宣传、处理沟通、现场处理等方式。
                {{ info.comment || '' }}
            </view>
            <view v-if="info.images && info.images.length > 0" class="">
                <view class="fs-27 font-bold mt-38">
                    图片
                </view>
                <view class="">
                    2、处理时间:记录处理该问题的时间节点,包括开始处理时间、处理完成时间等。
                </view>
                <view class="">
                    3、参与人员:记录参与处理该问题的人员名单,包括走访人员、相关部门工作人员等。
                </view>
                <view class="">
                    4、结果概述:简要描述问题的处理结果,是否得到有效解决,是否达到走访对象的期望等。
                </view>
                <view class="">
                    5、后续跟进:如需进一步跟进或处理,记录后续跟进的计划、时间节点及责任人员。
                <view class="flex a-center j-between mt-27 wrap">
                    <image v-for="(item,index) in info.images" :key="index" :src="item" mode="aspectFill" @click="previewImage(info.images,index)
                        class="w-140 h-140 mr-15 shrink0 mb-10"></image>
                </view>
            </view>
            <view class="fs-27 font-bold mt-38">
                图片
            </view>
            <view class="flex a-center j-between mt-27 wrap">
                <image src="../../static/logo.png" mode="aspectFill" class="w-140 h-140 mr-15 shrink0 mb-10" v-for="item in 4" :key="item"></image>
            </view>
            <view class="fs-27 font-bold mt-28">
                视频
            </view>
            <view class="flex a-center j-between mt-27 wrap">
                <view class="relative mr-15 shrink0 mb-10" v-for="item in 4" :key="item">
                    <image src="../../static/logo.png" mode="aspectFill" class="w-140 h-140" ></image>
                    <image src="../../static/detailImg/open.png" mode="aspectFill" class="w100 h100 absolute top0 left0"></image>
            <view v-if="info.videos && info.videos.length > 0" class="">
                <view class="fs-27 font-bold mt-28">
                    视频
                </view>
                <view class="flex a-center j-between mt-27 wrap">
                    <view class="relative mr-15 shrink0 mb-10" v-for="(item,index) in info.videos" :key="item"
                        @click="toPlay(item)">
                        <video :controls="false" :show-center-play-btn="false" :src="item" class="w-140 h-140"
                            mode=""></video>
                        <image src="../../static/detailImg/open.png" mode="aspectFill"
                            class="w100 h100 absolute top0 left0"></image>
                    </view>
                </view>
            </view>
        </view>
        <view class="h-10 safe-b">
        </view>
    </view>
</template>
<script>
    export default {
        data() {
            return {
            }
        },
        methods: {
        }
    }
</script>
<style scoped>
    .shadow1 {
        box-shadow: 0rpx 0rpx 27rpx 0rpx rgba(0,0,0,0.1);
        </view>
    </view>
</template>
<script>
    import {
        getDelayDetail
    } from './service.js'
    export default {
        data() {
            return {
                info: {}
            }
        },
        onLoad(e) {
            getDelayDetail(e.id).then(res => {
                if (res.data.images) {
                    res.data.images = res.data.images.split(',')
                }
                if (res.data.videos) {
                    res.data.videos = res.data.videos.split(',')
                }
                this.info = res.data
            })
        },
        methods: {
            toPlay(url) {
                uni.navigateTo({
                    url: '/pages/work-detail/maxVideo?url=' + url
                })
            },
            // 预览图片
            previewImage(list,index) {
                uni.previewImage({
                    urls: list,
                    current: index,
                });
            },
        }
    }
</script>
<style scoped>
    .shadow1 {
        box-shadow: 0rpx 0rpx 27rpx 0rpx rgba(0, 0, 0, 0.1);
    }
    .bgColor1 {
        background-color: #FBFBFB;
    }
</style>
    }
</style>
H5/pages/delay/service.js
New file
@@ -0,0 +1,5 @@
import request from '@/utils/request.js'
export const getDelayDetail =(complaintId)=>{
    return request.get(`/api/huacheng-sangeshenbian/applet/complaint/delay-detail/${complaintId}`)
}
H5/pages/dispatchWorkOrder/dispatchWorkOrder.vue
@@ -7,7 +7,7 @@
            </view>
            <view class="address">
                <view class="adr">{{detail.detailedAddress || ''}}</view>
                <view class="adr">{{detail.location || ''}}</view>
                <image src="/static/position@2x.png" class="w-31 h-31" mode="aspectFill"></image>
            </view>
@@ -48,8 +48,7 @@
            <view class="popup-content">
                <view class="title-pop">请选择下派单位</view>
                <view class="pop-label">社区:</view>
                <uni-data-select :disabled="false" v-model="value" :localdata="range"
                    @change="change"></uni-data-select>
                <uni-data-select :disabled="false" v-model="value" :localdata="range"></uni-data-select>
                <view class="botton-btn">
                    <view class="cancle" @tap="close">取消</view>
@@ -77,7 +76,7 @@
            };
        },
        onLoad(option) {
            option.id = 1
            // option.id = 1
            if (option.id) {
                this.id = option.id
                getDetail({
@@ -90,9 +89,6 @@
            }
        },
        methods: {
            change(e) {
                console.log("e:", e);
            },
            close() {
                this.showPop = false
            },
@@ -130,7 +126,9 @@
                            icon: 'none',
                            title: '下派成功'
                        })
                        uni.navigateBack()
                        uni.navigateBack({
                            delta: 2
                        })
                    }
                })
            }
H5/pages/index/index.vue
@@ -27,7 +27,7 @@
                    <image class="w-81 h-77 ml-38" src="/static/home/img4.png" mode=""></image>
                    <text class="ml-37">诉求录入</text>
                </view>
                <view class="pt-38  pb-38 bg1 w-333 mt-19 br-19 flex a-center">
                <view class="pt-38  pb-38 bg1 w-333 mt-19 br-19 flex a-center" @click="goToList()">
                    <image class="w-81 h-77 ml-38" src="/static/home/img2.png" mode=""></image>
                    <text class="ml-37">诉求列表</text>
                </view>
@@ -240,6 +240,11 @@
                    }
                });
            },
            goToList() {
                uni.navigateTo({
                    url: '/pages/list/list'
                })
            }
        }
    }
H5/pages/list/list.vue
@@ -2,35 +2,59 @@
    <view class="content">
        <view class="bgColor2 h-96 flex a-center fs-27  j-between txt-center shadow1 font-w400 color1"
            style="position: sticky;top: 0;">
            <view class="flex1 relative" :class="true && 'color2 font-bold'">
            <view @click="changeType('')" class="flex1 relative" :class="searchParams.type == '' && 'color2 font-bold'">
                <view class="relative zIndex1000">
                    全部
                </view>
                <view class="bgColor1">
                <view v-if="searchParams.type == ''" class="bgColor1"></view>
            </view>
            <view @click="changeType('0')" class="flex1 relative"
                :class="searchParams.type == '0' && 'color2 font-bold'">
                <view class="relative zIndex1000">
                    上报待审核
                </view>
                <view v-if="searchParams.type == '0'" class="bgColor1"></view>
            </view>
            <view class="flex1">
                上报待审核
            <view @click="changeType('1')" class="flex1 relative"
                :class="searchParams.type == '1' && 'color2 font-bold'">
                <view class="relative zIndex1000">
                    正在办理
                </view>
                <view v-if="searchParams.type == '1'" class="bgColor1"></view>
            </view>
            <view class="flex1">
                正在办理
            </view>
            <view class="flex1">
                办结
            <view @click="changeType('2')" class="flex1 relative"
                :class="searchParams.type == '2' && 'color2 font-bold'">
                <view class="relative zIndex1000">
                    办结
                </view>
                <view v-if="searchParams.type == '2'" class="bgColor1"></view>
            </view>
        </view>
        <view class="pl-31 pr-31">
            <view class="mt-31 br-19 bgColor3 shadow2 oh pb-31" v-for="(item,index) in list" :key="item.id">
        <view v-if="list.length == 0 && status == 'noMore'" class="mt-200">
            <image src="../../static/空空如也@2x.png" mode="widthFix" class="w100"></image>
            <view class="txt-center mt-94 fs-27 color9">
                暂无数据
            </view>
        </view>
        <view v-else class="pl-31 pr-31">
            <view class="mt-31 br-19 bgColor3 shadow2 oh pb-31" v-for="(item,index) in list" :key="item.id"
                @click="toDetail(item)">
                <view class="pt-21 pl-27 pr-27 flex a-center j-between fs-27 font-bold">
                    <view class="">
                        诉求号:{{ item.serialNumber || '' }}
                    </view>
                    <view class="color3">
                    <view class="color3 flex a-center">
                        <view v-if="status == '2'"
                            class="fs-23 font-w500 flex a-center pl-10 pr-12 mr-17 bgColor7 h-50 br-8 color8">
                            <view class="w-27 h-27 color3 bgColor2 txt-center br-18 fs-20 flex a-center j-center mr-17">
                                i
                            </view>
                            已超时{{ item.overTimeDays }}天
                        </view>
                        {{ statusObj[item.status] }}
                    </view>
                </view>
                <view class="mt-40 fs-23 pl-40 pr-40">
                <view v-if="['5','6'].includes(item.status)" class="mt-40 fs-23 pl-40 pr-40">
                    <view class="flex j-between a-center">
                        <view class="color4">
                            上报人:<text class="color5">{{ item.reporter || '' }}</text>
@@ -47,7 +71,7 @@
                </view>
                <view class="mt-27 ml-40 mr-40 br-19 bgColor4 pt-34 pb-34 fs-27 pl-27 pr-27 flex a-center j-between">
                    <text>{{ item.location || '' }}</text>
                    <image src="../../static/location.png" mode="aspectFill" class="w-31 h-31 ml-10 shrink0"></image>
                    <image src="../../static/position@2x.png" mode="aspectFill" class="w-31 h-31 ml-10 shrink0"></image>
                </view>
                <view class="ml-40 mr-40 mt-31 flex j-between a-center fs-27 txt-center">
                    <view class="">
@@ -75,7 +99,7 @@
                        </view>
                    </view>
                </view>
                <view class="fs-27 mt-31 ml-40 mr-40">
                <view v-if="item.status != '3'" class="fs-27 mt-31 ml-40 mr-40">
                    <view class="">
                        问题描述
                    </view>
@@ -83,13 +107,14 @@
                        {{ item.descriptionContent || '' }}
                    </view>
                </view>
                <view class="fs-27 mt-31 ml-40">
                <view v-if="item.status != '3' && item.images" class="fs-27 mt-31 ml-40">
                    <view class="">
                        描述图片
                    </view>
                    <view class="mt-19 flex wrap a-center">
                        <image v-for="(item1,index) in item.images" :key="index" :src="item1"
                            class="br-19 w-142 h-154 mr-13 mb-10 shrink0" mode="aspectFill"></image>
                            @click="previewImage(item.images,index)" class="br-19 w-142 h-154 mr-13 mb-10 shrink0"
                            mode="aspectFill"></image>
                    </view>
                </view>
                <view class="mt-31 border1">
@@ -98,18 +123,18 @@
                    <view class="txt-center fs-23 mt-27 color6">
                        创建时间:{{ item.createTime | formatTime }}
                    </view>
                    <view class="flex a-center j-center fs-23 mt-29 txt-center">
                        <view class="h-58 lh-58 bgColor5 w-192 br-29 color7">
                    <view v-if="!['3','5'].includes(item.status)" class="flex a-center j-center fs-23 mt-29 txt-center">
                        <view @click="addProgress(item.id)" class="h-58 lh-58 bgColor5 w-192 br-29 color7">
                            添加办理进度
                        </view>
                        <view class="ml-38 h-58 lh-58 bgColor6 w-192 br-29 color8">
                        <view @click="addResult(item.id)" class="ml-38 h-58 lh-58 bgColor6 w-192 br-29 color8">
                            办理结果录入
                        </view>
                    </view>
                </view>
            </view>
        </view>
        <view class="safe-b pt-20"></view>
    </view>
</template>
@@ -126,9 +151,9 @@
                searchParams: {
                    pageNum: 1,
                    pageSize: 10,
                    type: 0
                    type: '', //全部:不传,上报待审核:0,正在办理:1, 办结:2
                },
                list:[],
                list: [],
                status: 'loadMore',
                statusObj: {
                    // 0-正在办理 1-延期办理 2-超时办理 3-已办结 4-群众撤销 5-上报待审核 6-上级驳回
@@ -138,20 +163,33 @@
                    '3': '已办结',
                    '4': '群众撤销',
                    '5': '上报待审核',
                    '6': '上级驳回'
                    '6': '上级驳回',
                    '7': '延期待审核'
                }
            }
        },
        onReachBottom() {
            if (this.status == 'loadMore') {
                this.searchParams.pageNum += 1
                this.fetchList(this.searchParams, (e) => {
                    this.list = [...this.list, ...e.records]
                    if (this.list.length == e.total) {
                        this.status = 'noMore'
                    } else {
                        this.status = 'loadMore'
                    }
                })
            }
        },
        filters: {
            formatTime(val) {
                if (!val) return ''
                return dayjs(val).format('YYYY-MM-DD HH:mm:ss')
            }
        },
        onShow() {
            this.fetchList(this.searchParams,(e)=>{
            this.searchParams.pageNum = 1
            this.fetchList(this.searchParams, (e) => {
                this.list = e.records || []
                if (this.list.length == e.total) {
                    this.status = 'noMore'
@@ -161,16 +199,58 @@
            })
        },
        methods: {
            fetchList(params,callback) {
            fetchList(params, callback) {
                if (this.status == 'loading') return
                this.status = 'loading'
                getList(params).then(res=>{
                getList(params).then(res => {
                    if (res.code == 200) {
                        res.data.records.map(item=>{
                            item.images = item.images.split(',')
                        res.data.records.map(item => {
                            if (item.images) {
                                item.images = item.images.split(',')
                            }
                        })
                        callback(res.data)
                    }
                })
            },
            // 添加办理进度
            addProgress(id) {
                uni.navigateTo({
                    url: `/pages/progress/progress?id=${id}`
                })
            },
            // 办理结果录入
            addResult(id) {
                uni.navigateTo({
                    url: `/pages/result-entry/index?id=${id}`
                })
            },
            // 切换状态筛选
            changeType(type) {
                this.searchParams = {
                    pageNum: 1,
                    pageSize: 10,
                    type, //全部:不传,上报待审核:0,正在办理:1, 办结:2
                }
                this.fetchList(this.searchParams, (e) => {
                    this.list = e.records || []
                    if (this.list.length == e.total) {
                        this.status = 'noMore'
                    } else {
                        this.status = 'loadMore'
                    }
                })
            },
            // 预览图片
            previewImage(list, index) {
                uni.previewImage({
                    urls: list,
                    current: index,
                });
            },
            toDetail(item) {
                uni.navigateTo({
                    url: `/pages/work-detail/work-detail?id=${item.id}`
                })
            }
        }
@@ -179,7 +259,7 @@
<style scoped lang="scss">
    .content {
        min-height: 100vh;
        height: 100%;
        background-color: #f7f7f7;
    }
@@ -236,6 +316,10 @@
        color: #fff;
    }
    .color9 {
        color: #999999;
    }
    .bgColor1 {
        background: linear-gradient(270deg, #FFB318 0%, #FF330D 100%);
        width: 58rpx;
@@ -268,6 +352,10 @@
        background: linear-gradient(270deg, #FC8D55 0%, #FF4948 100%);
    }
    .bgColor7 {
        background: #FF4948;
    }
    .border1 {
        border-top: 2rpx solid #EDEEEF;
        position: relative;
H5/pages/problemReporting/problemReporting.vue
@@ -7,7 +7,7 @@
            </view>
            <view class="address">
                <view class="adr">{{detail.detailedAddress || ''}}</view>
                <view class="adr">{{detail.location || ''}}</view>
                <image src="/static/position@2x.png" class="w-31 h-31" mode="aspectFill"></image>
            </view>
@@ -63,7 +63,7 @@
            };
        },
        onLoad(option) {
            option.id = 1
            // option.id = 1
            if (option.id) {
                this.id = option.id
                getDetail({
@@ -88,7 +88,9 @@
                        })
                        setTimeout(() => {
                            uni.navigateBack()
                            uni.navigateBack({
                                delta: 2
                            })
                        }, 1500)
                    }
                })
H5/pages/result-entry/index.vue
@@ -9,7 +9,7 @@
                    </view>
                </view>
                <view class="mx-13 mt-33 pt-35 pb-33 px-27 br-19 flex a-center j-between bgcolor1">
                    <view class="fs-27 lh-38 color2">{{ info.detailedAddress }}</view>
                    <view class="fs-27 lh-38 color2">{{ info.location }}</view>
                    <image src="@/static/detailImg/dwei.png" class="w-31 h-31 shrink0" />
                </view>
                <view v-if="!unfoldFlag" class="flex a-center j-between mt-31 mx-13">
@@ -77,14 +77,15 @@
                    </view>
                </view>
            </view>
            <view @tap="unfold" class="bgcolor3 absolute w-100 txt-center"
                style="bottom:-58rpx;left: 50%;transform: translate(-50%,-50%);">
                <image src="/static/location/back.png" class="h-23 w-15" style="transform: rotate(-90deg);" />
            <view @tap="unfold" class="absolute" style="bottom:-90rpx;left: 50%;transform: translate(-50%,-50%);">
                <image v-if="!unfoldFlag" src="@/static/unfold.png" class="h-54 w-156" />
                <image v-if="unfoldFlag" src="@/static/packUp.png" class="h-54 w-156" />
            </view>
        </view>
        <view class="br-19 mt-76 bs-1 pt-35 pb-33">
            <view class="fs-27 lh-38 font-bold ml-31">处理状态</view>
            <view @tap="showList = true" class="br-15 py-15 pl-31 mx-31 pr-27 mt-27 flex j-between a-center border2" :class="(rulsFlag && !status) && 'bgcolor-border'">
            <view @tap="showList = true" class="br-15 py-15 pl-31 mx-31 pr-27 mt-27 flex j-between a-center border2"
                :class="(rulsFlag && !status) && 'bgcolor-border'">
                <view :class="!status && 'color6'">{{ status ? status : '请选择当前处理状态' }}</view>
                <image src="/static/location/back.png" class="h-23 w-15" style="transform: rotate(-90deg);" />
            </view>
@@ -174,126 +175,186 @@
</template>
<script>
import { saveResult, getComplaintDetail } from './service'
import config from '@/config/index.js'
export default {
    data() {
        return {
            showList: false,
            columns: [['已办结', '群众撤销']],
            unfoldFlag: false, //是否展开
            id: '',//诉求id
            info: {},//工单详情
            completionDescription: '',//办结结果描述
            localImageUrls: [], //本地回显的图片
            completionImages: [],//办结结果图片
            completionOtherDescription: '',//其他说明
            completionVideos: [],//办结结果视频
            status: '',//处理状态
            againCklicFlag: true,
            rulsFlag: false,
        }
    },
    onLoad(params) {
        this.id = params.id
        getComplaintDetail({ id: params.id }).then(res => {
            this.info = res.data
        })
    },
    methods: {
        submit() {
            if (!this.status) {
                this.rulsFlag = true
                return uni.showToast({
                    title: '请选择当前处理状态',
                    icon: 'none',
                    mask: true
                })
    import {
        saveResult,
        getComplaintDetail
    } from './service'
    import config from '@/config/index.js'
    export default {
        data() {
            return {
                showList: false,
                columns: [
                    ['已办结', '群众撤销']
                ],
                unfoldFlag: false, //是否展开
                id: '', //诉求id
                info: {}, //工单详情
                completionDescription: '', //办结结果描述
                localImageUrls: [], //本地回显的图片
                completionImages: [], //办结结果图片
                completionOtherDescription: '', //其他说明
                completionVideos: [], //办结结果视频
                status: '', //处理状态
                againCklicFlag: true,
                rulsFlag: false,
            }
            if (!this.completionDescription) {
                this.rulsFlag = true
                return uni.showToast({
                    title: '请填写办结结果描述',
                    icon: 'none',
                    mask: true
                })
            }
            if (this.completionImages.length == 0) {
                return uni.showToast({
                    title: '请上传办结结果图片',
                    icon: 'none',
                    mask: true
                })
            }
            if (this.completionVideos.length == 0) {
                return uni.showToast({
                    title: '请上传办结结果视频',
                    icon: 'none',
                    mask: true
                })
            }
            saveResult({
                id: this.id,
                status: this.status == '已办结' ? 3 : 4,
                completionDescription: this.completionDescription,
                completionImages: this.completionImages.join(','),
                completionOtherDescription: this.completionOtherDescription,
                completionVideos: this.completionVideos.join(',')
        },
        onLoad(params) {
            this.id = params.id
            getComplaintDetail({
                id: params.id
            }).then(res => {
                if (res.code == 200) {
                    uni.showToast({
                        title: '提交成功',
                        icon: 'success',
                        mask: true
                    })
                    setTimeout(() => {
                        uni.navigateBack()
                    }, 1500)
                } else {
                    uni.showToast({
                        title: res.msg,
                this.info = res.data
            })
        },
        methods: {
            submit() {
                if (!this.status) {
                    this.rulsFlag = true
                    return uni.showToast({
                        title: '请选择当前处理状态',
                        icon: 'none',
                        mask: true
                    })
                }
            })
        },
        confirm({ value }) {
            this.status = value[0]
            this.showList = false
        },
        cancel() {
            this.showList = false
        },
        unfold() {
            this.unfoldFlag = !this.unfoldFlag
        },
        delImg(item) {
            this.localImageUrls = this.localImageUrls.filter(i => i != item)
            this.completionImages = this.completionImages.filter(i => i != item)
        },
        delVideo(item) {
            this.completionVideos = this.completionVideos.filter(i => i != item)
        },
        viewImage(item) {
            uni.previewImage({
                urls: [item]
            })
        },
        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) {
                if (!this.completionDescription) {
                    this.rulsFlag = true
                    return uni.showToast({
                        title: '请填写办结结果描述',
                        icon: 'none',
                        mask: true
                    })
                }
                if (this.completionImages.length == 0) {
                    return uni.showToast({
                        title: '请上传办结结果图片',
                        icon: 'none',
                        mask: true
                    })
                }
                if (this.completionVideos.length == 0) {
                    return uni.showToast({
                        title: '请上传办结结果视频',
                        icon: 'none',
                        mask: true
                    })
                }
                saveResult({
                    id: this.id,
                    status: this.status == '已办结' ? 3 : 4,
                    completionDescription: this.completionDescription,
                    completionImages: this.completionImages.join(','),
                    completionOtherDescription: this.completionOtherDescription,
                    completionVideos: this.completionVideos.join(',')
                }).then(res => {
                    if (res.code == 200) {
                        uni.showToast({
                            title: '提交成功',
                            icon: 'success',
                            mask: true
                        })
                        setTimeout(() => {
                            uni.navigateBack()
                        }, 1500)
                    } else {
                        uni.showToast({
                            title: res.msg,
                            icon: 'none',
                            mask: true
                        })
                    }
                })
            },
            confirm({
                value
            }) {
                this.status = value[0]
                this.showList = false
            },
            cancel() {
                this.showList = false
            },
            unfold() {
                this.unfoldFlag = !this.unfoldFlag
            },
            delImg(item) {
                this.localImageUrls = this.localImageUrls.filter(i => i != item)
                this.completionImages = this.completionImages.filter(i => i != item)
            },
            delVideo(item) {
                this.completionVideos = this.completionVideos.filter(i => i != item)
            },
            viewImage(item) {
                uni.previewImage({
                    urls: [item]
                })
            },
            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({
                                    url: config.imageUrl,
                                    filePath: imgPathList[0],
                                    timeout: 1000 * 45,
                                    name: 'file',
                                    header: {
                                        Authorization: config.uploadToken
                                    },
                                    success: (res) => {
                                        if (JSON.parse(res.data).code == 200) {
                                            this.completionImages = this.completionImages.filter(
                                                item => item !=
                                                'loading')
                                            this.$nextTick(() => {
                                                this.completionImages.push(JSON.parse(res
                                                        .data)
                                                    .data)
                                                this.localImageUrls.push(imgPathList[0])
                                            })
                                        } else {
                                            this.againCklicFlag = true
                                            this.completionImages = this.completionImages.filter(
                                                item => item != 'loading')
                                            uni.showToast({
                                                title: '上传失败,请重新上传',
                                                icon: 'none',
                                                mask: true
                                            })
                                        }
                                    },
                                    fail: (err) => {
                                        this.againCklicFlag = true
                                        this.completionImages = this.completionImages.filter(
                                            item => item != 'loading')
                                        uni.showToast({
                                            title: '上传失败,请重新上传',
                                            icon: 'none',
                                            mask: true
                                        })
                                    }
                                })
                            }
                        },
                    })
                } else {
                    uni.chooseVideo({
                        camera: 'back',
                        success: (res) => {
                            this.completionVideos.push('loading')
                            this.againCklicFlag = true
                            const tempFilePath = res.tempFilePath;
                            uni.uploadFile({
                                url: config.imageUrl,
                                filePath: imgPathList[0],
                                filePath: tempFilePath,
                                timeout: 1000 * 45,
                                name: 'file',
                                header: {
@@ -301,16 +362,16 @@
                                },
                                success: (res) => {
                                    if (JSON.parse(res.data).code == 200) {
                                        this.completionImages = this.completionImages.filter(item => item !=
                                        this.completionVideos = this.completionVideos.filter(
                                            item => item !=
                                            'loading')
                                        this.$nextTick(() => {
                                            this.completionImages.push(JSON.parse(res.data)
                                            this.completionVideos.push(JSON.parse(res.data)
                                                .data)
                                            this.localImageUrls.push(imgPathList[0])
                                        })
                                    } else {
                                        this.againCklicFlag = true
                                        this.completionImages = this.completionImages.filter(
                                        this.completionVideos = this.completionVideos.filter(
                                            item => item != 'loading')
                                        uni.showToast({
                                            title: '上传失败,请重新上传',
@@ -321,7 +382,7 @@
                                },
                                fail: (err) => {
                                    this.againCklicFlag = true
                                    this.completionImages = this.completionImages.filter(
                                    this.completionVideos = this.completionVideos.filter(
                                        item => item != 'loading')
                                    uni.showToast({
                                        title: '上传失败,请重新上传',
@@ -331,195 +392,117 @@
                                }
                            })
                        }
                    },
                    })
                }
            },
            // 去大屏播放视频
            openVideo(url) {
                uni.navigateTo({
                    url: `/pages/work-detail/maxVideo?url=${url}`
                })
            } else {
                uni.chooseVideo({
                    camera: 'back',
                    success: (res) => {
                        this.completionVideos.push('loading')
                        this.againCklicFlag = true
                        const tempFilePath = res.tempFilePath;
                        uni.uploadFile({
                            url: config.imageUrl,
                            filePath: tempFilePath,
                            timeout: 1000 * 45,
                            name: 'file',
                            header: {
                                Authorization: config.uploadToken
                            },
                            success: (res) => {
                                if (JSON.parse(res.data).code == 200) {
                                    this.completionVideos = this.completionVideos.filter(item => item !=
                                        'loading')
                                    this.$nextTick(() => {
                                        this.completionVideos.push(JSON.parse(res.data).data)
                                    })
                                } else {
                                    this.againCklicFlag = true
                                    this.completionVideos = this.completionVideos.filter(
                                        item => item != 'loading')
                                    uni.showToast({
                                        title: '上传失败,请重新上传',
                                        icon: 'none',
                                        mask: true
                                    })
                                }
                            },
                            fail: (err) => {
                                this.againCklicFlag = true
                                this.completionVideos = this.completionVideos.filter(
                                    item => item != 'loading')
                                uni.showToast({
                                    title: '上传失败,请重新上传',
                                    icon: 'none',
                                    mask: true
                                })
                            }
                        })
                    }
                })
            }
        },
        // 去大屏播放视频
        openVideo(url) {
            uni.navigateTo({
                url: `/pages/work-detail/maxVideo?url=${url}`
            })
        },
            },
        }
    }
}
</script>
<style scoped lang="scss">
.bs-1 {
    box-shadow: 0rpx 0rpx 27rpx 0rpx rgba(0, 0, 0, 0.1);
}
.color1 {
    color: #FF4948;
}
.color2 {
    color: rgba(0, 0, 0, .8);
}
.color3 {
    color: #FAAD14;
}
.color4 {
    color: #FFFFFF;
}
.color5 {
    color: #FC8D55;
}
.color6 {
    color: rgba(0, 0, 0, 0.24);
}
.color99 {
    color: #FB9A0E;
}
.bgcolor-border {
    background: rgba(255, 253, 241, 1) !important;
    border: 2rpx solid #FFE58F !important;
}
.bgcolor1 {
    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%);
}
.bgcolor2 {
    background: linear-gradient(180deg, #FFDCDB 0%, rgba(255, 255, 255, 0) 91rpx);
}
.bgcolor3 {
    background: #FFFBE6;
}
.bgcolor4 {
    background: #F8F8F8;
}
.bgcolor5 {
    background: rgba(0, 0, 0, .23);
}
.bgcolor6 {
    background: linear-gradient(270deg, #FC8D55 0%, #FF4948 100%);
}
.bgcolor7 {
    background-color: rgba(252, 141, 85, 1);
}
.bgcolor8 {
    background: #FFFBE6;
}
.border1 {
    border: 2rpx solid #FFF1B8;
}
.border2 {
    border: 2rpx solid rgba(0, 0, 0, 0.15);
}
.safe-box {
    height: env(safe-area-inset-bottom);
}
.line-box {
    box-shadow: 0rpx 0rpx 27rpx 0rpx rgba(0, 0, 0, 0.1);
    height: 2rpx;
    background: rgba(0, 10, 26, 0.07);
}
.transition-h {
    transition: max-height 0.5s ease-out;
}
.max-300 {
    max-height: 300rpx;
}
.max-9999 {
    max-height: 9999rpx;
}
.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;
    margin-top: 19rpx;
    .video {
        z-index: 999;
        width: 140rpx;
        height: 140rpx;
    .bs-1 {
        box-shadow: 0rpx 0rpx 27rpx 0rpx rgba(0, 0, 0, 0.1);
    }
}
.imgOrVedio {
    margin-right: 17rpx;
    position: relative;
    .color1 {
        color: #FF4948;
    }
    .img {
        width: 140rpx;
        height: 140rpx;
        border-radius: 8rpx;
        margin-top: 19rpx;
    .color2 {
        color: rgba(0, 0, 0, .8);
    }
    .color3 {
        color: #FAAD14;
    }
    .color4 {
        color: #FFFFFF;
    }
    .color5 {
        color: #FC8D55;
    }
    .color6 {
        color: rgba(0, 0, 0, 0.24);
    }
    .color99 {
        color: #FB9A0E;
    }
    .bgcolor-border {
        background: rgba(255, 253, 241, 1) !important;
        border: 2rpx solid #FFE58F !important;
    }
    .bgcolor1 {
        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%);
    }
    .bgcolor2 {
        background: linear-gradient(180deg, #FFDCDB 0%, rgba(255, 255, 255, 0) 91rpx);
    }
    .bgcolor3 {
        background: #FFFBE6;
    }
    .bgcolor4 {
        background: #F8F8F8;
    }
    .bgcolor5 {
        background: rgba(0, 0, 0, .23);
    }
    .bgcolor6 {
        background: linear-gradient(270deg, #FC8D55 0%, #FF4948 100%);
    }
    .bgcolor7 {
        background-color: rgba(252, 141, 85, 1);
    }
    .bgcolor8 {
        background: #FFFBE6;
    }
    .border1 {
        border: 2rpx solid #FFF1B8;
    }
    .border2 {
        border: 2rpx solid rgba(0, 0, 0, 0.15);
    }
    .safe-box {
        height: env(safe-area-inset-bottom);
    }
    .line-box {
        box-shadow: 0rpx 0rpx 27rpx 0rpx rgba(0, 0, 0, 0.1);
        height: 2rpx;
        background: rgba(0, 10, 26, 0.07);
    }
    .transition-h {
        transition: max-height 0.8s cubic-bezier(0.25, 0.8, 0.25, 1);
    }
    .max-300 {
        max-height: 300rpx;
    }
    .max-9999 {
        max-height: 9999rpx;
    }
    .videoOpen {
@@ -533,6 +516,7 @@
        display: flex;
        align-items: center;
        justify-content: center;
        margin-top: 19rpx;
        .video {
            z-index: 999;
@@ -540,40 +524,70 @@
            height: 140rpx;
        }
    }
}
.videoImg {
    width: 140.38rpx;
    height: 140.38rpx;
    border-radius: 7.69rpx;
    position: relative;
}
    .imgOrVedio {
        margin-right: 17rpx;
        position: relative;
#myVideo {
    z-index: 1;
}
        .img {
            width: 140rpx;
            height: 140rpx;
            border-radius: 8rpx;
            margin-top: 19rpx;
        }
.zIndex999 {
    z-index: 999;
}
        .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;
/deep/.u-popup__content {
    border-radius: 16rpx 16rpx 0rpx 0rpx;
}
            .video {
                z-index: 999;
                width: 140rpx;
                height: 140rpx;
            }
        }
    }
/deep/ .u-toolbar {
    border-bottom: 2rpx solid RGBA(243, 243, 243, 1);
}
    .videoImg {
        width: 140.38rpx;
        height: 140.38rpx;
        border-radius: 7.69rpx;
        position: relative;
    }
/deep/ .u-toolbar__wrapper__cancel {
    font-weight: 400;
    font-size: 30rpx;
    color: #FF4948 !important;
}
    #myVideo {
        z-index: 1;
    }
/deep/ .u-toolbar__wrapper__confirm {
    font-weight: 400;
    font-size: 30rpx;
    color: #FF4948 !important;
}
    .zIndex999 {
        z-index: 999;
    }
    /deep/.u-popup__content {
        border-radius: 16rpx 16rpx 0rpx 0rpx;
    }
    /deep/ .u-toolbar {
        border-bottom: 2rpx solid RGBA(243, 243, 243, 1);
    }
    /deep/ .u-toolbar__wrapper__cancel {
        font-weight: 400;
        font-size: 30rpx;
        color: #FF4948 !important;
    }
    /deep/ .u-toolbar__wrapper__confirm {
        font-weight: 400;
        font-size: 30rpx;
        color: #FF4948 !important;
    }
</style>
H5/pages/work-detail/postpone-apply.vue
@@ -1,64 +1,81 @@
<template>
    <view class="px-31 pt-38">
        <view class="br-19 bs-1 pt-21 pb-35 px-27 bgcolor2">
        <view v-if="Object.keys(info).length != 0" class="br-19 bs-1 pt-21 pb-35 px-27 bgcolor2">
            <view class="flex a-center j-between fs-23 lh-33 font-bold">
                <view>诉求号:7843523454</view>
                <view class="color1">正在办理</view>
                <view>诉求号:{{ info.serialNumber }}</view>
                <view class="color1">{{ ["正在办理", "延期办理", "超时办理", "已办结", "群众撤销", "上报待审核", "上级驳回"][info.status] }}</view>
            </view>
            <view class="mx-13 mt-33 pt-35 pb-33 px-27 br-19 flex a-center j-between bgcolor1">
                <view class="fs-27 lh-38 color2">江苏省常州市溧阳市牛顿大道172号</view>
                <view class="fs-27 lh-38 color2">{{ info.location|'' }}</view>
                <image src="@/static/detailImg/dwei.png" class="w-31 h-31 shrink0" />
            </view>
            <view class="flex a-center j-between mt-31 mx-13">
                <view class="flex-column a-center">
                    <view class="fs-27 lh-38 font-bold">问题类型</view>
                    <view class="mt-8 fs-23 lh-42 txt-center px-31 font-w400 color3 bgcolor3 border1">教育</view>
                    <view class="mt-8 fs-23 lh-42 txt-center px-31 font-w400 color3 bgcolor3 border1">
                        {{ info.problemType }}
                    </view>
                </view>
                <view class="flex-column a-center">
                    <view class="fs-27 lh-38 font-bold">群众</view>
                    <view class="fs-27 lh-38 mt-10">沙振</view>
                    <view class="fs-27 lh-38 mt-10">{{ info.name }}</view>
                </view>
                <view class="flex-column a-center">
                    <view class="fs-27 lh-38 font-bold">联系电话</view>
                    <view class="fs-27 lh-38 mt-10">14225874426</view>
                    <view class="fs-27 lh-38 mt-10">{{ info.contactNumber }}</view>
                </view>
            </view>
        </view>
        <view class="br-19 mt-38 bs-1 pt-35 pb-33 px-31">
            <view class="fs-27 lh-38 font-bold">办理进度描述</view>
            <textarea class="pt-25 pl-31 mt-27 fs-27 br-8 bgcolor4" style="height: 365rpx;" placeholder="请输入办理进度描述" />
            <view class="fs-27 lh-38 font-bold">延期申请说明</view>
            <textarea v-model="describe" class="pt-25 pl-31 mt-27 fs-27 br-8 bgcolor4"
                :class="(rulsFlag && !describe) && 'bgcolor-border'" style="height: 365rpx;width: calc(100% - 31rpx);"
                placeholder="请输入延期申请说明" />
            <view v-if="rulsFlag && !describe" class="flex a-center mt-19">
                <image src="@/static/noNull.png" class="w-35 h-35 mr-13 shrink0" />
                <view class="fs-23 color99">请输入延期申请说明</view>
            </view>
            <view class="fs-27 mt-38 lh-38 font-bold">图片</view>
            <view class="flex wrap mt-27">
                <view class="relative mr-15" v-for="item in 4" :key="item">
                    <image src="/static/logo.png" class="w-140 h-140 shrink0 br-8" />
                    <view class="absolute w-140 h-140 bgcolor5 top0 left0 br-8">
                        <view class="absolute" style="top: 50%;left: 50%;transform: translate(-50%,-50%);">
                            <image @tap="viewImage(item)" src="@/static/Appeal/amplify.png" class="w-19 h-19 mr-35"
                                mode="" />
                            <image src="@/static/Appeal/trash.png" class="w-19 h-19" />
                <view class="relative mr-15" v-for="(item, index) in localImageUrls" :key="index">
                    <image v-if="item != 'loading'" :src="item" class="w-140 h-140 shrink0 br-8" />
                    <view v-if="item != 'loading'" class="absolute w-140 h-140 bgcolor5 top0 left0 br-8">
                        <view class="absolute flex a-center j-between px-34"
                            style="top: 50%;left: 50%;transform: translate(-50%,-50%);width: calc(100% - 68rpx);">
                            <image @tap="viewImage(item)" src="@/static/Appeal/amplify.png" class="w-19 h-19" />
                            <image @tap="delImg(item)" src="@/static/Appeal/trash.png" class="w-19 h-19" />
                        </view>
                    </view>
                </view>
                <image src="/static/Appeal/add.png" class="w-140 h-140 shrink0" />
                <view v-if="imgUrls.includes('loading')" class="w-140 h-140 flex a-center j-center mr-15 border2 br-8">
                    <u-loading-icon></u-loading-icon>
                </view>
                <image @tap="uploadImg(1)" src="/static/Appeal/add.png" class="w-140 h-140 shrink0" />
            </view>
            <view class="fs-27 mt-37 lh-38 font-bold">视频</view>
            <view class="flex wrap mt-27">
                <view class="relative mr-15" v-for="item in 4" :key="item">
                    <image src="@/static/logo.png" class="w-140 h-140 shrink0 br-8" />
                    <view class="absolute w-140 h-140 bgcolor5 top0 left0 br-8">
                        <view class="absolute" style="top: 50%;left: 50%;transform: translate(-50%,-50%);">
                            <image @tap="viewImage(item)" src="@/static/Appeal/amplify.png" class="w-19 h-19 mr-35"
                                mode="" />
                            <image src="@/static/Appeal/trash.png" class="w-19 h-19" />
                <view class="imgOrVedio" v-for="(ite, ind) in video" :key="ind">
                    <video v-if="ite != 'loading'" id="myVideo" class="videoImg shrink0" disabled :controls="false"
                        :show-center-play-btn="false" :src="ite">
                    </video>
                    <view v-if="ite != 'loading'" class="absolute w-140 h-140 bgcolor5 top0 left0 br-8 zIndex999">
                        <view class="absolute flex a-center j-between"
                            style="top: 50%;left: 50%;transform: translate(-50%,-50%);">
                            <image @tap="openVideo(ite)" src="@/static/detailImg/open.png" class="w-140 h-140" />
                        </view>
                        <image @tap="delVideo(ite)" src="@/static/Appeal/trash.png" class="absolute w-19 h-19 zIndex999"
                            style="top: 8rpx;right: 8rpx;" />
                    </view>
                </view>
                <image src="@/static/Appeal/add.png" class="w-140 h-140 shrink0" />
                <view v-if="video.includes('loading')" class="w-140 h-140 flex a-center j-center mr-15 border2 br-8">
                    <u-loading-icon></u-loading-icon>
                </view>
                <image @tap="uploadImg(2)" src="@/static/Appeal/add.png" class="w-140 h-140 shrink0" />
            </view>
        </view>
        <view class="mt-38 fs-35 lh-96 br-48 txt-center font-bold bgcolor6 color4">提交延期申请</view>
        <view @click.stop="submit" class="mt-38 fs-35 lh-96 br-48 txt-center font-bold bgcolor6 color4">提交延期申请
        </view>
        <view class="safe-box"></view>
        <u-popup round="19rpx" :show="showPop" mode="center" @close="close" @open="open">
            <view class="popup-content">
                <view class="title-pop">确认操作</view>
@@ -67,7 +84,7 @@
                </view>
                <view class="botton-btn">
                    <view class="cancle" @click.stop="showPop=false">取消</view>
                    <view class="sure" @click.stop="submitReject">确认</view>
                    <view class="sure" @click.stop="sureSubmit()">确认</view>
                </view>
            </view>
        </u-popup>
@@ -75,24 +92,204 @@
</template>
<script>
    import {
        saveProcess,
        getComplaintDetail
    } from './service'
    import config from '@/config/index.js'
    export default {
        data() {
            return {
                showPop: true,
                complaintId: '', //诉求id
                info: {}, //工单详情
                describe: '', //办理进度描述
                localImageUrls: [], //本地回显的图片
                imgUrls: [], //传给后端的url
                video: [],
                againCklicFlag: true,
                rulsFlag: false,
                showPop: false,
            }
        },
        onLoad(params) {
            this.complaintId = params.id
            getComplaintDetail({
                id: params.id
            }).then(res => {
                this.info = res.data
            })
        },
        methods: {
            close() {
            submit() {
                if (!this.describe) {
                    this.rulsFlag = true
                    return uni.showToast({
                        icon: 'none',
                        title: '请输入办理进度描述'
                    })
                }
                if (this.imgUrls.length == 0) {
                    return uni.showToast({
                        icon: 'none',
                        title: '请上传图片'
                    })
                }
                if (this.video.length == 0) {
                    return uni.showToast({
                        icon: 'none',
                        title: '请上传视频'
                    })
                }
                this.showPop = true
            },
            open() {
            sureSubmit() {
                let obj = {
                    complaintId: this.complaintId,
                    comment: this.describe,
                    images: this.imgUrls.join(','),
                    videos: this.video.join(',')
                }
                saveProcess(obj).then(res => {
                    if (res.code == 200) {
                        uni.showToast({
                            title: '提交成功',
                            icon: 'success',
                            mask: true
                        })
                        setTimeout(() => {
                            uni.navigateBack({
                                delta: 2
                            })
                        }, 1500)
                    } else {
                        uni.showToast({
                            title: res.msg,
                            icon: 'none',
                            mask: true
                        })
                    }
                })
            },
            delImg(item) {
                this.localImageUrls = this.localImageUrls.filter(i => i != item)
                this.imgUrls = this.imgUrls.filter(i => i != item)
            },
            delVideo(item) {
                this.video = this.video.filter(i => i != item)
            },
            viewImage(item) {
                uni.previewImage({
                    urls: [require('@/static/logo.png')]
                    urls: [item]
                })
            }
            },
            uploadImg(type) {
                if (!this.againCklicFlag) return
                this.againCklicFlag = false
                if (type == 1) {
                    uni.chooseImage({
                        count: 1,
                        success: (chooseImageRes) => {
                            this.imgUrls.push('loading')
                            this.againCklicFlag = true
                            let imgPathList = chooseImageRes.tempFilePaths;
                            if (imgPathList.length > 0) {
                                uni.uploadFile({
                                    url: config.imageUrl,
                                    filePath: imgPathList[0],
                                    timeout: 1000 * 45,
                                    name: 'file',
                                    header: {
                                        Authorization: config.uploadToken
                                    },
                                    success: (res) => {
                                        if (JSON.parse(res.data).code == 200) {
                                            this.imgUrls = this.imgUrls.filter(item => item !=
                                                'loading')
                                            this.$nextTick(() => {
                                                this.imgUrls.push(JSON.parse(res.data)
                                                    .data)
                                                this.localImageUrls.push(imgPathList[0])
                                            })
                                        } else {
                                            this.againCklicFlag = true
                                            this.imgUrls = this.imgUrls.filter(
                                                item => item != 'loading')
                                            uni.showToast({
                                                title: '上传失败,请重新上传',
                                                icon: 'none',
                                                mask: true
                                            })
                                        }
                                    },
                                    fail: (err) => {
                                        this.againCklicFlag = true
                                        this.imgUrls = this.imgUrls.filter(
                                            item => item != 'loading')
                                        uni.showToast({
                                            title: '上传失败,请重新上传',
                                            icon: 'none',
                                            mask: true
                                        })
                                    }
                                })
                            }
                        },
                    })
                } else {
                    uni.chooseVideo({
                        camera: 'back',
                        success: (res) => {
                            this.video.push('loading')
                            this.againCklicFlag = true
                            const tempFilePath = res.tempFilePath;
                            uni.uploadFile({
                                url: config.imageUrl,
                                filePath: tempFilePath,
                                timeout: 1000 * 45,
                                name: 'file',
                                header: {
                                    Authorization: config.uploadToken
                                },
                                success: (res) => {
                                    if (JSON.parse(res.data).code == 200) {
                                        this.video = this.video.filter(item => item !=
                                            'loading')
                                        this.$nextTick(() => {
                                            this.video.push(JSON.parse(res.data).data)
                                        })
                                    } else {
                                        this.againCklicFlag = true
                                        this.video = this.video.filter(
                                            item => item != 'loading')
                                        uni.showToast({
                                            title: '上传失败,请重新上传',
                                            icon: 'none',
                                            mask: true
                                        })
                                    }
                                },
                                fail: (err) => {
                                    this.againCklicFlag = true
                                    this.video = this.video.filter(
                                        item => item != 'loading')
                                    uni.showToast({
                                        title: '上传失败,请重新上传',
                                        icon: 'none',
                                        mask: true
                                    })
                                }
                            })
                        }
                    })
                }
            },
            // 去大屏播放视频
            openVideo(url) {
                uni.navigateTo({
                    url: `/pages/work-detail/maxVideo?url=${url}`
                })
            },
        }
    }
</script>
@@ -150,6 +347,52 @@
        height: env(safe-area-inset-bottom);
    }
    .imgOrVedio {
        margin-right: 17rpx;
        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;
            }
        }
    }
    .videoImg {
        width: 140.38rpx;
        height: 140.38rpx;
        border-radius: 7.69rpx;
        position: relative;
    }
    #myVideo {
        z-index: 1;
    }
    .zIndex999 {
        z-index: 999;
    }
    .popup-content {
        background: url('/static/pop@2x.png') no-repeat center center;
        width: 576.92rpx;
H5/pages/work-detail/service.js
@@ -1,17 +1,29 @@
import request from '@/utils/request.js'
export const list = (params) => {
    return request.post(`/api/huacheng-sangeshenbian/applet/complaint/list`, params)
}
// 党员端
// 党员端-工单详情
export const workOrderDetail = (params) => {
    return request.get(`/api/huacheng-sangeshenbian/applet/complaint/detail`, params)
}
//获取三个身边当前用户信息 用于判断用户是否是上级
export const getUserInfo = (params) => {
    return request.get(`/api/huacheng-sangeshenbian/applet/home/current-user-info`, params)
}
// 问题上报审核
export const reportAudit = (params) => {
    return request.post(`/api/huacheng-sangeshenbian/applet/complaint/reportAudit`, params, )
}
// 上级端
// 延期申请
export const saveProcess = (params) => {
    return request.post(`/api/huacheng-sangeshenbian/applet/complaint/saveDelay`, params, )
}
// 延期申请审核
export const delayAudit = (params) => {
    return request.post(`/api/huacheng-sangeshenbian/applet/complaint/delayAudit`, params, )
}
// 上级端-秒杀商品列表
export const getHomeGoodsSeckillVOList = (params) => {
    return request.post(`/goods/forepart/goods-seckill/getHomeGoodsSeckillVOList`, params)
// 工单详情
export const getComplaintDetail = (params) => {
    return request.get('/api/huacheng-sangeshenbian/applet/complaint/detail', params)
}
H5/pages/work-detail/work-detail.vue
@@ -1,17 +1,18 @@
<template>
    <view class="content">
        <u-navbar title="诉求详情" :bgColor="scoreTopHeight>300?'#ffffff':'transparent'" autoBack>
        <u-navbar title="诉求详情" :bgColor="scoreTopHeight>100?'#ffffff':'transparent'" autoBack>
        </u-navbar>
        <view class="topColor">
        </view>
        <view class="allContent">
            <view class="topStatus">
                <view class="status">{{['正在办理','延期办理','超时办理','已办结 ','群众撤销','上报待审核','上级驳回'][orderInfo.status] ||''}}
                <view class="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">
                    <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>
@@ -19,7 +20,7 @@
                    <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">12</view>
                        <view class="day">{{orderInfo.createByName||0}}</view>
                        <view class="overTime">天</view>
                    </view>
@@ -28,7 +29,7 @@
            <!-- 已完结诉求信息   已办结-->
            <view class="mt-19 flex a-center j-between topMore" v-if="orderInfo.status==3">
                <view class="name">诉求信息</view>
                <view class="flex a-center">
                <view class="flex a-center" @click.stop="toProgressDetail">
                    <view class="more">办理进度</view>
                    <image src="../../static/detailImg/right1.png" class="moreIcon shrink0"></image>
                </view>
@@ -40,7 +41,7 @@
            </view>
            <!-- 上报后的状态 -->
            <view class="card1" v-if="orderInfo.status==6 ||orderInfo.status==5 ">
            <view class="card1" v-if="[6,7,5].includes(orderInfo.status)">
                <!-- 上报上级上级驳回-->
                <view class="flex j-between" v-if="orderInfo.status==6">
                    <view class="flex flex-column a-center  mr-46">
@@ -51,43 +52,43 @@
                    <view class="infoCard mb-46">
                        <view class="flex j-between">
                            <view class="label">审核时间</view>
                            <view class="value">张三</view>
                            <view class="value">{{orderInfo.auditTime|formatTime}}</view>
                        </view>
                        <view class="flex j-between">
                            <view class="label">审核人</view>
                            <view class="value">13987654321</view>
                            <view class="value">{{orderInfo.auditorName||''}}</view>
                        </view>
                        <view class="flex j-between">
                            <view class="label">联系电话</view>
                            <view class="value">XXXXXXX部门</view>
                            <view class="value">{{orderInfo.auditorPhone||''}}</view>
                        </view>
                        <view class="flex j-between">
                            <view class="label">驳回原因</view>
                            <view class="value">上报说明上报说明上报说明上报上报说明上报说明上报说明上报上报说明上报说明上报说明上报</view>
                            <view class="value">{{orderInfo.rejectReason||''}}</view>
                        </view>
                    </view>
                </view>
                <!-- 上报待上级审核--待审核状态显示 -->
                <view class="flex j-between">
                    <view class="flex flex-column j-center  mr-46">
                    <view class="flex flex-column   mr-46">
                        <image src="../../static/detailImg/Ovaled.png" class="topIcon shrink0"></image>
                    </view>
                    <view class="infoCard">
                        <view class="flex j-between">
                            <view class="label">上报人</view>
                            <view class="value">{{orderInfo.reportName||''}}</view>
                            <view class="value">{{orderInfo.reporter||''}}</view>
                        </view>
                        <view class="flex j-between">
                            <view class="label">联系电话</view>
                            <view class="value">{{orderInfo.contactNumber||''}}</view>
                        </view>
                        <view class="flex j-between">
                        <view class="flex j-between" v-if="!isParty">
                            <view class="label">所属部门</view>
                            <view class="value">{{orderInfo.departmentName||""}}</view>
                        </view>
                        <view class="flex j-between">
                            <view class="label">上报时间</view>
                            <view class="value">{{orderInfo.reportTime||''}}</view>
                            <view class="value">{{orderInfo.reportTime|formatTime}}</view>
                        </view>
                        <view class="flex j-between">
                            <view class="label">上报说明</view>
@@ -107,12 +108,12 @@
                    </view>
                </view>
                <view class="addressCard">
                    <view class="address">{{orderInfo.detailedAddress||""}}</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||''}}</view>
                    <view class="value">{{orderInfo.createTime|formatTime}}</view>
                </view>
                <view class="flex j-between">
                    <view class="label">问题类型</view>
@@ -131,14 +132,17 @@
                    <view class="value">{{orderInfo.detailedAddress||''}}</view>
                </view>
                <!-- 上级端需要的字段 -->
                <view class="flex j-between">
                    <view class="label">录入人</view>
                    <view class="value">{{orderInfo.createBy||''}}</view>
                <view v-if="!isParty">
                    <view class="flex j-between">
                        <view class="label">录入人</view>
                        <view class="value">{{orderInfo.nickname||''}}</view>
                    </view>
                    <view class="flex j-between">
                        <view class="label">录入人联系方式</view>
                        <view class="value">{{orderInfo.contactNumber||''}}</view>
                    </view>
                </view>
                <view class="flex j-between">
                    <view class="label">录入人联系方式</view>
                    <view class="value">{{orderInfo.contactNumber||''}}</view>
                </view>
                <!--  上级端需要的字段-->
            </view>
@@ -153,7 +157,7 @@
                </view>
                <view class="title">描述图片</view>
                <view class="descPic" v-if="problemImg.length>0">
                    <view class="picItem" v-for="(item,index) in problemImg">
                    <view class="picItem" v-for="(item,index) in problemImg" @click.stop="viewImage(item)">
                        <image :src="item" class="img shrink0" mode="aspectFill">
                        </image>
                    </view>
@@ -195,7 +199,7 @@
                    </view>
                    <view class="flex a-center">
                        <view class="name">办结时间:</view>
                        <view class="value">{{orderInfo.completionTime||''}}</view>
                        <view class="value">{{orderInfo.completionTime|formatTime}}</view>
                    </view>
                </view>
                <view class="title">办结结果描述</view>
@@ -203,7 +207,7 @@
                </view>
                <view class="title">描述图片</view>
                <view class="descPic" v-if="resultImg.length>0">
                    <view class="picItem" v-for="(item,index) in resultImg">
                    <view class="picItem" v-for="(item,index) in resultImg" @click.stop="viewImage(item)">
                        <image :src="item" class="img shrink0" mode="aspectFill">
                        </image>
                    </view>
@@ -235,14 +239,14 @@
                            <view class="proLine">
                            </view>
                        </view>
                        <view>
                        <view class="flex1">
                            <view class="flex a-center j-between mb-10">
                                <view class="name">{{item.createByName||''}}</view>
                                <view class="time">{{item.createTime||''}}</view>
                                <view class="time">{{item.createTime | formatTime}}</view>
                            </view>
                            <view class="context">{{item.describe||''}}</view>
                            <view class="proImg">
                                <view class="imgOrVedio" v-for="(ite,ind) in item.imgList">
                                <view class="imgOrVedio" v-for="(ite,ind) in item.imgList" @click.stop="viewImage(ite)">
                                    <image :src="ite" class="img shrink0" mode="aspectFill">
                                    </image>
                                </view>
@@ -296,20 +300,20 @@
        </view>
        <!-- 上级显示 -->
        <view class="btnButtom" v-if="[0,1,2].includes(orderInfo.status)">
            <view class="btnDown" @click.stop="toUp">问题上报</view>
            <view class="btnDown" @click.stop="toDown">诉求下派</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">问题上报</view>
            <view class="btnDown" @click.stop="toDown" v-if="userInfo.accountLevel<4">诉求下派</view>
            <view class="btnAdd" @click="addProgress">添加办理进度</view>
            <view class="btnAdd" @click="resultEntery">办理结果录入</view>
        </view>
        <view class="btnButtom" v-if="orderInfo.status==5">
        <view class="btnButtom" v-if="[5,7].includes(orderInfo.status) && !isParty">
            <view class="cancel" @click.stop="showPop=true">驳回</view>
            <view class="sure">审核通过</view>
            <view class="sure" @click.stop="submitReSolve">审核通过</view>
        </view>
        <!-- 上级显示 -->
        <!-- 党员显示 -->
        <view class="btnButtom" v-if="[0,1,2].includes(orderInfo.status)">
        <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>
@@ -335,9 +339,12 @@
</template>
<script>
    import dayjs from '@/uni_modules/uview-ui/libs/util/dayjs.js'
    import {
        workOrderDetail,
        list
        getUserInfo,
        reportAudit,
        delayAudit
    } from './service.js'
    export default {
        data() {
@@ -355,28 +362,52 @@
                rejectText: "", //驳回原因
                scoreTopHeight: 0, //距离顶部多高
                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')
            }
        },
        onShow() {
            list({
                pageNum: 1,
                pageSize: 10,
            }).then(res => {
            })
            this.getDetailInfo()
        },
        onLoad(params) {
            if (params.id) {
                this.id = params.id
            }
            getUserInfo().then(res => {
                if (res.data == null) {
                    this.isParty = true
                    console.log('111111')
                }
                this.userInfo = {
                    ...res.data
                }
            })
        },
        methods: {
            open() {},
            close() {},
            viewImage(item) {
                uni.previewImage({
                    urls: [item]
                })
            },
            // 去大屏播放视频
            openVideo(url) {
                uni.navigateTo({
                    url: `/pages/work-detail/maxVideo?url=${'https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/2minute-demo.mp4'}`
                    url: `/pages/work-detail/maxVideo?url=${url}`
                })
            },
            // 获取订单详情信息
@@ -419,12 +450,61 @@
            },
            // 确认驳回
            submitReject() {
                this.showPop = false
                if (!this.rejectText) {
                    return uni.showToast({
                        duration: 1500,
                        title: '请输入驳回原因',
                        mask: true,
                        icon: 'none'
                    })
                }
                if (this.orderInfo.status == 5) { //上报
                    reportAudit({
                        id: this.id,
                        auditResult: 2,
                        rejectReason: this.rejectText
                    }).then(res => {
                        this.showPop = false
                        // this.getDetailInfo()
                        uni.navigateBack()
                    })
                } else { //延期
                    delayAudit({
                        complaintId: this.id,
                        auditResult: 2,
                        rejectReason: this.rejectText
                    }).then(res => {
                        this.showPop = false
                        // this.getDetailInfo()
                        uni.navigateBack()
                    })
                }
            },
            // 确认通过审批
            submitReSolve() {
                if (this.orderInfo.status == 5) { //上报
                    reportAudit({
                        id: this.id,
                        auditResult: 1,
                    }).then(res => {
                        // this.getDetailInfo()
                        uni.navigateBack()
                    })
                } else { //延期
                    delayAudit({
                        complaintId: this.id,
                        auditResult: 1,
                    }).then(res => {
                        // this.getDetailInfo()
                        uni.navigateBack()
                    })
                }
            },
            //延期申请
            applyOverTime() {
                uni.navigateTo({
                    url: `/pages/work-detail/postpone-apply`
                    url: `/pages/work-detail/postpone-apply?id=${this.id}`
                })
            },
            // 问题上报
@@ -448,7 +528,17 @@
                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>
@@ -792,6 +882,14 @@
                            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;
H5/static/packUp.png
H5/static/unfold.png
H5/static/空空如也@2x.png
H5/utils/request.js
@@ -19,8 +19,13 @@
    return new Promise(function(resolve, reject) {
        let token = uni.getStorageSync('token') ||
            'eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOjE4OTI0ODk0OTc5Nzk5NDA4NjUsInR5cGUiOjEsImV4cCI6MTc0MTY3NjA3MCwiY3JlYXRlZCI6MTc0MDM4MDA3MDQzM30.VbtID-0OdvLSLraK3Sr9cPbOLnvrrfobX-dHg3rScv7EUyu-qqPK_pXzd03wa5CgSQ7R6-m9R3NZqmPQEuQjEg'
        let token =
            'Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOjE1OTAxNzYwNTgxNTY1NDgwOTgsInR5cGUiOjEsImV4cCI6MTc0MTcwNTE1OSwiY3JlYXRlZCI6MTc0MDQwOTE1OTEwMH0.AmeZFq2Pj2y2bRF1AolsRWHA4ehobBdx1-LtQHIJzub8WjEh_TxZ-PTEI7uiujlLWKhJE07PCVCggAdeuF3UIA'
        //党员 eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOjE4OTI0ODk0OTc5Nzk5NDA4NjUsInR5cGUiOjEsImV4cCI6MTc0MDQ2NjQ3MCwiY3JlYXRlZCI6MTc0MDM4MDA3MDQzN30.oOlB8GBE50WmV4Kw-Uuy33rQpQ-homoJQ61QXs34rkQIr-jFlAn9dUOgebitI9bz5PUaFImSldhY6vokRjmYlg
        // 社区  eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOjE1OTAxNzYwNTgxNTY1NDgwOTgsInR5cGUiOjEsImV4cCI6MTc0MTcwNTE1OSwiY3JlYXRlZCI6MTc0MDQwOTE1OTEwMH0.AmeZFq2Pj2y2bRF1AolsRWHA4ehobBdx1-LtQHIJzub8WjEh_TxZ-PTEI7uiujlLWKhJE07PCVCggAdeuF3UIA
        // 市  eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOjE4OTI0MjE4MjgwODU4Mzc4MjYsInR5cGUiOjEsImV4cCI6MTc0MTY5ODg0OCwiY3JlYXRlZCI6MTc0MDQwMjg0ODMzN30.7IYRD37yTkhqcnKyXWcqKk_iTisMp3ar_ByfuVR7Go9rK8ZnGJrlwC3z4NF_ly7IIoBHgE2E4IAvfm3ccam8wg
        //街道  eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOjY2OTc5LCJ0eXBlIjoxLCJleHAiOjE3NDE3MDU4NDMsImNyZWF0ZWQiOjE3NDA0MDk4NDMyNTZ9.MOPT3X3Cw9AUmeuIpqDA1a1xZd7V85NSraJddxCrPHvOkaZ8dMI-aUB9gqninzqsMzwmMx6phbD8aBpTlYcWwA
        // 县级  eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOjU2MDYyLCJ0eXBlIjoxLCJleHAiOjE3NDE3MDU5MTgsImNyZWF0ZWQiOjE3NDA0MDk5MTg3MDF9.k9ck3gWfVElSCl1uUI_5fZ3lEbFgtbQs_OaJku4I4bXoUO77kUnHsghkPBFdRknFHa49fTdAEdHn0wsb_XN5tg
        let header = {
            'content-type': type ? 'application/x-www-form-urlencoded;charset=UTF-8' : 'application/json',
            'Authorization': 'Bearer ' + token,
management/config/routes.ts
@@ -36,46 +36,60 @@
  {
    path: '/setting',
    // layout: false,
    name:'系统设置',
    name: '系统设置',
    access: '/system_setting',
    routes: [
      {
        name: '职位管理',
        path: '/setting/career',
        component: './setting/career/index',
        access: '/system_setting/position_management',
      },
      {
        name: '角色管理',
        path: '/setting/role',
        component: './setting/role',
        access: '/system_setting/role_management',
      },
    ],
  },
  {
    path: '/work-order',
    // layout: false,
    name:'工单事项管理',
    name: '工单事项管理',
    access: '/work_order_transaction_management',
    routes: [
      {
        name: '工单事项配置',
        path: '/work-order/configuration',
        component: './work-order-setting/index',
        access: '/work_order_transaction_management/work_order_item_configuration',
      },
      {
        name: '问题类型管理',
        path: '/work-order/problemType',
        component: './work-order/problem-type/index',
        access: '/work_order_transaction_management/problem_type_management',
      },
      {
        name: 'banner管理',
        path: '/work-order/banner',
        component: './work-order/banner/index',
        access: '/work_order_transaction_management/banner_management',
      },
    ],
  },
  {
    path: '/message-notification',
    // layout: false,
    name:'消息通知',
    name: '消息通知',
    access: '/message_notification',
    routes: [
      {
        name: '消息通知',
        path: '/message-notification/list',
        component: './message-notification/index',
        access: '/message_notification',
      },
    ],
  },
management/src/app.tsx
@@ -7,6 +7,7 @@
import { errorConfig } from './requestErrorConfig';
const loginPath = '/login';
import '../public/font.css'
import { useEffect, useState } from 'react';
/**
@@ -39,8 +40,21 @@
// ProLayout 支持的api https://procomponents.ant.design/components/layout
export const layout: RunTimeLayoutConfig = ({ initialState, setInitialState }) => {
  const [title, setTitle] = useState('');
  useEffect(() => {
    const updateTitle = () => {
      const now = new Date();
      const days = ['周日', '周一', '周二', '周三', '周四', '周五', '周六'];
      const formattedDate = `${now.getFullYear()}-${now.getMonth() + 1}-${now.getDate()} ${now.getHours()}:${now.getMinutes()} ${days[now.getDay()]}`;
      setTitle(formattedDate);
    };
    updateTitle();
    const interval = setInterval(updateTitle, 1000); // 每分钟更新一次
    return () => clearInterval(interval); // 清除定时器
  }, []);
  return {
    title,
    logo: false,
    avatarProps: {
      title: <AvatarName />,
management/src/components/RightContent/AvatarDropdown.tsx
@@ -1,13 +1,10 @@
import { outLogin } from '@/services/ant-design-pro/api';
import { LogoutOutlined, SettingOutlined, UserOutlined } from '@ant-design/icons';
import { useEmotionCss } from '@ant-design/use-emotion-css';
import { history, useModel } from '@umijs/max';
import { Spin } from 'antd';
import { stringify } from 'querystring';
import type { MenuInfo } from 'rc-menu/lib/interface';
import React, { useCallback } from 'react';
import { outLogin, getUnreadCount } from './service';
import { LogoutOutlined } from '@ant-design/icons';
import { useModel } from '@umijs/max';
import React, { useEffect, useState } from 'react';
import { Access, history, useAccess } from 'umi';
import { flushSync } from 'react-dom';
import HeaderDropdown from '../HeaderDropdown';
import './style.less';
export type GlobalHeaderRightProps = {
  menu?: boolean;
@@ -17,120 +14,44 @@
export const AvatarName = () => {
  const { initialState } = useModel('@@initialState');
  // 
  const { currentUser } = initialState || {};
  return <span className="anticon">{currentUser?.userName || '超级管理员'}</span>;
};
export const AvatarDropdown: React.FC<GlobalHeaderRightProps> = ({ menu, children }) => {
  /**
   * 退出登录,并且将当前的 url 保存
   */
  const loginOut = async () => {
    // await outLogin();
    const { search, pathname } = window.location;
    const urlParams = new URL(window.location.href).searchParams;
    /** 此方法会跳转到 redirect 参数所在的位置 */
    const redirect = urlParams.get('redirect');
    // Note: There may be security issues, please note
    if (window.location.pathname !== '/login' && !redirect) {
      // history.replace({
      //   pathname: '/login',
      //   search: stringify({
      //     redirect: pathname + search,
      //   }),
      // });
    }
  };
  const actionClassName = useEmotionCss(({ token }) => {
    return {
      display: 'flex',
      height: '48px',
      marginLeft: 'auto',
      overflow: 'hidden',
      alignItems: 'center',
      padding: '0 8px',
      cursor: 'pointer',
      borderRadius: token.borderRadius,
      '&:hover': {
        backgroundColor: token.colorBgTextHover,
      },
    };
  });
  const { initialState, setInitialState } = useModel('@@initialState');
  const onMenuClick = useCallback(
    (event: MenuInfo) => {
      const { key } = event;
      if (key === 'logout') {
        localStorage.clear();
        flushSync(() => {
          setInitialState((s) => ({ ...s, currentUser: undefined }));
        });
        loginOut();
        return;
      }
      history.push(`/account/${key}`);
    },
    [setInitialState],
  );
  const [unreadCount, setUnreadCount] = useState(0);
  useEffect(() => {
    const timer = setInterval(() => {
      getUnreadCount().then((res: any) => {
        setUnreadCount(res.data || 0);
      });
    }, 1000 * 5)
  const loading = (
    <span className={actionClassName}>
      <Spin
        size="small"
        style={{
          marginLeft: 8,
          marginRight: 8,
        }}
      />
    </span>
  );
    return () => clearInterval(timer);
  }, []);
  if (!initialState) {
    return loading;
  const onMenuClick = async () => {
    await outLogin();
    localStorage.clear();
    flushSync(() => {
      setInitialState((s) => ({ ...s, currentUser: undefined }));
    });
  }
  const { currentUser } = initialState;
  if (!currentUser || !currentUser.userName) {
    return loading;
  }
  const menuItems = [
    ...(menu
      ? [
        {
          key: 'center',
          icon: <UserOutlined />,
          label: '个人中心',
        },
        {
          key: 'settings',
          icon: <SettingOutlined />,
          label: '个人设置',
        },
        {
          type: 'divider' as const,
        },
      ]
      : []),
  return <div style={{ display: 'flex', alignItems: 'center', color: '#000' }}>
    {
      key: 'logout',
      icon: <LogoutOutlined />,
      label: '退出登录',
    },
  ];
  return (
    <HeaderDropdown
      menu={{
        selectedKeys: [],
        onClick: onMenuClick,
        items: menuItems,
      }}
    >
      {children}
    </HeaderDropdown>
  );
      unreadCount > 0 &&
      <div className='unread' onClick={() => { history.push('/message-notification/list') }}>
        <div>未读提醒</div>
        <div style={{ border: '1px solid red', borderRadius: '50%', width: '18px', lineHeight: '16px', marginLeft: '5px', textAlign: 'center', color: 'red', flexShrink: 0 }}>{unreadCount}</div>
      </div>
    }
    <div className="logoOut" onClick={onMenuClick}>退出登录<LogoutOutlined style={{ marginLeft: '5px' }} /></div>
  </div>
};
management/src/components/RightContent/service.js
New file
@@ -0,0 +1,17 @@
import { request } from '@umijs/max';
// 退出登录
export async function outLogin(data) {
  return request('/api/huacheng-sangeshenbian/systemUser/logout', {
    method: 'POST',
    data,
  });
}
// 获取未读数量
export async function getUnreadCount(data) {
  return request('/api/huacheng-sangeshenbian/messageNotification/unreadCount', {
    method: 'GET',
    data,
  });
}
management/src/components/RightContent/style.less
New file
@@ -0,0 +1,17 @@
.unread {
    display: flex;
    align-items: center;
    margin-right: 20px;
}
.unread:hover {
    background-color: rgba(241, 237, 237, 0.45);
    cursor: pointer;
    border-radius: 8px;
}
.logoOut:hover {
    background-color: rgba(241, 237, 237, 0.45);
    cursor: pointer;
    border-radius: 8px;
}
management/src/global.less
@@ -54,4 +54,13 @@
      }
    }
  }
}
.ant-pro-global-header-header-actions-avatar>div:hover {
  background: #fff;
}
: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);
}
management/src/pages/message-notification/index.jsx
@@ -40,14 +40,14 @@
      dataIndex: 'bannerName',
      hideInSearch: true,
    },
    {
      title: '状态',
      dataIndex: 'listingStatus',
      hideInSearch: true,
      valueEnum: {
        '上架中': { text: '已读' },
        '已下架' : { text: '未读' },
        '已下架': { text: '未读' },
      }
    },
    {
@@ -56,20 +56,21 @@
      render: (text, record) => {
        return (
          <Space>
            <Button
              type="link"
              onClick={() => {
                showDelConfirm(async () => {
                  let status = await sendRequest(deleteBanner,  record.id)
                  if (status) {
                    actionRef.current.reload();
                  }
                },'确认标记已读所选信息吗?');
              }}
            >
              标记已读
            </Button>
            <Access accessible={access['/message_notification/mark_read']}>
              <Button
                type="link"
                onClick={() => {
                  showDelConfirm(async () => {
                    let status = await sendRequest(deleteBanner, record.id)
                    if (status) {
                      actionRef.current.reload();
                    }
                  }, '确认标记已读所选信息吗?');
                }}
              >
                标记已读
              </Button>
            </Access>
          </Space >
        );
      },
@@ -87,7 +88,7 @@
          showQuickJumper: true,
          defaultPageSize: 10,
        }}
        search={{labelWidth: 140}}
        search={{ labelWidth: 140 }}
        request={(params) => {
          params.bannerType = Number(params.bannerType)
          return buildProTableDataSource(getList, params)
management/src/pages/setting/career/index.jsx
@@ -24,31 +24,35 @@
          <Space>
            {
              !record.admin &&
              <Button
                type="link"
                onClick={() => {
                  addViewRef.current.refreshData(record);
                  handleModalVisible(true);
                }}
              >
                编辑
              </Button>
              <Access accessible={access['/system_setting/position_management/edit']}>
                <Button
                  type="link"
                  onClick={() => {
                    addViewRef.current.refreshData(record);
                    handleModalVisible(true);
                  }}
                >
                  编辑
                </Button>
              </Access>
            }
            {
              !record.admin &&
              <Button
                type="link"
                onClick={() => {
                  showDelConfirm(async () => {
                    let status = await sendRequest(del, record.deptId);
                    if (status) {
                      actionRef.current.reload();
                    }
                  }, '确认删除所选信息吗?');
                }}
              >
                删除
              </Button>
              <Access accessible={access['/position_management/del']}>
                <Button
                  type="link"
                  onClick={() => {
                    showDelConfirm(async () => {
                      let status = await sendRequest(del, record.deptId);
                      if (status) {
                        actionRef.current.reload();
                      }
                    }, '确认删除所选信息吗?');
                  }}
                >
                  删除
                </Button>
              </Access>
            }
          </Space>
        );
@@ -58,28 +62,30 @@
  return (
    <div>
      <PageContainer header={{
          breadcrumb: {},
        }}>
        breadcrumb: {},
      }}>
        <ProTable
          rowKey="id"
          actionRef={actionRef}
          columns={columns}
          pagination={false}
          request={async(params) => {
          request={async (params) => {
            return await buildProTableDataSource(getList, params);
          }}
          toolBarRender={(action, selectRows) => [
            <Space>
              <Button
                type="primary"
                onClick={() => {
                  addViewRef.current.refreshData({});
                  handleModalVisible(true);
                }}
              >
                添加
              </Button>
            </Space>,
              <Access accessible={access['/system_setting/position_management/add']}>
                <Button
                  type="primary"
                  onClick={() => {
                    addViewRef.current.refreshData({});
                    handleModalVisible(true);
                  }}
                >
                  添加
                </Button>
              </Access>
            </Space>
          ]}
        />
        <AddAndEdit
management/src/pages/setting/role/components/addAndEdit.jsx
New file
@@ -0,0 +1,192 @@
import { Form, Input, Modal, Tree, Button, Spin } from 'antd';
import { forwardRef, useImperativeHandle, useState } from 'react';
import { useEffect } from 'react';
import { getTree, getAddTree } from '../service';
const formItemLayout = {
    labelCol: { span: 6 },
    wrapperCol: { span: 18 },
};
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);
    useEffect(() => {
        // 获取权限树
        getAddTree().then(res => {
            setTreeData(res.data)
        })
    }, [])
    useImperativeHandle(ref, () => {
        return {
            refreshData: (data, type) => {
                setDetailType(type || false)
                if (data.id) {
                    // 获取角色的权限树
                    getTree(data.id).then(res => {
                        setTreeSeletKeys(res.data.systemMenuIds || []);
                    })
                }
                setData(data)
                form.setFieldsValue(data);
            },
            clean: () => {
                setSpinning(false)
            },
        };
    });
    // 保存
    const okHandle = () => {
        form.validateFields().then((values) => {
            setSpinning(true)
            values.menuIds = treeSeletKeys
            delete values.tree
            if (data.id) {
                values.id = data.id
                onUpdate(values)
            } else {
                onSave(values);
            }
        });
    };
    // 选中树
    const onCheck = (e, row) => {
        let seletKeys = e.checked;
        treeData.find(item => {
            if (item.children) {
                let arr1 = item.children.find((item1) => {//循环子路由
                    if (item1.children) {
                        let arr2 = item1.children.find((item2) => {//循环子路由下按钮
                            return item2.id == row.node.id;
                        });
                        if (row.checked) {
                            if (arr2 && !seletKeys.includes(item1.id)) {
                                seletKeys.push(item1.id);
                            }
                            if (arr2 && !seletKeys.includes(item.id)) {
                                seletKeys.push(item.id);
                            }
                        } else {
                            let isCheck = item1.children.find((item2) => seletKeys.includes(item2.id));
                            if (!isCheck) {
                                let arr = seletKeys.filter((it) => it != item1.id);
                                seletKeys = arr;
                            }
                        }
                    }
                    return item1.id == row.node.id;
                });
                if (row.checked) {
                    if (arr1 && !seletKeys.includes(item.id)) {
                        seletKeys.push(item.id);
                    }
                } else {
                    let isCheck = item.children.find((item1) => seletKeys.includes(item1.id));
                    if (!isCheck) {
                        let arr = seletKeys.filter((it) => it != item.id);
                        seletKeys = arr;
                    }
                }
            }
            return item.id == row.node.id;
        });
        if (row.node.children.length != 0) {
            row.node.children.map((item) => {
                if (row.checked) {
                    if (!seletKeys.includes(item.id)) {
                        seletKeys.push(item.id);
                    }
                } else {
                    seletKeys = seletKeys.filter((item1) => item1 != item.id);
                }
                if (item.children.length != 0) {
                    item.children.map((item1) => {
                        if (row.checked) {
                            if (!seletKeys.includes(item1.id)) {
                                seletKeys.push(item1.id);
                            }
                        } else {
                            seletKeys = seletKeys.filter((item2) => item2 != item1.id);
                        }
                    });
                }
            });
        }
        setTreeSeletKeys(seletKeys);
    };
    return (
        <Modal
            getContainer={false}
            width="20%"
            destroyOnClose
            title={detailType ? '角色详情' : data.id ? '编辑角色' : '添加角色'}
            open={visible}
            onCancel={() => onCancel(false)}
            afterClose={() => {
                form.resetFields()
                setTreeSeletKeys([])
            }}
            footer={
                !detailType ?
                    [
                        <Button key="back" onClick={() => onCancel(false)}>取消</Button>,
                        <Button key="submit" type="primary" onClick={okHandle}>
                            确定
                        </Button>
                    ]
                    :
                    <Button key="back" onClick={() => onCancel(false)}>关闭</Button>
            }
        >
            <Form layout="horizontal" {...formItemLayout} form={form} scrollToFirstError>
                <Form.Item
                    name="name"
                    label="角色名称"
                    rules={[{ required: true, message: '请输入角色名称' }]}
                >
                    <Input disabled={detailType} placeholder='请输入角色名称' />
                </Form.Item>
                <Form.Item
                    name="tree"
                    label="角色权限"
                    rules={[{
                        required: true,
                        validator: (rule, value) => {
                            return new Promise((resolve, reject) => {
                                if (value) {
                                    resolve('');
                                } else {
                                    if (treeSeletKeys.length === 0) {
                                        reject(new Error('请选择角色权限'));
                                    }
                                    resolve('');
                                }
                            })
                        }
                    }]}>
                    <Tree
                        checkable
                        checkStrictly
                        checkedKeys={treeSeletKeys}
                        treeData={treeData}
                        disabled={detailType}
                        fieldNames={{ title: 'name', key: 'id' }}
                        onCheck={onCheck}
                    />
                </Form.Item>
            </Form>
            <Spin spinning={spinning} fullscreen />
        </Modal >
    );
};
export default forwardRef(AddAndEdit);
management/src/pages/setting/role/index.jsx
New file
@@ -0,0 +1,127 @@
import { PageContainer, ProTable } from '@ant-design/pro-components';
import { buildProTableDataSource, sendRequest, showDelConfirm } from '@/utils/antdUtils';
import { Button, Space } from 'antd';
import { useRef, useState } from 'react';
import { Access, history, useAccess } from 'umi';
import { getList, del, edit, add } from './service'
import AddAndEdit from './components/addAndEdit'
const Role = () => {
    const actionRef = useRef();
    const addViewRef = useRef();
    const [modalVisible, handleModalVisibles] = useState(false);
    const access = useAccess();
    const columns = [
        {
            title: '角色名称',
            dataIndex: 'name',
        },
        {
            title: '操作',
            hideInSearch: true,
            render: (text, record) => {
                return (
                    <Space>
                        {
                            record.roleId != 1 &&
                            <Access accessible={access['/system_setting/role_management/edit']}>
                                <Button
                                    type="link"
                                    onClick={() => {
                                        addViewRef.current.refreshData(record);
                                        handleModalVisibles(true)
                                    }}
                                >
                                    编辑
                                </Button>
                            </Access>
                        }
                        {
                            record.roleId != 1 &&
                            <Access accessible={access['/system_setting/role_management/del']}>
                                <Button
                                    type="link"
                                    onClick={() => {
                                        showDelConfirm(async () => {
                                            let status = await sendRequest(del, record.id)
                                            if (status) {
                                                actionRef.current.reload();
                                            }
                                        }, '确认删除所选信息吗?');
                                    }}
                                >
                                    删除
                                </Button>
                            </Access>
                        }
                        <Access accessible={access['/system_setting/role_management/detail'] || false}>
                            <Button
                                type="link"
                                onClick={() => {
                                    addViewRef.current.refreshData(record, true);
                                    handleModalVisibles(true)
                                }}
                            >
                                查看详情
                            </Button>
                        </Access>
                    </Space >
                );
            },
        },
    ]
    return <PageContainer title='角色管理'>
        <ProTable
            rowKey='id'
            actionRef={actionRef}
            columns={columns}
            pagination={{
                showSizeChanger: true,
                showQuickJumper: true,
                defaultPageSize: 10,
            }}
            request={(params) => buildProTableDataSource(getList, params)}
            toolBarRender={(action, selectRows) => [
                <Access accessible={access['/system_setting/role_management/add']}>
                    <Space>
                        <Button
                            type="primary"
                            onClick={() => {
                                addViewRef.current.refreshData({});
                                handleModalVisibles(true)
                            }}
                        >
                            添加
                        </Button>
                    </Space>
                </Access>
            ]}
        />
        <AddAndEdit
            ref={addViewRef}
            visible={modalVisible}
            onSave={async (fileds) => {
                let success = await sendRequest(add, fileds);
                if (success) {
                    handleModalVisibles(false);
                    actionRef.current.reload();
                }
                addViewRef.current.clean();
            }}
            onUpdate={async (fileds) => {
                let success = await sendRequest(edit, fileds);
                if (success) {
                    handleModalVisibles(false);
                    actionRef.current.reload();
                }
                addViewRef.current.clean();
            }}
            onCancel={() => handleModalVisibles(false)}
        />
    </PageContainer>
};
export default Role;
management/src/pages/setting/role/service.js
New file
@@ -0,0 +1,47 @@
import { request } from '@umijs/max';
// 列表
export const getList = async (params) => {
    return request(`/api/huacheng-sangeshenbian/systemRole/list`, {
        method: 'GET',
        params
    });
}
// 编辑获取角色权限树
export const getTree = async (id) => {
    return request(`/api/huacheng-sangeshenbian/systemRole/getSystemRoleInfo/${id}`, {
        method: 'GET',
    });
}
// 新增获取权限树
export const getAddTree = async (id) => {
    return request(`/api/huacheng-sangeshenbian/systemMenu/getSystemMenuList`, {
        method: 'GET',
    });
}
// 新增
export const add = async (data) => {
    return request('/api/huacheng-sangeshenbian/systemRole/add', {
        method: 'POST',
        data,
    });
}
// 编辑
export const edit = async (data) => {
    return request('/api/huacheng-sangeshenbian/systemRole/edit', {
        method: 'POST',
        data,
    });
}
// 删除
export const del = async (id) => {
    return request(`/api/huacheng-sangeshenbian/systemRole/delete/${id}`, {
        method: 'DELETE',
    });
}
management/src/pages/work-order-setting/index.jsx
@@ -48,7 +48,7 @@
                            <div><span style={{ fontSize: '14px', fontWeight: 600 }}>*诉求处理时间配置:
                            </span><span style={{ marginLeft: 8, color: '#a5a5a5' }}>超过时间未处理诉求,系统自动对该事件承办者发送短信提醒,并知会至上一级管理层进行督办。
                                </span></div>
                            <Space style={{ marginTop: 20,display:'flex',flexWrap:'wrap'}}>
                            <Space style={{ marginTop: 20, display: 'flex', flexWrap: 'wrap' }}>
                                <Form.Item label="市级账号" name="isAuctioneer" rules={
                                    [{ required: true, message: '请输入市级账号' }]
                                }>
@@ -82,12 +82,12 @@
                            <div><span style={{ fontSize: '14px', fontWeight: 600 }}>*时限临期提醒配置:
                            </span><span style={{ marginLeft: 8, color: '#a5a5a5' }}>超过时间未处理诉求,系统自动对该事件承办者发送短信提醒,并知会至上一级管理层进行督办。
                                </span></div>
                            <Space style={{ marginTop: 20,display:'flex',flexWrap:'wrap'}}>
                            <Space style={{ marginTop: 20, display: 'flex', flexWrap: 'wrap' }}>
                                <Form.Item label="市级账号" name="isAuctioneer" rules={
                                    [{ required: true, message: '请输入市级账号' }]
                                }>
                                    <InputNumber precision={0} min={0} addonAfter="天内"  controls={false}></InputNumber>
                                    <InputNumber precision={0} min={0} addonAfter="天内" controls={false}></InputNumber>
                                </Form.Item>
                                <Form.Item label="区县账号" name="isAuctioneer" rules={
@@ -114,7 +114,7 @@
                            </Space>
                        </Card>
                        <Card>
                            <div style={{marginBottom:20}}><span style={{ fontSize: '14px', fontWeight: 600 }}>*诉求处理时间:
                            <div style={{ marginBottom: 20 }}><span style={{ fontSize: '14px', fontWeight: 600 }}>*诉求处理时间:
                            </span><span style={{ marginLeft: 8, color: '#a5a5a5' }}>超过时间未处理诉求,系统自动对该事件承办者发送短信提醒,并知会至上一级管理层进行督办。
                                </span></div>
                            <Form.Item label="添加后处理时间" name="isAuctioneer" rules={
@@ -123,12 +123,13 @@
                                <InputNumber precision={0} min={0} addonAfter="天内" controls={false}></InputNumber>
                            </Form.Item>
                        </Card>
                        <div style={{ marginTop: 20,display:'flex',justifyContent:'center'}}>
                            <Button type="primary" htmlType="submit" style={{ marginRight: 20 }}>
                                保存
                            </Button>
                        </div>
                        <Access accessible={access['/work_order_transaction_management/work_order_item_configuration/save'] || false}>
                            <div style={{ marginTop: 20, display: 'flex', justifyContent: 'center' }}>
                                <Button type="primary" htmlType="submit" style={{ marginRight: 20 }}>
                                    保存
                                </Button>
                            </div>
                        </Access>
                    </Form>
                </Card>
            </PageContainer>
management/src/pages/work-order/banner/index.jsx
@@ -38,27 +38,31 @@
      render: (text, record) => {
        return (
          <Space>
            <Button
              type="link"
              onClick={() => {
                history.push(`/marketing/banner/add?id=${record.id}&edit=true`);
              }}
            >
              编辑
            </Button>
            <Button
              type="link"
              onClick={() => {
                showDelConfirm(async () => {
                  let status = await sendRequest(deleteBanner,  record.id)
                  if (status) {
                    actionRef.current.reload();
                  }
                },'确认删除所选信息吗?');
              }}
            >
              删除
            </Button>
            <Access accessible={access['/work_order_transaction_management/banner_management/edit']}>
              <Button
                type="link"
                onClick={() => {
                  history.push(`/marketing/banner/add?id=${record.id}&edit=true`);
                }}
              >
                编辑
              </Button>
            </Access>
            <Access accessible={access['/work_order_transaction_management/banner_management/del']}>
              <Button
                type="link"
                onClick={() => {
                  showDelConfirm(async () => {
                    let status = await sendRequest(deleteBanner, record.id)
                    if (status) {
                      actionRef.current.reload();
                    }
                  }, '确认删除所选信息吗?');
                }}
              >
                删除
              </Button>
            </Access>
            {/* <Button
              type="link"
              onClick={() => {
@@ -121,7 +125,8 @@
          return buildProTableDataSource(getList, params)
        }}
        toolBarRender={(action, selectRows) => [
            <Space>
          <Space>
            <Access accessible={access['/work_order_transaction_management/banner_management/add']}>
              <Button
                type="primary"
                onClick={() => {
@@ -132,7 +137,8 @@
              >
                添加
              </Button>
            </Space>
            </Access>
          </Space>
        ]}
      />
    </PageContainer>
management/src/pages/work-order/problem-type/index.jsx
@@ -2,7 +2,7 @@
import { PageContainer, ProTable } from '@ant-design/pro-components';
import { Button, Space } from 'antd';
import { useRef, useState } from 'react';
import { useAccess,Access } from 'umi';
import { useAccess, Access } from 'umi';
import AddAndEdit from './components/addAndEdit';
import { addAndEdit, del, getList } from './service';
const Account = () => {
@@ -23,7 +23,7 @@
      render: (text, record) => {
        return (
          <Space>
            {/* <Access accessible={access.pm5 || false}> */}
            <Access accessible={access['/work_order_transaction_management/problem_type_management/edit']}>
              <Button
                type="link"
                onClick={() => {
@@ -33,9 +33,9 @@
              >
                编辑
              </Button>
            {/* </Access> */}
            {/* <Access accessible={access.pm5 || false}> */}
            <Button
            </Access>
            <Access accessible={access['/work_order_transaction_management/problem_type_management/del']}>
              <Button
                type="link"
                onClick={() => {
                  showDelConfirm(async () => {
@@ -48,7 +48,7 @@
              >
                删除
              </Button>
            {/* </Access> */}
            </Access>
          </Space>
        );
      },
@@ -74,7 +74,7 @@
          }}
          toolBarRender={(action, selectRows) => [
            <Space>
              {/* <Access accessible={access.pm4 || false}> */}
              <Access accessible={access['/work_order_transaction_management/problem_type_management/add']}>
                <Button
                  type="primary"
                  onClick={() => {
@@ -84,7 +84,7 @@
                >
                  添加
                </Button>
              {/* </Access> */}
              </Access>
            </Space>,
          ]}
        />
management/src/requestErrorConfig.ts
@@ -36,7 +36,7 @@
      o.headers = {
        ...config.headers,
        Authorization,
        Authorization:'Bearer ' + Authorization,
      }
      // }
      // 拦截请求配置,进行个性化处理。
management/src/utils/antdUtils.js
@@ -103,11 +103,11 @@
}
export async function buildProTableDataSource(fun, params) {
  params.pageCurr = params.current;
  params.pageNum = params.current;
  delete params.current
  const response = await fun(params);
  const data = Promise.resolve({
    data: response.data.list || [],
    data: response.data.records || [],
    total: response.data.total || 0,
    success: true,
    pageSize: response.data.size || 10,