Răsfoiți Sursa

推送短信和短信记录

Alex 11 luni în urmă
părinte
comite
3307ff6e96

+ 7 - 2
src/components/DictData/index.vue

@@ -53,7 +53,7 @@
     <el-option
       v-for="item in data"
       :key="item.dictCode"
-      :value="item.dictValue"
+      :value="item[valueKey]"
       :label="item.dictLabel"
     />
   </el-select>
@@ -80,7 +80,12 @@
       default: true
     },
     /** select是否可搜索 */
-    filterable: Boolean
+    filterable: Boolean,
+    /** 绑定值对应的字典数据 */
+    valueKey: {
+      type: String,
+      default: 'dictValue'
+    }
   });
 
   /** 字典值 */

+ 1 - 0
src/views/recycleOrder/components/after-sales-payment.vue

@@ -183,6 +183,7 @@
 
   /** 弹窗打开事件 */
   const handleOpen = (row) => {
+    resetForm();
     if (row.orderId) {
       visible.value = true;
       form.orderId = row.orderId;

+ 181 - 0
src/views/recycleOrder/components/manual-delivery.vue

@@ -0,0 +1,181 @@
+<template>
+  <el-dialog
+    v-model="visible"
+    title="发货"
+    width="500px"
+    :close-on-click-modal="false"
+    @closed="handleClosed"
+  >
+    <div class="order-info">
+      <div
+        >订单商品:<span v-for="(item, index) in orderInfo.items" :key="index">
+          <img
+            :src="item.image"
+            style="width: 40px; height: 40px; object-fit: cover"
+          /> </span
+        >共{{ orderInfo.totalNum }}件</div
+      >
+      <div>
+        收货地址:{{ orderInfo.receiveName }},{{ orderInfo.receiveMobile }},
+        {{ orderInfo.receiveAddress }}
+      </div>
+    </div>
+
+    <el-form ref="formRef" :model="form" :rules="rules" label-width="100px">
+      <el-form-item label="物流单号" prop="waybillCode">
+        <el-input v-model="form.waybillCode" placeholder="请输入物流单号" />
+      </el-form-item>
+      <el-form-item label="配送方式" prop="expressType">
+        <el-select
+          v-model="form.expressType"
+          placeholder="请选择配送方式"
+          style="width: 100%"
+        >
+          <el-option label="快递" value="1" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="物流公司" prop="expressName">
+        <dict-data
+          code="final_express"
+          type="select"
+          value-key="dictLabel"
+          v-model="form.expressName"
+          placeholder="请选择物流公司"
+          style="width: 100%"
+        />
+
+        <el-text type="info"> 同一订单拆分成多个包裹发货? </el-text>
+        <el-text type="primary" style="cursor: pointer" @click="handleSplit"
+          >填写多个单号</el-text
+        >
+      </el-form-item>
+      <el-form-item
+        label="物流子单号"
+        prop="waybillChildCode"
+        v-if="splitVisible"
+      >
+        <el-input
+          v-model="form.waybillChildCode"
+          placeholder="请输入物流子单号"
+        />
+      </el-form-item>
+    </el-form>
+
+    <template #footer>
+      <div class="dialog-footer">
+        <el-button @click="visible = false">返回</el-button>
+        <el-button type="primary" @click="handleSubmit">确定</el-button>
+      </div>
+    </template>
+  </el-dialog>
+</template>
+
+<script setup>
+  import { ref, reactive, getCurrentInstance } from 'vue';
+  import { ElMessage } from 'element-plus';
+  import DictData from '@/components/DictData/index.vue';
+
+  const visible = ref(false);
+  const formRef = ref(null);
+  const { proxy } = getCurrentInstance();
+
+  const form = reactive({
+    refundOrderId: null,
+    expressType: '1',
+    expressName: '',
+    waybillCode: '',
+    waybillChildCode: '',
+    waybillCodeList: []
+  });
+
+  const orderInfo = ref({
+    items: [],
+    totalNum: 0,
+    receiveAddress: ''
+  });
+
+  // 拆分单号
+  const splitVisible = ref(false);
+  function handleSplit() {
+    splitVisible.value = true;
+  }
+
+  const rules = {
+    waybillCode: [
+      { required: true, message: '请输入物流单号', trigger: 'blur' }
+    ],
+    expressType: [
+      { required: true, message: '请选择配送方式', trigger: 'change' }
+    ],
+    expressName: [
+      { required: true, message: '请选择物流公司', trigger: 'change' }
+    ]
+  };
+
+  // 打开弹窗
+  const handleOpen = (row) => {
+    if (!row) return;
+    visible.value = true;
+    form.refundOrderId = row.refundOrderId;
+    // 设置订单信息
+    orderInfo.value = row;
+  };
+
+  // 关闭弹窗
+  const handleClosed = () => {
+    formRef.value?.resetFields();
+    Object.assign(form, {
+      refundOrderId: null,
+      expressName: '',
+      waybillCode: ''
+    });
+  };
+
+  const emit = defineEmits(['success']);
+  // 提交表单
+  const handleSubmit = async () => {
+    if (!formRef.value) return;
+
+    await formRef.value.validate();
+    let params = JSON.parse(JSON.stringify(form));
+    params.waybillCodeList = params.waybillChildCode
+      ? [params.waybillCode, params.waybillChildCode]
+      : [params.waybillCode];
+    proxy.$http.post('/order/orderInfo/refund/send', params).then((res) => {
+      if (res.data.code === 200) {
+        ElMessage.success('发货成功');
+        visible.value = false;
+        emit('success');
+      } else {
+        ElMessage.error(res.data.msg || '发货失败');
+      }
+    });
+  };
+
+  defineExpose({
+    handleOpen
+  });
+</script>
+
+<style lang="scss" scoped>
+  .order-info {
+    padding: 16px;
+    background: #f5f7fa;
+    border-radius: 4px;
+    margin-bottom: 20px;
+
+    > div {
+      line-height: 24px;
+      margin-bottom: 8px;
+
+      &:last-child {
+        margin-bottom: 0;
+      }
+    }
+  }
+
+  .dialog-footer {
+    padding-top: 20px;
+    text-align: right;
+  }
+</style>

+ 60 - 49
src/views/recycleOrder/components/order-number.vue

@@ -1,66 +1,77 @@
 <template>
-    <div class="recycle-order-number">
-        <div class="common-text" v-if="!isReturn">
-            <el-text>订单号:</el-text>
-            <el-text type="danger">{{ row.orderId }}</el-text>
-        </div>
-        <div class="common-text" v-if="isReturn">
-            <el-text>退回编号:</el-text>
-            <el-text type="danger">31231321321321</el-text>
-        </div>
-        <div class="common-text">
-            <el-text>快递单号:</el-text>
-            <el-text v-if="!row.waybillCode">暂无信息</el-text>
-            <el-text v-else type="success">{{ row.waybillCode }}</el-text>
-        </div>
-        <div class="common-text">
-            <el-text>快递公司:</el-text>
-            <el-text :type="row.finalExpress != '0' ? 'success' : ''">{{ finalExpressText }}</el-text>
-        </div>
-        <template v-if="!isReturn">
-            <div class="common-text">
-                <el-text>订单来源:</el-text>
-                <el-text>{{ orderFormText }}</el-text>
-            </div>
-            <div class="common-text">
-                <el-text>订单备注:</el-text>
-                <el-text>{{ row.userExpress || '-' }}</el-text>
-            </div>
-        </template>
+  <div class="recycle-order-number">
+    <div class="common-text" v-if="!isReturn">
+      <el-text>订单号:</el-text>
+      <el-text type="danger">{{ row.orderId }}</el-text>
+    </div>
+    <div class="common-text" v-if="isReturn">
+      <el-text>退回编号:</el-text>
+      <el-text type="danger">{{ row.refundOrderId }}</el-text>
+    </div>
+    <div class="common-text">
+      <el-text>快递单号:</el-text>
+      <el-text v-if="!row.waybillCode">暂无信息</el-text>
+      <el-text v-else type="success">{{ row.waybillCode }}</el-text>
+    </div>
+    <div class="common-text">
+      <el-text>快递公司:</el-text>
+      <el-text v-if="row.expressName" type="success">{{ row.expressName }}</el-text>
+      <el-text v-else :type="row.finalExpress && row.finalExpress != '0' ? 'success' : ''">{{
+        finalExpressText
+      }}</el-text>
+    </div>
+    <template v-if="!isReturn">
+      <div class="common-text">
+        <el-text>订单来源:</el-text>
+        <el-text>{{ orderFormText }}</el-text>
+      </div>
+      <div class="common-text">
+        <el-text>订单备注:</el-text>
+        <el-text>{{ row.userExpress || '-' }}</el-text>
+      </div>
+    </template>
 
-        <div class="common-text" v-if="isReturn">
-            <el-text>回收订单:</el-text>
-            <el-text>2732781321</el-text>
-        </div>
+    <div class="common-text" v-if="isReturn">
+      <el-text>回收订单:</el-text>
+      <el-text>{{ row.originOrderId }}</el-text>
     </div>
+  </div>
 </template>
 
 <script setup>
-import { useDictData } from '@/utils/use-dict-data';
-
-/** 字典数据 */
-const [expressDicts, orderFormDicts] = useDictData(['final_express', 'order_form']);
+  import { useDictData } from '@/utils/use-dict-data';
 
+  /** 字典数据 */
+  const [expressDicts, orderFormDicts] = useDictData([
+    'final_express',
+    'order_form'
+  ]);
 
-const finalExpressText = computed(() => {
+  const finalExpressText = computed(() => {
     if (props.row.finalExpress == '0' || !props.row.finalExpress) {
-        return '暂无信息'
+      return '暂无信息';
     }
-    return expressDicts.value.find((d) => d.dictValue == props.row.finalExpress)?.dictLabel || '暂无信息'
-})
+    return (
+      expressDicts.value.find((d) => d.dictValue == props.row.finalExpress)
+        ?.dictLabel || '暂无信息'
+    );
+  });
 
-const orderFormText = computed(() => {
-    return orderFormDicts.value.find((d) => d.dictValue == props.row.orderFrom)?.dictLabel || '暂无信息'
-})
+  const orderFormText = computed(() => {
+    return (
+      orderFormDicts.value.find((d) => d.dictValue == props.row.orderFrom)
+        ?.dictLabel || '暂无信息'
+    );
+  });
 
-const props = defineProps({
+  const props = defineProps({
     row: {
-        type: Object,
-        default: () => { }
+      type: Object,
+      default: () => {}
     },
     isReturn: {
-        type: Boolean,
-        default: false
+      type: Boolean,
+      default: false
     }
-});
+  });
 </script>

+ 18 - 0
src/views/recycleOrder/components/order-page-all.vue

@@ -285,6 +285,10 @@
     <applyForOrderClaim ref="applyForOrderClaimRef" />
     <!-- 售后补款 -->
     <afterSalesPayment ref="afterSalesPaymentRef" />
+    <!-- 推送短信 -->
+    <sendSMS ref="sendSMSRef" />
+    <!-- 短信记录 -->
+    <orderSmsLog ref="orderSmsLogRef" />
   </ele-page>
 </template>
 
@@ -315,6 +319,10 @@
   import orderDetail from '@/views/recycleOrder/components/order-detail.vue';
   //审核截图
   import auditScreenshot from '@/views/recycleOrder/components/audit-screenshot.vue';
+  //推送短信
+  import sendSMS from '@/views/recycleOrder/components/send-SMS.vue';
+  //短信记录
+  import orderSmsLog from '@/views/recycleOrder/components/order-sms-log.vue';
 
   let props = defineProps({
     pageConfig: {
@@ -590,6 +598,16 @@
   function handleAfterSalesPayment(row) {
     afterSalesPaymentRef.value?.handleOpen(row);
   }
+  //推送短信
+  const sendSMSRef = ref(null);
+  function handleSendSMS(row) {
+    sendSMSRef.value?.handleOpen(row);
+  }
+  //短信记录
+  const orderSmsLogRef = ref(null);
+  function handleSmsLog(row) {
+    orderSmsLogRef.value?.handleOpen(row);
+  }
 
   //确认收货
   function handleConfirmReceipt(row) {

+ 33 - 11
src/views/recycleOrder/components/order-sms-log.vue

@@ -1,7 +1,11 @@
 <!-- 编辑弹窗 -->
 <template>
-  <ele-modal form :width="800" v-model="visible" title="短信记录">
-    <SimpleTable style="width: 100%" :columns="columns"></SimpleTable>
+  <ele-modal form :width="920" v-model="visible" title="短信记录">
+    <ele-data-table
+      row-key="id"
+      :columns="columns"
+      :data="smsRecords"
+    ></ele-data-table>
 
     <template #footer>
       <el-button @click="handleCancel">关闭</el-button>
@@ -10,29 +14,47 @@
 </template>
 
 <script setup>
-  import { ref, reactive, nextTick } from 'vue';
-  import { Flag, ChatDotSquare } from '@element-plus/icons-vue';
-  import SimpleTable from '@/components/CommonPage/SimpleTable.vue';
+  import { ref, reactive, nextTick, getCurrentInstance } from 'vue';
+  import { EleMessage } from 'ele-admin-plus/es';
+
+  const { proxy } = getCurrentInstance();
 
   /** 弹窗是否打开 */
   const visible = defineModel({ type: Boolean });
 
+  /** SMS记录数据 */
+  const smsRecords = ref([]);
+
   /** 关闭弹窗 */
   const handleCancel = () => {
     visible.value = false;
   };
 
   /** 弹窗打开事件 */
-  const handleOpen = () => {
-    visible.value = true;
-    nextTick(() => console.log('打开'));
+  const handleOpen = (row) => {
+    if (row.orderId) {
+      visible.value = true;
+      getSmsLogInfo(row.orderId);
+    }
+  };
+
+  /** 获取短信记录信息 */
+  const getSmsLogInfo = (orderId) => {
+    proxy.$http.get(`/order/orderSmsLog/getInfo/${orderId}`).then((res) => {
+      if (res.data.code === 200) {
+        let data = res.data.data || [];
+        smsRecords.value = data.smsLogList || [];
+      } else {
+        EleMessage.error(res.data.msg || '获取短信记录失败');
+      }
+    });
   };
 
   // 表格数据
   const columns = reactive([
-    { label: '发送人', prop: 'createBy', width: 100 },
-    { label: '发送内容', prop: 'logDescription' },
-    { label: '发送时间', prop: 'createTime', width: 180 }
+    { label: '发送人', prop: 'createName', width: 100 },
+    { label: '发送内容', prop: 'smsContent' },
+    { label: '发送时间', prop: 'createTime', width: 170 }
   ]);
 
   defineExpose({

+ 108 - 29
src/views/recycleOrder/components/send-SMS.vue

@@ -1,6 +1,12 @@
 <!-- 编辑弹窗 -->
 <template>
-  <ele-modal form :width="800" v-model="visible" title="推送短信">
+  <ele-modal
+    form
+    :width="800"
+    v-model="visible"
+    title="推送短信"
+    @open="handleOpen"
+  >
     <el-form
       ref="formRef"
       :model="form"
@@ -8,11 +14,14 @@
       label-width="80px"
       @submit.prevent=""
     >
-      <el-form-item label="短信类型" prop="paymentType">
-        <el-radio-group v-model="form.paymentType">
-          <el-radio :value="1">部分未收到</el-radio>
-          <el-radio :value="2">有多出书籍</el-radio>
-          <el-radio :value="3">书籍与订单不符</el-radio>
+      <el-form-item label="短信类型" prop="type">
+        <el-radio-group v-model="form.type" @change="handleChangeType">
+          <el-radio
+            :value="item.type"
+            v-for="item in smsContentList"
+            :key="item.type"
+            >{{ item.typeName }}</el-radio
+          >
         </el-radio-group>
       </el-form-item>
       <el-form-item label="短信预览" prop="remark">
@@ -20,52 +29,61 @@
           :rows="4"
           type="textarea"
           v-model="form.remark"
+          disabled
           placeholder="请输入短信预览"
         />
       </el-form-item>
       <el-form-item label="推送历史" prop="records">
-        <SimpleTable style="width: 100%" :columns="columns"></SimpleTable>
+        <ele-data-table
+          row-key="id"
+          :columns="columns"
+          :data="smsRecords"
+        ></ele-data-table>
       </el-form-item>
     </el-form>
 
     <template #footer>
       <el-button @click="handleCancel">关闭</el-button>
-      <el-button type="primary" @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 { Flag, ChatDotSquare } from '@element-plus/icons-vue';
-  import orderTimeline from '@/views/recycleOrder/components/order-timeline.vue';
-  import SimpleTable from '@/components/CommonPage/SimpleTable.vue';
+  import { ref, reactive, nextTick, getCurrentInstance } from 'vue';
+  import { EleMessage } from 'ele-admin-plus/es';
+
+  const { proxy } = getCurrentInstance();
+  const emit = defineEmits(['success']);
 
   /** 弹窗是否打开 */
   const visible = defineModel({ type: Boolean });
 
-  /** 关闭弹窗 */
-  const handleCancel = () => {
-    visible.value = false;
-  };
+  /** 表单引用 */
+  const formRef = ref();
 
-  /** 弹窗打开事件 */
-  const handleOpen = () => {
-    visible.value = true;
-    nextTick(() => console.log('打开'));
-  };
+  /** SMS记录数据 */
+  const smsRecords = ref([]);
 
   const form = reactive({
-    paymentType: '',
-    remark: '',
+    orderId: null,
+    type: '',
+    remark: ''
   });
+
+  /** 短信类型 */
+  const handleChangeType = (val) => {
+    form.remark = smsContentList.value.find(
+      (item) => item.type === val
+    ).smsContent;
+  };
+
   /** 表单验证规则 */
   const rules = reactive({
-    paymentType: [
+    type: [
       {
         required: true,
         message: '请选择短信类型',
-        type: 'string',
         trigger: 'change'
       }
     ],
@@ -76,16 +94,77 @@
         type: 'string',
         trigger: 'blur'
       }
-    ],
+    ]
   });
 
   // 表格数据
   const columns = reactive([
-    { label: '发送人', prop: 'createBy', width: 100 },
-    { label: '发送内容', prop: 'logDescription' },
-    { label: '发送时间', prop: 'createTime', width: 180 },
+    { label: '发送人', prop: 'createName', width: 100 },
+    { label: '发送内容', prop: 'smsContent' },
+    { label: '发送时间', prop: 'createTime', width: 160 }
   ]);
 
+  /** 关闭弹窗 */
+  const handleCancel = () => {
+    visible.value = false;
+    resetForm();
+  };
+
+  /** 重置表单 */
+  const resetForm = () => {
+    form.orderId = null;
+    form.type = '';
+    form.remark = '';
+    formRef.value?.resetFields();
+  };
+
+  /** 弹窗打开事件 */
+  const handleOpen = (row) => {
+    resetForm();
+    if (row.orderId) {
+      console.log(row, 'xxx');
+      visible.value = true;
+      getSmsLogInfo(row.orderId);
+    }
+  };
+
+  /** 获取短信记录信息 */
+  const smsContentList = ref([]);
+  const getSmsLogInfo = (orderId) => {
+    proxy.$http.get(`/order/orderSmsLog/getInfo/${orderId}`).then((res) => {
+      if (res.data.code === 200) {
+        let data = res.data.data || [];
+        form.orderId = data.orderId;
+        smsRecords.value = data.smsLogList;
+        smsContentList.value = data.smsContentList;
+      } else {
+        EleMessage.error(res.data.msg || '获取短信记录失败');
+      }
+    });
+  };
+
+  /** 提交表单 */
+  const handleSubmit = () => {
+    formRef.value?.validate(async (valid) => {
+      if (!valid) return;
+      proxy.$http
+        .post('/order/orderSmsLog/send', {
+          orderId: form.orderId,
+          type: form.type,
+          smsContent: form.remark
+        })
+        .then((res) => {
+          if (res.data.code == 200) {
+            EleMessage.success('短信发送成功');
+            emit('success');
+            handleCancel();
+          } else {
+            EleMessage.error(res.data.msg || '短信发送失败');
+          }
+        });
+    });
+  };
+
   defineExpose({
     handleOpen
   });

+ 1 - 1
src/views/recycleOrder/detail/index.vue

@@ -20,7 +20,7 @@
             品相良好:按原始回收折扣计价;品相一般:按原始回收折扣*0.7计价;品相极差:不收。
         </ele-card>
         <ele-card class="order-freight" header="物流动态">
-            <orderFreightStatus />
+            <orderFreightStatus :records="detail.trackingVoList" />
         </ele-card>
     </ele-page>
 </template>

+ 5 - 37
src/views/recycleOrder/detail/order-freight-status.vue

@@ -1,50 +1,18 @@
 <template>
-  <el-timeline>
+  <el-empty v-if="!records.length" description="暂无物流信息" :image-size="100" />
+  <el-timeline v-else>
     <el-timeline-item
-      v-for="(item, index) in recordsList"
+      v-for="(item, index) in records"
       :key="index"
       :timestamp="item.time"
     >
-      <div>{{ item.label }}</div>
-      {{ item.desc }}
+      <div>{{ item.title }}</div>
+      {{ item.description }}
     </el-timeline-item>
   </el-timeline>
 </template>
 
 <script setup>
-  import { reactive } from 'vue';
-  const recordsList = reactive([
-    {
-      label: '妥投',
-      time: '2024/07/28 07:35:36',
-      desc: '您的快件已由本人签收,感谢您使用京东物流,期待再次为您服务。'
-    },
-    {
-      label: '妥投',
-      time: '2024/07/28 07:35:36',
-      desc: '您的快件已由本人签收,感谢您使用京东物流,期待再次为您服务。'
-    },
-    {
-      label: '妥投',
-      time: '2024/07/28 07:35:36',
-      desc: '您的快件已由本人签收,感谢您使用京东物流,期待再次为您服务。'
-    },
-    {
-      label: '妥投',
-      time: '2024/07/28 07:35:36',
-      desc: '您的快件已由本人签收,感谢您使用京东物流,期待再次为您服务。'
-    },
-    {
-      label: '妥投',
-      time: '2024/07/28 07:35:36',
-      desc: '您的快件已由本人签收,感谢您使用京东物流,期待再次为您服务。'
-    },
-    {
-      label: '妥投',
-      time: '2024/07/28 07:35:36',
-      desc: '您的快件已由本人签收,感谢您使用京东物流,期待再次为您服务。'
-    }
-  ]);
   const props = defineProps({
     records: {
       type: Array,

+ 172 - 0
src/views/recycleOrder/needReturned/components/order-base-info.vue

@@ -0,0 +1,172 @@
+<template>
+  <div class="base-info">
+    <ele-data-table
+      ref="tableRef"
+      row-key="userId"
+      :columns="columns"
+      :data="datasource"
+      :tools="false"
+      :pagination="false"
+    >
+      <template #userNick="{ row }">
+        <el-text
+          >{{ formatName(detail.receiveName) }}(ID:{{
+            detail.userId
+          }})</el-text
+        >
+      </template>
+
+      <template #orderTime="{ row }">
+        <div class="common-text">
+          <el-text>建单:</el-text>
+          <el-text>{{ row.createTime }}</el-text>
+        </div>
+        <div class="common-text">
+          <el-text>付款:</el-text>
+          <el-text>{{ row.payTime || '-' }}</el-text>
+        </div>
+      </template>
+      <template #status="{ row }">
+        <el-tag effect="dark" :type="row.status < 1 ? 'warning' : 'success'">{{
+          row.status < 1 ? '未付款' : '已付款'
+        }}</el-tag>
+        <el-tag
+          style="margin-left: 15px"
+          effect="dark"
+          :type="row.status < 5 ? 'warning' : 'success'"
+          >{{ row.status < 5 ? '未完成' : '已完成' }}</el-tag
+        >
+      </template>
+    </ele-data-table>
+    <el-row :gutter="12" style="padding: 16px 10px; padding-bottom: 0">
+      <el-col :span="8">
+        <div class="common-text">
+          <el-text>物流类型:</el-text>
+          <el-text>平台物流</el-text>
+        </div>
+        <div class="common-text">
+          <el-text>快递单号:</el-text>
+          <el-text>{{ detail.waybillCode || '暂无信息' }}</el-text>
+        </div>
+        <div class="common-text">
+          <el-text>快递公司:</el-text>
+          <el-text>{{ finalExpressText || '暂无信息' }}</el-text>
+        </div>
+        <div class="common-text">
+          <el-text>发货时间:</el-text>
+          <el-text>{{ detail.sendTime || '-' }}</el-text>
+        </div>
+      </el-col>
+      <el-col :span="8">
+        <div class="common-text">
+          <el-text>收货人:</el-text>
+          <el-text
+            >{{ formatName(detail.receiveName) }}(ID:{{
+              detail.userId
+            }})</el-text
+          >
+        </div>
+        <div class="common-text">
+          <el-text>电 话:</el-text>
+          <el-text>{{ formatPhone(detail.receiveMobile) }}</el-text>
+        </div>
+        <div class="common-text">
+          <el-text>地 址:</el-text>
+          <el-text>{{ detail.receiveAddress || '-' }}</el-text>
+        </div>
+        <div class="common-text">
+          <el-text>买家留言:</el-text>
+          <el-text>{{ detail.userExpress || '-' }}</el-text>
+        </div>
+      </el-col>
+      <el-col :span="8">
+        <el-tag
+          effect="dark"
+          :type="detail.firstOrder == 1 ? 'success' : 'warning'"
+          >{{ detail.firstOrder == 1 ? '首单' : '非首单' }}</el-tag
+        >
+        <el-tag
+          style="margin-left: 15px"
+          effect="dark"
+          :type="detail.stockStatus == 1 ? 'success' : 'warning'"
+          >{{ detail.stockStatus == 1 ? '已入库' : '未入库' }}</el-tag
+        >
+        <el-tag
+          style="margin-left: 15px"
+          effect="dark"
+          :type="detail.checkStatus == 1 ? 'success' : 'warning'"
+          >{{ detail.checkStatus == 1 ? '已推送' : '未推送' }}</el-tag
+        >
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script setup>
+  import { formatName, formatPhone } from '@/utils/common';
+  import { ref, reactive, watch } from 'vue';
+  const props = defineProps({
+    detail: { type: Object, default: () => ({}) }
+  });
+
+  import { useDictData } from '@/utils/use-dict-data';
+
+  /** 字典数据 */
+  const [expressDicts, orderFormDicts] = useDictData([
+    'final_express',
+    'order_form'
+  ]);
+
+  const finalExpressText = computed(() => {
+    if (props.detail.finalExpress == '0' || !props.detail.finalExpress) {
+      return '暂无信息';
+    }
+    return (
+      expressDicts.value.find((d) => d.dictValue == props.detail.finalExpress)
+        ?.dictLabel || '暂无信息'
+    );
+  });
+
+  const formatTime = computed(() => {
+    if (!props.detail.schedulePickupStartTime) return '-';
+    return (
+      props.detail.schedulePickupStartTime +
+      '-' +
+      props.detail.schedulePickupEndTime.split(' ')[1]
+    );
+  });
+
+  const datasource = ref([]);
+  watch(
+    () => props.detail,
+    (newVal) => {
+      console.log(newVal, 'newVal');
+      datasource.value = newVal ? [newVal] : [];
+      console.log(datasource.value);
+    },
+    { immediate: true, deep: true }
+  );
+
+  const columns = ref([
+    { label: '订单编号', prop: 'refundOrderId' },
+    {
+      label: '订单来源',
+      prop: 'orderFrom',
+      formatter: (row) => '申请退回订单'
+    },
+    { label: '用户', prop: 'userNick', slot: 'userNick' },
+    {
+      label: '订单运费',
+      prop: 'expressMoney',
+      formatter: (row) => '¥' + row.expressMoney
+    },
+    {
+      label: '实付款',
+      prop: 'payMoney',
+      formatter: (row) =>
+        typeof row.payMoney == 'number' ? '¥' + row.payMoney : '-'
+    },
+    { label: '创建时间', prop: 'orderTime', slot: 'orderTime', width: 200 },
+    { label: '交易状态', prop: 'status', slot: 'status', width: 240 }
+  ]);
+</script>

+ 26 - 0
src/views/recycleOrder/needReturned/components/order-freight-status.vue

@@ -0,0 +1,26 @@
+<template>
+  <el-empty v-if="!records.length" description="暂无物流信息" :image-size="100" />
+  <el-timeline v-else>
+    <el-timeline-item
+      v-for="(item, index) in records"
+      :key="index"
+      :timestamp="item.ftime"
+    >
+      <div>{{ item.status }}</div>
+      {{ item.context }}
+    </el-timeline-item>
+  </el-timeline>
+</template>
+
+<script setup>
+  const props = defineProps({
+    records: {
+      type: Array,
+      default: () => []
+    },
+    title: {
+      type: String,
+      default: ''
+    }
+  });
+</script>

+ 53 - 0
src/views/recycleOrder/needReturned/components/order-status.vue

@@ -0,0 +1,53 @@
+<template>
+    <el-steps style="width: 100%" :active="active" align-center finish-status="success">
+        <el-step v-for="item in stepList" :title="item.label">
+            <template #description>
+                <div>{{ item.time }}</div>
+                <div>{{ item.createdBy }}</div>
+            </template>
+        </el-step>
+    </el-steps>
+</template>
+
+<script setup>
+import { ref, reactive, watch } from 'vue';
+// 状态 0-创建(待付款) 1-已付款 2-已推送 3-已发货 4-已签收 5-已完成 6-已取消 7-超时取消
+const stepList = reactive([
+    { label: '创建', time: '', createdBy: '', stutus: '0' },
+    { label: '付款', time: '', createdBy: '', stutus: '1' },
+    { label: '发货', time: '', createdBy: '', stutus: '3' },
+    { label: '已签收', time: '', createdBy: '', stutus: '4' },
+    { label: '完成', time: '', createdBy: '', stutus: '5' },
+]);
+
+const props = defineProps({
+    status: {
+        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(() => {
+    let status = props.logVoList[props.logVoList.length - 1]?.status || 0;
+    return stepList.findIndex(item => item.stutus == status) + 1;
+});
+
+</script>

+ 226 - 164
src/views/recycleOrder/needReturned/index.vue

@@ -1,209 +1,271 @@
 <template>
-    <ele-page flex-table>
-        <!-- 搜索表单 -->
-        <return-search @search="reload" />
-        <ele-card :body-style="{ paddingTop: '8px' }" flex-table>
-            <!-- 表格 -->
-            <ele-pro-table ref="tableRef" row-key="postId" :columns="columns" :datasource="datasource"
-                :show-overflow-tooltip="true" v-model:selections="selections" highlight-current-row
-                :export-config="{ fileName: '需退回订单' }" cache-key="needReturnedTable" :tools="false">
-                <template #status="{ row }">
-                    <dict-data code="refund_status" type="text" :model-value="row.status" />
-                </template>
-                <template #isPush="{ row }">
-                    <el-tag type="success" v-if="row.checkStatus == 1">已推送</el-tag>
-                    <el-tag type="danger" v-else>未推送</el-tag>
-                </template>
-                <template #isFirstOrder="{ row }">
-                    <dict-data code="is_first_order" type="tag" :model-value="row.firstOrder" />
-                </template>
-                <template #orderNumber="{ row }">
-                    <order-number :row="row" isReturn></order-number>
-                </template>
-                <template #customer="{ row }">
-                    <refund-customer :row="row"></refund-customer>
-                </template>
-                <template #amount="{ row }">
-                    <div class="common-text flex flex-col">
-                        <el-text>余额</el-text>
-                        <el-text>邮费:¥ {{ row.expressMoney || '0' }} </el-text>
-                    </div>
-                </template>
-                <template #remarks="{ row }">
-                    <el-popover trigger="hover" width="240px" @show="handleShowPopover(row)" @hide="showOrderId = ''">
-                        <template #reference>
-                            <el-icon style="cursor: pointer" :size="24" :color="row.remarkLabel || '#777777'"
-                                @click="handleRemarks(row)">
-                                <Flag />
-                            </el-icon>
-                        </template>
-                        <orderTimeline :orderId="showOrderId" title="备注历史记录"></orderTimeline>
-                    </el-popover>
-                </template>
-
-                <template #action="{ row }">
-                    <div>
-                        <el-button type="success" link v-permission="'recycleOrder:needReturned:detail'"
-                            @click="toOrderDetail(row)">
-                            [订单详情]
-                        </el-button>
-                        <el-button color="#7728f5" link plain v-permission="'recycleOrder:needReturned:manualDelivery'"
-                            @click="handleManualDelivery(row)">
-                            [手工发货]
-                        </el-button>
-                        <el-button type="danger" link v-permission="'recycleOrder:needReturned:cancel'"
-                            @click="cancelOrder(row)">
-                            [取消订单]
-                        </el-button>
-                        <el-button type="warning" link v-permission="'recycleOrder:needReturned:log'"
-                            @click="openOrderLog(row)">
-                            [订单日志]
-                        </el-button>
-                    </div>
-                </template>
-            </ele-pro-table>
-        </ele-card>
-
-        <slot></slot>
-        <orderRemarks ref="remarksRef" />
-        <orderLog ref="logRef" />
-    </ele-page>
+  <ele-page flex-table>
+    <!-- 搜索表单 -->
+    <return-search @search="reload" />
+    <ele-card :body-style="{ paddingTop: '8px' }" flex-table>
+      <!-- 表格 -->
+      <ele-pro-table
+        ref="tableRef"
+        row-key="postId"
+        :columns="columns"
+        :datasource="datasource"
+        :show-overflow-tooltip="true"
+        v-model:selections="selections"
+        highlight-current-row
+        :export-config="{ fileName: '需退回订单' }"
+        cache-key="needReturnedTable"
+        :tools="false"
+      >
+        <template #status="{ row }">
+          <dict-data
+            code="refund_status"
+            type="text"
+            :model-value="row.status"
+          />
+        </template>
+        <template #isPush="{ row }">
+          <el-tag type="success" v-if="row.checkStatus == 1">已推送</el-tag>
+          <el-tag type="danger" v-else>未推送</el-tag>
+        </template>
+        <template #isFirstOrder="{ row }">
+          <dict-data
+            code="is_first_order"
+            type="tag"
+            :model-value="row.firstOrder"
+          />
+        </template>
+        <template #orderNumber="{ row }">
+          <order-number :row="row" isReturn></order-number>
+        </template>
+        <template #customer="{ row }">
+          <refund-customer :row="row"></refund-customer>
+        </template>
+        <template #amount="{ row }">
+          <div class="common-text flex flex-col">
+            <el-text>余额</el-text>
+            <el-text>邮费:¥ {{ row.expressMoney || '0' }} </el-text>
+          </div>
+        </template>
+        <template #remarks="{ row }">
+          <el-popover
+            trigger="hover"
+            width="240px"
+            @show="handleShowPopover(row)"
+            @hide="showOrderId = ''"
+          >
+            <template #reference>
+              <el-icon
+                style="cursor: pointer"
+                :size="24"
+                :color="row.remarkLabel || '#777777'"
+                @click="handleRemarks(row)"
+              >
+                <Flag />
+              </el-icon>
+            </template>
+            <orderTimeline
+              :orderId="showOrderId"
+              title="备注历史记录"
+            ></orderTimeline>
+          </el-popover>
+        </template>
+
+        <template #action="{ row }">
+          <div>
+            <el-button
+              type="success"
+              link
+              v-permission="'recycleOrder:needReturned:detail'"
+              @click="toOrderDetail(row)"
+            >
+              [订单详情]
+            </el-button>
+            <el-button
+              color="#7728f5"
+              v-if="row.status !== '3'"
+              link
+              plain
+              v-permission="'recycleOrder:needReturned:manualDelivery'"
+              @click="handleManualDelivery(row)"
+            >
+              [手工发货]
+            </el-button>
+            <el-button
+              type="danger"
+              link
+              v-permission="'recycleOrder:needReturned:cancel'"
+              @click="cancelOrder(row)"
+            >
+              [取消订单]
+            </el-button>
+            <el-button
+              type="warning"
+              link
+              v-permission="'recycleOrder:needReturned:log'"
+              @click="openOrderLog(row)"
+            >
+              [订单日志]
+            </el-button>
+          </div>
+        </template>
+      </ele-pro-table>
+    </ele-card>
+
+    <slot></slot>
+    <orderRemarks ref="remarksRef" />
+    <orderLog ref="logRef" />
+    <manualDelivery ref="deliveryRef" @success="reload()" />
+    <orderRefundDetail ref="orderDetailRef" />
+  </ele-page>
 </template>
 
 <script setup>
-import { ref, getCurrentInstance } from 'vue';
-import { ElMessageBox } from 'element-plus/es';
-import { Flag, ChatDotSquare } from '@element-plus/icons-vue';
-import returnSearch from './return-search.vue';
-import OrderNumber from '@/views/recycleOrder/components/order-number.vue';
-import RefundCustomer from '@/views/recycleOrder/components/refund-customer.vue';
-import { useDictData } from '@/utils/use-dict-data';
-import orderRemarks from '@/views/recycleOrder/components/order-remarks.vue';
-import orderTimeline from '@/views/recycleOrder/components/order-timeline.vue';
-import orderLog from '@/views/recycleOrder/components/order-log.vue'
-import { useRouter } from 'vue-router';
-let router = useRouter();
-
-let props = defineProps({
+  import { ref, getCurrentInstance } from 'vue';
+  import { ElMessageBox } from 'element-plus/es';
+  import { Flag, ChatDotSquare } from '@element-plus/icons-vue';
+  import returnSearch from './return-search.vue';
+  import OrderNumber from '@/views/recycleOrder/components/order-number.vue';
+  import RefundCustomer from '@/views/recycleOrder/components/refund-customer.vue';
+  import { useDictData } from '@/utils/use-dict-data';
+  import orderRemarks from '@/views/recycleOrder/components/order-remarks.vue';
+  import orderTimeline from '@/views/recycleOrder/components/order-timeline.vue';
+  import orderLog from '@/views/recycleOrder/components/order-log.vue';
+  import manualDelivery from '@/views/recycleOrder/components/manual-delivery.vue';
+  //订单详情
+  import orderRefundDetail from '@/views/recycleOrder/needReturned/order-refund-detail.vue';
+
+  import { useRouter } from 'vue-router';
+  let router = useRouter();
+
+  let props = defineProps({
     pageConfig: {
-        type: Object,
-        default: () => ({
-            cacheKey: 'recycleOrderTable',
-            fileName: '需退回订单'
-        })
+      type: Object,
+      default: () => ({
+        cacheKey: 'recycleOrderTable',
+        fileName: '需退回订单'
+      })
     },
     pageUrl: { type: String, default: '/order/orderInfo/refund/pageList' },
     exportUrl: { type: String, default: '/system/post/export' }
-});
-let { proxy } = getCurrentInstance();
-/** 字典数据 */
-const [statusDicts] = useDictData(['sys_normal_disable']);
+  });
+  let { proxy } = getCurrentInstance();
+  /** 字典数据 */
+  const [statusDicts] = useDictData(['sys_normal_disable']);
 
-/** 表格实例 */
-const tableRef = ref(null);
+  /** 表格实例 */
+  const tableRef = ref(null);
 
-/** 表格列配置 */
-const columns = ref([
+  /** 表格列配置 */
+  const columns = ref([
     {
-        type: 'selection',
-        columnKey: 'selection',
-        width: 50,
-        align: 'center',
-        fixed: 'left'
+      type: 'selection',
+      columnKey: 'selection',
+      width: 50,
+      align: 'center',
+      fixed: 'left'
+    },
+    {
+      label: '单号',
+      prop: 'refundOrderId',
+      slot: 'orderNumber',
+      minWidth: 180
     },
-    { label: '单号', prop: 'refundOrderId', slot: 'orderNumber', minWidth: 180 },
     { label: '客户', prop: 'userNick', slot: 'customer', minWidth: 380 },
     { label: '金额', prop: 'balanceMoney', slot: 'amount', minWidth: 100 },
     { label: '是否推送', prop: 'plat', slot: 'isPush' },
     {
-        label: '订单状态',
-        prop: 'status',
-        slot: 'status',
-        formatter: (row) =>
-            statusDicts.value.find((d) => d.dictValue == row.status)?.dictLabel
+      label: '订单状态',
+      prop: 'status',
+      slot: 'status',
+      formatter: (row) =>
+        statusDicts.value.find((d) => d.dictValue == row.status)?.dictLabel
     },
     {
-        label: '入库状态',
-        prop: 'status',
-        formatter: (row) => row.stockStatus == 1 ? '已入库' : '-'
+      label: '入库状态',
+      prop: 'stockStatus',
+      formatter: (row) => (row.stockStatus == 1 ? '已入库' : '-')
     },
     { label: '是否首单', prop: 'firstOrder', slot: 'isFirstOrder' },
     { label: '备注', prop: 'remarkLabel', slot: 'remarks' },
     {
-        columnKey: 'action',
-        label: '操作',
-        width: 120,
-        align: 'center',
-        slot: 'action',
-        hideInPrint: true,
-        hideInExport: true
+      columnKey: 'action',
+      label: '操作',
+      width: 120,
+      align: 'center',
+      slot: 'action',
+      hideInPrint: true,
+      hideInExport: true
     }
-]);
+  ]);
 
-/** 表格选中数据 */
-const selections = ref([]);
+  /** 表格选中数据 */
+  const selections = ref([]);
 
-/** 当前编辑数据 */
-const current = ref(null);
+  /** 当前编辑数据 */
+  const current = ref(null);
 
-/** 是否显示编辑弹窗 */
-const showEdit = ref(false);
+  /** 是否显示编辑弹窗 */
+  const showEdit = ref(false);
 
-async function queryPage(params) {
+  async function queryPage(params) {
     const res = await proxy.$http.get(props.pageUrl, { params });
     if (res.data.code === 200) {
-        return res.data;
+      return res.data;
     }
     return Promise.reject(new Error(res.data.msg));
-}
+  }
 
-/** 表格数据源 */
-const datasource = ({ pages, where, orders }) => {
+  /** 表格数据源 */
+  const datasource = ({ pages, where, orders }) => {
     return queryPage({ ...where, ...orders, ...pages });
-};
+  };
 
-/** 搜索 */
-const reload = (where) => {
+  /** 搜索 */
+  const reload = (where) => {
     tableRef.value?.reload?.({ page: 1, where });
-};
+  };
 
-//订单详情
-function toOrderDetail(row) {
-    router.push({ path: '/recycleOrder/detail', query: { id: row.postId } });
-}
-function messageBoxConfirm({ message, url, row }) {
+  //订单详情
+  const orderDetailRef = ref(null);
+  function toOrderDetail(row) {
+    orderDetailRef.value?.handleOpen(row);
+  }
+
+  //弹窗确认
+  function messageBoxConfirm({ message, url, row }) {
     ElMessageBox.confirm(message, '提示', {
-        confirmButtonText: '确定',
-        cancelButtonText: '关闭',
-        type: 'warning'
+      confirmButtonText: '确定',
+      cancelButtonText: '关闭',
+      type: 'warning'
     }).then(() => {
-        console.log(row, 'row');
+      console.log(row, 'row');
     });
-}
+  }
 
-//取消订单
-function cancelOrder(row) {
+  //取消订单
+  function cancelOrder(row) {
     messageBoxConfirm({ message: '确认取消?', url: '', row });
-}
-//人工发货
-function handleManualDelivery(row) {
-    messageBoxConfirm({ message: '确认人工发货?', url: '', row });
-}
-//订单日志
-const logRef = ref(null);
-const openOrderLog = (row) => {
-    logRef.value?.handleOpen(row);
-};
-
-//修改备注
-const remarksRef = ref(null);
-function handleRemarks(row) {
+  }
+  //人工发货
+  const deliveryRef = ref(null);
+  function handleManualDelivery(row) {
+    deliveryRef.value?.handleOpen(row);
+  }
+  //订单日志
+  const logRef = ref(null);
+  const openOrderLog = (row) => {
+    logRef.value?.handleOpen(row.refundOrderId);
+  };
+
+  //修改备注
+  const remarksRef = ref(null);
+  function handleRemarks(row) {
     remarksRef.value?.handleOpen(row);
-}
+  }
 
-//备注弹窗显示
-const showOrderId = ref();
-function handleShowPopover(row) {
+  //备注弹窗显示
+  const showOrderId = ref();
+  function handleShowPopover(row) {
     showOrderId.value = row.originOrderId;
-}
+  }
 </script>

+ 75 - 0
src/views/recycleOrder/needReturned/order-refund-detail.vue

@@ -0,0 +1,75 @@
+<!-- 编辑弹窗 -->
+<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"
+  >
+    <refundDetail
+      :detail="orderDetail"
+      @refresh="getOrderDetail"
+      ref="refundDetailRef"
+    />
+
+    <template #footer>
+      <div style="display: flex; justify-content: center">
+        <el-button @click="handleCancel" type="danger">关闭弹窗</el-button>
+      </div>
+    </template>
+  </ele-modal>
+</template>
+
+<script setup>
+  import { ref, reactive, nextTick, getCurrentInstance } from 'vue';
+  import refundDetail from '@/views/recycleOrder/needReturned/refund-detail.vue';
+  import request from '@/utils/request';
+
+  const { proxy } = getCurrentInstance();
+  const emit = defineEmits(['refresh']);
+
+  /** 弹窗是否打开 */
+  const visible = defineModel({ type: Boolean });
+
+  /** 关闭弹窗 */
+  const handleCancel = () => {
+    visible.value = false;
+  };
+
+  /** 弹窗打开事件 */
+  let orderId = ref('');
+  const handleOpen = (data) => {
+    visible.value = true;
+    nextTick(() => {
+      if (data && data.refundOrderId) {
+        orderId.value = data.refundOrderId;
+        getOrderDetail();
+      }
+    });
+  };
+
+  //获取订单详情
+  const orderDetail = ref({});
+  const getOrderDetail = () => {
+    request
+      .get(`/order/orderInfo/refund/detail?refundOrderId=${orderId.value}`)
+      .then((res) => {
+        if (res.data.code === 200) {
+          orderDetail.value = res.data.data;
+        }
+      });
+  };
+
+  defineExpose({
+    handleOpen
+  });
+</script>

+ 101 - 0
src/views/recycleOrder/needReturned/refund-detail.vue

@@ -0,0 +1,101 @@
+<template>
+  <ele-page class="order-detail">
+    <ele-card class="order-status" header="订单状态">
+      <orderStatus :status="detail.status" :logVoList="detail.logVoList" />
+    </ele-card>
+    <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: '15px' }"
+    >
+      <ele-data-table :data="detail.detailVoList" :columns="columns">
+        <template #bookName="{ row }">
+          <div class="book-name">
+            <img :src="row.cover" style="width: 70px; height: 70px" alt="" />
+            <div style="display: flex; flex-direction: column; margin-left: 10px">
+              <div style="color: #1677ff">{{ row.bookName }}</div>
+              <div style="color: #666">{{ row.isbn }}</div>
+            </div>
+          </div>
+        </template>
+      </ele-data-table>
+    </ele-card>
+
+    <ele-card class="order-service" header="订单服务">
+      <el-tag size="large" style="margin-right: 20px">免费退回</el-tag>
+      <el-tag size="large" style="margin-right: 20px">24小时验</el-tag>
+      <el-tag size="large">急速打款</el-tag>
+    </ele-card>
+
+    <ele-card class="order-note" header="审核计价说明">
+      品相良好:按原始回收折扣计价;品相一般:按原始回收折扣*0.7计价;品相极差:不收。
+    </ele-card>
+    <ele-card class="order-freight" header="物流动态">
+      <orderFreightStatus :records="detail.trackingVoList" />
+    </ele-card>
+  </ele-page>
+</template>
+
+<script setup>
+  import orderStatus from '@/views/recycleOrder/needReturned/components/order-status.vue';
+  import orderBaseInfo from '@/views/recycleOrder/needReturned/components/order-base-info.vue';
+  import orderFreightStatus from '@/views/recycleOrder/needReturned/components/order-freight-status.vue';
+
+  const emit = defineEmits(['refresh']);
+  const props = defineProps({
+    detail: {
+      type: Object,
+      default: () => ({})
+    }
+  });
+
+  const columns = reactive([
+    {
+      type: 'index',
+      label: '序号',
+      width: 80
+    },
+    {
+      label: '图书名称',
+      prop: 'bookName',
+      slot: 'bookName'
+    },
+    {
+      label: '数量',
+      prop: 'refundNum',
+      width: 100,
+      formatter: (row) => {
+        return 'x' + row.refundNum;
+      }
+    },
+    {
+      label: '审核信息',
+      prop: 'commentCom',
+      formatter: (row) => {
+        return row.commentCom && row.commentCom.length > 0 ? row.commentCom.join(';') : '-';
+      }
+    }
+  ]);
+
+  // 其余审核良好
+  const bookListRef = ref(null);
+  function handleOtherAuditGood() {
+    bookListRef.value?.handleOtherAuditGood();
+  }
+  defineExpose({
+    handleOtherAuditGood
+  });
+</script>
+<style lang="scss" scoped>
+  .book-name {
+    display: flex;
+    align-items: start;
+  }
+</style>

+ 15 - 14
src/views/recycleOrder/needReturned/return-search.vue

@@ -3,10 +3,10 @@
   <ele-card :body-style="{ paddingBottom: '8px' }">
     <ProSearch :columns="columns" v-model:form="form" ref="searchRef">
       <el-col :span="6" style="min-width: 160px">
-        <el-button style="width: 80px" type="primary" plain @click="search"
+        <el-button style="width: 90px" type="primary" @click="search"
           >查询</el-button
         >
-        <el-button style="width: 80px" type="info" @click="reset"
+        <el-button style="width: 90px" type="info" @click="reset"
           >重置</el-button
         >
       </el-col>
@@ -21,23 +21,24 @@
 
   const emit = defineEmits(['search']);
   const columns = reactive([
-    { tag: 'el-input', label: '退回编号', prop: 'returnNumber', span: 4 },
-    { tag: 'el-input', label: '回收订单', prop: 'recycleOrder', span: 4 },
-    { tag: 'el-input', label: '物流单号', prop: 'logisticsNumber', span: 5 },
-    { tag: 'el-input', label: '收件人名称', prop: 'recipientName', span: 4 },
-    { tag: 'el-input', label: '收件人电话', prop: 'recipientPhone', span: 4 },
+    { tag: 'el-input', label: '退回编号', prop: 'refundOrderId', span: 4 },
+    { tag: 'el-input', label: '原始订单ID', prop: 'originOrderId', span: 4 },
+    { tag: 'el-input', label: '物流单号', prop: 'waybillCode', span: 4 },
+    { tag: 'el-input', label: '收件人姓名', prop: 'receiveName', span: 4 },
+    { tag: 'el-input', label: '收件人手机', prop: 'receiveMobile', span: 4 },
+    { tag: 'el-input', label: '收件地址', prop: 'receiveAddress', span: 4 },
     {
-      tag: 'el-select',
-      label: '收货仓库',
-      prop: 'receivingWarehouse',
-      span: 3
+      tag: 'dict-data',
+      label: '状态',
+      prop: 'status',
+      span: 4,
+      tagAttrs: { code: 'refund_status', type: 'select' }
     },
-    { tag: 'el-select', label: '全部订单', prop: 'allOrders', span: 3 },
     {
       tag: 'dict-data',
       label: '是否首单',
-      prop: 'isFirstOrder',
-      span: 3,
+      prop: 'firstOrder',
+      span: 4,
       tagAttrs: { code: 'is_first_order', type: 'select' }
     }
   ]);