xuxueyang
2024-08-26 ed5d47ad987f2a20f33fbd5cc64dbcdb208f5e15
add 意见反馈
已修改6个文件
已添加1个文件
561 ■■■■■ 文件已修改
common/global.scss 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
environments/index.js 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages.json 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/user/supplier-user.vue 26 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sub_pages/customer/self/feedback-detail.vue 251 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sub_pages/customer/self/feedback.vue 214 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sub_pages/partner/delivery/delivery-detail.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
common/global.scss
@@ -153,6 +153,52 @@
    padding-right: 0rpx;
    line-height: 40rpx;
}
.component-buttons{
    display: flex;
    margin-left: auto;
    width: fit-content;
    .button {
        // width: 216rpx;
        padding: 10rpx 20rpx;
        line-height: 34rpx;
        font-size: 24rpx;
        height: 34rpx;
        background: #20613D;
        text-align: center;
        border-radius: 30rpx;
        min-width: 80rpx;
    }
    .button-1 {
        padding: 10rpx 20rpx;
        line-height: 34rpx;
        font-size: 24rpx;
        height: 34rpx;
        background: #20613D;
        text-align: center;
        border-radius: 30rpx;
        min-width: 80rpx;
        background: #fff;
        color: #333;
        border: 2rpx solid #333;
    }
    .button-0 {
        padding: 10rpx 20rpx;
        line-height: 34rpx;
        font-size: 24rpx;
        height: 34rpx;
        background: #20613D;
        text-align: center;
        border-radius: 30rpx;
        min-width: 80rpx;
        color: #fff;
        border: 2rpx solid #20613D;
    }
}
.component-button-contact::after{
    display: none !important;
}
environments/index.js
@@ -8,4 +8,3 @@
    tenantId: '',
    type: 'dev'
}
pages.json
@@ -410,14 +410,19 @@
                        "navigationBarTitleText": "我的收藏",
                        "enablePullDownRefresh": true
                    }
                },
                ,
                {
                    "path": "self/feedback",
                    "style": {
                        "navigationBarTitleText": "投诉反馈",
                        "enablePullDownRefresh": true
                    }
                },
                {
                    "path": "self/feedback",
                    "style": {
                        "navigationBarTitleText": "投诉反馈",
                        "enablePullDownRefresh": true
                    }
                },
                {
                    "path": "self/feedback-detail",
                    "style": {
                        "navigationBarTitleText": "投诉反馈"
                    }
                }
                // #endif
            ]
pages/user/supplier-user.vue
@@ -100,14 +100,16 @@
                        <view>待付款</view>
                    </view>
                    <view class="order-icons" @click="goto('/pages/order/order?status=SEND',true)">
                        <image src="../../static/images/customer/order/order-type-2.png" class="order-icon dfh" style="position: relative;">
                        <image src="../../static/images/customer/order/order-type-2.png" class="order-icon dfh"
                            style="position: relative;">
                            <view class="image-shop-number" v-if="tj_order.sendCount">{{tj_order.sendCount||''}}</view>
                        </image>
                        <view>待发货</view>
                    </view>
                    <view class="order-icons" @click="goto('/pages/order/order?status=RECEIVE',true)">
                        <image src="../../static/images/customer/order/order-type-3.png" class="order-icon dsh" style="position: relative;">
                        <image src="../../static/images/customer/order/order-type-3.png" class="order-icon dsh"
                            style="position: relative;">
                            <view class="image-shop-number" v-if="tj_order.receiveCount">{{tj_order.receiveCount||''}}
                            </view>
@@ -115,7 +117,8 @@
                        <view>待收货</view>
                    </view>
                    <view class="order-icons" @click="goto('/pages/order/order?status=EVALUATE',true)">
                        <image src="../../static/images/customer/order/order-type-4.png" class="order-icon dpj" style="position: relative;">
                        <image src="../../static/images/customer/order/order-type-4.png" class="order-icon dpj"
                            style="position: relative;">
                            <view class="image-shop-number" v-if="tj_order.evaluateCount">{{tj_order.evaluateCount||''}}
                            </view>
