Bladeren bron

门店管理完成一半

Huanyi 1 maand geleden
bovenliggende
commit
c0df79ff7d

+ 2 - 2
.env.development

@@ -1,6 +1,6 @@
 # 页面标题
-VITE_APP_TITLE = 宠物系统管理后台
-VITE_APP_LOGO_TITLE = 宠物系统管理后台
+VITE_APP_TITLE = 管理后台
+VITE_APP_LOGO_TITLE = 管理后台
 
 # 开发环境配置
 VITE_APP_ENV = 'development'

+ 2 - 2
.env.production

@@ -1,6 +1,6 @@
 # 页面标题
-VITE_APP_TITLE = 宠物系统管理后台
-VITE_APP_LOGO_TITLE = 宠物系统管理后台
+VITE_APP_TITLE = 管理后台
+VITE_APP_LOGO_TITLE = 管理后台
 
 # 生产环境配置
 VITE_APP_ENV = 'production'

+ 1 - 0
src/api/system/menu/types.ts

@@ -23,6 +23,7 @@ export interface MenuQuery {
   keywords?: string;
   menuName?: string;
   status?: string;
+  platformId?: number;
 }
 
 /**

+ 63 - 0
src/api/system/store/index.ts

@@ -0,0 +1,63 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { StoreVO, StoreForm, StoreQuery } from '@/api/system/store/types';
+
+/**
+ * 查询门店管理列表
+ * @param query
+ * @returns {*}
+ */
+
+export const listStore = (query?: StoreQuery): AxiosPromise<StoreVO[]> => {
+  return request({
+    url: '/system/store/list',
+    method: 'get',
+    params: query
+  });
+};
+
+/**
+ * 查询门店管理详细
+ * @param id
+ */
+export const getStore = (id: string | number): AxiosPromise<StoreVO> => {
+  return request({
+    url: '/system/store/' + id,
+    method: 'get'
+  });
+};
+
+/**
+ * 新增门店管理
+ * @param data
+ */
+export const addStore = (data: StoreForm) => {
+  return request({
+    url: '/system/store',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 修改门店管理
+ * @param data
+ */
+export const updateStore = (data: StoreForm) => {
+  return request({
+    url: '/system/store',
+    method: 'put',
+    data: data
+  });
+};
+
+/**
+ * 删除门店管理
+ * @param id
+ */
+export const delStore = (id: string | number | Array<string | number>) => {
+  return request({
+    url: '/system/store/' + id,
+    method: 'delete'
+  });
+};

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

@@ -0,0 +1,199 @@
+export interface StoreVO {
+  /**
+   * 序号
+   */
+  id: string | number;
+
+  /**
+   * LOGO
+   */
+  logo: number;
+
+  /**
+   * LOGOUrl
+   */
+  logoUrl: string;
+  /**
+   * 营业执照
+   */
+  businessLicense: number;
+
+  /**
+   * 营业执照Url
+   */
+  businessLicenseUrl: string;
+  /**
+   * 门店名称
+   */
+  name: string;
+
+  /**
+   * 商户分类
+   */
+  tenantCatergories: number;
+
+  /**
+   * 开始营业时间
+   */
+  startBusinessTime: string;
+
+  /**
+   * 结束营业时间
+   */
+  endBusinessTime: string;
+
+  /**
+   * 联系人
+   */
+  contact: string;
+
+  /**
+   * 联系电话
+   */
+  contactNumber: string;
+
+  /**
+   * 有效期至
+   */
+  validity: string | number;
+
+  /**
+   * 归属站点
+   */
+  site: number;
+
+  /**
+   * 详细地址
+   */
+  detailAddress: string;
+
+  /**
+   * 状态
+   */
+  status: number;
+
+}
+
+export interface StoreForm extends BaseEntity {
+  /**
+   * 序号
+   */
+  id?: string | number;
+
+  /**
+   * LOGO
+   */
+  logo?: number;
+
+  /**
+   * 营业执照
+   */
+  businessLicense?: number;
+
+  /**
+   * 门店名称
+   */
+  name?: string;
+
+  /**
+   * 商户分类
+   */
+  tenantCatergories?: number;
+
+  /**
+   * 开始营业时间
+   */
+  startBusinessTime?: string;
+
+  /**
+   * 结束营业时间
+   */
+  endBusinessTime?: string;
+
+  /**
+   * 联系人
+   */
+  contact?: string;
+
+  /**
+   * 联系电话
+   */
+  contactNumber?: string;
+
+  /**
+   * 有效期至
+   */
+  validity?: string | number;
+
+  /**
+   * 归属站点
+   */
+  site?: number;
+
+  /**
+   * 详细地址
+   */
+  detailAddress?: string;
+
+  /**
+   * 状态
+   */
+  status?: number;
+
+  /**
+   * 经度
+   */
+  longitude?: number;
+
+  /**
+   * 维度
+   */
+  latitude?: number;
+
+}
+
+export interface StoreQuery extends PageQuery {
+
+  /**
+   * 营业执照
+   */
+  businessLicense?: number;
+
+  /**
+   * 门店名称
+   */
+  name?: string;
+
+  /**
+   * 商户分类
+   */
+  tenantCatergories?: number;
+
+  /**
+   * 联系人
+   */
+  contact?: string;
+
+  /**
+   * 有效期至
+   */
+  validity?: string | number;
+
+  /**
+   * 归属站点
+   */
+  site?: number;
+
+  /**
+   * 状态
+   */
+  status?: number;
+
+  /**
+   * 日期范围参数
+   */
+  params?: any;
+}
+
+
+

+ 1 - 0
src/api/tool/gen/types.ts

@@ -95,6 +95,7 @@ export interface DbTableVO {
   parentMenuName?: any;
   tree: boolean;
   crud: boolean;
+  platformId?: number;
 }
 
 export interface DbTableQuery extends PageQuery {

+ 1 - 1
src/router/index.ts

@@ -71,7 +71,7 @@ export const constantRoutes: RouteRecordRaw[] = [
         path: '/index',
         component: () => import('@/views/index.vue'),
         name: 'Index',
-        meta: { title: '首页', icon: 'dashboard', affix: true }
+        meta: { title: '工作台', icon: 'dashboard', affix: true }
       }
     ]
   },

+ 24 - 24
src/views/system/menu/index.vue

@@ -10,27 +10,27 @@
             <el-row :gutter="10" class="mb-[10px]">
               <el-col :span="1.5">
                 <el-button v-hasPermi="['system:menu:add']" type="primary" plain icon="Plus"
-                  @click="handleAdd()">新增</el-button>
+                           @click="handleAdd()">新增</el-button>
               </el-col>
               <el-col :span="1.5">
                 <el-button v-hasPermi="['system:menu:remove']" type="danger" plain icon="Delete"
-                  @click="handleCascadeDelete" :loading="deleteLoading">级联删除</el-button>
+                           @click="handleCascadeDelete" :loading="deleteLoading">级联删除</el-button>
               </el-col>
               <right-toolbar v-model:show-search="showSearch" @query-table="getList"></right-toolbar>
             </el-row>
 
             <transition :enter-active-class="proxy?.animate.searchAnimate.enter"
-              :leave-active-class="proxy?.animate.searchAnimate.leave">
+                        :leave-active-class="proxy?.animate.searchAnimate.leave">
               <div v-show="showSearch" class="mb-[10px]">
                 <el-form ref="queryFormRef" :model="queryParams" :inline="true">
                   <el-form-item label="菜单名称" prop="menuName">
                     <el-input v-model="queryParams.menuName" placeholder="请输入菜单名称" clearable
-                      @keyup.enter="handleQuery" />
+                              @keyup.enter="handleQuery" />
                   </el-form-item>
                   <el-form-item label="状态" prop="status">
                     <el-select v-model="queryParams.status" placeholder="菜单状态" clearable>
                       <el-option v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.label"
-                        :value="dict.value" />
+                                 :value="dict.value" />
                     </el-select>
                   </el-form-item>
                   <el-form-item>
@@ -42,8 +42,8 @@
             </transition>
 
             <el-table ref="menuTableRef" v-loading="loading" :data="menuList" row-key="menuId" border
-              :tree-props="{ children: 'children', hasChildren: 'hasChildren' }" :default-expand-all="false" lazy
-              :load="getChildrenList" :expand-change="expandMenuHandle">
+                      :tree-props="{ children: 'children', hasChildren: 'hasChildren' }" :default-expand-all="false" lazy
+                      :load="getChildrenList" :expand-change="expandMenuHandle">
               <el-table-column prop="menuName" label="菜单名称" :show-overflow-tooltip="true" width="160"></el-table-column>
               <el-table-column prop="icon" label="图标" align="center" width="100">
                 <template #default="scope">
@@ -67,15 +67,15 @@
                 <template #default="scope">
                   <el-tooltip content="修改" placement="top">
                     <el-button v-hasPermi="['system:menu:edit']" link type="primary" icon="Edit"
-                      @click="handleUpdate(scope.row)" />
+                               @click="handleUpdate(scope.row)" />
                   </el-tooltip>
                   <el-tooltip content="新增" placement="top">
                     <el-button v-hasPermi="['system:menu:add']" link type="primary" icon="Plus"
-                      @click="handleAdd(scope.row)" />
+                               @click="handleAdd(scope.row)" />
                   </el-tooltip>
                   <el-tooltip content="删除" placement="top">
                     <el-button v-hasPermi="['system:menu:remove']" link type="primary" icon="Delete"
-                      @click="handleDelete(scope.row)" />
+                               @click="handleDelete(scope.row)" />
                   </el-tooltip>
                 </template>
               </el-table-column>
@@ -88,27 +88,27 @@
             <el-row :gutter="10" class="mb-[10px]">
               <el-col :span="1.5">
                 <el-button v-hasPermi="['system:menu:add']" type="primary" plain icon="Plus"
-                  @click="handleAdd()">新增</el-button>
+                           @click="handleAdd()">新增</el-button>
               </el-col>
               <el-col :span="1.5">
                 <el-button v-hasPermi="['system:menu:remove']" type="danger" plain icon="Delete"
-                  @click="handleCascadeDelete" :loading="deleteLoading">级联删除</el-button>
+                           @click="handleCascadeDelete" :loading="deleteLoading">级联删除</el-button>
               </el-col>
               <right-toolbar v-model:show-search="showSearch" @query-table="getList"></right-toolbar>
             </el-row>
 
             <transition :enter-active-class="proxy?.animate.searchAnimate.enter"
-              :leave-active-class="proxy?.animate.searchAnimate.leave">
+                        :leave-active-class="proxy?.animate.searchAnimate.leave">
               <div v-show="showSearch" class="mb-[10px]">
                 <el-form ref="queryFormRef" :model="queryParams" :inline="true">
                   <el-form-item label="菜单名称" prop="menuName">
                     <el-input v-model="queryParams.menuName" placeholder="请输入菜单名称" clearable
-                      @keyup.enter="handleQuery" />
+                              @keyup.enter="handleQuery" />
                   </el-form-item>
                   <el-form-item label="状态" prop="status">
                     <el-select v-model="queryParams.status" placeholder="菜单状态" clearable>
                       <el-option v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.label"
-                        :value="dict.value" />
+                                 :value="dict.value" />
                     </el-select>
                   </el-form-item>
                   <el-form-item>
@@ -120,8 +120,8 @@
             </transition>
 
             <el-table ref="menuTableRef" v-loading="loading" :data="menuList" row-key="menuId" border
-              :tree-props="{ children: 'children', hasChildren: 'hasChildren' }" :default-expand-all="false" lazy
-              :load="getChildrenList" :expand-change="expandMenuHandle">
+                      :tree-props="{ children: 'children', hasChildren: 'hasChildren' }" :default-expand-all="false" lazy
+                      :load="getChildrenList" :expand-change="expandMenuHandle">
               <el-table-column prop="menuName" label="菜单名称" :show-overflow-tooltip="true" width="160"></el-table-column>
               <el-table-column prop="icon" label="图标" align="center" width="100">
                 <template #default="scope">
@@ -145,15 +145,15 @@
                 <template #default="scope">
                   <el-tooltip content="修改" placement="top">
                     <el-button v-hasPermi="['system:menu:edit']" link type="primary" icon="Edit"
-                      @click="handleUpdate(scope.row)" />
+                               @click="handleUpdate(scope.row)" />
                   </el-tooltip>
                   <el-tooltip content="新增" placement="top">
                     <el-button v-hasPermi="['system:menu:add']" link type="primary" icon="Plus"
-                      @click="handleAdd(scope.row)" />
+                               @click="handleAdd(scope.row)" />
                   </el-tooltip>
                   <el-tooltip content="删除" placement="top">
                     <el-button v-hasPermi="['system:menu:remove']" link type="primary" icon="Delete"
-                      @click="handleDelete(scope.row)" />
+                               @click="handleDelete(scope.row)" />
                   </el-tooltip>
                 </template>
               </el-table-column>
@@ -169,8 +169,8 @@
           <el-col :span="24">
             <el-form-item label="上级菜单">
               <el-tree-select v-model="form.parentId" :data="menuOptions"
-                :props="{ value: 'menuId', label: 'menuName', children: 'children' } as any" value-key="menuId"
-                placeholder="选择上级菜单" check-strictly />
+                              :props="{ value: 'menuId', label: 'menuName', children: 'children' } as any" value-key="menuId"
+                              placeholder="选择上级菜单" check-strictly />
             </el-form-item>
           </el-col>
           <el-col :span="24">
@@ -356,8 +356,8 @@
 
     <el-dialog v-model="deleteDialog.visible" :title="deleteDialog.title" destroy-on-close append-to-bod width="750px">
       <el-tree ref="menuTreeRef" class="tree-border" :data="menuOptions" show-checkbox node-key="menuId"
-        :check-strictly="false" empty-text="加载中,请稍候" :default-expanded-keys="[0]"
-        :props="{ value: 'menuId', label: 'menuName', children: 'children' } as any" />
+               :check-strictly="false" empty-text="加载中,请稍候" :default-expanded-keys="[0]"
+               :props="{ value: 'menuId', label: 'menuName', children: 'children' } as any" />
       <template #footer>
         <div class="dialog-footer">
           <el-button type="primary" @click="submitDeleteForm" :loading="deleteLoading">确 定</el-button>

+ 345 - 0
src/views/system/store/index.vue

@@ -0,0 +1,345 @@
+<template>
+  <div class="p-2">
+    <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
+      <div v-show="showSearch" class="mb-[10px]">
+        <el-card shadow="hover">
+          <el-form ref="queryFormRef" :model="queryParams" :inline="true">
+            <el-form-item label="门店名称" prop="name">
+              <el-input v-model="queryParams.name" placeholder="请输入门店名称" clearable @keyup.enter="handleQuery" />
+            </el-form-item>
+            <el-form-item label="联系人" prop="contact">
+              <el-input v-model="queryParams.contact" placeholder="请输入联系人" clearable @keyup.enter="handleQuery" />
+            </el-form-item>
+            <el-form-item label="有效期至" prop="validity">
+              <el-date-picker clearable
+                v-model="queryParams.validity"
+                type="date"
+                value-format="YYYY-MM-DD"
+                placeholder="请选择有效期至"
+              />
+            </el-form-item>
+            <el-form-item>
+              <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
+              <el-button icon="Refresh" @click="resetQuery">重置</el-button>
+            </el-form-item>
+          </el-form>
+        </el-card>
+      </div>
+    </transition>
+
+    <el-card shadow="never">
+      <template #header>
+        <el-row :gutter="10" class="mb8">
+          <el-col :span="1.5">
+            <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['system:store:add']">新增</el-button>
+          </el-col>
+          <el-col :span="1.5">
+            <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['system:store:edit']">修改</el-button>
+          </el-col>
+          <el-col :span="1.5">
+            <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['system:store:remove']">删除</el-button>
+          </el-col>
+          <el-col :span="1.5">
+            <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['system:store:export']">导出</el-button>
+          </el-col>
+          <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
+        </el-row>
+      </template>
+
+      <el-table v-loading="loading" border :data="storeList" @selection-change="handleSelectionChange">
+        <el-table-column type="selection" width="55" align="center" />
+        <el-table-column label="序号" align="center" prop="id" v-if="true" />
+        <el-table-column label="LOGO" align="center" prop="logoUrl" width="100">
+          <template #default="scope">
+            <image-preview :src="scope.row.logoUrl" :width="50" :height="50"/>
+          </template>
+        </el-table-column>
+        <el-table-column label="营业执照" align="center" prop="businessLicenseUrl" width="100">
+          <template #default="scope">
+            <image-preview :src="scope.row.businessLicenseUrl" :width="50" :height="50"/>
+          </template>
+        </el-table-column>
+        <el-table-column label="门店名称" align="center" prop="name" />
+        <el-table-column label="商户分类" align="center" prop="tenantCatergories" />
+        <el-table-column label="开始营业时间" align="center" prop="startBusinessTime" width="180">
+          <template #default="scope">
+            <span>{{ parseTime(scope.row.startBusinessTime, '{y}-{m}-{d}') }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="结束营业时间" align="center" prop="endBusinessTime" width="180">
+          <template #default="scope">
+            <span>{{ parseTime(scope.row.endBusinessTime, '{y}-{m}-{d}') }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="联系人" align="center" prop="contact" />
+        <el-table-column label="联系电话" align="center" prop="contactNumber" />
+        <el-table-column label="有效期至" align="center" prop="validity" width="180">
+          <template #default="scope">
+            <span>{{ parseTime(scope.row.validity, '{y}-{m}-{d}') }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="归属站点" align="center" prop="site" />
+        <el-table-column label="详细地址" align="center" prop="detailAddress" />
+        <el-table-column label="状态" align="center" prop="status" />
+        <el-table-column label="操作" align="center" fixed="right" class-name="small-padding fixed-width">
+          <template #default="scope">
+            <el-tooltip content="修改" placement="top">
+              <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:store:edit']"></el-button>
+            </el-tooltip>
+            <el-tooltip content="删除" placement="top">
+              <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:store:remove']"></el-button>
+            </el-tooltip>
+          </template>
+        </el-table-column>
+      </el-table>
+
+      <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
+    </el-card>
+    <!-- 添加或修改门店管理对话框 -->
+    <el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body>
+      <el-form ref="storeFormRef" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="LOGO" prop="logo">
+          <image-upload v-model="form.logo"/>
+        </el-form-item>
+        <el-form-item label="营业执照" prop="businessLicense">
+          <image-upload v-model="form.businessLicense"/>
+        </el-form-item>
+        <el-form-item label="门店名称" prop="name">
+          <el-input v-model="form.name" placeholder="请输入门店名称" />
+        </el-form-item>
+        <el-form-item label="开始营业时间" prop="startBusinessTime">
+          <el-date-picker clearable
+            v-model="form.startBusinessTime"
+            type="datetime"
+            value-format="YYYY-MM-DD HH:mm:ss"
+            placeholder="请选择开始营业时间">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="结束营业时间" prop="endBusinessTime">
+          <el-date-picker clearable
+            v-model="form.endBusinessTime"
+            type="datetime"
+            value-format="YYYY-MM-DD HH:mm:ss"
+            placeholder="请选择结束营业时间">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="联系人" prop="contact">
+          <el-input v-model="form.contact" placeholder="请输入联系人" />
+        </el-form-item>
+        <el-form-item label="联系电话" prop="contactNumber">
+          <el-input v-model="form.contactNumber" placeholder="请输入联系电话" />
+        </el-form-item>
+        <el-form-item label="有效期至" prop="validity">
+          <el-date-picker clearable
+            v-model="form.validity"
+            type="datetime"
+            value-format="YYYY-MM-DD HH:mm:ss"
+            placeholder="请选择有效期至">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="详细地址" prop="detailAddress">
+          <el-input v-model="form.detailAddress" placeholder="请输入详细地址" />
+        </el-form-item>
+        <el-form-item label="经度" prop="longitude">
+          <el-input v-model="form.longitude" placeholder="请输入经度" />
+        </el-form-item>
+        <el-form-item label="维度" prop="latitude">
+          <el-input v-model="form.latitude" placeholder="请输入维度" />
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button :loading="buttonLoading" type="primary" @click="submitForm">确 定</el-button>
+          <el-button @click="cancel">取 消</el-button>
+        </div>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup name="Store" lang="ts">
+import { listStore, getStore, delStore, addStore, updateStore } from '@/api/system/store';
+import { StoreVO, StoreQuery, StoreForm } from '@/api/system/store/types';
+
+const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+
+const storeList = ref<StoreVO[]>([]);
+const buttonLoading = ref(false);
+const loading = ref(true);
+const showSearch = ref(true);
+const ids = ref<Array<string | number>>([]);
+const single = ref(true);
+const multiple = ref(true);
+const total = ref(0);
+
+const queryFormRef = ref<ElFormInstance>();
+const storeFormRef = ref<ElFormInstance>();
+
+const dialog = reactive<DialogOption>({
+  visible: false,
+  title: ''
+});
+
+const initFormData: StoreForm = {
+  id: undefined,
+  logo: undefined,
+  businessLicense: undefined,
+  name: undefined,
+  tenantCatergories: undefined,
+  startBusinessTime: undefined,
+  endBusinessTime: undefined,
+  contact: undefined,
+  contactNumber: undefined,
+  validity: undefined,
+  site: undefined,
+  detailAddress: undefined,
+  status: undefined,
+  longitude: undefined,
+  latitude: undefined,
+  tenantId: undefined,
+}
+const data = reactive<PageData<StoreForm, StoreQuery>>({
+  form: {...initFormData},
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+    businessLicense: undefined,
+    name: undefined,
+    tenantCatergories: undefined,
+    contact: undefined,
+    validity: undefined,
+    site: undefined,
+    status: undefined,
+    params: {
+    }
+  },
+  rules: {
+    id: [
+      { required: true, message: "序号不能为空", trigger: "blur" }
+    ],
+    businessLicense: [
+      { required: true, message: "营业执照不能为空", trigger: "blur" }
+    ],
+    name: [
+      { required: true, message: "门店名称不能为空", trigger: "blur" }
+    ],
+    tenantCatergories: [
+      { required: true, message: "商户分类不能为空", trigger: "change" }
+    ],
+    startBusinessTime: [
+      { required: true, message: "开始营业时间不能为空", trigger: "blur" }
+    ],
+    endBusinessTime: [
+      { required: true, message: "结束营业时间不能为空", trigger: "blur" }
+    ],
+    contact: [
+      { required: true, message: "联系人不能为空", trigger: "blur" }
+    ],
+    contactNumber: [
+      { required: true, message: "联系电话不能为空", trigger: "blur" }
+    ],
+    validity: [
+      { required: true, message: "有效期至不能为空", trigger: "blur" }
+    ],
+    tenantId: [
+      { required: true, message: "租户编号不能为空", trigger: "change" }
+    ],
+  }
+});
+
+const { queryParams, form, rules } = toRefs(data);
+
+/** 查询门店管理列表 */
+const getList = async () => {
+  loading.value = true;
+  const res = await listStore(queryParams.value);
+  storeList.value = res.rows;
+  total.value = res.total;
+  loading.value = false;
+}
+
+/** 取消按钮 */
+const cancel = () => {
+  reset();
+  dialog.visible = false;
+}
+
+/** 表单重置 */
+const reset = () => {
+  form.value = {...initFormData};
+  storeFormRef.value?.resetFields();
+}
+
+/** 搜索按钮操作 */
+const handleQuery = () => {
+  queryParams.value.pageNum = 1;
+  getList();
+}
+
+/** 重置按钮操作 */
+const resetQuery = () => {
+  queryFormRef.value?.resetFields();
+  handleQuery();
+}
+
+/** 多选框选中数据 */
+const handleSelectionChange = (selection: StoreVO[]) => {
+  ids.value = selection.map(item => item.id);
+  single.value = selection.length != 1;
+  multiple.value = !selection.length;
+}
+
+/** 新增按钮操作 */
+const handleAdd = () => {
+  reset();
+  dialog.visible = true;
+  dialog.title = "添加门店管理";
+}
+
+/** 修改按钮操作 */
+const handleUpdate = async (row?: StoreVO) => {
+  reset();
+  const _id = row?.id || ids.value[0]
+  const res = await getStore(_id);
+  Object.assign(form.value, res.data);
+  dialog.visible = true;
+  dialog.title = "修改门店管理";
+}
+
+/** 提交按钮 */
+const submitForm = () => {
+  storeFormRef.value?.validate(async (valid: boolean) => {
+    if (valid) {
+      buttonLoading.value = true;
+      if (form.value.id) {
+        await updateStore(form.value).finally(() =>  buttonLoading.value = false);
+      } else {
+        await addStore(form.value).finally(() =>  buttonLoading.value = false);
+      }
+      proxy?.$modal.msgSuccess("操作成功");
+      dialog.visible = false;
+      await getList();
+    }
+  });
+}
+
+/** 删除按钮操作 */
+const handleDelete = async (row?: StoreVO) => {
+  const _ids = row?.id || ids.value;
+  await proxy?.$modal.confirm('是否确认删除门店管理编号为"' + _ids + '"的数据项?').finally(() => loading.value = false);
+  await delStore(_ids);
+  proxy?.$modal.msgSuccess("删除成功");
+  await getList();
+}
+
+/** 导出按钮操作 */
+const handleExport = () => {
+  proxy?.download('system/store/export', {
+    ...queryParams.value
+  }, `store_${new Date().getTime()}.xlsx`)
+}
+
+onMounted(() => {
+  getList();
+});
+</script>

+ 22 - 36
src/views/system/tenantCategories/index.vue

@@ -1,6 +1,7 @@
 <template>
   <div class="p-2">
-    <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
+    <transition :enter-active-class="proxy?.animate.searchAnimate.enter"
+      :leave-active-class="proxy?.animate.searchAnimate.leave">
       <div v-show="showSearch" class="mb-[10px]">
         <el-card shadow="hover">
           <el-form ref="queryFormRef" :model="queryParams" :inline="true">
@@ -8,26 +9,14 @@
               <el-input v-model="queryParams.name" placeholder="请输入分类名称" clearable @keyup.enter="handleQuery" />
             </el-form-item>
             <el-form-item label="创建时间" style="width: 308px">
-              <el-date-picker
-                v-model="dateRangeCreateTime"
-                value-format="YYYY-MM-DD HH:mm:ss"
-                type="daterange"
-                range-separator="-"
-                start-placeholder="开始日期"
-                end-placeholder="结束日期"
-                :default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]"
-              />
+              <el-date-picker v-model="dateRangeCreateTime" value-format="YYYY-MM-DD HH:mm:ss" type="daterange"
+                range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期"
+                :default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]" />
             </el-form-item>
             <el-form-item label="更新时间" style="width: 308px">
-              <el-date-picker
-                v-model="dateRangeUpdateTime"
-                value-format="YYYY-MM-DD HH:mm:ss"
-                type="daterange"
-                range-separator="-"
-                start-placeholder="开始日期"
-                end-placeholder="结束日期"
-                :default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]"
-              />
+              <el-date-picker v-model="dateRangeUpdateTime" value-format="YYYY-MM-DD HH:mm:ss" type="daterange"
+                range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期"
+                :default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]" />
             </el-form-item>
             <el-form-item>
               <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
