Forráskód Böngészése

fix 优化订单相关

Alex 1 éve
szülő
commit
048c81a087

+ 2 - 2
src/layout/index.vue

@@ -89,9 +89,9 @@
       </layout-tool>
 
       <!-- 消息通知 -->
-      <layout-tool :class="{ 'hidden-sm-and-down': tabBar && tabInHeader }">
+      <!-- <layout-tool :class="{ 'hidden-sm-and-down': tabBar && tabInHeader }">
         <header-notice />
-      </layout-tool>
+      </layout-tool> -->
       <!-- 用户信息 -->
       <layout-tool>
         <header-user />

+ 40 - 66
src/views/recycleOrder/awaitReview/index.vue

@@ -1,86 +1,60 @@
 <template>
-  <order-page
-    ref="pageRef"
-    :pageConfig="pageConfig"
-    permissionKey="awaitReview"
-  >
-    <template #toolbar>
-      <el-button
-        type="warning"
-        plain
-        class="ele-btn-icon"
-        v-permission="'recycleOrder:awaitReview:batchAudit'"
-        @click="handleBatchAudit"
-      >
-        批量初审
-      </el-button>
-      <el-button
-        type="success"
-        plain
-        class="ele-btn-icon"
-        :icon="DownloadOutlined"
-        v-permission="'recycleOrder:awaitReview:export'"
-        @click="exportData"
-      >
-        导出订单明细
-      </el-button>
-
-      <el-radio-group
-        v-model="status"
-        @change="handleExpressTypeChange"
-        style="position: relative; top: -3px; margin-left: 20px"
-      >
-        <el-radio-button label="全部" value="" />
-        <el-radio-button label="普通上门取件" value="1" />
-      </el-radio-group>
-    </template>
-  </order-page>
+    <order-page ref="pageRef" :pageConfig="pageConfig" permissionKey="awaitReview">
+        <template #toolbar>
+            <el-button type="warning" plain class="ele-btn-icon" v-permission="'recycleOrder:awaitReview:batchAudit'"
+                @click="handleBatchAudit">
+                批量初审
+            </el-button>
+            <el-button type="success" plain class="ele-btn-icon" :icon="DownloadOutlined"
+                v-permission="'recycleOrder:awaitReview:export'" @click="exportData">
+                导出订单明细
+            </el-button>
+
+            <el-radio-group v-model="status" @change="handleExpressTypeChange"
+                style="position: relative; top: -3px; margin-left: 20px">
+                <el-radio-button label="全部" value="" />
+                <el-radio-button label="普通上门取件" value="1" />
+            </el-radio-group>
+        </template>
+    </order-page>
 </template>
 
 <script setup>
-  import { ref, reactive } from 'vue';
-  import { ElMessageBox } from 'element-plus/es';
-  import { DownloadOutlined } from '@/components/icons';
-  import OrderPage from '@/views/recycleOrder/components/order-page-all.vue';
-  import { useRouter } from 'vue-router';
+import { ref, reactive } from 'vue';
+import { ElMessageBox } from 'element-plus/es';
+import { DownloadOutlined } from '@/components/icons';
+import OrderPage from '@/views/recycleOrder/components/order-page-all.vue';
+import { useRouter } from 'vue-router';
 
-  defineOptions({ name: 'recycleOrderAwaitReview' });
+defineOptions({ name: 'recycleOrderAwaitReview' });
 
-  let router = useRouter();
-  /** 页面组件实例 */
-  const pageRef = ref(null);
-  const status = ref('');
+let router = useRouter();
+/** 页面组件实例 */
+const pageRef = ref(null);
+const status = ref('');
 
-  const pageConfig = reactive({
+const pageConfig = reactive({
     pageUrl: '/order/orderInfo/firstCheck/pageList',
     exportUrl: '/order/orderInfo/firstCheck/export',
     fileName: '待初审订单',
     cacheKey: 'awaitReviewTable',
     where: {
-      expressType: "",
+        expressType: "",
     }
-  });
+});
 
-  function handleExpressTypeChange(val) {
+function handleExpressTypeChange(val) {
     pageConfig.where.expressType = val;
     pageRef.value?.reload({ expressType: val });
-  }
+}
 
