diff --git a/package.json b/package.json
index 97a19ba..b3fb122 100644
--- a/package.json
+++ b/package.json
@@ -5,11 +5,11 @@
"author": "srs",
"license": "MIT",
"scripts": {
- "dev": "cross-env vue-cli-service serve",
- "build:prod": "cross-env NODE_OPTIONS=--openssl-legacy-provider vue-cli-service build",
- "build:stage": "cross-env NODE_OPTIONS=--openssl-legacy-provider vue-cli-service build --mode staging",
- "build": "cross-env NODE_OPTIONS=--openssl-legacy-provider vite build",
- "preview": "cross-env NODE_OPTIONS=--openssl-legacy-provider node build/index.js --preview",
+ "dev": "vue-cli-service serve",
+ "build:prod": "vue-cli-service build",
+ "build:stage": "vue-cli-service build --mode staging",
+ "build": "vite build",
+ "preview": "node build/index.js --preview",
"lint": "eslint --ext .js,.vue src",
"lint:fix": "eslint --ext .js,.vue src --fix"
},
diff --git a/src/views/flowable/task/todo/detail/index.vue b/src/views/flowable/task/todo/detail/index.vue
index b9806b9..cebbead 100644
--- a/src/views/flowable/task/todo/detail/index.vue
+++ b/src/views/flowable/task/todo/detail/index.vue
@@ -757,7 +757,7 @@
+ append-to-body @opened="showGlobalWatermark" @closed="hideGlobalWatermark">
@@ -766,19 +766,16 @@
{{ form.stuName }}同学:
{{ form.letterService }}
-

-
学生工作处
{{ form.violationDate }}
+
- 下载处分下文
+
下载解除处分下文
@@ -790,13 +787,13 @@
}}学生,学号:{{ form.stuNo }}.该生于个人原因-{{ form.reasonApplying }},申请休学.经学校研究,同意休学,时间从{{ form.quitStartTime }}至{{
form.quitEndTime }}.
-