@@ -42,20 +31,20 @@
       <template #header>
         <el-row :gutter="10" class="mb8">
           <el-col :span="1.5">
-            <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['system:tenantCategories:add']">新增</el-button>
+            <el-button type="primary" plain icon="Plus" @click="handleAdd"
+              v-hasPermi="['system:tenantCategories:add']">新增</el-button>
           </el-col>
           <el-col :span="1.5">
-            <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['system:tenantCategories:edit']"
-              >修改</el-button
-            >
+            <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()"
+              v-hasPermi="['system:tenantCategories:edit']">修改</el-button>
           </el-col>
           <el-col :span="1.5">
-            <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['system:tenantCategories:remove']"
-              >删除</el-button
-            >
+            <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()"
+              v-hasPermi="['system:tenantCategories:remove']">删除</el-button>
           </el-col>
           <el-col :span="1.5">
-            <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['system:tenantCategories:export']">导出</el-button>
+            <el-button type="warning" plain icon="Download" @click="handleExport"
+              v-hasPermi="['system:tenantCategories:export']">导出</el-button>
           </el-col>
           <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
         </el-row>
@@ -93,22 +82,19 @@
         <el-table-column label="操作" align="center" fixed="right" class-name="small-padding fixed-width">
           <template #default="scope">
             <el-tooltip content="修改" placement="top">
