Bladeren bron

修改 bug

ylong 7 maanden geleden
bovenliggende
commit
6732191639

+ 1 - 1
src/views/recycle/bookStat/index.vue

@@ -102,7 +102,7 @@
         />
       </template>
       <template #baseInfo="{ row }">
-        <book-stat-info :row="row"></book-stat-info>
+        <book-stat-info :row="row" @refresh="reload"></book-stat-info>
       </template>
       <template #stock="{ row }">
         <book-stock :row="row"></book-stock>

+ 3 - 1
src/views/recycle/components/add-discount.vue

@@ -51,7 +51,9 @@ const items = reactive([
         props: {
             placeholder: '请输入折扣',
         },
-        rules: [validators.decimalRange]
+        itemProps: {
+            rules: [validators.decimalRange]
+        }
     }
 ]);
 

+ 33 - 2
src/views/recycle/components/book-stat-info.vue

@@ -64,10 +64,32 @@
                     <el-text>回收价格:</el-text>
                     <el-text>¥ {{ row.recyclePrice }}</el-text>
                 </div>
+                <div class="common-text" v-if="row.discountChangeLog">
+                    <el-text style="color: #3ab54b"
+                        >{{ row.discountChangeLog.userName }}:</el-text
+                    >
+                    <el-text style="color: #3ab54b">{{
+                        row.discountChangeLog.changeTime
+                    }}</el-text>
+                </div>
+
                 <div class="common-text">
                     <el-text>销售价格:</el-text>
                     <el-text>¥ {{ row.productPrice || 0 }}</el-text>
+                    <el-icon :size="14" color="#f56c6c" @click="handleEditProductPrice" style="margin-left: 6px;position: relative;top: 1px;">
+                        <EditPen />
+                    </el-icon>
+                </div>
+
+                <div class="common-text" v-if="row.productPriceChangeLog">
+                    <el-text style="color: #3ab54b"
+                        >{{ row.productPriceChangeLog.userName }}:</el-text
+                    >
+                    <el-text style="color: #3ab54b">{{
+                        row.productPriceChangeLog.changeTime
+                    }}</el-text>
                 </div>
+                
                 <div class="common-text">
                     <el-text
                         >(已回收数量:{{ row.recycleNum || 0 }} 当前库存:{{
@@ -78,11 +100,14 @@
             </div>
         </div>
     </div>
+    <ModifyProductPrice ref="productPriceDialogRef" @refresh="$emit('refresh')" />
 </template>
 
 <script setup>
     import { dayjs } from 'element-plus';
-    import { computed } from 'vue';
+    import { computed, ref } from 'vue';
+    import { EditPen } from '@element-plus/icons-vue';
+    import ModifyProductPrice from './modify-product-price.vue';
 
     const props = defineProps({
         row: {
@@ -99,7 +124,9 @@
         }
     });
 
-    const emit = defineEmits(['edit']);
+    const emit = defineEmits(['edit', 'refresh']);
+
+    const productPriceDialogRef = ref(null);
 
     const publishDate = computed(() => {
         return props.row.pubDate
@@ -110,6 +137,10 @@
     const handleEdit = () => {
         emit('edit', props.row);
     };
+    
+    const handleEditProductPrice = () => {
+        productPriceDialogRef.value?.handleOpen(props.row);
+    };
 </script>
 
 <style scoped>

+ 4 - 2
src/views/recycle/components/modify-discount.vue

@@ -57,7 +57,9 @@ const items = reactive([
         prop: 'recycleDiscount',
         type: 'input',
         required: true,
-        rules: [validators.decimalRange]
+        itemProps: {
+            rules: [validators.decimalRange]
+        }
     }
 ]);
 
@@ -70,7 +72,7 @@ const handleSumbit = () => {
         request.post('/book/bookRecycleInfo/updateDiscount', data).then(() => {
             visible.value = false;
             ElMessage.success('修改成功');
-            emit('refresh');
+            emit('refresh',data.recycleDiscount);
         });
     });
 };

+ 3 - 1
src/views/recycle/components/modify-max-recycle.vue

@@ -57,7 +57,9 @@ const items = reactive([
         prop: 'recycleMax',
         type: 'input',
         required: true,
-        rules: [validators.nonNegativeInteger]
+        itemProps: {
+            rules: [validators.nonNegativeInteger]
+        }
     }
 ]);
 

+ 3 - 1
src/views/recycle/components/modify-order-recycle.vue

@@ -57,7 +57,9 @@ const items = reactive([
         prop: 'recycleMaxPerOrder',
         type: 'input',
         required: true,
-        rules: [validators.nonNegativeInteger]
+        itemProps: {
+            rules: [validators.nonNegativeInteger]
+        }
     }
 ]);
 

