瀏覽代碼

Merge remote-tracking branch 'origin/master'

tjxt 2 月之前
父節點
當前提交
a0d2e60c8d

+ 74 - 0
src/api/company/comCurrency/index.ts

@@ -0,0 +1,74 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { ComCurrencyVO, ComCurrencyForm, ComCurrencyQuery } from '@/api/company/comCurrency/types';
+
+/**
+ * 查询交易币别配置列表
+ * @param query
+ * @returns {*}
+ */
+
+export const listComCurrency = (query?: ComCurrencyQuery): AxiosPromise<ComCurrencyVO[]> => {
+  return request({
+    url: '/system/comCurrency/list',
+    method: 'get',
+    params: query
+  });
+};
+
+/**
+ * 查询交易币别配置详细
+ * @param id
+ */
+export const getComCurrency = (id: string | number): AxiosPromise<ComCurrencyVO> => {
+  return request({
+    url: '/system/comCurrency/' + id,
+    method: 'get'
+  });
+};
+
+/**
+ * 新增交易币别配置
+ * @param data
+ */
+export const addComCurrency = (data: ComCurrencyForm) => {
+  return request({
+    url: '/system/comCurrency',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 修改交易币别配置
+ * @param data
+ */
+export const updateComCurrency = (data: ComCurrencyForm) => {
+  return request({
+    url: '/system/comCurrency',
+    method: 'put',
+    data: data
+  });
+};
+
+/**
+ * 删除交易币别配置
+ * @param id
+ */
+export const delComCurrency = (id: string | number | Array<string | number>) => {
+  return request({
+    url: '/system/comCurrency/' + id,
+    method: 'delete'
+  });
+};
+export function changeStatus(id: string | number, isShow: string) {
+  const data = {
+    id,
+    isShow
+  };
+  return request({
+    url: '/system/comCurrency/changeStatus',
+    method: 'put',
+    data: data
+  });
+}

+ 105 - 0
src/api/company/comCurrency/types.ts

@@ -0,0 +1,105 @@
+export interface ComCurrencyVO {
+  /**
+   * 主键ID
+   */
+  id: string | number;
+
+  /**
+   * 货币编码
+   */
+  currencyCode: string;
+
+  /**
+   * 货币名称
+   */
+  currencyName: string;
+
+  /**
+   * 是否显示(0-显示,1-不显示)
+   */
+  isShow: string;
+
+  /**
+   * 数据来源
+   */
+  dataSource: string;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status: string;
+
+  /**
+   * 备注
+   */
+  remark: string;
+}
+
+export interface ComCurrencyForm extends BaseEntity {
+  /**
+   * 主键ID
+   */
+  id?: string | number;
+
+  /**
+   * 货币编码
+   */
+  currencyCode?: string;
+
+  /**
+   * 货币名称
+   */
+  currencyName?: string;
+
+  /**
+   * 是否显示(0-显示,1-不显示)
+   */
+  isShow?: string;
+
+  /**
+   * 数据来源
+   */
+  dataSource?: string;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status?: string;
+
+  /**
+   * 备注
+   */
+  remark?: string;
+}
+
+export interface ComCurrencyQuery extends PageQuery {
+  /**
+   * 货币编码
+   */
+  currencyCode?: string;
+
+  /**
+   * 货币名称
+   */
+  currencyName?: string;
+
+  /**
+   * 是否显示(0-显示,1-不显示)
+   */
+  isShow?: string;
+
+  /**
+   * 数据来源
+   */
+  dataSource?: string;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status?: string;
+
+  /**
+   * 日期范围参数
+   */
+  params?: any;
+}

+ 74 - 0
src/api/company/revenueExpense/index.ts

@@ -0,0 +1,74 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { RevenueExpenseVO, RevenueExpenseForm, RevenueExpenseQuery } from '@/api/company/revenueExpense/types';
+
+/**
+ * 查询收入费用设定列表
+ * @param query
+ * @returns {*}
+ */
+
+export const listRevenueExpense = (query?: RevenueExpenseQuery): AxiosPromise<RevenueExpenseVO[]> => {
+  return request({
+    url: '/system/revenueExpense/list',
+    method: 'get',
+    params: query
+  });
+};
+
+/**
+ * 查询收入费用设定详细
+ * @param id
+ */
+export const getRevenueExpense = (id: string | number): AxiosPromise<RevenueExpenseVO> => {
+  return request({
+    url: '/system/revenueExpense/' + id,
+    method: 'get'
+  });
+};
+
+/**
+ * 新增收入费用设定
+ * @param data
+ */
+export const addRevenueExpense = (data: RevenueExpenseForm) => {
+  return request({
+    url: '/system/revenueExpense',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 修改收入费用设定
+ * @param data
+ */
+export const updateRevenueExpense = (data: RevenueExpenseForm) => {
+  return request({
+    url: '/system/revenueExpense',
+    method: 'put',
+    data: data
+  });
+};
+
+/**
+ * 删除收入费用设定
+ * @param id
+ */
+export const delRevenueExpense = (id: string | number | Array<string | number>) => {
+  return request({
+    url: '/system/revenueExpense/' + id,
+    method: 'delete'
+  });
+};
+export function changeStatus(id: string | number, isShow: string) {
+  const data = {
+    id,
+    isShow
+  };
+  return request({
+    url: '/system/revenueExpense/changeStatus',
+    method: 'put',
+    data: data
+  });
+}

+ 135 - 0
src/api/company/revenueExpense/types.ts

@@ -0,0 +1,135 @@
+export interface RevenueExpenseVO {
+  /**
+   * 主键ID
+   */
+  id: string | number;
+
+  /**
+   * 编码
+   */
+  revenueCode: string;
+
+  /**
+   * 费用名称
+   */
+  revenueName: string;
+
+  /**
+   * 费用类(0 是  1否)
+   */
+  expenseFlag: string;
+
+  /**
+   * 收入类(0 是  1否)
+   */
+  revenueFlag: string;
+
+  /**
+   * 是否显示(0-显示,1-不显示)
+   */
+  isShow: string;
+
+  /**
+   * 数据来源
+   */
+  dataSource: string;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status: string;
+
+  /**
+   * 备注
+   */
+  remark: string;
+}
+
+export interface RevenueExpenseForm extends BaseEntity {
+  /**
+   * 主键ID
+   */
+  id?: string | number;
+
+  /**
+   * 编码
+   */
+  revenueCode?: string;
+
+  /**
+   * 费用名称
+   */
+  revenueName?: string;
+
+  /**
+   * 费用类(0 是  1否)
+   */
+  expenseFlag?: string;
+
+  /**
+   * 收入类(0 是  1否)
+   */
+  revenueFlag?: string;
+
+  /**
+   * 是否显示(0-显示,1-不显示)
+   */
+  isShow?: string;
+
+  /**
+   * 数据来源
+   */
+  dataSource?: string;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status?: string;
+
+  /**
+   * 备注
+   */
+  remark?: string;
+}
+
+export interface RevenueExpenseQuery extends PageQuery {
+  /**
+   * 编码
+   */
+  revenueCode?: string;
+
+  /**
+   * 费用名称
+   */
+  revenueName?: string;
+
+  /**
+   * 费用类(0 是  1否)
+   */
+  expenseFlag?: string;
+
+  /**
+   * 收入类(0 是  1否)
+   */
+  revenueFlag?: string;
+
+  /**
+   * 是否显示(0-显示,1-不显示)
+   */
+  isShow?: string;
+
+  /**
+   * 数据来源
+   */
+  dataSource?: string;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status?: string;
+
+  /**
+   * 日期范围参数
+   */
+  params?: any;
+}

+ 4 - 0
src/api/system/dept/types.ts

@@ -5,6 +5,8 @@ export interface DeptQuery extends PageQuery {
   deptName?: string;
   deptCategory?: string;
   status?: number;
+  isCompanyFlag?: string;
+  companyId?: number | string;
 }
 
 /**
@@ -27,6 +29,7 @@ export interface DeptVO extends BaseEntity {
   ancestors: string;
   menuId: string | number;
   platformCode: string;
+  companyId?: number | string;
 }
 
 /**
@@ -59,4 +62,5 @@ export interface DeptForm {
   delFlag?: string;
   ancestors?: string;
   platformCode?: string;
+  companyId?: number | string;
 }

+ 230 - 0
src/views/company/comCurrency/index.vue

@@ -0,0 +1,230 @@
+<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="dataSource">
+              <el-input v-model="queryParams.dataSource" placeholder="请输入数据来源" clearable @keyup.enter="handleQuery" />
+            </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="22"><span>交易币别信息列表</span> </el-col>
+          <el-col :span="1.5">
+            <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['system:comCurrency:add']">新增</el-button>
+          </el-col>
+        </el-row>
+      </template>
+
+      <el-table v-loading="loading" border :data="comCurrencyList" @selection-change="handleSelectionChange">
+        <el-table-column type="selection" width="55" align="center" />
+        <el-table-column label="编号" align="center" prop="currencyCode" />
+        <el-table-column label="名称" align="center" prop="currencyName" />
+        <el-table-column label="是否显示" align="center" prop="isShow">
+          <template #default="scope">
+            <el-switch v-model="scope.row.isShow" active-value="0" inactive-value="1" @change="handleStatusChange(scope.row)"></el-switch>
+          </template>
+        </el-table-column>
+        <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+          <template #default="scope">
+            <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:comCurrency:edit']">编辑</el-button>
+          </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="comCurrencyFormRef" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="货币名称" prop="currencyName">
+          <el-input v-model="form.currencyName" placeholder="请输入货币名称" />
+        </el-form-item>
+        <el-form-item label="是否启用" prop="isShow">
+          <el-radio-group v-model="form.isShow">
+            <el-radio v-for="dict in sys_platform_yes_no" :key="dict.value" :value="dict.value">{{ dict.label }}</el-radio>
+          </el-radio-group>
+        </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="ComCurrency" lang="ts">
+import { listComCurrency, getComCurrency, delComCurrency, addComCurrency, updateComCurrency, changeStatus } from '@/api/company/comCurrency';
+import { ComCurrencyVO, ComCurrencyQuery, ComCurrencyForm } from '@/api/company/comCurrency/types';
+
+const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+const { sys_platform_yes_no } = toRefs<any>(proxy?.useDict('sys_platform_yes_no'));
+
+const comCurrencyList = ref<ComCurrencyVO[]>([]);
+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 comCurrencyFormRef = ref<ElFormInstance>();
+
+const dialog = reactive<DialogOption>({
+  visible: false,
+  title: ''
+});
+
+const initFormData: ComCurrencyForm = {
+  id: undefined,
+  currencyCode: undefined,
+  currencyName: undefined,
+  isShow: '0',
+  dataSource: undefined,
+  status: undefined,
+  remark: undefined
+};
+const data = reactive<PageData<ComCurrencyForm, ComCurrencyQuery>>({
+  form: { ...initFormData },
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+    currencyCode: undefined,
+    currencyName: undefined,
+    isShow: undefined,
+    dataSource: undefined,
+    status: undefined,
+    params: {}
+  },
+  rules: {
+    currencyName: [{ required: true, message: '货币名称不能为空', trigger: 'blur' }]
+  }
+});
+
+const { queryParams, form, rules } = toRefs(data);
+
+/** 查询交易币别配置列表 */
+const getList = async () => {
+  loading.value = true;
+  const res = await listComCurrency(queryParams.value);
+  comCurrencyList.value = res.rows;
+  total.value = res.total;
+  loading.value = false;
+};
+
+/** 取消按钮 */
+const cancel = () => {
+  reset();
+  dialog.visible = false;
+};
+
+/** 表单重置 */
+const reset = () => {
+  form.value = { ...initFormData };
+  comCurrencyFormRef.value?.resetFields();
+};
+
+const handleStatusChange = async (row: ComCurrencyVO) => {
+  const oldValue = row.isShow; // 保存旧值(0 或 1)
+
+  try {
+    await changeStatus(row.id, row.isShow); // 传新值
+    proxy?.$modal.msgSuccess('操作成功');
+  } catch {
+    row.isShow = oldValue; // 失败回滚
+    proxy?.$modal.msgError('操作失败,请重试');
+  }
+};
+
+/** 搜索按钮操作 */
+const handleQuery = () => {
+  queryParams.value.pageNum = 1;
+  getList();
+};
+
+/** 重置按钮操作 */
+const resetQuery = () => {
+  queryFormRef.value?.resetFields();
+  handleQuery();
+};
+
+/** 多选框选中数据 */
+const handleSelectionChange = (selection: ComCurrencyVO[]) => {
+  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?: ComCurrencyVO) => {
+  reset();
+  const _id = row?.id || ids.value[0];
+  const res = await getComCurrency(_id);
+  Object.assign(form.value, res.data);
+  dialog.visible = true;
+  dialog.title = '修改交易币别配置';
+};
+
+/** 提交按钮 */
+const submitForm = () => {
+  comCurrencyFormRef.value?.validate(async (valid: boolean) => {
+    if (valid) {
+      buttonLoading.value = true;
+      if (form.value.id) {
+        await updateComCurrency(form.value).finally(() => (buttonLoading.value = false));
+      } else {
+        await addComCurrency(form.value).finally(() => (buttonLoading.value = false));
+      }
+      proxy?.$modal.msgSuccess('操作成功');
+      dialog.visible = false;
+      await getList();
+    }
+  });
+};
+
+/** 删除按钮操作 */
+const handleDelete = async (row?: ComCurrencyVO) => {
+  const _ids = row?.id || ids.value;
+  await proxy?.$modal.confirm('是否确认删除交易币别配置编号为"' + _ids + '"的数据项?').finally(() => (loading.value = false));
+  await delComCurrency(_ids);
+  proxy?.$modal.msgSuccess('删除成功');
+  await getList();
+};
+
+/** 导出按钮操作 */
+const handleExport = () => {
+  proxy?.download(
+    'system/comCurrency/export',
+    {
+      ...queryParams.value
+    },
+    `comCurrency_${new Date().getTime()}.xlsx`
+  );
+};
+
+onMounted(() => {
+  getList();
+});
+</script>

+ 210 - 173
src/views/company/comDept/index.vue

@@ -4,10 +4,17 @@
       <div v-show="showSearch" class="mb-[10px]">
         <el-card shadow="hover">
           <el-form ref="queryFormRef" :model="queryParams" :inline="true">
-            <el-form-item label="数据来源" prop="dataSource">
-              <el-input v-model="queryParams.dataSource" placeholder="请输入数据来源" clearable @keyup.enter="handleQuery" />
+            <el-form-item label="部门名称" prop="deptName">
+              <el-input v-model="queryParams.deptName" placeholder="请输入部门名称" clearable @keyup.enter="handleQuery" />
+            </el-form-item>
+            <el-form-item label="类别编码" prop="deptCategory">
+              <el-input v-model="queryParams.deptCategory" placeholder="请输入类别编码" clearable style="width: 240px" @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" />
+              </el-select>
             </el-form-item>
-
             <el-form-item>
               <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
               <el-button icon="Refresh" @click="resetQuery">重置</el-button>
@@ -17,86 +24,126 @@
       </div>
     </transition>
 
-    <el-card shadow="never">
+    <el-card shadow="hover">
       <template #header>
-        <el-row :gutter="10" class="mb8">
-          <el-col :span="20"><span>部门设定</span> </el-col>
-          <el-col :span="1.5">
-            <el-button type="primary" plain icon="Plus" @click="handleAdd()" v-hasPermi="['system:comDept:add']">新增</el-button>
-          </el-col>
+        <el-row :gutter="10">
+          <!-- <el-col :span="1.5">
+            <el-button v-hasPermi="['system:dept:add']" type="primary" plain icon="Plus" @click="handleAdd()">新增 </el-button>
+          </el-col> -->
           <el-col :span="1.5">
             <el-button type="info" plain icon="Sort" @click="handleToggleExpandAll">展开/折叠</el-button>
           </el-col>
+          <right-toolbar v-model:show-search="showSearch" @query-table="getList"></right-toolbar>
         </el-row>
       </template>
+
       <el-table
-        ref="comDeptTableRef"
+        ref="deptTableRef"
         v-loading="loading"
-        :data="comDeptList"
-        row-key="id"
+        :data="deptList"
+        row-key="deptId"
         border
-        :default-expand-all="isExpandAll"
         :tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
+        :default-expand-all="isExpandAll"
       >
-        <!-- <el-table-column label="部门编码" prop="deptCode" /> -->
-        <el-table-column label="部门名称" align="center" prop="deptName" />
-        <el-table-column label="生效日期" align="center" prop="validFrom" width="180">
+        <el-table-column prop="deptName" label="部门名称" width="260"></el-table-column>
+        <el-table-column prop="deptCategory" align="center" label="类别编码" width="200"></el-table-column>
+        <el-table-column prop="orderNum" align="center" label="排序" width="200"></el-table-column>
+        <el-table-column prop="status" align="center" label="状态" width="100">
           <template #default="scope">
-            <span>{{ parseTime(scope.row.validFrom, '{y}-{m}-{d}') }}</span>
+            <dict-tag :options="sys_normal_disable" :value="scope.row.status" />
           </template>
         </el-table-column>
-        <el-table-column label="失效日期" align="center" prop="validTo" width="180">
+        <el-table-column label="创建时间" align="center" prop="createTime" width="200">
           <template #default="scope">
-            <span>{{ parseTime(scope.row.validTo, '{y}-{m}-{d}') }}</span>
+            <span>{{ proxy.parseTime(scope.row.createTime) }}</span>
           </template>
         </el-table-column>
-        <el-table-column label="主管" align="center" prop="leader" />
-        <el-table-column label="是否启用" align="center" prop="status">
+        <el-table-column fixed="right" align="center" label="操作">
           <template #default="scope">
-            <el-switch v-model="scope.row.status" active-value="0" inactive-value="1" @change="handleStatusChange(scope.row)"></el-switch>
-          </template>
-        </el-table-column>
-        <el-table-column label="数据来源" align="center" prop="dataSource" />
-        <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
-          <template #default="scope">
-            <el-button link type="primary" icon="Plus" @click="handleAdd(scope.row)" v-hasPermi="['system:comDept:add']">新增</el-button>
-
-            <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:comDept:edit']">编辑</el-button>
+            <el-tooltip content="修改" placement="top">
+              <el-button v-hasPermi="['system:dept:edit']" link type="primary" icon="Edit" @click="handleUpdate(scope.row)" />
+            </el-tooltip>
+            <el-tooltip content="新增" placement="top">
+              <el-button v-hasPermi="['system:dept:add']" link type="primary" icon="Plus" @click="handleAdd(scope.row)" />
+            </el-tooltip>
+            <el-tooltip content="删除" placement="top">
+              <el-button v-hasPermi="['system:dept:remove']" link type="primary" icon="Delete" @click="handleDelete(scope.row)" />
+            </el-tooltip>
           </template>
         </el-table-column>
       </el-table>
     </el-card>
-    <!-- 添加或修改企业部门对话框 -->
-    <el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body>
-      <el-form ref="comDeptFormRef" :model="form" :rules="rules" label-width="80px">
-        <el-form-item label="部门名称" prop="deptName">
-          <el-input v-model="form.deptName" placeholder="请输入部门名称" />
-        </el-form-item>
-        <el-form-item label="父部门ID" prop="parentId">
-          <el-tree-select
-            v-model="form.parentId"
-            :data="comDeptOptions"
-            :props="{ value: 'id', label: 'deptName', children: 'children' }"
-            value-key="id"
-            placeholder="请选择父部门ID"
-            check-strictly
-          />
-        </el-form-item>
-        <el-form-item label="是否启用" prop="status">
-          <el-radio-group v-model="form.status">
-            <el-radio v-for="dict in sys_platform_yes_no" :key="dict.value" :value="dict.value">{{ dict.label }}</el-radio>
-          </el-radio-group>
-        </el-form-item>
-        <el-form-item label="生效日期" prop="validFrom">
-          <el-date-picker clearable v-model="form.validFrom" type="date" value-format="YYYY-MM-DD" placeholder="选择生效日期" />
-        </el-form-item>
-        <el-form-item label="失效日期" prop="validTo">
-          <el-date-picker clearable v-model="form.validTo" type="date" value-format="YYYY-MM-DD" placeholder="选择失效日期" />
-        </el-form-item>
+
+    <el-dialog v-model="dialog.visible" :title="dialog.title" destroy-on-close append-to-body width="600px">
+      <el-form ref="deptFormRef" :model="form" :rules="rules" label-width="80px">
+        <el-row>
+          <el-col v-if="form.parentId !== 0" :span="24">
+            <el-form-item label="上级部门" prop="parentId">
+              <el-tree-select
+                v-model="form.parentId"
+                :data="deptOptions"
+                :props="{ value: 'deptId', label: 'deptName', children: 'children' } as any"
+                value-key="deptId"
+                placeholder="选择上级部门"
+                check-strictly
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="部门名称" prop="deptName">
+              <el-input v-model="form.deptName" placeholder="请输入部门名称" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="类别编码" prop="deptCategory">
+              <el-input v-model="form.deptCategory" placeholder="请输入类别编码" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="显示排序" prop="orderNum">
+              <el-input-number v-model="form.orderNum" controls-position="right" :min="0" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="负责人" prop="leader">
+              <el-select v-model="form.leader" placeholder="请选择负责人">
+                <el-option v-for="item in deptUserList" :key="item.userId" :label="item.userName" :value="item.userId" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="联系电话" prop="phone">
+              <el-input v-model="form.phone" placeholder="请输入联系电话" maxlength="11" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="邮箱" prop="email">
+              <el-input v-model="form.email" placeholder="请输入邮箱" maxlength="50" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="部门状态">
+              <el-radio-group v-model="form.status">
+                <el-radio v-for="dict in sys_normal_disable" :key="dict.value" :value="dict.value">{{ dict.label }}</el-radio>
+              </el-radio-group>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="24">
+            <!-- 仅当是总控平台时显示 -->
+            <el-form-item v-if="isMainPlatform" label="所属平台" prop="platformCode">
+              <el-select v-model="form.platformCode" placeholder="请选择平台">
+                <el-option v-for="dict in sys_platform_code" :key="dict.value" :label="dict.label" :value="dict.value" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
       </el-form>
       <template #footer>
         <div class="dialog-footer">
-          <el-button :loading="buttonLoading" type="primary" @click="submitForm">确 定</el-button>
+          <el-button type="primary" @click="submitForm">确 定</el-button>
           <el-button @click="cancel">取 消</el-button>
         </div>
       </template>
@@ -104,200 +151,190 @@
   </div>
 </template>
 
-<script setup name="ComDept" lang="ts">
-import { listComDept, getComDept, delComDept, addComDept, updateComDept, changeStatus } from '@/api/company/comDept';
-import { ComDeptVO, ComDeptQuery, ComDeptForm } from '@/api/company/comDept/types';
+<script setup name="Dept" lang="ts">
+import { listDept, getDept, delDept, addDept, updateDept, listDeptExcludeChild } from '@/api/system/dept';
+import { DeptForm, DeptQuery, DeptVO } from '@/api/system/dept/types';
+import { UserVO } from '@/api/system/user/types';
+import { listUserByDeptId } from '@/api/system/user';
+import { getPlatformCode } from '@/utils/platform';
 
-type ComDeptOption = {
-  id: number;
+interface DeptOptionsType {
+  deptId: number | string;
   deptName: string;
-  children?: ComDeptOption[];
-};
+  children: DeptOptionsType[];
+}
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+const { sys_normal_disable, sys_platform_code } = toRefs<any>(proxy?.useDict('sys_normal_disable', 'sys_platform_code'));
 
-const { sys_platform_yes_no } = toRefs<any>(proxy?.useDict('sys_platform_yes_no'));
-
-const comDeptList = ref<ComDeptVO[]>([]);
-const comDeptOptions = ref<ComDeptOption[]>([]);
-const buttonLoading = ref(false);
+const deptList = ref<DeptVO[]>([]);
+const loading = ref(true);
 const showSearch = ref(true);
+const deptOptions = ref<DeptOptionsType[]>([]);
 const isExpandAll = ref(true);
-const loading = ref(false);
-
-const queryFormRef = ref<ElFormInstance>();
-const comDeptFormRef = ref<ElFormInstance>();
-const comDeptTableRef = ref<ElTableInstance>();
+const deptUserList = ref<UserVO[]>([]);
+const currentPlatform = getPlatformCode();
+const isMainPlatform = computed(() => currentPlatform === 'main');
 
 const dialog = reactive<DialogOption>({
   visible: false,
   title: ''
 });
 
-const initFormData: ComDeptForm = {
-  id: undefined,
-  deptCode: undefined,
-  companyId: undefined,
-  deptName: undefined,
+const deptTableRef = ref<ElTableInstance>();
+const queryFormRef = ref<ElFormInstance>();
+const deptFormRef = ref<ElFormInstance>();
+
+const initFormData: DeptForm = {
+  deptId: undefined,
   parentId: undefined,
-  ancestors: undefined,
+  deptName: undefined,
+  companyId: undefined,
   deptCategory: undefined,
-  level: undefined,
+  orderNum: 0,
   leader: undefined,
   phone: undefined,
   email: undefined,
-  validFrom: undefined,
-  validTo: undefined,
   status: '0',
-  dataSource: undefined,
-  orderNum: undefined
+  platformCode: ''
 };
-
-const data = reactive<PageData<ComDeptForm, ComDeptQuery>>({
+const initData: PageData<DeptForm, DeptQuery> = {
   form: { ...initFormData },
   queryParams: {
-    deptCode: undefined,
-    companyId: undefined,
+    pageNum: 1,
+    pageSize: 10,
     deptName: undefined,
-    parentId: undefined,
-    ancestors: undefined,
     deptCategory: undefined,
-    level: undefined,
-    leader: undefined,
-    phone: undefined,
-    email: undefined,
-    validFrom: undefined,
-    validTo: undefined,
     status: undefined,
-    dataSource: undefined,
-    orderNum: undefined,
-    platformCode: undefined,
-    params: {}
+    isCompanyFlag: '0',
+    companyId: 1
   },
   rules: {
-    deptName: [{ required: true, message: '部门名称不能为空', trigger: 'blur' }]
+    parentId: [{ required: true, message: '上级部门不能为空', trigger: 'blur' }],
+    deptName: [{ required: true, message: '部门名称不能为空', trigger: 'blur' }],
+    orderNum: [{ required: true, message: '显示排序不能为空', trigger: 'blur' }],
+    platformCode: [{ required: true, message: '所属平台不能为空', trigger: 'blur' }],
+    email: [{ type: 'email', message: '请输入正确的邮箱地址', trigger: ['blur', 'change'] }],
+    phone: [{ pattern: /^1[3456789][0-9]\d{8}$/, message: '请输入正确的手机号码', trigger: 'blur' }]
   }
-});
+};
+const data = reactive<PageData<DeptForm, DeptQuery>>(initData);
 
-const { queryParams, form, rules } = toRefs(data);
+const { queryParams, form, rules } = toRefs<PageData<DeptForm, DeptQuery>>(data);
 
-/** 查询企业部门列表 */
+/** 查询菜单列表 */
 const getList = async () => {
   loading.value = true;
-  const res = await listComDept(queryParams.value);
-  const data = proxy?.handleTree<ComDeptVO>(res.data, 'id', 'parentId');
+  const res = await listDept(queryParams.value);
+  const data = proxy?.handleTree<DeptVO>(res.data, 'deptId');
   if (data) {
-    comDeptList.value = data;
-    loading.value = false;
+    deptList.value = data;
   }
+  loading.value = false;
 };
 
-const handleStatusChange = async (row: ComDeptVO) => {
-  const oldValue = row.status; // 保存旧值(0 或 1)
-
-  try {
-    await changeStatus(row.id, row.status); // 传新值
-    proxy?.$modal.msgSuccess('操作成功');
-  } catch {
-    row.status = oldValue; // 失败回滚
-    proxy?.$modal.msgError('操作失败,请重试');
+/** 查询当前部门的所有用户 */
+async function getDeptAllUser(deptId: any) {
+  if (deptId !== null && deptId !== '' && deptId !== undefined) {
+    const res = await listUserByDeptId(deptId);
+    deptUserList.value = res.data;
   }
-};
-
-/** 查询企业部门下拉树结构 */
-const getTreeselect = async () => {
-  const res = await listComDept();
-  comDeptOptions.value = [];
-  const data: ComDeptOption = { id: 0, deptName: '顶级节点', children: [] };
-  data.children = proxy?.handleTree<ComDeptOption>(res.data, 'id', 'parentId');
-  comDeptOptions.value.push(data);
-};
+}
 
-// 取消按钮
+/** 取消按钮 */
 const cancel = () => {
   reset();
   dialog.visible = false;
 };
-
-// 表单重置
+/** 表单重置 */
 const reset = () => {
   form.value = { ...initFormData };
-  comDeptFormRef.value?.resetFields();
+  deptFormRef.value?.resetFields();
 };
 
 /** 搜索按钮操作 */
 const handleQuery = () => {
   getList();
 };
-
 /** 重置按钮操作 */
 const resetQuery = () => {
   queryFormRef.value?.resetFields();
   handleQuery();
 };
 
-/** 新增按钮操作 */
-const handleAdd = (row?: ComDeptVO) => {
-  reset();
-  getTreeselect();
-  if (row != null && row.id) {
-    form.value.parentId = row.id;
-  } else {
-    form.value.parentId = 0;
-  }
-  dialog.visible = true;
-  dialog.title = '添加企业部门';
-};
-
 /** 展开/折叠操作 */
 const handleToggleExpandAll = () => {
   isExpandAll.value = !isExpandAll.value;
-  toggleExpandAll(comDeptList.value, isExpandAll.value);
+  toggleExpandAll(deptList.value, isExpandAll.value);
 };
-
-/** 展开/折叠操作 */
-const toggleExpandAll = (data: ComDeptVO[], status: boolean) => {
+/** 展开/折叠所有 */
+const toggleExpandAll = (data: DeptVO[], status: boolean) => {
   data.forEach((item) => {
-    comDeptTableRef.value?.toggleRowExpansion(item, status);
+    deptTableRef.value?.toggleRowExpansion(item, status);
     if (item.children && item.children.length > 0) toggleExpandAll(item.children, status);
   });
 };
 
+/** 新增按钮操作 */
+const handleAdd = async (row?: DeptVO) => {
+  reset();
+  const res = await listDept();
+  const data = proxy?.handleTree<DeptOptionsType>(res.data, 'deptId');
+  if (data) {
+    deptOptions.value = data;
+    if (row && row.deptId) {
+      form.value.parentId = row?.deptId;
+    }
+    if (row && row.companyId) {
+      form.value.companyId = row?.companyId;
+    }
+    if (row && row.platformCode) {
+      form.value.platformCode = row?.platformCode;
+    }
+    console.log(row);
+    dialog.visible = true;
+    dialog.title = '添加部门';
+  }
+};
+
 /** 修改按钮操作 */
-const handleUpdate = async (row: ComDeptVO) => {
+const handleUpdate = async (row: DeptVO) => {
   reset();
-  await getTreeselect();
-  if (row != null) {
-    form.value.parentId = row.parentId;
+  //查询当前部门所有用户
+  getDeptAllUser(row.deptId);
+  const res = await getDept(row.deptId);
+  form.value = res.data;
+  const response = await listDeptExcludeChild(row.deptId);
+  const data = proxy?.handleTree<DeptOptionsType>(response.data, 'deptId');
+  if (data) {
+    deptOptions.value = data;
+    if (data.length === 0) {
+      const noResultsOptions: DeptOptionsType = {
+        deptId: res.data.parentId,
+        deptName: res.data.parentName,
+        children: []
+      };
+      deptOptions.value.push(noResultsOptions);
+    }
   }
-  const res = await getComDept(row.id);
-  Object.assign(form.value, res.data);
   dialog.visible = true;
-  dialog.title = '修改企业部门';
+  dialog.title = '修改部门';
 };
-
 /** 提交按钮 */
 const submitForm = () => {
-  comDeptFormRef.value?.validate(async (valid: boolean) => {
+  deptFormRef.value?.validate(async (valid: boolean) => {
     if (valid) {
-      buttonLoading.value = true;
-      if (form.value.id) {
-        await updateComDept(form.value).finally(() => (buttonLoading.value = false));
-      } else {
-        await addComDept(form.value).finally(() => (buttonLoading.value = false));
-      }
+      form.value.deptId ? await updateDept(form.value) : await addDept(form.value);
       proxy?.$modal.msgSuccess('操作成功');
       dialog.visible = false;
-      getList();
+      await getList();
     }
   });
 };
-
 /** 删除按钮操作 */
-const handleDelete = async (row: ComDeptVO) => {
-  await proxy?.$modal.confirm('是否确认删除企业部门编号为"' + row.id + '"的数据项?');
-  loading.value = true;
-  await delComDept(row.id).finally(() => (loading.value = false));
+const handleDelete = async (row: DeptVO) => {
+  await proxy?.$modal.confirm('是否确认删除名称为"' + row.deptName + '"的数据项?');
+  await delDept(row.deptId);
   await getList();
   proxy?.$modal.msgSuccess('删除成功');
 };

+ 47 - 17
src/views/company/comStaff/index.vue

@@ -11,8 +11,8 @@
               <el-tree-select
                 v-model="queryParams.deptId"
                 :data="deptList"
-                node-key="id"
-                :props="{ value: 'id', label: 'deptName', children: 'children' }"
+                node-key="deptId"
+                :props="{ value: 'deptId', label: 'deptName', children: 'children' }"
                 placeholder="请选择部门"
                 clearable
               />
@@ -90,8 +90,8 @@
               <el-tree-select
                 v-model="form.deptId"
                 :data="deptList"
-                node-key="id"
-                :props="{ value: 'id', label: 'deptName', children: 'children' }"
+                node-key="deptId"
+                :props="{ value: 'deptId', label: 'deptName', children: 'children' }"
                 placeholder="请选择部门"
               />
             </el-form-item>
@@ -142,10 +142,10 @@
 <script setup name="ComStaff" lang="ts">
 import { listComStaff, getComStaff, delComStaff, addComStaff, updateComStaff, changeStatus } from '@/api/company/comStaff';
 import { ComStaffVO, ComStaffQuery, ComStaffForm } from '@/api/company/comStaff/types';
-import { listComDept } from '@/api/company/comDept';
-import { ComDeptVO } from '@/api/company/comDept/types';
-import { listComPost } from '@/api/company/comPost';
-import { ComPostVO } from '@/api/company/comPost/types';
+import { listDept, getDept, listDeptExcludeChild } from '@/api/system/dept';
+import { DeptVO } from '@/api/system/dept/types';
+import { listPost, getPost, deptTreeSelect } from '@/api/system/post';
+import { PostVO } from '@/api/system/post/types';
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
 const { sys_platform_yes_no, sys_user_sex } = toRefs<any>(proxy?.useDict('sys_platform_yes_no', 'sys_user_sex'));
@@ -158,8 +158,8 @@ const ids = ref<Array<string | number>>([]);
 const single = ref(true);
 const multiple = ref(true);
 const total = ref(0);
-const deptList = ref<ComDeptVO[]>([]);
-const postList = ref<ComPostVO[]>([]);
+const deptList = ref<DeptVO[]>([]);
+const postList = ref<PostVO[]>([]);
 
 const queryFormRef = ref<ElFormInstance>();
 const comStaffFormRef = ref<ElFormInstance>();
@@ -214,24 +214,54 @@ const { queryParams, form, rules } = toRefs(data);
 
 /** 获取部门列表(树结构) */
 const getDeptList = async () => {
-  try {
-    const res = await listComDept({ status: '0' });
-    deptList.value = res.data || [];
-  } catch (error) {
-    console.error('获取部门列表失败', error);
+  const res = await listDept();
+  const data = proxy?.handleTree<DeptVO>(res.data, 'deptId');
+  if (data) {
+    deptList.value = data;
   }
+  loading.value = false;
 };
 
 /** 获取岗位列表 */
-const getPostList = async () => {
+const getPostList = async (deptId?: number | string) => {
   try {
-    const res = await listComPost({ pageNum: 1, pageSize: 9999, status: '0' });
+    const res = await listPost({ belongDeptId: deptId });
     postList.value = res.rows || [];
   } catch (error) {
     console.error('获取岗位列表失败', error);
   }
 };
 
+/** 监听部门选择变化,更新岗位列表 */
+watch(
+  () => queryParams.value.deptId,
+  (newDeptId) => {
+    // 清空岗位选择
+    queryParams.value.postId = undefined;
+    // 根据部门获取岗位列表
+    if (newDeptId) {
+      getPostList(newDeptId);
+    } else {
+      getPostList();
+    }
+  }
+);
+
+/** 监听对话框中部门选择变化,更新岗位列表 */
+watch(
+  () => form.value.deptId,
+  (newDeptId) => {
+    // 清空岗位选择
+    form.value.postId = undefined;
+    // 根据部门获取岗位列表
+    if (newDeptId) {
+      getPostList(newDeptId);
+    } else {
+      getPostList();
+    }
+  }
+);
+
 /** 查询人员信息列表 */
 const getList = async () => {
   loading.value = true;

+ 6 - 8
src/views/company/company/add.vue

@@ -79,16 +79,14 @@
 
         <!-- 第六行:一行三列 -->
         <div class="form-row three-columns">
-          <el-form-item label="所属部门:" prop="deptId">
-            <el-tree-select v-model="form.deptId" :data="deptList" node-key="id" :props="{ value: 'id', label: 'deptName', children: 'children' }" placeholder="请选择部门" />
+          <el-form-item label="办公电话:" prop="phone">
+            <el-input v-model="form.phone" placeholder="请输入办公电话" />
           </el-form-item>
-          <el-form-item label="岗位:" prop="postId">
-            <el-select v-model="form.postId" placeholder="请选择岗位">
-              <el-option v-for="post in postList" :key="post.postId" :label="post.postName" :value="post.postId" />
-            </el-select>
+          <el-form-item label="负责人:" prop="principal">
+            <el-input v-model="form.principal" placeholder="请输入负责人" />
           </el-form-item>
-          <el-form-item label="联系电话:" prop="phone">
-            <el-input v-model="form.phone" placeholder="请输入联系电话" />
+          <el-form-item label="登记日期:" prop="regDate">
+            <el-date-picker v-model="form.regDate" type="date" placeholder="请选择" />
           </el-form-item>
         </div>
 

+ 3 - 0
src/views/company/company/index.vue

@@ -260,4 +260,7 @@ const handleExport = () => {
 onMounted(() => {
   getList();
 });
+onActivated(() => {
+  getList();
+});
 </script>

+ 264 - 0
src/views/company/revenueExpense/index.vue

@@ -0,0 +1,264 @@
+<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="dataSource">
+              <el-input v-model="queryParams.dataSource" placeholder="请输入数据来源" clearable @keyup.enter="handleQuery" />
+            </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="22"><span>收入费用设定信息列表</span> </el-col>
+          <el-col :span="1.5">
+            <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['system:revenueExpense:add']">新增</el-button>
+          </el-col>
+        </el-row>
+      </template>
+
+      <el-table v-loading="loading" border :data="revenueExpenseList" @selection-change="handleSelectionChange">
+        <el-table-column type="selection" width="55" align="center" />
+        <el-table-column label="编码" align="center" prop="revenueCode" />
+        <el-table-column label="费用类" align="center" prop="expenseFlag">
+          <template #default="scope">
+            <dict-tag :options="sys_platform_yes_no" :value="scope.row.expenseFlag" />
+          </template>
+        </el-table-column>
+        <el-table-column label="收入类" align="center" prop="revenueFlag">
+          <template #default="scope">
+            <dict-tag :options="sys_platform_yes_no" :value="scope.row.revenueFlag" />
+          </template>
+        </el-table-column>
+        <el-table-column label="费用名称" align="center" prop="revenueName" />
+        <el-table-column label="是否显示" align="center" prop="isShow">
+          <template #default="scope">
+            <el-switch v-model="scope.row.isShow" active-value="0" inactive-value="1" @change="handleStatusChange(scope.row)"></el-switch>
+          </template>
+        </el-table-column>
+        <el-table-column label="数据来源" align="center" prop="dataSource" />
+        <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+          <template #default="scope">
+            <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:revenueExpense:edit']">编辑</el-button>
+          </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="revenueExpenseFormRef" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="费用名称" prop="revenueName">
+          <el-input v-model="form.revenueName" placeholder="请输入费用名称" />
+        </el-form-item>
+        <el-form-item label="费用类" prop="expenseFlag">
+          <el-radio-group v-model="form.expenseFlag">
+            <el-radio v-for="dict in sys_platform_yes_no" :key="dict.value" :value="dict.value">{{ dict.label }}</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="收入类" prop="revenueFlag">
+          <el-radio-group v-model="form.revenueFlag">
+            <el-radio v-for="dict in sys_platform_yes_no" :key="dict.value" :value="dict.value">{{ dict.label }}</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="是否显示" prop="isShow">
+          <el-radio-group v-model="form.isShow">
+            <el-radio v-for="dict in sys_platform_yes_no" :key="dict.value" :value="dict.value">{{ dict.label }}</el-radio>
+          </el-radio-group>
+        </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="RevenueExpense" lang="ts">
+import {
+  listRevenueExpense,
+  getRevenueExpense,
+  delRevenueExpense,
+  addRevenueExpense,
+  updateRevenueExpense,
+  changeStatus
+} from '@/api/company/revenueExpense';
+import { RevenueExpenseVO, RevenueExpenseQuery, RevenueExpenseForm } from '@/api/company/revenueExpense/types';
+
+const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+const { sys_platform_yes_no } = toRefs<any>(proxy?.useDict('sys_platform_yes_no'));
+
+const revenueExpenseList = ref<RevenueExpenseVO[]>([]);
+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 revenueExpenseFormRef = ref<ElFormInstance>();
+
+const dialog = reactive<DialogOption>({
+  visible: false,
+  title: ''
+});
+
+const initFormData: RevenueExpenseForm = {
+  id: undefined,
+  revenueCode: undefined,
+  revenueName: undefined,
+  expenseFlag: '1',
+  revenueFlag: '1',
+  isShow: '0',
+  dataSource: undefined,
+  status: undefined,
+  remark: undefined
+};
+const data = reactive<PageData<RevenueExpenseForm, RevenueExpenseQuery>>({
+  form: { ...initFormData },
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+    revenueCode: undefined,
+    revenueName: undefined,
+    expenseFlag: undefined,
+    revenueFlag: undefined,
+    isShow: undefined,
+    dataSource: undefined,
+    status: undefined,
+    params: {}
+  },
+  rules: {
+    revenueName: [{ required: true, message: '费用名称不能为空', trigger: 'blur' }],
+    expenseFlag: [{ required: true, message: '费用类不能为空', trigger: 'change' }],
+    revenueFlag: [{ required: true, message: '收入类不能为空', trigger: 'change' }]
+  }
+});
+
+const { queryParams, form, rules } = toRefs(data);
+
+/** 查询收入费用设定列表 */
+const getList = async () => {
+  loading.value = true;
+  const res = await listRevenueExpense(queryParams.value);
+  revenueExpenseList.value = res.rows;
+  total.value = res.total;
+  loading.value = false;
+};
+
+/** 取消按钮 */
+const cancel = () => {
+  reset();
+  dialog.visible = false;
+};
+
+const handleStatusChange = async (row: RevenueExpenseVO) => {
+  const oldValue = row.isShow; // 保存旧值(0 或 1)
+
+  try {
+    await changeStatus(row.id, row.isShow); // 传新值
+    proxy?.$modal.msgSuccess('操作成功');
+  } catch {
+    row.isShow = oldValue; // 失败回滚
+    proxy?.$modal.msgError('操作失败,请重试');
+  }
+};
+
+/** 表单重置 */
+const reset = () => {
+  form.value = { ...initFormData };
+  revenueExpenseFormRef.value?.resetFields();
+};
+
+/** 搜索按钮操作 */
+const handleQuery = () => {
+  queryParams.value.pageNum = 1;
+  getList();
+};
+
+/** 重置按钮操作 */
+const resetQuery = () => {
+  queryFormRef.value?.resetFields();
+  handleQuery();
+};
+
+/** 多选框选中数据 */
+const handleSelectionChange = (selection: RevenueExpenseVO[]) => {
+  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?: RevenueExpenseVO) => {
+  reset();
+  const _id = row?.id || ids.value[0];
+  const res = await getRevenueExpense(_id);
+  Object.assign(form.value, res.data);
+  dialog.visible = true;
+  dialog.title = '修改收入费用设定';
+};
+
+/** 提交按钮 */
+const submitForm = () => {
+  revenueExpenseFormRef.value?.validate(async (valid: boolean) => {
+    if (valid) {
+      buttonLoading.value = true;
+      if (form.value.id) {
+        await updateRevenueExpense(form.value).finally(() => (buttonLoading.value = false));
+      } else {
+        await addRevenueExpense(form.value).finally(() => (buttonLoading.value = false));
+      }
+      proxy?.$modal.msgSuccess('操作成功');
+      dialog.visible = false;
+      await getList();
+    }
+  });
+};
+
+/** 删除按钮操作 */
+const handleDelete = async (row?: RevenueExpenseVO) => {
+  const _ids = row?.id || ids.value;
+  await proxy?.$modal.confirm('是否确认删除收入费用设定编号为"' + _ids + '"的数据项?').finally(() => (loading.value = false));
+  await delRevenueExpense(_ids);
+  proxy?.$modal.msgSuccess('删除成功');
+  await getList();
+};
+
+/** 导出按钮操作 */
+const handleExport = () => {
+  proxy?.download(
+    'system/revenueExpense/export',
+    {
+      ...queryParams.value
+    },
+    `revenueExpense_${new Date().getTime()}.xlsx`
+  );
+};
+
+onMounted(() => {
+  getList();
+});
+</script>