-              <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:tenantCategories:edit']"></el-button>
+              <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)"
+                v-hasPermi="['system:tenantCategories:edit']"></el-button>
             </el-tooltip>
             <el-tooltip content="删除" placement="top">
-              <el-button
-                link
-                type="primary"
-                icon="Delete"
-                @click="handleDelete(scope.row)"
-                v-hasPermi="['system:tenantCategories:remove']"
-              ></el-button>
+              <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)"
+                v-hasPermi="['system:tenantCategories:remove']"></el-button>
             </el-tooltip>
           </template>
         </el-table-column>
       </el-table>
 
-      <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
+      <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum"
+        v-model:limit="queryParams.pageSize" @pagination="getList" />
     </el-card>
     <!-- 添加或修改商户分类对话框 -->
     <el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body>

+ 4 - 2
src/views/tool/gen/editTable.vue

@@ -90,7 +90,8 @@
           <el-table-column label="字典类型" min-width="12%">
             <template #default="scope">
               <el-select v-model="scope.row.dictType" clearable filterable placeholder="请选择" value-on-clear="">
-                <el-option v-for="dict in dictOptions" :key="dict.dictType" :label="dict.dictName" :value="dict.dictType">
+                <el-option v-for="dict in dictOptions" :key="dict.dictType" :label="dict.dictName"
+                  :value="dict.dictType">
                   <span style="float: left">{{ dict.dictName }}</span>
                   <span style="float: right; color: #8492a6; font-size: 13px">{{ dict.dictType }}</span>
                 </el-option>
