莳松-行政管理系统
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ss-oa-manage-web/src/views/OKR/Meeting/MeetingInfo.vue

305 lines
10 KiB

3 weeks ago
<template>
<div>
3 weeks ago
<el-affix postion="top" :offset="95" v-if="!isDetail">
3 weeks ago
<div class="flex justify-between mb-4 bg-white">
3 weeks ago
<b class="text-20px">{{ form.meetingId ? '修改会议' : '新增会议' }}</b>
3 weeks ago
<el-button type="success" @click="submit()">保存</el-button>
3 weeks ago
</div>
</el-affix>
3 weeks ago
<el-form
:model="form"
ref="formRef"
:rules="rules"
label-width="120px"
v-loading="loading"
:disabled="!!isDetail"
>
3 weeks ago
<el-row :gutter="20">
<el-col :xl="12" :lg="12" :md="12" :sm="24" :xs="24">
3 weeks ago
<el-form-item label="会议主题" prop="meetingSubject">
3 weeks ago
<el-input v-model="form.meetingSubject" placeholder="请输入会议主题" clearable />
3 weeks ago
</el-form-item>
</el-col>
<el-col :xl="12" :lg="12" :md="12" :sm="24" :xs="24">
3 weeks ago
<el-form-item label="okr节点" prop="nodeId">
<el-tree-select
v-model="form.nodeId"
:data="peroidList"
:props="defaultProps"
:render-after-expand="false"
:default-expand-all="false"
check-strictly
clearable
placeholder="选择OKR节点"
style="width: 100%"
/>
</el-form-item>
3 weeks ago
</el-col>
<el-col :xl="6" :lg="6" :md="12" :sm="12" :xs="24">
3 weeks ago
<el-form-item label="会议时间" prop="startTime">
3 weeks ago
<el-date-picker
3 weeks ago
v-model="form.startTime"
3 weeks ago
type="datetime"
format="YYYY-MM-DD HH:mm"
value-format="YYYY-MM-DD HH:mm"
placeholder="请选择会议开始时间"
/>
</el-form-item>
</el-col>
<el-col :xl="6" :lg="6" :md="12" :sm="12" :xs="24">
3 weeks ago
<el-form-item label="预计结束时间" prop="expectEndTime">
3 weeks ago
<el-date-picker
3 weeks ago
v-model="form.expectEndTime"
3 weeks ago
type="datetime"
format="YYYY-MM-DD HH:mm"
value-format="YYYY-MM-DD HH:mm"
placeholder="请选择预计结束时间"
/>
</el-form-item>
</el-col>
<el-col :xl="6" :lg="6" :md="12" :sm="12" :xs="24">
3 weeks ago
<el-form-item label="会议地点" prop="meetingRoom">
3 weeks ago
<el-input v-model="form.meetingRoom" placeholder="请输入会议地点" clearable />
3 weeks ago
</el-form-item>
</el-col>
<el-col :xl="6" :lg="6" :md="12" :sm="12" :xs="24">
<el-form-item label="会议状态" prop="status">
<el-select v-model="form.status" placeholder="请选择会议状态" style="width: 100%">
3 weeks ago
<el-option label="未开始" value="1" />
<el-option label="已结束" value="2" />
3 weeks ago
<el-option label="已取消" value="3" disabled />
3 weeks ago
</el-select>
</el-form-item>
</el-col>
<el-col :span="24" :offset="0">
<el-form-item label="预约参会人员" prop="expectUsers">
<el-select
v-model="form.expectUsers"
placeholder="选择参会人员"
clearable
filterable
style="width: 100%"
multiple
@change="handleUserChange"
>
<el-option
v-for="item in userOptions"
3 weeks ago
:key="item.id"
:label="item.name"
:value="item.id"
:disabled="item.status == 1"
3 weeks ago
/>
</el-select>
</el-form-item>
</el-col>
3 weeks ago
<el-col :span="24" :offset="0" v-if="form.meetingId">
3 weeks ago
<el-form-item label="实际参会人员" prop="actualUsers">
<el-checkbox-group v-model="form.actualUsers">
<el-checkbox
v-for="item in expectUserOptions"
3 weeks ago
:key="item.id"
:label="item.name"
:value="item.id"
3 weeks ago
>
3 weeks ago
{{ item.name }}
3 weeks ago
</el-checkbox>
</el-checkbox-group>
</el-form-item>
</el-col>
<el-col :span="24" :offset="0" v-if="!isAllActived">
3 weeks ago
<el-form-item label="缺席原因" prop="absentReason">
<el-input v-model="form.absentReason" placeholder="请输入缺席原因" />
3 weeks ago
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
2 weeks ago
<el-col :xl="16" :lg="16" :md="24" :sm="24" :xs="24">
<el-form-item label="会议内容" prop="meetingContent">
3 weeks ago
<div v-if="!!isDetail" v-dompurify-html="form.meetingContent" class="w-full"></div>
2 weeks ago
<Editor v-else v-model="form.meetingContent" height="500px" style="width: 100%" />
3 weeks ago
</el-form-item>
</el-col>
2 weeks ago
<el-col :xl="8" :lg="8" :md="24" :sm="24" :xs="24" v-if="!!form.meetingId">
<el-form-item label="会议纪要" prop="meetingSummary" label-width="80px">
<!-- <div v-if="!!isDetail" v-dompurify-html="form.meetingSummary" class="w-full"></div>
<Editor v-else v-model="form.meetingSummary" height="500px" /> -->
<div v-if="!!isDetail" class="w-full">{{ form.meetingSummary }}</div>
<el-input
v-else
type="textarea"
placeholder="请输入会议纪要"
:maxlength="-1"
:show-word-limit="false"
:autosize="{ minRows: 20 }"
/>
3 weeks ago
</el-form-item>
</el-col>
</el-row>
</el-form>
</div>
</template>
<script setup name="MeetingInfo">
3 weeks ago
import { listToTree } from '@/utils/tree'
import { getAllNodeTree } from '@/api/okr/okr'
3 weeks ago
import * as MeetingApi from '@/api/okr/meeting'
import { formatDate } from '@/utils/formatTime'
import { getEmployeeSimpleList } from '@/api/pers/employee'
import { useTagsViewStore } from '@/store/modules/tagsView'
3 weeks ago
3 weeks ago
const route = useRoute()
3 weeks ago
const message = useMessage()
const tagsViewStore = useTagsViewStore()
3 weeks ago
const defaultProps = {
value: 'nodeId',
label: 'nodeName',
children: 'children'
}
const isDetail = route.query.isDetail
3 weeks ago
3 weeks ago
onMounted(async () => {
await getOptions()
3 weeks ago
if (route.params.id && route.params.id != 0) {
// 这里可以调用API获取会议详情数据
3 weeks ago
getMeetingInfo(route.params.id)
3 weeks ago
} else {
3 weeks ago
console.error('会议不存在')
3 weeks ago
}
})
3 weeks ago
const peroidList = ref([])
function getOptions() {
3 weeks ago
return Promise.all([getAllNodeTree(), getEmployeeSimpleList()])
.then(([okrResp, employeeResp]) => {
peroidList.value = listToTree(okrResp?.tree || [], {
id: 'nodeId',
pid: 'parentId',
children: 'children'
})
userOptions.value = employeeResp.map((it) => ({ ...it, id: it.id + '' }))
// handleUserChange()
})
.catch((error) => {
console.error('获取数据失败:', error)
3 weeks ago
})
3 weeks ago
// // 获取OKR节点数据
// getAllNodeTree().then((resp) => {
// peroidList.value = listToTree(resp?.tree || [], {
// id: 'nodeId',
// pid: 'parentId',
// children: 'children'
// })
// })
// // 获取人员数据
// getEmployeeSimpleList().then((data) => {
// userOptions.value = data.map((it) => ({ ...it, id: it.id + '' }))
// })
3 weeks ago
}
3 weeks ago
const form = ref({
3 weeks ago
meetingId: undefined,
meetingSubject: '',
startTime: '',
meetingRoom: '',
expectEndTime: '',
3 weeks ago
expectUsers: [],
actualUsers: [],
okrNodeName: '',
3 weeks ago
status: '1',
meetingContent: '',
meetingSummary: '',
absentReason: ''
3 weeks ago
})
const rules = {
3 weeks ago
meetingSubject: [{ required: true, message: '请输入会议主题', trigger: 'blur' }],
startTime: [{ required: true, message: '请选择会议开始时间', trigger: 'change' }],
expectEndTime: [{ required: true, message: '请选择预计结束时间', trigger: 'change' }],
meetingRoom: [{ required: true, message: '请输入会议地点', trigger: 'blur' }],
expectUsers: [{ required: true, message: '请选择参会人员', trigger: 'change' }]
3 weeks ago
}
const formRef = ref(null)
3 weeks ago
const userOptions = ref([])
3 weeks ago
const expectUserOptions = ref([])
const isAllActived = computed(() => {
// 判断实际参会人员是否包含所有预约参会人员
return form.value.expectUsers.every((item) => form.value.actualUsers.includes(item))
})
3 weeks ago
const loading = ref(false)
3 weeks ago
// 获取详情
3 weeks ago
const getMeetingInfo = async (meetingId) => {
try {
loading.value = true
// 调用API获取会议详情
const resp = await MeetingApi.getMeetingDetail({ meetingId })
loading.value = false
if (resp) {
form.value = {
...form.value,
...resp,
startTime: formatDate(resp.startTime, 'YYYY-MM-DD HH:mm'),
expectEndTime: formatDate(resp.expectEndTime, 'YYYY-MM-DD HH:mm'),
expectUsers: resp.expectUsers || [],
actualUsers: resp.actualUsers || []
}
handleUserChange()
3 weeks ago
}
3 weeks ago
} catch (error) {
loading.value = false
console.error('获取会议详情失败:', error)
}
3 weeks ago
}
function handleUserChange() {
// 当预约参会人员变化时,更新实际参会人员选项
expectUserOptions.value = userOptions.value.filter((user) =>
3 weeks ago
form.value.expectUsers.some((it) => it == user.id)
3 weeks ago
)
2 weeks ago
if (!isDetail) {
form.value.actualUsers = [...form.value.expectUsers]
}
3 weeks ago
}
3 weeks ago
const router = useRouter()
async function submit() {
// 校验表单
if (!formRef.value) return
const valid = await formRef.value.validate()
if (!valid) return
try {
// 提交表单数据
if (form.value.meetingId) {
if (form.value.status == 2 && !form.value.meetingSummary) {
message.error('会议结束时,会议纪要不能为空')
return
}
// 更新会议
await MeetingApi.updateMeeting(form.value)
message.success('会议更新成功')
3 weeks ago
} else {
3 weeks ago
if (form.value.status == 1 && !form.value.meetingContent) {
message.error('预约会议时,会议内容不能为空')
return
}
3 weeks ago
form.value.actualUsers = []
3 weeks ago
// 新增会议
await MeetingApi.createMeeting(form.value)
message.success('会议创建成功')
3 weeks ago
}
3 weeks ago
tagsViewStore.delView(route)
const visitedViews = tagsViewStore.getVisitedViews
const latestView = visitedViews.slice(-1)[0]
router.push(latestView)
} catch (error) {
console.error('保存会议数据失败:', error)
}
3 weeks ago
}
</script>
<style lang="scss" scoped></style>