<template>
|
<div class="container">
|
<div class="title" v-if="editId">
|
会议纪要详情
|
<span class="back" @click="back"> <i class="iconfont icon-fanhui"></i> 返回 </span>
|
</div>
|
<div class="content">
|
<h1 class="el-descriptions-title">会议纪要基本信息</h1>
|
|
<el-descriptions class="margin-top" title="" :column="1" size="small" border :key="editId">
|
<el-descriptions-item class="el-description-label">会议名称</el-descriptions-item>
|
<el-descriptions-item>{{ meeting.meeting_title }}</el-descriptions-item>
|
|
<el-descriptions-item>
|
<template #label>
|
<div class="cell-item">
|
<el-icon>
|
<iphone />
|
</el-icon>
|
日期
|
</div>
|
</template>
|
{{ meeting.meeting_date }}
|
</el-descriptions-item>
|
<el-descriptions-item>
|
<template #label>
|
<div class="cell-item">
|
<el-icon>
|
<location />
|
</el-icon>
|
时间
|
</div>
|
</template>
|
{{ meeting.meeting_start_time }} - {{ meeting.meeting_end_time }}
|
</el-descriptions-item>
|
<el-descriptions-item>
|
<template #label>
|
<div class="cell-item">
|
<el-icon>
|
<tickets />
|
</el-icon>
|
会议类型
|
</div>
|
</template>
|
{{ getSysDictName(meeting.meeting_type, meetingTypeList) }}
|
<!-- <el-tag size="small">{{meeting.meeting_type}}</el-tag> -->
|
</el-descriptions-item>
|
<el-descriptions-item span="2">
|
<template #label>
|
<div class="cell-item">
|
<el-icon>
|
<user />
|
</el-icon>
|
参会人员
|
</div>
|
</template>
|
|
<el-text style="margin-left: 5px" v-for="user in meeting.user_dolist" :key="user.id" type="primary">
|
{{ user.nickname }}
|
</el-text>
|
<!-- <el-tag v-for="user in meeting.user_dolist" :key="user.id" type="primary">
|
{{ user.nickname }}
|
</el-tag> -->
|
</el-descriptions-item>
|
|
<el-descriptions-item v-if="meeting.meeting_type != 'mrzh'">
|
<template #label>
|
<div class="cell-item">
|
<el-icon>
|
<user />
|
</el-icon>
|
内容
|
</div>
|
</template>
|
<div v-html="meeting.meeting_content"></div>
|
</el-descriptions-item>
|
|
<el-descriptions-item v-if="meeting.meeting_type != 'mrzh'">
|
<template #label>
|
<div class="cell-item">
|
<el-icon>
|
<user />
|
</el-icon>
|
备注
|
</div>
|
</template>
|
{{ meeting.remark }}
|
</el-descriptions-item>
|
|
<el-descriptions-item v-if="meeting.is_commit == 1">
|
<template #label>
|
<div class="cell-item">
|
<el-icon>
|
<office-building />
|
</el-icon>
|
提交状态
|
</div>
|
</template>
|
{{ getSysDictName(meeting.is_commit, dailyCommitList) }}
|
</el-descriptions-item>
|
|
<el-descriptions-item v-if="meeting.is_commit == 1">
|
<template #label>
|
<div class="cell-item">
|
<el-icon>
|
<office-building />
|
</el-icon>
|
提交时间
|
</div>
|
</template>
|
{{ meeting.commit_time }}
|
</el-descriptions-item>
|
|
<el-descriptions-item v-if="meeting.is_commit == 1">
|
<template #label>
|
<div class="cell-item">
|
<el-icon>
|
<office-building />
|
</el-icon>
|
提交人
|
</div>
|
</template>
|
{{ meeting.commit_user_name }}
|
</el-descriptions-item>
|
</el-descriptions>
|
|
<div v-if="meeting.meeting_type == 'mrzh'">
|
<h1 class="el-descriptions-title">商务部分</h1>
|
<!-- <div v-if="bussinessDailyData && bussinessDailyData.length==0"> 暂无</div> -->
|
<el-descriptions
|
class="margin-top"
|
title=""
|
:column="1"
|
size="small"
|
border
|
v-for="daily in bussinessDailyData"
|
:key="daily.id"
|
>
|
<template #extra>
|
<!-- <el-button type="primary">Operation</el-button> -->
|
</template>
|
|
<el-descriptions-item>
|
<template #label>
|
<div class="cell-item">
|
<el-icon>
|
<office-building />
|
</el-icon>
|
项目名称
|
</div>
|
</template>
|
{{ daily.project_name }}
|
</el-descriptions-item>
|
<el-descriptions-item>
|
<template #label>
|
<div class="cell-item">
|
<el-icon>
|
<iphone />
|
</el-icon>
|
实施时间段
|
</div>
|
</template>
|
{{ getFormatDateYYYYMMDD(daily.business_start_time) }} ~
|
{{ getFormatDateYYYYMMDD(daily.business_end_time) }}
|
</el-descriptions-item>
|
<el-descriptions-item>
|
<template #label>
|
<div class="cell-item">
|
<el-icon>
|
<location />
|
</el-icon>
|
负责人
|
</div>
|
</template>
|
<!-- <el-text style="margin-left:5px;" v-for="user in daily.user_dolist" :key="user.id" type="primary">
|
{{ user.nickname }}
|
</el-text> -->
|
{{ daily.business_user_names }}
|
</el-descriptions-item>
|
|
<el-descriptions-item>
|
<template #label>
|
<div class="cell-item">
|
<el-icon>
|
<user />
|
</el-icon>
|
内容
|
</div>
|
</template>
|
<div v-html="daily.business_content"></div>
|
</el-descriptions-item>
|
|
<el-descriptions-item>
|
<template #label>
|
<div class="cell-item">
|
<el-icon>
|
<user />
|
</el-icon>
|
备注
|
</div>
|
</template>
|
{{ daily.remark }}
|
</el-descriptions-item>
|
</el-descriptions>
|
</div>
|
|
<div v-if="meeting.meeting_type == 'mrzh'">
|
<h1 class="el-descriptions-title">项目部分</h1>
|
<div
|
style="width: 100%; margin-top: 20px"
|
v-for="dateUserDaily in dailyUserDailyData"
|
:key="dateUserDaily.date"
|
>
|
<el-text v-if="dateUserDaily.users_daily_list.length > 0" class="mx-1 dateTitle" size="large">{{
|
dateUserDaily.date
|
}}</el-text>
|
|
<div v-for="user in dateUserDaily.users_daily_list" :key="user.user_id">
|
<h2 style="margin-top: 10px" v-if="user.project_daily_bolist.length > 0">{{ user.name }}</h2>
|
|
<el-descriptions
|
:title="daily.name"
|
:column="1"
|
size="small"
|
border
|
v-for="daily in user.project_daily_bolist"
|
:key="daily.id"
|
>
|
<template #extra> </template>
|
|
<el-descriptions-item>
|
<template #label>
|
<div class="cell-item">
|
<el-icon>
|
<office-building />
|
</el-icon>
|
项目名称
|
</div>
|
</template>
|
{{ daily.project_name2 }}
|
</el-descriptions-item>
|
<el-descriptions-item>
|
<template #label>
|
<div class="cell-item">
|
<el-icon>
|
<iphone />
|
</el-icon>
|
计划时间
|
</div>
|
</template>
|
{{ daily.daily_date }}
|
</el-descriptions-item>
|
<el-descriptions-item>
|
<template #label>
|
<div class="cell-item">
|
<el-icon>
|
<location />
|
</el-icon>
|
状态
|
</div>
|
</template>
|
{{ daily.daily_status_name }}
|
</el-descriptions-item>
|
|
<el-descriptions-item>
|
<template #label>
|
<div class="cell-item">
|
<el-icon>
|
<user />
|
</el-icon>
|
内容
|
</div>
|
</template>
|
<div v-html="daily.daily_content"></div>
|
</el-descriptions-item>
|
|
<el-descriptions-item span="3">
|
<template #label>
|
<div class="cell-item">
|
<el-icon>
|
<user />
|
</el-icon>
|
备注
|
</div>
|
</template>
|
{{ daily.remark }}
|
</el-descriptions-item>
|
|
<el-descriptions-item>
|
<template #label>
|
<div class="cell-item">
|
<el-icon>
|
<user />
|
</el-icon>
|
进度状态
|
</div>
|
</template>
|
{{ daily.daily_process_state_name }}
|
</el-descriptions-item>
|
|
<el-descriptions-item>
|
<template #label>
|
<div class="cell-item">
|
<el-icon>
|
<user />
|
</el-icon>
|
进度人
|
</div>
|
</template>
|
{{ daily.daily_process_user_name }}
|
</el-descriptions-item>
|
|
<el-descriptions-item>
|
<template #label>
|
<div class="cell-item">
|
<el-icon>
|
<user />
|
</el-icon>
|
进度时间
|
</div>
|
</template>
|
{{ getFormatDateYYYYMMDD(daily.daily_process_time) }}
|
</el-descriptions-item>
|
|
<el-descriptions-item>
|
<template #label>
|
<div class="cell-item">
|
<el-icon>
|
<user />
|
</el-icon>
|
进度备注
|
</div>
|
</template>
|
{{ daily.daily_process_remark }}
|
</el-descriptions-item>
|
</el-descriptions>
|
</div>
|
</div>
|
</div>
|
</div>
|
</div>
|
</template>
|
|
<script>
|
import { reactive, ref, onMounted, computed } from 'vue'
|
import { ElMessageBox, ElMessage } from 'element-plus'
|
import ProjectInfo from '@/model/projectInfo'
|
import ProjectDaily from '@/model/projectDaily'
|
import SysDictItemModel from '@/model/sysDictItem'
|
import Meeting from '@/model/meeting'
|
import BusinessDaily from '@/model/businessDaily'
|
import Tinymce from '@/component/base/tinymce'
|
import dayjs from 'dayjs'
|
import { debounce } from 'lodash'
|
|
export default {
|
components: {
|
Tinymce,
|
},
|
props: {
|
editId: {
|
type: String,
|
default: null,
|
},
|
},
|
setup(props, context) {
|
const uniKey = ref(0)
|
|
const businessEditId = ref('')
|
|
// 防抖函数,避免动态表格数据变化时产生的抖动
|
const resizeObserver = window.ResizeObserver
|
|
window.ResizeObserver = class extends resizeObserver {
|
constructor(callback) {
|
const debouncedCallback = debounce(callback, 100)
|
super(debouncedCallback)
|
}
|
}
|
|
const form = ref(null)
|
const processForm = ref(null)
|
const loading = ref(false)
|
const content = ref('')
|
const meeting = reactive({
|
id: '',
|
meeting_title: '',
|
meeting_type: '',
|
user_ids: [],
|
date_range: [],
|
meeting_start_time: '',
|
meeting_end_time: '',
|
remark: '',
|
meeting_date: `${dayjs().format('YYYY-MM-DD')} 00:00:00`,
|
meeting_content: '',
|
user_dolist: [],
|
|
is_commit: '',
|
commit_user_id: '',
|
commit_user_name: '',
|
commit_time: '',
|
|
daily_date_list: [],
|
})
|
|
const userList = ref([])
|
const meetingTypeList = ref([])
|
const dailyProcessStateList = ref([])
|
const dailyCommitList = ref([])
|
|
// 商务部分
|
const businessData = ref([])
|
const bussinessDailyData = ref([])
|
|
const listAssign = (a, b) => Object.keys(a).forEach(key => {
|
a[key] = b[key] || a[key]
|
})
|
|
onMounted(() => {
|
// 编辑操作初始化
|
initInfo()
|
loadDictDitems()
|
})
|
|
// 根据字典类型查询字典
|
const loadDictDitems = async () => {
|
// 获取所有用户信息
|
userList.value = await ProjectDaily.getAllUsers()
|
// 获取会议类型字典
|
meetingTypeList.value = await SysDictItemModel.getSysDictItemListByType('meeting_type')
|
dailyProcessStateList.value = await SysDictItemModel.getSysDictItemListByType('daily_process_state')
|
|
dailyCommitList.value = await SysDictItemModel.getSysDictItemListByType('daily_commit')
|
}
|
|
const initInfo = async () => {
|
const res = await Meeting.getMeeting(props.editId)
|
listAssign(meeting, res)
|
const tmp_range = [res.meeting_start_time, res.meeting_end_time]
|
meeting.date_range = tmp_range
|
meeting.user_dolist = res.user_dolist
|
|
// 加载商务日志信息
|
await getBusinessDailyByMeetingId()
|
// 加载项目日志信息
|
await getDeveloperDailyByMeetingIdByUserIds()
|
|
//
|
meeting.daily_date_list = await Meeting.getDailyDateByMeetingId({ meeting_id: props.editId })
|
getDeveloperDailyByDates()
|
}
|
|
// 重置表单
|
const resetForm = () => {
|
form.value.resetFields()
|
}
|
|
const submitForm = async formName => {
|
form.value.validate(async valid => {
|
meeting.meeting_start_time = meeting.date_range[0]
|
meeting.meeting_end_time = meeting.date_range[1]
|
if (valid) {
|
let res = {}
|
if (props.editId) {
|
res = await Meeting.editMeeting(props.editId, meeting)
|
context.emit('editClose')
|
} else {
|
res = await Meeting.createMeeting(meeting)
|
if (res) {
|
props.editId = res.id
|
editId.value = res.id
|
meeting.id = res.id
|
// 获取当前会议的商务日志
|
getBusinessDailyByMeetingId()
|
// 提取人员会议,商务部分自己填写,开发部分提取开发人员的信息,根据人员分组里面是开发的人
|
getDeveloperDailyByMeetingIdByUserIds()
|
}
|
// resetForm(formName)
|
}
|
if (res.code < window.MAX_SUCCESS_CODE) {
|
ElMessage.success(`${res.message}`)
|
}
|
} else {
|
console.error('error submit!!')
|
ElMessage.error('请将信息填写完整')
|
}
|
})
|
}
|
|
const submitFormProcess = () => {
|
processForm.value.validate(async valid => {
|
if (valid) {
|
let res = {}
|
if (daily.value.id) {
|
res = await Meeting.editMeetingProcess(daily.value.id, daily.value)
|
// context.emit('editClose')
|
// 提取人员会议,商务部分自己填写,开发部分提取开发人员的信息,根据人员分组里面是开发的人
|
getDeveloperDailyByMeetingIdByUserIds()
|
}
|
if (res.code < window.MAX_SUCCESS_CODE) {
|
ElMessage.success(`${res.message}`)
|
}
|
} else {
|
console.error('error submit!!')
|
ElMessage.error('请将信息填写完整')
|
}
|
})
|
}
|
|
const resetFormProcess = () => {
|
processForm.value.resetFields()
|
daily.value = []
|
processdrawer.value = false
|
}
|
|
const back = () => {
|
context.emit('editClose')
|
}
|
|
const handleContentChange = val => {
|
meeting.content = val
|
meeting.meeting_content = val
|
}
|
|
// 会议类型发生变化
|
const handlerMeetingTypeChange = async val => {
|
switch (val) {
|
// 每日早会
|
case 'mrzh':
|
// 查看是否有ID,如果没有的话,则先保存当前的会议信息
|
if (props.editId == '') {
|
// 提交保存当前会议
|
submitForm()
|
}
|
|
break
|
// 项目会议
|
case 'xmhy':
|
businessData.value = []
|
break
|
default:
|
businessData.value = []
|
break
|
}
|
}
|
|
// 商务日志部分
|
const getBusinessDailyByMeetingId = async () => {
|
bussinessDailyData.value = await Meeting.getBusinessDailyByMeetingId({ meeting_id: meeting.id })
|
}
|
|
// 项目部分
|
const getDeveloperDailyByMeetingIdByUserIds = async val => {
|
// businessData.value = await Meeting.getDeveloperDailyByMeetingIdByUserIds({ meeting_id: meeting.id, meeting_date: meeting.meeting_date });
|
businessData.value = await Meeting.getDeveloperDailyByMeetingIdByUserIds({ meeting_id: meeting.id })
|
}
|
|
const processdrawer = ref(false)
|
const daily = ref({
|
id: '',
|
daily_process_state: '',
|
daily_process_remark: '',
|
})
|
// 项目进度
|
const handleProcess = obj => {
|
processdrawer.value = true
|
daily.value.id = obj.id
|
daily.value.daily_process_state = obj.daily_process_state
|
daily.value.daily_process_remark = obj.daily_process_remark
|
}
|
|
const businessDailyDrawer = ref(false)
|
// 新增商务日志
|
const addBussinessDaily = () => {
|
uniKey.value++
|
businessEditId.value = ''
|
businessDailyDrawer.value = true
|
}
|
|
const businessEditClose = () => {
|
businessDailyDrawer.value = false
|
// 重新加载
|
getBusinessDailyByMeetingId()
|
}
|
|
// 商务日志详情
|
|
const handleBusinessDailyDetail = obj => {
|
businessEditId.value = obj.id
|
businessDailyDrawer.value = true
|
}
|
|
// 商务日志编辑
|
const handleBusinessDailyEdit = obj => {
|
uniKey.value++
|
businessEditId.value = obj.id
|
businessDailyDrawer.value = true
|
}
|
|
// 商务日志删除
|
|
const handleBusinessDailyDel = async obj => {
|
// 删除操作
|
ElMessageBox.confirm('此操作将永久删除该记录, 是否继续?', '提示', {
|
confirmButtonText: '确定',
|
cancelButtonText: '取消',
|
type: 'warning',
|
})
|
.then(async () => {
|
const res = await BusinessDaily.deleteBusinessDaily(obj.id)
|
if (res.code < window.MAX_SUCCESS_CODE) {
|
await getBusinessDailyByMeetingId()
|
ElMessage.success(`${res.message}`)
|
}
|
})
|
.catch(() => {
|
// 用户点击取消按钮时执行的操作
|
// 可以选择不做任何事情,也可以显示取消消息
|
// ElMessage.info('操作已取消'); // 如果需要显示取消消息,可以取消注释
|
})
|
}
|
|
const getSysDictName = (value, data) => {
|
const tmp = data.find(tmp => tmp.value == value)
|
if (tmp) {
|
return tmp.label
|
}
|
return ''
|
}
|
|
const getFormatDateYYYYMMDD = date => {
|
if (date) {
|
return dayjs(date).format('YYYY-MM-DD')
|
}
|
return ''
|
}
|
|
// 项目日志
|
const dailyUserDailyData = ref([])
|
// 根据日志日期提取日志
|
const getDeveloperDailyByDates = async val => {
|
dailyUserDailyData.value = []
|
const tmpDailyDataList = meeting.daily_date_list.slice().reverse()
|
dailyUserDailyData.value = await Meeting.getDeveloperDailyByDates({
|
meeting_id: meeting.id,
|
daily_date_list: tmpDailyDataList,
|
})
|
}
|
|
return {
|
back,
|
meeting,
|
form,
|
resetForm,
|
submitForm,
|
|
content,
|
handleContentChange,
|
handlerMeetingTypeChange,
|
userList,
|
meetingTypeList,
|
dailyProcessStateList,
|
|
// 商务部分数据
|
businessData,
|
bussinessDailyData,
|
getDeveloperDailyByMeetingIdByUserIds,
|
processdrawer,
|
businessDailyDrawer,
|
handleProcess,
|
daily,
|
submitFormProcess,
|
resetFormProcess,
|
processForm,
|
|
addBussinessDaily,
|
|
businessEditId,
|
businessEditClose,
|
|
// 商务日志部分
|
handleBusinessDailyDetail,
|
handleBusinessDailyEdit,
|
handleBusinessDailyDel,
|
uniKey,
|
|
getSysDictName,
|
dailyCommitList,
|
|
getFormatDateYYYYMMDD,
|
dailyUserDailyData,
|
}
|
},
|
}
|
</script>
|
|
<style lang="scss" scoped>
|
.container {
|
.title {
|
height: 59px;
|
line-height: 59px;
|
color: $parent-title-color;
|
font-size: 16px;
|
font-weight: 500;
|
text-indent: 10px;
|
border-bottom: 1px solid #dae1ec;
|
|
.back {
|
float: right;
|
margin-right: 20px;
|
cursor: pointer;
|
}
|
}
|
|
.content {
|
margin: 10px;
|
}
|
|
.wrap {
|
padding: 20px;
|
}
|
|
.submit {
|
float: left;
|
}
|
|
.operationBtn {
|
margin-left: 5px;
|
}
|
}
|
|
.el-descriptions {
|
// margin-top: 20px;
|
}
|
|
.cell-item {
|
// display: flex;
|
align-items: center;
|
width: 120px;
|
}
|
|
.margin-top {
|
margin-top: 20px;
|
}
|
|
.el-descriptions-title {
|
font-weight: bold;
|
margin-top: 20px;
|
// margin-left:20px;
|
color: #3966b9;
|
}
|
.dateTitle {
|
color: $parent-title-color;
|
}
|
|
.el-descriptions__label.el-descriptions__cell.is-bordered-label {
|
font-weight: bold;
|
color: var(--el-text-color-regular);
|
background: var(--el-descriptions-item-bordered-label-background);
|
width: 120px !important;
|
}
|
</style>
|