Huanyi пре 1 недеља
родитељ
комит
bfd9cd7b6e

+ 1 - 0
src/api/archieves/customer/types.ts

@@ -63,6 +63,7 @@ export interface CustomerOnOrderVO {
 
 export interface CustomerOnOrderQuery extends PageQuery {
   content?: string;
+  stationId?: number;
 }
 
 export interface UsrCustomerRemarkForm {

+ 2 - 0
src/api/system/store/types.ts

@@ -295,6 +295,8 @@ export interface StoreOrderVO {
   id: number;
   name: string;
   services: number[];
+  site: number;
+  tenantId: string;
 }
 
 export interface StoreRenewReq {

+ 9 - 3
src/components/PageSelect/index.vue

@@ -1,7 +1,7 @@
 <template>
   <div class="page-select">
-    <el-select v-bind="{ ...$attrs, value: undefined }" v-model="localValue" :filterable="true" :remote="false"
-      @visible-change="handleVisibleChange" @change="handleInput">
+    <el-select v-bind="{ ...$attrs, value: undefined }" v-model="localValue" :filterable="true" :remote="true"
+      :remote-method="onFilterMethod" @visible-change="handleVisibleChange" @change="handleInput">
       <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value" />
       <!-- 分页组件 -->
       <div v-if="total > 0" class="brand-pagination">
@@ -48,7 +48,7 @@ const props = defineProps({
   }
 });
 
-const emit = defineEmits(['update:modelValue', 'page-change', 'visible-change']);
+const emit = defineEmits(['update:modelValue', 'page-change', 'visible-change', 'filter-method']);
 
 const localValue = ref(props.modelValue);
 const currentPage = ref(1);
@@ -107,6 +107,12 @@ const handlePageChange = (page: number) => {
   currentPage.value = page;
   emit('page-change', page);
 };
+
+// 处理筛选输入变化,重置到第1页
+const onFilterMethod = (query: string) => {
+  currentPage.value = 1;
+  emit('filter-method', query);
+};
 </script>
 
 <style scoped>

+ 1 - 1
src/views/merchant/storeManagement/index.vue

@@ -977,7 +977,7 @@ watch(
 /** 获取服务项目名称 */
 const getServiceName = (serviceId: number): string => {
   const service = serviceList.value.find(item => item.id === serviceId);
-  return service ? service.name : String(serviceId);
+  return service ? service.name : '未知服务';
 };
 
 /** 根据站点ID获取区域全称(向上遍历树形关系) */

+ 40 - 5
src/views/order/management/index.vue

@@ -12,6 +12,9 @@
             </el-radio-group>
             <el-input v-model="filters.content" placeholder="订单号/商户/宠主/手机号" class="search-input" prefix-icon="Search"
               clearable @clear="handleSearch" @keyup.enter="handleSearch" />
+            <el-cascader v-model="filterCascaderValue" :options="areaTreeOptions"
+              :props="{ checkStrictly: true, value: 'id', label: 'name' }" placeholder="所属站点" clearable
+              style="width: 350px; margin-left: 10px;" @change="handleFilterCascaderChange" />
             <el-button type="primary" icon="Search" @click="handleSearch">查询</el-button>
             <el-button v-hasPermi="['order:management:export']" type="success" icon="Download"
               @click="handleExport">导出Excel</el-button>
@@ -203,8 +206,8 @@
   </div>
 </template>
 
-<script setup>
-import { ref, reactive, onMounted, onUnmounted, nextTick, getCurrentInstance, toRefs } from 'vue';
+<script setup lang="ts">
+import { ref, reactive, computed, onMounted, onUnmounted, nextTick, getCurrentInstance, toRefs } from 'vue';
 import { ElMessage, ElMessageBox } from 'element-plus';
 import OrderDetailDrawer from './components/OrderDetailDrawer.vue';
 import DispatchDialog from './components/DispatchDialog.vue';
@@ -230,7 +233,8 @@ const loading = ref(false);
 const filters = reactive({
   service: '',
   status: '',
-  content: ''
+  content: '',
+  site: undefined
 });
 
 const pagination = reactive({
@@ -243,6 +247,20 @@ const tableData = ref([]);
 const serviceOptions = ref([]);
 const areaStationList = ref([]);
 const areaStationMap = ref({});
+const areaTreeOptions = computed(() => {
+  const buildTree = (data: any[], parentId: any): any[] => {
+    return data
+      .filter(item => String(item.parentId) === String(parentId))
+      .map(item => {
+        const children = buildTree(data, item.id);
+        const res: any = { id: item.id, name: item.name };
+        if (children && children.length > 0) res.children = children;
+        return res;
+      });
+  };
+  return buildTree(areaStationList.value, 0);
+});
+const filterCascaderValue = ref < any[] > ([]);
 const storeMap = ref({});
 
 let timer = null;
@@ -258,7 +276,8 @@ onMounted(() => {
       pageSize: pagination.size,
       service: filters.service !== '' ? filters.service : undefined,
       status: filters.status !== '' ? Number(filters.status) : undefined,
-      content: filters.content || undefined
+      content: filters.content || undefined,
+      site: filters.site || undefined
     }).then((res) => {
       tableData.value = res.rows || [];
       pagination.total = res.total || 0;
@@ -323,6 +342,21 @@ const handleStatusTabChange = async () => {
   handleSearch();
 };
 
+const handleFilterCascaderChange = (val: any[]) => {
+  if (val && val.length > 0) {
+    const lastId = val[val.length - 1];
+    const node = areaStationList.value.find((item: any) => item.id === lastId);
+    if (node && node.type === 2) {
+      filters.site = lastId;
+    } else {
+      filters.site = undefined;
+    }
+  } else {
+    filters.site = undefined;
+  }
+  handleSearch();
+};
+
 const handleSearch = () => {
   loading.value = true;
   listSubOrder({
@@ -330,7 +364,8 @@ const handleSearch = () => {
     pageSize: pagination.size,
     service: filters.service !== '' ? filters.service : undefined,
     status: filters.status !== '' ? Number(filters.status) : undefined,
-    content: filters.content || undefined
+    content: filters.content || undefined,
+    site: filters.site || undefined
   })
     .then((res) => {
       tableData.value = res.rows || [];

+ 31 - 4
src/views/order/purchase/index.vue

@@ -20,7 +20,8 @@
                     </template>
                     <PageSelect v-model="form.merchantId" placeholder="请选择商户门店" size="large" style="width: 100%"
                       :options="merchantOptions" :total="storeTotal" :page-size="5" @page-change="handleStorePageChange"
-                      @update:modelValue="handleStoreChange" />
+                      @update:modelValue="handleStoreChange" @filter-method="handleStoreFilter"
+                      @visible-change="handleStoreVisible" />
                   </el-form-item>
                 </el-col>
                 <el-col :span="12">
@@ -171,7 +172,7 @@
               <!-- 接送预览 -->
               <div v-if="form.type === 'transport'" class="preview-detail">
                 <div>{{ form.transport.subType === 'round' ? '往返接送' : form.transport.subType === 'pick' ? '单程接' : '单程送'
-                  }}
+                }}
                 </div>
                 <div class="minor">接: {{ form.transport.pickTime ? formatTime(form.transport.pickTime) : '未选时间' }}</div>
                 <div class="minor" v-if="form.transport.subType !== 'pick'">
@@ -215,7 +216,7 @@ import { createOrder } from '@/api/order/order';
 // --- State ---
 const userOptions = ref([]);
 const userTotal = ref(0);
-const userQuery = reactive({ pageNum: 1, pageSize: 5, content: '' });
+const userQuery = reactive({ pageNum: 1, pageSize: 5, content: '', stationId: undefined });
 const userLoading = ref(false);
 
 const serviceList = [
@@ -237,7 +238,7 @@ const currentPets = ref([]);
 const stores = ref([]);
 const storeTotal = ref(0);
 const allServices = ref([]);
-const storeQuery = reactive({ pageNum: 1, pageSize: 5 });
+const storeQuery = reactive({ pageNum: 1, pageSize: 5, name: '' });
 
 const form = reactive({
   merchantId: '',
@@ -354,7 +355,28 @@ const handleStorePageChange = (page) => {
   fetchStores();
 };
 
+const handleStoreFilter = (query) => {
+  storeQuery.name = query || '';
+  storeQuery.pageNum = 1;
+  fetchStores();
+};
+
+const handleStoreVisible = (visible) => {
+  if (visible) {
+    storeQuery.name = '';
+    storeQuery.pageNum = 1;
+    fetchStores();
+  }
+};
+
 const handleStoreChange = (val) => {
+  // 切换门店时清空已选用户和宠物
+  form.userId = '';
+  form.petId = '';
+  currentPets.value = [];
+  userOptions.value = [];
+  userTotal.value = 0;
+
   const store = stores.value.find((s) => s.id === val);
   if (store && store.services) {
     if (!store.services.includes(form.serviceId)) {
@@ -518,6 +540,11 @@ const fetchUsers = () => {
     userTotal.value = 0;
     return;
   }
+
+  // 关联当前选中门店的站点ID,仅显示同站点用户
+  const store = stores.value.find((s) => s.id === form.merchantId);
+  userQuery.stationId = store ? store.site : undefined;
+
   listCustomerOnOrder(userQuery).then((res) => {
     userOptions.value = res.rows || [];
     userTotal.value = res.total || 0;