@@ -148,7 +149,8 @@ const submitForm = () => {
         treeCode: info.value?.treeCode,
         treeName: info.value.treeName,
         treeParentCode: info.value.treeParentCode,
-        parentMenuId: info.value.parentMenuId
+        parentMenuId: info.value.parentMenuId,
+        platformId: info.value.platformId
       };
       const response = await updateGenTable(genTable);
       proxy?.$modal.msgSuccess(response.msg);

+ 52 - 4
src/views/tool/gen/genInfoForm.vue

@@ -60,6 +60,20 @@
       </el-col>
 
       <el-col :span="12">
+        <el-form-item>
+          <template #label>
+            所属平台
+            <el-tooltip content="选择功能所属的平台" placement="top">
+              <el-icon><question-filled /></el-icon>
+            </el-tooltip>
+          </template>
+          <el-select v-model="infoForm.platformId" placeholder="请选择平台" @change="handlePlatformChange">
+            <el-option v-for="platform in platformOptions" :key="platform.id" :label="platform.label" :value="platform.id" />
+          </el-select>
+        </el-form-item>
+      </el-col>
+
+      <el-col v-if="infoForm.platformId !== undefined && infoForm.platformId !== null" :span="12">
         <el-form-item>
           <template #label>
             上级菜单
@@ -223,6 +237,8 @@
 
 <script setup lang="ts">
 import { listMenu } from '@/api/system/menu';
