diff --git a/package.json b/package.json index b5bd3a0d..af7203cc 100644 --- a/package.json +++ b/package.json @@ -41,10 +41,11 @@ "clipboard": "2.0.8", "core-js": "3.25.3", "crypto-js": "^4.2.0", + "docx": "^9.5.1", "echarts": "5.4.0", "element-ui": "2.15.14", "exceljs": "^4.4.0", - "file-saver": "2.0.5", + "file-saver": "^2.0.5", "fuse.js": "6.4.3", "highlight.js": "9.18.5", "html2canvas": "^1.4.1", diff --git a/src/api/lease/apply.js b/src/api/lease/apply.js index fd1f973f..1cb468b1 100644 --- a/src/api/lease/apply.js +++ b/src/api/lease/apply.js @@ -207,3 +207,19 @@ export function getCheckInfo(data) { }) } + +export function getProjectList(data) { + return request({ + url: '/material/material_maMachine/getProjectList', + method: 'get', + params: data, + }) +} + +export function getDepartNameList(data) { + return request({ + url: '/material/material_maMachine/getDepartNameList', + method: 'get', + params: data, + }) +} diff --git a/src/views/business/businessHandling/directApply.vue b/src/views/business/businessHandling/directApply.vue index 348923fd..ddd440e8 100644 --- a/src/views/business/businessHandling/directApply.vue +++ b/src/views/business/businessHandling/directApply.vue @@ -5,39 +5,86 @@ - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + import { getMaTypeOpt } from '@/api/ma/base' -import {getListProject, getListUnite, getAgreement, getUnitProDepList} from '@/api/lease/apply' +import { + getListProject, + getListUnite, + getAgreement, + getUnitProDepList, + getProjectList, + getDepartNameList +} from '@/api/lease/apply' import { downloadFile, downloadFileData } from '@/utils/download' import { getUseringData, receiveSubmitTwo, receiveEdit, receiveDetail, getEquipmentThreeTypes } from '@/api/business/index' import Treeselect from '@riophae/vue-treeselect' import '@riophae/vue-treeselect/dist/vue-treeselect.css' import { getToken } from '@/utils/auth' import Pagination from '@/components/Pagination' +import {getImpUnitListApi} from "@/api/materialsStation"; export default { name: 'DirectApply', @@ -444,6 +538,20 @@ export default { }, // 表单校验 rules: { + impUnitName: [ + { + required: true, + message: '请选择转出分公司', + trigger: 'blur' + } + ], + departName: [ + { + required: true, + message: '请选择转出项目部', + trigger: 'blur' + } + ], backUnitId: [ { required: true, @@ -517,7 +625,12 @@ export default { dialogVisible: false, uploadKey: Date.now(), uploadUrl: process.env.VUE_APP_BASE_API + '/file/upload', // 上传的图片服务器地址 - headers: { Authorization: 'Bearer ' + getToken() } + headers: { Authorization: 'Bearer ' + getToken() }, + impUnitOptions: [], // 分公司下拉选项 + departOptions: [],//项目部下拉 + impProOptions: [],//转出工程下拉 + impUnitOptionsTwo: [], // 分公司下拉选项 + departOptionsTwo: [],//项目部下拉 } }, computed: { @@ -549,11 +662,14 @@ export default { const obj = Object.assign({}, this.$route, { title: '直转申请' }) this.$tab.updatePage(obj) } - this.projectInfoList() // 单位工程下拉选 + if (this.isEdit || this.isDetail) { console.log('isEdit', this.isEdit) this.getTaskInfo() + } else { + this.getImpUnitOptions() } + this.getImpUnitOptionsTwo() console.log(this.$store, 'this.$store.getters') console.log(this.$route.query, 'this.$route.query') }, @@ -573,6 +689,187 @@ export default { } }, methods: { + /** 获取分公司下拉 */ + async getImpUnitOptions() { + try { + const res = await getImpUnitListApi() + this.impUnitOptions = res.data.map(item => ({ + label: item.impUnitName, + value: item.impUnitName + })) + if (this.impUnitOptions.length === 1) { + this.maForm.impUnitName = this.impUnitOptions[0].value + await this.onImpUnitChange(this.maForm.impUnitName) + } + } catch (e) { + console.error('获取分公司下拉失败:', e) + } + }, + + /** 分公司变化 */ + async onImpUnitChange(value) { + this.maForm.departName = '' + this.maForm.backProId = '' + this.maForm.backUnitId = undefined + this.departOptions = [] + this.impProOptions = [] + this.uniteList = [] + + if (!value) return + const res = await getDepartNameList({ impUnitName: value }) + this.departOptions = res.data.map(item => ({ + label: item.departName, + value: item.departName + })) + if (this.departOptions.length === 1) { + this.maForm.departName = this.departOptions[0].value + await this.onDepartChange(this.maForm.departName) + } + }, + + /** 项目部变化 */ + async onDepartChange(value) { + this.maForm.backProId = '' + this.maForm.backUnitId = undefined + this.impProOptions = [] + this.uniteList = [] + + if (!value) return + const res = await getProjectList({ departName: value }) + this.impProOptions = res.data.map(item => ({ + label: item.proName, + value: item.proId + })) + if (this.impProOptions.length === 1) { + this.maForm.backProId = this.impProOptions[0].value + await this.onProjectChange(this.maForm.backProId) + } + }, + + /** 工程变化 */ + async onProjectChange(value) { + // 每次工程变化都先清空 + this.maForm.backUnitId = undefined + this.uniteList = [] + // 没选工程就直接返回 + if (!value) return + try { + let edit =true; + if (this.isEdit){ + edit=false + } + const res = await getUnitProDepList({ projectId: value, enableFilter: edit }) + this.uniteList = res.data || [] + + // 自动选中唯一叶子节点 + const leafNodes = [] + const findLeaf = nodes => { + nodes.forEach(n => { + if (!n.children || n.children.length === 0) { + leafNodes.push(n) + } else { + findLeaf(n.children) + } + }) + } + findLeaf(this.uniteList) + if (leafNodes.length === 1) { + this.maForm.backUnitId = leafNodes[0].id || leafNodes[0].value + await this.getAgreementId() + } + } catch (e) { + console.error('获取单位列表失败:', e) + } + }, + + /** 获取转入分公司下拉 */ + async getImpUnitOptionsTwo() { + try { + const params = { + enableFilter: false + } + const res = await getImpUnitListApi(params) + this.impUnitOptionsTwo = res.data.map(item => ({ + label: item.impUnitName, + value: item.impUnitName + })) + if (this.impUnitOptionsTwo.length === 1) { + this.maForm.impUnitNameTwo = this.impUnitOptionsTwo[0].value + await this.onImpUnitChangeTwo(this.maForm.impUnitNameTwo) + } + } catch (e) { + console.error('获取分公司下拉失败:', e) + } + }, + /** 分公司变化 */ + async onImpUnitChangeTwo(value) { + this.maForm.departNameTwo = '' + this.maForm.leaseProId = '' + this.maForm.leaseUnitId = undefined + this.departOptionsTwo = [] + this.leaseProjectList = [] + this.lessUniteList = [] + + if (!value) return + const res = await getDepartNameList({ impUnitName: value ,enableFilter: false}) + this.departOptionsTwo = res.data.map(item => ({ + label: item.departName, + value: item.departName + })) + if (this.departOptionsTwo.length === 1) { + this.maForm.departNameTwo = this.departOptionsTwo[0].value + await this.onDepartChangeTwo(this.maForm.departNameTwo) + } + }, + /** 转入项目部变化 */ + async onDepartChangeTwo(value) { + this.maForm.leaseProId = '' + this.maForm.leaseUnitId = undefined + this.leaseProjectList = [] + this.lessUniteList = [] + + if (!value) return + const res = await getProjectList({ departName: value,enableFilter: false }) + this.leaseProjectList = res.data.map(item => ({ + label: item.proName, + value: item.proId + })) + if (this.leaseProjectList.length === 1) { + this.maForm.leaseProId = this.leaseProjectList[0].value + await this.onProjectChangeTwo(this.maForm.leaseProId) + } + }, + /** 转入工程变化 */ + async onProjectChangeTwo(value) { + // 每次工程变化都先清空 + this.maForm.leaseUnitId = undefined + this.lessUniteList = [] + // 没选工程就直接返回 + if (!value) return + try { + const res = await getUnitProDepList({ projectId: value, enableFilter: false }) + this.lessUniteList = res.data || [] + + // 自动选中唯一叶子节点 + const leafNodes = [] + const findLeaf = nodes => { + nodes.forEach(n => { + if (!n.children || n.children.length === 0) { + leafNodes.push(n) + } else { + findLeaf(n.children) + } + }) + } + findLeaf(this.lessUniteList) + if (leafNodes.length === 1) { + this.maForm.leaseUnitId = leafNodes[0].id || leafNodes[0].value + await this.getLeaseAgreementId() + } + } catch (e) { + console.error('获取单位列表失败:', e) + } + }, // 查询 handleQuery() { // 重置分页到第一页 @@ -790,12 +1087,13 @@ export default { this.getTypeModelNameOpt(val) }, uniteChange(val) { - setTimeout(() => { - getListProject({ unitId: this.maForm.backUnitId,enableFilter: true }).then(response => { - this.projectList = response.data - this.maForm.backProId = null - }) - }, 500) + // setTimeout(() => { + // getListProject({ unitId: this.maForm.backUnitId,enableFilter: true }).then(response => { + // this.projectList = response.data + // this.maForm.backProId = null + // }) + // }, 500) + this.getAgreementId() }, projectChange(val) { setTimeout(() => { @@ -814,51 +1112,12 @@ export default { }, 500) }, leaseProjectChange(val) { - setTimeout(() => { - getListUnite({}).then(res => { - this.leaseUniteList = res.data - }) + // setTimeout(() => { + // getListUnite({}).then(res => { + // this.leaseUniteList = res.data + // }) this.getLeaseAgreementId() - }, 500) - }, - /** 租赁单位和工程-下拉选 */ - projectInfoList() { - console.log("kkkkkkkkkkk",this.isEdit) - if (!this.isEdit) { - //转出单位 - getUnitProDepList({ projectId: null,enableFilter: true }).then(response => { - this.uniteList = response.data - }) - //转出工程 - getListProject({ unitId: null,enableFilter: true }).then(response => { - this.projectList = response.data - }) - //转入单位 - getUnitProDepList({ projectId: null }).then(response => { - this.lessUniteList = response.data - }) - //转入工程 - getListProject({ unitId: null }).then(response => { - this.leaseProjectList = response.data - }) - } else { - //转出单位 - getUnitProDepList({ projectId: null,enableFilter: true }).then(response => { - this.uniteList = response.data - }) - //转出工程 - getListProject({ unitId: this.maForm.backUnitId,enableFilter: true }).then(response => { - this.projectList = response.data - }) - //转入单位 - getUnitProDepList({ projectId: null }).then(response => { - this.lessUniteList = response.data - }) - //转入工程 - getListProject({ unitId: this.maForm.leaseUnitId }).then(response => { - this.leaseProjectList = response.data - }) - } + // }, 500) }, //获取任务详情--- 编辑回显数据 async getTaskInfo() { @@ -867,8 +1126,44 @@ export default { const res = await receiveDetail({ id: this.id }) console.log('🚀 ~ getTaskInfo ~ res:', res) this.maForm = res.data + this.maForm.impUnitName=res.data.backImpUnitName + this.maForm.departName=res.data.backDepartName + this.maForm.impUnitNameTwo=res.data.leaseImpUnitName + this.maForm.departNameTwo=res.data.leaseDepartName + this.maForm.leaseUnitId=res.data.leaseUnitId this.multipleSelectionTemp = res.data.directApplyDetails - this.getList() + //查询工程和单位 + if (this.maForm.departName){ + const res = await getProjectList({ departName: this.maForm.departName }) + this.impProOptions = res.data.map(item => ({ + label: item.proName, + value: item.proId + })) + // if (this.impProOptions.length === 1) { + // this.maForm.backProId = this.impProOptions[0].value + await this.onProjectChange(this.maForm.backProId) + // } + } + if (this.maForm.impUnitNameTwo){ + const res = await getDepartNameList({ impUnitName: this.maForm.impUnitNameTwo ,enableFilter: false}) + this.departOptionsTwo = res.data.map(item => ({ + label: item.departName, + value: item.departName + })) + } + if (this.maForm.departNameTwo){ + const res = await getProjectList({ departName: this.maForm.departNameTwo,enableFilter: false }) + this.leaseProjectList = res.data.map(item => ({ + label: item.proName, + value: item.proId + })) + // if (this.leaseProjectList.length === 1) { + // this.maForm.leaseProId = this.leaseProjectList[0].value + await this.onProjectChangeTwo(this.maForm.leaseProId) + // } + } + + await this.getList() console.log('🚀 ~ getTaskInfo ~ this.equipmentList:', this.equipmentList) loading.close() } catch (error) { diff --git a/src/views/material/cost/component/applyHome.vue b/src/views/material/cost/component/applyHome.vue index 1ad62268..65f306b3 100644 --- a/src/views/material/cost/component/applyHome.vue +++ b/src/views/material/cost/component/applyHome.vue @@ -235,7 +235,8 @@ @@ -324,6 +325,20 @@ import Treeselect from '@riophae/vue-treeselect' import '@riophae/vue-treeselect/dist/vue-treeselect.css' import printJS from 'print-js' import ExcelJS from 'exceljs' +import { + Document, + Packer, + Paragraph, + TextRun, + Table, + TableRow, + TableCell, + AlignmentType, + WidthType, + BorderStyle, + PageOrientation +} from 'docx' + export default { name: 'ApplyHome', dicts: ['cost_status'], @@ -806,6 +821,335 @@ export default { // this.download('material/agreementInfo/export', { // ...this.queryParams // }, `协议_${new Date().getTime()}.xlsx`) + }, + async exportWord() { + const data = this.agreementContent + + // ====== 通用单元格样式 ====== + const cellOpts = { + margins: { top: 300, bottom: 300, left: 40, right: 40 }, // 缩小上下间距 + verticalAlign: 'center', + borders: { + top: { style: BorderStyle.SINGLE, size: 1 }, + bottom: { style: BorderStyle.SINGLE, size: 1 }, + left: { style: BorderStyle.SINGLE, size: 1 }, + right: { style: BorderStyle.SINGLE, size: 1 } + } + } + + const noBorder = { + top: { style: BorderStyle.NONE }, + bottom: { style: BorderStyle.NONE }, + left: { style: BorderStyle.NONE }, + right: { style: BorderStyle.NONE } + } + + // ====== 创建文档 ====== + const doc = new Document({ + sections: [ + { + properties: { + page: { + size: { width: 11900, height: 16840, orientation: PageOrientation.PORTRAIT }, + margin: { top: 720, right: 720, bottom: 720, left: 720 } + } + }, + children: [ + // ===== 标题 ===== + new Paragraph({ + alignment: AlignmentType.CENTER, + spacing: { before: 100, after: 200 }, + children: [new TextRun({ text: '机具设备有偿使用费结算协议书', bold: true, size: 32 })] + }), + + // ===== 协议号和编号 ===== + + new Table({ + width: { size: 100, type: WidthType.PERCENTAGE }, + rows: [ + new TableRow({ + children: [ + new TableCell({ + width: { size: 70, type: WidthType.PERCENTAGE }, + borders: noBorder, + children: [new Paragraph({ text: '' })] + }), + new TableCell({ + width: { size: 30, type: WidthType.PERCENTAGE }, + borders: noBorder, + children: [ + new Paragraph({ + alignment: AlignmentType.LEFT, + text: `协议号:${data.agreementCode || ''}`, + spacing: { before: 0, after: 0 }, + margins: { top: 100, bottom: 100 } + }) + ] + }) + ] + }), + new TableRow({ + children: [ + new TableCell({ + width: { size: 70, type: WidthType.PERCENTAGE }, + borders: noBorder, + children: [new Paragraph({ text: '' })] + }), + new TableCell({ + width: { size: 30, type: WidthType.PERCENTAGE }, + borders: noBorder, + children: [ + new Paragraph({ + alignment: AlignmentType.LEFT, + text: `编号:`, + spacing: { before: 0, after: 0 }, + margins: { top: 100, bottom: 100 } + }) + ] + }) + ] + }) + ] + }), + + // === 添加一个空白 Paragraph === + new Paragraph({ + text: '', + spacing: { before: 100, after: 100 } // 给点上下间距,让后面内容不受影响 + }), + + // ===== 主体表格 ===== + new Table({ + width: { size: 100, type: WidthType.PERCENTAGE }, + rows: [ + // 工程名称 + new TableRow({ + children: [ + new TableCell({ + ...cellOpts, + width: { size: 25, type: WidthType.PERCENTAGE }, + children: [ + new Paragraph({ + alignment: AlignmentType.CENTER, + text: '工程名称:' + }) + ] + }), + new TableCell({ + ...cellOpts, + width: { size: 75, type: WidthType.PERCENTAGE }, + columnSpan: 3, + children: [ + new Paragraph({ + alignment: AlignmentType.CENTER, + text: data.projectName + }) + ] + }) + ] + }), + + // 承租单位 + 日期 + new TableRow({ + children: [ + new TableCell({ + ...cellOpts, + width: { size: 25, type: WidthType.PERCENTAGE }, + children: [ + new Paragraph({ + alignment: AlignmentType.CENTER, + text: '承租单位:' + }) + ] + }), + new TableCell({ + ...cellOpts, + width: { size: 40, type: WidthType.PERCENTAGE }, + children: [ + new Paragraph({ + alignment: AlignmentType.CENTER, + text: data.unitName + }) + ] + }), + new TableCell({ + ...cellOpts, + width: { size: 10, type: WidthType.PERCENTAGE }, + children: [ + new Paragraph({ alignment: AlignmentType.CENTER, text: '日期:' }) + ] + }), + new TableCell({ + ...cellOpts, + width: { size: 25, type: WidthType.PERCENTAGE }, + children: [ + new Paragraph({ + alignment: AlignmentType.CENTER, + text: data.applyTime + }) + ] + }) + ] + }), + + // 表头 + new TableRow({ + children: [ + new TableCell({ + ...cellOpts, + columnSpan: 4, + children: [ + new Paragraph({ + alignment: AlignmentType.CENTER, + text: '结算项目及金额(元)', + bold: true + }) + ] + }) + ] + }), + + // 金额明细 + ...[ + ['一、施工机具有偿使用费:', `¥ ${Number(data.leaseCost).toFixed(2)}`], + ['二、施工机具维修费:', `¥ ${Number(data.repairCost).toFixed(2)}`], + ['三、施工机具丢失费:', `¥ ${Number(data.loseCost).toFixed(2)}`], + ['四、施工机具损坏赔偿费:', `¥ ${Number(data.scrapCost).toFixed(2)}`], + ['五、施工机具租赁减免费:', `¥ ${Number(data.reductionCost).toFixed(2)}`] + ].map( + ([label, value]) => + new TableRow({ + children: [ + new TableCell({ + ...cellOpts, + columnSpan: 2, + children: [ + new Paragraph({ + alignment: AlignmentType.CENTER, + text: label + }) + ] + }), + new TableCell({ + ...cellOpts, + columnSpan: 2, + children: [ + new Paragraph({ + alignment: AlignmentType.CENTER, + text: value + }) + ] + }) + ] + }) + ), + + // 合计 + new TableRow({ + children: [ + new TableCell({ + ...cellOpts, + children: [ + new Paragraph({ + alignment: AlignmentType.CENTER, + text: '费用合计金额(大写):' + }) + ] + }), + new TableCell({ + ...cellOpts, + children: [ + new Paragraph({ + alignment: AlignmentType.CENTER, + text: data.costAllUpper + }) + ] + }), + new TableCell({ + ...cellOpts, + columnSpan: 2, + children: [ + new Paragraph({ + alignment: AlignmentType.CENTER, + text: `¥ ${Number(data.costAll).toFixed(2)}` + }) + ] + }) + ] + }), + + // 说明 + new TableRow({ + children: [ + new TableCell({ + ...cellOpts, + children: [ + new Paragraph({ alignment: AlignmentType.CENTER, text: '说明:' }) + ] + }), + new TableCell({ + ...cellOpts, + columnSpan: 3, + children: [ + new Paragraph({ + alignment: AlignmentType.CENTER, + text: '本协议一式两份,甲方一份,乙方一份,经双方签字后生效。' + }) + ] + }) + ] + }), + + // 备注 + new TableRow({ + children: [ + new TableCell({ + ...cellOpts, + children: [ + new Paragraph({ alignment: AlignmentType.CENTER, text: '备注:' }) + ] + }), + new TableCell({ + ...cellOpts, + columnSpan: 3, + children: [ + new Paragraph({ + alignment: AlignmentType.CENTER, + text: '此费用仅为在机具设备分公司发生费用,未计从项目部领用机具费用。' + }) + ] + }) + ] + }) + ] + }), + + // 空白间距 + new Paragraph({ text: '', spacing: { before: 200 } }), + + // ===== 底部签名行(无边框) ===== + new Table({ + width: { size: 100, type: WidthType.PERCENTAGE }, + rows: [ + new TableRow({ + children: ['部门负责人:', '承租负责人:', '核算员:'].map( + text => + new TableCell({ + borders: noBorder, + children: [new Paragraph({ alignment: AlignmentType.LEFT, text })], + margins: { top: 200, bottom: 200 } // 缩小上下空间 + }) + ) + }) + ] + }) + ] + } + ] + }) + + const blob = await Packer.toBlob(doc) + saveAs(blob, `机具设备有偿使用费结算协议书-${data.agreementCode}.docx`) } } } diff --git a/src/views/material/cost/component/examHome.vue b/src/views/material/cost/component/examHome.vue index 25703dcd..a2e9f02f 100644 --- a/src/views/material/cost/component/examHome.vue +++ b/src/views/material/cost/component/examHome.vue @@ -268,8 +268,9 @@ @@ -286,6 +287,19 @@ import '@riophae/vue-treeselect/dist/vue-treeselect.css' import { formatTime } from '@/utils/bonus' import { saveAs } from 'file-saver' import ExcelJS from 'exceljs' +import { + Document, + Packer, + Paragraph, + TextRun, + Table, + TableRow, + TableCell, + AlignmentType, + WidthType, + BorderStyle, + PageOrientation +} from 'docx' export default { name: 'ExamHome', @@ -657,6 +671,335 @@ export default { // ======= 导出文件 ======= const buf = await workbook.xlsx.writeBuffer() saveAs(new Blob([buf]), `机具设备有偿使用费结算协议书-${data.agreementCode}_${formatTime(new Date())}.xlsx`) + }, + async exportWord() { + const data = this.agreementContent + + // ====== 通用单元格样式 ====== + const cellOpts = { + margins: { top: 300, bottom: 300, left: 40, right: 40 }, // 缩小上下间距 + verticalAlign: 'center', + borders: { + top: { style: BorderStyle.SINGLE, size: 1 }, + bottom: { style: BorderStyle.SINGLE, size: 1 }, + left: { style: BorderStyle.SINGLE, size: 1 }, + right: { style: BorderStyle.SINGLE, size: 1 } + } + } + + const noBorder = { + top: { style: BorderStyle.NONE }, + bottom: { style: BorderStyle.NONE }, + left: { style: BorderStyle.NONE }, + right: { style: BorderStyle.NONE } + } + + // ====== 创建文档 ====== + const doc = new Document({ + sections: [ + { + properties: { + page: { + size: { width: 11900, height: 16840, orientation: PageOrientation.PORTRAIT }, + margin: { top: 720, right: 720, bottom: 720, left: 720 } + } + }, + children: [ + // ===== 标题 ===== + new Paragraph({ + alignment: AlignmentType.CENTER, + spacing: { before: 100, after: 200 }, + children: [new TextRun({ text: '机具设备有偿使用费结算协议书', bold: true, size: 32 })] + }), + + // ===== 协议号和编号 ===== + + new Table({ + width: { size: 100, type: WidthType.PERCENTAGE }, + rows: [ + new TableRow({ + children: [ + new TableCell({ + width: { size: 70, type: WidthType.PERCENTAGE }, + borders: noBorder, + children: [new Paragraph({ text: '' })] + }), + new TableCell({ + width: { size: 30, type: WidthType.PERCENTAGE }, + borders: noBorder, + children: [ + new Paragraph({ + alignment: AlignmentType.LEFT, + text: `协议号:${data.agreementCode || ''}`, + spacing: { before: 0, after: 0 } + }) + ], + margins: { top: 100, bottom: 100 } // 缩小上下空间 + }) + ] + }), + new TableRow({ + children: [ + new TableCell({ + width: { size: 70, type: WidthType.PERCENTAGE }, + borders: noBorder, + children: [new Paragraph({ text: '' })] + }), + new TableCell({ + width: { size: 30, type: WidthType.PERCENTAGE }, + borders: noBorder, + children: [ + new Paragraph({ + alignment: AlignmentType.LEFT, + text: `编号:`, + spacing: { before: 0, after: 0 } + }) + ], + margins: { top: 100, bottom: 100 } // 缩小上下空间 + }) + ] + }) + ] + }), + + // === 添加一个空白 Paragraph === + new Paragraph({ + text: '', + spacing: { before: 100, after: 100 } // 给点上下间距,让后面内容不受影响 + }), + + // ===== 主体表格 ===== + new Table({ + width: { size: 100, type: WidthType.PERCENTAGE }, + rows: [ + // 工程名称 + new TableRow({ + children: [ + new TableCell({ + ...cellOpts, + width: { size: 25, type: WidthType.PERCENTAGE }, + children: [ + new Paragraph({ + alignment: AlignmentType.CENTER, + text: '工程名称:' + }) + ] + }), + new TableCell({ + ...cellOpts, + width: { size: 75, type: WidthType.PERCENTAGE }, + columnSpan: 3, + children: [ + new Paragraph({ + alignment: AlignmentType.CENTER, + text: data.projectName + }) + ] + }) + ] + }), + + // 承租单位 + 日期 + new TableRow({ + children: [ + new TableCell({ + ...cellOpts, + width: { size: 25, type: WidthType.PERCENTAGE }, + children: [ + new Paragraph({ + alignment: AlignmentType.CENTER, + text: '承租单位:' + }) + ] + }), + new TableCell({ + ...cellOpts, + width: { size: 40, type: WidthType.PERCENTAGE }, + children: [ + new Paragraph({ + alignment: AlignmentType.CENTER, + text: data.unitName + }) + ] + }), + new TableCell({ + ...cellOpts, + width: { size: 10, type: WidthType.PERCENTAGE }, + children: [ + new Paragraph({ alignment: AlignmentType.CENTER, text: '日期:' }) + ] + }), + new TableCell({ + ...cellOpts, + width: { size: 25, type: WidthType.PERCENTAGE }, + children: [ + new Paragraph({ + alignment: AlignmentType.CENTER, + text: data.applyTime + }) + ] + }) + ] + }), + + // 表头 + new TableRow({ + children: [ + new TableCell({ + ...cellOpts, + columnSpan: 4, + children: [ + new Paragraph({ + alignment: AlignmentType.CENTER, + text: '结算项目及金额(元)', + bold: true + }) + ] + }) + ] + }), + + // 金额明细 + ...[ + ['一、施工机具有偿使用费:', `¥ ${Number(data.leaseCost).toFixed(2)}`], + ['二、施工机具维修费:', `¥ ${Number(data.repairCost).toFixed(2)}`], + ['三、施工机具丢失费:', `¥ ${Number(data.loseCost).toFixed(2)}`], + ['四、施工机具损坏赔偿费:', `¥ ${Number(data.scrapCost).toFixed(2)}`], + ['五、施工机具租赁减免费:', `¥ ${Number(data.reductionCost).toFixed(2)}`] + ].map( + ([label, value]) => + new TableRow({ + children: [ + new TableCell({ + ...cellOpts, + columnSpan: 2, + children: [ + new Paragraph({ + alignment: AlignmentType.CENTER, + text: label + }) + ] + }), + new TableCell({ + ...cellOpts, + columnSpan: 2, + children: [ + new Paragraph({ + alignment: AlignmentType.CENTER, + text: value + }) + ] + }) + ] + }) + ), + + // 合计 + new TableRow({ + children: [ + new TableCell({ + ...cellOpts, + children: [ + new Paragraph({ + alignment: AlignmentType.CENTER, + text: '费用合计金额(大写):' + }) + ] + }), + new TableCell({ + ...cellOpts, + children: [ + new Paragraph({ + alignment: AlignmentType.CENTER, + text: data.costAllUpper + }) + ] + }), + new TableCell({ + ...cellOpts, + columnSpan: 2, + children: [ + new Paragraph({ + alignment: AlignmentType.CENTER, + text: `¥ ${Number(data.costAll).toFixed(2)}` + }) + ] + }) + ] + }), + + // 说明 + new TableRow({ + children: [ + new TableCell({ + ...cellOpts, + children: [ + new Paragraph({ alignment: AlignmentType.CENTER, text: '说明:' }) + ] + }), + new TableCell({ + ...cellOpts, + columnSpan: 3, + children: [ + new Paragraph({ + alignment: AlignmentType.CENTER, + text: '本协议一式两份,甲方一份,乙方一份,经双方签字后生效。' + }) + ] + }) + ] + }), + + // 备注 + new TableRow({ + children: [ + new TableCell({ + ...cellOpts, + children: [ + new Paragraph({ alignment: AlignmentType.CENTER, text: '备注:' }) + ] + }), + new TableCell({ + ...cellOpts, + columnSpan: 3, + children: [ + new Paragraph({ + alignment: AlignmentType.CENTER, + text: '此费用仅为在机具设备分公司发生费用,未计从项目部领用机具费用。' + }) + ] + }) + ] + }) + ] + }), + + // 空白间距 + new Paragraph({ text: '', spacing: { before: 200 } }), + + // ===== 底部签名行(无边框) ===== + new Table({ + width: { size: 100, type: WidthType.PERCENTAGE }, + rows: [ + new TableRow({ + children: ['部门负责人:', '承租负责人:', '核算员:'].map( + text => + new TableCell({ + borders: noBorder, + children: [new Paragraph({ alignment: AlignmentType.LEFT, text })], + margins: { top: 200, bottom: 200 } // 缩小上下空间 + }) + ) + }) + ] + }) + ] + } + ] + }) + + const blob = await Packer.toBlob(doc) + saveAs(blob, `机具设备有偿使用费结算协议书-${data.agreementCode}.docx`) } } } diff --git a/src/views/material/repair/testedInBound/component/home.vue b/src/views/material/repair/testedInBound/component/home.vue index e78a0dff..c32892a3 100644 --- a/src/views/material/repair/testedInBound/component/home.vue +++ b/src/views/material/repair/testedInBound/component/home.vue @@ -188,6 +188,7 @@ export default { time: [], startTime: undefined, endTime: undefined, + taskStatus: '', }, queryInBoundInfo:{ pageNum: 1,