whx 1 dzień temu
rodzic
commit
7b5b3678c8
50 zmienionych plików z 980 dodań i 30 usunięć
  1. 1 1
      virgo.wzfrontend/src/main/resources/static/workark/index.html
  2. 0 0
      virgo.wzfrontend/src/main/resources/static/workark/static/css/1704.10305418.css
  3. 1 0
      virgo.wzfrontend/src/main/resources/static/workark/static/css/1786.6e74ae84.css
  4. 0 0
      virgo.wzfrontend/src/main/resources/static/workark/static/css/3965.de2beb57.css
  5. 1 0
      virgo.wzfrontend/src/main/resources/static/workark/static/css/742.0710c824.css
  6. 1 1
      virgo.wzfrontend/src/main/resources/static/workark/static/js/1158.0d831ca6.js
  7. 1 1
      virgo.wzfrontend/src/main/resources/static/workark/static/js/1411.620b0a2c.js
  8. 0 0
      virgo.wzfrontend/src/main/resources/static/workark/static/js/1563.2e7fffa2.js
  9. 1 1
      virgo.wzfrontend/src/main/resources/static/workark/static/js/1654.4b35fcc1.js
  10. 1 0
      virgo.wzfrontend/src/main/resources/static/workark/static/js/1786.d5ebbc5a.js
  11. 1 0
      virgo.wzfrontend/src/main/resources/static/workark/static/js/224.6b99203e.js
  12. 0 1
      virgo.wzfrontend/src/main/resources/static/workark/static/js/224.f2dba002.js
  13. 1 1
      virgo.wzfrontend/src/main/resources/static/workark/static/js/244.2590393d.js
  14. 1 1
      virgo.wzfrontend/src/main/resources/static/workark/static/js/2449.5784d498.js
  15. 0 1
      virgo.wzfrontend/src/main/resources/static/workark/static/js/2891.dd29f798.js
  16. 1 0
      virgo.wzfrontend/src/main/resources/static/workark/static/js/2891.f3d361cf.js
  17. 0 1
      virgo.wzfrontend/src/main/resources/static/workark/static/js/2925.19914735.js
  18. 1 0
      virgo.wzfrontend/src/main/resources/static/workark/static/js/2925.5cd377fb.js
  19. 1 1
      virgo.wzfrontend/src/main/resources/static/workark/static/js/3419.10e0f937.js
  20. 1 1
      virgo.wzfrontend/src/main/resources/static/workark/static/js/3792.8789399f.js
  21. 1 1
      virgo.wzfrontend/src/main/resources/static/workark/static/js/4521.eb96de03.js
  22. 1 1
      virgo.wzfrontend/src/main/resources/static/workark/static/js/4669.2583c75d.js
  23. 0 1
      virgo.wzfrontend/src/main/resources/static/workark/static/js/5306.63667a2b.js
  24. 1 0
      virgo.wzfrontend/src/main/resources/static/workark/static/js/5306.702e9e80.js
  25. 0 0
      virgo.wzfrontend/src/main/resources/static/workark/static/js/5387.5db08259.js
  26. 1 0
      virgo.wzfrontend/src/main/resources/static/workark/static/js/5769.9df8b1bb.js
  27. 1 1
      virgo.wzfrontend/src/main/resources/static/workark/static/js/6466.16ea1981.js
  28. 1 1
      virgo.wzfrontend/src/main/resources/static/workark/static/js/6636.4a93c843.js
  29. 1 1
      virgo.wzfrontend/src/main/resources/static/workark/static/js/7218.6e08e2ef.js
  30. 0 1
      virgo.wzfrontend/src/main/resources/static/workark/static/js/7375.ebc6b4c4.js
  31. 1 1
      virgo.wzfrontend/src/main/resources/static/workark/static/js/7390.4e354b61.js
  32. 1 0
      virgo.wzfrontend/src/main/resources/static/workark/static/js/742.9c4006a8.js
  33. 1 1
      virgo.wzfrontend/src/main/resources/static/workark/static/js/7635.975467a8.js
  34. 1 1
      virgo.wzfrontend/src/main/resources/static/workark/static/js/7817.c20acf44.js
  35. 1 0
      virgo.wzfrontend/src/main/resources/static/workark/static/js/8935.56cb88d4.js
  36. 0 1
      virgo.wzfrontend/src/main/resources/static/workark/static/js/8935.993b2415.js
  37. 1 1
      virgo.wzfrontend/src/main/resources/static/workark/static/js/9021.ee78c1f5.js
  38. 1 1
      virgo.wzfrontend/src/main/resources/static/workark/static/js/9607.472ef290.js
  39. 0 1
      virgo.wzfrontend/src/main/resources/static/workark/static/js/9615.078404a5.js
  40. 1 0
      virgo.wzfrontend/src/main/resources/static/workark/static/js/9615.49340338.js
  41. 1 1
      virgo.wzfrontend/src/main/resources/static/workark/static/js/9874.099b4c38.js
  42. 2 2
      virgo.wzfrontend/src/main/resources/static/workark/static/js/app.45b1ab30.js
  43. 144 0
      virgo.wzfrontend/workark/src/api/oa.js
  44. 140 0
      virgo.wzfrontend/workark/src/components/work/oa/meeting/content.vue
  45. 99 0
      virgo.wzfrontend/workark/src/components/work/oa/meeting/detail.vue
  46. 148 0
      virgo.wzfrontend/workark/src/components/work/oa/meeting/edit.vue
  47. 16 0
      virgo.wzfrontend/workark/src/router/modules/work/oa.js
  48. 161 0
      virgo.wzfrontend/workark/src/views/work/oa/meeting/list.vue
  49. 233 0
      virgo.wzfrontend/workark/src/views/work/oa/meeting/set.vue
  50. 7 2
      virgo.wzfrontend/workark/src/views/work/system/main.vue

