Przeglądaj źródła

fix 调整页面

Alex 11 miesięcy temu
rodzic
commit
e9ecd908ce

+ 1 - 1
.env.production

@@ -1,2 +1,2 @@
 # 生产环境接口地址
-VITE_API_URL=https://bk.shuhi.com
+VITE_API_URL=https://bpi.shuhi.com

+ 25 - 32
src/views/recycle/booklist/index.vue

@@ -22,11 +22,11 @@
                     加入回收书单
                 </el-button>
                 <el-button type="warning" plain v-permission="'recycle:booklist:batchRemoveBlacklist'"
-                    @click="handleOptBlacklist()" v-if="searchType === '4'">
+                    @click="handleOptBlacklist('remove')" v-if="searchType === '4'">
                     移除黑名单
                 </el-button>
                 <el-button type="danger" plain v-permission="'recycle:booklist:batchAddBlacklist'"
-                    @click="handleOptBlacklist()" v-if="searchType !== '4'">
+                    @click="handleOptBlacklist('add')" v-if="searchType !== '4'">
                     加黑名单
                 </el-button>
 
@@ -56,14 +56,7 @@
                 <el-image style="width: 90px; height: 120px; border-radius: 4px" fit="cover" :src="row.cover" />
             </template>
             <template #baseInfo="{ row }">
-                <div class="flex justify-start items-center">
-                    <div style="flex: 2">
-                        <book-info :row="row" @edit="handleUpdateBook"></book-info>
-                    </div>
-                    <div style="flex: 1.5; margin-left: 15px">
-                        <book-other-info :row="row"></book-other-info>
-                    </div>
-                </div>
+                <book-info :row="row" @edit="handleUpdateBook"></book-info>
             </template>
             <template #stock="{ row }">
                 <book-stock :row="row"></book-stock>
@@ -79,11 +72,11 @@
                     [设置独立参数]
                 </el-button>
                 <el-button type="success" link v-permission="'recycle:booklist:removeBlacklist'"
-                    @click="handleOptBlacklist(row)" v-if="row.bookStatus == 3">
+                    @click="handleOptBlacklist('remove', row)" v-if="row.bookStatus == 3">
                     [移除黑名单]
                 </el-button>
                 <el-button type="warning" link v-permission="'recycle:booklist:addBlacklist'"
-                    @click="handleOptBlacklist(row)" v-if="row.bookStatus == 1 || row.bookStatus == 2">
+                    @click="handleOptBlacklist('add', row)" v-if="row.bookStatus == 1 || row.bookStatus == 2">
                     [加入黑名单]
                 </el-button>
                 <el-button type="danger" link v-permission="'recycle:booklist:pauseRecycle'"
@@ -108,6 +101,7 @@
         <books-edit ref="editRef"></books-edit>
         <set-params ref="paramsRef" @refresh="reload"></set-params>
         <add-discount ref="discountRef" @refresh="reload"></add-discount>
+        <order-blacklist ref="blacklistRef" @refresh="reload"></order-blacklist>
     </ele-page>
 </template>
 
@@ -121,6 +115,7 @@ import bookOtherInfo from '@/views/recycle/components/book-other-info.vue';
 import bookStock from '@/views/recycle/components/book-stock.vue';
 import setParams from '@/views/recycle/components/set-params.vue';
 import addDiscount from '@/views/recycle/components/add-discount.vue';
+import orderBlacklist from '@/views/recycleOrder/detail/order-blacklist.vue';
 import { useDictData } from '@/utils/use-dict-data';
 
 defineOptions({ name: 'recycleBooklist' });
@@ -267,33 +262,31 @@ function handleOptBooklist(row) {
     });
 }
 //黑名单操作