@@ -123,9 +126,11 @@
                        <view>待评价</view>
                    </view>
                    <view class="order-icons" @click="goto('/pages/order/order-sale/order-sale',true)">
                        <image src="../../static/images/customer/order/order-type-5.png" class="order-icon sh" style="position: relative;">
                        <image src="../../static/images/customer/order/order-type-5.png" class="order-icon sh"
                            style="position: relative;">
                            <view class="image-shop-number" v-if="tj_order.salesPendingCount">
                                {{tj_order.salesPendingCount||''}}</view>
                                {{tj_order.salesPendingCount||''}}
                            </view>
                        </image>
                        <view>售后</view>
@@ -251,6 +256,13 @@
                    <uni-icons type="right"></uni-icons>
                </view>
            </view>
            <view class="user-util m-t-12 flex" @click="goto('/sub_pages/customer/self/feedback',true)">
                <view class="title">投诉反馈</view>
                <view class="right-icon">
                    <uni-icons type="right"></uni-icons>
                </view>
            </view>
            <!-- v-if="selftype==='customer'" -->
            <view class="user-util m-t-12 flex" @click="clearlogout">
                <view class="title">退出登录</view>
@@ -259,6 +271,10 @@
                </view>
            </view>
            <view class="user-util m-t-12 " v-if="selftype==='supplier'||selftype==='customer' || !selftype">
                <view class="title">我的客服</view>
                <view class="flex flex-wrap-normal">
sub_pages/customer/self/feedback-detail.vue
对比新文件
@@ -0,0 +1,251 @@
<script>
    export default {
        data() {
            return {
                dto: {
                    id: '',
                    feedBack: '',
                    createTime: '',
                    reply: '',
                    replyTime: '',
                    type: '',
                    pictures: [],
                },
                id: '',
            };
        },
        async onLoad(options) {
            this.id = options.id || ''
            await this.init()
        },
        methods: {
            async init() {
                this.$message.showLoading()
                const {
                    data
                } = await this.$http.request('get', '/api/feedback/page/view?id=' + this.id, {})
                this.$message.hideLoading()
                if (data) {
                    var t = data || {}
                    if (!t.pictures) {
                        t.pictures = []
                    } else {
                        try {
                            t.pictures = JSON.parse(t.pictures) || []
                        } catch (e) {
                            console.log('parse arriveImages', e)
                        }
                    }
                    this.dto = {
                        ...this.dto,
                        ...t
                    }
                }
            },
        }
    }
</script>
<template>
    <view class="delivery-detail-page bg-white p20">
        <view v-if="dto.id">
            <view class="delivery-info flex">
                <view class="flex1 desc">
                    <view class="name">投诉反馈类型:{{ dto.typeStr || dto.type  || '-'}}</view>
                    <view class="name">投诉反馈内容:{{ dto.feedBack  || '-'}}</view>
                    <view class="name">提交时间:{{ dto.createTime || '-' }}</view>
                    <view class="line-gray"></view>
                    <view class="name">回复内容:{{ dto.reply  || '-'}}</view>
                    <view class="name">回复时间:{{ dto.replyTime || '-' }}</view>
                </view>
            </view>
        </view>
        <view class="m-t-12 flex" v-if="dto.pictures&&dto.pictures.length>0">
            <view class="m-l-15 m-r-0 station">
                <view>投诉反馈图片</view>
            </view>
            <view class="m-t-12 m-r-10 " v-for="(timg,index) of dto.pictures" :key="index">
                <image class="arrive-img" :src="timg" @click.stop="previewImg(timg)">
                </image>
            </view>
        </view>
    </view>
    </view>
