소스 검색

fix: employee detail Alipay字段映射 + EmployeeSelector label插槽 + 移除硬编码employeeOptions 部门详情响应判断修复 + 员工过滤改用 department_ids

alphah 2 주 전
부모
커밋
4398e3c522

+ 41 - 1
backend/app/plugin/module_payment/employee/service.py

@@ -181,6 +181,7 @@ class EmployeeService:
         查询员工详情
 
         调用: alipay.commerce.ec.employee.info.query
+        合并本地DB数据补全字段
         """
         from alipay.aop.api.request.AlipayCommerceEcEmployeeInfoQueryRequest import AlipayCommerceEcEmployeeInfoQueryRequest
         from alipay.aop.api.domain.AlipayCommerceEcEmployeeInfoQueryModel import AlipayCommerceEcEmployeeInfoQueryModel
@@ -208,7 +209,46 @@ class EmployeeService:
             log.error(f"支付宝接口调用失败: {result.code} - {result.msg}")
             raise CustomException(msg=f"查询员工详情失败: {result.msg}")
 
-        return EmployeeInfoDTO.to_alipay_dict(cast(EmployeeInfoDTO, result.employee_info))
+        # Alipay 原始字段 → 本地 schema 字段映射
+        raw = EmployeeInfoDTO.to_alipay_dict(cast(EmployeeInfoDTO, result.employee_info))
+        mapped = {
+            "employee_id": raw.get("employee_id"),
+            "employee_name": raw.get("employee_name"),
+            "employee_no": raw.get("employee_no"),
+            "employee_email": raw.get("email"),
+            "employee_mobile": raw.get("mobile"),
+            "employee_cert_type": raw.get("employee_cert_type"),
+            "employee_cert_no": raw.get("employee_cert_no"),
+            "identity_open_id": raw.get("open_id"),
+            "created_time": raw.get("gmt_create"),
+            "updated_time": raw.get("gmt_modified"),
+            "department_ids": raw.get("department_list"),
+            "label_names": raw.get("label_names"),
+            "enterprise_id": enterprise_id,
+        }
+
+        # 合并本地DB数据(补全 Alipay 不返回的字段)
+        try:
+            from .crud import EmployeeCRUD
+            local = await EmployeeCRUD(auth).get(
+                employee_id=employee_id,
+                employee_email=employee_email,
+                employee_mobile=employee_mobile,
+                enterprise_id=enterprise_id
+            )
+            if local:
+                for f in ("status", "identity_type", "identity", "iot_check_type",
+                          "withholding_sign_str", "free_sign_token", "share_code",
+                          "sign_url", "expire_time", "profiles", "department_ids",
+                          "accounting_entity_ids", "role_list", "employee_cert_type",
+                          "employee_cert_no", "employee_email", "employee_mobile"):
+                    val = getattr(local, f, None)
+                    if val is not None:
+                        mapped[f] = val
+        except Exception as e:
+            log.warning(f"合并本地员工数据失败: {e}")
+
+        return mapped
 
     @classmethod
     async def delete_employee_service(

+ 17 - 15
frontend/src/views/module_payment/employee/components/DepartmentDetail.vue

@@ -87,20 +87,21 @@ const loadDepartmentDetail = async () => {
     // 从路由参数获取企业ID
     const route = useRoute();
     const res = await DepartmentAPI.getDepartmentDetail(props.departmentId, props.enterpriseId);
-    if (res.data.code === 200) {
-      const data = res.data.data;
+    const body = res?.data?.data || res?.data;
+    if (body && body.department) {
+      const d = body.department;
       departmentData.value = {
-        name: data.department.department_name,
-        code: data.department.department_code,
-        parent_name: "", // 可以根据parent_department_id查询上级部门名称
-        leader_employee_name: data.department.leader_employee_name,
-        sort_order: data.department.sort_order,
-        status: data.department.status,
-        created_time: data.department.created_time,
-        updated_time: data.department.updated_time,
+        name: d.department_name,
+        code: d.department_code,
+        parent_name: "",
+        leader_employee_name: d.leader_employee_name,
+        sort_order: d.sort_order,
+        status: d.status,
+        created_time: d.created_time,
+        updated_time: d.updated_time,
       };
     } else {
-      ElMessage.error(res.data.message || "加载部门详情失败");
+      ElMessage.error("加载部门详情失败");
     }
   } catch (error) {
     console.error("加载部门详情失败:", error);
@@ -116,13 +117,14 @@ const loadRelatedEmployees = async () => {
 
   try {
     const res = await EmployeeAPI.listEmployee({
-      department_id: props.departmentId,
+      enterprise_id: props.enterpriseId,
       page_no: 1,
       page_size: 100,
     });
-    if (res.data.code === 200) {
-      relatedEmployees.value = res.data.data?.items || [];
-    }
+    const body = res?.data?.data || res?.data;
+    relatedEmployees.value = (body?.items || []).filter(
+      (e: any) => (e.department_ids || []).includes(props.departmentId)
+    );
   } catch (error) {
     console.error("加载部门员工失败:", error);
   }

+ 6 - 2
frontend/src/views/module_payment/institution/components/EmployeeSelector.vue

@@ -24,8 +24,12 @@
 
       <div class="employee-selector__tabs">
         <el-tabs v-model="activeTab">
-          <el-tab-pane label="全部" name="all" />
-          <el-tab-pane label="已选 ({{ selectedIds.length }}人)" name="selected" />
+          <el-tab-pane name="all">
+            <template #label>全部</template>
+          </el-tab-pane>
+          <el-tab-pane name="selected">
+            <template #label>已选 ({{ selectedIds.length }}人)</template>
+          </el-tab-pane>
         </el-tabs>
       </div>
 

+ 1 - 13
frontend/src/views/module_payment/institution/components/InstitutionForm.vue

@@ -291,13 +291,6 @@ const departmentOptions = ref([
   { value: "dept4", label: "财务部" },
 ]);
 
-const employeeOptions = ref([
-  { value: "emp1", label: "张三" },
-  { value: "emp2", label: "李四" },
-  { value: "emp3", label: "王五" },
-  { value: "emp4", label: "赵六" },
-]);
-
 const tagOptions = ref([
   { value: "tag1", label: "管理层" },
   { value: "tag2", label: "技术骨干" },
@@ -306,12 +299,7 @@ const tagOptions = ref([
 
 const showEmployeeSelector = ref(false);
 
-const selectedEmployeeNames = computed(() => {
-  return formData.employee_ids.map(id => {
-    const emp = employeeOptions.value.find(e => e.value === id);
-    return emp ? emp.label : id;
-  });
-});
+const selectedEmployeeNames = computed(() => formData.employee_ids as string[]);
 
 function handleEmployeeConfirm(ids: string[]) {
   formData.employee_ids = ids;