Просмотр исходного кода

feat(退款): 添加留言对话框组件并实现功能

fix: 修正降价取消场景的表单绑定变量名
style: 移除调试日志和多余注释
refactor: 初始化表单数据时使用默认值代替undefined
ylong 1 неделя назад
Родитель
Сommit
b535e2d98a

+ 1 - 1
src/views/goods/list/index.vue

@@ -249,7 +249,7 @@
             ref="listDelistModalRef"
             ref="listDelistModalRef"
             title="批量上/下架"
             title="批量上/下架"
             template-name="上架/下架模板"
             template-name="上架/下架模板"
-            template-url="https://example.com/list_delist_template.xlsx"
+            template-url="https://shuhi.oss-cn-qingdao.aliyuncs.com/default/shop_book_release_import.xlsx"
             upload-url="/shop/shopbook/batchShelf"
             upload-url="/shop/shopbook/batchShelf"
             instruction-title="上架/下架规则"
             instruction-title="上架/下架规则"
             :instructions="[
             :instructions="[

+ 101 - 0
src/views/mallOrder/refund/components/leave-message-dialog.vue

@@ -0,0 +1,101 @@
+<template>
+    <ele-modal
+        :width="500"
+        v-model="visible"
+        title="我要留言"
+        :body-style="{ padding: '20px 30px' }"
+    >
+        <el-form :model="form" :rules="rules" ref="formRef">
+            <el-form-item prop="content">
+                <el-input
+                    v-model="form.content"
+                    type="textarea"
+                    :rows="6"
+                    placeholder="请输入留言内容,限200字以内"
+                    maxlength="200"
+                    show-word-limit
+                />
+            </el-form-item>
+        </el-form>
+        <template #footer>
+            <div class="flex justify-end gap-3">
+                <el-button @click="visible = false">取消</el-button>
+                <el-button
+                    type="primary"
+                    :loading="loading"
+                    @click="handleSubmit"
+                    >确认提交</el-button
+                >
+            </div>
+        </template>
+    </ele-modal>
+</template>
+
+<script setup>
+    import { ref, reactive } from 'vue';
+    import { EleMessage } from 'ele-admin-plus/es';
+    import request from '@/utils/request';
+
+    const visible = ref(false);
+    const loading = ref(false);
+    const formRef = ref(null);
+
+    const form = reactive({
+        refundOrderId: '',
+        content: ''
+    });
+
+    const rules = {
+        content: [
+            { required: true, message: '请输入留言内容', trigger: 'blur' },
+            { max: 200, message: '长度不能超过200个字符', trigger: 'blur' }
+        ]
+    };
+
+    const emit = defineEmits(['success']);
+
+    const open = (refundOrderId) => {
+        form.refundOrderId = refundOrderId;
+        form.content = '';
+        visible.value = true;
+        // 清除上次的校验状态
+        if (formRef.value) {
+            formRef.value.clearValidate();
+        }
+    };
+
+    const handleSubmit = async () => {
+        if (!formRef.value) return;
+
+        await formRef.value.validate((valid) => {
+            if (valid) {
+                loading.value = true;
+                request
+                    .post('/shop/shopOrder/refundAddDisposeContent', {
+                        refundOrderId: form.refundOrderId,
+                        content: form.content
+                    })
+                    .then((res) => {
+                        if (res.data.code === 200) {
+                            EleMessage.success('留言成功');
+                            visible.value = false;
+                            emit('success');
+                        } else {
+                            EleMessage.error(res.data.msg || '留言失败');
+                        }
+                    })
+                    .catch((e) => {
+                        console.error(e);
+                        EleMessage.error('网络错误');
+                    })
+                    .finally(() => {
+                        loading.value = false;
+                    });
+            }
+        });
+    };
+
+    defineExpose({
+        open
+    });
+</script>

+ 9 - 1
src/views/mallOrder/refund/components/refund-detail-dialog.vue

@@ -424,6 +424,10 @@
             ref="negotiateReturnDialogRef"
             ref="negotiateReturnDialogRef"
             @success="handleNegotiationSuccess"
             @success="handleNegotiationSuccess"
         />
         />
+        <leave-message-dialog
+            ref="leaveMessageDialogRef"
+            @success="handleNegotiationSuccess"
+        />
     </ele-modal>
     </ele-modal>
 </template>
 </template>
 
 
@@ -439,6 +443,7 @@
     import AgreeDialog from './agree-dialog.vue';
     import AgreeDialog from './agree-dialog.vue';
     import ConfirmRefundDialog from './confirm-refund-dialog.vue';
     import ConfirmRefundDialog from './confirm-refund-dialog.vue';
     import NegotiateReturnDialog from './negotiate-return-dialog.vue';
     import NegotiateReturnDialog from './negotiate-return-dialog.vue';
