From db42d47f5692ef64e5436c5a6d29dcb537b44596 Mon Sep 17 00:00:00 2001
From: zouyu <2723363702@qq.com>
Date: 星期一, 26 一月 2026 16:36:13 +0800
Subject: [PATCH] 浪潮对接单点登录:mis调整

---
 src/views/oaSystem/projectManagement/components/projectForm.vue |  221 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 221 insertions(+), 0 deletions(-)

diff --git a/src/views/oaSystem/projectManagement/components/projectForm.vue b/src/views/oaSystem/projectManagement/components/projectForm.vue
new file mode 100644
index 0000000..50b671c
--- /dev/null
+++ b/src/views/oaSystem/projectManagement/components/projectForm.vue
@@ -0,0 +1,221 @@
+<template>
+  <el-form :model="form" :rules="rules" ref="formRef" label-width="100px">
+    <el-form-item label="椤圭洰鍚嶇О" prop="projectName">
+      <el-input
+        v-model="form.projectName"
+        placeholder="璇疯緭鍏ラ」鐩悕绉�"
+        maxlength="50"
+      />
+    </el-form-item>
+    <el-form-item label="椤圭洰鎻忚堪" prop="description">
+      <el-input
+        v-model="form.description"
+        type="textarea"
+        :rows="4"
+        placeholder="璇疯緭鍏ラ」鐩弿杩�"
+      />
+    </el-form-item>
+    <el-row :gutter="20">
+      <el-col :span="12">
+        <el-form-item label="寮�濮嬫棩鏈�" prop="startDate">
+          <el-date-picker
+            v-model="form.startDate"
+            type="date"
+            format="YYYY-MM-DD"
+            value-format="YYYY-MM-DD"
+            placeholder="閫夋嫨寮�濮嬫棩鏈�"
+            style="width: 100%"
+          />
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="缁撴潫鏃ユ湡" prop="endDate">
+          <el-date-picker
+            v-model="form.endDate"
+            type="date"
+            format="YYYY-MM-DD"
+            value-format="YYYY-MM-DD"
+            placeholder="閫夋嫨缁撴潫鏃ユ湡"
+            style="width: 100%"
+          />
+        </el-form-item>
+      </el-col>
+    </el-row>
+    <el-form-item label="椤圭洰璐熻矗浜�" prop="managerId">
+      <!-- <el-input
+        v-model="form.managerName"
+        placeholder="璇烽�夋嫨椤圭洰璐熻矗浜�"
+        readonly
+        @focus="showUserSelect = true"
+      /> -->
+      <!-- <el-input
+        v-model="userSearchKey"
+        placeholder="鎼滅储鐢ㄦ埛"
+        v-if="showUserSelect"
+        @keyup.enter="searchUsers"
+        style="margin-top: 10px"
+      /> -->
+      <el-select
+        v-model="form.managerId"
+        style="width: 100%; margin-top: 10px"
+        @change="selectUser"
+        filterable
+        remote
+        :remote-method="searchUsers"
+        :loading="userLoading"
+        placeholder="閫夋嫨椤圭洰璐熻矗浜�"
+      >
+        <el-option
+          v-for="user in userList"
+          :key="user.userId"
+          :label="user.nickName"
+          :value="user.userId"
+        />
+      </el-select>
+    </el-form-item>
+    <el-form-item label="椤圭洰瀹屾垚搴�" prop="completionRate">
+      <el-slider v-model="form.completionRate" :max="100" />
+    </el-form-item>
+    <el-form-item label="椤圭洰鐘舵��" prop="status">
+      <el-radio-group v-model="form.status">
+        <el-radio label="planning">瑙勫垝涓�</el-radio>
+        <el-radio label="inProgress">杩涜涓�</el-radio>
+        <el-radio label="completed">宸插畬鎴�</el-radio>
+        <el-radio label="paused">宸叉殏鍋�</el-radio>
+      </el-radio-group>
+    </el-form-item>
+  </el-form>
+</template>
+
+<script setup>
+import { ref, watch, defineExpose } from 'vue';
+import { listUser } from '@/api/system/user';
+import { ElMessage } from 'element-plus';
+const props = defineProps({
+  form: {
+    type: Object,
+    required: true
+  },
+  rules: {
+    type: Object,
+    required: true
+  },
+  visible: {
+    type: Boolean,
+    required: true
+  }
+});
+
+const formRef = ref();
+const showUserSelect = ref(false);
+const userSearchKey = ref('');
+const userList = ref([]);
+const userLoading = ref(false);
+// 妯℃嫙鐢ㄦ埛鏁版嵁
+const mockUserData = [
+  { userId: '1', nickName: '寮犱笁', userName: 'zhangsan' },
+  { userId: '2', nickName: '鏉庡洓', userName: 'lisi' },
+  { userId: '3', nickName: '鐜嬩簲', userName: 'wangwu' },
+  { userId: '4', nickName: '璧靛叚', userName: 'zhaoliu' },
+  { userId: '5', nickName: '閽变竷', userName: 'qianqi' },
+  { userId: '6', nickName: '瀛欏叓', userName: 'sunba' },
+  { userId: '7', nickName: '鍛ㄤ節', userName: 'zhoujiu' },
+  { userId: '8', nickName: '鍚村崄', userName: 'wushi' }
+];
+// 鎼滅储鐢ㄦ埛
+const searchUsers = async (query) => {
+  userLoading.value = true;
+  try {
+    // 妯℃嫙缃戠粶寤惰繜
+    await new Promise(resolve => setTimeout(resolve, 300));
+    
+    // 姝g‘璁剧疆鐢ㄦ埛鍒楄〃
+    if (!query) {
+      userList.value = [...mockUserData];
+    } else {
+      userList.value = mockUserData.filter(user => 
+        user.nickName.includes(query) || user.userName.includes(query)
+      );
+    }
+  } catch (error) {
+    console.error('鎼滅储鐢ㄦ埛澶辫触:', error);
+  } finally {
+    userLoading.value = false;
+  }
+};
+
+// 閫夋嫨鐢ㄦ埛
+const selectUser = (userId) => {
+    // 鍏堜粠userList鏌ユ壘锛屽鏋滄壘涓嶅埌鍐嶄粠mockUserData涓煡鎵�
+  let selectedUser = userList.value.find(user => user.userId === userId);
+  if (!selectedUser) {
+    selectedUser = mockUserData.find(user => user.userId === userId);
+  }
+
+    // 浣跨敤Vue.set纭繚鍝嶅簲寮忔洿鏂�
+  if (selectedUser) {
+    Object.assign(props.form, { managerName: selectedUser.nickName });
+  } else {
+    Object.assign(props.form, { managerName: '' });
+  }
+  showUserSelect.value = false;
+};
+
+// 閲嶇疆琛ㄥ崟
+const resetFields = () => {
+  if (formRef.value) {
+    formRef.value.resetFields();
+  }
+  showUserSelect.value = false;
+  userSearchKey.value = '';
+  userList.value = [];
+};
+
+// 楠岃瘉琛ㄥ崟
+const validate = () => {
+  return new Promise((resolve, reject) => {
+    if (formRef.value) {
+      formRef.value.validate((valid) => {
+        if (valid) {
+          // 棰濆楠岃瘉锛氱粨鏉熸棩鏈熶笉鑳芥棭浜庡紑濮嬫棩鏈�
+          if (props.form.startDate && props.form.endDate) {
+            const startDate = new Date(props.form.startDate);
+            const endDate = new Date(props.form.endDate);
+            if (endDate < startDate) {
+              ElMessage.error('缁撴潫鏃ユ湡涓嶈兘鏃╀簬寮�濮嬫棩鏈�');
+              reject(new Error('鏃ユ湡楠岃瘉澶辫触'));
+              return;
+            }
+          }
+          resolve();
+        } else {
+          reject(new Error('琛ㄥ崟楠岃瘉澶辫触'));
+        }
+      });
+    } else {
+      resolve();
+    }
+  });
+};
+
+// 鐩戝惉瀵硅瘽妗嗘樉绀虹姸鎬�
+watch(() => props.visible, (newVisible) => {
+  if (!newVisible) {
+    resetFields();
+    // 寤惰繜閲嶇疆锛岀‘淇濇暟鎹凡缁忔彁浜ゅ埌鍚庣
+    // setTimeout(() => {
+    //   resetFields();
+    // }, 300);
+  }
+});
+
+// 鏆撮湶鏂规硶
+defineExpose({
+  resetFields,
+  validate
+});
+</script>
+
+<style scoped>
+
+</style>
\ No newline at end of file

--
Gitblit v1.9.3