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