Plik diff jest za duży
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/workark/index.html


virgo.wzfrontend/src/main/resources/static/workark/static/css/1563.10305418.css → virgo.wzfrontend/src/main/resources/static/workark/static/css/1704.10305418.css


Plik diff jest za duży
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/workark/static/css/1786.6e74ae84.css


virgo.wzfrontend/src/main/resources/static/workark/static/css/5387.de2beb57.css → virgo.wzfrontend/src/main/resources/static/workark/static/css/3965.de2beb57.css


Plik diff jest za duży
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/workark/static/css/742.0710c824.css


Plik diff jest za duży
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/js/1158.0d831ca6.js


Plik diff jest za duży
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/js/1411.620b0a2c.js


virgo.wzfrontend/src/main/resources/static/workark/static/js/1563.38e56dab.js → virgo.wzfrontend/src/main/resources/static/workark/static/js/1563.2e7fffa2.js


Plik diff jest za duży
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/js/1654.4b35fcc1.js


Plik diff jest za duży
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/workark/static/js/1786.d5ebbc5a.js


Plik diff jest za duży
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/workark/static/js/224.6b99203e.js


Plik diff jest za duży
+ 0 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/js/224.f2dba002.js


Plik diff jest za duży
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/js/244.2590393d.js


Plik diff jest za duży
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/js/2449.5784d498.js


Plik diff jest za duży
+ 0 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/js/2891.dd29f798.js


Plik diff jest za duży
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/workark/static/js/2891.f3d361cf.js


Plik diff jest za duży
+ 0 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/js/2925.19914735.js


Plik diff jest za duży
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/workark/static/js/2925.5cd377fb.js


Plik diff jest za duży
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/js/3419.10e0f937.js


Plik diff jest za duży
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/js/3792.8789399f.js


Plik diff jest za duży
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/js/4521.eb96de03.js


Plik diff jest za duży
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/js/4669.2583c75d.js


Plik diff jest za duży
+ 0 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/js/5306.63667a2b.js


Plik diff jest za duży
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/workark/static/js/5306.702e9e80.js


virgo.wzfrontend/src/main/resources/static/workark/static/js/5387.2122d86b.js → virgo.wzfrontend/src/main/resources/static/workark/static/js/5387.5db08259.js


Plik diff jest za duży
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/workark/static/js/5769.9df8b1bb.js


Plik diff jest za duży
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/js/6466.16ea1981.js


Plik diff jest za duży
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/js/6636.4a93c843.js


Plik diff jest za duży
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/js/7218.6e08e2ef.js


Plik diff jest za duży
+ 0 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/js/7375.ebc6b4c4.js


Plik diff jest za duży
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/js/7390.4e354b61.js


Plik diff jest za duży
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/workark/static/js/742.9c4006a8.js


Plik diff jest za duży
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/js/7635.975467a8.js


Plik diff jest za duży
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/js/7817.c20acf44.js


Plik diff jest za duży
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/workark/static/js/8935.56cb88d4.js


Plik diff jest za duży
+ 0 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/js/8935.993b2415.js


Plik diff jest za duży
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/js/9021.ee78c1f5.js


Plik diff jest za duży
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/js/9607.472ef290.js


Plik diff jest za duży
+ 0 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/js/9615.078404a5.js


Plik diff jest za duży
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/workark/static/js/9615.49340338.js


Plik diff jest za duży
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/workark/static/js/9874.099b4c38.js


Plik diff jest za duży
+ 2 - 2
virgo.wzfrontend/src/main/resources/static/workark/static/js/app.45b1ab30.js


+ 144 - 0
virgo.wzfrontend/workark/src/api/oa.js