-function handleOptBlacklist(row) {
+const blacklistRef = ref(null);
+function handleOptBlacklist(type, row) {
     let selections = row ? [row] : pageRef.value?.getSelections();
-    console.log(selections, 'selections',pageRef.value?.getSelections());
     if (!selections || selections.length === 0) {
         ElMessage.warning('请选择要操作的图书');
         return;
     }
-
     const isbnList = selections.map((item) => item.isbn);
-    const isBlacklist = row ? row.bookStatus === '3' : selections[0].bookStatus === '3';
-
-    const url = isBlacklist
-        ? '/book/bookRecycleInfo/removeBlackList'
-        : '/book/bookRecycleInfo/addBlackList';
 
-    const title = isBlacklist ? '确认移除黑名单?' : '确认加入黑名单?';
-
-    pageRef.value?.operatBatch({
-        title,
-        method: 'post',
-        url,
-        data: { isbnList },
-        row,
-        success: () => {
-            reload();
-        }
-    });
+    if (type == 'remove') {
+        // 移除黑名单
+        pageRef.value?.operatBatch({
+            title: '确认移除黑名单?',
+            method: 'post',
+            url: '/book/bookRecycleInfo/removeBlackList',
+            data: { isbnList },
+            row,
+            success: () => {
+                reload();
+            }
+        });
+    } else {
+        // 加入黑名单,打开选择原因弹窗
+        blacklistRef.value?.handleOpen(isbnList);
+    }
 }
 //回收操作
 function handleOptRecycle(row) {

+ 71 - 41
src/views/recycle/components/book-info.vue

@@ -1,62 +1,92 @@
 <template>
-  <div class="recycle-order-number flex flex-col items-start">
-    <div class="common-text">
-      <el-text>书名:</el-text>
-      <el-text type="primary" class="cursor-pointer" @click="handleEdit">{{ row.bookName }}</el-text>
-    </div>
-    <div class="common-text">
-      <el-text>作 者:</el-text>
-      <el-text>{{ row.author || '-' }} </el-text>
-    </div>
-    <div class="common-text">
-      <el-text>ISBN:</el-text>
-      <el-text>{{ row.isbn }}</el-text>
-    </div>
-    <div class="common-text" v-if="showFormat">
-      <el-text>分类:</el-text>
-      <el-text>{{ row.cateName || '-' }}</el-text>
-    </div>
-    <div class="common-text">
-      <el-text>出版社:</el-text>
-      <el-text>{{ row.publish || '-' }}</el-text>
-    </div>
-    <div class="common-text">
-      <el-text>出版时间:</el-text>
-      <el-text>{{ publishDate }} </el-text>
+    <div class="recycle-order-number flex flex-col items-start">
+        <div class="common-text">
+            <el-text>书名:</el-text>
+            <el-text type="primary" class="cursor-pointer" @click="handleEdit">{{ row.bookName }}</el-text>
+        </div>
+
+        <div class="flex w-full">
+            <div class="flex flex-col" style="flex: 2">
+                <div class="common-text">
+                    <el-text>作 者:</el-text>
+                    <el-text>{{ row.author || '-' }} </el-text>
+                </div>
+                <div class="common-text">
+                    <el-text>ISBN:</el-text>
+                    <el-text>{{ row.isbn }}</el-text>
+                </div>
+                <div class="common-text" v-if="showFormat">
+                    <el-text>分类:</el-text>
+                    <el-text>{{ row.cateName || '-' }}</el-text>
+                </div>
+                <div class="common-text">
+                    <el-text>出版社:</el-text>
+                    <el-text>{{ row.publish || '-' }}</el-text>
+                </div>
+                <div class="common-text">
+                    <el-text>出版时间:</el-text>
+                    <el-text>{{ publishDate }} </el-text>
+                </div>
+            </div>
+            <div class="flex flex-col" style="flex: 1.5">
+                <div class="common-text">
+                    <el-text>定价:</el-text>
+                    <el-text>¥ {{ row.price }}</el-text>
+                </div>
+                <div class="common-text" v-if="!showFormat">
+                    <el-text>开本尺寸:</el-text>
+                    <el-text>{{ row.bookFormat }}</el-text>
+                </div>
+                <div class="common-text" v-else>
+                    <el-text>回收折扣:</el-text>
+                    <el-text>{{ row.recycleDiscount }}折</el-text>
+                </div>
+                <div class="common-text">
+                    <el-text>回收状态:</el-text>
+                    <el-text>{{ row.recyleStatus == 1 ? '正在回收' : '暂停回收' }}</el-text>
+                </div>
+                <div class="common-text">
+                    <el-text>所属类型:</el-text>
+                    <el-text>{{ row.bookTag == 1 ? '教材库' : row.bookTag == 2 ? '社科库' : '-' }}</el-text>
+                </div>
+                <div class="common-text">
+                    <el-text>(已回收数量:{{ row.recyleNum || 0 }} 当前库存:{{ row.stockNum || 0 }})</el-text>
+                </div>
+            </div>
+        </div>
     </div>
-  </div>
 </template>
 
 <script setup>
-  import { dayjs } from 'element-plus';
-  import { computed } from 'vue';
+import { dayjs } from 'element-plus';
+import { computed } from 'vue';
 
-  const props = defineProps({
+const props = defineProps({
     row: {
-      type: Object,
-      default: () => {}
+        type: Object,
+        default: () => { }
     },
     showFormat: {
-      type: Boolean,
-      default: true
+        type: Boolean,
+        default: true
     }
-  });
+});
 
-  const emit = defineEmits(['edit']);
+const emit = defineEmits(['edit']);
 
-  const publishDate = computed(() => {
+const publishDate = computed(() => {
     return props.row.pubDate
-      ? dayjs(props.row.pubDate).format('YYYY-MM-DD')
-      : '-';
-  });
+        ? dayjs(props.row.pubDate).format('YYYY-MM-DD')
+        : '-';
+});
 
-  const handleEdit = () => {
+const handleEdit = () => {
     emit('edit', props.row);
-  };
+};
 </script>
 
 <style scoped>
 .cursor-pointer {
-  cursor: pointer;
+    cursor: pointer;
 }
 </style>

+ 6 - 26
src/views/recycle/independentParameter/index.vue

@@ -37,14 +37,7 @@
                 <el-image style="width: 90px; height: 120px; border-radius: 4px" fit="cover" :src="row.cover" />
             </template>
             <template #baseInfo="{ row }">
-                <div class="flex justify-start items-center">
-                    <div style="flex: 2">
-                        <book-info :row="row" @edit="handleUpdateBook" :showFormat="false"></book-info>
-                    </div>
-                    <div style="flex: 1.5; margin-left: 15px">
-                        <book-other-info :row="row" showFormat></book-other-info>
-                    </div>
-                </div>
+                <book-info :row="row" @edit="handleUpdateBook" :showFormat="false"></book-info>
             </template>
             <template #stock="{ row }">
                 <book-stock :row="row"></book-stock>
@@ -120,6 +113,7 @@
         <modifyOrderRecycle ref="orderRecycleRef" @refresh="reload" />
         <modifyMaxRecycle ref="maxRecycleRef" @refresh="reload" />
         <modifyDiscount ref="modifyDiscountRef" @refresh="reload" />
+        <orderBlacklist ref="blacklistRef" @refresh="reload" />
     </ele-page>
 </template>
 
@@ -138,10 +132,12 @@ import orderSalesLog from '@/views/recycleOrder/detail/order-sales-log.vue';
 import modifyOrderRecycle from '@/views/recycle/components/modify-order-recycle.vue';
 import modifyMaxRecycle from '@/views/recycle/components/modify-max-recycle.vue';
 import modifyDiscount from '@/views/recycle/components/modify-discount.vue';
+import orderBlacklist from '@/views/recycleOrder/detail/order-blacklist.vue';
 
 defineOptions({ name: 'independentParameter' });
 
 const searchType = ref('0');
+const blacklistRef = ref(null);
 function handleStatusChange(value) {
     pageRef.value.reload({ searchType: value });
 }
@@ -249,24 +245,8 @@ function handleOptBlacklist(row) {
     }
 
     const isbnList = selections.map((item) => item.isbn);
-    const isBlacklist = row ? row.bookStatus === '3' : selections[0].bookStatus === '3';
-
-    const url = isBlacklist
-        ? '/book/bookRecycleInfo/removeBlackList'
-        : '/book/bookRecycleInfo/addBlackList';
-
-    const title = isBlacklist ? '确认移除黑名单?' : '确认加入黑名单?';
-
-    pageRef.value?.operatBatch({
-        title,
-        method: 'post',
-        url,
-        data: { isbnList },
-        row,
-        success: () => {
-            reload();
-        }
-    });
+    // 加入黑名单,打开选择原因弹窗
+    blacklistRef.value?.handleOpen(isbnList);
 }
 
 //回收操作

+ 6 - 26
src/views/recycle/specifiedBooks/index.vue

@@ -37,14 +37,7 @@
                 <el-image style="width: 90px; height: 120px; border-radius: 4px" fit="cover" :src="row.cover" />
             </template>
             <template #baseInfo="{ row }">
-                <div class="flex justify-start items-center">
-                    <div style="flex: 2">
-                        <book-info :row="row" @edit="handleUpdateBook" :showFormat="false"></book-info>
-                    </div>
-                    <div style="flex: 1.5; margin-left: 15px">
-                        <book-other-info :row="row" showFormat></book-other-info>
-                    </div>
-                </div>
+                <book-info :row="row" @edit="handleUpdateBook" :showFormat="false"></book-info>
             </template>
             <template #stock="{ row }">
                 <book-stock :row="row"></book-stock>
@@ -114,6 +107,7 @@
         <modifyOrderRecycle ref="orderRecycleRef" @refresh="reload" />
         <modifyMaxRecycle ref="maxRecycleRef" @refresh="reload" />
         <modifyDiscount ref="modifyDiscountRef" @refresh="reload" />
+        <orderBlacklist ref="blacklistRef" @refresh="reload" />
     </ele-page>
 </template>
 
@@ -132,10 +126,12 @@ import orderSalesLog from '@/views/recycleOrder/detail/order-sales-log.vue';
 import modifyOrderRecycle from '@/views/recycle/components/modify-order-recycle.vue';
 import modifyMaxRecycle from '@/views/recycle/components/modify-max-recycle.vue';
 import modifyDiscount from '@/views/recycle/components/modify-discount.vue';
+import orderBlacklist from '@/views/recycleOrder/detail/order-blacklist.vue';
 
 defineOptions({ name: 'specifiedBookslist' });
 
 const searchType = ref('0');
+const blacklistRef = ref(null);
 function handleStatusChange(value) {
     pageRef.value.reload({ searchType: value });
 }
@@ -243,24 +239,8 @@ function handleOptBlacklist(row) {
     }
 
     const isbnList = selections.map((item) => item.isbn);
-    const isBlacklist = row ? row.bookStatus === '3' : selections[0].bookStatus === '3';
-
-    const url = isBlacklist
-        ? '/book/bookRecycleInfo/removeBlackList'
-        : '/book/bookRecycleInfo/addBlackList';
-
-    const title = isBlacklist ? '确认移除黑名单?' : '确认加入黑名单?';
-
-    pageRef.value?.operatBatch({
-        title,
-        method: 'post',
-        url,
-        data: { isbnList },
-        row,
-        success: () => {
-            reload();
-        }
-    });
+    // 加入黑名单,打开选择原因弹窗
+    blacklistRef.value?.handleOpen(isbnList);
 }
 
 //回收操作