+ 93 - 0
src/views/recycle/components/modify-product-price.vue

@@ -0,0 +1,93 @@
+<!-- 修改销售价格弹窗 -->
+<template>
+    <ele-modal
+        form
+        :width="460"
+        v-model="visible"
+        title="修改销售价格"
+        @open="handleOpen"
+    >
+        <SimpleForm
+            :items="items"
+            labelWidth="100px"
+            ref="formRef"
+            :initKeys="form"
+        ></SimpleForm>
+        <template #footer>
+            <el-button @click="handleCancel">关闭</el-button>
+            <el-button type="primary" @click="handleSubmit">确定</el-button>
+        </template>
+    </ele-modal>
+</template>
+
+<script setup>
+    import { ref, reactive, nextTick } from 'vue';
+    import SimpleForm from '@/components/CommonPage/SimpleForm.vue';
+    import validators from '@/utils/validators';
+    import request from '@/utils/request';
+    import { ElMessage } from 'element-plus';
+
+    /** 弹窗是否打开 */
+    const visible = defineModel({ type: Boolean });
+
+    /** 关闭弹窗 */
+    const handleCancel = () => {
+        visible.value = false;
+        nextTick(() => {
+            formRef.value?.resetForm();
+        });
+    };
+
+    const form = ref({
+        isbn: '',
+        productPrice: ''
+    });
+
+    /** 弹窗打开事件 */
+    const handleOpen = (data) => {
+        visible.value = true;
+        nextTick(() => {
+            if (data?.isbn) {
+                form.value.isbn = data.isbn;
+                form.value.productPrice = data.productPrice || 0;
+                formRef.value?.setData(form.value);
+            }
+        });
+    };
+
+    const items = reactive([
+        {
+            label: '销售价格',
+            prop: 'productPrice',
+            type: 'input',
+            required: true,
+            itemProps:{
+                rules: [validators.money]
+            }
+        }
+    ]);
+
+    const formRef = ref();
+
+    const emit = defineEmits(['refresh']);
+    const handleSubmit = () => {
+        formRef.value?.submitForm().then((data) => {
+            data.isbn = form.value.isbn;
+            request
+                .post('/book/bookInfo/changeProductPrice', data)
+                .then((res) => {
+                    if (res.data.code === 200) {
+                        visible.value = false;
+                        ElMessage.success('修改成功');
+                        emit('refresh', data.productPrice);
+                    } else {
+                        ElMessage.error(res.data.msg || '修改失败');
+                    }
+                });
+        });
+    };
+
+    defineExpose({
+        handleOpen
+    });
+</script>

+ 128 - 112
src/views/recycle/components/set-params.vue

@@ -1,131 +1,147 @@
 <!-- 编辑弹窗 -->
 <template>