@@ -0,0 +1,144 @@
+import request from '@/axios'
+/* 
+ * 获取会议场所
+ * 
+ */
+export function getMeetingPlaceListByQuery(data) {
+	return request({
+		url: `/api/meetingMinutes/place/query`,
+		method: 'post',
+		data: data
+	})
+}
+/* 
+ * 新增会议场所
+ * 
+ */
+export function insertMeetingPlace(data) {
+	return request({
+		url: `/api/meetingMinutes/place`,
+		method: 'post',
+		data: data
+	})
+}
+/* 
+ * 更新会议场所
+ * 
+ */
+export function updateMeetingPlace(data) {
+	return request({
+		url: `/api/meetingMinutes/place`,
+		method: 'put',
+		data: data
+	})
+}
+/* 
+ * 删除会议场所
+ * 
+ * 
+ */
+export function deleteMeetingPlaceById(id) {
+	return request({
+		url: `/api/meetingMinutes/place/${id}`,
+		method: 'delete'
+	})
+}
+/* 
+ * 获取会议类别
+ * 
+ */
+export function getMeetingTypeListByQuery(data) {
+	return request({
+		url: `/api/meetingMinutes/type/query`,
+		method: 'post',
+		data: data
+	})
+}
+/* 
+ * 新增会议类别
+ * 
+ */
+export function insertMeetingType(data) {
+	return request({
+		url: `/api/meetingMinutes/type`,
+		method: 'post',
+		data: data
+	})
+}
+/* 
+ * 更新会议类别
+ * 
+ */
+export function updateMeetingType(data) {
+	return request({
+		url: `/api/meetingMinutes/type`,
+		method: 'put',
+		data: data
+	})
+}
+/* 
+ * 删除会议类别
+ * 
+ * 
+ */
+export function deleteMeetingTypeById(id) {
+	return request({
+		url: `/api/meetingMinutes/type/${id}`,
+		method: 'delete'
+	})
+}
+/* 
+ * 获取会议列表
+ * 
+ */
+export function getMeetingListByQuery(data) {
+	return request({
+		url: `/api/meetingMinutes/${data.currPage}/${data.pageSize}`,
+		method: 'post',
+		data: data
+	})
+}
+/* 
+ * 新增会议
+ * 
+ */
+export function insertMeeting(data) {
+	return request({
+		url: `/api/meetingMinutes`,
+		method: 'post',
+		data: data
+	})
+}
+/* 
+ * 更新会议
+ * 
+ */
+export function updateMeeting(data) {
+	return request({
+		url: `/api/meetingMinutes`,
+		method: 'put',
+		data: data
+	})
+}
+/* 
+ * 获取会议详情
+ * 
+ * 
+ */
+export function getMeetingDetailById(id) {
+	return request({
+		url: `/api/meetingMinutes/${id}`,
+		method: 'get'
+	})
+}
+/* 
+ * 删除会议
+ * 
+ * 
+ */
+export function deleteMeetingById(id) {
+	return request({
+		url: `/api/meetingMinutes/${id}`,
+		method: 'delete'
+	})
+}

+ 140 - 0
virgo.wzfrontend/workark/src/components/work/oa/meeting/content.vue

@@ -0,0 +1,140 @@
+<template>
+	<div class="custom-data">
+		<table border="1" cellspacing="0" cellpadding="0">
+			<tr class="th-title">
+				<th style="width: 50px;">序号</th>
+				<th>会议内容</th>
+			</tr>
+			<tr v-for="(item,index) in listData" :key="index">
+				<td>
+					{{index+1}}
+				</td>
+				<td>
+					<div class="td-input">
+						<el-input v-model="item.value"></el-input>
+						<div class="td-icon" @click="deleteRow(index)">
+							<i class="iconfont huifont-guanbi"></i>
+						</div>
+					</div>
+				</td>
+			</tr>
+			<tr>
+				<td colspan="2">
+					<div class="insert-icon color-primary" @click="insertRow()">
+						<i class="iconfont huifont-xinzeng"></i>
+						新增
+					</div>
+				</td>
+			</tr>
+		</table>
+	</div>
+</template>
+
+<script>
+	export default {
+		props: {
+			list: {
+				type: Array,
+				default: () => {
+					return []
+				}
+			},
+		},
+		data() {
+			return {
+				listData: []
+			}
+		},
+		mounted() {
+			this.listData = this.list;
+		},
+		methods: {
+			insertRow() {
+				this.listData.push({
+					value: ''
+				});
+			},
+			deleteRow(index) {
+				this.$confirm('确定要删除该项内容?', () => {
+					this.listData.splice(index, 1);
+				});
+			}
+		},
+		watch: {
+			list() {
+				this.listData = this.list;
+			}
+		},
+	}
+</script>
+
+<style lang="scss">
+	.custom-data {
+		table {
+			width: 100%;
+			border: 1px solid $--border-color-light;
+			border-collapse: collapse;
+			table-layout: fixed;
+		}
+
+		table th {
+			padding: 5px 0;
+			border: 1px solid $--border-color-light;
+			font-weight: 500;
+		}
+
+
+		table td {
+			border: 1px solid $--border-color-light;
+			padding: 6px 20px;
+		}
+
+		.insert-icon {
+			text-align: center;
+			cursor: pointer;
+			border-radius: 2px;
+			border: 1px dashed $--border-color-light;
+			line-height: 26px;
+			font-size: 13px;
+
+			.huifont-xinzeng {
+				font-size: 13px;
+			}
+		}
+
+		.td-input {
+			display: flex;
+			align-items: center;
+
+			.el-input {
+				flex: 1;
+				width: 0;
+				overflow: hidden;
+			}
+
+			.td-icon {
+				width: 20px;
+				height: 20px;
+				background: #171F2D;
+				border-radius: 10px;
+				border: 1px solid #8596B0;
+				opacity: 0.6;
+				text-align: center;
+				line-height: 16px;
+				margin-left: 12px;
+				color: #8596B0;
+				cursor: pointer;
+			}
+
+			.td-icon:hover {
+				color: $--color-danger;
+				border-color: $--color-danger;
+			}
+
+			.iconfont {
+				font-size: 10px;
+				margin-left: 1px;
+			}
+		}
+	}
+</style>