</template>
<style lang="scss" scoped>
    .delivery-detail-page {
        .arrive-img {
            width: 96rpx;
            height: 96rpx;
            border-radius: 4rpx;
            border: 2rpx dashed #CECECE;
        }
        .delivery-order-item {
            .title {
                font-weight: 600;
                font-size: 28rpx;
                color: #000000;
                line-height: 40rpx;
                .level {
                    font-weight: 400;
                    font-size: 28rpx;
                    color: #20613D;
                    line-height: 40rpx;
                    margin-left: 20rpx;
                }
            }
            .buttons {
                display: flex;
                .button {
                    margin: 0 auto;
                    width: 98rpx;
                    line-height: 48rpx;
                    border-radius: 24rpx;
                    border: 2rpx solid #CECECE;
                    text-align: center;
                    font-size: 24rpx;
                    color: #666666;
                    line-height: 34rpx;
                }
                .button-0 {
                    color: #fff;
                    border: 2rpx solid #20613D;
                    background: #20613D;
                }
            }
            .flower-img {
                width: 128rpx;
                height: 118rpx;
                min-width: 128rpx;
                min-height: 118rpx;
            }
            .each-list {
                display: flex;
                flex-wrap: wrap;
                margin-top: 6rpx;
                .each-item {
                    min-width: 30%;
                    max-width: 40%;
                    text-align: center;
                    margin-left: 0rpx;
                    margin-right: auto;
                    display: flex;
                    .label {
                        font-weight: 400;
                        font-size: 24rpx;
                        color: #666666;
                        text-align: left;
                        padding-right: 10rpx;
                    }
                    .label::after {
                        content: ": "
                    }
                    .value {
                        font-weight: 400;
                        font-size: 24rpx;
                        color: #666666;
                    }
                }
            }
        }
        .popup-check-form {
            background: #FFFFFF;
            border-radius: 16rpx;
            // width: 690rpx;
            height: 882rpx;
            margin-top: 120rpx;
            margin-left: 30rpx;
            margin-right: 30rpx;
            padding: 24rpx 36rpx;
            .check-img {
                width: 96rpx;
                height: 96rpx;
                border-radius: 4rpx;
                border: 2rpx dashed #CECECE;
            }
            .submit {
                margin-top: 30rpx;
                .form-input {
                    height: 36rpx;
                    line-height: 36rpx;
                }
                .value-item {
                    min-width: 152rpx;
                    width: fit-content;
                    text-align: center;
                    height: 58rpx;
                    background: #F1F5F2;
                    border-radius: 36rpx;
                    margin-bottom: 18rpx;
                    font-weight: 400;
                    font-size: 28rpx;
                    line-height: 58rpx;
                    padding: 8rpx 24rpx;
                    color: #33a868;
                    margin-left: 16rpx;
                    margin-right: 16rpx;
                    border: 2rpx solid #F1F5F2;
                }
                .value-item.cur {
                    background: #E1F0E7;
                    border-radius: 36rpx;
                    border: 2rpx solid #20613D;
                    color: #20613D;
                }
            }
        }
        .delivery-info {
            padding: 20rpx;
            .desc {
                font-weight: 400;
                font-size: 28rpx;
                color: #666666;
                line-height: 40rpx;
            }
            .station {
                height: 50rpx;
                background: #C6E8D4;
                border-radius: 4rpx;
                padding-left: 20rpx;
                padding-right: 20rpx;
                min-width: 110rpx;
                line-height: 50rpx;
            }
        }
    }
</style>
sub_pages/customer/self/feedback.vue
@@ -13,6 +13,10 @@
                    <view class="name">回复内容:{{ item.reply  || '-'}}</view>
                    <view class="name">回复时间:{{ item.replyTime || '-' }}</view>
                </view>
                <view class="line-gray"></view>
                <view class="component-buttons">
                    <view class="button-1" @click="toDetail(item)">查看详情</view>
                </view>
            </view>
        </view>
        <footer-msg :more="page.total>0&&page.total>page.current*page.size&&list.length>0"></footer-msg>