+import { listPlatform } from '@/api/system/platform';
+import { PlatformVO } from '@/api/system/platform/types';
 import { propTypes } from '@/utils/propTypes';
 
 interface MenuOptionsType {
@@ -230,17 +246,28 @@ interface MenuOptionsType {
   menuName: string;
   children?: MenuOptionsType[];
 }
+
 const { proxy } = getCurrentInstance();
 
 const subColumns = ref<any>([]);
 const menuOptions = ref<Array<MenuOptionsType>>([]);
+const platformOptions = ref<Array<PlatformVO>>([]);
 
 const props = defineProps({
   info: propTypes.any.isRequired,
   tables: propTypes.any.isRequired
 });
 
-const infoForm = computed(() => props.info);
+const infoForm = computed(() => {
+  /**
+   * 由于获取数据存在延迟,则只能这么书写
+   * @Author Huanyi
+   */
+  if (props.info.platformId !== undefined && props.info.platformId !== null) {
+    getMenuTreeselect(props.info.platformId);
+  }
+  return props.info;
+});
 
 const table = computed(() => props.tables);
 
@@ -272,8 +299,9 @@ const setSubTableColumns = (value: string) => {
 };
 
 /** 查询菜单下拉树结构 */
-const getMenuTreeselect = async () => {
-  const res = await listMenu();
+const getMenuTreeselect = async (platformId?: number) => {
+  const params = platformId !== undefined ? { platformId } : undefined;
+  const res = await listMenu(params);
   const data = proxy?.handleTree<MenuOptionsType>(res.data, 'menuId');
 
   if (data) {
@@ -281,6 +309,22 @@ const getMenuTreeselect = async () => {
   }
 };
 
+/** 平台选择变化 */
+const handlePlatformChange = () => {
+  // 清空上级菜单选择
+  infoForm.value.parentMenuId = undefined;
+  // 重新获取菜单列表
+  getMenuTreeselect(infoForm.value.platformId);
+};
+
+/** 查询平台列表 */
+const getPlatformList = async () => {
+  const res = await listPlatform();
+  if (res.code === 200) {
+    platformOptions.value = res.data;
+  }
+};
+
 watch(
   () => props.info.subTableName,
   (val) => {
@@ -289,6 +333,10 @@ watch(
 );
 
 onMounted(() => {
-  getMenuTreeselect();
+  getPlatformList();
+  // 如果已有平台ID,则获取对应的菜单列表
+  if (infoForm.value.platformId !== undefined && infoForm.value.platformId !== null) {
+    getMenuTreeselect(infoForm.value.platformId);
+  }
 });
 </script>