+ 99 - 0
virgo.wzfrontend/workark/src/components/work/oa/meeting/detail.vue

@@ -0,0 +1,99 @@
+<template>
+	<div class="hui-detail">
+		<div class="hui-detail-box">
+			<div class="hui-detail-title">基础信息</div>
+			<div class="hui-detail-content">
+				<div class="hui-detail-item">
+					<div class="hui-detail-label">会议名称</div>
+					<div class="hui-detail-value">{{detail.name}}</div>
+				</div>
+				<div class="hui-detail-item">
+					<div class="hui-detail-label">会议日期</div>
+					<div class="hui-detail-value">{{detail.date}}</div>
+				</div>
+				<div class="hui-detail-item">
+					<div class="hui-detail-label">会议类型</div>
+					<div class="hui-detail-value">{{detail.typeName}}</div>
+				</div>
+				<div class="hui-detail-item">
+					<div class="hui-detail-label">会议时长</div>
+					<div class="hui-detail-value">{{detail.duration}}</div>
+				</div>
+				<div class="hui-detail-item">
+					<div class="hui-detail-label">发起人</div>
+					<div class="hui-detail-value">{{detail.userName}}</div>
+				</div>
+				<div class="hui-detail-item">
+					<div class="hui-detail-label">会议地点</div>
+					<div class="hui-detail-value">{{detail.placeName}}</div>
+				</div>
+				<div class="hui-detail-item">
+					<div class="hui-detail-label">会议纪要</div>
+					<div class="hui-detail-value">{{detail.meetingMinutes}}</div>
+				</div>
+			</div>
+		</div>
+		<div class="hui-detail-box" v-if="detail.joinUserList.length > 0">
+			<div class="hui-detail-title">参与人员</div>
+			<div class="hui-detail-content hui-detail-image">
+				<cc ref="cc" type="look" :ccList="detail.joinUserList" label="会议人员"></cc>
+			</div>
+		</div>
+		<div class="hui-detail-box" v-if="detail.content && detail.content != '[]'">
+			<div class="hui-detail-title">会议内容</div>
+			<div class="hui-detail-content">
+				<div class="hui-detail-item" v-for="(item,index) in JSON.parse(detail.content)">
+					<div class="hui-detail-value">{{index+1}}、{{item.value}}</div>
+				</div>
+			</div>
+		</div>
+		<div class="hui-detail-box">
+			<div class="hui-detail-title">会议附件</div>
+			<div class="hui-detail-content hui-detail-image">
+				<upload ref="upload" :list="detail.attachment ? JSON.parse(detail.attachment) : []" type="preview">
+				</upload>
+			</div>
+		</div>
+	</div>
+</template>
+
+<script>
+	import {
+		getMeetingDetailById
+	} from '@/api/oa'
+	import cc from '@/components/common/cc'
+	import upload from '@/components/common/upload'
+	export default {
+		props: ['detailId'],
+		data() {
+			return {
+				detail: {
+					name: '',
+					duration: '',
+					placeId: '',
+					typeId: '',
+					joinUserList: []
+				}
+			}
+		},
+		mounted() {
+			if (this.detailId) this.init();
+		},
+		methods: {
+			init() {
+				getMeetingDetailById(this.detailId).then(res => {
+					if (res.state) {
+						this.detail = res.data;
+					}
+				})
+			},
+		},
+		components: {
+			cc,
+			upload
+		}
+	}
+</script>
+<style lang="scss">
+
+</style>

+ 148 - 0
virgo.wzfrontend/workark/src/components/work/oa/meeting/edit.vue

