whx hai 1 ano
pai
achega
287b198c5a
Modificáronse 93 ficheiros con 1033 adicións e 210 borrados
  1. 1 1
      virgo.wzfrontend/console/src/components/common/house/treeDetail.vue
  2. 7 3
      virgo.wzfrontend/console/src/components/common/house/treeSelect.vue
  3. 6 1
      virgo.wzfrontend/console/src/components/common/uploadFile.vue
  4. 104 130
      virgo.wzfrontend/console/src/components/document/editor.vue
  5. 38 9
      virgo.wzfrontend/console/src/components/work/contract/common/selectTemplate.vue
  6. 5 1
      virgo.wzfrontend/console/src/components/work/contract/template/field.vue
  7. 39 7
      virgo.wzfrontend/console/src/components/work/contract/template/fieldDetail.vue
  8. 127 0
      virgo.wzfrontend/console/src/components/work/contract/template/fieldForm.vue
  9. 43 3
      virgo.wzfrontend/console/src/components/work/organization/seal/request.vue
  10. 15 3
      virgo.wzfrontend/console/src/components/work/organization/user/edit.vue
  11. 40 4
      virgo.wzfrontend/console/src/httpApi/contract.js
  12. 24 0
      virgo.wzfrontend/console/src/httpApi/organization.js
  13. 5 1
      virgo.wzfrontend/console/src/layout/components/topNav.vue
  14. 9 2
      virgo.wzfrontend/console/src/router/modules/business.js
  15. 14 0
      virgo.wzfrontend/console/src/router/modules/contract.js
  16. 3 3
      virgo.wzfrontend/console/src/uitls/index.js
  17. 13 6
      virgo.wzfrontend/console/src/views/system/log.vue
  18. 194 0
      virgo.wzfrontend/console/src/views/work/business/client.vue
  19. 3 2
      virgo.wzfrontend/console/src/views/work/business/organization.vue
  20. 148 0
      virgo.wzfrontend/console/src/views/work/contract/client.vue
  21. 2 1
      virgo.wzfrontend/console/src/views/work/contract/list.vue
  22. 148 0
      virgo.wzfrontend/console/src/views/work/contract/organization.vue
  23. 1 1
      virgo.wzfrontend/src/main/resources/static/index.html
  24. 0 1
      virgo.wzfrontend/src/main/resources/static/static/css/17.1f9d67c5.css
  25. 1 1
      virgo.wzfrontend/src/main/resources/static/static/css/578.096e91e5.css
  26. 0 0
      virgo.wzfrontend/src/main/resources/static/static/css/192.48fa06e5.css
  27. 0 1
      virgo.wzfrontend/src/main/resources/static/static/css/197.15cb5418.css
  28. 1 0
      virgo.wzfrontend/src/main/resources/static/static/css/359.67238434.css
  29. 0 0
      virgo.wzfrontend/src/main/resources/static/static/css/375.863e2be4.css
  30. 1 0
      virgo.wzfrontend/src/main/resources/static/static/css/465.b6c7aaf0.css
  31. 1 0
      virgo.wzfrontend/src/main/resources/static/static/css/525.bedeeaa7.css
  32. 0 0
      virgo.wzfrontend/src/main/resources/static/static/css/568.863e2be4.css
  33. 0 0
      virgo.wzfrontend/src/main/resources/static/static/css/813.f43f4c00.css
  34. 0 1
      virgo.wzfrontend/src/main/resources/static/static/css/842.1f9d67c5.css
  35. 1 0
      virgo.wzfrontend/src/main/resources/static/static/css/850.32d3f99b.css
  36. 1 0
      virgo.wzfrontend/src/main/resources/static/static/css/893.67238434.css
  37. 1 0
      virgo.wzfrontend/src/main/resources/static/static/css/906.bedeeaa7.css
  38. 0 1
      virgo.wzfrontend/src/main/resources/static/static/css/924.15cb5418.css
  39. 0 0
      virgo.wzfrontend/src/main/resources/static/static/css/994.f43f4c00.css
  40. 0 0
      virgo.wzfrontend/src/main/resources/static/static/css/999.48fa06e5.css
  41. 1 1
      virgo.wzfrontend/src/main/resources/static/static/js/654-legacy.3f66ce42.js
  42. 1 1
      virgo.wzfrontend/src/main/resources/static/static/js/153-legacy.6c14061c.js
  43. 0 1
      virgo.wzfrontend/src/main/resources/static/static/js/17-legacy.3c1572db.js
  44. 1 0
      virgo.wzfrontend/src/main/resources/static/static/js/181.39f25f67.js
  45. 1 1
      virgo.wzfrontend/src/main/resources/static/static/js/102-legacy.2949c979.js
  46. 0 1
      virgo.wzfrontend/src/main/resources/static/static/js/197-legacy.853f0344.js
  47. 1 1
      virgo.wzfrontend/src/main/resources/static/static/js/578-legacy.ca36881e.js
  48. 1 1
      virgo.wzfrontend/src/main/resources/static/static/js/293.adf2df45.js
  49. 1 0
      virgo.wzfrontend/src/main/resources/static/static/js/359.c8cf2514.js
  50. 1 0
      virgo.wzfrontend/src/main/resources/static/static/js/375.0a221a0c.js
  51. 1 0
      virgo.wzfrontend/src/main/resources/static/static/js/419-legacy.b1d51d57.js
  52. 1 0
      virgo.wzfrontend/src/main/resources/static/static/js/419.165312a4.js
  53. 1 0
      virgo.wzfrontend/src/main/resources/static/static/js/465-legacy.bc1a59db.js
  54. 1 1
      virgo.wzfrontend/src/main/resources/static/static/js/202.4f9dd28b.js
  55. 1 1
      virgo.wzfrontend/src/main/resources/static/static/js/498-legacy.2517fa46.js
  56. 1 0
      virgo.wzfrontend/src/main/resources/static/static/js/499-legacy.60884805.js
  57. 1 0
      virgo.wzfrontend/src/main/resources/static/static/js/499.a092887d.js
  58. 1 1
      virgo.wzfrontend/src/main/resources/static/static/js/510.0d070746.js
  59. 1 1
      virgo.wzfrontend/src/main/resources/static/static/js/525-legacy.fc98d606.js
  60. 1 0
      virgo.wzfrontend/src/main/resources/static/static/js/525.8a7c2b40.js
  61. 1 0
      virgo.wzfrontend/src/main/resources/static/static/js/529-legacy.97d327f8.js
  62. 0 1
      virgo.wzfrontend/src/main/resources/static/static/js/529-legacy.b417da01.js
  63. 1 0
      virgo.wzfrontend/src/main/resources/static/static/js/529.045ffcf5.js
  64. 0 1
      virgo.wzfrontend/src/main/resources/static/static/js/529.a938767d.js
  65. 1 1
      virgo.wzfrontend/src/main/resources/static/static/js/838-legacy.bde41c88.js
  66. 0 1
      virgo.wzfrontend/src/main/resources/static/static/js/6.a1fd04c8.js
  67. 0 1
      virgo.wzfrontend/src/main/resources/static/static/js/61-legacy.20a0bb66.js
  68. 1 0
      virgo.wzfrontend/src/main/resources/static/static/js/61-legacy.6c783e3d.js
  69. 0 1
      virgo.wzfrontend/src/main/resources/static/static/js/61.20a0bb66.js
  70. 1 0
      virgo.wzfrontend/src/main/resources/static/static/js/61.6c783e3d.js
  71. 0 0
      virgo.wzfrontend/src/main/resources/static/static/js/64.c6e44433.js
  72. 0 0
      virgo.wzfrontend/src/main/resources/static/static/js/656-legacy.881cab5a.js
  73. 1 1
      virgo.wzfrontend/src/main/resources/static/static/js/689.42351db0.js
  74. 1 0
      virgo.wzfrontend/src/main/resources/static/static/js/709-legacy.78400548.js
  75. 1 0
      virgo.wzfrontend/src/main/resources/static/static/js/709.452c3cf5.js
  76. 1 1
      virgo.wzfrontend/src/main/resources/static/static/js/740.b8ec6d25.js
  77. 1 1
      virgo.wzfrontend/src/main/resources/static/static/js/636-legacy.6c99893f.js
  78. 0 0
      virgo.wzfrontend/src/main/resources/static/static/js/836-legacy.80c1c45c.js
  79. 0 0
      virgo.wzfrontend/src/main/resources/static/static/js/836.25868d7a.js
  80. 0 1
      virgo.wzfrontend/src/main/resources/static/static/js/842.d08f2115.js
  81. 1 0
      virgo.wzfrontend/src/main/resources/static/static/js/850-legacy.e6bb0e63.js
  82. 1 0
      virgo.wzfrontend/src/main/resources/static/static/js/850.c9b41997.js
  83. 1 0
      virgo.wzfrontend/src/main/resources/static/static/js/893-legacy.b140c90d.js
  84. 1 0
      virgo.wzfrontend/src/main/resources/static/static/js/906-legacy.7ccc2789.js
  85. 1 1
      virgo.wzfrontend/src/main/resources/static/static/js/919-legacy.671c405d.js
  86. 0 1
      virgo.wzfrontend/src/main/resources/static/static/js/924.1aca7843.js
  87. 0 1
      virgo.wzfrontend/src/main/resources/static/static/js/972.a2ae0f64.js
  88. 1 0
      virgo.wzfrontend/src/main/resources/static/static/js/994.814993ae.js
  89. 1 1
      virgo.wzfrontend/src/main/resources/static/static/js/449.f3eea1e6.js
  90. 1 0
      virgo.wzfrontend/src/main/resources/static/static/js/app-legacy.7303e0eb.js
  91. 0 1
      virgo.wzfrontend/src/main/resources/static/static/js/app-legacy.86f09e92.js
  92. 1 0
      virgo.wzfrontend/src/main/resources/static/static/js/app.4afb5347.js
  93. 0 1
      virgo.wzfrontend/src/main/resources/static/static/js/app.874ee3de.js