-  <ele-modal
-    form
-    :width="560"
-    v-model="visible"
-    title="设置独立参数"
-    @open="handleOpen"
-  >
-    <el-form :model="form" ref="formRef" label-width="140px" :rules="rules">
-      <el-form-item label="回收折扣" prop="recycleDiscount" required>
-        <el-input v-model="form.recycleDiscount" @input="handleChange" />
-      </el-form-item>
-      <el-form-item label="最大回收数量" prop="recycleMax" required>
-        <el-input v-model="form.recycleMax" @input="handleChange" />
-      </el-form-item>
-      <el-form-item label="单个订单回收数量" prop="recycleMaxPerOrder" required>
-        <el-input v-model="form.recycleMaxPerOrder" @input="handleChange" />
-      </el-form-item>
-      <el-form-item label="状态" prop="settingStatus" required>
-        <el-radio-group v-model="form.settingStatus">
-          <template v-for="item in dictData" :key="item.dictValue">
-            <el-radio :label="item.dictValue">{{ item.dictLabel }}</el-radio>
-          </template>
-        </el-radio-group>
-      </el-form-item>
-    </el-form>
-    <template #footer>
-      <el-button @click="handleCancel">关闭</el-button>
-      <el-button type="primary" @click="handleSumbit">确定</el-button>
-    </template>
-  </ele-modal>
+    <ele-modal
+        form
+        :width="560"
+        v-model="visible"
+        title="设置独立参数"
+        @open="handleOpen"
+    >
+        <el-form :model="form" ref="formRef" label-width="140px" :rules="rules">
+            <el-form-item label="回收折扣" prop="recycleDiscount" required>
+                <el-input
+                    v-model="form.recycleDiscount"
+                    @input="handleChange"
+                />
+            </el-form-item>
+            <el-form-item label="最大回收数量" prop="recycleMax" required>
+                <el-input v-model="form.recycleMax" @input="handleChange" />
+            </el-form-item>
+            <el-form-item
+                label="单个订单回收数量"
+                prop="recycleMaxPerOrder"
+                required
+            >
+                <el-input
+                    v-model="form.recycleMaxPerOrder"
+                    @input="handleChange"
+                />
+            </el-form-item>
+            <el-form-item label="状态" prop="settingStatus" required>
+                <el-radio-group v-model="form.settingStatus">
+                    <template v-for="item in dictData" :key="item.dictValue">
+                        <el-radio :label="item.dictValue">{{
+                            item.dictLabel
+                        }}</el-radio>
+                    </template>
+                </el-radio-group>
+            </el-form-item>
+        </el-form>
+        <template #footer>
+            <el-button @click="handleCancel">关闭</el-button>
+            <el-button type="primary" @click="handleSumbit">确定</el-button>
+        </template>
+    </ele-modal>
 </template>
 
 <script setup>
-  import { ref, reactive, nextTick } from 'vue';
-  import validators from '@/utils/validators';
-  import request from '@/utils/request';
-  import { useDictData } from '@/utils/use-dict-data';
+    import { ref, reactive, nextTick } from 'vue';
+    import validators from '@/utils/validators';
+    import request from '@/utils/request';
+    import { useDictData } from '@/utils/use-dict-data';
 
-  /** 弹窗是否打开 */
-  const visible = defineModel({ type: Boolean });
+    /** 弹窗是否打开 */
+    const visible = defineModel({ type: Boolean });
 
-  /** 字典数据 */
-  const [dictData] = useDictData(['discount_status']);
+    /** 字典数据 */
+    const [dictData] = useDictData(['discount_status']);
 
-  /** 关闭弹窗 */
-  const handleCancel = () => {
-    visible.value = false;
-    nextTick(() => {
-      formRef.value?.resetFields();
-    });
-  };
+    /** 关闭弹窗 */
+    const handleCancel = () => {
+        visible.value = false;
+        nextTick(() => {
+            formRef.value?.resetFields();
+        });
+    };
 