+ 114 - 71
src/views/recycleOrder/components/order-detail.vue

@@ -1,89 +1,132 @@
 <!-- 编辑弹窗 -->
 <template>
-  <ele-modal
-    form
-    :width="1460"
-    v-model="visible"
-    title="用户详情"
-    @open="handleOpen"
-    :body-style="{
-      maxHeight: '84vh',
-      position: 'relative',
-      overflow: 'auto',
-      background: '#f8f8f8',
-      padding: '0'
-    }"
-    position="center"
-  >
-    <userDetail :detail="orderDetail" />
+    <ele-modal form :width="1460" v-model="visible" title="用户详情" @open="handleOpen" :body-style="{
+        maxHeight: '84vh',
+        position: 'relative',
+        overflow: 'auto',
+        background: '#f8f8f8',
+        padding: '0'
+    }" position="center">
+        <userDetail :detail="orderDetail" @refresh="getOrderDetail" />
 
-    <template #footer>
-      <div style="display: flex; justify-content: space-between">
-        <div style="margin-left: 10px"></div>
-        <el-button @click="handleCancel" type="danger">关闭弹窗</el-button>
-        <div style="display: flex">
-          <el-button
-            type="warning"
-            @click="handleCancel"
-            v-if="orderDetail.status == 2"
-            >初步审核</el-button
-          >
-          <el-button
-            type="success"
-            @click="handleCancel"
-            v-if="orderDetail.status == 6"
-            >确认收货</el-button
-          >
-          <el-button
-            color="#bd3124"
-            @click="handleCancel"
-            v-if="orderDetail.status == 9"
-            >完成审核</el-button
-          >
-          <el-button
-            color="#a16222"
-            @click="handleCancel"
-            v-if="orderDetail.status == 10"
-            >支付书款</el-button
-          >
-        </div>
-      </div>
-    </template>
-  </ele-modal>
+        <template #footer>
+            <div style="display: flex; justify-content: space-between">
+                <div style="margin-left: 10px"></div>
+                <el-button @click="handleCancel" type="danger">关闭弹窗</el-button>
+                <div style="display: flex">
+                    <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="#a16222" @click="handleBatchPayment"
+                        v-if="orderDetail.status == 10">支付书款</el-button>
+                </div>
+            </div>
+        </template>
+    </ele-modal>
+
+    <!-- 初审弹窗 -->
+    <firstCheckModal ref="firstCheckRef" @success="handleSuccess" />
 </template>
 
 <script setup>
