Selaa lähdekoodia

导出功能完成

Huanyi 2 viikkoa sitten
vanhempi
sitoutus
712805e9cb

+ 13 - 0
src/api/order/subOrder/index.ts

@@ -105,3 +105,16 @@ export const listSubOrderOnStore = (params: { storeId: string | number; pageNum:
     params
   });
 };
+
+/**
+ * 导出订单列表为 Excel
+ * @param data 查询参数
+ */
+export const exportSubOrder = (data: { status?: number; service?: number; content?: string }) => {
+  return request({
+    url: '/order/subOrder/export',
+    method: 'post',
+    data,
+    responseType: 'blob'
+  });
+};

+ 40 - 35
src/views/order/management/components/OrderDetailDrawer.vue

@@ -15,11 +15,11 @@
                 <div class="right-head">
                     <!-- Action Buttons Group -->
                     <div class="detail-actions">
-<!--                        <template v-if="[0, 1, 2].includes(order.status)">-->
-<!--                            <el-button type="success" icon="Bicycle" @click="emit('dispatch', order)">-->
-<!--                                {{ order.fulfiller || order.fulfillerName ? '重新派单' : '立即派单' }}-->
-<!--                            </el-button>-->
-<!--                        </template>-->
+                        <!--                        <template v-if="[0, 1, 2].includes(order.status)">-->
+                        <!--                            <el-button type="success" icon="Bicycle" @click="emit('dispatch', order)">-->
+                        <!--                                {{ order.fulfiller || order.fulfillerName ? '重新派单' : '立即派单' }}-->
+                        <!--                            </el-button>-->
+                        <!--                        </template>-->
 
                         <template v-if="order.status === 0">
                             <el-button v-hasPermi="['order:management:cancel']" type="danger" plain icon="CircleClose"
@@ -32,7 +32,8 @@
                         </template>
 
                         <template v-if="[3, 4].includes(order.status)">
-                            <el-button v-hasPermi="['order:management:nursingSummary']" icon="Notebook" @click="emit('care-summary', order)">护理小结</el-button>
+                            <el-button v-hasPermi="['order:management:nursingSummary']" icon="Notebook"
+                                @click="emit('care-summary', order)">护理小结</el-button>
                         </template>
 
                         <el-dropdown trigger="click" @command="(cmd) => emit('command', cmd, order)"
@@ -40,8 +41,10 @@
                             <el-button icon="More">更多操作</el-button>
                             <template #dropdown>
                                 <el-dropdown-menu>
-                                    <el-dropdown-item v-hasPermi="['order:management:reward']" command="reward" icon="Trophy">奖惩操作</el-dropdown-item>
-                                    <el-dropdown-item v-hasPermi="['order:management:remark']" command="remark" icon="EditPen">订单备注</el-dropdown-item>
+                                    <el-dropdown-item v-hasPermi="['order:management:reward']" command="reward"
+                                        icon="Trophy">奖惩操作</el-dropdown-item>
+                                    <el-dropdown-item v-hasPermi="['order:management:remark']" command="remark"
+                                        icon="EditPen">订单备注</el-dropdown-item>
                                     <el-dropdown-item command="delete" v-if="[5, 4].includes(order.status)" divided
                                         icon="Delete" style="color: #f56c6c;">删除订单</el-dropdown-item>
                                 </el-dropdown-menu>
@@ -90,7 +93,7 @@
                         <el-descriptions :column="2" size="small" class="pet-desc" border>
                             <el-descriptions-item label="品种">{{ order.petBreed || '未知' }}</el-descriptions-item>
                             <el-descriptions-item label="疫苗状态"><span style="color:#67c23a">{{ order.petVaccine || '未知'
-                            }}</span></el-descriptions-item>
+                                    }}</span></el-descriptions-item>
                             <el-descriptions-item label="性格特点">{{ order.petCharacter || '温顺' }}</el-descriptions-item>
                             <el-descriptions-item label="健康状况">{{ order.petHealth || '健康' }}</el-descriptions-item>
                         </el-descriptions>
@@ -104,7 +107,7 @@
                         <div class="user-content">
                             <div class="u-row">
                                 <el-avatar :size="40" :src="order.userAvatar">{{ (order.userName || '').charAt(0)
-                                }}</el-avatar>
+                                    }}</el-avatar>
                                 <div class="u-info">
                                     <div class="nm">{{ order.userName }}</div>
                                     <div class="ph">{{ order.contactPhone }}</div>
@@ -137,15 +140,15 @@
                                     <el-descriptions-item label="归属门店">{{ order.merchantName }}
                                         ({{ Number(order.platformId) === 1 ? '门店下单' : '平台代下单' }})</el-descriptions-item>
                                     <el-descriptions-item label="宠主信息">{{ order.userName }} / {{ order.contactPhone
-                                    }}</el-descriptions-item>
+                                        }}</el-descriptions-item>
                                     <el-descriptions-item label="服务费用" label-class-name="money-label">
                                         <span style="color:#f56c6c; font-weight:bold;">¥ {{ order.fulfillerFee }}</span>
                                     </el-descriptions-item>
 
                                     <el-descriptions-item label="预约时间">{{ getServiceTimeRange(order.serviceTime)
-                                    }}</el-descriptions-item>
+                                        }}</el-descriptions-item>
                                     <el-descriptions-item label="团购套餐">{{ order.groupBuyPackage || '未使用团购套餐'
-                                    }}</el-descriptions-item>
+                                        }}</el-descriptions-item>
                                     <el-descriptions-item label="创建时间">{{ order.createTime }}</el-descriptions-item>
 
                                     <el-descriptions-item label="订单备注" :span="3">
