Bladeren bron

fix: EmployeeSelector 选中事件 + 员工列表渲染

alphah 2 weken geleden
bovenliggende
commit
9a166a82de

+ 19 - 1
backend/app/plugin/module_payment/expense/institution/model.py

@@ -1,6 +1,6 @@
 from datetime import datetime
 
-from sqlalchemy import DateTime, String, Text
+from sqlalchemy import DateTime, Numeric, String, Text
 from sqlalchemy.orm import Mapped, mapped_column
 
 from app.common.enums import PermissionFilterStrategy
@@ -53,6 +53,24 @@ class ExpenseInstitutionModel(PaymentModelMixin, TenantMixin, EnterpriseMixin):
     multi_employee_share_mode: Mapped[str | None] = mapped_column(
         String(32), default="0", comment="多员工分享模式: 0(不分享)/1(分享)"
     )
+    grant_mode: Mapped[str | None] = mapped_column(
+        String(32), comment="发放模式: manual(手动)/period(周期)"
+    )
+    period_type: Mapped[str | None] = mapped_column(
+        String(32), comment="周期类型: daily/weekly/monthly/quarterly/yearly"
+    )
+    amount: Mapped[float | None] = mapped_column(
+        Numeric(12, 2), default=0, comment="发放金额"
+    )
+    single_limit: Mapped[float | None] = mapped_column(
+        Numeric(12, 2), default=0, comment="单次消费限额"
+    )
+    effective_time_type: Mapped[str | None] = mapped_column(
+        String(32), default="unlimited", comment="有效时间类型: unlimited/all_day/workday/custom"
+    )
+    applicable_scope: Mapped[str | None] = mapped_column(
+        String(32), default="none", comment="适用范围: none/all/employee/department"
+    )
     currency: Mapped[str | None] = mapped_column(
         String(32), default="CNY", comment="货币类型"
     )

+ 6 - 0
backend/app/plugin/module_payment/expense/institution/schema.py

@@ -20,6 +20,12 @@ class InstitutionCreateSchema(BaseModel):
     consult_mode: str | None = Field(default=None, description="费控咨询模式")
     multi_employee_share_mode: str | None = Field(default=None, description="多员工分享模式")
     currency: str | None = Field(default=None, description="货币类型")
+    grant_mode: str | None = Field(default=None, description="发放模式: manual(手动)/period(周期)")
+    period_type: str | None = Field(default=None, description="周期类型")
+    amount: float | None = Field(default=None, description="发放金额")
+    single_limit: float | None = Field(default=None, description="单次消费限额")
+    effective_time_type: str | None = Field(default=None, description="有效时间类型")
+    applicable_scope: str | None = Field(default=None, description="适用范围")
 
 class InstitutionUpdateSchema(InstitutionCreateSchema):
     """更新费控制度请求模型"""

+ 7 - 1
backend/app/plugin/module_payment/expense/institution/service.py

@@ -191,7 +191,13 @@ class InstitutionService:
             effective_end_date=getattr(institution_model, 'effective_end_date', None),
             consult_mode=getattr(institution_model, 'consult_mode', None),
             multi_employee_share_mode=getattr(institution_model, 'multi_employee_share_mode', None),
-            currency=getattr(institution_model, 'currency', None)
+            currency=getattr(institution_model, 'currency', None),
+            grant_mode=(raw_data or {}).get("grant_mode"),
+            period_type=(raw_data or {}).get("period_type"),
+            amount=(raw_data or {}).get("amount"),
+            single_limit=(raw_data or {}).get("single_limit"),
+            effective_time_type=(raw_data or {}).get("effective_time_type"),
+            applicable_scope=(raw_data or {}).get("applicable_scope"),
         )
 
         create_data_dict = create_data.model_dump(exclude_unset=True)

+ 16 - 3
frontend/src/views/module_payment/institution/components/EmployeeSelector.vue

@@ -45,10 +45,12 @@
 
       <div class="employee-selector__table">
         <el-table
+          ref="tableRef"
           :data="displayEmployees"
           :show-header="true"
           border
           :max-height="300"
+          @selection-change="handleSelectionChange"
         >
           <el-table-column type="selection" width="50" />
           <el-table-column label="员工姓名" prop="name" />
@@ -77,7 +79,7 @@
 </template>
 
 <script setup lang="ts">
-import { ref, computed } from "vue";
+import { ref, computed, watch, nextTick } from "vue";
 
 interface Employee {
   id: string;
@@ -125,8 +127,17 @@ const allEmployees = ref<Employee[]>([
   { id: "emp2", name: "湖南钱程似锦技术服务有限公司", department: "湖南钱程似锦技术服务有限公司", phone: "-", email: "-" },
 ]);
 
-const selectedEmployees = computed(() => {
-  return allEmployees.value.filter(emp => props.selectedIds.includes(emp.id));
+const selectedEmployees = ref<Employee[]>([]);
+const tableRef = ref();
+
+function handleSelectionChange(val: Employee[]) {
+  selectedEmployees.value = val;
+}
+
+watch(() => props.visible, (v) => {
+  if (v) {
+    nextTick(() => selectedEmployees.value = allEmployees.value.filter(emp => props.selectedIds.includes(emp.id)));
+  }
 });
 
 const displayEmployees = computed(() => {
@@ -136,7 +147,9 @@ const displayEmployees = computed(() => {
   return allEmployees.value;
 });
 
+
 function handleClose() {
+  selectedEmployees.value = [];
   emit("update:visible", false);
 }