whx 6 månader sedan
förälder
incheckning
5da238b21c

+ 412 - 410
virgo.wzfrontend/console/src/components/document/editor.vue

@@ -1,411 +1,413 @@
-<template>
-	<div class="flow-document hui-flex">
-		<div class="hui-flex-box">
-			<div id="html" class="html" ref="html" v-html="html" @click="selectClick"></div>
-		</div>
-		<div class="hui-dialog-submit">
-			<el-button size="medium" @click="$emit('close')">取 消</el-button>
-			<el-button size="medium" type="primary" @click="submit">保 存</el-button>
-		</div>
-		<el-dialog :close-on-click-modal="false" title="选择日期" :visible.sync="timeDialog" :append-to-body="true" width="500px">
-			<div class="hui-flex">
-				<div class="hui-flex-box">
-					<date ref="dateTime"></date>
-				</div>
-				<div class="hui-dialog-submit">
-					<el-button size="medium" type="primary" @click="selectSuccess('time')">确 定</el-button>
-					<el-button size="medium" @click="timeDialog = false">取 消</el-button>
-				</div>
-			</div>
-		</el-dialog>
-		<el-dialog :close-on-click-modal="false" title="选择内容" :visible.sync="selectVisible" width="30%" :append-to-body="true">
-			<div class="hui-flex">
-				<div class="hui-flex-box">
-					<el-radio-group v-model="selectVal">
-						<div class="select-item" v-for="(value, name, index) in selectItem" :key="index">
-							<el-radio :label="value">{{ value }}</el-radio>
-						</div>
-					</el-radio-group>
-				</div>
-				<div class="hui-dialog-submit">
-					<el-button size="medium" @click="selectVisible = false">取 消</el-button>
-					<el-button size="medium" type="primary" @click="selectSuccess('select')">确 定</el-button>
-				</div>
-			</div>
-		</el-dialog>
-		<el-dialog :close-on-click-modal="false" title="选择公章" :visible.sync="dialogVisibles" width="600px" :append-to-body="true">
-			<div class="hui-flex hui-dialog">
-				<div class="hui-flex-box hui-dialog-content">
-					<div class="no-tips" v-if="sealData.length == 0">暂未添加公章</div>
-					<el-radio v-else v-model="sealVal" v-for="item in sealData" :key="item.id" :label="item.id" border
-						style="margin: 10px;">
-						{{ item.name }}
-					</el-radio>
-				</div>
-				<div class="hui-dialog-submit">
-					<el-button size="medium" @click="dialogVisibles = false">取 消</el-button>
-					<el-button size="medium" type="primary" @click="selectSeal">确 定</el-button>
-				</div>
-			</div>
-		</el-dialog>
-		<el-upload ref="upload" :action="action" name="uploadFile" style="position: absolute;z-index: -1;opacity: 0;"
-			:headers="headers" :on-success="successFile" :show-file-list="false">
-			<el-button slot="trigger" size="small" type="primary" ref="imgUpload">上传文件</el-button>
-		</el-upload>
-	</div>
-</template>
-
-<script>
-	import {
-		getDocumentById,
-		getDocumentTemplateById,
-		createDocument,
-		insertDocumentData,
-		getSealRegisterKey,
-		getRetrievers,
-	} from '@/httpApi/contract';
-	import {
-		getSealList,
-		requestSeal,
-		getSealDetailById,
-		getRequestSealDetail
-	} from '@/httpApi/organization';
-	import $ from 'jquery';
-	import {
-		constData
-	} from '@/uitls/index.js';
-	import {
-		createLogger
-	} from 'vuex';
-	// import verifyQr from '@/components/verifyQr';
-	export default {
-		props: ['documentId', 'templateId'],
-		data() {
-			return {
-				html: '', //html
-				changeSelect: [], //选择项
-				timeDialog: false, //选择日期是否显示
-				nowElem: '', //选择时点击的节点
-				selectVisible: false, //选择内容是否显示
-				selectVal: '', //选中的内容
-				selectItem: {}, //选择的数据
-				selectData: {}, //有极选项总数据
-				contextData: {}, //有极拉取数据
-				userInfo: {}, //登录人信息
-				submitShow: false, //是否显示保存按钮
-				hasData: false, //是否为编辑文档
-				sealData: [], //印章数据
-				sealDomId: '', //印章存放节点的id
-				dialogVisibles: false, //是否选择印章
-				sealVal: 1, //当前选择的印章
-				initIndex: 1, //初始化文档
-				organized: {
-					executionRecordList: 10, //施工方意见
-					supervisionRecordList: 4, //监理单位意见
-					constructionRecordList: 3, //建设单位意见
-					designRecordList: 2, //设计单位意见
-					prospectedRecordList: 5, //勘察单位意见
-					governmentRecordList: 6, //政府单位
-					supervisorRecordList: 4 //监理(建设)单位验收记录(监理单位验收记录,表中)
-				},
-				platformType: '1',
-				action: '',
-				headers: {
-					token: ''
-				},
-				copyImage: {}
-			};
-		},
-		created() {
-			this.$nextTick(() => {
-				this.userInfo = this.$store.getters.user;
-				this.contextData = this.$store.getters.document;
-				if (this.templateId) return this.initTemplate(this.templateId, [], []);
-				if (this.documentId) this.initDocument();
-			})
-		},
-		methods: {
-			initTemplate(templateId, elementData, sealData) {
-				getDocumentTemplateById(templateId).then(res => {
-					if (res.state) {
-						this.html = res.data.html;
-						this.templateName = res.data.name;
-						this.renderTamplate(elementData, sealData);
-					}
-				})
-			},
-			initDocument() {
-				getDocumentById(this.documentId).then(res => {
-					if (res.state) {
-						this.initTemplate(res.data.documentTemplateId, res.data.elementDataList, res.data
-							.sealUsageList);
-						this.documentSealRegister(res.data.id);
-					}
-				})
-			},
-			successFile(data, file, type) {
-				//上传头像成功
-				let _self = this;
-				if (data.state) {
-					_self.copyImage.dom.innerHTML = '<img id="' + _self.copyImage.domId +
-						'" class="copy-img copyImage" src="' + data
-						.data.node.url + '"/>'
-				}
-			},
-			documentSealRegister(documentId) {
-				getSealRegisterKey(documentId).then(res => {
-					if (res.state) {
-						res.data.forEach(item => {
-							$('#' + item.keyWord).css('position', 'relative');
-							$('#' + item.keyWord).html(
-								'<img id="' +
-								item.keyWord +
-								'" class="seal-img" src="' +
-								(item.fileNode.node.url ||
-									'https://file-node.oss-cn-shanghai.aliyuncs.com/youji/8b726641d0cc45fe91b5e59e4ea450c6'
-								) +
-								'"/>'
-							);
-						});
-					}
-				});
-			},
-			renderTamplate(elementDataList, sealUsageList) {
-				//整合模板
-				this.$nextTick(() => {
-					let documentElement = $('.documentElement');
-					if (elementDataList.length > 0) this.renderDocument(elementDataList);
-					for (let i = 0; i < documentElement.length; i++) {
-						let elem = documentElement[i];
-						let inputtype = $(elem).attr('inputtype') == undefined ? '' : $(elem).attr(
-							'inputtype');
-						let updatetype = inputtype.replace('@', '');
-						$(elem).attr('updatetype', updatetype);
-						this.domRender(updatetype, elem, elem.id);
-					}
-					if (sealUsageList) this.filterSeal(sealUsageList);
-					//申请印章
-					let _self = this;
-					$('.sureSeal').click(function() {
-						let _this = this;
-						_self.sealDomId = $(_this).parent()[0].id;
-						getSealList(_self.$store.getters.organization.id).then(res => {
-							if (res.state) {
-								_self.sealData = res.data;
-							}
-						})
-						_self.dialogVisibles = true;
-					});
-				});
-			},
-			domRender(type, elem, id) {
-				switch (type) {
-					case 'context':
-						if (elem.innerHTML) return;
-						$(elem).text(this.contextData[id] || '')
-						break;
-					case 'sign':
-						elem.innerHTML =
-							'<button class="sureAutograph el-button el-button--default el-button--medium">确认签名</button>';
-						break;
-					case 'seal':
-						if (elem.innerHTML) return;
-						elem.innerHTML = '<span class="sureSeal"">申请盖章</span>';
-						break;
-					default:
-						break;
-				}
-			},
-			renderDocument(data) {
-				data.forEach(item => {
-					let dataItem = JSON.parse(item.data);
-					for (let i in dataItem) {
-						for (let j in dataItem[i]) {
-							this.renderDom(i, j, dataItem[i][j]);
-						}
-					}
-				});
-			},
-			renderDom(i, j, text) {
-				switch (i) {
-					case 'seal':
-						if (text == '') return;
-						$('#' + j).addClass('seal-box');
-						$('#' + j).html('已申请印章,请等待审核');
-						break;
-					case 'sealperson':
-						break;
-					case 'sign':
-						$('#' + j + '[inputtype=' + i + ']').html('<img class="autograph" src="' + text + '">');
-						break;
-					case 'signQR':
-						$('#' + j + '[inputtype=' + i + ']').html('<img class="autograph" src="' + text + '">');
-						break;
-					case 'copyImage':
-						$('#' + j + '[inputtype=' + i + ']').html('<img  class="copy-img" src="' + text + '"/>');
-						break;
-					default:
-						if (i.indexOf('.') == -1) {
-							$('#' + j + '[inputtype=' + i + ']').text(text);
-						}
-						break;
-				}
-			},
-			filterSeal(data) {
-				//渲染印章
-				let _self = this;
-				data.forEach((item, index) => {
-					getRequestSealDetail(item.requestId).then(node => {
-						if (node.state) {
-							let data = node.data;
-							if (data.status == 1) {
-								$('#' + data.keyWord).css('position',
-									'relative');
-								getSealDetailById(data.sealId).then(item => {
-									if (item.state) {
-										$('#' + data.keyWord).html('<img id="' + data.keyWord +
-											'" class="seal-img" src="' + item.data.fileNode
-											.node.url + '"/>');
-									}
-								})
-							}
-						}
-					})
-				});
-			},
-			selectClick(event) {
-				let _self = this;
-				_self.nowElem = event.target; //当前点击的i标签
-				switch (event.target.className) {
-					case 'el-icon-arrow-down':
-						_self.selectItem = _self.selectData[_self.nowElem.id];
-						_self.selectVal = '';
-						_self.selectVisible = true;
-						break;
-					case 'el-icon-date':
-						_self.timeDialog = true;
-						break;
-					default:
-						break;
-				}
-			},
-			selectSuccess(type) {
-				let _self = this;
-				switch (type) {
-					case 'time':
-						_self.nowElem.parentNode.getElementsByClassName('documentElement')[0].innerHTML = _self.$refs
-							.dateTime.getDate();
-						_self.timeDialog = false;
-						break;
-					case 'select':
-						_self.nowElem.parentNode.getElementsByClassName('documentElement')[0].innerHTML = _self.selectVal;
-						_self.selectVisible = false;
-						break;
-					default:
-						break;
-				}
-			},
-			selectSeal() {
-				//选择印章
-				let _self = this;
-				if (_self.sealDomId == '') return;
-				let item = _self.sealData.filter(item => {
-					return item.id == _self.sealVal;
-				})[0];
-				requestSeal({
-					sealId: item.id,
-					requestUserName: _self.userInfo.name,
-					requestUserId: _self.userInfo.userId,
-					documentId: _self.documentId,
-					keyWord: _self.sealDomId,
-					projectId: _self.$store.getters.project.id
-				}).then(data => {
-					if (data.state) {
-						$('#' + _self.sealDomId).css('position', 'relative');
-						$('#' + _self.sealDomId).html('<img id="' + _self.sealDomId +
-							'" class="seal-img" src="' + item.fileNode.node.url + '"/>');
-						let documentElement = $('.documentElement');
-						let obj = constData(documentElement);
-						insertDocumentData({
-							data: JSON.stringify(obj),
-							documentId: _self.documentId,
-							userId: _self.$store.getters.user.userId
-						}).then(res => {
-							if (res.state) {
-								_self.$message.success('申请成功');
-								_self.dialogVisibles = false;
-							}
-						})
-					}
-				});
-			},
-			submit() {
-				let documentElement = $('.documentElement');
-				let obj = constData(documentElement);
-				if (this.documentId) this.updateDocument(obj);
-			},
-			updateDocument(obj) {
-				insertDocumentData({
-					data: JSON.stringify(obj),
-					documentId: this.documentId,
-					userId: this.$store.getters.user.userId
-				}).then(res => {
-					if (res.state) {
-						this.$message.success('保存成功');
-						this.$emit('close');
-					}
-				})
-			}
-		},
-		components: {}
-	};
-</script>
-
-<style lang="scss">
-	.flow-document {
-		position: relative;
-		width: 100%;
-		height: 100%;
-		overflow: auto;
-
-		&::-webkit-scrollbar-thumb {
-			background: #D9DEE6;
-		}
-
-		.html {
-			margin: 0 auto;
-			width: 900px;
-		}
-
-		.sureSeal {
-			position: relative;
-			z-index: 999;
-			padding: 5px 10px;
-			text-align: center;
-			background: rgba(97, 133, 214, 0);
-			border-radius: 2px;
-			border: 1px solid #ACADB3;
-			cursor: pointer;
-			color: #000;
-			font-size: 14px;
-			margin-bottom: 5px;
-		}
-
-		.seal-box {
-			color: $--color-red;
-			font-size: 14px;
-			margin-bottom: 5px;
-		}
-
-		.seal-img {
-			position: absolute;
-			width: 120px;
-			height: 120px;
-			z-index: 998;
-			top: 50%;
-			margin-top: -60px;
-			left: 50%;
-			margin-left: -60px;
-		}
-	}
+<template>
+	<div class="flow-document hui-flex">
+		<div class="hui-flex-box">
+			<div id="html" class="html" ref="html" v-html="html" @click="selectClick"></div>
+		</div>
+		<div class="hui-dialog-submit">
+			<el-button size="medium" @click="$emit('close')">取 消</el-button>
+			<el-button size="medium" type="primary" @click="submit">保 存</el-button>
+		</div>
+		<el-dialog :close-on-click-modal="false" title="选择日期" :visible.sync="timeDialog" :append-to-body="true"
+			width="500px">
+			<div class="hui-flex">
+				<div class="hui-flex-box">
+					<date ref="dateTime"></date>
+				</div>
+				<div class="hui-dialog-submit">
+					<el-button size="medium" type="primary" @click="selectSuccess('time')">确 定</el-button>
+					<el-button size="medium" @click="timeDialog = false">取 消</el-button>
+				</div>
+			</div>
+		</el-dialog>
+		<el-dialog :close-on-click-modal="false" title="选择内容" :visible.sync="selectVisible" width="30%"
+			:append-to-body="true">
+			<div class="hui-flex">
+				<div class="hui-flex-box">
+					<el-radio-group v-model="selectVal">
+						<div class="select-item" v-for="(value, name, index) in selectItem" :key="index">
+							<el-radio :label="value">{{ value }}</el-radio>
+						</div>
+					</el-radio-group>
+				</div>
+				<div class="hui-dialog-submit">
+					<el-button size="medium" @click="selectVisible = false">取 消</el-button>
+					<el-button size="medium" type="primary" @click="selectSuccess('select')">确 定</el-button>
+				</div>
+			</div>
+		</el-dialog>
+		<el-dialog :close-on-click-modal="false" title="选择公章" :visible.sync="dialogVisibles" width="600px"
+			:append-to-body="true">
+			<div class="hui-flex hui-dialog">
+				<div class="hui-flex-box hui-dialog-content">
+					<div class="no-tips" v-if="sealData.length == 0">暂未添加公章</div>
+					<el-radio v-else v-model="sealVal" v-for="item in sealData" :key="item.id" :label="item.id" border
+						style="margin: 10px;">
+						{{ item.name }}
+					</el-radio>
+				</div>
+				<div class="hui-dialog-submit">
+					<el-button size="medium" @click="dialogVisibles = false">取 消</el-button>
+					<el-button size="medium" type="primary" @click="selectSeal">确 定</el-button>
+				</div>
+			</div>
+		</el-dialog>
+		<el-upload ref="upload" :action="action" name="uploadFile" style="position: absolute;z-index: -1;opacity: 0;"
+			:headers="headers" :on-success="successFile" :show-file-list="false">
+			<el-button slot="trigger" size="small" type="primary" ref="imgUpload">上传文件</el-button>
+		</el-upload>
+	</div>
+</template>
+
+<script>
+	import {
+		getDocumentById,
+		getDocumentTemplateById,
+		createDocument,
+		insertDocumentData,
+		getSealRegisterKey,
+		getRetrievers,
+	} from '@/httpApi/contract';
+	import {
+		getSealList,
+		requestSeal,
+		getSealDetailById,
+		getRequestSealDetail
+	} from '@/httpApi/organization';
+	import $ from 'jquery';
+	import {
+		constData
+	} from '@/uitls/index.js';
+	import {
+		createLogger
+	} from 'vuex';
+	// import verifyQr from '@/components/verifyQr';
+	export default {
+		props: ['documentId', 'templateId'],
+		data() {
+			return {
+				html: '', //html
+				changeSelect: [], //选择项
+				timeDialog: false, //选择日期是否显示
+				nowElem: '', //选择时点击的节点
+				selectVisible: false, //选择内容是否显示
+				selectVal: '', //选中的内容
+				selectItem: {}, //选择的数据
+				selectData: {}, //有极选项总数据
+				contextData: {}, //有极拉取数据
+				userInfo: {}, //登录人信息
+				submitShow: false, //是否显示保存按钮
+				hasData: false, //是否为编辑文档
+				sealData: [], //印章数据
+				sealDomId: '', //印章存放节点的id
+				dialogVisibles: false, //是否选择印章
+				sealVal: 1, //当前选择的印章
+				initIndex: 1, //初始化文档
+				organized: {
+					executionRecordList: 10, //施工方意见
+					supervisionRecordList: 4, //监理单位意见
+					constructionRecordList: 3, //建设单位意见
+					designRecordList: 2, //设计单位意见
+					prospectedRecordList: 5, //勘察单位意见
+					governmentRecordList: 6, //政府单位
+					supervisorRecordList: 4 //监理(建设)单位验收记录(监理单位验收记录,表中)
+				},
+				platformType: '1',
+				action: '',
+				headers: {
+					token: ''
+				},
+				copyImage: {}
+			};
+		},
+		created() {
+			this.$nextTick(() => {
+				this.userInfo = this.$store.getters.user;
+				this.contextData = this.$store.getters.document;
+				if (this.templateId) return this.initTemplate(this.templateId, [], []);
+				if (this.documentId) this.initDocument();
+			})
+		},
+		methods: {
+			initTemplate(templateId, elementData, sealData) {
+				getDocumentTemplateById(templateId).then(res => {
+					if (res.state) {
+						this.html = res.data.html;
+						this.templateName = res.data.name;
+						this.renderTamplate(elementData, sealData);
+					}
+				})
+			},
+			initDocument() {
+				getDocumentById(this.documentId).then(res => {
+					if (res.state) {
+						this.initTemplate(res.data.documentTemplateId, res.data.elementDataList, res.data
+							.sealUsageList);
+						this.documentSealRegister(res.data.id);
+					}
+				})
+			},
+			successFile(data, file, type) {
+				//上传头像成功
+				let _self = this;
+				if (data.state) {
+					_self.copyImage.dom.innerHTML = '<img id="' + _self.copyImage.domId +
+						'" class="copy-img copyImage" src="' + data
+						.data.node.url + '"/>'
+				}
+			},
+			documentSealRegister(documentId) {
+				getSealRegisterKey(documentId).then(res => {
+					if (res.state) {
+						res.data.forEach(item => {
+							$('#' + item.keyWord).css('position', 'relative');
+							$('#' + item.keyWord).html(
+								'<img id="' +
+								item.keyWord +
+								'" class="seal-img" src="' +
+								(item.fileNode.node.url ||
+									'https://file-node.oss-cn-shanghai.aliyuncs.com/youji/8b726641d0cc45fe91b5e59e4ea450c6'
+								) +
+								'"/>'
+							);
+						});
+					}
+				});
+			},
+			renderTamplate(elementDataList, sealUsageList) {
+				//整合模板
+				this.$nextTick(() => {
+					let documentElement = $('.documentElement');
+					if (elementDataList.length > 0) this.renderDocument(elementDataList);
+					for (let i = 0; i < documentElement.length; i++) {
+						let elem = documentElement[i];
+						let inputtype = $(elem).attr('inputtype') == undefined ? '' : $(elem).attr(
+							'inputtype');
+						let updatetype = inputtype.replace('@', '');
+						$(elem).attr('updatetype', updatetype);
+						this.domRender(updatetype, elem, elem.id);
+					}
+					if (sealUsageList) this.filterSeal(sealUsageList);
+					//申请印章
+					let _self = this;
+					$('.sureSeal').click(function() {
+						let _this = this;
+						_self.sealDomId = $(_this).parent()[0].id;
+						getSealList(_self.$store.getters.organization.id).then(res => {
+							if (res.state) {
+								_self.sealData = res.data;
+							}
+						})
+						_self.dialogVisibles = true;
+					});
+				});
+			},
+			domRender(type, elem, id) {
+				switch (type) {
+					case 'context':
+						if (elem.innerHTML) return;
+						$(elem).text(this.contextData[id] || '')
+						break;
+					case 'sign':
+						elem.innerHTML =
+							'<button class="sureAutograph el-button el-button--default el-button--medium">确认签名</button>';
+						break;
+					case 'seal':
+						if (elem.innerHTML) return;
+						elem.innerHTML = '<span class="sureSeal"">申请盖章</span>';
+						break;
+					default:
+						break;
+				}
+			},
+			renderDocument(data) {
+				data.forEach(item => {
+					let dataItem = JSON.parse(item.data);
+					for (let i in dataItem) {
+						for (let j in dataItem[i]) {
+							this.renderDom(i, j, dataItem[i][j]);
+						}
+					}
+				});
+			},
+			renderDom(i, j, text) {
+				switch (i) {
+					case 'seal':
+						if (text == '') return;
+						$('#' + j).addClass('seal-box');
+						$('#' + j).html('已申请印章,请等待审核');
+						break;
+					case 'sealperson':
+						break;
+					case 'sign':
+						$('#' + j + '[inputtype=' + i + ']').html('<img class="autograph" src="' + text + '">');
+						break;
+					case 'signQR':
+						$('#' + j + '[inputtype=' + i + ']').html('<img class="autograph" src="' + text + '">');
+						break;
+					case 'copyImage':
+						$('#' + j + '[inputtype=' + i + ']').html('<img  class="copy-img" src="' + text + '"/>');
+						break;
+					default:
+						if (i.indexOf('.') == -1) {
+							$('#' + j + '[inputtype=' + i + ']').text(text);
+						}
+						break;
+				}
+			},
+			filterSeal(data) {
+				//渲染印章
+				let _self = this;
+				data.forEach((item, index) => {
+					getRequestSealDetail(item.requestId).then(node => {
+						if (node.state) {
+							let data = node.data;
+							if (data.status == 1) {
+								$('#' + data.keyWord).css('position',
+									'relative');
+								getSealDetailById(data.sealId).then(item => {
+									if (item.state) {
+										$('#' + data.keyWord).html('<img id="' + data.keyWord +
+											'" class="seal-img" src="' + item.data.fileNode
+											.node.url + '"/>');
+									}
+								})
+							}
+						}
+					})
+				});
+			},
+			selectClick(event) {
+				let _self = this;
+				_self.nowElem = event.target; //当前点击的i标签
+				switch (event.target.className) {
+					case 'el-icon-arrow-down':
+						_self.selectItem = _self.selectData[_self.nowElem.id];
+						_self.selectVal = '';
+						_self.selectVisible = true;
+						break;
+					case 'el-icon-date':
+						_self.timeDialog = true;
+						break;
+					default:
+						break;
+				}
+			},
+			selectSuccess(type) {
+				let _self = this;
+				switch (type) {
+					case 'time':
+						_self.nowElem.parentNode.getElementsByClassName('documentElement')[0].innerHTML = _self.$refs
+							.dateTime.getDate();
+						_self.timeDialog = false;
+						break;
+					case 'select':
+						_self.nowElem.parentNode.getElementsByClassName('documentElement')[0].innerHTML = _self.selectVal;
+						_self.selectVisible = false;
+						break;
+					default:
+						break;
+				}
+			},
+			selectSeal() {
+				//选择印章
+				let _self = this;
+				if (_self.sealDomId == '') return;
+				let item = _self.sealData.filter(item => {
+					return item.id == _self.sealVal;
+				})[0];
+				requestSeal({
+					sealId: item.id,
+					requestUserName: _self.userInfo.name,
+					requestUserId: _self.userInfo.userId,
+					documentId: _self.documentId,
+					keyWord: _self.sealDomId,
+					projectId: _self.$store.getters.project.id
+				}).then(data => {
+					if (data.state) {
+						$('#' + _self.sealDomId).css('position', 'relative');
+						$('#' + _self.sealDomId).html('<img id="' + _self.sealDomId +
+							'" class="seal-img" src="' + item.fileNode.node.url + '"/>');
+						let documentElement = $('.documentElement');
+						let obj = constData(documentElement);
+						insertDocumentData({
+							data: JSON.stringify(obj),
+							documentId: _self.documentId,
+							userId: _self.$store.getters.user.userId
+						}).then(res => {
+							if (res.state) {
+								_self.$message.success('申请成功');
+								_self.dialogVisibles = false;
+							}
+						})
+					}
+				});
+			},
+			submit() {
+				let documentElement = $('.documentElement');
+				let obj = constData(documentElement);
+				if (this.documentId) this.updateDocument(obj);
+			},
+			updateDocument(obj) {
+				insertDocumentData({
+					data: JSON.stringify(obj),
+					documentId: this.documentId,
+					userId: this.$store.getters.user.userId
+				}).then(res => {
+					if (res.state) {
+						this.$message.success('保存成功');
+						this.$emit('close');
+					}
+				})
+			}
+		},
+		components: {}
+	};
+</script>
+
+<style lang="scss">
+	.flow-document {
+		position: relative;
+		width: 100%;
+		height: 100%;
+
+		&::-webkit-scrollbar-thumb {
+			background: #D9DEE6;
+		}
+
+		.html {
+			margin: 0 auto;
+			width: 900px;
+		}
+
+		.sureSeal {
+			position: relative;
+			z-index: 999;
+			padding: 5px 10px;
+			text-align: center;
+			background: rgba(97, 133, 214, 0);
+			border-radius: 2px;
+			border: 1px solid #ACADB3;
+			cursor: pointer;
+			color: #000;
+			font-size: 14px;
+			margin-bottom: 5px;
+		}
+
+		.seal-box {
+			color: $--color-red;
+			font-size: 14px;
+			margin-bottom: 5px;
+		}
+
+		.seal-img {
+			position: absolute;
+			width: 120px;
+			height: 120px;
+			z-index: 998;
+			top: 50%;
+			margin-top: -60px;
+			left: 50%;
+			margin-left: -60px;
+		}
+	}
 </style>