-  import { ref, reactive, nextTick } from 'vue';
-  import userDetail from '@/views/recycleOrder/detail/index.vue';
-  import request from '@/utils/request';
+import { ref, reactive, nextTick, getCurrentInstance } from 'vue';
+import userDetail from '@/views/recycleOrder/detail/index.vue';
+import request from '@/utils/request';
+import { ElMessageBox } from 'element-plus/es';
+import { EleMessage } from 'ele-admin-plus/es';
+import firstCheckModal from '@/views/recycleOrder/components/first-check-modal.vue';
+
+const { proxy } = getCurrentInstance();
+const emit = defineEmits(['refresh']);
 
-  /** 弹窗是否打开 */
-  const visible = defineModel({ type: Boolean });
+/** 弹窗是否打开 */
+const visible = defineModel({ type: Boolean });
 
-  /** 关闭弹窗 */
-  const handleCancel = () => {
+/** 关闭弹窗 */
+const handleCancel = () => {
     visible.value = false;
-  };
+};
 
-  /** 弹窗打开事件 */
-  const handleOpen = (data) => {
+/** 弹窗打开事件 */
+let orderId = ref('');
+const handleOpen = (data) => {
     visible.value = true;
     nextTick(() => {
-      getOrderDetail(data.orderId);
+        if (data && data.orderId) {
+            orderId.value = data.orderId;
+            getOrderDetail();
+        }
+    });
+};
+
+//获取订单详情
+const orderDetail = ref({});
+const getOrderDetail = () => {
+    request.get(`/order/orderInfo/getInfo/${orderId.value}`).then((res) => {
+        if (res.data.code === 200) {
+            orderDetail.value = res.data.data;
+        }
     });
-  };
+};
 