@@ -0,0 +1,148 @@
+<template>
+	<div class="hui-flex hui-dialog">
+		<div class="hui-flex-box hui-dialog-content">
+			<el-form ref="form" label-position="top" :model="form">
+				<el-form-item label="会议名称" prop="name" :rules="[{required: true, message: '请输入会议名称'}]">
+					<el-input type="text" v-model="form.name" placeholder="请输入会议名称"></el-input>
+				</el-form-item>
+				<el-form-item label="会议日期" prop="date" :rules="[{required: true, message: '请选择会议日期'}]">
+					<el-date-picker v-model="form.date" value-format="yyyy-MM-dd" type="date" placeholder="请选择会议日期">
+					</el-date-picker>
+				</el-form-item>
+				<el-form-item label="会议时长" prop="duration" :rules="[{required: true, message: '请输入会议时长'}]">
+					<el-input type="text" v-model="form.duration" placeholder="请输入会议时长"></el-input>
+				</el-form-item>
+				<el-form-item label="会议类型" prop="typeId" :rules="[{required: true, message: '请选择会议类型'}]">
+					<el-select v-model="form.typeId" placeholder="请选择会议类型">
+						<el-option :label="item.name" :value="item.id" v-for="(item,index) in meetingType" :key="index">
+						</el-option>
+					</el-select>
+				</el-form-item>
+				<el-form-item label="会议场所" prop="placeId" :rules="[{required: true, message: '请选择会议场所'}]">
+					<el-select v-model="form.placeId" placeholder="请选择会议场所">
+						<el-option :label="item.name" :value="item.id" v-for="(item,index) in meetingPlace"
+							:key="index">
+						</el-option>
+					</el-select>
+				</el-form-item>
+				<el-form-item label="参与人员" class="hui-textarea">
+					<cc ref="cc" type="insert" :ccList="ccList" label="会议人员"></cc>
+				</el-form-item>
+				<el-form-item label="会议内容" class="hui-textarea">
+					<meeting-content ref="content" :list="contentList"></meeting-content>
+				</el-form-item>
+				<el-form-item label="会议纪要" class="hui-textarea">
+					<el-input type="textarea" v-model="form.meetingMinutes" placeholder="请输入会议纪要" resize="none">
+					</el-input>
+				</el-form-item>
+				<el-form-item label="上传附件" class="hui-textarea">
+					<upload ref="upload" :list="responsibility" type="insert" text="上传附件" accept="*"></upload>
+				</el-form-item>
+			</el-form>
+		</div>
+		<div class="hui-dialog-submit">
+			<el-button size="small" @click="$emit('callback')">取 消</el-button>
+			<el-button size="small" type="primary" @click="submit" :loading="loading">保 存</el-button>
+		</div>
+	</div>
+</template>
+
+<script>
+	import {
+		getMeetingPlaceListByQuery,
+		getMeetingTypeListByQuery,
+		insertMeeting,
+		updateMeeting,
+		getMeetingDetailById
+	} from '@/api/oa'
+	import upload from '@/components/common/upload'
+	import cc from '@/components/common/cc'
+	import meetingContent from '@/components/work/oa/meeting/content'
+	export default {
+		props: ['isUpdate', 'detailId', 'type'],
+		data() {
+			return {
+				form: {
+					name: '',
+					duration: '',
+					placeId: '',
+					typeId: '',
+					meetingMinutes: ''
+				},
+				responsibility: [],
+				meetingPlace: [],
+				meetingType: [],
+				ccList: [],
+				contentList: [],
+				loading: false
+			}
+		},
+		mounted() {
+			this.initParams();
+			if (!this.isUpdate) {
+				this.form['organizationId'] = this.$store.getters.organization.id;
+				this.form['projectId'] = this.$store.getters.project.id;
+				this.form['type'] = this.type;
+				this.form['userId'] = this.$store.getters.user.userId;
+			} else {
+				getMeetingDetailById(this.detailId).then(res => {
+					if (res.state) {
+						this.form = res.data;
+						if (this.form.attachment) this.responsibility = JSON.parse(this.form.attachment);
+						if (this.form.content) this.contentList = JSON.parse(this.form.content);
+						this.ccList = this.form.joinUserList;
+					}
+				})
+			}
+		},
+		methods: {
+			initParams() {
+				let data = {
+					organizationId: this.$store.getters.organization.id,
+					projectId: this.$store.getters.project.id,
+				};
+				const successFunc = (res, type) => {
+					if (res.state) {
+						this[type] = res.data;
+					}
+				}
+				getMeetingPlaceListByQuery(data).then(res => successFunc(res, 'meetingPlace'));
+				getMeetingTypeListByQuery(data).then(res => successFunc(res, 'meetingType'));
+			},
+			submit() {
+				this.loading = true;
+				this.$refs.form.validate((valid) => {
+					if (valid) {
+						let postData = JSON.parse(JSON.stringify(this.form));
+						postData['attachment'] = JSON.stringify(this.$refs.upload.fileList);
+						postData['content'] = JSON.stringify(this.$refs.content.listData);
+						if (this.$refs.cc.list.length > 0) postData['joinUserIds'] = this.$refs.cc.list.map(node =>
+							node.id).join(',');
+						if (this.isUpdate) {
+							updateMeeting(postData).then(this.successFunc);
+						} else {
+							insertMeeting(postData).then(this.successFunc);
+						}
+					} else {
+						this.loading = false;
+						return false;
+					}
+				});
+			},
+			successFunc(res) {
+				this.loading = false;
+				if (res.state) {
+					this.$message.success('操作成功');
+					this.$emit('callback', 'init');
+				}
+			}
+		},
+		components: {
+			upload,
+			cc,
+			meetingContent
+		},
+	}
+</script>
+
+<style lang="scss"></style>

