From 573c4975560e16b43651d07afdcd93732708e103 Mon Sep 17 00:00:00 2001
From: tuqin <tuqin@tuqin.cn>
Date: 星期六, 24 十月 2026 12:56:31 +0800
Subject: [PATCH] feat(hrm): 调岗申请表单新增「调岗人」选择,选中后自动带出原部门/原岗位

---
 src/views/hrm/transfer/modules/form.vue |   67 +++++++++++++++++++++++++--------
 1 files changed, 51 insertions(+), 16 deletions(-)

diff --git a/src/views/hrm/transfer/modules/form.vue b/src/views/hrm/transfer/modules/form.vue
index 6e76835..5527a15 100644
--- a/src/views/hrm/transfer/modules/form.vue
+++ b/src/views/hrm/transfer/modules/form.vue
@@ -17,7 +17,8 @@
 
 const emit = defineEmits(['success']);
 const formType = ref<FormType>('create');
-const currentEmployeeId = ref<number>();
+/** 鍛樺伐绮剧畝鍒楄〃缂撳瓨锛堥�変汉鏃剁敤浜庡甫鍑哄師閮ㄩ棬 / 鍘熷矖浣嶏級 */
+let employeeCache: any[] = [];
 
 const isDetail = computed(() => formType.value === 'detail');
 const getTitle = computed(() => {
@@ -26,6 +27,34 @@
   }
   return formType.value === 'update' ? '淇敼璋冨矖鐢宠' : '鏂板璋冨矖鐢宠';
 });
+
+/**
+ * 鏍规嵁閫変腑鐨勫憳宸ワ紝鑷姩甯﹀嚭鍘熼儴闂� / 鍘熷矖浣嶏紙鍚� ID锛屼究浜庡悗绔惤搴擄級
+ */
+async function fillCurrentPosition(employeeId?: number) {
+  if (!employeeId) {
+    await formApi.setValues({
+      currentDeptId: undefined,
+      currentDeptName: undefined,
+      currentPostId: undefined,
+      currentPostName: undefined,
+    });
+    return;
+  }
+  if (employeeCache.length === 0) {
+    employeeCache = (await getEmployeeSimpleList()) || [];
+  }
+  const emp = employeeCache.find((item) => item.id === employeeId);
+  if (!emp) {
+    return;
+  }
+  await formApi.setValues({
+    currentDeptId: emp.deptId,
+    currentDeptName: emp.deptName,
+    currentPostId: emp.postIds?.[0],
+    currentPostName: emp.postName,
+  });
+}
 
 const [Form, formApi] = useVbenForm({
   commonConfig: {
@@ -39,6 +68,12 @@
   layout: 'horizontal',
   schema: [],
   showDefaultActions: false,
+  // 閫夋嫨銆岃皟宀椾汉銆嶅悗锛岃嚜鍔ㄥ甫鍑哄叾褰撳墠閮ㄩ棬 / 宀椾綅
+  async handleValuesChange(values: any, changedFields: string[]) {
+    if (changedFields?.includes('userId')) {
+      await fillCurrentPosition(values?.userId);
+    }
+  },
 });
 
 const [Modal, modalApi] = useVbenModal({
@@ -53,7 +88,6 @@
     }
     modalApi.lock();
     const data = (await formApi.getValues()) as HrmTransferApi.Transfer;
-    data.employeeId = currentEmployeeId.value;
     try {
       if (data.id) {
         await updateTransfer(data);
@@ -71,30 +105,31 @@
     if (!isOpen) {
       return;
     }
+    employeeCache = [];
     const data = modalApi.getData<{ formType: FormType; id?: number }>();
     formType.value = data.formType;
     formApi.setState({ schema: useFormSchema(data.formType) });
     formApi.setDisabled(data.formType === 'detail');
     modalApi.setState({ showConfirmButton: data.formType !== 'detail' });
     if (!data?.id) {
-      // 鏂板鏃讹紝鑷姩鑾峰彇褰撳墠鐧诲綍鍛樺伐鐨勯儴闂ㄥ拰宀椾綅淇℃伅
-      const employees = await getEmployeeSimpleList();
-      // TODO: 杩欓噷搴旇鏍规嵁鐧诲綍鐢ㄦ埛鑾峰彇瀵瑰簲鐨勫憳宸ヤ俊鎭紝鏆傛椂鍙栫涓�涓憳宸ヤ綔涓虹ず渚�
-      const currentEmployee = employees[0];
-      if (currentEmployee) {
-        currentEmployeeId.value = currentEmployee.id;
-        await formApi.setValues({
-          currentDeptName: currentEmployee.deptName,
-          currentPostName: currentEmployee.postName,
-        });
-      }
+      // 鏂板锛氭竻绌鸿〃鍗曪紝鐢辩敤鎴烽�夋嫨璋冨矖浜�
+      await formApi.setValues({
+        userId: undefined,
+        currentDeptId: undefined,
+        currentDeptName: undefined,
+        currentPostId: undefined,
+        currentPostName: undefined,
+      });
       return;
     }
     modalApi.lock();
     try {
       const transfer = await getTransfer(data.id);
-      currentEmployeeId.value = transfer.employeeId;
       await formApi.setValues(transfer);
+      // 鍘嗗彶鏁版嵁鍙兘娌℃湁鍘熼儴闂�/宀椾綅锛屾寜璋冨矖浜鸿ˉ榻�
+      if (transfer.userId && !transfer.currentDeptId) {
+        await fillCurrentPosition(transfer.userId);
+      }
       if (transfer.attachmentList?.length) {
         await formApi.setFieldValue('blobIds', transfer.attachmentList.map(item => ({
           uid: String(item.id),
@@ -112,7 +147,7 @@
 </script>
 
 <template>
-  <Modal :title="getTitle" class="w-[600px]">
+  <Modal :title="getTitle" class="w-[700px]">
     <Form class="mx-4" />
   </Modal>
-</template>
\ No newline at end of file
+</template>

--
Gitblit v1.9.3