1
This commit is contained in:
@@ -81,3 +81,12 @@ export const putObj = (obj: any) => {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const print = (id: string | number) => {
|
||||||
|
return request({
|
||||||
|
url: `/professional/professionalteacherstationchange/print`,
|
||||||
|
method: 'get',
|
||||||
|
params: {
|
||||||
|
id: id
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|||||||
@@ -34,7 +34,8 @@ const props = withDefaults(defineProps<Props>(), {
|
|||||||
options: () => [
|
options: () => [
|
||||||
{ value: '1', label: '已通过', type: 'success', icon: 'fa-solid fa-circle-check' , effect:"dark" },
|
{ value: '1', label: '已通过', type: 'success', icon: 'fa-solid fa-circle-check' , effect:"dark" },
|
||||||
{ value: '-2', label: '已驳回', type: 'danger', icon: 'fa-solid fa-circle-xmark', effect:"dark" },
|
{ value: '-2', label: '已驳回', type: 'danger', icon: 'fa-solid fa-circle-xmark', effect:"dark" },
|
||||||
{ value: '0', label: '待审核', type: 'warning', icon: 'fa-regular fa-clock' ,effect:"light" }
|
{ value: '0', label: '待审核', type: 'warning', icon: 'fa-regular fa-clock' ,effect:"light" },
|
||||||
|
{ value: '10', label: '部门通过', type: 'warning', icon: 'fa-regular fa-clock' ,effect:"dark" }
|
||||||
],
|
],
|
||||||
showIcon: true,
|
showIcon: true,
|
||||||
emptyText: '-'
|
emptyText: '-'
|
||||||
|
|||||||
BIN
src/dept_change.docx
Normal file
BIN
src/dept_change.docx
Normal file
Binary file not shown.
@@ -58,6 +58,15 @@ export const dynamicRoutes: Array<RouteRecordRaw> = [
|
|||||||
isHide: true,
|
isHide: true,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
path: '/professional/professionalteacherstationchange/print',
|
||||||
|
name: 'professionalteacherstationchange.print',
|
||||||
|
component: () => import('/@/views/professional/professionalteacherstationchange/print.vue'),
|
||||||
|
meta: {
|
||||||
|
isHide: true, // 隐藏路由,不在菜单中显示
|
||||||
|
isAuth: true // 需要认证,在 layout 中显示
|
||||||
|
},
|
||||||
|
},
|
||||||
...dynamicRoutesFlow
|
...dynamicRoutesFlow
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|||||||
@@ -136,7 +136,7 @@
|
|||||||
</el-button>
|
</el-button>
|
||||||
<el-button
|
<el-button
|
||||||
v-auth="'professional_professionalqualificationrelation_exam'"
|
v-auth="'professional_professionalqualificationrelation_exam'"
|
||||||
v-if="scope.row.state === '0'"
|
v-if="scope.row.canExam"
|
||||||
type="success"
|
type="success"
|
||||||
link
|
link
|
||||||
icon="CircleCheck"
|
icon="CircleCheck"
|
||||||
@@ -144,12 +144,28 @@
|
|||||||
</el-button>
|
</el-button>
|
||||||
<el-button
|
<el-button
|
||||||
v-auth="'professional_professionalqualificationrelation_exam'"
|
v-auth="'professional_professionalqualificationrelation_exam'"
|
||||||
v-if="scope.row.state === '0' || scope.row.state === '1'"
|
v-if="scope.row.canDeptExam"
|
||||||
|
type="success"
|
||||||
|
link
|
||||||
|
icon="CircleCheck"
|
||||||
|
@click="changeState(scope.row, 1)">部门通过
|
||||||
|
</el-button>
|
||||||
|
<el-button
|
||||||
|
v-auth="'professional_professionalqualificationrelation_exam'"
|
||||||
|
v-if="scope.row.canBack"
|
||||||
type="danger"
|
type="danger"
|
||||||
link
|
link
|
||||||
icon="CircleClose"
|
icon="CircleClose"
|
||||||
@click="changeState(scope.row, -2)">驳回
|
@click="changeState(scope.row, -2)">驳回
|
||||||
</el-button>
|
</el-button>
|
||||||
|
<el-button
|
||||||
|
v-auth="'professional_professionalqualificationrelation_exam'"
|
||||||
|
v-if="scope.row.canDeptBack"
|
||||||
|
type="danger"
|
||||||
|
link
|
||||||
|
icon="CircleClose"
|
||||||
|
@click="changeState(scope.row, -2)">部门驳回
|
||||||
|
</el-button>
|
||||||
<el-button
|
<el-button
|
||||||
v-auth="'professional_professionalqualificationrelation_del'"
|
v-auth="'professional_professionalqualificationrelation_del'"
|
||||||
type="danger"
|
type="danger"
|
||||||
|
|||||||
@@ -162,7 +162,7 @@
|
|||||||
</el-button>
|
</el-button>
|
||||||
<el-button
|
<el-button
|
||||||
v-auth="'professional_professionalteacheracademicrelation_exam'"
|
v-auth="'professional_professionalteacheracademicrelation_exam'"
|
||||||
v-if="scope.row.state === '0'"
|
v-if="scope.row.canExam"
|
||||||
type="success"
|
type="success"
|
||||||
link
|
link
|
||||||
icon="CircleCheck"
|
icon="CircleCheck"
|
||||||
@@ -170,12 +170,28 @@
|
|||||||
</el-button>
|
</el-button>
|
||||||
<el-button
|
<el-button
|
||||||
v-auth="'professional_professionalteacheracademicrelation_exam'"
|
v-auth="'professional_professionalteacheracademicrelation_exam'"
|
||||||
v-if="scope.row.state === '0' || scope.row.state === '1'"
|
v-if="scope.row.canDeptExam"
|
||||||
|
type="success"
|
||||||
|
link
|
||||||
|
icon="CircleCheck"
|
||||||
|
@click="changeState(scope.row, 1)">部门通过
|
||||||
|
</el-button>
|
||||||
|
<el-button
|
||||||
|
v-auth="'professional_professionalteacheracademicrelation_exam'"
|
||||||
|
v-if="scope.row.canBack"
|
||||||
type="danger"
|
type="danger"
|
||||||
link
|
link
|
||||||
icon="CircleClose"
|
icon="CircleClose"
|
||||||
@click="changeState(scope.row, -2)">驳回
|
@click="changeState(scope.row, -2)">驳回
|
||||||
</el-button>
|
</el-button>
|
||||||
|
<el-button
|
||||||
|
v-auth="'professional_professionalteacheracademicrelation_exam'"
|
||||||
|
v-if="scope.row.canDeptBack"
|
||||||
|
type="danger"
|
||||||
|
link
|
||||||
|
icon="CircleClose"
|
||||||
|
@click="changeState(scope.row, -2)">部门驳回
|
||||||
|
</el-button>
|
||||||
<el-button
|
<el-button
|
||||||
v-auth="'professional_professionalteacheracademicrelation_del'"
|
v-auth="'professional_professionalteacheracademicrelation_del'"
|
||||||
type="danger"
|
type="danger"
|
||||||
|
|||||||
@@ -133,16 +133,30 @@
|
|||||||
type="success"
|
type="success"
|
||||||
link
|
link
|
||||||
icon="CircleCheck"
|
icon="CircleCheck"
|
||||||
v-if="permissions.professional_professionalteachercertificaterelation_exam && scope.row.state === '0'"
|
v-if="permissions.professional_professionalteachercertificaterelation_exam && scope.row.canExam"
|
||||||
@click="changeState(scope.row, 1)">通过
|
@click="changeState(scope.row, 1)">通过
|
||||||
</el-button>
|
</el-button>
|
||||||
|
<el-button
|
||||||
|
type="success"
|
||||||
|
link
|
||||||
|
icon="CircleCheck"
|
||||||
|
v-if="permissions.professional_professionalteachercertificaterelation_exam && scope.row.canDeptExam"
|
||||||
|
@click="changeState(scope.row, 1)">部门通过
|
||||||
|
</el-button>
|
||||||
<el-button
|
<el-button
|
||||||
type="danger"
|
type="danger"
|
||||||
link
|
link
|
||||||
icon="CircleClose"
|
icon="CircleClose"
|
||||||
v-if="permissions.professional_professionalteachercertificaterelation_exam && (scope.row.state === '0' || scope.row.state === '1')"
|
v-if="permissions.professional_professionalteachercertificaterelation_exam && scope.row.canBack"
|
||||||
@click="changeState(scope.row, -2)">驳回
|
@click="changeState(scope.row, -2)">驳回
|
||||||
</el-button>
|
</el-button>
|
||||||
|
<el-button
|
||||||
|
type="danger"
|
||||||
|
link
|
||||||
|
icon="CircleClose"
|
||||||
|
v-if="permissions.professional_professionalteachercertificaterelation_exam && scope.row.canDeptBack"
|
||||||
|
@click="changeState(scope.row, -2)">部门驳回
|
||||||
|
</el-button>
|
||||||
<el-button
|
<el-button
|
||||||
type="danger"
|
type="danger"
|
||||||
link
|
link
|
||||||
|
|||||||
@@ -128,16 +128,30 @@
|
|||||||
type="success"
|
type="success"
|
||||||
link
|
link
|
||||||
icon="CircleCheck"
|
icon="CircleCheck"
|
||||||
v-if="permissions.professional_professionalteacherhonor_exam && scope.row.state === '0'"
|
v-if="permissions.professional_professionalteacherhonor_exam && scope.row.canExam"
|
||||||
@click="changeState(scope.row, 1)">通过
|
@click="changeState(scope.row, 1)">通过
|
||||||
</el-button>
|
</el-button>
|
||||||
|
<el-button
|
||||||
|
type="success"
|
||||||
|
link
|
||||||
|
icon="CircleCheck"
|
||||||
|
v-if="permissions.professional_professionalteacherhonor_exam && scope.row.canDeptExam"
|
||||||
|
@click="changeState(scope.row, 1)">部门通过
|
||||||
|
</el-button>
|
||||||
<el-button
|
<el-button
|
||||||
type="danger"
|
type="danger"
|
||||||
link
|
link
|
||||||
icon="CircleClose"
|
icon="CircleClose"
|
||||||
v-if="permissions.professional_professionalteacherhonor_exam && (scope.row.state === '0' || scope.row.state === '1')"
|
v-if="permissions.professional_professionalteacherhonor_exam && scope.row.canBack"
|
||||||
@click="changeState(scope.row, -2)">驳回
|
@click="changeState(scope.row, -2)">驳回
|
||||||
</el-button>
|
</el-button>
|
||||||
|
<el-button
|
||||||
|
type="danger"
|
||||||
|
link
|
||||||
|
icon="CircleClose"
|
||||||
|
v-if="permissions.professional_professionalteacherhonor_exam && scope.row.canDeptBack"
|
||||||
|
@click="changeState(scope.row, -2)">部门驳回
|
||||||
|
</el-button>
|
||||||
<el-button
|
<el-button
|
||||||
type="danger"
|
type="danger"
|
||||||
link
|
link
|
||||||
|
|||||||
@@ -85,9 +85,13 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { ref, reactive, onMounted } from 'vue'
|
import { ref, reactive, onMounted } from 'vue'
|
||||||
import { defineAsyncComponent } from 'vue'
|
import { defineAsyncComponent } from 'vue'
|
||||||
|
import { useRouter, useRoute } from 'vue-router'
|
||||||
import { BasicTableProps, useTable } from '/@/hooks/table'
|
import { BasicTableProps, useTable } from '/@/hooks/table'
|
||||||
import { fetchList } from '/@/api/professional/professionaluser/professionalteacherstationchange'
|
import { fetchList } from '/@/api/professional/professionaluser/professionalteacherstationchange'
|
||||||
|
|
||||||
|
const router = useRouter()
|
||||||
|
const route = useRoute()
|
||||||
|
|
||||||
const TeacherNameNo = defineAsyncComponent(() => import('/@/components/TeacherNameNo/index.vue'))
|
const TeacherNameNo = defineAsyncComponent(() => import('/@/components/TeacherNameNo/index.vue'))
|
||||||
|
|
||||||
// 表格引用
|
// 表格引用
|
||||||
@@ -133,7 +137,12 @@ const resetQuery = () => {
|
|||||||
|
|
||||||
// 打印部门调令
|
// 打印部门调令
|
||||||
const doPrint = (row: any) => {
|
const doPrint = (row: any) => {
|
||||||
window.open(`/professional/professionalteacherstationchange/print/${row.id}`)
|
// 直接使用固定路径跳转到 print 页面
|
||||||
|
const routeData = router.resolve({
|
||||||
|
path: '/professional/professionalteacherstationchange/print',
|
||||||
|
query: { id: row.id } // 使用 query 参数传递 id
|
||||||
|
})
|
||||||
|
window.open(routeData.href, '_blank')
|
||||||
}
|
}
|
||||||
|
|
||||||
// 初始化
|
// 初始化
|
||||||
|
|||||||
@@ -0,0 +1,515 @@
|
|||||||
|
<template>
|
||||||
|
<div class="print-container" id="print-container" ref="printContainerRef">
|
||||||
|
<div class="print-content" v-loading="loading" ref="printContentRef">
|
||||||
|
<!-- 上半部分:存根 -->
|
||||||
|
<div class="stub-section">
|
||||||
|
<!-- 大标题 -->
|
||||||
|
<div class="main-title">江苏省常州技师学院调令</div>
|
||||||
|
|
||||||
|
<!-- 副标题和编号 -->
|
||||||
|
<div class="subtitle-row">
|
||||||
|
<div class="subtitle">
|
||||||
|
<div class="subtitle-text">校内调配通知单</div>
|
||||||
|
<div class="stub-label">(存根)</div>
|
||||||
|
</div>
|
||||||
|
<div class="doc-number">编号:</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 存根内容 -->
|
||||||
|
<div class="stub-content">
|
||||||
|
<div class="content-line">
|
||||||
|
<span class="underline-field">{{ detailData.fromDeptName || '________' }}</span>
|
||||||
|
<span class="text">(院、部、中心、处室):</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="content-line indent">
|
||||||
|
<span class="text">经学校研究决定,调配</span>
|
||||||
|
<span class="underline-field">{{ detailData.realName || '________' }}</span>
|
||||||
|
<span class="text">同志到</span>
|
||||||
|
<span class="underline-field">{{ detailData.toDeptName1 || '________' }}</span>
|
||||||
|
<span class="text">(院、部、中心、处室)</span>
|
||||||
|
<span class="underline-field">{{ detailData.pos || '________' }}</span>
|
||||||
|
<span class="text">(专技、管理、工勤)岗位工作,请做好移交或安排。</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="content-line">
|
||||||
|
<span class="text">限</span>
|
||||||
|
<span class="underline-field">{{ detailData.year1 || '____' }}</span>
|
||||||
|
<span class="text">年</span>
|
||||||
|
<span class="underline-field">{{ detailData.month1 || '____' }}</span>
|
||||||
|
<span class="text">月</span>
|
||||||
|
<span class="underline-field">{{ detailData.day1 || '____' }}</span>
|
||||||
|
<span class="text">日前离岗。</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 存根底部 -->
|
||||||
|
<div class="stub-footer">
|
||||||
|
<div class="footer-right">
|
||||||
|
<div class="dept-name">组织人事处</div>
|
||||||
|
<div class="date-line">
|
||||||
|
<span class="underline-field">{{ detailData.year || '____' }}</span>
|
||||||
|
<span class="text">年</span>
|
||||||
|
<span class="underline-field">{{ detailData.month || '____' }}</span>
|
||||||
|
<span class="text">月</span>
|
||||||
|
<span class="underline-field">{{ detailData.day || '____' }}</span>
|
||||||
|
<span class="text">日</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 分隔线 -->
|
||||||
|
<div class="divider-line"></div>
|
||||||
|
|
||||||
|
<!-- 下半部分:正式通知单 -->
|
||||||
|
<div class="notice-section">
|
||||||
|
<!-- 顶部横线 -->
|
||||||
|
<div class="top-line"></div>
|
||||||
|
|
||||||
|
<!-- 标题和编号 -->
|
||||||
|
<div class="notice-title-row">
|
||||||
|
<div class="notice-title">校内调配通知单</div>
|
||||||
|
<div class="doc-number">编号:</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 通知单内容 -->
|
||||||
|
<div class="notice-content">
|
||||||
|
<div class="content-line">
|
||||||
|
<span class="underline-field">{{ detailData.fromDeptName || '________' }}</span>
|
||||||
|
<span class="text">(院、部、中心、处室):</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="content-line indent">
|
||||||
|
<span class="text">经学校研究决定,调配</span>
|
||||||
|
<span class="underline-field">{{ detailData.realName || '________' }}</span>
|
||||||
|
<span class="text">同志到</span>
|
||||||
|
<span class="underline-field">{{ detailData.toDeptName1 || '________' }}</span>
|
||||||
|
<span class="text">(院、部、中心、处室)</span>
|
||||||
|
<span class="underline-field">{{ detailData.pos || '________' }}</span>
|
||||||
|
<span class="text">(专技、管理、工勤)岗位工作,请做好工作安排。</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="content-line">
|
||||||
|
<span class="text">限</span>
|
||||||
|
<span class="underline-field">{{ detailData.year1 || '____' }}</span>
|
||||||
|
<span class="text">年</span>
|
||||||
|
<span class="underline-field">{{ detailData.month1 || '____' }}</span>
|
||||||
|
<span class="text">月</span>
|
||||||
|
<span class="underline-field">{{ detailData.day1 || '____' }}</span>
|
||||||
|
<span class="text">日前报到,并将该单交财务处。</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 通知单底部 -->
|
||||||
|
<div class="notice-footer">
|
||||||
|
<div class="footer-center">
|
||||||
|
<div class="dept-name-bold">组织人事处</div>
|
||||||
|
<div class="date-line">
|
||||||
|
<span class="underline-field">{{ detailData.year || '____' }}</span>
|
||||||
|
<span class="text">年</span>
|
||||||
|
<span class="underline-field">{{ detailData.month || '____' }}</span>
|
||||||
|
<span class="text">月</span>
|
||||||
|
<span class="underline-field">{{ detailData.day || '____' }}</span>
|
||||||
|
<span class="text">日</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 签字栏 -->
|
||||||
|
<div class="signature-section">
|
||||||
|
<div class="signature-left">
|
||||||
|
<div class="signature-label">调配(出)部门领导签字/日期:</div>
|
||||||
|
</div>
|
||||||
|
<div class="signature-right">
|
||||||
|
<div class="signature-label">接收部门领导签字/日期:</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 打印按钮 -->
|
||||||
|
<div class="print-actions" v-if="!loading">
|
||||||
|
<el-button type="primary" icon="Printer" @click="handlePrint">打印</el-button>
|
||||||
|
<el-button @click="handleClose">关闭</el-button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { ref, onMounted, computed } from 'vue'
|
||||||
|
import { useRoute, useRouter } from 'vue-router'
|
||||||
|
import { print } from '/@/api/professional/professionaluser/professionalteacherstationchange'
|
||||||
|
import { useMessage } from '/@/hooks/message'
|
||||||
|
|
||||||
|
const route = useRoute()
|
||||||
|
const router = useRouter()
|
||||||
|
const message = useMessage()
|
||||||
|
|
||||||
|
const loading = ref(false)
|
||||||
|
const detailData = ref<any>({})
|
||||||
|
const printContainerRef = ref<HTMLElement>()
|
||||||
|
const printContentRef = ref<HTMLElement>()
|
||||||
|
|
||||||
|
// 解析日期
|
||||||
|
const parseDate = (dateStr: string) => {
|
||||||
|
if (!dateStr) return { year: '', month: '', day: '' }
|
||||||
|
const date = new Date(dateStr)
|
||||||
|
return {
|
||||||
|
year: date.getFullYear().toString(),
|
||||||
|
month: (date.getMonth() + 1).toString().padStart(2, '0'),
|
||||||
|
day: date.getDate().toString().padStart(2, '0')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 签发日期
|
||||||
|
const issueDate = computed(() => {
|
||||||
|
return parseDate(detailData.value.changeDate || '')
|
||||||
|
})
|
||||||
|
|
||||||
|
const issueYear = computed(() => issueDate.value.year)
|
||||||
|
const issueMonth = computed(() => issueDate.value.month)
|
||||||
|
const issueDay = computed(() => issueDate.value.day)
|
||||||
|
|
||||||
|
// 报到日期(假设是调令日期,可根据实际需求调整)
|
||||||
|
const reportDate = computed(() => {
|
||||||
|
return parseDate(detailData.value.changeDate || '')
|
||||||
|
})
|
||||||
|
|
||||||
|
const reportYear = computed(() => reportDate.value.year)
|
||||||
|
const reportMonth = computed(() => reportDate.value.month)
|
||||||
|
const reportDay = computed(() => reportDate.value.day)
|
||||||
|
|
||||||
|
// 获取详情数据
|
||||||
|
const fetchDetail = async () => {
|
||||||
|
// 优先从 params 获取,如果没有则从 query 获取
|
||||||
|
const id = (route.params.id || route.query.id) as string
|
||||||
|
if (!id) {
|
||||||
|
message.error('缺少调令ID')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
loading.value = true
|
||||||
|
try {
|
||||||
|
const response = await print(id)
|
||||||
|
if (response && response.data) {
|
||||||
|
detailData.value = response.data
|
||||||
|
} else {
|
||||||
|
message.error('获取调令信息失败')
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error('获取调令详情失败:', error)
|
||||||
|
message.error('获取调令信息失败')
|
||||||
|
} finally {
|
||||||
|
loading.value = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 打印
|
||||||
|
const handlePrint = () => {
|
||||||
|
// 使用 ref 直接操作元素
|
||||||
|
if (printContainerRef.value) {
|
||||||
|
printContainerRef.value.style.display = 'flex'
|
||||||
|
printContainerRef.value.style.visibility = 'visible'
|
||||||
|
printContainerRef.value.style.opacity = '1'
|
||||||
|
}
|
||||||
|
if (printContentRef.value) {
|
||||||
|
printContentRef.value.style.display = 'block'
|
||||||
|
printContentRef.value.style.visibility = 'visible'
|
||||||
|
printContentRef.value.style.opacity = '1'
|
||||||
|
}
|
||||||
|
|
||||||
|
// 隐藏左侧菜单等元素
|
||||||
|
const asideElements = document.querySelectorAll('.layout-aside, .layout-header, .layout-navbars, .layout-tags-view, .layout-breadcrumb')
|
||||||
|
asideElements.forEach((el: any) => {
|
||||||
|
if (el) {
|
||||||
|
el.style.display = 'none'
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
// 调整主内容区
|
||||||
|
const mainElements = document.querySelectorAll('.layout-main')
|
||||||
|
mainElements.forEach((el: any) => {
|
||||||
|
if (el) {
|
||||||
|
el.style.marginLeft = '0'
|
||||||
|
el.style.width = '100%'
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
// 延迟打印,确保样式已应用
|
||||||
|
setTimeout(() => {
|
||||||
|
window.print()
|
||||||
|
}, 200)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 关闭
|
||||||
|
const handleClose = () => {
|
||||||
|
router.back()
|
||||||
|
}
|
||||||
|
|
||||||
|
// 初始化
|
||||||
|
onMounted(() => {
|
||||||
|
fetchDetail()
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<!-- 全局打印样式,用于隐藏 layout 元素 -->
|
||||||
|
<style lang="scss">
|
||||||
|
/* 打印时隐藏左侧菜单和其他 layout 元素 */
|
||||||
|
@media print {
|
||||||
|
/* 只隐藏左侧菜单和头部,不影响其他内容 */
|
||||||
|
.layout-aside,
|
||||||
|
.layout-columns-aside,
|
||||||
|
.layout-header,
|
||||||
|
.layout-navbars,
|
||||||
|
.layout-tags-view,
|
||||||
|
.layout-breadcrumb,
|
||||||
|
.el-backtop {
|
||||||
|
display: none !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 确保主内容区全宽 */
|
||||||
|
.layout-main {
|
||||||
|
margin-left: 0 !important;
|
||||||
|
width: 100% !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 隐藏打印按钮 */
|
||||||
|
.print-actions {
|
||||||
|
display: none !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style lang="scss">
|
||||||
|
.print-container {
|
||||||
|
min-height: 100vh;
|
||||||
|
background: #f5f5f5;
|
||||||
|
padding: 20px;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.print-content {
|
||||||
|
background: #fff;
|
||||||
|
width: 100%;
|
||||||
|
max-width: 800px;
|
||||||
|
padding: 40px 60px;
|
||||||
|
box-shadow: 0 2px 12px rgba(0, 0, 0, 0.1);
|
||||||
|
margin-bottom: 20px;
|
||||||
|
font-size: 16px;
|
||||||
|
line-height: 1.8;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 上半部分:存根 */
|
||||||
|
.stub-section {
|
||||||
|
margin-bottom: 30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.main-title {
|
||||||
|
font-size: 24px;
|
||||||
|
font-weight: bold;
|
||||||
|
text-align: center;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
letter-spacing: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.subtitle-row {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: flex-start;
|
||||||
|
margin-bottom: 30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.subtitle {
|
||||||
|
flex: 1;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.subtitle-text {
|
||||||
|
font-size: 18px;
|
||||||
|
font-weight: 500;
|
||||||
|
margin-bottom: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.stub-label {
|
||||||
|
font-size: 14px;
|
||||||
|
color: #666;
|
||||||
|
}
|
||||||
|
|
||||||
|
.doc-number {
|
||||||
|
font-size: 16px;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.stub-content {
|
||||||
|
margin-bottom: 30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.content-line {
|
||||||
|
margin-bottom: 15px;
|
||||||
|
line-height: 2;
|
||||||
|
|
||||||
|
&.indent {
|
||||||
|
padding-left: 2em;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.underline-field {
|
||||||
|
display: inline-block;
|
||||||
|
min-width: 80px;
|
||||||
|
border-bottom: 1px solid #333;
|
||||||
|
text-align: center;
|
||||||
|
padding: 0 5px;
|
||||||
|
margin: 0 3px;
|
||||||
|
font-weight: 500;
|
||||||
|
}
|
||||||
|
|
||||||
|
.text {
|
||||||
|
color: #333;
|
||||||
|
}
|
||||||
|
|
||||||
|
.stub-footer {
|
||||||
|
margin-top: 40px;
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
.footer-right {
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.footer-center {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dept-name {
|
||||||
|
font-size: 16px;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dept-name-bold {
|
||||||
|
font-size: 18px;
|
||||||
|
font-weight: bold;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.date-line {
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 分隔线 */
|
||||||
|
.divider-line {
|
||||||
|
width: 100%;
|
||||||
|
height: 1px;
|
||||||
|
background: #ddd;
|
||||||
|
margin: 30px 0;
|
||||||
|
border-top: 1px dashed #999;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 下半部分:正式通知单 */
|
||||||
|
.notice-section {
|
||||||
|
margin-top: 30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.top-line {
|
||||||
|
width: 100%;
|
||||||
|
height: 1px;
|
||||||
|
background: #333;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.notice-title-row {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
margin-bottom: 30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.notice-title {
|
||||||
|
flex: 1;
|
||||||
|
text-align: center;
|
||||||
|
font-size: 18px;
|
||||||
|
font-weight: 500;
|
||||||
|
}
|
||||||
|
|
||||||
|
.notice-content {
|
||||||
|
margin-bottom: 40px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.notice-footer {
|
||||||
|
margin-top: 50px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.signature-section {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
margin-top: 60px;
|
||||||
|
padding-top: 20px;
|
||||||
|
border-top: 1px solid #ddd;
|
||||||
|
}
|
||||||
|
|
||||||
|
.signature-left,
|
||||||
|
.signature-right {
|
||||||
|
flex: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.signature-label {
|
||||||
|
font-size: 14px;
|
||||||
|
color: #666;
|
||||||
|
margin-bottom: 40px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.print-actions {
|
||||||
|
display: flex;
|
||||||
|
gap: 10px;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 打印样式 */
|
||||||
|
@media print {
|
||||||
|
/* 打印容器样式 - 确保正常显示 */
|
||||||
|
.print-container {
|
||||||
|
display: flex !important;
|
||||||
|
flex-direction: column !important;
|
||||||
|
align-items: center !important;
|
||||||
|
background: #fff !important;
|
||||||
|
padding: 20px !important;
|
||||||
|
margin: 0 !important;
|
||||||
|
width: 100% !important;
|
||||||
|
min-height: auto !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.print-content {
|
||||||
|
display: block !important;
|
||||||
|
background: #fff !important;
|
||||||
|
box-shadow: none !important;
|
||||||
|
padding: 40px 60px !important;
|
||||||
|
margin: 0 0 20px 0 !important;
|
||||||
|
max-width: 800px !important;
|
||||||
|
width: 100% !important;
|
||||||
|
font-size: 16px !important;
|
||||||
|
line-height: 1.8 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.divider-line {
|
||||||
|
margin: 20px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 隐藏打印按钮 */
|
||||||
|
.print-actions {
|
||||||
|
display: none !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
@page {
|
||||||
|
size: A4;
|
||||||
|
margin: 1.5cm;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 确保上下两部分在同一页 */
|
||||||
|
.stub-section,
|
||||||
|
.notice-section {
|
||||||
|
page-break-inside: avoid;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -172,16 +172,30 @@
|
|||||||
type="success"
|
type="success"
|
||||||
link
|
link
|
||||||
icon="CircleCheck"
|
icon="CircleCheck"
|
||||||
v-if="permissions.professional_professionaltitlerelation_exam && scope.row.state === '0'"
|
v-if="permissions.professional_professionaltitlerelation_exam && scope.row.canExam"
|
||||||
@click="changeState(scope.row, 1)">通过
|
@click="changeState(scope.row, 1)">通过
|
||||||
</el-button>
|
</el-button>
|
||||||
|
<el-button
|
||||||
|
type="success"
|
||||||
|
link
|
||||||
|
icon="CircleCheck"
|
||||||
|
v-if="permissions.professional_professionaltitlerelation_exam && scope.row.canDeptExam"
|
||||||
|
@click="changeState(scope.row, 1)">部门通过
|
||||||
|
</el-button>
|
||||||
<el-button
|
<el-button
|
||||||
type="danger"
|
type="danger"
|
||||||
link
|
link
|
||||||
icon="CircleClose"
|
icon="CircleClose"
|
||||||
v-if="permissions.professional_professionaltitlerelation_exam && (scope.row.state === '0' || scope.row.state === '1')"
|
v-if="permissions.professional_professionaltitlerelation_exam && scope.row.canBack"
|
||||||
@click="changeState(scope.row, -2)">驳回
|
@click="changeState(scope.row, -2)">驳回
|
||||||
</el-button>
|
</el-button>
|
||||||
|
<el-button
|
||||||
|
type="danger"
|
||||||
|
link
|
||||||
|
icon="CircleClose"
|
||||||
|
v-if="permissions.professional_professionaltitlerelation_exam && scope.row.canDeptBack"
|
||||||
|
@click="changeState(scope.row, -2)">部门驳回
|
||||||
|
</el-button>
|
||||||
<el-button
|
<el-button
|
||||||
type="danger"
|
type="danger"
|
||||||
link
|
link
|
||||||
|
|||||||
Reference in New Issue
Block a user