hejianhao
2025-02-24 035170ca21cc68ebda6c97831b78cc1b5ef2264d
Merge branch 'master' of http://120.76.84.145:10101/gitblit/r/H5/threeSide
10个文件已修改
2个文件已添加
746 ■■■■ 已修改文件
H5/pages/Appeal/Appeal.vue 305 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
H5/pages/Appeal/service.js 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
H5/pages/delay/delay.vue 25 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
H5/pages/dispatchWorkOrder/dispatchWorkOrder.vue 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
H5/pages/index/index.vue 80 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
H5/pages/list/list.vue 119 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
H5/pages/list/service.js 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
H5/pages/location/location.vue 150 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
H5/pages/problemReporting/problemReporting.vue 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
H5/pages/problemReporting/service.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
H5/pages/work-detail/work-detail.vue 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
H5/static/detailImg/right.png 补丁 | 查看 | 原始文档 | blame | 历史
H5/pages/Appeal/Appeal.vue
@@ -3,108 +3,331 @@
        <view class="main">
            <view class="card  flex a-center h-108 j-between">
                <text class="w-108 fs-27 font-bold mr-85">时间</text>
                <input placeholder-style="color: rgba(0,0,0,0.3);font-size:27rpx;" class="uni-input flex1"
                    maxlength="10" placeholder="请选择问题发生的时间" />
                <image src="/static/Appeal/left.png" class="w-19 h-19" mode=""></image>
                <view class=" flex a-center j-between flex1" @click="showDate=true">
                    <input v-model="time" disabled placeholder-style="color: rgba(0,0,0,0.3);font-size:27rpx;"
                        class="uni-input flex1" maxlength="10" placeholder="请选择问题发生的时间" />
                    <image src="/static/Appeal/left.png" class="w-19 h-19" mode=""></image>
                </view>
            </view>
            <view class="card  flex a-center h-108 j-between">
                <text class="w-108 fs-27 font-bold mr-85">问题类型</text>
                <input placeholder-style="color: rgba(0,0,0,0.3);font-size:27rpx;" class="uni-input flex1"
                    maxlength="10" placeholder="请选择问题类型" />
                <image src="/static/Appeal/left.png" class="w-19 h-19" mode=""></image>
                <view class=" flex a-center j-between flex1" @click="showList=true">
                    <input v-model="problemType" disabled placeholder-style="color: rgba(0,0,0,0.3);font-size:27rpx;"
                        class="uni-input flex1" maxlength="10" placeholder="请选择问题类型" />
                    <image src="/static/Appeal/left.png" class="w-19 h-19" mode=""></image>
                </view>
            </view>
            <view class="card  flex a-center h-108 j-between">
                <text class="w-108 fs-27 font-bold mr-85">群众</text>
                <input placeholder-style="color: rgba(0,0,0,0.3);font-size:27rpx;" class="uni-input flex1"
                    maxlength="10" placeholder="请输入群众姓名" />
                <input v-model="name" placeholder-style="color: rgba(0,0,0,0.3);font-size:27rpx;"
                    class="uni-input flex1" placeholder="请输入群众姓名" />
            </view>
            <view class="card  flex a-center h-108 j-between">
                <text class="w-108 fs-27 font-bold mr-85">联系电话</text>
                <input placeholder-style="color: rgba(0,0,0,0.3);font-size:27rpx;" class="uni-input flex1"
                    maxlength="10" placeholder="请输入群众联系电话" />
                <input v-model="contactNumber" type="number" placeholder-style="color: rgba(0,0,0,0.3);font-size:27rpx;"
                    class="uni-input flex1" maxlength="11" placeholder="请输入群众联系电话" />
            </view>
            <view class="card  flex a-center h-108 j-between" @click="goTopage">
                <text class="w-108 fs-27 font-bold mr-85">地点</text>
                <input placeholder-style="color: rgba(0,0,0,0.3);font-size:27rpx;" class="uni-input flex1"
                    maxlength="10" placeholder="请选择问题发生具体地点" />
                <image src="/static/Appeal/left.png" class="w-19 h-19" mode=""></image>
                <view class=" flex a-center j-between flex1">
                    <input v-model="location" disabled placeholder-style="color: rgba(0,0,0,0.3);font-size:27rpx;"
                        class="uni-input flex1" placeholder="请选择问题发生具体地点" />
                    <image src="/static/Appeal/left.png" class="w-19 h-19" mode=""></image>
                </view>
            </view>
            <view class="card  flex a-center h-108 j-between">
                <text class="w-108 fs-27 font-bold mr-85">详细地址</text>
                <input placeholder-style="color: rgba(0,0,0,0.3);font-size:27rpx;" class="uni-input flex1"
                    maxlength="10" placeholder="请输入详细地址描述" />
                <input v-model="detailedAddress" placeholder-style="color: rgba(0,0,0,0.3);font-size:27rpx;"
                    class="uni-input flex1" placeholder="请输入详细地址描述" />
            </view>
            <view class="mt-35">
                <text class="w-108 fs-27 font-bold mr-85">问题描述</text>
                <view class="bg mt-27 fs-27">
                    <view class="h-94 " style="border-bottom: 2rpx solid rgba(0, 10, 26, 0.07);">
                        <input placeholder-style="color: rgba(0,0,0,0.3);font-size:27rpx;" class="h-94 pl-31 flex1"
                            placeholder="请输入问题标题" />
                        <input v-model="descriptionTitle" placeholder-style="color: rgba(0,0,0,0.3);font-size:27rpx;"
                            class="h-94 pl-31 flex1" placeholder="请输入问题标题" />
                    </view>
                    <textarea name="" id="" cols="30" placeholder="请输入问题描述内容"
                    <textarea name="" v-model="descriptionContent" id="" cols="30" placeholder="请输入问题描述内容"
                        placeholder-style="color: rgba(0, 0, 0, 0.30);font-size:27rpx;" rows="10"></textarea>
                </view>
            </view>
            <view class="mt-35">
                <text class="w-108 fs-27 font-bold mr-85">图片</text>
                <view class="mt-27 flex a-center">
                    <view class="img mr-15">
                        <image src="/static/logo.png" class="w-140 h-140" mode=""></image>
                    <view class="img mr-15" v-for="item,index in images" :key="index">
                        <image :src="item" class="w-140 h-140" mode=""></image>
                        <view class="img-icon">
                            <image class="w-19 h-19" src="/static/Appeal/amplify.png" mode=""></image>
                            <image class="w-19 h-19 ml-35" src="/static/Appeal/trash.png" mode=""></image>
                            <image class="w-19 h-19" @click="previewImage(index)" src="/static/Appeal/amplify.png"
                                mode=""></image>
                            <image class="w-19 h-19 ml-35" @click="deletimg(item)" src="/static/Appeal/trash.png" mode="">
                            </image>
                        </view>
                    </view>
                    <image src="/static/Appeal/add.png" class="w-140 h-140" mode=""></image>
                    <image src="/static/Appeal/add.png" class="w-140 h-140" mode="" @click="uploadImg"></image>
                </view>
            </view>
            <view class="mt-35">
                <text class="w-108 fs-27 font-bold mr-85">视频</text>
                <view class="mt-27 flex a-center">
                    <view class="img mr-15">
                        <image src="/static/logo.png" class="w-140 h-140" mode=""></image>
                    <view class="img mr-15" v-for="item,index in videos" :key="index">
                        <video :controls="false" :show-center-play-btn="false" :src="item" class="w-140 h-140" mode=""></video>
                        <view class="img-icon">
                            <image class="w-19 h-19" src="/static/Appeal/amplify.png" mode=""></image>
                            <image class="w-19 h-19 ml-35" src="/static/Appeal/trash.png" mode=""></image>
                            <image class="w-19 h-19" @click="gotoPage(item)"  src="/static/Appeal/amplify.png" mode=""></image>
                            <image class="w-19 h-19 ml-35" @click="deletvideo(item)" src="/static/Appeal/trash.png" mode=""></image>
                        </view>
                    </view>
                    <image src="/static/Appeal/add.png" class="w-140 h-140" mode=""></image>
                    <image src="/static/Appeal/add.png" class="w-140 h-140" mode="" @click="uploadVideo"></image>
                </view>
            </view>
        </view>
        <view class="btn">
        <view class="btn" @click="submit">
            保存
        </view>
        <u-datetime-picker :show="showDate" v-model="value1" mode="date"></u-datetime-picker>
        <u-picker :show="showList" :columns="columns" @confirm="confirm" @cancel="cancel"></u-picker>
        <u-datetime-picker :show="showDate" v-model="value1" mode="date" :closeOnClickOverlay="true"
            @confirm="confirmone" @close="close" @cancel="cancel"></u-datetime-picker>
        <u-picker :show="showList" :columns="columns" @confirm="confirmtwo" :closeOnClickOverlay="true" @close="close"
            @cancel="cancel"></u-picker>
    </view>