+    import LeaveMessageDialog from './leave-message-dialog.vue';
 
 
     const visible = defineModel({ type: Boolean });
     const visible = defineModel({ type: Boolean });
     const loading = ref(false);
     const loading = ref(false);
@@ -450,6 +455,7 @@
     const agreeDialogRef = ref(null);
     const agreeDialogRef = ref(null);
     const confirmRefundDialogRef = ref(null);
     const confirmRefundDialogRef = ref(null);
     const negotiateReturnDialogRef = ref(null);
     const negotiateReturnDialogRef = ref(null);
+    const leaveMessageDialogRef = ref(null);
 
 
     const deadline = ref(0);
     const deadline = ref(0);
 
 
@@ -677,7 +683,9 @@
     };
     };
 
 
     const handleLeaveMessage = () => {
     const handleLeaveMessage = () => {
-        EleMessage.info('点击了我要留言');
+        if (leaveMessageDialogRef.value) {
+            leaveMessageDialogRef.value.open(form.value.refundOrderId);
+        }
     };
     };
 
 
     defineExpose({
     defineExpose({

+ 13 - 13
src/views/marketing/shareDiscount/rules/index.vue

@@ -79,7 +79,7 @@
                         <el-form-item label="降价取消场景:">
                         <el-form-item label="降价取消场景:">
                             <div class="flex items-center w-full">
                             <div class="flex items-center w-full">
                                 <dict-data
                                 <dict-data
-                                    v-model="form.upsellValidScenario"
+                                    v-model="form.reduceValidScenario"
                                     code="upsell_valid_scenario"
                                     code="upsell_valid_scenario"
                                     type="multipleSelect"
                                     type="multipleSelect"
                                     style="width: 300px"
                                     style="width: 300px"
@@ -170,15 +170,15 @@
     let timer = null;
     let timer = null;
 
 
     const form = reactive({
     const form = reactive({
-        reduceRate: void 0,
-        inviteExpireHour: void 0,
-        reduceTimesPerIsbn: void 0,
-        assistTimesEveryDay: void 0,
-        maxPerHelp: void 0,
-        minPerHelp: void 0,
-        upsellValidScenario: [],
+        reduceRate: 0,
+        inviteExpireHour: 0,
+        reduceTimesPerIsbn: 0,
+        assistTimesEveryDay: 0,
+        maxPerHelp: 0,
+        minPerHelp: 0,
+        reduceValidScenario: [],
         mobile: '',
         mobile: '',
-        reduceScope: void 0,
+        reduceScope: '',
         code: ''
         code: ''
     });
     });
 
 
@@ -199,13 +199,13 @@
         loading.value = true;
         loading.value = true;
         try {
         try {
             const res = await request.get('/activity/reduce/manage/rule/get');
             const res = await request.get('/activity/reduce/manage/rule/get');
+            console.log(res, 'xxxx');
+            
             if (res.data.code === 200) {
             if (res.data.code === 200) {
                 const data = res.data.data;
                 const data = res.data.data;
                 Object.assign(form, data);
                 Object.assign(form, data);
-                form.upsellValidScenario = data.upsellValidScenario.map((v) =>
-                    v.toString()
-                );
-                form.reduceScope = data.reduceScope?.toString();
+                form.reduceValidScenario = data.reduceValidScenario?.map((v) => v.toString()) || [];
+                form.reduceScope = data.reduceScope + '';
                 if (form.mobile) {
                 if (form.mobile) {
                     needVerification.value = true;
                     needVerification.value = true;
                 }
                 }

+ 2 - 2
src/views/salesOps/decoration/components/HotSalesEdit.vue

@@ -162,8 +162,8 @@
             console.log(product, 'xxxx');
             console.log(product, 'xxxx');
             items.value[activeIndex.value] = {
             items.value[activeIndex.value] = {
                 id: product.id, // Assuming product object has id
                 id: product.id, // Assuming product object has id
-                title: product.bookName, // GoodsSelectDialog returns bookName
-                imgUrl: product.cover, // GoodsSelectDialog returns cover
+                title: product.bookName, 
+                imgUrl: product.cover, 
                 price: product.price,
                 price: product.price,
                 jumpUrl: `/pages-sell/pages/detail?isbn=${product.isbn}` // Construct jumpUrl
                 jumpUrl: `/pages-sell/pages/detail?isbn=${product.isbn}` // Construct jumpUrl
             };
             };