-  //获取订单详情
-  const orderDetail = ref({});
-  const getOrderDetail = (orderId) => {
-    request.get(`/order/orderInfo/getInfo/${orderId}`).then((res) => {
-      if (res.data.code === 200) {
-        orderDetail.value = res.data.data;
-      }
+//弹窗确认操作
+function messageBoxConfirm({ message, fetch }) {
+    ElMessageBox.confirm(message, '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '关闭',
+        type: 'warning'
+    }).then(() => {
+        fetch().then((res) => {
+            if (res.data.code === 200) {
+                EleMessage.success('操作成功');
+                handleCancel();
+                emit('refresh');
+            } else {
+                EleMessage.error(res.data.msg);
+            }
+        });
     });
-  };
+}
+
+//初审
+const firstCheckRef = ref(null);
+function handleFirstCheck() {
+    firstCheckRef.value?.handleOpen(orderDetail.value);
+}
+
+//确认收货
+function handleConfirmReceipt() {
+    messageBoxConfirm({
+        message: '确认收货?',
+        fetch: () => proxy.$http.post('/order/orderInfo/adminConfirm', {
+            orderIds: [orderId.value]
+        })
+    });
+}
+
+//完成审核
+function toOrderDetail() {
+    orderDetailRef.value?.handleOpen(orderDetail.value);
+}
+
+//支付书款
+function handleBatchPayment() {
+    messageBoxConfirm({
+        message: '确认支付书款?',
+        fetch: () => proxy.$http.post('/order/orderInfo/adminPay', {
+            orderIds: [orderId.value]
+        })
+    });
+}
+
+//初审成功
+function handleSuccess() {
+    handleCancel();
+    emit('refresh');
+}
 
-  defineExpose({
+defineExpose({
     handleOpen
-  });
+});
 </script>

+ 47 - 5
src/views/recycleOrder/components/order-page-all.vue

@@ -67,15 +67,15 @@
                             [物流揽件]
                         </el-button>
                         <el-button type="success" link v-if="row.status == 5" v-permission="usePermission('receive')"
-                            @click="materialPickup(row)">
+                            @click="handleLogisticsSigning(row)">
                             [物流签收]
                         </el-button>
                         <el-button type="success" link v-if="row.status == 6"
-                            v-permission="usePermission('confirmReceipt')" @click="materialPickup(row)">
+                            v-permission="usePermission('confirmReceipt')" @click="handleConfirmReceipt(row)">
                             [确认收货]
                         </el-button>
                         <el-button type="success" link v-if="[8, 9].includes(row.status)"
-                            v-permission="usePermission('arrivalAudit')" @click="handleArrivalAudit(row)">
+                            v-permission="usePermission('arrivalAudit')" @click="toOrderDetail(row)">
                             [到货审核]
                         </el-button>
                         <el-button type="danger" link v-if="[8, 9, 10, 11].includes(row.status)"
@@ -379,9 +379,16 @@ function messageBoxConfirm({ message, fetch }) {
 
 //取消订单
 function handleCancelOrder(row) {
+    const rows = row == null ? selections.value : [row];
+    if (!rows.length) {
+        EleMessage.error('请至少选择一条数据');
+        return;
+    }
     messageBoxConfirm({
         message: '是否确认取消订单?',
-        fetch: () => proxy.$http.post(`/order/orderInfo/adminCancel/${row.orderId}`)
+        fetch: () => proxy.$http.post('/order/orderInfo/adminCancel', {
+            orderIds: rows.map(item => item.orderId)
+        })
     });
 }
 //申请拦截退出
@@ -399,6 +406,41 @@ function cancelInterception(row) {
     });
 }
 