-
-
学生工作处
-
{{ form.quitStartTime }}
+
+
+
![]()
+
+ 学生工作处
+ {{ form.quitStartTime }}
+
@@ -893,6 +890,7 @@
@@ -938,6 +936,7 @@ import { flowXmlAndNode, getProcessVariables } from '@/api/flowable/definition'
import { flowRecord } from '@/api/flowable/finished'
import { complete, delegate, flowTaskForm, getNextFlowNode, rejectTask, returnList, returnTask } from '@/api/flowable/todo'
import { getDisciplinaryApplicationByProcInsId, getStuInfo, updateDisciplinaryApplication } from '@/api/routine/disciplinaryApplication'
+import { getStampBase64 } from '@/api/common/stamp'
import { getLeaveApplicationByProcInsId, getStuInfoByStuId } from '@/api/routine/leaveApplication'
import { getStuDisciplinaryRelieveByProcInsId, updateRelieve } from '@/api/routine/relieve'
import { getRtStuQuitSchoolByProcInsId, updateRtStuQuitSchool } from '@/api/routine/rtStuQuitSchool'
@@ -1098,6 +1097,9 @@ export default {
basicForm: false,//退伍复学表单
BasicTestData: 0, // 新增:默认0,仅退回学生申请时改为1
user: [], // 当前登录用户
+ stampBase64: '', // 印章Base64数据
+ globalWatermarkEl: null,
+ globalWatermarkText: '\u5e7f\u897f\u6c34\u5229\u7535\u529b\u804c\u4e1a\u6280\u672f\u5b66\u9662\u5b66\u5de5\u7cfb\u7edf'
}
},
created() {
@@ -1120,9 +1122,11 @@ export default {
}
if ((this.taskName == '学生接收' || this.taskName == '申请人(辅导员)接收') && this.category == 'disposal') {
this.showLetterService = true
+ this.getStampBase64()
}
if ((this.taskName == '学生接收' || this.taskName == '辅导员接收') && this.category == 'quitSchool') {
this.showQuitSchoolProve = true
+ this.getStampBase64()
}
if (this.taskName == '学生接收' && this.category == 'relieve') {
this.showFileDowload = true
@@ -1177,7 +1181,86 @@ export default {
}
},
methods: {
-
+ createWatermarkCanvas(text, options = {}) {
+ const {
+ width = 300,
+ height = 200,
+ angle = -25,
+ fontSize = 18,
+ alpha = 0.2
+ } = options
+ const canvas = document.createElement('canvas')
+ canvas.width = width
+ canvas.height = height
+ const ctx = canvas.getContext('2d')
+ if (!ctx) {
+ return null
+ }
+ ctx.clearRect(0, 0, canvas.width, canvas.height)
+ ctx.translate(canvas.width / 2, canvas.height / 2)
+ ctx.rotate((angle * Math.PI) / 180)
+ ctx.textAlign = 'center'
+ ctx.textBaseline = 'middle'
+ ctx.font = `${fontSize}px Microsoft YaHei`
+ ctx.fillStyle = `rgba(0, 0, 0, ${alpha})`
+ ctx.fillText(text, 0, 0)
+ return canvas
+ },
+ createWatermarkDataUrl(text, options = {}) {
+ const canvas = this.createWatermarkCanvas(text, options)
+ if (!canvas) {
+ return ''
+ }
+ return canvas.toDataURL('image/png')
+ },
+ showGlobalWatermark() {
+ if (typeof document === 'undefined') {
+ return
+ }
+
+ // 检查是否有显示处分决定送达书的卡片且包含.stamp元素
+ const letterServiceCard = document.querySelector('.el-card:has(.stamp)')
+ if (!letterServiceCard) {
+ // 如果没有找到符合条件的元素,则不显示水印
+ return
+ }
+
+ if (!this.globalWatermarkEl) {
+ this.globalWatermarkEl = document.createElement('div')
+ this.globalWatermarkEl.className = 'global-dialog-watermark-mask'
+ }
+ const topZIndex = Array.from(document.querySelectorAll('body *'))
+ .map(item => Number(window.getComputedStyle(item).zIndex) || 0)
+ .reduce((max, value) => Math.max(max, value), 2002)
+ const watermarkUrl = this.createWatermarkDataUrl(this.globalWatermarkText)
+ this.globalWatermarkEl.style.cssText = `
+ position: fixed;
+ inset: 0;
+ width: 100vw;
+ height: 100vh;
+ pointer-events: none;
+ z-index: ${topZIndex + 1};
+ background-image: url(${watermarkUrl});
+ background-size: 300px 200px;
+ background-repeat: repeat;
+ background-position: 0 0;
+ `
+ if (!document.body.contains(this.globalWatermarkEl)) {
+ document.body.appendChild(this.globalWatermarkEl)
+ }
+ },
+ hideGlobalWatermark() {
+ if (this.globalWatermarkEl && this.globalWatermarkEl.parentNode) {
+ this.globalWatermarkEl.parentNode.removeChild(this.globalWatermarkEl)
+ }
+ },
+
+ getStampBase64() {
+ getStampBase64().then(res => {
+ this.stampBase64 = res.msg
+ })
+ },
+
handleChange1(value) {
if (value && value.length === 3) {
const [gradeId, majorId, classId] = value;
@@ -1525,7 +1608,7 @@ export default {
// this.completeOpen = true;
// this.completeTitle = "流程审批";
this.submitForm(null)
- // 获取当前用户的签名,并赋值给this.taskForm.variables.signature传入监听器
+ // 获取当前用户的签名,并赋值给this.taskForm.variables传入监听器
this.taskForm.variables.signature = this.user.signature
},
/** 用户审批任务 */
@@ -2380,7 +2463,53 @@ export default {
})
},
fileUpload() {
- download.resource(this.pdfURL)
+ // 使用html2canvas将处分决定书卡片内容转换为图片并下载
+ import('html2canvas').then((html2canvas) => {
+ // 优先选择处分决定书的卡片内容,如果找不到再尝试通用的.el-card__body
+ const element = document.querySelector('.certificate-service .el-card__body') ||
+ document.querySelector('.certificate-service') ||
+ document.querySelector('.el-card__body');
+ if (element) {
+ html2canvas.default(element).then((canvas) => {
+ // 创建一个新的canvas用于添加水印
+ const watermarkedCanvas = document.createElement('canvas');
+ const ctx = watermarkedCanvas.getContext('2d');
+ watermarkedCanvas.width = canvas.width;
+ watermarkedCanvas.height = canvas.height;
+
+ // 绘制原始canvas内容
+ ctx.drawImage(canvas, 0, 0);
+
+ // 使用平铺水印块,避免文字重叠并降低透明度
+ const watermarkCanvas = this.createWatermarkCanvas(this.globalWatermarkText, {
+ width: 320,
+ height: 220,
+ angle: -25,
+ fontSize: 22,
+ alpha: 0.3
+ })
+ if (watermarkCanvas) {
+ ctx.save()
+ const pattern = ctx.createPattern(watermarkCanvas, 'repeat')
+ if (pattern) {
+ ctx.fillStyle = pattern
+ ctx.fillRect(0, 0, watermarkedCanvas.width, watermarkedCanvas.height)
+ }
+ ctx.restore()
+ }
+
+ // 创建下载链接
+ const link = document.createElement('a');
+ link.download = '处分决定送达书.png'; // 更具描述性的文件名
+ link.href = watermarkedCanvas.toDataURL('image/png');
+ link.click();
+ });
+ } else {
+ console.error('找不到需要截图的元素');
+ }
+ }).catch((error) => {
+ console.error('html2canvas 加载失败:', error);
+ });
},
// 初始化入伍保留学籍申请审核意见参数
initApproval() {
@@ -2470,6 +2599,9 @@ export default {
})
}
},
+ beforeDestroy() {
+ this.hideGlobalWatermark()
+ }
}
diff --git a/src/views/flowable/task/todo/detail/quitSchoolIndex.vue b/src/views/flowable/task/todo/detail/quitSchoolIndex.vue
index 3314a16..a61cc67 100644
--- a/src/views/flowable/task/todo/detail/quitSchoolIndex.vue
+++ b/src/views/flowable/task/todo/detail/quitSchoolIndex.vue
@@ -194,11 +194,11 @@
{{ form.stuName }},{{ form.gender }},{{ form.mz }},{{ form.birthday }}出生,{{ form.jg }}人,{{ form.className }}学生,学号:{{ form.stuNo }}.该生于个人原因-{{ form.reasonApplying }},申请休学.经学校研究,同意休学,时间从{{ form.quitStartTime }}至{{ form.quitEndTime }}.
抄送:教务处、财务处、{{ form.departmentName }}
-
学生工作处
{{ form.quitStartTime }}
+
@@ -289,6 +289,7 @@ import { flowXmlAndNode, getProcessVariables } from '@/api/flowable/definition'
import { flowRecord } from '@/api/flowable/finished'
import { complete, delegate, flowTaskForm, getNextFlowNode, rejectTask, returnList, returnTask } from '@/api/flowable/todo'
import { getRtStuQuitSchoolByProcInsId, updateRtStuQuitSchool } from '@/api/routine/rtStuQuitSchool'
+import { getStampBase64 } from '@/api/common/stamp'
import FlowRole from '@/components/flow/Role'
import FlowUser from '@/components/flow/User'
import Parser from '@/components/parser/Parser'
@@ -403,6 +404,7 @@ export default {
quitSchoolForm: false, // 休学申请表单
showQuitSchoolProve: false, //休学证明
quitSchoolGLKSHShow: false, // 学生教育管理科审核
+ stampBase64: '', // 印章Base64数据
}
},
created() {
@@ -418,6 +420,7 @@ export default {
// 如果任务名是其中的两个,则改变审批意见的输入框内容
if ((this.taskName == '学生接收' || this.taskName == '辅导员接收') && this.category == 'quitSchool') {
this.showQuitSchoolProve = true
+ this.getStampBase64()
}
if (this.category == 'quitSchool') {
this.quitSchoolForm = true
@@ -439,6 +442,12 @@ export default {
}
},
methods: {
+ getStampBase64() {
+ getStampBase64().then(res => {
+ this.stampBase64 = res.msg
+ })
+ },
+
reentryYearMethodFormat(row, column) {
return this.selectDictLabel(this.dict.type.sys_teacher_kpi_filling_year, row.quitYear)
},
@@ -765,14 +774,24 @@ export default {
.stamp {
text-align: right;
+ position: relative;
+ min-height: 120px;
+ padding-top: 10px;
+
& > div {
- margin-top: -70px;
+ position: relative;
+ z-index: 2;
+ margin-top: 10px;
margin-right: 25px;
}
img {
- width: 120px;
- height: 120px;
+ position: absolute;
+ right: 0;
+ top: 10px;
+ width: 200px;
+ height: 200px;
+ z-index: 1;
}
}
}
diff --git a/src/views/flowable/task/todo/detail/reentryIndex.vue b/src/views/flowable/task/todo/detail/reentryIndex.vue
index a71657a..0063f75 100644
--- a/src/views/flowable/task/todo/detail/reentryIndex.vue
+++ b/src/views/flowable/task/todo/detail/reentryIndex.vue
@@ -213,11 +213,11 @@