+ 1 - 1
virgo.wzfrontend/console/src/components/common/house/treeDetail.vue

@@ -45,7 +45,7 @@
 				getHouseTree(this.$store.getters.project.id).then(res => {
 					if (res.state) {
 						this.options = roomCheckedList(res.data.projectItemList || [], this.idsBox);
-						for (var i = 0; i < this.options.length; i++) {
+						for (let i = 0; i < this.options.length; i++) {
 							this.active.push(i)
 						}
 					}

+ 7 - 3
virgo.wzfrontend/console/src/components/common/house/treeSelect.vue

@@ -1,7 +1,7 @@
 <template>
 	<div class="project-item-tree-select">
-		<el-collapse>
-			<el-collapse-item v-for="item in options" :key="item.id">
+		<el-collapse v-model="active">
+			<el-collapse-item :name="index" v-for="(item,index) in options" :key="item.id">
 				<template slot="title">
 					<i class="iconfont huifont-shuzhuangcaidantubiao"></i>
 					<span class="el-collapse-name">{{item.name}}</span>
@@ -34,7 +34,8 @@
 				},
 				checkKeys: [],
 				idsBox: [],
-				request: false
+				request: false,
+				active: []
 			}
 		},
 		created() {
@@ -47,6 +48,9 @@
 				getHouseTree(this.$store.getters.project.id).then(res => {
 					if (res.state) {
 						this.options = roomList(res.data.projectItemList || []);
+						for (let i = 0; i < this.options.length; i++) {
+							this.active.push(i)
+						}
 						if (this.ids) {
 							this.idsBox = this.ids.split(',');
 							this.returnChecked(this.options);

+ 6 - 1
virgo.wzfrontend/console/src/components/common/uploadFile.vue

@@ -42,7 +42,12 @@
 				this.$message.error('上传失败');
 			},
 			successFile(data) {
-				this.$emit('changeFile', data.data)
+				let file = data.data;
+				this.$emit('changeFile', {
+					id: file.id,
+					name: file.name,
+					url: file.node.url
+				})
 				this.$loading.close();
 			},
 		}

+ 104 - 130
virgo.wzfrontend/console/src/components/document/editor.vue

@@ -4,8 +4,8 @@
 			<div id="html" class="html" ref="html" v-html="html" @click="selectClick"></div>
 		</div>
 		<div class="hui-dialog-submit">
-			<el-button size="medium" type="primary" @click="submit">保 存</el-button>
 			<el-button size="medium" @click="$emit('close')">取 消</el-button>
+			<el-button size="medium" type="primary" @click="submit">保 存</el-button>
 		</div>
 		<el-dialog title="选择日期" :visible.sync="timeDialog" :append-to-body="true" width="500px">
 			<div class="hui-flex">
@@ -33,16 +33,21 @@
 				</div>
 			</div>
 		</el-dialog>
-		<el-dialog title="选择公章" :visible.sync="dialogVisibles" width="880px" :append-to-body="true">
-			<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 class="dialog-footer">
-				<el-button @click="dialogVisibles = false">取 消</el-button>
-				<el-button type="primary" @click="selectSeal">确 定</el-button>
+		<el-dialog 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>
-		<!-- <verify-qr ref="verifyQr"></verify-qr> -->
 		<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>
@@ -70,9 +75,6 @@
 		constData
 	} from '@/uitls/index.js';
 	// import verifyQr from '@/components/verifyQr';
-	import {
-		getUserInfo
-	} from '@/httpApi/loginRegister';
 	export default {
 		props: ['documentId', 'templateId'],
 		data() {
@@ -115,7 +117,6 @@
 			this.$nextTick(() => {
 				this.userInfo = this.$store.getters.user;
 				this.contextData = this.$store.getters.document;
-				console.log(this.contextData);
 				if (this.templateId) return this.initTemplate(this.templateId, [], []);
 				if (this.documentId) this.initDocument();
 			})
@@ -169,23 +170,35 @@
 			renderTamplate(elementDataList, sealUsageList) {
 				//整合模板
 				this.$nextTick(() => {
-					if (elementDataList.length === 0) {
-						let documentElement = $('.documentElement');
-						for (let i = 0; i < documentElement.length; i++) {
-							let elem = documentElement[i];
-							let inputtype = $(elem).attr('inputtype') == undefined ? '' : $(elem).attr(
-								'inputtype');
-							this.domRender(inputtype, elem, elem.id);
-						}
-					} else {
-						this.renderDocument(elementDataList);
+					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) {
-				elem.innerHTML = '';
 				switch (type) {
 					case 'context':
+						if (elem.innerHTML) return;
 						$(elem).text(this.contextData[id] || '')
 						break;
 					case 'sign':
@@ -193,7 +206,7 @@
 							'<button class="sureAutograph el-button el-button--default el-button--medium">确认签名</button>';
 						break;
 					case 'seal':
-						elem.innerHTML = '<div class="sureSeal"">申请印章</div>';
+						elem.innerHTML = '<span class="sureSeal"">申请盖章</span>';
 						break;
 					default:
 						break;
@@ -202,10 +215,8 @@
 			renderDocument(data) {
 				data.forEach(item => {
 					let dataItem = JSON.parse(item.data);
-					console.log(dataItem);
 					for (let i in dataItem) {
 						for (let j in dataItem[i]) {
-							console.log(i, j, dataItem[i][j]);
 							this.renderDom(i, j, dataItem[i][j]);
 						}
 					}
@@ -215,7 +226,7 @@
 				switch (i) {
 					case 'seal':
 						if (text == '') return;
-						$('#' + j)[0].className = '';
+						$('#' + j).addClass('seal-box');
 						$('#' + j).html('已申请印章,请等待审核');
 						break;
 					case 'sealperson':
@@ -236,99 +247,22 @@
 						break;
 				}
 			},
-			updateRenderDom(i, j, text) {
-				let _self = this,
-					oldI = i;
-				i = i.indexOf('select_') > -1 ? i.split('_')[0] : i;
-				switch (i) {
-					case 'input':
-						$('#' + j + '[name="' + i + '"]')
-							.attr('contenteditable', true)
-							.attr('class', 'documentElement inputElement')
-							.html(text);
-						_self.submitShow = true;
-						break;
-					case 'select':
-						if ($('#' + j + '[name="' + oldI + '"]').hasClass('documentElement')) {
-							$('#' + j + '[name="' + oldI + '"]').text(text);
-							break;
-						}
-						let keys = oldI.split('.')[0].split('_')[1],
-							html = '<div class="documentElement" id="' + j + '" name="' + oldI +
-							'" contenteditable="true">' + text + '</div>';
-						$('#' + j + '[name="' + oldI + '"]')
-							.attr('id', '')
-							.attr('class', 'selectElement')
-							.html(html + '<i id="' + keys + '" class="el-icon-arrow-down"></i>');
-						_self.changeSelect.push(keys);
-						_self.submitShow = true;
-						break;
-					case 'context':
-						$('#' + j + '[name="' + i + '"]')
-							.attr('contenteditable', true)
-							.attr('class', 'documentElement contextElement')
-							.html(text);
-						break;
-					case 'seal':
-						$('#' + j)[0].className = '';
-						$('#' + j).html('已申请印章,请等待审核');
-						break;
-					case 'sealperson':
-						if (text != '') $('#' + j).html('<img class="autograph" src="' + text + '">');
-						break;
-					case 'sign':
-						if (text != '') $('#' + j).html('<img class="autograph" src="' + text + '">');
-						break;
-					case 'signQR':
-						if (text != '') $('#' + j).html('<img class="autograph" src="' + text + '">');
-						break;
-					case 'dateTime':
-						if ($('#' + j + '[name="' + oldI + '"]').hasClass('documentElement')) {
-							$('#' + j + '[name="' + oldI + '"]').text(text);
-							break;
-						}
-						let timehtml = '<div class="documentElement" id="' + j + '" name="' + oldI +
-							'"contenteditable="true">' + text + '</div>';
-						$('#' + j + '[name="' + oldI + '"]')
-							.attr('id', '')
-							.attr('class', 'dateTimeElement')
-							.html(timehtml + '<i class="el-icon-date"></i>');
-						_self.submitShow = true;
-						break;
-					case 'checkbox':
-						$('#' + j + '[name="' + i + '"]')
-							.attr('class', 'documentElement checkboxElement')
-							.html(text);
-						_self.submitShow = true;
-						break;
-					case 'copyImage':
-						if (text != '') {
-							$('#' + j)[0].className = 'documentElement copyImageElement';
-							$('#' + j).html('<img class="copyImage" src="' + text + '">');
-						}
-						_self.submitShow = true;
-						break;
-					default:
-						$('#' + j + '[name="' + i + '"]').html(text);
-						break;
-				}
-			},
 			filterSeal(data) {
 				//渲染印章
 				let _self = this;
-				if (_self.platformType == '1') return;
 				data.forEach((item, index) => {
 					getRequestSealDetail(item.requestId).then(node => {
-						if (node.code == '200') {
+						if (node.state) {
 							let data = node.data;
 							if (data.status == 1) {
 								$('#' + data.keyWord).css('position',
 									'relative');
 								getSealDetailById(data.sealId).then(item => {
-									if (item.code == '200') $('#' + data
-										.keyWord).html('<img id="' + data
-										.keyWord + '" class="seal-img" src="' +
-										item.data.fileNode.node.url + '"/>');
+									if (item.state) {
+										$('#' + data.keyWord).html('<img id="' + data.keyWord +
+											'" class="seal-img" src="' + item.data.fileNode
+											.node.url + '"/>');
+									}
 								})
 							}
 						}
@@ -371,25 +305,34 @@
 				//选择印章
 				let _self = this;
 				if (_self.sealDomId == '') return;
-				_self.$refs.verifyQr.createVerifyQr('seal', null, function() {
-					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 + '"/>');
-							_self.dialogVisibles = false;
-						}
-					});
+				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() {
@@ -429,5 +372,36 @@
 			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>

+ 38 - 9
virgo.wzfrontend/console/src/components/work/contract/common/selectTemplate.vue

@@ -14,11 +14,20 @@
 						</template>
 					</el-table-column>
 					<el-table-column label="合同名称" prop="name"></el-table-column>
+					<el-table-column label="文档字段" width="100" v-if="type === 'insert'">
+						<template slot-scope="scope">
+							<div class="hui-table-operation">
+								<span class="table-operation" @click="inputField(scope.row)">
+									填写
+								</span>
+							</div>
+						</template>
+					</el-table-column>
 					<el-table-column label="操作" width="240">
 						<template slot-scope="scope">
 							<div class="hui-table-operation">
-								<span class="table-operation" v-if="type === 'insert'">
-									编辑
+								<span class="table-operation" @click="updateDocument(scope.row)">
+									查看文档
 								</span>
 								<span class="table-operation" v-if="type === 'insert'" @click="deleteItem(scope.row)">
 									删除
@@ -54,6 +63,9 @@
 								<span class="table-operation" v-if="type === 'insert'" @click="deleteFile(scope.row)">
 									删除
 								</span>
+								<span class="table-operation" v-if="type === 'look'" @click="downloadFile(scope.row)">
+									下载
+								</span>
 							</div>
 						</template>
 					</el-table-column>
@@ -68,6 +80,10 @@
 			<editor :documentId="file.id" v-if="documentShow" @close="documentShow = false" @submit="submit">
 			</editor>
 		</el-dialog>
+		<el-dialog :title="file.name" :visible.sync="fieldShow" width="900px" :append-to-body="true">
+			<field-form v-if="fieldShow" :documentId="file.id" :templateId="file.templateId" @callback="callback">
+			</field-form>
+		</el-dialog>
 		<el-dialog title="选择合同模板" custom-class="select-template-dialog" :visible.sync="visible" width="500px"
 			:append-to-body="true">
 			<div class="hui-flex hui-dialog">
@@ -100,11 +116,13 @@
 	import preview from '@/components/document/preview'
 	import editor from '@/components/document/editor'
 	import uploadFile from '@/components/common/uploadFile'
+	import fieldForm from '@/components/work/contract/template/fieldForm'
 	import {
 		getContractTemplateList,
 		getTagList,
 		createDocument
 	} from '@/httpApi/contract'
+	import config from '@/config'
 	export default {
 		props: ['documentFileList', 'type'],
 		data() {
@@ -126,7 +144,8 @@
 					value: 'id',
 					checkStrictly: true
 				},
-				fileList: []
+				fileList: [],
+				fieldShow: false
 			}
 		},
 		created() {
@@ -158,7 +177,11 @@
 					this.templateData.splice(index, 1);
 				});
 			},
-			preview(item) {
+			inputField(item) {
+				this.file = item;
+				this.fieldShow = true;
+			},
+			updateDocument(item) {
 				this.file = item;
 				this.documentShow = true;
 			},
@@ -175,6 +198,9 @@
 					}
 				})
 			},
+			downloadFile(item) {
+				window.location.href = config.baseURL + '/file/filenode/' + item.id;
+			},
 			deleteFile(item) {
 				this.$confirm('确定要移除该文件?', () => {
 					let index = this.fileList.findIndex(node => node.id === item.id);
@@ -197,7 +223,8 @@
 					if (res.state) {
 						this.templateData.push({
 							id: res.data.id,
-							name: res.data.name
+							name: res.data.name,
+							templateId: res.data.documentTemplateId
 						});
 						this.visible = false;
 						this.form = {
@@ -206,15 +233,16 @@
 						}
 					}
 				});
-
-
-
 			},
 			returnData() {
 				return {
 					document: JSON.stringify(this.templateData),
 					attachment: JSON.stringify(this.fileList)
 				}
+			},
+			callback(type) {
+				if (type === 'init') this.init();
+				this.fieldShow = false;
 			}
 		},
 		watch: {
@@ -226,7 +254,8 @@
 		components: {
 			preview,
 			uploadFile,
-			editor
+			editor,
+			fieldForm
 		},
 	}
 </script>

+ 5 - 1
virgo.wzfrontend/console/src/components/work/contract/template/field.vue

@@ -44,7 +44,7 @@
 				:templateId="templateId">
 			</field-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">
 			<field-detail v-if="drawer" :detailId="detailId"></field-detail>
 		</el-drawer>
 	</div>
@@ -84,6 +84,10 @@
 			insertRow() {
 				this.isUpdate = false;
 				this.visible = true;
+			},
+			look(item){
+				this.detailId = item.id;
+				this.drawer = true;
 			},
 			updateRow(item) {
 				this.detailId = item.id;

+ 39 - 7
virgo.wzfrontend/console/src/components/work/contract/template/fieldDetail.vue

@@ -3,25 +3,57 @@
 		<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-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.description}}</div>
+				<div class="hui-detail-label">字段代码</div>
+				<div class="hui-detail-value">{{detail.code}}</div>
+			</div>
+			<div class="hui-detail-item">
+				<div class="hui-detail-label">字段类型</div>
+				<div class="hui-detail-value">{{$field.findTypeName('fieldType',detail.type)}}</div>
+			</div>
+			<div class="hui-detail-item">
+				<div class="hui-detail-label">是否必填</div>
+				<div class="hui-detail-value">{{detail.required === 1 ? '必填' : '非必填'}}</div>
+			</div>
+		</div>
+		<div v-if="detail.type === 2 || detail.type === 4">
+			<div class="hui-detail-title">选项信息</div>
+			<div class="hui-detail-content">
+				<div class="hui-detail-item" v-for="(item,index) in list" :key="item.id">
+					<div class="hui-detail-label">选项{{index+1}}</div>
+					<div class="hui-detail-value">{{item.label}}</div>
+				</div>
 			</div>
 		</div>
 	</div>
 </template>
 
 <script>
+	import {
+		getFieldList
+	} from '@/httpApi/contract'
 	export default {
-		props: ['detail'],
+		props: ['detailId'],
 		data() {
-			return {}
+			return {
+				detail: {},
+				list: []
+			}
 		},
-		created() {
-			
+		created() {
+			getFieldList({
+				id: this.detailId
+			}).then(res => {
+				if (res.state) {
+					this.detail = res.data[0];
+					if (this.detail.data) {
+						this.list = JSON.parse(this.detail.data).list;
+					}
+				}
+			})
 		}
 	}
 </script>

+ 127 - 0
virgo.wzfrontend/console/src/components/work/contract/template/fieldForm.vue

@@ -0,0 +1,127 @@
+<template>
+	<div class="hui-flex hui-dialog">
+		<div class="hui-flex-box hui-dialog-content">
+			<el-form ref="fieldForm" :model="fieldForm" label-position="top">
+				<el-form-item :label="item.name" v-for="(item,index) in list" :prop="item.code"
+					:rules="[{required: item.required === 1, message:item.name}]" :key="item.id">
+					<el-input type="text" v-model="fieldForm[item.code]" :placeholder="'请输入' + item.name"
+						v-if="item.type === 1">
+					</el-input>
+					<el-select v-model="fieldForm[item.code]" :placeholder="'请选择' + item.name"
+						v-else-if="item.type === 2">
+						<el-option :label="item.label" :value="item.value"
+							v-for="(item,index) in JSON.parse(item.data).list" :key="item.id">
+						</el-option>
+					</el-select>
+					<el-date-picker v-model="fieldForm[item.code]" value-format="yyyy-MM-dd" type="date"
+						:placeholder="'请选择' + item.name" v-else-if="item.type === 3">
+					</el-date-picker>
+					<el-radio-group v-model="fieldForm[item.code]" v-else-if="item.type === 4">
+						<el-radio :label="item.label" v-for="(item,index) in JSON.parse(item.data).list" :key="item.id">
+						</el-radio>
+					</el-radio-group>
+				</el-form-item>
+			</el-form>
+		</div>
+		<div class="hui-dialog-submit">
+			<el-button size="medium" @click="$emit('callback')">取 消</el-button>
+			<el-button size="medium" type="primary" @click="submit">保 存</el-button>
+		</div>
+	</div>
+</template>
+
+<script>
+	import {
+		getFieldList,
+		getFieldData,
+		insertFieldData,
+		insertDocumentData,
+		updateFieldData
+	} from '@/httpApi/contract';
+	export default {
+		props: ['documentId', 'templateId'],
+		data() {
+			return {
+				fieldForm: {},
+				list: [],
+				fieldData: {}
+			}
+		},
+		created() {
+			this.init();
+		},
+		methods: {
+			init() {
+				getFieldList({
+					documentTemplateId: this.templateId
+				}).then(res => {
+					if (res.state) {
+						this.list = res.data;
+						getFieldData(this.documentId, this.templateId).then(res => {
+							if (res.state) {
+								if (res.data) {
+									this.fieldData = res.data;
+									this.fieldForm = JSON.parse(res.data.data);
+								} else {
+									let obj = {};
+									for (var i = 0; i < this.list.length; i++) {
+										if (this.list[i].type === 2 || this.list[i].type === 4) {
+											let data = JSON.parse(this.list[i].data);
+											obj[this.list[i].code] = data.list.find(node => node.id == data
+												.value).value;
+										}
+									}
+									this.fieldForm = obj;
+								}
+							}
+						})
+					}
+				})
+			},
+			submit() {
+				this.$refs.fieldForm.validate((valid) => {
+					if (valid) {
+						console.log(this.fieldForm);
+						return;
+						if (this.fieldData.id) {
+							updateFieldData({
+								id: this.fieldData.id,
+								data: JSON.stringify(this.fieldForm)
+							}).then(this.successFunc)
+						} else {
+							insertFieldData({
+								documentId: this.documentId,
+								templateId: this.templateId,
+								data: JSON.stringify(this.fieldForm)
+							}).then(this.successFunc)
+						}
+					} else {
+						return false;
+					}
+				});
+			},
+			successFunc(res) {
+				if (res.state) {
+					let obj = {
+						context: {}
+					}
+					obj['context'] = this.fieldForm;
+					insertDocumentData({
+						data: JSON.stringify(obj),
+						documentId: this.documentId,
+						userId: this.$store.getters.user.userId
+					}).then(res => {
+						if (res.state) {
+							this.$message.success('操作成功');
+							this.$emit('callback', 'init');
+						}
+					})
+
+				}
+			}
+		}
+	}
+</script>
+
+<style>
+</style>

+ 43 - 3
virgo.wzfrontend/console/src/components/work/organization/seal/request.vue

@@ -8,10 +8,28 @@
 					</template>
 				</el-table-column>
 				<el-table-column prop="requestUserName" label="姓名"></el-table-column>
+				<el-table-column label="适用类型" width="80">
+					<template slot-scope="scope">
+						<span>
+							<span v-if="scope.row.documentId">文档</span>
+						</span>
+					</template>
+				</el-table-column>
 				<el-table-column label="申请状态" width="80">
 					<template slot-scope="scope">
-						<el-tag type="info" v-if="scope.row.status == 0" size="small">待审核</el-tag>
-						<el-tag size="small" v-else>通过</el-tag>
+						<div class="hui-table-tag">
+							<div class="hui-tag hui-tag-info" v-if="scope.row.status == 0">待审核</div>
+							<div class="hui-tag hui-tag-success" v-else>通过</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="pass(scope.row)" v-if="scope.row.status == 0">
+								通过
+							</span>
+						</div>
 					</template>
 				</el-table-column>
 				<template slot="empty">
@@ -30,6 +48,7 @@
 <script>
 	import {
 		getSealRequestListByQuery,
+		requestUseSeal
 	} from '@/httpApi/organization'
 	export default {
 		props: ['detailId'],
@@ -61,7 +80,28 @@
 			currentChange(currPage) {
 				this.currPage = currPage;
 				this.init();
-			}
+			},
+			pass(item) {
+				this.$confirm('确定通过该印章申请?', () => {
+					console.log('-----=======');
+					this.$loading.open();
+					console.log('-------');
+					requestUseSeal(item.id, {
+						documentId: item.documentId,
+						requestId: item.id,
+						sealId: item.sealId,
+						usageUserId: this.$store.getters.user.userId,
+						usageUserName: this.$store.getters.user.name
+					}).then(res => {
+						if (res.state) {
+							this.$message.success('操作成功');
+							this.init();
+						}
+						this.$loading.close();
+					});
+				});
+
+			},
 		},
 	}
 </script>

+ 15 - 3
virgo.wzfrontend/console/src/components/work/organization/user/edit.vue

@@ -31,7 +31,8 @@
 <script>
 	import {
 		insertUser,
-		testPhone
+		testPhone,
+		bindProject
 	} from '@/httpApi/organization'
 	export default {
 		props: ['part'],
@@ -80,8 +81,19 @@
 							insertUser(this.$store.getters.organization.id, this.part.id, this.userForm)
 								.then(res => {
 									if (res.state) {
-										this.$emit('callback', 'init');
-										this.$message.success('操作成功');
+										bindProject({
+											organizationId: this.$store.getters.organization
+												.id,
+											projectId: this.$store.getters.project.id,
+											userId: res.data.id,
+											identityId: 3
+										}).then(res => {
+											if (res.state) {
+												this.$emit('callback', 'init');
+												this.$message.success('操作成功');
+											}
+										})
+
 									}
 								})
 						} else {

+ 40 - 4
virgo.wzfrontend/console/src/httpApi/contract.js

@@ -161,6 +161,42 @@ export function deleteField(id) {
 		method: 'delete'
 	})
 }
+/* 
+ * 保存合同模板字段数据
+ * 
+ * 
+ */
+export function insertFieldData(data) {
+	return request({
+		url: `/file/template/documentTemplateData`,
+		method: 'post',
+		data: data
+	})
+}
+/* 
+ * 更新合同模板字段数据
+ * 
+ * 
+ */
+export function updateFieldData(data) {
+	return request({
+		url: `/file/template/documentTemplateData/update`,
+		method: 'put',
+		data: data
+	})
+}
+
+/* 
+ * 获取合同模板字段数据
+ * 
+ * 
+ */
+export function getFieldData(documentId, templateId) {
+	return request({
+		url: `/file/template/documentTemplateData/${documentId}/${templateId}`,
+		method: 'get',
+	})
+}
 /* 
  * 新增合同
  * 
@@ -252,7 +288,7 @@ export function getDocumentById(id) {
 		url: `/file/document/${id}`,
 		method: 'get',
 	})
-}
+}
 /* 
  * 通过id获取模板详情
  * 
@@ -263,7 +299,7 @@ export function getDocumentTemplateById(id) {
 		url: `/file/template/${id}`,
 		method: 'get'
 	})
-}
+}
 /* 
  * 保存文档数据
  * @param {Object} data = {}
@@ -275,7 +311,7 @@ export function insertDocumentData(data) {
 		method: 'post',
 		data: data
 	})
-}
+}
 /* 
  * 获取文档下使用的印章
  * @param {Object} data = {}
@@ -286,7 +322,7 @@ export function getSealRegisterKey(documentId) {
 		url: `/file/sealRegisterkey/${documentId}`,
 		method: 'get',
 	})
-}
+}
 /* 
  * 获取文档选择参数
  * @param {Object} data = {}

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

@@ -35,6 +35,18 @@ export function bindProject(data) {
 		data: data
 	})
 }
+/* 
+ * 获取客户/经纪人/组织绑定信息
+ * 
+ * 
+ */
+export function bindProjectDetail(data) {
+	return request({
+		url: `/manager/bindProject/list`,
+		method: 'post',
+		data: data
+	})
+}
 /* 
  * 获取组织项目部门列表
  * 
@@ -228,4 +240,16 @@ export function getRequestSealDetail(id) {
 		url: `/file/sealRequest/${id}`,
 		method: 'get',
 	})
+}
+/*
+ * 通过印章申请
+ * @param {Object} data = {}
+ * 
+ */
+export function requestUseSeal(id, data) {
+	return request({
+		url: `/file/sealRequest/${id}`,
+		method: 'post',
+		data: data
+	})
 }

+ 5 - 1
virgo.wzfrontend/console/src/layout/components/topNav.vue

@@ -42,6 +42,9 @@
 			:append-to-body="true">
 			<user-detail v-if="drawer"></user-detail>
 		</el-drawer>
+		<el-dialog title="切换项目" :visible.sync="visible" width="900px" :append-to-body="true">
+			
+		</el-dialog>
 	</div>
 </template>
 
@@ -67,7 +70,8 @@
 				userDropdown: false,
 				projectDropdown: false,
 				projectList: [],
-				drawer: false
+				drawer: false,
+				visible: false
 			}
 		},
 		created() {

+ 9 - 2
virgo.wzfrontend/console/src/router/modules/business.js

@@ -1,9 +1,16 @@
 const business = [{
 	path: 'business/organization',
 	component: () => import('@/views/work/business/organization'),
-	name: '企业管理',
+	name: '企业客户',
 	meta: {
-		title: '企业管理'
+		title: '企业客户'
+	}
+}, {
+	path: 'business/client',
+	component: () => import('@/views/work/business/client'),
+	name: '个人客户',
+	meta: {
+		title: '个人客户'
 	}
 }]
 export default business;

+ 14 - 0
virgo.wzfrontend/console/src/router/modules/contract.js

@@ -19,5 +19,19 @@ const contract = [{
 	meta: {
 		title: '合同列表'
 	}
+}, {
+	path: 'contract/organization',
+	component: () => import('@/views/work/contract/organization'),
+	name: '公司合同',
+	meta: {
+		title: '公司合同'
+	}
+}, {
+	path: 'contract/client',
+	component: () => import('@/views/work/contract/client'),
+	name: '个人合同',
+	meta: {
+		title: '个人合同'
+	}
 }]
 export default contract;

+ 3 - 3
virgo.wzfrontend/console/src/uitls/index.js

@@ -460,8 +460,8 @@ export function constData(documentElement) {
 	for (var i = 0; i < documentElement.length; i++) {
 		let elem = documentElement[i];
 		let id = elem.getAttribute('id'),
-			name = elem.getAttribute('inputtype');
-		if (!name || name == 'null' || elem.innerText == '申请章' || elem.innerText == '确认签名' || elem.innerText ==
+			name = elem.getAttribute('updatetype');
+		if (!name || name == 'null' || elem.innerText == '申请章' || elem.innerText == '确认签名' || elem.innerText ==
 			'使用注册章')
 			continue;
 		if (!obj[name]) obj[name] = {};
@@ -488,7 +488,7 @@ export function constData(documentElement) {
 				"img")[0].getAttribute('src');
 			continue;
 		}
-		if (elem.innerText != '申请章' && elem.innerText != '确认签名' && elem.innerText != '使用注册章' && elem.innerText !=
+		if (elem.innerText != '申请章' && elem.innerText != '确认签名' && elem.innerText != '使用注册章' && elem.innerText !=
 			'上传图片') obj[name][id] = elem.innerText == null ? '' : elem.innerText;
 	}
 	return obj;

+ 13 - 6
virgo.wzfrontend/console/src/views/system/log.vue

@@ -26,12 +26,19 @@
 					<div class="log-item">1、新增获取合同列表、创建合同、编辑合同的功能。</div>
 					<div class="log-item">2、新增合同服务条款的功能。</div>
 				</div>
-			</el-timeline-item>
-			<el-timeline-item timestamp="2024-06-11" placement="top">
-				<div class="log-box">
-					<div class="log-item">1、新增合同详情的功能、合同列表筛选功能。</div>
-					<div class="log-item">2、将合同字段填入文档中。</div>
-				</div>
+			</el-timeline-item>
+			<el-timeline-item timestamp="2024-06-11" placement="top">
+				<div class="log-box">
+					<div class="log-item">1、新增合同详情的功能、合同列表筛选功能。</div>
+					<div class="log-item">2、将合同字段填入文档中。</div>
+				</div>
+			</el-timeline-item>
+			<el-timeline-item timestamp="2024-06-12" placement="top">
+				<div class="log-box">
+					<div class="log-item">1、完成文档中:申请印章、印章审核、印章渲染的功能。</div>
+					<div class="log-item">2、新增文档模板字段详情以及文档模板字段操作的功能。</div>
+					<div class="log-item">3、新增公司合同、个人合同的功能。</div>
+				</div>
 			</el-timeline-item>
 		</el-timeline>
 	</div>

+ 194 - 0
virgo.wzfrontend/console/src/views/work/business/client.vue

@@ -0,0 +1,194 @@
+<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">
+			<list-filter type="customer" @filter="filterInit"></list-filter>
+			<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="客户类型">
+						<template slot-scope="scope">
+							<span>{{$field.findTypeName('customerType',scope.row.type)}}</span>
+						</template>
+					</el-table-column>
+					<el-table-column label="客户名称" prop="name"></el-table-column>
+					<el-table-column label="客户行业" prop="customerIndustry"></el-table-column>
+					<el-table-column label="需求区间" prop="demand"></el-table-column>
+					<el-table-column label="跟进记录" width="100">
+						<template slot-scope="scope">
+							<div class="hui-table-operation">
+								<span class="table-operation" @click="lookCustomer(scope.row,'followUpRecord')">
+									查看
+								</span>
+							</div>
+						</template>
+					</el-table-column>
+					<el-table-column label="邀请状态" width="150">
+						<template slot-scope="scope">
+							<div v-if="!scope.row.status" class="hui-state">
+								<span class="hui-state-bage hui-state-primary"></span>
+								<span class="hui-state-label">待邀请</span>
+							</div>
+							<div v-if="scope.row.status == 1" class="hui-state">
+								<span class="hui-state-bage hui-state-info"></span>
+								<span class="hui-state-label">邀请中</span>
+							</div>
+							<div v-if="scope.row.status == 2" class="hui-state">
+								<span class="hui-state-bage hui-state-success"></span>
+								<span class="hui-state-label">通过邀请</span>
+							</div>
+							<div v-if="scope.row.status == 3" class="hui-state">
+								<span class="hui-state-bage hui-state-error"></span>
+								<span class="hui-state-label">拒绝邀请</span>
+							</div>
+						</template>
+					</el-table-column>
+					<el-table-column label="操作" width="200">
+						<template slot-scope="scope">
+							<div class="hui-table-operation">
+								<span class="table-operation" @click="lookCustomer(scope.row,'customer')">详情</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 :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="type === 'customer'?'客户详情':'跟进列表'" :visible.sync="drawer" :size="400" :append-to-body="true">
+			<detail v-if="drawer && type === 'customer'" :detailId="detailId"></detail>
+			<follow-up-record-detail v-if="drawer && type === 'followUpRecord'" :detailId="detailId">
+			</follow-up-record-detail>
+		</el-drawer>
+	</div>
+</template>
+
+<script>
+	import {
+		getCustomerListByPage,
+		deleteCustomerById,
+		updateCustomer,
+		getCustomerCount
+	} from '@/httpApi/crm'
+	import {
+		testPhone
+	} from '@/httpApi/organization'
+	import edit from '@/components/work/crm/customer/edit'
+	import detail from '@/components/work/crm/customer/detail'
+	import followUpRecordDetail from '@/components/work/crm/customer/followUpRecordDetail'
+	import listFilter from '@/components/common/listFilter'
+	export default {
+		data() {
+			return {
+				tableData: [],
+				currPage: 1,
+				pageSize: 10,
+				totalCount: 0,
+				visible: false,
+				detailId: '',
+				isUpdate: false,
+				drawer: false,
+				type: 'customer',
+				filterOption: {},
+			}
+		},
+		created() {
+			this.init();
+		},
+		methods: {
+			init() {
+				let postData = {
+					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);
+				getCustomerListByPage(postData).then(res => {
+					if (res.state) {
+						this.tableData = res.data.dataList;
+						this.totalCount = res.data.totalCount;
+					}
+				})
+			},
+			filterInit(option) {
+				this.filterOption = option;
+				this.currPage = 1;
+				this.init();
+			},
+			currentChange(currPage) {
+				this.currPage = currPage;
+				this.init();
+			},
+			insertCustomer() {
+				this.isUpdate = false;
+				this.visible = true;
+			},
+			updateCustomer(val) {
+				this.detailId = val.id;
+				this.isUpdate = true;
+				this.visible = true;
+			},
+			lookCustomer(val, type) {
+				this.detailId = val.id;
+				this.type = type;
+				this.drawer = true;
+			},
+			callback(type) {
+				if (type === 'init') this.init();
+				this.visible = false;
+			}
+		},
+		components: {
+			edit,
+			detail,
+			followUpRecordDetail,
+			listFilter,
+		},
+	}
+</script>
+
+<style lang="scss">
+	.customer-test {
+		padding: 15px 20px;
+		display: flex;
+
+		.test-item {
+			border-right: 1px solid $--color-border;
+			width: 160px;
+			margin-right: 20px;
+
+			.name {
+				font-size: 12px;
+				opacity: 0.8;
+			}
+
+			.label {
+				font-size: 16px;
+				font-weight: 600;
+				padding-top: 5px;
+			}
+		}
+	}
+
+	.customer-line {
+		height: 12px;
+		background: $--background;
+	}
+</style>

+ 3 - 2
virgo.wzfrontend/console/src/views/work/business/organization.vue

@@ -157,8 +157,9 @@
 					bindProject({
 						organizationId: this.$store.getters.organization.id,
 						projectId: this.$store.getters.project.id,
-						merchantId: organizationId,
-						identityId: 3
+						merchantId: item.id,
+						bindOrganizationId: organizationId,
+						identityId: 4
 					}).then(res => {
 						if (res.state) {
 							updateOrganization({

+ 148 - 0
virgo.wzfrontend/console/src/views/work/contract/client.vue

@@ -0,0 +1,148 @@
+<template>
+	<div class="hui-flex hui-content">
+		<div class="hui-flex" v-if="type === 'list'">
+			<div class="hui-content-title">
+				<div class="hui-title-item active">合同列表</div>
+			</div>
+			<div class="hui-flex-box hui-flex hui-table">
+				<list-filter type="contract" @filter="filterInit"></list-filter>
+				<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="code"></el-table-column>
+						<el-table-column label="租客" prop="name">
+							<template slot-scope="scope">
+								{{scope.row.tenantType === 1 ? scope.row.merchantName: scope.row.clientName}}
+							</template>
+						</el-table-column>
+						<el-table-column label="房号" prop="projectItemTargetRoomIds">
+							<template slot-scope="scope">
+								<div class="hui-ellipsis">
+									<span v-for="(item,index) in scope.row.roomMap">
+										{{item}}、
+									</span>
+								</div>
+							</template>
+						</el-table-column>
+						<el-table-column label="开始日" prop="startDate"></el-table-column>
+						<el-table-column label="结束日" prop="endDate"></el-table-column>
+						<el-table-column label="运营跟进人" prop="operatorName"></el-table-column>
+						<el-table-column label="操作" width="150">
+							<template slot-scope="scope">
+								<div class="hui-table-operation">
+									<span class="table-operation" @click="detailItem(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>
+		</div>
+		<div class="hui-flex" v-else>
+			<div class="hui-nav">
+				<el-page-header @back="type = 'list'" :content="type === 'edit'?'新建合同':'合同详情'"></el-page-header>
+			</div>
+			<edit v-if="type === 'edit'" class="hui-flex-box" @callback="callback" :detailId="detailId"></edit>
+			<detail v-else class="hui-flex-box" @callback="callback" :detailId="detailId"></detail>
+		</div>
+	</div>
+</template>
+
+<script>
+	import edit from '@/components/work/contract/list/edit'
+	import detail from '@/components/work/contract/list/detail'
+	import listFilter from '@/components/common/listFilter'
+	import {
+		getContractListByPage,
+		deleteContractById
+	} from '@/httpApi/contract'
+	import {
+		bindProjectDetail
+	} from '@/httpApi/organization'
+	export default {
+		data() {
+			return {
+				type: 'list',
+				tableData: [],
+				currPage: 1,
+				pageSize: 10,
+				totalCount: 0,
+				detailId: '',
+				filterOption: {},
+				clientId: ''
+			}
+		},
+		created() {
+			bindProjectDetail({
+				userId: this.$store.getters.user.userId,
+				identityId: 1
+			}).then(res => {
+				if (res.state) {
+					if (res.data.length == 0) return;
+					this.clientId = res.data[0].clientId;
+					this.init();
+				}
+			})
+		},
+		methods: {
+			init() {
+				let postData = {
+					currPage: this.currPage,
+					pageSize: this.pageSize,
+					clientId: this.clientId,
+					projectId: this.$store.getters.project.id
+				}
+				postData = Object.assign(postData, this.filterOption);
+				getContractListByPage(postData).then(res => {
+					if (res.state) {
+						this.tableData = res.data.dataList;
+						this.totalCount = res.data.totalCount;
+					}
+				})
+			},
+			filterInit(option) {
+				this.filterOption = option;
+				this.currPage = 1;
+				this.init();
+			},
+			insert() {
+				this.detailId = '';
+				this.type = 'edit';
+			},
+			currentChange(currPage) {
+				this.currPage = currPage;
+				this.init();
+			},
+			detailItem(item) {
+				this.detailId = item.id;
+				this.type = 'detail';
+			},
+			callback(type) {
+				if (type === 'init') this.init();
+				this.type = 'list';
+			}
+		},
+		components: {
+			edit,
+			detail,
+			listFilter
+		},
+	}
+</script>
+
+<style>
+</style>

+ 2 - 1
virgo.wzfrontend/console/src/views/work/contract/list.vue

@@ -100,7 +100,8 @@
 				let postData = {
 					currPage: this.currPage,
 					pageSize: this.pageSize,
-					organizationId: this.$store.getters.organization.id
+					organizationId: this.$store.getters.organization.id,
+					projectId: this.$store.getters.project.id
 				}
 				postData = Object.assign(postData, this.filterOption);
 				getContractListByPage(postData).then(res => {

+ 148 - 0
virgo.wzfrontend/console/src/views/work/contract/organization.vue

@@ -0,0 +1,148 @@
+<template>
+	<div class="hui-flex hui-content">
+		<div class="hui-flex" v-if="type === 'list'">
+			<div class="hui-content-title">
+				<div class="hui-title-item active">合同列表</div>
+			</div>
+			<div class="hui-flex-box hui-flex hui-table">
+				<list-filter type="contract" @filter="filterInit"></list-filter>
+				<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="code"></el-table-column>
+						<el-table-column label="租客" prop="name">
+							<template slot-scope="scope">
+								{{scope.row.tenantType === 1 ? scope.row.merchantName: scope.row.clientName}}
+							</template>
+						</el-table-column>
+						<el-table-column label="房号" prop="projectItemTargetRoomIds">
+							<template slot-scope="scope">
+								<div class="hui-ellipsis">
+									<span v-for="(item,index) in scope.row.roomMap">
+										{{item}}、
+									</span>
+								</div>
+							</template>
+						</el-table-column>
+						<el-table-column label="开始日" prop="startDate"></el-table-column>
+						<el-table-column label="结束日" prop="endDate"></el-table-column>
+						<el-table-column label="运营跟进人" prop="operatorName"></el-table-column>
+						<el-table-column label="操作" width="150">
+							<template slot-scope="scope">
+								<div class="hui-table-operation">
+									<span class="table-operation" @click="detailItem(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>
+		</div>
+		<div class="hui-flex" v-else>
+			<div class="hui-nav">
+				<el-page-header @back="type = 'list'" :content="type === 'edit'?'新建合同':'合同详情'"></el-page-header>
+			</div>
+			<edit v-if="type === 'edit'" class="hui-flex-box" @callback="callback" :detailId="detailId"></edit>
+			<detail v-else class="hui-flex-box" @callback="callback" :detailId="detailId"></detail>
+		</div>
+	</div>
+</template>
+
+<script>
+	import edit from '@/components/work/contract/list/edit'
+	import detail from '@/components/work/contract/list/detail'
+	import listFilter from '@/components/common/listFilter'
+	import {
+		getContractListByPage,
+		deleteContractById
+	} from '@/httpApi/contract'
+	import {
+		bindProjectDetail
+	} from '@/httpApi/organization'
+
+	export default {
+		data() {
+			return {
+				type: 'list',
+				tableData: [],
+				currPage: 1,
+				pageSize: 10,
+				totalCount: 0,
+				detailId: '',
+				filterOption: {},
+				merchantId: ''
+			}
+		},
+		created() {
+			bindProjectDetail({
+				bindOrganizationId: this.$store.getters.organization.id
+			}).then(res => {
+				if (res.state) {
+					if (res.data.length == 0) return;
+					this.merchantId = res.data[0].merchantId;
+					this.init();
+				}
+			})
+		},
+		methods: {
+			init() {
+				let postData = {
+					currPage: this.currPage,
+					pageSize: this.pageSize,
+					merchantId: this.merchantId,
+					projectId: this.$store.getters.project.id
+				}
+				postData = Object.assign(postData, this.filterOption);
+				getContractListByPage(postData).then(res => {
+					if (res.state) {
+						this.tableData = res.data.dataList;
+						this.totalCount = res.data.totalCount;
+					}
+				})
+			},
+			filterInit(option) {
+				this.filterOption = option;
+				this.currPage = 1;
+				this.init();
+			},
+			insert() {
+				this.detailId = '';
+				this.type = 'edit';
+			},
+			currentChange(currPage) {
+				this.currPage = currPage;
+				this.init();
+			},
+			detailItem(item) {
+				this.detailId = item.id;
+				this.type = 'detail';
+			},
+			callback(type) {
+				if (type === 'init') this.init();
+				this.type = 'list';
+			}
+		},
+		components: {
+			edit,
+			detail,
+			listFilter
+		},
+	}
+</script>
+
+<style>
+</style>

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/index.html


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 1
virgo.wzfrontend/src/main/resources/static/static/css/17.1f9d67c5.css


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/static/css/578.096e91e5.css


virgo.wzfrontend/src/main/resources/static/static/css/102.48fa06e5.css → virgo.wzfrontend/src/main/resources/static/static/css/192.48fa06e5.css


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 1
virgo.wzfrontend/src/main/resources/static/static/css/197.15cb5418.css


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/static/css/359.67238434.css


virgo.wzfrontend/src/main/resources/static/static/css/6.863e2be4.css → virgo.wzfrontend/src/main/resources/static/static/css/375.863e2be4.css


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/static/css/465.b6c7aaf0.css


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/static/css/525.bedeeaa7.css


virgo.wzfrontend/src/main/resources/static/static/css/838.863e2be4.css → virgo.wzfrontend/src/main/resources/static/static/css/568.863e2be4.css


virgo.wzfrontend/src/main/resources/static/static/css/636.f43f4c00.css → virgo.wzfrontend/src/main/resources/static/static/css/813.f43f4c00.css


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 1
virgo.wzfrontend/src/main/resources/static/static/css/842.1f9d67c5.css


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/static/css/850.32d3f99b.css


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/static/css/893.67238434.css


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/static/css/906.bedeeaa7.css


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 1
virgo.wzfrontend/src/main/resources/static/static/css/924.15cb5418.css


virgo.wzfrontend/src/main/resources/static/static/css/972.f43f4c00.css → virgo.wzfrontend/src/main/resources/static/static/css/994.f43f4c00.css


virgo.wzfrontend/src/main/resources/static/static/css/449.48fa06e5.css → virgo.wzfrontend/src/main/resources/static/static/css/999.48fa06e5.css


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/static/js/654-legacy.3f66ce42.js


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/static/js/153-legacy.6c14061c.js


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 1
virgo.wzfrontend/src/main/resources/static/static/js/17-legacy.3c1572db.js


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/static/js/181.39f25f67.js


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/static/js/102-legacy.2949c979.js


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 1
virgo.wzfrontend/src/main/resources/static/static/js/197-legacy.853f0344.js


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/static/js/578-legacy.ca36881e.js


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/static/js/293.adf2df45.js


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/static/js/359.c8cf2514.js


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/static/js/375.0a221a0c.js


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/static/js/419-legacy.b1d51d57.js


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/static/js/419.165312a4.js


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/static/js/465-legacy.bc1a59db.js


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/static/js/202.4f9dd28b.js


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/static/js/498-legacy.2517fa46.js


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/static/js/499-legacy.60884805.js


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/static/js/499.a092887d.js


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/static/js/510.0d070746.js


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/static/js/525-legacy.fc98d606.js


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/static/js/525.8a7c2b40.js


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/static/js/529-legacy.97d327f8.js


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 1
virgo.wzfrontend/src/main/resources/static/static/js/529-legacy.b417da01.js


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/static/js/529.045ffcf5.js


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 1
virgo.wzfrontend/src/main/resources/static/static/js/529.a938767d.js


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/static/js/838-legacy.bde41c88.js


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 1
virgo.wzfrontend/src/main/resources/static/static/js/6.a1fd04c8.js


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 1
virgo.wzfrontend/src/main/resources/static/static/js/61-legacy.20a0bb66.js


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/static/js/61-legacy.6c783e3d.js


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 1
virgo.wzfrontend/src/main/resources/static/static/js/61.20a0bb66.js


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/static/js/61.6c783e3d.js


virgo.wzfrontend/src/main/resources/static/static/js/64.4351bf83.js → virgo.wzfrontend/src/main/resources/static/static/js/64.c6e44433.js


virgo.wzfrontend/src/main/resources/static/static/js/656-legacy.b63345d8.js → virgo.wzfrontend/src/main/resources/static/static/js/656-legacy.881cab5a.js


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/static/js/689.42351db0.js


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/static/js/709-legacy.78400548.js


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/static/js/709.452c3cf5.js


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/static/js/740.b8ec6d25.js


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/static/js/636-legacy.6c99893f.js


virgo.wzfrontend/src/main/resources/static/static/js/836-legacy.a695668c.js → virgo.wzfrontend/src/main/resources/static/static/js/836-legacy.80c1c45c.js


virgo.wzfrontend/src/main/resources/static/static/js/836.54fa45a6.js → virgo.wzfrontend/src/main/resources/static/static/js/836.25868d7a.js


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 1
virgo.wzfrontend/src/main/resources/static/static/js/842.d08f2115.js


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/static/js/850-legacy.e6bb0e63.js


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/static/js/850.c9b41997.js


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/static/js/893-legacy.b140c90d.js


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/static/js/906-legacy.7ccc2789.js


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/static/js/919-legacy.671c405d.js


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 1
virgo.wzfrontend/src/main/resources/static/static/js/924.1aca7843.js


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 1
virgo.wzfrontend/src/main/resources/static/static/js/972.a2ae0f64.js


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/static/js/994.814993ae.js


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/static/js/449.f3eea1e6.js


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/static/js/app-legacy.7303e0eb.js


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 1
virgo.wzfrontend/src/main/resources/static/static/js/app-legacy.86f09e92.js


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/static/js/app.4afb5347.js


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 1
virgo.wzfrontend/src/main/resources/static/static/js/app.874ee3de.js