-  // 监听输入框的值变化,改成状态为有效
-  function handleChange(value) {
-    if (form.settingStatus == '0') {
-      form.settingStatus = '1';
+    // 监听输入框的值变化,改成状态为有效
+    function handleChange(value) {
+        if (form.settingStatus == '0') {
+            form.settingStatus = '1';
+        }
     }
-  }
 
-  const form = reactive({
-    isbn: '',
-    recycleDiscount: '',
-    recycleMax: '',
-    recycleMaxPerOrder: '',
-    settingStatus: '1'
-  });
+    const form = reactive({
+        isbn: '',
+        recycleDiscount: '',
+        recycleMax: '',
+        recycleMaxPerOrder: '',
+        settingStatus: '1'
+    });
 
-  // 表单校验规则
-  const rules = {
-    recycleDiscount: [
-      { required: true, message: '请输入回收折扣', trigger: 'blur' },
-      validators.money
-    ],
-    recycleMax: [
-      { required: true, message: '请输入最大回收数量', trigger: 'blur' },
-      validators.nonNegativeInteger
-    ],
-    recycleMaxPerOrder: [
-      { required: true, message: '请输入单个订单回收数量', trigger: 'blur' },
-      validators.nonNegativeInteger
-    ],
-    settingStatus: [
-      { required: true, message: '请选择状态', trigger: 'change' }
-    ]
-  };
+    // 表单校验规则
+    const rules = {
+        recycleDiscount: [
+            { required: true, message: '请输入回收折扣', trigger: 'blur' },
+            validators.money
+        ],
+        recycleMax: [
+            { required: true, message: '请输入最大回收数量', trigger: 'blur' },
+            validators.nonNegativeInteger
+        ],
+        recycleMaxPerOrder: [
+            {
+                required: true,
+                message: '请输入单个订单回收数量',
+                trigger: 'blur'
+            },
+            validators.nonNegativeInteger
+        ],
+        settingStatus: [
+            { required: true, message: '请选择状态', trigger: 'change' }
+        ]
+    };
 
-  /** 弹窗打开事件 */
-  const handleOpen = (data) => {
-    visible.value = true;
-    nextTick(() => {
-      if (data?.isbn) {
-        form.isbn = data.isbn;
-        getParams(data.isbn);
-      }
-    });
-  };
+    /** 弹窗打开事件 */
+    const handleOpen = (data) => {
+        visible.value = true;
+        nextTick(() => {
+            if (data?.isbn) {
+                form.isbn = data.isbn;
+                getParams(data.isbn);
+            }
+        });
+    };
 
-  //根据isbn获取参数
-  const getParams = (isbn) => {
-    request.get(`/book/bookRecycleInfo/getSepSet/${isbn}`).then((res) => {
-      let data = res.data.data;
-      console.log(data);
-      form.recycleDiscount = data.recycleDiscount;
-      form.recycleMax = data.recycleMax;
-      form.recycleMaxPerOrder = data.recycleMaxPerOrder;
-      form.settingStatus = data.settingStatus;
-    });
-  };
+    //根据isbn获取参数
+    const getParams = (isbn) => {
+        request.get(`/book/bookRecycleInfo/getSepSet/${isbn}`).then((res) => {
+            let data = res.data.data;
+            console.log(data);
+            form.recycleDiscount = data.recycleDiscount;
+            form.recycleMax = data.recycleMax;
+            form.recycleMaxPerOrder = data.recycleMaxPerOrder;
+            form.settingStatus = data.settingStatus;
+        });
+    };
 
-  const formRef = ref();
+    const formRef = ref();
 
-  const emit = defineEmits(['refresh']);
-  const handleSumbit = () => {
-    formRef.value?.validate((valid) => {
-      if (valid) {
-        const data = { ...form };
-        request.post('/book/bookRecycleInfo/setSep', data).then(() => {
-          visible.value = false;
-          ElMessage.success('设置成功');
-          emit('refresh');
+    const emit = defineEmits(['refresh']);
+    const handleSumbit = () => {
+        formRef.value?.validate((valid) => {
+            if (valid) {
+                const data = { ...form };
+                request.post('/book/bookRecycleInfo/setSep', data).then(() => {
+                    visible.value = false;
+                    ElMessage.success('设置成功');
+                    emit('refresh', data.recycleDiscount);
+                });
+            }
         });
-      }
-    });
-  };
+    };
 
-  defineExpose({
-    handleOpen
-  });
+    defineExpose({
+        handleOpen
+    });
 </script>

+ 1 - 1
src/views/recycle/inventoryAlert/index.vue

@@ -84,7 +84,7 @@
       <template #baseInfo="{ row }">
         <div class="flex justify-start items-center">
           <div style="flex: 2">
-            <book-stat-info :row="row"></book-stat-info>
+            <book-stat-info :row="row" @refresh="reload"></book-stat-info>
           </div>
         </div>
       </template>

+ 1 - 1
src/views/recycle/priceAlert/index.vue

@@ -65,7 +65,7 @@
                 />
             </template>
             <template #baseInfo="{ row }">
-                <book-stat-info :row="row"></book-stat-info>
+                <book-stat-info :row="row" @refresh="reload"></book-stat-info>
             </template>
 
             <template #view="{ row }">

+ 1 - 1
src/views/recycle/stockFullAlert/index.vue

@@ -65,7 +65,7 @@
                 />
             </template>
             <template #baseInfo="{ row }">
-                <book-stat-info :row="row"></book-stat-info>
+                <book-stat-info :row="row" @refresh="reload"></book-stat-info>
             </template>
 
             <template #view="{ row }">

+ 1 - 1
src/views/recycle/workbench/index.vue

@@ -102,7 +102,7 @@
         />
       </template>
       <template #baseInfo="{ row }">
-        <book-stat-info :row="row"></book-stat-info>
+        <book-stat-info :row="row" @refresh="reload"></book-stat-info>
       </template>
       <template #stock="{ row }">
         <book-stock :row="row"></book-stock>

+ 64 - 17
src/views/recycleOrder/detail/order-book-list.vue

@@ -84,7 +84,7 @@
                 </div>
                 <div class="base-info-right shrink-0" style="width: 210px">
                     <div class="common-text flex">
-                        <el-text>定  价:</el-text>
+                        <el-text>定 价:</el-text>
                         <el-text>¥ {{ row.bookPrice }}</el-text>
                     </div>
                     <div class="common-text flex">
@@ -110,9 +110,40 @@
                             +{{ row.upsellPrice }}</el-text
                         >
                     </div>
+                    <div class="common-text flex" v-if="row.discountChangeLog">
+                        <el-text style="color: #3ab54b"
+                            >{{ row.discountChangeLog.userName }}:</el-text
+                        >
+                        <el-text style="color: #3ab54b">{{
+                            row.discountChangeLog.changeTime
+                        }}</el-text>
+                    </div>
                     <div class="common-text flex">
                         <el-text>销售价格:</el-text>
                         <el-text>¥ {{ row.productPrice }}</el-text>
+                        <el-icon
+                            :size="14"
+                            color="#f56c6c"
+                            @click="handleEditProductPrice(row)"
+                            style="
+                                margin-left: 6px;
+                                position: relative;
+                                top: 5px;
+                            "
+                        >
+                            <EditPen />
+                        </el-icon>
+                    </div>
+                    <div
+                        class="common-text flex"
+                        v-if="row.productPriceChangeLog"
+                    >
+                        <el-text style="color: #3ab54b"
+                            >{{ row.productPriceChangeLog.userName }}:</el-text
+                        >
+                        <el-text style="color: #3ab54b">{{
+                            row.productPriceChangeLog.changeTime
+                        }}</el-text>
                     </div>
                 </div>
             </div>
@@ -189,14 +220,18 @@
     </ele-data-table>
     <orderModifyDiscount
         ref="specifiedRef"
-        @refresh="handleRefresh('specified')"
+        @refresh="(value) => handleRefresh('specified', value)"
     />
-    <setParams ref="modifyRef" @refresh="handleRefresh('modify')" />
+    <setParams ref="modifyRef" @refresh="(value) => handleRefresh('modify', value)" />
     <orderBlacklist ref="blacklistRef" @refresh="handleRefresh('blacklist')" />
     <orderRecycleLog ref="recycleLogRef" />
     <orderSalesLog ref="salesLogRef" />
     <booksEdit ref="booksEditRef" />
     <auditScreenshotIsbn ref="auditScreenshotIsbnRef" />
+    <ModifyProductPrice
+        ref="productPriceDialogRef"
+        @refresh="(value) => handleRefresh('productPrice', value)"
+    />
 </template>
 
 <script setup>
@@ -209,6 +244,8 @@
     import BooksEdit from '@/views/data/books/components/books-edit.vue';
     import auditScreenshotIsbn from '@/views/recycleOrder/components/audit-screenshot-isbn.vue';
     import request from '@/utils/request';
+    import { EditPen } from '@element-plus/icons-vue';
+    import ModifyProductPrice from '@/views/recycle/components/modify-product-price.vue';
 
     const props = defineProps({
         detail: {
@@ -476,7 +513,7 @@
             align: 'center',
             minWidth: 317,
             renderHeader: (row) => {
-                let data = auditStats()
+                let data = auditStats();
                 return `审核信息(总数:${data.total},加价数量${data.upsell},良好:${data.good},一般:${data.normal},极差:${data.bad})`;
             }
         },
@@ -578,25 +615,28 @@
         auditScreenshotIsbnRef.value?.handleOpen(row);
     };
 
-    const handleRefresh = (type) => {
+    const handleRefresh = (type, value) => {
         if (!currentRow.value) return;
-        const index = dataList.value.findIndex(
-            (item) => item.isbn === currentRow.value.isbn
-        );
-        if (index > -1) {
-            const newList = [...dataList.value];
-            if (type === 'specified' || type === 'modify') {
-                newList[index] = { ...newList[index], settingStatus: 1 };
-            } else if (type === 'blacklist') {
-                newList[index] = { ...newList[index], bookStatus: 3 };
+        const newList = [...dataList.value];
+        
+        // 更新所有具有相同ISBN的项目
+        newList.forEach((item, idx) => {
+            if (item.isbn === currentRow.value.isbn) {
+                if (type === 'specified' || type === 'modify') {
+                    newList[idx] = { ...newList[idx], settingStatus: 1, recycleDiscount: value };
+                } else if (type === 'blacklist') {
+                    newList[idx] = { ...newList[idx], bookStatus: 3 };
+                } else if (type === 'productPrice') {
+                    newList[idx] = { ...newList[idx], productPrice: value };
+                }
             }
-            dataList.value = newList;
-        }
+        });
+        
+        dataList.value = newList;
     };
 
     // 手动刷新数据
     const refreshData = () => {
-        console.log('Manual refresh triggered');
         initData();
     };
 
@@ -621,6 +661,13 @@
         };
     };
 
+    // 修改销售价格
+    const productPriceDialogRef = ref(null);
+    const handleEditProductPrice = (row) => {
+        currentRow.value = row;
+        productPriceDialogRef.value?.handleOpen(row);
+    };
+
     defineExpose({
         handleOtherAuditGood,
         refreshData

+ 9 - 3
src/views/recycleOrder/detail/order-modify-discount.vue

@@ -58,21 +58,27 @@
       prop: 'discount',
       type: 'input',
       required: true,
-      rules: [validators.decimalRange]
+      itemProps: {
+        rules: [validators.decimalRange]
+      }
     },
     {
       label: '最大回收数量',
       prop: 'maxCount',
       type: 'input',
       required: true,
-      rules: [validators.nonNegativeInteger]
+      itemProps: {
+        rules: [validators.nonNegativeInteger]
+      }
     },
     {
       label: '单个订单回收数量',
       prop: 'number',
       type: 'input',
       required: true,
-      rules: [validators.nonNegativeInteger]
+      itemProps: {
+        rules: [validators.nonNegativeInteger]
+      }
     },
     {
       label: '状态',

+ 3 - 1
src/views/recycleOrder/detail/order-specified-discount.vue

@@ -55,7 +55,9 @@
       prop: 'discount',
       type: 'input',
       required: true,
-      rules: [validators.decimalRange]
+      itemProps: {
+        rules: [validators.decimalRange]
+      }
     }
   ]);