pyt
2025-03-17 956d1d6e32b3c7a8c40101a42a2855fb5c22bc63
Merge branch 'master' of http://120.76.84.145:10101/gitblit/r/H5/threeSide
27个文件已修改
1个文件已添加
1468 ■■■■■ 已修改文件
H5/config/index.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
H5/index.html 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
H5/manifest.json 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
H5/pages/certificationAudit/certificationAudit.vue 187 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
H5/pages/certificationAudit/service.js 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
H5/pages/evaluate/evaluate.vue 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
H5/pages/evaluate/service.js 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
H5/pages/index/index.vue 77 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
H5/pages/index/service.js 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
H5/pages/work-detail/work-detail.vue 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
management/config/env.ts 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
management/config/routes.ts 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
management/src/components/RightContent/AvatarDropdown.tsx 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
management/src/pages/Login/index.tsx 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
management/src/pages/appeal-management/detail.jsx 245 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
management/src/pages/appeal-management/index.jsx 96 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
management/src/pages/appeal-management/index.less 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
management/src/pages/appeal-management/service.js 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
management/src/pages/party/audit/components/index.jsx 73 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
management/src/pages/party/audit/index.jsx 107 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
management/src/pages/party/audit/service.js 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
management/src/pages/party/manage/components/addAndEdit.jsx 103 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
management/src/pages/party/manage/components/export.jsx 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
management/src/pages/party/manage/components/index.jsx 82 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
management/src/pages/party/manage/index.jsx 192 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
management/src/pages/party/manage/service.js 64 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
management/src/pages/setting/career/index.jsx 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
management/src/utils/utils.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
H5/config/index.js
@@ -1,5 +1,5 @@
export default {
    BASE_URL: 'https://huacheng.psciio.com',
    // BASE_URL: 'http://192.168.110.188:6194',
    // BASE_URL: 'https://huacheng.psciio.com',
    BASE_URL: 'http://192.168.110.188:6194',
    imageUrl: 'https://huacheng.psciio.com/api/huacheng-applets/common/uploadimages',
}
H5/index.html
@@ -19,5 +19,6 @@
        <div id="app"><!--app-html--></div>
        <script type="module" src="/main.js"></script>
        <script type="text/javascript" src="https://api.map.baidu.com/api?v=3.0&type=webgl&ak=5CVivDODPGwsWoqqrDxplq9hkfX5OEzs"></script>
        <script type="text/javascript" src="https://res.wx.qq.com/open/js/jweixin-1.3.2.js"></script>
    </body>