+ 1 - 1
virgo.wzfrontend/console/src/components/work/contract/list/edit.vue

@@ -316,7 +316,6 @@
 					}
 				})
 			} else {
-				console.log(this.$store.getters.contractData);
 				if (this.$store.getters.contractData && JSON.stringify(this.$store.getters.contractData) != '{}') {
 					if (this.$store.getters.contractData.projectId != this.$store.getters.project.id) {
 						return this.$store.dispatch('projectBase/changeContractData', {});
@@ -373,6 +372,7 @@
 			merchant() {
 				getOrganizationList({
 					organizationId: this.organization.id,
+					projectId: this.$store.getters.project.id,
 					status: 1
 				}).then(res => {
 					if (res.state) {

+ 15 - 3
virgo.wzfrontend/console/src/config/demo1.js

@@ -68,9 +68,21 @@ export default {
 		"z": 18500
 	}],
 	deviceList: [{
-		"x": 19394,
-		"y": 64194,
-		"z": 18500
+		"x": 16282,
+		"y": 63917,
+		"z": 14500
+	}, {
+		"x": 16282,
+		"y": 51469,
+		"z": 14500
+	}, {
+		"x": 15334,
+		"y": 38614,
+		"z": 14500
+	}, {
+		"x": 15334,
+		"y": 23849,
+		"z": 14500
 	}],
 	roomList: [{
 		"roomId": 1,

+ 11 - 0
virgo.wzfrontend/console/src/httpApi/organization.js

@@ -275,4 +275,15 @@ export function requestUseSeal(id, data) {
 		method: 'post',
 		data: data
 	})
+}
+/*
+ * 判断文档中申请印章痛没通过
+ * @param {Object} data = {}
+ * 
+ */
+export function isPassRequestUseSeal(documentIds) {
+	return request({
+		url: `/file/sealRequest/document/${documentIds}`,
+		method: 'get'
+	})
 }

+ 7 - 0
virgo.wzfrontend/console/src/router/modules/crm.js

@@ -12,6 +12,13 @@ const crm = [{
 	meta: {
 		title: '经纪人管理'
 	}
+}, {
+	path: 'crm/organization',
+	component: () => import('@/views/work/crm/organization'),
+	name: '企业管理',
+	meta: {
+		title: '企业管理'
+	}
 }, {
 	path: 'crm/highseas',
 	component: () => import('@/views/work/crm/highseas'),

+ 20 - 2
virgo.wzfrontend/console/src/uitls/controls.js

@@ -8,7 +8,7 @@ class bimView {
 		let viewToken, dom, app, viewer3D, model3D, viewerGIS, renderSuccess, index = 0,
 			click, hover, roomSaved, change, marker3D, drawableContainer, roomManager, layerMng, layerId, walk,
 			elementColor, type, map, background, initHomeViewer, fanScanEffectConfig, planeScanEffect,
-			extObjIds = [],
+			ringScanEffect, extObjIds = [],
 			elementObject = {
 				fileId: '',
 				objectId: ''
@@ -648,7 +648,7 @@ class bimView {
 				viewer3D.render();
 			});
 		}
-		this.inserttFanScanEffect = (position) => {
+		this.insertFanScanEffect = (position) => {
 			// 构造扇形扫描效果配置项
 			if (!fanScanEffectConfig) {
 				fanScanEffectConfig = new Glodon.Bimface.Plugins.Animation.FanScanEffectConfig();
@@ -702,6 +702,24 @@ class bimView {
 			if (!planeScanEffect) return;
 			planeScanEffect.hide();
 		}
+		this.setRingScanEffect = option => {
+			// 构造环状扫描效果配置项
+			let ringScanEffectConfig = new Glodon.Bimface.Plugins.Animation.RingScanEffectConfig();
+			// 配置Viewer对象、颜色、持续时间、位置、半径、衰减力度等参数
+			ringScanEffectConfig.viewer = viewer3D;
+			ringScanEffectConfig.color = new Glodon.Web.Graphics.Color(17, 218, 183, 1);
+			ringScanEffectConfig.duration = option.duration;
+			ringScanEffectConfig.originPosition = option.position;
+			ringScanEffectConfig.radius = option.radius;
+			ringScanEffectConfig.progressive = 5;
+			// 构造环状扫描效果对象
+			ringScanEffect = new Glodon.Bimface.Plugins.Animation.RingScanEffect(ringScanEffectConfig);
+			ringScanEffect.show();
+			viewer3D.render();
+		}
+		this.clearRingScanEffect = () => {
+			ringScanEffect.destroy();
+		}
 		this.destroy = () => {
 			console.log('销毁场景');
 			app.destroy();

+ 5 - 1
virgo.wzfrontend/console/src/views/work/bim/distribution.vue

@@ -44,6 +44,9 @@
 				}, {
 					id: 4,
 					name: '灯光'
+				}, {
+					id: 5,
+					name: '漫游'
 				}],
 				pathNode: {},
 				renderSuccess: false
@@ -121,7 +124,7 @@
 						'./assets/shexiangtou.png', (data) => {
 							console.log(data);
 						}, i);
-					this.bimViewer.insertExternalObject('./assets/model/yuanzhui.fbx', this.monitorList[i], i);
+					this.bimViewer.insertExternalObject('./assets/model/yuanzhui.fbx', this.monitorList[i], i, 'monitor');
 				}
 			},
 			clearMonitor() {
@@ -134,6 +137,7 @@
 						'http://static.bimface.com/resources/3DMarker/warner/warner_red.png', (data) => {
 							console.log(data);
 						}, i);
+					this.bimViewer.insertExternalObject('./assets/model/yuanzhui.fbx', this.deviceList[i], i, 'device');
 				}
 			},
 			clearDevice() {

+ 1 - 2
virgo.wzfrontend/console/src/views/work/business/client.vue

@@ -1,7 +1,7 @@
 <template>
 	<div class="hui-flex hui-content">
 		<div class="hui-content-title">
-			<div class="hui-title-item active">客户列表</div>
+			<div class="hui-title-item active">个人客户</div>
 		</div>
 		<div class="hui-flex-box hui-flex hui-table">
 			<list-filter type="customer" @filter="filterInit"></list-filter>
@@ -116,7 +116,6 @@
 					currPage: this.currPage,
 					pageSize: this.pageSize,
 					organizationId: this.$store.getters.organization.id,
-					userId: this.$store.getters.user.id,
 					status: 2
 				}
 				postData = Object.assign(postData, this.filterOption);

+ 6 - 129
virgo.wzfrontend/console/src/views/work/business/organization.vue

@@ -1,12 +1,9 @@
 <template>
 	<div class="hui-flex hui-content">
 		<div class="hui-content-title">
-			<div class="hui-title-item active">企业列表</div>
+			<div class="hui-title-item active">企业客户</div>
 		</div>
 		<div class="hui-flex-box hui-flex hui-table">
-			<div class="hui-content-insert">
-				<el-button type="primary" size="medium" @click="insertProject">新增企业</el-button>
-			</div>
 			<div class="hui-flex-box">
 				<el-table :data="tableData" row-key="id" border height="100%">
 					<el-table-column label="序号" width="50">
@@ -37,8 +34,6 @@
 						<template slot-scope="scope">
 							<div class="hui-table-operation">
 								<span class="table-operation" @click="lookProject(scope.row)">详情</span>
-								<span class="table-operation" @click="updateProject(scope.row)">编辑</span>
-								<span class="table-operation" @click="deleteOrganization(scope.row)">删除</span>
 							</div>
 						</template>
 					</el-table-column>
@@ -53,11 +48,7 @@
 				</el-pagination>
 			</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"></edit>
-		</el-dialog>
-		<el-drawer title="项目详情" :visible.sync="drawer" :size="400" :append-to-body="true">
+		<el-drawer title="企业详情" :visible.sync="drawer" :size="400" :append-to-body="true">
 			<detail v-if="drawer" :detailId="detailId"></detail>
 		</el-drawer>
 	</div>
@@ -65,18 +56,8 @@
 
 <script>
 	import {
-		getOrganizationListByPage,
-		deleteOrganizationById,
-		updateOrganization
+		getOrganizationListByPage
 	} from '@/httpApi/business'
-	import {
-		getOrganizationByCode,
-		bindProject,
-		bindProjectDetail,
-		putBindProject
-	} from '@/httpApi/organization'
-
-	import edit from '@/components/work/business/organization/edit'
 	import detail from '@/components/work/business/organization/detail'
 	export default {
 		data() {
@@ -100,7 +81,8 @@
 					currPage: this.currPage,
 					pageSize: this.pageSize,
 					organizationId: this.$store.getters.organization.id,
-					projectId: this.$store.getters.project.id
+					projectId: this.$store.getters.project.id,
+					status: 1
 				}).then(res => {
 					if (res.state) {
 						this.tableData = res.data.dataList;
@@ -112,119 +94,14 @@
 				this.currPage = currPage;
 				this.init();
 			},
-			insertProject() {
-				this.isUpdate = false;
-				this.visible = true;
-			},
-			updateProject(item) {
-				this.detailId = item.id;
-				this.isUpdate = true;
-				this.visible = true;
-			},
 			lookProject(item) {
 				this.detailId = item.id;
 				this.drawer = true;
-			},
-			bindOrganization(item) {
-				let organizationId = '',
-					_self = this;
-				this.$prompt('请输入组织编码', '红链提示', {
-					confirmButtonText: '确 定',
-					cancelButtonClass: 'cancel',
-					confirmButtonClass: 'confirm',
-					cancelButtonText: '取 消',
-					inputPattern: /\S/,
-					inputErrorMessage: '请输入组织编码',
-					beforeClose(action, instance, done) {
-						if (action === 'confirm') {
-							getOrganizationByCode(instance.inputValue).then(res => {
-								if (res.state) {
-									if (!res.data) return _self.$message.warning('该组织编码无效,请重新输入');
-									organizationId = res.data.id;
-									bindProjectDetail({
-										organizationId: _self.$store.getters.organization.id,
-										projectId: _self.$store.getters.project.id,
-										bindOrganizationId: organizationId,
-										identityId: 4
-									}).then(node => {
-										if (node.state) {
-											if (node.data.length > 0) return _self.$message
-												.warning('该组织已被绑定,不能再次绑定');
-											done();
-										}
-									})
-								}
-							})
-						} else {
-							done();
-						}
-					}
-				}).then((data) => {
-					bindProject({
-						organizationId: _self.$store.getters.organization.id,
-						projectId: _self.$store.getters.project.id,
-						merchantId: item.id,
-						bindOrganizationId: organizationId,
-						identityId: 4
-					}).then(res => {
-						if (res.state) {
-							updateOrganization({
-								id: item.id,
-								status: 1
-							}).then(res => {
-								if (res.state) {
-									_self.init();
-									_self.$message.success('操作成功');
-								}
-							})
-						}
-					})
-				}).catch(() => {});
-			},
-			deleteOrganization(val) {
-				let _self = this;
-				this.$confirm('确定要删除该企业?', () => {
-					if (val.status == 1) {
-						bindProjectDetail({
-							organizationId: _self.$store.getters.organization.id,
-							projectId: _self.$store.getters.project.id,
-							merchantId: val.id,
-							identityId: 4
-						}).then(node => {
-							if (node.state) {
-								let data = node.data;
-								if (data.length === 0) return _self.deleteOrganizaitonFunc(val.id);
-								putBindProject({
-									id: data[0].id,
-									merchantId: 0,
-									bindOrganizationId: 0
-								}).then(res => {
-									if (res.state) _self.deleteOrganizaitonFunc(val.id);
-								})
-							}
-						})
-					} else {
-						_self.deleteOrganizaitonFunc(val.id);
-					}
-				});
-			},
-			deleteOrganizaitonFunc(id) {
-				deleteOrganizationById(id).then(res => {
-					if (res.state) {
-						this.init();
-						this.$message.success('操作成功');
-					}
-				})
-			},
-			callback(type) {
-				if (type === 'init') this.init();
-				this.visible = false;
 			}
 		},
 		components: {
-			edit,
 			detail
-		},
+		}
 	}
 </script>
 

+ 24 - 14
virgo.wzfrontend/console/src/views/work/contract/list.vue

@@ -95,6 +95,9 @@
 		deleteContractById,
 		updateContract
 	} from '@/httpApi/contract'
+	import {
+		isPassRequestUseSeal
+	} from '@/httpApi/organization'
 	export default {
 		data() {
 			return {
@@ -111,7 +114,7 @@
 			this.init();
 		},
 		methods: {
-			init() {
+			init() {
 				//合同状态,0-初始状态、1.已发送租客、2.已确认生成合同、3.已续费、4.即将过期、5.已过期、6.已退租。
 				let postData = {
 					currPage: this.currPage,
@@ -149,20 +152,27 @@
 				this.type = 'edit';
 			},
 			sendItem(item) {
-				this.$confirm('确定要发送合同给租客?', () => {
-					updateContract({
-						id: item.id,
-						status: 1
-					}).then(res => {
-						if (res.state) {
-							this.$message({
-								type: 'success',
-								message: '操作成功'
+				let document = JSON.parse(item.document);
+				isPassRequestUseSeal(document.map(node => node.id).join(',')).then(res => {
+					if (res.state) {
+						if (!res.data.hasSeal) return this.$message.warning('您暂未添加公章,请设置后发送给租客');
+						if (!res.data.passSeal) return this.$message.warning('您申请的公章暂未审核通过,请审核通过后发送给租客');
+						this.$confirm('确定要发送合同给租客?', () => {
+							updateContract({
+								id: item.id,
+								status: 1
+							}).then(res => {
+								if (res.state) {
+									this.$message({
+										type: 'success',
+										message: '操作成功'
+									})
+									this.init();
+								}
 							})
-							this.init();
-						}
-					})
-				});
+						});
+					}
+				})
 			},
 			deleteItem(item) {
 				this.$confirm('确定要删除该合同?', () => {

+ 231 - 0
virgo.wzfrontend/console/src/views/work/crm/organization.vue

@@ -0,0 +1,231 @@
+<template>
+	<div class="hui-flex hui-content">
+		<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 type="primary" size="medium" @click="insertProject">新增企业</el-button>
+			</div>
+			<div class="hui-flex-box">
+				<el-table :data="tableData" row-key="id" border height="100%">
+					<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="企业类型">
+						<template slot-scope="scope">
+							<span>{{$field.findTypeName('industryType',scope.row.industryType)}}</span>
+						</template>
+					</el-table-column>
+					<el-table-column label="企业法人" prop="legalPerson"></el-table-column>
+					<el-table-column label="成立时间" prop="establishDate"></el-table-column>
+					<el-table-column label="营业期限" prop="businessTerm"></el-table-column>
+					<el-table-column label="绑定组织" width="150">
+						<template slot-scope="scope">
+							<div class="hui-table-operation" v-if="!scope.row.status">
+								<span class="table-operation" @click="bindOrganization(scope.row)">绑定组织</span>
+							</div>
+							<div v-else class="hui-table-tag">
+								<div class="hui-tag hui-tag-success">已绑定</div>
+							</div>
+						</template>
+					</el-table-column>
+					<el-table-column label="操作" width="150">
+						<template slot-scope="scope">
+							<div class="hui-table-operation">
+								<span class="table-operation" @click="lookProject(scope.row)">详情</span>
+								<span class="table-operation" @click="updateProject(scope.row)">编辑</span>
+								<span class="table-operation" @click="deleteOrganization(scope.row)">删除</span>
+							</div>
+						</template>
+					</el-table-column>
+					<template slot="empty">
+						<empty description="暂无数据"></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">
+				</el-pagination>
+			</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"></edit>
+		</el-dialog>
+		<el-drawer title="企业详情" :visible.sync="drawer" :size="400" :append-to-body="true">
+			<detail v-if="drawer" :detailId="detailId"></detail>
+		</el-drawer>
+	</div>
+</template>
+
+<script>
+	import {
+		getOrganizationListByPage,
+		deleteOrganizationById,
+		updateOrganization
+	} from '@/httpApi/business'
+	import {
+		getOrganizationByCode,
+		bindProject,
+		bindProjectDetail,
+		putBindProject
+	} from '@/httpApi/organization'
+
+	import edit from '@/components/work/business/organization/edit'
+	import detail from '@/components/work/business/organization/detail'
+	export default {
+		data() {
+			return {
+				tableData: [],
+				currPage: 1,
+				pageSize: 10,
+				totalCount: 0,
+				visible: false,
+				detailId: '',
+				isUpdate: false,
+				drawer: false
+			}
+		},
+		created() {
+			this.init();
+		},
+		methods: {
+			init() {
+				getOrganizationListByPage({
+					currPage: this.currPage,
+					pageSize: this.pageSize,
+					organizationId: this.$store.getters.organization.id,
+					projectId: this.$store.getters.project.id
+				}).then(res => {
+					if (res.state) {
+						this.tableData = res.data.dataList;
+						this.totalCount = res.data.totalCount;
+					}
+				})
+			},
+			currentChange(currPage) {
+				this.currPage = currPage;
+				this.init();
+			},
+			insertProject() {
+				this.isUpdate = false;
+				this.visible = true;
+			},
+			updateProject(item) {
+				this.detailId = item.id;
+				this.isUpdate = true;
+				this.visible = true;
+			},
+			lookProject(item) {
+				this.detailId = item.id;
+				this.drawer = true;
+			},
+			bindOrganization(item) {
+				let organizationId = '',
+					_self = this;
+				this.$prompt('请输入组织编码', '红链提示', {
+					confirmButtonText: '确 定',
+					cancelButtonClass: 'cancel',
+					confirmButtonClass: 'confirm',
+					cancelButtonText: '取 消',
+					inputPattern: /\S/,
+					inputErrorMessage: '请输入组织编码',
+					beforeClose(action, instance, done) {
+						if (action === 'confirm') {
+							getOrganizationByCode(instance.inputValue).then(res => {
+								if (res.state) {
+									if (!res.data) return _self.$message.warning('该组织编码无效,请重新输入');
+									organizationId = res.data.id;
+									bindProjectDetail({
+										organizationId: _self.$store.getters.organization.id,
+										projectId: _self.$store.getters.project.id,
+										bindOrganizationId: organizationId,
+										identityId: 4
+									}).then(node => {
+										if (node.state) {
+											if (node.data.length > 0) return _self.$message
+												.warning('该组织已被绑定,不能再次绑定');
+											done();
+										}
+									})
+								}
+							})
+						} else {
+							done();
+						}
+					}
+				}).then((data) => {
+					bindProject({
+						organizationId: _self.$store.getters.organization.id,
+						projectId: _self.$store.getters.project.id,
+						merchantId: item.id,
+						bindOrganizationId: organizationId,
+						identityId: 4
+					}).then(res => {
+						if (res.state) {
+							updateOrganization({
+								id: item.id,
+								status: 1
+							}).then(res => {
+								if (res.state) {
+									_self.init();
+									_self.$message.success('操作成功');
+								}
+							})
+						}
+					})
+				}).catch(() => {});
+			},
+			deleteOrganization(val) {
+				let _self = this;
+				this.$confirm('确定要删除该企业?', () => {
+					if (val.status == 1) {
+						bindProjectDetail({
+							organizationId: _self.$store.getters.organization.id,
+							projectId: _self.$store.getters.project.id,
+							merchantId: val.id,
+							identityId: 4
+						}).then(node => {
+							if (node.state) {
+								let data = node.data;
+								if (data.length === 0) return _self.deleteOrganizaitonFunc(val.id);
+								putBindProject({
+									id: data[0].id,
+									merchantId: 0,
+									bindOrganizationId: 0
+								}).then(res => {
+									if (res.state) _self.deleteOrganizaitonFunc(val.id);
+								})
+							}
+						})
+					} else {
+						_self.deleteOrganizaitonFunc(val.id);
+					}
+				});
+			},
+			deleteOrganizaitonFunc(id) {
+				deleteOrganizationById(id).then(res => {
+					if (res.state) {
+						this.init();
+						this.$message.success('操作成功');
+					}
+				})
+			},
+			callback(type) {
+				if (type === 'init') this.init();
+				this.visible = false;
+			}
+		},
+		components: {
+			edit,
+			detail
+		},
+	}
+</script>
+
+<style lang="scss"></style>