+//物流签收
+function handleLogisticsSigning(row) {
+    messageBoxConfirm({
+        message: '确认签收?',
+        fetch: () => proxy.$http.post('/order/orderInfo/adminSigned', {
+            orderIds: [row.orderId]
+        })
+    });
+}
+
+//物流揽件
+function materialPickup(row) {
+    messageBoxConfirm({
+        message: '确认物流揽件?',
+        fetch: () => proxy.$http.post('/order/orderInfo/adminPickup', {
+            orderIds: [row.orderId]
+        })
+    });
+}
+
+//确认收货
+function handleConfirmReceipt(row) {
+    const rows = row == null ? selections.value : [row];
+    if (!rows.length) {
+        EleMessage.error('请至少选择一条数据');
+        return;
+    }
+    messageBoxConfirm({
+        message: '确认收货?',
+        fetch: () => proxy.$http.post('/order/orderInfo/adminConfirm', {
+            orderIds: rows.map(item => item.orderId)
+        })
+    });
+}
+
 //用户详情
 const orderDetailRef = ref(null);
 function toOrderDetail(row) {
@@ -425,5 +467,5 @@ function openEditUserTag(row) {
     userTagRef.value?.handleOpen(row);
 }
 
-defineExpose({ reload, exportData, operatBatch });
+defineExpose({ reload, exportData, operatBatch, handleConfirmReceipt, handleCancelOrder });
 </script>

+ 6 - 5
src/views/recycleOrder/detail/index.vue

@@ -1,13 +1,13 @@
 <template>
     <ele-page class="order-detail">
         <ele-card class="order-status" header="订单状态">
-            <orderStatus :status="detail.status" />
+            <orderStatus :status="detail.status" :logVoList="detail.logVoList" />
         </ele-card>
-        <ele-card class="order-base" header="订单基本信息" :body-style="{ paddingTop: '0' }">
-            <orderBaseInfo :detail="detail" />
+        <ele-card class="order-base" header="订单基本信息" :body-style="{ paddingTop: '15px' }">
+            <orderBaseInfo :detail="detail"  />
         </ele-card>
-        <ele-card class="order-book-list" header="图书清单" :body-style="{ paddingTop: '0' }">
-            <orderBookList />
+        <ele-card class="order-book-list" header="图书清单" :body-style="{ paddingTop: '15px' }">
+            <orderBookList :detail="detail" @refresh="emit('refresh')" />
         </ele-card>
 
         <ele-card class="order-service" header="订单服务">
@@ -31,6 +31,7 @@ import orderBaseInfo from '@/views/recycleOrder/detail/order-base-info.vue';
 import orderFreightStatus from '@/views/recycleOrder/detail/order-freight-status.vue';
 import orderBookList from '@/views/recycleOrder/detail/order-book-list.vue'
 
+const emit = defineEmits(['refresh']);
 const props = defineProps({
     detail: {
         type: Object,

+ 3 - 3
src/views/recycleOrder/detail/order-base-info.vue

@@ -31,15 +31,15 @@
                 </div>
                 <div class="common-text">
                     <el-text>快递单号:</el-text>
-                    <el-text>{{ detail.waybillCode }}</el-text>
+                    <el-text>{{ detail.waybillCode || '暂无信息' }}</el-text>
                 </div>
                 <div class="common-text">
                     <el-text>快递公司:</el-text>
-                    <el-text>{{ finalExpressText }}</el-text>
+                    <el-text>{{ finalExpressText || '暂无信息' }}</el-text>
                 </div>
                 <div class="common-text">
                     <el-text>预约时间:</el-text>
-                    <el-text>{{ formatTime }}</el-text>
+                    <el-text>{{ formatTime  }}</el-text>
                 </div>
             </el-col>
             <el-col :span="8">

+ 55 - 47
src/views/recycleOrder/detail/order-blacklist.vue

@@ -1,68 +1,76 @@
 <!-- 编辑弹窗 -->
 <template>
-  <ele-modal
-    form
-    :width="460"
-    v-model="visible"
-    title="加入黑名单"
-    @open="handleOpen"
-  >
-    <SimpleForm
-      :items="items"
-      labelWidth="90px"
-      ref="formRef"
-      :initKeys="form"
-    ></SimpleForm>
-    <template #footer>
-      <el-button @click="handleCancel">关闭</el-button>
-      <el-button type="primary" @click="handleSumbit">确定</el-button>
-    </template>
-  </ele-modal>
+    <ele-modal form :width="460" v-model="visible" title="加入黑名单" @open="handleOpen">
+        <SimpleForm :items="items" labelWidth="90px" ref="formRef" :initKeys="form"></SimpleForm>
+        <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 SimpleForm from '@/components/CommonPage/SimpleForm.vue';
+import { ref, reactive, nextTick } from 'vue';
+import SimpleForm from '@/components/CommonPage/SimpleForm.vue';
+import { ElMessage } from 'element-plus';
+import request from '@/utils/request';
 
-  /** 弹窗是否打开 */
-  const visible = defineModel({ type: Boolean });
+/** 弹窗是否打开 */
+const visible = defineModel({ type: Boolean });
 
-  /** 关闭弹窗 */
-  const handleCancel = () => {
+/** 关闭弹窗 */
+const handleCancel = () => {
     visible.value = false;
     nextTick(() => {
-      formRef.value?.resetForm();
+        formRef.value?.resetForm();
     });
-  };
+};
 
-  const form = reactive({
+const form = reactive({
     reason: ''
-  });
-  /** 弹窗打开事件 */
-  const handleOpen = () => {
-    visible.value = true;
-    nextTick(() => {
-      formRef.value?.assignFields(form);
-    });
-  };
+});
 
-  const items = reactive([
+const items = reactive([
     {
-      label: '拉黑原因',
-      prop: 'reason',
-      type: 'dictSelect',
-      required: true
+        label: '拉黑原因',
+        prop: 'reason',
+        type: 'dictSelect',
+        required: true,
+        props: {
+            code: 'book_black_reason',
+            value: 'dictLabel',
+            label: 'dictLabel'
+        }
     }
-  ]);
+]);
+
+const formRef = ref();
+const emit = defineEmits(['refresh']);
+const currentRow = ref();
+
+const handleOpen = (isbn) => {
+    visible.value = true;
+    nextTick(() => {
+        if (isbn) {
+            currentRow.value = isbn;
+        }
+    });
+};
 
-  const formRef = ref();
-  const handleSumbit = () => {
+const handleSumbit = () => {
     formRef.value?.submitForm().then((data) => {
-      visible.value = false;
+        request.post('/book/bookRecycleInfo/addBlackList', {
+            isbnList: currentRow.value,
+            reason: data.reason
+        }).then(() => {
+            ElMessage.success('操作成功');
+            visible.value = false;
+            emit('refresh');
+        });
     });
-  };
+};
 
-  defineExpose({
+defineExpose({
     handleOpen
-  });
+});
 </script>

+ 96 - 28
src/views/recycleOrder/detail/order-book-list.vue

@@ -1,40 +1,47 @@
 <template>
-    <SimpleTable :columns="columns" border>
+    <ele-data-table row-key="userId" :columns="columns" :data="dataList" border class="order-books">
         <template #baseInfo="{ row }">
             <div class="base-info flex justify-between">
                 <div class="base-info-left flex flex-1">
-                    <el-image style="width: 80px; height: 100px" fit="cover"
-                        src="https://fuss10.elemecdn.com/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg" />
+                    <el-image style="width: 80px; height: 100px" fit="cover" :src="row.cover" />
                     <div class="base-info-left-con flex flex-col items-start ml-3">
-                        <div><el-text type="primary">作物栽培</el-text></div>
-                        <div><el-text>ISBN:9787109261839</el-text></div>
+                        <div><el-text type="primary">{{ row.bookName }}</el-text></div>
+                        <div><el-text>ISBN:{{ row.isbn }}</el-text></div>
                         <div class="base-info-btns flex">
-                            <el-button size="small" color="#4f4f4f" @click="handleBlackList(row)">加入黑名单</el-button>
-                            <el-button size="small" type="success" @click="handleAddBookList(row)">加入回收书单</el-button>
-                            <el-button size="small" type="warning"
+                            <el-button size="small" color="#4f4f4f" v-if="row.bookStatus != 3"
+                                @click="handleBlackList([row.isbn])">加入黑名单</el-button>
+                            <el-button size="small" color="#4f4f4f" v-if="row.bookStatus == 3">已在黑名单</el-button>
+
+                            <el-button size="small" type="success" v-if="row.bookStatus == 1"
+                                @click="handleAddBookList(row)">加入回收书单</el-button>
+                            <el-button size="small" color="#2d430a" v-if="row.bookStatus == 2">已在回收书单</el-button>
+
+                            <el-button size="small" type="warning" v-if="row.settingStatus == 0"
                                 @click="handleSpecifiedDiscount(row)">指定回收折扣</el-button>
-                            <el-button size="small" color="#7728f5"
+                            <el-button size="small" color="#7728f5" v-if="row.settingStatus == 1"
                                 @click="handleModifyDiscount(row)">修改回收折扣</el-button>
                         </div>
-                        <div><el-text type="danger">(已回收数量:200当前库存:75)</el-text></div>
+                        <div><el-text type="danger">(已回收数量:{{ row.recycleNum }}当前库存:{{
+                            row.stockNum
+                                }})</el-text></div>
                     </div>
                 </div>
                 <div class="base-info-right w-36 shrink-0">
                     <div class="common-text flex">
                         <el-text>定  价:</el-text>
-                        <el-text>¥ 46</el-text>
+                        <el-text>¥ {{ row.bookPrice }}</el-text>
                     </div>
                     <div class="common-text flex">
                         <el-text>回收折扣:</el-text>
-                        <el-text>¥ 0.35折</el-text>
+                        <el-text>¥ {{ row.recycleDiscount }}折</el-text>
                     </div>
                     <div class="common-text flex">
                         <el-text>预估金额:</el-text>
-                        <el-text>¥ 1.61</el-text>
+                        <el-text>¥ {{ row.expectMoney }}</el-text>
                     </div>
                     <div class="common-text flex">
                         <el-text>销售价格:</el-text>
-                        <el-text>¥ 10.1</el-text>
+                        <el-text>¥ {{ row.salePrice || '-' }}</el-text>
                     </div>
                 </div>
             </div>
@@ -51,31 +58,47 @@
         </template>
         <template #auditInfo="{ row }">
             <div class="audit-info flex justify-center">
-                <el-radio-group v-model="row.auditInfo" style="width: 120px">
+                <el-radio-group v-model="row.auditInfo" style="width: 120px"
+                    :disabled="!(detail.status == 8 || detail.status == 9)">
                     <el-radio :value="1">品相良好</el-radio>
                     <el-radio :value="2">品相一般</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="请输入品相极差的原因" />
+                <el-input v-model="row.textarea" style="width: 170px" :rows="4" type="textarea" placeholder="请输入品相极差的原因"
+                    :disabled="!(detail.status == 8 || detail.status == 9)" />
             </div>
         </template>
-    </SimpleTable>
-    <orderSpecifiedDiscount ref="specifiedRef" />
-    <orderModifyDiscount ref="modifyRef" />
-    <orderBlacklist ref="blacklistRef" />
+    </ele-data-table>
+    <orderModifyDiscount ref="specifiedRef" @refresh="handleRefresh('specified')" />
+    <setParams ref="modifyRef" @refresh="handleRefresh('modify')" />
+    <orderBlacklist ref="blacklistRef" @refresh="handleRefresh('blacklist')" />
     <orderRecycleLog ref="recycleLogRef" />
     <orderSalesLog ref="salesLogRef" />
 </template>
 
 <script setup>
 import { ref, reactive } from 'vue';
-import SimpleTable from '@/components/CommonPage/SimpleTable.vue';
-import orderSpecifiedDiscount from '@/views/recycleOrder/detail/order-specified-discount.vue';
-import orderModifyDiscount from '@/views/recycleOrder/detail/order-modify-discount.vue';
+import orderModifyDiscount from '@/views/recycle/components/modify-discount.vue';
 import orderBlacklist from '@/views/recycleOrder/detail/order-blacklist.vue';
 import orderRecycleLog from '@/views/recycleOrder/detail/order-recycle-log.vue';
 import orderSalesLog from '@/views/recycleOrder/detail/order-sales-log.vue';
+import setParams from '@/views/recycle/components/set-params.vue';
+import request from '@/utils/request';
+
+const props = defineProps({
+    detail: {
+        type: Object,
+        default: () => ({
+            detailVoList: []
+        })
+    }
+});
+const dataList = ref([]);
+watch(() => props.detail.detailVoList, (newVal) => {
+    dataList.value = newVal;
+}, { deep: true });
+
+const emit = defineEmits(['update:detail', 'refresh']);
 
 const columns = ref([
     {
@@ -88,7 +111,7 @@ const columns = ref([
         label: '信息',
         prop: 'baseInfo',
         slot: 'baseInfo',
-        minWidth: 650,
+        minWidth: 560,
         align: 'center'
     },
     {
@@ -108,9 +131,12 @@ const columns = ref([
     },
     {
         label: '审核金额',
-        prop: 'reviewedPayment',
+        prop: 'finalMoney',
         align: 'center',
-        minWidth: 120
+        minWidth: 100,
+        render: (row) => {
+            return row.finalMoney ? `¥ ${row.finalMoney}` : '待核算';
+        }
     }
 ]);
 
@@ -135,22 +161,37 @@ const handleAddBookList = (row) => {
         cancelButtonText: '关闭',
         type: 'warning'
     }).then(() => {
-        console.log(row, 'row');
+        request.post('/book/bookRecycleInfo/addIn', {
+            isbnList: [row.isbn]
+        }).then(() => {
+            ElMessage.success('操作成功');
+            // 更新列表数据
+            const index = props.detail.detailVoList.findIndex(item => item.isbn === row.isbn);
+            if (index > -1) {
+                const newList = [...props.detail.detailVoList];
+                newList[index] = { ...newList[index], bookStatus: 2 };
+                dataList.value = newList;
+            }
+        });
     });
 };
+const currentRow = ref(null);
 //修改回收折扣
 const modifyRef = ref();
 const handleModifyDiscount = (row) => {
+    currentRow.value = row;
     modifyRef.value?.handleOpen(row);
 };
 //指定回收折扣
 const specifiedRef = ref();
 const handleSpecifiedDiscount = (row) => {
+    currentRow.value = row;
     specifiedRef.value?.handleOpen(row);
 };
 //加入黑名单
 const blacklistRef = ref();
 const handleBlackList = (row) => {
+    currentRow.value = row;
     blacklistRef.value?.handleOpen(row);
 };
 //查看回收日志
@@ -163,10 +204,37 @@ const salesLogRef = ref();
 const handleSalesLog = (row) => {
     salesLogRef.value?.handleOpen(row);
 };
+
+const handleRefresh = (type) => {
+    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 };
+        }
+        dataList.value = newList;
+    }
+};
 </script>
 
 <style lang="scss">
 .mb-10 {
     margin-bottom: 7px;
 }
+
+.order-books {
+    .action-btns {
+        display: flex;
+        flex-wrap: wrap;
+        gap: 10px;
+
+        .el-button {
+            margin: 0;
+            color: #fff;
+        }
+    }
+}
 </style>

+ 31 - 12
src/views/recycleOrder/detail/order-status.vue

@@ -10,27 +10,46 @@
 </template>
 
 <script setup>
-import { ref, reactive } from 'vue';
+import { ref, reactive, watch } from 'vue';
 const stepList = reactive([
-    { label: '创建', time: '2024-06-05 15:00:00', createdBy: '微信用户', stutus: 0 },
-    { label: '下单', time: '2024-06-05 15:00:00', createdBy: '微信用户', stutus: 2 },
-    { label: '初审', time: '2024-06-05 15:00:00', createdBy: 'system', stutus: 3 },
-    { label: '快递取书', time: '2024-06-05 15:00:00', createdBy: 'system', stutus: 5 },
-    { label: '快递签收', time: '2024-06-05 15:00:00', createdBy: 'system', stutus: 6 },
-    { label: '仓库收货', time: '2024-06-05 15:00:00', createdBy: '喷喷喷', stutus: 8 },
-    { label: '到货审核', time: '', createdBy: '', stutus: 9 },
-    { label: '支付书款(完成)', time: '', createdBy: '', stutus: 11 }
+    { label: '创建', time: '', createdBy: '', stutus: '0' },
+    { label: '下单', time: '', createdBy: '', stutus: '2' },
+    { label: '初审', time: '', createdBy: '', stutus: '3' },
+    { label: '快递取书', time: '', createdBy: '', stutus: '5' },
+    { label: '快递签收', time: '', createdBy: '', stutus: '6' },
+    { label: '仓库收货', time: '', createdBy: '', stutus: '8' },
+    { label: '到货审核', time: '', createdBy: '', stutus: '9' },
+    { label: '支付书款(完成)', time: '', createdBy: '', stutus: '11' }
 ]);
 
 const props = defineProps({
     status: {
-        type: Number,
-        default: 0
+        type: [Number, String],
+        default: '0'
+    },
+    logVoList: {
+        type: Array,
+        default: []
     }
 });
 
+watch(() => props.logVoList, (newVal) => {
+    if (newVal.length > 0) {
+        stepList.forEach(item => {
+            item.time = newVal.find(log => log.status == item.stutus)?.createTime || '';
+            item.createdBy = newVal.find(log => log.status == item.stutus)?.createName || '';
+        });
+    } else {
+        stepList.forEach(item => {
+            item.time = '';
+            item.createdBy = '';
+        });
+    }
+}, { deep: true, immediate: true });
+
 const active = computed(() => {
-    return stepList.findIndex(item => item.stutus == props.status) || 0;
+    let status = props.logVoList[props.logVoList.length - 1]?.status || 0;
+    return stepList.findIndex(item => item.stutus == status) + 1;
 });
 
 </script>