Lou
2024-01-19 581912c1f1d4ea9c7c3847e54309fd4114518668
个人中心新增我的事件
4 files modified
2 files added
869 ■■■■■ changed files
common/setting.js 2 ●●● patch | view | raw | blame | history
pages.json 18 ●●●●● patch | view | raw | blame | history
pages/user/center.vue 7 ●●●●● patch | view | raw | blame | history
subPackage/bs/views/repairList.vue 20 ●●●●● patch | view | raw | blame | history
subPackage/user/event/event.vue 227 ●●●●● patch | view | raw | blame | history
subPackage/workbench/views/reportDetail.vue 595 ●●●●● patch | view | raw | blame | history
common/setting.js
@@ -10,7 +10,7 @@
    version: '2.0.0',
    // 开发环境接口Url
    // devUrl: 'http://z4042833u6.wicp.vip',
    // devUrl: 'http://192.168.0.109:9528',
    // devUrl: 'http://192.168.0.110:9528',
    devUrl: 'https://srgdjczzxtpt.com:2080/api',
    // devUrl: 'https://kt39592615.goho.co',
    minioBaseUrl: "https://srgdjczzxtpt.com:2080/gminio/jczz/",
pages.json
@@ -142,6 +142,15 @@
                        "navigationBarBackgroundColor": "#fff",
                        "navigationBarTextStyle": "black"
                    }
                },
                {
                    "path": "event/event",
                    "style": {
                        "navigationBarTitleText": "我的事件",
                        "enablePullDownRefresh": false,
                        "navigationBarBackgroundColor": "#fff",
                        "navigationBarTextStyle": "black"
                    }
                }
            ]
        },
@@ -475,6 +484,15 @@
                    }
                },
                {
                    "path": "views/reportDetail",
                    "style": {
                        "navigationBarTitleText": "报事报修详情",
                        "enablePullDownRefresh": false,
                        "navigationBarBackgroundColor": "#fff",
                        "navigationBarTextStyle": "black"
                    }
                },
                {
                    "path": "views/hotelReportDetail",
                    "style": {
                        "navigationBarTitleText": "审核",
pages/user/center.vue
@@ -41,9 +41,16 @@
                <u-cell title="切换角色" isLink url="/subPackage/user/role/index">
                    <image slot="icon" src="/static/icon/menu-center-02.png" class="icon" mode=""></image>
                </u-cell>
                <u-cell v-if="siteInfo.addressType == 1" title="我的事件" isLink url="/subPackage/bs/views/repairList">
                    <image slot="icon" src="/static/icon/menu-center-01.png" class="icon" mode=""></image>
                </u-cell>
                <u-cell v-if="siteInfo.addressType == 2" title="我的事件" isLink url="/subPackage/user/event/event">
                    <image slot="icon" src="/static/icon/menu-center-01.png" class="icon" mode=""></image>
                </u-cell>
                <u-cell title="修改密码" :border="false" isLink url="/subPackage/user/password/index">
                    <image slot="icon" src="/static/icon/menu-center-03.png" class="icon" mode=""></image>
                </u-cell>
            </u-cell-group>
        </view>
        <view class="cell-box" v-if="isLogin">
subPackage/bs/views/repairList.vue
@@ -19,7 +19,7 @@
            </view>
        </view> -->
        <z-paging ref="paging" v-model="dataList" @query="queryList" :refresher-enabled="false"
            loading-more-no-more-text="没有更多了"   :hide-empty-view="true">
            loading-more-no-more-text="没有更多了" :hide-empty-view="true">
            <view class="list">
                <view class="list-item bgc-ff mb-20" v-for="item in dataList" :key="item.id" @click="pushPage(item)">
                    <view class="item-title flex a-i-c j-c-s-b mb-20">
@@ -103,8 +103,8 @@
                        status: 3,
                        type: 'error'
                    },
                ]
                ],
                repairType: ""
            }
        },
@@ -120,11 +120,15 @@
            }
        },
        onLoad(option) {
            uni.setNavigationBarTitle({
                title: option.title
            })
            // this.query.type = option.type
            this.repairType = option.type;
            if (option.type) {
                uni.setNavigationBarTitle({
                    title: option.title
                })
                this.repairType = option.type;
            }
            // this.getList()
        },
        // onReachBottom() {