</template>
<script>
    import dayjs from '@/uni_modules/uview-ui/libs/util/dayjs.js';
    import {
        save,
        getproblem
    } from './service.js'
    export default {
        data() {
            return {
                showList: false,
                showDate: false,
                value1: Number(new Date()),
                columns: [['医疗','教育','就业','住房','养老']],
                columns: [
                    ['医疗', '教育', '就业', '住房', '养老']
                ],
                time: '',
                problemType: '',
                name: '',
                contactNumber: '',
                location: '',
                detailedAddress: '',
                descriptionTitle: '',
                descriptionContent: '',
                latitude:'',
                longitude:'',
                images: [],
                videos: [],
            };
        },
        methods:{
            confirm(e){
                console.log(e,'eeee');
        onLoad() {
            this.getproblem()
        },
        methods: {
            previewImage(index) {
                uni.previewImage({
                    urls: this.images,
                    current: this.images[index],
                    longPressActions: {
                        itemList: ['发送给朋友', '保存图片', '收藏'],
                        success: function(data) {
                            console.log('选中了第' + (data.tapIndex + 1) + '个按钮,第' + (data.index + 1) + '张图片');
                        },
                        fail: function(err) {
                            console.log(err.errMsg);
                        }
                    }
                });
            },
            cancel(e){
                console.log(e,'eeee');
            deletimg(e) {
                this.images = this.images.filter(item => item != e)
            },
            goTopage(){
            deletvideo(e){
                this.videos = this.videos.filter(item => item != e)
            },
            gotoPage(e){
                uni.navigateTo({
                    url:'/pages/location/location'
                    url:`/pages/work-detail/maxVideo?url=${e}`
                })
            }
            },
            getproblem() {
                getproblem().then((resp => {
                    console.log(resp, '问题类型')
                    this.columns =[resp.data.map(item=>{
                        return item.name
                    })]
                }))
            },
            submit() {
                const preciseRegex = /^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}$/;
                if(!this.time){
                    uni.showToast({
                        title:'请选择时间',
                        icon:'none'
                    })
                }else if(!this.problemType){
                    uni.showToast({
                        title:'请选择问题类型',
                        icon:'none'
                    })
                }else if(!this.name){
                    uni.showToast({
                        title:'请输入群众姓名',
                        icon:'none'
                    })
                }else if(!this.contactNumber){
                    uni.showToast({
                        title:'请输入联系电话',
                        icon:'none'
                    })
                }else if(!preciseRegex.test(this.contactNumber)){
                    uni.showToast({
                        title:'请输入正确的手机号',
                        icon:'none'
                    })
                }else if(!this.location){
                    uni.showToast({
                        title:'请选择地点',
                        icon:'none'
                    })
                }else if(!this.detailedAddress){
                    uni.showToast({
                        title:'请输入详细地址',
                        icon:'none'
                    })
                }else if(!this.descriptionTitle){
                    uni.showToast({
                        title:'请输入问题标题',
                        icon:'none'
                    })
                }else if(!this.descriptionContent){
                    uni.showToast({
                        title:'请输入问题描述',
                        icon:'none'
                    })
                }else if(this.images==0){
                    uni.showToast({
                        title:'请上传图片',
                        icon:'none'
                    })
                }else if(this.videos==0){
                    uni.showToast({
                        title:'请上传视频',
                        icon:'none'
                    })
                }
                const data = {
                    time: this.time,
                    problemType: this.problemType,
                    name: this.name,
                    contactNumber: this.contactNumber,
                    location: this.location,
                    latitude:this.latitude,
                    longitude:this.longitude,
                    detailedAddress: this.detailedAddress,
                    descriptionTitle: this.descriptionTitle,
                    descriptionContent: this.descriptionContent,
                    images: this.images.join(','),
                    videos: this.videos.join(','),
                }
                save(data).then(resp => {
                    console.log(resp, '保存');
                    if(resp.code==200){
                        uni.showToast({
                            title:'保存成功',
                            icon:'none'
                        })
                    }
                })
            },
            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
            },
            cancel() {
                this.showDate = false
                this.showList = false
            },
            close(e) {
                this.showDate = false
                this.showList = false
            },
            goTopage() {
                uni.navigateTo({
                    url: '/pages/location/location'
                })
            },
            uploadImg() {
                uni.chooseImage({
                    count: 1, //默认9
                    sizeType: ['original', 'compressed'], //可以指定是原图还是压缩图,默认二者都有
                    sourceType: ['album'], //从相册选择
                    success: (res) => {
                        console.log(res, 'res');
                        uni.showLoading()
                        uni.uploadFile({
                            url: 'https://huacheng.psciio.com/api/huacheng-communitybackstage/communitypartybuilding/uploadimage',
                            filePath: res.tempFilePaths[0],
                            name: 'file',
                            header: {
                                'Authorization': 'Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOjE2NzYwOTg3NzQ0OTk0NjMxNjgsInR5cGUiOjMsImV4cCI6MTc0MTY4NjQ0OSwiY3JlYXRlZCI6MTc0MDM5MDQ0OTYxN30.UpanrjmCLuKlxm32IbBldBOSJJNYL8ZDrbZQM9z_HCW8X9cL8Ox8jwgX0j4_2nq3ALjYD7aPQWbVmMb2vHIIdA'
                            },
                            success: (uploadFileRes) => {
                                console.log(JSON.parse(uploadFileRes.data), 'uploadFileRes');
                                this.images = [...this.images, JSON.parse(uploadFileRes.data).data]
                                uni.hideLoading()
                            },
                            fail: () => {
                                uni.hideLoading()
                                uni.showToast({
                                    title: '上传失败',
                                    icon: 'error'
                                })
                            }
                        })
                    }
                });
            },
            uploadVideo() {
                uni.chooseVideo({
                    count: 1, //默认9
                    sourceType: ['camera', 'album'],
                    success: (res) => {
                        console.log(res, 'res');
                        uni.showLoading()
                        uni.uploadFile({
                            url: 'https://huacheng.psciio.com/api/huacheng-communitybackstage/communitypartybuilding/uploadimage',
                            filePath: res.tempFilePath,
                            name: 'file',
                            header: {
                                'Authorization': 'Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOjE2NzYwOTg3NzQ0OTk0NjMxNjgsInR5cGUiOjMsImV4cCI6MTc0MTY4NjQ0OSwiY3JlYXRlZCI6MTc0MDM5MDQ0OTYxN30.UpanrjmCLuKlxm32IbBldBOSJJNYL8ZDrbZQM9z_HCW8X9cL8Ox8jwgX0j4_2nq3ALjYD7aPQWbVmMb2vHIIdA'
                            },
                            success: (uploadFileRes) => {
                                console.log(JSON.parse(uploadFileRes.data).data, 'uploadFileRes');
                                this.videos = [...this.videos, JSON.parse(uploadFileRes.data).data]
                                uni.hideLoading()
                            },
                            fail: () => {
                                uni.hideLoading()
                                uni.showToast({
                                    title: '上传失败',
                                    icon: 'error'
                                })
                            }
                        })
                    }
                });
            },
        }
    }
</script>
H5/pages/Appeal/service.js
New file
@@ -0,0 +1,9 @@
import request from '@/utils/request.js'
export const save =(params)=>{
    return request.post(`/api/huacheng-sangeshenbian/applet/complaint/save`,params)
}
export const getproblem =(params)=>{
    return request.get(`/api/huacheng-sangeshenbian/applet/complaint/problem-type/list`,params)
}
H5/pages/delay/delay.vue
@@ -5,11 +5,21 @@
                说明内容
            </view>
            <view class="mt-27 bgColor1 pt-25 pl-31 pr-31 pb-29 lh-38 fs-27">
                1、处理措施:记录为解决该问题所采取的具体措施,包括政策宣传、处理沟通、现场处理等方式。
                2、处理时间:记录处理该问题的时间节点,包括开始处理时间、处理完成时间等。
                3、参与人员:记录参与处理该问题的人员名单,包括走访人员、相关部门工作人员等。
                4、结果概述:简要描述问题的处理结果,是否得到有效解决,是否达到走访对象的期望等。
                5、后续跟进:如需进一步跟进或处理,记录后续跟进的计划、时间节点及责任人员。
                <view class="">
                    1、处理措施:记录为解决该问题所采取的具体措施,包括政策宣传、处理沟通、现场处理等方式。
                </view>
                <view class="">
                    2、处理时间:记录处理该问题的时间节点,包括开始处理时间、处理完成时间等。
                </view>
                <view class="">
                    3、参与人员:记录参与处理该问题的人员名单,包括走访人员、相关部门工作人员等。
                </view>
                <view class="">
                    4、结果概述:简要描述问题的处理结果,是否得到有效解决,是否达到走访对象的期望等。
                </view>
                <view class="">
                    5、后续跟进:如需进一步跟进或处理,记录后续跟进的计划、时间节点及责任人员。
                </view>
            </view>
            <view class="fs-27 font-bold mt-38">
                图片
@@ -21,7 +31,10 @@
                视频
            </view>
            <view class="flex a-center j-between mt-27 wrap">
                <image src="../../static/logo.png" mode="aspectFill" class="w-140 h-140 mr-15 shrink0 mb-10" v-for="item in 4" :key="item"></image>
                <view class="relative mr-15 shrink0 mb-10" v-for="item in 4" :key="item">
                    <image src="../../static/logo.png" mode="aspectFill" class="w-140 h-140" ></image>
                    <image src="../../static/detailImg/open.png" mode="aspectFill" class="w100 h100 absolute top0 left0"></image>
                </view>
            </view>
        </view>
        <view class="h-10 safe-b">
H5/pages/dispatchWorkOrder/dispatchWorkOrder.vue
@@ -32,7 +32,7 @@
        <view class="input-card">
            <view class="title mb-27">
                上报说明
                下派说明
            </view>
            <u--textarea style="background-color:rgba(248, 248, 248, 1);border: unset;padding:25rpx 30.77rpx;"
                height="365.38rpx" v-model="content" placeholder="请输入内容"></u--textarea>
@@ -48,7 +48,8 @@
            <view class="popup-content">
                <view class="title-pop">请选择下派单位</view>
                <view class="pop-label">社区:</view>
                <uni-data-select v-model="value" :localdata="range" @change="change"></uni-data-select>
                <uni-data-select :disabled="false" v-model="value" :localdata="range"
                    @change="change"></uni-data-select>
                <view class="botton-btn">
                    <view class="cancle" @tap="close">取消</view>
@@ -76,6 +77,7 @@
            };
        },
        onLoad(option) {
            option.id = 1
            if (option.id) {
                this.id = option.id
                getDetail({
@@ -104,6 +106,8 @@
                        this.range = res.data.map(item => {
                            item.text = item.name
                            item.value = item.id
                            item.disable = false
                            return item
                        })
                    }
                })
H5/pages/index/index.vue
@@ -9,15 +9,11 @@
                    <image class="h-32" src="/static/home/img5.png" mode=""></image>
                </view>
                <swiper class="swiper " :indicator-dots="false" :autoplay="true" :interval="3000">
                    <swiper-item>
                        <image style="height: 270rpx;width: 688rpx;" src="/static/home/img2.png" mode=""></image>
                    <swiper-item v-for="item,index in bannerlist" :key="index">
                        <image style="height: 270rpx;width: 688rpx;border-radius: 19rpx;" :src="item.url" mode="">
                        </image>
                    </swiper-item>
                    <swiper-item>
                        <image style="height: 270rpx;width: 688rpx;" src="/static/home/img2.png" mode=""></image>
                    </swiper-item>
                    <swiper-item>
                        <image style="height: 270rpx;width: 688rpx;" src="/static/home/img2.png" mode=""></image>
                    </swiper-item>
                </swiper>
            </view>
        </view>
@@ -54,37 +50,37 @@
            </view>
            <view class=" mt-15">
                <view class="flex a-center">
                    <view class="msg mr-19" @click="isactive=1" :class="isactive==1? 'active':''">
                    <view class="msg mr-19" @click="changeActive(1)" :class="isactive==1? 'active':''">
                        消息
                        <view class="tips">
                            6
                            {{msgList.length}}
                        </view>
                    </view>
                    <view class="representative" @click="isactive=2" :class="isactive==2? 'active':''">
                    <view class="representative" @click="changeActive(2)" :class="isactive==2? 'active':''">
                        待办
                        <view class="tips">
                            6
                            {{msgList.length}}
                        </view>
                    </view>
                </view>
                <view class="list mt-29">
                    <view class="flex a-center mb-27" v-for="item in 5">
                    <view class="flex a-center mb-27" v-for="item in msgList" :key="item.id">
                        <view class="avater pb-33">
                            <image class="w-85 h-85 br50" src="/static/home/img9.png" mode=""></image>
                            <view class="tips">
                            <view class="tips" v-if="item.readStatus==2">
                            </view>
                        </view>
                        <view class="border-b flex1 ml-18 pb-33">
                            <view class="fs-31  font-w500 flex  flex1 j-between">
                                <text>钟山淑</text>
                                <text class="fs-23 font-w400">16分钟前</text>
                                <text>{{item.title}}</text>
                                <text class="fs-23 font-w400">{{item.time}}分钟前</text>
                            </view>
                            <view class="fs-27 flex j-between mt-8">
                                <text>向你发来10份报告</text>
                                <view class="read">已读</view>
                                <view class="noread">未读</view>
                                <text></text>
                                <view class="read" v-if="item.readStatus==1">已读</view>
                                <view class="noread" v-else>未读</view>
                            </view>
                        </view>
@@ -100,6 +96,7 @@
</template>
<script>
    import dayjs from '../../uni_modules/uview-ui/libs/util/dayjs'
    import popupCertificate from '../components/certificate/certificate.vue'
    import {
        getBanner,
@@ -115,7 +112,10 @@
                list1: [],
                showData: false,
                isClick: false,
                pageNum:1,
                pageNum: 1,
                bannerlist: [],
                msgList: [],
                msgListTotal: [],
            }
        },
        onLoad() {
@@ -126,6 +126,7 @@
            getBanner() {
                getBanner().then(resp => {
                    console.log(resp, '获取banner');
                    this.bannerlist = resp.data
                })
            },
            getMessagelist() {
@@ -135,7 +136,42 @@
                }
                getMessagelist(data).then(resp => {
                    console.log(resp, '获取消息列表');
                    this.msgListTotal = resp.data.records.map(item => {
                        const timeDifference = new Date().getTime() - new Date(item.createTime).getTime()
                        // 使用 dayjs 的 duration 来处理时间差
                          // 计算总秒数
                            const totalSeconds = Math.floor(timeDifference / 1000);
                            // 计算天数
                            const days = Math.floor(totalSeconds / (3600 * 24));
                            // 计算剩余的秒数
                            const remainingSecondsAfterDays = totalSeconds % (3600 * 24);
                            // 计算小时数
                            const hours = Math.floor(remainingSecondsAfterDays / 3600);
                            // 计算剩余的秒数
                            const remainingSecondsAfterHours = remainingSecondsAfterDays % 3600;
                            // 计算分钟数
                            const minutes = Math.floor(remainingSecondsAfterHours / 60);
                        item.time = days&&hours?`${days} 天 ${hours}小时 ${minutes} `:!days&&hours?`${hours}小时 ${minutes}`:`${minutes}`
                        return item
                    })
                    this.msgList = JSON.parse(JSON.stringify(this.msgListTotal)).filter(item => item.promptType ==
                        2)
                    console.log(this.msgListTotal, 'this.msgListTotal');
                })
            },
            changeActive(value) {
                this.isactive = value
                if (value == 1) {
                    this.msgList = JSON.parse(JSON.stringify(this.msgListTotal)).filter(item => item.promptType == 2)
                } else {
                    this.msgList = JSON.parse(JSON.stringify(this.msgListTotal)).filter(item => item.promptType == 1)
                }
            },
            change() {
                console.log('1111');
@@ -282,6 +318,10 @@
    }
    // swiper-item{
    //     border-radius: 19rpx;
    // }
    .msg {
        width: 173rpx;
        height: 58rpx;
H5/pages/list/list.vue
@@ -21,32 +21,32 @@
            </view>
        </view>
        <view class="pl-31 pr-31">
            <view class="mt-31 br-19 bgColor3 shadow2 oh pb-31" v-for="(item,index) in 10" :key="index">
            <view class="mt-31 br-19 bgColor3 shadow2 oh pb-31" v-for="(item,index) in list" :key="item.id">
                <view class="pt-21 pl-27 pr-27 flex a-center j-between fs-27 font-bold">
                    <view class="">
                        诉求号:7843523454
                        诉求号:{{ item.serialNumber || '' }}
                    </view>
                    <view class="color3">
                        上级驳回
                        {{ statusObj[item.status] }}
                    </view>
                </view>
                <view class="mt-40 fs-23 pl-40 pr-40">
                    <view class="flex j-between a-center">
                        <view class="color4">
                            上报人:<text class="color5">李雷</text>
                            上报人:<text class="color5">{{ item.reporter || '' }}</text>
                        </view>
                        <view class="color4">
                            所属部门:<text class="color5">部门AA</text>
                            所属部门:<text class="color5">{{ item.departmentName || '' }}</text>
                        </view>
                    </view>
                    <view class="mt-15">
                        <view class="color4">
                            提交时间:<text class="color5">2025-2-11 11:09:09</text>
                            提交时间:<text class="color5">{{ item.reportTime | formatTime }}</text>
                        </view>
                    </view>
                </view>
                <view class="mt-27 ml-40 mr-40 br-19 bgColor4 pt-34 pb-34 fs-27 pl-27 pr-27 flex a-center j-between">
                    <text>江苏省常州市溧阳市牛顿大道172号</text>
                    <text>{{ item.location || '' }}</text>
                    <image src="../../static/location.png" mode="aspectFill" class="w-31 h-31 ml-10 shrink0"></image>
                </view>
                <view class="ml-40 mr-40 mt-31 flex j-between a-center fs-27 txt-center">
@@ -55,7 +55,7 @@
                            问题类型
                        </view>
                        <view class="tip">
                            教育
                            {{ item.problemType || '' }}
                        </view>
                    </view>
                    <view class="">
@@ -63,7 +63,7 @@
                            群众
                        </view>
                        <view class="mt-10">
                            沙振
                            {{ item.name || '' }}
                        </view>
                    </view>
                    <view class="">
@@ -71,7 +71,7 @@
                            联系电话
                        </view>
                        <view class="mt-10">
                            14225874426
                            {{ item.contactNumber || '' }}
                        </view>
                    </view>
                </view>
@@ -80,7 +80,7 @@
                        问题描述
                    </view>
                    <view class="mt-10 lh-38">
                        说出来的是你想的,做出来的是你说的,交出来的是你做的
                        {{ item.descriptionContent || '' }}
                    </view>
                </view>
                <view class="fs-27 mt-31 ml-40">
@@ -88,14 +88,15 @@
                        描述图片
                    </view>
                    <view class="mt-19 flex wrap a-center">
                        <image v-for="(item,index) in 4" :key="index" src="../../static/logo.png" class="br-19 w-142 h-154 mr-13 mb-10 shrink0" mode=""></image>
                        <image v-for="(item1,index) in item.images" :key="index" :src="item1"
                            class="br-19 w-142 h-154 mr-13 mb-10 shrink0" mode="aspectFill"></image>
                    </view>
                </view>
                <view class="mt-31 border1">
                    <view class="left"></view>
                    <view class="right"></view>
                    <view class="txt-center fs-23 mt-27 color6">
                        创建时间:2025-9-11 11:01:09
                        创建时间:{{ item.createTime | formatTime }}
                    </view>
                    <view class="flex a-center j-center fs-23 mt-29 txt-center">
                        <view class="h-58 lh-58 bgColor5 w-192 br-29 color7">
@@ -106,7 +107,7 @@
                        </view>
                    </view>
                </view>
            </view>
        </view>
        <view class="safe-b pt-20"></view>
@@ -114,14 +115,64 @@
</template>
<script>
    import dayjs from '@/uni_modules/uview-ui/libs/util/dayjs.js'
    import {
        getList
    } from './service.js'
    export default {
        data() {
            return {
                active: 1
                active: 1,
                searchParams: {
                    pageNum: 1,
                    pageSize: 10,
                    type: 0
                },
                list:[],
                status: 'loadMore',
                statusObj: {
                    // 0-正在办理 1-延期办理 2-超时办理 3-已办结 4-群众撤销 5-上报待审核 6-上级驳回
                    '0': '正在办理',
                    '1': '延期办理',
                    '2': '超时办理',
                    '3': '已办结',
                    '4': '群众撤销',
                    '5': '上报待审核',
                    '6': '上级驳回'
                }
            }
        },
        methods: {
        onReachBottom() {
        },
        filters: {
            formatTime(val) {
                return dayjs(val).format('YYYY-MM-DD HH:mm:ss')
            }
        },
        onShow() {
            this.fetchList(this.searchParams,(e)=>{
                this.list = e.records || []
                if (this.list.length == e.total) {
                    this.status = 'noMore'
                } else {
                    this.status = 'loadMore'
                }
            })
        },
        methods: {
            fetchList(params,callback) {
                if (this.status == 'loading') return
                this.status = 'loading'
                getList(params).then(res=>{
                    if (res.code == 200) {
                        res.data.records.map(item=>{
                            item.images = item.images.split(',')
                        })
                        callback(res.data)
                    }
                })
            }
        }
    }
</script>
@@ -131,7 +182,7 @@
        min-height: 100vh;
        background-color: #f7f7f7;
    }
    .tip {
        height: 40rpx;
        background-color: #FFFBE6;
@@ -148,7 +199,7 @@
    .shadow1 {
        box-shadow: 0rpx 12rpx 15rpx 0rpx rgba(0, 0, 0, 0.1);
    }
    .shadow2 {
        box-shadow: 0rpx 0rpx 27rpx 0rpx rgba(0, 0, 0, 0.1);
    }
@@ -160,27 +211,27 @@
    .color2 {
        color: #232323;
    }
    .color3 {
        color: #FF4948;
    }
    .color4 {
        color: #929191;
    }
    .color5 {
        color: #000;
    }
    .color6 {
        color: #666666;
    }
    .color7 {
        color: #727272;
    }
    .color8 {
        color: #fff;
    }
@@ -196,30 +247,31 @@
        bottom: -5rpx;
        margin: auto;
    }
    .bgColor2 {
        background-color: #fff;
    }
    .bgColor3 {
        background: linear-gradient( 180deg, #FFDCDB 0%, rgba(255,255,255,0) 138rpx, #fff 100%);
        background: linear-gradient(180deg, #FFDCDB 0%, rgba(255, 255, 255, 0) 138rpx, #fff 100%);
    }
    .bgColor4 {
        background: linear-gradient( 270deg, rgba(255,241,0,0.5) 0%, rgba(255,249,172,0.25) 48%, rgba(255,255,255,0.2) 100%, #FFFFFF 100%);
        background: linear-gradient(270deg, rgba(255, 241, 0, 0.5) 0%, rgba(255, 249, 172, 0.25) 48%, rgba(255, 255, 255, 0.2) 100%, #FFFFFF 100%);
    }
    .bgColor5 {
        background: #F3F3F3;
    }
    .bgColor6 {
        background: linear-gradient( 270deg, #FC8D55 0%, #FF4948 100%);
        background: linear-gradient(270deg, #FC8D55 0%, #FF4948 100%);
    }
    .border1 {
        border-top: 2rpx solid #EDEEEF;
        position: relative;
        .left {
            width: 40rpx;
            height: 40rpx;
@@ -229,6 +281,7 @@
            left: -20rpx;
            top: -20rpx;
        }
        .right {
            width: 40rpx;
            height: 40rpx;
H5/pages/list/service.js
New file
@@ -0,0 +1,5 @@
import request from '@/utils/request.js'
// 工单列表
export const getList =(params)=>{
    return request.post(`/api/huacheng-sangeshenbian/applet/complaint/list`,params)
}
H5/pages/location/location.vue
@@ -1,29 +1,31 @@
<template>
    <view class="content">
        <u-navbar title="选择地点" bgColor="transparent" titleStyle="font-size: 35rpx;font-weight:bold;" placeholder>
            <view slot="left">
            <view slot="left" @click="back">
                <image src="/static/location/back.png" class="w-19 h-35" mode=""></image>
            </view>
        </u-navbar>
        <view class="" id="container">
        </view>
        <view class="">
            <view class="searchMain mb-35">
        <view class=" main">
            <view class="searchMain  mb-35 mt-38">
                <view class="search fs-27 ">
                    <text class="mr-35 ml-50">成都市</text>
                    <image class="w-17 h-8 mr-35" src="/static/location/toleft.png" mode=""></image>
                    <image class="w-31 h-31 mr-13" src="/static/location/search.png" mode=""></image>
                    <input class="flex1" placeholder="搜索小区/写字楼等" placeholder-style="font-size:27rpx"></input>
                    <view class="sure">
                    <input class="flex1" v-model="keyword" placeholder="搜索小区/写字楼等"
                        placeholder-style="font-size:27rpx"></input>
                    <view class="sure" @click="searchLocation">
                        确定
                    </view>
                </view>
            </view>
            <view class="card" :class="" v-for="item in 5">
                <text>天府新谷九号楼二单元</text>
                <text class="font-w500 fs-23 mt-25" style="color: rgba(0, 0, 0, 0.6);">四川省成都市高新区府城大道西段399号天</text>
            <view class="card" @click="changeAdr(item.id,item)" :class="item.id ==uid ?'activecard':''"
                v-for="item in locationList" :key="item.id">
                <text>{{item.address}}</text>
                <text class="font-w500 fs-23 mt-25" style="color: rgba(0, 0, 0, 0.6);">{{item.address}}</text>
            </view>
        </view>
@@ -37,30 +39,142 @@
            return {
                latitude: 39.909,
                longitude: 116.39742,
                map: null,
                uid: 0,
                keyword: '',
                locationList: [],
            };
        },
        mounted() {
        methods: {
            back() {
                uni.navigateBack()
            },
            changeAdr(value, addr) {
                console.log(value, addr, 'asdasdada');
                this.uid = value
                const pages = getCurrentPages()
                let prevPage = pages[pages.length - 2];
                prevPage.location = addr.address
                prevPage.latitude = addr.point.lat
                prevPage.longitude = addr.point.lng
                setTimeout(() => {
                    uni.navigateBack()
                }, 200)
            },
            // 搜索地点
            searchLocation() {
                if (!this.keyword) return;
                uni.request({
                    url: `https://api.map.baidu.com/place/v2/search`,
                    method: 'GET',
                    data: {
                        query: this.keyword,
                        location: `${this.latitude},${this.longitude }`,
                        radius: 10000, // 搜索半径,单位:米
                        output: 'json',
                        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
                            this.longitude = res.data.results[0].location.lng
                            this.locationList = res.data.results.map((result, index) => {
                                result.id = index + 1
                                return result
                            });
                        }
                    },
                    fail: (err) => {
                        console.error('搜索失败:', err);
                    }
                });
            },
        },
         onReady() {
             var map = new BMapGL.Map("container");          // 创建地图实例
             var point = new BMapGL.Point(116.404, 39.915);  // 创建点坐标
             map.centerAndZoom(point, 15);
         }
        onLoad() {
        },
        onReady() {
            this.map = new BMapGL.Map("container"); // 创建地图实例
            uni.getLocation({
                type: 'wgs84',
                success: (res) => {
                    console.log(res, 'res');
                    this.longitude = res.longitude;
                    this.latitude = res.latitude;
                    var point = new BMapGL.Point(res.longitude, res.latitude); // 创建点坐标
                    this.map.enableScrollWheelZoom(true);
                    this.map.centerAndZoom(point, 12);
                    var marker = new BMapGL.Marker(point);
                    this.map.addOverlay(marker);
                    var myGeo = new BMapGL.Geocoder();
                    // 根据坐标得到地址描述
                    myGeo.getLocation(new BMapGL.Point(res.longitude, res.latitude), (result) => {
                        console.log(result, 'result');
                        this.locationList = result.surroundingPois.map((item, index) => {
                            item.id = index + 1
                            return item
                        })
                    })
                    this.map.addEventListener('click', (e) => {
                        var mercator = this.map.lnglatToMercator(e.latlng.lng, e.latlng.lat);
                        this.latitude = e.latlng.lat
                        this.longitude = e.latlng.lng
                        var point = new BMapGL.Point(e.latlng.lng, e.latlng.lat);
                        this.map.centerAndZoom(point, 12);
                        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
                            })
                        })
                        var marker = new BMapGL.Marker(point);
                        this.map.addOverlay(marker);
                    });
                }
            });
        }
    }
</script>
<style lang="scss" scoped>
    #container {
        width: 100vw;
        height: 517rpx;
        height: 534rpx;
    }
    .content {
        display: flex;
        flex-direction: column;
        align-items: center;
        .main {
            background-color: #fff;
            border-radius: 34rpx;
            position: absolute;
            top: 517rpx;
            z-index: 100;
            .activecard {
                background: #F2F2F2;
            }
        }
    }
    .searchMain {
        padding-left: 40rpx;
@@ -101,7 +215,7 @@
        font-size: 31rpx;
        color: rgba(0, 0, 0, 0.8);
        padding: 34rpx 38rpx 33rpx 38rpx;
        background: #F2F2F2;
        background: #fff;
        border-bottom: 2rpx solid rgba(0, 10, 26, 0.07);
    }
</style>
H5/pages/problemReporting/problemReporting.vue
@@ -44,7 +44,7 @@
            提交后会由上级部门进行审核,请留意审核结果
        </view>
        <view class="btn">提交至上级部门</view>
        <view class="btn" @tap="problemReports">提交至上级部门</view>
    </view>
</template>
@@ -63,6 +63,7 @@
            };
        },
        onLoad(option) {
            option.id = 1
            if (option.id) {
                this.id = option.id
                getDetail({
@@ -85,7 +86,10 @@
                            icon: 'none',
                            title: '上报成功'
                        })
                        uni.navigateBack()
                        setTimeout(() => {
                            uni.navigateBack()
                        }, 1500)
                    }
                })
            },