-  //批量初审
-  function handleBatchAudit(row) {
-    pageRef.value?.operatBatch({
-      title: '确认审核?',
-      row,
-      url: '/recycleOrder/batchAudit'
-    });
-  }
+//批量初审
+function handleBatchAudit() {
+    pageRef.value?.handleFirstCheck(null);
+}
 
-  //导出数据
-  function exportData() {
+//导出数据
+function exportData() {
     pageRef.value?.exportData('待初审订单');
-  }
-  //订单详情
-  function toOrderDetail(row) {
-    router.push({ path: '/recycleOrder/detail', query: { id: row.postId } });
-  }
+}
 </script>

+ 38 - 53
src/views/recycleOrder/components/audit-screenshot.vue

@@ -1,65 +1,50 @@
 <!-- 编辑弹窗 -->
 <template>
-  <ele-modal :width="560" v-model="visible" title="审核截图">
-    <div
-      class="demo-image__preview"
-      v-for="(item, index) in imageList"
-      :key="index"
-    >
-      <div class="demo-image__info" style="margin-bottom: 6px">{{
-        item.remark
-      }}</div>
-      <el-image
-        v-for="(url, idx) in item.list"
-        style="width: 100px; height: 100px; margin-right: 10px"
-        :src="url"
-        :preview-src-list="item.list"
-        :initial-index="idx"
-        fit="cover"
-      />
-    </div>
-
-    <template #footer>
-      <el-button @click="handleCancel">关闭</el-button>
-    </template>
-  </ele-modal>
+    <ele-modal :width="560" v-model="visible" title="审核截图">
+        <template v-if="imageList.length">
+            <div class="demo-image__preview" v-for="(item, index) in imageList" :key="index">
+                <div class="demo-image__info" style="margin-bottom: 6px">{{
+                    item.remark
+                    }}</div>
+                <el-image v-for="(url, idx) in item.imgInfo" style="width: 100px; height: 100px; margin-right: 10px" :src="url"
+                    :preview-src-list="item.imgInfo" :initial-index="idx" fit="cover" />
+            </div>
+        </template>
+        <el-empty v-else description="暂无审核截图" />
+
+        <template #footer>
+            <el-button @click="handleCancel">关闭</el-button>
+        </template>
+    </ele-modal>
 </template>
 
 <script setup>
-  import { ref, reactive, nextTick } from 'vue';
+import { ref, getCurrentInstance, nextTick } from 'vue';
+const { proxy } = getCurrentInstance();
 
-  /** 弹窗是否打开 */
-  const visible = defineModel({ type: Boolean });
+/** 弹窗是否打开 */
+const visible = defineModel({ type: Boolean });
 
-  /** 关闭弹窗 */
-  const handleCancel = () => {
+/** 关闭弹窗 */
+const handleCancel = () => {
     visible.value = false;
-  };
-
-  /** 弹窗打开事件 */
-  const handleOpen = () => {
+};
+
+//获取审核截图
+const imageList = ref([]);
+function getAuditScreenshot(orderId) {
+    proxy.$http.get(`/order/orderInfo/getOrderAnnexList?orderId=${orderId}`).then(res => {
+        imageList.value = res.data;
+    })
+}
+
+/** 弹窗打开事件 */
+const handleOpen = (row) => {
     visible.value = true;
-    nextTick(() => console.log('打开'));
-  };
-
-  const srcList = [
-    'https://fuss10.elemecdn.com/9/bb/e27858e973f5d7d3904835f46abbdjpeg.jpeg',
-    'https://fuss10.elemecdn.com/d/e6/c4d93a3805b3ce3f323f7974e6f78jpeg.jpeg',
-    'https://fuss10.elemecdn.com/3/28/bbf893f792f03a54408b3b7a7ebf0jpeg.jpeg'
-  ];
-
-  const imageList = reactive([
-    {
-      remark: '说明3213213',
-      list: srcList
-    },
-    {
-      remark: '说明说明说明说明说明说明说明',
-      list: srcList
-    }
-  ]);
+    row.orderId && getAuditScreenshot(row.orderId);
+};
 