+ 16 - 0
virgo.wzfrontend/workark/src/router/modules/work/oa.js

@@ -0,0 +1,16 @@
+const organization = [{
+	path: 'oa/meeting',
+	component: () => import('@/views/work/oa/meeting/list'),
+	name: '会议纪要',
+	meta: {
+		title: '会议纪要'
+	}
+},{
+	path: 'oa/meeting/set',
+	component: () => import('@/views/work/oa/meeting/set'),
+	name: '会议设置',
+	meta: {
+		title: '会议设置'
+	}
+}]
+export default organization;

+ 161 - 0
virgo.wzfrontend/workark/src/views/work/oa/meeting/list.vue

@@ -0,0 +1,161 @@
+<template>
+	<div class="hui-flex hui-content border-box">
+		<div class="hui-flex">
+			<div class="hui-content-title">
+				<div class="hui-title-item active">会议纪要</div>
+			</div>
+			<div class="hui-flex-box hui-flex hui-table">
+				<div class="hui-content-insert">
+					<el-button v-permission="'/work/oa/meeting/add'" type="primary" size="small" @click="insert">
+						新增会议
+					</el-button>
+				</div>
+				<div class="hui-flex-box">
+					<el-table :data="tableData" row-key="id" height="100%" v-loading="loading">
+						<el-table-column label="序号" width="50">
+							<template slot-scope="scope">
+								<div style="text-align: center;">{{scope.$index + 1}}</div>
+							</template>
+						</el-table-column>
+						<el-table-column label="会议名称" prop="name"></el-table-column>
+						<el-table-column label="会议时间" prop="date"></el-table-column>
+						<el-table-column label="会议类型" prop="typeName"></el-table-column>
+						<el-table-column label="发起人" prop="userName"></el-table-column>
+						<el-table-column label="会议地点" prop="placeName"></el-table-column>
+						<el-table-column label="会议纪要" prop="meetingMinutes"></el-table-column>
+						<el-table-column label="操作" width="150">
+							<template slot-scope="scope">
+								<div class="hui-table-operation">
+									<span class="table-operation" v-permission="'/work/oa/meeting/detail'"
+										@click="detailItem(scope.row)">
+										详情
+									</span>
+									<span class="table-operation" v-permission="'/work/oa/meeting/update'"
+										@click="updateItem(scope.row)">
+										编辑
+									</span>
+									<span class="table-operation" v-permission="'/work/oa/meeting/delete'"
+										@click="deleteItem(scope.row)">
+										删除
+									</span>
+								</div>
+							</template>
+						</el-table-column>
+						<template slot="empty">
+							<el-empty description="暂无数据"></el-empty>
+						</template>
+					</el-table>
+				</div>
+				<div class="hui-content-pagination">
+					<el-pagination :page-size="pageSize" :pager-count="9" layout="prev, pager, next" :total="totalCount"
+						@current-change="currentChange" background>
+					</el-pagination>
+				</div>
+			</div>
+		</div>
+		<el-dialog :close-on-click-modal="false" :title="isUpdate?'编辑':'新增'" :visible.sync="visible" width="900px"
+			:append-to-body="true">
+			<edit v-if="visible" @callback="callback" :isUpdate="isUpdate" :detailId="detailId" :type="type"></edit>
+		</el-dialog>
+		<el-drawer title="会议详情" :visible.sync="drawer" :size="400" :append-to-body="true">
+			<detail v-if="drawer" :detailId="detailId" @callback="callback"></detail>
+		</el-drawer>
+	</div>
+</template>
+
+<script>
+	import {
+		getMeetingListByQuery,
+		deleteMeetingById
+	} from '@/api/oa'
+	import edit from '@/components/work/oa/meeting/edit'
+	import detail from '@/components/work/oa/meeting/detail'
+	export default {
+		data() {
+			return {
+				tableData: [],
+				currPage: 1,
+				pageSize: 10,
+				totalCount: 0,
+				filterOption: {},
+				type: 1,
+				isUpdate: false,
+				visible: false,
+				detailId: '',
+				drawer: false,
+				loading: false
+			}
+		},
+		mounted() {
+			this.init();
+		},
+		methods: {
+			init() {
+				if (!this.auth('/work/oa/meeting/list')) return;
+				this.loading = true;
+				let postData = {
+					currPage: this.currPage,
+					pageSize: this.pageSize,
+					organizationId: this.$store.getters.organization.id,
+					projectId: this.$store.getters.project.id,
+					type: this.type
+				}
+				postData = Object.assign(postData, this.filterOption);
+				getMeetingListByQuery(postData).then(res => {
+					if (res.state) {
+						this.tableData = res.data.dataList;
+						this.totalCount = res.data.totalCount;
+					}
+					this.loading = false;
+				})
+			},
+			filterInit(option) {
+				this.filterOption = option;
+				this.currPage = 1;
+				this.init();
+			},
+			insert() {
+				this.detailId = '';
+				this.isUpdate = false;
+				this.visible = true;
+			},
+			updateItem(item) {
+				this.detailId = item.id;
+				this.isUpdate = true;
+				this.visible = true;
+			},
+			detailItem(item) {
+				this.detailId = item.id;
+				this.drawer = true;
+			},
+			currentChange(currPage) {
+				this.currPage = currPage;
+				this.init();
+			},
+			deleteItem(item) {
+				this.$confirm('确定要删除该会议记录?', () => {
+					deleteMeetingById(item.id).then(res => {
+						if (res.state) {
+							this.$message({
+								type: 'success',
+								message: '操作成功'
+							})
+							this.init();
+						}
+					})
+				});
+			},
+			callback(type) {
+				if (type === 'init') this.init();
+				this.visible = false;
+			}
+		},
+		components: {
+			edit,
+			detail
+		},
+	}
+</script>
+
+<style>
+</style>