H5/pages/problemReporting/service.js
@@ -3,6 +3,6 @@
export const getDetail = (params) => {
    return request.get(`/api/huacheng-sangeshenbian/applet/complaint/detail`, params)
}
export const problemReport = (params) => {
    return request.get(`/api/huacheng-sangeshenbian/applet/complaint/report`, params)
export const problemReport = (data) => {
    return request.post(`/api/huacheng-sangeshenbian/applet/complaint/report`, data)
}
H5/pages/work-detail/work-detail.vue
@@ -225,7 +225,7 @@
            </view>
            <!-- 详情/办理进度 --正在办理-延期-超时  显示-->
            <view class="progress" v-if="['0','1','2'].includes(orderInfo.status)">
            <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">
@@ -263,7 +263,7 @@
            </view>
            <!-- 详情/诉求流转 --正在办理显示-->
            <view class="careRequire" v-if="orderInfo.status==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">
@@ -296,11 +296,11 @@
        </view>
        <!-- 上级显示 -->
        <view class="btnButtom" v-if="['0','1','2'].includes(orderInfo.status)">
        <view class="btnButtom" v-if="[0,1,2].includes(orderInfo.status)">
            <view class="btnDown" @click.stop="toUp">问题上报</view>
            <view class="btnDown" @click.stop="toDown">诉求下派</view>
            <view class="btnAdd">添加办理进度</view>
            <view class="btnAdd">办理结果录入</view>
            <view class="btnAdd" @click="addProgress">添加办理进度</view>
            <view class="btnAdd" @click="resultEntery">办理结果录入</view>
        </view>
        <view class="btnButtom" v-if="orderInfo.status==5">
            <view class="cancel" @click.stop="showPop=true">驳回</view>
@@ -309,10 +309,10 @@
        <!-- 上级显示 -->
        <!-- 党员显示 -->
        <view class="btnButtom" v-if="['0','1','2'].includes(orderInfo.status)">
        <view class="btnButtom" v-if="[0,1,2].includes(orderInfo.status)">
            <view class="btnDown partyUp" @click.stop="toUp">问题上报</view>
            <view class="btnAdd partyDown">添加办理进度</view>
            <view class="btnAdd partyDown">办理结果录入</view>
            <view class="btnAdd partyDown" @click="addProgress">添加办理进度</view>
            <view class="btnAdd partyDown" @click="resultEntery">办理结果录入</view>
        </view>
        <!-- 党员显示 -->
@@ -342,7 +342,7 @@
    export default {
        data() {
            return {
                id: "", //工单详情ID
                id: "1", //工单详情ID
                orderInfo: {}, //工单详情
                problemVideos: [], //描述视频
                problemImg: [], //描述图片
@@ -368,6 +368,7 @@
            }).then(res => {
            })
            this.getDetailInfo()
        },
        methods: {
            open() {},
@@ -396,7 +397,7 @@
                        this.resultVideos = res.data.completionVideos.split(',')
                    }
                    // 办理进度
                    if (res.data.complaintProgresses.length > 0) {
                    if (res.data.complaintProgresses && res.data.complaintProgresses.length > 0) {
                        this.progressesList = res.data.complaintProgresses.map((item) => {
                            return {
                                ...item,
@@ -406,7 +407,7 @@
                        })
                    }
                    // 诉求流转记录
                    if (res.data.complaintFlows.length > 0) {
                    if (res.data.complaintFlows && res.data.complaintFlows.length > 0) {
                        this.flowsList = res.data.complaintFlows
                    }
@@ -438,6 +439,16 @@
                    url: `/pages/dispatchWorkOrder/dispatchWorkOrder?id=${this.id}`
                })
            },
            addProgress() {
                uni.navigateTo({
                    url: `/pages/add-progress/index?id=${this.id}`
                })
            },
            resultEntery() {
                uni.navigateTo({
                    url: `/pages/result-entry/index?id=${this.id}`
                })
            }
        }
    }
</script>
H5/static/detailImg/right.png