-  defineExpose({
+defineExpose({
     handleOpen
-  });
+});
 </script>

+ 4 - 4
src/views/recycleOrder/components/first-check-modal.vue

@@ -57,21 +57,21 @@ const baseUrl = reactive({
     update: '/order/orderInfo/auditFirst'
 });
 const formData = ref({
-    orderId: '',
+    orderIds: '',
     auditStatus: '1'
 });
 
 const formatData = (data) => {
     return {
         ...data,
-        orderId: formData.value.orderId
+        orderIds: formData.value.orderIds
     }
 }
 
 const editRef = ref(null);
 
-function handleOpen(data) {
-    formData.value.orderId = data.orderId;
+function handleOpen(orderIds) {
+    formData.value.orderIds = orderIds;
     editRef.value?.handleOpen(formData.value);
 
     getGodownList().then((res) => {

+ 2 - 2
src/views/recycleOrder/components/order-amount.vue

@@ -6,8 +6,8 @@
         </div>
         <div class="common-text">
             <el-text>审核书款:</el-text>
-            <el-text v-if="row.deliveryCode">待核算</el-text>
-            <el-text v-else>-</el-text>
+            <el-text v-if="!row.finalMoney">待核算</el-text>
+            <el-text v-else>¥{{ row.finalMoney }}</el-text>
         </div>
         <div class="common-text">
             <el-text>订单类型:</el-text>

+ 11 - 3
src/views/recycleOrder/components/order-detail.vue

@@ -17,7 +17,8 @@
                     <el-button type="warning" @click="handleFirstCheck" v-if="orderDetail.status == 2">初步审核</el-button>
                     <el-button type="success" @click="handleConfirmReceipt"
                         v-if="orderDetail.status == 6">确认收货</el-button>
-                    <el-button color="#bd3124" @click="toOrderDetail" v-if="orderDetail.status == 9">完成审核</el-button>
+                    <el-button color="#bd3124" @click="handleCompleteAudit"
+                        v-if="orderDetail.status == 9 || orderDetail.status == 8">完成审核</el-button>
                     <el-button color="#a16222" @click="handleBatchPayment"
                         v-if="orderDetail.status == 10">支付书款</el-button>
                 </div>
@@ -55,6 +56,7 @@ const handleOpen = (data) => {
     nextTick(() => {
         if (data && data.orderId) {
             orderId.value = data.orderId;
+            console.log(data, orderId.value,'xxxx')
             getOrderDetail();
         }
     });
@@ -106,8 +108,14 @@ function handleConfirmReceipt() {
 }
 
 //完成审核
-function toOrderDetail() {
-    orderDetailRef.value?.handleOpen(orderDetail.value);
+function handleCompleteAudit() {
+    // /order/orderInfo/adminCheckFinish
+    messageBoxConfirm({
+        message: '确认完成审核?',
+        fetch: () => proxy.$http.post('/order/orderInfo/adminCheckFinish', {
+            orderId: orderId.value
+        })
+    });
 }
 
 //支付书款

+ 35 - 13
src/views/recycleOrder/components/order-page-all.vue

@@ -53,12 +53,12 @@
                             [初步审核]
                         </el-button>
                         <!-- 3 已初审-带上门取件 5已揽件-待签收 6已签收-待确认到货 -->
-                        <el-button type="danger" link v-if="[3, 5, 6].includes(row.status)"
+                        <el-button type="danger" link v-if="['3', '5', '6'].includes(row.status)"
                             v-permission="usePermission('cancel')" @click="handleCancelOrder(row)">
                             [取消订单]
                         </el-button>
                         <!-- 3 已初审-带上门取件 5已揽件-待签收 6已签收-待确认到货 8待回收审核 9审核未提交 10待付款 -->
-                        <el-button type="primary" link v-if="[3, 5, 6, 8, 9, 10].includes(row.status)"
+                        <el-button type="primary" link v-if="['3', '5', '6', '8', '9', '10'].includes(row.status)"
                             v-permission="usePermission('fallback')" @click="fallbackOrder(row)">
                             [回退状态]
                         </el-button>
@@ -74,11 +74,11 @@
                             v-permission="usePermission('confirmReceipt')" @click="handleConfirmReceipt(row)">
                             [确认收货]
                         </el-button>
-                        <el-button type="success" link v-if="[8, 9].includes(row.status)"
+                        <el-button type="success" link v-if="['8', '9'].includes(row.status)"
                             v-permission="usePermission('arrivalAudit')" @click="toOrderDetail(row)">
                             [到货审核]
                         </el-button>
-                        <el-button type="danger" link v-if="[8, 9, 10, 11].includes(row.status)"
+                        <el-button type="danger" link v-if="['8', '9', '10', '11'].includes(row.status)"
                             v-permission="usePermission('auditScreenshot')" @click="handleAuditScreenshot(row)">
                             [审核截图]
                         </el-button>
@@ -98,11 +98,11 @@
                             v-permission="usePermission('modifyAddress')" @click="handleModifyAddress(row)">
                             [修改地址]
                         </el-button>
-                        <el-button type="success" link v-if="[8, 9, 10, 11].includes(row.status)"
+                        <el-button type="success" link v-if="['8', '9', '10', '11'].includes(row.status)"
                             v-permission="usePermission('sendSMS')" @click="handleSendSMS(row)">
                             [推送短信]
                         </el-button>
-                        <el-button type="info" link v-if="[8, 9, 10].includes(row.status)"
+                        <el-button type="info" link v-if="['8', '9', '10'].includes(row.status)"
                             v-permission="usePermission('smsLog')" @click="handleSmsLog(row)">
                             [短信记录]
                         </el-button>
@@ -117,13 +117,13 @@
                         </el-button>
 
                         <template v-if="row.interceptStatus == 0">
-                            <el-button type="danger" link v-if="[5, 6].includes(row.status)"
+                            <el-button type="danger" link v-if="['5', '6'].includes(row.status)"
                                 v-permission="usePermission('interception')" @click="applyForInterception(row)">
                                 [申请拦截退回]
                             </el-button>
                         </template>
                         <template v-else>
-                            <el-button type="info" link v-if="[5, 6].includes(row.status)"
+                            <el-button type="info" link v-if="['5', '6'].includes(row.status)"
                                 v-permission="usePermission('cancelInterception')" @click="cancelInterception(row)">
                                 [取消拦截退回]
                             </el-button>
@@ -145,7 +145,9 @@
         <!-- 用户标签 -->
         <userBindTag ref="userTagRef" @success="reload()" />
         <!-- 用户详情 -->
-        <orderDetail ref="orderDetailRef" />
+        <orderDetail ref="orderDetailRef" @refresh="reload()" />
+        <!-- 审核截图 -->
+        <auditScreenshot ref="auditScreenshotRef" />
     </ele-page>
 </template>
 
@@ -172,7 +174,8 @@ import orderLog from '@/views/recycleOrder/components/order-log.vue';
 import userBindTag from '@/views/recycleOrder/components/user-bind-tag.vue';
 //用户详情
 import orderDetail from '@/views/recycleOrder/components/order-detail.vue';
-
+//审核截图
+import auditScreenshot from '@/views/recycleOrder/components/audit-screenshot.vue';
 
 let props = defineProps({
     pageConfig: {
@@ -441,7 +444,7 @@ function handleConfirmReceipt(row) {
     });
 }
 
-//用户详情
+//订单详情
 const orderDetailRef = ref(null);
 function toOrderDetail(row) {
     orderDetailRef.value?.handleOpen(row);
@@ -449,7 +452,13 @@ function toOrderDetail(row) {
 //初审
 const firstCheckRef = ref(null);
 function handleFirstCheck(row) {
-    firstCheckRef.value?.handleOpen(row);
+    const rows = row == null ? selections.value : [row];
+    if (!rows.length) {
+        EleMessage.error('请至少选择一条数据');
+        return;
+    }
+    let orderIds = rows.map(item => item.orderId).join(',');
+    firstCheckRef.value?.handleOpen(orderIds);
 }
 //修改地址
 const modifyAddressRef = ref(null);
@@ -482,5 +491,18 @@ function handleBatchPayment(row) {
     });
 }
 
-defineExpose({ selections, reload, exportData, operatBatch, handleConfirmReceipt, handleCancelOrder, handleBatchPayment });
+//回退状态
+function fallbackOrder(row) {
+    messageBoxConfirm({
+        message: '确认回退?',
+        fetch: () => proxy.$http.post(`/order/orderInfo/statusBack/${row.orderId}`)
+    });
+}
+//审核截图
+const auditScreenshotRef = ref(null);
+function handleAuditScreenshot(row) {
+    auditScreenshotRef.value?.handleOpen(row);
+}
+
+defineExpose({ selections, reload, exportData, operatBatch, handleFirstCheck, handleConfirmReceipt, handleCancelOrder, handleBatchPayment });
 </script>

+ 150 - 13
src/views/recycleOrder/detail/order-book-list.vue

@@ -1,5 +1,6 @@
 <template>
-    <ele-data-table row-key="userId" :columns="columns" :data="dataList" border class="order-books">
+    <ele-data-table row-key="userId" :columns="columns" :data="dataList" border class="order-books"
+        :span-method="handleSpanMethod">
         <template #baseInfo="{ row }">
             <div class="base-info flex justify-between">
                 <div class="base-info-left flex flex-1">
@@ -37,7 +38,7 @@
                     </div>
                     <div class="common-text flex">
                         <el-text>预估金额:</el-text>
-                        <el-text>¥ {{ row.expectMoney }}</el-text>
+                        <el-text>¥ {{ row.recyclePrice }}</el-text>
                     </div>
                     <div class="common-text flex">
                         <el-text>销售价格:</el-text>
@@ -58,14 +59,20 @@
         </template>
         <template #auditInfo="{ row }">
             <div class="audit-info flex justify-center">
-                <el-radio-group v-model="row.auditInfo" style="width: 120px"
-                    :disabled="!(detail.status == 8 || detail.status == 9)">
+                <el-radio-group v-model="row.sts" style="width: 120px"
+                    :disabled="!(detail.status == 8 || detail.status == 9)"
+                    @change="(value) => handleAuditInfo(value, row)">
                     <el-radio :value="1">品相良好</el-radio>
-                    <el-radio :value="2">品相一般</el-radio>
+                    <el-radio :value="2" disabled>品相一般</el-radio>
                     <el-radio :value="3">品相极差</el-radio>
                 </el-radio-group>
-                <el-input v-model="row.textarea" style="width: 170px" :rows="4" type="textarea" placeholder="请输入品相极差的原因"
-                    :disabled="!(detail.status == 8 || detail.status == 9)" />
+
+                <el-select v-model="row.com" style="width: 180px" placeholder="请选择品相极差的原因"
+                    :disabled="!(detail.status == 8 || detail.status == 9) || row.sts !== 3" class="reason-select"
+                    @change="(value) => handleSelectReason(value, row)">
+                    <el-option v-for="item in auditReason" :key="item.dictValue" :label="item.dictValue"
+                        :value="item.dictValue" />
+                </el-select>
             </div>
         </template>
     </ele-data-table>
@@ -94,10 +101,96 @@ const props = defineProps({
     }
 });
 const dataList = ref([]);
+
+// 处理detailVoList数据
+const processDetailList = (list) => {
+    const result = [];
+    let currentIndex = 0;
+    list.forEach(item => {
+        let auditInfo = item.auditCommentList
+        // 根据num拆分对象
+        for (let i = 0; i < item.num; i++) {
+            let audit = auditInfo ? auditInfo[i] : { sts: 0, com: '' }
+            result.push({
+                ...item,
+                ...audit,
+                _index: i,
+                _groupIndex: currentIndex, // 用于标识分组
+                _isFirstRow: i === 0 // 标识是否是组内第一行
+            });
+        }
+        currentIndex++;
+    });
+    return result;
+};
+
 watch(() => props.detail.detailVoList, (newVal) => {
-    dataList.value = newVal;
+    if (!newVal) return;
+    dataList.value = processDetailList(newVal);
+    console.log(dataList.value);
+    if (auditReason.value.length == 0) {
+        getAuditReason();
+    }
 }, { deep: true });
 
+// 处理单元格合并
+const handleSpanMethod = ({ row, column, rowIndex }) => {
+    if (column.property === 'num') {
+        // 找到当前行所在组的所有行
+        const currentGroup = dataList.value.filter(item => item._groupIndex === row._groupIndex);
+        if (row._isFirstRow) {
+            // 如果是组内第一行,设置合并行数
+            return {
+                rowspan: currentGroup.length,
+                colspan: 1
+            };
+        } else {
+            // 组内其他行不显示
+            return {
+                rowspan: 0,
+                colspan: 0
+            };
+        }
+    }
+    return {
+        rowspan: 1,
+        colspan: 1
+    };
+};
+//审核书籍
+function handleAudit(row) {
+    request.post('/order/orderInfo/adminCheckOrder', {
+        "orderId": props.detail.orderId,
+        "isbn": row.isbn,
+        "inx": row._index,
+        "sts": row.sts,
+        "com": row.com
+    }).then((res) => {
+        if (res.data.code == 200) {
+            ElMessage.success('操作成功');
+        } else {
+            ElMessage.error(res.data.msg)
+        }
+    });
+}
+
+//单选框选择变化
+function handleAuditInfo(value, row) {
+    if (value == 1) {
+        row.com = '';
+        handleAudit(row)
+    } else if (value == 3 && row.com) {
+        handleAudit(row)
+    }
+}
+//选择审核原因
+function handleSelectReason(value, row) {
+    if (row.sts == 3) {
+        row.com = value;
+        handleAudit(row)
+    }
+}
+
 const emit = defineEmits(['update:detail', 'refresh']);
 
 const columns = ref([
@@ -121,7 +214,15 @@ const columns = ref([
         width: 220,
         align: 'center'
     },
-    { label: '数量', prop: 'num', minWidth: 90, align: 'center' },
+    {
+        label: '数量',
+        prop: 'num',
+        minWidth: 90,
+        align: 'center',
+        formatter: (row) => {
+            return `× ${row.num}`;
+        }
+    },
     {
         label: '审核信息',
         prop: 'auditInfo',
@@ -131,14 +232,22 @@ const columns = ref([
     },
     {
         label: '审核金额',
-        prop: 'finalMoney',
+        prop: 'recyclePrice',
         align: 'center',
         minWidth: 100,
-        render: (row) => {
-            return row.finalMoney ? `¥ ${row.finalMoney}` : '待核算';
+        formatter: (row) => {
+            return row.sts == 1 ? `¥ ${row.recyclePrice}` : '0';
         }
     }
 ]);
+//获取审核原因的字典 book_audit_reason
+const auditReason = ref([]);
+const getAuditReason = async () => {
+    const res = await request.get('/system/dict/data/type/book_audit_reason');
+    auditReason.value = res.data.data;
+    console.log(res, 'xxxx')
+};
+
 
 //查看当当、淘宝、豆瓣链接
 const handleViewUrl = (row, type) => {
@@ -220,11 +329,24 @@ const handleRefresh = (type) => {
 };
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .mb-10 {
     margin-bottom: 7px;
 }
 
+.reason-select {
+    :deep(.el-select__wrapper) {
+        height: 120px !important;
+    }
+
+    :deep(.el-select__placeholder) {
+        top: 0;
+        text-wrap: wrap;
+        white-space: normal;
+        text-overflow: initial;
+    }
+}
+
 .order-books {
     .action-btns {
         display: flex;
@@ -236,5 +358,20 @@ const handleRefresh = (type) => {
             color: #fff;
         }
     }
+
+    // 处理合并单元格效果
+    .el-table {
+        td.el-table__cell {
+            &.first-row {
+                border-bottom: none;
+            }
+        }
+
+        .first-row~tr {
+            td.el-table__cell:nth-child(4) {
+                display: none;
+            }
+        }
+    }
 }
 </style>

+ 1 - 4
src/views/recycleOrder/search/index.vue

@@ -98,10 +98,7 @@ const pageConfig = reactive({
 
 //批量初审
 function handleBatchAudit() {
-    pageRef.value?.operatBatch({
-        title: '确认批量审核?',
-        url: '/recycleOrder/batchAudit'
-    });
+    pageRef.value?.handleFirstCheck(null);
 }
 
 //导出数据