@@ -165,7 +168,7 @@
                                     <div class="t-row">
                                         <span class="t-k">起点</span>
                                         <span class="t-v">{{ order.detail?.fromAddress || order.detail?.pickAddr || '--'
-                                            }}</span>
+                                        }}</span>
                                     </div>
                                     <div class="t-row">
                                         <span class="t-k">终点</span>
@@ -185,7 +188,7 @@
                                 <div class="sec-title-bar">服务执行要求</div>
                                 <el-descriptions :column="2" border size="default" class="custom-desc">
                                     <el-descriptions-item label="服务地址" :span="2">{{ order.detail?.area || order.address
-                                    }}</el-descriptions-item>
+                                        }}</el-descriptions-item>
                                 </el-descriptions>
                             </div>
                         </div>
@@ -197,7 +200,7 @@
                             <div v-if="order.fulfillerName" class="fulfiller-card">
                                 <div class="f-left">
                                     <el-avatar :size="60" :src="order.fulfillerAvatar">{{ order.fulfillerName.charAt(0)
-                                    }}</el-avatar>
+                                        }}</el-avatar>
                                 </div>
                                 <div class="f-right">
                                     <div class="f-row1">
@@ -239,24 +242,25 @@
                                         <h4 class="p-title">{{ step.title }}</h4>
                                         <p class="p-desc">{{ step.desc }}</p>
                                         <div class="p-media" v-if="step.media && step.media.length">
-                                             <div v-for="(item, i) in step.media" :key="i" class="media-item">
-                                                 <!-- 图片类型 -->
-                                                 <el-image v-if="item.type === 'image'" :src="item.url"
-                                                     :preview-src-list="step.media.filter(m => m.type === 'image').map(m => m.url)"
-                                                     fit="cover" class="p-img" :preview-teleported="true" />
-
-                                                 <!-- 视频类型 -->
-                                                 <div v-else-if="item.type === 'video'" class="p-video-box"
-                                                     @click="openVideoPreview(item.url)">
-                                                     <video :src="item.url" preload="metadata" class="p-img p-video"></video>
-                                                     <div class="play-icon-overlay">
-                                                         <el-icon>
-                                                             <VideoPlay />
-                                                         </el-icon>
-                                                     </div>
-                                                 </div>
-                                             </div>
-                                         </div>
+                                            <div v-for="(item, i) in step.media" :key="i" class="media-item">
+                                                <!-- 图片类型 -->
+                                                <el-image v-if="item.type === 'image'" :src="item.url"
+                                                    :preview-src-list="step.media.filter(m => m.type === 'image').map(m => m.url)"
+                                                    fit="cover" class="p-img" :preview-teleported="true" />
+
+                                                <!-- 视频类型 -->
+                                                <div v-else-if="item.type === 'video'" class="p-video-box"
+                                                    @click="openVideoPreview(item.url)">
+                                                    <video :src="item.url" preload="metadata"
+                                                        class="p-img p-video"></video>
+                                                    <div class="play-icon-overlay">
+                                                        <el-icon>
+                                                            <VideoPlay />
+                                                        </el-icon>
+                                                    </div>
+                                                </div>
+                                            </div>
+                                        </div>
                                     </div>
                                 </el-timeline-item>
                             </el-timeline>
@@ -268,6 +272,7 @@
                         <div class="tab-pane-content">
                             <div style="display: flex; justify-content: flex-end; margin-bottom: 15px;">
                                 <el-button type="primary" size="small" icon="Download"
+                                    v-hasPermi="['order:management:queryExportExcel']"
                                     @click="handleExportLogs">导出日志Excel</el-button>
                             </div>
                             <el-timeline>
@@ -383,7 +388,7 @@ const loadOrderLogs = async (order) => {
         orderLogs.value = []
         fulfillerLogs.value = []
     }
-    
+
     try {
         const complaintRes = await listComplaintByOrder(id)
         complaintList.value = complaintRes?.data || []

+ 20 - 1
src/views/order/management/index.vue

@@ -19,6 +19,12 @@
               @keyup.enter="handleSearch"
             />
             <el-button type="primary" icon="Search" @click="handleSearch">查询</el-button>
+            <el-button
+              v-hasPermi="['order:management:export']"
+              type="success"
+              icon="Download"
+              @click="handleExport"
+            >导出Excel</el-button>
           </div>
         </div>
 
@@ -188,7 +194,7 @@ import RewardDialog from './components/RewardDialog.vue';
 import RemarkDialog from './components/RemarkDialog.vue';
 import PetDetailDrawer from '@/components/PetDetailDrawer/index.vue';
 import { listAllService } from '@/api/service/list/index';
-import { listSubOrder, dispatchSubOrder, getSubOrderInfo, cancelSubOrder, remarkSubOrder, confirmSubOrder, nursingSummarySubOrder } from '@/api/order/subOrder/index';
+import { listSubOrder, dispatchSubOrder, getSubOrderInfo, cancelSubOrder, remarkSubOrder, confirmSubOrder, nursingSummarySubOrder, exportSubOrder } from '@/api/order/subOrder/index';
 import { listAreaStation } from '@/api/system/areaStation';
 import { getStore } from '@/api/system/store';
 import { reward } from '@/api/fulfiller/pool';
@@ -739,6 +745,19 @@ const handleCommand = (cmd, row) => {
     });
   }
 };
+
+/** 导出为Excel */
+const handleExport = () => {
+  proxy?.download(
+    'order/subOrder/export',
+    {
+      status: filters.status !== '' ? Number(filters.status) : undefined,
+      service: filters.service !== '' ? filters.service : undefined,
+      content: filters.content || undefined
+    },
+    `订单列表.xlsx`
+  );
+};
 </script>
 
 <style scoped>