@@ -148,7 +152,7 @@
                    }
                }
            },
            queryList(pageNo, pageSize) {
                getPage({
                    current: pageNo,
subPackage/user/event/event.vue
New file
@@ -0,0 +1,227 @@
<template>
    <view class="">
        <z-paging ref="paging" v-model="list" @query="queryList" :refresher-enabled="false"
            loading-more-no-more-text="没有更多了">
            <view class="bgc-ff" slot="top">
                <u-tabs :list="tabList" :current="tabIndex" @click="changeTab" :inactiveStyle="{color:'#999999'}"
                    :activeStyle="{color:'#017BFC'}" :scrollable="false">
                </u-tabs>
            </view>
            <view class="list" v-if="tabIndex == 0">
                <view class="list-item bgc-ff mb-20" v-for="item in list" :key="item.id" @click="pushPage(item)">
                    <view class="item-title flex a-i-c j-c-s-b mb-20">
                        <text class="f-32 fw">{{getRepairType(item.type)}}</text>
                        <u-tag v-if="item.status == 1" text="待处理" type="warning" plain plainFill></u-tag>
                        <u-tag v-if="item.status == 2" text="处理中" type="success" plain plainFill></u-tag>
                        <u-tag v-if="item.status == 3" text="已处理" type="success" plain plainFill></u-tag>
                    </view>
                    <view class="item-row flex a-i-c j-c-s-b">
                        <text class="f-28">时间</text>
                        <text class="f-28 c-66">{{ item.createTime }}</text>
                    </view>
                    <view class="item-row flex a-i-c j-c-s-b">
                        <text class="f-28">描述</text>
                        <text class="address f-28 c-66">{{ item.remark}}</text>
                    </view>
                </view>
            </view>
            <view class="list" v-if="tabIndex == 1">
                <view class="list-item bgc-ff mb-20" v-for="(i,k) in list" :key="k"
                    @click="navTo(i.id,i.reportType,i.status)">
                    <view class="item-title flex a-i-c j-c-s-b mb-20">
                        <text class="f-32 fw">{{i.name}}</text>
                        <u-tag v-if="i.status == 4" text="待接收" type="warning" plain plainFill></u-tag>
                        <u-tag v-if="i.status == 1" text="待审批" type="warning" plain plainFill></u-tag>
                        <u-tag v-if="i.status == 2" text="审核通过" type="success" plain plainFill></u-tag>
                        <u-tag v-if="i.status == 3" text="审核拒绝" type="error" plain plainFill></u-tag>
                    </view>
                    <view class="item-row flex a-i-c j-c-s-b">
                        <text class="f-28">时间</text>
                        <text class="f-28 c-66">{{i.createTime}}</text>
                    </view>
                    <view class="item-row flex a-i-c j-c-s-b">
                        <text class="f-28">地址</text>
                        <text class="address f-28 c-66">{{i.addressName || ""}}</text>
                    </view>
                </view>
            </view>
        </z-paging>
    </view>
</template>
<script>
    import {
        getPage
    } from '@/api/task/taskReportForRepairs'
    import {
        getAuditReportingList
    } from "@/api/reporting/reporting"
    export default {
        data() {
            return {
                tabList: [
                    {
                        name: "公共报事"
                    },
                    {
                        name: "标签事件"
                    },
                ],
                typeList: [{
                        name: "公共维修",
                        type: 1
                    },
                    {
                        name: "居家维修",
                        type: 2
                    },
                    {
                        name: "矛盾纠纷",
                        type: 3
                    },
                    {
                        name: "投诉举报",
                        type: 4
                    },
                    {
                        name: "企业商户上报",
                        type: 5
                    }
                ],
                tabIndex: 0,
                list: []
            }
        },
        methods: {
            getRepairType(val, key) {
                for (let i of this.typeList) {
                    if (i.type == val) {
                        return i.name
                    }
                }
            },
            changeTab(e) {
                this.tabIndex = e.index;
                this.$refs.paging.reload()
            },
            queryList(pageNo, pageSize) {
                if (this.tabIndex == 0) {
                    this.getRepairList(pageNo, pageSize)
                } else {
                    this.getReportList(pageNo, pageSize)
                }
            },
            //标签事件列表
            getReportList(page, size) {
                getAuditReportingList({
                    page: page,
                    size: size,
                    status: "",
                    houseCode: uni.getStorageSync("siteInfo").houseCode
                }).then(res => {
                    this.$refs.paging.complete(res.data.records);
                })
            },
            //公共报事列表
            getRepairList(page, size) {
                getPage({
                    current: page,
                    size: size,
                    createUser: uni.getStorageSync("userInfo").user_id,
                    type: ""
                }).then(res => {
                    this.$refs.paging.complete(res.data.records);
                })
            },
            navTo(id, type, status) {
                if (status == 4) {
                    if (uni.getStorageSync("activeRole").roleName == "民警") {
                        this.navToDetail(type, id)
                    } else {
                        this.navToEdit(type, id);
                    }
                } else {
                    this.navToDetail(type, id)
                }
            },
            navToEdit(type, id) {
                if (type == 1) {
                    this.$u.func.globalNavigator(`/subPackage/label/bail?id=${id}`)
                } else if (type == 2) {
                    this.$u.func.globalNavigator(`/subPackage/label/hotel?id=${id}`)
                } else if (type == 3 || type == 4 || type == 5) {
                    this.$u.func.globalNavigator(`/subPackage/label/form?id=${id}`)
                } else if (type == 6) {
                    this.$u.func.globalNavigator(`/subPackage/label/school?id=${id}`)
                }
            },
            navToDetail(type, id) {
                if (type == 1) {
                    this.$u.func.globalNavigator(`/subPackage/workbench/views/bailReportDetail?id=${id}`)
                } else if (type == 2) {
                    this.$u.func.globalNavigator(`/subPackage/workbench/views/hotelReportDetail?id=${id}`)
                } else if (type == 3 || type == 4 || type == 5) {
                    this.$u.func.globalNavigator(`/subPackage/workbench/views/labelReportDetail?id=${id}`)
                } else if (type == 6) {
                    this.$u.func.globalNavigator(`/subPackage/workbench/views/schoolReportDetail?id=${id}`)
                }
            },
            pushPage(item) {
                const data = JSON.stringify(item)
                // this.$u.func.globalNavigator('/subPackage/workbench/views/reportAudit?id='+id)
                this.$u.func.globalNavigator(`/subPackage/workbench/views/reportDetail?data=${data}&from=record`)
            }
        }
    }
</script>
<style lang="scss">
    page {
        background-color: #F5F5F5;
    }
    .list {
        margin: 20rpx 30rpx 0;
    }
    .list-item {
        padding: 0 30rpx 20rpx;
        border-radius: 8rpx;
        .item-title {
            padding: 30rpx 0;
            border-bottom: 1px solid #F5F5F5;
        }
        .item-row {
            padding: 10rpx 0;
            .address {
                width: 75%;
                text-align: right;
            }
        }
    }
</style>
subPackage/workbench/views/reportDetail.vue
New file
@@ -0,0 +1,595 @@
<template>
    <view class="container">
        <view class="basic-box">
            <!-- <view class="title-box">
                <view class="line"></view>
                <view class="text">基本信息</view>
            </view> -->
            <caption-row title="基本信息" />
            <view class="basic-data">
                <lineItem :dataInfo="basicData"></lineItem>
            </view>
        </view>
        <view class="pic-box" v-if="imgUrls.length">
            <!-- <view class="title-box">
                <view class="line"></view>
                <view class="text">事件照片</view>
            </view> -->
            <caption-row title="事件照片" />
            <view class="pic-data">
                <view class="mr-20 " v-for="(i,k) in imgUrls" :key="k">
                    <u-image class="img" :src="i" width="80" height="80" @click="previewImg(i)"></u-image>
                </view>
            </view>
        </view>
        <view class="audit-box">
            <!-- <view class="title-box">
                <view class="line"></view>
                <view class="text">审核信息</view>
            </view> -->
            <caption-row title="审核信息" />
            <view class="step">
                <view class="step-list " v-for="i in defaultData.taskRepairStepList"
                    v-if="defaultData.taskRepairStepList.length">
                    <view class="flex j-c-s-b a-i-c mb-10">
                        <text class="f-30 fw">{{i.peopleType ==1?"转办":"已处理"}}</text>
                        <text class="f-26 c-99">{{i.createTime}} </text>
                    </view>
                    <view class="f-28">{{i.content}}</view>
                </view>
            </view>
            <view class="audit-form" v-if="defaultData.confirmFlag == 1">
                <u-form labelWidth="70" :model="form" class="form" ref="form">
                    <u-form-item label="事件状态" @click="showPicker" class="form-item">
                        <!-- <u--input v-model="form.confirmFlag" disabled disabledColor="#ffffff" placeholder="请选择审核状态"
                            border="none" :placeholder="defaultPlaceholder"  inputAlign="right"  color="#333"></u--input>
                        <u-icon slot="right" name="arrow-right"  v-show="from == 'list'"></u-icon> -->
                        <view class="stauts">
                            待处理
                        </view>
                    </u-form-item>
                    <u-form-item label="处理情况" class="form-item"
                        v-if="from == 'list' || (from == 'record' && form.confirmNotion)">
                        <u--input v-model="form.confirmNotion" :border="from == 'list'?'surround':'none'"
                            inputAlign="right" color="#333" :disabled="from == 'record'?true:false"></u--input>
                    </u-form-item>
                </u-form>
            </view>
        </view>
        <view class="upload bgc-ff" v-if="form.imageList.length">
            <view class="f-28">图片</view>
            <view class="mt-20">
                <u-upload :fileList="form.imageList" :previewFullImage="uploadConfig.previewFullImage"
                    :accept="uploadConfig.acceptImg" :multiple="uploadConfig.multiple" :maxCount="form.imageList.length"
                    :capture="uploadConfig.capture" :deletable="false" @afterRead="afterReadImg($event,'imageList')"
                    @delete="deletePics($event,'imageList')">
                    <view class="upload-item upload-icon flex_base">
                        <u-icon name="/static/icon/upload.png" width="60rpx" height="60rpx"></u-icon>
                    </view>
                </u-upload>
            </view>
        </view>
        <view class="upload bgc-ff" v-if="form.videoList.length">
            <view class="f-28">视频</view>
            <view class="mt-20">
                <u-upload :fileList="form.videoList" :previewFullImage="uploadConfig.previewFullImage"
                    :accept="uploadConfig.acceptVideo" :multiple="uploadConfig.multiple"
                    :maxCount="form.videoList.length" :capture="uploadConfig.capture" :deletable="false"
                    @afterRead="afterReadImg($event,'videoList')" @delete="deletePics($event,'videoList')">
                    <view class="upload-item upload-icon flex_base">
                        <u-icon name="/static/icon/upload.png" width="60rpx" height="60rpx"></u-icon>
                    </view>
                </u-upload>
            </view>
        </view>
        <!-- <view class="bottom"  v-if="from == 'list'">
            <u-button type="primary" @click="submit">提交处理</u-button>
        </view> -->
        <!-- <footer-btn  @click="submit"  v-if="from == 'list'"></footer-btn> -->
        <!--     <view class="footer flex a-i-c j-c-s-b" v-if="from == 'list' && confirmFlag == 1">
            <button class="footer-btn" @click="submit(0)">处置</button>
            <button class="footer-btn" @click="submit(1)">转办</button>
        </view> -->
        <u-picker :defaultIndex="[defaultColums]" :closeOnClickOverlay="true" @close="isPickerShow = false"
            :show="isPickerShow" ref="uPicker" :columns="columns" keyName="name" @cancel="isPickerShow = false"
            @confirm="handleConfirm"></u-picker>
        <u-picker :defaultIndex="peopleIndex" :closeOnClickOverlay="true" @close="isShowPeoplePicker = false"
            :show="isShowPeoplePicker" ref="pPicker" :columns="peopleList" keyName="name"
            @cancel="isShowPeoplePicker = false" @confirm="handlePeopleConfirm" @change="changePeople"></u-picker>
    </view>
</template>
<script>
    import lineItem from '../components/lineItem.vue'
    import captionRow from '@/components/caption/caption.vue'
    import {
        checkReportForRepairsData,
        reportSave
    } from '@/api/task/taskReportForRepairs.js'
    import {
        getPeopleType
    } from '@/api/user.js'
    import {
        minioBaseUrl
    } from "@/common/setting.js"
    import uploadMixin from "@/mixin/uploadMixin";
    export default {
        mixins: [uploadMixin],
        components: {
            captionRow,
            lineItem
        },
        data() {
            return {
                basicData: [{
                        label: '事发地',
                        name: 'address',
                        value: '未完善'
                    },
                    {
                        label: '姓名',
                        name: 'realName',
                        value: '未完善'
                    },
                    {
                        label: '手机号码',
                        name: 'phone',
                        value: '未完善'
                    },
                    {
                        label: '事件类型',
                        name: 'type',
                        value: '未完善'
                    },
                    {
                        label: '事件描述',
                        name: 'remark',
                        value: '未完善'
                    },
                    {
                        label: '提交时间',
                        name: 'createTime',
                        value: '未完善'
                    }
                ],
                typeList: [{
                        name: "公共维修",
                        type: 1
                    },
                    {
                        name: "居家维修",
                        type: 2
                    },
                    {
                        name: "矛盾纠纷",
                        type: 3
                    },
                    {
                        name: "投诉举报",
                        type: 4
                    },
                    {
                        name: "企业商户上报",
                        type: 5
                    }
                ],
                form: {
                    confirmFlag: '',
                    confirmNotion: '',
                    imageList: [],
                    videoList: []
                },
                defaultPlaceholder: "",
                defaultColums: 0,
                imgUrls: [],
                currentId: '',
                defaultData: {
                    taskRepairStepList: []
                },
                isPickerShow: false,
                columns: [
                    [{
                            name: "待处理",
                            status: 1
                        },
                        {
                            name: "处理中",
                            status: 2
                        },
                        {
                            name: "已处理",
                            status: 3
                        },
                    ]
                ],
                from: "list",
                peopleList: [
                    [{
                            name: "网格员",
                            type: 0
                        },
                        {
                            name: "物业人员",
                            type: 2
                        }
                    ],
                    []
                ],
                peopleIndex: [0, 0],
                isShowPeoplePicker: false,
                transferUserId: "",
                content: "",
                confirmFlag: ""
            }
        },
        onLoad(option) {
            // const { id } = option
            // this.currentId = id
            if (option.from) {
                this.from = option.from;
            }
            let data = JSON.parse(option.data)
            this.defaultData = data;
            this.confirmFlag = data.confirmFlag;
            if (data.confirmFlag == 3 && data.taskRepairStepList.length) {
                let {
                    imageList,
                    videoList
                } = data.taskRepairStepList[data.taskRepairStepList.length - 1];
                this.form.imageList = this.$setImageUrl(imageList, 2)
                this.form.videoList = this.$setImageUrl(videoList, 2)
            }
            this.getPeopleList(0)
        },
        onShow() {
            this.setDefaultValue()
        },
        methods: {
            getPeopleList(type) {
                getPeopleType({
                    houseCode: this.defaultData.addressCode,
                    type
                }).then(res => {
                    console.log(res);
                    this.$set(this.peopleList, 1, res.data);
                })
            },
            showPicker() {
                if (this.from == "list") {
                    this.isPickerShow = true;
                }
            },
            setImgUrl(url) {
                return `${minioBaseUrl}${url}`
            },
            async checkReportForRepairs() {
                const {
                    confirmFlag,
                    confirmNotion
                } = this.form
                if (!confirmNotion) {
                    uni.showToast({
                        title: "请输入处理情况",
                        icon: "none"
                    })
                    return;
                }
                const res = await checkReportForRepairsData({
                    // id: this.currentId,
                    id: this.defaultData.id,
                    // confirmFlag: this.findObjValue(confirmFlag, this.columns[0], 'name').status,
                    confirmFlag: 3,
                    confirmNotion
                })
                if (res.code !== 200) {
                    uni.showToast({
                        title: "提交处理失败",
                        icon: "error"
                    })
                    return
                }
                uni.showToast({
                    title: "处理事件成功",
                    icon: "success",
                    duration: 1500,
                    complete() {
                        setTimeout(() => {
                            uni.navigateBack()
                        }, 1500)
                    }
                })
            },
            setDefaultValue() {
                console.log(this.defaultData);
                this.basicData.forEach(item => {
                    item.value = this.defaultData[item.name] || '未完善'
                    if (item.name === 'type') {
                        item.value = this.findObjValue(item.value, this.typeList, 'type').name || '未完善'
                    }
                })
                this.imgUrls = this.$setImageUrl(this.defaultData.imageUrls);
                //if(this.defaultData.imageUrls){
                // let list = this.defaultData.imageUrls.split(",")
                // let arr = []
                // for(let i of list){
                //     arr.push(`${minioBaseUrl}${i}`);
                // }
                //}
                let columns = this.columns[0]
                this.defaultColums = columns.findIndex(item => item.status == this.defaultData.confirmFlag)
                this.defaultPlaceholder = columns[this.defaultColums].name
            },
            submit(type) {
                if (type == 1) {
                    this.isShowPeoplePicker = true;
                } else {
                    if (!this.form.confirmNotion) {
                        uni.showToast({
                            title: "请输入处理情况",
                            icon: "none"
                        })
                        return;
                    }
                    let data = {
                        confirmFlag: 3,
                        content: this.form.confirmNotion,
                        imageList: this.getFileName(this.form.imageList),
                        mobile: this.defaultData.mobile,
                        peopleType: 0,
                        repairId: this.defaultData.id,
                        videoList: this.getFileName(this.form.videoList)
                    }
                    this.submitRequest(data)
                }
                // this.checkReportForRepairs()
            },
            getFileName(urls) {
                if (urls.length) {
                    let arr = [];
                    for (let i of urls) {
                        arr.push(i.name);
                    }
                    return arr.join(",");
                } else {
                    return ""
                }
            },
            submitRequest(data) {
                reportSave(data).then(res => {
                    if (res.code == 200) {
                        uni.showToast({
                            title: "操作成功"
                        })
                        uni.navigateBack()
                    }
                })
            },
            handleConfirm(e) {
                this.form.confirmFlag = e.value[0].name
                this.isPickerShow = false
            },
            findObjValue(value, obj, word) {
                const res = obj.find(item => {
                    return item[word] == value
                })
                return res
            },
            previewImg(url) {
                uni.previewImage({
                    urls: this.imgUrls,
                    current: url
                })
            },
            changePeople(e) {
                console.log(e);
                const {
                    columnIndex,
                    value,
                    values, // values为当前变化列的数组内容
                    index,
                    // 微信小程序无法将picker实例传出来,只能通过ref操作
                    picker = this.$refs.pPicker
                } = e
                if (columnIndex === 0) {
                    // picker为选择器this实例,变化第二列对应的选项
                    // picker.setColumnValues(1, this.columnData[index])
                    this.getPeopleList(value[0].type)
                }
            },
            handlePeopleConfirm(e) {
                console.log(e)
                let {
                    value,
                    indexs
                } = e;
                this.transferUserId = value[1].id
                this.peopleIndex = indexs;
                // this.content = `事件已移交至${value[0].distictName}${value[1].distictName}`
                let data = {
                    addressCode: this.defaultData.addressCode,
                    confirmFlag: 1,
                    content: `事件已移交至${value[0].name}${value[1].name}`,
                    peopleType: 1,
                    repairId: this.defaultData.id,
                    transferUserId: value[1].id
                }
                console.log(data);
                this.submitRequest(data)
            },
        }
    }
</script>
<style lang="scss" scoped>
    page {
        background-color: #f6f6f6;
    }
    .container {
        padding: 0 20rpx 150rpx;
        .basic-box,
        .pic-box,
        .audit-box,
        .bottom {
            background-color: #fff;
            padding: 20rpx;
        }
        .pic-box {
            // margin-top: 20rpx;
            .pic-data {
                padding: 0 20rpx;
                display: flex;
                flex-wrap: wrap;
                margin-top: 20rpx;
            }
        }
        .audit-box {
            // margin-top: 20rpx;
            .audit-form {
                padding: 0 20rpx;
                .form {
                    font-size: 30rpx;
                    .form-item {
                        padding: 0 20rpx;
                        &:first-child {
                            border-bottom: 1rpx solid #f6f6ff;
                        }
                    }
                }
            }
        }
        .bottom {
            position: fixed;
            left: 0;
            bottom: 0;
            width: calc(100% - 40rpx);
            border-top: 1rpx solid #f6f6f6;
        }
        .title-box {
            display: flex;
            align-items: center;
            font-size: 30rpx;
            .line {
                width: 6rpx;
                height: 30rpx;
                margin-right: 10rpx;
                background-color: #017BFC;
            }
            .text {
                font-weight: 700;
            }
        }
    }
    /deep/ .u-form-item__body__left__content__label,
    /deep/ .uni-input-placeholder {
        font-size: 30rpx;
    }
    .footer {
        width: 100%;
        padding: 20rpx 30rpx;
        box-sizing: border-box;
        position: fixed;
        bottom: 0;
        left: 0;
        background-color: #fff;
        z-index: 10;
        padding-bottom: calc(env(safe-area-inset-bottom) + 20rpx);
        z-index: 999;
        background-color: #fff;
        box-shadow: 0rpx 0rpx 10rpx 1rpx rgba(0, 0, 0, 0.1);
        .footer-btn {
            width: 300rpx;
            height: 78rpx;
            border-radius: 8rpx;
            font-size: 32rpx;
            color: #fff;
            border: none;
            background: linear-gradient(163deg, #01BDFC 0%, #017BFC 100%);
        }
        .footer-btn:after {
            border: none;
        }
    }
    .upload {
        margin: 0 30rpx;
        padding: 30rpx;
        .upload-item {
            width: 140rpx;
            height: 140rpx;
            border: 1px solid #EEEEEE;
        }
    }
    .step {
        margin-top: 20rpx;
        padding: 0 20rpx;
    }
    .step-list {
        padding: 15rpx 0;
    }
    .status {
        flex: 1;
        text-align: right;
    }
</style>