@@ -25,30 +29,65 @@
        </view>
        <!-- <uni-popup ref="popup" type="bottom">
        <uni-popup ref="popup" type="bottom">
            <view class="component-popup_input_all">
                <view class="text-center m-b-40" style="font-size: 48rpx;font-weight: 600;">填写投诉/反馈内容</view>
                <view v-for="(item,i) in level_columns" :key="i" class="m-t-20">
                    <view class="m-t-12 flex value-items">
                        <view class="value-item" @click="()=>{
                        if(each.value!==query.value){
                            query.level = each.value
                            query.levelStr = each.label
                            refreshList()
                            $refs.popup.close()
                        }
                    }" :class="[query.level==each.value?'cur':'']" v-for="(each, j) in item" :key="j">
                            {{ each.label || '-' }}
                <view class="close-parent">
                    填写投诉/反馈内容
                    <uni-icons class="close" type="closeempty" @click="$refs.popup.close()"></uni-icons>
                </view>
                <view class="submit form">
                    <view class="form-item" style="height: unset;">
                        <view class="form-item-label require" style="min-width: 120rpx;margin-right: 10rpx;">
                            类型
                        </view>
                        <view class="form-item-value flex value-items">
                            <view class="value-item" @click="()=>{
                                    if(submitForm.type!==each.value){
                                        submitForm.type = each.value
                                    }
                                }" :class="[submitForm.type==each.value?'cur':'']" v-for="(each, j) in type_columns" :key="j">
                                {{ each.label || '-' }}
                            </view>
                        </view>
                    </view>
                    <view class="form-item">
                        <view class="form-item-label require">
                            内容
                        </view>
                        <view class="form-item-value">
                            <input v-model="submitForm.feedBack" placeholder="填写投诉/反馈内容" class="form-input"></input>
                        </view>
                    </view>
                    <view class="form-item">
                        <view class="form-item-label require">
                            图片
                        </view>
                        <view class="form-item-value m-l-a m-r-0">
                            <view class="t-red" @click="uploadCheckImage()">上传</view>
                        </view>
                    </view>
                    <view class="flex p20" v-if="submitForm.pictures&&submitForm.pictures.length>0">
                        <view class="m-t-12 m-r-10 " v-for="(timg,index) of submitForm.pictures" :key="index">
                            <image class="check-img" :src="timg" @click.stop="previewImg(timg)">
                            </image>
                            <view class="t-red text-center" @click.stop="deleteCheckImage(index)">删除</view>
                        </view>
                    </view>
                </view>
                <view class="button-space"></view>
                <view>
                    <view class="button-green" @click="$refs.popup.close()">关闭
                    </view>
                <!-- <view class="line-gray"></view> -->
                <view class="component-buttons m-t-20" style="width: unset;">
                    <view class="button-1 m-auto" @click="$refs.popup.close()">关闭</view>
                    <view class="button-0 m-auto" @click="submit">提交</view>
                </view>
            </view>
        </uni-popup> -->
        </uni-popup>
    </view>
