Merge branch 'master' of http://120.76.84.145:10101/gitblit/r/H5/threeSide
New file |
| | |
| | | {
|
| | | "marscode.codeCompletionPro": {
|
| | | "enableCodeCompletionPro": true
|
| | | },
|
| | | "marscode.enableInlineCommand": true
|
| | | } |
| | |
| | | <script> |
| | | export default { |
| | | onLaunch: function() { |
| | | console.log('App Launch') |
| | | |
| | | }, |
| | | onShow: function() { |
| | | console.log('App Show') |
| | | |
| | | }, |
| | | onHide: function() { |
| | | console.log('App Hide') |
| | | |
| | | } |
| | | } |
| | | </script> |
| | |
| | | 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', |
| | | } |
| | |
| | | getproblem |
| | | } from './service.js' |
| | | import config from '@/config/index.js' |
| | | |
| | | |
| | | export default { |
| | | data() { |
| | | return { |
| | |
| | | longPressActions: { |
| | | itemList: ['发送给朋友', '保存图片', '收藏'], |
| | | success: function(data) { |
| | | console.log('选中了第' + (data.tapIndex + 1) + '个按钮,第' + (data.index + 1) + '张图片'); |
| | | |
| | | }, |
| | | fail: function(err) { |
| | | console.log(err.errMsg); |
| | | |
| | | } |
| | | } |
| | | }); |
| | |
| | | }, |
| | | getproblem() { |
| | | getproblem().then((resp => { |
| | | console.log(resp, '问题类型') |
| | | |
| | | this.columns = [resp.data.map(item => { |
| | | return item.name |
| | | })] |
| | |
| | | videos: this.videos.join(','), |
| | | } |
| | | save(data).then(resp => { |
| | | console.log(resp, '保存'); |
| | | |
| | | if (resp.code == 200) { |
| | | uni.showToast({ |
| | | title: '保存成功', |
| | |
| | | }) |
| | | }, |
| | | confirmone(e) { |
| | | console.log(e, 'eeee'); |
| | | |
| | | this.time = dayjs(e.value).format('YYYY-MM-DD') |
| | | this.showDate = false |
| | | }, |
| | | confirmtwo(e) { |
| | | console.log(e, 'eeee'); |
| | | |
| | | this.problemType = e.value[0] |
| | | this.showList = false |
| | | }, |
| | |
| | | this.showList = false |
| | | }, |
| | | goTopagelocation() { |
| | | console.log('0000000000000000'); |
| | | |
| | | uni.navigateTo({ |
| | | url: '/pages/location/location' |
| | | }) |
| | |
| | | sizeType: ['original', 'compressed'], //可以指定是原图还是压缩图,默认二者都有 |
| | | sourceType: ['album'], //从相册选择 |
| | | success: (res) => { |
| | | console.log(res, 'res'); |
| | | |
| | | uni.showLoading() |
| | | uni.uploadFile({ |
| | | url: config.imageUrl, |
| | |
| | | 'Authorization': uni.getStorageSync('token') |
| | | }, |
| | | success: (uploadFileRes) => { |
| | | console.log(JSON.parse(uploadFileRes.data), 'uploadFileRes'); |
| | | |
| | | this.images = [...this.images, JSON.parse(uploadFileRes.data).data] |
| | | uni.hideLoading() |
| | | }, |
| | |
| | | count: 1, //默认9 |
| | | sourceType: ['camera', 'album'], |
| | | success: (res) => { |
| | | console.log(res, 'res'); |
| | | const videoExtensions = /\.(mp4|avi|rmvb)$/i; |
| | | if (!videoExtensions.test(res.name)) { |
| | | uni.showToast({ |
| | | title: '请上传mp4, avi, rmvb格式的视频', |
| | | icon: 'none', |
| | | duration: 3000 |
| | | }) |
| | | return |
| | | } |
| | | uni.showLoading() |
| | | uni.uploadFile({ |
| | | url: config.imageUrl, |
| | |
| | | 'Authorization': uni.getStorageSync('token') |
| | | }, |
| | | success: (uploadFileRes) => { |
| | | console.log(JSON.parse(uploadFileRes.data).data, 'uploadFileRes'); |
| | | |
| | | this.videos = [...this.videos, JSON.parse(uploadFileRes.data).data] |
| | | uni.hideLoading() |
| | | }, |
| | |
| | | methods: { |
| | | open() { |
| | | getInfo().then(resp => { |
| | | console.log(resp, '党员信息'); |
| | | |
| | | if(resp.code==200){ |
| | | this.info =resp.data |
| | | } |
| | |
| | | <view class="top_content"> |
| | | <image src="/static/home/bg@2x.png" class="bg-img vw100" style="z-index: 1;" mode=""></image> |
| | | <view class="main"> |
| | | <image src="/static/home/img6.png" class="h-85" mode=""></image> |
| | | <image class="w-275 h-28 mt-15" src="/static/home/img3.png" mode=""></image> |
| | | <image src="/static/home/img6.png" mode="widthFix"></image> |
| | | <image class="w-275 mt-15" src="/static/home/img3.png" mode="widthFix"></image> |
| | | <view class="flex a-center mt-17 mb-31"> |
| | | <image class="h-32" src="/static/home/img5.png" mode=""></image> |
| | | <image src="/static/home/img5.png" mode="widthFix"></image> |
| | | </view> |
| | | <swiper class="swiper " :indicator-dots="false" :autoplay="true" :interval="3000"> |
| | | <swiper-item v-for="item,index in bannerlist" :key="index"> |
| | |
| | | methods: { |
| | | Allread() { |
| | | getread().then(resp => { |
| | | console.log(resp, '====='); |
| | | |
| | | this.getMessagelist() |
| | | }) |
| | | }, |
| | | getBanner() { |
| | | getBanner().then(resp => { |
| | | console.log(resp, '获取banner'); |
| | | |
| | | this.bannerlist = resp.data |
| | | }) |
| | | }, |
| | | getappletcinfo() { |
| | | getappletcinfo().then(resp => { |
| | | console.log(resp, '-----判断角色'); |
| | | |
| | | this.userInfo = resp.data |
| | | this.member = resp.data ? 2 : 1 |
| | | uni.setStorageSync('userInfo', resp.data) |
| | |
| | | pageSize: 5 |
| | | } |
| | | getMessagelist(data).then(resp => { |
| | | console.log(resp, '获取消息列表'); |
| | | |
| | | if (resp.data.records.length < 5 && this.pageNum == 1) { |
| | | this.msgListTotal = resp.data.records |
| | | this.isLoading = true |
| | |
| | | 1) |
| | | this.noreadlists = this.msgLists.filter(item => item.readStatus === 0) |
| | | this.noreadlist = this.msgList.filter(item => item.readStatus === 0) |
| | | console.log(this.msgListTotal, 'this.msgListTotal'); |
| | | |
| | | }) |
| | | }, |
| | | changeActive(value) { |
| | |
| | | |
| | | }, |
| | | change() { |
| | | console.log('1111'); |
| | | |
| | | }, |
| | | |
| | | onClick() { |
| | | this.isClick = true |
| | | console.log('this.isClick', this.isClick); |
| | | |
| | | }, |
| | | goTopage() { |
| | | uni.navigateTo({ |
| | |
| | | result.id = index + 1 |
| | | return result |
| | | }); |
| | | console.log(this.locationList); |
| | | |
| | | } |
| | | }) |
| | | return |
| | |
| | | ak: '3mHKIXMArjgIkgADzOlTYp4XssNSNkwr' // 替换为你自己的 AK |
| | | }, |
| | | success: (res) => { |
| | | console.log(res, '-------'); |
| | | |
| | | if (res.data.status === 0) { |
| | | this.searchResults = res.data.results; |
| | | this.latitude = res.data.results[0].location.lat |
| | |
| | | }, |
| | | onReady() { |
| | | this.map = new BMapGL.Map("container"); // 创建地图实例 |
| | | console.log(this.map); |
| | | |
| | | // uni.getLocation({ |
| | | // type: 'wgs84', |
| | | // success: (res) => { |
| | |
| | | const longitude = position.coords.longitude; |
| | | const accuracy = position.coords.accuracy; // 精度,单位米 |
| | | |
| | | console.log(`纬度: ${latitude}, 经度: ${longitude}, 精度: ${accuracy}`); |
| | | |
| | | // 在这里可以使用获取到的经纬度信息,例如在地图上显示位置等。 |
| | | } |
| | | |
| | | function error(err) { |
| | | console.log(err); |
| | | |
| | | switch (err.code) { |
| | | case err.PERMISSION_DENIED: |
| | | console.error("用户拒绝了位置请求。"); |
| | |
| | | item.id = index + 1 |
| | | return item |
| | | }) |
| | | console.log(this.locationList); |
| | | |
| | | }) |
| | | this.map.addEventListener('click', (e) => { |
| | | this.clearMarkers() |
| | |
| | | var myGeo = new BMapGL.Geocoder(); |
| | | // 根据坐标得到地址描述 |
| | | myGeo.getLocation(new BMapGL.Point(e.latlng.lng, e.latlng.lat), (result) => { |
| | | console.log(result, 'result'); |
| | | |
| | | this.locationList = result.surroundingPois.map((item, index) => { |
| | | item.id = index + 1 |
| | | return item |
| | |
| | | }); |
| | | // }, |
| | | // error:err=>{ |
| | | // console.log(err,'err'); |
| | | // |
| | | // } |
| | | // }); |
| | | |
| | |
| | | return dayjs(val).format('YYYY-MM-DD HH:mm:ss') |
| | | } |
| | | }, |
| | | onLoad(params) { |
| | | onShow(params) { |
| | | this.id = params.id |
| | | if (params.type) { |
| | | this.type = false |
| | |
| | | getComplaintDetail({ |
| | | id: params.id |
| | | }).then(res => { |
| | | console.log('res', res) |
| | | |
| | | this.info = { |
| | | ...res.data |
| | | } |
| | |
| | | }) |
| | | }, |
| | | uploadImg(type) { |
| | | // if (!this.againCklicFlag) return |
| | | this.againCklicFlag = false |
| | | if (type == 1) { |
| | | uni.chooseImage({ |
| | | count: 1, |
| | | success: (chooseImageRes) => { |
| | | this.completionImages.push('loading') |
| | | this.againCklicFlag = true |
| | | let imgPathList = chooseImageRes.tempFilePaths; |
| | | if (imgPathList.length > 0) { |
| | | uni.uploadFile({ |
| | |
| | | this.localImageUrls.push(imgPathList[0]) |
| | | }) |
| | | } else { |
| | | this.againCklicFlag = true |
| | | this.completionImages = this.completionImages.filter( |
| | | item => item != 'loading') |
| | | uni.showToast({ |
| | |
| | | } |
| | | }, |
| | | fail: (err) => { |
| | | this.againCklicFlag = true |
| | | this.completionImages = this.completionImages.filter( |
| | | item => item != 'loading') |
| | | uni.showToast({ |
| | |
| | | } |
| | | }) |
| | | } |
| | | }, |
| | | } |
| | | }) |
| | | } else { |
| | | uni.chooseVideo({ |
| | | camera: 'back', |
| | | count: 1, //默认9 |
| | | success: (res) => { |
| | | const videoExtensions = /\.(mp4|avi|rmvb)$/i; |
| | | if (!videoExtensions.test(res.name)) { |
| | | uni.showToast({ |
| | | title: '请上传mp4, avi, rmvb格式的视频', |
| | | icon: 'none', |
| | | duration: 3000 |
| | | }) |
| | | return |
| | | } |
| | | this.completionVideos.push('loading') |
| | | this.againCklicFlag = true |
| | | const tempFilePath = res.tempFilePath; |
| | | uni.uploadFile({ |
| | | url: config.imageUrl, |
| | |
| | | .data) |
| | | }) |
| | | } else { |
| | | this.againCklicFlag = true |
| | | this.completionVideos = this.completionVideos.filter( |
| | | item => item != 'loading') |
| | | uni.showToast({ |
| | |
| | | } |
| | | }, |
| | | fail: (err) => { |
| | | this.againCklicFlag = true |
| | | this.completionVideos = this.completionVideos.filter( |
| | | item => item != 'loading') |
| | | uni.showToast({ |
| | |
| | | uni.chooseVideo({ |
| | | camera: 'back', |
| | | success: (res) => { |
| | | const videoExtensions = /\.(mp4|avi|rmvb)$/i; |
| | | if (!videoExtensions.test(res.name)) { |
| | | uni.showToast({ |
| | | title: '请上传mp4, avi, rmvb格式的视频', |
| | | icon: 'none', |
| | | duration: 3000 |
| | | }) |
| | | return |
| | | } |
| | | this.video.push('loading') |
| | | this.againCklicFlag = true |
| | | const tempFilePath = res.tempFilePath; |
| | |
| | | <view class="allContent"> |
| | | <view class="topStatus"> |
| | | <view class="status"> |
| | | {{['正在办理','延期办理','超时办理','已办结 ','群众撤销','上报待审核','上级驳回','延期待审核'][orderInfo.status] ||''}} |
| | | {{ ['正在办理', '延期办理', '超时办理', '已办结 ', '群众撤销', '上报待审核', '上级驳回', '延期待审核'][orderInfo.status] || '' }} |
| | | </view> |
| | | <view class="flex a-center j-between mb-17"> |
| | | <view class="tit">当前状态</view> |
| | | <!-- 延期状态 --> |
| | | <view v-if="orderInfo.status==1" class="flex a-center" @click.stop="toDelayDetail()"> |
| | | <view v-if="orderInfo.status == 1" class="flex a-center" @click.stop="toDelayDetail()"> |
| | | <image src="../../static/detailImg/explain.png" class="plainIcon shrink0"></image> |
| | | <view class="explain">延期情况说明</view> |
| | | </view> |
| | | <!-- 超时状态 --> |
| | | <view v-if="orderInfo.status==2" class="flex a-center"> |
| | | <view v-if="orderInfo.status == 2" class="flex a-center"> |
| | | <image src="../../static/detailImg/notice.png" class="overTimeIcon shrink0"></image> |
| | | <view class="overTime">已超时</view> |
| | | <view class="day">{{orderInfo.createByName||0}}</view> |
| | | <view class="day">{{ orderInfo.createByName || 0 }}</view> |
| | | <view class="overTime">天</view> |
| | | </view> |
| | | |
| | | </view> |
| | | </view> |
| | | <!-- 已完结诉求信息 已办结--> |
| | | <view class="mt-19 flex a-center j-between topMore" v-if="orderInfo.status==3"> |
| | | <view class="mt-19 flex a-center j-between topMore" v-if="orderInfo.status == 3"> |
| | | <view class="name">诉求信息</view> |
| | | <view class="flex a-center" @click.stop="toProgressDetail"> |
| | | <view class="more">办理进度</view> |
| | |
| | | </view> |
| | | |
| | | <!-- 上级驳回 --> |
| | | <view class="mt-19 flex a-center j-between topMore" v-if="orderInfo.status==6"> |
| | | <view class="mt-19 flex a-center j-between topMore" v-if="orderInfo.status == 6"> |
| | | <view class="name">上报情况</view> |
| | | </view> |
| | | |
| | | <!-- 上报后的状态 --> |
| | | <view class="card1" v-if="[6,7,5].includes(orderInfo.status)"> |
| | | <view class="card1" v-if="[6, 7, 5].includes(orderInfo.status)"> |
| | | <!-- 上报上级上级驳回--> |
| | | <view class="flex j-between" v-if="orderInfo.status==6"> |
| | | <view class="flex j-between" v-if="orderInfo.status == 6"> |
| | | <view class="flex flex-column a-center mr-46"> |
| | | <image src="../../static/detailImg/Ovaled.png" class="topIcon shrink0"></image> |
| | | <view class="proLine"> |
| | |
| | | <view class="infoCard mb-46"> |
| | | <view class="flex j-between"> |
| | | <view class="label">审核时间</view> |
| | | <view class="value">{{orderInfo.auditTime|formatTime}}</view> |
| | | <view class="value">{{ orderInfo.auditTime | formatTime }}</view> |
| | | </view> |
| | | <view class="flex j-between"> |
| | | <view class="label">审核人</view> |
| | | <view class="value">{{orderInfo.auditorName||''}}</view> |
| | | <view class="value">{{ orderInfo.auditorName || '' }}</view> |
| | | </view> |
| | | <view class="flex j-between"> |
| | | <view class="label">联系电话</view> |
| | | <view class="value">{{orderInfo.auditorPhone||''}}</view> |
| | | <view class="value">{{ orderInfo.auditorPhone || '' }}</view> |
| | | </view> |
| | | <view class="flex j-between"> |
| | | <view class="label">驳回原因</view> |
| | | <view class="value">{{orderInfo.rejectReason||''}}</view> |
| | | <view class="value">{{ orderInfo.rejectReason || '' }}</view> |
| | | </view> |
| | | </view> |
| | | </view> |
| | |
| | | <view class="infoCard"> |
| | | <view class="flex j-between"> |
| | | <view class="label">上报人</view> |
| | | <view class="value">{{orderInfo.reporter||''}}</view> |
| | | <view class="value">{{ orderInfo.reporter || '' }}</view> |
| | | </view> |
| | | <view class="flex j-between"> |
| | | <view class="label">联系电话</view> |
| | | <view class="value">{{orderInfo.contactNumber||''}}</view> |
| | | <view class="value">{{ orderInfo.contactNumber || '' }}</view> |
| | | </view> |
| | | <view class="flex j-between" v-if="!isParty"> |
| | | <view class="label">所属部门</view> |
| | | <view class="value">{{orderInfo.departmentName||""}}</view> |
| | | <view class="value">{{ orderInfo.departmentName || "" }}</view> |
| | | </view> |
| | | <view class="flex j-between"> |
| | | <view class="label">上报时间</view> |
| | | <view class="value">{{orderInfo.reportTime|formatTime}}</view> |
| | | <view class="value">{{ orderInfo.reportTime | formatTime }}</view> |
| | | </view> |
| | | <view class="flex j-between"> |
| | | <view class="label">上报说明</view> |
| | | <view class="value">{{orderInfo.comment||''}}</view> |
| | | <view class="value">{{ orderInfo.comment || '' }}</view> |
| | | </view> |
| | | </view> |
| | | </view> |
| | |
| | | <!-- --> |
| | | <view class="cardInfo"> |
| | | <view class="flex j-between a-center"> |
| | | <view class="title">诉求号:{{orderInfo.serialNumber||''}}</view> |
| | | <view class="flex a-center" v-if="orderInfo.status==0" @click.stop="applyOverTime"> |
| | | <view class="title">诉求号:{{ orderInfo.serialNumber || '' }}</view> |
| | | <view class="flex a-center" v-if="orderInfo.status == 0" @click.stop="applyOverTime"> |
| | | <view class="apply">延期申请</view> |
| | | <image src="../../static/detailImg/right.png" class="rightIcon shrink0"></image> |
| | | </view> |
| | | </view> |
| | | <view class="addressCard"> |
| | | <view class="address">{{orderInfo.location||""}}</view> |
| | | <view class="address">{{ orderInfo.location || "" }}</view> |
| | | <image src="../../static/detailImg/dwei.png" class="addressIcon shrink0" mode="aspectFill"></image> |
| | | </view> |
| | | <view class="flex j-between"> |
| | | <view class="label">创建时间</view> |
| | | <view class="value">{{orderInfo.createTime|formatTime}}</view> |
| | | <view class="value">{{ orderInfo.createTime | formatTime }}</view> |
| | | </view> |
| | | <view class="flex j-between"> |
| | | <view class="label">问题类型</view> |
| | | <view class="value">{{orderInfo.problemType||''}}</view> |
| | | <view class="value">{{ orderInfo.problemType || '' }}</view> |
| | | </view> |
| | | <view class="flex j-between"> |
| | | <view class="label">群众姓名</view> |
| | | <view class="value">{{orderInfo.name||''}}</view> |
| | | <view class="value">{{ orderInfo.name || '' }}</view> |
| | | </view> |
| | | <view class="flex j-between"> |
| | | <view class="label"> 联系电话</view> |
| | | <view class="value">{{orderInfo.contactNumber||""}}</view> |
| | | <view class="value">{{ orderInfo.contactNumber || "" }}</view> |
| | | </view> |
| | | <view class="flex j-between"> |
| | | <view class="label">详细地址</view> |
| | | <view class="value">{{orderInfo.detailedAddress||''}}</view> |
| | | <view class="value">{{ orderInfo.detailedAddress || '' }}</view> |
| | | </view> |
| | | <!-- 上级端需要的字段 --> |
| | | <view v-if="!isParty"> |
| | | <view class="flex j-between"> |
| | | <view class="label">录入人</view> |
| | | <view class="value">{{orderInfo.nickname||''}}</view> |
| | | <view class="value">{{ orderInfo.nickname || '' }}</view> |
| | | </view> |
| | | <view class="flex j-between"> |
| | | <view class="label">录入人联系方式</view> |
| | | <view class="value">{{orderInfo.contactNumber||''}}</view> |
| | | <view class="value">{{ orderInfo.contactNumber || '' }}</view> |
| | | </view> |
| | | </view> |
| | | |
| | |
| | | <view class="problem"> |
| | | <view class="title">问题描述</view> |
| | | <view class="desc"> |
| | | <view class="top">{{orderInfo.descriptionTitle||""}}</view> |
| | | <view class="top">{{ orderInfo.descriptionTitle || "" }}</view> |
| | | <view class="line1"></view> |
| | | <view class="context">{{orderInfo.descriptionContent||''}}</view> |
| | | <view class="context">{{ orderInfo.descriptionContent || '' }}</view> |
| | | |
| | | </view> |
| | | <view class="title">描述图片</view> |
| | | <view class="descPic" v-if="problemImg.length>0"> |
| | | <view class="picItem" v-for="(item,index) in problemImg" @click.stop="viewImage(item)"> |
| | | <view class="descPic" v-if="problemImg.length > 0"> |
| | | <view class="picItem" v-for="(item, index) in problemImg" @click.stop="viewImage(item)"> |
| | | <image :src="item" class="img shrink0" mode="aspectFill"> |
| | | </image> |
| | | </view> |
| | | </view> |
| | | <view v-else class="noData">暂无数据</view> |
| | | <view class="title">描述视频</view> |
| | | <view class="descPic" v-if="problemVideos.length>0"> |
| | | <view class="picItem relative" v-for="(item,index) in problemVideos"> |
| | | <view class="descPic" v-if="problemVideos.length > 0"> |
| | | <view class="picItem relative" v-for="(item, index) in problemVideos"> |
| | | <video id="myVideo" class="videoImg shrink0" disabled :controls="false" |
| | | :show-center-play-btn="false" :src="item"> |
| | | </video> |
| | |
| | | </view> |
| | | |
| | | <!-- 办结情况 --> |
| | | <view class=" flex a-center j-between topMore topMore1" v-if="orderInfo.status==3"> |
| | | <view class=" flex a-center j-between topMore topMore1" v-if="orderInfo.status == 3"> |
| | | <view class="name">办结情况</view> |
| | | <view class="flex a-center"> |
| | | </view> |
| | | </view> |
| | | <!-- 办结结果描述 --> |
| | | <view class="resultDesc" v-if="orderInfo.status==3"> |
| | | <view class="resultDesc" v-if="orderInfo.status == 3"> |
| | | <view class="topInfo"> |
| | | <view class="flex a-center j-between mb-15"> |
| | | <view class="flex a-center"> |
| | | <view class="name">办结人员:</view> |
| | | <view class="value">{{orderInfo.completionUsername||''}}</view> |
| | | <view class="value">{{ orderInfo.completionUsername || '' }}</view> |
| | | </view> |
| | | <view class="flex a-center"> |
| | | <view class="name">联系电话:</view> |
| | | <view class="value">{{orderInfo.completionUserPhone||''}}</view> |
| | | <view class="value">{{ orderInfo.completionUserPhone || '' }}</view> |
| | | </view> |
| | | </view> |
| | | <view class="flex a-center"> |
| | | <view class="name">办结时间:</view> |
| | | <view class="value">{{orderInfo.completionTime|formatTime}}</view> |
| | | <view class="value">{{ orderInfo.completionTime | formatTime }}</view> |
| | | </view> |
| | | </view> |
| | | <view class="title">办结结果描述</view> |
| | | <view class="context">{{orderInfo.completionDescription||''}} |
| | | <view class="context">{{ orderInfo.completionDescription || '' }} |
| | | </view> |
| | | <view class="title">描述图片</view> |
| | | <view class="descPic" v-if="resultImg.length>0"> |
| | | <view class="picItem" v-for="(item,index) in resultImg" @click.stop="viewImage(item)"> |
| | | <view class="descPic" v-if="resultImg.length > 0"> |
| | | <view class="picItem" v-for="(item, index) in resultImg" @click.stop="viewImage(item)"> |
| | | <image :src="item" class="img shrink0" mode="aspectFill"> |
| | | </image> |
| | | </view> |
| | | </view> |
| | | <view v-else class="noData">暂无数据</view> |
| | | <view class="title">描述视频</view> |
| | | <view class="descPic" v-if="resultVideos.length>0"> |
| | | <view class="picItem relative" v-for="(item,index) in resultVideos"> |
| | | <view class="descPic" v-if="resultVideos.length > 0"> |
| | | <view class="picItem relative" v-for="(item, index) in resultVideos"> |
| | | <video id="myVideo" class="videoImg shrink0" disabled :controls="false" |
| | | :show-center-play-btn="false" :src="item"> |
| | | </video> |
| | |
| | | </view> |
| | | |
| | | <!-- 详情/办理进度 --正在办理-延期-超时 显示--> |
| | | <view class="progress" v-if="[0,1,2].includes(orderInfo.status) &&progressesList.length>0"> |
| | | <view class="progress" v-if="[0, 1, 2].includes(orderInfo.status) && progressesList.length > 0"> |
| | | <view class="title">当前办理进度</view> |
| | | <view class="proCard"> |
| | | <view class="proItem" v-for="(item,index) in progressesList"> |
| | | <view class="proItem" v-for="(item, index) in progressesList"> |
| | | <view class="mr-31 flex flex-column a-center"> |
| | | <image src="../../static/detailImg/Ovaled.png" class="proIcon shrink0" mode="aspectFill"> |
| | | </image> |
| | |
| | | </view> |
| | | <view class="flex1"> |
| | | <view class="flex a-center j-between mb-10"> |
| | | <view class="name">{{item.createByName||''}}</view> |
| | | <view class="time">{{item.createTime | formatTime}}</view> |
| | | <view class="name">{{ item.createByName || '' }}</view> |
| | | <view class="time">{{ item.createTime | formatTime }}</view> |
| | | </view> |
| | | <view class="context">{{item.describe||''}}</view> |
| | | <view class="context">{{ item.describe || '' }}</view> |
| | | <view class="proImg"> |
| | | <view class="imgOrVedio" v-for="(ite,ind) in item.imgList" @click.stop="viewImage(ite)"> |
| | | <view class="imgOrVedio" v-for="(ite, ind) in item.imgList" @click.stop="viewImage(ite)"> |
| | | <image :src="ite" class="img shrink0" mode="aspectFill"> |
| | | </image> |
| | | </view> |
| | | <view class="imgOrVedio" v-for="(ite,ind) in item.videoList "> |
| | | <view class="imgOrVedio" v-for="(ite, ind) in item.videoList"> |
| | | <video id="myVideo" class="videoImg shrink0" disabled :controls="false" |
| | | :show-center-play-btn="false" :src="ite"> |
| | | </video> |
| | |
| | | </view> |
| | | |
| | | <!-- 详情/诉求流转 --正在办理显示--> |
| | | <view class="careRequire" v-if="orderInfo.status==0 &&flowsList.length>0"> |
| | | <view class="careRequire" v-if="orderInfo.status == 0 && flowsList.length > 0"> |
| | | <view class="title">诉求流转</view> |
| | | <view class="proCard"> |
| | | <view class="proItem" v-for="(item,index) in flowsList"> |
| | | <view class="proItem" v-for="(item, index) in flowsList"> |
| | | <view class="mr-34 flex flex-column a-center"> |
| | | <image v-if="index==flowsList.length-1" src="../../static/detailImg/Ovaled.png" |
| | | <image v-if="index == flowsList.length - 1" src="../../static/detailImg/Ovaled.png" |
| | | class="proIcon shrink0" mode="aspectFill"> |
| | | </image> |
| | | <image v-else src="../../static/detailImg/Ovaled.png" class="proIcon shrink0" |
| | | mode="aspectFill"> |
| | | </image> |
| | | |
| | | <view v-if="index!=flowsList.length-1" class="proLine"> |
| | | <view v-if="index != flowsList.length - 1" class="proLine"> |
| | | </view> |
| | | </view> |
| | | <view class="requireItem"> |
| | | <view class="flex a-center j-between mb-23"> |
| | | <view class="name">{{item.name||''}}</view> |
| | | <view class="name">{{ item.name || '' }}</view> |
| | | <view class="time"> |
| | | {{item.createTime|formatTime}} |
| | | {{ item.createTime | formatTime }} |
| | | </view> |
| | | </view> |
| | | <view class="name fs-23"> |
| | | {{item.type==0?"上报":'下派'}} |
| | | {{ item.type == 0 ? "上报" : '下派' }} |
| | | </view> |
| | | |
| | | </view> |
| | |
| | | </view> |
| | | |
| | | <!-- 上级显示 --> |
| | | <view class="btnButtom" v-if="[0,1,2,6].includes(orderInfo.status) && !isParty"> |
| | | <view class="btnDown" @click.stop="toUp" v-if="userInfo.accountLevel>1" |
| | | :class="[2,3].includes(userInfo.accountLevel)?'':'partyUp'">问题上报</view> |
| | | <view class="btnDown" @click.stop="toDown" v-if="userInfo.accountLevel<4" |
| | | :class="[2,3].includes(userInfo.accountLevel)?'':'partyDown'">诉求下派</view> |
| | | <view class="btnButtom" v-if="[0, 1, 2, 6].includes(orderInfo.status) && !isParty && orderInfo.auditButtonStatus == 1"> |
| | | <view class="btnDown" @click.stop="toUp" v-if="userInfo.accountLevel > 1" |
| | | :class="[2, 3].includes(userInfo.accountLevel) ? '' : 'partyUp'">问题上报</view> |
| | | <view class="btnDown" @click.stop="toDown" v-if="userInfo.accountLevel < 4" |
| | | :class="[2, 3].includes(userInfo.accountLevel) ? '' : 'partyDown'">诉求下派</view> |
| | | <view class="btnAdd" @click="addProgress">添加办理进度</view> |
| | | <view class="btnAdd" @click="resultEntery">办理结果录入</view> |
| | | </view> |
| | | <view class="btnButtom" v-if="[5,7].includes(orderInfo.status) && !isParty"> |
| | | <view class="cancel" @click.stop="showPop=true">驳回</view> |
| | | <view class="btnButtom" v-if="[5, 7].includes(orderInfo.status) && !isParty && orderInfo.auditButtonStatus == 0"> |
| | | <view class="cancel" @click.stop="showPop = true">驳回</view> |
| | | <view class="sure" @click.stop="submitReSolve">审核通过</view> |
| | | </view> |
| | | <!-- 上级显示 --> |
| | | |
| | | <!-- 党员显示 --> |
| | | <view class="btnButtom" v-if="[0,1,2,6].includes(orderInfo.status) && isParty"> |
| | | <view class="btnButtom" v-if="[0, 1, 2, 6].includes(orderInfo.status) && isParty"> |
| | | <view class="btnDown partyUp" @click.stop="toUp">问题上报</view> |
| | | <view class="btnAdd partyDown" @click="addProgress">添加办理进度</view> |
| | | <view class="btnAdd partyDown" @click="resultEntery">办理结果录入</view> |
| | |
| | | <u--textarea v-model="rejectText" placeholder="请输入驳回原因"></u--textarea> |
| | | </view> |
| | | <view class="botton-btn"> |
| | | <view class="cancle" @click.stop="showPop=false">取消</view> |
| | | <view class="cancle" @click.stop="showPop = false">取消</view> |
| | | <view class="sure" @click.stop="submitReject">确定</view> |
| | | </view> |
| | | </view> |
| | |
| | | </template> |
| | | |
| | | <script> |
| | | import dayjs from '@/uni_modules/uview-ui/libs/util/dayjs.js' |
| | | import { |
| | | workOrderDetail, |
| | | getUserInfo, |
| | | reportAudit, |
| | | delayAudit |
| | | } from './service.js' |
| | | export default { |
| | | data() { |
| | | return { |
| | | id: "1", //工单详情ID |
| | | orderInfo: {}, //工单详情 |
| | | problemVideos: [], //描述视频 |
| | | problemImg: [], //描述图片 |
| | | resultVideos: [], //结果描述视频 |
| | | resultImg: [], //结果描述图片 |
| | | progressesList: [], //诉求流转记录 |
| | | flowsList: [], //办理进度 |
| | | import dayjs from '@/uni_modules/uview-ui/libs/util/dayjs.js' |
| | | import { |
| | | workOrderDetail, |
| | | getUserInfo, |
| | | reportAudit, |
| | | delayAudit |
| | | } from './service.js' |
| | | export default { |
| | | data() { |
| | | return { |
| | | id: "1", //工单详情ID |
| | | orderInfo: {}, //工单详情 |
| | | problemVideos: [], //描述视频 |
| | | problemImg: [], //描述图片 |
| | | resultVideos: [], //结果描述视频 |
| | | resultImg: [], //结果描述图片 |
| | | progressesList: [], //诉求流转记录 |
| | | flowsList: [], //办理进度 |
| | | |
| | | showPop: false, //弹窗驳回 |
| | | rejectText: "", //驳回原因 |
| | | showPop: false, //弹窗驳回 |
| | | rejectText: "", //驳回原因 |
| | | |
| | | scoreTopHeight: 0, //距离顶部多高 |
| | | scoreTopHeight: 0, //距离顶部多高 |
| | | |
| | | userInfo: {}, //个人信息 |
| | | isParty: false, //这是党员 |
| | | }; |
| | | }, |
| | | onPageScroll(e) { |
| | | this.scoreTopHeight = e.scrollTop |
| | | userInfo: {}, //个人信息 |
| | | isParty: false, //这是党员 |
| | | }; |
| | | }, |
| | | onPageScroll(e) { |
| | | this.scoreTopHeight = e.scrollTop |
| | | |
| | | }, |
| | | filters: { |
| | | formatTime(val) { |
| | | if (!val) return '' |
| | | return dayjs(val).format('YYYY-MM-DD HH:mm:ss') |
| | | }, |
| | | filters: { |
| | | formatTime(val) { |
| | | if (!val) return '' |
| | | return dayjs(val).format('YYYY-MM-DD HH:mm:ss') |
| | | } |
| | | }, |
| | | onShow() { |
| | | // alert(uni.getStorageSync('token')) |
| | | this.getDetailInfo() |
| | | }, |
| | | onLoad(params) { |
| | | if (params.id) { |
| | | this.id = params.id |
| | | } |
| | | |
| | | getUserInfo().then(res => { |
| | | if (res.data == null || res.data.accountLevel == 5) { |
| | | this.isParty = true |
| | | } |
| | | }, |
| | | onShow() { |
| | | // alert(uni.getStorageSync('token')) |
| | | this.getDetailInfo() |
| | | }, |
| | | onLoad(params) { |
| | | if (params.id) { |
| | | this.id = params.id |
| | | this.userInfo = { |
| | | ...res.data |
| | | } |
| | | |
| | | getUserInfo().then(res => { |
| | | if (res.data == null) { |
| | | this.isParty = true |
| | | } |
| | | this.userInfo = { |
| | | ...res.data |
| | | } |
| | | }) |
| | | }, |
| | | methods: { |
| | | open() { }, |
| | | close() { }, |
| | | viewImage(item) { |
| | | uni.previewImage({ |
| | | urls: [item] |
| | | }) |
| | | }, |
| | | methods: { |
| | | open() {}, |
| | | close() {}, |
| | | viewImage(item) { |
| | | uni.previewImage({ |
| | | urls: [item] |
| | | // 去大屏播放视频 |
| | | openVideo(url) { |
| | | uni.navigateTo({ |
| | | url: `/pages/work-detail/maxVideo?url=${url}` |
| | | }) |
| | | }, |
| | | // 获取订单详情信息 |
| | | getDetailInfo() { |
| | | workOrderDetail({ |
| | | id: this.id |
| | | }).then(res => { |
| | | if (res.data.images) { |
| | | this.problemImg = res.data.images.split(',') |
| | | } |
| | | if (res.data.videos) { |
| | | this.problemVideos = res.data.videos.split(',') |
| | | } |
| | | if (res.data.completionImages) { |
| | | this.resultImg = res.data.completionImages.split(',') |
| | | } |
| | | if (res.data.completionVideos) { |
| | | this.resultVideos = res.data.completionVideos.split(',') |
| | | } |
| | | // 办理进度 |
| | | if (res.data.complaintProgresses && res.data.complaintProgresses.length > 0) { |
| | | this.progressesList = res.data.complaintProgresses.map((item) => { |
| | | return { |
| | | ...item, |
| | | imgList: item.imgUrl ? item.imgUrl.split(',') : [], |
| | | videoList: item.video ? item.video.split(',') : [], |
| | | } |
| | | }) |
| | | } |
| | | // 诉求流转记录 |
| | | if (res.data.complaintFlows && res.data.complaintFlows.length > 0) { |
| | | this.flowsList = res.data.complaintFlows |
| | | } |
| | | |
| | | this.orderInfo = { |
| | | ...res.data |
| | | } |
| | | |
| | | }) |
| | | }, |
| | | // 确认驳回 |
| | | submitReject() { |
| | | if (!this.rejectText) { |
| | | return uni.showToast({ |
| | | duration: 1500, |
| | | title: '请输入驳回原因', |
| | | mask: true, |
| | | icon: 'none' |
| | | }) |
| | | }, |
| | | // 去大屏播放视频 |
| | | openVideo(url) { |
| | | uni.navigateTo({ |
| | | url: `/pages/work-detail/maxVideo?url=${url}` |
| | | }) |
| | | }, |
| | | // 获取订单详情信息 |
| | | getDetailInfo() { |
| | | workOrderDetail({ |
| | | id: this.id |
| | | } |
| | | if (this.orderInfo.status == 5) { //上报 |
| | | reportAudit({ |
| | | id: this.id, |
| | | auditResult: 2, |
| | | rejectReason: this.rejectText |
| | | }).then(res => { |
| | | if (res.data.images) { |
| | | this.problemImg = res.data.images.split(',') |
| | | } |
| | | if (res.data.videos) { |
| | | this.problemVideos = res.data.videos.split(',') |
| | | } |
| | | if (res.data.completionImages) { |
| | | this.resultImg = res.data.completionImages.split(',') |
| | | } |
| | | if (res.data.completionVideos) { |
| | | this.resultVideos = res.data.completionVideos.split(',') |
| | | } |
| | | // 办理进度 |
| | | if (res.data.complaintProgresses && res.data.complaintProgresses.length > 0) { |
| | | this.progressesList = res.data.complaintProgresses.map((item) => { |
| | | return { |
| | | ...item, |
| | | imgList: item.imgUrl ? item.imgUrl.split(',') : [], |
| | | videoList: item.video ? item.video.split(',') : [], |
| | | } |
| | | }) |
| | | } |
| | | // 诉求流转记录 |
| | | if (res.data.complaintFlows && res.data.complaintFlows.length > 0) { |
| | | this.flowsList = res.data.complaintFlows |
| | | } |
| | | |
| | | this.orderInfo = { |
| | | ...res.data |
| | | } |
| | | this.showPop = false |
| | | // this.getDetailInfo() |
| | | uni.showToast({ |
| | | title: '操作成功', |
| | | icon: 'success', |
| | | mask: true |
| | | }) |
| | | setTimeout(() => { |
| | | uni.navigateBack() |
| | | }, 1500) |
| | | |
| | | }) |
| | | }, |
| | | // 确认驳回 |
| | | submitReject() { |
| | | if (!this.rejectText) { |
| | | return uni.showToast({ |
| | | duration: 1500, |
| | | title: '请输入驳回原因', |
| | | mask: true, |
| | | icon: 'none' |
| | | } else { //延期 |
| | | delayAudit({ |
| | | complaintId: this.id, |
| | | auditResult: 2, |
| | | rejectReason: this.rejectText |
| | | }).then(res => { |
| | | this.showPop = false |
| | | uni.showToast({ |
| | | title: '操作成功', |
| | | icon: 'success', |
| | | mask: true |
| | | }) |
| | | } |
| | | if (this.orderInfo.status == 5) { //上报 |
| | | reportAudit({ |
| | | id: this.id, |
| | | auditResult: 2, |
| | | rejectReason: this.rejectText |
| | | }).then(res => { |
| | | this.showPop = false |
| | | // this.getDetailInfo() |
| | | uni.showToast({ |
| | | title: '操作成功', |
| | | icon: 'success', |
| | | mask: true |
| | | }) |
| | | setTimeout(() => { |
| | | uni.navigateBack() |
| | | }, 1500) |
| | | // this.getDetailInfo() |
| | | setTimeout(() => { |
| | | uni.navigateBack() |
| | | }, 1500) |
| | | }) |
| | | } |
| | | |
| | | }, |
| | | // 确认通过审批 |
| | | submitReSolve() { |
| | | if (this.orderInfo.status == 5) { //上报 |
| | | reportAudit({ |
| | | id: this.id, |
| | | auditResult: 1, |
| | | }).then(res => { |
| | | // this.getDetailInfo() |
| | | uni.showToast({ |
| | | title: '操作成功', |
| | | icon: 'success', |
| | | mask: true |
| | | }) |
| | | } else { //延期 |
| | | delayAudit({ |
| | | complaintId: this.id, |
| | | auditResult: 2, |
| | | rejectReason: this.rejectText |
| | | }).then(res => { |
| | | this.showPop = false |
| | | uni.showToast({ |
| | | title: '操作成功', |
| | | icon: 'success', |
| | | mask: true |
| | | }) |
| | | // this.getDetailInfo() |
| | | setTimeout(() => { |
| | | uni.navigateBack() |
| | | }, 1500) |
| | | setTimeout(() => { |
| | | uni.navigateBack() |
| | | }, 1500) |
| | | }) |
| | | } else { //延期 |
| | | delayAudit({ |
| | | complaintId: this.id, |
| | | auditResult: 1, |
| | | }).then(res => { |
| | | uni.showToast({ |
| | | title: '操作成功', |
| | | icon: 'success', |
| | | mask: true |
| | | }) |
| | | } |
| | | |
| | | }, |
| | | // 确认通过审批 |
| | | submitReSolve() { |
| | | if (this.orderInfo.status == 5) { //上报 |
| | | reportAudit({ |
| | | id: this.id, |
| | | auditResult: 1, |
| | | }).then(res => { |
| | | // this.getDetailInfo() |
| | | uni.showToast({ |
| | | title: '操作成功', |
| | | icon: 'success', |
| | | mask: true |
| | | }) |
| | | setTimeout(() => { |
| | | uni.navigateBack() |
| | | }, 1500) |
| | | }) |
| | | } else { //延期 |
| | | delayAudit({ |
| | | complaintId: this.id, |
| | | auditResult: 1, |
| | | }).then(res => { |
| | | uni.showToast({ |
| | | title: '操作成功', |
| | | icon: 'success', |
| | | mask: true |
| | | }) |
| | | // this.getDetailInfo() |
| | | setTimeout(() => { |
| | | uni.navigateBack() |
| | | }, 1500) |
| | | }) |
| | | } |
| | | }, |
| | | //延期申请 |
| | | applyOverTime() { |
| | | uni.navigateTo({ |
| | | url: `/pages/work-detail/postpone-apply?id=${this.id}` |
| | | // this.getDetailInfo() |
| | | setTimeout(() => { |
| | | uni.navigateBack() |
| | | }, 1500) |
| | | }) |
| | | }, |
| | | // 问题上报 |
| | | toUp() { |
| | | uni.navigateTo({ |
| | | url: `/pages/problemReporting/problemReporting?id=${this.id}` |
| | | }) |
| | | }, |
| | | // 问题下派 |
| | | toDown() { |
| | | uni.navigateTo({ |
| | | url: `/pages/dispatchWorkOrder/dispatchWorkOrder?id=${this.id}` |
| | | }) |
| | | }, |
| | | addProgress() { |
| | | uni.navigateTo({ |
| | | url: `/pages/progress/progress?id=${this.id}` |
| | | }) |
| | | }, |
| | | resultEntery() { |
| | | uni.navigateTo({ |
| | | url: `/pages/result-entry/index?id=${this.id}` |
| | | }) |
| | | }, |
| | | toProgressDetail() { |
| | | uni.navigateTo({ |
| | | url: '/pages/progress/progress?type=1&id=' + this.id |
| | | }) |
| | | }, |
| | | toDelayDetail() { |
| | | uni.navigateTo({ |
| | | url: '/pages/delay/delay?type=1&id=' + this.id |
| | | }) |
| | | }, |
| | | } |
| | | } |
| | | }, |
| | | //延期申请 |
| | | applyOverTime() { |
| | | uni.navigateTo({ |
| | | url: `/pages/work-detail/postpone-apply?id=${this.id}` |
| | | }) |
| | | }, |
| | | // 问题上报 |
| | | toUp() { |
| | | uni.navigateTo({ |
| | | url: `/pages/problemReporting/problemReporting?id=${this.id}` |
| | | }) |
| | | }, |
| | | // 问题下派 |
| | | toDown() { |
| | | uni.navigateTo({ |
| | | url: `/pages/dispatchWorkOrder/dispatchWorkOrder?id=${this.id}` |
| | | }) |
| | | }, |
| | | addProgress() { |
| | | uni.navigateTo({ |
| | | url: `/pages/progress/progress?id=${this.id}` |
| | | }) |
| | | }, |
| | | resultEntery() { |
| | | uni.navigateTo({ |
| | | url: `/pages/result-entry/index?id=${this.id}` |
| | | }) |
| | | }, |
| | | toProgressDetail() { |
| | | uni.navigateTo({ |
| | | url: '/pages/progress/progress?type=1&id=' + this.id |
| | | }) |
| | | }, |
| | | toDelayDetail() { |
| | | uni.navigateTo({ |
| | | url: '/pages/delay/delay?type=1&id=' + this.id |
| | | }) |
| | | }, |
| | | } |
| | | } |
| | | </script> |
| | | <style> |
| | | page { |
| | | background: linear-gradient(180deg, #FFFFFF 0%, #F9F9F9 6%, #F8F8F8 100%); |
| | | } |
| | | page { |
| | | background: linear-gradient(180deg, #FFFFFF 0%, #F9F9F9 6%, #F8F8F8 100%); |
| | | } |
| | | </style> |
| | | |
| | | <style lang="scss" scoped> |
| | | .topColor { |
| | | height: 346rpx; |
| | | background: linear-gradient(180deg, #FFDCDB 0%, rgba(255, 255, 255, 0) 100%); |
| | | // padding: 176rpx 27rpx 17rpx 27rpx; |
| | | .topColor { |
| | | height: 346rpx; |
| | | background: linear-gradient(180deg, #FFDCDB 0%, rgba(255, 255, 255, 0) 100%); |
| | | // padding: 176rpx 27rpx 17rpx 27rpx; |
| | | } |
| | | |
| | | .allContent { |
| | | margin-top: -243rpx; |
| | | padding: 0 31rpx 178rpx 31rpx; |
| | | |
| | | |
| | | .topStatus { |
| | | .status { |
| | | font-weight: 600; |
| | | font-size: 44rpx; |
| | | color: #000000; |
| | | line-height: 62rpx; |
| | | margin-bottom: 15rpx; |
| | | } |
| | | |
| | | .tit { |
| | | font-size: 27rpx; |
| | | color: rgba(0, 0, 0, 0.8); |
| | | line-height: 38rpx; |
| | | // margin-bottom: 17rpx; |
| | | } |
| | | |
| | | .plainIcon { |
| | | width: 36rpx; |
| | | height: 36rpx; |
| | | } |
| | | |
| | | .explain { |
| | | font-weight: 600; |
| | | font-size: 23rpx; |
| | | color: rgba(0, 0, 0, 0.6); |
| | | line-height: 33rpx; |
| | | margin-left: 8rpx; |
| | | } |
| | | |
| | | .overTimeIcon { |
| | | width: 30.77rpx; |
| | | height: 30.77rpx; |
| | | margin-right: 15rpx; |
| | | } |
| | | |
| | | .overTime { |
| | | font-weight: 400; |
| | | font-size: 23rpx; |
| | | color: #FF4948; |
| | | line-height: 33rpx; |
| | | } |
| | | |
| | | .day { |
| | | margin: -11rpx 12rpx 0 9rpx; |
| | | background: #FFEAEA; |
| | | border-radius: 19rpx; |
| | | border: 2rpx solid #FF4948; |
| | | padding: 4rpx 24rpx; |
| | | font-weight: 600; |
| | | font-size: 42rpx; |
| | | color: #FF4948; |
| | | line-height: 42rpx; |
| | | } |
| | | } |
| | | |
| | | .allContent { |
| | | margin-top: -243rpx; |
| | | padding: 0 31rpx 178rpx 31rpx; |
| | | .topMore { |
| | | padding: 8rpx 31rpx; |
| | | margin: 19rpx -31rpx 0 -31rpx; |
| | | background: linear-gradient(270deg, rgba(102, 102, 102, 0) 0%, rgba(102, 102, 102, 0.14) 100%); |
| | | |
| | | |
| | | .topStatus { |
| | | .status { |
| | | font-weight: 600; |
| | | font-size: 44rpx; |
| | | color: #000000; |
| | | line-height: 62rpx; |
| | | margin-bottom: 15rpx; |
| | | } |
| | | |
| | | .tit { |
| | | font-size: 27rpx; |
| | | color: rgba(0, 0, 0, 0.8); |
| | | line-height: 38rpx; |
| | | // margin-bottom: 17rpx; |
| | | } |
| | | |
| | | .plainIcon { |
| | | width: 36rpx; |
| | | height: 36rpx; |
| | | } |
| | | |
| | | .explain { |
| | | font-weight: 600; |
| | | font-size: 23rpx; |
| | | color: rgba(0, 0, 0, 0.6); |
| | | line-height: 33rpx; |
| | | margin-left: 8rpx; |
| | | } |
| | | |
| | | .overTimeIcon { |
| | | width: 30.77rpx; |
| | | height: 30.77rpx; |
| | | margin-right: 15rpx; |
| | | } |
| | | |
| | | .overTime { |
| | | font-weight: 400; |
| | | font-size: 23rpx; |
| | | color: #FF4948; |
| | | line-height: 33rpx; |
| | | } |
| | | |
| | | .day { |
| | | margin: -11rpx 12rpx 0 9rpx; |
| | | background: #FFEAEA; |
| | | border-radius: 19rpx; |
| | | border: 2rpx solid #FF4948; |
| | | padding: 4rpx 24rpx; |
| | | font-weight: 600; |
| | | font-size: 42rpx; |
| | | color: #FF4948; |
| | | line-height: 42rpx; |
| | | } |
| | | .name { |
| | | font-weight: 600; |
| | | font-size: 23rpx; |
| | | color: rgba(0, 0, 0, 0.8); |
| | | line-height: 33rpx; |
| | | } |
| | | |
| | | .topMore { |
| | | padding: 8rpx 31rpx; |
| | | margin: 19rpx -31rpx 0 -31rpx; |
| | | background: linear-gradient(270deg, rgba(102, 102, 102, 0) 0%, rgba(102, 102, 102, 0.14) 100%); |
| | | |
| | | .name { |
| | | font-weight: 600; |
| | | font-size: 23rpx; |
| | | color: rgba(0, 0, 0, 0.8); |
| | | line-height: 33rpx; |
| | | } |
| | | |
| | | .more { |
| | | font-weight: 600; |
| | | font-size: 23rpx; |
| | | color: rgba(0, 0, 0, 0.6); |
| | | line-height: 33rpx; |
| | | } |
| | | |
| | | .moreIcon { |
| | | width: 19.23rpx; |
| | | height: 19.23rpx; |
| | | margin-left: 15rpx; |
| | | } |
| | | .more { |
| | | font-weight: 600; |
| | | font-size: 23rpx; |
| | | color: rgba(0, 0, 0, 0.6); |
| | | line-height: 33rpx; |
| | | } |
| | | |
| | | .topMore1 { |
| | | margin-top: 38rpx !important; |
| | | .moreIcon { |
| | | width: 19.23rpx; |
| | | height: 19.23rpx; |
| | | margin-left: 15rpx; |
| | | } |
| | | } |
| | | |
| | | .card1 { |
| | | margin-top: 21rpx; |
| | | .topMore1 { |
| | | margin-top: 38rpx !important; |
| | | } |
| | | |
| | | .card1 { |
| | | margin-top: 21rpx; |
| | | |
| | | |
| | | .topIcon { |
| | | margin-top: 17rpx; |
| | | width: 26.23rpx; |
| | | height: 26.23rpx; |
| | | |
| | | } |
| | | |
| | | .proLine { |
| | | flex: 1; |
| | | width: 4rpx; |
| | | min-height: 50rpx; |
| | | background: rgba(0, 0, 0, 0.06); |
| | | border-radius: 3rpx; |
| | | } |
| | | |
| | | .infoCard { |
| | | flex: 1; |
| | | background: #FFFFFF; |
| | | box-shadow: 0rpx 4rpx 12rpx 0rpx rgba(0, 0, 0, 0.06); |
| | | padding: 13rpx 30.77rpx 19rpx 31rpx; |
| | | border-radius: 27rpx; |
| | | |
| | | .label { |
| | | font-weight: 400; |
| | | font-size: 27rpx; |
| | | color: rgba(0, 0, 0, 0.88); |
| | | line-height: 77rpx; |
| | | } |
| | | |
| | | .value { |
| | | max-width: 403rpx; |
| | | font-weight: 500; |
| | | font-size: 27rpx; |
| | | color: rgba(0, 0, 0, 0.88); |
| | | line-height: 77rpx; |
| | | } |
| | | } |
| | | .topIcon { |
| | | margin-top: 17rpx; |
| | | width: 26.23rpx; |
| | | height: 26.23rpx; |
| | | |
| | | } |
| | | |
| | | .cardInfo { |
| | | margin-top: 38.46rpx; |
| | | .proLine { |
| | | flex: 1; |
| | | width: 4rpx; |
| | | min-height: 50rpx; |
| | | background: rgba(0, 0, 0, 0.06); |
| | | border-radius: 3rpx; |
| | | } |
| | | |
| | | .infoCard { |
| | | flex: 1; |
| | | background: #FFFFFF; |
| | | box-shadow: 0rpx 0rpx 27rpx 0rpx rgba(0, 0, 0, 0.1); |
| | | border-radius: 8rpx; |
| | | padding: 21rpx 31rpx 38rpx 31rpx; |
| | | box-shadow: 0rpx 4rpx 12rpx 0rpx rgba(0, 0, 0, 0.06); |
| | | padding: 13rpx 30.77rpx 19rpx 31rpx; |
| | | border-radius: 27rpx; |
| | | background: linear-gradient(180deg, #FFDCDB 0%, rgba(255, 255, 255, 0) 20%, rgba(255, 255, 255, 0) 100%); |
| | | |
| | | .title { |
| | | font-weight: 600; |
| | | font-size: 23rpx; |
| | | color: rgba(0, 0, 0, 0.88); |
| | | line-height: 33rpx; |
| | | text-shadow: 0px 0px 27px rgba(0, 0, 0, 0.1); |
| | | } |
| | | |
| | | .apply { |
| | | font-weight: 600; |
| | | font-size: 23rpx; |
| | | color: #FF4948; |
| | | line-height: 33rpx; |
| | | margin-right: 15rpx; |
| | | } |
| | | |
| | | .rightIcon { |
| | | width: 19.23rpx; |
| | | height: 19.23rpx; |
| | | } |
| | | |
| | | .addressCard { |
| | | margin: 33rpx 10rpx; |
| | | padding: 33rpx 27rpx; |
| | | background: linear-gradient(270deg, rgba(255, 241, 0, 0.5) 0%, rgba(255, 249, 172, 0.25) 48%, rgba(255, 255, 255, 0.2) 100%, #FFFFFF 100%); |
| | | border-radius: 19rpx; |
| | | display: flex; |
| | | justify-content: space-between; |
| | | |
| | | .address { |
| | | font-weight: 500; |
| | | font-size: 27rpx; |
| | | color: #000000; |
| | | line-height: 38rpx; |
| | | text-shadow: 0px 0px 27px rgba(0, 0, 0, 0.1); |
| | | } |
| | | |
| | | .addressIcon { |
| | | width: 23.08rpx; |
| | | height: 25.64rpx; |
| | | } |
| | | } |
| | | |
| | | .label { |
| | | font-weight: 400; |
| | |
| | | color: rgba(0, 0, 0, 0.88); |
| | | line-height: 77rpx; |
| | | } |
| | | |
| | | } |
| | | |
| | | .problem { |
| | | border-radius: 27rpx; |
| | | margin-top: 38.46rpx; |
| | | background: #FFFFFF; |
| | | box-shadow: 0rpx 0rpx 27rpx 0rpx rgba(0, 0, 0, 0.1); |
| | | padding: 0 31rpx 34rpx 31rpx; |
| | | } |
| | | |
| | | .title { |
| | | padding-top: 34rpx; |
| | | font-weight: 600; |
| | | .cardInfo { |
| | | margin-top: 38.46rpx; |
| | | background: #FFFFFF; |
| | | box-shadow: 0rpx 0rpx 27rpx 0rpx rgba(0, 0, 0, 0.1); |
| | | border-radius: 8rpx; |
| | | padding: 21rpx 31rpx 38rpx 31rpx; |
| | | border-radius: 27rpx; |
| | | background: linear-gradient(180deg, #FFDCDB 0%, rgba(255, 255, 255, 0) 20%, rgba(255, 255, 255, 0) 100%); |
| | | |
| | | .title { |
| | | font-weight: 600; |
| | | font-size: 23rpx; |
| | | color: rgba(0, 0, 0, 0.88); |
| | | line-height: 33rpx; |
| | | text-shadow: 0px 0px 27px rgba(0, 0, 0, 0.1); |
| | | } |
| | | |
| | | .apply { |
| | | font-weight: 600; |
| | | font-size: 23rpx; |
| | | color: #FF4948; |
| | | line-height: 33rpx; |
| | | margin-right: 15rpx; |
| | | } |
| | | |
| | | .rightIcon { |
| | | width: 19.23rpx; |
| | | height: 19.23rpx; |
| | | } |
| | | |
| | | .addressCard { |
| | | margin: 33rpx 10rpx; |
| | | padding: 33rpx 27rpx; |
| | | background: linear-gradient(270deg, rgba(255, 241, 0, 0.5) 0%, rgba(255, 249, 172, 0.25) 48%, rgba(255, 255, 255, 0.2) 100%, #FFFFFF 100%); |
| | | border-radius: 19rpx; |
| | | display: flex; |
| | | justify-content: space-between; |
| | | |
| | | .address { |
| | | font-weight: 500; |
| | | font-size: 27rpx; |
| | | color: rgba(0, 0, 0, 0.88); |
| | | color: #000000; |
| | | line-height: 38rpx; |
| | | text-shadow: 0px 0px 27px rgba(0, 0, 0, 0.1); |
| | | margin-bottom: 27rpx; |
| | | } |
| | | |
| | | .desc { |
| | | background: #F8F8F8; |
| | | // box-shadow: 0rpx 0rpx 27rpx 0rpx rgba(0, 0, 0, 0.1); |
| | | border-radius: 8rpx; |
| | | padding: 29rpx 0 121rpx 0; |
| | | .addressIcon { |
| | | width: 23.08rpx; |
| | | height: 25.64rpx; |
| | | } |
| | | } |
| | | |
| | | .top { |
| | | padding: 0 31rpx; |
| | | .label { |
| | | font-weight: 400; |
| | | font-size: 27rpx; |
| | | color: rgba(0, 0, 0, 0.88); |
| | | line-height: 77rpx; |
| | | } |
| | | |
| | | .value { |
| | | max-width: 403rpx; |
| | | font-weight: 500; |
| | | font-size: 27rpx; |
| | | color: rgba(0, 0, 0, 0.88); |
| | | line-height: 77rpx; |
| | | } |
| | | |
| | | } |
| | | |
| | | .problem { |
| | | border-radius: 27rpx; |
| | | margin-top: 38.46rpx; |
| | | background: #FFFFFF; |
| | | box-shadow: 0rpx 0rpx 27rpx 0rpx rgba(0, 0, 0, 0.1); |
| | | padding: 0 31rpx 34rpx 31rpx; |
| | | |
| | | .title { |
| | | padding-top: 34rpx; |
| | | font-weight: 600; |
| | | font-size: 27rpx; |
| | | color: rgba(0, 0, 0, 0.88); |
| | | line-height: 38rpx; |
| | | text-shadow: 0px 0px 27px rgba(0, 0, 0, 0.1); |
| | | margin-bottom: 27rpx; |
| | | } |
| | | |
| | | .desc { |
| | | background: #F8F8F8; |
| | | // box-shadow: 0rpx 0rpx 27rpx 0rpx rgba(0, 0, 0, 0.1); |
| | | border-radius: 8rpx; |
| | | padding: 29rpx 0 121rpx 0; |
| | | |
| | | .top { |
| | | padding: 0 31rpx; |
| | | font-size: 27rpx; |
| | | color: rgba(0, 0, 0, 0.8); |
| | | line-height: 38rpx; |
| | | } |
| | | |
| | | .line1 { |
| | | margin: 27rpx 0; |
| | | height: 2rpx; |
| | | background: rgba(0, 10, 26, 0.07); |
| | | } |
| | | |
| | | .context { |
| | | padding: 0 31rpx; |
| | | font-size: 27rpx; |
| | | color: rgba(0, 0, 0, 0.8); |
| | | line-height: 38rpx; |
| | | } |
| | | } |
| | | |
| | | .descPic { |
| | | display: flex; |
| | | flex-wrap: wrap; |
| | | |
| | | .picItem { |
| | | margin-right: 15rpx; |
| | | |
| | | .img { |
| | | width: 140.38rpx; |
| | | height: 140.38rpx; |
| | | border-radius: 7.69rpx; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | .progress { |
| | | border-radius: 27rpx; |
| | | margin-top: 38.46rpx; |
| | | background: #FFFFFF; |
| | | box-shadow: 0rpx 0rpx 27rpx 0rpx rgba(0, 0, 0, 0.1); |
| | | padding: 34rpx 31rpx; |
| | | |
| | | .title { |
| | | font-weight: 600; |
| | | font-size: 27rpx; |
| | | color: rgba(0, 0, 0, 0.88); |
| | | line-height: 38rpx; |
| | | text-shadow: 0px 0px 27px rgba(0, 0, 0, 0.1); |
| | | margin-bottom: 48rpx; |
| | | } |
| | | |
| | | .proCard { |
| | | .proItem { |
| | | display: flex; |
| | | padding-bottom: 46rpx; |
| | | |
| | | .proIcon { |
| | | width: 26.23rpx; |
| | | height: 26.23rpx; |
| | | margin: 10rpx 0; |
| | | } |
| | | |
| | | .proLine { |
| | | flex: 1; |
| | | width: 4rpx; |
| | | min-height: 50rpx; |
| | | background: rgba(0, 0, 0, 0.06); |
| | | border-radius: 3rpx; |
| | | } |
| | | |
| | | |
| | | .name { |
| | | font-weight: 400; |
| | | font-size: 27rpx; |
| | | color: rgba(0, 0, 0, 0.8); |
| | | line-height: 38rpx; |
| | | } |
| | | |
| | | .line1 { |
| | | margin: 27rpx 0; |
| | | height: 2rpx; |
| | | background: rgba(0, 10, 26, 0.07); |
| | | .time { |
| | | font-weight: 400; |
| | | font-size: 23rpx; |
| | | color: rgba(0, 0, 0, 0.4); |
| | | line-height: 33rpx; |
| | | } |
| | | |
| | | .context { |
| | | padding: 0 31rpx; |
| | | font-size: 27rpx; |
| | | color: rgba(0, 0, 0, 0.8); |
| | | line-height: 38rpx; |
| | | } |
| | | } |
| | | |
| | | .descPic { |
| | | display: flex; |
| | | flex-wrap: wrap; |
| | | .proImg { |
| | | display: flex; |
| | | flex-wrap: wrap; |
| | | |
| | | .picItem { |
| | | margin-right: 15rpx; |
| | | .imgOrVedio { |
| | | margin-right: 17rpx; |
| | | position: relative; |
| | | |
| | | .img { |
| | | width: 140.38rpx; |
| | | height: 140.38rpx; |
| | | border-radius: 7.69rpx; |
| | | .videoImg { |
| | | width: 140.38rpx; |
| | | height: 140.38rpx; |
| | | border-radius: 7.69rpx; |
| | | margin-top: 19rpx; |
| | | position: relative; |
| | | } |
| | | |
| | | .img { |
| | | width: 140rpx; |
| | | height: 140rpx; |
| | | border-radius: 8rpx; |
| | | margin-top: 19rpx; |
| | | } |
| | | |
| | | .videoOpen { |
| | | position: absolute; |
| | | top: 10rpx; |
| | | left: 0; |
| | | z-index: 99; |
| | | width: 140rpx; |
| | | height: 140rpx; |
| | | border-radius: 8rpx; |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | |
| | | .video { |
| | | z-index: 999; |
| | | width: 140rpx; |
| | | height: 140rpx; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | .proItem:last-child { |
| | | .proLine { |
| | | display: none; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | .careRequire { |
| | | border-radius: 27rpx; |
| | | margin-top: 38.46rpx; |
| | | background: #FFFFFF; |
| | | box-shadow: 0rpx 0rpx 27rpx 0rpx rgba(0, 0, 0, 0.1); |
| | | padding: 34rpx 31rpx; |
| | | |
| | | .title { |
| | | font-weight: 600; |
| | | font-size: 27rpx; |
| | | color: rgba(0, 0, 0, 0.88); |
| | | line-height: 38rpx; |
| | | text-shadow: 0px 0px 27px rgba(0, 0, 0, 0.1); |
| | | margin-bottom: 38rpx; |
| | | } |
| | | |
| | | .progress { |
| | | border-radius: 27rpx; |
| | | margin-top: 38.46rpx; |
| | | background: #FFFFFF; |
| | | box-shadow: 0rpx 0rpx 27rpx 0rpx rgba(0, 0, 0, 0.1); |
| | | padding: 34rpx 31rpx; |
| | | .proCard { |
| | | .proItem { |
| | | display: flex; |
| | | |
| | | .title { |
| | | font-weight: 600; |
| | | font-size: 27rpx; |
| | | color: rgba(0, 0, 0, 0.88); |
| | | line-height: 38rpx; |
| | | text-shadow: 0px 0px 27px rgba(0, 0, 0, 0.1); |
| | | margin-bottom: 48rpx; |
| | | } |
| | | |
| | | .proCard { |
| | | .proItem { |
| | | display: flex; |
| | | padding-bottom: 46rpx; |
| | | .proIcon { |
| | | width: 26.23rpx; |
| | | height: 26.23rpx; |
| | | margin: 23rpx 0 19rpx 0; |
| | | } |
| | | |
| | | .proIcon { |
| | | width: 26.23rpx; |
| | | height: 26.23rpx; |
| | | margin: 10rpx 0; |
| | | } |
| | | .proLine { |
| | | flex: 1; |
| | | width: 4rpx; |
| | | min-height: 50rpx; |
| | | background: rgba(0, 0, 0, 0.06); |
| | | border-radius: 3rpx; |
| | | } |
| | | |
| | | .proLine { |
| | | flex: 1; |
| | | width: 4rpx; |
| | | min-height: 50rpx; |
| | | background: rgba(0, 0, 0, 0.06); |
| | | border-radius: 3rpx; |
| | | } |
| | | |
| | | .requireItem { |
| | | flex: 1; |
| | | background: #F9F9F9; |
| | | box-shadow: 0rpx 0rpx 27rpx 0rpx rgba(0, 0, 0, 0.1); |
| | | border-radius: 8rpx; |
| | | padding: 31rpx; |
| | | margin-bottom: 46rpx; |
| | | |
| | | .name { |
| | | font-weight: 400; |
| | |
| | | line-height: 33rpx; |
| | | } |
| | | |
| | | .context { |
| | | font-size: 27rpx; |
| | | color: rgba(0, 0, 0, 0.8); |
| | | line-height: 38rpx; |
| | | } |
| | | |
| | | .proImg { |
| | | display: flex; |
| | | flex-wrap: wrap; |
| | | |
| | | .imgOrVedio { |
| | | margin-right: 17rpx; |
| | | position: relative; |
| | | |
| | | .videoImg { |
| | | width: 140.38rpx; |
| | | height: 140.38rpx; |
| | | border-radius: 7.69rpx; |
| | | margin-top: 19rpx; |
| | | position: relative; |
| | | } |
| | | |
| | | .img { |
| | | width: 140rpx; |
| | | height: 140rpx; |
| | | border-radius: 8rpx; |
| | | margin-top: 19rpx; |
| | | } |
| | | |
| | | .videoOpen { |
| | | position: absolute; |
| | | top: 10rpx; |
| | | left: 0; |
| | | z-index: 99; |
| | | width: 140rpx; |
| | | height: 140rpx; |
| | | border-radius: 8rpx; |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | |
| | | .video { |
| | | z-index: 999; |
| | | width: 140rpx; |
| | | height: 140rpx; |
| | | } |
| | | } |
| | | } |
| | | .opt1 { |
| | | color: rgba(0, 0, 0, 0.10) !important; |
| | | } |
| | | } |
| | | |
| | | .proItem:last-child { |
| | | .proLine { |
| | | display: none; |
| | | } |
| | | |
| | | |
| | | } |
| | | |
| | | .proItem:last-child { |
| | | .proLine { |
| | | display: none; |
| | | } |
| | | } |
| | | } |
| | | |
| | | .careRequire { |
| | | border-radius: 27rpx; |
| | | margin-top: 38.46rpx; |
| | | background: #FFFFFF; |
| | | box-shadow: 0rpx 0rpx 27rpx 0rpx rgba(0, 0, 0, 0.1); |
| | | padding: 34rpx 31rpx; |
| | | |
| | | .title { |
| | | font-weight: 600; |
| | | font-size: 27rpx; |
| | | color: rgba(0, 0, 0, 0.88); |
| | | line-height: 38rpx; |
| | | text-shadow: 0px 0px 27px rgba(0, 0, 0, 0.1); |
| | | margin-bottom: 38rpx; |
| | | } |
| | | |
| | | .proCard { |
| | | .proItem { |
| | | display: flex; |
| | | |
| | | |
| | | .proIcon { |
| | | width: 26.23rpx; |
| | | height: 26.23rpx; |
| | | margin: 23rpx 0 19rpx 0; |
| | | } |
| | | |
| | | .proLine { |
| | | flex: 1; |
| | | width: 4rpx; |
| | | min-height: 50rpx; |
| | | background: rgba(0, 0, 0, 0.06); |
| | | border-radius: 3rpx; |
| | | } |
| | | |
| | | .requireItem { |
| | | flex: 1; |
| | | background: #F9F9F9; |
| | | box-shadow: 0rpx 0rpx 27rpx 0rpx rgba(0, 0, 0, 0.1); |
| | | border-radius: 8rpx; |
| | | padding: 31rpx; |
| | | margin-bottom: 46rpx; |
| | | |
| | | .name { |
| | | font-weight: 400; |
| | | font-size: 27rpx; |
| | | color: rgba(0, 0, 0, 0.8); |
| | | line-height: 38rpx; |
| | | } |
| | | |
| | | .time { |
| | | font-weight: 400; |
| | | font-size: 23rpx; |
| | | color: rgba(0, 0, 0, 0.4); |
| | | line-height: 33rpx; |
| | | } |
| | | |
| | | .opt1 { |
| | | color: rgba(0, 0, 0, 0.10) !important; |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | } |
| | | |
| | | .proItem:last-child { |
| | | .proLine { |
| | | display: none; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | .resultDesc { |
| | | background: #FFFFFF; |
| | | box-shadow: 0rpx 0rpx 27rpx 0rpx rgba(0, 0, 0, 0.1); |
| | | margin-top: 27rpx; |
| | | padding: 31rpx 31rpx 31rpx 27rpx; |
| | | border-radius: 27rpx; |
| | | |
| | | .topInfo { |
| | | background: rgba(252, 141, 85, 0.1); |
| | | border-radius: 8rpx; |
| | | padding: 19rpx 27rpx; |
| | | |
| | | .name { |
| | | font-size: 23rpx; |
| | | color: #000000; |
| | | line-height: 33rpx; |
| | | margin-right: 8rpx; |
| | | } |
| | | |
| | | .value { |
| | | font-size: 23rpx; |
| | | color: #000000; |
| | | line-height: 33rpx; |
| | | } |
| | | } |
| | | |
| | | .title { |
| | | font-weight: 600; |
| | | font-size: 27rpx; |
| | | color: rgba(0, 0, 0, 0.88); |
| | | line-height: 38rpx; |
| | | margin-top: 38rpx; |
| | | margin-bottom: 27rpx; |
| | | } |
| | | |
| | | .context { |
| | | padding: 25rpx 30rpx 29rpx 31rpx; |
| | | |
| | | font-size: 27rpx; |
| | | color: rgba(0, 0, 0, 0.8); |
| | | line-height: 38rpx; |
| | | } |
| | | |
| | | |
| | | } |
| | | } |
| | | |
| | | .descPic { |
| | | display: flex; |
| | | flex-wrap: wrap; |
| | | .resultDesc { |
| | | background: #FFFFFF; |
| | | box-shadow: 0rpx 0rpx 27rpx 0rpx rgba(0, 0, 0, 0.1); |
| | | margin-top: 27rpx; |
| | | padding: 31rpx 31rpx 31rpx 27rpx; |
| | | border-radius: 27rpx; |
| | | |
| | | .picItem { |
| | | margin-right: 15rpx; |
| | | .topInfo { |
| | | background: rgba(252, 141, 85, 0.1); |
| | | border-radius: 8rpx; |
| | | padding: 19rpx 27rpx; |
| | | |
| | | .name { |
| | | font-size: 23rpx; |
| | | color: #000000; |
| | | line-height: 33rpx; |
| | | margin-right: 8rpx; |
| | | } |
| | | |
| | | .img { |
| | | width: 140.38rpx; |
| | | height: 140.38rpx; |
| | | border-radius: 7.69rpx; |
| | | .value { |
| | | font-size: 23rpx; |
| | | color: #000000; |
| | | line-height: 33rpx; |
| | | } |
| | | } |
| | | |
| | | .videoImg { |
| | | .title { |
| | | font-weight: 600; |
| | | font-size: 27rpx; |
| | | color: rgba(0, 0, 0, 0.88); |
| | | line-height: 38rpx; |
| | | margin-top: 38rpx; |
| | | margin-bottom: 27rpx; |
| | | } |
| | | |
| | | .context { |
| | | padding: 25rpx 30rpx 29rpx 31rpx; |
| | | |
| | | font-size: 27rpx; |
| | | color: rgba(0, 0, 0, 0.8); |
| | | line-height: 38rpx; |
| | | } |
| | | |
| | | |
| | | } |
| | | } |
| | | |
| | | .descPic { |
| | | display: flex; |
| | | flex-wrap: wrap; |
| | | |
| | | .picItem { |
| | | margin-right: 15rpx; |
| | | |
| | | |
| | | .img { |
| | | width: 140.38rpx; |
| | | height: 140.38rpx; |
| | | border-radius: 7.69rpx; |
| | | position: relative; |
| | | } |
| | | |
| | | .videoOpen { |
| | | position: absolute; |
| | | top: 10rpx; |
| | | left: 0; |
| | | z-index: 99; |
| | | width: 140rpx; |
| | | height: 140rpx; |
| | | border-radius: 8rpx; |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | |
| | | .video { |
| | | z-index: 999; |
| | | width: 140rpx; |
| | | height: 140rpx; |
| | | } |
| | | } |
| | | } |
| | | |
| | | .noData { |
| | | font-size: 27rpx; |
| | | color: rgba(0, 0, 0, 0.40); |
| | | line-height: 38rpx; |
| | | .videoImg { |
| | | width: 140.38rpx; |
| | | height: 140.38rpx; |
| | | border-radius: 7.69rpx; |
| | | position: relative; |
| | | } |
| | | |
| | | #myVideo { |
| | | z-index: 1; |
| | | } |
| | | |
| | | .btnButtom { |
| | | .videoOpen { |
| | | position: absolute; |
| | | top: 10rpx; |
| | | left: 0; |
| | | z-index: 99; |
| | | position: fixed; |
| | | bottom: 0; |
| | | width: 100vw; |
| | | box-sizing: border-box; |
| | | padding: 33rpx 31rpx; |
| | | width: 140rpx; |
| | | height: 140rpx; |
| | | border-radius: 8rpx; |
| | | display: flex; |
| | | background-color: #ffffff; |
| | | justify-content: space-between; |
| | | |
| | | .cancel { |
| | | background: #FFFFFF; |
| | | border: 2rpx solid; |
| | | box-shadow: 0 0 0 5px linear-gradient(270deg, rgba(252, 141, 85, 1), rgba(255, 73, 72, 1)); |
| | | border-image-slice: 1; |
| | | border-radius: 38rpx; |
| | | font-size: 27rpx; |
| | | color: #FF4948; |
| | | line-height: 38rpx; |
| | | padding: 19rpx 138rpx; |
| | | } |
| | | |
| | | .sure { |
| | | background: linear-gradient(270deg, #FC8D55 0%, #FF4948 100%); |
| | | border-radius: 38rpx; |
| | | font-size: 27rpx; |
| | | color: #FFFFFF; |
| | | line-height: 38rpx; |
| | | padding: 19rpx 119rpx 19rpx 119rpx; |
| | | } |
| | | |
| | | .btnDown { |
| | | background: #FFFFFF; |
| | | border: 2rpx solid; |
| | | box-shadow: 0 0 0 5px linear-gradient(270deg, rgba(252, 141, 85, 1), rgba(255, 73, 72, 1)); |
| | | border-image-slice: 1; |
| | | border-radius: 38rpx; |
| | | font-size: 27rpx; |
| | | color: #FF4948; |
| | | line-height: 38rpx; |
| | | padding: 19rpx 13rpx; |
| | | } |
| | | |
| | | .btnAdd { |
| | | background: linear-gradient(270deg, #FC8D55 0%, #FF4948 100%); |
| | | border-radius: 38rpx; |
| | | font-size: 27rpx; |
| | | color: #FFFFFF; |
| | | line-height: 38rpx; |
| | | padding: 19rpx 15rpx 19rpx 15rpx; |
| | | } |
| | | |
| | | .partyUp { |
| | | padding: 19rpx 52rpx !important; |
| | | } |
| | | |
| | | .partyDown { |
| | | padding: 19rpx 25rpx 19rpx 25rpx !important; |
| | | } |
| | | |
| | | |
| | | } |
| | | |
| | | .popup-content { |
| | | background: url('/static/pop@2x.png') no-repeat center center; |
| | | width: 576.92rpx; |
| | | // height: 425rpx; |
| | | border-radius: 19rpx; |
| | | |
| | | .title-pop { |
| | | font-family: PingFangSC, PingFang SC; |
| | | font-weight: 600; |
| | | font-size: 35rpx; |
| | | color: rgba(0, 0, 0, 0.8); |
| | | line-height: 35rpx; |
| | | text-align: center; |
| | | margin-top: 46.15rpx; |
| | | } |
| | | |
| | | .pop-textArea { |
| | | padding: 34rpx 44rpx 0 44rpx; |
| | | |
| | | ::v-deep .u-textarea {} |
| | | |
| | | } |
| | | |
| | | .pop-label { |
| | | font-family: PingFang-SC, PingFang-SC; |
| | | font-weight: 500; |
| | | font-size: 31rpx; |
| | | color: rgba(0, 0, 0, 0.6); |
| | | margin-top: 46.15rpx; |
| | | margin-left: 64.54rpx; |
| | | } |
| | | |
| | | .pop-select { |
| | | height: 77rpx; |
| | | background: #FFFFFF; |
| | | border-radius: 15rpx; |
| | | border: 2rpx solid rgba(0, 0, 0, 0.15); |
| | | margin-left: 61.54rpx; |
| | | margin-top: 19.23rpx; |
| | | margin-right: 61.54rpx; |
| | | display: flex; |
| | | align-items: center; |
| | | padding-left: 30.77rpx; |
| | | font-family: PingFangSC, PingFang SC; |
| | | font-weight: 400; |
| | | font-size: 31rpx; |
| | | color: rgba(0, 0, 0, 0.24); |
| | | cursor: pointer; |
| | | } |
| | | |
| | | .botton-btn { |
| | | display: flex; |
| | | margin-top: 44.23rpx; |
| | | justify-content: center; |
| | | padding-bottom: 55rpx; |
| | | } |
| | | |
| | | .cancle { |
| | | width: 212rpx; |
| | | height: 77rpx; |
| | | border-radius: 48rpx; |
| | | border: 2rpx solid rgba(0, 0, 0, 0.8); |
| | | font-family: PingFangSC, PingFang SC; |
| | | font-weight: 500; |
| | | font-size: 27rpx; |
| | | color: rgba(0, 0, 0, 0.8); |
| | | display: flex; |
| | | justify-content: center; |
| | | align-items: center; |
| | | margin-right: 32.69rpx; |
| | | cursor: pointer; |
| | | } |
| | | |
| | | .sure { |
| | | width: 212rpx; |
| | | height: 77rpx; |
| | | background: linear-gradient(270deg, #FC8D55 0%, #FF4948 100%); |
| | | border-radius: 48rpx; |
| | | display: flex; |
| | | justify-content: center; |
| | | align-items: center; |
| | | font-family: PingFangSC, PingFang SC; |
| | | font-weight: 600; |
| | | font-size: 27rpx; |
| | | color: #FFFFFF; |
| | | cursor: pointer; |
| | | } |
| | | } |
| | | |
| | | .preview-full { |
| | | width: 100vw; |
| | | height: 100vh; |
| | | display: flex; |
| | | flex-direction: column; |
| | | align-items: center; |
| | | justify-content: center; |
| | | background-color: #000000; |
| | | |
| | | .maxVideo { |
| | | width: 100%; |
| | | .video { |
| | | z-index: 999; |
| | | width: 140rpx; |
| | | height: 140rpx; |
| | | } |
| | | } |
| | | } |
| | | |
| | | .noData { |
| | | font-size: 27rpx; |
| | | color: rgba(0, 0, 0, 0.40); |
| | | line-height: 38rpx; |
| | | } |
| | | |
| | | #myVideo { |
| | | z-index: 1; |
| | | } |
| | | |
| | | .btnButtom { |
| | | z-index: 99; |
| | | position: fixed; |
| | | bottom: 0; |
| | | width: 100vw; |
| | | box-sizing: border-box; |
| | | padding: 33rpx 31rpx; |
| | | display: flex; |
| | | background-color: #ffffff; |
| | | justify-content: space-between; |
| | | |
| | | .cancel { |
| | | background: #FFFFFF; |
| | | border: 2rpx solid; |
| | | box-shadow: 0 0 0 5px linear-gradient(270deg, rgba(252, 141, 85, 1), rgba(255, 73, 72, 1)); |
| | | border-image-slice: 1; |
| | | border-radius: 38rpx; |
| | | font-size: 27rpx; |
| | | color: #FF4948; |
| | | line-height: 38rpx; |
| | | padding: 19rpx 138rpx; |
| | | } |
| | | |
| | | .sure { |
| | | background: linear-gradient(270deg, #FC8D55 0%, #FF4948 100%); |
| | | border-radius: 38rpx; |
| | | font-size: 27rpx; |
| | | color: #FFFFFF; |
| | | line-height: 38rpx; |
| | | padding: 19rpx 119rpx 19rpx 119rpx; |
| | | } |
| | | |
| | | .btnDown { |
| | | background: #FFFFFF; |
| | | border: 2rpx solid; |
| | | box-shadow: 0 0 0 5px linear-gradient(270deg, rgba(252, 141, 85, 1), rgba(255, 73, 72, 1)); |
| | | border-image-slice: 1; |
| | | border-radius: 38rpx; |
| | | font-size: 27rpx; |
| | | color: #FF4948; |
| | | line-height: 38rpx; |
| | | padding: 19rpx 13rpx; |
| | | } |
| | | |
| | | .btnAdd { |
| | | background: linear-gradient(270deg, #FC8D55 0%, #FF4948 100%); |
| | | border-radius: 38rpx; |
| | | font-size: 27rpx; |
| | | color: #FFFFFF; |
| | | line-height: 38rpx; |
| | | padding: 19rpx 15rpx 19rpx 15rpx; |
| | | } |
| | | |
| | | .partyUp { |
| | | padding: 19rpx 52rpx !important; |
| | | } |
| | | |
| | | .partyDown { |
| | | padding: 19rpx 25rpx 19rpx 25rpx !important; |
| | | } |
| | | |
| | | |
| | | } |
| | | |
| | | .popup-content { |
| | | background: url('/static/pop@2x.png') no-repeat center center; |
| | | width: 576.92rpx; |
| | | // height: 425rpx; |
| | | border-radius: 19rpx; |
| | | |
| | | .title-pop { |
| | | font-family: PingFangSC, PingFang SC; |
| | | font-weight: 600; |
| | | font-size: 35rpx; |
| | | color: rgba(0, 0, 0, 0.8); |
| | | line-height: 35rpx; |
| | | text-align: center; |
| | | margin-top: 46.15rpx; |
| | | } |
| | | |
| | | .pop-textArea { |
| | | padding: 34rpx 44rpx 0 44rpx; |
| | | |
| | | ::v-deep .u-textarea {} |
| | | |
| | | } |
| | | |
| | | .pop-label { |
| | | font-family: PingFang-SC, PingFang-SC; |
| | | font-weight: 500; |
| | | font-size: 31rpx; |
| | | color: rgba(0, 0, 0, 0.6); |
| | | margin-top: 46.15rpx; |
| | | margin-left: 64.54rpx; |
| | | } |
| | | |
| | | .pop-select { |
| | | height: 77rpx; |
| | | background: #FFFFFF; |
| | | border-radius: 15rpx; |
| | | border: 2rpx solid rgba(0, 0, 0, 0.15); |
| | | margin-left: 61.54rpx; |
| | | margin-top: 19.23rpx; |
| | | margin-right: 61.54rpx; |
| | | display: flex; |
| | | align-items: center; |
| | | padding-left: 30.77rpx; |
| | | font-family: PingFangSC, PingFang SC; |
| | | font-weight: 400; |
| | | font-size: 31rpx; |
| | | color: rgba(0, 0, 0, 0.24); |
| | | cursor: pointer; |
| | | } |
| | | |
| | | .botton-btn { |
| | | display: flex; |
| | | margin-top: 44.23rpx; |
| | | justify-content: center; |
| | | padding-bottom: 55rpx; |
| | | } |
| | | |
| | | .cancle { |
| | | width: 212rpx; |
| | | height: 77rpx; |
| | | border-radius: 48rpx; |
| | | border: 2rpx solid rgba(0, 0, 0, 0.8); |
| | | font-family: PingFangSC, PingFang SC; |
| | | font-weight: 500; |
| | | font-size: 27rpx; |
| | | color: rgba(0, 0, 0, 0.8); |
| | | display: flex; |
| | | justify-content: center; |
| | | align-items: center; |
| | | margin-right: 32.69rpx; |
| | | cursor: pointer; |
| | | } |
| | | |
| | | .sure { |
| | | width: 212rpx; |
| | | height: 77rpx; |
| | | background: linear-gradient(270deg, #FC8D55 0%, #FF4948 100%); |
| | | border-radius: 48rpx; |
| | | display: flex; |
| | | justify-content: center; |
| | | align-items: center; |
| | | font-family: PingFangSC, PingFang SC; |
| | | font-weight: 600; |
| | | font-size: 27rpx; |
| | | color: #FFFFFF; |
| | | cursor: pointer; |
| | | } |
| | | } |
| | | |
| | | .preview-full { |
| | | width: 100vw; |
| | | height: 100vh; |
| | | display: flex; |
| | | flex-direction: column; |
| | | align-items: center; |
| | | justify-content: center; |
| | | background-color: #000000; |
| | | |
| | | .maxVideo { |
| | | width: 100%; |
| | | } |
| | | } |
| | | </style> |
| | |
| | | item.height = uni.$u.addUnit(rowHeight) |
| | | rows.push(item) |
| | | } |
| | | // console.log(rows); |
| | | // |
| | | return rows |
| | | }, |
| | | uTitleWidth() { |
| | |
| | | // width: `${this.startX + this.deltaX}px` |
| | | // } |
| | | // }) |
| | | // // console.log(this.startX + this.deltaX); |
| | | // // |
| | | // animation.transition(button, { |
| | | // styles: { |
| | | // transform: `translateX(${this.startX + this.deltaX}px)` |
| | |
| | | this.barStyle = { |
| | | width: `${width}px` |
| | | } |
| | | // console.log('width', width); |
| | | // |
| | | if (drag) { |
| | | this.$emit('drag', { |
| | | value |
| | |
| | | |
| | | // 开发环境才提示,生产环境不会提示 |
| | | if (process.env.NODE_ENV === 'development') { |
| | | console.log(`\n %c uView V${version} %c https://uviewui.com/ \n\n`, 'color: #ffffff; background: #3c9cff; padding:5px 0; border-radius: 5px;'); |
| | | |
| | | } |
| | | |
| | | export default { |
| | |
| | | * @param m solar month |
| | | * @param d solar day |
| | | * @return JSON object |
| | | * @eg:console.log(calendar.solar2lunar(1987,11,01)); |
| | | * @eg: |
| | | */ |
| | | solar2lunar: function (y, m, d) { // 参数区间1900.1.31~2100.12.31 |
| | | // 年份限定、上限 |
| | |
| | | * @param d lunar day |
| | | * @param isLeapMonth lunar month is leap or not.[如果是农历闰月第四个参数赋值true即可] |
| | | * @return JSON object |
| | | * @eg:console.log(calendar.lunar2solar(1987,9,10)); |
| | | * @eg: |
| | | */ |
| | | lunar2solar: function (y, m, d, isLeapMonth) { // 参数区间1900.1.31~2100.12.1 |
| | | var isLeapMonth = !!isLeapMonth |
| | |
| | | }) |
| | | } |
| | | |
| | | return new Promise(function(resolve, reject) { |
| | | return new Promise(function (resolve, reject) { |
| | | |
| | | let token = 'Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOjE4OTI0MjE4MjgwODU4Mzc4MjYsInR5cGUiOjEsImV4cCI6MTc0MTY5ODg0OCwiY3JlYXRlZCI6MTc0MDQwMjg0ODMzN30.7IYRD37yTkhqcnKyXWcqKk_iTisMp3ar_ByfuVR7Go9rK8ZnGJrlwC3z4NF_ly7IIoBHgE2E4IAvfm3ccam8wg' |
| | | let header = { |
| | |
| | | title: '提示', |
| | | content: str, |
| | | showCancel: false, |
| | | success: function(res) { |
| | | success: function (res) { |
| | | if (res.confirm) { |
| | | // if (routeStr == 'pages/login/index') { |
| | | // uni.reLaunch({ |
| | |
| | | }, |
| | | favicons: [], |
| | | requestRecord: {}, |
| | | publicPath: REACT_APP_ENV === 'prod' ? '/admin/' : '/', |
| | | publicPath: REACT_APP_ENV === 'prod' ? './' : '/', |
| | | }); |
| | |
| | | export default { |
| | | dev: { |
| | | SERVER_URL: 'http://192.168.110.188:6194', |
| | | // SERVER_URL: 'https://huacheng.psciio.com', |
| | | }, |
| | | test: { |
| | | SERVER_URL: '', |
| | | }, |
| | | prod: { |
| | | SERVER_URL: '', |
| | | SERVER_URL: 'https://huacheng.psciio.com', |
| | | }, |
| | | }; |
| | |
| | | name: '人员管理', |
| | | path: '/setting/user', |
| | | component: './setting/user', |
| | | // access: '/system_setting/user_management', |
| | | access: '/system_setting/people_management', |
| | | } |
| | | ], |
| | | }, |
| | |
| | | ); |
| | | }, |
| | | ...initialState?.settings, |
| | | pageTitleRender: () => '“三个身边”群众工作机制平台' |
| | | }; |
| | | }; |
| | | |
| | |
| | | // |
| | | |
| | | const { currentUser } = initialState || {}; |
| | | console.log('currentUser currentUser currentUser currentUser',currentUser) |
| | | return <span className="anticon">{currentUser?.userName || '超级管理员'}</span>; |
| | | }; |
| | | |
| | |
| | | const { initialState, setInitialState } = useModel('@@initialState'); |
| | | |
| | | const [unreadCount, setUnreadCount] = useState(0); |
| | | const { currentUser } = initialState || {}; |
| | | useEffect(() => { |
| | | // const timer = setInterval(() => { |
| | | // getUnreadCount().then((res: any) => { |
| | | // setUnreadCount(res.data || 0); |
| | | // }); |
| | | // }, 1000 * 5) |
| | | const timer = setInterval(() => { |
| | | getUnreadCount().then((res: any) => { |
| | | setUnreadCount(res.data || 0); |
| | | }); |
| | | }, 1000 * 5) |
| | | |
| | | // return () => clearInterval(timer); |
| | | return () => clearInterval(timer); |
| | | }, []); |
| | | |
| | | |
| | | const onMenuClick = async () => { |
| | | await outLogin(); |
| | | localStorage.clear(); |
| | | history.push('/login'); |
| | | flushSync(() => { |
| | | setInitialState((s) => ({ ...s, currentUser: undefined })); |
| | | }); |
| | |
| | | <div style={{ border: '1px solid red', borderRadius: '50%', width: '18px', lineHeight: '16px', marginLeft: '5px', textAlign: 'center', color: 'red', flexShrink: 0 }}>{unreadCount}</div> |
| | | </div> |
| | | } |
| | | <div style={{ marginRight: '25px' }} >{currentUser?.userName || '超级管理员'}</div> |
| | | <div className="logoOut" onClick={onMenuClick}>退出登录<LogoutOutlined style={{ marginLeft: '5px' }} /></div> |
| | | </div> |
| | | }; |
| | |
| | | :where(.css-dev-only-do-not-override-17md30i).ant-menu-light .ant-menu-submenu-selected>.ant-menu-submenu-title, |
| | | :where(.css-dev-only-do-not-override-17md30i).ant-menu-light>.ant-menu .ant-menu-submenu-selected>.ant-menu-submenu-title{ |
| | | color: rgba(0, 0, 0, 0.95); |
| | | } |
| | | |
| | | .del-confirm { |
| | | .del-icon { |
| | | margin-right: 5px; |
| | | width: 22px; |
| | | height: 22px; |
| | | background-color: rgba(233, 157, 66, 1); |
| | | color: #fff; |
| | | border-radius: 50%; |
| | | align-content: center; |
| | | text-align: center; |
| | | } |
| | | |
| | | .ant-modal-confirm-btns { |
| | | .ant-btn-default:last-child { |
| | | border-color: red !important; |
| | | color: #fff !important; |
| | | background-color: red !important; |
| | | } |
| | | |
| | | .ant-btn-default { |
| | | color: #000 !important; |
| | | border-color: #d9d9d9 !important; |
| | | } |
| | | } |
| | | } |
| | |
| | | id: 'pages.login.success', |
| | | defaultMessage: '登录成功!', |
| | | }); |
| | | const userInfo = { userName: data.name }; |
| | | const userInfo = { userName: data.name,...data }; |
| | | localStorage.setItem('userInfo', JSON.stringify(userInfo)); |
| | | let permissionList: any[] = [ |
| | | "/work_order_transaction_management/work_order_item_configuration", |
| | |
| | | "/system_setting/people_management/edit", |
| | | "/work_order_transaction_management/problem_type_management/add", |
| | | "/system_setting/unit_management/add", |
| | | "/system_setting/people_management/detail", |
| | | "/system_setting/role_management/detail", |
| | | "/system_setting/unit_management", |
| | | "/message_notification", |
| | | "/system_setting/role_management/add", |
| | |
| | | "/system_setting/position_management", |
| | | "/system_setting", |
| | | "/system_setting/people_management", |
| | | "/work_order_transaction_management/work_order_item_configuration/save", |
| | | ]; |
| | | let accessObj: any = {}; |
| | | permissionList.map((item) => { |
| | |
| | | accessObj[item] = data.menu.includes(item); |
| | | } |
| | | }); |
| | | |
| | | |
| | | |
| | | setInitialState((s: any) => ({ |
| | | ...s, |
| | | token: data.token, |
| | | userName:data.name, |
| | | permission: accessObj, |
| | | currentUser: userInfo, |
| | | settings: Settings, |
| | |
| | | > |
| | | <div style={{ width: '787px', fontSize: '26px', textAlign: 'center' }}> |
| | | <h1> |
| | | “三个身边”群众工作机制问题化解 |
| | | “三个身边”群众工作机制 |
| | | </h1> |
| | | <h1>平台</h1> |
| | | </div> |
| | |
| | | import { PageContainer, ProTable } from '@ant-design/pro-components'; |
| | | import { buildProTableDataSource, sendRequest, showDelConfirm } from '@/utils/antdUtils'; |
| | | import { Button, message, Space, Select } from 'antd'; |
| | | import { useRef, useState } from 'react'; |
| | | import { Button, message, Space, Select, Cascader } from 'antd'; |
| | | import { useRef, useState, useEffect } from 'react'; |
| | | import { Access, history, useAccess } from 'umi'; |
| | | import { getList, setStatus } from './service' |
| | | import { getList, setStatus, getUnitList,systemPostList } from './service' |
| | | import { render } from 'react-dom'; |
| | | const Banner = () => { |
| | | |
| | | const actionRef = useRef(); |
| | | const access = useAccess(); |
| | | const [items, setItems] = useState([]); |
| | | const [positionList, setPositionList] = useState([]); |
| | | |
| | | const columns = [ |
| | | { |
| | |
| | | }, |
| | | { |
| | | title: '所在单位', |
| | | dataIndex: 'department', |
| | | renderFormItem: (_, { type, defaultRender, ...rest }, form) => { |
| | | dataIndex: 'departmentId', |
| | | renderFormItem: () => { |
| | | return ( |
| | | <Select |
| | | key="searchSelect" |
| | | allowClear |
| | | <Cascader |
| | | options={items} |
| | | fieldNames={{ value: 'key', label: 'name' }} |
| | | placeholder="请选择" |
| | | filterOption={false} |
| | | options={[{ label: '市级', value: '1' }, { label: '区县', value: '2' }, { label: '街道', value: '3' }, { label: '社区', value: '4' }, { label: '党员', value: '5' }]} |
| | | > |
| | | </Select > |
| | | ) |
| | | displayRender={(label) => label[label.length - 1]} |
| | | changeOnSelect={true} |
| | | /> |
| | | ); |
| | | }, |
| | | render: (_, record) => { |
| | | return record.department |
| | |
| | | allowClear |
| | | placeholder="请选择" |
| | | filterOption={false} |
| | | options={[{ label: '市级', value: '1' }, { label: '区县', value: '2' }, { label: '街道', value: '3' }, { label: '社区', value: '4' }, { label: '党员', value: '5' }]} |
| | | fieldNames={{ label: 'name', value: 'id' }} |
| | | options={positionList} |
| | | > |
| | | </Select > |
| | | ) |
| | |
| | | title: '诉求应处理时间', |
| | | dataIndex: 'responseTime', |
| | | hideInSearch: true, |
| | | render: (_, record) => { |
| | | return record.responseTime.split('T')[0] |
| | | |
| | | } |
| | | }, |
| | | { |
| | | title: '提示类型', |
| | |
| | | render: (text, record) => { |
| | | return ( |
| | | <Space> |
| | | <Access accessible={access['/message_notification/mark_read']}> |
| | | <Button |
| | | type="link" |
| | | onClick={() => { |
| | | showDelConfirm(async () => { |
| | | let status = await sendRequest(setStatus, record.id) |
| | | if (status) { |
| | | actionRef.current.reload(); |
| | | } |
| | | }, '确认将所选信息标记为已读吗?'); |
| | | }} |
| | | > |
| | | 标记已读 |
| | | </Button> |
| | | </Access> |
| | | {record.readStatus == 0 && ( |
| | | <Access accessible={access['/message_notification/mark_read']}> |
| | | <Button |
| | | type="link" |
| | | onClick={() => { |
| | | showDelConfirm(async () => { |
| | | let status = await sendRequest(setStatus, record.id) |
| | | if (status) { |
| | | actionRef.current.reload(); |
| | | } |
| | | }, '确认将所选信息标记为已读吗?', '确定', '取消', '操作提示'); |
| | | }} |
| | | > |
| | | 标记已读 |
| | | </Button> |
| | | </Access> |
| | | )} |
| | | |
| | | </Space > |
| | | ); |
| | | }, |
| | | }, |
| | | ] |
| | | useEffect(() => { |
| | | fetchUnit(); |
| | | systemPostList({ pageNum: 1, pageSize: 10000 }).then(res => { |
| | | setPositionList(() => res.data.records) |
| | | }) |
| | | }, []); |
| | | |
| | | const fetchUnit = () => { |
| | | getUnitList().then((res) => { |
| | | if (res.code == 200 && res.data) { |
| | | const traverseItems = (items) => { |
| | | return items.map((item) => { |
| | | item.key = item.id; |
| | | item.title = '1'; |
| | | if (item.child && item.child.length > 0) { |
| | | item.children = traverseItems(item.child); |
| | | } |
| | | return item; |
| | | }); |
| | | }; |
| | | setItems(traverseItems(res.data)); |
| | | } |
| | | }); |
| | | }; |
| | | |
| | | return <div> |
| | | <PageContainer title='消息通知'> |
| | | <PageContainer title='消息通知' header={{ |
| | | breadcrumb: {}, |
| | | }}> |
| | | <ProTable |
| | | rowKey='id' |
| | | actionRef={actionRef} |
| | |
| | | }} |
| | | search={{ labelWidth: 140 }} |
| | | request={(params) => { |
| | | params.bannerType = Number(params.bannerType) |
| | | if (params.departmentId) { |
| | | params.departmentId = params.departmentId[params.departmentId.length - 1]; |
| | | } |
| | | return buildProTableDataSource(getList, params) |
| | | }} |
| | | toolBarRender={false} |
| | |
| | | export const getList = async (data) => { |
| | | return request(`/api/huacheng-sangeshenbian/messageNotification/list`, { |
| | | method: 'GET', |
| | | data |
| | | params:data |
| | | }); |
| | | } |
| | | // 设置已读 |
| | |
| | | }); |
| | | } |
| | | |
| | | // 单位列表 |
| | | export const getUnitList = async (params) => { |
| | | return request(`/api/huacheng-sangeshenbian/department/list`, { |
| | | method: 'GET', |
| | | params |
| | | }); |
| | | } |
| | | // 获取职位列表数据 |
| | | export const systemPostList = async (params) => { |
| | | return request(`/api/huacheng-sangeshenbian/systemPost/list`, { |
| | | method: 'GET',params |
| | | }); |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | // 详情列表 |
| | | export const getDetailList = async (data) => { |
| | |
| | | } |
| | | { |
| | | !record.admin && |
| | | <Access accessible={access['/position_management/del']}> |
| | | <Access accessible={access['/system_setting/position_management/del']}> |
| | | <Button |
| | | type="link" |
| | | onClick={() => { |
| | | showDelConfirm(async () => { |
| | | let status = await sendRequest(del, record.deptId); |
| | | let status = await sendRequest(del, record); |
| | | if (status) { |
| | | actionRef.current.reload(); |
| | | } |
| | |
| | | const okHandle = () => { |
| | | form.validateFields().then((values) => { |
| | | setSpinning(true) |
| | | values.menuIds = treeSeletKeys |
| | | values.systemMenuIds = treeSeletKeys |
| | | delete values.tree |
| | | if (data.id) { |
| | | values.id = data.id |
| | |
| | | return ( |
| | | <Space> |
| | | { |
| | | record.roleId != 1 && |
| | | record.id != 1 && |
| | | <Access accessible={access['/system_setting/role_management/edit']}> |
| | | <Button |
| | | type="link" |
| | |
| | | </Access> |
| | | } |
| | | { |
| | | record.roleId != 1 && |
| | | record.id != 1 && |
| | | <Access accessible={access['/system_setting/role_management/del']}> |
| | | <Button |
| | | type="link" |
| | |
| | | </Button> |
| | | </Access> |
| | | } |
| | | <Access accessible={access['/system_setting/role_management/detail'] || false}> |
| | | <Access accessible={access['/system_setting/role_management/detail']}> |
| | | <Button |
| | | type="link" |
| | | onClick={() => { |
| | |
| | | }, |
| | | ] |
| | | |
| | | return <PageContainer title='角色管理'> |
| | | return <PageContainer title='角色管理' header={{ |
| | | breadcrumb: {}, |
| | | }}> |
| | | <ProTable |
| | | rowKey='id' |
| | | actionRef={actionRef} |
| | |
| | | import { Form, Input, Modal, Tree, Button, Spin, Row, Col, Select, Radio } from 'antd'; |
| | | import { Form, Input, Modal, Tree, Button, Spin, Row, Col, Select, Radio, Cascader } from 'antd'; |
| | | import { forwardRef, useImperativeHandle, useState } from 'react'; |
| | | import { useEffect } from 'react'; |
| | | import { getDepartmentList } from '../service'; |
| | | import { Color } from 'antd/es/color-picker'; |
| | | import { getDepartmentList, systemPostList, systemRoleList, getSystemUserInfo, getCityList, addSystemUserInfo, editSystemUserInfo } from '../service'; |
| | | import CryptoJS from 'crypto-js'; |
| | | const formItemLayout = { |
| | | labelCol: { span: 8 }, |
| | | wrapperCol: { span: 16 }, |
| | |
| | | const AddAndEdit = ({ visible, onSave, onUpdate, onCancel }, ref) => { |
| | | const [form] = Form.useForm(); |
| | | const [data, setData] = useState({}) |
| | | const [treeData, setTreeData] = useState([]);//权限树 |
| | | const [treeSeletKeys, setTreeSeletKeys] = useState([]); //勾选权限 |
| | | const [detailType, setDetailType] = useState(false);//是否详情 |
| | | const [spinning, setSpinning] = useState(false); |
| | | |
| | | const [oneCompanyList, setOneCompanyList] = useState([]) |
| | | |
| | | const [twoCompanyList, setTwoCompanyList] = useState([]) |
| | | const [threeCompanyList, setThreeCompanyList] = useState([]) |
| | | const [fourCompanyList, setFourCompanyList] = useState([]) |
| | | |
| | | const [adminLevel, setAdminLevel] = useState(1) |
| | | |
| | | //所属职位 |
| | | const [positionList, setPositionList] = useState([]) |
| | |
| | | const [roleList, setRoleList] = useState([]) |
| | | //账号层级 |
| | | const [levelList, setLevelList] = useState([{ name: '市级账号', value: 1 }, { name: '区县账号', value: 2 }, { name: '街道账号', value: 3 }, { name: '社区账号', value: 4 }, { name: '党员账号', value: 5 }]) |
| | | //选择的层级 |
| | | const [activeLevel, setActiveLevel] = useState('') |
| | | //所属区县 |
| | | const [countyList, setCountyList] = useState([]) |
| | | const [activeCounty, setActiveCounty] = useState({}) |
| | | //所属街道 |
| | | const [streetList, setStreetList] = useState([]) |
| | | const [activeStreet, setActiveStreet] = useState({}) |
| | | //所属社区 |
| | | const [communityList, setCommunityList] = useState([]) |
| | | const [activeCommunity, setActiveCommunity] = useState({}) |
| | | |
| | | |
| | | |
| | | |
| | | useEffect(() => { |
| | | // 获取单位 |
| | | getDepartmentList(1).then(res => { |
| | | setOneCompanyList(() => res.data) |
| | | }) |
| | | getDepartmentList(2).then(res => { |
| | | setTwoCompanyList(() => res.data) |
| | | }) |
| | | getDepartmentList(3).then(res => { |
| | | setThreeCompanyList(() => res.data) |
| | | }) |
| | | getDepartmentList(4).then(res => { |
| | | setThreeCompanyList(() => res.data) |
| | | }) |
| | | |
| | | }, []) |
| | | |
| | | useImperativeHandle(ref, () => { |
| | | return { |
| | | refreshData: (data, type) => { |
| | | setDetailType(type || false) |
| | | if (data.id) { |
| | | // 获取角色的权限树 |
| | | getTree(data.id).then(res => { |
| | | setTreeSeletKeys(res.data.systemMenuIds || []); |
| | | }) |
| | | refreshData: (data, companyList) => { |
| | | getCountyList() |
| | | setOneCompanyList(() => companyList) |
| | | console.log('companyList', companyList) |
| | | |
| | | systemPostList({ pageNum: 1, pageSize: 10000 }).then(res => { |
| | | setPositionList(() => res.data.records) |
| | | }) |
| | | systemRoleList({ pageNum: 1, pageSize: 10000 }).then(res => { |
| | | setRoleList(() => res.data.records) |
| | | }) |
| | | // 权限判断 |
| | | let adminInfo = JSON.parse(localStorage.getItem('userInfo')) |
| | | setAdminLevel(() => adminInfo.accountLevel) |
| | | switch (adminInfo.accountLevel) { |
| | | case 1: |
| | | setLevelList(() => [{ name: '市级账号', value: 1 }, { name: '区县账号', value: 2 }, { name: '街道账号', value: 3 }, { name: '社区账号', value: 4 }, { name: '党员账号', value: 5 }]) |
| | | break; |
| | | case 2: |
| | | getStreetList(adminInfo.districtsCode) |
| | | setLevelList(() => [{ name: '区县账号', value: 2 }, { name: '街道账号', value: 3 }, { name: '社区账号', value: 4 }, { name: '党员账号', value: 5 }]) |
| | | this.$nextTick(() => { |
| | | form.setFieldsValue({ districtsCode: adminInfo.districtsCode }) |
| | | }) |
| | | |
| | | break; |
| | | case 3: |
| | | getStreetList(adminInfo.districtsCode) |
| | | getcommunityList(adminInfo.streetId) |
| | | setLevelList(() => [{ name: '街道账号', value: 3 }, { name: '社区账号', value: 4 }, { name: '党员账号', value: 5 }]) |
| | | form.setFieldsValue({ districtsCode: adminInfo.districtsCode }) |
| | | form.setFieldsValue({ streetId: adminInfo.streetId }) |
| | | break; |
| | | case 4: |
| | | getStreetList(adminInfo.districtsCode) |
| | | getcommunityList(adminInfo.streetId) |
| | | setLevelList(() => [{ name: '社区账号', value: 4 }, { name: '党员账号', value: 5 }]) |
| | | // this.$nextTick(() => { |
| | | form.setFieldsValue({ districtsCode: adminInfo.districtsCode }) |
| | | form.setFieldsValue({ streetId: adminInfo.streetId }) |
| | | form.setFieldsValue({ communityId: adminInfo.communityId * 1 }) |
| | | // }) |
| | | |
| | | |
| | | break; |
| | | case 5: |
| | | getStreetList(adminInfo.districtsCode) |
| | | getcommunityList(adminInfo.streetId) |
| | | setLevelList(() => [{ name: '党员账号', value: 5 }]) |
| | | form.setFieldsValue({ districtsCode: adminInfo.districtsCode }) |
| | | form.setFieldsValue({ streetId: adminInfo.streetId }) |
| | | form.setFieldsValue({ communityId: adminInfo.communityId * 1 }) |
| | | break; |
| | | default: |
| | | break; |
| | | } |
| | | setData(data) |
| | | form.setFieldsValue(data); |
| | | |
| | | |
| | | |
| | | if (data.id) { |
| | | getInfo(data.id) |
| | | } |
| | | setData(() => data) |
| | | if (data.unitId) { |
| | | let result = [] |
| | | findParent(companyList, data.unitId * 1, result) |
| | | form.setFieldsValue({ DepartmentId: result }) |
| | | } |
| | | }, |
| | | clean: () => { |
| | | setSpinning(false) |
| | |
| | | // 保存 |
| | | const okHandle = () => { |
| | | form.validateFields().then((values) => { |
| | | setSpinning(true) |
| | | values.menuIds = treeSeletKeys |
| | | delete values.tree |
| | | values.password = CryptoJS.MD5(values.password).toString(); |
| | | if (values.DepartmentId) { |
| | | values.oneDepartmentId = values.DepartmentId.length > 0 ? values.DepartmentId[0] : null |
| | | values.twoDepartmentId = values.DepartmentId.length > 1 ? values.DepartmentId[1] : null |
| | | values.threeDepartmentId = values.DepartmentId.length > 2 ? values.DepartmentId[2] : null |
| | | values.fourDepartmentId = values.DepartmentId.length > 3 ? values.DepartmentId[3] : null |
| | | } |
| | | if (data.id) { |
| | | values.id = data.id |
| | | onUpdate(values) |
| | |
| | | } |
| | | }); |
| | | }; |
| | | const getCountyList = (id) => { |
| | | getCityList({ id: '510400', tier: 2 }).then(res => { |
| | | setCountyList(() => res.data) |
| | | }) |
| | | } |
| | | const getStreetList = (id) => { |
| | | getCityList({ id: id, tier: 3 }).then(res => { |
| | | setStreetList(() => res.data) |
| | | }) |
| | | } |
| | | const getcommunityList = (id) => { |
| | | getCityList({ id: id, tier: 4 }).then(res => { |
| | | setCommunityList(() => res.data) |
| | | }) |
| | | } |
| | | const changeCountry = (value, label) => { |
| | | setActiveCounty(label) |
| | | getStreetList(value) |
| | | form.setFieldsValue({ streetId: '', communityId: '' }) |
| | | setActiveCommunity({ name: '', id: '' }) |
| | | setActiveStreet({ name: '', id: '' }) |
| | | |
| | | } |
| | | const changeStreet = (value, label) => { |
| | | setActiveStreet(label) |
| | | getcommunityList(value) |
| | | form.setFieldsValue({ communityId: '' }) |
| | | setActiveCommunity({ name: '', id: '' }) |
| | | } |
| | | const changeCommunity = (value, label) => { |
| | | setActiveCommunity(label) |
| | | } |
| | | const getInfo = (id) => { |
| | | getSystemUserInfo(id).then(res => { |
| | | if (res.data.districtsCode) { |
| | | setActiveStreet({ name: res.data.districts, id: res.data.districtsCode }) |
| | | getStreetList(res.data.districtsCode) |
| | | } |
| | | if (res.data.streetId) { |
| | | setActiveCounty({ name: res.data.street, id: res.data.streetId }) |
| | | getcommunityList(res.data.streetId) |
| | | } |
| | | if (res.data.communityId) { |
| | | setActiveCommunity({ name: res.data.community, id: res.data.communityId }) |
| | | } |
| | | // delete res.data.password |
| | | |
| | | let departmentId = [] |
| | | if (res.data.oneDepartmentId) { |
| | | departmentId.push(res.data.oneDepartmentId) |
| | | } |
| | | if (res.data.twoDepartmentId) { |
| | | departmentId.push(res.data.twoDepartmentId) |
| | | } |
| | | if (res.data.threeDepartmentId) { |
| | | departmentId.push(res.data.threeDepartmentId) |
| | | } |
| | | if (res.data.fourDepartmentId) { |
| | | departmentId.push(res.data.fourDepartmentId) |
| | | } |
| | | res.data.DepartmentId = departmentId |
| | | console.log('departmentId', departmentId) |
| | | setActiveLevel(() => res.data.accountLevel) |
| | | |
| | | form.setFieldsValue({ ...res.data, password: '' }) |
| | | }) |
| | | } |
| | | const findParent = (data, target, result) => { |
| | | for (let item of data) { |
| | | if (item.id === target) { |
| | | //将查找到的目标数据加入结果数组中 |
| | | //可根据需求unshift(item.id)或unshift(item) |
| | | result.unshift(item.id) |
| | | return true |
| | | } |
| | | if (item.children && item.children.length > 0) { |
| | | //根据查找到的结果往上找父级节点 |
| | | let isFind = findParent(item.children, target, result) |
| | | if (isFind) { |
| | | result.unshift(item.id) |
| | | return true |
| | | } |
| | | } |
| | | } |
| | | //走到这说明没找到目标 |
| | | return false |
| | | } |
| | | |
| | | return ( |
| | | <Modal |
| | | getContainer={false} |
| | | width="65%" |
| | | destroyOnClose |
| | | title={detailType ? '人员详情' : data.id ? '编辑人员' : '添加人员'} |
| | | title={data.type == 'detail' ? '人员详情' : data.type == 'edit' ? '编辑人员' : '添加人员'} |
| | | open={visible} |
| | | onCancel={() => onCancel(false)} |
| | | afterClose={() => { |
| | | form.resetFields() |
| | | setTreeSeletKeys([]) |
| | | }} |
| | | footer={ |
| | | !detailType ? |
| | | (data.type == 'edit' || data.type == 'add') ? |
| | | [ |
| | | <Button key="back" onClick={() => onCancel(false)}>取消</Button>, |
| | | <Button key="submit" type="primary" onClick={okHandle}> |
| | |
| | | label="姓名" |
| | | rules={[{ required: true, message: '请输入人员姓名' }]} |
| | | > |
| | | <Input disabled={detailType} placeholder='请输入人员姓名' /> |
| | | <Input disabled={data.type == 'detail'} placeholder='请输入人员姓名' /> |
| | | </Form.Item> |
| | | </Col> |
| | | </Row> |
| | | <Row> |
| | | <Col span={8}> |
| | | <Col span={16}> |
| | | <Form.Item |
| | | name="oneDepartmentId" |
| | | label="所属一级单位" |
| | | rules={[{ required: true, message: '请选择所属一级单位' }]} |
| | | name="DepartmentId" |
| | | label="所属单位" |
| | | labelCol={{ span: 4 }} |
| | | rules={[{ required: true, message: '请选择所属单位' }]} |
| | | > |
| | | <Select |
| | | {/* <Select |
| | | key="searchSelect" |
| | | allowClear |
| | | disabled={data.type == 'detail'} |
| | | placeholder="请选择" |
| | | options={oneCompanyList} |
| | | fieldNames={{ label: 'name', value: 'id' }} |
| | | filterOption={false} |
| | | > |
| | | </Select > |
| | | </Select > */} |
| | | <Cascader |
| | | changeSelect |
| | | options={oneCompanyList} |
| | | fieldNames={{ value: 'key', label: 'name' }} |
| | | placeholder="请选择" |
| | | // displayRender={(label) => label[label.length - 1]} |
| | | changeOnSelect={true} |
| | | /> |
| | | </Form.Item> |
| | | </Col> |
| | | <Col span={8}> |
| | | {/* <Col span={8}> |
| | | <Form.Item |
| | | name="twoDepartmentId" |
| | | label="所属二级单位" |
| | |
| | | <Select |
| | | key="searchSelect" |
| | | allowClear |
| | | disabled={data.type == 'detail'} |
| | | placeholder="请选择" |
| | | options={twoCompanyList} |
| | | fieldNames={{ label: 'name', value: 'id' }} |
| | |
| | | <Select |
| | | key="searchSelect" |
| | | allowClear |
| | | disabled={data.type == 'detail'} |
| | | placeholder="请选择" |
| | | options={threeCompanyList} |
| | | fieldNames={{ label: 'name', value: 'id' }} |
| | |
| | | > |
| | | </Select > |
| | | </Form.Item> |
| | | </Col> |
| | | </Col> */} |
| | | </Row> |
| | | <Row> |
| | | {/* <Row> |
| | | <Col span={8}> |
| | | <Form.Item |
| | | name="fourDepartmentId" |
| | |
| | | <Select |
| | | key="searchSelect" |
| | | allowClear |
| | | disabled={data.type == 'detail'} |
| | | placeholder="请选择" |
| | | options={fourCompanyList} |
| | | fieldNames={{ label: 'name', value: 'id' }} |
| | |
| | | </Select > |
| | | </Form.Item> |
| | | </Col> |
| | | </Row> |
| | | </Row> */} |
| | | <Row> |
| | | <Col span={8}> |
| | | <Form.Item |
| | |
| | | <Select |
| | | key="searchSelect" |
| | | allowClear |
| | | disabled={data.type == 'detail'} |
| | | placeholder="请选择" |
| | | options={positionList} |
| | | fieldNames={{ label: 'name', value: 'id' }} |
| | |
| | | <Select |
| | | key="searchSelect" |
| | | allowClear |
| | | disabled={data.type == 'detail'} |
| | | placeholder="请选择" |
| | | options={roleList} |
| | | fieldNames={{ label: 'name', value: 'id' }} |
| | |
| | | <Select |
| | | key="searchSelect" |
| | | allowClear |
| | | onChange={(e) => setActiveLevel(e)} |
| | | disabled={data.type == 'detail'} |
| | | placeholder="请选择" |
| | | options={levelList} |
| | | fieldNames={{ label: 'name', value: 'value' }} |
| | |
| | | rules={[{ required: true, message: '是否管理员' }]} |
| | | > |
| | | <Radio.Group |
| | | disabled={data.type == 'detail'} |
| | | // style={style} |
| | | // onChange={onChange} |
| | | // value={value} |
| | |
| | | </Form.Item> |
| | | </Col> |
| | | </Row> |
| | | <Row> |
| | | <Col span={8}> |
| | | <Form.Item |
| | | name="districts" |
| | | label="所属区县" |
| | | rules={[{ required: true, message: '请选择所属区县' }]} |
| | | > |
| | | <Select |
| | | key="searchSelect" |
| | | allowClear |
| | | {activeLevel != 1 && ( |
| | | <Row> |
| | | {[2, 3, 4, 5].includes(activeLevel) && ( |
| | | <Col span={8}> |
| | | <Form.Item |
| | | name="districtsCode" |
| | | label="所属区县" |
| | | rules={[{ required: true, message: '请选择所属区县' }]} |
| | | > |
| | | {/* <Select |
| | | // onChange={changeCountry} |
| | | // value={activeCounty} |
| | | placeholder="请选择" |
| | | options={oneCompanyList} |
| | | options={levelList} |
| | | fieldNames={{ label: 'name', value: 'id' }} |
| | | filterOption={false} |
| | | > |
| | | </Select > |
| | | </Form.Item> |
| | | </Col> |
| | | <Col span={8}> |
| | | <Form.Item |
| | | name="street" |
| | | label="所属街道" |
| | | rules={[{ required: true, message: '请选择所属街道' }]} |
| | | > |
| | | <Select |
| | | key="searchSelect" |
| | | allowClear |
| | | placeholder="请选择" |
| | | options={twoCompanyList} |
| | | fieldNames={{ label: 'name', value: 'id' }} |
| | | filterOption={false} |
| | | > |
| | | </Select > |
| | | </Form.Item> |
| | | </Col> |
| | | <Col span={8}> |
| | | <Form.Item |
| | | name="community" |
| | | label="所属社区" |
| | | rules={[{ required: true, message: '请选择所属社区' }]} |
| | | > |
| | | <Select |
| | | key="searchSelect" |
| | | allowClear |
| | | placeholder="请选择" |
| | | options={threeCompanyList} |
| | | fieldNames={{ label: 'name', value: 'id' }} |
| | | filterOption={false} |
| | | > |
| | | </Select > |
| | | </Form.Item> |
| | | </Col> |
| | | </Row> |
| | | </Select > */} |
| | | <Select |
| | | key="searchSelect" |
| | | allowClear |
| | | disabled={data.type == 'detail' || [2, 3, 4, 5].includes(adminLevel)} |
| | | onChange={changeCountry} |
| | | value={activeCounty.id} |
| | | placeholder="请选择" |
| | | options={countyList} |
| | | fieldNames={{ label: 'name', value: 'id' }} |
| | | // filterOption={false} |
| | | > |
| | | </Select > |
| | | </Form.Item> |
| | | </Col> |
| | | )} |
| | | {[3, 4, 5].includes(activeLevel) && ( |
| | | <Col span={8}> |
| | | <Form.Item |
| | | name="streetId" |
| | | label="所属街道" |
| | | rules={[{ required: true, message: '请选择所属街道' }]} |
| | | > |
| | | <Select |
| | | onChange={changeStreet} |
| | | disabled={!activeCounty || data.type == 'detail' || [3, 4, 5].includes(adminLevel)} |
| | | key="searchSelect" |
| | | allowClear |
| | | value={activeStreet.id} |
| | | placeholder="请选择" |
| | | options={streetList} |
| | | fieldNames={{ label: 'name', value: 'id' }} |
| | | > |
| | | </Select > |
| | | </Form.Item> |
| | | </Col> |
| | | )} |
| | | |
| | | {[4, 5].includes(activeLevel) && ( |
| | | <Col span={8}> |
| | | <Form.Item |
| | | name="communityId" |
| | | label="所属社区" |
| | | rules={[{ required: true, message: '请选择所属社区' }]} |
| | | > |
| | | <Select |
| | | onChange={changeCommunity} |
| | | disabled={!activeStreet || data.type == 'detail' || [4, 5].includes(adminLevel)} |
| | | key="searchSelect" |
| | | allowClear |
| | | value={activeCommunity.id} |
| | | placeholder="请选择" |
| | | options={communityList} |
| | | fieldNames={{ label: 'name', value: 'id' }} |
| | | > |
| | | </Select > |
| | | </Form.Item> |
| | | </Col> |
| | | )} |
| | | </Row> |
| | | )} |
| | | |
| | | <Row> |
| | | <Col span={16}> |
| | | <Form.Item |
| | | label="联系方式" |
| | | required |
| | | labelCol={{ span: 4 }} |
| | | wrapperCol={{ span: 20 }} |
| | | style={{ marginBottom: 0 }} |
| | |
| | | <div style={{ display: "flex", flex: 1 }}> |
| | | <Form.Item |
| | | name="phone" |
| | | |
| | | rules={[{ |
| | | validator: (rule, value) => { |
| | | return new Promise((resolve, reject) => { |
| | |
| | | }, |
| | | }]} |
| | | > |
| | | <Input disabled={detailType} placeholder='请输入联系方式' /> |
| | | <Input disabled={data.type == 'detail'} placeholder='请输入联系方式' /> |
| | | </Form.Item> |
| | | <div style={{ fontSize: '12px', color: "rgba(0,0,0,0.5)", marginLeft: "10px" }}>联系方式将作为登录账号使用</div> |
| | | </div> |
| | |
| | | <Row> |
| | | <Col span={8}> |
| | | <Form.Item |
| | | required |
| | | required={data.type == 'add'} |
| | | name="password" |
| | | label="登录密码" |
| | | rules={[{ |
| | | validator: (rule, value) => { |
| | | return new Promise((resolve, reject) => { |
| | | if (!value) { |
| | | if (!value && data.type == 'add') { |
| | | reject('请输入新密码'); |
| | | } |
| | | const passwordRegex = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$/; |
| | | if (!passwordRegex.test(value)) { |
| | | if (!passwordRegex.test(value) && data.type == 'add') { |
| | | reject('密码需要包含大小写字母,数字和特殊符号,且长度为8位以上'); |
| | | } |
| | | resolve(''); |
| | |
| | | }, |
| | | }]} |
| | | > |
| | | <Input.Password disabled={detailType} placeholder='请输入' /> |
| | | <Input.Password disabled={data.type == 'detail'} placeholder='请输入' /> |
| | | </Form.Item> |
| | | </Col> |
| | | <Col span={16}> |
| | | <Form.Item |
| | | label="确认密码" |
| | | required |
| | | required={data.type == 'add'} |
| | | labelCol={{ span: 4 }} |
| | | wrapperCol={{ span: 20 }} |
| | | style={{ marginBottom: 0 }} |
| | |
| | | rules={[{ |
| | | validator: (rule, value) => { |
| | | return new Promise((resolve, reject) => { |
| | | if (!value) { |
| | | if (!value && data.type == 'add') { |
| | | reject('请再次输入新密码'); |
| | | } |
| | | if (value != form.getFieldValue('password')) { |
| | | if (value != form.getFieldValue('password') && data.type == 'add') { |
| | | reject('两次密码请保持一致'); |
| | | } |
| | | resolve(''); |
| | |
| | | }, |
| | | },]} |
| | | > |
| | | <Input.Password disabled={detailType} placeholder='请输入' /> |
| | | <Input.Password disabled={data.type == 'detail'} placeholder='请输入' /> |
| | | </Form.Item> |
| | | <div style={{ fontSize: '12px', color: "rgba(0,0,0,0.5)", marginLeft: "10px" }}>密码需要包含大小写字母,数字和特殊符号,且长度为8位以上</div> |
| | | </div> |
New file |
| | |
| | | import { Button, Form, Input, Modal } from 'antd';
|
| | | import { forwardRef, useImperativeHandle, useState } from 'react';
|
| | |
|
| | | const formItemLayout = {
|
| | | labelCol: { span: 7 },
|
| | | wrapperCol: { span: 12 },
|
| | | };
|
| | |
|
| | | const AddEditView = ({ visible, onSave, onUpdate, onCancel }, ref) => {
|
| | | const [form] = Form.useForm();
|
| | | const [editData, setEditData] = useState({});
|
| | | const [rolesList, setRolesList] = useState();
|
| | |
|
| | | /**
|
| | | * 确定按钮事件
|
| | | */
|
| | | const okHandle = () => {
|
| | | form.validateFields().then((values) => {
|
| | | if (editData.id && editData.type === 'edit') {
|
| | | values.id = editData.id;
|
| | | if (editData.pid) {
|
| | | values.pid = editData.pid;
|
| | | }
|
| | | onUpdate(values);
|
| | | } else {
|
| | | if (editData.type === 'add') {
|
| | | values.pid = editData.id;
|
| | | }
|
| | | onSave(values);
|
| | | }
|
| | | });
|
| | | };
|
| | |
|
| | | useImperativeHandle(ref, () => {
|
| | | return {
|
| | | refreshData: (data) => {
|
| | | form.resetFields();
|
| | | if (data.id && data.type === 'edit') {
|
| | | form.setFieldsValue(data);
|
| | | }
|
| | | setEditData(data);
|
| | | },
|
| | | clean: () => {
|
| | | form.resetFields();
|
| | | },
|
| | | };
|
| | | });
|
| | |
|
| | | return (
|
| | | <Modal
|
| | | getContainer={false}
|
| | | width="25%"
|
| | | destroyOnClose
|
| | | title={editData.type === 'edit' ? '编辑单位' : '添加单位'}
|
| | | open={visible}
|
| | | onCancel={() => onCancel(false)}
|
| | | footer={[
|
| | | <Button key="back" onClick={() => onCancel(false)}>
|
| | | 关闭
|
| | | </Button>,
|
| | | <Button key="submit" type="primary" onClick={okHandle}>
|
| | | 确认
|
| | | </Button>,
|
| | | ]}
|
| | | >
|
| | | <Form layout="horizontal" {...formItemLayout} form={form} initialValues={{ isAuctioneer: 1 }}>
|
| | | <Form.Item
|
| | | name="name"
|
| | | required
|
| | | label="单位名称"
|
| | | rules={[{ required: true, message: '请输入单位名称' }]}
|
| | | >
|
| | | <Input placeholder="请输入单位名称" />
|
| | | </Form.Item>
|
| | | </Form>
|
| | | </Modal>
|
| | | );
|
| | | };
|
| | |
|
| | | export default forwardRef(AddEditView);
|
| | |
| | | import { buildProTableDataSource, sendRequest, showDelConfirm } from '@/utils/antdUtils'; |
| | | import { buildProTableDataSource, sendRequest, showDelConfirm, showConfirm } from '@/utils/antdUtils'; |
| | | import { DeleteOutlined, EditOutlined, PlusOutlined } from '@ant-design/icons'; |
| | | import { PageContainer, ProFormText, ProTable, QueryFilter } from '@ant-design/pro-components'; |
| | | import { Button, Col, Menu, Row, Space } from 'antd'; |
| | | import { Button, Cascader, Col, Menu, Row, Select, Space } from 'antd'; |
| | | import { useEffect, useRef, useState } from 'react'; |
| | | import { Access, useAccess } from 'umi'; |
| | | import AddAndEdit from './components/addAndEdit'; |
| | | import { add, del, edit, getList, getUnitList } from './service'; |
| | | import AddUnit from './components/addUnit'; |
| | | import { |
| | | addSystemUserInfo, |
| | | addUnit, |
| | | del, |
| | | delUnit, |
| | | editSystemUserInfo, |
| | | editUnit, |
| | | getList, |
| | | getUnitList, |
| | | systemRoleList, |
| | | unfreezeApi, |
| | | freezeApi, |
| | | } from './service'; |
| | | |
| | | const Role = () => { |
| | | const actionRef = useRef(); |
| | | const addViewRef = useRef(); |
| | | const [modalVisible, handleModalVisibles] = useState(true); |
| | | const addViewRef1 = useRef(); |
| | | const [modalVisible, handleModalVisibles] = useState(false); |
| | | const [modalVisible1, handleModalVisibles1] = useState(false); |
| | | const [roleList, setRoleList] = useState([]); |
| | | const [unitId, setUnitId] = useState(''); |
| | | const access = useAccess(); |
| | | const [items, setItems] = useState([]); |
| | | const { SubMenu } = Menu; |
| | | useEffect(() => { |
| | | getUnitList().then((res) => { |
| | | console.log(res); |
| | | fetchUnit(); |
| | | systemRoleList({ pageNum: 1, pageSize: 10000 }).then((res) => { |
| | | setRoleList(() => res.data.records); |
| | | }); |
| | | }, []); |
| | | const items = [ |
| | | { |
| | | key: '1', |
| | | icon: ( |
| | | <div |
| | | style={{ |
| | | display: 'flex', |
| | | alignItems: 'center', |
| | | justifyContent: 'space-between', |
| | | width: '100%', |
| | | }} |
| | | > |
| | | <span>组织部</span> |
| | | <div> |
| | | <PlusOutlined |
| | | onClick={(e) => { |
| | | e.stopPropagation(); |
| | | console.log(e); |
| | | }} |
| | | /> |
| | | const node = (item) => { |
| | | return ( |
| | | <div |
| | | style={{ |
| | | display: 'flex', |
| | | alignItems: 'center', |
| | | justifyContent: 'space-between', |
| | | width: '100%', |
| | | }} |
| | | > |
| | | <span>{item.name}</span> |
| | | <div> |
| | | {item.tier < 4 && ( |
| | | <Access accessible={access['/system_setting/unit_management/add']}> |
| | | <PlusOutlined |
| | | onClick={(e) => { |
| | | e.stopPropagation(); |
| | | addViewRef1.current.refreshData({ ...item, type: 'add' }); |
| | | handleModalVisibles1(true); |
| | | }} |
| | | /> |
| | | </Access> |
| | | )} |
| | | <Access accessible={access['/system_setting/unit_management/edit']}> |
| | | <EditOutlined |
| | | onClick={(e) => { |
| | | e.stopPropagation(); |
| | | console.log(e); |
| | | addViewRef1.current.refreshData({ ...item, type: 'edit' }); |
| | | handleModalVisibles1(true); |
| | | }} |
| | | /> |
| | | </Access> |
| | | <Access accessible={access['/system_setting/unit_management/del']}> |
| | | <DeleteOutlined |
| | | onClick={(e) => { |
| | | e.stopPropagation(); |
| | | console.log(e); |
| | | showDelConfirm(async () => { |
| | | let status = await sendRequest(delUnit, item.id); |
| | | if (status) { |
| | | fetchUnit(); |
| | | } |
| | | }, '确认删除该单位吗?'); |
| | | }} |
| | | /> |
| | | </div> |
| | | </Access> |
| | | </div> |
| | | ), |
| | | children: [ |
| | | { |
| | | key: '11', |
| | | label: 'Option 1', |
| | | }, |
| | | { |
| | | key: '12', |
| | | label: 'Option 2', |
| | | }, |
| | | { |
| | | key: '13', |
| | | label: 'Option 3', |
| | | }, |
| | | { |
| | | key: '14', |
| | | label: 'Option 4', |
| | | }, |
| | | ], |
| | | }, |
| | | ]; |
| | | </div > |
| | | ); |
| | | }; |
| | | const renderMenuItems = (items) => { |
| | | return items.map((item) => { |
| | | if (item.children && item.children.length > 0) { |
| | | return ( |
| | | <SubMenu |
| | | key={item.key} |
| | | title={node(item)} |
| | | onTitleClick={(item) => { |
| | | setUnitId(item.key); |
| | | actionRef.current.reload(); |
| | | }} |
| | | > |
| | | {renderMenuItems(item.children)} |
| | | </SubMenu> |
| | | ); |
| | | } |
| | | return ( |
| | | <Menu.Item |
| | | onClick={(item) => { |
| | | setUnitId(item.key); |
| | | actionRef.current.reload(); |
| | | }} |
| | | key={item.key} |
| | | > |
| | | {node(item)} |
| | | </Menu.Item> |
| | | ); |
| | | }); |
| | | }; |
| | | const fetchUnit = (params) => { |
| | | getUnitList(params).then((res) => { |
| | | if (res.code == 200 && res.data) { |
| | | const traverseItems = (items) => { |
| | | return items.map((item) => { |
| | | item.key = item.id; |
| | | item.title = '1'; |
| | | if (item.child && item.child.length > 0) { |
| | | item.children = traverseItems(item.child); |
| | | } |
| | | return item; |
| | | }); |
| | | }; |
| | | setItems(traverseItems(res.data)); |
| | | } |
| | | }); |
| | | }; |
| | | const columns = [ |
| | | { |
| | | title: '角色名称', |
| | | title: '姓名', |
| | | dataIndex: 'name', |
| | | }, |
| | | { |
| | | title: '联系方式', |
| | | dataIndex: 'phone', |
| | | }, |
| | | { |
| | | title: '所在单位', |
| | | dataIndex: 'departmentName', |
| | | hideInSearch: true, |
| | | renderFormItem: () => { |
| | | return ( |
| | | <Cascader |
| | | options={items} |
| | | fieldNames={{ value: 'key', label: 'name' }} |
| | | placeholder="请选择" |
| | | displayRender={(label) => label[label.length - 1]} |
| | | changeOnSelect={true} |
| | | /> |
| | | ); |
| | | }, |
| | | }, |
| | | { |
| | | hideInTable: true, |
| | | title: '所在单位', |
| | | dataIndex: 'departmentId', |
| | | renderFormItem: () => { |
| | | return ( |
| | | <Cascader |
| | | options={items} |
| | | fieldNames={{ value: 'key', label: 'name' }} |
| | | placeholder="请选择" |
| | | displayRender={(label) => label[label.length - 1]} |
| | | changeOnSelect={true} |
| | | /> |
| | | ); |
| | | }, |
| | | }, |
| | | { |
| | | title: '所属职位', |
| | | dataIndex: 'systemPostName', |
| | | hideInSearch: true, |
| | | }, |
| | | { |
| | | title: '所属角色', |
| | | dataIndex: 'systemRoleName', |
| | | hideInSearch: true, |
| | | }, |
| | | { |
| | | title: '所属角色', |
| | | dataIndex: 'systemRoleId', |
| | | hideInTable: true, |
| | | renderFormItem: () => { |
| | | return ( |
| | | <Select |
| | | key="searchSelect" |
| | | allowClear |
| | | placeholder="请选择" |
| | | options={roleList} |
| | | fieldNames={{ label: 'name', value: 'id' }} |
| | | filterOption={false} |
| | | ></Select> |
| | | ); |
| | | }, |
| | | }, |
| | | { |
| | | title: '账号层级', |
| | | dataIndex: 'accountLevel', |
| | | // (1=市级账号,2=区县账号,3=街道账号,4=社区账号) |
| | | render: (text, record) => { |
| | | let role = ''; |
| | | switch (record.accountLevel) { |
| | | case 1: |
| | | role = '市'; |
| | | break; |
| | | case 2: |
| | | role = '区县'; |
| | | break; |
| | | case 3: |
| | | role = '街道'; |
| | | break; |
| | | case 4: |
| | | role = '社区'; |
| | | break; |
| | | case 5: |
| | | role = '党员'; |
| | | break; |
| | | default: |
| | | role = ''; |
| | | } |
| | | return role; |
| | | }, |
| | | valueEnum: { |
| | | 1: '市', |
| | | 2: '区县', |
| | | 3: '街道', |
| | | 4: '社区', |
| | | 5: '党员', |
| | | }, |
| | | }, |
| | | { |
| | | title: '状态', |
| | | dataIndex: 'status', |
| | | // (1=使用中,2=已冻结) |
| | | hideInSearch: true, |
| | | render: (text, record) => { |
| | | let status = ''; |
| | | switch (record.status) { |
| | | case 1: |
| | | status = '使用中'; |
| | | break; |
| | | case 2: |
| | | status = '已冻结'; |
| | | break; |
| | | default: |
| | | status = ''; |
| | | } |
| | | return status; |
| | | }, |
| | | }, |
| | | { |
| | | title: '操作', |
| | |
| | | return ( |
| | | <Space> |
| | | {record.roleId != 1 && ( |
| | | <Access accessible={access['/system_setting/role_management/edit']}> |
| | | <Button |
| | | type="link" |
| | | <Access accessible={access['/system_setting/people_management/edit']}> |
| | | <a |
| | | onClick={() => { |
| | | addViewRef.current.refreshData(record); |
| | | addViewRef.current.refreshData({ ...record, type: 'edit' },items); |
| | | handleModalVisibles(true); |
| | | }} |
| | | > |
| | | 编辑 |
| | | </Button> |
| | | </a> |
| | | </Access> |
| | | )} |
| | | {record.roleId != 1 && ( |
| | | <Access accessible={access['/system_setting/role_management/del']}> |
| | | <Button |
| | | type="link" |
| | | <Access accessible={access['/system_setting/people_management/del']}> |
| | | <a |
| | | onClick={() => { |
| | | showDelConfirm(async () => { |
| | | let status = await sendRequest(del, record.id); |
| | |
| | | }} |
| | | > |
| | | 删除 |
| | | </Button> |
| | | </a> |
| | | </Access> |
| | | )} |
| | | <Access accessible={access['/system_setting/role_management/detail'] || false}> |
| | | <Button |
| | | type="link" |
| | | <Access accessible={access['/system_setting/people_management/detail']}> |
| | | <a |
| | | onClick={() => { |
| | | addViewRef.current.refreshData(record, true); |
| | | addViewRef.current.refreshData({ ...record, type: 'detail' },items); |
| | | handleModalVisibles(true); |
| | | }} |
| | | > |
| | | 查看详情 |
| | | </Button> |
| | | </a> |
| | | </Access> |
| | | <Access accessible={access['/system_setting/people_management/freeze']}> |
| | | <a |
| | | onClick={() => { |
| | | showConfirm(`确认${record.status === 1 ? '冻结' : '解冻'}该人员吗?`,'', async () => { |
| | | let status = await sendRequest( |
| | | record.status === 1 ? freezeApi : unfreezeApi, |
| | | record.id, |
| | | ); |
| | | if (status) { |
| | | actionRef.current.reload(); |
| | | } |
| | | }); |
| | | }} |
| | | > |
| | | {record.status === 1 ? '冻结' : '解冻'} |
| | | </a> |
| | | </Access> |
| | | </Space> |
| | | ); |
| | |
| | | <PageContainer |
| | | header={{ |
| | | breadcrumb: {}, |
| | | title: '人员管理', |
| | | }} |
| | | > |
| | | <div style={{ background: '#fff' }}> |
| | | <QueryFilter> |
| | | <QueryFilter |
| | | onReset={(values) => { |
| | | fetchUnit(values); |
| | | setUnitId(''); |
| | | actionRef.current.reload(); |
| | | }} |
| | | onFinish={(values) => { |
| | | fetchUnit(values); |
| | | setUnitId(''); |
| | | actionRef.current.reload(); |
| | | }} |
| | | > |
| | | <ProFormText name="name" label="单位名称" /> |
| | | </QueryFilter> |
| | | </div> |
| | | <Row style={{ marginTop: 20, background: '#fff' }}> |
| | | <Col span={4}> |
| | | <Menu |
| | | mode="inline" |
| | | defaultSelectedKeys={['231']} |
| | | style={{ |
| | | // width: 256, |
| | | height: '100%', |
| | | }} |
| | | items={items} |
| | | /> |
| | | <Space style={{ margin: '10px 0' }}> |
| | | <span style={{ margin: '0 27px' }}>单位管理</span> |
| | | <Button |
| | | type="primary" |
| | | onClick={() => { |
| | | addViewRef1.current.refreshData({}); |
| | | handleModalVisibles1(true); |
| | | }} |
| | | > |
| | | 添加 |
| | | </Button> |
| | | </Space> |
| | | |
| | | <Menu mode="inline">{renderMenuItems(items)}</Menu> |
| | | </Col> |
| | | <Col span={20} style={{ minHeight: 650 }}> |
| | | <ProTable |
| | |
| | | showQuickJumper: true, |
| | | defaultPageSize: 10, |
| | | }} |
| | | // request={(params) => buildProTableDataSource(getList, params)} |
| | | search={{ |
| | | labelWidth: 'auto', |
| | | span: 6, |
| | | defaultCollapsed: false, // 默认是否收起 |
| | | }} |
| | | request={(params) => { |
| | | let obj = { ...params }; |
| | | if (unitId) { |
| | | obj.departmentId = unitId; |
| | | } |
| | | if (params.departmentId) { |
| | | obj.departmentId = params.departmentId[params.departmentId.length - 1]; |
| | | } |
| | | return buildProTableDataSource(getList, obj); |
| | | }} |
| | | toolBarRender={(action, selectRows) => [ |
| | | <Access accessible={access['/system_setting/role_management/add']}> |
| | | <Access accessible={access['/system_setting/people_management/add']}> |
| | | <Space> |
| | | <Button |
| | | type="primary" |
| | | onClick={() => { |
| | | addViewRef.current.refreshData({}); |
| | | addViewRef.current.refreshData({ type: 'add', unitId : unitId },items); |
| | | handleModalVisibles(true); |
| | | }} |
| | | > |
| | |
| | | ref={addViewRef} |
| | | visible={modalVisible} |
| | | onSave={async (fileds) => { |
| | | let success = await sendRequest(add, fileds); |
| | | let success = await sendRequest(addSystemUserInfo, fileds); |
| | | if (success) { |
| | | handleModalVisibles(false); |
| | | actionRef.current.reload(); |
| | |
| | | addViewRef.current.clean(); |
| | | }} |
| | | onUpdate={async (fileds) => { |
| | | let success = await sendRequest(edit, fileds); |
| | | let success = await sendRequest(editSystemUserInfo, fileds); |
| | | if (success) { |
| | | handleModalVisibles(false); |
| | | actionRef.current.reload(); |
| | |
| | | }} |
| | | onCancel={() => handleModalVisibles(false)} |
| | | /> |
| | | <AddUnit |
| | | ref={addViewRef1} |
| | | visible={modalVisible1} |
| | | onSave={async (fileds) => { |
| | | let success = await sendRequest(addUnit, fileds); |
| | | if (success) { |
| | | handleModalVisibles1(false); |
| | | fetchUnit(); |
| | | } |
| | | }} |
| | | onUpdate={async (fileds) => { |
| | | let success = await sendRequest(editUnit, fileds); |
| | | if (success) { |
| | | handleModalVisibles1(false); |
| | | fetchUnit(); |
| | | } |
| | | }} |
| | | onCancel={() => handleModalVisibles1(false)} |
| | | /> |
| | | </PageContainer> |
| | | ); |
| | | }; |
| | |
| | | |
| | | // 列表 |
| | | export const getList = async (params) => { |
| | | return request(`/api/huacheng-sangeshenbian/systemRole/list`, { |
| | | return request(`/api/huacheng-sangeshenbian/systemUser/list`, { |
| | | method: 'GET', |
| | | params |
| | | }); |
| | |
| | | }); |
| | | } |
| | | |
| | | // 新增单位 |
| | | export const addUnit = async (data) => { |
| | | return request('/api/huacheng-sangeshenbian/department/add', { |
| | | method: 'POST', |
| | | data, |
| | | }); |
| | | } |
| | | |
| | | // 编辑单位 |
| | | export const editUnit = async (data) => { |
| | | return request('/api/huacheng-sangeshenbian/department/edit', { |
| | | method: 'POST', |
| | | data, |
| | | }); |
| | | } |
| | | |
| | | // 编辑 |
| | | export const edit = async (data) => { |
| | | return request('/api/huacheng-sangeshenbian/systemRole/edit', { |
| | |
| | | |
| | | // 删除 |
| | | export const del = async (id) => { |
| | | return request(`/api/huacheng-sangeshenbian/systemRole/delete/${id}`, { |
| | | return request(`/api/huacheng-sangeshenbian/systemUser/delete/${id}`, { |
| | | method: 'DELETE', |
| | | }); |
| | | } |
| | | |
| | | // 删除单位 |
| | | export const delUnit = async (id) => { |
| | | return request(`/api/huacheng-sangeshenbian/department/delete/${id}`, { |
| | | method: 'DELETE', |
| | | }); |
| | | } |
| | |
| | | }); |
| | | } |
| | | // 获取职位列表数据 |
| | | export const systemPostList = async (tier) => { |
| | | export const systemPostList = async (params) => { |
| | | return request(`/api/huacheng-sangeshenbian/systemPost/list`, { |
| | | method: 'GET', |
| | | method: 'GET',params |
| | | }); |
| | | } |
| | | |
| | | // 获取角色列表数据 |
| | | export const systemRoleList = async (tier) => { |
| | | export const systemRoleList = async (params) => { |
| | | return request(`/api/huacheng-sangeshenbian/systemRole/list`, { |
| | | method: 'GET',params |
| | | }); |
| | | } |
| | | // 获取人员详情数据 |
| | | export const getSystemUserInfo = async (id) => { |
| | | return request(`/api/huacheng-sangeshenbian/systemUser/getSystemUserInfo/${id}`, { |
| | | method: 'GET', |
| | | }); |
| | | }// 添加人员数据 |
| | | export const addSystemUserInfo = async (data) => { |
| | | return request(`/api/huacheng-sangeshenbian/systemUser/add`, { |
| | | method: 'POST', |
| | | data |
| | | }); |
| | | } |
| | | |
| | | // 编辑人员数据 |
| | | export const editSystemUserInfo = async (data) => { |
| | | return request(`/api/huacheng-sangeshenbian/systemUser/edit`, { |
| | | method: 'POST', |
| | | data |
| | | }); |
| | | } |
| | | // 获取省市区 |
| | | export const getCityList = async (data) => { |
| | | return request(`/api/huacheng-sangeshenbian/systemUser/getAdministrativeDivision/${data.id}/${data.tier}`, { |
| | | method: 'GET', |
| | | }); |
| | | } |
| | | |
| | | // 冻结 |
| | | export const freezeApi = async (id) => { |
| | | return request(`/api/huacheng-sangeshenbian/systemUser/freeze/${id}`, { |
| | | method: 'PUT', |
| | | }); |
| | | } |
| | | // 解冻 |
| | | export const unfreezeApi = async (id) => { |
| | | return request(`/api/huacheng-sangeshenbian/systemUser/unfreeze/${id}`, { |
| | | method: 'PUT', |
| | | }); |
| | | } |
| | |
| | | |
| | | const save = () => { |
| | | form.validateFields().then(async (values) => { |
| | | values.id = 1 |
| | | sendRequest(addSetting, values).then(res => { |
| | | if (res.code === 200) { |
| | | |
| | | } |
| | | }) |
| | | values.id = 1 |
| | | sendRequest(addSetting, values).then(res => { |
| | | if (res.code === 200) { |
| | | |
| | | } |
| | | }) |
| | | }); |
| | | }; |
| | | |
| | |
| | | > |
| | | <Card> |
| | | <Form scrollToFirstError form={form}> |
| | | <Card> |
| | | <div style={{ marginBottom: 20 }}><span style={{ fontSize: '14px', fontWeight: 600 }}>*诉求处理时间: |
| | | </span><span style={{ marginLeft: 8, color: '#a5a5a5' }}>超过时间未处理诉求,系统自动对该事件承办者发送短信提醒,并知会至上一级管理层进行督办。 |
| | | </span></div> |
| | | <Form.Item label="添加后处理时间" name="demandProcessingTime" rules={ |
| | | [{ required: true, message: '请输入添加后处理时间' }] |
| | | }> |
| | | <InputNumber precision={0} min={0} addonAfter="天内" controls={false}></InputNumber> |
| | | </Form.Item> |
| | | </Card> |
| | | <Card> |
| | | <div><span style={{ fontSize: '14px', fontWeight: 600 }}>*时限临期提醒配置: |
| | | </span><span style={{ marginLeft: 8, color: '#a5a5a5' }}>当事件处理时限即将到达时,系统将自动通过微信消息以及短信的方式提醒单位管理员。 |
| | | </span></div> |
| | | <Space style={{ marginTop: 20, display: 'flex', flexWrap: 'wrap' }}> |
| | | |
| | | <Form.Item label="市级账号" name="cityDeadlineReminder" rules={ |
| | | [{ required: true, message: '请输入市级账号' }] |
| | | }> |
| | | <InputNumber precision={0} max={form.getFieldValue('demandProcessingTime')} min={0} addonAfter="天前" controls={false}></InputNumber> |
| | | </Form.Item> |
| | | |
| | | <Form.Item label="区县账号" name="districtDeadlineReminder" rules={ |
| | | [{ required: true, message: '请输入区县账号' }] |
| | | }> |
| | | <InputNumber precision={0} max={form.getFieldValue('demandProcessingTime')} min={0} addonAfter="天前" controls={false}></InputNumber> |
| | | </Form.Item> |
| | | |
| | | <Form.Item label="街道账号" name="streetDeadlineReminder" rules={ |
| | | [{ required: true, message: '请输入街道账号' }] |
| | | }> |
| | | <InputNumber precision={0} max={form.getFieldValue('demandProcessingTime')} min={0} addonAfter="天前" controls={false}></InputNumber> |
| | | </Form.Item> |
| | | <Form.Item label="社区账号" name="communityDeadlineReminder" rules={ |
| | | [{ required: true, message: '请输入社区账号' }] |
| | | }> |
| | | <InputNumber precision={0} max={form.getFieldValue('demandProcessingTime')} min={0} addonAfter="天前" controls={false}></InputNumber> |
| | | </Form.Item> |
| | | <Form.Item label="党员账号" name="partyMemberDeadlineReminder" rules={ |
| | | [{ required: true, message: '请输入党员账号' }] |
| | | }> |
| | | <InputNumber precision={0} max={form.getFieldValue('demandProcessingTime')} min={0} addonAfter="天前" controls={false}></InputNumber> |
| | | </Form.Item> |
| | | </Space> |
| | | </Card> |
| | | <Card> |
| | | <div><span style={{ fontSize: '14px', fontWeight: 600 }}>*诉求处理时间配置: |
| | | </span><span style={{ marginLeft: 8, color: '#a5a5a5' }}>超过时间未处理诉求,系统自动对该事件承办者发送短信提醒,并知会至上一级管理层进行督办。 |
| | |
| | | </Form.Item> |
| | | </Space> |
| | | </Card> |
| | | <Card> |
| | | <div><span style={{ fontSize: '14px', fontWeight: 600 }}>*时限临期提醒配置: |
| | | </span><span style={{ marginLeft: 8, color: '#a5a5a5' }}>超过时间未处理诉求,系统自动对该事件承办者发送短信提醒,并知会至上一级管理层进行督办。 |
| | | </span></div> |
| | | <Space style={{ marginTop: 20, display: 'flex', flexWrap: 'wrap' }}> |
| | | |
| | | <Form.Item label="市级账号" name="cityDeadlineReminder" rules={ |
| | | [{ required: true, message: '请输入市级账号' }] |
| | | }> |
| | | <InputNumber precision={0} min={0} addonAfter="天内" controls={false}></InputNumber> |
| | | </Form.Item> |
| | | |
| | | <Form.Item label="区县账号" name="districtDeadlineReminder" rules={ |
| | | [{ required: true, message: '请输入区县账号' }] |
| | | }> |
| | | <InputNumber precision={0} min={0} addonAfter="天内" controls={false}></InputNumber> |
| | | </Form.Item> |
| | | |
| | | <Form.Item label="街道账号" name="streetDeadlineReminder" rules={ |
| | | [{ required: true, message: '请输入街道账号' }] |
| | | }> |
| | | <InputNumber precision={0} min={0} addonAfter="天内" controls={false}></InputNumber> |
| | | </Form.Item> |
| | | <Form.Item label="社区账号" name="communityDeadlineReminder" rules={ |
| | | [{ required: true, message: '请输入社区账号' }] |
| | | }> |
| | | <InputNumber precision={0} min={0} addonAfter="天内" controls={false}></InputNumber> |
| | | </Form.Item> |
| | | <Form.Item label="党员账号" name="partyMemberDeadlineReminder" rules={ |
| | | [{ required: true, message: '请输入党员账号' }] |
| | | }> |
| | | <InputNumber precision={0} min={0} addonAfter="天内" controls={false}></InputNumber> |
| | | </Form.Item> |
| | | </Space> |
| | | </Card> |
| | | <Card> |
| | | <div style={{ marginBottom: 20 }}><span style={{ fontSize: '14px', fontWeight: 600 }}>*诉求处理时间: |
| | | </span><span style={{ marginLeft: 8, color: '#a5a5a5' }}>超过时间未处理诉求,系统自动对该事件承办者发送短信提醒,并知会至上一级管理层进行督办。 |
| | | </span></div> |
| | | <Form.Item label="添加后处理时间" name="demandProcessingTime" rules={ |
| | | [{ required: true, message: '请输入添加后处理时间' }] |
| | | }> |
| | | <InputNumber precision={0} min={0} addonAfter="天内" controls={false}></InputNumber> |
| | | </Form.Item> |
| | | </Card> |
| | | <Access accessible={access['/work_order_transaction_management/work_order_item_configuration/save'] || false}> |
| | | <Access accessible={access['/work_order_transaction_management/work_order_item_configuration/save']}> |
| | | <div style={{ marginTop: 20, display: 'flex', justifyContent: 'center' }}> |
| | | <Button type="primary" htmlType="submit" style={{ marginRight: 20 }} onClick={() => {save()}} > |
| | | <Button type="primary" htmlType="submit" style={{ marginRight: 20 }} onClick={() => { save() }} > |
| | | 保存 |
| | | </Button> |
| | | </div> |
| | |
| | | import { customRequest } from '@/utils/utils'; |
| | | const AddOrEditOrDetail = () => { |
| | | |
| | | const config = { |
| | | name: 'file', |
| | | action: 'https://huacheng.psciio.com/api/huacheng-communitybackstage/communitypartybuilding/uploadimage', |
| | | headers: { |
| | | Authorization: 'Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOjE4OTI0MjE4MjgwODU4Mzc4MjYsInR5cGUiOjEsImV4cCI6MTc0MTY1OTg5MywiY3JlYXRlZCI6MTc0MDM2Mzg5MzE2MH0.o3Gc0g1LAo_kkL3X3QrC6qKwztxsp6psoTcpTreDzQUXGqPzUXw89fNSR5YKz8gzhtSuSKI2d6TJJYPX1IQCgw', |
| | | }, |
| | | }; |
| | | |
| | | |
| | | |
| | |
| | | } |
| | | rules={[ |
| | | { |
| | | required: fileList.length == 0 ? true : false, |
| | | required: true, |
| | | message: '请上传banner图片', |
| | | }, |
| | | ]} |
| | |
| | | showUploadList={{ |
| | | showPreviewIcon: false, |
| | | }} |
| | | customRequest={customRequest} |
| | | // accept="image/png, image/jpeg, image/jpg" |
| | | // customRequest={customRequest} |
| | | accept="image/png, image/jpeg, image/jpg" |
| | | fileList={fileList} |
| | | disabled={searchParams.get('detail')} |
| | | > |
| | |
| | | import { LoadingOutlined, PlusOutlined } from '@ant-design/icons'; |
| | | import { forwardRef, useEffect, useImperativeHandle, useState } from 'react'; |
| | | import { customRequest } from '@/utils/utils'; |
| | | import { add, Edit, getDetail } from '../service' |
| | | |
| | | const formItemLayout = { |
| | | labelCol: { span: 7 }, |
| | |
| | | name: 'file', |
| | | action: 'https://huacheng.psciio.com/api/huacheng-communitybackstage/communitypartybuilding/uploadimage', |
| | | headers: { |
| | | authorization: localStorage.getItem('token'), |
| | | Authorization: 'Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOjE4OTI0MjE4MjgwODU4Mzc4MjYsInR5cGUiOjEsImV4cCI6MTc0MTY1OTg5MywiY3JlYXRlZCI6MTc0MDM2Mzg5MzE2MH0.o3Gc0g1LAo_kkL3X3QrC6qKwztxsp6psoTcpTreDzQUXGqPzUXw89fNSR5YKz8gzhtSuSKI2d6TJJYPX1IQCgw', |
| | | }, |
| | | }; |
| | | const formItemLayout = { |
| | |
| | | url: res.data.url |
| | | }] |
| | | setFileList(obj) |
| | | form.setFieldsValue({ image: obj }) |
| | | } |
| | | form.setFieldsValue(res.data) |
| | | form.setFieldsValue({name: res.data.name}) |
| | | }) |
| | | } |
| | | }, |
| | | clean: () => { |
| | | form.resetFields(); |
| | | setFileList([]) |
| | | }, |
| | | }; |
| | | }); |
| | |
| | | delete values.image |
| | | if (editData.id) { |
| | | values.id = editData.id |
| | | let state = await sendRequest(add, values) |
| | | if (state) { |
| | | history.back() |
| | | } |
| | | onUpdate(values) |
| | | return |
| | | } |
| | | let state = await sendRequest(Edit, values) |
| | | if (state) { |
| | | history.back() |
| | | } |
| | | onSave(values) |
| | | }) |
| | | } |
| | | |
| | |
| | | } |
| | | rules={[ |
| | | { |
| | | required: fileList.length == 0 ? true : false, |
| | | required: true, |
| | | message: '请上传banner图片', |
| | | }, |
| | | ]} |
| | |
| | | showPreviewIcon: false, |
| | | }} |
| | | // customRequest={customRequest} |
| | | // accept="image/png, image/jpeg, image/jpg" |
| | | accept="image/png, image/jpeg, image/jpg" |
| | | fileList={fileList} |
| | | disabled={editData.type == 'detail'} |
| | | > |
| | |
| | | import { useRef, useState } from 'react'; |
| | | import { Access, history, useAccess } from 'umi'; |
| | | import AddAndEdit from './components/index'; |
| | | import { getList, updateStatus, deleteBanner } from './service' |
| | | import { getList, updateStatus, deleteBanner, add, Edit } from './service' |
| | | const Banner = () => { |
| | | |
| | | const actionRef = useRef(); |
| | |
| | | <Button |
| | | type="link" |
| | | onClick={() => { |
| | | history.push(`/marketing/banner/add?id=${record.id}&edit=true`); |
| | | addViewRef.current.clean(); |
| | | addViewRef.current.refreshData({ ...record, type: 'edit' }); |
| | | handleModalVisible(true); |
| | | }} |
| | | > |
| | | 编辑 |
| | |
| | | ] |
| | | |
| | | return <div> |
| | | <PageContainer title='banner管理'> |
| | | <PageContainer title='banner管理' header={{ |
| | | breadcrumb: {}, |
| | | }}> |
| | | <ProTable |
| | | rowKey='id' |
| | | actionRef={actionRef} |
| | |
| | | <Button |
| | | type="primary" |
| | | onClick={() => { |
| | | addViewRef.current.clean(); |
| | | addViewRef.current.refreshData({}); |
| | | handleModalVisible(true); |
| | | }} |
| | |
| | | ]} |
| | | /> |
| | | <AddAndEdit |
| | | ref={addViewRef} |
| | | visible={modalVisible} |
| | | onCancel={() => handleModalVisible(false)} |
| | | onSave={async (fileds) => { |
| | | const success = await sendRequest(add, fileds); |
| | | if (success) { |
| | | handleModalVisible(false); |
| | | actionRef.current.reload(); |
| | | } |
| | | }} |
| | | onUpdate={async (fileds) => { |
| | | const success = await sendRequest(Edit, fileds); |
| | | if (success) { |
| | | handleModalVisible(false); |
| | | actionRef.current.reload(); |
| | | } |
| | | }} |
| | | /> |
| | | ref={addViewRef} |
| | | visible={modalVisible} |
| | | onCancel={() => handleModalVisible(false)} |
| | | onSave={async (fileds) => { |
| | | const success = await sendRequest(add, fileds); |
| | | if (success) { |
| | | handleModalVisible(false); |
| | | actionRef.current.reload(); |
| | | } |
| | | }} |
| | | onUpdate={async (fileds) => { |
| | | const success = await sendRequest(Edit, fileds); |
| | | if (success) { |
| | | handleModalVisible(false); |
| | | actionRef.current.reload(); |
| | | } |
| | | }} |
| | | /> |
| | | </PageContainer> |
| | | </div>; |
| | | }; |
| | |
| | | ]; |
| | | return ( |
| | | <div> |
| | | <PageContainer> |
| | | <PageContainer title="问题类型管理" header={{ |
| | | breadcrumb: {}, |
| | | }}> |
| | | <ProTable |
| | | rowKey="id" |
| | | actionRef={actionRef} |
| | |
| | | // import { getToken } from '@/utils/authority'; |
| | | import pathRegexp from 'path-to-regexp'; |
| | | import { parse } from 'querystring'; |
| | | import { uploadFile } from './service' |
| | | /* eslint no-useless-escape:0 import/prefer-default-export:0 */ |
| | |
| | | }) |
| | | .catch(error => console.error('Error downloading file:', error)); |
| | | } |
| | | export const getAuthorityFromRouter = (router = [], pathname) => { |
| | | const authority = router.find( |
| | | ({ routes, path = '/' }) => |
| | | (path && pathRegexp(path).exec(pathname)) || |
| | | (routes && getAuthorityFromRouter(routes, pathname)), |
| | | ); |
| | | if (authority) return authority; |
| | | return undefined; |
| | | }; |
| | | export const getRouteAuthority = (path, routeData) => { |
| | | let authorities; |
| | | routeData.forEach((route) => { |
| | | // match prefix |
| | | if (pathRegexp(`${route.path}/(.*)`).test(`${path}/`)) { |
| | | if (route.authority) { |
| | | authorities = route.authority; |
| | | } // exact match |
| | | |
| | | if (route.path === path) { |
| | | authorities = route.authority || authorities; |
| | | } // get children authority recursively |
| | | |
| | | if (route.routes) { |
| | | authorities = getRouteAuthority(path, route.routes) || authorities; |
| | | } |
| | | } |
| | | }); |
| | | return authorities; |
| | | }; |