hejianhao
1 天以前 dd8617c818e31d19863cc03d103bc83f209666f6
Merge branch 'master' of http://120.76.84.145:10101/gitblit/r/H5/threeSide
13个文件已修改
1145 ■■■■■ 已修改文件
H5/components/voiceInputPopup.vue 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
H5/manifest.json 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
H5/pages/Appeal/Appeal.vue 924 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
H5/pages/dispatchWorkOrder/dispatchWorkOrder.vue 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
H5/pages/location/location.vue 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
H5/pages/statistics/index.vue 25 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
H5/pages/supervision/edit-supervision-progress.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
H5/pages/work-detail/work-detail.vue 44 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
H5/store/index.js 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
H5/uni_modules/mumu-recorder/components/mumu-recorder/mumu-recorder.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
H5/utils/request.js 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
management/src/pages/setting/user/index.jsx 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
management/src/pages/statistics/index.jsx 40 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
H5/components/voiceInputPopup.vue
@@ -146,7 +146,11 @@
      // 清空录音片段
      this.recordSegments = []
      this.currentSegment = null
      // 重置计时器
      // 停止计时器
      this.stopTimer()
      // 重置录音状态
      this.isRecording = false
      this.isPaused = false
      this.seconds = 0
      this.minutes = 0
      this.hours = 0