</template>
@@ -56,7 +95,10 @@
<script>
    export default {
        data() {
            return {}
            return {
                submitForm: {},
                type_columns: [],
            }
        },
        async onPullDownRefresh() {
            await this.refreshList()
@@ -68,36 +110,120 @@
        async onLoad() {
            this.listApi = '/api/feedback/my/feedback/list'
            this.getList()
            this.$http.request('get', '/api/code/value', {
                params: {
                    type: 'feedback_type'
                }
            }).then(res => {
                var data = res.data
                this.type_columns = data || []
            })
        },
        methods: {
            async addFeedback() {
                const res = await this.$message.confirm('', {
                    editable: true,
                    title: '请填写投诉/反馈内容'
            toDetail(item) {
                uni.navigateTo({
                    url: `/sub_pages/customer/self/feedback-detail?id=${item.id}`
                })
                if (res.content && res.confirm) {
                    // 发送请求
                    if (!res.content) {
                        this.$message.showToast('未填写内容')
                    } else {
                        this.$message.showLoading()
                        const {
                            code
                        } = await this.$http.request('post', '', {
                            data: {
                                feedBack: res.content
            },
            async deleteCheckImage(index) {
                await this.$message.confirm('确定删除吗')
                this.submitForm.pictures.splice(index, 1)
            },
            uploadCheckImage() {
                let that = this
                uni.chooseImage({
                    count: 1, // 最多可以选择的图片张数,默认9
                    sizeType: ['compressed'], //original 原图,compressed 压缩图,默认二者都有
                    sourceType: ['camera', 'album'], //album 从相册选图,camera 使用相机,默认二者都有。如需直接开相机或直接选相册,请只使用一个选项
                    success: function(res) {
                        let errMsg = res.errMsg
                        let tempFiles = res.tempFiles
                        if (errMsg === 'chooseImage:ok') {
                            if (tempFiles[0].size > 1024 * 1024 * 5) {
                                that.$message.confirm('图片最多支持5M大小,超出大小限制')
                                return
                            }
                        })
                        this.$message.hideLoading()
                        if (code == 0) {
                            await this.refreshList()
                            this.$message.showToast('提交成功')
                            that.$message.showLoading()
                            that.$http.upload(tempFiles[0].path).then(async res => {
                                console.log('res1', res)
                                var pic = res.data && res.data.length > 0 && res.data[
                                        0]
                                    .url || ''
                                that.$message.hideLoading()
                                that.submitForm.pictures.push(pic)
                                that.$forceUpdate()
                            }).catch(res => {
                                that.$message.hideLoading()
                                console.error(res)
                            })
                        }
                    }
                })
            },
            async addFeedback() {
                this.submitForm = {
                    feedBack: '',
                    type: '',
                    pictures: [],
                }
                this.$refs.popup.open()
                // const res = await this.$message.confirm('', {
                //     editable: true,
                //     title: '请填写投诉/反馈内容'
                // })
                // if (res.content && res.confirm) {
                //     // 发送请求
                //     if (!res.content) {
                //         this.$message.showToast('未填写内容')
                //     } else {
                //         this.$message.showLoading()
                //         const {
                //             code
                //         } = await this.$http.request('post', '', {
                //             data: {
                //                 feedBack: res.content
                //             }
                //         })
                //         this.$message.hideLoading()
                //         if (code == 0) {
                //             await this.refreshList()
                //             this.$message.showToast('提交成功')
                //         }
                //     }
                } else {
                // } else {
                // }
            },
            async submit() {
                console.log('submitForm',this.submitForm)
                if (!this.submitForm.type) {
                    this.$message.showToast('未选择类型')
                    return
                }
                if (!this.submitForm.feedBack) {
                    this.$message.showToast('未填写内容')
                    return
                }
                this.$message.showLoading()
                const {
                    code
                } = await this.$http.request('post', '/api/feedback/page/new', {
                    data: {
                        feedBack: this.submitForm.feedBack,
                        type: this.submitForm.type,
                        pictures: JSON.stringify(this.submitForm.pictures)
                    }
                })
                this.$message.hideLoading()
                if (code == 0) {
                    this.$refs.popup.close()
                    await this.refreshList()
                    this.$message.showToast('提交成功')
                }
            }
@@ -163,4 +289,12 @@
            }
        }
    }
    .component-popup_input_all{
        .check-img {
            width: 96rpx;
            height: 96rpx;
            border-radius: 4rpx;
            border: 2rpx dashed #CECECE;
        }
    }
</style>
sub_pages/partner/delivery/delivery-detail.vue
@@ -337,7 +337,7 @@
                        <view class="form-item-label require" style="min-width: 120rpx;margin-right: 10rpx;">
                            降级等级
                        </view>
                        <view class="form-item-value flex">
                        <view class="form-item-value flex ">
                            <view class="value-item" @click="()=>{
                                    if(form.targetLevel!==query.value){
                                        form.targetLevel = each.value