Bläddra i källkod

财务订单审核需求

wangxy 5 dagar sedan
förälder
incheckning
a7ad22aac3

+ 18 - 0
src/api/store/rejectNoReturn.js

@@ -17,3 +17,21 @@ export function exportRejectNoReturn(query) {
     params: query
   })
 }
+
+// 拒收未还货列表(药品订单)
+export function listStoreRejectNoReturn(query) {
+  return request({
+    url: '/store/rejectNoReturn/storeList',
+    method: 'get',
+    params: query
+  })
+}
+
+// 拒收未还货导出(药品订单)
+export function exportStoreRejectNoReturn(query) {
+  return request({
+    url: '/store/rejectNoReturn/storeExport',
+    method: 'get',
+    params: query
+  })
+}

+ 40 - 4
src/api/store/rejectReport.js

@@ -1,6 +1,6 @@
 import request from '@/utils/request'
 
-// 查询拒收明细报表订单维度列表
+// 查询拒收明细报表订单维度列表(外部订单)
 export function listRejectOrderReport(query) {
   return request({
     url: '/store/rejectReport/orderList',
@@ -9,7 +9,7 @@ export function listRejectOrderReport(query) {
   })
 }
 
-// 导出拒收明细报表订单维度
+// 导出拒收明细报表订单维度(外部订单)
 export function exportRejectOrderReport(query) {
   return request({
     url: '/store/rejectReport/orderExport',
@@ -18,7 +18,7 @@ export function exportRejectOrderReport(query) {
   })
 }
 
-// 查询拒收明细报表产品维度列表
+// 查询拒收明细报表产品维度列表(外部订单)
 export function listRejectProductReport(query) {
   return request({
     url: '/store/rejectReport/productList',
@@ -27,7 +27,7 @@ export function listRejectProductReport(query) {
   })
 }
 
-// 导出拒收明细报表产品维度
+// 导出拒收明细报表产品维度(外部订单)
 export function exportRejectProductReport(query) {
   return request({
     url: '/store/rejectReport/productExport',
@@ -35,3 +35,39 @@ export function exportRejectProductReport(query) {
     params: query
   })
 }
+
+// 查询拒收明细报表订单维度列表(药品订单)
+export function listStoreRejectOrderReport(query) {
+  return request({
+    url: '/store/rejectReport/storeOrderList',
+    method: 'get',
+    params: query
+  })
+}
+
+// 导出拒收明细报表订单维度(药品订单)
+export function exportStoreRejectOrderReport(query) {
+  return request({
+    url: '/store/rejectReport/storeOrderExport',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询拒收明细报表产品维度列表(药品订单)
+export function listStoreRejectProductReport(query) {
+  return request({
+    url: '/store/rejectReport/storeProductList',
+    method: 'get',
+    params: query
+  })
+}
+
+// 导出拒收明细报表产品维度(药品订单)
+export function exportStoreRejectProductReport(query) {
+  return request({
+    url: '/store/rejectReport/storeProductExport',
+    method: 'get',
+    params: query
+  })
+}

+ 40 - 4
src/api/store/returnReport.js

@@ -1,6 +1,6 @@
 import request from '@/utils/request'
 
-// 回款明细 - 订单维度列表
+// 回款明细 - 订单维度列表(外部订单)
 export function listReturnOrderReport(query) {
   return request({
     url: '/store/returnReport/orderList',
@@ -9,7 +9,7 @@ export function listReturnOrderReport(query) {
   })
 }
 
-// 回款明细 - 订单维度导出
+// 回款明细 - 订单维度导出(外部订单)
 export function exportReturnOrderReport(query) {
   return request({
     url: '/store/returnReport/orderExport',
@@ -18,7 +18,7 @@ export function exportReturnOrderReport(query) {
   })
 }
 
-// 回款明细 - 产品维度列表
+// 回款明细 - 产品维度列表(外部订单)
 export function listReturnProductReport(query) {
   return request({
     url: '/store/returnReport/productList',
@@ -27,7 +27,7 @@ export function listReturnProductReport(query) {
   })
 }
 
-// 回款明细 - 产品维度导出
+// 回款明细 - 产品维度导出(外部订单)
 export function exportReturnProductReport(query) {
   return request({
     url: '/store/returnReport/productExport',
@@ -35,3 +35,39 @@ export function exportReturnProductReport(query) {
     params: query
   })
 }
+
+// 回款明细 - 订单维度列表(药品订单)
+export function listStoreReturnOrderReport(query) {
+  return request({
+    url: '/store/returnReport/storeOrderList',
+    method: 'get',
+    params: query
+  })
+}
+
+// 回款明细 - 订单维度导出(药品订单)
+export function exportStoreReturnOrderReport(query) {
+  return request({
+    url: '/store/returnReport/storeOrderExport',
+    method: 'get',
+    params: query
+  })
+}
+
+// 回款明细 - 产品维度列表(药品订单)
+export function listStoreReturnProductReport(query) {
+  return request({
+    url: '/store/returnReport/storeProductList',
+    method: 'get',
+    params: query
+  })
+}
+
+// 回款明细 - 产品维度导出(药品订单)
+export function exportStoreReturnProductReport(query) {
+  return request({
+    url: '/store/returnReport/storeProductExport',
+    method: 'get',
+    params: query
+  })
+}

+ 18 - 0
src/api/store/signDetailReport.js

@@ -17,3 +17,21 @@ export function exportSignDetailReport(query) {
     params: query
   })
 }
+
+// 签收情况明细列表(药品订单)
+export function listStoreSignDetailReport(query) {
+  return request({
+    url: '/store/signDetailReport/storeList',
+    method: 'get',
+    params: query
+  })
+}
+
+// 签收情况明细导出(药品订单)
+export function exportStoreSignDetailReport(query) {
+  return request({
+    url: '/store/signDetailReport/storeExport',
+    method: 'get',
+    params: query
+  })
+}

+ 18 - 0
src/api/store/signReport.js

@@ -17,3 +17,21 @@ export function exportSignOrderReport(query) {
     params: query
   })
 }
+
+// 签收未回款列表(药品订单)
+export function listStoreSignOrderReport(query) {
+  return request({
+    url: '/store/signReport/storeList',
+    method: 'get',
+    params: query
+  })
+}
+
+// 签收未回款导出(药品订单)
+export function exportStoreSignOrderReport(query) {
+  return request({
+    url: '/store/signReport/storeExport',
+    method: 'get',
+    params: query
+  })
+}

+ 43 - 0
src/api/store/storeFinanceOrder.js

@@ -0,0 +1,43 @@
+import request from '@/utils/request'
+
+export function listStoreFinanceOrder(query) {
+  return request({
+    url: '/store/storeFinanceOrder/list',
+    method: 'get',
+    params: query
+  })
+}
+
+export function editStoreFinanceOrder(data) {
+  return request({
+    url: '/store/storeFinanceOrder/edit',
+    method: 'post',
+    data: data
+  })
+}
+
+export function exportStoreFinanceOrder(query) {
+  return request({
+    url: '/store/storeFinanceOrder/export',
+    method: 'get',
+    params: query
+  })
+}
+
+// 下载导入模板
+export function downloadStoreFinanceImportTemplate() {
+  return request({
+    url: '/store/storeFinanceOrder/importTemplate',
+    method: 'get'
+  })
+}
+
+// 导入回款数据
+export function importStoreFinanceOrder(data) {
+  return request({
+    url: '/store/storeFinanceOrder/importData',
+    method: 'post',
+    data: data,
+    headers: { 'Content-Type': 'multipart/form-data' }
+  })
+}

+ 16 - 0
src/views/store/components/storeOrderDetails.vue

@@ -82,6 +82,22 @@
       <el-descriptions-item label=" 公众号/渠道" ><span v-if="item!=null">{{ item.channel }}</span></el-descriptions-item>
       <el-descriptions-item label=" 渠道" ><span v-if="item!=null"><dict-tag :options="channelOptions" :value="item.orderChannel"/></span></el-descriptions-item>
       <el-descriptions-item label=" 企微主体" ><span v-if="item!=null"><dict-tag :options="qwSubjectOptions" :value="item.qwSubject"/></span></el-descriptions-item>
+      <el-descriptions-item label="订单总价"><span v-if="item!=null">{{item.totalPrice != null ? item.totalPrice : '-'}}</span></el-descriptions-item>
+      <el-descriptions-item label="代收金额"><span v-if="item!=null">{{item.collectionPrice != null ? item.collectionPrice : '-'}}</span></el-descriptions-item>
+      <el-descriptions-item label="退款金额"><span v-if="item!=null">{{item.refundPrice != null ? item.refundPrice : '-'}}</span></el-descriptions-item>
+      <el-descriptions-item label="回款金额"><span v-if="item!=null">{{item.returnPrice != null ? item.returnPrice : '-'}}</span></el-descriptions-item>
+      <el-descriptions-item label="定金回款时间"><span v-if="item!=null">{{item.status == 4 ? item.depositReturnTime : '-'}}</span></el-descriptions-item>
+      <el-descriptions-item label="审核人"><span v-if="item!=null">{{item.auditor || '-'}}</span></el-descriptions-item>
+      <el-descriptions-item label="审核时间"><span v-if="item!=null">{{item.auditTime || '-'}}</span></el-descriptions-item>
+      <el-descriptions-item label="病名"><span v-if="item!=null">{{item.diseaseName || '-'}}</span></el-descriptions-item>
+      <el-descriptions-item label="签收状态更新时间"><span v-if="item!=null">{{item.deliveryStatusUpdateTime || '-'}}</span></el-descriptions-item>
+      <el-descriptions-item label="签收状态更新人"><span v-if="item!=null">{{item.deliveryStatusUpdateBy || '-'}}</span></el-descriptions-item>
+      <el-descriptions-item label="拒收回退时间"><span v-if="item!=null">{{item.rejectReturnTime || '-'}}</span></el-descriptions-item>
+      <el-descriptions-item label="是否还货">
+        <span v-if="item!=null && item.isReturnGoods==1">是</span>
+        <span v-else-if="item!=null && item.isReturnGoods==2">否</span>
+        <span v-else>-</span>
+      </el-descriptions-item>
     </el-descriptions>
     </el-card>
  </div>

+ 181 - 37
src/views/store/externalOrder/index.vue

@@ -203,10 +203,10 @@
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
 
-    <el-table v-loading="loading" border :data="orderList" style="width:100%">
-      <el-table-column label="外部订单号" align="center" prop="orderCode" width="170" fixed="left" />
-      <el-table-column label="会员ID" align="center" prop="userId" width="90" />
-      <el-table-column label="订单状态" align="center" prop="status" width="100">
+    <el-table ref="orderTable" v-loading="loading" border :data="orderList" style="width:100%" show-summary :summary-method="getSummaries" @filter-change="handleFilterChange">
+      <el-table-column label="外部订单号" align="center" prop="orderCode" width="170" fixed="left" column-key="orderCode" :filters="getFilters('orderCode')" :filtered-value="columnFilters.orderCode" />
+      <el-table-column label="会员ID" align="center" prop="userId" width="90" column-key="userId" :filters="getFilters('userId')" :filtered-value="columnFilters.userId" />
+      <el-table-column label="订单状态" align="center" prop="status" width="100" column-key="status" :filters="statusFilters" :filtered-value="columnFilters.status">
         <template slot-scope="scope">
           <el-tag v-if="scope.row.status==1" type="warning" size="mini">未审核</el-tag>
           <el-tag v-else-if="scope.row.status==2" type="success" size="mini">审核通过</el-tag>
@@ -216,7 +216,7 @@
           <span v-else>-</span>
         </template>
       </el-table-column>
-      <el-table-column label="订单类型" align="center" prop="orderType" width="100">
+      <el-table-column label="订单类型" align="center" prop="orderType" width="100" column-key="orderType" :filters="orderTypeFilters" :filtered-value="columnFilters.orderType">
         <template slot-scope="scope">
           <span v-if="scope.row.orderType==1">外部订单</span>
           <span v-else-if="scope.row.orderType==2">套餐包</span>
@@ -227,56 +227,56 @@
       </el-table-column>
       <el-table-column label="所属公司" align="center" prop="companyName" width="120" show-overflow-tooltip />
       <el-table-column label="部门" align="center" prop="deptName" width="120" show-overflow-tooltip />
-      <el-table-column label="员工" align="center" prop="companyUserName" width="100" />
-      <el-table-column label="收货人" align="center" prop="userName" width="90" />
-      <el-table-column label="会员手机号" align="center" prop="memberPhone" width="130" />
-      <el-table-column label="会员年龄" align="center" prop="memberAge" width="80" />
-      <el-table-column label="会员性别" align="center" prop="memberSex" width="80">
+      <el-table-column label="员工" align="center" prop="companyUserName" width="100" column-key="companyUserName" :filters="getFilters('companyUserName')" :filtered-value="columnFilters.companyUserName" />
+      <el-table-column label="收货人" align="center" prop="userName" width="90" column-key="userName" :filters="getFilters('userName')" :filtered-value="columnFilters.userName" />
+      <el-table-column label="会员手机号" align="center" prop="memberPhone" width="130" column-key="memberPhone" :filters="getFilters('memberPhone')" :filtered-value="columnFilters.memberPhone" />
+      <el-table-column label="会员年龄" align="center" prop="memberAge" width="80" column-key="memberAge" :filters="getFilters('memberAge', null, true)" :filtered-value="columnFilters.memberAge" />
+      <el-table-column label="会员性别" align="center" prop="memberSex" width="80" column-key="memberSex" :filters="memberSexFilters" :filtered-value="columnFilters.memberSex">
         <template slot-scope="scope">
           <span v-if="scope.row.memberSex==1">男</span>
           <span v-else-if="scope.row.memberSex==2">女</span>
           <span v-else>-</span>
         </template>
       </el-table-column>
-      <el-table-column label="复购次数" align="center" prop="memberBuyCount" width="80" />
-      <el-table-column label="省" align="center" prop="province" width="80" />
-      <el-table-column label="二级市" align="center" prop="city" width="90" />
-      <el-table-column label="区县" align="center" prop="district" width="90" />
-      <el-table-column label="乡镇" align="center" prop="township" width="90" />
-      <el-table-column label="病名" align="center" prop="diseaseName" width="100" show-overflow-tooltip />
-      <el-table-column label="商品名称" align="center" prop="productNames" width="200" show-overflow-tooltip />
-      <el-table-column label="商品总额" align="center" prop="totalPrice" width="100" />
-      <el-table-column label="应收金额" align="center" prop="receivablePrice" width="100" />
-      <el-table-column label="定金(实收)" align="center" prop="payPrice" width="100" />
-      <el-table-column label="代收金额" align="center" prop="collectionPrice" width="100" />
-      <el-table-column label="支付方式" align="center" prop="payType" width="100">
+      <el-table-column label="复购次数" align="center" prop="memberBuyCount" width="80" column-key="memberBuyCount" :filters="getFilters('memberBuyCount', null, true)" :filtered-value="columnFilters.memberBuyCount" />
+      <el-table-column label="省" align="center" prop="province" width="80" column-key="province" :filters="getFilters('province')" :filtered-value="columnFilters.province" />
+      <el-table-column label="二级市" align="center" prop="city" width="90" column-key="city" :filters="getFilters('city')" :filtered-value="columnFilters.city" />
+      <el-table-column label="区县" align="center" prop="district" width="90" column-key="district" :filters="getFilters('district')" :filtered-value="columnFilters.district" />
+      <el-table-column label="乡镇" align="center" prop="township" width="90" column-key="township" :filters="getFilters('township')" :filtered-value="columnFilters.township" />
+      <el-table-column label="病名" align="center" prop="diseaseName" width="100" show-overflow-tooltip column-key="diseaseName" :filters="getFilters('diseaseName')" :filtered-value="columnFilters.diseaseName" />
+      <el-table-column label="商品名称" align="center" prop="productNames" width="200" show-overflow-tooltip column-key="productNames" :filters="getFilters('productNames')" :filtered-value="columnFilters.productNames" />
+      <el-table-column label="商品总额" align="center" prop="totalPrice" width="100" column-key="totalPrice" :filters="getFilters('totalPrice', null, true)" :filtered-value="columnFilters.totalPrice" />
+      <el-table-column label="应收金额" align="center" prop="receivablePrice" width="100" column-key="receivablePrice" :filters="getFilters('receivablePrice', null, true)" :filtered-value="columnFilters.receivablePrice" />
+      <el-table-column label="定金(实收)" align="center" prop="payPrice" width="100" column-key="payPrice" :filters="getFilters('payPrice', null, true)" :filtered-value="columnFilters.payPrice" />
+      <el-table-column label="代收金额" align="center" prop="collectionPrice" width="100" column-key="collectionPrice" :filters="getFilters('collectionPrice', null, true)" :filtered-value="columnFilters.collectionPrice" />
+      <el-table-column label="支付方式" align="center" prop="payType" width="100" column-key="payType" :filters="payTypeFilters" :filtered-value="columnFilters.payType">
         <template slot-scope="scope">
           <dict-tag :options="payTypeOptions" :value="scope.row.payType" />
         </template>
       </el-table-column>
-      <el-table-column label="定金回款时间" align="center" width="160">
+      <el-table-column label="定金回款时间" align="center" prop="depositReturnTime" width="160" column-key="depositReturnTime" :filters="getDepositReturnTimeFilters()" :filtered-value="columnFilters.depositReturnTime">
         <template slot-scope="scope">
           <span>{{ scope.row.status == 4 ? scope.row.updateTime : '-' }}</span>
         </template>
       </el-table-column>
-      <el-table-column label="创建时间" align="center" prop="externalCreateTime" width="160" />
-      <el-table-column label="快递单号" align="center" prop="deliverySn" width="150" show-overflow-tooltip />
-      <el-table-column label="快递公司" align="center" prop="deliveryCode" width="100" />
-      <el-table-column label="快递类型" align="center" prop="deliveryName" width="100" />
-      <el-table-column label="发货日期" align="center" prop="deliveryTime" width="160" />
-      <el-table-column label="签收状态" align="center" prop="deliveryStatus" width="100">
+      <el-table-column label="创建时间" align="center" prop="externalCreateTime" width="160" column-key="externalCreateTime" :filters="getFilters('externalCreateTime')" :filtered-value="columnFilters.externalCreateTime" />
+      <el-table-column label="快递单号" align="center" prop="deliverySn" width="150" show-overflow-tooltip column-key="deliverySn" :filters="getFilters('deliverySn')" :filtered-value="columnFilters.deliverySn" />
+      <el-table-column label="快递公司" align="center" prop="deliveryCode" width="100" column-key="deliveryCode" :filters="getFilters('deliveryCode')" :filtered-value="columnFilters.deliveryCode" />
+      <el-table-column label="快递类型" align="center" prop="deliveryName" width="100" column-key="deliveryName" :filters="getFilters('deliveryName')" :filtered-value="columnFilters.deliveryName" />
+      <el-table-column label="发货日期" align="center" prop="deliveryTime" width="160" column-key="deliveryTime" :filters="getFilters('deliveryTime')" :filtered-value="columnFilters.deliveryTime" />
+      <el-table-column label="签收状态" align="center" prop="deliveryStatus" width="100" column-key="deliveryStatus" :filters="deliveryStatusFilters" :filtered-value="columnFilters.deliveryStatus">
         <template slot-scope="scope">
           <dict-tag v-if="scope.row.deliveryStatus != null" :options="deliveryStatusOptions" :value="scope.row.deliveryStatus" />
           <span v-else>-</span>
         </template>
       </el-table-column>
-      <el-table-column label="跟单时间" align="center" prop="followTime" width="160" />
-      <el-table-column label="退款金额" align="center" prop="refundPrice" width="100" />
-      <el-table-column label="退款日期" align="center" prop="refundTime" width="160" />
-      <el-table-column label="拒收回退时间" align="center" prop="rejectReturnTime" width="160" />
-      <el-table-column label="备注" align="center" prop="remark" width="150" show-overflow-tooltip />
-      <el-table-column label="审核人" align="center" prop="auditor" width="90" />
-      <el-table-column label="审核时间" align="center" prop="auditTime" width="160" />
+      <el-table-column label="跟单时间" align="center" prop="followTime" width="160" column-key="followTime" :filters="getFilters('followTime')" :filtered-value="columnFilters.followTime" />
+      <el-table-column label="退款金额" align="center" prop="refundPrice" width="100" column-key="refundPrice" :filters="getFilters('refundPrice', null, true)" :filtered-value="columnFilters.refundPrice" />
+      <el-table-column label="退款日期" align="center" prop="refundTime" width="160" column-key="refundTime" :filters="getFilters('refundTime')" :filtered-value="columnFilters.refundTime" />
+      <el-table-column label="拒收回退时间" align="center" prop="rejectReturnTime" width="160" column-key="rejectReturnTime" :filters="getFilters('rejectReturnTime')" :filtered-value="columnFilters.rejectReturnTime" />
+      <el-table-column label="备注" align="center" prop="remark" width="150" show-overflow-tooltip column-key="remark" :filters="getFilters('remark')" :filtered-value="columnFilters.remark" />
+      <el-table-column label="审核人" align="center" prop="auditor" width="90" column-key="auditor" :filters="getFilters('auditor')" :filtered-value="columnFilters.auditor" />
+      <el-table-column label="审核时间" align="center" prop="auditTime" width="160" column-key="auditTime" :filters="getFilters('auditTime')" :filtered-value="columnFilters.auditTime" />
       <el-table-column label="操作" align="center" class-name="small-padding fixed-width" fixed="right" width="200">
         <template slot-scope="scope">
           <el-button size="mini" type="text" v-hasPermi="['store:externalOrder:query']" @click="handleView(scope.row)">查看</el-button>
@@ -786,7 +786,15 @@ export default {
         refundTimeStart: null,
         refundTimeEnd: null,
         auditTimeStart: null,
-        auditTimeEnd: null
+        auditTimeEnd: null,
+        rejectReturnTimeStart: null,
+        rejectReturnTimeEnd: null,
+        // 以下为列头筛选用字段
+        orderType: null,
+        payType: null,
+        userName: null,
+        memberBuyCount: null,
+        receivablePrice: null
       },
       createTime: null,
       deliveryTime: null,
@@ -842,6 +850,22 @@ export default {
       deliveryTypeOptions: [],
       userStatusOptions: [],
       deptOptions: [],
+      // 列头筛选-枚举字段展示文案映射
+      statusMap: { 1: '未审核', 2: '审核通过', 3: '已发货', 4: '已回款', '-3': '已取消' },
+      orderTypeMap: { 1: '外部订单', 2: '套餐包', 3: '问诊', 4: '积分' },
+      memberSexMap: { 1: '男', 2: '女' },
+      // 列头筛选-各列选中值(单选语义,用数组承载以适配 Element filtered-value)
+      columnFilters: {
+        orderCode: [], userId: [], status: [], orderType: [],
+        companyUserName: [], userName: [], memberPhone: [], memberAge: [],
+        memberSex: [], memberBuyCount: [], province: [], city: [],
+        district: [], township: [], diseaseName: [], productNames: [],
+        totalPrice: [], receivablePrice: [], payPrice: [], collectionPrice: [],
+        payType: [], depositReturnTime: [], externalCreateTime: [],
+        deliverySn: [], deliveryCode: [], deliveryName: [], deliveryTime: [],
+        deliveryStatus: [], followTime: [], refundPrice: [], refundTime: [],
+        rejectReturnTime: [], remark: [], auditor: [], auditTime: []
+      },
       editOpen: false,
       editConfirmOpen: false,
       editForm: {
@@ -879,6 +903,26 @@ export default {
         return statusItem.dictLabel === '已拒收';
       }
       return false;
+    },
+    // 订单状态-全量枚举筛选项
+    statusFilters() {
+      return Object.keys(this.statusMap).map(k => ({ text: this.statusMap[k], value: Number(k) }));
+    },
+    // 订单类型-全量枚举筛选项
+    orderTypeFilters() {
+      return Object.keys(this.orderTypeMap).map(k => ({ text: this.orderTypeMap[k], value: Number(k) }));
+    },
+    // 会员性别-全量枚举筛选项
+    memberSexFilters() {
+      return Object.keys(this.memberSexMap).map(k => ({ text: this.memberSexMap[k], value: Number(k) }));
+    },
+    // 支付方式-全量字典筛选项
+    payTypeFilters() {
+      return (this.payTypeOptions || []).map(d => ({ text: d.dictLabel, value: Number(d.dictValue) }));
+    },
+    // 签收状态-全量字典筛选项
+    deliveryStatusFilters() {
+      return (this.deliveryStatusOptions || []).map(d => ({ text: d.dictLabel, value: Number(d.dictValue) }));
     }
   },
   created() {
@@ -905,6 +949,8 @@ export default {
       } else {
         this.queryParams.status = tab.name;
       }
+      // 切换 tab 时清空列头筛选,避免与 tab 状态筛选冲突
+      this.resetColumnFilters();
       this.handleQuery();
     },
     getList() {
@@ -921,6 +967,100 @@ export default {
         this.loading = false;
       });
     },
+    /** 列头筛选:根据当前列表数据生成某字段去重后的筛选项(sort=true 时按数值正序排序) */
+    getFilters(prop, labelMap = null, sort = false) {
+      if (!this.orderList || this.orderList.length === 0) return [];
+      const seen = new Map();
+      this.orderList.forEach(item => {
+        const v = item[prop];
+        if (v === null || v === undefined || v === '') return;
+        if (!seen.has(v)) seen.set(v, true);
+      });
+      let keys = Array.from(seen.keys());
+      if (sort) {
+        keys.sort((a, b) => Number(a) - Number(b));
+      }
+      return keys.map(v => ({
+        text: labelMap ? (labelMap[v] || String(v)) : String(v),
+        value: v
+      }));
+    },
+    /** 定金回款时间筛选项(仅 status==4 显示 updateTime,否则显示 -) */
+    getDepositReturnTimeFilters() {
+      if (!this.orderList || this.orderList.length === 0) return [];
+      const seen = new Map();
+      this.orderList.forEach(item => {
+        const v = item.status == 4 ? item.updateTime : '-';
+        if (v === null || v === undefined || v === '') return;
+        if (!seen.has(v)) seen.set(v, true);
+      });
+      return Array.from(seen.keys()).map(v => ({ text: String(v), value: v }));
+    },
+    /** 列头筛选变化:单选语义,取最后选中值映射到后端查询参数并重新请求 */
+    handleFilterChange(filters) {
+      // 时间字段:选中值当天范围映射
+      const timeRangeMap = {
+        externalCreateTime: ['sTime', 'eTime'],
+        deliveryTime: ['deliveryStartTime', 'deliveryEndTime'],
+        followTime: ['followTimeStart', 'followTimeEnd'],
+        refundTime: ['refundTimeStart', 'refundTimeEnd'],
+        auditTime: ['auditTimeStart', 'auditTimeEnd'],
+        depositReturnTime: ['depositReturnTimeStart', 'depositReturnTimeEnd'],
+        rejectReturnTime: ['rejectReturnTimeStart', 'rejectReturnTimeEnd']
+      };
+      // 列 column-key 到 queryParams 字段名的映射(特殊映射)
+      const fieldMap = {
+        productNames: 'productName'
+      };
+      Object.keys(filters).forEach(key => {
+        const vals = filters[key] || [];
+        // 单选:只保留最后选中的一项
+        const last = vals.length > 0 ? vals[vals.length - 1] : null;
+        this.$set(this.columnFilters, key, last != null ? [last] : []);
+        if (timeRangeMap[key]) {
+          const [startField, endField] = timeRangeMap[key];
+          if (last != null && String(last).length >= 10) {
+            const day = String(last).substring(0, 10);
+            this.queryParams[startField] = day + ' 00:00:00';
+            this.queryParams[endField] = day + ' 23:59:59';
+          } else {
+            this.queryParams[startField] = null;
+            this.queryParams[endField] = null;
+          }
+        } else {
+          const fieldName = fieldMap[key] || key;
+          this.queryParams[fieldName] = last;
+        }
+      });
+      this.handleQuery();
+    },
+    /** 重置所有列头筛选选中状态 */
+    resetColumnFilters() {
+      Object.keys(this.columnFilters).forEach(key => {
+        this.columnFilters[key] = [];
+      });
+    },
+    /** 合计行:对金额/数量列求和(基于当前页数据) */
+    getSummaries({ columns, data }) {
+      const sums = [];
+      const sumProps = ['totalPrice', 'receivablePrice', 'payPrice', 'collectionPrice', 'refundPrice', 'memberBuyCount'];
+      columns.forEach((column, index) => {
+        if (index === 0) {
+          sums[index] = '总计';
+          return;
+        }
+        if (sumProps.includes(column.property)) {
+          const total = data.reduce((sum, row) => {
+            const v = Number(row[column.property]);
+            return isNaN(v) ? sum : sum + v;
+          }, 0);
+          sums[index] = column.property === 'memberBuyCount' ? total : total.toFixed(2);
+        } else {
+          sums[index] = '';
+        }
+      });
+      return sums;
+    },
     getCompanyList() {
       getCompanyList().then(response => {
         this.companyList = response.data || [];
@@ -1010,6 +1150,10 @@ export default {
       this.queryParams.refundTimeEnd = null;
       this.queryParams.auditTimeStart = null;
       this.queryParams.auditTimeEnd = null;
+      this.queryParams.rejectReturnTimeStart = null;
+      this.queryParams.rejectReturnTimeEnd = null;
+      // 清空列头筛选选中状态及对应查询参数
+      this.resetColumnFilters();
       this.handleQuery();
     },
     handleAdd() {

+ 113 - 21
src/views/store/financeOrder/index.vue

@@ -126,52 +126,52 @@
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
 
-    <el-table v-loading="loading" border :data="orderList" style="width:100%">
-      <el-table-column label="订单编号" align="center" prop="orderCode" width="170" fixed="left" />
-      <el-table-column label="订单日期" align="center" prop="externalCreateTime" width="160">
+    <el-table v-loading="loading" border :data="orderList" style="width:100%" show-summary :summary-method="getSummaries" @filter-change="handleFilterChange">
+      <el-table-column label="订单编号" align="center" prop="orderCode" width="170" fixed="left" column-key="orderCode" :filters="getFilters('orderCode')" :filtered-value="columnFilters.orderCode" />
+      <el-table-column label="订单日期" align="center" prop="externalCreateTime" width="160" column-key="externalCreateTime" :filters="getFilters('externalCreateTime')" :filtered-value="columnFilters.externalCreateTime">
         <template slot-scope="scope">
           <span>{{ parseTime(scope.row.externalCreateTime) }}</span>
         </template>
       </el-table-column>
-      <el-table-column label="回款日期" align="center" prop="returnTime" width="160">
+      <el-table-column label="回款日期" align="center" prop="returnTime" width="160" column-key="returnTime" :filters="getFilters('returnTime')" :filtered-value="columnFilters.returnTime">
         <template slot-scope="scope">
           <span>{{ scope.row.returnTime ? parseTime(scope.row.returnTime) : '-' }}</span>
         </template>
       </el-table-column>
-      <el-table-column label="回款人" align="center" prop="returnUser" width="100">
+      <el-table-column label="回款人" align="center" prop="returnUser" width="100" column-key="returnUser" :filters="getFilters('returnUser')" :filtered-value="columnFilters.returnUser">
         <template slot-scope="scope">
           <span>{{ scope.row.returnUser || '-' }}</span>
         </template>
       </el-table-column>
-      <el-table-column label="会员姓名" align="center" prop="userName" width="90" />
-      <el-table-column label="快递公司" align="center" prop="deliveryName" width="100" />
-      <el-table-column label="运单号" align="center" prop="deliverySn" width="150" show-overflow-tooltip />
-      <el-table-column label="订单金额" align="center" prop="totalPrice" width="100" />
-      <el-table-column label="代收金额" align="center" prop="collectionPrice" width="100" />
-      <el-table-column label="回款金额" align="center" prop="returnPrice" width="100" />
-      <el-table-column label="收件人电话" align="center" prop="receiverPhone" width="130" show-overflow-tooltip />
-      <el-table-column label="订购产品" align="center" prop="productNames" width="180" show-overflow-tooltip />
-      <el-table-column label="付款方式" align="center" prop="payType" width="90">
+      <el-table-column label="会员姓名" align="center" prop="userName" width="90" column-key="userName" :filters="getFilters('userName')" :filtered-value="columnFilters.userName" />
+      <el-table-column label="快递公司" align="center" prop="deliveryName" width="100" column-key="deliveryName" :filters="getFilters('deliveryName')" :filtered-value="columnFilters.deliveryName" />
+      <el-table-column label="运单号" align="center" prop="deliverySn" width="150" show-overflow-tooltip column-key="deliverySn" :filters="getFilters('deliverySn')" :filtered-value="columnFilters.deliverySn" />
+      <el-table-column label="订单金额" align="center" prop="totalPrice" width="100" column-key="totalPrice" :filters="getFilters('totalPrice', null, true)" :filtered-value="columnFilters.totalPrice" />
+      <el-table-column label="代收金额" align="center" prop="collectionPrice" width="100" column-key="collectionPrice" :filters="getFilters('collectionPrice', null, true)" :filtered-value="columnFilters.collectionPrice" />
+      <el-table-column label="回款金额" align="center" prop="returnPrice" width="100" column-key="returnPrice" :filters="getFilters('returnPrice', null, true)" :filtered-value="columnFilters.returnPrice" />
+      <el-table-column label="收件人电话" align="center" prop="receiverPhone" width="130" show-overflow-tooltip column-key="receiverPhone" :filters="getFilters('receiverPhone')" :filtered-value="columnFilters.receiverPhone" />
+      <el-table-column label="订购产品" align="center" prop="productNames" width="180" show-overflow-tooltip column-key="productNames" :filters="getFilters('productNames')" :filtered-value="columnFilters.productNames" />
+      <el-table-column label="付款方式" align="center" prop="payType" width="90" column-key="payType" :filters="payTypeFilters" :filtered-value="columnFilters.payType">
         <template slot-scope="scope">
           <dict-tag :options="payTypeOptions" :value="scope.row.payType" />
         </template>
       </el-table-column>
-      <el-table-column label="回款状态" align="center" prop="returnStatus" width="90">
+      <el-table-column label="回款状态" align="center" prop="returnStatus" width="90" column-key="returnStatus" :filters="returnStatusFilters" :filtered-value="columnFilters.returnStatus">
         <template slot-scope="scope">
           <el-tag :type="scope.row.returnStatus == 1 ? 'success' : 'info'">
             {{ scope.row.returnStatus == 1 ? '已回款' : '未回款' }}
           </el-tag>
         </template>
       </el-table-column>
-      <el-table-column label="备注" align="center" prop="remark" width="150" show-overflow-tooltip />
-      <el-table-column label="发货日期" align="center" prop="deliveryTime" width="160">
+      <el-table-column label="备注" align="center" prop="remark" width="150" show-overflow-tooltip column-key="remark" :filters="getFilters('remark')" :filtered-value="columnFilters.remark" />
+      <el-table-column label="发货日期" align="center" prop="deliveryTime" width="160" column-key="deliveryTime" :filters="getFilters('deliveryTime')" :filtered-value="columnFilters.deliveryTime">
         <template slot-scope="scope">
           <span>{{ scope.row.deliveryTime ? parseTime(scope.row.deliveryTime) : '-' }}</span>
         </template>
       </el-table-column>
-      <el-table-column label="销售姓名" align="center" prop="companyUserName" width="100" />
-      <el-table-column label="公司" align="center" prop="companyName" width="120" show-overflow-tooltip />
-      <el-table-column label="部门" align="center" prop="deptName" width="100" show-overflow-tooltip />
+      <el-table-column label="销售姓名" align="center" prop="companyUserName" width="100" column-key="companyUserName" :filters="getFilters('companyUserName')" :filtered-value="columnFilters.companyUserName" />
+      <el-table-column label="公司" align="center" prop="companyName" width="120" show-overflow-tooltip column-key="companyName" :filters="getFilters('companyName')" :filtered-value="columnFilters.companyName" />
+      <el-table-column label="部门" align="center" prop="deptName" width="100" show-overflow-tooltip column-key="deptName" :filters="getFilters('deptName')" :filtered-value="columnFilters.deptName" />
       <el-table-column label="操作" align="center" class-name="small-padding fixed-width" fixed="right" width="100">
         <template slot-scope="scope">
           <el-button
@@ -308,7 +308,22 @@ export default {
       importLoading: false,
       importAction: process.env.VUE_APP_BASE_API + '/store/financeOrder/importData',
       importHeaders: { Authorization: 'Bearer ' + getToken() },
-      importDisableUpload: true
+      importDisableUpload: true,
+      columnFilters: {
+        orderCode: [], externalCreateTime: [], returnTime: [], returnUser: [],
+        userName: [], deliveryName: [], deliverySn: [], totalPrice: [],
+        collectionPrice: [], returnPrice: [], receiverPhone: [], productNames: [],
+        payType: [], returnStatus: [], remark: [], deliveryTime: [],
+        companyUserName: [], companyName: [], deptName: []
+      }
+    }
+  },
+  computed: {
+    payTypeFilters() {
+      return (this.payTypeOptions || []).map(d => ({ text: d.dictLabel, value: Number(d.dictValue) }));
+    },
+    returnStatusFilters() {
+      return [{ text: '未回款', value: 0 }, { text: '已回款', value: 1 }];
     }
   },
   created() {
@@ -339,6 +354,82 @@ export default {
         this.loading = false
       })
     },
+    /** 列头筛选:根据当前列表数据生成某字段去重后的筛选项(sort=true 时按数值正序排序) */
+    getFilters(prop, labelMap = null, sort = false) {
+      if (!this.orderList || this.orderList.length === 0) return [];
+      const seen = new Map();
+      this.orderList.forEach(item => {
+        const v = item[prop];
+        if (v === null || v === undefined || v === '') return;
+        if (!seen.has(v)) seen.set(v, true);
+      });
+      let keys = Array.from(seen.keys());
+      if (sort) {
+        keys.sort((a, b) => Number(a) - Number(b));
+      }
+      return keys.map(v => ({
+        text: labelMap ? (labelMap[v] || String(v)) : String(v),
+        value: v
+      }));
+    },
+    /** 列头筛选变化:单选语义,取最后选中值映射到后端查询参数并重新请求 */
+    handleFilterChange(filters) {
+      const timeRangeMap = {
+        externalCreateTime: ['sTime', 'eTime'],
+        returnTime: ['returnTimeStart', 'returnTimeEnd'],
+        deliveryTime: ['deliveryStartTime', 'deliveryEndTime']
+      };
+      const fieldMap = {
+        productNames: 'productName'
+      };
+      Object.keys(filters).forEach(key => {
+        const vals = filters[key] || [];
+        const last = vals.length > 0 ? vals[vals.length - 1] : null;
+        this.$set(this.columnFilters, key, last != null ? [last] : []);
+        if (timeRangeMap[key]) {
+          const [startField, endField] = timeRangeMap[key];
+          if (last != null && String(last).length >= 10) {
+            const day = String(last).substring(0, 10);
+            this.queryParams[startField] = day + ' 00:00:00';
+            this.queryParams[endField] = day + ' 23:59:59';
+          } else {
+            this.queryParams[startField] = null;
+            this.queryParams[endField] = null;
+          }
+        } else {
+          const fieldName = fieldMap[key] || key;
+          this.queryParams[fieldName] = last;
+        }
+      });
+      this.handleQuery();
+    },
+    /** 重置所有列头筛选选中状态 */
+    resetColumnFilters() {
+      Object.keys(this.columnFilters).forEach(key => {
+        this.columnFilters[key] = [];
+      });
+    },
+    /** 合计行:对金额列求和(基于当前页数据) */
+    getSummaries({ columns, data }) {
+      const sums = [];
+      const sumProps = ['totalPrice', 'collectionPrice', 'returnPrice'];
+      columns.forEach((column, index) => {
+        if (index === 0) {
+          sums[index] = '总计';
+          return;
+        }
+        if (sumProps.includes(column.property)) {
+          const total = data.reduce((sum, row) => {
+            const v = Number(row[column.property]);
+            return isNaN(v) ? sum : sum + v;
+          }, 0);
+          sums[index] = total.toFixed(2);
+        } else {
+          sums[index] = '';
+        }
+      });
+      return sums;
+    },
     handleDeliveryTimeChange(val) {
       if (val) {
         this.queryParams.deliveryStartTime = val[0]
@@ -381,6 +472,7 @@ export default {
       this.queryParams.deliveryEndTime = null
       this.queryParams.returnTimeStart = null
       this.queryParams.returnTimeEnd = null
+      this.resetColumnFilters()
       this.handleQuery()
     },
     handleExport() {

+ 560 - 0
src/views/store/financeOrder/storeFinanceOrder.vue

@@ -0,0 +1,560 @@
+<template>
+  <div class="app-container">
+
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="90px">
+      <el-form-item label="回款状态" prop="returnStatus">
+        <el-select v-model="queryParams.returnStatus" placeholder="请选择回款状态" clearable size="small" style="width:140px;">
+          <el-option label="未回款" :value="0" />
+          <el-option label="已回款" :value="1" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="所属部门" prop="deptId">
+        <treeselect style="width:220px" v-model="queryParams.deptId" :options="deptOptions" :show-count="true" placeholder="请选择所属部门" />
+      </el-form-item>
+      <el-form-item label="订单编号" prop="orderCode">
+        <el-input v-model="queryParams.orderCode" placeholder="请输入订单编号" clearable size="small" @keyup.enter.native="handleQuery" />
+      </el-form-item>
+      <el-form-item label="订单日期" prop="createTime">
+        <el-date-picker
+          v-model="createTime"
+          size="small"
+          style="width: 220px"
+          value-format="yyyy-MM-dd"
+          type="daterange"
+          range-separator="-"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期"
+          @change="handleCreateTimeChange"
+        />
+      </el-form-item>
+      <el-form-item label="回款日期" prop="returnTime">
+        <el-date-picker
+          v-model="returnTime"
+          size="small"
+          style="width: 220px"
+          value-format="yyyy-MM-dd"
+          type="daterange"
+          range-separator="-"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期"
+          @change="handleReturnTimeChange"
+        />
+      </el-form-item>
+      <el-form-item label="回款人" prop="returnUser">
+        <el-input v-model="queryParams.returnUser" placeholder="请输入回款人" clearable size="small" @keyup.enter.native="handleQuery" />
+      </el-form-item>
+      <el-form-item label="会员姓名" prop="userName">
+        <el-input v-model="queryParams.userName" placeholder="请输入会员姓名" clearable size="small" @keyup.enter.native="handleQuery" />
+      </el-form-item>
+      <el-form-item label="收件人电话" prop="receiverPhone">
+        <el-input v-model="queryParams.receiverPhone" placeholder="请输入收件人电话" clearable size="small" @keyup.enter.native="handleQuery" />
+      </el-form-item>
+      <el-form-item label="快递公司" prop="deliveryName">
+        <el-input v-model="queryParams.deliveryName" placeholder="请输入快递公司" clearable size="small" @keyup.enter.native="handleQuery" />
+      </el-form-item>
+      <el-form-item label="快递单号" prop="deliverySn">
+        <el-input v-model="queryParams.deliverySn" placeholder="请输入快递单号" clearable size="small" @keyup.enter.native="handleQuery" />
+      </el-form-item>
+      <el-form-item label="订单金额" prop="totalPrice">
+        <el-input-number v-model="queryParams.totalPrice" :precision="2" :min="0" placeholder="请输入订单金额" size="small" style="width:200px" controls-position="right" />
+      </el-form-item>
+      <el-form-item label="代收金额" prop="collectionPrice">
+        <el-input-number v-model="queryParams.collectionPrice" :precision="2" :min="0" placeholder="请输入代收金额" size="small" style="width:200px" controls-position="right" />
+      </el-form-item>
+      <el-form-item label="订购产品" prop="productName">
+        <el-input v-model="queryParams.productName" placeholder="请输入产品名称" clearable size="small" @keyup.enter.native="handleQuery" />
+      </el-form-item>
+      <el-form-item label="备注" prop="remark">
+        <el-input v-model="queryParams.remark" placeholder="请输入备注" clearable size="small" @keyup.enter.native="handleQuery" />
+      </el-form-item>
+      <el-form-item label="销售姓名" prop="companyUserName">
+        <el-input v-model="queryParams.companyUserName" placeholder="请输入销售姓名" clearable size="small" @keyup.enter.native="handleQuery" />
+      </el-form-item>
+      <el-form-item label="付款方式" prop="payType">
+        <el-select v-model="queryParams.payType" placeholder="请选择付款方式" clearable size="small" style="width:140px;">
+          <el-option
+            v-for="item in payTypeOptions"
+            :key="item.dictValue"
+            :label="item.dictLabel"
+            :value="Number(item.dictValue)"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="发货时间" prop="deliveryTime">
+        <el-date-picker
+          v-model="deliveryTime"
+          size="small"
+          style="width: 220px"
+          value-format="yyyy-MM-dd"
+          type="daterange"
+          range-separator="-"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期"
+          @change="handleDeliveryTimeChange"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          :loading="exportLoading"
+          @click="handleExport"
+          v-hasPermi="['store:storeFinanceOrder:export']"
+        >导出</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          icon="el-icon-upload"
+          size="mini"
+          @click="handleImport"
+          v-hasPermi="['store:storeFinanceOrder:import']"
+        >导入</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" border :data="orderList" style="width:100%" show-summary :summary-method="getSummaries" @filter-change="handleFilterChange">
+      <el-table-column label="订单编号" align="center" prop="orderCode" width="170" fixed="left" column-key="orderCode" :filters="getFilters('orderCode')" :filtered-value="columnFilters.orderCode" />
+      <el-table-column label="订单日期" align="center" prop="externalCreateTime" width="160" column-key="externalCreateTime" :filters="getFilters('externalCreateTime')" :filtered-value="columnFilters.externalCreateTime">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.externalCreateTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="回款日期" align="center" prop="returnTime" width="160" column-key="returnTime" :filters="getFilters('returnTime')" :filtered-value="columnFilters.returnTime">
+        <template slot-scope="scope">
+          <span>{{ scope.row.returnTime ? parseTime(scope.row.returnTime) : '-' }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="回款人" align="center" prop="returnUser" width="100" column-key="returnUser" :filters="getFilters('returnUser')" :filtered-value="columnFilters.returnUser">
+        <template slot-scope="scope">
+          <span>{{ scope.row.returnUser || '-' }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="会员姓名" align="center" prop="userName" width="90" column-key="userName" :filters="getFilters('userName')" :filtered-value="columnFilters.userName" />
+      <el-table-column label="快递公司" align="center" prop="deliveryName" width="100" column-key="deliveryName" :filters="getFilters('deliveryName')" :filtered-value="columnFilters.deliveryName" />
+      <el-table-column label="运单号" align="center" prop="deliverySn" width="150" show-overflow-tooltip column-key="deliverySn" :filters="getFilters('deliverySn')" :filtered-value="columnFilters.deliverySn" />
+      <el-table-column label="订单金额" align="center" prop="totalPrice" width="100" column-key="totalPrice" :filters="getFilters('totalPrice', null, true)" :filtered-value="columnFilters.totalPrice" />
+      <el-table-column label="代收金额" align="center" prop="collectionPrice" width="100" column-key="collectionPrice" :filters="getFilters('collectionPrice', null, true)" :filtered-value="columnFilters.collectionPrice" />
+      <el-table-column label="回款金额" align="center" prop="returnPrice" width="100" column-key="returnPrice" :filters="getFilters('returnPrice', null, true)" :filtered-value="columnFilters.returnPrice" />
+      <el-table-column label="收件人电话" align="center" prop="receiverPhone" width="130" show-overflow-tooltip column-key="receiverPhone" :filters="getFilters('receiverPhone')" :filtered-value="columnFilters.receiverPhone" />
+      <el-table-column label="订购产品" align="center" prop="productNames" width="180" show-overflow-tooltip column-key="productNames" :filters="getFilters('productNames')" :filtered-value="columnFilters.productNames" />
+      <el-table-column label="付款方式" align="center" prop="payType" width="90" column-key="payType" :filters="payTypeFilters" :filtered-value="columnFilters.payType">
+        <template slot-scope="scope">
+          <dict-tag :options="payTypeOptions" :value="scope.row.payType" />
+        </template>
+      </el-table-column>
+      <el-table-column label="回款状态" align="center" prop="returnStatus" width="90" column-key="returnStatus" :filters="returnStatusFilters" :filtered-value="columnFilters.returnStatus">
+        <template slot-scope="scope">
+          <el-tag :type="scope.row.returnStatus == 1 ? 'success' : 'info'">
+            {{ scope.row.returnStatus == 1 ? '已回款' : '未回款' }}
+          </el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column label="备注" align="center" prop="remark" width="150" show-overflow-tooltip column-key="remark" :filters="getFilters('remark')" :filtered-value="columnFilters.remark" />
+      <el-table-column label="发货日期" align="center" prop="deliveryTime" width="160" column-key="deliveryTime" :filters="getFilters('deliveryTime')" :filtered-value="columnFilters.deliveryTime">
+        <template slot-scope="scope">
+          <span>{{ scope.row.deliveryTime ? parseTime(scope.row.deliveryTime) : '-' }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="销售姓名" align="center" prop="companyUserName" width="100" column-key="companyUserName" :filters="getFilters('companyUserName')" :filtered-value="columnFilters.companyUserName" />
+      <el-table-column label="公司" align="center" prop="companyName" width="120" show-overflow-tooltip column-key="companyName" :filters="getFilters('companyName')" :filtered-value="columnFilters.companyName" />
+      <el-table-column label="部门" align="center" prop="deptName" width="100" show-overflow-tooltip column-key="deptName" :filters="getFilters('deptName')" :filtered-value="columnFilters.deptName" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" fixed="right" width="100">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleEdit(scope.row)"
+            v-hasPermi="['store:storeFinanceOrder:edit']"
+            v-if="scope.row.returnStatus == 1"
+          >修改</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total > 0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <el-dialog :title="editTitle" :visible.sync="editOpen" width="450px" append-to-body>
+      <el-form ref="editForm" :model="editForm" :rules="editRules" label-width="100px">
+        <el-form-item label="订单编号">
+          <span>{{ editForm.orderCode }}</span>
+        </el-form-item>
+        <el-form-item label="订单金额">
+          <span>{{ editForm.totalPrice }}</span>
+        </el-form-item>
+        <el-form-item label="代收金额">
+          <span>{{ editForm.collectionPrice }}</span>
+        </el-form-item>
+        <el-form-item label="回款金额" prop="returnPrice">
+          <el-input v-model="editForm.returnPrice" placeholder="请输入回款金额" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitEdit">确 定</el-button>
+        <el-button @click="editOpen = false">取 消</el-button>
+      </div>
+    </el-dialog>
+
+    <!-- 导入对话框 -->
+    <el-dialog title="导入回款数据" :visible.sync="importOpen" width="450px" append-to-body>
+      <el-form label-width="80px">
+        <el-form-item label="选择文件">
+          <el-upload
+            ref="upload"
+            :action="importAction"
+            :headers="importHeaders"
+            :auto-upload="false"
+            :limit="1"
+            accept=".xls,.xlsx"
+            :on-change="handleImportFileChange"
+            :on-remove="handleImportFileRemove"
+          >
+            <el-button size="small" type="primary">选择文件</el-button>
+            <div slot="tip" class="el-upload__tip">仅支持 .xls/.xlsx 文件</div>
+          </el-upload>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="success" icon="el-icon-download" size="mini" @click="downloadImportTemplate">模板下载</el-button>
+        <el-button type="primary" @click="submitImport" :loading="importLoading" :disabled="importDisableUpload">开 始</el-button>
+        <el-button @click="importOpen = false">关 闭</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listStoreFinanceOrder, editStoreFinanceOrder, exportStoreFinanceOrder, downloadStoreFinanceImportTemplate, importStoreFinanceOrder } from '@/api/store/storeFinanceOrder'
+import { treeselect } from '@/api/company/companyDept'
+import Treeselect from '@riophae/vue-treeselect'
+import '@riophae/vue-treeselect/dist/vue-treeselect.css'
+import { getToken } from '@/utils/auth'
+
+export default {
+  name: 'StoreFinanceOrder',
+  components: { Treeselect },
+  data() {
+    return {
+      loading: false,
+      exportLoading: false,
+      showSearch: true,
+      total: 0,
+      orderList: [],
+      deliveryTime: null,
+      createTime: null,
+      returnTime: null,
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        deptId: null,
+        orderCode: null,
+        userName: null,
+        deliverySn: null,
+        deliveryName: null,
+        returnUser: null,
+        totalPrice: null,
+        collectionPrice: null,
+        receiverPhone: null,
+        productName: null,
+        remark: null,
+        companyUserName: null,
+        payType: null,
+        returnStatus: null,
+        sTime: null,
+        eTime: null,
+        returnTimeStart: null,
+        returnTimeEnd: null,
+        deliveryStartTime: null,
+        deliveryEndTime: null
+      },
+      payTypeOptions: [],
+      deptOptions: [],
+      editOpen: false,
+      editTitle: '',
+      editForm: {
+        orderId: null,
+        orderCode: null,
+        totalPrice: null,
+        collectionPrice: null,
+        returnPrice: null
+      },
+      editRules: {
+        returnPrice: [
+          { required: true, message: '回款金额不能为空', trigger: 'blur' }
+        ]
+      },
+      columnFilters: {
+        orderCode: [], externalCreateTime: [], returnTime: [], returnUser: [],
+        userName: [], deliveryName: [], deliverySn: [], totalPrice: [],
+        collectionPrice: [], returnPrice: [], receiverPhone: [], productNames: [],
+        payType: [], returnStatus: [], remark: [], deliveryTime: [],
+        companyUserName: [], companyName: [], deptName: []
+      },
+      importOpen: false,
+      importLoading: false,
+      importAction: process.env.VUE_APP_BASE_API + '/store/storeFinanceOrder/importData',
+      importHeaders: { Authorization: 'Bearer ' + getToken() },
+      importDisableUpload: true
+    }
+  },
+  computed: {
+    payTypeFilters() {
+      return (this.payTypeOptions || []).map(d => ({ text: d.dictLabel, value: Number(d.dictValue) }));
+    },
+    returnStatusFilters() {
+      return [{ text: '未回款', value: 0 }, { text: '已回款', value: 1 }];
+    }
+  },
+  created() {
+    this.getList()
+    this.getDicts('sys_package_pay_type').then(response => {
+      this.payTypeOptions = response.data
+    })
+    this.getTreeselect()
+  },
+  methods: {
+    getTreeselect() {
+      treeselect().then((response) => {
+        this.deptOptions = response.data
+      })
+    },
+    getList() {
+      this.loading = true
+      const params = { ...this.queryParams }
+      if (params.totalPrice === 0) params.totalPrice = null
+      if (params.collectionPrice === 0) params.collectionPrice = null
+      if (params.returnStatus === '' || params.returnStatus === null || params.returnStatus === undefined) delete params.returnStatus
+      listStoreFinanceOrder(params).then(response => {
+        this.orderList = response.rows || []
+        this.total = response.total || 0
+        this.loading = false
+      }).catch(() => {
+        this.loading = false
+      })
+    },
+    getFilters(prop, labelMap = null, sort = false) {
+      if (!this.orderList || this.orderList.length === 0) return [];
+      const seen = new Map();
+      this.orderList.forEach(item => {
+        const v = item[prop];
+        if (v === null || v === undefined || v === '') return;
+        if (!seen.has(v)) seen.set(v, true);
+      });
+      let keys = Array.from(seen.keys());
+      if (sort) {
+        keys.sort((a, b) => Number(a) - Number(b));
+      }
+      return keys.map(v => ({
+        text: labelMap ? (labelMap[v] || String(v)) : String(v),
+        value: v
+      }));
+    },
+    handleFilterChange(filters) {
+      const timeRangeMap = {
+        externalCreateTime: ['sTime', 'eTime'],
+        returnTime: ['returnTimeStart', 'returnTimeEnd'],
+        deliveryTime: ['deliveryStartTime', 'deliveryEndTime']
+      };
+      const fieldMap = {
+        productNames: 'productName'
+      };
+      Object.keys(filters).forEach(key => {
+        const vals = filters[key] || [];
+        const last = vals.length > 0 ? vals[vals.length - 1] : null;
+        this.$set(this.columnFilters, key, last != null ? [last] : []);
+        if (timeRangeMap[key]) {
+          const [startField, endField] = timeRangeMap[key];
+          if (last != null && String(last).length >= 10) {
+            const day = String(last).substring(0, 10);
+            this.queryParams[startField] = day + ' 00:00:00';
+            this.queryParams[endField] = day + ' 23:59:59';
+          } else {
+            this.queryParams[startField] = null;
+            this.queryParams[endField] = null;
+          }
+        } else {
+          const fieldName = fieldMap[key] || key;
+          this.queryParams[fieldName] = last;
+        }
+      });
+      this.handleQuery();
+    },
+    resetColumnFilters() {
+      Object.keys(this.columnFilters).forEach(key => {
+        this.columnFilters[key] = [];
+      });
+    },
+    getSummaries({ columns, data }) {
+      const sums = [];
+      const sumProps = ['totalPrice', 'collectionPrice', 'returnPrice'];
+      columns.forEach((column, index) => {
+        if (index === 0) {
+          sums[index] = '总计';
+          return;
+        }
+        if (sumProps.includes(column.property)) {
+          const total = data.reduce((sum, row) => {
+            const v = Number(row[column.property]);
+            return isNaN(v) ? sum : sum + v;
+          }, 0);
+          sums[index] = total.toFixed(2);
+        } else {
+          sums[index] = '';
+        }
+      });
+      return sums;
+    },
+    handleDeliveryTimeChange(val) {
+      if (val) {
+        this.queryParams.deliveryStartTime = val[0]
+        this.queryParams.deliveryEndTime = val[1] + ' 23:59:59'
+      } else {
+        this.queryParams.deliveryStartTime = null
+        this.queryParams.deliveryEndTime = null
+      }
+    },
+    handleCreateTimeChange(val) {
+      if (val) {
+        this.queryParams.sTime = val[0]
+        this.queryParams.eTime = val[1] + ' 23:59:59'
+      } else {
+        this.queryParams.sTime = null
+        this.queryParams.eTime = null
+      }
+    },
+    handleReturnTimeChange(val) {
+      if (val) {
+        this.queryParams.returnTimeStart = val[0]
+        this.queryParams.returnTimeEnd = val[1] + ' 23:59:59'
+      } else {
+        this.queryParams.returnTimeStart = null
+        this.queryParams.returnTimeEnd = null
+      }
+    },
+    handleQuery() {
+      this.queryParams.pageNum = 1
+      this.getList()
+    },
+    resetQuery() {
+      this.resetForm('queryForm')
+      this.deliveryTime = null
+      this.createTime = null
+      this.returnTime = null
+      this.queryParams.sTime = null
+      this.queryParams.eTime = null
+      this.queryParams.deliveryStartTime = null
+      this.queryParams.deliveryEndTime = null
+      this.queryParams.returnTimeStart = null
+      this.queryParams.returnTimeEnd = null
+      this.resetColumnFilters()
+      this.handleQuery()
+    },
+    handleExport() {
+      this.$confirm('是否确认导出财务店铺订单数据?', '警告', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      }).then(() => {
+        this.exportLoading = true
+        return exportStoreFinanceOrder(this.queryParams)
+      }).then(response => {
+        this.download(response.msg)
+        this.exportLoading = false
+      }).catch(() => {
+        this.exportLoading = false
+      })
+    },
+    handleEdit(row) {
+      this.resetForm('editForm')
+      this.editForm = {
+        orderId: row.orderId,
+        orderCode: row.orderCode,
+        totalPrice: row.totalPrice,
+        collectionPrice: row.collectionPrice,
+        returnPrice: row.returnPrice
+      }
+      this.editTitle = '修改回款金额 - ' + row.orderCode
+      this.editOpen = true
+    },
+    submitEdit() {
+      this.$refs.editForm.validate(valid => {
+        if (!valid) return
+        editStoreFinanceOrder(this.editForm).then(response => {
+          if (response.code === 200) {
+            this.msgSuccess('修改成功')
+            this.editOpen = false
+            this.getList()
+          }
+        })
+      })
+    },
+    handleImport() {
+      this.importDisableUpload = true
+      this.importOpen = true
+      this.$nextTick(() => {
+        this.$refs.upload && this.$refs.upload.clearFiles()
+      })
+    },
+    downloadImportTemplate() {
+      downloadStoreFinanceImportTemplate().then(response => {
+        this.download(response.msg)
+      })
+    },
+    handleImportFileChange(file) {
+      this.importDisableUpload = false
+    },
+    handleImportFileRemove() {
+      this.importDisableUpload = true
+    },
+    submitImport() {
+      const uploadFiles = this.$refs.upload.uploadFiles
+      if (!uploadFiles || uploadFiles.length === 0) {
+        this.msgError('请选择文件')
+        return
+      }
+      const formData = new FormData()
+      formData.append('file', uploadFiles[0].raw)
+      this.importLoading = true
+      importStoreFinanceOrder(formData).then(response => {
+        this.$refs.upload.clearFiles()
+        this.importDisableUpload = true
+        this.importLoading = false
+        this.importOpen = false
+        const hasFail = response.msg && response.msg.indexOf('失败') !== -1
+        const failFile = response.data
+        if (hasFail && failFile) {
+          this.$confirm(response.msg + ',是否下载失败记录?', '提示', {
+            confirmButtonText: '下载',
+            cancelButtonText: '关闭',
+            type: 'warning'
+          }).then(() => {
+            this.download(failFile)
+          }).catch(() => {})
+        } else {
+          this.msgSuccess(response.msg)
+        }
+        this.getList()
+      }).catch(() => {
+        this.importLoading = false
+      })
+    }
+  }
+}
+</script>

+ 107 - 12
src/views/store/rejectNoReturn/index.vue

@@ -1,5 +1,14 @@
 <template>
   <div class="app-container">
+    <!-- 订单类型选择 -->
+    <el-form :inline="true" style="margin-bottom: 10px;">
+      <el-form-item label="订单类型">
+        <el-radio-group v-model="orderType" size="small" @change="handleOrderTypeChange">
+          <el-radio-button label="external">外部订单</el-radio-button>
+          <el-radio-button label="store">药品订单</el-radio-button>
+        </el-radio-group>
+      </el-form-item>
+    </el-form>
     <!-- 查询条件 -->
     <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="80px">
       <el-form-item label="订单编号" prop="orderCode">
@@ -60,23 +69,23 @@
     </el-row>
 
     <!-- 拒收未还货列表 -->
-    <el-table v-loading="loading" border :data="tableList" style="width:100%">
-      <el-table-column label="订单编号" align="center" prop="orderCode" min-width="160" />
-      <el-table-column label="运单号" align="center" prop="deliverySn" min-width="140" show-overflow-tooltip />
-      <el-table-column label="会员姓名" align="center" prop="userName" min-width="80" />
-      <el-table-column label="地址" align="center" prop="userAddress" min-width="180" show-overflow-tooltip />
-      <el-table-column label="发货日期" align="center" prop="deliveryTime" min-width="150">
+    <el-table v-loading="loading" border :data="tableList" style="width:100%" show-summary :summary-method="getSummaries" @filter-change="handleFilterChange">
+      <el-table-column label="订单编号" align="center" prop="orderCode" min-width="160" column-key="orderCode" :filters="getFilters('orderCode')" :filtered-value="columnFilters.orderCode" />
+      <el-table-column label="运单号" align="center" prop="deliverySn" min-width="140" show-overflow-tooltip column-key="deliverySn" :filters="getFilters('deliverySn')" :filtered-value="columnFilters.deliverySn" />
+      <el-table-column label="会员姓名" align="center" prop="userName" min-width="80" column-key="userName" :filters="getFilters('userName')" :filtered-value="columnFilters.userName" />
+      <el-table-column label="地址" align="center" prop="userAddress" min-width="180" show-overflow-tooltip column-key="userAddress" :filters="getFilters('userAddress')" :filtered-value="columnFilters.userAddress" />
+      <el-table-column label="发货日期" align="center" prop="deliveryTime" min-width="150" column-key="deliveryTime" :filters="getFilters('deliveryTime')" :filtered-value="columnFilters.deliveryTime">
         <template slot-scope="scope">
           <span>{{ scope.row.deliveryTime ? parseTime(scope.row.deliveryTime) : '-' }}</span>
         </template>
       </el-table-column>
-      <el-table-column label="金额" align="center" prop="totalPrice" min-width="100" />
-      <el-table-column label="跟单时间" align="center" prop="followTime" min-width="150">
+      <el-table-column label="金额" align="center" prop="totalPrice" min-width="100" column-key="totalPrice" :filters="getFilters('totalPrice', null, true)" :filtered-value="columnFilters.totalPrice" />
+      <el-table-column label="跟单时间" align="center" prop="followTime" min-width="150" column-key="followTime" :filters="getFilters('followTime')" :filtered-value="columnFilters.followTime">
         <template slot-scope="scope">
           <span>{{ scope.row.followTime ? parseTime(scope.row.followTime) : '-' }}</span>
         </template>
       </el-table-column>
-      <el-table-column label="快递公司" align="center" prop="deliveryName" min-width="120" />
+      <el-table-column label="快递公司" align="center" prop="deliveryName" min-width="120" column-key="deliveryName" :filters="getFilters('deliveryName')" :filtered-value="columnFilters.deliveryName" />
     </el-table>
 
     <pagination
@@ -90,12 +99,13 @@
 </template>
 
 <script>
-import { listRejectNoReturn, exportRejectNoReturn } from '@/api/store/rejectNoReturn'
+import { listRejectNoReturn, exportRejectNoReturn, listStoreRejectNoReturn, exportStoreRejectNoReturn } from '@/api/store/rejectNoReturn'
 
 export default {
   name: 'RejectNoReturn',
   data() {
     return {
+      orderType: 'external',
       loading: false,
       exportLoading: false,
       total: 0,
@@ -115,6 +125,11 @@ export default {
         deliveryEndTime: null,
         followTimeStart: null,
         followTimeEnd: null
+      },
+      // 列头筛选-各列选中值(单选语义,用数组承载以适配 Element filtered-value)
+      columnFilters: {
+        orderCode: [], deliverySn: [], userName: [], userAddress: [],
+        deliveryTime: [], totalPrice: [], followTime: [], deliveryName: []
       }
     }
   },
@@ -122,11 +137,16 @@ export default {
     this.getList()
   },
   methods: {
+    handleOrderTypeChange() {
+      this.resetColumnFilters()
+      this.handleQuery()
+    },
     getList() {
       this.loading = true
       const params = { ...this.queryParams }
       if (params.totalPrice === 0) params.totalPrice = null
-      listRejectNoReturn(params).then(response => {
+      const api = this.orderType === 'store' ? listStoreRejectNoReturn : listRejectNoReturn
+      api(params).then(response => {
         this.tableList = response.rows || []
         this.total = response.total || 0
         this.loading = false
@@ -156,6 +176,79 @@ export default {
       this.queryParams.pageNum = 1
       this.getList()
     },
+    /** 列头筛选:根据当前列表数据生成某字段去重后的筛选项(sort=true 时按数值正序排序) */
+    getFilters(prop, labelMap = null, sort = false) {
+      if (!this.tableList || this.tableList.length === 0) return []
+      const seen = new Map()
+      this.tableList.forEach(item => {
+        const v = item[prop]
+        if (v === null || v === undefined || v === '') return
+        if (!seen.has(v)) seen.set(v, true)
+      })
+      let keys = Array.from(seen.keys())
+      if (sort) {
+        keys.sort((a, b) => Number(a) - Number(b))
+      }
+      return keys.map(v => ({
+        text: labelMap ? (labelMap[v] || String(v)) : String(v),
+        value: v
+      }))
+    },
+    /** 列头筛选变化:单选语义,取最后选中值映射到后端查询参数并重新请求 */
+    handleFilterChange(filters) {
+      // 时间字段:选中值当天范围映射
+      const timeRangeMap = {
+        deliveryTime: ['deliveryStartTime', 'deliveryEndTime'],
+        followTime: ['followTimeStart', 'followTimeEnd']
+      }
+      Object.keys(filters).forEach(key => {
+        const vals = filters[key] || []
+        // 单选:只保留最后选中的一项
+        const last = vals.length > 0 ? vals[vals.length - 1] : null
+        this.$set(this.columnFilters, key, last != null ? [last] : [])
+        if (timeRangeMap[key]) {
+          const [startField, endField] = timeRangeMap[key]
+          if (last != null && String(last).length >= 10) {
+            const day = String(last).substring(0, 10)
+            this.queryParams[startField] = day + ' 00:00:00'
+            this.queryParams[endField] = day + ' 23:59:59'
+          } else {
+            this.queryParams[startField] = null
+            this.queryParams[endField] = null
+          }
+        } else {
+          this.queryParams[key] = last
+        }
+      })
+      this.handleQuery()
+    },
+    /** 重置所有列头筛选选中状态 */
+    resetColumnFilters() {
+      Object.keys(this.columnFilters).forEach(key => {
+        this.columnFilters[key] = []
+      })
+    },
+    /** 合计行:对金额列求和(基于当前页数据) */
+    getSummaries({ columns, data }) {
+      const sums = []
+      const sumProps = ['totalPrice']
+      columns.forEach((column, index) => {
+        if (index === 0) {
+          sums[index] = '总计'
+          return
+        }
+        if (sumProps.includes(column.property)) {
+          const total = data.reduce((sum, row) => {
+            const v = Number(row[column.property])
+            return isNaN(v) ? sum : sum + v
+          }, 0)
+          sums[index] = total.toFixed(2)
+        } else {
+          sums[index] = ''
+        }
+      })
+      return sums
+    },
     resetQuery() {
       this.deliveryTime = null
       this.followTime = null
@@ -164,6 +257,7 @@ export default {
       this.queryParams.deliveryEndTime = null
       this.queryParams.followTimeStart = null
       this.queryParams.followTimeEnd = null
+      this.resetColumnFilters()
       this.handleQuery()
     },
     handleExport() {
@@ -173,7 +267,8 @@ export default {
         type: 'warning'
       }).then(() => {
         this.exportLoading = true
-        return exportRejectNoReturn(this.queryParams)
+        const api = this.orderType === 'store' ? exportStoreRejectNoReturn : exportRejectNoReturn
+        return api(this.queryParams)
       }).then(response => {
         this.download(response.msg)
         this.exportLoading = false

+ 145 - 27
src/views/store/rejectReport/index.vue

@@ -5,6 +5,16 @@
       <el-tab-pane label="拒收产品维度" name="product"></el-tab-pane>
     </el-tabs>
 
+    <!-- 订单类型选择 -->
+    <el-form :inline="true" style="margin-bottom: 10px;">
+      <el-form-item label="订单类型">
+        <el-radio-group v-model="orderType" size="small" @change="handleOrderTypeChange">
+          <el-radio-button label="external">外部订单</el-radio-button>
+          <el-radio-button label="store">药品订单</el-radio-button>
+        </el-radio-group>
+      </el-form-item>
+    </el-form>
+
     <!-- 拒收时间维度查询条件 -->
     <el-form v-show="activeTab === 'order'" :model="orderQuery" ref="orderQueryForm" :inline="true" label-width="90px">
       <el-form-item label="订单编号" prop="orderCode">
@@ -92,38 +102,38 @@
     </el-row>
 
     <!-- 拒收时间维度列表 -->
-    <el-table v-show="activeTab === 'order'" v-loading="orderLoading" border :data="orderList" style="width:100%">
-      <el-table-column label="订单编号" align="center" prop="orderCode" min-width="160" />
-      <el-table-column label="快递单号" align="center" prop="deliverySn" min-width="140" show-overflow-tooltip />
-      <el-table-column label="会员姓名" align="center" prop="userName" min-width="80" />
-      <el-table-column label="订单日期" align="center" prop="externalCreateTime" min-width="150">
+    <el-table v-show="activeTab === 'order'" v-loading="orderLoading" border :data="orderList" style="width:100%" show-summary :summary-method="getSummaries" @filter-change="handleFilterChange">
+      <el-table-column label="订单编号" align="center" prop="orderCode" min-width="160" column-key="orderCode" :filters="getFilters(orderList, 'orderCode')" :filtered-value="columnFilters.orderCode" />
+      <el-table-column label="快递单号" align="center" prop="deliverySn" min-width="140" show-overflow-tooltip column-key="deliverySn" :filters="getFilters(orderList, 'deliverySn')" :filtered-value="columnFilters.deliverySn" />
+      <el-table-column label="会员姓名" align="center" prop="userName" min-width="80" column-key="userName" :filters="getFilters(orderList, 'userName')" :filtered-value="columnFilters.userName" />
+      <el-table-column label="订单日期" align="center" prop="externalCreateTime" min-width="150" column-key="externalCreateTime" :filters="getFilters(orderList, 'externalCreateTime')" :filtered-value="columnFilters.externalCreateTime">
         <template slot-scope="scope">
           <span>{{ scope.row.externalCreateTime ? parseTime(scope.row.externalCreateTime) : '-' }}</span>
         </template>
       </el-table-column>
-      <el-table-column label="发货日期" align="center" prop="deliveryTime" min-width="150">
+      <el-table-column label="发货日期" align="center" prop="deliveryTime" min-width="150" column-key="deliveryTime" :filters="getFilters(orderList, 'deliveryTime')" :filtered-value="columnFilters.deliveryTime">
         <template slot-scope="scope">
           <span>{{ scope.row.deliveryTime ? parseTime(scope.row.deliveryTime) : '-' }}</span>
         </template>
       </el-table-column>
-      <el-table-column label="金额" align="center" prop="totalPrice" min-width="90" />
-      <el-table-column label="快递公司" align="center" prop="deliveryName" min-width="100" />
-      <el-table-column label="跟单时间" align="center" prop="followTime" min-width="150">
+      <el-table-column label="金额" align="center" prop="totalPrice" min-width="90" column-key="totalPrice" :filters="getFilters(orderList, 'totalPrice', true)" :filtered-value="columnFilters.totalPrice" />
+      <el-table-column label="快递公司" align="center" prop="deliveryName" min-width="100" column-key="deliveryName" :filters="getFilters(orderList, 'deliveryName')" :filtered-value="columnFilters.deliveryName" />
+      <el-table-column label="跟单时间" align="center" prop="followTime" min-width="150" column-key="followTime" :filters="getFilters(orderList, 'followTime')" :filtered-value="columnFilters.followTime">
         <template slot-scope="scope">
           <span>{{ scope.row.followTime ? parseTime(scope.row.followTime) : '-' }}</span>
         </template>
       </el-table-column>
-      <el-table-column label="拒收退回日期" align="center" prop="rejectReturnTime" min-width="150">
+      <el-table-column label="拒收退回日期" align="center" prop="rejectReturnTime" min-width="150" column-key="rejectReturnTime" :filters="getFilters(orderList, 'rejectReturnTime')" :filtered-value="columnFilters.rejectReturnTime">
         <template slot-scope="scope">
           <span>{{ scope.row.rejectReturnTime ? parseTime(scope.row.rejectReturnTime) : '-' }}</span>
         </template>
       </el-table-column>
-      <el-table-column label="拒收人" align="center" prop="rejectUser" min-width="90" />
-      <el-table-column label="电话1" align="center" prop="userPhone" min-width="120" />
-      <el-table-column label="电话2" align="center" prop="memberPhone" min-width="120" />
-      <el-table-column label="销售姓名" align="center" prop="companyUserName" min-width="90" />
-      <el-table-column label="订购产品" align="center" prop="productNames" min-width="180" show-overflow-tooltip />
-      <el-table-column label="地址" align="center" prop="userAddress" min-width="180" show-overflow-tooltip />
+      <el-table-column label="拒收人" align="center" prop="rejectUser" min-width="90" column-key="rejectUser" :filters="getFilters(orderList, 'rejectUser')" :filtered-value="columnFilters.rejectUser" />
+      <el-table-column label="电话1" align="center" prop="userPhone" min-width="120" column-key="userPhone" :filters="getFilters(orderList, 'userPhone')" :filtered-value="columnFilters.userPhone" />
+      <el-table-column label="电话2" align="center" prop="memberPhone" min-width="120" column-key="memberPhone" :filters="getFilters(orderList, 'memberPhone')" :filtered-value="columnFilters.memberPhone" />
+      <el-table-column label="销售姓名" align="center" prop="companyUserName" min-width="90" column-key="companyUserName" :filters="getFilters(orderList, 'companyUserName')" :filtered-value="columnFilters.companyUserName" />
+      <el-table-column label="订购产品" align="center" prop="productNames" min-width="180" show-overflow-tooltip column-key="productNames" :filters="getFilters(orderList, 'productNames')" :filtered-value="columnFilters.productNames" />
+      <el-table-column label="地址" align="center" prop="userAddress" min-width="180" show-overflow-tooltip column-key="userAddress" :filters="getFilters(orderList, 'userAddress')" :filtered-value="columnFilters.userAddress" />
     </el-table>
 
     <pagination
@@ -161,11 +171,11 @@
       </el-col>
     </el-row>
 
-    <el-table v-show="activeTab === 'product'" v-loading="productLoading" border :data="productList" style="width:100%">
-      <el-table-column label="订购产品" align="center" prop="productName" min-width="200" show-overflow-tooltip />
-      <el-table-column label="快递公司" align="center" prop="deliveryName" min-width="120" />
-      <el-table-column label="数量" align="center" prop="num" min-width="100" />
-      <el-table-column label="金额" align="center" prop="totalPrice" min-width="120" />
+    <el-table v-show="activeTab === 'product'" v-loading="productLoading" border :data="productList" style="width:100%" show-summary :summary-method="getSummaries" @filter-change="handleFilterChange">
+      <el-table-column label="订购产品" align="center" prop="productName" min-width="200" show-overflow-tooltip column-key="productName" :filters="getFilters(productList, 'productName')" :filtered-value="columnFilters.productName" />
+      <el-table-column label="快递公司" align="center" prop="deliveryName" min-width="120" column-key="deliveryName" :filters="getFilters(productList, 'deliveryName')" :filtered-value="columnFilters.deliveryName" />
+      <el-table-column label="数量" align="center" prop="num" min-width="100" column-key="num" :filters="getFilters(productList, 'num', true)" :filtered-value="columnFilters.num" />
+      <el-table-column label="金额" align="center" prop="totalPrice" min-width="120" column-key="totalPrice" :filters="getFilters(productList, 'totalPrice', true)" :filtered-value="columnFilters.totalPrice" />
     </el-table>
 
     <pagination
@@ -179,13 +189,14 @@
 </template>
 
 <script>
-import { listRejectOrderReport, exportRejectOrderReport, listRejectProductReport, exportRejectProductReport } from '@/api/store/rejectReport'
+import { listRejectOrderReport, exportRejectOrderReport, listRejectProductReport, exportRejectProductReport, listStoreRejectOrderReport, exportStoreRejectOrderReport, listStoreRejectProductReport, exportStoreRejectProductReport } from '@/api/store/rejectReport'
 
 export default {
   name: 'RejectReport',
   data() {
     return {
       activeTab: 'order',
+      orderType: 'external',
       // 订单维度
       orderLoading: false,
       orderExportLoading: false,
@@ -204,6 +215,8 @@ export default {
         totalPrice: null,
         deliveryName: null,
         returnUser: null,
+        rejectUser: null,
+        followTime: null,
         userPhone: null,
         memberPhone: null,
         companyUserName: null,
@@ -226,7 +239,16 @@ export default {
         productName: null,
         deliveryName: null,
         totalNum: null,
-        totalPrice: null
+        totalPrice: null,
+        num: null
+      },
+      // 列头筛选-各列选中值(单选语义,用数组承载以适配 Element filtered-value)
+      columnFilters: {
+        orderCode: [], deliverySn: [], userName: [], externalCreateTime: [],
+        deliveryTime: [], totalPrice: [], deliveryName: [], followTime: [],
+        rejectReturnTime: [], rejectUser: [], userPhone: [], memberPhone: [],
+        companyUserName: [], productNames: [], userAddress: [],
+        productName: [], num: []
       }
     }
   },
@@ -241,12 +263,100 @@ export default {
     }
   },
   methods: {
+    /** 列头筛选:根据指定列表数据生成某字段去重后的筛选项(sort=true 时按数值正序排序) */
+    getFilters(list, prop, sort = false) {
+      if (!list || list.length === 0) return []
+      const seen = new Map()
+      list.forEach(item => {
+        const v = item[prop]
+        if (v === null || v === undefined || v === '') return
+        if (!seen.has(v)) seen.set(v, true)
+      })
+      let keys = Array.from(seen.keys())
+      if (sort) {
+        keys.sort((a, b) => Number(a) - Number(b))
+      }
+      return keys.map(v => ({ text: String(v), value: v }))
+    },
+    /** 列头筛选变化:单选语义,取最后选中值映射到后端查询参数并重新请求 */
+    handleFilterChange(filters) {
+      const isOrderTab = this.activeTab === 'order'
+      const queryObj = isOrderTab ? this.orderQuery : this.productQuery
+      const timeRangeMap = isOrderTab ? {
+        externalCreateTime: ['sTime', 'eTime'],
+        deliveryTime: ['deliveryStartTime', 'deliveryEndTime'],
+        rejectReturnTime: ['rejectReturnTimeStart', 'rejectReturnTimeEnd']
+      } : {}
+      const fieldMap = { productNames: 'productName' }
+      Object.keys(filters).forEach(key => {
+        const vals = filters[key] || []
+        const last = vals.length > 0 ? vals[vals.length - 1] : null
+        this.$set(this.columnFilters, key, last != null ? [last] : [])
+        if (timeRangeMap[key]) {
+          const [startField, endField] = timeRangeMap[key]
+          if (last != null && String(last).length >= 10) {
+            const day = String(last).substring(0, 10)
+            queryObj[startField] = day + ' 00:00:00'
+            queryObj[endField] = day + ' 23:59:59'
+          } else {
+            queryObj[startField] = null
+            queryObj[endField] = null
+          }
+        } else {
+          const fieldName = fieldMap[key] || key
+          queryObj[fieldName] = last
+        }
+      })
+      if (isOrderTab) {
+        this.handleOrderQuery()
+      } else {
+        this.handleProductQuery()
+      }
+    },
+    handleOrderTypeChange() {
+      this.resetColumnFilters()
+      if (this.activeTab === 'order') {
+        this.handleOrderQuery()
+      } else {
+        this.handleProductQuery()
+      }
+    },
+    /** 重置所有列头筛选选中状态 */
+    resetColumnFilters() {
+      Object.keys(this.columnFilters).forEach(key => {
+        this.columnFilters[key] = []
+      })
+    },
+    /** 合计行:对金额/数量列求和(基于当前页数据) */
+    getSummaries({ columns, data }) {
+      const sums = []
+      const sumProps = this.activeTab === 'order'
+        ? ['totalPrice']
+        : ['num', 'totalPrice']
+      columns.forEach((column, index) => {
+        if (index === 0) {
+          sums[index] = '总计'
+          return
+        }
+        if (sumProps.includes(column.property)) {
+          const total = data.reduce((sum, row) => {
+            const v = Number(row[column.property])
+            return isNaN(v) ? sum : sum + v
+          }, 0)
+          sums[index] = column.property === 'num' ? total : total.toFixed(2)
+        } else {
+          sums[index] = ''
+        }
+      })
+      return sums
+    },
     // ========== 订单维度 ==========
     getOrderList() {
       this.orderLoading = true
       const params = { ...this.orderQuery }
       if (params.totalPrice === 0) params.totalPrice = null
-      listRejectOrderReport(params).then(response => {
+      const api = this.orderType === 'store' ? listStoreRejectOrderReport : listRejectOrderReport
+      api(params).then(response => {
         this.orderList = response.rows || []
         this.orderTotal = response.total || 0
         this.orderLoading = false
@@ -296,6 +406,9 @@ export default {
       this.orderQuery.deliveryEndTime = null
       this.orderQuery.rejectReturnTimeStart = null
       this.orderQuery.rejectReturnTimeEnd = null
+      this.orderQuery.followTime = null
+      this.orderQuery.rejectUser = null
+      this.resetColumnFilters()
       this.handleOrderQuery()
     },
     handleOrderExport() {
@@ -305,7 +418,8 @@ export default {
         type: 'warning'
       }).then(() => {
         this.orderExportLoading = true
-        return exportRejectOrderReport(this.orderQuery)
+        const api = this.orderType === 'store' ? exportStoreRejectOrderReport : exportRejectOrderReport
+        return api(this.orderQuery)
       }).then(response => {
         this.download(response.msg)
         this.orderExportLoading = false
@@ -320,7 +434,8 @@ export default {
       const params = { ...this.productQuery }
       if (params.totalNum === 0) params.totalNum = null
       if (params.totalPrice === 0) params.totalPrice = null
-      listRejectProductReport(params).then(response => {
+      const api = this.orderType === 'store' ? listStoreRejectProductReport : listRejectProductReport
+      api(params).then(response => {
         this.productList = response.rows || []
         this.productTotal = response.total || 0
         this.productLoading = false
@@ -334,6 +449,8 @@ export default {
     },
     resetProductQuery() {
       this.resetForm('productQueryForm')
+      this.productQuery.num = null
+      this.resetColumnFilters()
       this.handleProductQuery()
     },
     handleProductExport() {
@@ -343,7 +460,8 @@ export default {
         type: 'warning'
       }).then(() => {
         this.productExportLoading = true
-        return exportRejectProductReport(this.productQuery)
+        const api = this.orderType === 'store' ? exportStoreRejectProductReport : exportRejectProductReport
+        return api(this.productQuery)
       }).then(response => {
         this.download(response.msg)
         this.productExportLoading = false

+ 148 - 28
src/views/store/returnReport/index.vue

@@ -5,6 +5,16 @@
       <el-tab-pane label="回款产品维度" name="product"></el-tab-pane>
     </el-tabs>
 
+    <!-- 订单类型选择 -->
+    <el-form :inline="true" style="margin-bottom: 10px;">
+      <el-form-item label="订单类型">
+        <el-radio-group v-model="orderType" size="small" @change="handleOrderTypeChange">
+          <el-radio-button label="external">外部订单</el-radio-button>
+          <el-radio-button label="store">药品订单</el-radio-button>
+        </el-radio-group>
+      </el-form-item>
+    </el-form>
+
     <!-- 回款时间维度查询条件 -->
     <el-form v-show="activeTab === 'order'" :model="orderQuery" ref="orderQueryForm" :inline="true" label-width="80px">
       <el-form-item label="订单编号" prop="orderCode">
@@ -98,31 +108,31 @@
     </el-row>
 
     <!-- 回款时间维度列表 -->
-    <el-table v-show="activeTab === 'order'" v-loading="orderLoading" border :data="orderList" style="width:100%">
-      <el-table-column label="订单编号" align="center" prop="orderCode" min-width="160" />
-      <el-table-column label="快递单号" align="center" prop="deliverySn" min-width="140" show-overflow-tooltip />
-      <el-table-column label="姓名" align="center" prop="userName" min-width="80" />
-      <el-table-column label="地址" align="center" prop="userAddress" min-width="180" show-overflow-tooltip />
-      <el-table-column label="订单日期" align="center" prop="externalCreateTime" min-width="150">
+    <el-table v-show="activeTab === 'order'" v-loading="orderLoading" border :data="orderList" style="width:100%" show-summary :summary-method="getSummaries" @filter-change="handleFilterChange">
+      <el-table-column label="订单编号" align="center" prop="orderCode" min-width="160" column-key="orderCode" :filters="getFilters(orderList, 'orderCode')" :filtered-value="columnFilters.orderCode" />
+      <el-table-column label="快递单号" align="center" prop="deliverySn" min-width="140" show-overflow-tooltip column-key="deliverySn" :filters="getFilters(orderList, 'deliverySn')" :filtered-value="columnFilters.deliverySn" />
+      <el-table-column label="姓名" align="center" prop="userName" min-width="80" column-key="userName" :filters="getFilters(orderList, 'userName')" :filtered-value="columnFilters.userName" />
+      <el-table-column label="地址" align="center" prop="userAddress" min-width="180" show-overflow-tooltip column-key="userAddress" :filters="getFilters(orderList, 'userAddress')" :filtered-value="columnFilters.userAddress" />
+      <el-table-column label="订单日期" align="center" prop="externalCreateTime" min-width="150" column-key="externalCreateTime" :filters="getFilters(orderList, 'externalCreateTime')" :filtered-value="columnFilters.externalCreateTime">
         <template slot-scope="scope">
           <span>{{ scope.row.externalCreateTime ? parseTime(scope.row.externalCreateTime) : '-' }}</span>
         </template>
       </el-table-column>
-      <el-table-column label="定金" align="center" prop="payPrice" min-width="90" />
-      <el-table-column label="金额" align="center" prop="totalPrice" min-width="90" />
-      <el-table-column label="快递公司" align="center" prop="deliveryName" min-width="100" />
-      <el-table-column label="回款人" align="center" prop="returnUser" min-width="90" />
-      <el-table-column label="回款日期" align="center" prop="returnTime" min-width="150">
+      <el-table-column label="定金" align="center" prop="payPrice" min-width="90" column-key="payPrice" :filters="getFilters(orderList, 'payPrice', true)" :filtered-value="columnFilters.payPrice" />
+      <el-table-column label="金额" align="center" prop="totalPrice" min-width="90" column-key="totalPrice" :filters="getFilters(orderList, 'totalPrice', true)" :filtered-value="columnFilters.totalPrice" />
+      <el-table-column label="快递公司" align="center" prop="deliveryName" min-width="100" column-key="deliveryName" :filters="getFilters(orderList, 'deliveryName')" :filtered-value="columnFilters.deliveryName" />
+      <el-table-column label="回款人" align="center" prop="returnUser" min-width="90" column-key="returnUser" :filters="getFilters(orderList, 'returnUser')" :filtered-value="columnFilters.returnUser" />
+      <el-table-column label="回款日期" align="center" prop="returnTime" min-width="150" column-key="returnTime" :filters="getFilters(orderList, 'returnTime')" :filtered-value="columnFilters.returnTime">
         <template slot-scope="scope">
           <span>{{ scope.row.returnTime ? parseTime(scope.row.returnTime) : '-' }}</span>
         </template>
       </el-table-column>
-      <el-table-column label="电话1" align="center" prop="userPhone" min-width="120" />
-      <el-table-column label="电话2" align="center" prop="memberPhone" min-width="120" />
-      <el-table-column label="销售" align="center" prop="companyUserName" min-width="90" />
-      <el-table-column label="部门" align="center" prop="deptName" min-width="110" show-overflow-tooltip />
-      <el-table-column label="订购产品" align="center" prop="productNames" min-width="180" show-overflow-tooltip />
-      <el-table-column label="发货日期" align="center" prop="deliveryTime" min-width="150">
+      <el-table-column label="电话1" align="center" prop="userPhone" min-width="120" column-key="userPhone" :filters="getFilters(orderList, 'userPhone')" :filtered-value="columnFilters.userPhone" />
+      <el-table-column label="电话2" align="center" prop="memberPhone" min-width="120" column-key="memberPhone" :filters="getFilters(orderList, 'memberPhone')" :filtered-value="columnFilters.memberPhone" />
+      <el-table-column label="销售" align="center" prop="companyUserName" min-width="90" column-key="companyUserName" :filters="getFilters(orderList, 'companyUserName')" :filtered-value="columnFilters.companyUserName" />
+      <el-table-column label="部门" align="center" prop="deptName" min-width="110" show-overflow-tooltip column-key="deptName" :filters="getFilters(orderList, 'deptName')" :filtered-value="columnFilters.deptName" />
+      <el-table-column label="订购产品" align="center" prop="productNames" min-width="180" show-overflow-tooltip column-key="productNames" :filters="getFilters(orderList, 'productNames')" :filtered-value="columnFilters.productNames" />
+      <el-table-column label="发货日期" align="center" prop="deliveryTime" min-width="150" column-key="deliveryTime" :filters="getFilters(orderList, 'deliveryTime')" :filtered-value="columnFilters.deliveryTime">
         <template slot-scope="scope">
           <span>{{ scope.row.deliveryTime ? parseTime(scope.row.deliveryTime) : '-' }}</span>
         </template>
@@ -174,12 +184,12 @@
       </el-col>
     </el-row>
 
-    <el-table v-show="activeTab === 'product'" v-loading="productLoading" border :data="productList" style="width:100%">
-      <el-table-column label="部门" align="center" prop="deptName" min-width="140" show-overflow-tooltip />
-      <el-table-column label="快递公司" align="center" prop="deliveryName" min-width="120" />
-      <el-table-column label="订购产品" align="center" prop="productName" min-width="200" show-overflow-tooltip />
-      <el-table-column label="数量" align="center" prop="num" min-width="100" />
-      <el-table-column label="金额" align="center" prop="totalPrice" min-width="120" />
+    <el-table v-show="activeTab === 'product'" v-loading="productLoading" border :data="productList" style="width:100%" show-summary :summary-method="getSummaries" @filter-change="handleFilterChange">
+      <el-table-column label="部门" align="center" prop="deptName" min-width="140" show-overflow-tooltip column-key="deptName" :filters="getFilters(productList, 'deptName')" :filtered-value="columnFilters.deptName" />
+      <el-table-column label="快递公司" align="center" prop="deliveryName" min-width="120" column-key="deliveryName" :filters="getFilters(productList, 'deliveryName')" :filtered-value="columnFilters.deliveryName" />
+      <el-table-column label="订购产品" align="center" prop="productName" min-width="200" show-overflow-tooltip column-key="productName" :filters="getFilters(productList, 'productName')" :filtered-value="columnFilters.productName" />
+      <el-table-column label="数量" align="center" prop="num" min-width="100" column-key="num" :filters="getFilters(productList, 'num', true)" :filtered-value="columnFilters.num" />
+      <el-table-column label="金额" align="center" prop="totalPrice" min-width="120" column-key="totalPrice" :filters="getFilters(productList, 'totalPrice', true)" :filtered-value="columnFilters.totalPrice" />
     </el-table>
 
     <pagination
@@ -193,7 +203,7 @@
 </template>
 
 <script>
-import { listReturnOrderReport, exportReturnOrderReport, listReturnProductReport, exportReturnProductReport } from '@/api/store/returnReport'
+import { listReturnOrderReport, exportReturnOrderReport, listReturnProductReport, exportReturnProductReport, listStoreReturnOrderReport, exportStoreReturnOrderReport, listStoreReturnProductReport, exportStoreReturnProductReport } from '@/api/store/returnReport'
 import { treeselect } from '@/api/company/companyDept'
 import Treeselect from '@riophae/vue-treeselect'
 import '@riophae/vue-treeselect/dist/vue-treeselect.css'
@@ -204,6 +214,7 @@ export default {
   data() {
     return {
       activeTab: 'order',
+      orderType: 'external',
       // 部门树
       deptOptions: [],
       // 订单维度
@@ -229,6 +240,7 @@ export default {
         memberPhone: null,
         companyUserName: null,
         deptId: null,
+        deptName: null,
         productName: null,
         sTime: null,
         eTime: null,
@@ -248,9 +260,20 @@ export default {
         pageSize: 10,
         productName: null,
         deptId: null,
+        deptName: null,
         deliveryName: null,
+        num: null,
+        totalPrice: null,
         returnTimeStart: null,
         returnTimeEnd: null
+      },
+      // 列头筛选-各列选中值(单选语义,用数组承载以适配 Element filtered-value)
+      columnFilters: {
+        orderCode: [], deliverySn: [], userName: [], userAddress: [],
+        externalCreateTime: [], payPrice: [], totalPrice: [], deliveryName: [],
+        returnUser: [], returnTime: [], userPhone: [], memberPhone: [],
+        companyUserName: [], deptName: [], productNames: [], deliveryTime: [],
+        productName: [], num: []
       }
     }
   },
@@ -272,13 +295,101 @@ export default {
         this.deptOptions = response.data
       })
     },
+    /** 列头筛选:根据指定列表数据生成某字段去重后的筛选项(sort=true 时按数值正序排序) */
+    getFilters(list, prop, sort = false) {
+      if (!list || list.length === 0) return []
+      const seen = new Map()
+      list.forEach(item => {
+        const v = item[prop]
+        if (v === null || v === undefined || v === '') return
+        if (!seen.has(v)) seen.set(v, true)
+      })
+      let keys = Array.from(seen.keys())
+      if (sort) {
+        keys.sort((a, b) => Number(a) - Number(b))
+      }
+      return keys.map(v => ({ text: String(v), value: v }))
+    },
+    /** 列头筛选变化:单选语义,取最后选中值映射到后端查询参数并重新请求 */
+    handleFilterChange(filters) {
+      const isOrderTab = this.activeTab === 'order'
+      const queryObj = isOrderTab ? this.orderQuery : this.productQuery
+      const timeRangeMap = isOrderTab ? {
+        externalCreateTime: ['sTime', 'eTime'],
+        returnTime: ['returnTimeStart', 'returnTimeEnd'],
+        deliveryTime: ['deliveryStartTime', 'deliveryEndTime']
+      } : {}
+      const fieldMap = { productNames: 'productName' }
+      Object.keys(filters).forEach(key => {
+        const vals = filters[key] || []
+        const last = vals.length > 0 ? vals[vals.length - 1] : null
+        this.$set(this.columnFilters, key, last != null ? [last] : [])
+        if (timeRangeMap[key]) {
+          const [startField, endField] = timeRangeMap[key]
+          if (last != null && String(last).length >= 10) {
+            const day = String(last).substring(0, 10)
+            queryObj[startField] = day + ' 00:00:00'
+            queryObj[endField] = day + ' 23:59:59'
+          } else {
+            queryObj[startField] = null
+            queryObj[endField] = null
+          }
+        } else {
+          const fieldName = fieldMap[key] || key
+          queryObj[fieldName] = last
+        }
+      })
+      if (isOrderTab) {
+        this.handleOrderQuery()
+      } else {
+        this.handleProductQuery()
+      }
+    },
+    /** 重置所有列头筛选选中状态 */
+    resetColumnFilters() {
+      Object.keys(this.columnFilters).forEach(key => {
+        this.columnFilters[key] = []
+      })
+    },
+    handleOrderTypeChange() {
+      this.resetColumnFilters()
+      if (this.activeTab === 'order') {
+        this.handleOrderQuery()
+      } else {
+        this.handleProductQuery()
+      }
+    },
+    /** 合计行:对金额/数量列求和(基于当前页数据) */
+    getSummaries({ columns, data }) {
+      const sums = []
+      const sumProps = this.activeTab === 'order'
+        ? ['payPrice', 'totalPrice']
+        : ['num', 'totalPrice']
+      columns.forEach((column, index) => {
+        if (index === 0) {
+          sums[index] = '总计'
+          return
+        }
+        if (sumProps.includes(column.property)) {
+          const total = data.reduce((sum, row) => {
+            const v = Number(row[column.property])
+            return isNaN(v) ? sum : sum + v
+          }, 0)
+          sums[index] = column.property === 'num' ? total : total.toFixed(2)
+        } else {
+          sums[index] = ''
+        }
+      })
+      return sums
+    },
     // ========== 订单维度 ==========
     getOrderList() {
       this.orderLoading = true
       const params = { ...this.orderQuery }
       if (params.payPrice === 0) params.payPrice = null
       if (params.totalPrice === 0) params.totalPrice = null
-      listReturnOrderReport(params).then(response => {
+      const api = this.orderType === 'store' ? listStoreReturnOrderReport : listReturnOrderReport
+      api(params).then(response => {
         this.orderList = response.rows || []
         this.orderTotal = response.total || 0
         this.orderLoading = false
@@ -328,6 +439,8 @@ export default {
       this.orderQuery.deliveryEndTime = null
       this.orderQuery.returnTimeStart = null
       this.orderQuery.returnTimeEnd = null
+      this.orderQuery.deptName = null
+      this.resetColumnFilters()
       this.handleOrderQuery()
     },
     handleOrderExport() {
@@ -337,7 +450,8 @@ export default {
         type: 'warning'
       }).then(() => {
         this.orderExportLoading = true
-        return exportReturnOrderReport(this.orderQuery)
+        const api = this.orderType === 'store' ? exportStoreReturnOrderReport : exportReturnOrderReport
+        return api(this.orderQuery)
       }).then(response => {
         this.download(response.msg)
         this.orderExportLoading = false
@@ -349,7 +463,8 @@ export default {
     // ========== 产品维度 ==========
     getProductList() {
       this.productLoading = true
-      listReturnProductReport(this.productQuery).then(response => {
+      const api = this.orderType === 'store' ? listStoreReturnProductReport : listReturnProductReport
+      api(this.productQuery).then(response => {
         this.productList = response.rows || []
         this.productTotal = response.total || 0
         this.productLoading = false
@@ -375,6 +490,10 @@ export default {
       this.resetForm('productQueryForm')
       this.productQuery.returnTimeStart = null
       this.productQuery.returnTimeEnd = null
+      this.productQuery.deptName = null
+      this.productQuery.num = null
+      this.productQuery.totalPrice = null
+      this.resetColumnFilters()
       this.handleProductQuery()
     },
     handleProductExport() {
@@ -384,7 +503,8 @@ export default {
         type: 'warning'
       }).then(() => {
         this.productExportLoading = true
-        return exportReturnProductReport(this.productQuery)
+        const api = this.orderType === 'store' ? exportStoreReturnProductReport : exportReturnProductReport
+        return api(this.productQuery)
       }).then(response => {
         this.download(response.msg)
         this.productExportLoading = false

+ 69 - 11
src/views/store/signDetailReport/index.vue

@@ -64,20 +64,21 @@
       style="width:100%"
       show-summary
       :summary-method="getSummaries"
+      @filter-change="handleFilterChange"
     >
-      <el-table-column label="订单类型" align="center" prop="orderType" min-width="100" sortable>
+      <el-table-column label="订单类型" align="center" prop="orderType" min-width="100" sortable column-key="orderType" :filters="orderTypeFilters" :filtered-value="columnFilters.orderType">
         <template slot-scope="scope">
           <span>{{ formatOrderType(scope.row.orderType) }}</span>
         </template>
       </el-table-column>
-      <el-table-column label="发货数量" align="center" prop="deliveryCount" min-width="100" sortable />
-      <el-table-column label="发货金额" align="center" prop="deliveryAmount" min-width="120" sortable />
-      <el-table-column label="签收数量" align="center" prop="signCount" min-width="100" sortable />
-      <el-table-column label="签收金额" align="center" prop="signAmount" min-width="120" sortable />
+      <el-table-column label="发货数量" align="center" prop="deliveryCount" min-width="100" sortable column-key="deliveryCount" :filters="getFilters('deliveryCount', null, true)" :filtered-value="columnFilters.deliveryCount" />
+      <el-table-column label="发货金额" align="center" prop="deliveryAmount" min-width="120" sortable column-key="deliveryAmount" :filters="getFilters('deliveryAmount', null, true)" :filtered-value="columnFilters.deliveryAmount" />
+      <el-table-column label="签收数量" align="center" prop="signCount" min-width="100" sortable column-key="signCount" :filters="getFilters('signCount', null, true)" :filtered-value="columnFilters.signCount" />
+      <el-table-column label="签收金额" align="center" prop="signAmount" min-width="120" sortable column-key="signAmount" :filters="getFilters('signAmount', null, true)" :filtered-value="columnFilters.signAmount" />
       <el-table-column label="单数签收率" align="center" prop="orderSignRate" min-width="110" sortable />
       <el-table-column label="金额签收率" align="center" prop="amountSignRate" min-width="110" sortable />
-      <el-table-column label="部门" align="center" prop="deptName" min-width="140" show-overflow-tooltip sortable />
-      <el-table-column label="公司" align="center" prop="companyName" min-width="160" show-overflow-tooltip sortable />
+      <el-table-column label="部门" align="center" prop="deptName" min-width="140" show-overflow-tooltip sortable column-key="deptName" :filters="getFilters('deptName')" :filtered-value="columnFilters.deptName" />
+      <el-table-column label="公司" align="center" prop="companyName" min-width="160" show-overflow-tooltip sortable column-key="companyName" :filters="getFilters('companyName')" :filtered-value="columnFilters.companyName" />
     </el-table>
 
     <pagination
@@ -91,7 +92,7 @@
 </template>
 
 <script>
-import { listSignDetailReport, exportSignDetailReport } from '@/api/store/signDetailReport'
+import { listSignDetailReport, exportSignDetailReport, listStoreSignDetailReport, exportStoreSignDetailReport } from '@/api/store/signDetailReport'
 import { selectDeptTreeByCompanyId } from '@/api/company/companyDept'
 import { getCompanyList } from '@/api/company/company'
 import Treeselect from '@riophae/vue-treeselect'
@@ -120,10 +121,29 @@ export default {
          signCount: null,
          signAmount: null,
         sTime: null,
-        eTime: null
+        eTime: null,
+        // 以下为列头筛选用字段
+        deptName: null,
+        companyName: null
+      },
+      // 列头筛选-各列选中值(单选语义,用数组承载以适配 Element filtered-value)
+      columnFilters: {
+        orderType: [], deliveryCount: [], deliveryAmount: [],
+        signCount: [], signAmount: [], deptName: [], companyName: []
       }
     }
   },
+  computed: {
+    // 订单类型-全量枚举筛选项
+    orderTypeFilters() {
+      return [
+        { text: '外部订单', value: 1 },
+        { text: '套餐包', value: 2 },
+        { text: '问诊', value: 3 },
+        { text: '积分', value: 4 }
+      ]
+    }
+  },
   created() {
     this.getCompanyList()
     this.getList()
@@ -136,7 +156,8 @@ export default {
       if (params.deliveryAmount === 0) params.deliveryAmount = null
       if (params.signCount === 0) params.signCount = null
       if (params.signAmount === 0) params.signAmount = null
-      listSignDetailReport(params).then(response => {
+      const api = this.queryParams.orderType === 2 ? listStoreSignDetailReport : listSignDetailReport
+      api(params).then(response => {
         this.tableList = response.rows || []
         this.total = response.total || 0
         this.loading = false
@@ -171,6 +192,41 @@ export default {
       this.queryParams.pageNum = 1
       this.getList()
     },
+    /** 列头筛选:根据当前列表数据生成某字段去重后的筛选项(sort=true 时按数值正序排序) */
+    getFilters(prop, labelMap = null, sort = false) {
+      if (!this.tableList || this.tableList.length === 0) return []
+      const seen = new Map()
+      this.tableList.forEach(item => {
+        const v = item[prop]
+        if (v === null || v === undefined || v === '') return
+        if (!seen.has(v)) seen.set(v, true)
+      })
+      let keys = Array.from(seen.keys())
+      if (sort) {
+        keys.sort((a, b) => Number(a) - Number(b))
+      }
+      return keys.map(v => ({
+        text: labelMap ? (labelMap[v] || String(v)) : String(v),
+        value: v
+      }))
+    },
+    /** 列头筛选变化:单选语义,取最后选中值映射到后端查询参数并重新请求 */
+    handleFilterChange(filters) {
+      Object.keys(filters).forEach(key => {
+        const vals = filters[key] || []
+        // 单选:只保留最后选中的一项
+        const last = vals.length > 0 ? vals[vals.length - 1] : null
+        this.$set(this.columnFilters, key, last != null ? [last] : [])
+        this.queryParams[key] = last
+      })
+      this.handleQuery()
+    },
+    /** 重置所有列头筛选选中状态 */
+    resetColumnFilters() {
+      Object.keys(this.columnFilters).forEach(key => {
+        this.columnFilters[key] = []
+      })
+    },
     resetQuery() {
       this.orderTime = null
       this.queryParams.sTime = null
@@ -179,6 +235,7 @@ export default {
       this.queryParams.deptId = null
       this.deptOptions = []
       this.resetForm('queryForm')
+      this.resetColumnFilters()
       this.handleQuery()
     },
     handleExport() {
@@ -188,7 +245,8 @@ export default {
         type: 'warning'
       }).then(() => {
         this.exportLoading = true
-        return exportSignDetailReport(this.queryParams)
+        const api = this.queryParams.orderType === 2 ? exportStoreSignDetailReport : exportSignDetailReport
+        return api(this.queryParams)
       }).then(response => {
         this.download(response.msg)
         this.exportLoading = false

+ 109 - 16
src/views/store/signReport/index.vue

@@ -1,5 +1,14 @@
 <template>
   <div class="app-container">
+    <!-- 订单类型选择 -->
+    <el-form :inline="true" style="margin-bottom: 10px;">
+      <el-form-item label="订单类型">
+        <el-radio-group v-model="orderType" size="small" @change="handleOrderTypeChange">
+          <el-radio-button label="external">外部订单</el-radio-button>
+          <el-radio-button label="store">药品订单</el-radio-button>
+        </el-radio-group>
+      </el-form-item>
+    </el-form>
     <!-- 查询条件 -->
     <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="90px">
       <el-form-item label="订单编号" prop="orderCode">
@@ -69,27 +78,27 @@
     </el-row>
 
     <!-- 签收未回款列表 -->
-    <el-table v-loading="loading" border :data="tableList" style="width:100%">
-      <el-table-column label="订单编号" align="center" prop="orderCode" min-width="160" />
-      <el-table-column label="运单号" align="center" prop="deliverySn" min-width="140" show-overflow-tooltip />
-      <el-table-column label="会员姓名" align="center" prop="userName" min-width="80" />
-      <el-table-column label="地址" align="center" prop="userAddress" min-width="180" show-overflow-tooltip />
-      <el-table-column label="发货日期" align="center" prop="deliveryTime" min-width="150">
+    <el-table v-loading="loading" border :data="tableList" style="width:100%" show-summary :summary-method="getSummaries" @filter-change="handleFilterChange">
+      <el-table-column label="订单编号" align="center" prop="orderCode" min-width="160" column-key="orderCode" :filters="getFilters('orderCode')" :filtered-value="columnFilters.orderCode" />
+      <el-table-column label="运单号" align="center" prop="deliverySn" min-width="140" show-overflow-tooltip column-key="deliverySn" :filters="getFilters('deliverySn')" :filtered-value="columnFilters.deliverySn" />
+      <el-table-column label="会员姓名" align="center" prop="userName" min-width="80" column-key="userName" :filters="getFilters('userName')" :filtered-value="columnFilters.userName" />
+      <el-table-column label="地址" align="center" prop="userAddress" min-width="180" show-overflow-tooltip column-key="userAddress" :filters="getFilters('userAddress')" :filtered-value="columnFilters.userAddress" />
+      <el-table-column label="发货日期" align="center" prop="deliveryTime" min-width="150" column-key="deliveryTime" :filters="getFilters('deliveryTime')" :filtered-value="columnFilters.deliveryTime">
         <template slot-scope="scope">
           <span>{{ scope.row.deliveryTime ? parseTime(scope.row.deliveryTime) : '-' }}</span>
         </template>
       </el-table-column>
-      <el-table-column label="定金" align="center" prop="payPrice" min-width="90" />
-      <el-table-column label="代收金额" align="center" prop="collectionPrice" min-width="90" />
-      <el-table-column label="订单总金额" align="center" prop="totalPrice" min-width="100" />
-      <el-table-column label="跟单时间" align="center" prop="followTime" min-width="150">
+      <el-table-column label="定金" align="center" prop="payPrice" min-width="90" column-key="payPrice" :filters="getFilters('payPrice', null, true)" :filtered-value="columnFilters.payPrice" />
+      <el-table-column label="代收金额" align="center" prop="collectionPrice" min-width="90" column-key="collectionPrice" :filters="getFilters('collectionPrice', null, true)" :filtered-value="columnFilters.collectionPrice" />
+      <el-table-column label="订单总金额" align="center" prop="totalPrice" min-width="100" column-key="totalPrice" :filters="getFilters('totalPrice', null, true)" :filtered-value="columnFilters.totalPrice" />
+      <el-table-column label="跟单时间" align="center" prop="followTime" min-width="150" column-key="followTime" :filters="getFilters('followTime')" :filtered-value="columnFilters.followTime">
         <template slot-scope="scope">
           <span>{{ scope.row.followTime ? parseTime(scope.row.followTime) : '-' }}</span>
         </template>
       </el-table-column>
-      <el-table-column label="快递公司" align="center" prop="deliveryName" min-width="100" />
-      <el-table-column label="部门" align="center" prop="deptName" min-width="120" show-overflow-tooltip />
-      <el-table-column label="公司" align="center" prop="companyName" min-width="140" show-overflow-tooltip />
+      <el-table-column label="快递公司" align="center" prop="deliveryName" min-width="100" column-key="deliveryName" :filters="getFilters('deliveryName')" :filtered-value="columnFilters.deliveryName" />
+      <el-table-column label="部门" align="center" prop="deptName" min-width="120" show-overflow-tooltip column-key="deptName" :filters="getFilters('deptName')" :filtered-value="columnFilters.deptName" />
+      <el-table-column label="公司" align="center" prop="companyName" min-width="140" show-overflow-tooltip column-key="companyName" :filters="getFilters('companyName')" :filtered-value="columnFilters.companyName" />
     </el-table>
 
     <pagination
@@ -103,7 +112,7 @@
 </template>
 
 <script>
-import { listSignOrderReport, exportSignOrderReport } from '@/api/store/signReport'
+import { listSignOrderReport, exportSignOrderReport, listStoreSignOrderReport, exportStoreSignOrderReport } from '@/api/store/signReport'
 import { treeselect } from '@/api/company/companyDept'
 import Treeselect from '@riophae/vue-treeselect'
 import '@riophae/vue-treeselect/dist/vue-treeselect.css'
@@ -113,6 +122,7 @@ export default {
   components: { Treeselect },
   data() {
     return {
+      orderType: 'external',
       loading: false,
       exportLoading: false,
       total: 0,
@@ -136,6 +146,11 @@ export default {
         deliveryEndTime: null,
         followTimeStart: null,
         followTimeEnd: null
+      },
+      columnFilters: {
+        orderCode: [], deliverySn: [], userName: [], userAddress: [],
+        deliveryTime: [], payPrice: [], collectionPrice: [], totalPrice: [],
+        followTime: [], deliveryName: [], deptName: [], companyName: []
       }
     }
   },
@@ -144,6 +159,10 @@ export default {
     this.getList()
   },
   methods: {
+    handleOrderTypeChange() {
+      this.resetColumnFilters()
+      this.handleQuery()
+    },
     getTreeselect() {
       treeselect().then((response) => {
         this.deptOptions = response.data
@@ -155,7 +174,8 @@ export default {
       if (params.payPrice === 0) params.payPrice = null
       if (params.collectionPrice === 0) params.collectionPrice = null
       if (params.totalPrice === 0) params.totalPrice = null
-      listSignOrderReport(params).then(response => {
+      const api = this.orderType === 'store' ? listStoreSignOrderReport : listSignOrderReport
+      api(params).then(response => {
         this.tableList = response.rows || []
         this.total = response.total || 0
         this.loading = false
@@ -163,6 +183,77 @@ export default {
         this.loading = false
       })
     },
+    /** 列头筛选:根据当前列表数据生成某字段去重后的筛选项(sort=true 时按数值正序排序) */
+    getFilters(prop, labelMap = null, sort = false) {
+      if (!this.tableList || this.tableList.length === 0) return [];
+      const seen = new Map();
+      this.tableList.forEach(item => {
+        const v = item[prop];
+        if (v === null || v === undefined || v === '') return;
+        if (!seen.has(v)) seen.set(v, true);
+      });
+      let keys = Array.from(seen.keys());
+      if (sort) {
+        keys.sort((a, b) => Number(a) - Number(b));
+      }
+      return keys.map(v => ({
+        text: labelMap ? (labelMap[v] || String(v)) : String(v),
+        value: v
+      }));
+    },
+    /** 列头筛选变化:单选语义,取最后选中值映射到后端查询参数并重新请求 */
+    handleFilterChange(filters) {
+      const timeRangeMap = {
+        deliveryTime: ['deliveryStartTime', 'deliveryEndTime'],
+        followTime: ['followTimeStart', 'followTimeEnd']
+      };
+      Object.keys(filters).forEach(key => {
+        const vals = filters[key] || [];
+        const last = vals.length > 0 ? vals[vals.length - 1] : null;
+        this.$set(this.columnFilters, key, last != null ? [last] : []);
+        if (timeRangeMap[key]) {
+          const [startField, endField] = timeRangeMap[key];
+          if (last != null && String(last).length >= 10) {
+            const day = String(last).substring(0, 10);
+            this.queryParams[startField] = day + ' 00:00:00';
+            this.queryParams[endField] = day + ' 23:59:59';
+          } else {
+            this.queryParams[startField] = null;
+            this.queryParams[endField] = null;
+          }
+        } else {
+          this.queryParams[key] = last;
+        }
+      });
+      this.handleQuery();
+    },
+    /** 重置所有列头筛选选中状态 */
+    resetColumnFilters() {
+      Object.keys(this.columnFilters).forEach(key => {
+        this.columnFilters[key] = [];
+      });
+    },
+    /** 合计行:对金额列求和(基于当前页数据) */
+    getSummaries({ columns, data }) {
+      const sums = [];
+      const sumProps = ['payPrice', 'collectionPrice', 'totalPrice'];
+      columns.forEach((column, index) => {
+        if (index === 0) {
+          sums[index] = '总计';
+          return;
+        }
+        if (sumProps.includes(column.property)) {
+          const total = data.reduce((sum, row) => {
+            const v = Number(row[column.property]);
+            return isNaN(v) ? sum : sum + v;
+          }, 0);
+          sums[index] = total.toFixed(2);
+        } else {
+          sums[index] = '';
+        }
+      });
+      return sums;
+    },
     handleDeliveryTimeChange(val) {
       if (val) {
         this.queryParams.deliveryStartTime = val[0]
@@ -193,6 +284,7 @@ export default {
       this.queryParams.deliveryEndTime = null
       this.queryParams.followTimeStart = null
       this.queryParams.followTimeEnd = null
+      this.resetColumnFilters()
       this.handleQuery()
     },
     handleExport() {
@@ -202,7 +294,8 @@ export default {
         type: 'warning'
       }).then(() => {
         this.exportLoading = true
-        return exportSignOrderReport(this.queryParams)
+        const api = this.orderType === 'store' ? exportStoreSignOrderReport : exportSignOrderReport
+        return api(this.queryParams)
       }).then(response => {
         this.download(response.msg)
         this.exportLoading = false

+ 203 - 39
src/views/store/storeOrder/list.vue

@@ -250,49 +250,83 @@
       </el-col>
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
-    <el-tabs type="card" v-model="actName" @tab-click="handleClickX">
-      <el-tab-pane label="全部订单" name="10"></el-tab-pane>
-      <el-tab-pane v-for="(item,index) in orderOptions" :label="item.dictLabel" :name="item.dictValue"></el-tab-pane>
+    <el-tabs v-model="actName" @tab-click="handleClickX">
+      <el-tab-pane label="全部" name="all"></el-tab-pane>
+      <el-tab-pane label="未审核" name="1"></el-tab-pane>
+      <el-tab-pane label="审核通过" name="2"></el-tab-pane>
+      <el-tab-pane label="已发货" name="3"></el-tab-pane>
+      <el-tab-pane label="已回款" name="4"></el-tab-pane>
+      <el-tab-pane label="已取消" name="-3"></el-tab-pane>
     </el-tabs>
-    <el-table height="450" v-loading="loading" border :data="orderList" @selection-change="handleSelectionChange" >
+    <el-table ref="orderTable" height="450" v-loading="loading" border :data="orderList" show-summary :summary-method="getSummaries" @filter-change="handleFilterChange" @selection-change="handleSelectionChange" >
       <el-table-column type="selection" width="55" align="center" />
-      <el-table-column label="药品订单号" align="center" prop="orderCode" width="180px"/>
-      <el-table-column label="所属公司" align="center" prop="companyName" />
-      <el-table-column label="员工" align="center" prop="companyUserName" />
-      <el-table-column label="就诊人" align="center" prop="patientName" />
-      <el-table-column label="收货人" align="center" prop="userName" />
-      <el-table-column label="套餐名称" align="center" prop="packageName" />
-      <el-table-column label="套餐别名" align="center" prop="packageSecondName" />
-      <el-table-column label="应收金额" align="center" prop="payPrice" />
-      <el-table-column label="实收金额" align="center" prop="payMoney" />
-      <el-table-column label="支付方式" align="center" prop="payType" >
+      <el-table-column label="药品订单号" align="center" prop="orderCode" width="180px" column-key="orderCode" :filters="getFilters('orderCode')" :filtered-value="columnFilters.orderCode"/>
+      <el-table-column label="所属公司" align="center" prop="companyName" column-key="companyName" :filters="getFilters('companyName')" :filtered-value="columnFilters.companyName"/>
+      <el-table-column label="员工" align="center" prop="companyUserName" column-key="companyUserName" :filters="getFilters('companyUserName')" :filtered-value="columnFilters.companyUserName"/>
+      <el-table-column label="就诊人" align="center" prop="patientName" column-key="patientName" :filters="getFilters('patientName')" :filtered-value="columnFilters.patientName"/>
+      <el-table-column label="收货人" align="center" prop="userName" column-key="userName" :filters="getFilters('userName')" :filtered-value="columnFilters.userName"/>
+      <el-table-column label="套餐名称" align="center" prop="packageName" column-key="packageName" :filters="getFilters('packageName')" :filtered-value="columnFilters.packageName"/>
+      <el-table-column label="套餐别名" align="center" prop="packageSecondName" column-key="packageSecondName" :filters="getFilters('packageSecondName')" :filtered-value="columnFilters.packageSecondName"/>
+      <el-table-column label="应收金额" align="center" prop="payPrice" column-key="payPrice" :filters="getFilters('payPrice', null, true)" :filtered-value="columnFilters.payPrice"/>
+      <el-table-column label="实收金额" align="center" prop="payMoney" column-key="payMoney" :filters="getFilters('payMoney', null, true)" :filtered-value="columnFilters.payMoney"/>
+      <el-table-column label="订单总价" align="center" prop="totalPrice" width="100" column-key="totalPrice" :filters="getFilters('totalPrice', null, true)" :filtered-value="columnFilters.totalPrice"/>
+      <el-table-column label="代收金额" align="center" prop="collectionPrice" width="100" column-key="collectionPrice" :filters="getFilters('collectionPrice', null, true)" :filtered-value="columnFilters.collectionPrice"/>
+      <el-table-column label="退款金额" align="center" prop="refundPrice" width="100" column-key="refundPrice" :filters="getFilters('refundPrice', null, true)" :filtered-value="columnFilters.refundPrice"/>
+      <el-table-column label="回款金额" align="center" prop="returnPrice" width="100" column-key="returnPrice" :filters="getFilters('returnPrice', null, true)" :filtered-value="columnFilters.returnPrice"/>
+      <el-table-column label="支付方式" align="center" prop="payType" column-key="payType" :filters="payTypeFilters" :filtered-value="columnFilters.payType">
         <template slot-scope="scope">
               <dict-tag :options="PayOptions" :value="scope.row.payType"/>
          </template>
       </el-table-column>
-		<el-table-column label="订单来源" align="center" prop="source" >
+		<el-table-column label="订单来源" align="center" prop="source" column-key="source" :filters="sourceFilters" :filtered-value="columnFilters.source">
 				  <template slot-scope="scope">
 				     <dict-tag :options="sourceOptions" :value="scope.row.source"/>
 				  </template>
 		</el-table-column>
-        <el-table-column label="下单时间" align="center" prop="createTime" width="180" />
-        <el-table-column label="支付时间" align="center" prop="payTime" width="180" />
-        <el-table-column label="订单状态" align="center" prop="status" >
+      <el-table-column label="快递公司编号" align="center" prop="deliveryCode" width="100" column-key="deliveryCode" :filters="getFilters('deliveryCode')" :filtered-value="columnFilters.deliveryCode"/>
+      <el-table-column label="快递名称" align="center" prop="deliveryName" width="100" column-key="deliveryName" :filters="getFilters('deliveryName')" :filtered-value="columnFilters.deliveryName"/>
+        <el-table-column label="下单时间" align="center" prop="createTime" width="180" column-key="createTime" :filters="getFilters('createTime')" :filtered-value="columnFilters.createTime"/>
+        <el-table-column label="发货时间" align="center" prop="deliveryTime" width="160" column-key="deliveryTime" :filters="getFilters('deliveryTime')" :filtered-value="columnFilters.deliveryTime"/>
+        <el-table-column label="跟单时间" align="center" prop="followTime" width="160" column-key="followTime" :filters="getFilters('followTime')" :filtered-value="columnFilters.followTime"/>
+        <el-table-column label="支付时间" align="center" prop="payTime" width="180" column-key="payTime" :filters="getFilters('payTime')" :filtered-value="columnFilters.payTime"/>
+        <el-table-column label="订单状态" align="center" prop="status" width="100" column-key="status" :filters="statusFilters" :filtered-value="columnFilters.status">
           <template slot-scope="scope">
-                <dict-tag :options="orderOptions" :value="scope.row.status"/>
+            <el-tag v-if="scope.row.status==1" type="warning" size="mini">未审核</el-tag>
+            <el-tag v-else-if="scope.row.status==2" type="success" size="mini">审核通过</el-tag>
+            <el-tag v-else-if="scope.row.status==3" type="primary" size="mini">已发货</el-tag>
+            <el-tag v-else-if="scope.row.status==4" size="mini">已回款</el-tag>
+            <el-tag v-else-if="scope.row.status==-3" type="danger" size="mini">已取消</el-tag>
+            <span v-else>-</span>
            </template>
         </el-table-column>
-     <el-table-column label="物流状态" align="center" prop="deliveryStatus" >
+     <el-table-column label="物流状态" align="center" prop="deliveryStatus" column-key="deliveryStatus" :filters="deliveryStatusFilters" :filtered-value="columnFilters.deliveryStatus">
        <template slot-scope="scope">
              <dict-tag :options="deliveryStatusOptions" :value="scope.row.deliveryStatus"/>
         </template>
      </el-table-column>
-      <el-table-column label="物流单号" align="center" prop="deliverySn" width="180px"/>
-    <el-table-column label="结算状态" align="center" prop="deliveryPayStatus" >
+      <el-table-column label="物流单号" align="center" prop="deliverySn" width="180px" column-key="deliverySn" :filters="getFilters('deliverySn')" :filtered-value="columnFilters.deliverySn"/>
+      <el-table-column label="签收状态更新时间" align="center" prop="deliveryStatusUpdateTime" width="160" column-key="deliveryStatusUpdateTime" :filters="getFilters('deliveryStatusUpdateTime')" :filtered-value="columnFilters.deliveryStatusUpdateTime"/>
+      <el-table-column label="签收状态更新人" align="center" prop="deliveryStatusUpdateBy" width="100" column-key="deliveryStatusUpdateBy" :filters="getFilters('deliveryStatusUpdateBy')" :filtered-value="columnFilters.deliveryStatusUpdateBy"/>
+      <el-table-column label="拒收回退时间" align="center" prop="rejectReturnTime" width="160" column-key="rejectReturnTime" :filters="getFilters('rejectReturnTime')" :filtered-value="columnFilters.rejectReturnTime"/>
+    <el-table-column label="结算状态" align="center" prop="deliveryPayStatus" column-key="deliveryPayStatus" :filters="deliveryPayStatusFilters" :filtered-value="columnFilters.deliveryPayStatus">
       <template slot-scope="scope">
             <dict-tag :options="deliveryPayStatusOptions" :value="scope.row.deliveryPayStatus"/>
        </template>
     </el-table-column>
+      <el-table-column label="定金回款时间" align="center" prop="depositReturnTime" width="160" column-key="depositReturnTime" :filters="getFilters('depositReturnTime')" :filtered-value="columnFilters.depositReturnTime">
+        <template slot-scope="scope">
+          <span>{{ scope.row.status == 4 ? scope.row.depositReturnTime : '-' }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="审核人" align="center" prop="auditor" width="90" column-key="auditor" :filters="getFilters('auditor')" :filtered-value="columnFilters.auditor"/>
+      <el-table-column label="审核时间" align="center" prop="auditTime" width="160" column-key="auditTime" :filters="getFilters('auditTime')" :filtered-value="columnFilters.auditTime"/>
+      <el-table-column label="病名" align="center" prop="diseaseName" width="100" show-overflow-tooltip column-key="diseaseName" :filters="getFilters('diseaseName')" :filtered-value="columnFilters.diseaseName"/>
+      <el-table-column label="是否还货" align="center" prop="isReturnGoods" width="80" column-key="isReturnGoods" :filters="isReturnGoodsFilters" :filtered-value="columnFilters.isReturnGoods">
+        <template slot-scope="scope">
+          <span>{{ scope.row.isReturnGoods == 1 ? '是' : scope.row.isReturnGoods == 2 ? '否' : '-' }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="备注" align="center" prop="remark" width="150" show-overflow-tooltip column-key="remark" :filters="getFilters('remark')" :filtered-value="columnFilters.remark"/>
       <el-table-column label="操作" align="center" class-name="small-padding fixed-width" fixed="right" width="200px">
       <template slot-scope="scope">
           <el-button
@@ -678,7 +712,7 @@ export default {
       // 部门树选项
       deptOptions: [],
       deptName:undefined,
-      actName:"10",
+      actName:"all",
       show:{
               title:"订单详情",
               open:false,
@@ -774,6 +808,32 @@ export default {
         packageSecondName:null,
         isFirst:null,
       		source:null,
+        // 列头筛选用字段
+        collectionPrice: null,
+        refundPrice: null,
+        returnPrice: null,
+        followTime: null,
+        followTimeStart: null,
+        followTimeEnd: null,
+        remark: null,
+        depositReturnTime: null,
+        depositReturnTimeStart: null,
+        depositReturnTimeEnd: null,
+        auditor: null,
+        auditTime: null,
+        auditTimeStart: null,
+        auditTimeEnd: null,
+        diseaseName: null,
+        deliveryStatusUpdateTime: null,
+        deliveryStatusUpdateTimeStart: null,
+        deliveryStatusUpdateTimeEnd: null,
+        deliveryStatusUpdateBy: null,
+        rejectReturnTime: null,
+        rejectReturnTimeStart: null,
+        rejectReturnTimeEnd: null,
+        isReturnGoods: null,
+        deliveryStartTime: null,
+        deliveryEndTime: null,
       },
       // 表单参数
       form: {
@@ -859,6 +919,21 @@ export default {
         rejectReturnTime: null,
         diseaseName: null,
         isReturnGoods: null
+      },
+      statusMap: { 1: '未审核', 2: '审核通过', 3: '已发货', 4: '已回款', '-3': '已取消' },
+      columnFilters: {
+        orderCode: [], companyName: [], companyUserName: [], patientName: [],
+        userName: [], packageName: [], packageSecondName: [],
+        payPrice: [], payMoney: [], totalPrice: [],
+        collectionPrice: [], refundPrice: [], returnPrice: [],
+        payType: [], source: [], status: [],
+        createTime: [], payTime: [],
+        deliveryCode: [], deliveryName: [], deliveryTime: [],
+        deliveryStatus: [], deliverySn: [], deliveryPayStatus: [],
+        deliveryStatusUpdateTime: [], deliveryStatusUpdateBy: [],
+        rejectReturnTime: [], depositReturnTime: [],
+        auditor: [], auditTime: [], diseaseName: [],
+        isReturnGoods: [], remark: [], followTime: []
       }
     };
   },
@@ -879,6 +954,24 @@ export default {
         return statusItem.dictLabel === '已拒收';
       }
       return false;
+    },
+    statusFilters() {
+      return Object.keys(this.statusMap).map(k => ({ text: this.statusMap[k], value: Number(k) }));
+    },
+    payTypeFilters() {
+      return (this.PayOptions || []).map(d => ({ text: d.dictLabel, value: Number(d.dictValue) }));
+    },
+    sourceFilters() {
+      return (this.sourceOptions || []).map(d => ({ text: d.dictLabel, value: Number(d.dictValue) }));
+    },
+    deliveryStatusFilters() {
+      return (this.deliveryStatusOptions || []).map(d => ({ text: d.dictLabel, value: Number(d.dictValue) }));
+    },
+    deliveryPayStatusFilters() {
+      return (this.deliveryPayStatusOptions || []).map(d => ({ text: d.dictLabel, value: Number(d.dictValue) }));
+    },
+    isReturnGoodsFilters() {
+      return [{ text: '是', value: 1 }, { text: '否', value: 2 }];
     }
   },
   watch: {
@@ -1210,13 +1303,79 @@ export default {
       this.queryParams.pageNum = 1;
       this.getList();
     },
-   handleClickX(tab, event) {
-    if(tab.name=="10"){
-      this.queryParams.status=null;
-    }else{
-      this.queryParams.status=tab.name;
+    getFilters(prop, labelMap = null, sort = false) {
+      if (!this.orderList || this.orderList.length === 0) return [];
+      const seen = new Map();
+      this.orderList.forEach(item => {
+        const v = item[prop];
+        if (v === null || v === undefined || v === '') return;
+        if (!seen.has(v)) seen.set(v, true);
+      });
+      let keys = Array.from(seen.keys());
+      if (sort) { keys.sort((a, b) => Number(a) - Number(b)); }
+      return keys.map(v => ({ text: labelMap ? (labelMap[v] || String(v)) : String(v), value: v }));
+    },
+    handleFilterChange(filters) {
+      const timeRangeMap = {
+        createTime: ['sTime', 'eTime'],
+        payTime: ['paysTime', 'payeTime'],
+        deliveryTime: ['deliveryStartTime', 'deliveryEndTime'],
+        followTime: ['followTimeStart', 'followTimeEnd'],
+        depositReturnTime: ['depositReturnTimeStart', 'depositReturnTimeEnd'],
+        auditTime: ['auditTimeStart', 'auditTimeEnd'],
+        rejectReturnTime: ['rejectReturnTimeStart', 'rejectReturnTimeEnd'],
+        deliveryStatusUpdateTime: ['deliveryStatusUpdateTimeStart', 'deliveryStatusUpdateTimeEnd']
+      };
+      Object.keys(filters).forEach(key => {
+        const vals = filters[key] || [];
+        const last = vals.length > 0 ? vals[vals.length - 1] : null;
+        this.$set(this.columnFilters, key, last != null ? [last] : []);
+        if (timeRangeMap[key]) {
+          const [startField, endField] = timeRangeMap[key];
+          if (last != null && String(last).length >= 10) {
+            const day = String(last).substring(0, 10);
+            this.queryParams[startField] = day + ' 00:00:00';
+            this.queryParams[endField] = day + ' 23:59:59';
+          } else {
+            this.queryParams[startField] = null;
+            this.queryParams[endField] = null;
+          }
+        } else {
+          this.queryParams[key] = last;
+        }
+      });
+      this.handleQuery();
+    },
+    resetColumnFilters() {
+      Object.keys(this.columnFilters).forEach(key => {
+        this.columnFilters[key] = [];
+      });
+    },
+    getSummaries({ columns, data }) {
+      const sums = [];
+      const sumProps = ['payPrice', 'payMoney', 'totalPrice', 'collectionPrice', 'refundPrice', 'returnPrice'];
+      columns.forEach((column, index) => {
+        if (index === 0) { sums[index] = '总计'; return; }
+        if (sumProps.includes(column.property)) {
+          const total = data.reduce((sum, row) => {
+            const v = Number(row[column.property]);
+            return isNaN(v) ? sum : sum + v;
+          }, 0);
+          sums[index] = total.toFixed(2);
+        } else {
+          sums[index] = '';
+        }
+      });
+      return sums;
+    },
+   handleClickX(tab) {
+    if (tab.name === "all") {
+      this.queryParams.status = null;
+    } else {
+      this.queryParams.status = tab.name;
     }
-     this.handleQuery();
+    this.resetColumnFilters();
+    this.handleQuery();
    },
   changeTime(){
        if(this.createTime!=null){
@@ -1263,20 +1422,25 @@ export default {
     /** 重置按钮操作 */
     resetQuery() {
       this.resetForm("queryForm");
-       this.createTime=null;
+      this.createTime=null;
       this.queryParams.sTime=null;
       this.queryParams.eTime=null;
-       this.payTime=null;
+      this.payTime=null;
       this.queryParams.paysTime=null;
       this.queryParams.payeTime=null;
-      this.queryParams.deliveryImportTime = null;
-      this.queryParams.deliveryImportsTime = null;
-      this.queryParams.deliveryImporteTime = null;
-      this.queryParams.deliverySendTime = null;
-      this.queryParams.deliverySendsTime = null;
-      this.queryParams.deliverySendeTime = null;
-      this.queryParams.tuisTIme = null;
-      this.queryParams.tuieTIme = null;
+      this.queryParams.deliveryStartTime = null;
+      this.queryParams.deliveryEndTime = null;
+      this.queryParams.followTimeStart = null;
+      this.queryParams.followTimeEnd = null;
+      this.queryParams.depositReturnTimeStart = null;
+      this.queryParams.depositReturnTimeEnd = null;
+      this.queryParams.auditTimeStart = null;
+      this.queryParams.auditTimeEnd = null;
+      this.queryParams.rejectReturnTimeStart = null;
+      this.queryParams.rejectReturnTimeEnd = null;
+      this.queryParams.deliveryStatusUpdateTimeStart = null;
+      this.queryParams.deliveryStatusUpdateTimeEnd = null;
+      this.resetColumnFilters();
       this.handleQuery();
     },
     // 多选框选中数据