H5/manifest.json
@@ -1,6 +1,6 @@
{
    "name": "“三个身边”群众工作机制",
    "appid": "__UNI__DB035F5",
    "appid": "__UNI__5DC32B0",
    "description": "",
    "versionName": "1.0.0",
    "versionCode": "100",
H5/pages/Appeal/Appeal.vue
@@ -69,7 +69,7 @@
                <view v-for="item, index in videoContent" :key="index">
                    <view class="pl-19 pr-19 pb-17 pt-17 flex j-between a-center br-8 pink">
                        <view class="flex1">
                            <text class="fs-27 font-bold">语音文件{{ index + 1 }}</text>
                            <text class="fs-27 font-bold">语音文件{{ (index + 1) | numToWords }}</text>
                        </view>
                        <view class="flex j-between a-center">
                            <image src="/static/Appeal/delete.png" class="w-27 h-27 mr-38" mode=""
@@ -147,495 +147,513 @@
</template>
<script>
    import dayjs from '@/uni_modules/uview-ui/libs/util/dayjs.js';
    import {
        save,
        getproblem
    } from './service.js'
    import config from '@/config/index.js'
    import voiceInputPopup from '@/components/voiceInputPopup.vue'
    import {
        mapActions,
        mapState
    } from "vuex";
import dayjs from '@/uni_modules/uview-ui/libs/util/dayjs.js';
import {
    save,
    getproblem
} from './service.js'
import config from '@/config/index.js'
import voiceInputPopup from '@/components/voiceInputPopup.vue'
import {
    mapActions,
    mapState
} from "vuex";
    export default {
        components: {
            voiceInputPopup
export default {
    components: {
        voiceInputPopup
    },
    data() {
        return {
            showList: false,
            showDate: false,
            value1: Number(new Date()),
            columns: [
                ['医疗', '教育', '就业', '住房', '养老']
            ],
            time: '',
            problemType: '',
            name: '',
            contactNumber: '',
            detailedAddress: '',
            descriptionTitle: '',
            descriptionContent: '',
            videoContent: [],
            latitude: '',
            longitude: '',
            location: '',
            images: [],
            videos: [],
            voiceFile: '', //语音文件多个逗号拼接
            userInfo: uni.getStorageSync('userInfo'), //个人信息
            voiceInputShow: false,
        };
    },
    computed: {
        ...mapState(["playFlag"]),
    },
    filters: {
        formatTime(val) {
            if (!val) return ''
            return dayjs(val).format('YYYY-MM-DD HH:mm:ss')
        },
        data() {
            return {
                showList: false,
                showDate: false,
                value1: Number(new Date()),
                columns: [
                    ['医疗', '教育', '就业', '住房', '养老']
                ],
                time: '',
                problemType: '',
                name: '',
                contactNumber: '',
                detailedAddress: '',
                descriptionTitle: '',
                descriptionContent: '',
                videoContent: [],
                latitude: '30.5061493',
                longitude: '105.574542',
                location: '测试地址',
                images: [],
                videos: [],
                voiceFile: '', //语音文件多个逗号拼接
                userInfo: uni.getStorageSync('userInfo'), //个人信息
                voiceInputShow: false,
            };
        numToWords(val) {
            const words = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九', '十']
            // 处理 0-10
            if (val >= 0 && val <= 10) return words[val];
            // 处理 11-99
            if (val > 10 && val < 100) {
                const ten = Math.floor(val / 10);
                const unit = val % 10;
                return `${ten > 1 ? words[ten] : ''}十${unit > 0 ? words[unit] : ''}`;
            }
            return val; // 超过99返回原数字
        }
    },
    onReady() {
        uni.setNavigationBarTitle({
            title: '诉求录入'
        })
    },
    onLoad() {
        this.getproblem()
        this.time = dayjs().format('YYYY-MM-DD')
    },
    methods: {
        ...mapActions(["playRecording", "pausePlaying"]),
        onPlayRecording(index) {
            // 先处理本地播放状态
            this.videoContent.forEach((item, i) => {
                item.playing = i === index;
            });
            // 调用store的播放方法,传url
            this.playRecording(this.videoContent[index].url);
        },
        computed: {
            ...mapState(["playFlag"]),
        onPausePlaying(index) {
            this.videoContent[index].playing = false;
            this.pausePlaying(this.videoContent[index].url);
        },
        onReady() {
            uni.setNavigationBarTitle({
                title: '诉求录入'
        deleteVoice(ind) {
            this.videoContent = this.videoContent.filter((item, index) => index != ind)
        },
        voiceInput() {
            this.voiceInputShow = true;
        },
        closeVoiceInput() {
            this.voiceInputShow = false;
        },
        submitVoiceInput(e) {
            console.log('eeeeeeeeeeeeeeeeeee', e)
            this.videoContent.push({
                url: e.url,
                data: e.data,
                playing: false
            });
            this.voiceInputShow = false;
        },
        previewImage(index) {
            uni.previewImage({
                urls: this.images,
                current: this.images[index],
                longPressActions: {
                    itemList: ['发送给朋友', '保存图片', '收藏'],
                    success: function (data) {
                    },
                    fail: function (err) {
                    }
                }
            });
        },
        deletimg(e) {
            this.images = this.images.filter(item => item != e)
        },
        deletvideo(e) {
            this.videos = this.videos.filter(item => item != e)
        },
        gotoPage(e) {
            uni.navigateTo({
                url: `/pages/work-detail/maxVideo?url=${e}`
            })
        },
        onLoad() {
            this.getproblem()
            this.time = dayjs().format('YYYY-MM-DD')
        getproblem() {
            getproblem().then((resp => {
                this.columns = [resp.data.map(item => {
                    return item.name
                })]
            }))
        },
        methods: {
            ...mapActions(["playRecording", "pausePlaying"]),
            onPlayRecording(index) {
                // 先处理本地播放状态
                this.videoContent.forEach((item, i) => {
                    item.playing = i === index;
        async submit(type) {
            if (this.videoContent.length > 0) {
                uni.showLoading({
                    title: '正在上传语音文件...'
                });
                // 调用store的播放方法,传url
                this.playRecording(this.videoContent[index].url);
            },
            onPausePlaying(index) {
                this.videoContent[index].playing = false;
                this.pausePlaying(this.videoContent[index].url);
            },
            deleteVoice(ind) {
                this.videoContent = this.videoContent.filter((item, index) => index != ind)
            },
            voiceInput() {
                this.voiceInputShow = true;
            },
            closeVoiceInput() {
                this.voiceInputShow = false;
            },
            submitVoiceInput(e) {
                console.log('eeeeeeeeeeeeeeeeeee', e)
                this.videoContent.push({
                    url: e.url,
                    data: e.data,
                    playing: false
                });
                this.voiceInputShow = false;
            },
            previewImage(index) {
                uni.previewImage({
                    urls: this.images,
                    current: this.images[index],
                    longPressActions: {
                        itemList: ['发送给朋友', '保存图片', '收藏'],
                        success: function(data) {
                        },
                        fail: function(err) {
                        }
                    }
                });
            },
            deletimg(e) {
                this.images = this.images.filter(item => item != e)
            },
            deletvideo(e) {
                this.videos = this.videos.filter(item => item != e)
            },
            gotoPage(e) {
                uni.navigateTo({
                    url: `/pages/work-detail/maxVideo?url=${e}`
                })
            },
            getproblem() {
                getproblem().then((resp => {
                    this.columns = [resp.data.map(item => {
                        return item.name
                    })]
                }))
            },
            async submit(type) {
                if (this.videoContent.length > 0) {
                    uni.showLoading({
                        title: '正在上传语音文件...'
                    });
                    const uploadPromises = this.videoContent.map(item => {
                        return new Promise((resolve, reject) => {
                            console.log('item.data', item.data)
                            // uni.chooseAudio({
                            //     success:  (res)=> {
                            //         console.log(res.tempFilePaths[0]);
                            //         uni.uploadFile({
                            //             url: config.imageUrl,
                            //             filePath: res.tempFilePaths[0],  // 使用 Blob 数据
                            //             name: 'file',
                            //             header: {
                            //                 // 'Content-Type': 'multipart/form-data',
                            //                 'Authorization': uni.getStorageSync('token')
                            //             },
                            //             success: (uploadFileRes) => {
                            //                 const response = JSON.parse(uploadFileRes.data);
                            //                 if (response.code === 200) {
                            //                     resolve(response.data);
                            //                 } else {
                            //                     reject(new Error('上传失败'));
                            //                 }
                            //             },
                            //             fail: (error) => {
                            //                 reject(error);
                            //             }
                            //         });
                            //     }
                            // });
                            uni.uploadFile({
                                url: config.imageUrl,
                                file: item.data, // 使用 Blob 数据
                                name: 'file',
                                header: {
                                    // 'Content-Type': 'multipart/form-data',
                                    'Authorization': uni.getStorageSync('token')
                                },
                                success: (uploadFileRes) => {
                                    const response = JSON.parse(uploadFileRes.data);
                                    if (response.code === 200) {
                                        resolve(response.data);
                                    } else {
                                        reject(new Error('上传失败'));
                                    }
                                },
                                fail: (error) => {
                                    reject(error);
                const uploadPromises = this.videoContent.map(item => {
                    return new Promise((resolve, reject) => {
                        console.log('item.data', item.data)
                        // uni.chooseAudio({
                        //     success:  (res)=> {
                        //         console.log(res.tempFilePaths[0]);
                        //         uni.uploadFile({
                        //             url: config.imageUrl,
                        //             filePath: res.tempFilePaths[0],  // 使用 Blob 数据
                        //             name: 'file',
                        //             header: {
                        //                 // 'Content-Type': 'multipart/form-data',
                        //                 'Authorization': uni.getStorageSync('token')
                        //             },
                        //             success: (uploadFileRes) => {
                        //                 const response = JSON.parse(uploadFileRes.data);
                        //                 if (response.code === 200) {
                        //                     resolve(response.data);
                        //                 } else {
                        //                     reject(new Error('上传失败'));
                        //                 }
                        //             },
                        //             fail: (error) => {
                        //                 reject(error);
                        //             }
                        //         });
                        //     }
                        // });
                        uni.uploadFile({
                            url: config.imageUrl,
                            file: item.data, // 使用 Blob 数据
                            name: 'file',
                            header: {
                                // 'Content-Type': 'multipart/form-data',
                                'Authorization': uni.getStorageSync('token')
                            },
                            success: (uploadFileRes) => {
                                const response = JSON.parse(uploadFileRes.data);
                                if (response.code === 200) {
                                    resolve(response.data);
                                } else {
                                    reject(new Error('上传失败'));
                                }
                            });
                            },
                            fail: (error) => {
                                reject(error);
                            }
                        });
                    });
                });
                    try {
                        const uploadedUrls = await Promise.all(uploadPromises);
                        this.voiceFile = uploadedUrls.join(',');
                        console.log('this.voiceFile', this.voiceFile)
                        uni.hideLoading();
                    } catch (error) {
                        uni.hideLoading();
                        uni.showToast({
                            title: '语音文件上传失败',
                            icon: 'error'
                        });
                        return;
                    }
                try {
                    const uploadedUrls = await Promise.all(uploadPromises);
                    this.voiceFile = uploadedUrls.join(',');
                    console.log('this.voiceFile', this.voiceFile)
                    uni.hideLoading();
                } catch (error) {
                    uni.hideLoading();
                    uni.showToast({
                        title: '语音文件上传失败',
                        icon: 'error'
                    });
                    return;
                }
                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'
                    })
                    return
                } else if (!this.problemType) {
                    uni.showToast({
                        title: '请选择问题类型',
                        icon: 'none'
                    })
                    return
                } else if (!this.name) {
                    uni.showToast({
                        title: '请输入群众姓名',
                        icon: 'none'
                    })
                    return
                } else if (!this.contactNumber) {
                    uni.showToast({
                        title: '请输入联系电话',
                        icon: 'none'
                    })
                    return
                } else if (!preciseRegex.test(this.contactNumber)) {
                    uni.showToast({
                        title: '请输入正确的手机号',
                        icon: 'none'
                    })
                    return
                } else if (!this.location) {
                    uni.showToast({
                        title: '请选择地点',
                        icon: 'none'
                    })
                    return
                } else if (!this.detailedAddress) {
                    uni.showToast({
                        title: '请输入详细地址',
                        icon: 'none'
                    })
                    return
                } else if (!this.descriptionContent) {
                    uni.showToast({
                        title: '请输入问题描述',
                        icon: 'none'
                    })
                    return
                }
                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,
                    descriptionContent: this.descriptionContent,
                    images: this.images.join(','),
                    videos: this.videos.join(','),
                    voiceFile: this.voiceFile,
                }
                // 问题上报
                if (type == 1) {
                    uni.navigateTo({
                        url: `/pages/problemReporting/problemReporting?data=${JSON.stringify(data)}`
                    })
                    return
                }
                // 办理结果录入
                if (type == 2) {
                    uni.navigateTo({
                        url: `/pages/result-entry/index?data=${JSON.stringify(data)}`
                    })
                    return
                }
                // 添加
                if (type == 3) {
                    save(data).then(resp => {
                        if (resp.code == 200) {
                            uni.showToast({
                                title: '保存成功',
                                icon: 'none'
                            })
                            setTimeout(() => {
                                uni.navigateBack()
                            }, 1500)
                        }
                    })
                }
            },
            confirmone(e) {
                this.time = dayjs(e.value).format('YYYY-MM-DD')
                this.showDate = false
            },
            confirmtwo(e) {
                this.problemType = e.value[0]
                this.showList = false
            },
            cancel() {
                this.showDate = false
                this.showList = false
            },
            close(e) {
                this.showDate = false
                this.showList = false
            },
            goTopagelocation() {
                uni.navigateTo({
                    url: '/pages/location/location'
            }
            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'
                })
            },
            uploadImg() {
                uni.chooseImage({
                    count: 1, //默认9
                    sizeType: ['original', 'compressed'], //可以指定是原图还是压缩图,默认二者都有
                    sourceType: ['album'], //从相册选择
                    success: (res) => {
                return
                        uni.showLoading()
                        console.log('res.tempFilePaths[0]', res.tempFilePaths[0])
                        uni.uploadFile({
                            url: config.imageUrl,
                            filePath: res.tempFilePaths[0],
                            name: 'file',
                            header: {
                                'Authorization': uni.getStorageSync('token')
                            },
                            success: (uploadFileRes) => {
            } else if (!this.problemType) {
                uni.showToast({
                    title: '请选择问题类型',
                    icon: 'none'
                })
                return
            } else if (!this.name) {
                uni.showToast({
                    title: '请输入群众姓名',
                    icon: 'none'
                })
                return
            } else if (!this.contactNumber) {
                uni.showToast({
                    title: '请输入联系电话',
                    icon: 'none'
                })
                return
            } else if (!preciseRegex.test(this.contactNumber)) {
                uni.showToast({
                    title: '请输入正确的手机号',
                    icon: 'none'
                })
                return
            } else if (!this.location) {
                uni.showToast({
                    title: '请选择地点',
                    icon: 'none'
                })
                return
            } else if (!this.detailedAddress) {
                uni.showToast({
                    title: '请输入详细地址',
                    icon: 'none'
                })
                return
            } else if (!this.descriptionContent) {
                uni.showToast({
                    title: '请输入问题描述',
                    icon: 'none'
                })
                return
            }
                                this.images = [...this.images, JSON.parse(uploadFileRes.data).data]
                                uni.hideLoading()
                            },
                            fail: () => {
                                uni.hideLoading()
                                uni.showToast({
                                    title: '上传失败',
                                    icon: 'error'
                                })
                            }
            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,
                descriptionContent: this.descriptionContent,
                images: this.images.join(','),
                videos: this.videos.join(','),
                voiceFile: this.voiceFile,
            }
            // 问题上报
            if (type == 1) {
                uni.navigateTo({
                    url: `/pages/problemReporting/problemReporting?data=${JSON.stringify(data)}`
                })
                return
            }
            // 办理结果录入
            if (type == 2) {
                uni.navigateTo({
                    url: `/pages/result-entry/index?data=${JSON.stringify(data)}`
                })
                return
            }
            // 添加
            if (type == 3) {
                save(data).then(resp => {
                    if (resp.code == 200) {
                        uni.showToast({
                            title: '保存成功',
                            icon: 'none'
                        })
                        setTimeout(() => {
                            uni.navigateBack()
                        }, 1500)
                    }
                });
            },
            uploadVideo() {
                uni.chooseVideo({
                    count: 1, //默认9
                    sourceType: ['camera', 'album'],
                    success: (res) => {
                        const videoExtensions = /\.(mp4|avi|rmvb)$/i;
                        if (!videoExtensions.test(res.name)) {
                })
            }
        },
        confirmone(e) {
            this.time = dayjs(e.value).format('YYYY-MM-DD')
            this.showDate = false
        },
        confirmtwo(e) {
            this.problemType = e.value[0]
            this.showList = false
        },
        cancel() {
            this.showDate = false
            this.showList = false
        },
        close(e) {
            this.showDate = false
            this.showList = false
        },
        goTopagelocation() {
            uni.navigateTo({
                url: '/pages/location/location'
            })
        },
        uploadImg() {
            uni.chooseImage({
                count: 1, //默认9
                sizeType: ['original', 'compressed'], //可以指定是原图还是压缩图,默认二者都有
                sourceType: ['album'], //从相册选择
                success: (res) => {
                    uni.showLoading()
                    console.log('res.tempFilePaths[0]', res.tempFilePaths[0])
                    uni.uploadFile({
                        url: config.imageUrl,
                        filePath: res.tempFilePaths[0],
                        name: 'file',
                        header: {
                            'Authorization': uni.getStorageSync('token')
                        },
                        success: (uploadFileRes) => {
                            this.images = [...this.images, JSON.parse(uploadFileRes.data).data]
                            uni.hideLoading()
                        },
                        fail: () => {
                            uni.hideLoading()
                            uni.showToast({
                                title: '请上传mp4, avi, rmvb格式的视频',
                                icon: 'none',
                                duration: 3000
                                title: '上传失败',
                                icon: 'error'
                            })
                            return
                        }
                        uni.showLoading()
                        uni.uploadFile({
                            url: config.imageUrl,
                            filePath: res.tempFilePath,
                            name: 'file',
                            header: {
                                'Authorization': uni.getStorageSync('token')
                            },
                            success: (uploadFileRes) => {
                                this.videos = [...this.videos, 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) => {
                    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,
                        filePath: res.tempFilePath,
                        name: 'file',
                        header: {
                            'Authorization': uni.getStorageSync('token')
                        },
                        success: (uploadFileRes) => {
                            this.videos = [...this.videos, JSON.parse(uploadFileRes.data).data]
                            uni.hideLoading()
                        },
                        fail: () => {
                            uni.hideLoading()
                            uni.showToast({
                                title: '上传失败',
                                icon: 'error'
                            })
                        }
                    })
                }
            });
        },
    }
}
</script>
<style lang="scss" scoped>
    .min-108 {
        min-height: 108rpx;
.min-108 {
    min-height: 108rpx;
}
.red {
    color: rgba(255, 73, 72, 1);
}
.pink {
    background: #FFF1F4;
    border-radius: 8rpx;
    margin-top: 19rpx;
}
.card {
    border-bottom: 2rpx solid rgba(0, 10, 26, 0.07);
}
.bg {
    background: #F8F8F8;
}
.content {
    padding: 38rpx 31rpx 162rpx 31rpx;
    .main {
        padding: 0 27rpx 48rpx 27rpx;
        background: #FFFFFF;
        box-shadow: 0rpx 0rpx 27rpx 0rpx rgba(0, 0, 0, 0.1);
        border-radius: 19rpx;
    }
}
    .red {
        color: rgba(255, 73, 72, 1);
textarea {
    padding: 27rpx 31rpx 27rpx 31rpx;
    font-weight: 500;
}
.img {
    position: relative;
    .img-icon {
        height: 140rpx;
        line-height: 140rpx;
        position: absolute;
        top: 0rpx;
        left: 35rpx;
    }
}
    .pink {
        background: #FFF1F4;
        border-radius: 8rpx;
        margin-top: 19rpx;
    }
/deep/.u-popup__content {
    border-radius: 16rpx 16rpx 0rpx 0rpx;
}
    .card {
        border-bottom: 2rpx solid rgba(0, 10, 26, 0.07);
    }
/deep/ .u-toolbar {
    border-bottom: 2rpx solid RGBA(243, 243, 243, 1);
}
    .bg {
        background: #F8F8F8;
    }
/deep/ .u-toolbar__wrapper__cancel {
    font-weight: 400;
    font-size: 30rpx;
    color: #FF4948 !important;
}
    .content {
        padding: 38rpx 31rpx 162rpx 31rpx;
/deep/ .u-toolbar__wrapper__confirm {
    font-weight: 400;
    font-size: 30rpx;
    color: #FF4948 !important;
}
        .main {
            padding: 0 27rpx 48rpx 27rpx;
            background: #FFFFFF;
            box-shadow: 0rpx 0rpx 27rpx 0rpx rgba(0, 0, 0, 0.1);
            border-radius: 19rpx;
        }
    }
.footer {
    position: fixed;
    bottom: 0;
    left: 0;
    box-shadow: 0rpx -4rpx 27rpx 0rpx rgba(0, 0, 0, 0.08);
    width: calc(100% - 20rpx);
    background-color: #fff;
    display: flex;
    gap: 27rpx;
    padding: 33rpx 10rpx;
    justify-content: space-between;
    textarea {
        padding: 27rpx 31rpx 27rpx 31rpx;
        font-weight: 500;
    }
    .img {
        position: relative;
        .img-icon {
            height: 140rpx;
            line-height: 140rpx;
            position: absolute;
            top: 0rpx;
            left: 35rpx;
        }
    }
    /deep/.u-popup__content {
        border-radius: 16rpx 16rpx 0rpx 0rpx;
    }
    /deep/ .u-toolbar {
        border-bottom: 2rpx solid RGBA(243, 243, 243, 1);
    }
    /deep/ .u-toolbar__wrapper__cancel {
        font-weight: 400;
        font-size: 30rpx;
        color: #FF4948 !important;
    }
    /deep/ .u-toolbar__wrapper__confirm {
        font-weight: 400;
        font-size: 30rpx;
        color: #FF4948 !important;
    }
    .footer {
        position: fixed;
        bottom: 0;
        left: 0;
        box-shadow: 0rpx -4rpx 27rpx 0rpx rgba(0, 0, 0, 0.08);
        width: calc(100% - 20rpx);
        background-color: #fff;
    .cancel {
        width: 331rpx;
        height: 77rpx;
        border: 2rpx solid rgba(252, 141, 85, 1);
        border-radius: 38rpx;
        display: flex;
        gap: 27rpx;
        padding: 33rpx 10rpx;
        justify-content: space-between;
        .cancel {
            width: 331rpx;
            height: 77rpx;
            border: 2rpx solid rgba(252, 141, 85, 1);
            border-radius: 38rpx;
            display: flex;
            align-items: center;
            justify-content: center;
            color: #FF4948;
        }
        .ok {
            width: 331rpx;
            height: 77rpx;
            background: linear-gradient(270deg, #FC8D55 0%, #FF4948 100%);
            border-radius: 48rpx;
            display: flex;
            align-items: center;
            justify-content: center;
            color: #FFFFFF;
        }
        align-items: center;
        justify-content: center;
        color: #FF4948;
    }
    .ok {
        width: 331rpx;
        height: 77rpx;
        background: linear-gradient(270deg, #FC8D55 0%, #FF4948 100%);
        border-radius: 48rpx;
        display: flex;
        align-items: center;
        justify-content: center;
        color: #FFFFFF;
    }
}
</style>
H5/pages/dispatchWorkOrder/dispatchWorkOrder.vue
@@ -25,7 +25,12 @@
                        </view>
                    </view>
                    <view class="person-item flex1">{{detail.name}}</view>
                    <view class="phone-item flex1">{{detail.contactNumber}}</view>
                    <view class="flex a-center">
                        <view class="phone-item flex1">{{detail.contactNumber}}</view>
                        <image @click.stop="callPhone(detail.contactNumber)" src="../../static/tell.png"
                            class="w-58 h-58 shrink0 " />
                    </view>
                </view>
            </view>
        </view>
@@ -93,6 +98,12 @@
            }
        },
        methods: {
            callPhone(phoneNumber) {
                uni.makePhoneCall({
                    phoneNumber
                });
            },
            close() {
                this.showPop = false
            },
H5/pages/location/location.vue
@@ -112,7 +112,11 @@
            navigator.geolocation.getCurrentPosition(success, error, options);
            function success(position) {
                geoconv({coords:`${position.coords.longitude},${position.coords.latitude}`}).then(res=>{
                console.log('position', position)
                geoconv({
                    coords: `${position.coords.longitude},${position.coords.latitude}`
                }).then(res => {
                    console.log('res', res)
                    const latitude = res.data.result[0].y;
                    const longitude = res.data.result[0].x;
                    var point = new BMapGL.Point(longitude, latitude); // 创建点坐标
@@ -134,6 +138,7 @@
            }
            function error(err) {
                console.log('err', err)
                switch (err.code) {
                    case err.PERMISSION_DENIED:
                        console.error("用户拒绝了位置请求。");
@@ -187,7 +192,7 @@
                this.map.addOverlay(marker);
                this.markers.push(marker);
            });
        }
    }
</script>
H5/pages/statistics/index.vue
@@ -877,6 +877,16 @@
      // 如果第一层是街道
      if (this.regionTree[this.regionTree.length - 1]?.tier === 3) {
        const streets = this.regionTree.slice(1).map(item => ({
          name: item.name,
          id: item.id,
          tier: item.tier,
          children: item.children || []
        }));
        return [{ name: "全部", id: "all", tier: 3, children: [] }, ...streets];
      }
      // 如果第一层是社区
      else if (this.regionTree[this.regionTree.length - 1]?.tier === 4) {
        return this.regionTree.slice(1).map(item => ({
          name: item.name,
          id: item.id,
@@ -884,9 +894,8 @@
          children: item.children || []
        }));
      }
      // 如果当前选中的是区县
      if (county.tier === 2) {
      else if (county.tier === 2) {
        const streets = county.children.filter((c) => c && c.tier === 3);
        return streets.length
          ? [{ name: "全部", id: "all", tier: 3, children: [] }, ...streets]
@@ -906,9 +915,17 @@
        const communities = street.children?.filter(c => c && c.tier === 4) || [];
        return communities.length ? [{ name: "全部", id: "all", tier: 4 }, ...communities] : [];
      }
      // 如果第一层是社区
      else if (this.regionTree[this.regionTree.length - 1]?.tier === 4) {
        return this.regionTree.slice(1).map(item => ({
          name: item.name,
          id: item.id,
          tier: item.tier,
          children: item.children || []
        }));
      }
      // 如果当前选中的是区县
      if (county.tier === 2) {
      else if (county.tier === 2) {
        // 区县下直接有社区
        const communities = county.children.filter((c) => c && c.tier === 4);
        if (communities.length)
H5/pages/supervision/edit-supervision-progress.vue
@@ -73,7 +73,7 @@
                <image @tap="uploadImg(2)" src="@/static/Appeal/add.png" class="w-140 h-140 shrink0" />
            </view>
        </view>
        <view @click.stop="submit" class="mt-38 fs-35 lh-96 br-48 txt-center font-bold bgcolor6 color4 fixed"
        <view @click.stop="submit" class="mt-38 fs-35 lh-96 br-48 txt-center font-bold bgcolor6 color4 fixed zIndex1000"
            style="width: calc(100% - 62rpx);bottom: calc(env(safe-area-inset-bottom) + 10rpx);">确认</view>
        <view class="btn-box"></view>
        <view class="safe-box"></view>
H5/pages/work-detail/work-detail.vue
@@ -5,12 +5,13 @@
        <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>
@@ -109,7 +110,7 @@
                <view class="flex j-between a-center">
                    <view class="title">诉求号:{{ orderInfo.serialNumber || '' }}</view>
                    <view class="flex a-center"
                        v-if="(orderInfo.status == 0||orderInfo.status == 6)&&orderInfo.listControlsButtonStatus == 0"
                        v-if="(orderInfo.status == 0 || orderInfo.status == 6) && orderInfo.listControlsButtonStatus == 0"
                        @click.stop="applyOverTime">
                        <view class="apply">延期申请</view>
                        <image src="../../static/detailImg/right.png" class="rightIcon shrink0"></image>
@@ -165,12 +166,12 @@
            <!-- 问题描述 -->
            <view class="problem">
                <view class="title">问题描述</view>
                <view v-for="(item,index) in getVoiceFile(orderInfo.voiceFile)" :key="index"
                <view v-for="(item, index) in videoContent" :key="index"
                    class="flex a-center j-between py-17 px-19 br-8 bgcolor1 mb-19">
                    <view class="fs-27 lh-38">语音文件{{(index + 1) | numToWords}}</view>
                    <image v-if="!playFlag" @click.stop="playRecording(item)" src="../../static/24gf-playCircle@2x.png"
                        class="w-27 h-27 shrink0" />
                    <image v-else @click.stop="pausePlaying" src="../../static/pausePlaying.png"
                    <view class="fs-27 lh-38">语音文件{{ (index + 1) | numToWords }}</view>
                    <image v-if="!playFlag" @click.stop="onPlayRecording(index)"
                        src="../../static/24gf-playCircle@2x.png" class="w-27 h-27 shrink0" />
                    <image v-else @click.stop="onPausePlaying(index)" src="../../static/pausePlaying.png"
                        class="w-27 h-27 shrink0" />
                </view>
                <view class="desc">
@@ -330,7 +331,7 @@
        </view>
        <!-- 上级显示 -->
        <view class="btnButtom" v-if="(!isParty)&&orderInfo.listControlsButtonStatus == 0">
        <view class="btnButtom" v-if="(!isParty) && orderInfo.listControlsButtonStatus == 0">
            <view class="btnDown" @click.stop="toUp" v-if="userInfo.levelId > 1"
                :class="[2, 3].includes(userInfo.levelId) ? '' : 'partyUp'">问题上报</view>
            <view class="btnDown" @click.stop="toDown" v-if="userInfo.levelId < 4"
@@ -345,7 +346,7 @@
        <!-- 上级显示 -->
        <!-- 党员显示 -->
        <view class="btnButtom" v-if=" isParty && orderInfo.listControlsButtonStatus == 0">
        <view class="btnButtom" v-if="isParty && orderInfo.listControlsButtonStatus == 0">
            <view class="btnDown partyUp" @click.stop="toUp">问题上报</view>
            <view class="btnAdd partyDown" @click="addProgress">添加办理进度</view>
            <view class="btnAdd partyDown" @click="resultEntery">办理结果录入</view>
@@ -419,6 +420,8 @@
                userInfo: uni.getStorageSync('userInfo'), //个人信息
                isParty: false, //true 党员 false 管理员
                videoContent: [],
            };
        },
        computed: {
@@ -468,7 +471,24 @@
            ...mapActions(["playRecording", "pausePlaying"]),
            getVoiceFile(voiceFile) {
                if (!voiceFile || voiceFile.length == 0) return []
                return voiceFile.split(',')
                this.videoContent = voiceFile.split(',').map(item => {
                    return {
                        url: item,
                        playing: false
                    }
                })
            },
            onPlayRecording(index) {
                // 先处理本地播放状态
                this.videoContent.forEach((item, i) => {
                    item.playing = i === index;
                });
                // 调用store的播放方法,传url
                this.playRecording(this.videoContent[index].url);
            },
            onPausePlaying(index) {
                this.videoContent[index].playing = false;
                this.pausePlaying(this.videoContent[index].url);
            },
            callPhone(phoneNumber) {
                uni.makePhoneCall({
@@ -541,6 +561,7 @@
                    this.orderInfo = {
                        ...res.data
                    }
                    this.getVoiceFile(this.orderInfo.voiceFile)
                })
            },
@@ -1336,6 +1357,7 @@
        .pop-textArea {
            padding: 34rpx 44rpx 0 44rpx;
            margin: 2rpx;
            ::v-deep .u-textarea {}
H5/store/index.js
@@ -25,18 +25,63 @@
            }
            state.innerAudioContext = uni.createInnerAudioContext();
            state.innerAudioContext.autoplay = true;
            // state.innerAudioContext.src =
            //     'https://haitunyingyu.obs.cn-southwest-2.myhuaweicloud.com/admin/6660c5497ff34ee5b2bddaed01dd3880.wav';
            state.innerAudioContext.src = url
            // 设置音频格式为MPEG
            state.innerAudioContext.format = 'mpeg';
            state.innerAudioContext.src = url;
            // 显示音频信息
            // uni.showToast({
            //     title: '音频链接:' + url,
            //     icon: 'none',
            //     duration: 3000
            // });
            // 添加加载事件处理
            state.innerAudioContext.onCanplay(() => {
                console.log('音频可以播放了');
                uni.showToast({
                    title: '音频已准备就绪',
                    icon: 'none',
                    duration: 2000
                });
            });
            state.innerAudioContext.onPlay(() => {
                state.playFlag = true;
                uni.showToast({
                    title: '开始播放',
                    icon: 'none',
                    duration: 2000
                });
            });
            state.innerAudioContext.onError((res) => {
                // console.log('播放错误', res);
                console.log('播放错误', res);
                uni.showToast({
                    title: '播放错误'+`${res}`,
                    icon: 'none',
                    duration: 3000
                });
                // 显示具体的错误信息
                // let errorMsg = '音频播放失败';
                // if (res.errMsg) {
                //     errorMsg += ':' + res.errMsg;
                // }
                // uni.showToast({
                //     title: errorMsg,
                //     icon: 'none',
                //     duration: 3000
                // });
                dispatch('stopPlaying')
            });
            state.innerAudioContext.onEnded((res) => {
                // console.log('播放自然结束', res);
                console.log('播放自然结束', res);
                uni.showToast({
                    title: '播放结束',
                    icon: 'none',
                    duration: 2000
                });
                dispatch('stopPlaying')
            });
        },
H5/uni_modules/mumu-recorder/components/mumu-recorder/mumu-recorder.vue
@@ -70,7 +70,7 @@
                this.chunks.push(e.data)
            },
            saveRecordingData() {
                const blob = new Blob(this.chunks, { 'type': 'audio/mpeg' }),
                const blob = new Blob(this.chunks, { 'type': 'audio/mp3' }),
                    localUrl = URL.createObjectURL(blob)
                const endTime = new Date().getTime()
H5/utils/request.js
@@ -19,9 +19,9 @@
    return new Promise(function(resolve, reject) {
        let token = uni.getStorageSync('token')
        token =
            'Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOjE4OTI0MjE4MjgwODU4Mzc4MjYsInR5cGUiOjEsImV4cCI6MTc0OTAxMjMwMSwiY3JlYXRlZCI6MTc0NzcxNjMwMTM0OH0.8C2x0xHFW45XbehroA1uWziKsUdVHFck8VpIOVkS_s0KvAeTbFG7nIeEQEjGq0a8bn6kHIF3q58mJi4H34Q0Cg'
        uni.setStorageSync('token', token)
        // token =
        //     'Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOjE4OTI0MjE4MjgwODU4Mzc4MjYsInR5cGUiOjEsImV4cCI6MTc0OTAxMjMwMSwiY3JlYXRlZCI6MTc0NzcxNjMwMTM0OH0.8C2x0xHFW45XbehroA1uWziKsUdVHFck8VpIOVkS_s0KvAeTbFG7nIeEQEjGq0a8bn6kHIF3q58mJi4H34Q0Cg'
        // uni.setStorageSync('token', token)
        let header = {
            'content-type': type ? 'application/x-www-form-urlencoded;charset=UTF-8' : 'application/json',
            'Authorization': token,
management/src/pages/setting/user/index.jsx
@@ -29,6 +29,7 @@
  const [modalVisible1, handleModalVisibles1] = useState(false);
  const [roleList, setRoleList] = useState([]);
  const [unitId, setUnitId] = useState('');
  const [tier, setTier] = useState(0);
  const [openKeys, setOpenKeys] = useState([]);
  const access = useAccess();
  const [items, setItems] = useState([]);
@@ -99,7 +100,9 @@
              if (e && e.domEvent) {
                e.domEvent.stopPropagation();
              }
              console.log('item', item);
              setUnitId(item.id);
              setTier(item.tier);
              const values = form.getFieldsValue();
              actionRef.current.reload(values);
            }}
@@ -114,6 +117,8 @@
            if (e && e.domEvent) {
              e.domEvent.stopPropagation();
            }
            console.log('item////////////', item);
            setTier(item.tier);
            setUnitId(item.id);
            const values = form.getFieldsValue();
            actionRef.current.reload(values);
@@ -238,7 +243,6 @@
        2: '区县',
        3: '街道',
        4: '社区',
        5: '党员',
      },
    },
    {
@@ -342,6 +346,7 @@
          initialValues={{ type: 1 }}
          onReset={() => {
            setUnitId('');
            setTier('');
            setOpenKeys([]);
            actionRef.current.reload();
          }}
@@ -393,6 +398,7 @@
            rowKey="id"
            onReset={() => {
              setUnitId('');
              setTier('');
              setOpenKeys([]);
              actionRef.current.reset();
            }}
@@ -411,10 +417,13 @@
            request={(params) => {
              let obj = { ...params };
              if (unitId) {
                obj.departmentId = unitId;
                obj.code = unitId;
              }
              if (params.departmentId) {
                obj.departmentId = params.departmentId[params.departmentId.length - 1];
              // if (params.departmentId) {
              //   obj.departmentId = params.departmentId[params.departmentId.length - 1];
              // }
              if (tier && !params.accountLevel) {
                obj.accountLevel = tier;
              }
              if (form.getFieldValue('type')) {
                obj.type = form.getFieldValue('type');
management/src/pages/statistics/index.jsx
@@ -199,8 +199,17 @@
  const handleSearch = async (values) => {
    setLoading(true);
    let time = '';
    if (dateRange && dateRange.length === 2) {
      time = `${dateRange[0].format('YYYY-MM-DD')} - ${dateRange[1].format('YYYY-MM-DD')}`;
    let range = dateRange;
    if (!range || range.length !== 2) {
      // 没选时间时默认近7天
      const end = moment().endOf('day');
      const start = moment().subtract(6, 'days').startOf('day');
      range = [start, end];
      setDateRange(range);
      form.setFieldsValue({ time: range });
    }
    if (range && range.length === 2) {
      time = `${range[0].format('YYYY-MM-DD')} - ${range[1].format('YYYY-MM-DD')}`;
    }
    const params = {
      cityCode: values.cityCode,
@@ -273,6 +282,17 @@
    });
  }, [adminLevel]);
  useEffect(() => {
    // 页面初始默认近7天
    const end = moment().endOf('day');
    const start = moment().subtract(6, 'days').startOf('day');
    const dates = [start, end];
    setDateRange(dates);
    form.setFieldsValue({ time: dates });
    form.submit();
    // eslint-disable-next-line
  }, []);
  // 处理区县选择
  const handleDistrictChange = async (value) => {
    if (!value) {
@@ -310,7 +330,7 @@
          options={communityOptions} 
          placeholder="请选择社区" 
          fieldNames={{ label: 'name', value: 'communityId' }}
          disabled={adminLevel <= 1 && !form.getFieldValue('districtId')}
          disabled={adminLevel <= 2 && !form.getFieldValue('streetId')}
        />,
      },
    ];
@@ -380,6 +400,12 @@
                  form.resetFields();
                  setStreetOptions([]);
                  setCommunityOptions([]);
                  const end = moment().endOf('day');
                  const start = moment().subtract(6, 'days').startOf('day');
                  const dates = [start, end];
                  setDateRange(dates);
                  form.setFieldsValue({ time: dates });
                  form.submit();
                }}>
                  重置
                </Button>
@@ -480,16 +506,16 @@
              }} 
            />
            <Button onClick={() => {
              const end = moment();
              const start = moment().subtract(7, 'days');
              const end = moment().endOf('day');
              const start = moment().subtract(6, 'days').startOf('day');
              const dates = [start, end];
              setDateRange(dates);
              form.setFieldsValue({ time: dates });
              form.submit();
            }}>近7天</Button>
            <Button onClick={() => {
              const end = moment();
              const start = moment().subtract(30, 'days');
              const end = moment().endOf('day');
              const start = moment().subtract(29, 'days').startOf('day');
              const dates = [start, end];
              setDateRange(dates);
              form.setFieldsValue({ time: dates });