|
@@ -0,0 +1,433 @@
|
|
|
+<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" type="primary" @click="submit">保 存</el-button>
|
|
|
+ <el-button size="medium" @click="$emit('close')">取 消</el-button>
|
|
|
+ </div>
|
|
|
+ <el-dialog 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 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 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>
|
|
|
+ </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>
|
|
|
+ </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 verifyQr from '@/components/verifyQr';
|
|
|
+ import {
|
|
|
+ getUserInfo
|
|
|
+ } from '@/httpApi/loginRegister';
|
|
|
+ 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;
|
|
|
+ console.log(this.contextData);
|
|
|
+ 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(() => {
|
|
|
+ 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);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ },
|
|
|
+ domRender(type, elem, id) {
|
|
|
+ elem.innerHTML = '';
|
|
|
+ switch (type) {
|
|
|
+ case 'context':
|
|
|
+ $(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':
|
|
|
+ elem.innerHTML = '<div class="sureSeal"">申请印章</div>';
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ },
|
|
|
+ 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]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+ },
|
|
|
+ renderDom(i, j, text) {
|
|
|
+ switch (i) {
|
|
|
+ case 'seal':
|
|
|
+ if (text == '') return;
|
|
|
+ $('#' + j)[0].className = '';
|
|
|
+ $('#' + 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;
|
|
|
+ }
|
|
|
+ },
|
|
|
+ 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') {
|
|
|
+ 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 + '"/>');
|
|
|
+ })
|
|
|
+ }
|
|
|
+ }
|
|
|
+ })
|
|
|
+ });
|
|
|
+ },
|
|
|
+ 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;
|
|
|
+ _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;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ });
|
|
|
+ },
|
|
|
+ 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;
|
|
|
+ }
|
|
|
+ }
|
|
|
+</style>
|