| | |
| | | }); |
| | | } |
| | | |
| | | // 模çå¤å¶ |
| | | export function copyStandardTemplate(data) { |
| | | return request({ |
| | | url: "/StandardTemplate/copyStandardTemplate", |
| | | method: "post", |
| | | data: data, |
| | | }); |
| | | } |
| | | |
| | | // æ·»å æ£éªæ¨¡æ¿ |
| | | export function addStandardTemplate(data) { |
| | | return request({ |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <div class="up-pdf-stamp"> |
| | | <div class="work" style="display: flex;justify-content: space-between;align-items: center;margin-bottom: 10px;" |
| | | v-if="isUpFile"> |
| | | <input type="file" @change="handleFileUpload" accept="application/pdf" ref="fileInput" /> |
| | | </div> |
| | | <p style="color: red;font-size: 12px;margin: 16px 0;" v-if="canvasNumPages > 0">æç¤ºï¼å¨æä»¶èå´å
ï¼åå»é¼ æ çç« ï¼åå»é¼ æ å·²çå¥½ç« å¤å¯å é¤å½åç« </p> |
| | | <canvas ref="pdfCanvas" @click="e => handleCanvasClick(e, index)" style="border: 1px solid #000;" |
| | | @dblclick="e => removeStamp(e, index)" v-for="(item, index) in canvasNumPages" :key="index"></canvas> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | import jsPDF from "jspdf"; |
| | | import file from '@/utils/file.js' |
| | | export default { |
| | | props: ['isUpFile'], |
| | | data() { |
| | | return { |
| | | pdfDoc: null, // åå¨ä¸ä¼ ç PDF æ°æ® |
| | | stamps: [], // è®°å½çç« çä½ç½® |
| | | contextList: [],//canvaså表 |
| | | canvasNumPages: 0,// åå¨ PDF æ»é¡µæ° |
| | | stampWidth: 120, // çç« å®½åº¦ |
| | | stampHeight: 80, // çç« é«åº¦ |
| | | stampsName: '', |
| | | stampsList: ['主任', 'è´¨éè´è´£äºº', 'ææ¯è´è´£äºº', '综å室', 'éä¿¡', 'çµå', 'è£
å¤', 'å¨è½', 'å°é¢'], |
| | | fileName: 'æä»¶å' |
| | | }; |
| | | }, |
| | | methods: { |
| | | handleFileUpload(event) { |
| | | const file = event.target.files[0]; |
| | | if (file.size > 20 * 1024 * 1024) { |
| | | this.$refs.fileInput.value = ""; // æ¸
空æä»¶è¾å
¥æ¡å
容 |
| | | return this.$message.error('æä»¶å¤§å°ä¸è½è¶
è¿20M') |
| | | } |
| | | this.lookFile(file) |
| | | }, |
| | | lookFile(file, currentStamp) { |
| | | this.fileName = file.name |
| | | if (currentStamp) { |
| | | this.stampsName = currentStamp |
| | | } else { |
| | | const index = this.stampsList.indexOf(m => file.name.includes(m)) |
| | | if (index > -1) { |
| | | this.stampsName = this.stampsList[index] |
| | | } else { |
| | | this.stampsName = '综å室' |
| | | } |
| | | } |
| | | if (file && file.type === 'application/pdf') { |
| | | const reader = new FileReader(); |
| | | reader.onload = (e) => { |
| | | const typedArray = new Uint8Array(e.target.result); |
| | | this.loadPDF(typedArray); |
| | | }; |
| | | reader.readAsArrayBuffer(file); |
| | | } else { |
| | | this.$message.error('è¯·éæ© PDF æä»¶'); |
| | | } |
| | | }, |
| | | loadPDF(typedArray) { |
| | | pdfjsLib.getDocument(typedArray).promise.then(pdfDoc_ => { |
| | | this.pdfDoc = pdfDoc_; |
| | | this.canvasNumPages = this.pdfDoc._pdfInfo.numPages |
| | | this.stamps = [] |
| | | this.contextList = [] |
| | | for (let i = 1; i <= this.canvasNumPages; i++) { |
| | | this.$nextTick(() => { |
| | | this.renderPage(i); // 渲æé¡µé¢ |
| | | }); |
| | | this.stamps.push([]) |
| | | } |
| | | }); |
| | | }, |
| | | // 渲ææå®é¡µé¢ |
| | | renderPage(pageNum) { |
| | | this.pdfDoc.getPage(pageNum).then(page => { |
| | | const canvas = this.$refs.pdfCanvas[pageNum - 1]; |
| | | this.contextList.push(canvas.getContext("2d")) |
| | | const viewport = page.getViewport({ scale: 1.5 }); |
| | | |
| | | canvas.width = viewport.width; |
| | | canvas.height = viewport.height; |
| | | |
| | | page.render({ |
| | | canvasContext: this.contextList[pageNum - 1], |
| | | viewport: viewport |
| | | }).promise.then(() => { |
| | | this.stamps[pageNum - 1].forEach(m => { |
| | | this.drawStamps(m.x, m.y, pageNum - 1) |
| | | }) |
| | | }); |
| | | }); |
| | | }, |
| | | // åå»--æ·»å ç« |
| | | handleCanvasClick(event, i) { |
| | | const x = event.offsetX; |
| | | const y = event.offsetY; |
| | | const index = this.stamps[i].findIndex(stamp => { |
| | | let x0 = x - stamp.x; |
| | | let y0 = y - stamp.y; |
| | | return x0 > 0 && x0 < this.stampWidth && y0 > 0 && y0 < this.stampHeight; |
| | | }); |
| | | if (index > -1) return; |
| | | this.drawStamps(x, y, i) |
| | | this.stamps[i].push({ x, y }); |
| | | }, |
| | | // åå»--å é¤çç« |
| | | removeStamp(event, i) { |
| | | const x = event.offsetX; |
| | | const y = event.offsetY; |
| | | // æ¥æ¾è¢«åå»ççç« |
| | | const index = this.stamps[i].findIndex(stamp => { |
| | | let x0 = x - stamp.x; |
| | | let y0 = y - stamp.y; |
| | | return x0 > 0 && x0 < this.stampWidth && y0 > 0 && y0 < this.stampHeight; |
| | | }); |
| | | if (index === -1) return; |
| | | this.stamps[i].splice(index, 1); // å 餿å®ççç« |
| | | this.contextList[i].clearRect(0, 0, this.contextList[i].width, this.contextList[i].height); |
| | | this.renderPage(i + 1) |
| | | }, |
| | | // 渲æç« |
| | | drawStamps(x, y, index) { |
| | | var img = new Image(); |
| | | console.log(this.stampsName) |
| | | // 设置å¾çæº |
| | | img.src = require("@/assets/stamps/" + this.stampsName + ".png"); // æ¿æ¢ä¸ºä½ çå¾ç龿¥ |
| | | let that = this |
| | | img.onload = function () { |
| | | // å¾çå è½½å®æåï¼å°å¾çç»å¶å°canvasä¸ |
| | | that.contextList[index].drawImage(img, x, y, that.stampWidth, that.stampHeight); |
| | | }; |
| | | }, |
| | | // çæ PDF ç彿° |
| | | async generatePDF() { |
| | | if (this.contextList.length === 0) { |
| | | this.$message({ message: '请å
ä¸ä¼ PDFæä»¶', type: 'error' }); |
| | | this.$emit('uploadPDFErr') |
| | | return false |
| | | } |
| | | const pdf = new jsPDF("p", "mm", "a4"); |
| | | for (let i = 0; i < this.contextList.length; i++) { |
| | | const imgData = this.$refs.pdfCanvas[i].toDataURL('image/jpeg', 0.7); |
| | | const pdfWidth = pdf.internal.pageSize.getWidth(); |
| | | const pdfHeight = (this.$refs.pdfCanvas[i].height * pdfWidth) / this.$refs.pdfCanvas[i].width; |
| | | pdf.addImage(imgData, "JPEG", 0, 0, pdfWidth, pdfHeight); // å°å¾çæ·»å å° PDF |
| | | if (i !== this.contextList.length - 1) { |
| | | pdf.addPage(); // æ·»å æ°çä¸é¡µ |
| | | } |
| | | } |
| | | |
| | | // å° PDF æä»¶ä¿åæä¸ä¼ |
| | | const pdfOutput = pdf.output('blob'); // è·å PDF æä»¶ç Blob 对象 |
| | | |
| | | // ä¸ä¼ å°å端 |
| | | return this.$emit('uploadPDF', pdfOutput, this.fileName) |
| | | }, |
| | | } |
| | | } |
| | | </script> |
| | | |
| | | <style scoped></style> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <div>客æ·åºæ¬ä¿¡æ¯ç®¡ç</div> |
| | | </template> |
| | | |
| | | <script> |
| | | export default { |
| | | |
| | | } |
| | | </script> |
| | | |
| | | <style></style> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <!-- æä»¶åæ§ç³è¯· --> |
| | | <div class="controlled-file-application" 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="queryParams.documentCode" |
| | | @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="queryParams.createUserName" @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" style="padding-left: 30px;"> |
| | | <el-button size="small" type="primary" |
| | | @click="addDialogVisible = true, addInfo = {}, file = null">æä»¶åæ§ç³è¯·</el-button> |
| | | </div> |
| | | </div> |
| | | <div class="table"> |
| | | <lims-table :tableData="tableData" :column="column" :page="page" :tableLoading="tableLoading" |
| | | :height="'calc(100vh - 290px)'" @pagination="pagination"></lims-table> |
| | | </div> |
| | | <el-dialog title="æä»¶åæ§ç³è¯·" :visible.sync="addDialogVisible" width="800px" top="10vh"> |
| | | <el-row> |
| | | <el-col :span="12" style="margin-bottom: 16px;"> |
| | | <div class="search_thing"> |
| | | <div class="search_label"><span style="color:red;margin-right: 4px;">*</span>ç³è¯·ç¼å·ï¼</div> |
| | | <div class="search_input"><el-input size="small" placeholder="请è¾å
¥" clearable |
| | | v-model="addInfo.documentCode"></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.dutyUser" 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="12" style="margin-bottom: 16px;"> |
| | | <div class="search_thing"> |
| | | <div class="search_label">æä»¶ç±»å«ï¼</div> |
| | | <div class="search_input"> |
| | | <el-select v-model="addInfo.type" 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="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.name"></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.version"></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"> |
| | | <el-button size="small" type="primary">ä¸ä¼ éä»¶</el-button> |
| | | </el-upload></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.writer"></el-input> --> |
| | | <el-select v-model="addInfo.writer" size="small" style="width: 100%;" filterable> |
| | | <el-option v-for="item in personList" :key="item.value" :label="item.label" :value="item.label"> |
| | | </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.submitDate" 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="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.instructions" |
| | | 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="æ¥çéä»¶" :visible.sync="lookDialogVisible" width="800px" top="5vh" fullscreen> |
| | | <filePreview v-if="lookDialogVisible" :fileUrl="javaApi + '/word/' + currentInfo.url" :currentFile="{}" |
| | | style="height: 90vh;overflow-y: auto;" /> |
| | | </el-dialog> |
| | | <el-dialog title="å®¡æ ¸" :visible.sync="checkDialogVisible" width="1000px" top="5vh"> |
| | | <UpPdfStamp ref="UpPdfStamp" v-if="checkDialogVisible" @uploadPDF="uploadPDF" :isUpFile="false"></UpPdfStamp> |
| | | <span slot="footer" class="dialog-footer"> |
| | | <el-button @click="handleCheckSub('ä¸éè¿')" :loading="noCheckLoading">ä¸éè¿</el-button> |
| | | <el-button type="primary" @click="handleCheckSub('éè¿')" :loading="checkLoading">é è¿</el-button> |
| | | </span> |
| | | </el-dialog> |
| | | <el-dialog title="éæ©åæ§ç« " :visible.sync="checkStampDialogVisible" width="600px" top="5vh"> |
| | | <div class="stamp-list"> |
| | | <img :src="require('@/assets/stamps/' + item + '.png')" alt="" v-for="(item, index) in stampsList" :key="index" |
| | | style="width: 120px;height: 80px;margin: 6px;" class="stamp" :class="{ active: currentStamp == item }" |
| | | @click="currentStamp = item"> |
| | | </div> |
| | | <span slot="footer" class="dialog-footer"> |
| | | <el-button @click="checkStampDialogVisible = false">å æ¶</el-button> |
| | | <el-button type="primary" @click="handleCheck0(currentInfo)">ç¡® å®</el-button> |
| | | </span> |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | import UpPdfStamp from '@/components/UpPdfStamp/index.vue' |
| | | import filePreview from '@/components/Preview/filePreview.vue' |
| | | import limsTable from "@/components/Table/lims-table.vue"; |
| | | import { |
| | | selectUserCondition, |
| | | } from "@/api/system/user.js"; |
| | | import { |
| | | addManageDocumentControlled, |
| | | doManageDocumentControlled, |
| | | checkManageDocumentControlledPdf, |
| | | delManageDocumentControlled, |
| | | pageManageDocumentControlled, |
| | | checkManageDocumentControlled, |
| | | } from '@/api/cnas/systemManagement/documentControl.js' |
| | | import { mapGetters } from "vuex"; |
| | | export default { |
| | | components: { |
| | | filePreview, |
| | | UpPdfStamp, |
| | | limsTable |
| | | }, |
| | | computed: { |
| | | ...mapGetters(["nickName"]), |
| | | }, |
| | | data() { |
| | | return { |
| | | upLoading: false, |
| | | addPower: false, |
| | | addDialogVisible: false, |
| | | addLoading: false, |
| | | lookDialogVisible: false, |
| | | checkDialogVisible: false, |
| | | checkStampDialogVisible: false, |
| | | addInfo: {}, |
| | | personList: [], |
| | | fileType: [], |
| | | file: null, |
| | | currentInfo: {}, |
| | | checkLoading: false, |
| | | noCheckLoading: false, |
| | | type: '', |
| | | stampsList: ['主任', 'è´¨éè´è´£äºº', 'ææ¯è´è´£äºº', '综å室', 'éä¿¡', 'çµå', 'è£
å¤', 'å¨è½', 'å°é¢'], |
| | | currentStamp: '主任', |
| | | queryParams: {}, |
| | | tableData: [], |
| | | column: [ |
| | | { label: "ç³è¯·æä»¶ç¼å·", prop: "documentCode" }, |
| | | { |
| | | label: "æä»¶ç±»å«", prop: "type", width: "120px", dataType: "tag", |
| | | formatData: (params) => { |
| | | return this.fileType.find((m) => m.value == params).label; |
| | | }, |
| | | formatType: (params) => { |
| | | return this.fileType.find((m) => m.value == params).type; |
| | | }, |
| | | }, |
| | | { |
| | | label: "ç³è¯·äºº", |
| | | prop: "createUserName", |
| | | }, |
| | | { label: "ç³è¯·æ¶é´", prop: "createTime" }, |
| | | { label: "说æ", prop: "instructions" }, |
| | | { label: "æäº¤æ¥æ", prop: "submitDate" }, |
| | | { label: "责任人", prop: "dutyUserName" }, |
| | | { |
| | | label: "ç³è¯·ç¶æ", prop: "state", dataType: "tag", |
| | | formatData: (params) => { |
| | | return params; |
| | | }, |
| | | formatType: (params) => { |
| | | if (params == 'éè¿') { |
| | | return 'success' |
| | | } else { |
| | | return 'danger' |
| | | } |
| | | }, |
| | | }, |
| | | { |
| | | dataType: "action", |
| | | fixed: "right", |
| | | label: "æä½", |
| | | operation: [ |
| | | { |
| | | name: "ç¼è¾", |
| | | type: "text", |
| | | clickFun: (row) => { |
| | | this.handleUpdate(row); |
| | | }, |
| | | disabled: (row) => { |
| | | return row.state == 'éè¿' |
| | | } |
| | | }, |
| | | { |
| | | name: "å®¡æ ¸", |
| | | type: "text", |
| | | clickFun: (row) => { |
| | | this.handleCheck(row); |
| | | }, |
| | | disabled: (row) => { |
| | | return !row.dutyUserName.includes(this.nickName) || row.state == 'éè¿' |
| | | } |
| | | }, |
| | | { |
| | | name: "æ¥çéä»¶", |
| | | type: "text", |
| | | clickFun: (row) => { |
| | | this.handleLook(row); |
| | | }, |
| | | }, |
| | | { |
| | | name: "ä¸è½½", |
| | | type: "text", |
| | | clickFun: (row) => { |
| | | this.handleDown(row); |
| | | }, |
| | | }, |
| | | |
| | | { |
| | | name: "å é¤", |
| | | type: "text", |
| | | clickFun: (row) => { |
| | | this.handleDelete(row); |
| | | }, |
| | | disabled: (row, index) => { |
| | | return row.state == 'éè¿' |
| | | } |
| | | }, |
| | | ], |
| | | }, |
| | | ], |
| | | page: { |
| | | total: 0, |
| | | size: 10, |
| | | current: 0, |
| | | }, |
| | | tableLoading: false, |
| | | } |
| | | }, |
| | | mounted() { |
| | | this.getList() |
| | | this.getAuthorizedPerson() |
| | | this.selectEnumByCategory() |
| | | }, |
| | | methods: { |
| | | getList() { |
| | | this.tableLoading = true; |
| | | let param = { ...this.queryParams, ...this.page }; |
| | | delete param.total; |
| | | pageManageDocumentControlled({ ...param }) |
| | | .then((res) => { |
| | | this.tableLoading = false; |
| | | if (res.code === 200) { |
| | | this.tableData = res.data.records; |
| | | this.page.total = res.data.total; |
| | | } |
| | | }) |
| | | .catch((err) => { |
| | | this.tableLoading = false; |
| | | }); |
| | | }, |
| | | pagination({ page, limit }) { |
| | | this.page.current = page; |
| | | this.page.size = limit; |
| | | this.getList(); |
| | | }, |
| | | refreshTable() { |
| | | this.page.current = 1; |
| | | this.getList(); |
| | | }, |
| | | refresh() { |
| | | this.queryParams = {}; |
| | | this.page.current = 1; |
| | | this.getList(); |
| | | }, |
| | | getPower() { |
| | | let power = JSON.parse(sessionStorage.getItem('power')) |
| | | let up = false |
| | | let del = false |
| | | let add = false |
| | | // let check = false |
| | | for (var i = 0; i < power.length; i++) { |
| | | if (power[i].menuMethod == 'addManageDocumentControlled') { |
| | | up = true |
| | | } |
| | | if (power[i].menuMethod == 'addManageDocumentControlled') { |
| | | add = true |
| | | } |
| | | if (power[i].menuMethod == 'delManageDocumentControlled') { |
| | | del = true |
| | | } |
| | | // if (power[i].menuMethod == 'checkManageDocumentControlled') { |
| | | // check = true |
| | | // } |
| | | } |
| | | // if (!check) { |
| | | // this.componentData.do.splice(2, 1) |
| | | // } |
| | | if (!del) { |
| | | this.componentData.do.splice(1, 1) |
| | | } |
| | | if (!up) { |
| | | this.componentData.do.splice(0, 1) |
| | | } |
| | | this.addPower = add |
| | | }, |
| | | getAuthorizedPerson() { |
| | | selectUserCondition().then(res => { |
| | | let data = [] |
| | | res.data.forEach(a => { |
| | | data.push({ |
| | | label: a.name, |
| | | value: a.id |
| | | }) |
| | | }) |
| | | this.personList = data |
| | | }) |
| | | }, |
| | | selectEnumByCategory() { |
| | | // æä»¶ç±»å« |
| | | this.getDicts("document_type").then((response) => { |
| | | this.fileType = this.dictToValue(response.data); |
| | | }); |
| | | }, |
| | | // æäº¤ |
| | | handleAdd() { |
| | | if (!this.addInfo.documentCode) return this.$message({ type: 'error', message: "请è¾å
¥ç¼å·" }) |
| | | if (!this.addInfo.id) { |
| | | // æ°å¢ |
| | | let fd = new FormData(); |
| | | //æä»¶ä¿¡æ¯ä¸rawææ¯ççæä»¶ |
| | | if (this.file) { |
| | | fd.append("file", this.file.raw); |
| | | } |
| | | for (let m in this.addInfo) { |
| | | fd.append(m, this.addInfo[m]) |
| | | } |
| | | this.addLoading = true |
| | | addManageDocumentControlled(fd).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, documentCode, dutyUser, type, name, version, writer, submitDate, instructions } = this.addInfo |
| | | let fd = new FormData(); |
| | | //æä»¶ä¿¡æ¯ä¸rawææ¯ççæä»¶ |
| | | if (this.file) { |
| | | fd.append("file", this.file.raw); |
| | | } |
| | | fd.append("id", id); |
| | | fd.append("documentCode", documentCode); |
| | | fd.append("dutyUser", dutyUser); |
| | | fd.append("type", type); |
| | | fd.append("name", name); |
| | | fd.append("version", version); |
| | | fd.append("writer", writer); |
| | | fd.append("submitDate", submitDate); |
| | | fd.append("instructions", instructions); |
| | | this.addLoading = true |
| | | doManageDocumentControlled(fd).then(res => { |
| | | this.addLoading = false |
| | | if (res.code == 200) { |
| | | this.refreshTable() |
| | | this.addDialogVisible = false |
| | | } else { |
| | | this.$message({ |
| | | type: 'error', |
| | | message: 'æ·»å 失败' |
| | | }) |
| | | } |
| | | }) |
| | | } |
| | | }, |
| | | handleChangeUpload(file, fileLists) { |
| | | this.file = file |
| | | this.$set(this.addInfo, 'name', file.name) |
| | | }, |
| | | // ç¼è¾ |
| | | handleUpdate(row) { |
| | | this.title = 'æä»¶åæ´ç³è¯·' |
| | | this.addInfo = this.HaveJson(row) |
| | | this.addDialogVisible = true |
| | | }, |
| | | // æ¥çéä»¶ |
| | | handleLook(row) { |
| | | this.currentInfo = row |
| | | this.lookDialogVisible = true |
| | | }, |
| | | // å®¡æ ¸ |
| | | handleCheck(row) { |
| | | this.title = 'å®¡æ ¸' |
| | | this.currentInfo = row |
| | | if (!row.url) return this.$message.warning('æä»¶æªä¸ä¼ ') |
| | | this.checkStampDialogVisible = true |
| | | }, |
| | | handleCheck0(row) { |
| | | this.checkStampDialogVisible = false |
| | | this.checkDialogVisible = true |
| | | checkManageDocumentControlledPdf({ id: row.id }).then(res => { |
| | | const blob = new Blob([res]); |
| | | const file = new File([blob], row.name, { type: 'application/pdf' }) |
| | | this.$refs.UpPdfStamp.lookFile(file, this.currentStamp) |
| | | }).catch(err => { |
| | | console.log(err) |
| | | }) |
| | | }, |
| | | handleDown(row) { |
| | | if (!row.url) return this.$message.warning('æä»¶æªä¸ä¼ ') |
| | | let url = this.javaApi + '/word/' + row.url |
| | | this.$download.saveAs(url, row.url); |
| | | }, |
| | | async uploadPDF(pdfBlob) { |
| | | const formData = new FormData(); |
| | | formData.append('file', pdfBlob, this.fileName + '.pdf'); // æä»¶å段 |
| | | formData.append('id', this.currentInfo.id); // æä»¶ååæ®µ |
| | | formData.append('state', this.type); // æä»¶ååæ®µ |
| | | formData.append('writer', this.currentInfo.writer); // æä»¶ååæ®µ |
| | | |
| | | try { |
| | | let res = await checkManageDocumentControlled(formData) |
| | | this.checkLoading = false |
| | | this.noCheckLoading = false |
| | | if (res.code == 200) { |
| | | this.$message({ message: 'æä½æå', type: 'success' }); |
| | | this.checkDialogVisible = false; |
| | | this.refreshTable() |
| | | return true |
| | | } else { |
| | | this.$message({ message: 'æä½å¤±è´¥', type: 'error' }); |
| | | return false |
| | | } |
| | | } catch (e) { |
| | | this.checkLoading = false |
| | | this.noCheckLoading = false |
| | | } |
| | | |
| | | |
| | | }, |
| | | handleCheckSub(type) { |
| | | this.type = type |
| | | if (type == 'éè¿') { |
| | | this.checkLoading = true |
| | | } else { |
| | | this.noCheckLoading = true |
| | | } |
| | | this.addLoading = true |
| | | this.$refs['UpPdfStamp'].generatePDF() |
| | | }, |
| | | handleDelete(row) { |
| | | this.$confirm("æ¯å¦å é¤è¯¥æ¡æ°æ®?", "æç¤º", { |
| | | confirmButtonText: "ç¡®å®", |
| | | cancelButtonText: "åæ¶", |
| | | type: "warning", |
| | | }) |
| | | .then(() => { |
| | | delManageDocumentControlled({ id: row.id }).then((res) => { |
| | | if (res.code == 201) return; |
| | | this.$message.success("å 餿å"); |
| | | this.refresh(); |
| | | }); |
| | | }) |
| | | .catch(() => { }); |
| | | }, |
| | | } |
| | | } |
| | | </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; |
| | | height: calc(100% - 60px - 80px); |
| | | padding: 20px; |
| | | } |
| | | |
| | | .btns { |
| | | position: absolute; |
| | | right: 20px; |
| | | top: 5px; |
| | | } |
| | | |
| | | .stamp { |
| | | cursor: pointer; |
| | | border: #fff 1px solid; |
| | | } |
| | | |
| | | .stamp:hover { |
| | | border: #3A7BFA 1px solid; |
| | | box-shadow: inset 0px 0px 15px #3A7BFA; |
| | | } |
| | | |
| | | .stamp.active { |
| | | border: #3A7BFA 1px solid; |
| | | box-shadow: inset 0px 0px 15px #3A7BFA; |
| | | } |
| | | </style> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <!-- åæ¾åæ¶è®°å½ --> |
| | | <div class="distribution-collection-record" style="height: 100%;"> |
| | | <div class="search"> |
| | | <div class="search_thing"> |
| | | <div class="search_label">æä»¶ç¼å·ï¼</div> |
| | | <div class="search_input"><el-input v-model="queryParams.documentCode" clearable placeholder="请è¾å
¥" size="small" |
| | | @keyup.enter.native="refreshTable()"></el-input></div> |
| | | </div> |
| | | <div class="search_thing"> |
| | | <div class="search_label">æä»¶åç§°ï¼</div> |
| | | <div class="search_input"><el-input v-model="queryParams.name" clearable placeholder="请è¾å
¥" size="small" |
| | | @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" style="padding-left: 30px;"> |
| | | <el-button v-if="addPower" size="small" type="primary" |
| | | @click="addDialogVisible = true, addInfo = {}, radio = 'åæ¾'">æ·»å åæ¾è®°å½</el-button> |
| | | <el-button v-if="outPower" :loading="outLoading" size="small" type="primary" @click="handleOut">导åº</el-button> |
| | | </div> |
| | | </div> |
| | | <div class="table"> |
| | | <lims-table :tableData="tableData" :column="column" :page="page" :tableLoading="tableLoading" |
| | | :height="'calc(100vh - 290px)'" @pagination="pagination"></lims-table> |
| | | </div> |
| | | <el-dialog :title="'æ·»å ' + radio + 'è®°å½'" :visible.sync="addDialogVisible" top="10vh" width="800px"> |
| | | <el-row v-if="addDialogVisible"> |
| | | <el-col :span="12" style="margin-bottom: 16px;"> |
| | | <div class="search_thing"> |
| | | <div class="search_label"><span style="color:red;margin-right: 4px;">*</span>ç³è¯·ç¼å·ï¼</div> |
| | | <div class="search_input"> |
| | | <el-select v-model="addInfo.documentCode" :disabled="radio == 'åæ¶'" allow-create clearable filterable |
| | | size="small" style="width: 100%;" @change="changeFileList"> |
| | | <el-option v-for="item in fileList" :key="item.documentCode" :label="item.documentCode" |
| | | :value="item.documentCode"> |
| | | </el-option> |
| | | </el-select> |
| | | </div> |
| | | </div> |
| | | </el-col> |
| | | <el-col v-if="radio == 'åæ¾'" :span="12" style="margin-bottom: 16px;"> |
| | | <div class="search_thing"> |
| | | <div class="search_label"><span style="color:red;margin-right: 4px;">*</span>åæ¾äººï¼</div> |
| | | <div class="search_input"> |
| | | <el-select v-model="addInfo.issueUser" filterable size="small" style="width: 100%;"> |
| | | <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 v-else :span="12" style="margin-bottom: 16px;"> |
| | | <div class="search_thing"> |
| | | <div class="search_label"><span style="color:red;margin-right: 4px;">*</span>åæ¶äººï¼</div> |
| | | <div class="search_input"> |
| | | <el-select v-model="addInfo.recycleUser" filterable size="small" style="width: 100%;"> |
| | | <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"><span style="color:red;margin-right: 4px;">*</span>审æ¹äººï¼</div> |
| | | <div class="search_input"> |
| | | <el-select v-model="addInfo.receiveUser" :disabled="radio != 'åæ¾'" filterable size="small" |
| | | style="width: 100%;"> |
| | | <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-input v-model="addInfo.name" :disabled="radio == 'åæ¶'" clearable |
| | | placeholder="请è¾å
¥" size="small"></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 v-model="addInfo.version" :disabled="radio == 'åæ¶'" clearable |
| | | placeholder="请è¾å
¥" size="small"></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.state" :disabled="radio == 'åæ¶'" size="small" style="width: 100%;"> |
| | | <el-option v-for="(item, index) in fileState" :key="index" :label="item.label" |
| | | :value="item.value"></el-option> |
| | | </el-select> |
| | | </div> |
| | | </div> |
| | | </el-col> |
| | | <el-col v-if="radio == 'åæ¾'" :span="12" style="margin-bottom: 16px;"> |
| | | <div class="search_thing"> |
| | | <div class="search_label">åæ¾ç¼å·ï¼</div> |
| | | <div class="search_input"><el-input v-model="addInfo.issueCode" clearable placeholder="请è¾å
¥" |
| | | size="small"></el-input></div> |
| | | </div> |
| | | </el-col> |
| | | <el-col v-else :span="12" style="margin-bottom: 16px;"> |
| | | <div class="search_thing"> |
| | | <div class="search_label">åæ¶ç¼å·ï¼</div> |
| | | <div class="search_input"><el-input v-model="addInfo.recycleCode" clearable placeholder="请è¾å
¥" |
| | | size="small"></el-input></div> |
| | | </div> |
| | | </el-col> |
| | | <el-col v-if="radio == 'åæ¾'" :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.issueDate" format="yyyy-MM-dd" placeholder="éæ©æ¥æ" size="small" |
| | | style="width: 100%;" type="date" value-format="yyyy-MM-dd"> |
| | | </el-date-picker> |
| | | </div> |
| | | </div> |
| | | </el-col> |
| | | <el-col v-else :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.recycleDate" format="yyyy-MM-dd" placeholder="éæ©æ¥æ" size="small" |
| | | style="width: 100%;" type="date" value-format="yyyy-MM-dd"> |
| | | </el-date-picker> |
| | | </div> |
| | | </div> |
| | | </el-col> |
| | | <el-col v-if="radio == 'åæ¾'" :span="12" style="margin-bottom: 16px;"> |
| | | <div class="search_thing"> |
| | | <div class="search_label">åæ¾è¯´æï¼</div> |
| | | <div class="search_input"><el-input v-model="addInfo.issueNote" :rows="2" clearable placeholder="请è¾å
¥" |
| | | size="small" type="textarea"></el-input></div> |
| | | </div> |
| | | </el-col> |
| | | <el-col v-else :span="12" style="margin-bottom: 16px;"> |
| | | <div class="search_thing"> |
| | | <div class="search_label">åæ¶è¯´æï¼</div> |
| | | <div class="search_input"><el-input v-model="addInfo.recycleNote" :rows="2" clearable placeholder="请è¾å
¥" |
| | | size="small" type="textarea"></el-input></div> |
| | | </div> |
| | | </el-col> |
| | | <el-col v-if="radio == 'åæ¾'" :span="12" style="margin-bottom: 16px;"> |
| | | <div class="search_thing"> |
| | | <div class="search_label">ä¸ä¼ éä»¶ï¼</div> |
| | | <div class="search_input"><el-upload :auto-upload="false" :multiple="false" :on-change="handleChangeUpload" |
| | | accept='.pdf,.doc,.docx,.xls,.xlsx' action="#" style="margin: 8px 0 0px 50px;"> |
| | | <el-button size="small" type="primary">ä¸ä¼ éä»¶</el-button> |
| | | </el-upload></div> |
| | | </div> |
| | | </el-col> |
| | | </el-row> |
| | | <span slot="footer" class="dialog-footer"> |
| | | <el-button @click="addDialogVisible = false">å æ¶</el-button> |
| | | <el-button :loading="addLoading" type="primary" @click="handleAdd">ç¡® å®</el-button> |
| | | </span> |
| | | </el-dialog> |
| | | <el-dialog :visible.sync="lookDialogVisible" fullscreen title="æ¥çéä»¶" top="5vh" width="800px"> |
| | | <filePreview v-if="lookDialogVisible" :currentFile="{}" :fileUrl="javaApi + '/word/' + currentInfo.url" |
| | | style="height: 90vh;overflow-y: auto;" /> |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | import limsTable from "@/components/Table/lims-table.vue"; |
| | | import filePreview from '@/components/Preview/filePreview.vue' |
| | | import { |
| | | selectUserCondition, |
| | | } from "@/api/system/user.js"; |
| | | import { |
| | | pageManageDocumentList, |
| | | pageManageDocumentCancel, |
| | | exportManageDocumentIssueRecycle, |
| | | addManageDocumentIssueRecycle, |
| | | doManageDocumentIssueRecycle, |
| | | checkManageDocumentIssueRecycle, |
| | | pageManageDocumentIssueRecycle, |
| | | delManageDocumentIssueRecycle, |
| | | } from '@/api/cnas/systemManagement/documentControl.js' |
| | | import { mapGetters } from "vuex"; |
| | | export default { |
| | | components: { |
| | | filePreview, |
| | | limsTable |
| | | }, |
| | | computed: { |
| | | ...mapGetters(["userId"]), |
| | | }, |
| | | data() { |
| | | return { |
| | | ddPower: false, |
| | | outPower: true, |
| | | addInfo: {}, |
| | | addPower: true, |
| | | addLoading: false, |
| | | addDialogVisible: false, |
| | | outLoading: false, |
| | | personList: [], |
| | | fileList: [], |
| | | fileList0: [], |
| | | radio: 'åæ¾', |
| | | fileState: [], |
| | | file: null, |
| | | currentInfo: {}, |
| | | lookDialogVisible: false, |
| | | queryParams: {}, |
| | | tableData: [], |
| | | column: [ |
| | | { label: "æä»¶ç¼å·", prop: "documentCode" }, |
| | | { label: "æä»¶åç§°", prop: "name" }, |
| | | { |
| | | label: "æä»¶çæ¬", |
| | | prop: "version", |
| | | }, |
| | | { label: "æä»¶ç¶æ", prop: "documentState" }, |
| | | { label: "åæ¾ç¼å·", prop: "issueCode" }, |
| | | { label: "åæ¾äºº", prop: "issueUserName" }, |
| | | { label: "åæ¾æ¥æ", prop: "issueDate" }, |
| | | { label: "åæ¶äºº", prop: "recycleUserName" }, |
| | | { label: "åæ¶æ¥æ", prop: "recycleDate" }, |
| | | { |
| | | dataType: "action", |
| | | fixed: "right", |
| | | label: "æä½", |
| | | operation: [ |
| | | { |
| | | name: "åæ¶è®°å½", |
| | | type: "text", |
| | | clickFun: (row) => { |
| | | this.handleUpdate(row); |
| | | } |
| | | }, |
| | | { |
| | | name: "å é¤", |
| | | type: "text", |
| | | clickFun: (row) => { |
| | | this.handleDelete(row); |
| | | }, |
| | | disabFun: (row, index) => { |
| | | return row.documentState == 'éè¿' |
| | | } |
| | | }, |
| | | { |
| | | name: "æ¥çéä»¶", |
| | | type: "text", |
| | | clickFun: (row) => { |
| | | this.handleLook(row); |
| | | }, |
| | | disabFun: (row, index) => { |
| | | return !row.url |
| | | } |
| | | }, |
| | | { |
| | | name: "å®¡æ ¸", |
| | | type: "text", |
| | | clickFun: (row) => { |
| | | this.handleCheck(row); |
| | | }, |
| | | disabFun: (row, index) => { |
| | | return row.receiveUser != this.userId || row.documentState == 'éè¿' |
| | | } |
| | | }, |
| | | ], |
| | | }, |
| | | ], |
| | | page: { |
| | | total: 0, |
| | | size: 10, |
| | | current: 0, |
| | | }, |
| | | tableLoading: false, |
| | | } |
| | | }, |
| | | mounted() { |
| | | this.getList() |
| | | this.getAuthorizedPerson() |
| | | this.getFileList() |
| | | this.getFileList0() |
| | | this.selectEnumByCategory() |
| | | }, |
| | | methods: { |
| | | getPower() { |
| | | let power = JSON.parse(sessionStorage.getItem('power')) |
| | | let out = false |
| | | let del = false |
| | | let add = false |
| | | // let check = false |
| | | for (var i = 0; i < power.length; i++) { |
| | | if (power[i].menuMethod == 'exportManageDocumentIssueRecycle') { |
| | | out = true |
| | | } |
| | | if (power[i].menuMethod == 'addManageDocumentIssueRecycle') { |
| | | add = true |
| | | } |
| | | if (power[i].menuMethod == 'delManageDocumentIssueRecycle') { |
| | | del = true |
| | | } |
| | | // if (power[i].menuMethod == 'checkManageDocumentControlled') { |
| | | // check = true |
| | | // } |
| | | } |
| | | // if (!check) { |
| | | // this.componentData.do.splice(2, 1) |
| | | // } |
| | | if (!del) { |
| | | this.componentData.do.splice(1, 1) |
| | | } |
| | | if (!add) { |
| | | this.componentData.do.splice(0, 1) |
| | | } |
| | | this.addPower = add |
| | | this.outPower = out |
| | | }, |
| | | getList() { |
| | | this.tableLoading = true; |
| | | let param = { ...this.queryParams, ...this.page }; |
| | | delete param.total; |
| | | pageManageDocumentIssueRecycle({ ...param }) |
| | | .then((res) => { |
| | | this.tableLoading = false; |
| | | if (res.code === 200) { |
| | | this.tableData = res.data.records; |
| | | this.page.total = res.data.total; |
| | | } |
| | | }) |
| | | .catch((err) => { |
| | | this.tableLoading = false; |
| | | }); |
| | | }, |
| | | pagination({ page, limit }) { |
| | | this.page.current = page; |
| | | this.page.size = limit; |
| | | this.getList(); |
| | | }, |
| | | refresh() { |
| | | this.queryParams = {}; |
| | | this.page.current = 1; |
| | | this.getList(); |
| | | }, |
| | | refreshTable() { |
| | | this.page.current = 1; |
| | | this.getList(); |
| | | }, |
| | | selectEnumByCategory() { |
| | | // æä»¶ç¶æ |
| | | this.getDicts("document_state").then((response) => { |
| | | this.fileState = this.dictToValue(response.data); |
| | | }); |
| | | }, |
| | | // è·å人åå表 |
| | | getAuthorizedPerson() { |
| | | selectUserCondition().then(res => { |
| | | let data = [] |
| | | res.data.forEach(a => { |
| | | data.push({ |
| | | label: a.name, |
| | | value: a.id |
| | | }) |
| | | }) |
| | | this.personList = data |
| | | }) |
| | | }, |
| | | // è·åæä»¶å表--æä»¶æ¸
å |
| | | getFileList() { |
| | | pageManageDocumentList({ |
| | | current: -1, |
| | | size: -1 |
| | | }).then(res => { |
| | | this.fileList = res.data.records |
| | | }).catch(err => { }) |
| | | }, |
| | | // è·åæä»¶å表--ä½åºæä»¶ |
| | | getFileList0() { |
| | | pageManageDocumentCancel({ |
| | | current: -1, |
| | | size: -1 |
| | | }).then(res => { |
| | | this.fileList0 = res.data.records |
| | | }).catch(err => { }) |
| | | }, |
| | | // å¯¼åº |
| | | handleOut() { |
| | | this.outLoading = true |
| | | // queryParams |
| | | exportManageDocumentIssueRecycle(this.queryParams).then(res => { |
| | | this.outLoading = false |
| | | const blob = new Blob([res], { type: 'application/octet-stream' }); |
| | | this.$download.saveAs(blob, 'åæ¾åæ¶è®°å½.xlsx'); |
| | | }) |
| | | }, |
| | | changeFileList(e) { |
| | | if (e) { |
| | | let obj = this.fileList.find(a => a.documentCode == e) |
| | | if (obj) { |
| | | this.addInfo.name = obj.name |
| | | this.addInfo.version = obj.version |
| | | this.addInfo.state = obj.state |
| | | } |
| | | } |
| | | }, |
| | | // æäº¤ |
| | | handleAdd() { |
| | | if (!this.addInfo.documentCode) { |
| | | this.$message.error('è¯·éæ©æä»¶') |
| | | return |
| | | } |
| | | if (!this.addInfo.receiveUser) { |
| | | this.$message.error('è¯·éæ©å®¡æ¹äºº') |
| | | return |
| | | } |
| | | if (this.radio == 'åæ¾') { |
| | | if (!this.addInfo.issueUser) { |
| | | this.$message.error('è¯·éæ©åæ¾äºº') |
| | | return |
| | | } |
| | | } else { |
| | | if (!this.addInfo.recycleUser) { |
| | | this.$message.error('è¯·éæ©åæ¶äºº') |
| | | return |
| | | } |
| | | } |
| | | this.addLoading = true; |
| | | if (!this.addInfo.id) { |
| | | // æ°å¢åæ¾è®°å½ |
| | | let fd = new FormData(); |
| | | //æä»¶ä¿¡æ¯ä¸rawææ¯ççæä»¶ |
| | | if (this.file) { |
| | | fd.append("file", this.file.raw); |
| | | } |
| | | for (let key in this.addInfo) { |
| | | fd.append(key, this.addInfo[key]) |
| | | } |
| | | addManageDocumentIssueRecycle(fd).then(res => { |
| | | this.addLoading = false; |
| | | if (res.code == 200) { |
| | | this.$message.success('åæ¾æå') |
| | | this.addDialogVisible = false |
| | | this.refreshTable() |
| | | } |
| | | }) |
| | | } else { |
| | | let { documentCode, id, issueUser, recycleUser, receiveUser, name, version, documentState, issueCode, recycleCode, issueDate, recycleDate, issueNote, recycleNote } = this.addInfo |
| | | // æ·»å åæ¶è®°å½ |
| | | doManageDocumentIssueRecycle({ |
| | | documentCode, |
| | | id, |
| | | issueUser, |
| | | recycleUser, |
| | | receiveUser, |
| | | name, |
| | | version, |
| | | documentState, |
| | | issueCode, |
| | | recycleCode, |
| | | issueDate, |
| | | recycleDate, |
| | | issueNote, |
| | | recycleNote |
| | | }).then(res => { |
| | | this.addLoading = false; |
| | | if (res.code == 200) { |
| | | this.$message.success('æäº¤æå') |
| | | this.addDialogVisible = false |
| | | this.refreshTable() |
| | | } |
| | | }) |
| | | } |
| | | }, |
| | | // æ·»å åæ¶ |
| | | handleUpdate(row) { |
| | | this.addInfo = this.HaveJson(row) |
| | | this.radio = 'åæ¶' |
| | | this.addDialogVisible = true |
| | | }, |
| | | // å®¡æ ¸ |
| | | handleCheck(row) { |
| | | this.$confirm('æ¯å¦å®¡æ ¸éè¿?', 'æç¤º', { |
| | | confirmButtonText: 'éè¿', |
| | | cancelButtonText: 'ä¸éè¿', |
| | | type: 'warning', |
| | | closeOnClickModal: false, // ç¦æ¢ç¹å»é®ç½©å±å
³é |
| | | distinguishCancelAndClose: true, |
| | | beforeClose: (action, instance, done) => { |
| | | if (action === 'confirm') { |
| | | // ç¹å»âç¡®å®âæé®ï¼å
许å
³é |
| | | checkManageDocumentIssueRecycle({ id: row.id, documentState: 'éè¿' }).then(res => { |
| | | this.refreshTable() |
| | | done(); |
| | | this.$message({ |
| | | type: 'success', |
| | | message: 'æäº¤æå' |
| | | }) |
| | | }) |
| | | .catch(err => { |
| | | |
| | | }) |
| | | } else if (action === 'cancel') { |
| | | // ç¹å»âåæ¶âæé®ï¼ä¸å
许å
³é |
| | | checkManageDocumentIssueRecycle({ id: row.id, documentState: 'ä¸éè¿' }).then(res => { |
| | | this.refreshTable() |
| | | done(); |
| | | this.$message({ |
| | | type: 'success', |
| | | message: 'æäº¤æå' |
| | | }) |
| | | }) |
| | | .catch(err => { |
| | | |
| | | }) |
| | | } else if (action === 'close') { |
| | | // ç¹å»âÃâæé®ï¼ä¸å
许å
³é |
| | | done(); |
| | | console.log("Ãæé®ç¹å»äºä»¶ï¼ä¸å
³éå¼¹æ¡"); |
| | | } |
| | | } |
| | | }) |
| | | }, |
| | | handleChangeUpload(file, fileLists) { |
| | | this.file = file |
| | | this.$set(this.addInfo, 'name', file.name) |
| | | }, |
| | | // æ¥çéä»¶ |
| | | handleLook(row) { |
| | | this.currentInfo = this.HaveJson(row) |
| | | this.lookDialogVisible = true |
| | | }, |
| | | handleDelete(row) { |
| | | this.$confirm("æ¯å¦å é¤è¯¥æ¡æ°æ®?", "æç¤º", { |
| | | confirmButtonText: "ç¡®å®", |
| | | cancelButtonText: "åæ¶", |
| | | type: "warning", |
| | | }) |
| | | .then(() => { |
| | | delManageDocumentIssueRecycle({ id: row.id }).then((res) => { |
| | | if (res.code == 201) return; |
| | | this.$message.success("å 餿å"); |
| | | this.refresh(); |
| | | }); |
| | | }) |
| | | .catch(() => { }); |
| | | }, |
| | | } |
| | | } |
| | | </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; |
| | | height: calc(100% - 60px - 80px); |
| | | padding: 20px; |
| | | } |
| | | |
| | | .btns { |
| | | position: absolute; |
| | | right: 20px; |
| | | top: 5px; |
| | | } |
| | | </style> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <!-- æä»¶åæ´ç³è¯· --> |
| | | <div class="file-change-request" style="height: 100%;"> |
| | | <div class="search"> |
| | | <div class="search_thing"> |
| | | <div class="search_label">ç³è¯·æä»¶ç¼å·ï¼</div> |
| | | <div class="search_input"><el-input v-model="queryParams.code" clearable placeholder="请è¾å
¥" size="small" |
| | | @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="small" type="primary" |
| | | @click="addDialogVisible = true, addInfo = {}, currentFile = {}, title = 'æä»¶åæ´ç³è¯·'">æä»¶åæ´ç³è¯·</el-button> |
| | | <el-button :loading="outLoading" size="small" type="primary" @click="handleOut">导åº</el-button> |
| | | </div> |
| | | </div> |
| | | <div class="table"> |
| | | <lims-table :tableData="tableData" :column="column" :page="page" :tableLoading="tableLoading" |
| | | :height="'calc(100vh - 290px)'" @pagination="pagination"></lims-table> |
| | | </div> |
| | | <el-dialog :title="title" :visible.sync="addDialogVisible" top="0vh" width="950px"> |
| | | <el-row> |
| | | <el-col :span="12" style="margin-bottom: 16px;"> |
| | | <div class="search_thing"> |
| | | <div class="search_label"><span style="color:red;margin-right: 4px;">*</span>ç³è¯·ç¼å·ï¼</div> |
| | | <div class="search_input"><el-input v-model="addInfo.code" :disabled="title == 'å®¡æ ¸'" clearable |
| | | placeholder="请è¾å
¥" size="small"></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.checkUser" :disabled="title == 'å®¡æ ¸'" filterable size="small" |
| | | style="width: 100%;"> |
| | | <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-date-picker v-model="addInfo.expectAlterDate" :disabled="title == 'å®¡æ ¸'" format="yyyy-MM-dd" |
| | | placeholder="éæ©æ¥æ" size="small" style="width: 100%;" type="date" value-format="yyyy-MM-dd"> |
| | | </el-date-picker> |
| | | </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.actuallyAlterDate" :disabled="title == 'å®¡æ ¸'" format="yyyy-MM-dd" |
| | | placeholder="éæ©æ¥æ" size="small" style="width: 100%;" type="date" value-format="yyyy-MM-dd"> |
| | | </el-date-picker> |
| | | </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.alterBeforeCode" :disabled="title == 'å®¡æ ¸'" allow-create clearable filterable |
| | | size="small" style="width: 100%;" @change="getCurrentFile"> |
| | | <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"> |
| | | <h4 class="title">å½åæä»¶ä¿¡æ¯</h4> |
| | | </el-col> |
| | | <el-col :span="8" style="margin-bottom: 16px;"> |
| | | <div class="search_thing" style="width: 100%;"> |
| | | <div class="search_label">æä»¶ç¼å·ï¼</div> |
| | | <div class="search_input"><el-input v-model="currentFile.documentCode" :disabled="title == 'å®¡æ ¸'" clearable |
| | | placeholder="请è¾å
¥" size="small"></el-input></div> |
| | | </div> |
| | | </el-col> |
| | | <el-col :span="8" style="margin-bottom: 16px;"> |
| | | <div class="search_thing" style="width: 100%;"> |
| | | <div class="search_label">æä»¶åç§°ï¼</div> |
| | | <div class="search_input"><el-input v-model="currentFile.name" :disabled="title == 'å®¡æ ¸'" clearable |
| | | placeholder="请è¾å
¥" size="small"></el-input></div> |
| | | </div> |
| | | </el-col> |
| | | <el-col :span="8" style="margin-bottom: 16px;"> |
| | | <div class="search_thing" style="width: 100%;"> |
| | | <div class="search_label">æä»¶çæ¬ï¼</div> |
| | | <div class="search_input"><el-input v-model="currentFile.version" :disabled="title == 'å®¡æ ¸'" clearable |
| | | placeholder="请è¾å
¥" size="small"></el-input></div> |
| | | </div> |
| | | </el-col> |
| | | <el-col :span="8" style="margin-bottom: 16px;"> |
| | | <div class="search_thing" style="width: 100%;"> |
| | | <div class="search_label">æäº¤äººï¼</div> |
| | | <div class="search_input"><el-select v-model="currentFile.createUser" disabled filterable size="small" |
| | | style="width: 100%;"> |
| | | <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="8" style="margin-bottom: 16px;"> |
| | | <div class="search_thing" style="width: 100%;"> |
| | | <div class="search_label">å®¡æ ¸äººï¼</div> |
| | | <div class="search_input"><el-input size="small" placeholder="请è¾å
¥" clearable v-model="addInfo.version" disabled></el-input></div> |
| | | </div> |
| | | </el-col> |
| | | <el-col :span="8" style="margin-bottom: 16px;"> |
| | | <div class="search_thing" style="width: 100%;"> |
| | | <div class="search_label">ä½åºäººï¼</div> |
| | | <div class="search_input"><el-input size="small" placeholder="请è¾å
¥" clearable v-model="addInfo.version" disabled></el-input></div> |
| | | </div> |
| | | </el-col> --> |
| | | <el-col :span="8" style="margin-bottom: 16px;"> |
| | | <div class="search_thing" style="width: 100%;"> |
| | | <div class="search_label">æäº¤æ¶é´ï¼</div> |
| | | <div class="search_input"><el-input v-model="currentFile.createTime" clearable disabled placeholder="请è¾å
¥" |
| | | size="small"></el-input></div> |
| | | </div> |
| | | </el-col> |
| | | <el-col :span="8" style="margin-bottom: 16px;"> |
| | | <div class="search_thing" style="width: 100%;"> |
| | | <div class="search_label">å®¡æ ¸æ¶é´ï¼</div> |
| | | <div class="search_input"><el-input v-model="currentFile.effectiveDate" clearable disabled placeholder="请è¾å
¥" |
| | | size="small"></el-input></div> |
| | | </div> |
| | | </el-col> |
| | | <!-- <el-col :span="8" style="margin-bottom: 16px;"> |
| | | <div class="search_thing" style="width: 100%;"> |
| | | <div class="search_label">ä½åºæ¶é´ï¼</div> |
| | | <div class="search_input"><el-input size="small" placeholder="请è¾å
¥" clearable v-model="addInfo.version" disabled></el-input></div> |
| | | </div> |
| | | </el-col> --> |
| | | <el-col :span="8" style="margin-bottom: 16px;"> |
| | | <div class="search_thing" style="width: 100%;"> |
| | | <div class="search_label">æä»¶ç¶æï¼</div> |
| | | <div class="search_input"> |
| | | <el-select v-model="currentFile.state" disabled size="small" style="width: 100%;"> |
| | | <el-option v-for="item in fileState" :key="item.value" :label="item.label" :value="item.value"> |
| | | </el-option> |
| | | </el-select> |
| | | </div> |
| | | </div> |
| | | </el-col> |
| | | <!-- <el-col :span="8" style="margin-bottom: 16px;"> |
| | | <div class="search_thing" style="width: 100%;"> |
| | | <div class="search_label">æä»¶è¯´æï¼</div> |
| | | <div class="search_input"><el-input size="small" placeholder="请è¾å
¥" clearable v-model="addInfo.instructions" type="textarea" |
| | | :rows="2" disabled></el-input></div> |
| | | </div> |
| | | </el-col> --> |
| | | <el-col :span="24"> |
| | | <h4 class="title">æä»¶åæ´ç³è¯·</h4> |
| | | </el-col> |
| | | <el-col :span="8" style="margin-bottom: 16px;"> |
| | | <div class="search_thing" style="width: 100%;"> |
| | | <div class="search_label">åæ´åç¼å·ï¼</div> |
| | | <div class="search_input"><el-input v-model="addInfo.alterAfterCode" :disabled="title == 'å®¡æ ¸'" clearable |
| | | placeholder="请è¾å
¥" size="small"></el-input></div> |
| | | </div> |
| | | </el-col> |
| | | <el-col :span="8" style="margin-bottom: 16px;"> |
| | | <div class="search_thing" style="width: 100%;"> |
| | | <div class="search_label">åæ´ååç§°ï¼</div> |
| | | <div class="search_input"><el-input v-model="addInfo.alterAfterName" :disabled="title == 'å®¡æ ¸'" clearable |
| | | placeholder="请è¾å
¥" size="small"></el-input></div> |
| | | </div> |
| | | </el-col> |
| | | <el-col :span="8" style="margin-bottom: 16px;"> |
| | | <div class="search_thing" style="width: 100%;"> |
| | | <div class="search_label">åä¸çæ¬å¤çï¼</div> |
| | | <div class="search_input"> |
| | | <el-select v-model="addInfo.method" :disabled="title == 'å®¡æ ¸'" size="small" style="width: 100%;"> |
| | | <el-option label="ä½åº" value="ä½åº"></el-option> |
| | | <el-option label="åæ¡£ä¸å¯ç¨" value="åæ¡£ä¸å¯ç¨"> |
| | | </el-option> |
| | | </el-select> |
| | | </div> |
| | | </div> |
| | | </el-col> |
| | | <el-col :span="8" style="margin-bottom: 16px;"> |
| | | <div class="search_thing" style="width: 100%;"> |
| | | <div class="search_label">åæ´åçæ¬ï¼</div> |
| | | <div class="search_input"><el-input v-model="addInfo.alterAfterVersion" :disabled="title == 'å®¡æ ¸'" clearable |
| | | placeholder="请è¾å
¥" size="small"></el-input></div> |
| | | </div> |
| | | </el-col> |
| | | <el-col :span="16" style="margin-bottom: 16px;"> |
| | | <div class="search_thing" style="width: 100%;"> |
| | | <div class="search_label">åæ´è¯´æï¼</div> |
| | | <div class="search_input"><el-input v-model="addInfo.alterNote" :disabled="title == 'å®¡æ ¸'" :rows="2" |
| | | clearable placeholder="请è¾å
¥" size="small" type="textarea"></el-input></div> |
| | | </div> |
| | | </el-col> |
| | | <el-col v-if="title != 'å®¡æ ¸'" :span="24" style="margin-bottom: 16px;"> |
| | | <div class="search_thing" style="width: 100%;"> |
| | | <div class="search_label">ç¸å
³éä»¶ï¼</div> |
| | | <div class="search_input"><el-upload v-if="addDialogVisible" :auto-upload="false" :multiple="false" |
| | | :on-change="handleChangeUpload" accept='.pdf' action="#" style="margin: 8px 0 0px 50px;"> |
| | | <el-button size="small" type="primary">ä¸ä¼ éä»¶</el-button> |
| | | </el-upload></div> |
| | | </div> |
| | | </el-col> |
| | | <UpPdfStamp v-if="title == 'å®¡æ ¸' && addDialogVisible" ref="UpPdfStamp" :isUpFile="false" @uploadPDF="uploadPDF"> |
| | | </UpPdfStamp> |
| | | </el-row> |
| | | <span v-if="title != 'å®¡æ ¸'" slot="footer" class="dialog-footer"> |
| | | <el-button @click="addDialogVisible = false">å æ¶</el-button> |
| | | <el-button :loading="addLoading" type="primary" @click="handleAdd">ç¡® å®</el-button> |
| | | </span> |
| | | <span v-else slot="footer" class="dialog-footer"> |
| | | <el-button :loading="noCheckLoading" @click="handleCheckSub('ä¸éè¿')">ä¸éè¿</el-button> |
| | | <el-button :loading="checkLoading" type="primary" @click="handleCheckSub('éè¿')">é è¿</el-button> |
| | | </span> |
| | | </el-dialog> |
| | | <el-dialog :visible.sync="lookDialogVisible" fullscreen title="æ¥çéä»¶" top="5vh" width="800px"> |
| | | <filePreview v-if="lookDialogVisible" :currentFile="{}" :fileUrl="javaApi + '/word/' + currentInfo.alterAfterUrl" |
| | | style="height: 90vh;overflow-y: auto;" /> |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | import limsTable from "@/components/Table/lims-table.vue"; |
| | | import UpPdfStamp from '@/components/UpPdfStamp/index.vue' |
| | | import filePreview from '@/components/Preview/filePreview.vue' |
| | | import { |
| | | selectUserCondition, |
| | | } from "@/api/system/user.js"; |
| | | import { |
| | | exportManageDocumentAlter, |
| | | pageManageDocumentList, |
| | | addManageDocumentAlter, |
| | | doManageDocumentAlter, |
| | | checkManageDocumentAlterPdf, |
| | | checkManageDocumentAlter, |
| | | delManageDocumentAlter, |
| | | pageManageDocumentAlter, |
| | | } from '@/api/cnas/systemManagement/documentControl.js' |
| | | import { mapGetters } from "vuex"; |
| | | export default { |
| | | components: { |
| | | limsTable, |
| | | filePreview, |
| | | UpPdfStamp, |
| | | }, |
| | | computed: { |
| | | ...mapGetters(["userId"]), |
| | | }, |
| | | data() { |
| | | return { |
| | | title: 'æä»¶åæ´ç³è¯·', |
| | | noCheckLoading: false, |
| | | checkLoading: false, |
| | | addDialogVisible: false, |
| | | addInfo: {}, |
| | | addPower: false, |
| | | outPower: false, |
| | | outLoading: false, |
| | | personList: [], |
| | | fileList: [], |
| | | currentFile: {}, |
| | | fileState: [], |
| | | file: null, |
| | | addLoading: false, |
| | | lookDialogVisible: false, |
| | | currentInfo: { |
| | | }, |
| | | type: null, |
| | | fileName: null, |
| | | queryParams: {}, |
| | | tableData: [], |
| | | column: [ |
| | | { label: "ç³è¯·ç¼å·", prop: "code" }, |
| | | { label: "ç³è¯·äºº", prop: "createUserName", width: "120px" }, |
| | | { |
| | | label: "åæ´è¯´æ", |
| | | prop: "alterNote", |
| | | }, |
| | | { label: "ææåæ´æ¶é´", prop: "expectAlterDate" }, |
| | | { label: "å®é
åæ´æ¶é´", prop: "actuallyAlterDate" }, |
| | | { |
| | | label: "ç¶æ", prop: "state", dataType: "tag", |
| | | formatData: (params) => { |
| | | return params; |
| | | }, |
| | | formatType: (params) => { |
| | | if (params == 'éè¿') { |
| | | return 'success' |
| | | } else { |
| | | return 'danger' |
| | | } |
| | | }, |
| | | }, |
| | | { |
| | | dataType: "action", |
| | | fixed: "right", |
| | | label: "æä½", |
| | | operation: [ |
| | | { |
| | | name: "ç¼è¾", |
| | | type: "text", |
| | | clickFun: (row) => { |
| | | this.handleUpdate(row); |
| | | }, |
| | | disabled: (row, index) => { |
| | | return row.state == 'éè¿' |
| | | } |
| | | }, |
| | | { |
| | | name: "å é¤", |
| | | type: "text", |
| | | clickFun: (row) => { |
| | | this.handleDelete(row); |
| | | }, |
| | | disabled: (row, index) => { |
| | | return row.state == 'éè¿' |
| | | } |
| | | }, |
| | | { |
| | | name: "å®¡æ ¸", |
| | | type: "text", |
| | | clickFun: (row) => { |
| | | this.handleCheck(row); |
| | | }, |
| | | disabled: (row, index) => { |
| | | return row.checkUser != this.userId || row.state == 'éè¿' |
| | | } |
| | | }, |
| | | { |
| | | name: "æ¥çéä»¶", |
| | | type: "text", |
| | | clickFun: (row) => { |
| | | this.handleLook(row); |
| | | }, |
| | | }, |
| | | { |
| | | name: "ä¸è½½éä»¶", |
| | | type: "text", |
| | | clickFun: (row) => { |
| | | this.handleDown(row); |
| | | }, |
| | | }, |
| | | ], |
| | | }, |
| | | ], |
| | | page: { |
| | | total: 0, |
| | | size: 10, |
| | | current: 0, |
| | | }, |
| | | tableLoading: false, |
| | | } |
| | | }, |
| | | mounted() { |
| | | this.getList() |
| | | this.getAuthorizedPerson() |
| | | this.getFileList() |
| | | this.selectEnumByCategory() |
| | | }, |
| | | methods: { |
| | | getPower() { |
| | | let power = JSON.parse(sessionStorage.getItem('power')) |
| | | let up = false |
| | | let del = false |
| | | let add = false |
| | | let out = false |
| | | for (var i = 0; i < power.length; i++) { |
| | | if (power[i].menuMethod == 'addManageDocumentAlter') { |
| | | up = true |
| | | } |
| | | if (power[i].menuMethod == 'addManageDocumentAlter') { |
| | | add = true |
| | | } |
| | | if (power[i].menuMethod == 'delManageDocumentAlter') { |
| | | del = true |
| | | } |
| | | if (power[i].menuMethod == 'exportManageDocumentAlter') { |
| | | out = true |
| | | } |
| | | } |
| | | if (!del) { |
| | | this.componentData.do.splice(1, 1) |
| | | } |
| | | if (!up) { |
| | | this.componentData.do.splice(0, 1) |
| | | } |
| | | this.addPower = add |
| | | this.outPower = out |
| | | }, |
| | | getList() { |
| | | this.tableLoading = true; |
| | | let param = { ...this.queryParams, ...this.page }; |
| | | delete param.total; |
| | | pageManageDocumentAlter({ ...param }) |
| | | .then((res) => { |
| | | this.tableLoading = false; |
| | | if (res.code === 200) { |
| | | this.tableData = res.data.records; |
| | | this.page.total = res.data.total; |
| | | } |
| | | }) |
| | | .catch((err) => { |
| | | this.tableLoading = false; |
| | | }); |
| | | }, |
| | | pagination({ page, limit }) { |
| | | this.page.current = page; |
| | | this.page.size = limit; |
| | | this.getList(); |
| | | }, |
| | | refresh() { |
| | | this.queryParams = {}; |
| | | this.page.current = 1; |
| | | this.getList(); |
| | | }, |
| | | refreshTable() { |
| | | this.page.current = 1; |
| | | this.getList(); |
| | | }, |
| | | // å¯¼åº |
| | | handleOut() { |
| | | this.outLoading = true |
| | | exportManageDocumentAlter(this.queryParams).then(res => { |
| | | this.outLoading = false |
| | | const blob = new Blob([res], { type: 'application/octet-stream' }); |
| | | this.$download.saveAs(blob, 'æä»¶åæ´è®°å½.xlsx') |
| | | }) |
| | | }, |
| | | getAuthorizedPerson() { |
| | | selectUserCondition().then(res => { |
| | | let data = [] |
| | | res.data.forEach(a => { |
| | | data.push({ |
| | | label: a.name, |
| | | value: a.id |
| | | }) |
| | | }) |
| | | this.personList = data |
| | | }) |
| | | }, |
| | | // è·åæä»¶å表--æä»¶æ¸
å |
| | | getFileList() { |
| | | pageManageDocumentList({ |
| | | current: -1, |
| | | size: -1 |
| | | }).then(res => { |
| | | this.fileList = res.data.records.map(m => { |
| | | m.title = m.documentCode + ':' + m.name |
| | | return m |
| | | }) |
| | | }).catch(err => { }) |
| | | }, |
| | | // å½åæä»¶ |
| | | getCurrentFile(e) { |
| | | this.currentFile = this.fileList.find(m => m.documentCode == e) |
| | | if (!this.currentFile) { |
| | | this.currentFile = {} |
| | | } |
| | | }, |
| | | selectEnumByCategory() { |
| | | // æä»¶ç¶æ |
| | | this.getDicts("document_state").then((response) => { |
| | | this.fileState = this.dictToValue(response.data); |
| | | }); |
| | | }, |
| | | handleChangeUpload(file, fileLists) { |
| | | this.file = file |
| | | this.$set(this.addInfo, 'alterAfterName', file.name) |
| | | }, |
| | | handleAdd() { |
| | | if (!this.addInfo.code) return this.$message({ type: 'error', message: "请è¾å
¥ç³è¯·ç¼å·" }) |
| | | if (!this.addInfo.id) { |
| | | // æ°å¢ |
| | | let fd = new FormData(); |
| | | //æä»¶ä¿¡æ¯ä¸rawææ¯ççæä»¶ |
| | | if (this.file) { |
| | | fd.append("file", this.file.raw); |
| | | } |
| | | for (let m in this.addInfo) { |
| | | fd.append(m, this.addInfo[m]) |
| | | } |
| | | let { name, version, documentCode } = this.currentFile; |
| | | fd.append("alterBeforeName", name); |
| | | fd.append("alterBeforeVersion", version); |
| | | // fd.append("alterBeforeCode",documentCode); |
| | | this.addLoading = true |
| | | addManageDocumentAlter(fd).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 fd = new FormData(); |
| | | //æä»¶ä¿¡æ¯ä¸rawææ¯ççæä»¶ |
| | | if (this.file) { |
| | | fd.append("file", this.file.raw); |
| | | } |
| | | let { name, version } = this.currentFile; |
| | | fd.append("alterBeforeName", name); |
| | | fd.append("alterBeforeVersion", version); |
| | | let { code, checkUser, expectAlterDate, actuallyAlterDate, alterAfterCode, method, alterAfterVersion, alterNote, alterAfterName, id } = this.addInfo |
| | | fd.append("code", code); |
| | | fd.append("checkUser", checkUser); |
| | | fd.append("expectAlterDate", expectAlterDate); |
| | | fd.append("actuallyAlterDate", actuallyAlterDate); |
| | | fd.append("alterAfterCode", alterAfterCode); |
| | | fd.append("method", method); |
| | | fd.append("alterAfterVersion", alterAfterVersion); |
| | | fd.append("alterNote", alterNote); |
| | | fd.append("alterAfterName", alterAfterName); |
| | | fd.append("id", id); |
| | | this.addLoading = true |
| | | doManageDocumentAlter(fd).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: 'ä¿®æ¹å¤±è´¥' |
| | | }) |
| | | } |
| | | }) |
| | | } |
| | | }, |
| | | // ç¼è¾ |
| | | handleUpdate(row) { |
| | | this.title = 'æä»¶åæ´ç³è¯·' |
| | | this.addInfo = this.HaveJson(row) |
| | | let alterBeforeCode = this.addInfo.alterBeforeCode |
| | | this.getCurrentFile(alterBeforeCode) |
| | | this.addDialogVisible = true |
| | | }, |
| | | // é¢è§ |
| | | handleLook(row) { |
| | | this.currentInfo = this.HaveJson(row) |
| | | this.lookDialogVisible = true |
| | | }, |
| | | // ä¸è½½éä»¶ |
| | | handleDown(row) { |
| | | if (!row.alterAfterUrl) return this.$message.warning('æä»¶æªä¸ä¼ ') |
| | | let url = this.javaApi + '/word/' + row.alterAfterUrl |
| | | this.$download.saveAs(url, row.alterAfterUrl) |
| | | }, |
| | | // æå¼å®¡æ ¸å¼¹æ¡ |
| | | handleCheck(row) { |
| | | this.title = 'å®¡æ ¸' |
| | | this.fileName = row.alterAfterName |
| | | if (!row.alterAfterUrl) return this.$message.warning('æä»¶æªä¸ä¼ ') |
| | | this.addInfo = this.HaveJson(row) |
| | | let alterBeforeCode = this.addInfo.alterBeforeCode |
| | | this.getCurrentFile(alterBeforeCode) |
| | | this.addDialogVisible = true |
| | | checkManageDocumentAlterPdf({ id: row.id }).then(res => { |
| | | // |
| | | const blob = new Blob([res]); |
| | | const file = new File([blob], row.name, { type: 'application/pdf' }) |
| | | this.$refs.UpPdfStamp.lookFile(file) |
| | | this.currentInfo = row |
| | | }).catch(err => { |
| | | console.log(err) |
| | | }) |
| | | }, |
| | | // å®¡æ ¸ä¿å |
| | | async uploadPDF(pdfBlob) { |
| | | const formData = new FormData(); |
| | | formData.append('file', pdfBlob, this.fileName + '.pdf'); // æä»¶å段 |
| | | formData.append('id', this.currentInfo.id); // æä»¶ååæ®µ |
| | | formData.append('state', this.type); // æä»¶ååæ®µ |
| | | |
| | | let res = await checkManageDocumentAlter(formData) |
| | | this.checkLoading = false |
| | | this.noCheckLoading = false |
| | | if (res.code == 200) { |
| | | this.$message({ message: 'æä½æå', type: 'success' }); |
| | | this.addDialogVisible = false; |
| | | this.refreshTable() |
| | | return true |
| | | } else { |
| | | this.$message({ message: 'æä½å¤±è´¥', type: 'error' }); |
| | | return false |
| | | } |
| | | }, |
| | | // æäº¤å®¡æ ¸ |
| | | handleCheckSub(type) { |
| | | this.type = type |
| | | if (type == 'éè¿') { |
| | | this.checkLoading = true |
| | | } else { |
| | | this.noCheckLoading = true |
| | | } |
| | | this.addLoading = true |
| | | this.$refs['UpPdfStamp'].generatePDF() |
| | | }, |
| | | handleDelete(row) { |
| | | this.$confirm("æ¯å¦å é¤è¯¥æ¡æ°æ®?", "æç¤º", { |
| | | confirmButtonText: "ç¡®å®", |
| | | cancelButtonText: "åæ¶", |
| | | type: "warning", |
| | | }) |
| | | .then(() => { |
| | | delManageDocumentAlter({ id: row.id }).then((res) => { |
| | | if (res.code == 201) return; |
| | | this.$message.success("å 餿å"); |
| | | this.refresh(); |
| | | }); |
| | | }) |
| | | .catch(() => { }); |
| | | }, |
| | | } |
| | | } |
| | | </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; |
| | | height: calc(100% - 60px - 80px); |
| | | padding: 20px; |
| | | } |
| | | |
| | | .btns { |
| | | position: absolute; |
| | | right: 20px; |
| | | top: 5px; |
| | | } |
| | | |
| | | 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; |
| | | } |
| | | </style> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <!-- æä»¶æ¸
å --> |
| | | <div class="file-list" 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="queryParams.name" |
| | | @keyup.enter.native="refreshTable()"></el-input></div> |
| | | </div> |
| | | <div class="search_thing"> |
| | | <div class="search_label">æä»¶ç¶æï¼</div> |
| | | <div class="search_input"> |
| | | <el-select v-model="queryParams.state" size="small" @change="refreshTable()"> |
| | | <el-option :label="item.label" :value="item.value" v-for="(item, index) in fileState" |
| | | :key="index"></el-option> |
| | | </el-select> |
| | | </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" style="padding-left: 30px;"> |
| | | <el-upload :action="action" :multiple="false" accept='.xls,.xlsx' :headers="uploadHeader" |
| | | :on-change="beforeUpload" :on-error="onError" ref='upload' :on-success="handleSuccessUp" |
| | | :show-file-list="false"> |
| | | <el-button size="small" type="primary" :loading="upLoading">导å
¥</el-button></el-upload> |
| | | </div> |
| | | </div> |
| | | <div class="table"> |
| | | <lims-table :tableData="tableData" :column="column" :page="page" :tableLoading="tableLoading" |
| | | :height="'calc(100vh - 290px)'" @pagination="pagination"></lims-table> |
| | | </div> |
| | | <el-dialog title="ä¸ä¼ " :visible.sync="addDialogVisible" width="1000px" top="3vh"> |
| | | <UpPdfStamp ref="UpPdfStamp" v-if="addDialogVisible" @uploadPDF="uploadPDF" :isUpFile="true" |
| | | @uploadPDFErr="uploadPDFErr"></UpPdfStamp> |
| | | <span slot="footer" class="dialog-footer"> |
| | | <el-button @click="addDialogVisible = false">å æ¶</el-button> |
| | | <el-button type="primary" @click="handleAdd" v-loading="addLoading">ç¡® å®</el-button> |
| | | </span> |
| | | </el-dialog> |
| | | <el-dialog title="æ¥çéä»¶" :visible.sync="lookDialogVisible" width="800px" top="5vh" fullscreen> |
| | | <filePreview v-if="lookDialogVisible" :fileUrl="javaApi + '/word/' + currentInfo.url" :currentFile="{}" |
| | | style="max-height: 90vh;overflow-y: auto;" /> |
| | | </el-dialog> |
| | | <!-- æ°å¢/ç¼è¾ --> |
| | | <el-dialog :title="title" :visible.sync="addDia" width="500px"> |
| | | <el-form :model="currentInfo" ref="currentInfoForm" :rules="rules" label-position="right" label-width="120px"> |
| | | <el-form-item label="æä»¶ç¼å·" prop="documentCode"> |
| | | <el-input size="small" placeholder="请è¾å
¥" clearable v-model="currentInfo.documentCode"></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="ç±»å«" prop="type"> |
| | | <el-select v-model="currentInfo.type" size="small" clearable placeholder="è¯·éæ©" style="width: 100%"> |
| | | <el-option v-for="item in fileType" :key="item.value" :label="item.label" :value="item.value"> |
| | | </el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="åç§°" prop="name"> |
| | | <el-input size="small" placeholder="请è¾å
¥" clearable v-model="currentInfo.name"> |
| | | </el-input> |
| | | </el-form-item> |
| | | <el-form-item label="æä»¶çæ¬" prop="version"> |
| | | <el-input size="small" placeholder="请è¾å
¥" clearable v-model="currentInfo.version"> |
| | | </el-input> |
| | | </el-form-item> |
| | | <el-form-item label="ä½è
" prop="writer"> |
| | | <el-input size="small" placeholder="请è¾å
¥" clearable v-model="currentInfo.writer"> |
| | | </el-input> |
| | | </el-form-item> |
| | | <el-form-item label="çææ¥æ" prop="effectiveDate"> |
| | | <el-date-picker v-model="currentInfo.effectiveDate" format="yyyy-MM-dd" value-format="yyyy-MM-dd" type="date" |
| | | size="small" placeholder="éæ©æ¥æ"> |
| | | </el-date-picker> |
| | | </el-form-item> |
| | | <el-form-item label="æä»¶ç¶æ" prop="state"> |
| | | <el-select v-model="currentInfo.state" size="small" clearable placeholder="è¯·éæ©" style="width: 100%"> |
| | | <el-option v-for="item in fileState" :key="item.value" :label="item.label" :value="item.value"> |
| | | </el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-form> |
| | | <span slot="footer" class="dialog-footer"> |
| | | <el-button @click="addDia = false">å æ¶</el-button> |
| | | <el-button :loading="uploading" type="primary" @click="submitProduct('currentInfoForm')">确 认</el-button> |
| | | </span> |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | import UpPdfStamp from '@/components/UpPdfStamp/index.vue' |
| | | import filePreview from '@/components/Preview/filePreview.vue' |
| | | import limsTable from "@/components/Table/lims-table.vue"; |
| | | import { |
| | | uploadFileManageDocumentList, |
| | | pageManageDocumentList, |
| | | delManageDocumentList, |
| | | doManageDocumentList, |
| | | } from '@/api/cnas/systemManagement/documentControl.js' |
| | | export default { |
| | | components: { |
| | | UpPdfStamp, |
| | | filePreview, |
| | | limsTable, |
| | | }, |
| | | data() { |
| | | return { |
| | | addDialogVisible: false, |
| | | lookDialogVisible: false, |
| | | addPower: false, |
| | | upLoading: false, |
| | | addLoading: false, |
| | | currentInfo: {}, |
| | | fileType: [], |
| | | fileState: [], |
| | | title: 'æ°å¢', |
| | | queryParams: {}, |
| | | tableData: [], |
| | | column: [ |
| | | { label: "æä»¶ç¼å·", prop: "documentCode" }, |
| | | { |
| | | label: "ç±»å«", prop: "type", width: "120px", dataType: "tag", |
| | | formatData: (params) => { |
| | | return this.fileType.find((m) => m.value == params).label; |
| | | }, |
| | | formatType: (params) => { |
| | | return this.fileType.find((m) => m.value == params).type; |
| | | }, |
| | | }, |
| | | { |
| | | label: "åç§°", |
| | | prop: "name", |
| | | }, |
| | | { label: "æä»¶çæ¬", prop: "version" }, |
| | | { label: "ä½è
", prop: "writer" }, |
| | | { label: "çææ¥æ", prop: "effectiveDate" }, |
| | | { |
| | | label: "æä»¶ç¶æ", prop: "state", dataType: "tag", |
| | | formatData: (params) => { |
| | | return this.fileState.find((m) => m.value == params).label; |
| | | }, |
| | | formatType: (params) => { |
| | | return this.fileState.find((m) => m.value == params).type; |
| | | }, |
| | | }, |
| | | { |
| | | dataType: "action", |
| | | fixed: "right", |
| | | label: "æä½", |
| | | operation: [ |
| | | { |
| | | name: "ç¼è¾", |
| | | type: "text", |
| | | clickFun: (row) => { |
| | | this.openAdd("ç¼è¾", row); |
| | | }, |
| | | }, |
| | | { |
| | | name: "ä¸ä¼ ", |
| | | type: "text", |
| | | clickFun: (row) => { |
| | | this.handleUp(row); |
| | | }, |
| | | }, |
| | | { |
| | | name: "ä¸è½½", |
| | | type: "text", |
| | | clickFun: (row) => { |
| | | this.handleDown(row); |
| | | }, |
| | | }, |
| | | { |
| | | name: "æ¥çéä»¶", |
| | | type: "text", |
| | | clickFun: (row) => { |
| | | this.handleLook(row); |
| | | }, |
| | | }, |
| | | { |
| | | name: "å é¤", |
| | | type: "text", |
| | | clickFun: (row) => { |
| | | this.handleDelete(row); |
| | | }, |
| | | }, |
| | | ], |
| | | }, |
| | | ], |
| | | page: { |
| | | total: 0, |
| | | size: 10, |
| | | current: 0, |
| | | }, |
| | | tableLoading: false, |
| | | addDia: false, |
| | | rules: { |
| | | documentCode: [{ required: true, message: "请è¾å
¥æä»¶ç¼å·", trigger: "blur" }], |
| | | }, |
| | | uploading: false, |
| | | } |
| | | }, |
| | | // ç¨äºä¸ä¼ æä»¶çä¿¡æ¯ |
| | | computed: { |
| | | action() { |
| | | return this.javaApi + '/manageDocumentList/exportManageDocumentList' |
| | | } |
| | | }, |
| | | mounted() { |
| | | this.getList() |
| | | this.selectEnumByCategory() |
| | | }, |
| | | methods: { |
| | | getList() { |
| | | this.tableLoading = true; |
| | | let param = { ...this.queryParams, ...this.page }; |
| | | delete param.total; |
| | | pageManageDocumentList({ ...param }) |
| | | .then((res) => { |
| | | this.tableLoading = false; |
| | | if (res.code === 200) { |
| | | this.tableData = res.data.records; |
| | | this.page.total = res.data.total; |
| | | } |
| | | }) |
| | | .catch((err) => { |
| | | this.tableLoading = false; |
| | | }); |
| | | }, |
| | | pagination({ page, limit }) { |
| | | this.page.current = page; |
| | | this.page.size = limit; |
| | | this.getList(); |
| | | }, |
| | | refreshTable() { |
| | | this.page.current = 1; |
| | | this.getList(); |
| | | }, |
| | | refresh() { |
| | | this.queryParams = {}; |
| | | this.page.current = 1; |
| | | this.getList(); |
| | | }, |
| | | openAdd(title, row) { |
| | | this.title = title; |
| | | if (row) { |
| | | this.currentInfo = row; |
| | | } else { |
| | | this.currentInfo = {}; |
| | | } |
| | | this.addDia = true; |
| | | }, |
| | | // ä¸è½½æä»¶ |
| | | handleDown(row) { |
| | | if (!row.url) return this.$message.warning('æä»¶æªä¸ä¼ ') |
| | | let url = this.javaApi + '/word/' + row.url |
| | | this.$download.saveAs(url, row.url); |
| | | }, |
| | | // æ¥çæä»¶ |
| | | handleLook(row) { |
| | | if (!row.url) return this.$message.warning('æä»¶æªä¸ä¼ ') |
| | | this.currentInfo = row |
| | | this.lookDialogVisible = true |
| | | }, |
| | | getPower() { |
| | | let power = JSON.parse(sessionStorage.getItem('power')) |
| | | let up = false |
| | | let upFile = false |
| | | let add = false |
| | | for (var i = 0; i < power.length; i++) { |
| | | if (power[i].menuMethod == 'doManageDocumentList') { |
| | | up = true |
| | | } |
| | | if (power[i].menuMethod == 'exportManageDocumentList') { |
| | | add = true |
| | | } |
| | | if (power[i].menuMethod == 'uploadFileManageDocumentList') { |
| | | upFile = true |
| | | } |
| | | } |
| | | if (!upFile) { |
| | | this.componentData.do.splice(1, 1) |
| | | } |
| | | if (!up) { |
| | | this.componentData.do.splice(0, 1) |
| | | } |
| | | this.addPower = add |
| | | }, |
| | | // ä¸ä¼ æä»¶ |
| | | handleUp(row) { |
| | | this.currentInfo = row |
| | | this.addDialogVisible = true; |
| | | }, |
| | | // æäº¤ä¸ä¼ |
| | | handleAdd() { |
| | | this.addLoading = true |
| | | this.$refs['UpPdfStamp'].generatePDF() |
| | | }, |
| | | uploadPDFErr() { |
| | | this.addLoading = false |
| | | }, |
| | | 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.refreshTable() |
| | | }else { |
| | | this.$message.error(response.msg); |
| | | } |
| | | }, |
| | | selectEnumByCategory() { |
| | | // æä»¶ç±»å« |
| | | this.getDicts("document_type").then((response) => { |
| | | this.fileType = this.dictToValue(response.data); |
| | | }); |
| | | // æä»¶ç¶æ |
| | | this.getDicts("document_state").then((response) => { |
| | | this.fileState = this.dictToValue(response.data); |
| | | }); |
| | | }, |
| | | async uploadPDF(pdfBlob, fileName) { |
| | | const formData = new FormData(); |
| | | formData.append('file', pdfBlob, fileName); // æä»¶å段 |
| | | formData.append('id', this.currentInfo.id); // æä»¶ååæ®µ |
| | | |
| | | try { |
| | | let res = await uploadFileManageDocumentList(formData) |
| | | this.addLoading = false |
| | | if (res.code == 200) { |
| | | this.$message({ message: 'ä¸ä¼ æå', type: 'success' }); |
| | | this.addDialogVisible = false; |
| | | this.refreshTable() |
| | | return true |
| | | } else { |
| | | this.$message({ message: 'ä¸ä¼ 失败', type: 'error' }); |
| | | return false |
| | | } |
| | | } catch (e) { |
| | | this.addLoading = false |
| | | } |
| | | |
| | | }, |
| | | handleDelete(row) { |
| | | this.$confirm("æ¯å¦å é¤è¯¥æ¡æ°æ®?", "æç¤º", { |
| | | confirmButtonText: "ç¡®å®", |
| | | cancelButtonText: "åæ¶", |
| | | type: "warning", |
| | | }) |
| | | .then(() => { |
| | | delManageDocumentList({ id: row.id }).then((res) => { |
| | | if (res.code == 201) return; |
| | | this.$message.success("å 餿å"); |
| | | this.refresh(); |
| | | }); |
| | | }) |
| | | .catch(() => { }); |
| | | }, |
| | | submitProduct(formName) { |
| | | this.$refs[formName].validate((valid) => { |
| | | if (valid) { |
| | | this.uploading = true; |
| | | doManageDocumentList(this.currentInfo) |
| | | .then((res) => { |
| | | this.uploading = false; |
| | | if (res.code != 200) { |
| | | return; |
| | | } |
| | | this.$message.success("æäº¤æå"); |
| | | this.refresh(); |
| | | this.addDia = false; |
| | | }) |
| | | .catch((err) => { |
| | | this.uploading = false; |
| | | }); |
| | | } else { |
| | | return false; |
| | | } |
| | | }); |
| | | }, |
| | | } |
| | | } |
| | | </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; |
| | | height: calc(100% - 60px - 80px); |
| | | padding: 20px; |
| | | } |
| | | |
| | | .btns { |
| | | position: absolute; |
| | | right: 20px; |
| | | top: 5px; |
| | | } |
| | | </style> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <!-- æä»¶ä½åºç³è¯· --> |
| | | <div class="file-obsoletion-request" style="height: 100%;"> |
| | | <div class="search"> |
| | | <div class="search_thing"> |
| | | <div class="search_label">æä»¶ç¼å·ï¼</div> |
| | | <div class="search_input"><el-input v-model="queryParams.documentCode" clearable placeholder="请è¾å
¥" size="small" |
| | | @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" style="padding-left: 30px;"> |
| | | <el-button size="small" type="primary" @click="addDialogVisible = true, addInfo = {}">æä»¶ä½åºç³è¯·</el-button> |
| | | <el-button :loading="outLoading" size="small" type="primary" @click="handleOut">导åº</el-button> |
| | | </div> |
| | | </div> |
| | | <div class="table"> |
| | | <lims-table :tableData="tableData" :column="column" :page="page" :tableLoading="tableLoading" |
| | | :height="'calc(100vh - 290px)'" @pagination="pagination"></lims-table> |
| | | </div> |
| | | <el-dialog :visible.sync="addDialogVisible" title="æä»¶ä½åºç³è¯·" top="10vh" width="800px"> |
| | | <el-row> |
| | | <el-col :span="12" style="margin-bottom: 16px;"> |
| | | <div class="search_thing"> |
| | | <div class="search_label"><span style="color:red;margin-right: 4px;">*</span>ç³è¯·ç¼å·ï¼</div> |
| | | <div class="search_input"> |
| | | <el-select v-model="addInfo.documentCode" allow-create clearable filterable size="small" |
| | | style="width: 100%;" @change="changeFileList"> |
| | | <el-option v-for="item in fileList" :key="item.documentCode" :label="item.documentCode" |
| | | :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-select v-model="addInfo.checkUser" filterable size="small" style="width: 100%;"> |
| | | <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-input v-model="addInfo.name" clearable placeholder="请è¾å
¥" |
| | | size="small"></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 v-model="addInfo.version" clearable placeholder="请è¾å
¥" |
| | | size="small"></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.state" size="small" style="width: 100%;"> |
| | | <el-option v-for="(item, index) in fileState" :key="index" :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.method" size="small" style="width: 100%;"> |
| | | <el-option label="ä½åº" value="ä½åº"></el-option> |
| | | <el-option label="æ æ" 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-date-picker v-model="addInfo.expectCancelDate" format="yyyy-MM-dd" placeholder="éæ©æ¥æ" size="small" |
| | | style="width: 100%;" type="date" value-format="yyyy-MM-dd"> |
| | | </el-date-picker> |
| | | </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.actuallyCancelDate" format="yyyy-MM-dd" placeholder="éæ©æ¥æ" size="small" |
| | | style="width: 100%;" type="date" value-format="yyyy-MM-dd"> |
| | | </el-date-picker> |
| | | </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 v-model="addInfo.cancelNote" :rows="2" clearable placeholder="请è¾å
¥" |
| | | size="small" type="textarea"></el-input></div> |
| | | </div> |
| | | </el-col> |
| | | </el-row> |
| | | <span slot="footer" class="dialog-footer"> |
| | | <el-button @click="addDialogVisible = false">å æ¶</el-button> |
| | | <el-button :loading="addLoading" type="primary" @click="handleAdd">ç¡® å®</el-button> |
| | | </span> |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | import limsTable from "@/components/Table/lims-table.vue"; |
| | | import { |
| | | selectUserCondition, |
| | | } from "@/api/system/user.js"; |
| | | import { |
| | | addManageDocumentCancel, |
| | | pageManageDocumentList, |
| | | doManageDocumentCancel, |
| | | checkManageDocumentCancel, |
| | | exportManageDocumentCancel, |
| | | delManageDocumentCancel, |
| | | pageManageDocumentCancel, |
| | | } from '@/api/cnas/systemManagement/documentControl.js' |
| | | import { mapGetters } from "vuex"; |
| | | export default { |
| | | components: { |
| | | limsTable |
| | | }, |
| | | computed: { |
| | | ...mapGetters(["userId"]), |
| | | }, |
| | | data() { |
| | | return { |
| | | addPower: false, |
| | | outPower: false, |
| | | addInfo: {}, |
| | | addLoading: false, |
| | | addDialogVisible: false, |
| | | personList: [], |
| | | fileList: [], |
| | | outLoading: false, |
| | | fileState: [], |
| | | queryParams: {}, |
| | | tableData: [], |
| | | column: [ |
| | | { label: "æä»¶ç¼å·", prop: "documentCode" }, |
| | | { label: "ç³è¯·äºº", prop: "createUserName", width: "120px" }, |
| | | { |
| | | label: "ä½åºè¯´æ", |
| | | prop: "cancelNote", |
| | | }, |
| | | { label: "ææä½åºæ¶é´", prop: "expectCancelDate" }, |
| | | { label: "å®é
ä½åºæ¥æ", prop: "actuallyCancelDate" }, |
| | | { |
| | | label: "ä½åºç¶æ", prop: "state", dataType: "tag", |
| | | formatData: (params) => { |
| | | return params; |
| | | }, |
| | | formatType: (params) => { |
| | | if (params == 'éè¿') { |
| | | return 'success' |
| | | } else { |
| | | return 'danger' |
| | | } |
| | | } |
| | | }, |
| | | { |
| | | dataType: "action", |
| | | fixed: "right", |
| | | label: "æä½", |
| | | operation: [ |
| | | { |
| | | name: "ç¼è¾", |
| | | type: "text", |
| | | clickFun: (row) => { |
| | | this.handleUpdate(row); |
| | | }, |
| | | disabled: (row, index) => { |
| | | return row.state == 'éè¿' |
| | | } |
| | | }, |
| | | { |
| | | name: "å é¤", |
| | | type: "text", |
| | | clickFun: (row) => { |
| | | this.handleDelete(row); |
| | | }, |
| | | disabled: (row, index) => { |
| | | return row.state == 'éè¿' |
| | | } |
| | | }, |
| | | { |
| | | name: "å®¡æ ¸", |
| | | type: "text", |
| | | clickFun: (row) => { |
| | | this.handleCheck(row); |
| | | }, |
| | | disabled: (row, index) => { |
| | | return row.checkUser != this.userId || row.state == 'éè¿' |
| | | } |
| | | }, |
| | | ], |
| | | }, |
| | | ], |
| | | page: { |
| | | total: 0, |
| | | size: 10, |
| | | current: 0, |
| | | }, |
| | | tableLoading: false, |
| | | } |
| | | }, |
| | | mounted() { |
| | | this.getList() |
| | | this.getAuthorizedPerson() |
| | | this.getFileList() |
| | | this.selectEnumByCategory() |
| | | }, |
| | | methods: { |
| | | getPower() { |
| | | let power = JSON.parse(sessionStorage.getItem('power')) |
| | | let out = false |
| | | let del = false |
| | | let add = false |
| | | // let check = false |
| | | for (var i = 0; i < power.length; i++) { |
| | | if (power[i].menuMethod == 'exportManageDocumentCancel') { |
| | | out = true |
| | | } |
| | | if (power[i].menuMethod == 'addManageDocumentCancel') { |
| | | add = true |
| | | } |
| | | if (power[i].menuMethod == 'delManageDocumentCancel') { |
| | | del = true |
| | | } |
| | | // if (power[i].menuMethod == 'checkManageDocumentControlled') { |
| | | // check = true |
| | | // } |
| | | } |
| | | // if (!check) { |
| | | // this.componentData.do.splice(2, 1) |
| | | // } |
| | | if (!del) { |
| | | this.componentData.do.splice(1, 1) |
| | | } |
| | | if (!add) { |
| | | this.componentData.do.splice(0, 1) |
| | | } |
| | | this.addPower = add |
| | | this.outPower = out |
| | | }, |
| | | getList() { |
| | | this.tableLoading = true; |
| | | let param = { ...this.queryParams, ...this.page }; |
| | | delete param.total; |
| | | pageManageDocumentCancel({ ...param }) |
| | | .then((res) => { |
| | | this.tableLoading = false; |
| | | if (res.code === 200) { |
| | | this.tableData = res.data.records; |
| | | this.page.total = res.data.total; |
| | | } |
| | | }) |
| | | .catch((err) => { |
| | | this.tableLoading = false; |
| | | }); |
| | | }, |
| | | pagination({ page, limit }) { |
| | | this.page.current = page; |
| | | this.page.size = limit; |
| | | this.getList(); |
| | | }, |
| | | refresh() { |
| | | this.queryParams = {}; |
| | | this.page.current = 1; |
| | | this.getList(); |
| | | }, |
| | | refreshTable() { |
| | | this.page.current = 1; |
| | | this.getList(); |
| | | }, |
| | | selectEnumByCategory() { |
| | | // æä»¶ç¶æ |
| | | this.getDicts("document_state").then((response) => { |
| | | this.fileState = this.dictToValue(response.data); |
| | | }); |
| | | }, |
| | | // è·å人åå表 |
| | | getAuthorizedPerson() { |
| | | selectUserCondition().then(res => { |
| | | let data = [] |
| | | res.data.forEach(a => { |
| | | data.push({ |
| | | label: a.name, |
| | | value: a.id |
| | | }) |
| | | }) |
| | | this.personList = data |
| | | }) |
| | | }, |
| | | // è·åæä»¶å表 |
| | | getFileList() { |
| | | pageManageDocumentList({ |
| | | current: -1, |
| | | size: -1 |
| | | }).then(res => { |
| | | this.fileList = res.data.records |
| | | }).catch(err => { }) |
| | | }, |
| | | // æäº¤ |
| | | handleAdd() { |
| | | if (!this.addInfo.documentCode) { |
| | | this.$message.error('请è¾å
¥ç³è¯·ç¼å·') |
| | | return false |
| | | } |
| | | this.addInfo.method = 'ä½åº' |
| | | this.addLoading = true |
| | | if (!this.addInfo.id) { |
| | | // æ°å¢ |
| | | addManageDocumentCancel(this.addInfo).then(res => { |
| | | this.addLoading = false |
| | | this.refreshTable() |
| | | this.$message({ |
| | | type: 'success', |
| | | message: 'æäº¤æå' |
| | | }) |
| | | this.addDialogVisible = false |
| | | }).catch(err => { }) |
| | | } else { |
| | | // ç¼è¾ |
| | | doManageDocumentCancel({ |
| | | id: this.addInfo.id, |
| | | method: 'ä½åº', |
| | | documentCode: this.addInfo.documentCode, |
| | | checkUser: this.addInfo.checkUser, |
| | | name: this.addInfo.name, |
| | | version: this.addInfo.version, |
| | | documentState: this.addInfo.documentState, |
| | | expectCancelDate: this.addInfo.expectCancelDate, |
| | | actuallyCancelDate: this.addInfo.actuallyCancelDate, |
| | | cancelNote: this.addInfo.cancelNote, |
| | | }).then(res => { |
| | | this.addLoading = false |
| | | this.refreshTable() |
| | | this.$message({ |
| | | type: 'success', |
| | | message: 'æäº¤æå' |
| | | }) |
| | | this.addDialogVisible = false |
| | | }).catch(err => { }) |
| | | } |
| | | |
| | | }, |
| | | // é䏿件 |
| | | changeFileList(e) { |
| | | if (e) { |
| | | let obj = this.fileList.find(a => a.documentCode == e) |
| | | if (obj) { |
| | | this.addInfo.name = obj.name |
| | | this.addInfo.version = obj.version |
| | | this.addInfo.documentState = obj.state |
| | | } |
| | | } |
| | | }, |
| | | handleUpdate(row) { |
| | | this.addInfo = this.HaveJson(row) |
| | | this.addDialogVisible = true |
| | | }, |
| | | // å®¡æ ¸ |
| | | handleCheck(row) { |
| | | this.$confirm('æ¯å¦å®¡æ ¸éè¿?', 'æç¤º', { |
| | | confirmButtonText: 'éè¿', |
| | | cancelButtonText: 'ä¸éè¿', |
| | | type: 'warning', |
| | | closeOnClickModal: false, // ç¦æ¢ç¹å»é®ç½©å±å
³é |
| | | distinguishCancelAndClose: true, |
| | | beforeClose: (action, instance, done) => { |
| | | if (action === 'confirm') { |
| | | // ç¹å»âç¡®å®âæé®ï¼å
许å
³é |
| | | checkManageDocumentCancel({ id: row.id, state: 'éè¿' }).then(res => { |
| | | this.refreshTable() |
| | | done(); |
| | | this.$message({ |
| | | type: 'success', |
| | | message: 'æäº¤æå' |
| | | }) |
| | | }) |
| | | .catch(err => { |
| | | |
| | | }) |
| | | } else if (action === 'cancel') { |
| | | // ç¹å»âåæ¶âæé®ï¼ä¸å
许å
³é |
| | | checkManageDocumentCancel({ id: row.id, state: 'ä¸éè¿' }).then(res => { |
| | | this.refreshTable() |
| | | done(); |
| | | this.$message({ |
| | | type: 'success', |
| | | message: 'æäº¤æå' |
| | | }) |
| | | }) |
| | | .catch(err => { |
| | | |
| | | }) |
| | | } else if (action === 'close') { |
| | | // ç¹å»âÃâæé®ï¼ä¸å
许å
³é |
| | | done(); |
| | | console.log("Ãæé®ç¹å»äºä»¶ï¼ä¸å
³éå¼¹æ¡"); |
| | | } |
| | | } |
| | | }) |
| | | }, |
| | | // å¯¼åº |
| | | handleOut() { |
| | | this.outLoading = true |
| | | exportManageDocumentCancel(this.queryParams).then(res => { |
| | | this.outLoading = false |
| | | const blob = new Blob([res], { type: 'application/octet-stream' }); |
| | | this.$download.saveAs(blob, 'æä»¶ä½åºè¡¨.xlsx') |
| | | }) |
| | | }, |
| | | handleDelete(row) { |
| | | this.$confirm("æ¯å¦å é¤è¯¥æ¡æ°æ®?", "æç¤º", { |
| | | confirmButtonText: "ç¡®å®", |
| | | cancelButtonText: "åæ¶", |
| | | type: "warning", |
| | | }) |
| | | .then(() => { |
| | | delManageDocumentCancel({ id: row.id }).then((res) => { |
| | | if (res.code == 201) return; |
| | | this.$message.success("å 餿å"); |
| | | this.refresh(); |
| | | }); |
| | | }) |
| | | .catch(() => { }); |
| | | }, |
| | | } |
| | | } |
| | | </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; |
| | | height: calc(100% - 60px - 80px); |
| | | padding: 20px; |
| | | } |
| | | |
| | | .btns { |
| | | position: absolute; |
| | | right: 20px; |
| | | top: 5px; |
| | | } |
| | | </style> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <div class="file-handling"> |
| | | <el-tabs type="border-card" v-model="activeName" style="height: 100%;"> |
| | | <el-tab-pane :label="item.name" :name="item.component" v-for="(item, index) in tabList" :key="index" |
| | | style="height: 100%;"> |
| | | <component :is="item.component" :key="item.component"></component> |
| | | </el-tab-pane> |
| | | </el-tabs> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | import FileList from './components/FileList.vue' |
| | | import ControlledFileApplication from './components/ControlledFileApplication.vue' |
| | | import DistributionCollectionRecord from './components/DistributionCollectionRecord.vue' |
| | | import FileChangeRequest from './components/FileChangeRequest.vue' |
| | | import FileObsoletionRequest from './components/FileObsoletionRequest.vue' |
| | | export default { |
| | | components: { |
| | | FileList, |
| | | ControlledFileApplication, |
| | | DistributionCollectionRecord, |
| | | FileChangeRequest, |
| | | FileObsoletionRequest |
| | | }, |
| | | data() { |
| | | return { |
| | | tabList: [ |
| | | { |
| | | name: 'æä»¶æ¸
å', |
| | | component: 'FileList' |
| | | }, |
| | | { |
| | | name: 'æä»¶åæ§ç³è¯·', |
| | | component: 'ControlledFileApplication' |
| | | }, |
| | | { |
| | | name: 'åæ¾åæ¶è®°å½', |
| | | component: 'DistributionCollectionRecord' |
| | | }, |
| | | { |
| | | name: 'æä»¶åæ´ç³è¯·', |
| | | component: 'FileChangeRequest' |
| | | }, |
| | | { |
| | | name: 'æä»¶ä½åºç³è¯·', |
| | | component: 'FileObsoletionRequest' |
| | | }, |
| | | ], |
| | | activeName: 'FileList' |
| | | }; |
| | | }, |
| | | } |
| | | </script> |
| | | |
| | | <style scoped> |
| | | .file-handling { |
| | | margin-top: 10px; |
| | | height: calc(100% - 20px); |
| | | } |
| | | |
| | | >>>.el-tabs__content { |
| | | height: 100%; |
| | | padding: 0; |
| | | padding-top: 10px; |
| | | } |
| | | </style> |
| | |
| | | <div class="search_thing"> |
| | | <div class="search_label">模æ¿åç§°ï¼</div> |
| | | <div class="search_input"> |
| | | <el-input |
| | | v-model="queryParams.name" |
| | | clearable |
| | | placeholder="请è¾å
¥" |
| | | size="small" |
| | | @keyup.enter.native="refreshTable()" |
| | | ></el-input> |
| | | <el-input v-model="queryParams.name" clearable placeholder="请è¾å
¥" size="small" |
| | | @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 |
| | | > |
| | | <el-button size="small" type="primary" @click="refreshTable()">æ¥ è¯¢</el-button> |
| | | </div> |
| | | <div class="btn"> |
| | | <el-button |
| | | v-if="checkPermi(['standard:model:add'])" |
| | | size="small" |
| | | type="primary" |
| | | @click="openAdd" |
| | | >æ°å¢</el-button |
| | | > |
| | | <!-- <el-button |
| | | v-if="checkPermi(['standard:model:copy'])" |
| | | size="small" |
| | | @click="copyTemplate" |
| | | >å¤å¶æ¨¡ç</el-button |
| | | > --> |
| | | <el-button v-if="checkPermi(['standard:model:add'])" size="small" type="primary" @click="openAdd">æ°å¢</el-button> |
| | | </div> |
| | | </div> |
| | | <lims-table |
| | | :tableData="tableData" |
| | | :column="column" |
| | | :page="page" |
| | | :tableLoading="tableLoading" |
| | | :height="'calc(100vh - 240px)'" |
| | | style="padding: 20px; padding-top: 0" |
| | | @pagination="pagination" |
| | | ></lims-table> |
| | | <el-dialog |
| | | :before-close="isClose" |
| | | :close-on-click-modal="false" |
| | | :close-on-press-escape="false" |
| | | :visible.sync="isShow" |
| | | title="模æ¿ç¼å¶" |
| | | width="85%" |
| | | > |
| | | <lims-table :tableData="tableData" :column="column" :page="page" :tableLoading="tableLoading" |
| | | :height="'calc(100vh - 240px)'" style="padding: 20px; padding-top: 0" @pagination="pagination"></lims-table> |
| | | <el-dialog :before-close="isClose" :close-on-click-modal="false" :close-on-press-escape="false" |
| | | :visible.sync="isShow" title="模æ¿ç¼å¶" width="85%"> |
| | | <div v-if="isShow" style="width: 100%; height: 82vh; overflow: auto"> |
| | | <Excel |
| | | v-loading="loading" |
| | | :data="row.thing" |
| | | :execlTitle="row.name" |
| | | ></Excel> |
| | | <Excel v-loading="loading" :data="row.thing" :execlTitle="row.name"></Excel> |
| | | </div> |
| | | </el-dialog> |
| | | <el-dialog |
| | | :before-close="closeCopyTem" |
| | | :close-on-click-modal="false" |
| | | :close-on-press-escape="false" |
| | | :visible.sync="isShowCopyTem" |
| | | :title="title" |
| | | width="35%" |
| | | > |
| | | <el-form |
| | | ref="copyForm" |
| | | :model="copyForm" |
| | | :rules="copyFormRules" |
| | | label-position="right" |
| | | label-width="80px" |
| | | > |
| | | <el-dialog :before-close="closeCopyTem" :close-on-click-modal="false" :close-on-press-escape="false" |
| | | :visible.sync="isShowCopyTem" :title="title" width="35%"> |
| | | <el-form ref="copyForm" :model="copyForm" :rules="copyFormRules" label-position="right" label-width="80px"> |
| | | <el-form-item label="模çç¼å·" prop="number"> |
| | | <el-input v-model="copyForm.number" clearable size="small"></el-input> |
| | | </el-form-item> |
| | |
| | | </el-form> |
| | | <span slot="footer" class="dialog-footer"> |
| | | <el-button @click="closeCopyTem">å æ¶</el-button> |
| | | <el-button |
| | | :loading="submitCopyInfoLoading" |
| | | type="primary" |
| | | @click="submitCopyInfo" |
| | | >ç¡® å®</el-button |
| | | > |
| | | <el-button :loading="submitCopyInfoLoading" type="primary" @click="submitCopyInfo">ç¡® å®</el-button> |
| | | </span> |
| | | </el-dialog> |
| | | </div> |
| | |
| | | import Excel from "@/components/Excel/luckysheet.vue"; |
| | | import { |
| | | selectStandardTemplatePageList, |
| | | copyStandardTemplate, |
| | | addStandardTemplate, |
| | | upStandardTemplate, |
| | | delStandardTemplate, |
| | |
| | | return this.checkPermi(["standard:model:del"]); |
| | | }, |
| | | }, |
| | | // { |
| | | // name: "å¤å¶æ¨¡æ¿", |
| | | // type: "text", |
| | | // clickFun: (row) => { |
| | | // this.copyTemplate(row); |
| | | // }, |
| | | // showHide: (row) => { |
| | | // return this.checkPermi(["standard:model:copy"]); |
| | | // }, |
| | | // }, |
| | | { |
| | | name: "模æ¿ç¼å¶", |
| | | type: "text", |
| | |
| | | this.copyForm = {}; |
| | | this.isShowCopyTem = true; |
| | | }, |
| | | // å¤å¶æ¨¡ç |
| | | copyTemplate(row) { |
| | | this.title = "å¤å¶æ¨¡ç"; |
| | | this.isShowCopyTem = true; |
| | | this.copyForm.id = row.id; |
| | | }, |
| | | // æ°å¢/ç¼è¾/å¤å¶æ¨¡æ¿ |
| | | submitCopyInfo() { |
| | | this.$refs["copyForm"].validate((valid) => { |
| | |
| | | this.submitCopyInfoLoading = false; |
| | | }); |
| | | break; |
| | | case "å¤å¶æ¨¡ç": |
| | | copyStandardTemplate(params) |
| | | .then((res) => { |
| | | if (res.code == 201) return; |
| | | this.isShowCopyTem = false; |
| | | this.submitCopyInfoLoading = false; |
| | | this.$message.success("å¤å¶æå"); |
| | | this.refreshTable("page"); |
| | | }) |
| | | .catch((err) => { |
| | | console.log("copyTemplate----", err); |
| | | this.submitCopyInfoLoading = false; |
| | | }); |
| | | break; |
| | | } |
| | | } else { |
| | | console.log("error submit!!"); |
| | |
| | | this.refreshTable("page"); |
| | | }); |
| | | }) |
| | | .catch(() => {}); |
| | | .catch(() => { }); |
| | | }, |
| | | templateWrite(row) { |
| | | getEditTemplatePreparation({ id: row.id }).then((res) => { |
| | |
| | | .then(() => { |
| | | this.closed(); |
| | | }) |
| | | .catch(() => {}); |
| | | .catch(() => { }); |
| | | }, |
| | | closed() { |
| | | this.loading = true; |
| | |
| | | .search_input { |
| | | width: calc(100% - 110px); |
| | | } |
| | | |
| | | .btn { |
| | | position: absolute; |
| | | right: 14px; |