From fb32eb71ac39a71d911516deb1f09e65d824f3fc Mon Sep 17 00:00:00 2001 From: licp <lichunping@guanfang.com.cn> Date: 星期三, 18 十二月 2024 13:10:40 +0800 Subject: [PATCH] 完成cnas8.4迁移 --- src/components/view/a8-distribution-retrieval-records-all-documents.vue | 501 ++++++++ src/components/tool/value-table.vue | 215 ++- src/components/view/a8-obsolete-document-destruction-records.vue | 440 +++++++ src/components/view/a8-periodic-document-review-records.vue | 592 ++++++++++ src/components/view/a8-document-revision-request-approval-records.vue | 856 ++++++++++++++ src/components/view/a8-external-document-confirmation-records.vue | 377 ++++++ src/components/view/a8-document-approval-records.vue | 394 ++++++ src/util/downHtmlToPDF.js | 22 src/assets/api/controller.js | 78 + 9 files changed, 3,411 insertions(+), 64 deletions(-) diff --git a/src/assets/api/controller.js b/src/assets/api/controller.js index 527cd79..3d05fd0 100644 --- a/src/assets/api/controller.js +++ b/src/assets/api/controller.js @@ -35,6 +35,13 @@ role, insProductTemplate, manageDocumentList, + manageRecordTotal, + manageRecordCheck, + manageRecordIssueRecycle, + manageRecordIntervals, + manageRecordCancel, + manageRecordAudit, + personnel, } } @@ -467,3 +474,74 @@ checkManageDocumentAlterPdf:'/manageDocumentAlter/checkManageDocumentAlterPdf', // 鏂囦欢鍙樻洿-杞崲娴� exportManageDocumentAlter:'/manageDocumentAlter/exportManageDocumentAlter', // 鏂囦欢鍙樻洿-瀵煎嚭 } + +// 8.4璁板綍鐨勬帶鍒�--澶栨潵鏂囦欢纭璁板綍 +const manageRecordTotal = { + pageManageRecordTotal:'/manageRecordTotal/pageManageRecordTotal',//鍘嗗彶--鍒楄〃 + submitManageRecordTotal:'/manageRecordTotal/submitManageRecordTotal',//鍘嗗彶--鎻愪氦 + ratifyManageRecordTotal:'/manageRecordTotal/ratifyManageRecordTotal',//鍘嗗彶--瀹℃牳 + pageManageRecordVerify:'/manageRecordVerify/pageManageRecordVerify',//濉啓--鍒楄〃 + addManageRecordVerify:'/manageRecordVerify/addManageRecordVerify',//濉啓--鏂板 + delManageRecordVerify:'/manageRecordVerify/delManageRecordVerify',//濉啓--鍒犻櫎 + doManageRecordVerify:'/manageRecordVerify/doManageRecordVerify',//濉啓--淇敼 + exportManageRecordVerify:'/manageRecordVerify/exportManageRecordVerify',//濉啓--瀵煎叆 +} +// 8.4璁板綍鐨勬帶鍒�--鏂囦欢瀹℃壒璁板綍 +const manageRecordCheck = { + pageManageRecordCheck:'/manageRecordCheck/pageManageRecordCheck ',//鍒楄〃 + addManageRecordCheck:'/manageRecordCheck/addManageRecordCheck ',//鏂板 + doManageRecordCheck:'/manageRecordCheck/doManageRecordCheck ',//缂栬緫 + delManageRecordCheck:'/manageRecordCheck/delManageRecordCheck ',//鍒犻櫎 + checkManageRecordCheck:'/manageRecordCheck/checkManageRecordCheck ',//瀹℃牳 + ratifyManageRecordCheck:'/manageRecordCheck/ratifyManageRecordCheck ',//鎵瑰噯 + exportOutManageRecordCheck:'/manageRecordCheck/exportOutManageRecordCheck ',//瀵煎嚭 + exportInManageRecordCheck:'/manageRecordCheck/exportInManageRecordCheck',//瀵煎叆 +} + +// 8.4璁板綍鐨勬帶鍒�--鏂囦欢鍙戞斁鍥炴敹璁板綍 +const manageRecordIssueRecycle = { + pageManageRecordIssueRecycle:'/manageRecordIssueRecycle/pageManageRecordIssueRecycle',//鍒楄〃 + delManageRecordIssueRecycle:'/manageRecordIssueRecycle/delManageRecordIssueRecycle',//鍒犻櫎 + addManageRecordIssueRecycle:'/manageRecordIssueRecycle/addManageRecordIssueRecycle',//鏂板 + doManageRecordIssueRecycle:'/manageRecordIssueRecycle/doManageRecordIssueRecycle',//缂栬緫 + exportOutManageRecordIssueRecycle:'/manageRecordIssueRecycle/exportOutManageRecordIssueRecycle',//瀵煎嚭 + exportInManageRecordIssueRecycle:'/manageRecordIssueRecycle/exportInManageRecordIssueRecycle',//瀵煎叆 +} +// 8.4璁板綍鐨勬帶鍒�--鏂囦欢瀹氭湡瀹℃煡璁板綍 +const manageRecordIntervals = { + pageManageRecordIntervals:'/manageRecordIntervals/pageManageRecordIntervals',//鍒楄〃 + addManageRecordIntervals:'/manageRecordIntervals/addManageRecordIntervals',//鏂板 + doManageRecordIntervals:'/manageRecordIntervals/doManageRecordIntervals',//缂栬緫 + delManageRecordIntervals:'/manageRecordIntervals/delManageRecordIntervals',//鍒犻櫎 + exportOutManageRecordIntervals:'/manageRecordIntervals/exportOutManageRecordIntervals',//瀵煎嚭 + exportInManageRecordIntervals:'/manageRecordIntervals/exportInManageRecordIntervals',//瀵煎叆 + pageManageRecordIntervalsTotal:'/manageRecordIntervalsTotal/pageManageRecordIntervalsTotal',//鍘嗗彶璁板綍-鍒楄〃 + submitManageRecordIntervalsTotal:'/manageRecordIntervalsTotal/submitManageRecordIntervalsTotal',//鍘嗗彶璁板綍-鎻愪氦 + ratifyManageRecordIntervalsTotal:'/manageRecordIntervalsTotal/ratifyManageRecordIntervalsTotal',//鍘嗗彶璁板綍-鎵瑰噯 +} + +// 8.4璁板綍鐨勬帶鍒�--鏂囦欢浣滃簾璁板綍 +const manageRecordCancel = { + pageManageRecordCancel:'/manageRecordCancel/pageManageRecordCancel',//鍒楄〃 + addManageRecordCancel:'/manageRecordCancel/addManageRecordCancel',//鏂板 + doManageRecordCancel:'/manageRecordCancel/doManageRecordCancel',//缂栬緫 + delManageRecordCancel:'/manageRecordCancel/delManageRecordCancel',//鍒犻櫎 + ratifyManageRecordCancel:'/manageRecordCancel/ratifyManageRecordCancel',//鎵瑰噯 + exportOutManageRecordCancel:'/manageRecordCancel/exportOutManageRecordCancel',//瀵煎嚭 + exportInManageRecordCancel:'/manageRecordCancel/exportInManageRecordCancel',//瀵煎叆 +} + +// 8.4璁板綍鐨勬帶鍒�--鏂囦欢淇 +const manageRecordAudit = { + pageManageRecordAudit:'/manageRecordAudit/pageManageRecordAudit', // 鍒楄〃 + addManageRecordAudit:'/manageRecordAudit/addManageRecordAudit', // 鏂板 + doManageRecordAudit:'/manageRecordAudit/doManageRecordAudit', // 缂栬緫 + delManageRecordAudit:'/manageRecordAudit/delManageRecordAudit', // 鍒犻櫎 + ratifyManageRecordAudit:'/manageRecordAudit/ratifyManageRecordAudit', // 鎵瑰噯 + exportOutManageRecordAudit:'/manageRecordAudit/exportOutManageRecordAudit', // 瀵煎嚭鍒楄〃 +} + +// 6.2 浜哄憳 +const personnel = { + selectCNSAPersonTree: '/personBasicInfo/selectCNSAPersonTree', // 鏌ヨCNAS浜哄憳渚ц竟鏍� +} diff --git a/src/components/tool/value-table.vue b/src/components/tool/value-table.vue index 4d7ee4a..32d996a 100644 --- a/src/components/tool/value-table.vue +++ b/src/components/tool/value-table.vue @@ -4,10 +4,6 @@ height: 100%; overflow-y: auto; } - >>>.el-table__row { - cursor: move; - position: relative; - } .table { width: 100%; @@ -117,28 +113,44 @@ <template> <div class="value-table"> <div class="table" :style="data.isPage!=undefined&&data.isPage!=true?'height:100%':''"> - <el-table ref="eltable" :data="tableData" style="width: 100%;" height="100%" tooltip-effect="dark" border - @selection-change="selectChange" @select="select" v-loading="loading" @sort-change="sortChange" - @row-click="rowClick" :show-summary="data.countFleid!=undefined && data.countFleid.length > 0" - :summary-method="getSummaries" :row-class-name="tableRowClassName" :row-key="record=>record[rowKey]" - :current-row-key="data.currentId" :highlight-current-row="data.highlight===undefined||data.highlight" - :span-method="spanMethod" :key="specialKey" :class="{sortable:data.sortable}"> - <el-table-column type="selection" :width="selectionWidth" v-if="data.showSelect" :key="Math.random()"> + <el-table + ref="eltable" + v-loading="loading" + :data="tableData" + style="width: 100%;" + height="100%" + tooltip-effect="dark" + element-loading-text="鍔犺浇涓�..." + :border="true" + :show-summary="data.countFleid!=undefined && data.countFleid.length > 0" + :summary-method="getSummaries" + :row-class-name="tableRowClassName" + :row-key="record=>record[rowKey]" + :current-row-key="data.currentId" + :highlight-current-row="data.highlight===undefined||data.highlight" + :span-method="spanMethod" + :key="specialKey" + @selection-change="selectChange" + @select="select" + @sort-change="sortChange" + @row-click="rowClick" + element-loading-spinner="el-icon-loading"> + <el-table-column :reserve-selection="isReserveSelection" type="selection" :width="selectionWidth" v-if="data.showSelect" :key="Math.random()"> </el-table-column> <el-table-column type="index" align="center" label="搴忓彿" :width="selectionWidth" v-if="data.isIndex" :key="Math.random()"> </el-table-column> - <el-table-column :prop="a.label" :label="a.value" :sortable="a.sort === 'custom' ? 'custom' : false" :isColumnWidth="isColumnWidth" :isShowZero="isShowZero" - v-for="(a, ai) in tableHead" :key="ai+'bbbbb'" show-overflow-tooltip :min-width="columnMinWidth" v-if="!data.headNoShow||(data.headNoShow&&data.headNoShow.length==0)||(data.headNoShow&&data.headNoShow.length>0&&!data.headNoShow.find(d=>d==a.label))"> + <el-table-column :prop="a.label" :label="a.value" :width="a.width" :sortable="a.sort === 'custom' ? 'custom' : false" :isColumnWidth="isColumnWidth" :isShowZero="isShowZero" + v-for="(a, ai) in tableHead" :key="ai" show-overflow-tooltip :min-width="columnMinWidth" v-if="!data.headNoShow||(data.headNoShow&&data.headNoShow.length==0)||(data.headNoShow&&data.headNoShow.length>0&&!data.headNoShow.find(d=>d==a.label))"> <template slot-scope="scope"> <div v-if="showType(a.label, data.tagField) != null"> <template v-if="typeof(scope.row[a.label]) == 'object'"> <template v-for="(param, i) in scope.row[a.label]"> - <el-tag v-for="(b, bi) in data.tagField[a.label].select" :key="bi+'cccc'" v-if="b.value == param" + <el-tag v-for="(b, bi) in data.tagField[a.label].select" :key="bi" v-if="b.value == param" :type="b.type" size="medium" style="margin-right: 5px;">{{b.label}}</el-tag> </template> </template> <template v-else> - <el-tag v-for="(b, bi) in data.tagField[a.label].select" :key="bi+'ddddd'" v-show="b.value == scope.row[a.label]" + <el-tag v-for="(b, bi) in data.tagField[a.label].select" :key="bi" v-show="b.value == scope.row[a.label]" :type="b.type" size="medium">{{b.label}}</el-tag> </template> </div> @@ -183,12 +195,12 @@ </el-col> <el-col :span="16/data.row"> <el-input v-model="upData[a.label]" size="small" clearable :placeholder="`璇疯緭鍏�${a.value}`" - v-if="showType(a.label, data.selectField) == null&&!showUpload(a.label)&&!showCascader(a.label)" + v-if="showType(a.label, data.selectField) == null&&!showUpload(a.label)&&!showCascader(a.label)&&!showDatePicker(a.label)" :disabled="isDisabled(a.label)"></el-input> <el-select v-model="upData[a.label]" :multiple="data.selectField[a.label].choose" size="small" v-if="showType(a.label, data.selectField) != null" style="width: 100%;" :disabled="isDisabled(a.label)" clearable filterable> - <el-option v-for="(b, bi) in data.selectField[a.label].select" :key="bi+'eeeee'" :value="b.value" + <el-option v-for="(b, bi) in data.selectField[a.label].select" :key="bi" :value="b.value" :label="b.label"> </el-option> </el-select> @@ -205,6 +217,15 @@ v-if="showCascader(a.label)" :placeholder="`璇烽�夋嫨${a.value}`" clearable :props="data.cascaderField.props" size="small" style="width: 100%;" @change="m=>handleCascader(m,a.label)" filterable></el-cascader> + <el-date-picker + v-if="showDatePicker(a.label)" + v-model="upData[a.label]" + type="date" + size="small" + placeholder="閫夋嫨鏃ユ湡" + format="yyyy-MM-dd" + value-format="yyyy-MM-dd" style="width: 100%;"> + </el-date-picker> </el-col> </div> </div> @@ -215,12 +236,12 @@ </el-col> <el-col :span="16" :offset="1"> <el-input v-model="upData[a.label]" size="small" clearable :placeholder="`璇疯緭鍏�${a.value}`" - v-if="showType(a.label, data.selectField) == null&&!showUpload(a.label)&&!showCascader(a.label)" + v-if="showType(a.label, data.selectField) == null&&!showUpload(a.label)&&!showCascader(a.label)&&!showDatePicker(a.label)" :disabled="isDisabled(a.label)"></el-input> <el-select v-model="upData[a.label]" :multiple="data.selectField[a.label].choose" size="small" v-if="showType(a.label, data.selectField) != null" style="width: 100%;" :disabled="isDisabled(a.label)" clearable filterable> - <el-option v-for="(b, bi) in data.selectField[a.label].select" :key="bi+'fffff'" :value="b.value" + <el-option v-for="(b, bi) in data.selectField[a.label].select" :key="bi" :value="b.value" :label="b.label"></el-option> </el-select> <el-upload :action="javaApi+data.addUploadConfig.url" v-if="showUpload(a.label)" :multiple="false" @@ -234,6 +255,15 @@ <el-cascader :value="upData[a.label]" :options="data.cascaderField[a.label].tree" :show-all-levels="false" :placeholder="`璇烽�夋嫨${a.value}`" v-if="showCascader(a.label)" clearable :props="data.cascaderField.props" size="small" style="width: 100%;" @change="m=>handleCascader(m,a.label)" filterable></el-cascader> + <el-date-picker + v-if="showDatePicker(a.label)" + v-model="upData[a.label]" + type="date" + size="small" + placeholder="閫夋嫨鏃ユ湡" + format="yyyy-MM-dd" + value-format="yyyy-MM-dd" style="width: 100%;"> + </el-date-picker> </el-col> </el-row> </div> @@ -252,7 +282,7 @@ </span>{{a.value}}锛�</el-col> <el-col :span="16/data.row"> <el-input v-model="upData[a.label]" size="small" clearable :placeholder="`璇疯緭鍏�${a.value}`" - v-if="showType(a.label, data.selectField) == null&&!showUpload(a.label)&&!showCascader(a.label)"></el-input> + v-if="showType(a.label, data.selectField) == null&&!showUpload(a.label)&&!showCascader(a.label)&&!showDatePicker(a.label)"></el-input> <el-select v-model="upData[a.label]" size="small" v-if="showType(a.label, data.selectField) != null" :multiple="data.selectField[a.label].choose" style="width: 100%;" :placeholder="`璇烽�夋嫨${a.value}`" clearable filterable> @@ -271,19 +301,28 @@ <el-cascader :options="data.cascaderField[a.label].tree" v-if="showCascader(a.label)" clearable :placeholder="`璇烽�夋嫨${a.value}`" :props="data.cascaderField.props" size="small" style="width: 100%;" @change="m=>handleCascader(m,a.label)" filterable :show-all-levels="false"></el-cascader> + <el-date-picker + v-if="showDatePicker(a.label)" + v-model="upData[a.label]" + type="date" + size="small" + placeholder="閫夋嫨鏃ユ湡" + format="yyyy-MM-dd" + value-format="yyyy-MM-dd" style="width: 100%;"> + </el-date-picker> </el-col> </div> </div> <div v-else> - <el-row v-for="(a, ai) in upHead" :key="ai+'jjjjj'" style="line-height: 50px;"> + <el-row v-for="(a, ai) in upHead" :key="ai" style="line-height: 50px;"> <el-col :span="6" style="text-align: right;"><span class="required-span" v-if="showAddReq(a.label)">* </span>{{a.value}}锛�</el-col> <el-col :span="16" :offset="1"> <el-input v-model="upData[a.label]" size="small" clearable :placeholder="`璇疯緭鍏�${a.value}`" - v-if="showType(a.label, data.selectField) == null&&!showUpload(a.label)&&!showCascader(a.label)"></el-input> + v-if="showType(a.label, data.selectField) == null&&!showUpload(a.label)&&!showCascader(a.label)&&!showDatePicker(a.label)"></el-input> <el-select v-model="upData[a.label]" size="small" v-if="showType(a.label, data.selectField) != null" :multiple="data.selectField[a.label].choose" - style="width: 100%;" :placeholder="`璇烽�夋嫨${a.value}`" clearable> + style="width: 100%;" :placeholder="`璇烽�夋嫨${a.value}`" clearable filterable> <el-option v-for="(b, bi) in data.selectField[a.label].select" :key="bi+'mmmmmm'" :value="b.value" :label="b.label"></el-option> </el-select> @@ -299,6 +338,15 @@ <el-cascader :options="data.cascaderField[a.label].tree" v-if="showCascader(a.label)" clearable :placeholder="`璇烽�夋嫨${a.value}`" :props="data.cascaderField.props" size="small" style="width: 100%;" @change="m=>handleCascader(m,a.label)" filterable :show-all-levels="false"></el-cascader> + <el-date-picker + v-if="showDatePicker(a.label)" + v-model="upData[a.label]" + type="date" + size="small" + placeholder="閫夋嫨鏃ユ湡" + format="yyyy-MM-dd" + value-format="yyyy-MM-dd" style="width: 100%;"> + </el-date-picker> </el-col> </el-row> </div> @@ -336,9 +384,23 @@ </template> <script> - import Sortable from 'sortablejs'; + export default { props: { + isReserveSelection:{ + type: Boolean, + default: ()=> false + }, + dateFormat: { + type: String, + default: () => 'yyyy-MM-dd HH:mm:ss' + }, + isSelectedList: { + type: Array, + default: ()=>{ + return [] + } + }, selectionWidth: { type: String, default: () => '65' @@ -502,36 +564,21 @@ 'token': sessionStorage.getItem('token') } this.specialKey = this.specialKey+Math.random()*100; - // 鏄惁鍙嫋鍔ㄥ垪琛�--姝ゅ姛鑳芥殏鏃舵湭瀹炵幇 - if(this.data.sortable){ - this.$nextTick(() => { - this.initializeSortable() - }) - } }, + watch: { + componentData: { + handler(newVal) { + this.data = newVal; + // this.selectList(); + }, + deep: true + }, + }, methods: { - initializeSortable() { - let className =".el-table__body-wrapper > table > tbody"; - const table= document.querySelector(className); - const self = this - Sortable.create(table, { - animation: 150, //鍔ㄧ敾鏃堕暱 - handle: ".el-table__row", //鍙嫋鎷藉尯鍩焎lass - onEnd({ newIndex, oldIndex }) { - console.log(3333,newIndex, oldIndex) - const movedItem = this.tableData[oldIndex]; - this.tableData.splice(oldIndex, 1); - this.tableData.splice(newIndex, 0, movedItem); - } - }) - }, - getUpdatedOrder() { - // 鏍规嵁鎷栨嫿鍚庣殑椤哄簭鑾峰彇鏇存柊鐨勬暟鎹� - // 杩欓噷闇�瑕佸疄鐜颁綘鐨勯�昏緫 - }, - updateTableData(newOrder) { - // 鏍规嵁鏂扮殑椤哄簭鏇存柊琛ㄦ牸鏁版嵁 - // 杩欓噷闇�瑕佸疄鐜颁綘鐨勯�昏緫 + // 璁剧疆澶氶�夌姸鎬� + setSelect(row, index) { + let result = this.isSelectedList.includes(row.id) + return !result; }, rowspan(spanArr, position, spanName) { this.tableData.forEach((item, index) => { @@ -613,11 +660,14 @@ } }, rowClick(row, column, event) { - if (this.data.select) { - this.$refs['eltable'].toggleRowSelection(row) - } else { - this.$refs['eltable'].clearSelection() - this.$refs['eltable'].toggleRowSelection(row, true) + let result = this.isSelectedList.includes(row.id) + if(!result) { + if (this.data.select) { + this.$refs['eltable'].toggleRowSelection(row) + } else { + this.$refs['eltable'].clearSelection() + this.$refs['eltable'].toggleRowSelection(row, true) + } } }, sizeChange(val) { @@ -652,13 +702,27 @@ 'Content-Type': 'application/json' } }).then(res => { + this.$nextTick(); if (res.code === 201) { this.loading = false return } this.total = res.data.body.total this.tableHead = res.data.head - this.tableData = res.data.body.records + this.tableData = res.data.body.records || res.data.body + if(res.data.body.records){ + this.$emit("getTableData",res.data.body.records) + } + if(this.dateFormat.trim() == 'yyyy-MM-dd') { + const dateTimeRegex = /^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/; //鏍煎紡鍖栨椂闂翠负'yyyy-MM-dd HH:mm:ss' + this.tableData.map(item => { + Object.keys(item).forEach(val => { + if ( typeof item[val] == 'string' && dateTimeRegex.test(item[val])) { + item[val] = item[val].split(' ')[0] + } + }) + }) + } if (this.data.needSort !== undefined) { for (var i = 0; i < this.data.needSort.length; i++) { this.tableHead.forEach(item => { @@ -737,8 +801,11 @@ .spanConfig.special.main); }) } - this.loading = false + this.$nextTick(()=>{ + this.loading = false + }) }).catch(e => { + console.log(e); this.loading = false this.$message.error('璇峰埛鏂伴〉闈㈠啀灏濊瘯') }) @@ -801,6 +868,13 @@ return false; } }, + showDatePicker(label){ + if (this.data.datePicker && this.data.datePicker.find(m=>m==label)) { + return true; + } else { + return false; + } + }, handleTree(arr, value) { let label = '' for (let i = 0; i < arr.length; i++) { @@ -820,6 +894,11 @@ this.upDia = true, this.upData = this.HaveJson(row) this.upHead = this.HaveJson(this.tableHead) + if(this.data.noHead&&this.data.noHead.length>0){ + for (let i =0; i < this.data.noHead.length; i++) { + this.upHead = this.upHead.filter(item => item.label != this.data.noHead[i]) + } + } this.upHead.forEach((item, index) => { if (this.data.cascaderField && this.data.cascaderField[item.label]) { if (this.upData[item.label]) { @@ -878,7 +957,14 @@ } } else { delete row.orderBy - this.$parent[val.method](row) + if(this.$parent[val.method]){ + this.$parent[val.method](row) + }else if(this.$parent.$parent[val.method]){ + this.$parent.$parent[val.method](row) + }else if(this.$parent.$parent.$parent[val.method]){ + this.$parent.$parent.$parent[val.method](row) + } + } }, saveUpData() { @@ -982,12 +1068,13 @@ this.$message.error('璇风粰娣诲姞璇锋眰鍦板潃') return } + for (var i = 0; i < this.data.requiredAdd.length; i++) { - if (this.upData[this.data.requiredAdd[i]] === null || this.upData[this.data.requiredAdd[i]] === '') { + if (this.upData[this.data.requiredAdd[i]] === null || this.upData[this.data.requiredAdd[i]] === '' || this.upData[this.data.requiredAdd[i]] === undefined) { var list = this.upHead.filter(a => { if (a.label == this.data.requiredAdd[i]) return a }) - if (list[0].value == undefined) continue + if (list[0].value == undefined || list[0].value == null || list[0].value == '') continue this.$message.error(list[0].value + '鏄繀濉」') return } @@ -1067,7 +1154,7 @@ eleLink.click() document.body.removeChild(eleLink) }).catch(e => { - console.log(e); + // console.log(e); this.loading = false this.$message.error('璇峰埛鏂伴〉闈㈠啀灏濊瘯') }) @@ -1244,7 +1331,7 @@ }else{ return false } - } + }, } } </script> diff --git a/src/components/view/a8-distribution-retrieval-records-all-documents.vue b/src/components/view/a8-distribution-retrieval-records-all-documents.vue new file mode 100644 index 0000000..e72775c --- /dev/null +++ b/src/components/view/a8-distribution-retrieval-records-all-documents.vue @@ -0,0 +1,501 @@ +<template> + <!-- 鎵�鏈夋枃浠讹紙鍐呫�佸閮ㄦ枃浠讹級鐨勫彂鏀句笌鍥炴敹璁板綍 --> + <div class="DistributionRetrievalRecordsAllDocuments"> + <el-row class="title"> + <el-col :span="12" style="padding-left: 20px;text-align: left;">鎵�鏈夋枃浠讹紙鍐呫�佸閮ㄦ枃浠讹級鐨勫彂鏀句笌鍥炴敹璁板綍</el-col> + <el-col :span="12" style="text-align: right;"> + <el-button size="medium" type="primary" @click="openAdd" v-if="addPower">鏂板</el-button> + <el-upload :action="action" :multiple="false" + :show-file-list="false" + accept='.doc,.docx' :headers="headers" :on-change="beforeUpload" + :on-error="onError" ref='upload' v-if="upPower" :on-success="handleSuccessUp" style="display:inline-block;margin-left: 20px;"> + <el-button type="primary" size="medium">瀵煎叆</el-button></el-upload> + <el-button size="medium" type="primary" @click="handleDown" :loading="outLoading" v-if="outPower" style="display:inline-block;margin-left: 20px;">瀵煎嚭</el-button> + </el-col> + </el-row> + <div class="search"> + <div class="search_thing"> + <div class="search_label">鏂囦欢鍚嶇О锛�</div> + <div class="search_input"><el-input size="small" placeholder="璇疯緭鍏�" clearable v-model="componentData.entity.documentName" + @keyup.enter.native="refreshTable()"></el-input></div> + </div> + <div class="search_thing"> + <div class="search_label">鏂囦欢缂栧彿锛�</div> + <div class="search_input"> + <el-input size="small" placeholder="璇疯緭鍏�" clearable v-model="componentData.entity.documentCode" + @keyup.enter.native="refreshTable()"></el-input> + </div> + </div> + <div class="search_thing" style="padding-left: 30px;"> + <el-button size="small" @click="refresh()">閲� 缃�</el-button> + <el-button size="small" type="primary" @click="refreshTable()">鏌� 璇�</el-button> + </div> + </div> + <div class="table"> + <ValueTable ref="ValueTable" :url="$api.manageRecordIssueRecycle.pageManageRecordIssueRecycle" + :delUrl="$api.manageRecordIssueRecycle.delManageRecordIssueRecycle" + :componentData="componentData" :upUrl="$api.manageRecordIssueRecycle.doManageRecordIssueRecycle" :key="upIndex"/> + </div> + <el-dialog + :title="title" + :visible.sync="addDialogVisible" + width="400px" top="6vh"> + <el-row> + <el-col :span="24" style="margin-bottom: 16px;"> + <div class="search_thing"> + <div class="search_label"><span style="color: red;margin-left: 4px;">* </span>鏂囦欢缂栧彿锛�</div> + <div class="search_input"> + <el-select v-model="addInfo.documentCode" size="small" style="width: 100%;" @change="getCurrentFile" allow-create clearable filterable> + <el-option + v-for="item in fileList" + :key="item.documentCode" + :label="item.title" + :value="item.documentCode"> + </el-option> + </el-select> + </div> + </div> + </el-col> + <el-col :span="24" style="margin-bottom: 16px;"> + <div class="search_thing"> + <div class="search_label">鏂囦欢鍚嶇О锛�</div> + <div class="search_input"><el-input size="small" placeholder="璇疯緭鍏�" clearable v-model="addInfo.documentName"></el-input></div> + </div> + </el-col> + <el-col :span="24" style="margin-bottom: 16px;"> + <div class="search_thing"> + <div class="search_label">鐗堝彿锛�</div> + <div class="search_input"><el-input size="small" placeholder="璇疯緭鍏�" clearable v-model="addInfo.documentVersion"></el-input></div> + </div> + </el-col> + <el-col :span="24" style="margin-bottom: 16px;"> + <div class="search_thing"> + <div class="search_label">浠芥暟锛�</div> + <div class="search_input"><el-input size="small" placeholder="璇疯緭鍏�" clearable v-model="addInfo.pages"></el-input></div> + </div> + </el-col> + <el-col :span="24" style="margin-bottom: 16px;"> + <div class="search_thing"> + <div class="search_label">鏂囦欢绫诲埆锛�</div> + <div class="search_input"> + <el-select v-model="addInfo.documentType" placeholder="璇烽�夋嫨" size="small" style="width: 100%;"> + <el-option + v-for="item in fileType" + :key="item.value" + :label="item.label" + :value="item.value"> + </el-option> + </el-select> + </div> + </div> + </el-col> + <el-col :span="24" style="margin-bottom: 16px;"> + <div class="search_thing"> + <div class="search_label">鍒嗗彂鍙凤細</div> + <div class="search_input"><el-input size="small" placeholder="璇疯緭鍏�" clearable v-model="addInfo.number"></el-input></div> + </div> + </el-col> + <el-col :span="24" style="margin-bottom: 16px;"> + <div class="search_thing"> + <div class="search_label">鎺ュ彈浜猴細</div> + <div class="search_input"> + <el-select v-model="addInfo.receiveUser" placeholder="璇烽�夋嫨" size="small" style="width: 100%;" filterable=""> + <el-option + v-for="item in personList" + :key="item.value" + :label="item.label" + :value="item.value"> + </el-option> + </el-select> + </div> + </div> + </el-col> + <el-col :span="24" style="margin-bottom: 16px;"> + <div class="search_thing"> + <div class="search_label">鎺ユ敹閮ㄩ棬锛�</div> + <div class="search_input"> + <el-select v-model="addInfo.departLims" placeholder="璇烽�夋嫨" size="small" style="width: 100%;"> + <el-option + v-for="item in list" + :key="item.name" + :label="item.name" + :value="item.name"> + </el-option> + </el-select> + </div> + </div> + </el-col> + <el-col :span="24" style="margin-bottom: 16px;"> + <div class="search_thing"> + <div class="search_label">鎺ュ彈鏃ユ湡锛�</div> + <div class="search_input"> + <el-date-picker + v-model="addInfo.receiveDate" + type="date" + size="small" + placeholder="閫夋嫨鏃ユ湡" + format="yyyy-MM-dd" + value-format="yyyy-MM-dd" style="width: 100%;"> + </el-date-picker> + </div> + </div> + </el-col> + </el-row> + <span slot="footer" class="dialog-footer"> + <el-button @click="addDialogVisible = false">鍙� 娑�</el-button> + <el-button type="primary" @click="handleAdd" :loading="addLoading">纭� 瀹�</el-button> + </span> + </el-dialog> + </div> +</template> + +<script> +import ValueTable from '../tool/value-table.vue' +import { + getYearAndMonthAndDays + } from '../../util/date' +export default { + components: { + ValueTable + }, + data(){ + return{ + addPower:true, + outPower:true, + upPower:true, + outLoading:false, + addLoading:false, + componentData: { + entity: { + documentName: null, + documentCode: null, + orderBy: { + field: 'id', + order: 'desc' + } + }, + isIndex: true, + showSelect: false, + select: false, + // selectMethod: 'handleChangeTask', + do: [{ + id: 'delete', + font: '鍒犻櫎', + type: 'text', + method: 'doDiy', + disabFun: (row, index) => { + return !!row.signedUser + } + }, { + id: 'handleEdit', + font: '淇敼', + type: 'text', + method: 'handleEdit', + field:[], + disabFun: (row, index) => { + return !!row.signedUser + } + },{ + id: 'handleBack', + font: '鍥炴敹', + type: 'text', + method: 'handleBack', + disabFun: (row, index) => { + return !!row.signedUser + } + }], + tagField: { + // documentType:{ + // select: [] + // }, + // receiveUserName:{ + // select: [] + // }, + }, + selectField: { + // documentType:{ + // select: [] + // }, + // receiveUserName:{ + // select: [] + // }, + }, + addUpload:['signatoryUrl'], + requiredAdd: [], + requiredUp: [], + datePicker:['receiveDate'], + noHead:['signedUserName','signedDate','departLims'],//涓嶅弬涓庢柊澧炵紪杈戠殑瀛楁 + needSort: [], + inputType:'' + }, + entityCopy: {}, + upIndex: 0, + title:'鏂板', + addDialogVisible:false, + addInfo:{}, + personList:[], + fileType:[], + fileList:[], + list:[] + } + }, + // 鐢ㄤ簬涓婁紶鏂囦欢鐨勪俊鎭� + computed: { + headers() { + return { + 'token': sessionStorage.getItem('token') + } + }, + action() { + return this.javaApi +this.$api.manageRecordIssueRecycle.exportInManageRecordIssueRecycle + } + }, + mounted() { + this.entityCopy = this.HaveJson(this.componentData.entity); + this.getPower() + this.getAuthorizedPerson() + this.selectEnumByCategory() + this.getFileList() + this.selectTreeList() + }, + methods:{ + getPower(){ + let power = JSON.parse(sessionStorage.getItem('power')) + let add = false + let del = false + let up = false; + let out = false; + let edit = false + for (var i = 0; i < power.length; i++) { + if (power[i].menuMethod == 'addManageRecordIssueRecycle') { + add = true + } + if (power[i].menuMethod == 'delManageRecordIssueRecycle') { + del = true + } + if (power[i].menuMethod == 'exportInManageRecordIssueRecycle') { + up = true + } + if (power[i].menuMethod == 'doManageRecordIssueRecycle') { + edit = true + } + if (power[i].menuMethod == 'exportOutManageRecordIssueRecycle') { + out = true + } + } + if (!add) { + this.componentData.do.splice(2, 1) + } + if (!add) { + this.componentData.do.splice(1, 1) + } + if (!del) { + this.componentData.do.splice(0, 1) + } + this.addPower = add + this.outPower = out + this.upPower = up + }, + // 鏂板 + openAdd(){ + // this.$refs.ValueTable.openAddDia(this.$api.manageRecordIssueRecycle.addManageRecordIssueRecycle); + this.addInfo = {} + this.title = '鏂板' + this.addDialogVisible = true; + }, + handleEdit(row){ + this.addInfo = row + this.title = '缂栬緫' + this.addDialogVisible = true; + }, + // 瀵煎嚭 + handleDown(){ + this.outLoading = true + this.$axios.post(this.$api.manageRecordIssueRecycle.exportOutManageRecordIssueRecycle,{entity:this.componentData.entity},{headers: { 'Content-Type': 'application/json' }}).then(res => { + this.outLoading = false + if(res.code==201) return this.$message.error('瀵煎嚭澶辫触') + this.$message.success('瀵煎嚭鎴愬姛') + let url = this.javaApi+'word/'+res.message + const link = document.createElement('a'); + link.href = url; + link.download = '鏂囦欢鍙戞斁涓庡洖鏀惰褰�'; + link.click(); + }) + }, + refreshTable() { + this.$refs['ValueTable'].selectList() + }, + refresh() { + this.componentData.entity = this.HaveJson(this.entityCopy) + this.upIndex++ + this.refreshTable() + }, + getAuthorizedPerson() { + this.$axios.get(this.$api.user.getUserMenu).then(res => { + let data = [] + res.data.forEach(a => { + data.push({ + label: a.name, + value: a.id + }) + }) + // this.componentData.tagField.receiveUserName.select = data + // this.componentData.selectField.receiveUserName.select = data + this.personList = data + }) + }, + beforeUpload(file) { + if (file.size > 1024 * 1024 * 10) { + this.$message.error('涓婁紶鏂囦欢涓嶈秴杩�10M'); + this.$refs.upload.clearFiles() + return false; + } else { + // this.upLoading = true; + return true; + } + }, + onError(err, file, fileList) { + this.$message.error('涓婁紶澶辫触') + this.$refs.upload.clearFiles() + }, + handleSuccessUp(response) { + this.upLoading = false; + if (response.code == 200) { + this.$message.success('涓婁紶鎴愬姛'); + this.$refs['ValueTable'].selectList() + }else{ + this.$message.error('涓婁紶澶辫触'); + } + }, + selectEnumByCategory() { + this.$axios.post(this.$api.enums.selectEnumByCategory, { + category: "鏂囦欢绫诲埆" + }).then(res => { + // this.componentData.tagField.documentType.select = res.data + // this.componentData.selectField.documentType.select = res.data + this.fileType = res.data + }) + }, + // 鑾峰彇鏂囦欢鍒楄〃--鏂囦欢娓呭崟 + getFileList(){ + this.$axios.post(this.$api.manageDocumentList.pageManageDocumentList,{ + entity: { + orderBy: { + field: 'createTime', + order: 'desc' + } + }, + page:{ + current:-1, + size:-1 + } + },{headers: { + 'Content-Type': 'application/json' + }}).then(res=>{ + this.fileList = res.data.body.records.map(m=>{ + m.title = m.documentCode + return m + }) + }).catch(err=>{}) + }, + getCurrentFile(e){ + let obj = this.fileList.find(m=>m.documentCode==e) + if(obj){ + this.$set(this.addInfo,'documentName',obj.name) + this.$set(this.addInfo,'documentVersion',obj.version) + this.$set(this.addInfo,'documentType',obj.type) + } + }, + handleAdd(){ + if(!this.addInfo.documentCode) return this.$message.error('璇疯緭鍏ユ枃浠剁紪鍙�') + this.addLoading = true + let obj = {} + if(this.title=='鏂板'){ + obj = this.HaveJson(this.addInfo) + }else{ + let {id,documentCode,documentName,documentVersion,pages,documentType,number,receiveUser,receiveDate,departLims} = this.addInfo + obj = {id,documentCode,documentName,documentVersion,pages,documentType,number,receiveUser,receiveDate,departLims} + } + this.$axios.post(this.$api.manageRecordIssueRecycle[this.title=='鏂板'?'addManageRecordIssueRecycle':'doManageRecordIssueRecycle'], obj,{headers: { 'Content-Type': 'application/json' },noQs:true}).then(res => { + this.addLoading = false + if (res.code == 201) { + return + } + this.addDialogVisible = false + this.$message({ + type: 'success', + message: '鎿嶄綔鎴愬姛!' + }); + this.refreshTable() + }).catch(err => {}) + }, + // 鍥炴敹 + handleBack(row){ + this.$confirm('鏄惁纭鍥炴敹?', "鎻愮ず", { + confirmButtonText: "纭畾", + cancelButtonText: "鍙栨秷", + type: "warning" + }).then(() => { + let obj = {} + let {id,documentCode,documentName,documentVersion,pages,documentType,number,receiveUser,receiveDate,departLims} = row + obj = {id,documentCode,documentName,documentVersion,pages,documentType,number,receiveUser,receiveDate,departLims,signedDate:getYearAndMonthAndDays(),signedUser:JSON.parse(localStorage.getItem("user")).userId} + this.$axios.post(this.$api.manageRecordIssueRecycle.doManageRecordIssueRecycle, obj,{headers: { 'Content-Type': 'application/json' },noQs:true}).then(res => { + this.addLoading = false + if (res.code == 201) { + return + } + this.addDialogVisible = false + this.$message({ + type: 'success', + message: '鎿嶄綔鎴愬姛!' + }); + this.refreshTable() + }).catch(err => {}) + }).catch(() => {}) + }, + // 鏌ヨ鏍戝舰鍒楄〃 + selectTreeList() { + this.$axios.get(this.$api.personnel.selectCNSAPersonTree).then((res) => { + this.list = res.data[0].children; + }); + }, + } +} +</script> + +<style scoped> +.title { + height: 60px; + line-height: 60px; + } + .search { + background-color: #fff; + height: 80px; + display: flex; + align-items: center; + } + + .search_thing { + width: 350px; + display: flex; + align-items: center; + } + + .search_label { + width: 110px; + font-size: 14px; + text-align: right; + } + + .search_input { + width: calc(100% - 110px); + } + + .table { + margin-top: 10px; + background-color: #fff; + width: calc(100% - 40px); + height: calc(100% - 60px - 80px - 10px - 40px); + padding: 20px; + } +</style> diff --git a/src/components/view/a8-document-approval-records.vue b/src/components/view/a8-document-approval-records.vue new file mode 100644 index 0000000..79c4da0 --- /dev/null +++ b/src/components/view/a8-document-approval-records.vue @@ -0,0 +1,394 @@ +<template> + <!-- 鏂囦欢瀹℃壒璁板綍 --> + <div class="DocumentApprovalRecords"> + <el-row class="title"> + <el-col :span="12" style="padding-left: 20px;text-align: left;">鏂囦欢瀹℃壒璁板綍</el-col> + <el-col :span="12" style="text-align: right;"> + <el-button size="medium" type="primary" @click="openAdd" v-if="addPower">鏂板</el-button> + <el-upload :action="action" :multiple="false" + :show-file-list="false" + accept='.doc,.docx' :headers="headers" :on-change="beforeUpload" + :on-error="onError" ref='upload' v-if="upPower" :on-success="handleSuccessUp" style="display:inline-block;margin-left: 20px;"> + <el-button type="primary" size="medium">瀵煎叆</el-button></el-upload> + <el-button size="medium" type="primary" @click="handleDown" :loading="outLoading" v-if="outPower" style="display:inline-block;margin-left: 20px;">瀵煎嚭</el-button> + </el-col> + </el-row> + <div class="search"> + <div class="search_thing"> + <div class="search_label">鏂囦欢鍚嶇О锛�</div> + <div class="search_input"><el-input size="small" placeholder="璇疯緭鍏�" clearable v-model="componentData.entity.documentName" + @keyup.enter.native="refreshTable()"></el-input></div> + </div> + <div class="search_thing"> + <div class="search_label">鏂囦欢缂栧彿锛�</div> + <div class="search_input"> + <el-input size="small" placeholder="璇疯緭鍏�" clearable v-model="componentData.entity.documentCode" + @keyup.enter.native="refreshTable()"></el-input> + </div> + </div> + <div class="search_thing" style="padding-left: 30px;"> + <el-button size="small" @click="refresh()">閲� 缃�</el-button> + <el-button size="small" type="primary" @click="refreshTable()">鏌� 璇�</el-button> + </div> + </div> + <div class="table"> + <ValueTable ref="ValueTable" :url="$api.manageRecordCheck.pageManageRecordCheck" + :delUrl="$api.manageRecordCheck.delManageRecordCheck" + :componentData="componentData" :dateFormat="'yyyy-MM-dd'" :upUrl="$api.manageRecordCheck.doManageRecordCheck" :key="upIndex"/> + </div> + </div> +</template> + +<script> +import ValueTable from '../tool/value-table.vue' +export default { + components: { + ValueTable + }, + data(){ + return{ + addPower:true, + outPower:true, + upPower:true, + outLoading:false, + componentData: { + entity: { + documentName: null, + documentCode: null, + orderBy: { + field: 'id', + order: 'desc' + } + }, + init:false, + isIndex: true, + showSelect: false, + select: false, + // selectMethod: 'handleChangeTask', + do: [{ + id: 'delete', + font: '鍒犻櫎', + type: 'text', + method: 'doDiy', + disabFun: (row, index) => { + return row.checkState=='閫氳繃'||row.ratifyState=='閫氳繃' + } + }, { + id: 'update', + font: '淇敼', + type: 'text', + method: 'doDiy', + field:[], + disabFun: (row, index) => { + return row.checkState=='閫氳繃'||row.ratifyState=='閫氳繃' + } + },{ + id: 'handleCheck', + font: '瀹℃牳', + type: 'text', + method: 'handleCheck', + disabFun: (row, index) => { + return row.checkState=='閫氳繃'||row.ratifyState=='閫氳繃' + } + },{ + id: 'handleApproval', + font: '鎵瑰噯', + type: 'text', + method: 'handleApproval', + disabFun: (row, index) => { + return row.ratifyState=='閫氳繃' + } + }], + tagField: { + writeUser:{ + select: [] + }, + checkUser:{ + select: [] + }, + ratifyUser:{ + select: [] + }, + }, + selectField: { + writeUser:{ + select: [] + }, + checkUser:{ + select: [] + }, + ratifyUser:{ + select: [] + }, + }, + addUpload:['signatoryUrl'], + requiredAdd: [], + requiredUp: [], + datePicker:['ratifyDate'], + needSort: [], + inputType:'' + }, + entityCopy: {}, + upIndex: 0, + } + }, + // 鐢ㄤ簬涓婁紶鏂囦欢鐨勪俊鎭� + computed: { + headers() { + return { + 'token': sessionStorage.getItem('token') + } + }, + action() { + return this.javaApi +this.$api.manageRecordCheck.exportInManageRecordCheck + } + }, + mounted() { + this.entityCopy = this.HaveJson(this.componentData.entity); + this.getPower() + this.getAuthorizedPerson() + }, + methods:{ + getPower(){ + let power = JSON.parse(sessionStorage.getItem('power')) + let add = false + let del = false + let up = false; + let out = false; + let check = false + let ratify = false + for (var i = 0; i < power.length; i++) { + if (power[i].menuMethod == 'addManageRecordCheck') { + add = true + } + if (power[i].menuMethod == 'delManageRecordCheck') { + del = true + } + if (power[i].menuMethod == 'exportInManageRecordCheck') { + up = true + } + if (power[i].menuMethod == 'checkManageRecordCheck') { + check = true + } + if (power[i].menuMethod == 'ratifyManageRecordCheck') { + ratify = true + } + if (power[i].menuMethod == 'exportOutManageRecordCheck') { + out = true + } + } + if (!ratify) { + this.componentData.do.splice(3, 1) + } + if (!check) { + this.componentData.do.splice(2, 1) + } + if (!add) { + this.componentData.do.splice(1, 1) + } + if (!del) { + this.componentData.do.splice(0, 1) + } + this.addPower = add + this.outPower = out + this.upPower = up + }, + // 鏂板 + openAdd(){ + this.$refs.ValueTable.openAddDia(this.$api.manageRecordCheck.addManageRecordCheck); + }, + // 瀵煎嚭 + handleDown(){ + this.outLoading = true + this.$axios.post(this.$api.manageRecordCheck.exportOutManageRecordCheck,{entity:this.componentData.entity},{headers: { 'Content-Type': 'application/json' }}).then(res => { + this.outLoading = false + if(res.code==201) return this.$message.error('瀵煎嚭澶辫触') + this.$message.success('瀵煎嚭鎴愬姛') + let url = this.javaApi+'word/'+res.message + const link = document.createElement('a'); + link.href = url; + link.download = '鏂囦欢瀹℃壒璁板綍'; + link.click(); + }) + }, + refreshTable() { + this.$refs['ValueTable'].selectList() + }, + refresh() { + this.componentData.entity = this.HaveJson(this.entityCopy) + // this.upIndex++ + this.refreshTable() + }, + getAuthorizedPerson() { + this.$axios.get(this.$api.user.getUserMenu).then(res => { + let data = [] + res.data.forEach(a => { + data.push({ + label: a.name, + value: a.id + }) + }) + this.componentData.tagField.writeUser.select = data + this.componentData.selectField.writeUser.select = data + this.componentData.tagField.checkUser.select = data + this.componentData.selectField.checkUser.select = data + this.componentData.tagField.ratifyUser.select = data + this.componentData.selectField.ratifyUser.select = data + this.$refs['ValueTable'].selectList() + }) + }, + // 瀹℃牳 + handleCheck(row){ + this.$confirm('鏄惁瀹℃牳閫氳繃?', '鎻愮ず', { + confirmButtonText: '閫氳繃', + cancelButtonText: '涓嶉�氳繃', + type: 'warning', + closeOnClickModal: false, // 绂佹鐐瑰嚮閬僵灞傚叧闂� + distinguishCancelAndClose: true, + beforeClose: (action, instance, done) => { + if (action === 'confirm') { + // 鐐瑰嚮鈥滅‘瀹氣�濇寜閽紝鍏佽鍏抽棴 + this.$axios.post(this.$api.manageRecordCheck.checkManageRecordCheck, {id:row.id,checkState:'閫氳繃'}).then(res => { + if (res.code === 201) return + this.refreshTable() + done(); + this.$message({ + type: 'success', + message: '鎻愪氦鎴愬姛' + }) + }) + .catch(err => { + + }) + } else if (action === 'cancel') { + // 鐐瑰嚮鈥滃彇娑堚�濇寜閽紝涓嶅厑璁稿叧闂� + this.$axios.post(this.$api.manageRecordCheck.checkManageRecordCheck, {id:row.id,checkState:'涓嶉�氳繃'}).then(res => { + if (res.code === 201) return + this.refreshTable() + done(); + this.$message({ + type: 'success', + message: '鎻愪氦鎴愬姛' + }) + }) + .catch(err => { + + }) + console.log("鍙栨秷鎸夐挳鐐瑰嚮浜嬩欢锛屼笉鍏抽棴寮规"); + } else if (action === 'close') { + // 鐐瑰嚮鈥溍椻�濇寜閽紝涓嶅厑璁稿叧闂� + done(); + console.log("脳鎸夐挳鐐瑰嚮浜嬩欢锛屼笉鍏抽棴寮规"); + } + } + }) + }, + // 鎵瑰噯 + handleApproval(row){ + this.$confirm('鏄惁鎵瑰噯閫氳繃?', '鎻愮ず', { + confirmButtonText: '閫氳繃', + cancelButtonText: '涓嶉�氳繃', + type: 'warning', + closeOnClickModal: false, // 绂佹鐐瑰嚮閬僵灞傚叧闂� + distinguishCancelAndClose: true, + beforeClose: (action, instance, done) => { + if (action === 'confirm') { + // 鐐瑰嚮鈥滅‘瀹氣�濇寜閽紝鍏佽鍏抽棴 + this.$axios.post(this.$api.manageRecordCheck.ratifyManageRecordCheck, {id:row.id,ratifyState:'閫氳繃'}).then(res => { + if (res.code === 201) return + this.refreshTable() + done(); + this.$message({ + type: 'success', + message: '鎻愪氦鎴愬姛' + }) + }) + .catch(err => { + + }) + } else if (action === 'cancel') { + // 鐐瑰嚮鈥滃彇娑堚�濇寜閽紝涓嶅厑璁稿叧闂� + this.$axios.post(this.$api.manageRecordCheck.ratifyManageRecordCheck, {id:row.id,ratifyState:'涓嶉�氳繃'}).then(res => { + if (res.code === 201) return + this.refreshTable() + done(); + this.$message({ + type: 'success', + message: '鎻愪氦鎴愬姛' + }) + }) + .catch(err => { + + }) + console.log("鍙栨秷鎸夐挳鐐瑰嚮浜嬩欢锛屼笉鍏抽棴寮规"); + } else if (action === 'close') { + // 鐐瑰嚮鈥溍椻�濇寜閽紝涓嶅厑璁稿叧闂� + done(); + console.log("脳鎸夐挳鐐瑰嚮浜嬩欢锛屼笉鍏抽棴寮规"); + } + } + }) + }, + beforeUpload(file) { + if (file.size > 1024 * 1024 * 10) { + this.$message.error('涓婁紶鏂囦欢涓嶈秴杩�10M'); + this.$refs.upload.clearFiles() + return false; + } else { + // this.upLoading = true; + return true; + } + }, + onError(err, file, fileList) { + this.$message.error('涓婁紶澶辫触') + this.$refs.upload.clearFiles() + }, + handleSuccessUp(response) { + this.upLoading = false; + if (response.code == 200) { + this.$message.success('涓婁紶鎴愬姛'); + this.$refs['ValueTable'].selectList() + }else{ + this.$message.error('涓婁紶澶辫触'); + } + }, + } +} +</script> + +<style scoped> +.title { + height: 60px; + line-height: 60px; + } + .search { + background-color: #fff; + height: 80px; + display: flex; + align-items: center; + } + + .search_thing { + width: 350px; + display: flex; + align-items: center; + } + + .search_label { + width: 110px; + font-size: 14px; + text-align: right; + } + + .search_input { + width: calc(100% - 110px); + } + + .table { + margin-top: 10px; + background-color: #fff; + width: calc(100% - 40px); + height: calc(100% - 60px - 80px - 10px - 40px); + padding: 20px; + } +</style> diff --git a/src/components/view/a8-document-revision-request-approval-records.vue b/src/components/view/a8-document-revision-request-approval-records.vue new file mode 100644 index 0000000..63c0e9a --- /dev/null +++ b/src/components/view/a8-document-revision-request-approval-records.vue @@ -0,0 +1,856 @@ +<template> + <!-- 鏂囦欢淇鐢宠瀹℃壒璁板綍 --> + <div class="DocumentRevisionRequestApprovalRecords"> + <el-row class="title"> + <el-col :span="12" style="padding-left: 20px;text-align: left;">鏂囦欢淇鐢宠瀹℃壒璁板綍</el-col> + <el-col :span="12" style="text-align: right;"> + <el-button size="medium" type="primary" @click="openAdd" v-if="addPower">鏂板</el-button> + <!-- <el-upload :action="action" :show-file-list="false" + accept='.doc,.docx' :headers="headers" :on-change="beforeUpload" + :on-error="onError" ref='upload' v-if="upPower" :on-success="handleSuccessUp" style="display:inline-block;margin-left: 20px;"> + <el-button type="primary" size="medium">瀵煎叆</el-button></el-upload> --> + <el-button size="medium" type="primary" @click="handleDown" :loading="outLoading" v-if="outPower" style="display:inline-block;margin-left: 20px;">瀵煎嚭</el-button> + </el-col> + </el-row> + <div class="search"> + <!-- <div class="search_thing"> + <div class="search_label">鏂囦欢鍚嶇О锛�</div> + <div class="search_input"><el-input size="small" placeholder="璇疯緭鍏�" clearable v-model="componentData.entity.documentName" + @keyup.enter.native="refreshTable()"></el-input></div> + </div> --> + <div class="search_thing"> + <div class="search_label">鏂囦欢缂栧彿锛�</div> + <div class="search_input"> + <el-input size="small" placeholder="璇疯緭鍏�" clearable v-model="componentData.entity.documentCode" + @keyup.enter.native="refreshTable()"></el-input> + </div> + </div> + <div class="search_thing" style="padding-left: 30px;"> + <el-button size="small" @click="refresh()">閲� 缃�</el-button> + <el-button size="small" type="primary" @click="refreshTable()">鏌� 璇�</el-button> + </div> + </div> + <div class="table"> + <ValueTable ref="ValueTable" :url="$api.manageRecordAudit.pageManageRecordAudit" + :delUrl="$api.manageRecordAudit.delManageRecordAudit" + :componentData="componentData" :upUrl="$api.manageRecordIssueRecycle.doManageRecordIssueRecycle" :key="upIndex"/> + </div> + <el-dialog + :title="title" + :visible.sync="addDialogVisible" + width="800px" top="6vh"> + <el-row> + <el-col :span="12" style="margin-bottom: 16px;"> + <div class="search_thing"> + <div class="search_label">鐢宠绫诲瀷锛�</div> + <div class="search_input"> + <el-radio-group v-model="addInfo.method" size="small" :disabled="title.includes('鎰忚')"> + <el-radio label="淇">淇</el-radio> + <el-radio label="浣滃簾">浣滃簾</el-radio> + </el-radio-group> + </div> + </div> + </el-col> + <el-col :span="12" style="margin-bottom: 16px;"> + <div class="search_thing"> + <div class="search_label"><span style="color: red;margin-left: 4px;">* </span>鏂囦欢缂栧彿锛�</div> + <div class="search_input"> + <el-select v-model="addInfo.documentCode" size="small" style="width: 100%;" @change="getCurrentFile" allow-create clearable filterable :disabled="title.includes('鎰忚')"> + <el-option + v-for="item in fileList" + :key="item.documentCode" + :label="item.title" + :value="item.documentCode"> + </el-option> + </el-select> + </div> + </div> + </el-col> + <el-col :span="12" style="margin-bottom: 16px;"> + <div class="search_thing"> + <div class="search_label">鏂囦欢鍚嶇О锛�</div> + <div class="search_input"><el-input size="small" placeholder="璇疯緭鍏�" clearable v-model="addInfo.documentName" :disabled="title.includes('鎰忚')"></el-input></div> + </div> + </el-col> + <el-col :span="12" style="margin-bottom: 16px;"> + <div class="search_thing"> + <div class="search_label">绔犺妭鍙凤細</div> + <div class="search_input"><el-input size="small" placeholder="璇疯緭鍏�" clearable v-model="addInfo.capter" :disabled="title.includes('鎰忚')"></el-input></div> + </div> + </el-col> + <el-col :span="12" style="margin-bottom: 16px;"> + <div class="search_thing"> + <div class="search_label">椤电爜锛�</div> + <div class="search_input"><el-input size="small" placeholder="璇疯緭鍏�" clearable v-model="addInfo.pages" :disabled="title.includes('鎰忚')"></el-input></div> + </div> + </el-col> + <el-col :span="12" style="margin-bottom: 16px;"> + <div class="search_thing"> + <div class="search_label">淇敼娆℃暟锛�</div> + <div class="search_input"><el-input size="small" placeholder="璇疯緭鍏�" clearable v-model="addInfo.number" :disabled="title.includes('鎰忚')"></el-input></div> + </div> + </el-col> + <el-col :span="12" style="margin-bottom: 16px;"> + <div class="search_thing"> + <div class="search_label">淇敼鍓嶇増鏈彿锛�</div> + <div class="search_input"><el-input size="small" placeholder="璇疯緭鍏�" clearable v-model="addInfo.beforeVersion" :disabled="title.includes('鎰忚')"></el-input></div> + </div> + </el-col> + <el-col :span="12" style="margin-bottom: 16px;"> + <div class="search_thing"> + <div class="search_label">淇敼鍚庣増鏈彿锛�</div> + <div class="search_input"><el-input size="small" placeholder="璇疯緭鍏�" clearable v-model="addInfo.afterVersion" :disabled="title.includes('鎰忚')"></el-input></div> + </div> + </el-col> + <el-col :span="12" style="margin-bottom: 16px;"> + <div class="search_thing"> + <div class="search_label">淇浜猴細</div> + <div class="search_input"> + <el-select v-model="addInfo.alterUser" placeholder="璇烽�夋嫨" size="small" style="width: 100%;" filterable :disabled="title.includes('鎰忚')"> + <el-option + v-for="item in personList" + :key="item.value" + :label="item.label" + :value="item.value"> + </el-option> + </el-select> + </div> + </div> + </el-col> + <el-col :span="12" style="margin-bottom: 16px;"> + <div class="search_thing"> + <div class="search_label">鍘熷垎鍙戦儴闂細</div> + <div class="search_input"> + <el-select v-model="addInfo.beforeDepart" placeholder="璇烽�夋嫨" size="small" style="width: 100%;" :disabled="title.includes('鎰忚')"> + <el-option + v-for="item in list" + :key="item.name" + :label="item.name" + :value="item.name"> + </el-option> + </el-select> + </div> + </div> + </el-col> + <el-col :span="12" style="margin-bottom: 16px;"> + <div class="search_thing"> + <div class="search_label">淇鍚庡垎鍙戦儴闂細</div> + <div class="search_input"> + <el-select v-model="addInfo.afterDepart" placeholder="璇烽�夋嫨" size="small" style="width: 100%;" :disabled="title.includes('鎰忚')"> + <el-option + v-for="item in list" + :key="item.name" + :label="item.name" + :value="item.name"> + </el-option> + </el-select> + </div> + </div> + </el-col><el-col :span="12" style="margin-bottom: 16px;"> + <div class="search_thing"> + <div class="search_label">鏃ユ湡锛�</div> + <div class="search_input"> + <el-date-picker + v-model="addInfo.date" + type="date" + size="small" + placeholder="閫夋嫨鏃ユ湡" + format="yyyy-MM-dd" + value-format="yyyy-MM-dd" style="width: 100%;"> + </el-date-picker> + </div> + </div> + </el-col> + <el-col :span="24" style="margin-bottom: 16px;"> + <div class="search_thing" style="width: 90%;"> + <div class="search_label">淇敼鍐呭锛�</div> + <div class="search_input"><el-input size="small" placeholder="璇疯緭鍏�" clearable v-model="addInfo.alterThing" type="textarea" + :rows="2" :disabled="title.includes('鎰忚')"></el-input></div> + </div> + </el-col> + <el-col :span="24" style="margin-bottom: 16px;"> + <div class="search_thing" style="width: 90%;"> + <div class="search_label">鍙樺寲鍘熷洜锛�</div> + <div class="search_input"><el-input size="small" placeholder="璇疯緭鍏�" clearable v-model="addInfo.reason" type="textarea" + :rows="2" :disabled="title.includes('鎰忚')"></el-input></div> + </div> + </el-col> + <el-col :span="12" style="margin-bottom: 16px;"> + <div class="search_thing"> + <div class="search_label">涓婁紶闄勪欢锛�</div> + <div class="search_input"><el-upload + style="margin: 8px 0 0px 50px;" + action="#" + :auto-upload="false" + :multiple="false" + accept='.pdf' :on-change="handleChangeUpload" v-if="addDialogVisible&&!title.includes('鎰忚')"> + <el-button size="small" type="primary">涓婁紶闄勪欢</el-button> + </el-upload></div> + </div> + </el-col> + <el-col :span="12" style="margin-bottom: 16px;" v-if="title.includes('鎰忚')"> + <div class="search_thing"> + <div class="search_label">鐢宠閮ㄩ棬涓荤鎰忚锛�</div> + <div class="search_input"><el-input size="small" placeholder="璇疯緭鍏�" clearable v-model="addInfo.applicant" type="textarea" + :rows="2" :disabled="title!='鐢宠閮ㄩ棬涓荤鎰忚'"></el-input></div> + </div> + </el-col> + <el-col :span="12" style="margin-bottom: 16px;" v-if="title.includes('鎰忚')"> + <div class="search_thing"> + <div class="search_label">鍘熷畾鍒堕儴闂ㄦ剰瑙侊細</div> + <div class="search_input"><el-input size="small" placeholder="璇疯緭鍏�" clearable v-model="addInfo.formulation" type="textarea" + :rows="2" :disabled="title!='鍘熷畾鍒堕儴闂ㄦ剰瑙�'"></el-input></div> + </div> + </el-col> + <el-col :span="12" style="margin-bottom: 16px;" v-if="title.includes('鎰忚')"> + <div class="search_thing"> + <div class="search_label">鍘熷鏍搁儴闂ㄦ剰瑙侊細</div> + <div class="search_input"><el-input size="small" placeholder="璇疯緭鍏�" clearable v-model="addInfo.audit" type="textarea" + :rows="2" :disabled="title!='鍘熷鏍搁儴闂ㄦ剰瑙�'"></el-input></div> + </div> + </el-col> + </el-row> + <span slot="footer" class="dialog-footer"> + <el-button @click="addDialogVisible = false">鍙� 娑�</el-button> + <el-button type="primary" @click="handleAdd" :loading="addLoading">纭� 瀹�</el-button> + </span> + </el-dialog> + <el-dialog + :title="title0" + :visible.sync="detailDialogVisible" width="900px" top="20px" :class="{downPdf:title0=='涓嬭浇'}" :modal="title0!='涓嬭浇'"> + <div style="max-height: 75vh;overflow-y: auto;"> + <div id="dialogBody"> + <h4 style="display: flex;align-items: center;flex-direction: column;justify-content: center;"> + <span style="font-size: 20px;">鏂囦欢鏇存敼/浣滃簾鐢宠琛�</span> + <span>Application for alteration/cancellation of Document</span> + </h4> + <p style="display: flex;justify-content: space-between;margin-top: 16px;"> + <span>{{ currentInfo.documentCode }}</span> + <span>{{currentInfo.method}}</span> + </p> + <table border="1" class="tables" cellpadding="10"> + <tr> + <td> + <p>鐢宠閮ㄩ棬</p> + <p class="en">Application department</p> + </td> + <td>{{ currentInfo.createUserDepart }}</td> + <td> + <p>鐢宠浜�</p> + <p>Proposer</p> + </td> + <td>{{ currentInfo.createUserName }}</td> + <td > + <p>鐢宠鏃堕棿</p> + <p class="en">Application date</p> + </td> + <td>{{ currentInfo.createTime }}</td> + </tr> + <tr> + <td> + <p>鏂囦欢鍚嶇О</p> + <p class="en">File name</p> + </td> + <td colspan="3">{{ currentInfo.documentName }}</td> + <td> + <p>鏂囦欢缂栧彿</p> + <p class="en">Document number</p> + </td> + <td>{{ currentInfo.documentCode }}</td> + </tr> + <tr> + <td> + <p>淇敼鍓嶇増娆�</p> + <p class="en">Modify previous editions</p> + </td> + <td colspan="2">{{ currentInfo.beforeVersion }}</td> + <td > + <p>淇敼鍚庣増娆�</p> + <p class="en">Revised edition</p> + </td> + <td colspan="2">{{ currentInfo.afterVersion }}</td> + </tr> + <tr> + <td> + <p>鍙樺寲鍘熷洜</p> + <p class="en">Changing reason</p> + </td> + <td colspan="5"> + <div class="user-content"> + <p style="text-align: left;line-height: 26px;">{{ currentInfo.reason }}</p> + </div> + </td> + </tr> + <tr> + <td> + <p>鍘熸枃鍐呭</p> + <p class="en">Original content</p> + </td> + <td colspan="2">瑙侀檮浠�</td> + <td > + <p>鎷熶慨璁㈠唴瀹�</p> + <p class="en">Content be revised</p> + </td> + <td colspan="2">{{ currentInfo.alterThing }}</td> + </tr> + <tr> + <td> + <p>淇鍚庡垎鍙戦儴闂�</p> + <p class="en">Distribute to the department after revision</p> + </td> + <td colspan="2">{{ currentInfo.afterDepart }}</td> + <td > + <p>鍘熷垎鏀鹃儴闂�</p> + <p class="en">The original distribution department</p> + </td> + <td colspan="2">{{ currentInfo.beforeDepart }}</td> + </tr> + <tr> + <td> + <p>鐢宠閮ㄩ棬涓荤鎰忚</p> + <p class="en">Opinion of the head of the applicant department</p> + </td> + <td colspan="2"> + <p>鍘熷埗瀹氶儴闂ㄦ剰瑙�</p> + <p class="en">Original formulation of the department's opinion</p> + </td> + <td colspan="2"> + <p>鍘熷鏍搁儴闂ㄦ剰瑙�</p> + <p class="en">Opinion of the original audit department</p> + </td> + <td> + <p>鎵瑰噯</p> + <p class="en">Ratify</p> + </td> + </tr> + <tr> + <td> + {{ currentInfo.applicant }} + </td> + <td colspan="2"> + {{ currentInfo.formulation }} + </td> + <td colspan="2"> + {{ currentInfo.audit }} + </td> + <td> + <img :src="javaApi+'img/'+currentInfo.ratifyUserUrl" style="width: 100%;" alt="鎵瑰噯浜虹鍚�"> + </td> + </tr> + </table> + </div> + </div> + </el-dialog> + <el-dialog + title="鏂囦欢棰勮" + :visible.sync="lookDialogVisible" + width="800px" top="5vh" fullscreen> + <h4>淇鍐呭</h4> + <filePreview v-if="lookDialogVisible" :fileUrl="javaApi+'/word/'+currentInfo.afterUrl" + :currentFile="{}"/> + <h4>鍘熷唴瀹�</h4> + <filePreview v-if="lookDialogVisible" :fileUrl="javaApi+'/word/'+currentInfo.beforeUrl" + :currentFile="{}"/> + </el-dialog> + </div> +</template> + +<script> +import ValueTable from '../tool/value-table.vue' +import {exportHtmlToPDF} from '../../util/downHtmlToPDF' +import filePreview from '../tool/file-preview.vue' +export default { + components: { + ValueTable, + filePreview + }, + data () { + return { + addPower:true, + outPower:true, + outLoading:false, + lookDialogVisible:false, + addLoading:false, + componentData: { + entity: { + // documentName: null, + documentCode: null, + orderBy: { + field: 'createTime', + order: 'desc' + } + }, + isIndex: true, + showSelect: false, + select: false, + // selectMethod: 'handleChangeTask', + do: [{ + id: 'handleLook', + font: '鏌ョ湅', + type: 'text', + method: 'handleLook' + }, { + id: 'handleLook0', + font: '鏂囦欢棰勮', + type: 'text', + method: 'handleLook0' + }, { + id: 'handleOut', + font: '涓嬭浇', + type: 'text', + method: 'handleOut' + }, { + id: 'delete', + font: '鍒犻櫎', + type: 'text', + method: 'doDiy', + disabFun: (row, index) => { + return !!row.ratifyUser + } + }, { + id: 'handleEdit', + font: '淇敼', + type: 'text', + method: 'handleEdit', + field:[], + disabFun: (row, index) => { + return !!row.ratifyUser + } + }, { + id: 'handleRatify', + font: '鎵瑰噯', + type: 'text', + method: 'handleRatify', + field:[], + disabFun: (row, index) => { + return !!row.ratifyUser + } + }, { + id: 'handlework0', + font: '鐢宠鎰忚', + type: 'text', + method: 'handlework0', + field:[], + disabFun: (row, index) => { + return !!row.ratifyUser + } + }, { + id: 'handlework1', + font: '鍘熷畾鍒舵剰瑙�', + type: 'text', + method: 'handlework1', + field:[], + disabFun: (row, index) => { + return !!row.ratifyUser + } + }, { + id: 'handlework2', + font: '鍘熷鏍告剰瑙�', + type: 'text', + method: 'handlework2', + field:[], + disabFun: (row, index) => { + return !!row.ratifyUser + } + }], + tagField: { + // documentType:{ + // select: [] + // }, + // receiveUserName:{ + // select: [] + // }, + }, + selectField: { + // documentType:{ + // select: [] + // }, + // receiveUserName:{ + // select: [] + // }, + }, + addUpload:['signatoryUrl'], + requiredAdd: [], + requiredUp: [], + datePicker:['receiveDate'], + noHead:['signedUserName','signedDate','departLims'],//涓嶅弬涓庢柊澧炵紪杈戠殑瀛楁 + needSort: [], + inputType:'' + }, + entityCopy: {}, + upIndex: 0, + title:'鏂板', + addInfo:{ + method:'淇', + }, + addDialogVisible:false, + detailDialogVisible:false, + fileList:[], + personList:[], + list:[], + file:null, + title0:'鏌ョ湅', + currentInfo:{}, + } + }, + mounted(){ + this.entityCopy = this.HaveJson(this.componentData.entity); + this.getPower() + this.getFileList() + this.getAuthorizedPerson() + this.selectTreeList() + }, + methods:{ + getPower(){ + let power = JSON.parse(sessionStorage.getItem('power')) + let add = false + let del = false + let out = false; + let ratify = false + let audit1 = false + let audit2 = false + let audit3 = false + for (var i = 0; i < power.length; i++) { + if (power[i].menuMethod == 'addManageRecordAudit') { + add = true + } + if (power[i].menuMethod == 'delManageRecordAudit') { + del = true + } + if (power[i].menuMethod == 'ratifyManageRecordAudit') { + ratify = true + } + if (power[i].menuMethod == 'exportOutManageRecordAudit') { + out = true + } + if (power[i].menuMethod == 'manageRecordAudit1') { + audit1 = true + } + if (power[i].menuMethod == 'manageRecordAudit2') { + audit2 = true + } + if (power[i].menuMethod == 'manageRecordAudit3') { + audit3 = true + } + } + if (!audit3) { + this.componentData.do.splice(8, 1) + } + if (!audit2) { + this.componentData.do.splice(7, 1) + } + if (!audit1) { + this.componentData.do.splice(6, 1) + } + if (!ratify) { + this.componentData.do.splice(5, 1) + } + if (!add) { + this.componentData.do.splice(4, 1) + } + if (!del) { + this.componentData.do.splice(3, 1) + } + this.addPower = add + this.outPower = out + }, + openAdd(){ + this.addInfo = { + method:'淇', + } + this.title = '鏂板' + this.addDialogVisible = true; + }, + // 瀵煎嚭 + handleDown(){ + this.outLoading = true + this.$axios.post(this.$api.manageRecordAudit.exportOutManageRecordAudit,{entity:this.componentData.entity},{headers: { 'Content-Type': 'application/json' }}).then(res => { + this.outLoading = false + if(res.code==201) return this.$message.error('瀵煎嚭澶辫触') + this.$message.success('瀵煎嚭鎴愬姛') + let url = this.javaApi+'word/'+res.message + const link = document.createElement('a'); + link.href = url; + link.download = '鏂囦欢淇琛�'; + link.click(); + }) + }, + refreshTable() { + this.$refs['ValueTable'].selectList() + }, + refresh() { + this.componentData.entity = this.HaveJson(this.entityCopy) + this.upIndex++ + this.refreshTable() + }, + // 鑾峰彇鏂囦欢鍒楄〃--鏂囦欢娓呭崟 + getFileList(){ + this.$axios.post(this.$api.manageDocumentList.pageManageDocumentList,{ + entity: { + orderBy: { + field: 'createTime', + order: 'desc' + } + }, + page:{ + current:-1, + size:-1 + } + },{headers: { + 'Content-Type': 'application/json' + }}).then(res=>{ + this.fileList = res.data.body.records.map(m=>{ + m.title = m.documentCode + return m + }) + }).catch(err=>{}) + }, + getCurrentFile(e){}, + handleAdd(){ + if(!this.addInfo.documentCode) return this.$message({type:'error',message:"璇疯緭鍏ユ枃浠剁紪鍙�"}) + if(!this.addInfo.id){ + // 鏂板 + let fd = new FormData(); + //鏂囦欢淇℃伅涓璻aw鎵嶆槸鐪熺殑鏂囦欢 + if(this.file){ + fd.append("file",this.file.raw); + } + for (let m in this.addInfo){ + fd.append(m,this.addInfo[m]) + } + this.addLoading = true + this.$axios.post(this.$api.manageRecordAudit.addManageRecordAudit, fd,{ + headers: { + 'Content-Type': 'multipart/form-data' + }, + noQs:true + }).then(res => { + this.addLoading = false + if (res.code == 200) { + this.$message({ + type: 'success', + message: '娣诲姞鎴愬姛' + }) + this.refreshTable() + this.addDialogVisible = false + } else { + this.$message({ + type: 'error', + message: '娣诲姞澶辫触' + }) + } + }) + }else{ + // 淇敼 + let {id,method,documentCode,documentName,capter,pages,beforeVersion,afterVersion,alterUser,alterThing,reason,beforeDepart,afterDepart,number,applicant,formulation,audit,date} = this.addInfo + let fd = new FormData(); + //鏂囦欢淇℃伅涓璻aw鎵嶆槸鐪熺殑鏂囦欢 + if(this.file){ + fd.append("file",this.file.raw); + } + let obj = {id,method,documentCode,documentName,capter,pages,beforeVersion,afterVersion,alterUser,alterThing,reason,beforeDepart,afterDepart,number,applicant,formulation,audit,date} + for (let m in obj){ + if(this.addInfo[m]){ + fd.append(m,this.addInfo[m]) + } + } + this.addLoading = true + this.$axios.post(this.$api.manageRecordAudit.doManageRecordAudit, fd,{ + headers: { + 'Content-Type': 'multipart/form-data' + }, + noQs:true + }).then(res => { + this.addLoading = false + if (res.code == 200) { + this.refreshTable() + this.addDialogVisible = false + } else { + this.$message({ + type: 'error', + message: '娣诲姞澶辫触' + }) + } + }) + } + }, + getAuthorizedPerson() { + this.$axios.get(this.$api.user.getUserMenu).then(res => { + let data = [] + res.data.forEach(a => { + data.push({ + label: a.name, + value: a.id + }) + }) + // this.componentData.tagField.receiveUserName.select = data + // this.componentData.selectField.receiveUserName.select = data + this.personList = data + }) + }, + // 鏌ヨ鏍戝舰鍒楄〃 + selectTreeList() { + this.$axios.get(this.$api.personnel.selectCNSAPersonTree).then((res) => { + this.list = res.data[0].children; + }); + }, + handleChangeUpload(file, fileLists){ + this.file = file + // this.$set(this.addInfo,'name',file.name) + }, + handleEdit(row){ + this.addInfo = row + this.title = '淇敼' + this.addDialogVisible = true; + }, + // 瀹℃壒 + handleRatify(row){ + this.$confirm('鏄惁鎵瑰噯閫氳繃?', '鎵瑰噯', { + confirmButtonText: '纭畾', + cancelButtonText: '鍙栨秷', + type: 'warning' + }) + .then(() => { + this.$axios + .post(this.$api.manageRecordAudit.ratifyManageRecordAudit,{id:row.id}) + .then(res => { + if (res.code === 201) { + return; + } + this.$message.success('鎿嶄綔鎴愬姛'); + this.refreshTable(); + }) + .catch(e => { + this.$message.error('鎿嶄綔澶辫触'); + }); + }) + .catch(() => { + }); + }, + handlework0(row){ + this.addInfo = row + this.title = '鐢宠閮ㄩ棬涓荤鎰忚' + this.addDialogVisible = true; + }, + handlework1(row){ + this.addInfo = row + this.title = '鍘熷畾鍒堕儴闂ㄦ剰瑙�' + this.addDialogVisible = true; + }, + handlework2(row){ + this.addInfo = row + this.title = '鍘熷鏍搁儴闂ㄦ剰瑙�' + this.addDialogVisible = true; + }, + handleLook(row){ + this.title0 = '鏌ョ湅' + this.currentInfo = row + this.detailDialogVisible = true; + }, + handleOut(row){ + this.currentInfo = row + this.title0 = '涓嬭浇' + this.detailDialogVisible = true; + setTimeout(() => { + this.$nextTick(() => { + const element = document.getElementById("dialogBody"); + exportHtmlToPDF(element,'鏂囦欢'+row.method+'鐢宠琛�').then(res=>{ + this.detailDialogVisible = false; + }) + }) + }, 500); + }, + handleLook0(row){ + this.currentInfo = row; + this.lookDialogVisible = true + } + } +} +</script> + +<style scoped> +.title { + height: 60px; + line-height: 60px; + } + .search { + background-color: #fff; + height: 80px; + display: flex; + align-items: center; + } + + .search_thing { + width: 350px; + display: flex; + align-items: center; + } + + .search_label { + width: 110px; + font-size: 14px; + text-align: right; + } + + .search_input { + width: calc(100% - 110px); + } + + .table { + margin-top: 10px; + background-color: #fff; + width: calc(100% - 40px); + height: calc(100% - 60px - 80px - 10px - 40px); + padding: 20px; + } + .tables { + table-layout: fixed; + width: 100%; + margin-top: 10px; + } + + .tables td { + height: 40px; + width: 100px; + text-align: center; + font-size: 14px; + word-wrap: break-word; + white-space: normal; + } + .en{ + font-size: 12px; + word-break: break-word; /* 鑷姩鏂 */ + overflow-wrap: break-word; /* 闃叉婧㈠嚭 */ + white-space: normal; /* 榛樿鎹㈣ */ + } + + .heads td { + border: 1px dashed black; /* 鍗曞厓鏍肩殑铏氱嚎 */ + padding: 8px; + text-align: left; + } + .downPdf{ + opacity: 0 !important; + } + h4.title{ + position: relative; + height: 30px; + line-height: 30px; + box-sizing: border-box; + padding-left: 16px; + margin-left: 10px; + margin-bottom: 10px; + } + h4.title::after{ + content: ''; + width: 4px; + height: 20px; + background: #3A7BFA; + position: absolute; + top: 5px; + left: 0; + } + >>>.el-dialog__body{ + height: auto; + } +</style> diff --git a/src/components/view/a8-external-document-confirmation-records.vue b/src/components/view/a8-external-document-confirmation-records.vue new file mode 100644 index 0000000..9eeb31b --- /dev/null +++ b/src/components/view/a8-external-document-confirmation-records.vue @@ -0,0 +1,377 @@ +<template> + <!-- 澶栨潵鏂囦欢纭璁板綍 --> + <div class="ExternalDocumentConfirmationRecords"> + <el-row class="title"> + <el-col :span="20" style="padding-left: 20px;text-align: left;">澶栨潵鏂囦欢纭璁板綍</el-col> + </el-row> + <el-tabs type="border-card" v-model="activeName" style="height: 100%;"> + <el-tab-pane label="濉啓" name="濉啓" style="height: 100%;"> + <div style="display: flex;align-items: center;justify-content: flex-end;margin-right: 20px;"> + <el-button size="small" type="primary" @click="handleAdd0" style="margin-left: 20px;" v-if="addPower">鏂板</el-button> + <el-upload :action="action" :multiple="false" + :show-file-list="false" + accept='.doc,.docx' :headers="headers" :on-change="beforeUpload" + :on-error="onError" ref='upload' v-if="upPower" :on-success="handleSuccessUp" style="display:inline-block;margin-left: 20px;"> + <el-button size="small" type="primary" :loading="upLoading">瀵煎叆</el-button></el-upload> + </div> + <div class="table" style="height: calc(100% - 200px)"> + <ValueTable ref="ValueTable0" :url="$api.manageRecordTotal.pageManageRecordVerify" + :componentData="componentData0" :key="upIndex0" :delUrl="$api.manageRecordTotal.delManageRecordVerify" :upUrl="$api.manageRecordTotal.doManageRecordVerify" /> + </div> + </el-tab-pane> + <el-tab-pane label="鍘嗗彶璁板綍" name="鍘嗗彶璁板綍" style="height: 100%;"> + <div class="search"> + <div class="search_thing"> + <div class="search_label">骞达細</div> + <div class="search_input"> + <el-date-picker + v-model="componentData.entity.year" + type="year" + placeholder="閫夋嫨骞�" format="yyyy" + value-format="yyyy" size="small" @change="refreshTable()"> + </el-date-picker> + </div> + </div> + <div class="search_thing" style="padding-left: 30px;"> + <el-button size="small" @click="refresh()">閲� 缃�</el-button> + <el-button size="small" type="primary" @click="refreshTable()">鏌� 璇�</el-button> + </div> + </div> + <div class="table"> + <ValueTable ref="ValueTable" :url="$api.manageRecordTotal.pageManageRecordTotal" + :componentData="componentData" :key="upIndex"/> + </div> + </el-tab-pane> + </el-tabs> + <!-- 璇︽儏/涓嬭浇/瀹℃牳 --> + <el-dialog + :title="title0" + :visible.sync="lookDialogVisible" + width="800px" :class="{downPdf:title0=='涓嬭浇'}" :modal="title0!='涓嬭浇'" top="5vh"> + <filePreview v-if="lookDialogVisible" :fileUrl="javaApi+'/word/'+currentInfo.url" + :currentFile="{}" style="max-height: 70vh;overflow-y: auto;"/> + <span slot="footer" class="dialog-footer" v-if="title0=='瀹℃牳'||title0=='鎵瑰噯'"> + <el-button @click="submitCheck('涓嶉�氳繃')" :loading="noCheckLoading">涓嶉�氳繃</el-button> + <el-button type="primary" @click="submitCheck('閫氳繃')" :loading="checkLoading">閫� 杩�</el-button> + </span> + </el-dialog> + </div> +</template> + +<script> +import filePreview from '../tool/file-preview.vue' +import ValueTable from '../tool/value-table.vue' +export default { + components: { + ValueTable, + filePreview, + }, + data(){ + return{ + title0:'鏌ョ湅', + activeName:'濉啓', + lookDialogVisible:false, + noCheckLoading:false, + checkLoading:false, + componentData: { + entity: { + year: null, + orderBy: { + field: 'id', + order: 'desc' + } + }, + isIndex: true, + showSelect: false, + select: false, + do: [{ + id: 'handleLook', + font: '鏌ョ湅', + type: 'text', + method: 'handleLook', + disabFun: (row, index) => { + return !row.url + } + }, { + id: 'handleDown0', + font: '涓嬭浇', + type: 'text', + method: 'handleDown0', + disabFun: (row, index) => { + return !row.url + } + }, + { + id: 'handleSubmit', + font: '鎻愪氦', + type: 'text', + method: 'handleSubmit', + disabFun: (row, index) => { + return !!row.submitUserName + } + },{ + id: 'handleApproval', + font: '鎵瑰噯', + type: 'text', + method: 'handleApproval', + disabFun: (row, index) => { + return !row.submitUserName||!!row.ratifyUserName + } + }], + tagField: {}, + selectField: {}, + requiredAdd: [], + requiredUp: [], + needSort: [], + inputType:'' + }, + // 鏍峰搧鍒楄〃 + componentData0: { + entity: { + manageRecordTotalId: null, + orderBy: { + field: 'id', + order: 'desc' + } + }, + isIndex: true, + showSelect: false, + select: false, + do: [{ + id: 'update', + font: '淇敼', + type: 'text', + method: 'doDiy' + },{ + id: 'delete', + font: '鍒犻櫎', + type: 'text', + method: 'doDiy' + }], + tagField: {}, + selectField: {}, + requiredAdd: ['documentName','documentCode'], + requiredUp: ['documentName','documentCode'], + datePicker:['effectiveDate','cancelDate'], + needSort: [], + inputType:聽'' + }, + upIndex0: 100, + entityCopy: {}, + upIndex: 0, + addPower:true, + upPower:true, + currentInfo:{}, + upLoading:false, + } + }, + // 鐢ㄤ簬涓婁紶鏂囦欢鐨勪俊鎭� + computed: { + headers() { + return { + 'token': sessionStorage.getItem('token') + } + }, + action() { + return this.javaApi +this.$api.manageRecordTotal.exportManageRecordVerify + } + }, + mounted() { + this.entityCopy = this.HaveJson(this.componentData.entity); + this.getPower() + }, + methods:{ + getPower(){ + let power = JSON.parse(sessionStorage.getItem('power')) + let add = false + let del = false + let up = false; + let sub = false + let ratify = false + for (var i = 0; i < power.length; i++) { + if (power[i].menuMethod == 'addManageRecordVerify') { + add = true + } + if (power[i].menuMethod == 'delManageRecordVerify') { + del = true + } + if (power[i].menuMethod == 'exportManageRecordVerify') { + up = true + } + if (power[i].menuMethod == 'submitManageRecordTotal') { + sub = true + } + if (power[i].menuMethod == 'ratifyManageRecordTotal') { + ratify = true + } + } + if (!ratify) { + this.componentData.do.splice(3, 1) + } + if (!sub) { + this.componentData.do.splice(2, 1) + } + if (!del) { + this.componentData0.do.splice(1, 1) + } + if (!add) { + this.componentData0.do.splice(0, 1) + } + this.addPower = add + this.upPower = up + }, + handleAdd0(){ + this.$refs.ValueTable0.openAddDia(this.$api.manageRecordTotal.addManageRecordVerify); + }, + refreshTable() { + this.$refs['ValueTable'].selectList() + }, + beforeUpload(file) { + if (file.size > 1024 * 1024 * 10) { + this.$message.error('涓婁紶鏂囦欢涓嶈秴杩�10M'); + this.$refs.upload.clearFiles() + return false; + } else { + // this.upLoading = true; + return true; + } + }, + onError(err, file, fileList) { + this.$message.error('涓婁紶澶辫触') + this.$refs.upload.clearFiles() + }, + handleSuccessUp(response) { + this.upLoading = false; + if (response.code == 200) { + this.$message.success('涓婁紶鎴愬姛'); + this.$refs['ValueTable0'].selectList() + }else{ + this.$message.error('涓婁紶澶辫触'); + } + }, + refresh() { + this.componentData.entity = this.HaveJson(this.entityCopy) + this.upIndex++ + this.refreshTable() + }, + submitCheck(type){}, + // 鏌ョ湅 + handleLook(row){ + this.title0 = '鏌ョ湅' + this.commonFun(row) + }, + // 鍏敤鏂规硶 + commonFun(row,callbanck){ + this.currentInfo = row + this.componentData0.entity.manageRecordTotalId = row.id + this.$axios.post(this.$api.manageRecordTotal.pageManageRecordVerify ,{ + entity:this.componentData0.entity, + page:{ + current:-1, + size:-1 + } + },{headers: { + 'Content-Type': 'application/json' + },noQs:true}).then(res=>{ + this.currentInfo.arr = res.data.body.records + this.lookDialogVisible = true + if(callbanck){ + callbanck() + } + }).catch(err=>{}); + }, + handleDown0(row){ + let url = this.javaApi+'word/'+row.url + const link = document.createElement('a'); + link.href = url; + link.download = row.month+' 澶栨潵鏂囦欢纭璁板綍'; + link.click(); + }, + // 鎻愪氦 + handleSubmit(row){ + this.$confirm('鏄惁鎻愪氦 '+row.year+' 骞寸殑鏁版嵁', '鎻愪氦', { + confirmButtonText: '纭畾', + cancelButtonText: '鍙栨秷', + type: 'warning' + }).then(() => { + this.$axios.post(this.$api.manageRecordTotal.submitManageRecordTotal,{ + id:row.id + }).then(res=>{ + this.$message({ + type: 'success', + message: '鎻愪氦鎴愬姛!' + }); + this.$refs['ValueTable'].selectList() + }).catch(err=>{}); + }) + }, + // 鎵瑰噯 + handleApproval(row){ + this.title0 = '鎵瑰噯' + this.commonFun(row) + }, + // 鎻愪氦瀹℃牳/鎵瑰噯 + submitCheck(state){ + if(state=='閫氳繃'){ + this.checkLoading = true + }else{ + this.noCheckLoading = true + } + this.$axios.post(this.$api.manageRecordTotal.ratifyManageRecordTotal,{ + id:this.currentInfo.id, + ratifyState:state + }).then(res=>{ + this.checkLoading = false + this.noCheckLoading = false + if (res.code === 201) return + this.$message({ + type: 'success', + message: '鎿嶄綔鎴愬姛!' + }); + this.$refs['ValueTable'].selectList() + this.lookDialogVisible = false + }).catch(err=>{}); + }, + } +} +</script> + +<style scoped> +.title { + height: 60px; + line-height: 60px; + } + .search { + background-color: #fff; + height: 40px; + display: flex; + align-items: center; + position: relative; + } + + .search_thing { + width: 350px; + display: flex; + align-items: center; + } + + .search_label { + width: 110px; + font-size: 14px; + text-align: right; + } + + .search_input { + width: calc(100% - 110px); + } + + .table { + background-color: #fff; + width: calc(100% - 40px); + height: calc(100% - 60px - 140px); + padding: 20px; + } + >>>.el-tabs__content{ + height: 100%; + } +</style> diff --git a/src/components/view/a8-obsolete-document-destruction-records.vue b/src/components/view/a8-obsolete-document-destruction-records.vue new file mode 100644 index 0000000..a6629cb --- /dev/null +++ b/src/components/view/a8-obsolete-document-destruction-records.vue @@ -0,0 +1,440 @@ +<template> + <!-- 浣滃簾鏂囦欢閿�姣佽褰� --> + <div class="ObsoleteDocumentDestructionRecords"> + <el-row class="title"> + <el-col :span="12" style="padding-left: 20px;text-align: left;">浣滃簾鏂囦欢閿�姣佽褰�</el-col> + <el-col :span="12" style="text-align: right;"> + <el-button size="medium" type="primary" @click="openAdd" v-if="addPower">鏂板</el-button> + <el-upload :action="action" :multiple="false" + :show-file-list="false" + accept='.doc,.docx' :headers="headers" :on-change="beforeUpload" + :on-error="onError" ref='upload' v-if="upPower" :on-success="handleSuccessUp" style="display:inline-block;margin-left: 20px;"> + <el-button type="primary" size="medium">瀵煎叆</el-button></el-upload> + <el-button size="medium" type="primary" @click="handleDown" :loading="outLoading" v-if="outPower" style="display:inline-block;margin-left: 20px;">瀵煎嚭</el-button> + </el-col> + </el-row> + <div class="search"> + <div class="search_thing"> + <div class="search_label">鏂囦欢鍚嶇О锛�</div> + <div class="search_input"><el-input size="small" placeholder="璇疯緭鍏�" clearable v-model="componentData.entity.documentName" + @keyup.enter.native="refreshTable()"></el-input></div> + </div> + <div class="search_thing"> + <div class="search_label">鏂囦欢缂栧彿锛�</div> + <div class="search_input"> + <el-input size="small" placeholder="璇疯緭鍏�" clearable v-model="componentData.entity.documentCode" + @keyup.enter.native="refreshTable()"></el-input> + </div> + </div> + <div class="search_thing" style="padding-left: 30px;"> + <el-button size="small" @click="refresh()">閲� 缃�</el-button> + <el-button size="small" type="primary" @click="refreshTable()">鏌� 璇�</el-button> + </div> + </div> + <div class="table"> + <ValueTable ref="ValueTable" :url="$api.manageRecordCancel.pageManageRecordCancel" + :delUrl="$api.manageRecordCancel.delManageRecordCancel" + :componentData="componentData" :upUrl="$api.manageRecordIssueRecycle.doManageRecordIssueRecycle" :key="upIndex"/> + </div> + <el-dialog + :title="title" + :visible.sync="addDialogVisible" + width="400px" top="6vh"> + <el-row> + <el-col :span="24" style="margin-bottom: 16px;"> + <div class="search_thing"> + <div class="search_label"><span style="color: red;margin-left: 4px;">* </span>鏂囦欢缂栧彿锛�</div> + <div class="search_input"> + <el-select v-model="addInfo.documentCode" size="small" style="width: 100%;" @change="getCurrentFile" allow-create clearable filterable> + <el-option + v-for="item in fileList" + :key="item.documentCode" + :label="item.title" + :value="item.documentCode"> + </el-option> + </el-select> + </div> + </div> + </el-col> + <el-col :span="24" style="margin-bottom: 16px;"> + <div class="search_thing"> + <div class="search_label">鏂囦欢鍚嶇О锛�</div> + <div class="search_input"><el-input size="small" placeholder="璇疯緭鍏�" clearable v-model="addInfo.documentName"></el-input></div> + </div> + </el-col> + <el-col :span="24" style="margin-bottom: 16px;"> + <div class="search_thing"> + <div class="search_label">鏁伴噺锛�</div> + <div class="search_input"><el-input size="small" placeholder="璇疯緭鍏�" clearable v-model="addInfo.qty"></el-input></div> + </div> + </el-col> + <el-col :span="24" style="margin-bottom: 16px;"> + <div class="search_thing"> + <div class="search_label">閿�姣佸師鍥狅細</div> + <div class="search_input"><el-input size="small" placeholder="璇疯緭鍏�" clearable v-model="addInfo.reason"></el-input></div> + </div> + </el-col> + <el-col :span="24" style="margin-bottom: 16px;"> + <div class="search_thing"> + <div class="search_label">澶囨敞锛�</div> + <div class="search_input"><el-input size="small" placeholder="璇疯緭鍏�" clearable v-model="addInfo.remark" type="textarea" + :rows="2"></el-input></div> + </div> + </el-col> + </el-row> + <span slot="footer" class="dialog-footer"> + <el-button @click="addDialogVisible = false">鍙� 娑�</el-button> + <el-button type="primary" @click="handleAdd" :loading="addLoading">纭� 瀹�</el-button> + </span> + </el-dialog> + </div> +</template> + +<script> +import ValueTable from '../tool/value-table.vue' +export default { + components: { + ValueTable + }, + data(){ + return{ + addPower:true, + outPower:true, + upPower:true, + outLoading:false, + addLoading:false, + componentData: { + entity: { + documentName: null, + documentCode: null, + orderBy: { + field: 'createTime', + order: 'desc' + } + }, + isIndex: true, + showSelect: false, + select: false, + // selectMethod: 'handleChangeTask', + do: [{ + id: 'delete', + font: '鍒犻櫎', + type: 'text', + method: 'doDiy', + disabFun: (row, index) => { + return row.ratifyState=='閫氳繃' + } + }, { + id: 'handleEdit0', + font: '淇敼', + type: 'text', + method: 'handleEdit0', + field:[], + disabFun: (row, index) => { + return row.ratifyState=='閫氳繃' + } + }, { + id: 'handleRatify', + font: '鎵瑰噯', + type: 'text', + method: 'handleRatify', + field:[], + disabFun: (row, index) => { + return row.ratifyState=='閫氳繃' + } + }], + tagField: { + // documentType:{ + // select: [] + // }, + // receiveUserName:{ + // select: [] + // }, + }, + selectField: { + // documentType:{ + // select: [] + // }, + // receiveUserName:{ + // select: [] + // }, + }, + addUpload:['signatoryUrl'], + requiredAdd: [], + requiredUp: [], + datePicker:['receiveDate'], + noHead:['signedUserName','signedDate','departLims'],//涓嶅弬涓庢柊澧炵紪杈戠殑瀛楁 + needSort: [], + inputType:'' + }, + entityCopy: {}, + upIndex: 0, + addInfo:{}, + title:'鏂板', + addInfo:{}, + addDialogVisible:false, + fileList:[], + personList:[], + } + }, + // 鐢ㄤ簬涓婁紶鏂囦欢鐨勪俊鎭� + computed: { + headers() { + return { + 'token': sessionStorage.getItem('token') + } + }, + action() { + return this.javaApi +this.$api.manageRecordCancel.exportInManageRecordCancel + } + }, + mounted() { + this.entityCopy = this.HaveJson(this.componentData.entity); + this.getPower() + this.getAuthorizedPerson() + this.getFileList() + }, + methods:{ + getPower(){ + let power = JSON.parse(sessionStorage.getItem('power')) + let add = false + let del = false + let up = false; + let out = false; + let ratify = false + for (var i = 0; i < power.length; i++) { + if (power[i].menuMethod == 'addManageRecordCancel') { + add = true + } + if (power[i].menuMethod == 'delManageRecordCancel') { + del = true + } + if (power[i].menuMethod == 'exportInManageRecordCancel') { + up = true + } + if (power[i].menuMethod == 'ratifyManageRecordCancel') { + ratify = true + } + if (power[i].menuMethod == 'exportOutManageRecordCancel') { + out = true + } + } + if (!ratify) { + this.componentData.do.splice(2, 1) + } + if (!add) { + this.componentData.do.splice(1, 1) + } + if (!del) { + this.componentData.do.splice(0, 1) + } + this.addPower = add + this.outPower = out + this.upPower = up + }, + openAdd(){ + // this.$refs.ValueTable.openAddDia(this.$api.manageRecordIssueRecycle.addManageRecordIssueRecycle); + this.addInfo = {} + this.title = '鏂板' + this.addDialogVisible = true; + }, + handleEdit0(row){ + this.addInfo = row + this.title = '淇敼' + this.addDialogVisible = true; + }, + // 瀵煎嚭 + handleDown(){ + this.outLoading = true + this.$axios.post(this.$api.manageRecordCancel.exportOutManageRecordCancel,{entity:this.componentData.entity},{headers: { 'Content-Type': 'application/json' }}).then(res => { + this.outLoading = false + if(res.code==201) return this.$message.error('瀵煎嚭澶辫触') + this.$message.success('瀵煎嚭鎴愬姛') + let url = this.javaApi+'word/'+res.message + const link = document.createElement('a'); + link.href = url; + link.download = '浣滃簾鏂囦欢閿�姣佽褰�'; + link.click(); + }) + }, + refreshTable() { + this.$refs['ValueTable'].selectList() + }, + refresh() { + this.componentData.entity = this.HaveJson(this.entityCopy) + this.upIndex++ + this.refreshTable() + }, + beforeUpload(file) { + if (file.size > 1024 * 1024 * 10) { + this.$message.error('涓婁紶鏂囦欢涓嶈秴杩�10M'); + this.$refs.upload.clearFiles() + return false; + } else { + // this.upLoading = true; + return true; + } + }, + onError(err, file, fileList) { + this.$message.error('涓婁紶澶辫触') + this.$refs.upload.clearFiles() + }, + handleSuccessUp(response) { + this.upLoading = false; + if (response.code == 200) { + this.$message.success('涓婁紶鎴愬姛'); + this.$refs['ValueTable'].selectList() + }else{ + this.$message.error('涓婁紶澶辫触'); + } + }, + // 鑾峰彇鏂囦欢鍒楄〃--鏂囦欢娓呭崟 + getFileList(){ + this.$axios.post(this.$api.manageDocumentList.pageManageDocumentList,{ + entity: { + orderBy: { + field: 'createTime', + order: 'desc' + } + }, + page:{ + current:-1, + size:-1 + } + },{headers: { + 'Content-Type': 'application/json' + }}).then(res=>{ + this.fileList = res.data.body.records.map(m=>{ + m.title = m.documentCode + return m + }) + }).catch(err=>{}) + }, + handleAdd(){ + if(!this.addInfo.documentCode) return this.$message.error('璇疯緭鍏ユ枃浠剁紪鍙�') + this.addLoading = true + let obj = {} + if(this.title=='鏂板'){ + obj = this.HaveJson(this.addInfo) + }else{ + let {id,documentCode,documentName,qty,reason,remark} = this.addInfo + obj = {id,documentCode,documentName,qty,reason,remark} + } + this.$axios.post(this.$api.manageRecordCancel[this.title=='鏂板'?'addManageRecordCancel':'doManageRecordCancel'], obj,{headers: { 'Content-Type': 'application/json' },noQs:true}).then(res => { + this.addLoading = false + if (res.code == 201) { + return + } + this.addDialogVisible = false + this.$message({ + type: 'success', + message: '鎿嶄綔鎴愬姛!' + }); + this.refreshTable() + }).catch(err => {}) + }, + getCurrentFile(e){ + let obj = this.fileList.find(m=>m.documentCode==e) + if(obj){ + this.$set(this.addInfo,'documentName',obj.name) + } + }, + getAuthorizedPerson() { + this.$axios.get(this.$api.user.getUserMenu).then(res => { + let data = [] + res.data.forEach(a => { + data.push({ + label: a.name, + value: a.id + }) + }) + // this.componentData.tagField.receiveUserName.select = data + // this.componentData.selectField.receiveUserName.select = data + this.personList = data + }) + }, + handleRatify(row){ + this.$confirm('鏄惁鎵瑰噯閫氳繃?', '鎻愮ず', { + confirmButtonText: '閫氳繃', + cancelButtonText: '涓嶉�氳繃', + type: 'warning', + closeOnClickModal: false, // 绂佹鐐瑰嚮閬僵灞傚叧闂� + distinguishCancelAndClose: true, + beforeClose: (action, instance, done) => { + if (action === 'confirm') { + // 鐐瑰嚮鈥滅‘瀹氣�濇寜閽紝鍏佽鍏抽棴 + this.$axios.post(this.$api.manageRecordCancel.ratifyManageRecordCancel, {id:row.id,ratifyState:'閫氳繃'}).then(res => { + if (res.code === 201) return + this.refreshTable() + done(); + this.$message({ + type: 'success', + message: '鎻愪氦鎴愬姛' + }) + }) + .catch(err => { + + }) + } else if (action === 'cancel') { + // 鐐瑰嚮鈥滃彇娑堚�濇寜閽紝涓嶅厑璁稿叧闂� + this.$axios.post(this.$api.manageRecordCancel.ratifyManageRecordCancel, {id:row.id,ratifyState:'涓嶉�氳繃'}).then(res => { + if (res.code === 201) return + this.refreshTable() + done(); + this.$message({ + type: 'success', + message: '鎻愪氦鎴愬姛' + }) + }) + .catch(err => { + + }) + console.log("鍙栨秷鎸夐挳鐐瑰嚮浜嬩欢锛屼笉鍏抽棴寮规"); + } else if (action === 'close') { + // 鐐瑰嚮鈥溍椻�濇寜閽紝涓嶅厑璁稿叧闂� + done(); + console.log("脳鎸夐挳鐐瑰嚮浜嬩欢锛屼笉鍏抽棴寮规"); + } + } + }) + } + } +} +</script> + +<style scoped> +.title { + height: 60px; + line-height: 60px; + } + .search { + background-color: #fff; + height: 80px; + display: flex; + align-items: center; + } + + .search_thing { + width: 350px; + display: flex; + align-items: center; + } + + .search_label { + width: 110px; + font-size: 14px; + text-align: right; + } + + .search_input { + width: calc(100% - 110px); + } + + .table { + margin-top: 10px; + background-color: #fff; + width: calc(100% - 40px); + height: calc(100% - 60px - 80px - 10px - 40px); + padding: 20px; + } +</style> diff --git a/src/components/view/a8-periodic-document-review-records.vue b/src/components/view/a8-periodic-document-review-records.vue new file mode 100644 index 0000000..6c89fda --- /dev/null +++ b/src/components/view/a8-periodic-document-review-records.vue @@ -0,0 +1,592 @@ +<template> + <!-- 鏂囦欢瀹氭湡瀹℃煡璁板綍 --> + <div class="PeriodicDocumentReviewRecords"> + <el-row class="title"> + <el-col :span="12" style="padding-left: 20px;text-align: left;">鏂囦欢瀹氭湡瀹℃煡璁板綍</el-col> + <!-- <el-col :span="12" style="text-align: right;"> + <el-button size="medium" type="primary" @click="openAdd" v-if="addPower">鏂板</el-button> + <el-upload :action="action" :show-file-list="false" + accept='.doc,.docx' :headers="headers" :on-change="beforeUpload" + :on-error="onError" ref='upload' v-if="upPower" :on-success="handleSuccessUp" style="display:inline-block;margin-left: 20px;"> + <el-button type="primary" size="medium">瀵煎叆</el-button></el-upload> + <el-button size="medium" type="primary" @click="handleDown" :loading="outLoading" v-if="outPower" style="display:inline-block;margin-left: 20px;">瀵煎嚭</el-button> + </el-col> --> + </el-row> + <el-tabs type="border-card" v-model="activeName" style="height: 100%;"> + <el-tab-pane label="濉啓" name="濉啓" style="height: 100%;"> + <div class="search"> + <div class="search_thing"> + <div class="search_label">鏂囦欢鍚嶇О锛�</div> + <div class="search_input"><el-input size="small" placeholder="璇疯緭鍏�" clearable v-model="componentData.entity.documentName" + @keyup.enter.native="refreshTable()"></el-input></div> + </div> + <div class="search_thing"> + <div class="search_label">鏂囦欢缂栧彿锛�</div> + <div class="search_input"> + <el-input size="small" placeholder="璇疯緭鍏�" clearable v-model="componentData.entity.documentCode" + @keyup.enter.native="refreshTable()"></el-input> + </div> + </div> + <div class="search_thing" style="padding-left: 30px;"> + <el-button size="small" @click="refresh()">閲� 缃�</el-button> + <el-button size="small" type="primary" @click="refreshTable()">鏌� 璇�</el-button> + </div> + <div class="btns"> + <el-button size="medium" type="primary" @click="openAdd" v-if="addPower">鏂板</el-button> + <el-upload :action="action" :multiple="false" + :show-file-list="false" + accept='.doc,.docx' :headers="headers" :on-change="beforeUpload" + :on-error="onError" ref='upload' v-if="upPower" :on-success="handleSuccessUp" style="display:inline-block;margin-left: 20px;"> + <el-button type="primary" size="medium">瀵煎叆</el-button></el-upload> + </div> + </div> + <div class="table"> + <ValueTable ref="ValueTable" :url="$api.manageRecordIntervals.pageManageRecordIntervals" + :delUrl="$api.manageRecordIntervals.delManageRecordIntervals" + :componentData="componentData" :upUrl="$api.manageRecordIssueRecycle.doManageRecordIssueRecycle" :key="upIndex"/> + </div> + </el-tab-pane> + <el-tab-pane label="鍘嗗彶璁板綍" name="鍘嗗彶璁板綍" style="height: 100%;"> + <div class="search"> + <div class="search_thing"> + <div class="search_label">骞达細</div> + <div class="search_input"> + <el-date-picker + v-model="componentData0.entity.year" + type="year" + placeholder="閫夋嫨骞�" format="yyyy" + value-format="yyyy" size="small" @change="refreshTable()"> + </el-date-picker> + </div> + </div> + <div class="search_thing" style="padding-left: 30px;"> + <el-button size="small" @click="refresh(1)">閲� 缃�</el-button> + <el-button size="small" type="primary" @click="refreshTable(1)">鏌� 璇�</el-button> + </div> + </div> + <div class="table"> + <ValueTable ref="ValueTable0" :url="$api.manageRecordIntervals.pageManageRecordIntervalsTotal" + :componentData="componentData0" :key="upIndex"/> + </div> + </el-tab-pane> + </el-tabs> + <el-dialog + :title="title" + :visible.sync="addDialogVisible" + width="400px" top="6vh"> + <el-row> + <el-col :span="24" style="margin-bottom: 16px;"> + <div class="search_thing"> + <div class="search_label"><span style="color: red;margin-left: 4px;">* </span>鏂囦欢缂栧彿锛�</div> + <div class="search_input"> + <el-select v-model="addInfo.documentCode" size="small" style="width: 100%;" @change="getCurrentFile" allow-create clearable filterable> + <el-option + v-for="item in fileList" + :key="item.documentCode" + :label="item.title" + :value="item.documentCode"> + </el-option> + </el-select> + </div> + </div> + </el-col> + <el-col :span="24" style="margin-bottom: 16px;"> + <div class="search_thing"> + <div class="search_label">鏂囦欢鍚嶇О锛�</div> + <div class="search_input"><el-input size="small" placeholder="璇疯緭鍏�" clearable v-model="addInfo.documentName"></el-input></div> + </div> + </el-col> + <el-col :span="24" style="margin-bottom: 16px;"> + <div class="search_thing"> + <div class="search_label">鐗堟湰鍙凤細</div> + <div class="search_input"><el-input size="small" placeholder="璇疯緭鍏�" clearable v-model="addInfo.documentVersion"></el-input></div> + </div> + </el-col> + <el-col :span="24" style="margin-bottom: 16px;"> + <div class="search_thing"> + <div class="search_label">淇鍙凤細</div> + <div class="search_input"><el-input size="small" placeholder="璇疯緭鍏�" clearable v-model="addInfo.revision"></el-input></div> + </div> + </el-col> + <el-col :span="24" style="margin-bottom: 16px;"> + <div class="search_thing"> + <div class="search_label">閫傚疁鎬э細</div> + <div class="search_input"> + <el-select v-model="addInfo.suitability" placeholder="璇烽�夋嫨" size="small" style="width: 100%;"> + <el-option + v-for="item in typeList" + :key="item.value" + :label="item.label" + :value="item.value"> + </el-option> + </el-select> + </div> + </div> + </el-col> + <el-col :span="24" style="margin-bottom: 16px;"> + <div class="search_thing"> + <div class="search_label">澶囨敞锛�</div> + <div class="search_input"><el-input size="small" placeholder="璇疯緭鍏�" clearable v-model="addInfo.remark" type="textarea" + :rows="2"></el-input></div> + </div> + </el-col> + </el-row> + <span slot="footer" class="dialog-footer"> + <el-button @click="addDialogVisible = false">鍙� 娑�</el-button> + <el-button type="primary" @click="handleAdd" :loading="addLoading">纭� 瀹�</el-button> + </span> + </el-dialog> + <!-- 璇︽儏/瀹℃牳 --> + <el-dialog + :title="title0" + :visible.sync="lookDialogVisible" + width="800px" top="5vh"> + <filePreview v-if="lookDialogVisible" :fileUrl="javaApi+'/word/'+currentInfo.url" + :currentFile="{}" style="max-height: 70vh;overflow-y: auto;"/> + <span slot="footer" class="dialog-footer" v-if="title0=='瀹℃牳'||title0=='鎵瑰噯'"> + <el-button @click="submitCheck('涓嶉�氳繃')" :loading="noCheckLoading">涓嶉�氳繃</el-button> + <el-button type="primary" @click="submitCheck('閫氳繃')" :loading="checkLoading">閫� 杩�</el-button> + </span> + </el-dialog> + </div> +</template> + +<script> +import ValueTable from '../tool/value-table.vue' +import filePreview from '../tool/file-preview.vue' +export default { + components: { + ValueTable, + filePreview + }, + data() { + return { + activeName:'濉啓', + title0:'鏂板', + addPower:true, + outPower:true, + upPower:true, + outLoading:false, + addLoading:false, + lookDialogVisible:false, + noCheckLoading:false, + checkLoading:false, + componentData: { + entity: { + documentName: null, + documentCode: null, + orderBy: { + field: 'id', + order: 'desc' + } + }, + isIndex: true, + showSelect: false, + select: false, + // selectMethod: 'handleChangeTask', + do: [{ + id: 'delete', + font: '鍒犻櫎', + type: 'text', + method: 'doDiy', + }, { + id: 'handleEdit', + font: '淇敼', + type: 'text', + method: 'handleEdit', + field:[], + }], + tagField: { + // documentType:{ + // select: [] + // }, + // receiveUserName:{ + // select: [] + // }, + }, + selectField: { + // documentType:{ + // select: [] + // }, + // receiveUserName:{ + // select: [] + // }, + }, + addUpload:['signatoryUrl'], + requiredAdd: [], + requiredUp: [], + datePicker:['receiveDate'], + noHead:['signedUserName','signedDate','departLims'],//涓嶅弬涓庢柊澧炵紪杈戠殑瀛楁 + needSort: [], + inputType:'' + }, + componentData0: { + entity: { + year: null, + orderBy: { + field: 'id', + order: 'desc' + } + }, + isIndex: true, + showSelect: false, + select: false, + do: [{ + id: 'handleLook', + font: '鏌ョ湅', + type: 'text', + method: 'handleLook', + disabFun: (row, index) => { + return !row.url + } + }, { + id: 'handleDown0', + font: '涓嬭浇', + type: 'text', + method: 'handleDown0', + disabFun: (row, index) => { + return !row.url + } + }, + { + id: 'handleSubmit', + font: '鎻愪氦', + type: 'text', + method: 'handleSubmit', + disabFun: (row, index) => { + return !!row.submitUserName + } + },{ + id: 'handleApproval', + font: '鎵瑰噯', + type: 'text', + method: 'handleApproval', + disabFun: (row, index) => { + return !row.submitUserName||!!row.ratifyUserName + } + }], + tagField: {}, + selectField: {}, + requiredAdd: [], + requiredUp: [], + needSort: [], + inputType:'' + }, + entityCopy: {}, + entityCopy0: {}, + upIndex: 0, + addInfo:{}, + title:'鏂板', + addInfo:{}, + addDialogVisible:false, + fileList:[], + typeList:[], + currentInfo:{}, + } + }, + // 鐢ㄤ簬涓婁紶鏂囦欢鐨勪俊鎭� + computed: { + headers() { + return { + 'token': sessionStorage.getItem('token') + } + }, + action() { + return this.javaApi +this.$api.manageRecordIntervals.exportInManageRecordIntervals + } + }, + mounted() { + this.entityCopy = this.HaveJson(this.componentData.entity); + this.entityCopy0 = this.HaveJson(this.componentData0.entity); + this.getPower() + this.getFileList() + this.selectEnumByCategory() + }, + methods:{ + getPower(){ + let power = JSON.parse(sessionStorage.getItem('power')) + let add = false + let del = false + let up = false; + let out = false; + let submit = false + let ratify = false + for (var i = 0; i < power.length; i++) { + if (power[i].menuMethod == 'addManageRecordIntervals') { + add = true + } + if (power[i].menuMethod == 'delManageRecordIntervals') { + del = true + } + if (power[i].menuMethod == 'exportInManageRecordIntervals') { + up = true + } + if (power[i].menuMethod == 'exportOutManageRecordIntervals') { + out = true + } + if (power[i].menuMethod == 'submitManageRecordIntervalsTotal') { + submit = true + } + if (power[i].menuMethod == 'ratifyManageRecordIntervalsTotal') { + ratify = true + } + } + if (!ratify) { + this.componentData0.do.splice(3, 1) + } + if (!submit) { + this.componentData0.do.splice(2, 1) + } + if (!add) { + this.componentData.do.splice(1, 1) + } + if (!del) { + this.componentData.do.splice(0, 1) + } + this.addPower = add + this.outPower = out + this.upPower = up + }, + // 鏂板 + openAdd(){ + // this.$refs.ValueTable.openAddDia(this.$api.manageRecordIssueRecycle.addManageRecordIssueRecycle); + this.addInfo = {} + this.title = '鏂板' + this.addDialogVisible = true; + }, + // 瀵煎嚭 + handleDown(){ + this.outLoading = true + this.$axios.post(this.$api.manageRecordIntervals.exportOutManageRecordIntervals,{entity:this.componentData.entity},{headers: { 'Content-Type': 'application/json' }}).then(res => { + this.outLoading = false + if(res.code==201) return this.$message.error('瀵煎嚭澶辫触') + this.$message.success('瀵煎嚭鎴愬姛') + let url = this.javaApi+'word/'+res.message + const link = document.createElement('a'); + link.href = url; + link.download = '鏂囦欢瀹氭湡瀹℃煡璁板綍'; + link.click(); + }) + }, + refreshTable(num) { + if(num){ + this.$refs['ValueTable0'].selectList() + }else{ + this.$refs['ValueTable'].selectList() + } + }, + refresh(num) { + if(num){ + this.componentData0.entity = this.HaveJson(this.entityCopy0) + this.upIndex++ + }else{ + this.componentData.entity = this.HaveJson(this.entityCopy) + this.upIndex++ + } + }, + beforeUpload(file) { + if (file.size > 1024 * 1024 * 10) { + this.$message.error('涓婁紶鏂囦欢涓嶈秴杩�10M'); + this.$refs.upload.clearFiles() + return false; + } else { + // this.upLoading = true; + return true; + } + }, + onError(err, file, fileList) { + this.$message.error('涓婁紶澶辫触') + this.$refs.upload.clearFiles() + }, + handleSuccessUp(response) { + this.upLoading = false; + if (response.code == 200) { + this.$message.success('涓婁紶鎴愬姛'); + this.$refs['ValueTable'].selectList() + }else{ + this.$message.error('涓婁紶澶辫触'); + } + }, + getCurrentFile(e){ + let obj = this.fileList.find(m=>m.documentCode==e) + if(obj){ + this.$set(this.addInfo,'documentName',obj.name) + this.$set(this.addInfo,'documentVersion',obj.version) + // this.addInfo.documentName = obj.name + // this.addInfo.documentVersion = obj.version + } + }, + // 鑾峰彇鏂囦欢鍒楄〃--鏂囦欢娓呭崟 + getFileList(){ + this.$axios.post(this.$api.manageDocumentList.pageManageDocumentList,{ + entity: { + orderBy: { + field: 'id', + order: 'asc' + } + }, + page:{ + current:-1, + size:-1 + } + },{headers: { + 'Content-Type': 'application/json' + }}).then(res=>{ + this.fileList = res.data.body.records.map(m=>{ + m.title = m.documentCode + return m + }) + }).catch(err=>{}) + }, + selectEnumByCategory() { + this.$axios.post(this.$api.enums.selectEnumByCategory, { + category: "閫傚疁鎬�" + }).then(res => { + this.typeList = res.data + }) + }, + // 鎻愪氦 + handleAdd(){ + if(!this.addInfo.documentCode) return this.$message.error('璇疯緭鍏ユ枃浠剁紪鍙�') + this.addLoading = true + let obj = {} + if(this.title=='鏂板'){ + obj = this.HaveJson(this.addInfo) + }else{ + let {id,documentCode,documentName,documentVersion,revision,suitability,remark} = this.addInfo + obj = {id,documentCode,documentName,documentVersion,revision,suitability,remark} + } + this.$axios.post(this.$api.manageRecordIntervals[this.title=='鏂板'?'addManageRecordIntervals':'doManageRecordIntervals'], obj,{headers: { 'Content-Type': 'application/json' },noQs:true}).then(res => { + this.addLoading = false + if (res.code == 201) { + return + } + this.addDialogVisible = false + this.$message({ + type: 'success', + message: '鎿嶄綔鎴愬姛!' + }); + this.refreshTable() + }).catch(err => {}) + }, + // 淇敼 + handleEdit(row){ + this.addInfo = row + this.title = '缂栬緫' + this.addDialogVisible = true; + }, + submitCheck(state){ + if(state=='閫氳繃'){ + this.checkLoading = true + }else{ + this.noCheckLoading = true + } + this.$axios.post(this.$api.manageRecordIntervals.ratifyManageRecordIntervalsTotal,{ + id:this.currentInfo.id, + ratifyState:state + }).then(res=>{ + this.checkLoading = false + if(res.code==201){ + return + } + this.noCheckLoading = false + this.$message({ + type: 'success', + message: '鎿嶄綔鎴愬姛!' + }); + this.$refs['ValueTable0'].selectList() + this.lookDialogVisible = false + }).catch(err=>{}); + }, + // 鏌ョ湅 + handleLook(row){ + this.title0 = '鏌ョ湅' + this.commonFun(row) + }, + commonFun(row,callbanck){ + this.currentInfo = row + this.lookDialogVisible = true + if(callbanck){ + callbanck() + } + }, + handleDown0(row){ + let url = this.javaApi+'word/'+row.url + const link = document.createElement('a'); + link.href = url; + link.download = row.month+' 鎵�鏈夋枃浠跺畾鏈熸鏌ヨ褰�'; + link.click(); + }, + // 鎻愪氦 + handleSubmit(row){ + this.$confirm('鏄惁鎻愪氦 '+row.year+' 骞寸殑鏁版嵁', '鎻愪氦', { + confirmButtonText: '纭畾', + cancelButtonText: '鍙栨秷', + type: 'warning' + }).then(() => { + this.$axios.post(this.$api.manageRecordIntervals.submitManageRecordIntervalsTotal,{ + id:row.id + }).then(res=>{ + if (res.code === 201) return + this.$message({ + type: 'success', + message: '鎻愪氦鎴愬姛!' + }); + this.$refs['ValueTable0'].selectList() + }).catch(err=>{}); + }) + }, + // 鎵瑰噯 + handleApproval(row){ + this.title0 = '鎵瑰噯' + this.commonFun(row) + }, + } +} +</script> + +<style scoped> +.title { + height: 60px; + line-height: 60px; + } + .search { + background-color: #fff; + height: 40px; + display: flex; + align-items: center; + position: relative; + } + + .search_thing { + width: 350px; + display: flex; + align-items: center; + } + + .search_label { + width: 110px; + font-size: 14px; + text-align: right; + } + + .search_input { + width: calc(100% - 110px); + } + + .table { + margin-top: 10px; + background-color: #fff; + width: calc(100% - 40px); + height: calc(100% - 60px - 140px); + padding: 20px; + } + >>>.el-tabs__content{ + height: 100%; + } + .btns{ + position: absolute; + right: 20px; + top: 5px; + } +</style> diff --git a/src/util/downHtmlToPDF.js b/src/util/downHtmlToPDF.js new file mode 100644 index 0000000..6efa1e8 --- /dev/null +++ b/src/util/downHtmlToPDF.js @@ -0,0 +1,22 @@ +import html2canvas from "html2canvas"; +import jsPDF from "jspdf"; + +export async function exportHtmlToPDF(element,name='exported') { + try { + // 灏� HTML 鍏冪礌杞崲涓� canvas + console.log("姝e湪灏� HTML 杞崲涓� canvas...",element); + const canvas = await html2canvas(element,{useCORS: true}); + const imgData = canvas.toDataURL("image/png"); + + // 鍒涘缓 PDF + const pdf = new jsPDF("p", "mm", "a4"); + const pdfWidth = pdf.internal.pageSize.getWidth(); + const pdfHeight = (canvas.height * pdfWidth) / canvas.width; + + pdf.addImage(imgData, "PNG", 10, 10, pdfWidth-20, pdfHeight-20); + pdf.save(name+".pdf"); + console.log("PDF 瀵煎嚭鎴愬姛锛�"); + } catch (error) { + console.error("瀵煎嚭 PDF 澶辫触锛�", error); + } +} -- Gitblit v1.9.3