</html>
H5/manifest.json
@@ -1,6 +1,6 @@
{
    "name" : "三个身边",
    "appid" : "__UNI__4B73B99",
    "appid" : "__UNI__DB035F5",
    "description" : "",
    "versionName" : "1.0.0",
    "versionCode" : "100",
H5/pages/certificationAudit/certificationAudit.vue
@@ -1,6 +1,6 @@
<template>
    <view>
        <view v-if="list.length == 0 && status == 'noMore'" class="mt-200">
        <view v-if="list.length == 0" class="mt-200">
            <image src="../../static/空空如也@2x.png" mode="widthFix" class="w100"></image>
            <view class="txt-center mt-94 fs-27 color9">
                暂无数据
@@ -10,8 +10,8 @@
            <view class="mt-38 br-19 bgColor3 shadow2 oh pb-31" v-for="(item,index) in list" :key="item.id">
                <view class="pt-21 px-31 flex a-center j-between font-bold">
                    <view class="flex a-center">
                        <view class="fs-31 mr-23">习婕海</view>
                        <view v-if="!index" class="flex a-center pr-19 border3">
                        <view class="fs-31 lh-38 mr-23">{{item.name}}</view>
                        <view v-if="!item.gender" class="flex a-center pr-19 border3">
                            <image src="@/static/man.png" class="w-38 h-38 shrink0" />
                            <view class="fs-23 ml-12">
                                男
@@ -25,32 +25,39 @@
                        </view>
                    </view>
                    <view class="color3 flex a-center fs-31">
                        待审核
                        {{['待审核','审核通过','审核不通过'][item.auditStatus]}}
                    </view>
                </view>
                <view class="mt-38 mx-31 pt-12 pb-23 px-31 br-19 bgColor8">
                    <view class="flex a-center j-between lh-38 mt-19 fs-27 color11">
                        <view class="font-w400">身份证号</view>
                        <view class="font-bold">500000000000000000</view>
                        <view class="font-bold">{{item.idNumber}}</view>
                    </view>
                    <view class="flex a-center j-between lh-38 mt-19 fs-27 color11">
                        <view class="font-w400">联系电话</view>
                        <view class="font-bold">15729765305</view>
                        <view class="font-bold">{{item.phone}}</view>
                    </view>
                    <view class="flex j-between lh-38 mt-19 fs-27 color11">
                        <view class="font-w400">服务社区</view>
                        <view class="font-bold">仁和区-仁和镇-仁和街社区</view>
                        <view class="font-bold">
                            {{item.districts}}
                            <span v-if="item.street">-</span>
                            {{item.street}}
                            <span v-if="item.community">-</span>
                            {{item.community}}
                        </view>
                    </view>
                    <view class="flex j-between lh-38 mt-19 fs-27 color11">
                        <view class="font-w400">服务对象</view>
                        <view class="font-bold">文化小区一栋一单元</view>
                        <view class="font-bold">{{item.serviceTarget}}</view>
                    </view>
                    <view class="flex j-between lh-38 mt-19 fs-27 color11">
                        <view class="font-w400">所在党组织</view>
                        <view class="font-bold max-w1">中共攀枝花市委组织部机关中共11攀枝花市委组织部机关</view>
                        <view class="font-bold max-w1 txt-aligin-r">{{item.partyOrganization}}</view>
                    </view>
                    <view class="flex wrap mt-19">
                        <image src="/static/logo.png" class="w-142 h-142 mr-12 shrink0 br-19 mb-12" />
                        <image @tap="viewImage(item.avatar)" :src="item.avatar"
                            class="w-142 h-142 mr-12 shrink0 br-19 mb-12" />
                    </view>
                </view>
                <view class="mt-37 border1">
@@ -60,10 +67,11 @@
                        申请时间:{{ item.createTime | formatTime }}
                    </view>
                    <view class="flex a-center j-center fs-23 mt-29 txt-center">
                        <view @click.stop="refuse" class="h-58 lh-58 bgColor5 w-192 br-29 color10 border2">
                        <view @click.stop="auditPopup(item.id,2)"
                            class="h-58 lh-58 bgColor5 w-192 br-29 color10 border2">
                            拒绝
                        </view>
                        <view @click.stop="pass" class="ml-38 h-58 lh-58 bgColor6 w-192 br-29 color8">
                        <view @click.stop="auditPopup(item.id,1)" class="ml-38 h-58 lh-58 bgColor6 w-192 br-29 color8">
                            通过
                        </view>
                    </view>
@@ -71,17 +79,17 @@
            </view>
        </view>
        <view class="h-safe-b"></view>
        <CustomPopup ref="tipPoput" @close="closePopup" @comfirm="comfirmPopup">
            <view class="mt-50" :class="suditStatus ? 'mb-38' : 'mb-60'">
                <view class="txt-center fs-31 lh-42 color12">确认审核{{suditStatus ? '拒绝' : '通过'}}所选信息吗?</view>
                <view v-if="suditStatus" class="mt-38">
            <view class="mt-50" :class="form.result == 2 ? 'mb-38' : 'mb-60'">
                <view class="txt-center fs-31 lh-42 color12">确认审核{{form.result == 2 ? '拒绝' : '通过'}}所选信息吗?</view>
                <view v-if="form.result == 2" class="mt-38">
                    <view class="flex">
                        <image src="/static/required.png" class="w-10 h-10 mt-12 mr-15 shrink0" />
                        <view class="fs-31 lh-42 font-bold">拒绝理由:</view>
                    </view>
                    <view class="border5 br-19 mt-13 px-35 py-27 ">
                        <textarea v-model="reasonsRefusal" placeholder="请输入拒绝理由" class="fs-27 h-178 w100"></textarea>
                        <textarea v-model="form.reason" placeholder="请输入拒绝理由" class="fs-27 h-178 w100"></textarea>
                        <view v-if="showRequiredTip" class="fs-23 lh-33 color3">拒绝理由必填</view>
                    </view>
                </view>
@@ -93,7 +101,8 @@
<script>
    import dayjs from '@/uni_modules/uview-ui/libs/util/dayjs.js'
    import {
        getList
        getList,
        audit
    } from './service.js'
    export default {
        data() {
@@ -102,11 +111,15 @@
                    pageNum: 1,
                    pageSize: 10,
                },
                list: [{}, {}],
                status: 'loadMore',
                suditStatus: false,
                reasonsRefusal: '',
                showRequiredTip: false,
                list: [],
                isLoading: false,
                showRequiredTip: false, //必填校验状态
                form: {
                    id: '', //党员id
                    reason: '', //原因
                    result: null, //1 通过 2 不通过
                },
                clickAgain: false,
            }
        },
        filters: {
@@ -116,61 +129,81 @@
            }
        },
        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'
                    }
                })
            if (!this.isLoading) {
                this.searchParams.pageNum = this.searchParams.pageNum + 1;
                this.fetchList();
            } else {
                return uni.showToast({
                    title: "没有更多了",
                    duration: 2000,
                    icon: "none",
                });
            }
        },
        onShow() {
            this.searchParams.pageNum = 1
            this.list = []
            this.fetchList()
        },
        onReady() {},
        methods: {
            comfirmPopup() {
                if (this.suditStatus) {
                    if (!this.reasonsRefusal) {
                        this.showRequiredTip = true
                        return
                    }
                if (this.clickAgain) return
                if (this.form.result == 2 && !this.form.reason) {
                    this.showRequiredTip = true
                    return
                }
                this.closePopup()
                this.clickAgain = true
                audit(this.form).then(res => {
                    this.searchParams.pageNum = 1
                    this.list = []
                    this.fetchList()
                    this.closePopup()
                    uni.showToast({
                        title: this.form.result == 1 ? '当前党员信息审核已通过。' : '当前党员信息审核已拒绝。',
                        icon: 'none',
                        mask: true,
                    })
                }).catch(err => {
                    this.clickAgain = false
                })
            },
            refuse() {
                this.suditStatus = true
            auditPopup(id, type) {
                this.form.id = id
                this.form.result = type
                this.$refs.tipPoput.showPopup()
            },
            pass() {
                this.$refs.tipPoput.showPopup()
            },
            fetchList(params, callback) {
                if (this.status == 'loading') return
                this.status = 'loading'
                getList(params).then(res => {
            fetchList() {
                getList(this.searchParams).then(res => {
                    if (res.code == 200) {
                        res.data.records.map(item => {
                            if (item.images) {
                                item.images = item.images.split(',')
                            }
                        })
                        callback(res.data)
                        if (res.data.records.length < 10) {
                            this.isLoading = true;
                        } else {
                            this.isLoading = false;
                        }
                        this.list = [...this.list, ...res.data.records];
                        if (res.data.total == this.list.length) {
                            this.isLoading = true
                        }
                    }
                })
            },
            closePopup() {
                this.$refs.tipPoput.closePopup()
                this.$nextTick(() => {
                    this.suditStatus = false
                    this.showRequiredTip = false
                    this.reasonsRefusal = ''
                    this.form = {
                        id: '', //党员id
                        reason: '', //原因
                        result: null, //1 通过 2 不通过
                    }
                    this.showRequiredTip = false //必填校验状态
                    this.clickAgain = false
                })
            },
            viewImage(item) {
                uni.previewImage({
                    urls: [item]
                })
            },
        }
    }
@@ -185,16 +218,8 @@
        color: #4C4C4C;
    }
    .color2 {
        color: #232323;
    }
    .color3 {
        color: #FF4948;
    }
    .color4 {
        color: #929191;
    }
    .color5 {
@@ -203,10 +228,6 @@
    .color6 {
        color: #666666;
    }
    .color7 {
        color: #727272;
    }
    .color8 {
@@ -229,28 +250,8 @@
        color: rgba(0, 0, 0, 0.6);
    }
    .bgColor1 {
        background: linear-gradient(270deg, #FFB318 0%, #FF330D 100%);
        width: 58rpx;
        height: 12rpx;
        border-radius: 6rpx;
        position: absolute;
        left: 0;
        right: 0;
        bottom: -5rpx;
        margin: auto;
    }
    .bgColor2 {
        background-color: #fff;
    }
    .bgColor3 {
        background: linear-gradient(180deg, #FFDCDB 0%, rgba(255, 255, 255, 0) 138rpx, #fff 100%);
    }
    .bgColor4 {
        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%);
    }
    .bgColor5 {
@@ -259,10 +260,6 @@
    .bgColor6 {
        background: linear-gradient(270deg, #FC8D55 0%, #FF4948 100%);
    }
    .bgColor7 {
        background: #FF4948;
    }
    .bgColor8 {
H5/pages/certificationAudit/service.js
@@ -1,5 +1,11 @@
import request from '@/utils/request.js'
// 工单列表
export const getList =(params)=>{
    return request.post(`/api/huacheng-sangeshenbian/applet/complaint/list`,params)
}
// 党员待审核列表
export const getList = (params) => {
    return request.post(`/api/huacheng-sangeshenbian/applet/party-member/pre-audit-list`, params)
}
// 党员申请审核
export const audit = (params) => {
    return request.post(`/api/huacheng-sangeshenbian/applet/party-member/audit`, params, false, false)
}
H5/pages/evaluate/evaluate.vue
@@ -5,19 +5,18 @@
        <view class="allContent">
            <view class="fs-27 lh-38 font-bold">评价打分</view>
            <view class="mt-25 flex j-between">
                <view class="evaluateItem" v-for="(item,index) in list" :key="index" @click="activeType=item.value"
                    :class="activeType==item.value && 'activeBg'">
                <view class="evaluateItem" v-for="(item,index) in list" :key="index" @click="rate=item.value"
                    :class="rate==item.value && 'activeBg'">
                    <image :src="item.img" class="statusImg" />
                    <view class="title">{{item.tit}}</view>
                </view>
            </view>
            <view class="mt-38">
                <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'"
                <textarea v-model="content" class="pt-25 pl-31 mt-27 fs-27 br-8 bgcolor4"
                    :class="(rulsFlag && !content) && 'bgcolor-border'"
                    style="height: 365rpx;width: calc(100% - 31rpx);" placeholder="请输入不超过200字评价" />
                <view v-if="rulsFlag && !describe" class="flex a-center mt-19">
                <view v-if="rulsFlag && !content" 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>
@@ -72,47 +71,39 @@
<script>
    import {
        saveProcess,
        getComplaintDetail
    } from './service'
    import config from '@/config/index.js'
    export default {
        data() {
            return {
                complaintId: '', //诉求id
                info: {}, //工单详情
                describe: '', //办理进度描述
                content: '', //评价内容
                localImageUrls: [], //本地回显的图片
                imgUrls: [], //传给后端的url
                video: [],
                againCklicFlag: true,
                rulsFlag: false,
                activeType: 1,
                rate: null, //评价打分
                list: [{
                    img: '../../static/detailImg/img1.png',
                    tit: '不满意',
                    value: 1
                    value: 0
                }, {
                    img: '../../static/detailImg/img2.png',
                    tit: '一般',
                    value: 2
                    value: 1
                }, {
                    img: '../../static/detailImg/img3.png',
                    tit: '满意',
                    value: 3
                    value: 2
                }, {
                    img: '../../static/detailImg/img4.png',
                    tit: '非常满意',
                    value: 4
                    value: 3
                }],
            }
        },
        onLoad(params) {
            // this.complaintId = params.id
            // getComplaintDetail({
            //     id: params.id
            // }).then(res => {
            //     this.info = res.data
            // })
            this.complaintId = params.id
        },
        methods: {
            back() {
@@ -121,16 +112,17 @@
                })
            },
            submit() {
                if (!this.describe) {
                    this.rulsFlag = true
                    return uni.showToast({
                if (this.rate == null) {
                    uni.showToast({
                        icon: 'none',
                        title: '请输入办理进度描述'
                        title: '请评价打分',
                    })
                    return
                }
                let obj = {
                    complaintId: this.complaintId,
                    describe: this.describe,
                    content: this.content,
                    rate: this.rate,
                    imgUrl: this.imgUrls.join(','),
                    video: this.video.join(',')
                }
@@ -166,14 +158,11 @@
                })
            },
            uploadImg(type) {
                // if (!this.againCklicFlag) return
                this.againCklicFlag = false
                if (type == 1) {
                    uni.chooseImage({
                        count: 1,
                        count: 9 - this.imgUrls.length,
                        success: (chooseImageRes) => {
                            this.imgUrls.push('loading')
                            this.againCklicFlag = true
                            let imgPathList = chooseImageRes.tempFilePaths;
                            if (imgPathList.length > 0) {
                                uni.uploadFile({
@@ -194,7 +183,6 @@
                                                this.localImageUrls.push(imgPathList[0])
                                            })
                                        } else {
                                            this.againCklicFlag = true
                                            this.imgUrls = this.imgUrls.filter(
                                                item => item != 'loading')
                                            uni.showToast({
@@ -205,7 +193,6 @@
                                        }
                                    },
                                    fail: (err) => {
                                        this.againCklicFlag = true
                                        this.imgUrls = this.imgUrls.filter(
                                            item => item != 'loading')
                                        uni.showToast({
@@ -217,16 +204,12 @@
                                })
                            }
                        },
                        fail: () => {
                            this.againCklicFlag = true
                        }
                    })
                } else {
                    uni.chooseVideo({
                        camera: 'back',
                        count: 9 - this.video.length,
                        success: (res) => {
                            this.video.push('loading')
                            this.againCklicFlag = true
                            const tempFilePath = res.tempFilePath;
                            uni.uploadFile({
                                url: config.imageUrl,
@@ -234,7 +217,7 @@
                                timeout: 1000 * 45,
                                name: 'file',
                                header: {
                                    Authorization: cuni.getStorageSync('token')
                                    Authorization: uni.getStorageSync('token')
                                },
                                success: (res) => {
                                    if (JSON.parse(res.data).code == 200) {
@@ -244,7 +227,6 @@
                                            this.video.push(JSON.parse(res.data).data)
                                        })
                                    } else {
                                        this.againCklicFlag = true
                                        this.video = this.video.filter(
                                            item => item != 'loading')
                                        uni.showToast({
@@ -255,7 +237,6 @@
                                    }
                                },
                                fail: (err) => {
                                    this.againCklicFlag = true
                                    this.video = this.video.filter(
                                        item => item != 'loading')
                                    uni.showToast({
@@ -266,9 +247,6 @@
                                }
                            })
                        },
                        fail: () => {
                            this.againCklicFlag = true
                        }
                    })
                }
            },
H5/pages/evaluate/service.js
@@ -1,12 +1,7 @@
import request from '@/utils/request.js'
// 办理进度录入
// 添加评论
export const saveProcess = (params) => {
    return request.post(`/api/huacheng-sangeshenbian/applet/complaint/save-process`, params, )
}
// 工单详情
export const getComplaintDetail = (params) => {
    return request.get('/api/huacheng-sangeshenbian/applet/complaint/detail', params)
    return request.post(`/api/huacheng-sangeshenbian/applet/complaint/commentComplaint`, params, )
}
H5/pages/index/index.vue
@@ -9,7 +9,7 @@
                    <image src="/static/home/img5.png" mode="widthFix"></image>
                </view>
                <swiper class="swiper " :indicator-dots="false" :autoplay="true" :interval="3000">
                    <swiper-item v-for="item,index in bannerlist" :key="index">
                    <swiper-item v-for="item, index in bannerlist" :key="index">
                        <image style="height: 270rpx;width: 688rpx;border-radius: 19rpx;" :src="item.url" mode="">
                        </image>
                    </swiper-item>
@@ -42,7 +42,7 @@
        <view class="pt-38 pl-31 pr-31 flex flex-column">
            <view class="flex j-between a-center">
                <text class="color1 fs-31 font-bold">工作台</text>
                <text class="color2 fs-27" @click="showData =!showData">查看更多</text>
                <text class="color2 fs-27" @click="showData = !showData">查看更多</text>
            </view>
            <view class="flex flex-wrap j-between">
                <view class="pt-38 pb-38 bg1 w-333 br-19 mt-19 flex a-center relative"
@@ -73,7 +73,7 @@
                    <image class="w-81 h-77 ml-38" src="/static/home/img8.png" mode=""></image>
                    <text class="ml-37 font-bold">统计分析</text>
                </view>
                <view class="pt-38 pb-38 bg1 w-333 br-19 mt-19 flex a-center" v-if="showData && userInfo.isAdmin == 1">
                <view class="pt-38 pb-38 bg1 w-333 br-19 mt-19 flex a-center" @tap.stop="toCertificationAudit" v-if="showData && userInfo.isAdmin == 1">
                    <image class="w-81 h-77 ml-38" src="/static/home/Group 2@2x.png" mode=""></image>
                    <text class="ml-37 font-bold">党员审核</text>
                </view>
@@ -83,25 +83,25 @@
            </view>
            <view class=" mt-15">
                <view class="flex a-center">
                    <view class="msg mr-19" @click="changeActive(1)" :class="isactive==1? 'active':''">
                    <view class="msg mr-19" @click="changeActive(1)" :class="isactive == 1 ? 'active' : ''">
                        消息
                        <view class="tips">
                            {{noreadlist.length}}
                            {{ noreadlist.length }}
                        </view>
                    </view>
                    <view class="representative" @click="changeActive(2)" :class="isactive==2? 'active':''">
                    <view class="representative" @click="changeActive(2)" :class="isactive == 2 ? 'active' : ''">
                        待办
                        <view class="tips">
                            {{noreadlists.length}}
                            {{ noreadlists.length }}
                        </view>
                    </view>
                </view>
                <view class="list mt-29">
                    <view v-if="isactive==1?msgList.length == 0:msgLists.length == 0" class="txt-center">
                    <view v-if="isactive == 1 ? msgList.length == 0 : msgLists.length == 0" class="txt-center">
                        <image src="../../static/空空如也@2x.png" mode="widthFix" class="w80"></image>
                        <view class="fs-23 mt-20 mb-20 color4">暂无数据</view>
                    </view>
                    <view class="flex a-center mb-27" v-for="item in isactive==1?msgList:msgLists" :key="item.id">
                    <view class="flex a-center mb-27" v-for="item in isactive == 1 ? msgList : msgLists" :key="item.id">
                        <view class="avater pb-33">
                            <image class="w-85 h-85 br50" src="/static/home/img9.png" mode=""></image>
                            <view class="tips" v-if="item.readStatus==2"></view>
@@ -112,18 +112,19 @@
                                <text class="fs-23 font-w400">{{item.time}}</text>
                            </view>
                            <view class="fs-27 flex j-between mt-8">
                                <text style="color: rgba(102, 102, 102, 1);">{{item.promptType==1?'临期提醒':'超时提醒'}}</text>
                                <view class="read" v-if="item.readStatus==1">已读</view>
                                <text style="color: rgba(102, 102, 102, 1);">{{ item.promptType == 1 ? '临期提醒' : '超时提醒'
                                    }}</text>
                                <view class="read" v-if="item.readStatus == 1">已读</view>
                                <view class="noread" v-else>未读</view>
                            </view>
                        </view>
                    </view>
                    <text v-if="isactive==1?msgList.length > 0:msgLists.length > 0"
                    <text v-if="isactive == 1 ? msgList.length > 0 : msgLists.length > 0"
                        class="flex j-center fs-27 color4 pb-48" @click="Allread">全部已读</text>
                </view>
            </view>
        </view>
        <popupCertificate :show="isClick" @onCancel="isClick=false"></popupCertificate>
        <popupCertificate :show="isClick" @onCancel="isClick = false"></popupCertificate>
        <!-- 用户多个角色时切换角色弹窗 -->
        <u-popup :show="changeRolePopup" round="16rpx" @close="closeChangeRole">
@@ -198,7 +199,8 @@
        getread,
        getCurrentUserInfo,
        changeIdentity,
        confirmContent
        confirmContent,
        getSignature
    } from './service.js'
    export default {
        components: {
@@ -236,6 +238,36 @@
        },
        onLoad(e) {
            getSignature().then(res => {
                wx.config({
                    debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来
                    appld: 'wx118de8a734d269f0',
                    timestamp: res.data.timestamp, // 必填,生成签名的 时间戳
                    noncestr: res.data.nonceStr, // 必填,生成签名的随机串
                    signature: res.data.signature, // 必填,签名
                    jsApiList: [
                        'miniProgram.navigateBack',
                        'miniProgram.navigateTo',
                        'miniProgram.postMessage',
                    ] // 必填,需要使用的JS接口列表
                })
                wx.ready(() => {
                    // 在这里调用任何你需要的JS-SDK功能
                    uni.showToast({
                        title: '配置成功!'
                    })
                });
                wx.error((err) => {
                    // 处理错误情况
                    uni.showToast({
                        title: '配置失败'
                    });
                    uni.setClipboardData({
                        data: JSON.stringify(err)
                    })
                })
            })
            if (e.token) {
                uni.setStorageSync('token', 'Bearer ' + e.token)
            }
@@ -254,6 +286,12 @@
            closeChangeRole() {
                this.getMessagelist()
                this.getappletcinfo()
            },
            closeH5() {
                wx.miniProgram.navigateBack()
            },
            changeRole(item) {
                this.activeRole = item - 1
                this.changeRolePopup = false
            },
            //确认冻结
@@ -432,12 +470,14 @@
            changeActive(value) {
                this.isactive = value
                if (value == 1) {
                    this.msgList = JSON.parse(JSON.stringify(this.msgListTotal)).filter(item => item.promptType ==
                    this.msgList = JSON.parse(JSON.stringify(this.msgListTotal)).filter(item => item
                        .promptType ==
                        2)
                    this.noreadlist = this.msgList.filter(item => item.readStatus === 0)
                } else {
                    this.msgLists = JSON.parse(JSON.stringify(this.msgListTotal)).filter(item => item.promptType ==
                    this.msgLists = JSON.parse(JSON.stringify(this.msgListTotal)).filter(item => item
                        .promptType ==
                        1)
                    this.noreadlists = this.msgLists.filter(item => item.readStatus === 0)
                }
@@ -484,6 +524,11 @@
                uni.navigateTo({
                    url: '/pages/list/list'
                })
            },
            toCertificationAudit() {
                uni.navigateTo({
                    url: '/pages/certificationAudit/certificationAudit'
                })
            }
        }
    }
H5/pages/index/service.js
@@ -20,4 +20,7 @@
export const confirmContent =(params)=>{
    return request.get(`/api/huacheng-sangeshenbian/applet/home/confirm-content`,params)
}
}
export const getSignature=(params)=>{
    return request.get(`/api/huacheng-sangeshenbian/systemUser/getSignature`,params)
}
H5/pages/work-detail/work-detail.vue
@@ -227,7 +227,7 @@
                <view v-else class="noData">暂无数据</view>
            </view>
            <!-- 详情/办理进度 --正在办理-延期-超时  显示-->
            <!-- 详情/办理进度 -正在办理-延期-超时  显示-->
            <view class="progress" v-if="[0, 1, 2].includes(orderInfo.status) && progressesList.length > 0">
                <view class="title">当前办理进度</view>
                <view class="proCard">
@@ -266,7 +266,7 @@
                </view>
            </view>
            <!-- 详情/诉求流转 --正在办理显示-->
            <!-- 详情/诉求流转 -正在办理显示-->
            <view class="careRequire" v-if="orderInfo.status == 0 && flowsList.length > 0">
                <view class="title">诉求流转</view>
                <view class="proCard">
@@ -302,7 +302,7 @@
        <!-- 上级显示 -->
        <view class="btnButtom"
            v-if="[0, 1, 2, 6].includes(orderInfo.status) && !isParty && orderInfo.auditButtonStatus == 1">
            v-if="[0, 1, 2, 6].includes(orderInfo.status) && !isParty && orderInfo.listControlsButtonStatus == 0">
            <view class="btnDown" @click.stop="toUp" v-if="userInfo.accountLevel > 1"
                :class="[2, 3].includes(userInfo.accountLevel) ? '' : 'partyUp'">问题上报</view>
            <view class="btnDown" @click.stop="toDown" v-if="userInfo.accountLevel < 4"
@@ -325,8 +325,8 @@
        </view>
        <!-- 党员显示 -->
        <!-- v-if="[3].includes(orderInfo.status)" -->
        <view class="btnButtom" v-if="[3].includes(orderInfo.status)">
            <view class="btnAdd  evaluate" @click.stop="toEvaluate">评价</view>
        <view class="btnButtom" v-if="[3].includes(orderInfo.status)&& orderInfo.evaluateButtonStatus == 0">
            <view class=" btnAdd evaluate" @click.stop="toEvaluate">评价</view>
        </view>
@@ -770,7 +770,7 @@
            .addressCard {
                margin: 33rpx 10rpx;
                padding: 33rpx 27rpx;
                background: linear-gradient( 270deg, rgba(255,241,0,0.5) 0%, rgba(255,249,172,0.25) 48%, rgba(255,255,255,0.2) 100%, #FFFFFF 100%);
                background: linear-gradient(270deg, rgba(255, 241, 0, 0.5) 0%, rgba(255, 249, 172, 0.25) 48%, rgba(255, 255, 255, 0.2) 100%, #FFFFFF 100%);
                border-radius: 19rpx;
                display: flex;
                justify-content: space-between;
management/config/env.ts
@@ -1,7 +1,7 @@
export default {
  dev: {
    // SERVER_URL: 'http://192.168.110.188:6194',
    SERVER_URL: 'https://huacheng.psciio.com',
    SERVER_URL: 'http://192.168.110.188:6194',
    // SERVER_URL: 'https://huacheng.psciio.com',
  },
  test: {
    SERVER_URL: '',
management/config/routes.ts
@@ -89,13 +89,13 @@
    path: '/party',
    // layout: false,
    name: '党员管理',
    // access: '/work_order_transaction_management',
    access: '/party_member',
    routes: [
      {
        name: '党员管理',
        path: '/party/manage',
        component: './party/manage/index',
        // access: '/work_order_transaction_management/work_order_item_configuration',
        access: '/party_member/list',
      },
      {
        name: '添加党员',
@@ -108,7 +108,7 @@
        name: '党员审核',
        path: '/party/audit',
        component: './party/audit/index',
        // access: '/work_order_transaction_management/banner_management',
        access: '/party_member_audit/list',
      },
    ],
  },
@@ -130,13 +130,13 @@
    path: '/appeal-management',
    // layout: false,
    name: '诉求管理',
    // access: '/message_notification',
    access: '/complaint',
    routes: [
      {
        name: '诉求管理',
        path: '/appeal-management/list',
        component: './appeal-management/index',
        access: '/message_notification',
        access: '/complaint/list',
      },
      {
        name: '述求详情',
management/src/components/RightContent/AvatarDropdown.tsx
@@ -27,13 +27,13 @@
  const [unreadCount, setUnreadCount] = useState(0);
  const { currentUser } = initialState || {};
  useEffect(() => {
    const timer = setInterval(() => {
      getUnreadCount().then((res: any) => {
        setUnreadCount(res.data || 0);
      });
    }, 1000 * 5)
    // const timer = setInterval(() => {
    //   getUnreadCount().then((res: any) => {
    //     setUnreadCount(res.data || 0);
    //   });
    // }, 1000 * 5)
    return () => clearInterval(timer);
    // return () => clearInterval(timer);
  }, []);
management/src/pages/Login/index.tsx
@@ -112,6 +112,24 @@
      "/system_setting",
      "/system_setting/people_management",
      "/work_order_transaction_management/work_order_item_configuration/save",
      "/party_member",
      "/party_member/list",
      "/party_member/edit",
      "/party_member/del",
      "/party_member/detail",
      "/party_member/add",
      "/party_member/freeze",
      "/party_member/import",
      "/party_member/export",
      "/party_member_audit/list",
      "/party_member_audit/audit",
      "/complaint",
      "/complaint/list",
      "/complaint/detail",
      "/complaint/community-problem-export",
      "/complaint/problem-handle-export",
      "/complaint/notice-export",
      "/complaint/export",
    ];
    let accessObj: any = {};
    permissionList.map((item) => {
management/src/pages/appeal-management/detail.jsx
@@ -1,189 +1,217 @@
import { buildProTableDataSource, sendRequest, showDelConfirm } from '@/utils/antdUtils';
import { PageContainer, ProTable } from '@ant-design/pro-components';
import { Button, Card, Select, Space, Descriptions, Divider, Steps, message } from 'antd';
import { useRef, useState } from 'react';
import { Access, useAccess, history } from 'umi';
// import { add, edit, del, getList } from './service';
import { useRef, useState, useEffect } from 'react';
import { Access, useAccess } from 'umi'
import { history, useLocation } from "@umijs/max"
import { getDetail } from './service';
import moment from 'moment';
import './index.less';
import {downLoad } from '@/utils/utils';
const Account = () => {
    const actionRef = useRef();
    const addViewRef = useRef();
    const [current, setCurrent] = useState(0);
    const [detail, setDetail] = useState({});
    const searchParams = new URLSearchParams(useLocation().search);
    const id = searchParams.get('id');
    useEffect(() => {
        getDetail({ id: id }).then((res) => {
            setDetail(res.data);
        });
    }, []);
    const items = [
        {
            key: '1',
            label: '述求状态',
            children: 'Zhou Maomao',
            children: ['正在办理', '延期办理', '超时办理', '已办结', '待审核', '上报待审核'][detail.status],
        },
        {
            key: '2',
            label: '述求号',
            children: '1810000000',
            children: detail.serialNumber,
        },
        {
            key: '3',
            label: '处理状态',
            children: 'Pending',
            label: '',
            children: '',
        },
        {
            key: '4',
            label: '处理进度',
            children: 'In Progress',
            label: '',
            children: '',
        },
        {
            key: '5',
            label: '发生时间',
            children: 'Hangzhou, Zhejiang',
            children: moment(detail.time).format('YYYY-MM-DD HH:mm:ss'),
        },
        {
            key: '6',
            label: '问题类型',
            children: 'empty',
            children: detail.problemType,
        },
        {
            key: '7',
            label: '群众姓名',
            children: '张三',
            children: detail.name,
        },
        {
            key: '8',
            label: '联系电话',
            children: '13800138000',
            children: detail.contactNumber,
        },
        {
            key: '9',
            label: '发生地点',
            children: 'Hangzhou, Zhejiang',
            children: detail.location,
        },
        {
            key: '10',
            label: '详细地址',
            children: 'empty',
            children: detail.detailedAddress,
        },
        {
            key: '11',
            label: '录入人',
            children: '张三',
            children: detail.reportUserName,
        },
        {
            key: '12',
            label: '联系电话',
            children: '13800138000',
            children: detail.reportUserPhone,
        },
        {
            key: '13',
            label: '问题描述',
            children: '这是一段问题描述文字',
            children: detail.descriptionContent,
            span: 4,
        },
        {
            key: '14',
            label: '上传图片',
            children: <>
                <img width={80} height={80} src="https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png" alt="example" />
                {detail.images && (detail.images || '').split(',').map((item, index) => (
                    <img width={80} height={80} src={item} key={index} alt="example" />
                ))}
            </>,
            span: 4,
        },
        {
            key: '15',
            label: '上传视频',
            children: <><video width={280} src="https://www.w3schools.com/html/mov_bbb.mp4" controls></video></>,
            children: <>
                {detail.videos && (detail.videos || '').split(',').map((item, index) => (
                    <video width={280} src={item} key={index} controls></video>
                ))}
            </>,
            span: 4,
        },
    ];
    const items1 = [
        {
            key: 'First',
            title: 'First-content',
        },
        {
            key: 'Second',
            title: 'Second-content',
        },
        {
            key: 'Last',
            title: 'Last-content',
        },
    ];
    return (
        <div>
            <PageContainer header={{ breadcrumb: {} }} title="述求详情" >
            <PageContainer className={'appeal-management-detail'} header={{ breadcrumb: {} }} title="述求详情" >
                <Card>
                    <Descriptions column={4} title="基础信息" items={items} />
                    <Divider />
                    <Descriptions title="办理进度" column={1} >
                        <Descriptions.Item>
                            <Card style={{ width: '800px' }} title={'张三'} extra={'2021-01-01 15:00:00'}>
                                <Descriptions column={1} >
                                    <Descriptions.Item>
                                        这是办理进度说明这是办理进度说明这是办理进度说明这是办理进度说明这是办理进度说明
                                    </Descriptions.Item>
                                    <Descriptions.Item label={'上传图片'}>
                                        <img width={80} height={80} src="https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png" alt="example" />
                                    </Descriptions.Item>
                                    <Descriptions.Item label={'上传视频'}>
                                        <video width={280} src="https://www.w3schools.com/html/mov_bbb.mp4" controls></video>
                                    </Descriptions.Item>
                                </Descriptions>
                            </Card>
                        </Descriptions.Item>
                    </Descriptions>
                    <div>
                        <Descriptions title="办理进度" column={1}>
                            {detail.complaintProgresses?.length > 0 ? detail.complaintProgresses.map((item, index) => (
                                <Descriptions.Item key={index}>
                                    <Card style={{ width: '800px' }} title={item.createByName} extra={moment(item.createTime).format('YYYY-MM-DD HH:mm:ss')}>
                                        <Descriptions column={1} >
                                            <Descriptions.Item>
                                                {item.describe}
                                            </Descriptions.Item>
                                            <Descriptions.Item label={'上传图片'}>
                                                {item.imgUrl && (item.imgUrl || '').split(',').map((item, index) => (
                                                    <img width={80} style={{ marginRight: '10px' }} height={80} src={item} key={index} alt="example" />
                                                ))}
                                            </Descriptions.Item>
                                            <Descriptions.Item label={'上传视频'}>
                                                {item.videoUrl && (item.videoUrl || '').split(',').map((item, index) => (
                                                    <video width={280} style={{ marginRight: '10px' }} src={item} key={index} controls></video>
                                                ))}
                                            </Descriptions.Item>
                                        </Descriptions>
                                    </Card>
                                </Descriptions.Item>
                            )) : <Descriptions.Item span={4} >暂无办理进度</Descriptions.Item>}
                        </Descriptions>
                    </div>
                    <Divider />
                    <Descriptions title="述求流转" >
                    {detail.complaintFlows?.length > 0 && <><Descriptions title="述求流转" >
                        <Descriptions.Item span={4}>
                            <div style={{ width: '100%', overflowX: 'auto' }}   >
                                <Steps current={current} items={items1} />
                                <Steps size="small"  >
                                    {detail.complaintFlows && detail.complaintFlows.map((item, index) => (
                                        <Steps.Item status={'process'} key={index} title={item.name} description={<span>{item.type == 1 ? '下派' : '上报'} <span>{moment(item.createTime).format('YYYY-MM-DD HH:mm:ss')}</span> </span>} />
                                    ))}
                                </Steps>
                            </div>
                        </Descriptions.Item>
                    </Descriptions>
                    <Divider />
                    <Descriptions title="办结情况" >
                        <Descriptions.Item span={4}>
                            <Card style={{ width: '800px' }} extra={<div style={{ width: '750px', display: 'flex', justifyContent: 'space-between' }}>
                                <span>办结时间:2021-01-01 15:00:00</span>
                                <span>办结人员:张三</span>
                                <span>联系电话:13588888888</span>
                            </div>}>
                                <Descriptions column={1} >
                                    <Descriptions.Item>
                                        这是办理进度说明这是办理进度说明这是办理进度说明这是办理进度说明这是办理进度说明
                                    </Descriptions.Item>
                                    <Descriptions.Item label={'上传图片'}>
                                        <img width={80} height={80} src="https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png" alt="example" />
                                    </Descriptions.Item>
                                    <Descriptions.Item label={'上传视频'}>
                                        <video width={280} src="https://www.w3schools.com/html/mov_bbb.mp4" controls></video>
                                    </Descriptions.Item>
                                </Descriptions>
                            </Card>
                        </Descriptions.Item>
                    </Descriptions>
                    <Descriptions title="办结评价" style={{ marginTop: '20px' }} >
                        <Descriptions.Item span={4}>
                            <Card style={{ width: '800px' }} extra={<div style={{ width: '750px', display: 'flex', justifyContent: 'flex-start' }}>
                                <span>评价打分:满意</span>
                            </div>}>
                                <Descriptions column={1} >
                                    <Descriptions.Item>
                                        这是评价内容这是评价内容这是评价内容这是评价内容这是评价内容
                                    </Descriptions.Item>
                                    <Descriptions.Item label={'上传图片'}>
                                        <img width={80} height={80} src="https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png" alt="example" />
                                    </Descriptions.Item>
                                    <Descriptions.Item label={'上传视频'}>
                                        <video width={280} src="https://www.w3schools.com/html/mov_bbb.mp4" controls></video>
                                    </Descriptions.Item>
                                </Descriptions>
                            </Card>
                        </Descriptions.Item>
                    </Descriptions>
                        <Divider /></>}
                    {[3, 4].includes(detail.status) &&
                        <Descriptions title="办结情况" >
                            <Descriptions.Item span={4}>
                                <Card style={{ width: '800px' }} extra={<div style={{ width: '750px', display: 'flex', justifyContent: 'space-between' }}>
                                    <span>办结时间:{moment(detail.completionTime).format('YYYY-MM-DD HH:mm:ss')}</span>
                                    <span>办结人员:{detail.completionUsername}</span>
                                    <span>联系电话:{detail.completionUserPhone}</span>
                                </div>}>
                                    <Descriptions column={1} >
                                        <Descriptions.Item>
                                            {detail.completionDescription}
                                        </Descriptions.Item>
                                        <Descriptions.Item label={'上传图片'}>
                                            {detail.completionImages && detail.completionImages.split(',').map((item, index) => (
                                                <img width={80} height={80} style={{ marginRight: '10px' }} src={item} key={index} alt="example" />
                                            ))}
                                        </Descriptions.Item>
                                        <Descriptions.Item label={'上传视频'}>
                                            {detail.completionVideos && detail.completionVideos.split(',').map((item, index) => (
                                                <video width={280} style={{ marginRight: '10px' }} src={item} key={index} controls></video>
                                            ))}
                                        </Descriptions.Item>
                                    </Descriptions>
                                </Card>
                            </Descriptions.Item>
                        </Descriptions>}
                    {detail.complaintComment &&
                        <Descriptions title="办结评价" style={{ marginTop: '20px' }} >
                            <Descriptions.Item span={4}>
                                <Card style={{ width: '800px' }} extra={<div style={{ width: '750px', display: 'flex', justifyContent: 'flex-start' }}>
                                    <span>评价打分:{['不满意', '一般', '满意', '非常满意'][detail.complaintComment?.rate]}</span>
                                </div>}>
                                    <Descriptions column={1} >
                                        <Descriptions.Item>
                                            {detail.complaintComment?.content}
                                        </Descriptions.Item>
                                        <Descriptions.Item label={'上传图片'}>
                                            {detail.complaintComment?.imgUrl && detail.complaintComment?.imgUrl.split(',').map((item, index) => (
                                                <img width={80} height={80} style={{ marginRight: '10px' }} src={item} key={index} alt="example" />
                                            ))}
                                        </Descriptions.Item>
                                        <Descriptions.Item label={'上传视频'}>
                                            {detail.complaintComment?.videoUrl && detail.complaintComment?.videoUrl.split(',').map((item, index) => (
                                                <video width={280} style={{ marginRight: '10px' }} src={item} key={index} controls></video>
                                            ))}
                                        </Descriptions.Item>
                                    </Descriptions>
                                </Card>
                            </Descriptions.Item>
                        </Descriptions>
                    }
                    <div style={{ marginTop: '20px', display: 'flex', justifyContent: 'center' }}>
                        <Button onClick={() => {
                        <Button onClick={() => {
                            try {
                                history.go(-1);
                            } catch (error) {
@@ -191,36 +219,39 @@
                                console.error('Navigation error:', error);
                            }
                        }} style={{ marginRight: '20px' }}  >关闭</Button>
                        <Button type="primary" onClick={() => {
                        <Button type="primary" onClick={() => {
                            try {
                                downLoad(`/api/huacheng-sangeshenbian/complaint/download-file/${id}/1`, '社区问题单导出.docx');
                                // TODO: Implement export functionality
                                message.success('导出成功');
                            } catch (error) {
                                message.error('导出失败,请重试');
                                console.error('Export error:', error);
                            }
                        }}  style={{ marginRight: '20px' }}>社区问题单导出</Button>
                        <Button type="primary" onClick={() => {
                            try {
                        }} style={{ marginRight: '20px' }}>社区问题单导出</Button>
                        <Button type="primary" onClick={() => {
                                try {
                                downLoad(`/api/huacheng-sangeshenbian/complaint/download-file/${id}/2`, '问题处理单导出.docx');
                                // TODO: Implement export functionality
                                message.success('导出成功');
                            } catch (error) {
                                message.error('导出失败,请重试');
                                console.error('Export error:', error);
                            }
                        }}  style={{ marginRight: '20px' }}>问题处理单导出</Button>
                        <Button type="primary" onClick={() => {
                        }} style={{ marginRight: '20px' }}>问题处理单导出</Button>
                        <Button type="primary" onClick={() => {
                            try {
                                downLoad(`/api/huacheng-sangeshenbian/complaint/download-file/${id}/3`, '协调通知单导出.docx');
                                // TODO: Implement export functionality
                                message.success('导出成功');
                            } catch (error) {
                                message.error('导出失败,请重试');
                                console.error('Export error:', error);
                            }
                        }} >协调通知到导出</Button>
                        }} >协调通知单导出</Button>
                    </div>
                </Card>
            </PageContainer>
        </div>
management/src/pages/appeal-management/index.jsx
@@ -1,24 +1,25 @@
import { buildProTableDataSource, sendRequest, showDelConfirm } from '@/utils/antdUtils';
import { buildProTableDataSource } from '@/utils/antdUtils';
import { PageContainer, ProTable } from '@ant-design/pro-components';
import { Button, InputNumber, Select, Space } from 'antd';
import { useRef, useState } from 'react';
import { Access, useAccess } from 'umi';
import { Button, Space } from 'antd';
import { useRef } from 'react';
import { Access, useAccess,history } from 'umi';
import moment from 'moment';
import { getList } from './service';
import { exportExcell,downLoad } from '@/utils/utils';
// import { add, edit, del, getList } from './service';
const Account = () => {
    const actionRef = useRef();
    const addViewRef = useRef();
    const [modalVisible, handleModalVisible] = useState(false);
    const access = useAccess();
    const formRef = useRef();
    const columns = [
        {
            title: '录入人',
            dataIndex: 'name',
            dataIndex: 'reportUserName',
        },
        {
            title: '录入联系方式',
            dataIndex: 'name',
            dataIndex: 'reportUserPhone',
        },
        {
            title: '群众姓名',
@@ -26,29 +27,29 @@
        },
        {
            title: '群众联系方式',
            dataIndex: 'name',
            dataIndex: 'contactNumber',
        },
        {
            title: '发生时间',
            dataIndex: 'name',
            dataIndex: 'time',
            valueType:'dateRange',
            render: (text, record) => {
                return record.time ? moment(record.time).format('YYYY-MM-DD HH:mm:ss') : '';
            }
        },
        {
            title: '问题类型',
            dataIndex: 'name',
            valueEnum: {
                1: '正常',
                2: '冻结',
            },
            dataIndex: 'problemType',
        },
        {
            title: '状态',
            dataIndex: 'name',
            dataIndex: 'status',
            valueEnum: {
                1: '上报待审核',
                2: '正在办理',
                0: '正在办理',
                1: '延期办理',
                2: '超时办理',
                3: '已办结',
                4:'延期办理',
                5:'超时办理'
                4: '上报待审核',
            },
        },
        {
@@ -58,54 +59,47 @@
                return (
                    <Space>
                        {
                            !record.admin &&
                            <Access accessible={access['/system_setting/position_management/edit']}>
                           <Access accessible={access['/complaint/detail']}>
                                <Button
                                    type="link"
                                    onClick={() => {
                                        history.push('/appeal-management/detail')
                                        history.push('/appeal-management/detail?id=' + record.id)
                                    }}
                                >
                                    查看详情
                                </Button>
                            </Access>
                        }
                       {
                            !record.admin &&
                            <Access accessible={access['/system_setting/position_management/edit']}>
                        {
                            <Access accessible={access['/complaint/community-problem-export']}>
                                <Button
                                    type="link"
                                    onClick={() => {
                                        addViewRef.current.refreshData(record);
                                        handleModalVisible(true);
                                        downLoad(`/api/huacheng-sangeshenbian/complaint/download-file/${record.id}/1`, '社区问题单导出.docx');
                                    }}
                                >
                                    社区问题单导出
                                </Button>
                            </Access>
                        }
                         {
                            !record.admin &&
                            <Access accessible={access['/system_setting/position_management/edit']}>
                        {
                            <Access accessible={access['/complaint/problem-handle-export']}>
                                <Button
                                    type="link"
                                    onClick={() => {
                                        addViewRef.current.refreshData(record);
                                        handleModalVisible(true);
                                        downLoad(`/api/huacheng-sangeshenbian/complaint/download-file/${record.id}/2`, '问题处理单导出.docx');
                                    }}
                                >
                                    问题处理单导出
                                </Button>
                            </Access>
                        }
                         {
                            !record.admin &&
                            <Access accessible={access['/system_setting/position_management/edit']}>
                        {
                            <Access accessible={access['/complaint/notice-export']}>
                                <Button
                                    type="link"
                                    onClick={() => {
                                        addViewRef.current.refreshData(record);
                                        handleModalVisible(true);
                                        downLoad(`/api/huacheng-sangeshenbian/complaint/download-file/${record.id}/3`, '协调通知单导出.docx');
                                    }}
                                >
                                    协调通知单导出
@@ -121,23 +115,39 @@
        <div>
            <PageContainer header={{
                breadcrumb: {},
            }}>
            }}
            title={'诉求管理'}
            >
                <ProTable
                    rowKey="id"
                    actionRef={actionRef}
                    columns={columns}
                    pagination={false}
                    formRef={formRef}
                    request={async (params) => {
                        if(params.time && params.time.length > 0) {
                            params.startTime =moment(params.time[0]).format('YYYY-MM-DD HH:mm:ss');
                            params.endTime = moment(params.time[1]).format('YYYY-MM-DD 23:59:59');
                            delete params.time
                        }else{
                            delete params.startTime
                            delete params.endTime
                        }
                        return buildProTableDataSource(getList, params);
                    }}
                    search={{ labelWidth: 'auto' }}
                    toolBarRender={(action, selectRows) => [
                        <Space>
                            <Access accessible={access['/system_setting/position_management/add']}>
                            <Access accessible={access['/complaint/export']}>
                                <Button
                                    type="primary"
                                    onClick={() => {
                                        const params = {
                                          ...formRef.current.getFieldsValue(),
                                        };
                                        exportExcell('诉求管理.xlsx', params, '/api/huacheng-sangeshenbian/complaint/export');
                                    }}
                                >
                                    导出
management/src/pages/appeal-management/index.less
New file
@@ -0,0 +1,5 @@
.appeal-management-detail{
    .ant-steps-item-description{
        max-width: 200px !important;
    }
}
management/src/pages/appeal-management/service.js
@@ -0,0 +1,17 @@
import { request } from '@umijs/max';
// 获取诉求列表
export const getList = async (data) => {
    return request(`/api/huacheng-sangeshenbian/complaint/page`, {
        method: 'POST',
        data
    });
}
// 获取述求详情
export const getDetail = async (data) => {
    return request(`/api/huacheng-sangeshenbian/complaint/detail/${data.id}`, {
        method: 'GET',
        data
    });
}
management/src/pages/party/audit/components/index.jsx
@@ -1,9 +1,9 @@
import { Form, Input, Modal, Select, Upload, Space, Button, message, Row, Col, Divider } from 'antd';
import { Form, Input, Modal, Image, Upload, Space, Cascader, message, Row, Col, Divider } from 'antd';
import { sendRequest } from '@/utils/antdUtils';
import { LoadingOutlined, PlusOutlined } from '@ant-design/icons';
import { forwardRef, useEffect, useImperativeHandle, useState } from 'react';
import { customRequest } from '@/utils/utils';
import { add, Edit, getDetail } from '../service'
import { audit, getDetail, regionTree } from '../service'
const formItemLayout = {
  labelCol: { span: 8 },
@@ -15,6 +15,8 @@
  const [fileList, setFileList] = useState([])//banner图片
  const [loading, setLoading] = useState(false);
  const [editData, setEditData] = useState({})
  const [userInfo, setUserInfo] = useState({})//党员信息
  const [items, setItems] = useState([]);
  const formItemLayout = {
    labelCol: { span: 6 },
@@ -25,25 +27,21 @@
  useImperativeHandle(ref, () => {
    return {
      refreshData: (data) => {
        setEditData(data);
        regionTree({}).then(res => {
          setItems(() => res.data)
        })
        if (data.id) {
          // getDetail(data.id).then(res => {
          //   if (res.data.url) {
          //     let obj = [{
          //       uid: 1,
          //       name: 'banner',
          //       url: res.data.url
          //     }]
          //     setFileList(obj)
          //     form.setFieldsValue({ image: obj })
          //   }
          //   form.setFieldsValue({name: res.data.name})
          // })
          getDetail(data.id).then(res => {
            res.data.community = [res.data.districtsCode, res.data.streetId, res.data.communityId.toString()]
            setUserInfo(() => res.data)
            form.setFieldsValue(res.data)
          })
        }
      },
      clean: () => {
        form.resetFields();
        setUserInfo({})
        setFileList([])
      },
    };
@@ -54,15 +52,14 @@
  // 提交表单
  const submit = () => {
    form.validateFields().then(async (values) => {
      values.url = fileList[0].url
      delete values.image
      if (editData.id) {
        values.id = editData.id
        onUpdate(values)
        return
      let params = {
        id: editData.id,
        auditStatus: editData.type == 'sure' ? 1 : 2,
      }
      onSave(values)
      if (editData.type == 'refuse') {
        params.refuseReason = values.refuseReason
      }
      onSave(params)
    })
  }
@@ -77,7 +74,7 @@
      onCancel={() => onCancel(false)}
      onOk={submit}
    >
      <div style={{ width: '100%', textAlign: 'center', margin: '20px 0', fontWeight: 'bold' }}>确认审核{editData.type == 'sure' ? '同意' : '拒绝'}所选信息么?</div>
      <div style={{ width: '100%', textAlign: 'center', margin: '20px 0', fontWeight: 'bold', fontSize: "22px" }}>确认审核{editData.type == 'sure' ? '通过' : '拒绝'}所选信息么?</div>
      <Form scrollToFirstError layout="horizontal" {...formItemLayout} form={form}>
        <Row>
          <Col span={8}>
@@ -89,30 +86,40 @@
              <Input disabled placeholder='请输入'></Input>
            </Form.Item>
            <Form.Item
              name="name"
              name="community"
              label='所在社区'
              required
            >
              <Input disabled placeholder='请输入'></Input>
              <Cascader
                disabled
                options={items}
                fieldNames={{ value: 'id', label: 'name' }}
                placeholder="请选择"
              // onChange={(value, label) => {
              //   setCommunity(() => label)
              // }}
              // displayRender={(label) => label[label.length - 1]}
              // changeOnSelect={true}
              />
            </Form.Item>
            <Form.Item
              name="name"
              name="avatar"
              label='头像上传'
              required
            >
              <Input disabled placeholder='请输入'></Input>
              <Image src={userInfo.avatar} width={100} height={100} />
            </Form.Item>
          </Col>
          <Col span={8}>
            <Form.Item
              name="name"
              name="phone"
              label='联系电话'
              required
            >
              <Input disabled placeholder='请输入'></Input>
            </Form.Item>
            <Form.Item
              name="name"
              name="serviceTarget"
              label='服务对象'
              required
            >
@@ -120,14 +127,14 @@
            </Form.Item></Col>
          <Col span={8}>
            <Form.Item
              name="name"
              name="idNumber"
              label='身份证号'
              required
            >
              <Input disabled placeholder='请输入'></Input>
            </Form.Item>
            <Form.Item
              name="name"
              name="partyOrganization"
              label='所在党组织'
              required
            >
@@ -141,7 +148,7 @@
            <Row>
              <Col span={8}>
                <Form.Item
                  name="remark"
                  name="refuseReason"
                  label='拒绝理由'
                  rules={[{ required: true, message: '拒绝理由必填' }]}
                >
management/src/pages/party/audit/index.jsx
@@ -1,10 +1,10 @@
import { PageContainer, ProTable } from '@ant-design/pro-components';
import { buildProTableDataSource, sendRequest, showDelConfirm } from '@/utils/antdUtils';
import { Button, message, Space,Cascader } from 'antd';
import { useRef, useState } from 'react';
import { Button, message, Space, Cascader } from 'antd';
import { useRef, useState, useEffect } from 'react';
import { Access, history, useAccess } from 'umi';
import AddAndEdit from './components/index';
import { getList, updateStatus, deleteBanner, add, Edit } from './service'
import { getList, regionTree, audit } from './service'
const Banner = () => {
  const actionRef = useRef();
@@ -22,44 +22,54 @@
    {
      title: '性别',
      hideInSearch: true,
      dataIndex: 'name'
      dataIndex: 'gender',
      valueEnum: {
        1: { text: '男' },
        0: { text: '女' },
      }
    },
    {
      title: '联系电话',
      hideInSearch: true,
      dataIndex: 'name'
      dataIndex: 'phone'
    },
    {
      title: '身份证号',
      hideInSearch: true,
      dataIndex: 'name'
      dataIndex: 'idNumber'
    },
    {
      title: '所在社区',
      dataIndex: 'name',
      dataIndex: 'community',
      renderFormItem: () => {
        return (
          <Cascader
            options={items}
            fieldNames={{ value: 'key', label: 'name' }}
            fieldNames={{ value: 'id', label: 'name' }}
            placeholder="请选择"
            displayRender={(label) => label[label.length - 1]}
            changeOnSelect={true}
          />
        );
      },
      render: (text, record) => {
        return record.community
      }
    },
    {
      title: '服务对象',
      dataIndex: 'name'
      dataIndex: 'serviceTarget',
      render: (text, record) => {
        return record.serviceTarget
      }
    },
    {
      title: '所在党组织',
      dataIndex: 'name'
      dataIndex: 'partyOrganization'
    },
    {
      title: '申请时间',
      dataIndex: 'status',
      dataIndex: 'createTime',
      hideInSearch: true,
    },
    {
@@ -68,33 +78,44 @@
      render: (text, record) => {
        return (
          <Space>
            {/* <Access accessible={access['/work_order_transaction_management/banner_management/del']}> */}
            <Button
              type="link"
              onClick={() => {
                addViewRef.current.refreshData({type:'sure',id:record.id});
                handleModalVisible(true);
              }}
            >
              通过
            </Button>
            {/* </Access> */}
            {/* <Access accessible={access['/work_order_transaction_management/banner_management/del']}> */}
            <Button
              type="link"
              onClick={() => {
                addViewRef.current.refreshData({type:'refuse',id:record.id});
                handleModalVisible(true);
              }}
            >
              拒绝
            </Button>
            {/* </Access> */}
            {record.auditStatus == 0 && (
              <>
                <Access accessible={access['/party_member_audit/audit']}>
                <Button
                  type="link"
                  onClick={() => {
                    addViewRef.current.refreshData({ type: 'sure', id: record.id });
                    handleModalVisible(true);
                  }}
                >
                  通过
                </Button>
                </Access>
                <Access accessible={access['/party_member_audit/audit']}>
                <Button
                  type="link"
                  onClick={() => {
                    addViewRef.current.refreshData({ type: 'refuse', id: record.id });
                    handleModalVisible(true);
                  }}
                >
                  拒绝
                </Button>
                </Access>
              </>
            )}
          </Space >
        );
      },
    },
  ]
  useEffect(() => {
    regionTree({}).then(res => {
      setItems(() => res.data)
    })
  }, [])
  return <div>
    <PageContainer title='党员审核' header={{
@@ -110,6 +131,8 @@
          defaultPageSize: 10,
        }}
        request={(params) => {
          params.auditStatus = 0
          params.communityId = params.community ? params.community[params.community.length - 1] : ''
          return buildProTableDataSource(getList, params)
        }}
        toolBarRender={false}
@@ -119,18 +142,12 @@
        visible={modalVisible}
        onCancel={() => handleModalVisible(false)}
        onSave={async (fileds) => {
          // const success = await sendRequest(add, fileds);
          // if (success) {
          //   handleModalVisible(false);
          //   actionRef.current.reload();
          // }
        }}
        onUpdate={async (fileds) => {
          // const success = await sendRequest(Edit, fileds);
          // if (success) {
          //   handleModalVisible(false);
          //   actionRef.current.reload();
          // }
          const success = await sendRequest(audit, fileds);
          if (success) {
            handleModalVisible(false);
            addViewRef.current.clean()
            actionRef.current.reload();
          }
        }}
      />
    </PageContainer>
management/src/pages/party/audit/service.js
@@ -2,43 +2,33 @@
// 列表
export const getList = async (data) => {
    return request(`/api/huacheng-sangeshenbian/banner/list`, {
    return request(`/api/huacheng-sangeshenbian/party-member/list`, {
        method: 'POST',
        data:data
    });
}
export const regionTree = async (data) => {
    return request('/api/huacheng-sangeshenbian/systemUser/regionTree', {
        method: 'GET',
        params:data
        data,
    });
}
export const audit = async (data) => {
    return request(`/api/huacheng-sangeshenbian/party-member/audit`, {
        method: 'POST',
        data
    });
}
// 详情
export const getDetail = async (id) => {
    return request(`/api/huacheng-sangeshenbian/banner/getBannerInfo/${id}`, {
    return request(`/api/huacheng-sangeshenbian/party-member/${id}`, {
        method: 'GET',
        // data
    });
}
// 删除
export const deleteBanner = async (id) => {
    return request(`/api/huacheng-sangeshenbian/banner/delete/${id}`, {
        method: 'delete',
        // params
    });
}
// 添加 编辑
export const add = async (data) => {
    return request('/api/huacheng-sangeshenbian/banner/add', {
        method: 'POST',
        data,
    });
}
// 添加 编辑
export const Edit = async (data) => {
    return request('/api/huacheng-sangeshenbian/banner/edit', {
        method: 'POST',
        data,
    });
}
management/src/pages/party/manage/components/addAndEdit.jsx
@@ -3,9 +3,10 @@
import { PageContainer, } from '@ant-design/pro-components';
import { Button, Select, Row, Col, Input, Card, Space, Form, Upload, Spin, message, Cascader, InputNumber } from 'antd';
import { useState, useEffect } from 'react';
import { add, Edit, getDetail } from '../service';
import { add, Edit, getDetail, regionTree, verifyPhone } from '../service';
import { history, useLocation, useSearchParams } from 'umi';
import { customRequest } from '@/utils/utils';
const AddOrEditOrDetail = () => {
  const [form] = Form.useForm();
  const [loading, setLoading] = useState(false);
@@ -15,6 +16,8 @@
  const [adminLevel, setAdminLevel] = useState(1)
  const [fileList, setFileList] = useState([])
  const [community, setCommunity] = useState([])//社区
  const [userInfo, setUserInfo] = useState({})
  const formItemLayout = {
    labelCol: { span: 6 },
@@ -41,36 +44,47 @@
    name: 'file',
    action: 'https://huacheng.psciio.com/api/huacheng-communitybackstage/communitypartybuilding/uploadimage',
    headers: {
      Authorization: 'Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOjE4OTI0MjE4MjgwODU4Mzc4MjYsInR5cGUiOjEsImV4cCI6MTc0MTY1OTg5MywiY3JlYXRlZCI6MTc0MDM2Mzg5MzE2MH0.o3Gc0g1LAo_kkL3X3QrC6qKwztxsp6psoTcpTreDzQUXGqPzUXw89fNSR5YKz8gzhtSuSKI2d6TJJYPX1IQCgw',
      Authorization: `Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOjE2MTc2LCJ0eXBlIjoxLCJleHAiOjE3NDM0OTM5NzYsImNyZWF0ZWQiOjE3NDIxOTc5NzY5NDB9.Lph5ktdjynkIhOdkfFa6pgPM9rQJ2bcGJdk8i9_GOs-ZRR79PrqWWgwgAXsUwOdYUInEDdP90uBXxvBV8SJhvA`,
    },
  };
  useEffect(() => {
    let adminInfo = JSON.parse(localStorage.getItem('userInfo'))
    setAdminLevel(() => adminInfo.accountLevel)//角色权限1市级2区县3街道4社区5党员
    regionTree({}).then(res => {
      setItems(() => res.data)
    })
    if (searchParams.get('id')) {
      getDetail(searchParams.get('id')).then(res => {
        setUserInfo(() => res.data)
        res.data.community = [res.data.districtsCode, res.data.streetId, res.data.communityId.toString()]
        setCommunity(() => res.data.community)
        if (res.data.avatar) {
          setFileList(() => [{ url: res.data.avatar, uid: '1' }])
        }
        form.setFieldsValue(res.data)
      })
    }
  }, [])
  // 上传前
  const beforeUpload = (file, type) => {
    return new Promise(async (resolve, reject) => {
  const beforeUpload = (file) => {
    return new Promise((resolve, reject) => {
      if (file.name.includes(',')) {
        message.warning('上传图片名字不能包含英文逗号(,)');
        return Upload.LIST_IGNORE;
      }
      console.log('============================================')
      setLoading(false)
      setLoading(true)
      resolve(file);
    });
  };
  const handleChange = ({ file: file, fileList: newFileList }, type) => {
    console.log(file, 'newfilelist', newFileList, 'type', type)
    if (file.status == 'error') {
  const handleChange = ({ file, fileList: newFileList }) => {
    if (file.status == 'error' || (file.status == 'done' && file.response.code != 200)) {
      setLoading(false)
      // setFileList([])
      message.error('上传失败')
      return
    }
    if (file.status == 'done') {
    if (file.status == 'done' && file.response.code == 200) {
      setLoading(false)
      message.success('上传成功')
    }
@@ -82,16 +96,36 @@
      }
      return item.url
    });
    console.log('newFileList', newFileList, 'list', list)
    // if (type == 1) {
    //   setImageUrl1(newFileList)
    // } else if (type == 2) {
    //   setImageUrl(newFileList)
    // }
    setFileList(() => newFileList)
  };
  const submit = () => {
    form.validateFields().then(async (values) => {
      if (fileList.length == 0) {
        message.warning('请上传头像')
        return
      }
      let params = { ...values }
      let adminInfo = JSON.parse(localStorage.getItem('userInfo'))
      params.communityId = params.community.length > 0 ? params.community[params.community.length - 1] : ''
      params.streetId = params.community.length > 1 ? params.community[params.community.length - 2] : adminInfo.streetId
      params.districtsCode = params.community.length == 3 ? params.community[0] : adminInfo.districtsCode
      delete params.community
      params.avatar = fileList[0].url
      if (searchParams.get('id')) {
        params.id = searchParams.get('id')
        let res = await Edit(params)
        if (res.code == 200) {
          message.success('编辑成功')
          history.back()
        }
      } else {
        let res = await add(params)
        if (res.code == 200) {
          message.success('添加成功')
          history.back()
        }
      }
    })
  }
@@ -110,7 +144,14 @@
    return Promise.resolve();
  };
  const checkPhoneUse = (e) => {
    console.log('eeeeeeeeee', e.target.value)
    if (Object.keys(userInfo).length > 0 && userInfo.phone == e.target.value) {
      return Promise.resolve()
    }
    verifyPhone({ phone: e.target.value }).then(res => {
      if (res.code != 200) {
        message.warning('该手机号已注册党员信息')
      }
    })
  }
@@ -130,42 +171,45 @@
                  <Input disabled={searchParams.get('detail')} placeholder='请输入'></Input>
                </Form.Item>
                <Form.Item
                  name="name"
                  name="phone"
                  label='联系电话' rules={[{ required: true, message: '请输入党员联系电话' }, { validator: checkPhone }]}
                >
                  <Input disabled={searchParams.get('detail')} placeholder='请输入' maxLength={11} onBlur={checkPhoneUse} ></Input>
                </Form.Item>
                <Form.Item
                  name="idcard"
                  name="idNumber"
                  label='身份证号' rules={[{ required: true, message: '请输入党员身份证号' }, { validator: checkIdCard }]}
                >
                  <Input disabled={searchParams.get('detail')} placeholder='请输入' maxLength={18}></Input>
                </Form.Item>
                <Form.Item
                  name="name"
                  name="community"
                  label='所在社区'
                  rules={[{ required: true, message: '请选择所在社区' }]}
                >
                  <Cascader
                    disabled={searchParams.get('detail') || adminLevel == 4}
                    options={items}
                    fieldNames={{ value: 'key', label: 'name' }}
                    fieldNames={{ value: 'id', label: 'name' }}
                    placeholder="请选择"
                    displayRender={(label) => label[label.length - 1]}
                    changeOnSelect={true}
                    onChange={(value, label) => {
                      setCommunity(() => label)
                    }}
                  // displayRender={(label) => label[label.length - 1]}
                  // changeOnSelect={true}
                  />
                </Form.Item>
                <Form.Item
                  name="name"
                  name="serviceTarget"
                  label='服务对象'
                //  rules={[ { required: true,message: '请输入服务对象'}]}
                >
                  <Input disabled={searchParams.get('detail')} placeholder='请输入'></Input>
                </Form.Item>
                <Form.Item
                  name="name"
                  name="partyOrganization"
                  label='所在党组织'
                //  rules={[ { required: true,message: '请输入所在党组织'}]}
                >
@@ -173,7 +217,7 @@
                </Form.Item>
                <Form.Item
                  name="image"
                  name="avatar"
                  label="头像上传"
                  // extra={
                  //   <div>
@@ -196,8 +240,9 @@
                    onRemove={() => {
                      setFileList([])
                      form.setFieldsValue({
                        image: ''
                        avatar: null
                      })
                      form.validateFields(['avatar'])
                    }}
                    showUploadList={{
                      showPreviewIcon: false,
management/src/pages/party/manage/components/export.jsx
@@ -13,14 +13,18 @@
  const [form] = Form.useForm();
  const [status, setStatus] = useState(true);
  const okHandle = () => {
    onSave()
    // form.validateFields().then((values) => {
    //   onSave(values.file.file);
    // });
    // onSave()
    form.validateFields().then((values) => {
      if(status){
        message.warning('请上传文件')
        return
      }
      onSave(values.file.file);
    });
  };
  const downLod = () => {
    // downLoad('/tCheck/import-template', '检查项导入模版');
    downLoad('/api/huacheng-sangeshenbian/party-member/download', '导入模版');
  };
  const onChange = (e) => {
@@ -35,6 +39,7 @@
    return {
      refreshData: (data) => {},
      clean: () => {
        setStatus(true)
        form.resetFields();
      },
    };
management/src/pages/party/manage/components/index.jsx
@@ -1,6 +1,6 @@
import { Form, Input, Modal, Select, Upload, Space, Button, message } from 'antd';
import { PageContainer, ProTable } from '@ant-design/pro-components';
import { forwardRef, useEffect, useImperativeHandle, useState,useRef } from 'react';
import { forwardRef, useEffect, useImperativeHandle, useState, useRef, useMemo } from 'react';
const AddEditView = ({ visible, onSave, onUpdate, onCancel, }, ref) => {
  const actionRef = useRef();
@@ -14,84 +14,84 @@
    {
      title: '联系电话',
      hideInSearch: true,
      dataIndex: 'name'
      dataIndex: 'phone'
    },
    {
      title: '身份证号',
      dataIndex: 'name'
      dataIndex: 'idNumber'
    },
    {
      title: '所在社区',
      dataIndex: 'name',
      dataIndex: 'community',
    },
    {
      title: '服务对象',
      dataIndex: 'name'
      dataIndex: 'serviceTarget'
    },
    {
      title: '所在党组织',
      dataIndex: 'name'
      dataIndex: 'partyOrganization'
    },
    {
      title: '失败原因',
      dataIndex: 'status',
      dataIndex: 'failReason',
    },
  ]
  useImperativeHandle(ref, () => {
    return {
      refreshData: (data) => {
       setTableListData(()=>data)
      },
      clean: () => {
        setTableListData(()=>[])
      },
    };
  });
  // 提交表单
  const submit = () => {
  }
  return (
    <Modal
      getContainer={false}
      width="65%"
      destroyOnClose
      title={'数据导入失败提示'}
      title="数据导入失败提示"
      open={visible}
      onCancel={() => onCancel(false)}
      footer={
        [
          <Button
            key="submit"
            type="primary"
            onClick={() => onCancel(false)}
          >
            确认
          </Button>,
        ]
      }
      footer={[
        <Button
          key="submit"
          type="primary"
          onClick={() => onCancel(false)}
        >
          确认
        </Button>,
      ]}
    >
      <div>
        <div style={{width:'100%',textAlign:'center',marginBottom:'20px',fontWeight:'bold'}}>以下信息导入失败</div>
        <div
          style={{
            width: '100%',
            textAlign: 'center',
            marginBottom: '20px',
            fontWeight: 'bold'
          }}
        >
          以下信息导入失败
        </div>
        <ProTable
        rowKey='id'
        search={false}
        actionRef={actionRef}
        columns={columns}
        dataSource={tableListData}
        pagination={{
          showSizeChanger: true,
          showQuickJumper: true,
          defaultPageSize: 10,
        }}
        toolBarRender={false}
      />
          rowKey="id"
          search={false}
          actionRef={actionRef}
          columns={columns}
          dataSource={tableListData}
          pagination={{
            showSizeChanger: true,
            showQuickJumper: true,
            defaultPageSize: 10,
          }}
          toolBarRender={false}
        />
      </div>
    </Modal>
  );
management/src/pages/party/manage/index.jsx
@@ -1,17 +1,18 @@
import { PageContainer, ProTable } from '@ant-design/pro-components';
import { buildProTableDataSource, sendRequest, showDelConfirm } from '@/utils/antdUtils';
import { buildProTableDataSource, sendRequest, showDelConfirm, showDelConfirm1 } from '@/utils/antdUtils';
import { Button, message, Space, Cascader } from 'antd';
import { useRef, useState } from 'react';
import { useRef, useState, useEffect } from 'react';
import { Access, history, useAccess } from 'umi';
import AddAndEdit from './components/index';
import ImportExcell from './components/export';
import { getList, updateStatus, deleteBanner, add, Edit } from './service'
import { getList, deleteBanner, freeze, regionTree, enterList } from './service'
import { exportExcell } from '@/utils/utils'
const Banner = () => {
  const actionRef = useRef();
  const access = useAccess();
  const addViewRef = useRef();
  const modalExportRef = useRef();
  const [modalVisible, handleModalVisible] = useState(false);
  const [items, setItems] = useState([]);
  const [excelParams, setExcelParams] = useState({});
@@ -26,38 +27,51 @@
    {
      title: '性别',
      hideInSearch: true,
      dataIndex: 'name'
      dataIndex: 'gender',
      valueEnum: {
        1: { text: '男' },
        0: { text: '女' },
      }
    },
    {
      title: '所在社区',
      dataIndex: 'name',
      dataIndex: 'community',
      renderFormItem: () => {
        return (
          <Cascader
            options={items}
            fieldNames={{ value: 'key', label: 'name' }}
            fieldNames={{ value: 'id', label: 'name' }}
            placeholder="请选择"
            displayRender={(label) => label[label.length - 1]}
            changeOnSelect={true}
          // changeOnSelect={true}
          />
        );
      },
      render: (text, record) => {
        return record.community
      }
    },
    {
      title: '服务对象',
      dataIndex: 'name'
      dataIndex: 'serviceTarget',
      render: (text, record) => {
        return record.serviceTarget
      }
    },
    {
      title: '所在党组织',
      dataIndex: 'name'
      dataIndex: 'partyOrganization',
      render: (text, record) => {
        return record.partyOrganization
      }
    },
    {
      title: '状态',
      dataIndex: 'status',
      dataIndex: 'freezeStatus',
      valueEnum: {
        0: { text: '全部' },
        1: { text: '正常中' },
        2: { text: '已冻结' },
        // 'all': { text: '全部' },
        '1': { text: '已冻结' },
        '0': { text: '正常中' },
      }
    },
    {
@@ -66,7 +80,7 @@
      render: (text, record) => {
        return (
          <Space>
            {/* <Access accessible={access['/work_order_transaction_management/banner_management/edit']}> */}
            <Access accessible={access['/party_member/edit']}>
            <Button
              type="link"
              onClick={() => {
@@ -75,23 +89,23 @@
            >
              编辑
            </Button>
            {/* </Access> */}
            {/* <Access accessible={access['/work_order_transaction_management/banner_management/del']}> */}
            </Access>
            <Access accessible={access['/party_member/del']}>
            <Button
              type="link"
              onClick={() => {
                showDelConfirm(async () => {
                  // let status = await sendRequest(deleteBanner, record.id)
                  // if (status) {
                  //   actionRef.current.reload();
                  // }
                  let status = await sendRequest(deleteBanner, {id:record.id})
                  if (status) {
                    actionRef.current.reload();
                  }
                }, '确认删除所选信息吗?');
              }}
            >
              删除
            </Button>
            {/* </Access> */}
            {/* <Access accessible={access['/work_order_transaction_management/banner_management/del']}> */}
            </Access>
            <Access accessible={access['/party_member/detail']}>
            <Button
              type="link"
              onClick={() => {
@@ -100,42 +114,53 @@
            >
              查看详情
            </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> */}
            {/* <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> */}
            </Access>
            <Access accessible={access['/party_member/freeze']}>
            {record.freezeStatus == 0 && (
              <Button
                type="link"
                onClick={() => {
                  showDelConfirm1(async () => {
                    let status = await sendRequest(freeze, { id: record.id })
                    if (status) {
                      actionRef.current.reload();
                    }
                  }, '确认冻结该党员信息吗?', '冻结', '', '确认冻结该党员信息吗?');
                }}
              >
                冻结
              </Button>
            )}
            </Access>
            <Access accessible={access['/party_member/freeze']}>
            {record.freezeStatus == 1 && (
              <Button
                type="link"
                onClick={() => {
                  showDelConfirm1(async () => {
                    let status = await sendRequest(freeze, { id: record.id })
                    if (status) {
                      actionRef.current.reload();
                    }
                  }, '确认解冻该党员信息吗?', '解冻', '', '确认解冻该党员信息吗?');
                }}
              >
                解冻
              </Button>
            )}
            </Access>
          </Space >
        );
      },
    },
  ]
  useEffect(() => {
    regionTree({}).then(res => {
      setItems(() => res.data)
    })
  }, [])
  return <div>
    <PageContainer title='党员管理' header={{
@@ -151,13 +176,14 @@
          defaultPageSize: 10,
        }}
        request={(params) => {
          params.status = (params.status && params.status != 0) ? params.status : '';
          params.communityId = params.community ? params.community[params.community.length - 1] : ''
          params.auditStatus = 1
          setExcelParams(() => params)
          return buildProTableDataSource(getList, params)
        }}
        toolBarRender={(action, selectRows) => [
          <Space>
            {/* <Access accessible={access['/work_order_transaction_management/banner_management/add']}> */}
            <Access accessible={access['/party_member/add']}>
            <Button
              type="primary"
              onClick={() => {
@@ -166,67 +192,63 @@
            >
              添加
            </Button>
            {/* </Access> */}
            {/* <Access accessible={access['/work_order_transaction_management/banner_management/add']}> */}
            </Access>
            <Access accessible={access['/party_member/export']}>
            <Button
              type="primary"
              onClick={() => {
                // exportExcell('党员列表', excelParams, '/promotion/mgt/coupon/receive-detail/export')
                exportExcell('党员列表', excelParams, '/api/huacheng-sangeshenbian/party-member/export')
              }}
            >
              导出
            </Button>
            {/* </Access> */}
            {/* <Access accessible={access['/work_order_transaction_management/banner_management/add']}> */}
            </Access>
            <Access accessible={access['/party_member/import']}>
            <Button
              type="primary"
              onClick={() => {
                // history.push('/party/manage/add?type=add')
                handleModalExport(true)
                modalExportRef.current.clean()
              }}
            >
              导入
            </Button>
            {/* </Access> */}
            </Access>
          </Space>
        ]}
      />
      {/* 导入失败弹窗 */}
      <AddAndEdit
        ref={addViewRef}
        visible={modalVisible}
        onCancel={() => handleModalVisible(false)}
        onSave={async (fileds) => {
          // const success = await sendRequest(add, fileds);
          // if (success) {
            handleModalVisible(false);
          //   actionRef.current.reload();
          // }
          handleModalVisible(false);
        }}
        onUpdate={async (fileds) => {
          // const success = await sendRequest(Edit, fileds);
          // if (success) {
            handleModalVisible(false);
          //   actionRef.current.reload();
          // }
          handleModalVisible(false);
        }}
      />
      <ImportExcell
        ref={modalExportRef}
        visible={modalExport}
        onSave={async (fileds) => {
          console.log('上传文件数据', fileds);
          handleModalExport(false);
          handleModalVisible(true)
          // const success = await sendRequest(enable, fileds);
          // if (success) {
          //   handleModalExport(false);
          //   // actionRef.current.reload();
          //   // listCheck({ checkType: checktype, }).then(res => {
          //   //   console.log('一键导入数据', res)
          //   // })
          // }
          enterList(fileds).then(res => {
            if (res.code == 200) {
              if (res.data.length > 0) {
                message.error('导入失败')
                handleModalExport(false);
                handleModalVisible(true)
                actionRef.current.reload()
                addViewRef.current.refreshData(res.data)
              } else {
                message.success('导入成功')
                handleModalExport(false);
                actionRef.current.reload()
              }
            }
          })
        }}
        onCancel={() => handleModalExport(false)}
      />
management/src/pages/party/manage/service.js
@@ -2,14 +2,14 @@
// 列表
export const getList = async (data) => {
    return request(`/api/huacheng-sangeshenbian/banner/list`, {
        method: 'GET',
        params:data
    return request(`/api/huacheng-sangeshenbian/party-member/list`, {
        method: 'POST',
        data:data
    });
}
// 详情
export const getDetail = async (id) => {
    return request(`/api/huacheng-sangeshenbian/banner/getBannerInfo/${id}`, {
    return request(`/api/huacheng-sangeshenbian/party-member/${id}`, {
        method: 'GET',
        // data
    });
@@ -17,16 +17,16 @@
// 删除
export const deleteBanner = async (id) => {
    return request(`/api/huacheng-sangeshenbian/banner/delete/${id}`, {
export const deleteBanner = async (params) => {
    return request(`/api/huacheng-sangeshenbian/party-member/${params.id}`, {
        method: 'delete',
        // params
        params
    });
}
// 添加 编辑
export const add = async (data) => {
    return request('/api/huacheng-sangeshenbian/banner/add', {
    return request('/api/huacheng-sangeshenbian/party-member/save', {
        method: 'POST',
        data,
    });
@@ -34,11 +34,57 @@
// 添加 编辑
export const Edit = async (data) => {
    return request('/api/huacheng-sangeshenbian/banner/edit', {
    return request('/api/huacheng-sangeshenbian/party-member/save', {
        method: 'POST',
        data,
    });
}
// 导出
export const exportList = async (data) => {
    return request('/api/huacheng-sangeshenbian/party-member/export', {
        method: 'POST',
        data,
    });
}
export const freeze = async (data) => {
    console.log('冻结')
    return request(`/api/huacheng-sangeshenbian/party-member/freeze/${data.id}`, {
        method: 'GET',
        // data,
    });
}
// 导入
export async function enable(data) {
    const formData = new FormData()
    formData.append('file',data.originFileObj)
    return request(`/tCheck/importContract`, {
      method: 'POST',
      data: formData
    });
  }
export const enterList = async (data) => {
    const formData = new FormData()
    formData.append('file',data.originFileObj)
    return request('/api/huacheng-sangeshenbian/party-member/import', {
        method: 'POST',
        data: formData
    });
}
// 获取社区
export const regionTree = async (data) => {
    return request('/api/huacheng-sangeshenbian/systemUser/regionTree', {
        method: 'GET',
        data,
    });
}
// 校验手机号是否存在
export const verifyPhone = async (data) => {
    return request(`/api/huacheng-sangeshenbian/party-member/verify/${data.phone}`, {
        method: 'GET',
        data,
    });
}
management/src/pages/setting/career/index.jsx
@@ -63,7 +63,9 @@
    <div>
      <PageContainer header={{
        breadcrumb: {},
      }}>
      }}
      title={'职位管理'}
      >
        <ProTable
          rowKey="id"
          actionRef={actionRef}
management/src/utils/utils.js
@@ -57,7 +57,7 @@
      ...params,
    }),
    headers: {
      Authorization: localStorage.getItem('token'),
      Authorization:'Bearer ' +  localStorage.getItem('token'),
      'ConTent-Type': 'application/json;charset=UTF-8',
      timestamp: new Date().getTime(),
      client: localStorage.getItem('client')
@@ -85,7 +85,7 @@
    method: 'get',
    responseType: 'blob',
    headers: {
      Authorization: localStorage.getItem('token'),
      Authorization:'Bearer ' + localStorage.getItem('token'),
      'ConTent-Type': 'application/json;charset=UTF-8',
      timestamp: new Date().getTime(),
      client: localStorage.getItem('client')