+ 233 - 0
virgo.wzfrontend/workark/src/views/work/oa/meeting/set.vue

@@ -0,0 +1,233 @@
+<template>
+	<div class="meeting-set">
+		<div class="meeting-item hui-flex hui-content border-box">
+			<div class="hui-content-title">
+				<div class="hui-title-item active">会议场所</div>
+			</div>
+			<div class="hui-flex-box">
+				<div class="tag">
+					<div class="target-item" v-for="item in placeList" :key="item.id">
+						<span class="label">{{item.name}}</span>
+						<i class="iconfont huifont-bianji" v-permission="'/work/oa/meeting/set/place/update'"
+							@click.stop="updateFunc(1,item)"></i>
+						<i class="iconfont huifont-guanbi" v-permission="'/work/oa/meeting/set/place/delete'"
+							@click.stop="deleteFunc(1,item)"></i>
+					</div>
+					<div class="target-item target-item-insert" v-permission="'/work/oa/meeting/set/place/add'"
+						@click="insertFunc(1)">
+						<i class="iconfont huifont-xinzeng"></i>
+						<span class="label">新增场所</span>
+					</div>
+				</div>
+			</div>
+		</div>
+		<div class="meeting-line"></div>
+		<div class="meeting-item hui-flex hui-content border-box">
+			<div class="hui-content-title">
+				<div class="hui-title-item active">会议类型</div>
+			</div>
+			<div class="hui-flex-box">
+				<div class="tag">
+					<div class="target-item" v-for="item in typeList" :key="item.id">
+						<span class="label">{{item.name}}</span>
+						<i class="iconfont huifont-bianji" v-permission="'/work/oa/meeting/set/type/update'"
+							@click.stop="updateFunc(2,item)"></i>
+						<i class="iconfont huifont-guanbi" v-permission="'/work/oa/meeting/set/type/delete'"
+							@click.stop="deleteFunc(2,item)"></i>
+					</div>
+					<div class="target-item target-item-insert" v-permission="'/work/oa/meeting/set/type/add'"
+						@click="insertFunc(2)">
+						<i class="iconfont huifont-xinzeng"></i>
+						<span class="label">新增类型</span>
+					</div>
+				</div>
+			</div>
+		</div>
+	</div>
+</template>
+
+<script>
+	import {
+		getMeetingPlaceListByQuery,
+		insertMeetingPlace,
+		updateMeetingPlace,
+		deleteMeetingPlaceById,
+		getMeetingTypeListByQuery,
+		insertMeetingType,
+		updateMeetingType,
+		deleteMeetingTypeById
+	} from '@/api/oa'
+	export default {
+		data() {
+			return {
+				placeList: [],
+				typeList: []
+			}
+		},
+		mounted() {
+			this.initPlaceList();
+			this.initTypeList();
+		},
+		methods: {
+			initPlaceList() {
+				if (!this.auth('/work/oa/meeting/set/place/list')) return;
+				getMeetingPlaceListByQuery({
+					organizationId: this.$store.getters.organization.id,
+					projectId: this.$store.getters.project.id
+				}).then(res => {
+					if (res.state) {
+						this.placeList = res.data;
+					}
+				})
+			},
+			initTypeList() {
+				if (!this.auth('/work/oa/meeting/set/type/list')) return;
+				getMeetingTypeListByQuery({
+					organizationId: this.$store.getters.organization.id,
+					projectId: this.$store.getters.project.id
+				}).then(res => {
+					if (res.state) {
+						this.typeList = res.data;
+					}
+				})
+			},
+			insertFunc(type) {
+				let msg = type === 1 ? '场所名称' : '类型名称';
+				this.$prompt(`请输入${msg}`, 'WorkArk', {
+					confirmButtonText: '确 定',
+					cancelButtonClass: 'cancel',
+					confirmButtonClass: 'confirm',
+					cancelButtonText: '取 消',
+					inputPattern: /\S/,
+					inputErrorMessage: `请输入${msg}`
+				}).then(({
+					value
+				}) => {
+					let postData = {
+						organizationId: this.$store.getters.organization.id,
+						projectId: this.$store.getters.project.id
+					}
+					postData['name'] = value;
+					if (type === 1) {
+						insertMeetingPlace(postData).then(res => this.successFunc(res, type))
+					} else {
+						insertMeetingType(postData).then(res => this.successFunc(res, type))
+					}
+				}).catch(() => {});
+			},
+			updateFunc(type, item) {
+				let msg = type === 1 ? '场所名称' : '类型名称';
+				this.$prompt(`请输入${msg}`, 'WoraArk', {
+					confirmButtonText: '确 定',
+					cancelButtonClass: 'cancel',
+					confirmButtonClass: 'confirm',
+					cancelButtonText: '取 消',
+					inputPattern: /\S/,
+					inputErrorMessage: `请输入${msg}`,
+					inputValue: item.name
+				}).then(({
+					value
+				}) => {
+					if (type === 1) {
+						updateMeetingPlace({
+							id: item.id,
+							name: value
+						}).then(res => this.successFunc(res, type))
+					} else {
+						updateMeetingType({
+							id: item.id,
+							name: value
+						}).then(res => this.successFunc(res, type))
+					}
+				}).catch(() => {});
+			},
+			deleteFunc(type, item) {
+				let msg = type === 1 ? '场所名称' : '类型名称';
+				this.$confirm(`确定要删除该${msg}?`, () => {
+					if (type === 1) {
+						deleteMeetingPlaceById(item.id).then(res => this.successFunc(res, type))
+					} else {
+						deleteMeetingTypeById(item.id).then(res => this.successFunc(res, type))
+					}
+				});
+			},
+			successFunc(res, type) {
+				if (res.state) {
+					type === 1 ? this.initPlaceList() : this.initTypeList();
+					this.$message.success('操作成功');
+				}
+			}
+		},
+	}
+</script>
+
+<style lang="scss">
+	.meeting-set {
+		width: 100%;
+		height: 100%;
+		display: flex;
+
+		.meeting-item {
+			flex: 1;
+			height: 100%;
+		}
+
+		.hui-flex-box {
+			padding: 10px;
+		}
+
+		.meeting-line {
+			width: 15px;
+			height: 100%;
+			background: $--background-color-base;
+		}
+
+		.tag {
+			display: flex;
+			flex-wrap: wrap;
+
+			.target-item {
+				display: flex;
+				height: 28px;
+				align-items: center;
+				margin: 5px 0;
+				margin-right: 15px;
+				background: $--color-primary;
+				color: #fff;
+				border-radius: 15px;
+				padding: 0 15px;
+
+				.label {
+					font-size: 12px;
+				}
+
+				.iconfont {
+					margin-left: 10px;
+					font-size: 12px;
+					cursor: pointer;
+				}
+
+				.huifont-bianji {
+					font-size: 18px;
+				}
+			}
+
+			.target-item-insert {
+				cursor: pointer;
+				background: transparent;
+				border: 1px solid $--border-color-base;
+				color: $--color-text-primary;
+
+				.iconfont {
+					margin-left: 0;
+					margin-right: 10px;
+				}
+			}
+
+			.target-item-insert:hover {
+				border-color: $--color-primary;
+				color: $--color-primary;
+			}
+		}
+	}
+</style>

+ 7 - 2
virgo.wzfrontend/workark/src/views/work/system/main.vue

@@ -45,8 +45,9 @@
 			<edit v-if="dialogVisible && logType === 1" :updateData="updateData" ref="mainForm"
 				@callback="dialogVisible = false" @sure="sure">
 			</edit>
-			<role v-if="dialogVisible && (logType === 2 || logType === 3)" @callback="dialogVisible = false"
-				:type="logType" :menuData="menuData"></role>
+			<role v-if="dialogVisible && (logType === 2 || logType === 3)" @callback="callback" :type="logType"
+				:menuData="menuData">
+			</role>
 		</el-dialog>
 	</div>
 </template>
@@ -271,6 +272,10 @@
 				if (this.type == 'insert') form['id'] = this.tableId;
 				return form;
 			},
+			callback(type) {
+				this.dialogVisible = false;
+				if (type === 'init') this.init();
+			},
 			successFunc(res) {
 				if (res.state) {
 					this.$message({