ren
This commit is contained in:
@@ -5,7 +5,7 @@
|
|||||||
:label="label"
|
:label="label"
|
||||||
v-bind="$attrs"
|
v-bind="$attrs"
|
||||||
>
|
>
|
||||||
<template v-for="(_, name) in $slots" :key="name" #[name]="slotProps">
|
<template v-for="(_, name) in $slots" #[name]="slotProps">
|
||||||
<slot :name="name" v-bind="slotProps" />
|
<slot :name="name" v-bind="slotProps" />
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
@@ -31,35 +31,13 @@ const isColumnVisible = inject<(propOrLabel: string) => boolean>('isColumnVisibl
|
|||||||
// 计算是否应该显示该列
|
// 计算是否应该显示该列
|
||||||
const shouldShow = computed(() => {
|
const shouldShow = computed(() => {
|
||||||
// 优先使用 prop,如果没有 prop 则使用 label
|
// 优先使用 prop,如果没有 prop 则使用 label
|
||||||
let key = props.prop || props.label || ''
|
const key = props.prop || props.label || ''
|
||||||
if (!key) {
|
if (!key) {
|
||||||
// 如果没有 prop 和 label,默认显示(可能是序号列等特殊列)
|
// 如果没有 prop 和 label,默认显示(可能是序号列等特殊列)
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
// 如果 key 是 label,尝试通过 labelToPropMap 映射到 prop
|
// isColumnVisible 函数会同时匹配 prop 和 label,所以直接传递即可
|
||||||
// 这样可以确保与 useTableColumns 的提取逻辑一致
|
|
||||||
if (!props.prop && props.label) {
|
|
||||||
const labelToPropMap: Record<string, string> = {
|
|
||||||
'是否退休': 'tied',
|
|
||||||
'姓名/工号': 'nameNo',
|
|
||||||
'性别': 'sex',
|
|
||||||
'部门': 'deptName',
|
|
||||||
'学历学位': 'dgreeName',
|
|
||||||
'职称等级': 'professionalTitle',
|
|
||||||
'岗位级别': 'stationLevelName',
|
|
||||||
'职业资格等级': 'levelName',
|
|
||||||
'职业资格工种': 'workName',
|
|
||||||
'用工性质': 'employmentNatureName',
|
|
||||||
'手机': 'telPhone',
|
|
||||||
'家庭住址': 'homeAddress',
|
|
||||||
'授课类型': 'teacherCate',
|
|
||||||
'操作': 'action',
|
|
||||||
}
|
|
||||||
// 如果 label 在映射表中,使用映射后的 prop;否则使用 label
|
|
||||||
key = labelToPropMap[props.label] || props.label
|
|
||||||
}
|
|
||||||
|
|
||||||
return isColumnVisible(key)
|
return isColumnVisible(key)
|
||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -2,36 +2,24 @@
|
|||||||
<div class="table-column-control">
|
<div class="table-column-control">
|
||||||
<el-button
|
<el-button
|
||||||
:type="triggerType"
|
:type="triggerType"
|
||||||
:icon="Setting"
|
:icon="slots.trigger ? undefined : Menu"
|
||||||
:size="triggerSize"
|
:size="triggerSize"
|
||||||
:circle="triggerCircle"
|
:circle="triggerCircle"
|
||||||
:link="triggerLink"
|
:link="triggerLink"
|
||||||
@click="visible = true"
|
@click="visible = true"
|
||||||
>
|
>
|
||||||
<slot name="trigger">
|
<slot name="trigger">
|
||||||
{{ triggerText || '列设置' }}
|
{{ triggerText || '列显隐' }}
|
||||||
</slot>
|
</slot>
|
||||||
</el-button>
|
</el-button>
|
||||||
|
|
||||||
<el-dialog
|
<el-dialog
|
||||||
v-model="visible"
|
v-model="visible"
|
||||||
title="列显示设置"
|
title="列显隐设置"
|
||||||
:width="dialogWidth"
|
:width="dialogWidth"
|
||||||
append-to-body
|
append-to-body
|
||||||
>
|
>
|
||||||
<div class="column-control-content">
|
<div class="column-control-content">
|
||||||
<div class="column-control-header">
|
|
||||||
<div class="header-actions">
|
|
||||||
<el-button
|
|
||||||
type="primary"
|
|
||||||
link
|
|
||||||
@click="handleToggleSelectAll"
|
|
||||||
>
|
|
||||||
{{ isAllSelected ? '取消全选' : '全选' }}
|
|
||||||
</el-button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="column-control-body">
|
<div class="column-control-body">
|
||||||
<el-checkbox-group v-model="checkedColumns" @change="handleColumnChange" class="column-checkbox-group">
|
<el-checkbox-group v-model="checkedColumns" @change="handleColumnChange" class="column-checkbox-group">
|
||||||
<div
|
<div
|
||||||
@@ -45,30 +33,25 @@
|
|||||||
>
|
>
|
||||||
{{ column.label }}
|
{{ column.label }}
|
||||||
</el-checkbox>
|
</el-checkbox>
|
||||||
<el-tag v-if="column.fixed !== undefined" size="small" type="info">
|
<!-- <el-tag v-if="column.fixed !== undefined" size="small" type="info">
|
||||||
{{ column.fixed === 'left' ? '固定左侧' : column.fixed === 'right' ? '固定右侧' : '固定' }}
|
{{ column.fixed === 'left' ? '固定左侧' : column.fixed === 'right' ? '固定右侧' : '固定' }}
|
||||||
</el-tag>
|
</el-tag> -->
|
||||||
</div>
|
</div>
|
||||||
</el-checkbox-group>
|
</el-checkbox-group>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<template #footer>
|
|
||||||
<div class="column-control-footer">
|
|
||||||
<el-button @click="handleReset">重置</el-button>
|
|
||||||
<el-button type="primary" @click="handleConfirm">确定</el-button>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
</el-dialog>
|
</el-dialog>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { ref, computed, watch, onMounted, nextTick, type Ref } from 'vue'
|
import { ref, computed, watch, onMounted, nextTick, useSlots, type Ref } from 'vue'
|
||||||
import { Setting } from '@element-plus/icons-vue'
|
import { Menu } from '@element-plus/icons-vue'
|
||||||
import type { TableInstance } from 'element-plus'
|
import type { TableInstance } from 'element-plus'
|
||||||
import { useTableColumns, type ColumnConfig } from '/@/composables/useTableColumns'
|
import { useTableColumns, type ColumnConfig } from '/@/composables/useTableColumns'
|
||||||
|
|
||||||
|
const slots = useSlots()
|
||||||
|
|
||||||
interface Column {
|
interface Column {
|
||||||
prop?: string
|
prop?: string
|
||||||
label: string
|
label: string
|
||||||
@@ -102,7 +85,7 @@ const props = withDefaults(defineProps<Props>(), {
|
|||||||
triggerCircle: false,
|
triggerCircle: false,
|
||||||
triggerText: '',
|
triggerText: '',
|
||||||
triggerLink: false,
|
triggerLink: false,
|
||||||
dialogWidth: '600px'
|
dialogWidth: '800px'
|
||||||
})
|
})
|
||||||
|
|
||||||
const emit = defineEmits<{
|
const emit = defineEmits<{
|
||||||
@@ -225,7 +208,6 @@ watch(actualColumns, (newColumns) => {
|
|||||||
|
|
||||||
// 监听弹窗打开,触发列配置重新提取
|
// 监听弹窗打开,触发列配置重新提取
|
||||||
watch(visible, (newVal) => {
|
watch(visible, (newVal) => {
|
||||||
console.log('[TableColumnControl] 弹窗状态变化:', newVal)
|
|
||||||
if (newVal) {
|
if (newVal) {
|
||||||
// 弹窗打开时,确保选中状态正确初始化(但不重置用户已保存的设置)
|
// 弹窗打开时,确保选中状态正确初始化(但不重置用户已保存的设置)
|
||||||
if (actualColumns.value.length > 0) {
|
if (actualColumns.value.length > 0) {
|
||||||
@@ -246,27 +228,20 @@ watch(visible, (newVal) => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (newVal && props.tableRef) {
|
if (newVal && props.tableRef) {
|
||||||
console.log('[TableColumnControl] 弹窗打开,tableRef 存在:', props.tableRef)
|
|
||||||
console.log('[TableColumnControl] tableRef.value:', props.tableRef.value)
|
|
||||||
console.log('[TableColumnControl] tableRef.value 类型:', typeof props.tableRef.value)
|
|
||||||
|
|
||||||
// 尝试多种方式获取表格实例
|
// 尝试多种方式获取表格实例
|
||||||
const getTableInstance = (): TableInstance | null => {
|
const getTableInstance = (): TableInstance | null => {
|
||||||
// 方法1: 直接从 props.tableRef.value 获取
|
// 方法1: 直接从 props.tableRef.value 获取
|
||||||
if (props.tableRef?.value) {
|
if (props.tableRef?.value) {
|
||||||
console.log('[TableColumnControl] 从 props.tableRef.value 获取表格实例')
|
|
||||||
return props.tableRef.value
|
return props.tableRef.value
|
||||||
}
|
}
|
||||||
|
|
||||||
// 方法2: 尝试从 props.tableRef 本身获取(可能是直接的 ref 对象)
|
// 方法2: 尝试从 props.tableRef 本身获取(可能是直接的 ref 对象)
|
||||||
if ((props.tableRef as any).value) {
|
if ((props.tableRef as any).value) {
|
||||||
console.log('[TableColumnControl] 从 props.tableRef 的 value 属性获取表格实例')
|
|
||||||
return (props.tableRef as any).value
|
return (props.tableRef as any).value
|
||||||
}
|
}
|
||||||
|
|
||||||
// 方法3: 如果 props.tableRef 本身就是表格实例(不应该发生,但作为备用)
|
// 方法3: 如果 props.tableRef 本身就是表格实例(不应该发生,但作为备用)
|
||||||
if ((props.tableRef as any).$el) {
|
if ((props.tableRef as any).$el) {
|
||||||
console.log('[TableColumnControl] props.tableRef 本身就是表格实例')
|
|
||||||
return props.tableRef as any
|
return props.tableRef as any
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -278,10 +253,8 @@ watch(visible, (newVal) => {
|
|||||||
if (tableInstance) {
|
if (tableInstance) {
|
||||||
const tableEl = (tableInstance as any).$el
|
const tableEl = (tableInstance as any).$el
|
||||||
if (tableEl) {
|
if (tableEl) {
|
||||||
console.log('[TableColumnControl] 表格实例已就绪,立即提取列配置')
|
|
||||||
nextTick(() => {
|
nextTick(() => {
|
||||||
refreshAutoColumns()
|
refreshAutoColumns()
|
||||||
console.log('[TableColumnControl] 刷新后列数:', actualColumns.value.length)
|
|
||||||
})
|
})
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -298,21 +271,16 @@ watch(visible, (newVal) => {
|
|||||||
if (tableInstance) {
|
if (tableInstance) {
|
||||||
const tableEl = (tableInstance as any).$el
|
const tableEl = (tableInstance as any).$el
|
||||||
if (tableEl) {
|
if (tableEl) {
|
||||||
console.log('[TableColumnControl] 表格实例已就绪,开始提取列配置')
|
|
||||||
nextTick(() => {
|
nextTick(() => {
|
||||||
refreshAutoColumns()
|
refreshAutoColumns()
|
||||||
console.log('[TableColumnControl] 刷新后列数:', actualColumns.value.length)
|
|
||||||
|
|
||||||
// 如果还是没有数据,多次重试
|
// 如果还是没有数据,多次重试
|
||||||
let retryCount = 0
|
let retryCount = 0
|
||||||
const maxRetries = 10
|
const maxRetries = 10
|
||||||
const retryInterval = setInterval(() => {
|
const retryInterval = setInterval(() => {
|
||||||
retryCount++
|
retryCount++
|
||||||
console.log(`[TableColumnControl] 第 ${retryCount} 次重试刷新列配置`)
|
|
||||||
refreshAutoColumns()
|
refreshAutoColumns()
|
||||||
console.log(`[TableColumnControl] 重试后列数:`, actualColumns.value.length)
|
|
||||||
if (actualColumns.value.length > 0 || retryCount >= maxRetries) {
|
if (actualColumns.value.length > 0 || retryCount >= maxRetries) {
|
||||||
console.log('[TableColumnControl] 停止重试,最终列数:', actualColumns.value.length)
|
|
||||||
clearInterval(retryInterval)
|
clearInterval(retryInterval)
|
||||||
}
|
}
|
||||||
}, 200)
|
}, 200)
|
||||||
@@ -324,16 +292,10 @@ watch(visible, (newVal) => {
|
|||||||
// 继续等待
|
// 继续等待
|
||||||
waitCount++
|
waitCount++
|
||||||
if (waitCount < maxWaitCount) {
|
if (waitCount < maxWaitCount) {
|
||||||
console.log(`[TableColumnControl] tableRef.value 还未就绪,等待中... (${waitCount}/${maxWaitCount})`)
|
|
||||||
waitTimer = setTimeout(waitForTableRef, 100)
|
waitTimer = setTimeout(waitForTableRef, 100)
|
||||||
} else {
|
} else {
|
||||||
console.warn('[TableColumnControl] 等待超时,tableRef.value 仍未就绪')
|
|
||||||
console.warn('[TableColumnControl] props.tableRef:', props.tableRef)
|
|
||||||
console.warn('[TableColumnControl] props.tableRef?.value:', props.tableRef?.value)
|
|
||||||
// 即使超时,也尝试提取一次(可能表格已经渲染了,只是 ref 没有正确绑定)
|
// 即使超时,也尝试提取一次(可能表格已经渲染了,只是 ref 没有正确绑定)
|
||||||
console.log('[TableColumnControl] 尝试强制提取列配置')
|
|
||||||
refreshAutoColumns()
|
refreshAutoColumns()
|
||||||
console.log('[TableColumnControl] 强制提取后列数:', actualColumns.value.length)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -349,8 +311,6 @@ watch(visible, (newVal) => {
|
|||||||
waitTimer = null
|
waitTimer = null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
console.warn('[TableColumnControl] 弹窗打开但 tableRef 不存在或为空')
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -368,16 +328,14 @@ if (props.tableRef) {
|
|||||||
return null
|
return null
|
||||||
}, (newVal, oldVal) => {
|
}, (newVal, oldVal) => {
|
||||||
if (newVal && newVal !== oldVal) {
|
if (newVal && newVal !== oldVal) {
|
||||||
console.log('[TableColumnControl] tableRef.value 已赋值,触发列配置提取')
|
|
||||||
// 延迟一下,确保表格完全渲染
|
// 延迟一下,确保表格完全渲染
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
nextTick(() => {
|
nextTick(() => {
|
||||||
refreshAutoColumns()
|
refreshAutoColumns()
|
||||||
console.log('[TableColumnControl] 列配置提取完成,列数:', actualColumns.value.length)
|
|
||||||
})
|
})
|
||||||
}, 200)
|
}, 200)
|
||||||
}
|
}
|
||||||
}, { immediate: true }) // 立即检查一次,如果 tableRef.value 已经有值,立即触发
|
}, { immediate: true })
|
||||||
}
|
}
|
||||||
|
|
||||||
// 暴露给父组件使用
|
// 暴露给父组件使用
|
||||||
@@ -387,54 +345,7 @@ defineExpose({
|
|||||||
refreshColumns: refreshAutoColumns
|
refreshColumns: refreshAutoColumns
|
||||||
})
|
})
|
||||||
|
|
||||||
// 获取默认显示的列(所有可隐藏的列)- 用于重置功能
|
// 列变化处理(实时生效)
|
||||||
const getDefaultColumns = (): string[] => {
|
|
||||||
return actualColumns.value
|
|
||||||
.filter(col => !col.alwaysShow && !col.fixed)
|
|
||||||
.map(col => col.prop || col.label)
|
|
||||||
}
|
|
||||||
|
|
||||||
// 获取所有可选择的列
|
|
||||||
const selectableColumns = computed(() => {
|
|
||||||
return actualColumns.value
|
|
||||||
.filter(col => !col.alwaysShow && !col.fixed)
|
|
||||||
.map(col => col.prop || col.label)
|
|
||||||
})
|
|
||||||
|
|
||||||
// 判断是否全选
|
|
||||||
const isAllSelected = computed(() => {
|
|
||||||
const selectable = selectableColumns.value
|
|
||||||
if (selectable.length === 0) return false
|
|
||||||
return selectable.every(col => checkedColumns.value.includes(col))
|
|
||||||
})
|
|
||||||
|
|
||||||
// 切换全选/全不选
|
|
||||||
const handleToggleSelectAll = () => {
|
|
||||||
if (isAllSelected.value) {
|
|
||||||
// 当前全选,执行全不选(但保留固定列和 alwaysShow 列)
|
|
||||||
const fixedAndAlwaysShow = actualColumns.value
|
|
||||||
.filter(col => col.alwaysShow || !!col.fixed)
|
|
||||||
.map(col => col.prop || col.label)
|
|
||||||
checkedColumns.value = [...fixedAndAlwaysShow]
|
|
||||||
} else {
|
|
||||||
// 当前未全选,执行全选(所有列)
|
|
||||||
checkedColumns.value = getAllColumns()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 重置为默认值
|
|
||||||
const handleReset = () => {
|
|
||||||
checkedColumns.value = getDefaultColumns()
|
|
||||||
handleColumnChange(checkedColumns.value)
|
|
||||||
}
|
|
||||||
|
|
||||||
// 确认
|
|
||||||
const handleConfirm = () => {
|
|
||||||
handleColumnChange(checkedColumns.value)
|
|
||||||
visible.value = false
|
|
||||||
}
|
|
||||||
|
|
||||||
// 列变化处理
|
|
||||||
const handleColumnChange = (value: string[]) => {
|
const handleColumnChange = (value: string[]) => {
|
||||||
// 确保固定列和 alwaysShow 列始终在选中列表中
|
// 确保固定列和 alwaysShow 列始终在选中列表中
|
||||||
const fixedAndAlwaysShow = actualColumns.value
|
const fixedAndAlwaysShow = actualColumns.value
|
||||||
@@ -442,6 +353,7 @@ const handleColumnChange = (value: string[]) => {
|
|||||||
.map(col => col.prop || col.label)
|
.map(col => col.prop || col.label)
|
||||||
const finalValue = [...new Set([...value, ...fixedAndAlwaysShow])]
|
const finalValue = [...new Set([...value, ...fixedAndAlwaysShow])]
|
||||||
|
|
||||||
|
// 立即应用更改
|
||||||
emit('update:modelValue', finalValue)
|
emit('update:modelValue', finalValue)
|
||||||
emit('change', finalValue)
|
emit('change', finalValue)
|
||||||
|
|
||||||
@@ -483,26 +395,6 @@ onMounted(() => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.column-control-content {
|
.column-control-content {
|
||||||
.column-control-header {
|
|
||||||
display: flex;
|
|
||||||
justify-content: space-between;
|
|
||||||
align-items: center;
|
|
||||||
padding-bottom: 12px;
|
|
||||||
margin-bottom: 12px;
|
|
||||||
border-bottom: 1px solid #ebeef5;
|
|
||||||
|
|
||||||
.header-title {
|
|
||||||
font-size: 14px;
|
|
||||||
font-weight: 600;
|
|
||||||
color: #303133;
|
|
||||||
}
|
|
||||||
|
|
||||||
.header-actions {
|
|
||||||
display: flex;
|
|
||||||
gap: 8px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.column-control-body {
|
.column-control-body {
|
||||||
max-height: 400px;
|
max-height: 400px;
|
||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
|
|||||||
@@ -53,24 +53,17 @@ export function useTableColumns(
|
|||||||
|
|
||||||
// 从 el-table 提取列配置
|
// 从 el-table 提取列配置
|
||||||
const extractColumns = (): ColumnConfig[] => {
|
const extractColumns = (): ColumnConfig[] => {
|
||||||
console.log('[useTableColumns] extractColumns 开始执行')
|
|
||||||
|
|
||||||
const tableInstance = getTableInstance()
|
const tableInstance = getTableInstance()
|
||||||
if (!tableInstance) {
|
if (!tableInstance) {
|
||||||
console.warn('[useTableColumns] tableRef.value 为空')
|
|
||||||
console.warn('[useTableColumns] tableRef:', tableRef)
|
|
||||||
console.warn('[useTableColumns] tableRef?.value:', tableRef?.value)
|
|
||||||
return []
|
return []
|
||||||
}
|
}
|
||||||
|
|
||||||
const table = tableInstance
|
const table = tableInstance
|
||||||
console.log('[useTableColumns] tableInstance 存在:', table)
|
|
||||||
const extracted: ColumnConfig[] = []
|
const extracted: ColumnConfig[] = []
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// 方法1: 从 table.store 中提取(Element Plus 内部实现)
|
// 方法1: 从 table.store 中提取(Element Plus 内部实现)
|
||||||
const store = (table as any).store
|
const store = (table as any).store
|
||||||
console.log('[useTableColumns] store:', store)
|
|
||||||
|
|
||||||
if (store) {
|
if (store) {
|
||||||
// 尝试多种路径访问列数据
|
// 尝试多种路径访问列数据
|
||||||
@@ -78,40 +71,24 @@ export function useTableColumns(
|
|||||||
|
|
||||||
if (store.states && store.states.columns) {
|
if (store.states && store.states.columns) {
|
||||||
tableColumns = store.states.columns.value || []
|
tableColumns = store.states.columns.value || []
|
||||||
console.log('[useTableColumns] 从 store.states.columns 获取到列数:', tableColumns.length)
|
|
||||||
console.log('[useTableColumns] store.states.columns 内容:', tableColumns)
|
|
||||||
} else if (store.columns) {
|
} else if (store.columns) {
|
||||||
tableColumns = Array.isArray(store.columns) ? store.columns : (store.columns.value || [])
|
tableColumns = Array.isArray(store.columns) ? store.columns : (store.columns.value || [])
|
||||||
console.log('[useTableColumns] 从 store.columns 获取到列数:', tableColumns.length)
|
|
||||||
} else if ((table as any).columns) {
|
} else if ((table as any).columns) {
|
||||||
tableColumns = Array.isArray((table as any).columns) ? (table as any).columns : ((table as any).columns.value || [])
|
tableColumns = Array.isArray((table as any).columns) ? (table as any).columns : ((table as any).columns.value || [])
|
||||||
console.log('[useTableColumns] 从 table.columns 获取到列数:', tableColumns.length)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tableColumns.length > 0) {
|
if (tableColumns.length > 0) {
|
||||||
tableColumns.forEach((col: any, idx: number) => {
|
tableColumns.forEach((col: any) => {
|
||||||
console.log(`[useTableColumns] store 列 ${idx}:`, {
|
|
||||||
type: col.type,
|
|
||||||
label: col.label,
|
|
||||||
property: col.property,
|
|
||||||
prop: col.prop,
|
|
||||||
fixed: col.fixed,
|
|
||||||
fullCol: col
|
|
||||||
})
|
|
||||||
|
|
||||||
// 跳过序号列
|
// 跳过序号列
|
||||||
if (col.type === 'index' || col.type === 'selection') {
|
if (col.type === 'index' || col.type === 'selection') {
|
||||||
console.log(`[useTableColumns] 列 ${idx} 被跳过(类型: ${col.type})`)
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// 尝试多种方式获取 label
|
// 尝试多种方式获取 label
|
||||||
const label = col.label || col.columnKey || col.property || col.prop || ''
|
const label = col.label || col.columnKey || col.property || col.prop || ''
|
||||||
|
|
||||||
// 如果没有 label,尝试从其他属性推断
|
// 如果没有 label,跳过这一列
|
||||||
if (!label) {
|
if (!label) {
|
||||||
console.log(`[useTableColumns] 列 ${idx} 没有 label,尝试从其他属性推断`)
|
|
||||||
// 如果还是没有,跳过这一列
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -140,22 +117,17 @@ export function useTableColumns(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
console.log(`[useTableColumns] 从 store 提取到列配置:`, config)
|
|
||||||
extracted.push(config)
|
extracted.push(config)
|
||||||
})
|
})
|
||||||
|
|
||||||
console.log('[useTableColumns] 从 store 总共提取到列数:', extracted.length)
|
|
||||||
if (extracted.length > 0) {
|
if (extracted.length > 0) {
|
||||||
return extracted
|
return extracted
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
console.warn('[useTableColumns] store 中没有找到列数据')
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 方法2: 从 DOM 中提取(备用方案,更可靠)
|
// 方法2: 从 DOM 中提取(备用方案,更可靠)
|
||||||
const tableEl = (table as any).$el
|
const tableEl = (table as any).$el
|
||||||
console.log('[useTableColumns] tableEl:', tableEl)
|
|
||||||
|
|
||||||
if (tableEl) {
|
if (tableEl) {
|
||||||
// 尝试多种选择器来查找表头
|
// 尝试多种选择器来查找表头
|
||||||
@@ -163,35 +135,27 @@ export function useTableColumns(
|
|||||||
|
|
||||||
// 方法2.1: 从主表格头部查找
|
// 方法2.1: 从主表格头部查找
|
||||||
const headerWrapper = tableEl.querySelector('.el-table__header-wrapper')
|
const headerWrapper = tableEl.querySelector('.el-table__header-wrapper')
|
||||||
console.log('[useTableColumns] headerWrapper:', headerWrapper)
|
|
||||||
if (headerWrapper) {
|
if (headerWrapper) {
|
||||||
columnHeaders = headerWrapper.querySelectorAll('th')
|
columnHeaders = headerWrapper.querySelectorAll('th')
|
||||||
console.log('[useTableColumns] 从 headerWrapper 找到列数:', columnHeaders?.length || 0)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 方法2.2: 如果找不到,从整个表格查找
|
// 方法2.2: 如果找不到,从整个表格查找
|
||||||
if (!columnHeaders || columnHeaders.length === 0) {
|
if (!columnHeaders || columnHeaders.length === 0) {
|
||||||
columnHeaders = tableEl.querySelectorAll('th')
|
columnHeaders = tableEl.querySelectorAll('th')
|
||||||
console.log('[useTableColumns] 从整个表格找到列数:', columnHeaders?.length || 0)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 方法2.3: 如果还是找不到,尝试查找固定列
|
// 方法2.3: 如果还是找不到,尝试查找固定列
|
||||||
if (!columnHeaders || columnHeaders.length === 0) {
|
if (!columnHeaders || columnHeaders.length === 0) {
|
||||||
const fixedLeft = tableEl.querySelector('.el-table__fixed-left')
|
const fixedLeft = tableEl.querySelector('.el-table__fixed-left')
|
||||||
console.log('[useTableColumns] fixedLeft:', fixedLeft)
|
|
||||||
if (fixedLeft) {
|
if (fixedLeft) {
|
||||||
columnHeaders = fixedLeft.querySelectorAll('th')
|
columnHeaders = fixedLeft.querySelectorAll('th')
|
||||||
console.log('[useTableColumns] 从 fixedLeft 找到列数:', columnHeaders?.length || 0)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!columnHeaders || columnHeaders.length === 0) {
|
if (!columnHeaders || columnHeaders.length === 0) {
|
||||||
console.warn('[useTableColumns] 未找到任何列头元素')
|
|
||||||
return []
|
return []
|
||||||
}
|
}
|
||||||
|
|
||||||
console.log('[useTableColumns] 最终找到列数量:', columnHeaders.length)
|
|
||||||
|
|
||||||
// 创建一个映射,通过列索引匹配 prop
|
// 创建一个映射,通过列索引匹配 prop
|
||||||
const propMap = new Map<number, string>()
|
const propMap = new Map<number, string>()
|
||||||
|
|
||||||
@@ -235,20 +199,8 @@ export function useTableColumns(
|
|||||||
|
|
||||||
const label = rawLabel.trim()
|
const label = rawLabel.trim()
|
||||||
|
|
||||||
// 调试:打印 th 的完整结构
|
|
||||||
console.log(`[useTableColumns] DOM 列 ${index}:`, {
|
|
||||||
label,
|
|
||||||
rawLabel,
|
|
||||||
thHTML: th.innerHTML.substring(0, 100),
|
|
||||||
hasCell: !!cell,
|
|
||||||
cellText: cell?.innerText || cell?.textContent || '',
|
|
||||||
thInnerText: th.innerText,
|
|
||||||
thTextContent: th.textContent
|
|
||||||
})
|
|
||||||
|
|
||||||
// 排除序号列和空列
|
// 排除序号列和空列
|
||||||
if (!label || label === '序号') {
|
if (!label || label === '序号') {
|
||||||
console.log(`[useTableColumns] 列 ${index} 被跳过(序号列或空列)`)
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -278,51 +230,30 @@ export function useTableColumns(
|
|||||||
// 尝试从对应的 body cell 中获取 data-key 或其他属性来匹配 prop
|
// 尝试从对应的 body cell 中获取 data-key 或其他属性来匹配 prop
|
||||||
let prop = propMap.get(index)
|
let prop = propMap.get(index)
|
||||||
|
|
||||||
// 如果没有找到 prop,尝试从 label 推断(简单匹配)
|
// 如果没有找到 prop,使用 label 作为 prop(isColumnVisible 会同时匹配 prop 和 label)
|
||||||
|
// 或者使用默认的 column_${index}
|
||||||
if (!prop) {
|
if (!prop) {
|
||||||
// 对于常见的列,可以通过 label 推断 prop
|
prop = `column_${index}`
|
||||||
const labelToPropMap: Record<string, string> = {
|
|
||||||
'是否退休': 'tied',
|
|
||||||
'姓名/工号': 'nameNo',
|
|
||||||
'性别': 'sex',
|
|
||||||
'部门': 'deptName',
|
|
||||||
'学历学位': 'dgreeName',
|
|
||||||
'职称等级': 'professionalTitle',
|
|
||||||
'岗位级别': 'stationLevelName',
|
|
||||||
'职业资格等级': 'levelName',
|
|
||||||
'职业资格工种': 'workName',
|
|
||||||
'用工性质': 'employmentNatureName',
|
|
||||||
'手机': 'telPhone',
|
|
||||||
'家庭住址': 'homeAddress',
|
|
||||||
'授课类型': 'teacherCate',
|
|
||||||
'操作': 'action',
|
|
||||||
}
|
|
||||||
prop = labelToPropMap[label]
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const columnConfig = {
|
const columnConfig = {
|
||||||
prop: prop || `column_${index}`,
|
prop: prop,
|
||||||
label,
|
label,
|
||||||
width,
|
width,
|
||||||
// DOM 提取的 fixed 只有 left/right,这里也归一为 undefined 或 'left'/'right'
|
// DOM 提取的 fixed 只有 left/right,这里也归一为 undefined 或 'left'/'right'
|
||||||
fixed: fixed ? fixed : undefined,
|
fixed: fixed ? fixed : undefined,
|
||||||
}
|
}
|
||||||
console.log(`[useTableColumns] 提取到列配置:`, columnConfig)
|
|
||||||
extracted.push(columnConfig)
|
extracted.push(columnConfig)
|
||||||
})
|
})
|
||||||
|
|
||||||
console.log('[useTableColumns] 总共提取到列数:', extracted.length)
|
|
||||||
if (extracted.length > 0) {
|
if (extracted.length > 0) {
|
||||||
console.log('[useTableColumns] 提取到的所有列:', extracted)
|
|
||||||
return extracted
|
return extracted
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
// 提取失败,输出错误信息
|
// 提取失败,静默处理
|
||||||
console.error('[useTableColumns] 提取列配置时出错:', error)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
console.warn('[useTableColumns] 提取失败,返回空数组')
|
|
||||||
return []
|
return []
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -418,8 +349,6 @@ export function useTableColumns(
|
|||||||
}
|
}
|
||||||
hasInitializedVisibleColumns.value = true
|
hasInitializedVisibleColumns.value = true
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
console.warn('[useTableColumns] initColumns: 提取失败,未设置 columns.value')
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -490,19 +419,17 @@ export function useTableColumns(
|
|||||||
return null
|
return null
|
||||||
}, (newVal, oldVal) => {
|
}, (newVal, oldVal) => {
|
||||||
if (newVal && newVal !== oldVal) {
|
if (newVal && newVal !== oldVal) {
|
||||||
console.log('[useTableColumns] tableRef.value 变化,开始提取列配置')
|
|
||||||
// 延迟一下,确保表格已经渲染
|
// 延迟一下,确保表格已经渲染
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
initColumns()
|
initColumns()
|
||||||
}, 200)
|
}, 200)
|
||||||
} else if (newVal && !oldVal) {
|
} else if (newVal && !oldVal) {
|
||||||
// 如果从 undefined 变为有值,也触发提取
|
// 如果从 undefined 变为有值,也触发提取
|
||||||
console.log('[useTableColumns] tableRef.value 从 undefined 变为有值,开始提取列配置')
|
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
initColumns()
|
initColumns()
|
||||||
}, 200)
|
}, 200)
|
||||||
}
|
}
|
||||||
}, { immediate: true }) // 改为 true,立即检查一次
|
}, { immediate: true })
|
||||||
|
|
||||||
// 组件挂载后初始化
|
// 组件挂载后初始化
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
@@ -513,8 +440,6 @@ export function useTableColumns(
|
|||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
initColumns()
|
initColumns()
|
||||||
}, 300)
|
}, 300)
|
||||||
} else {
|
|
||||||
console.log('[useTableColumns] onMounted: tableRef.value 还未就绪,等待 watch 触发')
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
@@ -96,7 +96,6 @@ service.interceptors.request.use(
|
|||||||
* @returns 如果响应成功,则返回响应的data属性;否则,抛出错误或者执行其他操作
|
* @returns 如果响应成功,则返回响应的data属性;否则,抛出错误或者执行其他操作
|
||||||
*/
|
*/
|
||||||
const handleResponse = (response: AxiosResponse<any>) => {
|
const handleResponse = (response: AxiosResponse<any>) => {
|
||||||
console.log("response",response)
|
|
||||||
if (response.data.code === 1) {
|
if (response.data.code === 1) {
|
||||||
throw response.data;
|
throw response.data;
|
||||||
}
|
}
|
||||||
@@ -114,7 +113,8 @@ const handleResponse = (response: AxiosResponse<any>) => {
|
|||||||
* 添加 Axios 的响应拦截器,用于全局响应结果处理
|
* 添加 Axios 的响应拦截器,用于全局响应结果处理
|
||||||
*/
|
*/
|
||||||
service.interceptors.response.use(handleResponse, (error) => {
|
service.interceptors.response.use(handleResponse, (error) => {
|
||||||
const status = Number(error.response.status) || 200;
|
// 处理 HTTP 错误
|
||||||
|
const status = Number(error.response?.status) || 200;
|
||||||
if (status === 423) {
|
if (status === 423) {
|
||||||
return Promise.reject({ msg: '"演示环境,仅供预览"' });
|
return Promise.reject({ msg: '"演示环境,仅供预览"' });
|
||||||
}
|
}
|
||||||
@@ -147,7 +147,7 @@ service.interceptors.response.use(handleResponse, (error) => {
|
|||||||
error.response.data = decrypt(error.response?.data.encryption);
|
error.response.data = decrypt(error.response?.data.encryption);
|
||||||
}
|
}
|
||||||
|
|
||||||
return Promise.reject(error.response.data);
|
return Promise.reject(error.response?.data);
|
||||||
});
|
});
|
||||||
|
|
||||||
// 导出 axios 实例
|
// 导出 axios 实例
|
||||||
|
|||||||
@@ -233,8 +233,9 @@ const handleSubmit = async () => {
|
|||||||
}
|
}
|
||||||
dialogVisible.value = false
|
dialogVisible.value = false
|
||||||
getDataList()
|
getDataList()
|
||||||
} catch (error) {
|
} catch (error: any) {
|
||||||
// 提交失败
|
// 处理业务错误
|
||||||
|
message.error(error.msg)
|
||||||
} finally {
|
} finally {
|
||||||
submitLoading.value = false
|
submitLoading.value = false
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
<div class="layout-padding">
|
<div class="layout-padding">
|
||||||
<div class="layout-padding-auto layout-padding-view">
|
<div class="layout-padding-auto layout-padding-view">
|
||||||
<!-- 搜索表单 -->
|
<!-- 搜索表单 -->
|
||||||
<el-row shadow="hover" v-show="showSearch" class="ml10">
|
<el-row shadow="hover" v-show="showSearch">
|
||||||
<el-form :model="state.queryForm" ref="queryRef" :inline="true" @keyup.enter="getDataList">
|
<el-form :model="state.queryForm" ref="queryRef" :inline="true" @keyup.enter="getDataList">
|
||||||
<el-form-item label="单位名称" prop="companyName">
|
<el-form-item label="单位名称" prop="companyName">
|
||||||
<el-input
|
<el-input
|
||||||
@@ -29,12 +29,6 @@
|
|||||||
@click="handleAdd"
|
@click="handleAdd"
|
||||||
v-if="permissions.professional_outercompany_add">新 增
|
v-if="permissions.professional_outercompany_add">新 增
|
||||||
</el-button>
|
</el-button>
|
||||||
<right-toolbar
|
|
||||||
v-model:showSearch="showSearch"
|
|
||||||
class="ml10"
|
|
||||||
style="float: right; margin-right: 20px"
|
|
||||||
@queryTable="getDataList"
|
|
||||||
></right-toolbar>
|
|
||||||
</div>
|
</div>
|
||||||
</el-row>
|
</el-row>
|
||||||
|
|
||||||
@@ -60,9 +54,9 @@
|
|||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
|
|
||||||
<el-table-column prop="updateTime" label="更新时间" width="180" align="center" />
|
<el-table-column prop="updateTime" label="更新时间" min-width="180" align="center" />
|
||||||
|
|
||||||
<el-table-column label="操作" width="150" align="center" fixed="right">
|
<el-table-column label="操作" min-width="150" align="center" fixed="right">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<el-button
|
<el-button
|
||||||
v-if="permissions.professional_outercompany_edit"
|
v-if="permissions.professional_outercompany_edit"
|
||||||
@@ -76,7 +70,6 @@
|
|||||||
icon="delete"
|
icon="delete"
|
||||||
link
|
link
|
||||||
type="primary"
|
type="primary"
|
||||||
style="margin-left: 12px"
|
|
||||||
@click="handleDel(scope.row)">删除
|
@click="handleDel(scope.row)">删除
|
||||||
</el-button>
|
</el-button>
|
||||||
</template>
|
</template>
|
||||||
@@ -286,8 +279,9 @@ const handleSubmit = async () => {
|
|||||||
}
|
}
|
||||||
dialogVisible.value = false
|
dialogVisible.value = false
|
||||||
getDataList()
|
getDataList()
|
||||||
} catch (error) {
|
} catch (error: any) {
|
||||||
// 提交失败
|
// 处理业务错误
|
||||||
|
message.error(error.msg)
|
||||||
} finally {
|
} finally {
|
||||||
submitLoading.value = false
|
submitLoading.value = false
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -286,8 +286,9 @@ const handleSubmit = async () => {
|
|||||||
}
|
}
|
||||||
dialogVisible.value = false
|
dialogVisible.value = false
|
||||||
getDataList()
|
getDataList()
|
||||||
} catch (error) {
|
} catch (error: any) {
|
||||||
// 提交失败
|
// 处理业务错误
|
||||||
|
message.error(error.msg)
|
||||||
} finally {
|
} finally {
|
||||||
submitLoading.value = false
|
submitLoading.value = false
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,25 +20,6 @@
|
|||||||
</el-form>
|
</el-form>
|
||||||
</el-row>
|
</el-row>
|
||||||
|
|
||||||
<!-- 操作按钮 -->
|
|
||||||
<el-row>
|
|
||||||
<div class="mb15" style="width: 100%;">
|
|
||||||
<!-- 新增按钮已注释,此页面为只读 -->
|
|
||||||
<!-- <el-button
|
|
||||||
type="primary"
|
|
||||||
icon="FolderAdd"
|
|
||||||
@click="handleAdd"
|
|
||||||
v-if="permissions.professional_outercompany_add">新 增
|
|
||||||
</el-button> -->
|
|
||||||
<right-toolbar
|
|
||||||
v-model:showSearch="showSearch"
|
|
||||||
class="ml10"
|
|
||||||
style="float: right; margin-right: 20px"
|
|
||||||
@queryTable="getDataList"
|
|
||||||
></right-toolbar>
|
|
||||||
</div>
|
|
||||||
</el-row>
|
|
||||||
|
|
||||||
<!-- 表格 -->
|
<!-- 表格 -->
|
||||||
<el-table
|
<el-table
|
||||||
ref="tableRef"
|
ref="tableRef"
|
||||||
@@ -61,7 +42,7 @@
|
|||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
|
|
||||||
<el-table-column prop="updateTime" label="更新时间" width="180" align="center" />
|
<el-table-column prop="updateTime" label="更新时间" min-width="180" align="center" />
|
||||||
|
|
||||||
<!-- 操作列已注释,此页面为只读 -->
|
<!-- 操作列已注释,此页面为只读 -->
|
||||||
<!-- <el-table-column label="操作" width="150" align="center" fixed="right">
|
<!-- <el-table-column label="操作" width="150" align="center" fixed="right">
|
||||||
|
|||||||
304
src/views/professional/outercompanyemployee/form.vue
Normal file
304
src/views/professional/outercompanyemployee/form.vue
Normal file
@@ -0,0 +1,304 @@
|
|||||||
|
<template>
|
||||||
|
<el-dialog
|
||||||
|
v-model="visible"
|
||||||
|
:title="formData.id ? '编辑' : '新增'"
|
||||||
|
width="800px"
|
||||||
|
:close-on-click-modal="false"
|
||||||
|
destroy-on-close
|
||||||
|
@close="handleClose"
|
||||||
|
>
|
||||||
|
<el-form
|
||||||
|
ref="formRef"
|
||||||
|
:model="formData"
|
||||||
|
:rules="formRules"
|
||||||
|
label-width="120px"
|
||||||
|
class="form-content"
|
||||||
|
>
|
||||||
|
<el-row :gutter="20">
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-form-item label="单位名称" prop="companyId">
|
||||||
|
<el-select
|
||||||
|
v-model="formData.companyId"
|
||||||
|
filterable
|
||||||
|
clearable
|
||||||
|
placeholder="请选择单位"
|
||||||
|
style="width: 100%"
|
||||||
|
>
|
||||||
|
<el-option
|
||||||
|
v-for="item in companyList"
|
||||||
|
:key="item.id"
|
||||||
|
:label="item.companyName"
|
||||||
|
:value="item.id"
|
||||||
|
/>
|
||||||
|
</el-select>
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-form-item label="职员编号" prop="employeeNo">
|
||||||
|
<el-input
|
||||||
|
v-model="formData.employeeNo"
|
||||||
|
placeholder="系统自动生成"
|
||||||
|
disabled
|
||||||
|
clearable
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
|
||||||
|
<el-row :gutter="20">
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-form-item label="姓名" prop="realName">
|
||||||
|
<el-input
|
||||||
|
v-model="formData.realName"
|
||||||
|
placeholder="请输入姓名"
|
||||||
|
clearable
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-form-item label="身份证" prop="idCard">
|
||||||
|
<el-input
|
||||||
|
v-model="formData.idCard"
|
||||||
|
placeholder="请输入身份证号"
|
||||||
|
clearable
|
||||||
|
maxlength="18"
|
||||||
|
@input="handleIdCardInput"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
|
||||||
|
<el-row :gutter="20">
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-form-item label="手机" prop="mobile">
|
||||||
|
<el-input
|
||||||
|
v-model="formData.mobile"
|
||||||
|
type="number"
|
||||||
|
placeholder="请输入手机号"
|
||||||
|
clearable
|
||||||
|
maxlength="11"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-form-item label="职位" prop="position">
|
||||||
|
<el-input
|
||||||
|
v-model="formData.position"
|
||||||
|
placeholder="请输入职位"
|
||||||
|
clearable
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
|
||||||
|
<el-row :gutter="20">
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-form-item label="家庭地址" prop="address">
|
||||||
|
<el-input
|
||||||
|
v-model="formData.address"
|
||||||
|
placeholder="请输入家庭地址"
|
||||||
|
clearable
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-form-item label="允许进出" prop="inoutFlag">
|
||||||
|
<el-select
|
||||||
|
v-model="formData.inoutFlag"
|
||||||
|
clearable
|
||||||
|
placeholder="请选择"
|
||||||
|
style="width: 100%"
|
||||||
|
>
|
||||||
|
<el-option
|
||||||
|
v-for="item in yesNoDict"
|
||||||
|
:key="item.value"
|
||||||
|
:label="item.label"
|
||||||
|
:value="item.value"
|
||||||
|
/>
|
||||||
|
</el-select>
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
|
||||||
|
<el-form-item label="备注" prop="remarks">
|
||||||
|
<el-input
|
||||||
|
v-model="formData.remarks"
|
||||||
|
type="textarea"
|
||||||
|
:rows="3"
|
||||||
|
placeholder="请输入备注"
|
||||||
|
clearable
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
|
||||||
|
<template #footer>
|
||||||
|
<div class="dialog-footer">
|
||||||
|
<el-button @click="handleClose">取消</el-button>
|
||||||
|
<el-button type="primary" @click="handleSubmit" :loading="submitLoading">确定</el-button>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</el-dialog>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { ref, watch } from 'vue'
|
||||||
|
import { useDict } from '/@/hooks/dict'
|
||||||
|
import { useMessage } from '/@/hooks/message'
|
||||||
|
import { addObj, putObj } from '/@/api/professional/stayschool/outercompanyemployee'
|
||||||
|
|
||||||
|
// Props
|
||||||
|
interface Props {
|
||||||
|
modelValue: boolean
|
||||||
|
formData: {
|
||||||
|
id?: string
|
||||||
|
companyId?: string
|
||||||
|
companyName?: string
|
||||||
|
employeeNo?: string
|
||||||
|
realName?: string
|
||||||
|
idCard?: string
|
||||||
|
mobile?: string
|
||||||
|
position?: string
|
||||||
|
address?: string
|
||||||
|
inoutFlag?: string
|
||||||
|
remarks?: string
|
||||||
|
}
|
||||||
|
companyList: any[]
|
||||||
|
}
|
||||||
|
|
||||||
|
const props = withDefaults(defineProps<Props>(), {
|
||||||
|
modelValue: false,
|
||||||
|
formData: () => ({
|
||||||
|
id: '',
|
||||||
|
companyId: '',
|
||||||
|
companyName: '',
|
||||||
|
employeeNo: '',
|
||||||
|
realName: '',
|
||||||
|
idCard: '',
|
||||||
|
mobile: '',
|
||||||
|
position: '',
|
||||||
|
address: '',
|
||||||
|
inoutFlag: '',
|
||||||
|
remarks: ''
|
||||||
|
}),
|
||||||
|
companyList: () => []
|
||||||
|
})
|
||||||
|
|
||||||
|
// Emits
|
||||||
|
const emit = defineEmits<{
|
||||||
|
(e: 'update:modelValue', value: boolean): void
|
||||||
|
(e: 'success'): void
|
||||||
|
}>()
|
||||||
|
|
||||||
|
// 字典数据
|
||||||
|
const { yes_no_type: yesNoDict } = useDict('yes_no_type')
|
||||||
|
|
||||||
|
// 消息提示
|
||||||
|
const message = useMessage()
|
||||||
|
|
||||||
|
// 表单引用
|
||||||
|
const formRef = ref()
|
||||||
|
|
||||||
|
// 提交加载状态
|
||||||
|
const submitLoading = ref(false)
|
||||||
|
|
||||||
|
// 弹窗显示状态
|
||||||
|
const visible = ref(false)
|
||||||
|
|
||||||
|
watch(() => props.modelValue, (val) => {
|
||||||
|
visible.value = val
|
||||||
|
})
|
||||||
|
|
||||||
|
watch(visible, (val) => {
|
||||||
|
emit('update:modelValue', val)
|
||||||
|
})
|
||||||
|
|
||||||
|
// 表单验证规则
|
||||||
|
const formRules = {
|
||||||
|
companyId: [
|
||||||
|
{ required: true, message: '请选择单位', trigger: 'change' }
|
||||||
|
],
|
||||||
|
realName: [
|
||||||
|
{ required: true, message: '请填写姓名', trigger: 'blur' }
|
||||||
|
],
|
||||||
|
idCard: [
|
||||||
|
{ required: true, message: '请输入正确身份证', trigger: 'blur' },
|
||||||
|
{ min: 15, max: 18, message: '长度在 15 到 18 个字符', trigger: 'blur' },
|
||||||
|
{ pattern: /^(\d{15}|\d{17}[\dXx])$/, message: '身份证号格式不正确(15位或18位,18位最后一位可以是X)', trigger: 'blur' }
|
||||||
|
],
|
||||||
|
mobile: [
|
||||||
|
{ required: true, message: '请填写手机号', trigger: 'blur' },
|
||||||
|
{ pattern: /^1[3-9]\d{9}$/, message: '请输入正确的手机号', trigger: 'blur' }
|
||||||
|
],
|
||||||
|
address: [
|
||||||
|
{ required: true, message: '请填写家庭住址', trigger: 'blur' }
|
||||||
|
],
|
||||||
|
inoutFlag: [
|
||||||
|
{ required: true, message: '请选择是否允许进出', trigger: 'change' }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
// 关闭弹窗
|
||||||
|
const handleClose = () => {
|
||||||
|
visible.value = false
|
||||||
|
formRef.value?.resetFields()
|
||||||
|
}
|
||||||
|
|
||||||
|
// 身份证号输入限制:只允许数字和X/x,最大长度18
|
||||||
|
const handleIdCardInput = (value: string) => {
|
||||||
|
// 只保留数字和X/x
|
||||||
|
const filtered = value.replace(/[^\dXx]/g, '')
|
||||||
|
if (filtered !== value) {
|
||||||
|
props.formData.idCard = filtered
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 提交表单
|
||||||
|
const handleSubmit = async () => {
|
||||||
|
if (!formRef.value) return
|
||||||
|
|
||||||
|
await formRef.value.validate(async (valid: boolean) => {
|
||||||
|
if (valid) {
|
||||||
|
submitLoading.value = true
|
||||||
|
try {
|
||||||
|
// 设置单位名称
|
||||||
|
const selectedCompany = props.companyList.find(item => item.id === props.formData.companyId)
|
||||||
|
const submitData = {
|
||||||
|
...props.formData,
|
||||||
|
companyName: selectedCompany?.companyName || ''
|
||||||
|
}
|
||||||
|
|
||||||
|
if (props.formData.id) {
|
||||||
|
await putObj(submitData)
|
||||||
|
message.success('修改成功')
|
||||||
|
} else {
|
||||||
|
await addObj(submitData)
|
||||||
|
message.success('添加成功')
|
||||||
|
}
|
||||||
|
handleClose()
|
||||||
|
emit('success')
|
||||||
|
} catch (error: any) {
|
||||||
|
message.error(error?.msg || '操作失败')
|
||||||
|
} finally {
|
||||||
|
submitLoading.value = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.form-content {
|
||||||
|
:deep(.el-row) {
|
||||||
|
margin-bottom: 18px;
|
||||||
|
|
||||||
|
&:last-child {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.el-row .el-form-item) {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
<div class="layout-padding">
|
<div class="layout-padding">
|
||||||
<div class="layout-padding-auto layout-padding-view">
|
<div class="layout-padding-auto layout-padding-view">
|
||||||
<!-- 搜索表单 -->
|
<!-- 搜索表单 -->
|
||||||
<el-row shadow="hover" v-show="showSearch" class="ml10">
|
<el-row shadow="hover" v-show="showSearch">
|
||||||
<el-form :model="state.queryForm" ref="queryRef" :inline="true" @keyup.enter="handleFilter">
|
<el-form :model="state.queryForm" ref="queryRef" :inline="true" @keyup.enter="handleFilter">
|
||||||
<el-form-item label="单位名称" prop="companyId">
|
<el-form-item label="单位名称" prop="companyId">
|
||||||
<el-select
|
<el-select
|
||||||
@@ -10,7 +10,6 @@
|
|||||||
filterable
|
filterable
|
||||||
clearable
|
clearable
|
||||||
placeholder="请选择单位"
|
placeholder="请选择单位"
|
||||||
style="width: 200px"
|
|
||||||
>
|
>
|
||||||
<el-option
|
<el-option
|
||||||
v-for="item in companyList"
|
v-for="item in companyList"
|
||||||
@@ -25,7 +24,6 @@
|
|||||||
v-model="state.queryForm.employeeNo"
|
v-model="state.queryForm.employeeNo"
|
||||||
placeholder="请输入职员编号"
|
placeholder="请输入职员编号"
|
||||||
clearable
|
clearable
|
||||||
style="width: 200px"
|
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="姓名" prop="realName">
|
<el-form-item label="姓名" prop="realName">
|
||||||
@@ -33,7 +31,6 @@
|
|||||||
v-model="state.queryForm.realName"
|
v-model="state.queryForm.realName"
|
||||||
placeholder="请输入姓名"
|
placeholder="请输入姓名"
|
||||||
clearable
|
clearable
|
||||||
style="width: 200px"
|
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="身份证" prop="idCard">
|
<el-form-item label="身份证" prop="idCard">
|
||||||
@@ -41,7 +38,6 @@
|
|||||||
v-model="state.queryForm.idCard"
|
v-model="state.queryForm.idCard"
|
||||||
placeholder="请输入身份证"
|
placeholder="请输入身份证"
|
||||||
clearable
|
clearable
|
||||||
style="width: 200px"
|
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="手机" prop="mobile">
|
<el-form-item label="手机" prop="mobile">
|
||||||
@@ -49,7 +45,6 @@
|
|||||||
v-model="state.queryForm.mobile"
|
v-model="state.queryForm.mobile"
|
||||||
placeholder="请输入手机"
|
placeholder="请输入手机"
|
||||||
clearable
|
clearable
|
||||||
style="width: 200px"
|
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="允许进出" prop="inoutFlag">
|
<el-form-item label="允许进出" prop="inoutFlag">
|
||||||
@@ -57,7 +52,6 @@
|
|||||||
v-model="state.queryForm.inoutFlag"
|
v-model="state.queryForm.inoutFlag"
|
||||||
clearable
|
clearable
|
||||||
placeholder="请选择"
|
placeholder="请选择"
|
||||||
style="width: 200px"
|
|
||||||
>
|
>
|
||||||
<el-option
|
<el-option
|
||||||
v-for="item in yesNoDict"
|
v-for="item in yesNoDict"
|
||||||
@@ -68,43 +62,45 @@
|
|||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item>
|
<el-form-item>
|
||||||
<el-button icon="search" type="primary" @click="handleFilter">查询</el-button>
|
<el-button type="primary" @click="handleFilter" icon="Search">查询</el-button>
|
||||||
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
|
<el-button @click="resetQuery" icon="Refresh">重置</el-button>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-form>
|
</el-form>
|
||||||
</el-row>
|
</el-row>
|
||||||
|
|
||||||
<!-- 操作按钮 -->
|
<!-- 操作按钮 -->
|
||||||
<el-row>
|
<el-row>
|
||||||
<div class="mb15" style="width: 100%;">
|
<div class="mb15">
|
||||||
<el-button
|
<el-button
|
||||||
type="primary"
|
type="primary"
|
||||||
icon="FolderAdd"
|
icon="Plus"
|
||||||
@click="handleAdd"
|
@click="handleAdd"
|
||||||
v-if="permissions.professional_outercompanyemployee_add">新 增
|
v-if="permissions.professional_outercompanyemployee_add">新 增
|
||||||
</el-button>
|
</el-button>
|
||||||
<el-button
|
<el-button
|
||||||
type="primary"
|
type="primary"
|
||||||
|
plain
|
||||||
|
icon="UploadFilled"
|
||||||
|
class="ml10"
|
||||||
@click="handleExportIn"
|
@click="handleExportIn"
|
||||||
v-if="permission.scope == '1'"
|
v-if="permission.scope == '1'"
|
||||||
>导 入
|
>导 入
|
||||||
</el-button>
|
</el-button>
|
||||||
<el-button
|
<el-button
|
||||||
type="warning"
|
type="warning"
|
||||||
|
plain
|
||||||
|
icon="Download"
|
||||||
|
class="ml10"
|
||||||
@click="handleExportScore"
|
@click="handleExportScore"
|
||||||
:loading="exportLoading"
|
:loading="exportLoading">导出
|
||||||
icon="Download">导出
|
|
||||||
</el-button>
|
</el-button>
|
||||||
<el-button
|
<el-button
|
||||||
type="primary"
|
type="danger"
|
||||||
|
plain
|
||||||
|
icon="Delete"
|
||||||
|
class="ml10"
|
||||||
@click="batchDelect">批量删除
|
@click="batchDelect">批量删除
|
||||||
</el-button>
|
</el-button>
|
||||||
<right-toolbar
|
|
||||||
v-model:showSearch="showSearch"
|
|
||||||
class="ml10"
|
|
||||||
style="float: right; margin-right: 20px"
|
|
||||||
@queryTable="getDataList"
|
|
||||||
></right-toolbar>
|
|
||||||
</div>
|
</div>
|
||||||
</el-row>
|
</el-row>
|
||||||
|
|
||||||
@@ -190,139 +186,12 @@
|
|||||||
/>
|
/>
|
||||||
|
|
||||||
<!-- 新增/编辑弹窗 -->
|
<!-- 新增/编辑弹窗 -->
|
||||||
<el-dialog
|
<form-dialog
|
||||||
v-model="dialogVisible"
|
v-model="dialogVisible"
|
||||||
:title="form.id ? '编辑' : '新增'"
|
:form-data="form"
|
||||||
width="800px"
|
:company-list="companyList"
|
||||||
:close-on-click-modal="false"
|
@success="handleFormSuccess"
|
||||||
destroy-on-close
|
/>
|
||||||
>
|
|
||||||
<el-form
|
|
||||||
ref="formRef"
|
|
||||||
:model="form"
|
|
||||||
:rules="formRules"
|
|
||||||
label-width="120px"
|
|
||||||
>
|
|
||||||
<el-row :gutter="20">
|
|
||||||
<el-col :span="12">
|
|
||||||
<el-form-item label="单位名称" prop="companyId">
|
|
||||||
<el-select
|
|
||||||
v-model="form.companyId"
|
|
||||||
filterable
|
|
||||||
clearable
|
|
||||||
placeholder="请选择单位"
|
|
||||||
style="width: 100%"
|
|
||||||
>
|
|
||||||
<el-option
|
|
||||||
v-for="item in companyList"
|
|
||||||
:key="item.id"
|
|
||||||
:label="item.companyName"
|
|
||||||
:value="item.id"
|
|
||||||
/>
|
|
||||||
</el-select>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
<el-col :span="12">
|
|
||||||
<el-form-item label="职员编号" prop="employeeNo">
|
|
||||||
<el-input
|
|
||||||
v-model="form.employeeNo"
|
|
||||||
placeholder="系统自动生成"
|
|
||||||
disabled
|
|
||||||
clearable
|
|
||||||
/>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
</el-row>
|
|
||||||
|
|
||||||
<el-row :gutter="20">
|
|
||||||
<el-col :span="12">
|
|
||||||
<el-form-item label="姓名" prop="realName">
|
|
||||||
<el-input
|
|
||||||
v-model="form.realName"
|
|
||||||
placeholder="请输入姓名"
|
|
||||||
clearable
|
|
||||||
/>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
<el-col :span="12">
|
|
||||||
<el-form-item label="身份证" prop="idCard">
|
|
||||||
<el-input
|
|
||||||
v-model="form.idCard"
|
|
||||||
placeholder="请输入身份证号"
|
|
||||||
clearable
|
|
||||||
/>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
</el-row>
|
|
||||||
|
|
||||||
<el-row :gutter="20">
|
|
||||||
<el-col :span="12">
|
|
||||||
<el-form-item label="手机" prop="mobile">
|
|
||||||
<el-input
|
|
||||||
v-model="form.mobile"
|
|
||||||
placeholder="请输入手机号"
|
|
||||||
clearable
|
|
||||||
/>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
<el-col :span="12">
|
|
||||||
<el-form-item label="职位" prop="position">
|
|
||||||
<el-input
|
|
||||||
v-model="form.position"
|
|
||||||
placeholder="请输入职位"
|
|
||||||
clearable
|
|
||||||
/>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
</el-row>
|
|
||||||
|
|
||||||
<el-row :gutter="20">
|
|
||||||
<el-col :span="12">
|
|
||||||
<el-form-item label="家庭地址" prop="address">
|
|
||||||
<el-input
|
|
||||||
v-model="form.address"
|
|
||||||
placeholder="请输入家庭地址"
|
|
||||||
clearable
|
|
||||||
/>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
<el-col :span="12">
|
|
||||||
<el-form-item label="允许进出" prop="inoutFlag">
|
|
||||||
<el-select
|
|
||||||
v-model="form.inoutFlag"
|
|
||||||
clearable
|
|
||||||
placeholder="请选择"
|
|
||||||
style="width: 100%"
|
|
||||||
>
|
|
||||||
<el-option
|
|
||||||
v-for="item in yesNoDict"
|
|
||||||
:key="item.value"
|
|
||||||
:label="item.label"
|
|
||||||
:value="item.value"
|
|
||||||
/>
|
|
||||||
</el-select>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
</el-row>
|
|
||||||
|
|
||||||
<el-form-item label="备注" prop="remarks">
|
|
||||||
<el-input
|
|
||||||
v-model="form.remarks"
|
|
||||||
type="textarea"
|
|
||||||
:rows="3"
|
|
||||||
placeholder="请输入备注"
|
|
||||||
clearable
|
|
||||||
/>
|
|
||||||
</el-form-item>
|
|
||||||
</el-form>
|
|
||||||
|
|
||||||
<template #footer>
|
|
||||||
<div class="dialog-footer">
|
|
||||||
<el-button @click="dialogVisible = false">取消</el-button>
|
|
||||||
<el-button type="primary" @click="handleSubmit" :loading="submitLoading">确定</el-button>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
</el-dialog>
|
|
||||||
|
|
||||||
<!-- 头像预览对话框 -->
|
<!-- 头像预览对话框 -->
|
||||||
<el-dialog v-model="dialogUploadVisible" title="头像预览" append-to-body>
|
<el-dialog v-model="dialogUploadVisible" title="头像预览" append-to-body>
|
||||||
@@ -400,13 +269,12 @@ import { Plus } from '@element-plus/icons-vue'
|
|||||||
import {
|
import {
|
||||||
fetchList,
|
fetchList,
|
||||||
getObj,
|
getObj,
|
||||||
addObj,
|
|
||||||
putObj,
|
|
||||||
delObj,
|
delObj,
|
||||||
batchDel,
|
batchDel,
|
||||||
resetPassWord
|
resetPassWord
|
||||||
} from '/@/api/professional/stayschool/outercompanyemployee'
|
} from '/@/api/professional/stayschool/outercompanyemployee'
|
||||||
import { getList as getCompanyList } from '/@/api/professional/stayschool/outercompany'
|
import { getList as getCompanyList } from '/@/api/professional/stayschool/outercompany'
|
||||||
|
import FormDialog from './form.vue'
|
||||||
|
|
||||||
// 使用 Pinia store
|
// 使用 Pinia store
|
||||||
const userInfoStore = useUserInfo()
|
const userInfoStore = useUserInfo()
|
||||||
@@ -436,7 +304,6 @@ const getDictLabel = (value: string | number) => {
|
|||||||
|
|
||||||
// 表格引用
|
// 表格引用
|
||||||
const tableRef = ref()
|
const tableRef = ref()
|
||||||
const formRef = ref()
|
|
||||||
const queryRef = ref()
|
const queryRef = ref()
|
||||||
const uploadFormRef = ref()
|
const uploadFormRef = ref()
|
||||||
|
|
||||||
@@ -448,7 +315,6 @@ const dialogVisible = ref(false)
|
|||||||
const dialogUploadVisible = ref(false)
|
const dialogUploadVisible = ref(false)
|
||||||
const dialogAvatarVisible = ref(false)
|
const dialogAvatarVisible = ref(false)
|
||||||
const dialogViewVisible = ref(false)
|
const dialogViewVisible = ref(false)
|
||||||
const submitLoading = ref(false)
|
|
||||||
const exportLoading = ref(false)
|
const exportLoading = ref(false)
|
||||||
|
|
||||||
// 选中的行数据
|
// 选中的行数据
|
||||||
@@ -476,28 +342,6 @@ const form = reactive({
|
|||||||
remarks: ''
|
remarks: ''
|
||||||
})
|
})
|
||||||
|
|
||||||
// 表单验证规则
|
|
||||||
const formRules = {
|
|
||||||
companyId: [
|
|
||||||
{ required: true, message: '请选择单位', trigger: 'change' }
|
|
||||||
],
|
|
||||||
realName: [
|
|
||||||
{ required: true, message: '请填写姓名', trigger: 'blur' }
|
|
||||||
],
|
|
||||||
idCard: [
|
|
||||||
{ required: true, message: '请填写身份证号', trigger: 'blur' }
|
|
||||||
],
|
|
||||||
mobile: [
|
|
||||||
{ required: true, message: '请填写手机号', trigger: 'blur' }
|
|
||||||
],
|
|
||||||
address: [
|
|
||||||
{ required: true, message: '请填写家庭住址', trigger: 'blur' }
|
|
||||||
],
|
|
||||||
inoutFlag: [
|
|
||||||
{ required: true, message: '请选择是否允许进出', trigger: 'change' }
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
// 头像相关
|
// 头像相关
|
||||||
const dialogImageUrl = ref('')
|
const dialogImageUrl = ref('')
|
||||||
const fileList = ref<any[]>([])
|
const fileList = ref<any[]>([])
|
||||||
@@ -665,36 +509,9 @@ const resetPassword = (row: any) => {
|
|||||||
}).catch(() => {})
|
}).catch(() => {})
|
||||||
}
|
}
|
||||||
|
|
||||||
// 提交表单
|
// 表单提交成功回调
|
||||||
const handleSubmit = async () => {
|
const handleFormSuccess = () => {
|
||||||
if (!formRef.value) return
|
getDataList()
|
||||||
|
|
||||||
await formRef.value.validate(async (valid: boolean) => {
|
|
||||||
if (valid) {
|
|
||||||
submitLoading.value = true
|
|
||||||
try {
|
|
||||||
// 设置单位名称
|
|
||||||
const selectedCompany = companyList.value.find(item => item.id === form.companyId)
|
|
||||||
if (selectedCompany) {
|
|
||||||
form.companyName = selectedCompany.companyName
|
|
||||||
}
|
|
||||||
|
|
||||||
if (form.id) {
|
|
||||||
await putObj(form)
|
|
||||||
message.success('修改成功')
|
|
||||||
} else {
|
|
||||||
await addObj(form)
|
|
||||||
message.success('添加成功')
|
|
||||||
}
|
|
||||||
dialogVisible.value = false
|
|
||||||
getDataList()
|
|
||||||
} catch (error: any) {
|
|
||||||
message.error(error?.msg || '操作失败')
|
|
||||||
} finally {
|
|
||||||
submitLoading.value = false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取图片 URL
|
// 获取图片 URL
|
||||||
|
|||||||
@@ -690,7 +690,7 @@ const handleSubmit = async () => {
|
|||||||
dialogVisible.value = false
|
dialogVisible.value = false
|
||||||
getDataList()
|
getDataList()
|
||||||
} catch (error: any) {
|
} catch (error: any) {
|
||||||
message.error(error?.msg || '操作失败')
|
message.error(error.msg)
|
||||||
} finally {
|
} finally {
|
||||||
submitLoading.value = false
|
submitLoading.value = false
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -648,7 +648,7 @@ const handleSubmit = async () => {
|
|||||||
dialogVisible.value = false
|
dialogVisible.value = false
|
||||||
getDataList()
|
getDataList()
|
||||||
} catch (error: any) {
|
} catch (error: any) {
|
||||||
message.error(error?.msg || '操作失败')
|
message.error(error.msg)
|
||||||
} finally {
|
} finally {
|
||||||
submitLoading.value = false
|
submitLoading.value = false
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -233,8 +233,9 @@ const handleSubmit = async () => {
|
|||||||
}
|
}
|
||||||
dialogVisible.value = false
|
dialogVisible.value = false
|
||||||
getDataList()
|
getDataList()
|
||||||
} catch (error) {
|
} catch (error: any) {
|
||||||
// 提交失败
|
// 处理业务错误
|
||||||
|
message.error(error.msg)
|
||||||
} finally {
|
} finally {
|
||||||
submitLoading.value = false
|
submitLoading.value = false
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -233,8 +233,9 @@ const handleSubmit = async () => {
|
|||||||
}
|
}
|
||||||
dialogVisible.value = false
|
dialogVisible.value = false
|
||||||
getDataList()
|
getDataList()
|
||||||
} catch (error) {
|
} catch (error: any) {
|
||||||
// 提交失败
|
// 处理业务错误
|
||||||
|
message.error(error.msg)
|
||||||
} finally {
|
} finally {
|
||||||
submitLoading.value = false
|
submitLoading.value = false
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -233,8 +233,9 @@ const handleSubmit = async () => {
|
|||||||
}
|
}
|
||||||
dialogVisible.value = false
|
dialogVisible.value = false
|
||||||
getDataList()
|
getDataList()
|
||||||
} catch (error) {
|
} catch (error: any) {
|
||||||
// 提交失败
|
// 处理业务错误
|
||||||
|
message.error(error.msg)
|
||||||
} finally {
|
} finally {
|
||||||
submitLoading.value = false
|
submitLoading.value = false
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -233,8 +233,9 @@ const handleSubmit = async () => {
|
|||||||
}
|
}
|
||||||
dialogVisible.value = false
|
dialogVisible.value = false
|
||||||
getDataList()
|
getDataList()
|
||||||
} catch (error) {
|
} catch (error: any) {
|
||||||
// 提交失败
|
// 处理业务错误
|
||||||
|
message.error(error.msg)
|
||||||
} finally {
|
} finally {
|
||||||
submitLoading.value = false
|
submitLoading.value = false
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -233,8 +233,9 @@ const handleSubmit = async () => {
|
|||||||
}
|
}
|
||||||
dialogVisible.value = false
|
dialogVisible.value = false
|
||||||
getDataList()
|
getDataList()
|
||||||
} catch (error) {
|
} catch (error: any) {
|
||||||
// 提交失败
|
// 处理业务错误
|
||||||
|
message.error(error.msg)
|
||||||
} finally {
|
} finally {
|
||||||
submitLoading.value = false
|
submitLoading.value = false
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -233,8 +233,9 @@ const handleSubmit = async () => {
|
|||||||
}
|
}
|
||||||
dialogVisible.value = false
|
dialogVisible.value = false
|
||||||
getDataList()
|
getDataList()
|
||||||
} catch (error) {
|
} catch (error: any) {
|
||||||
// 提交失败
|
// 处理业务错误
|
||||||
|
message.error(error.msg)
|
||||||
} finally {
|
} finally {
|
||||||
submitLoading.value = false
|
submitLoading.value = false
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -232,8 +232,9 @@ const handleSubmit = async () => {
|
|||||||
}
|
}
|
||||||
dialogVisible.value = false
|
dialogVisible.value = false
|
||||||
getDataList()
|
getDataList()
|
||||||
} catch (error) {
|
} catch (error: any) {
|
||||||
// 提交失败
|
// 处理业务错误
|
||||||
|
message.error(error.msg)
|
||||||
} finally {
|
} finally {
|
||||||
submitLoading.value = false
|
submitLoading.value = false
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -66,7 +66,7 @@
|
|||||||
|
|
||||||
<el-table-column prop="changeTime" label="变动时间" width="180" align="center" />
|
<el-table-column prop="changeTime" label="变动时间" width="180" align="center" />
|
||||||
|
|
||||||
<el-table-column prop="createTime" label="创建时间" width="180" align="center" />
|
<!-- <el-table-column prop="createTime" label="创建时间" width="180" align="center" /> -->
|
||||||
|
|
||||||
<el-table-column prop="remarks" label="备注" min-width="200" align="center" show-overflow-tooltip />
|
<el-table-column prop="remarks" label="备注" min-width="200" align="center" show-overflow-tooltip />
|
||||||
</el-table>
|
</el-table>
|
||||||
|
|||||||
@@ -233,8 +233,9 @@ const handleSubmit = async () => {
|
|||||||
}
|
}
|
||||||
dialogVisible.value = false
|
dialogVisible.value = false
|
||||||
getDataList()
|
getDataList()
|
||||||
} catch (error) {
|
} catch (error: any) {
|
||||||
// 提交失败
|
// 处理业务错误
|
||||||
|
message.error(error.msg)
|
||||||
} finally {
|
} finally {
|
||||||
submitLoading.value = false
|
submitLoading.value = false
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -307,8 +307,9 @@ const changeState = (row: any, val: number) => {
|
|||||||
})
|
})
|
||||||
message.success('操作成功')
|
message.success('操作成功')
|
||||||
getDataList()
|
getDataList()
|
||||||
} catch (error) {
|
} catch (error: any) {
|
||||||
// Failed to change state
|
// 处理业务错误
|
||||||
|
message.error(error.msg)
|
||||||
}
|
}
|
||||||
}).catch(() => {})
|
}).catch(() => {})
|
||||||
} else if (val === -2) {
|
} else if (val === -2) {
|
||||||
@@ -354,8 +355,9 @@ const handleDel = (row: any) => {
|
|||||||
state.pagination.current = state.pagination.current - 1
|
state.pagination.current = state.pagination.current - 1
|
||||||
}
|
}
|
||||||
getDataList()
|
getDataList()
|
||||||
} catch (error) {
|
} catch (error: any) {
|
||||||
// Failed to delete
|
// 处理业务错误
|
||||||
|
message.error(error.msg)
|
||||||
}
|
}
|
||||||
}).catch(() => {})
|
}).catch(() => {})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -233,8 +233,9 @@ const handleSubmit = async () => {
|
|||||||
}
|
}
|
||||||
dialogVisible.value = false
|
dialogVisible.value = false
|
||||||
getDataList()
|
getDataList()
|
||||||
} catch (error) {
|
} catch (error: any) {
|
||||||
// 提交失败
|
// 处理业务错误
|
||||||
|
message.error(error.msg)
|
||||||
} finally {
|
} finally {
|
||||||
submitLoading.value = false
|
submitLoading.value = false
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -233,8 +233,9 @@ const handleSubmit = async () => {
|
|||||||
}
|
}
|
||||||
dialogVisible.value = false
|
dialogVisible.value = false
|
||||||
getDataList()
|
getDataList()
|
||||||
} catch (error) {
|
} catch (error: any) {
|
||||||
// 提交失败
|
// 处理业务错误
|
||||||
|
message.error(error.msg)
|
||||||
} finally {
|
} finally {
|
||||||
submitLoading.value = false
|
submitLoading.value = false
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -347,8 +347,9 @@ const changeState = (row: any, val: number) => {
|
|||||||
})
|
})
|
||||||
message.success('操作成功')
|
message.success('操作成功')
|
||||||
getDataList()
|
getDataList()
|
||||||
} catch (error) {
|
} catch (error: any) {
|
||||||
// Failed to change state
|
// 处理业务错误
|
||||||
|
message.error(error.msg)
|
||||||
}
|
}
|
||||||
}).catch(() => {})
|
}).catch(() => {})
|
||||||
} else if (val === -2) {
|
} else if (val === -2) {
|
||||||
@@ -393,8 +394,9 @@ const handleDel = (row: any) => {
|
|||||||
state.pagination.current = state.pagination.current - 1
|
state.pagination.current = state.pagination.current - 1
|
||||||
}
|
}
|
||||||
getDataList()
|
getDataList()
|
||||||
} catch (error) {
|
} catch (error: any) {
|
||||||
// Failed to delete
|
// 处理业务错误
|
||||||
|
message.error(error.msg)
|
||||||
}
|
}
|
||||||
}).catch(() => {})
|
}).catch(() => {})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -233,8 +233,9 @@ const handleSubmit = async () => {
|
|||||||
}
|
}
|
||||||
dialogVisible.value = false
|
dialogVisible.value = false
|
||||||
getDataList()
|
getDataList()
|
||||||
} catch (error) {
|
} catch (error: any) {
|
||||||
// 提交失败
|
// 处理业务错误
|
||||||
|
message.error(error.msg)
|
||||||
} finally {
|
} finally {
|
||||||
submitLoading.value = false
|
submitLoading.value = false
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -300,8 +300,9 @@ const changeState = (row: any, val: number) => {
|
|||||||
})
|
})
|
||||||
message.success('操作成功')
|
message.success('操作成功')
|
||||||
getDataList()
|
getDataList()
|
||||||
} catch (error) {
|
} catch (error: any) {
|
||||||
// Failed to change state
|
// 处理业务错误
|
||||||
|
message.error(error.msg)
|
||||||
}
|
}
|
||||||
}).catch(() => {})
|
}).catch(() => {})
|
||||||
} else if (val === -2) {
|
} else if (val === -2) {
|
||||||
@@ -346,8 +347,9 @@ const handleDel = (row: any) => {
|
|||||||
state.pagination.current = state.pagination.current - 1
|
state.pagination.current = state.pagination.current - 1
|
||||||
}
|
}
|
||||||
getDataList()
|
getDataList()
|
||||||
} catch (error) {
|
} catch (error: any) {
|
||||||
// Failed to delete
|
// 处理业务错误
|
||||||
|
message.error(error.msg)
|
||||||
}
|
}
|
||||||
}).catch(() => {})
|
}).catch(() => {})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -283,8 +283,9 @@ const changeState = (row: any, val: number) => {
|
|||||||
})
|
})
|
||||||
message.success('操作成功')
|
message.success('操作成功')
|
||||||
getDataList()
|
getDataList()
|
||||||
} catch (error) {
|
} catch (error: any) {
|
||||||
// Failed to change state
|
// 处理业务错误
|
||||||
|
message.error(error.msg)
|
||||||
}
|
}
|
||||||
}).catch(() => {})
|
}).catch(() => {})
|
||||||
} else if (val === -2) {
|
} else if (val === -2) {
|
||||||
@@ -331,8 +332,9 @@ const handleDel = (row: any) => {
|
|||||||
state.pagination.current = state.pagination.current - 1
|
state.pagination.current = state.pagination.current - 1
|
||||||
}
|
}
|
||||||
getDataList()
|
getDataList()
|
||||||
} catch (error) {
|
} catch (error: any) {
|
||||||
// Failed to delete
|
// 处理业务错误
|
||||||
|
message.error(error.msg)
|
||||||
}
|
}
|
||||||
}).catch(() => {})
|
}).catch(() => {})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -233,8 +233,9 @@ const handleSubmit = async () => {
|
|||||||
}
|
}
|
||||||
dialogVisible.value = false
|
dialogVisible.value = false
|
||||||
getDataList()
|
getDataList()
|
||||||
} catch (error) {
|
} catch (error: any) {
|
||||||
// 提交失败
|
// 处理业务错误
|
||||||
|
message.error(error.msg)
|
||||||
} finally {
|
} finally {
|
||||||
submitLoading.value = false
|
submitLoading.value = false
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -233,8 +233,9 @@ const handleSubmit = async () => {
|
|||||||
}
|
}
|
||||||
dialogVisible.value = false
|
dialogVisible.value = false
|
||||||
getDataList()
|
getDataList()
|
||||||
} catch (error) {
|
} catch (error: any) {
|
||||||
// 提交失败
|
// 处理业务错误
|
||||||
|
message.error(error.msg)
|
||||||
} finally {
|
} finally {
|
||||||
submitLoading.value = false
|
submitLoading.value = false
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -233,8 +233,9 @@ const handleSubmit = async () => {
|
|||||||
}
|
}
|
||||||
dialogVisible.value = false
|
dialogVisible.value = false
|
||||||
getDataList()
|
getDataList()
|
||||||
} catch (error) {
|
} catch (error: any) {
|
||||||
// 提交失败
|
// 处理业务错误
|
||||||
|
message.error(error.msg)
|
||||||
} finally {
|
} finally {
|
||||||
submitLoading.value = false
|
submitLoading.value = false
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -341,8 +341,9 @@ const changeState = (row: any, val: number) => {
|
|||||||
})
|
})
|
||||||
message.success('操作成功')
|
message.success('操作成功')
|
||||||
getDataList()
|
getDataList()
|
||||||
} catch (error) {
|
} catch (error: any) {
|
||||||
// Failed to change state
|
// 处理业务错误
|
||||||
|
message.error(error.msg)
|
||||||
}
|
}
|
||||||
}).catch(() => {})
|
}).catch(() => {})
|
||||||
} else if (val === -2) {
|
} else if (val === -2) {
|
||||||
@@ -389,8 +390,9 @@ const handleDel = (row: any) => {
|
|||||||
state.pagination.current = state.pagination.current - 1
|
state.pagination.current = state.pagination.current - 1
|
||||||
}
|
}
|
||||||
getDataList()
|
getDataList()
|
||||||
} catch (error) {
|
} catch (error: any) {
|
||||||
// Failed to delete
|
// 处理业务错误
|
||||||
|
message.error(error.msg)
|
||||||
}
|
}
|
||||||
}).catch(() => {})
|
}).catch(() => {})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -233,8 +233,9 @@ const handleSubmit = async () => {
|
|||||||
}
|
}
|
||||||
dialogVisible.value = false
|
dialogVisible.value = false
|
||||||
getDataList()
|
getDataList()
|
||||||
} catch (error) {
|
} catch (error: any) {
|
||||||
// 提交失败
|
// 处理业务错误
|
||||||
|
message.error(error.msg)
|
||||||
} finally {
|
} finally {
|
||||||
submitLoading.value = false
|
submitLoading.value = false
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -233,8 +233,9 @@ const handleSubmit = async () => {
|
|||||||
}
|
}
|
||||||
dialogVisible.value = false
|
dialogVisible.value = false
|
||||||
getDataList()
|
getDataList()
|
||||||
} catch (error) {
|
} catch (error: any) {
|
||||||
// 提交失败
|
// 处理业务错误
|
||||||
|
message.error(error.msg)
|
||||||
} finally {
|
} finally {
|
||||||
submitLoading.value = false
|
submitLoading.value = false
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -201,8 +201,9 @@ const handleSubmit = async () => {
|
|||||||
}
|
}
|
||||||
dialogVisible.value = false
|
dialogVisible.value = false
|
||||||
getDataList()
|
getDataList()
|
||||||
} catch (error) {
|
} catch (error: any) {
|
||||||
// 提交失败
|
// 处理业务错误
|
||||||
|
message.error(error.msg)
|
||||||
} finally {
|
} finally {
|
||||||
submitLoading.value = false
|
submitLoading.value = false
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -292,7 +292,7 @@ const handleDel = (row: any) => {
|
|||||||
message.success('删除成功')
|
message.success('删除成功')
|
||||||
getDataList(false) // 删除后保持当前页
|
getDataList(false) // 删除后保持当前页
|
||||||
} catch (error: any) {
|
} catch (error: any) {
|
||||||
message.error(error?.msg || '删除失败')
|
message.error(error.msg)
|
||||||
}
|
}
|
||||||
}).catch(() => {
|
}).catch(() => {
|
||||||
// 用户取消
|
// 用户取消
|
||||||
@@ -317,7 +317,7 @@ const handleSubmit = async () => {
|
|||||||
dialogVisible.value = false
|
dialogVisible.value = false
|
||||||
getDataList(false) // 提交后保持当前页
|
getDataList(false) // 提交后保持当前页
|
||||||
} catch (error: any) {
|
} catch (error: any) {
|
||||||
message.error(error?.msg || '操作失败')
|
message.error(error.msg)
|
||||||
} finally {
|
} finally {
|
||||||
submitLoading.value = false
|
submitLoading.value = false
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,7 +18,6 @@
|
|||||||
value-format="YYYY"
|
value-format="YYYY"
|
||||||
placeholder="请选择薪资年份"
|
placeholder="请选择薪资年份"
|
||||||
clearable
|
clearable
|
||||||
style="width: 200px"
|
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
|
||||||
@@ -30,11 +29,18 @@
|
|||||||
value-format="M"
|
value-format="M"
|
||||||
placeholder="请选择薪资月份"
|
placeholder="请选择薪资月份"
|
||||||
clearable
|
clearable
|
||||||
style="width: 200px"
|
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</template>
|
</template>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
<!-- 查询和重置按钮 -->
|
||||||
|
<template #actions>
|
||||||
|
<el-form-item>
|
||||||
|
<el-button type="primary" @click="handleFilter" icon="Search">查询</el-button>
|
||||||
|
<el-button @click="resetQuery" icon="Refresh">重置</el-button>
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
</search-form>
|
</search-form>
|
||||||
|
|
||||||
<!-- 表格 -->
|
<!-- 表格 -->
|
||||||
@@ -49,13 +55,13 @@
|
|||||||
>
|
>
|
||||||
<el-table-column type="index" label="序号" width="60" align="center" />
|
<el-table-column type="index" label="序号" width="60" align="center" />
|
||||||
|
|
||||||
<el-table-column prop="createTime" label="导出时间" width="180" align="center" />
|
<el-table-column prop="createTime" label="导出时间" min-width="180" align="center" />
|
||||||
|
|
||||||
<el-table-column prop="salaryYear" label="薪资年份" width="120" align="center" />
|
<el-table-column prop="salaryYear" label="薪资年份" min-width="120" align="center" />
|
||||||
|
|
||||||
<el-table-column prop="salaryMonth" label="薪资月份" width="120" align="center" />
|
<el-table-column prop="salaryMonth" label="薪资月份" min-width="120" align="center" />
|
||||||
|
|
||||||
<el-table-column prop="confirm" label="劳务日期锁定" width="150" align="center">
|
<el-table-column prop="confirm" label="劳务日期锁定" min-width="150" align="center">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<el-tag :type="scope.row.confirm === '1' ? 'success' : 'info'">
|
<el-tag :type="scope.row.confirm === '1' ? 'success' : 'info'">
|
||||||
{{ scope.row.confirm === '1' ? '是' : '否' }}
|
{{ scope.row.confirm === '1' ? '是' : '否' }}
|
||||||
@@ -63,7 +69,7 @@
|
|||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
|
|
||||||
<el-table-column label="操作" min-width="150" align="center" fixed="right">
|
<el-table-column label="操作" min-width="80" align="center" fixed="right">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<el-button
|
<el-button
|
||||||
v-if="permissions.professional_salaryexportrecord_del"
|
v-if="permissions.professional_salaryexportrecord_del"
|
||||||
@@ -145,6 +151,16 @@ const handleFilter = () => {
|
|||||||
getDataList() // 查询后跳转到第一页
|
getDataList() // 查询后跳转到第一页
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 重置
|
||||||
|
const resetQuery = () => {
|
||||||
|
searchFormRef.value?.formRef?.resetFields()
|
||||||
|
Object.assign(search, {
|
||||||
|
salaryYear: '',
|
||||||
|
salaryMonth: ''
|
||||||
|
})
|
||||||
|
handleFilter()
|
||||||
|
}
|
||||||
|
|
||||||
// 删除
|
// 删除
|
||||||
const handleDel = (row: any) => {
|
const handleDel = (row: any) => {
|
||||||
messageBox.confirm('确认删除?').then(async () => {
|
messageBox.confirm('确认删除?').then(async () => {
|
||||||
@@ -153,7 +169,7 @@ const handleDel = (row: any) => {
|
|||||||
message.success('删除成功')
|
message.success('删除成功')
|
||||||
getDataList(false) // 删除后保持当前页
|
getDataList(false) // 删除后保持当前页
|
||||||
} catch (error: any) {
|
} catch (error: any) {
|
||||||
message.error(error?.msg || '删除失败')
|
message.error(error.msg)
|
||||||
}
|
}
|
||||||
}).catch(() => {
|
}).catch(() => {
|
||||||
// 用户取消
|
// 用户取消
|
||||||
|
|||||||
@@ -1,18 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="layout-padding">
|
<div class="layout-padding">
|
||||||
<div class="layout-padding-auto layout-padding-view">
|
<div class="layout-padding-auto layout-padding-view">
|
||||||
<!-- 操作按钮 -->
|
|
||||||
<el-row>
|
|
||||||
<div class="mb15" style="width: 100%;">
|
|
||||||
<el-button
|
|
||||||
size="small"
|
|
||||||
v-if="permissions.teacher_award_import"
|
|
||||||
type="primary"
|
|
||||||
@click="handleImportBaseSalary">绩效导入
|
|
||||||
</el-button>
|
|
||||||
</div>
|
|
||||||
</el-row>
|
|
||||||
|
|
||||||
<!-- 搜索表单 -->
|
<!-- 搜索表单 -->
|
||||||
<search-form
|
<search-form
|
||||||
v-show="showSearch"
|
v-show="showSearch"
|
||||||
@@ -27,7 +15,6 @@
|
|||||||
v-model="search.realName"
|
v-model="search.realName"
|
||||||
placeholder="请输入姓名"
|
placeholder="请输入姓名"
|
||||||
clearable
|
clearable
|
||||||
style="width: 200px"
|
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
|
||||||
@@ -36,7 +23,6 @@
|
|||||||
v-model="search.teacherNo"
|
v-model="search.teacherNo"
|
||||||
placeholder="请输入工号"
|
placeholder="请输入工号"
|
||||||
clearable
|
clearable
|
||||||
style="width: 200px"
|
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
|
||||||
@@ -48,13 +34,33 @@
|
|||||||
value-format="YYYY"
|
value-format="YYYY"
|
||||||
placeholder="请选择年份"
|
placeholder="请选择年份"
|
||||||
clearable
|
clearable
|
||||||
style="width: 200px"
|
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</template>
|
</template>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
<!-- 查询和重置按钮 -->
|
||||||
|
<template #actions>
|
||||||
|
<el-form-item>
|
||||||
|
<el-button type="primary" @click="handleFilter" icon="Search">查询</el-button>
|
||||||
|
<el-button @click="resetQuery" icon="Refresh">重置</el-button>
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
</search-form>
|
</search-form>
|
||||||
|
|
||||||
|
<!-- 操作按钮 -->
|
||||||
|
<el-row>
|
||||||
|
<div class="mb15">
|
||||||
|
<el-button
|
||||||
|
type="primary"
|
||||||
|
plain
|
||||||
|
icon="UploadFilled"
|
||||||
|
v-if="permissions.teacher_award_import"
|
||||||
|
@click="handleImportBaseSalary">绩效导入
|
||||||
|
</el-button>
|
||||||
|
</div>
|
||||||
|
</el-row>
|
||||||
|
|
||||||
<!-- 表格 -->
|
<!-- 表格 -->
|
||||||
<el-table
|
<el-table
|
||||||
ref="tableRef"
|
ref="tableRef"
|
||||||
@@ -63,7 +69,6 @@
|
|||||||
border
|
border
|
||||||
:cell-style="tableStyle.cellStyle"
|
:cell-style="tableStyle.cellStyle"
|
||||||
:header-cell-style="tableStyle.headerCellStyle"
|
:header-cell-style="tableStyle.headerCellStyle"
|
||||||
class="data-table"
|
|
||||||
>
|
>
|
||||||
<el-table-column type="index" label="序号" width="60" align="center" />
|
<el-table-column type="index" label="序号" width="60" align="center" />
|
||||||
|
|
||||||
@@ -158,6 +163,17 @@ const handleFilter = () => {
|
|||||||
getDataList() // 查询后跳转到第一页
|
getDataList() // 查询后跳转到第一页
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 重置
|
||||||
|
const resetQuery = () => {
|
||||||
|
searchFormRef.value?.formRef?.resetFields()
|
||||||
|
Object.assign(search, {
|
||||||
|
realName: '',
|
||||||
|
teacherNo: '',
|
||||||
|
year: ''
|
||||||
|
})
|
||||||
|
handleFilter()
|
||||||
|
}
|
||||||
|
|
||||||
// 导入
|
// 导入
|
||||||
const handleImportBaseSalary = () => {
|
const handleImportBaseSalary = () => {
|
||||||
importAwardTaxRef.value?.init()
|
importAwardTaxRef.value?.init()
|
||||||
@@ -165,7 +181,4 @@ const handleImportBaseSalary = () => {
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.data-table {
|
|
||||||
width: 100% !important;
|
|
||||||
}
|
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -1,360 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<el-dialog v-model="educationDialogFromVisible" width="600" :title="waitShenheForm.title" append-to-body>
|
<el-dialog v-model="dialogVisible" width="600" :title="waitShenheForm.title" append-to-body>
|
||||||
|
<!--人员调动-->
|
||||||
<!--2.1 教师资格证-->
|
<el-form v-if="waitShenheForm.isPersonnelTransfer" ref="stationChangeFormRef" :model="waitShenheForm.form" :rules="stationChangeRules" label-width="120px">
|
||||||
<el-form v-if="waitShenheForm.a" ref="teacherCertificateFormRef" :model="waitShenheForm.form" :rules="teacherCertificateRules" label-width="120px">
|
|
||||||
<el-form-item label="类型" prop="certificateConfId">
|
|
||||||
<el-select v-model="waitShenheForm.form.certificateConfId" placeholder="请选择类型" style="width: 100%">
|
|
||||||
<el-option
|
|
||||||
v-for="item in certificateTypeList"
|
|
||||||
:key="item.id"
|
|
||||||
:label="item.cretificateName"
|
|
||||||
:value="item.id">
|
|
||||||
</el-option>
|
|
||||||
</el-select>
|
|
||||||
</el-form-item>
|
|
||||||
|
|
||||||
<el-form-item label="证书编号" prop="certificateNumber">
|
|
||||||
<el-input
|
|
||||||
v-model="waitShenheForm.form.certificateNumber"
|
|
||||||
placeholder="请输入证书编号(仅支持英文和数字)"
|
|
||||||
show-word-limit
|
|
||||||
maxlength="64"
|
|
||||||
@input="handleCertificateNumberInput"
|
|
||||||
/>
|
|
||||||
</el-form-item>
|
|
||||||
|
|
||||||
<el-form-item label="证明材料">
|
|
||||||
<el-upload
|
|
||||||
:headers="headers"
|
|
||||||
:limit="1"
|
|
||||||
:action="materialUrlFrom.url"
|
|
||||||
:file-list="materialUrlFrom.fileListA"
|
|
||||||
:on-success="materiaUploadSuccessA"
|
|
||||||
:accept="'.jpg,.jpeg,.png,.pdf'"
|
|
||||||
>
|
|
||||||
<div>
|
|
||||||
<el-button size="small" type="primary">点击上传</el-button>
|
|
||||||
<div style="margin-top: 8px;">
|
|
||||||
<el-tag>仅支持jpg,jpeg,png,pdf后缀的文件上传</el-tag>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</el-upload>
|
|
||||||
</el-form-item>
|
|
||||||
|
|
||||||
<el-form-item>
|
|
||||||
<div style="text-align: right; width: 100%;">
|
|
||||||
<el-button type="primary" @click="dialogSubmit(0)">提交</el-button>
|
|
||||||
<el-button @click="educationDialogFromVisible = false">取消</el-button>
|
|
||||||
</div>
|
|
||||||
</el-form-item>
|
|
||||||
</el-form>
|
|
||||||
<!--2.2 学历-->
|
|
||||||
<el-form v-if="waitShenheForm.b" ref="educationFormRef" :model="waitShenheForm.form" :rules="educationRules" label-width="120px">
|
|
||||||
<el-form-item label="毕业时间" prop="graduateTime">
|
|
||||||
<el-date-picker
|
|
||||||
v-model="waitShenheForm.form.graduateTime"
|
|
||||||
type="date"
|
|
||||||
placeholder="选择日期"
|
|
||||||
format="yyyy-MM-dd"
|
|
||||||
value-format="yyyy-MM-dd HH:mm:ss"
|
|
||||||
style="width: 100%"
|
|
||||||
/>
|
|
||||||
</el-form-item>
|
|
||||||
|
|
||||||
<el-form-item label="教育类型" prop="type">
|
|
||||||
<el-select v-model="waitShenheForm.form.type" placeholder="请选择教育类型" style="width: 100%">
|
|
||||||
<el-option
|
|
||||||
v-for="item in educationTypeList"
|
|
||||||
:key="item.id"
|
|
||||||
:label="item.name"
|
|
||||||
:value="item.id">
|
|
||||||
</el-option>
|
|
||||||
</el-select>
|
|
||||||
</el-form-item>
|
|
||||||
|
|
||||||
<el-form-item label="学历" prop="qualificationConfigId">
|
|
||||||
<el-select v-model="waitShenheForm.form.qualificationConfigId" placeholder="请选择学历" style="width: 100%">
|
|
||||||
<el-option
|
|
||||||
v-for="item in qualificationList"
|
|
||||||
:key="item.id"
|
|
||||||
:label="item.qualificationName"
|
|
||||||
:value="item.id">
|
|
||||||
</el-option>
|
|
||||||
</el-select>
|
|
||||||
</el-form-item>
|
|
||||||
|
|
||||||
<el-form-item label="学位" prop="degreeConfigId">
|
|
||||||
<el-select v-model="waitShenheForm.form.degreeConfigId" placeholder="请选择学位" style="width: 100%">
|
|
||||||
<el-option
|
|
||||||
v-for="item in degreeList"
|
|
||||||
:key="item.id"
|
|
||||||
:label="item.degreeName"
|
|
||||||
:value="item.id">
|
|
||||||
</el-option>
|
|
||||||
</el-select>
|
|
||||||
</el-form-item>
|
|
||||||
|
|
||||||
<el-form-item label="毕业学校" prop="graduateSchool">
|
|
||||||
<el-input v-model="waitShenheForm.form.graduateSchool" placeholder="请输入毕业学校" />
|
|
||||||
</el-form-item>
|
|
||||||
|
|
||||||
<el-form-item label="所学专业" prop="major">
|
|
||||||
<el-input v-model="waitShenheForm.form.major" placeholder="请输入所学专业" />
|
|
||||||
</el-form-item>
|
|
||||||
|
|
||||||
<el-form-item label="证书编码" prop="certificateNumber">
|
|
||||||
<el-input
|
|
||||||
v-model="waitShenheForm.form.certificateNumber"
|
|
||||||
placeholder="请输入证书编码(仅支持英文和数字)"
|
|
||||||
show-word-limit
|
|
||||||
maxlength="100"
|
|
||||||
@input="handleCertificateNumberInput"
|
|
||||||
/>
|
|
||||||
</el-form-item>
|
|
||||||
|
|
||||||
<el-form-item label="学历证书">
|
|
||||||
<el-upload
|
|
||||||
:headers="headers"
|
|
||||||
:limit="1"
|
|
||||||
:action="materialUrlFrom.url"
|
|
||||||
:file-list="materialUrlFrom.fileListA"
|
|
||||||
:on-success="materiaUploadSuccessA"
|
|
||||||
:accept="'.jpg,.jpeg,.png,.pdf'"
|
|
||||||
>
|
|
||||||
<div>
|
|
||||||
<el-button size="small" type="primary">点击上传</el-button>
|
|
||||||
<div style="margin-top: 8px;">
|
|
||||||
<el-tag>仅支持jpg,jpeg,png,pdf后缀的文件上传</el-tag>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</el-upload>
|
|
||||||
</el-form-item>
|
|
||||||
|
|
||||||
<el-form-item label="学位证书">
|
|
||||||
<el-upload
|
|
||||||
:headers="headers"
|
|
||||||
:limit="1"
|
|
||||||
:action="materialUrlFrom.url"
|
|
||||||
:on-success="materiaUploadSuccessB"
|
|
||||||
:file-list="materialUrlFrom.fileListB"
|
|
||||||
:accept="'.jpg,.jpeg,.png,.pdf'"
|
|
||||||
>
|
|
||||||
<div>
|
|
||||||
<el-button size="small" type="primary">点击上传</el-button>
|
|
||||||
<div style="margin-top: 8px;">
|
|
||||||
<el-tag>仅支持jpg,jpeg,png,pdf后缀的文件上传</el-tag>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</el-upload>
|
|
||||||
</el-form-item>
|
|
||||||
|
|
||||||
<el-form-item>
|
|
||||||
<div style="text-align: right; width: 100%;">
|
|
||||||
<el-button type="primary" @click="dialogSubmit(1)">提交</el-button>
|
|
||||||
<el-button @click="educationDialogFromVisible = false">取消</el-button>
|
|
||||||
</div>
|
|
||||||
</el-form-item>
|
|
||||||
</el-form>
|
|
||||||
<!--2.3 职称-->
|
|
||||||
<el-form v-if="waitShenheForm.c" ref="proFormRef" :model="waitShenheForm.form" :rules="proRules" label-width="120px">
|
|
||||||
<el-form-item label="职称等级" prop="professionalTitleConfigId">
|
|
||||||
<el-select v-model="waitShenheForm.form.professionalTitleConfigId" placeholder="请选择职称等级" style="width: 100%">
|
|
||||||
<el-option
|
|
||||||
v-for="item in baseInfoAbout.proTitleList"
|
|
||||||
:key="item.id"
|
|
||||||
:label="item.professionalTitle"
|
|
||||||
:value="item.id">
|
|
||||||
</el-option>
|
|
||||||
</el-select>
|
|
||||||
</el-form-item>
|
|
||||||
|
|
||||||
<el-form-item label="专业技术职务" prop="majorStation">
|
|
||||||
<el-select v-model="waitShenheForm.form.majorStation" placeholder="请选择专业技术职务" style="width: 100%">
|
|
||||||
<el-option
|
|
||||||
v-for="item in baseInfoAbout.majorStationList"
|
|
||||||
:key="item.id"
|
|
||||||
:label="item.majorStationName"
|
|
||||||
:value="item.id">
|
|
||||||
</el-option>
|
|
||||||
</el-select>
|
|
||||||
</el-form-item>
|
|
||||||
|
|
||||||
<el-form-item label="取证时间" prop="certificateTime">
|
|
||||||
<el-date-picker
|
|
||||||
v-model="waitShenheForm.form.certificateTime"
|
|
||||||
type="date"
|
|
||||||
placeholder="选择日期"
|
|
||||||
format="yyyy-MM-dd"
|
|
||||||
value-format="yyyy-MM-dd HH:mm:ss"
|
|
||||||
style="width: 100%"
|
|
||||||
/>
|
|
||||||
</el-form-item>
|
|
||||||
|
|
||||||
<el-form-item label="职称任职时间" prop="inOfficeDate">
|
|
||||||
<el-date-picker
|
|
||||||
v-model="waitShenheForm.form.inOfficeDate"
|
|
||||||
type="date"
|
|
||||||
placeholder="选择日期"
|
|
||||||
format="yyyy-MM-dd"
|
|
||||||
value-format="yyyy-MM-dd HH:mm:ss"
|
|
||||||
style="width: 100%"
|
|
||||||
/>
|
|
||||||
</el-form-item>
|
|
||||||
|
|
||||||
<el-form-item label="证书编号" prop="certificateNumber">
|
|
||||||
<el-input
|
|
||||||
v-model="waitShenheForm.form.certificateNumber"
|
|
||||||
placeholder="请输入证书编号(仅支持英文和数字)"
|
|
||||||
show-word-limit
|
|
||||||
maxlength="32"
|
|
||||||
@input="handleCertificateNumberInput"
|
|
||||||
/>
|
|
||||||
</el-form-item>
|
|
||||||
|
|
||||||
<el-form-item label="证明材料">
|
|
||||||
<el-upload
|
|
||||||
:headers="headers"
|
|
||||||
:limit="1"
|
|
||||||
:action="materialUrlFrom.url"
|
|
||||||
:file-list="materialUrlFrom.fileListA"
|
|
||||||
:on-success="materiaUploadSuccessA"
|
|
||||||
:accept="'.jpg,.jpeg,.png,.pdf'"
|
|
||||||
>
|
|
||||||
<div>
|
|
||||||
<el-button size="small" type="primary">点击上传</el-button>
|
|
||||||
<div style="margin-top: 8px;">
|
|
||||||
<el-tag>仅支持jpg,jpeg,png,pdf后缀的文件上传</el-tag>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</el-upload>
|
|
||||||
</el-form-item>
|
|
||||||
|
|
||||||
<el-form-item>
|
|
||||||
<div style="text-align: right; width: 100%;">
|
|
||||||
<el-button type="primary" @click="dialogSubmit(2)">提交</el-button>
|
|
||||||
<el-button @click="educationDialogFromVisible = false">取消</el-button>
|
|
||||||
</div>
|
|
||||||
</el-form-item>
|
|
||||||
</el-form>
|
|
||||||
<!--2.4 职业-->
|
|
||||||
<el-form v-if="waitShenheForm.d" ref="workFormRef" :model="waitShenheForm.form" :rules="workRules" label-width="120px">
|
|
||||||
<el-form-item label="职业工种" prop="worker">
|
|
||||||
<el-select v-model="waitShenheForm.form.worker" filterable placeholder="请选择职业工种" style="width: 100%">
|
|
||||||
<el-option
|
|
||||||
v-for="item in baseInfoAbout.workTypeList"
|
|
||||||
:key="item.id"
|
|
||||||
:label="item.workName"
|
|
||||||
:value="item.id">
|
|
||||||
</el-option>
|
|
||||||
</el-select>
|
|
||||||
</el-form-item>
|
|
||||||
|
|
||||||
<el-form-item label="等级" prop="qualificationConfigId">
|
|
||||||
<el-select v-model="waitShenheForm.form.qualificationConfigId" placeholder="请选择等级" style="width: 100%">
|
|
||||||
<el-option
|
|
||||||
v-for="item in baseInfoAbout.qualificationList"
|
|
||||||
:key="item.id"
|
|
||||||
:label="item.levelName"
|
|
||||||
:value="item.id">
|
|
||||||
</el-option>
|
|
||||||
</el-select>
|
|
||||||
</el-form-item>
|
|
||||||
|
|
||||||
<el-form-item label="取证时间" prop="certificateTime">
|
|
||||||
<el-date-picker
|
|
||||||
v-model="waitShenheForm.form.certificateTime"
|
|
||||||
type="date"
|
|
||||||
placeholder="选择日期"
|
|
||||||
format="yyyy-MM-dd"
|
|
||||||
value-format="yyyy-MM-dd HH:mm:ss"
|
|
||||||
style="width: 100%"
|
|
||||||
/>
|
|
||||||
</el-form-item>
|
|
||||||
|
|
||||||
<el-form-item label="证书编号" prop="certificateNumber">
|
|
||||||
<el-input
|
|
||||||
v-model="waitShenheForm.form.certificateNumber"
|
|
||||||
placeholder="请输入证书编号(仅支持英文和数字)"
|
|
||||||
show-word-limit
|
|
||||||
maxlength="32"
|
|
||||||
@input="handleCertificateNumberInput"
|
|
||||||
/>
|
|
||||||
</el-form-item>
|
|
||||||
|
|
||||||
<el-form-item label="材料1">
|
|
||||||
<el-upload
|
|
||||||
:headers="headers"
|
|
||||||
:limit="1"
|
|
||||||
:action="materialUrlFrom.url"
|
|
||||||
:file-list="materialUrlFrom.fileListA"
|
|
||||||
:on-success="materiaUploadSuccessA"
|
|
||||||
:accept="'.jpg,.jpeg,.png,.pdf'"
|
|
||||||
>
|
|
||||||
<div>
|
|
||||||
<el-button size="small" type="primary">点击上传</el-button>
|
|
||||||
<div style="margin-top: 8px;">
|
|
||||||
<el-tag>仅支持jpg,jpeg,png,pdf后缀的文件上传</el-tag>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</el-upload>
|
|
||||||
</el-form-item>
|
|
||||||
|
|
||||||
<el-form-item>
|
|
||||||
<div style="text-align: right; width: 100%;">
|
|
||||||
<el-button type="primary" @click="dialogSubmit(3)">提交</el-button>
|
|
||||||
<el-button @click="educationDialogFromVisible = false">取消</el-button>
|
|
||||||
</div>
|
|
||||||
</el-form-item>
|
|
||||||
</el-form>
|
|
||||||
<!--2.5 综合表彰-->
|
|
||||||
<el-form v-if="waitShenheForm.e" ref="honorFormRef" :model="waitShenheForm.form" :rules="honorRules" label-width="120px">
|
|
||||||
<el-form-item label="荣誉" prop="honor">
|
|
||||||
<el-input v-model="waitShenheForm.form.honor" placeholder="请填写荣誉" />
|
|
||||||
</el-form-item>
|
|
||||||
|
|
||||||
<el-form-item label="表彰单位" prop="honorCompany">
|
|
||||||
<el-input v-model="waitShenheForm.form.honorCompany" placeholder="请填写表彰单位" />
|
|
||||||
</el-form-item>
|
|
||||||
|
|
||||||
<el-form-item label="年份" prop="year">
|
|
||||||
<el-date-picker
|
|
||||||
v-model="waitShenheForm.form.year"
|
|
||||||
type="year"
|
|
||||||
placeholder="选择年份"
|
|
||||||
format="yyyy"
|
|
||||||
value-format="yyyy"
|
|
||||||
style="width: 100%"
|
|
||||||
/>
|
|
||||||
</el-form-item>
|
|
||||||
|
|
||||||
<el-form-item label="证明材料">
|
|
||||||
<el-upload
|
|
||||||
:headers="headers"
|
|
||||||
:limit="1"
|
|
||||||
:action="materialUrlFrom.url"
|
|
||||||
:on-success="materiaUploadSuccessA"
|
|
||||||
:file-list="materialUrlFrom.fileListA"
|
|
||||||
:accept="'.jpg,.jpeg,.png,.pdf'"
|
|
||||||
>
|
|
||||||
<div>
|
|
||||||
<el-button size="small" type="primary">点击上传</el-button>
|
|
||||||
<div style="margin-top: 8px;">
|
|
||||||
<el-tag>仅支持jpg,jpeg,png,pdf后缀的文件上传</el-tag>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</el-upload>
|
|
||||||
</el-form-item>
|
|
||||||
|
|
||||||
<el-form-item>
|
|
||||||
<div style="text-align: right; width: 100%;">
|
|
||||||
<el-button type="primary" @click="dialogSubmit(4)">提交</el-button>
|
|
||||||
<el-button @click="educationDialogFromVisible = false">取消</el-button>
|
|
||||||
</div>
|
|
||||||
</el-form-item>
|
|
||||||
</el-form>
|
|
||||||
<!--2.6 人员调动-->
|
|
||||||
<el-form v-if="waitShenheForm.f" ref="stationChangeFormRef" :model="waitShenheForm.form" :rules="stationChangeRules" label-width="120px">
|
|
||||||
<el-form-item label="工号">
|
<el-form-item label="工号">
|
||||||
<el-tag>{{waitShenheForm.form.teacherNo}}</el-tag>
|
<el-tag>{{waitShenheForm.form.teacherNo}}</el-tag>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
@@ -415,12 +62,12 @@
|
|||||||
<el-form-item>
|
<el-form-item>
|
||||||
<div style="text-align: right; width: 100%;">
|
<div style="text-align: right; width: 100%;">
|
||||||
<el-button type="primary" @click="dialogSubmit(5)">提交</el-button>
|
<el-button type="primary" @click="dialogSubmit(5)">提交</el-button>
|
||||||
<el-button @click="educationDialogFromVisible = false">取消</el-button>
|
<el-button @click="dialogVisible = false">取消</el-button>
|
||||||
</div>
|
</div>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-form>
|
</el-form>
|
||||||
<!--2.7 党员调动-->
|
<!--党员调动-->
|
||||||
<el-form v-if="waitShenheForm.g" ref="partChangeFormRef" :model="waitShenheForm.form" :rules="partChangeRules" label-width="120px">
|
<el-form v-if="waitShenheForm.isPartyTransfer" ref="partChangeFormRef" :model="waitShenheForm.form" :rules="partChangeRules" label-width="120px">
|
||||||
<el-form-item label="工号">
|
<el-form-item label="工号">
|
||||||
<el-tag>{{waitShenheForm.form.teacherNo}}</el-tag>
|
<el-tag>{{waitShenheForm.form.teacherNo}}</el-tag>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
@@ -472,7 +119,7 @@
|
|||||||
<el-form-item>
|
<el-form-item>
|
||||||
<div style="text-align: right; width: 100%;">
|
<div style="text-align: right; width: 100%;">
|
||||||
<el-button type="primary" @click="dialogSubmit(6)">提交</el-button>
|
<el-button type="primary" @click="dialogSubmit(6)">提交</el-button>
|
||||||
<el-button @click="educationDialogFromVisible = false">取消</el-button>
|
<el-button @click="dialogVisible = false">取消</el-button>
|
||||||
</div>
|
</div>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-form>
|
</el-form>
|
||||||
@@ -480,178 +127,106 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { ref, reactive, computed } from 'vue'
|
import { ref, reactive } from 'vue'
|
||||||
import { useMessage, useMessageBox } from '/@/hooks/message'
|
import { useMessage, useMessageBox } from '/@/hooks/message'
|
||||||
import { updateOtherInfo, getMyTeacherNo, getAllInfoAboutList } from '/@/api/professional/professionaluser/teacherbase'
|
import { getAllInfoAboutList } from '/@/api/professional/professionaluser/teacherbase'
|
||||||
import { checkLocked } from '/@/api/professional/professionalstatuslock'
|
|
||||||
import { getDeptListByLevelTwo, getDeptListByParent as getDeptListByParentApi } from '/@/api/basic/basicdept'
|
import { getDeptListByLevelTwo, getDeptListByParent as getDeptListByParentApi } from '/@/api/basic/basicdept'
|
||||||
import { getTeacherCertificateList } from '/@/api/professional/rsbase/professionalteachercertificateconf'
|
import { addObj as addStationChangeObj } from '/@/api/professional/professionaluser/professionalteacherstationchange'
|
||||||
import { getAllTypeList } from '/@/api/professional/rsbase/professionalacademiceducationtypeconfig'
|
import { addObj as addPartyChangeObj } from '/@/api/professional/professionaluser/professionalpartychange'
|
||||||
import { getQualificationList } from '/@/api/professional/rsbase/academicqualificationsconfig'
|
|
||||||
import { getDegreeList } from '/@/api/professional/rsbase/professionalacademicdegreeconfig'
|
|
||||||
import { addObj as addStationChangeObj } from '/@/api/professional/professionaluser/professionalteacherstationchange'
|
|
||||||
import { addObj as addPartyChangeObj } from '/@/api/professional/professionaluser/professionalpartychange'
|
|
||||||
import global from '/@/components/tools/commondict.vue'
|
import global from '/@/components/tools/commondict.vue'
|
||||||
import { Session } from '/@/utils/storage'
|
import type { Pagination } from '/@/hooks/table'
|
||||||
|
|
||||||
|
// 表单类型常量
|
||||||
|
const FORM_TYPE = {
|
||||||
|
PERSONNEL_TRANSFER: 5, // 人员调动
|
||||||
|
PARTY_TRANSFER: 6 // 党员调动
|
||||||
|
} as const
|
||||||
|
|
||||||
|
// 类型定义
|
||||||
|
interface FormData {
|
||||||
|
newDeptCodeList?: any[]
|
||||||
|
deptCodeList?: any[]
|
||||||
|
teacherNo?: string
|
||||||
|
realName?: string
|
||||||
|
userName?: string
|
||||||
|
deptName?: string
|
||||||
|
id?: string
|
||||||
|
oldBranchId?: string
|
||||||
|
oldBranchName?: string
|
||||||
|
newDeptCode?: string
|
||||||
|
newSecDeptCode?: string
|
||||||
|
changeDate?: string
|
||||||
|
pos?: string
|
||||||
|
remarks?: string
|
||||||
|
branchName?: string
|
||||||
|
partyFee?: number
|
||||||
|
changeTime?: string
|
||||||
|
[key: string]: any
|
||||||
|
}
|
||||||
|
|
||||||
|
interface WaitShenheForm {
|
||||||
|
form: FormData
|
||||||
|
title: string
|
||||||
|
isPersonnelTransfer: boolean
|
||||||
|
isPartyTransfer: boolean
|
||||||
|
}
|
||||||
|
|
||||||
// 字典数据
|
|
||||||
const certificateTypeList = ref<any[]>([])
|
|
||||||
const educationTypeList = ref<any[]>([])
|
|
||||||
const qualificationList = ref<any[]>([])
|
|
||||||
const degreeList = ref<any[]>([])
|
|
||||||
|
|
||||||
// 表单 ref
|
// 表单 ref
|
||||||
const teacherCertificateFormRef = ref()
|
|
||||||
const educationFormRef = ref()
|
|
||||||
const proFormRef = ref()
|
|
||||||
const workFormRef = ref()
|
|
||||||
const honorFormRef = ref()
|
|
||||||
const stationChangeFormRef = ref()
|
const stationChangeFormRef = ref()
|
||||||
const partChangeFormRef = ref()
|
const partChangeFormRef = ref()
|
||||||
|
|
||||||
// 表单验证规则
|
// 人员调动验证规则
|
||||||
const teacherCertificateRules = {
|
|
||||||
certificateConfId: [{ required: true, message: '请选择类型', trigger: 'change' }],
|
|
||||||
certificateNumber: [
|
|
||||||
{ required: true, message: '请输入证书编号', trigger: 'blur' },
|
|
||||||
{ pattern: /^[A-Za-z0-9]+$/, message: '证书编号只能包含英文和数字', trigger: 'blur' }
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
const educationRules = {
|
|
||||||
graduateTime: [{ required: true, message: '请输入毕业时间', trigger: 'change' }],
|
|
||||||
type: [{ required: true, message: '请选择教育类型', trigger: 'change' }],
|
|
||||||
graduateSchool: [{ required: true, message: '请输入毕业学校', trigger: 'blur' }],
|
|
||||||
major: [{ required: true, message: '请输入所学专业', trigger: 'blur' }],
|
|
||||||
certificateNumber: [
|
|
||||||
{ required: true, message: '请输入证书编码', trigger: 'blur' },
|
|
||||||
{ pattern: /^[A-Za-z0-9]+$/, message: '证书编码只能包含英文和数字', trigger: 'blur' }
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
const proRules = {
|
|
||||||
professionalTitleConfigId: [{ required: true, message: '请选择职称等级', trigger: 'change' }],
|
|
||||||
majorStation: [{ required: true, message: '请选择专业技术职务', trigger: 'change' }],
|
|
||||||
certificateTime: [{ required: true, message: '请选择取证时间', trigger: 'change' }],
|
|
||||||
certificateNumber: [
|
|
||||||
{ required: true, message: '请输入证书编号', trigger: 'blur' },
|
|
||||||
{ pattern: /^[A-Za-z0-9]+$/, message: '证书编号只能包含英文和数字', trigger: 'blur' }
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
const workRules = {
|
|
||||||
worker: [{ required: true, message: '请选择职业工种', trigger: 'change' }],
|
|
||||||
qualificationConfigId: [{ required: true, message: '请选择等级', trigger: 'change' }],
|
|
||||||
certificateTime: [{ required: true, message: '请选择取证时间', trigger: 'change' }],
|
|
||||||
certificateNumber: [
|
|
||||||
{ required: true, message: '请输入证书编号', trigger: 'blur' },
|
|
||||||
{ pattern: /^[A-Za-z0-9]+$/, message: '证书编号只能包含英文和数字', trigger: 'blur' }
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
const honorRules = {
|
|
||||||
honor: [{ required: true, message: '请填写荣誉', trigger: 'blur' }],
|
|
||||||
honorCompany: [{ required: true, message: '请填写表彰单位', trigger: 'blur' }],
|
|
||||||
year: [{ required: true, message: '请输入年份', trigger: 'change' }]
|
|
||||||
}
|
|
||||||
|
|
||||||
const stationChangeRules = {
|
const stationChangeRules = {
|
||||||
newDeptCode: [{ required: true, message: '请选择要调入的二级部门', trigger: 'change' }],
|
newDeptCode: [{ required: true, message: '请选择要调入的二级部门', trigger: 'change' }],
|
||||||
changeDate: [{ required: true, message: '请选择调令日期', trigger: 'change' }],
|
changeDate: [{ required: true, message: '请选择调令日期', trigger: 'change' }],
|
||||||
pos: [{ required: true, message: '请选择岗位类型', trigger: 'change' }]
|
pos: [{ required: true, message: '请选择岗位类型', trigger: 'change' }]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 党员调动验证规则
|
||||||
const partChangeRules = {
|
const partChangeRules = {
|
||||||
branchName: [{ required: true, message: '请选择现支部', trigger: 'change' }],
|
branchName: [{ required: true, message: '请选择现支部', trigger: 'change' }],
|
||||||
changeTime: [{ required: true, message: '请选择变动时间', trigger: 'change' }]
|
changeTime: [{ required: true, message: '请选择变动时间', trigger: 'change' }]
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取字典数据
|
|
||||||
const loadCertificateTypeList = async () => {
|
|
||||||
try {
|
|
||||||
const res = await getTeacherCertificateList()
|
|
||||||
certificateTypeList.value = res.data || []
|
|
||||||
} catch (err) {
|
|
||||||
// 获取证书类型列表失败
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const loadEducationTypeList = async () => {
|
|
||||||
try {
|
|
||||||
const res = await getAllTypeList()
|
|
||||||
educationTypeList.value = res.data || []
|
|
||||||
} catch (err) {
|
|
||||||
// 获取教育类型列表失败
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const loadQualificationList = async () => {
|
|
||||||
try {
|
|
||||||
const res = await getQualificationList()
|
|
||||||
qualificationList.value = res.data || []
|
|
||||||
} catch (err) {
|
|
||||||
// 获取学历列表失败
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const loadDegreeList = async () => {
|
|
||||||
try {
|
|
||||||
const res = await getDegreeList()
|
|
||||||
degreeList.value = res.data || []
|
|
||||||
} catch (err) {
|
|
||||||
// 获取学位列表失败
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Props
|
/**
|
||||||
|
* 定义Props
|
||||||
|
* @param page 分页信息
|
||||||
|
* @param nowRow 当前行数据
|
||||||
|
*/
|
||||||
const props = defineProps<{
|
const props = defineProps<{
|
||||||
page: any
|
page?: Pagination
|
||||||
nowRow: any
|
nowRow: Record<string, any>
|
||||||
}>()
|
}>()
|
||||||
|
|
||||||
// Emits
|
/**
|
||||||
const emit = defineEmits(['getList'])
|
* 定义Emits
|
||||||
|
*/
|
||||||
|
const emit = defineEmits<{
|
||||||
|
(e: 'getList', page?: Pagination): void
|
||||||
|
}>()
|
||||||
|
|
||||||
// 消息提示 hooks
|
// 消息提示 hooks
|
||||||
const message = useMessage()
|
const message = useMessage()
|
||||||
const messageBox = useMessageBox()
|
const messageBox = useMessageBox()
|
||||||
|
|
||||||
// 响应式数据
|
// 响应式数据
|
||||||
const educationDialogFromVisible = ref(false)
|
const dialogVisible = ref(false)
|
||||||
const waitShenheForm = reactive({
|
|
||||||
form: {
|
|
||||||
newDeptCodeList: [] as any[],
|
|
||||||
deptCodeList: [] as any[]
|
|
||||||
} as any,
|
|
||||||
title: '',
|
|
||||||
a: false,
|
|
||||||
b: false,
|
|
||||||
c: false,
|
|
||||||
d: false,
|
|
||||||
e: false,
|
|
||||||
f: false,
|
|
||||||
g: false
|
|
||||||
})
|
|
||||||
|
|
||||||
const materialUrlFrom = reactive({
|
/**
|
||||||
url: '/professional/file/teacherAboutInfoUpload',
|
* 等待审核表单
|
||||||
fileListA: [] as any[],
|
*/
|
||||||
fileListB: [] as any[],
|
const waitShenheForm = reactive<WaitShenheForm>({
|
||||||
fileListC: [] as any[]
|
form: {
|
||||||
|
newDeptCodeList: [],
|
||||||
|
deptCodeList: []
|
||||||
|
},
|
||||||
|
title: '',
|
||||||
|
isPersonnelTransfer: false,
|
||||||
|
isPartyTransfer: false
|
||||||
})
|
})
|
||||||
|
|
||||||
const baseInfoAbout = reactive({
|
const baseInfoAbout = reactive({
|
||||||
stationTypeList: [] as any[],
|
partBranchList: [] as any[]
|
||||||
atStationList: [] as any[],
|
|
||||||
teacherTypeList: [] as any[],
|
|
||||||
partBranchList: [] as any[],
|
|
||||||
employmentNatureList: [] as any[],
|
|
||||||
stationLevelList: [] as any[],
|
|
||||||
stationDutyLevelList: [] as any[],
|
|
||||||
workTypeList: [] as any[],
|
|
||||||
proTitleList: [] as any[],
|
|
||||||
majorStationList: [] as any[],
|
|
||||||
qualificationList: [] as any[]
|
|
||||||
})
|
})
|
||||||
|
|
||||||
const secDeptList = ref<any[]>([])
|
const secDeptList = ref<any[]>([])
|
||||||
@@ -660,198 +235,85 @@ import { addObj as addPartyChangeObj } from '/@/api/professional/professionaluse
|
|||||||
const newSecChildDeptCode = ref('')
|
const newSecChildDeptCode = ref('')
|
||||||
const teacherNo = ref('')
|
const teacherNo = ref('')
|
||||||
|
|
||||||
// Computed
|
|
||||||
const headers = computed(() => {
|
|
||||||
return {
|
|
||||||
"Authorization": 'Bearer ' + Session.getToken()
|
|
||||||
}
|
|
||||||
})
|
|
||||||
// 方法定义
|
// 方法定义
|
||||||
|
/**
|
||||||
|
* 初始化字典数据
|
||||||
|
*/
|
||||||
const initDicData = async () => {
|
const initDicData = async () => {
|
||||||
try {
|
const response = await getAllInfoAboutList()
|
||||||
const response = await getAllInfoAboutList()
|
const map = response.data
|
||||||
const map = response.data
|
baseInfoAbout.partBranchList = map['partBranchList'] || []
|
||||||
baseInfoAbout.stationTypeList = map['stationTypeList'] || []
|
|
||||||
baseInfoAbout.atStationList = map['atStationList'] || []
|
|
||||||
baseInfoAbout.teacherTypeList = map['teacherTypeList'] || []
|
|
||||||
baseInfoAbout.employmentNatureList = map['employmentNatureList'] || []
|
|
||||||
baseInfoAbout.stationLevelList = map['stationLevelList'] || []
|
|
||||||
baseInfoAbout.stationDutyLevelList = map['stationDutyLevelList'] || []
|
|
||||||
baseInfoAbout.workTypeList = map['workTypeList'] || []
|
|
||||||
baseInfoAbout.proTitleList = map['proTitleList'] || []
|
|
||||||
baseInfoAbout.majorStationList = map['majorStationList'] || []
|
|
||||||
baseInfoAbout.qualificationList = map['qualificationList'] || []
|
|
||||||
baseInfoAbout.partBranchList = map['partBranchList'] || []
|
|
||||||
} catch (error) {
|
|
||||||
// 获取基础信息失败
|
|
||||||
}
|
|
||||||
|
|
||||||
// 加载字典数据
|
|
||||||
loadCertificateTypeList()
|
|
||||||
loadEducationTypeList()
|
|
||||||
loadQualificationList()
|
|
||||||
loadDegreeList()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 初始化对话框
|
||||||
|
* @param val 表单类型:5-人员调动,6-党员调动
|
||||||
|
*/
|
||||||
const init = async (val: number) => {
|
const init = async (val: number) => {
|
||||||
|
if (val !== FORM_TYPE.PERSONNEL_TRANSFER && val !== FORM_TYPE.PARTY_TRANSFER) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
await initDicData()
|
await initDicData()
|
||||||
if (val === 5 || val === 6) {
|
teacherNo.value = props.nowRow.teacherNo
|
||||||
teacherNo.value = props.nowRow.teacherNo
|
handleFormType(val)
|
||||||
handleWaitExam(val)
|
}
|
||||||
} else {
|
|
||||||
// 重置表单数据
|
/**
|
||||||
Object.keys(waitShenheForm.form).forEach(key => {
|
* 处理表单类型显示
|
||||||
if (key !== 'newDeptCodeList' && key !== 'deptCodeList') {
|
* @param val 表单类型
|
||||||
(waitShenheForm.form as any)[key] = ''
|
*/
|
||||||
}
|
const handleFormType = (val: number) => {
|
||||||
})
|
// 重置所有表单状态
|
||||||
|
waitShenheForm.isPersonnelTransfer = false
|
||||||
|
waitShenheForm.isPartyTransfer = false
|
||||||
|
|
||||||
|
if (val === FORM_TYPE.PERSONNEL_TRANSFER) {
|
||||||
|
// 人员调动:加载部门数据
|
||||||
|
waitShenheForm.title = "人员调动"
|
||||||
|
waitShenheForm.isPersonnelTransfer = true
|
||||||
|
waitShenheForm.form = { ...props.nowRow }
|
||||||
waitShenheForm.form.newDeptCodeList = []
|
waitShenheForm.form.newDeptCodeList = []
|
||||||
waitShenheForm.form.deptCodeList = []
|
waitShenheForm.form.deptCodeList = []
|
||||||
materialUrlFrom.fileListA = []
|
newSecDeptCode.value = ''
|
||||||
materialUrlFrom.fileListB = []
|
newSecChildDeptCode.value = ''
|
||||||
materialUrlFrom.fileListC = []
|
|
||||||
materialUrlFrom.url = '/professional/file/teacherAboutInfoUpload'
|
|
||||||
|
|
||||||
// 状态码映射
|
getDeptListByLevelTwo().then((res: any) => {
|
||||||
const statusCodeMap: Record<number, string> = {
|
secDeptList.value = res.data || []
|
||||||
0: "teacherTitle",
|
dialogVisible.value = true
|
||||||
1: "acade",
|
})
|
||||||
2: "title",
|
} else if (val === FORM_TYPE.PARTY_TRANSFER) {
|
||||||
3: "job",
|
// 党员调动:设置原支部
|
||||||
4: "remix"
|
waitShenheForm.title = "党员调动"
|
||||||
}
|
waitShenheForm.isPartyTransfer = true
|
||||||
const statusCode = statusCodeMap[val]
|
waitShenheForm.form = { ...props.nowRow }
|
||||||
|
waitShenheForm.form.id = ''
|
||||||
if (statusCode) {
|
waitShenheForm.form.realName = waitShenheForm.form.userName || waitShenheForm.form.realName
|
||||||
try {
|
waitShenheForm.form.oldBranchName = waitShenheForm.form.oldBranchId
|
||||||
const lockResponse = await checkLocked(statusCode)
|
dialogVisible.value = true
|
||||||
if (lockResponse.data) {
|
|
||||||
message.warning("新增功能已锁定,暂不允许操作")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
const response = await getMyTeacherNo()
|
|
||||||
teacherNo.value = response.data
|
|
||||||
handleWaitExam(val)
|
|
||||||
} catch (error) {
|
|
||||||
message.error('操作失败')
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
handleWaitExam(val)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
const handleWaitExam = (val: number) => {
|
|
||||||
materialUrlFrom.url = '/professional/file/teacherAboutInfoUpload'
|
|
||||||
waitShenheForm.a = false
|
|
||||||
waitShenheForm.b = false
|
|
||||||
waitShenheForm.c = false
|
|
||||||
waitShenheForm.d = false
|
|
||||||
waitShenheForm.e = false
|
|
||||||
waitShenheForm.f = false
|
|
||||||
waitShenheForm.g = false
|
|
||||||
|
|
||||||
// 表单类型配置
|
|
||||||
const formConfig: Record<number, { title: string; field: 'a' | 'b' | 'c' | 'd' | 'e' | 'f' | 'g' }> = {
|
|
||||||
0: { title: "教师资格证", field: 'a' },
|
|
||||||
1: { title: "学历更新", field: 'b' },
|
|
||||||
2: { title: "职称更新", field: 'c' },
|
|
||||||
3: { title: "职业更新", field: 'd' },
|
|
||||||
4: { title: "综合表彰", field: 'e' },
|
|
||||||
5: { title: "人员调动", field: 'f' },
|
|
||||||
6: { title: "党员调动", field: 'g' }
|
|
||||||
}
|
|
||||||
|
|
||||||
const config = formConfig[val]
|
|
||||||
if (config) {
|
|
||||||
waitShenheForm.title = config.title
|
|
||||||
;(waitShenheForm as any)[config.field] = true
|
|
||||||
|
|
||||||
// 特殊处理
|
|
||||||
if (val === 4) {
|
|
||||||
// 综合表彰:重置相关字段
|
|
||||||
materialUrlFrom.fileListA = []
|
|
||||||
waitShenheForm.form.honor = ''
|
|
||||||
waitShenheForm.form.honorCompany = ''
|
|
||||||
waitShenheForm.form.year = ''
|
|
||||||
waitShenheForm.form.attachment = ''
|
|
||||||
} else if (val === 5) {
|
|
||||||
// 人员调动:加载部门数据
|
|
||||||
waitShenheForm.form = { ...props.nowRow }
|
|
||||||
waitShenheForm.form.newDeptCodeList = []
|
|
||||||
waitShenheForm.form.deptCodeList = []
|
|
||||||
newSecDeptCode.value = ''
|
|
||||||
newSecChildDeptCode.value = ''
|
|
||||||
getDeptListByLevelTwo().then((res: any) => {
|
|
||||||
secDeptList.value = res.data
|
|
||||||
educationDialogFromVisible.value = true
|
|
||||||
}).catch(() => {
|
|
||||||
message.error('获取部门列表失败')
|
|
||||||
})
|
|
||||||
} else if (val === 6) {
|
|
||||||
// 党员调动:设置原支部
|
|
||||||
waitShenheForm.form = { ...props.nowRow }
|
|
||||||
waitShenheForm.form.oldBranchName = waitShenheForm.form.oldBranchId
|
|
||||||
}
|
|
||||||
}
|
|
||||||
materialUrlFrom.url = `${materialUrlFrom.url}?teacherNo=${teacherNo.value}&type=${val}`
|
|
||||||
if (val !== 5) {
|
|
||||||
educationDialogFromVisible.value = true
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// 证书编号输入处理(只允许英文和数字)
|
/**
|
||||||
const handleCertificateNumberInput = (value: string) => {
|
* 提交表单
|
||||||
waitShenheForm.form.certificateNumber = value.replace(/[^A-Za-z0-9]/g, '')
|
* @param val 表单类型:5-人员调动,6-党员调动
|
||||||
}
|
*/
|
||||||
|
|
||||||
// 文件上传成功处理
|
|
||||||
const materiaUploadSuccessA = (response: any) => {
|
|
||||||
if (response.data?.code === "-1") {
|
|
||||||
message.error("当前不允许上传文件")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
waitShenheForm.form.mateA = response.data.url
|
|
||||||
}
|
|
||||||
|
|
||||||
const materiaUploadSuccessB = (response: any) => {
|
|
||||||
if (response.data?.code === "-1") {
|
|
||||||
message.error("当前不允许上传文件")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
waitShenheForm.form.mateB = response.data.url
|
|
||||||
}
|
|
||||||
const dialogSubmit = async (val: number) => {
|
const dialogSubmit = async (val: number) => {
|
||||||
waitShenheForm.form.type = val
|
if (val !== FORM_TYPE.PERSONNEL_TRANSFER && val !== FORM_TYPE.PARTY_TRANSFER) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
waitShenheForm.form.teacherNo = teacherNo.value
|
waitShenheForm.form.teacherNo = teacherNo.value
|
||||||
|
|
||||||
// 表单验证配置
|
// 表单验证配置
|
||||||
const formRefMap: Record<number, any> = {
|
const formRefMap: Record<number, any> = {
|
||||||
0: teacherCertificateFormRef.value,
|
[FORM_TYPE.PERSONNEL_TRANSFER]: stationChangeFormRef.value,
|
||||||
1: educationFormRef.value,
|
[FORM_TYPE.PARTY_TRANSFER]: partChangeFormRef.value
|
||||||
2: proFormRef.value,
|
|
||||||
3: workFormRef.value,
|
|
||||||
4: honorFormRef.value,
|
|
||||||
5: stationChangeFormRef.value,
|
|
||||||
6: partChangeFormRef.value
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const formRef = formRefMap[val]
|
const formRef = formRefMap[val]
|
||||||
|
|
||||||
// 材料验证
|
// 人员调动:需要选择部门
|
||||||
if (val === 0 || val === 2 || val === 3 || val === 4) {
|
if (val === FORM_TYPE.PERSONNEL_TRANSFER) {
|
||||||
// 需要上传材料A的表单
|
|
||||||
if (!waitShenheForm.form.mateA) {
|
|
||||||
message.info("请上传资料")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
} else if (val === 1) {
|
|
||||||
// 学历:需要上传材料A或材料B
|
|
||||||
if (!waitShenheForm.form.mateA && !waitShenheForm.form.mateB) {
|
|
||||||
message.info("请上传学历或学位证书")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
} else if (val === 5) {
|
|
||||||
// 人员调动:需要选择部门
|
|
||||||
if (!newSecDeptCode.value) {
|
if (!newSecDeptCode.value) {
|
||||||
message.info("请选择要调入的部门")
|
message.info("请选择要调入的部门")
|
||||||
return
|
return
|
||||||
@@ -871,38 +333,42 @@ import { addObj as addPartyChangeObj } from '/@/api/professional/professionaluse
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
await messageBox.confirm('确认提交?')
|
await messageBox.confirm('确认提交?')
|
||||||
let res
|
let res: any
|
||||||
if (val === 5) {
|
|
||||||
|
if (val === FORM_TYPE.PERSONNEL_TRANSFER) {
|
||||||
// 人员调动:使用人员调动接口
|
// 人员调动:使用人员调动接口
|
||||||
res = await addStationChangeObj(waitShenheForm.form)
|
res = await addStationChangeObj(waitShenheForm.form)
|
||||||
} else if (val === 6) {
|
} else if (val === FORM_TYPE.PARTY_TRANSFER) {
|
||||||
// 党员调动:使用党员调动接口
|
// 党员调动:使用党员调动接口
|
||||||
res = await addPartyChangeObj(waitShenheForm.form)
|
res = await addPartyChangeObj(waitShenheForm.form)
|
||||||
} else {
|
|
||||||
// 其他类型:走通用“其他信息”更新接口
|
|
||||||
res = await updateOtherInfo(waitShenheForm.form)
|
|
||||||
}
|
}
|
||||||
if (res.data === '-1') {
|
|
||||||
|
if (res && res.data === '-1') {
|
||||||
message.warning("当前不允许提交")
|
message.warning("当前不允许提交")
|
||||||
} else {
|
} else if (res) {
|
||||||
message.success("提交成功")
|
message.success("提交成功")
|
||||||
|
emit("getList", props.page)
|
||||||
|
dialogVisible.value = false
|
||||||
}
|
}
|
||||||
emit("getList", props.page)
|
} catch (err: any) {
|
||||||
educationDialogFromVisible.value = false
|
// 处理业务错误
|
||||||
} catch (err) {
|
message.error(err.msg)
|
||||||
// 用户取消
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取子部门列表
|
||||||
|
*/
|
||||||
const getDeptListByParent = async () => {
|
const getDeptListByParent = async () => {
|
||||||
newSecChildDeptCode.value = ''
|
newSecChildDeptCode.value = ''
|
||||||
newSecChildDeptCodeList.value = []
|
newSecChildDeptCodeList.value = []
|
||||||
try {
|
|
||||||
const res = await getDeptListByParentApi(newSecDeptCode.value)
|
if (!newSecDeptCode.value) {
|
||||||
newSecChildDeptCodeList.value = res.data
|
return
|
||||||
} catch (error) {
|
|
||||||
message.error('获取部门列表失败')
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const res = await getDeptListByParentApi(newSecDeptCode.value)
|
||||||
|
newSecChildDeptCodeList.value = res.data || []
|
||||||
}
|
}
|
||||||
|
|
||||||
// 暴露方法
|
// 暴露方法
|
||||||
@@ -911,6 +377,3 @@ import { addObj as addPartyChangeObj } from '/@/api/professional/professionaluse
|
|||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped>
|
|
||||||
|
|
||||||
</style>
|
|
||||||
|
|||||||
@@ -1,36 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="layout-padding">
|
<div class="layout-padding">
|
||||||
<div class="layout-padding-auto layout-padding-view">
|
<div class="layout-padding-auto layout-padding-view">
|
||||||
<!-- 操作按钮 -->
|
|
||||||
<el-row>
|
|
||||||
<div class="mb15" style="width: 100%;">
|
|
||||||
<el-button
|
|
||||||
size="small"
|
|
||||||
v-if="permissions.professional_salary_import"
|
|
||||||
type="primary"
|
|
||||||
@click="handleImportBaseSalary">工资条导入
|
|
||||||
</el-button>
|
|
||||||
<el-button
|
|
||||||
type="primary"
|
|
||||||
size="small"
|
|
||||||
v-if="permissions.professional_seach_auth"
|
|
||||||
@click="canSearch(1)">设置可查询
|
|
||||||
</el-button>
|
|
||||||
<el-button
|
|
||||||
type="primary"
|
|
||||||
size="small"
|
|
||||||
v-if="permissions.professional_seach_auth"
|
|
||||||
@click="canSearch(0)">设置不可查询
|
|
||||||
</el-button>
|
|
||||||
<el-button
|
|
||||||
type="primary"
|
|
||||||
size="small"
|
|
||||||
v-if="permissions.professional_professionalsalaries_del"
|
|
||||||
@click="delbatch">批量删除
|
|
||||||
</el-button>
|
|
||||||
</div>
|
|
||||||
</el-row>
|
|
||||||
|
|
||||||
<!-- 搜索表单 -->
|
<!-- 搜索表单 -->
|
||||||
<search-form
|
<search-form
|
||||||
v-show="showSearch"
|
v-show="showSearch"
|
||||||
@@ -45,7 +15,6 @@
|
|||||||
v-model="search.teacherNo"
|
v-model="search.teacherNo"
|
||||||
placeholder="请输入工号"
|
placeholder="请输入工号"
|
||||||
clearable
|
clearable
|
||||||
style="width: 200px"
|
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
|
||||||
@@ -54,7 +23,6 @@
|
|||||||
v-model="search.realName"
|
v-model="search.realName"
|
||||||
placeholder="请输入姓名"
|
placeholder="请输入姓名"
|
||||||
clearable
|
clearable
|
||||||
style="width: 200px"
|
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
|
||||||
@@ -63,7 +31,6 @@
|
|||||||
v-model="search.idCard"
|
v-model="search.idCard"
|
||||||
placeholder="请输入身份证号"
|
placeholder="请输入身份证号"
|
||||||
clearable
|
clearable
|
||||||
style="width: 200px"
|
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
|
||||||
@@ -75,7 +42,6 @@
|
|||||||
value-format="YYYY"
|
value-format="YYYY"
|
||||||
placeholder="请选择年份"
|
placeholder="请选择年份"
|
||||||
clearable
|
clearable
|
||||||
style="width: 200px"
|
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
|
||||||
@@ -87,7 +53,6 @@
|
|||||||
value-format="M"
|
value-format="M"
|
||||||
placeholder="请选择月份"
|
placeholder="请选择月份"
|
||||||
clearable
|
clearable
|
||||||
style="width: 200px"
|
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
|
||||||
@@ -97,7 +62,6 @@
|
|||||||
filterable
|
filterable
|
||||||
clearable
|
clearable
|
||||||
placeholder="请选择岗位类别"
|
placeholder="请选择岗位类别"
|
||||||
style="width: 200px"
|
|
||||||
>
|
>
|
||||||
<el-option
|
<el-option
|
||||||
v-for="item in stationLevelList"
|
v-for="item in stationLevelList"
|
||||||
@@ -109,8 +73,49 @@
|
|||||||
</el-form-item>
|
</el-form-item>
|
||||||
</template>
|
</template>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
<!-- 查询和重置按钮 -->
|
||||||
|
<template #actions>
|
||||||
|
<el-form-item>
|
||||||
|
<el-button type="primary" @click="handleFilter" icon="Search">查询</el-button>
|
||||||
|
<el-button @click="resetQuery" icon="Refresh">重置</el-button>
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
</search-form>
|
</search-form>
|
||||||
|
|
||||||
|
<!-- 操作按钮 -->
|
||||||
|
<el-row>
|
||||||
|
<div class="mb15">
|
||||||
|
<el-button
|
||||||
|
type="primary"
|
||||||
|
plain
|
||||||
|
icon="UploadFilled"
|
||||||
|
v-if="permissions.professional_salary_import"
|
||||||
|
@click="handleImportBaseSalary">工资条导入
|
||||||
|
</el-button>
|
||||||
|
<el-button
|
||||||
|
icon="View"
|
||||||
|
class="ml10"
|
||||||
|
v-if="permissions.professional_seach_auth"
|
||||||
|
@click="canSearch(1)">设置可查询
|
||||||
|
</el-button>
|
||||||
|
<el-button
|
||||||
|
icon="Hide"
|
||||||
|
class="ml10"
|
||||||
|
v-if="permissions.professional_seach_auth"
|
||||||
|
@click="canSearch(0)">设置不可查询
|
||||||
|
</el-button>
|
||||||
|
<el-button
|
||||||
|
type="danger"
|
||||||
|
plain
|
||||||
|
icon="Delete"
|
||||||
|
class="ml10"
|
||||||
|
v-if="permissions.professional_professionalsalaries_del"
|
||||||
|
@click="delbatch">批量删除
|
||||||
|
</el-button>
|
||||||
|
</div>
|
||||||
|
</el-row>
|
||||||
|
|
||||||
<!-- 表格 -->
|
<!-- 表格 -->
|
||||||
<el-table
|
<el-table
|
||||||
ref="tableRef"
|
ref="tableRef"
|
||||||
@@ -149,7 +154,7 @@
|
|||||||
<el-table-column prop="normalView" label="职工查看" width="120" align="center">
|
<el-table-column prop="normalView" label="职工查看" width="120" align="center">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<el-tag :type="scope.row.normalView === '1' ? 'success' : 'info'">
|
<el-tag :type="scope.row.normalView === '1' ? 'success' : 'info'">
|
||||||
{{ scope.row.normalView === '1' ? '是' : '否' }}
|
{{ scope.row.normalView === '1' ? '可查询' : '不可查询' }}
|
||||||
</el-tag>
|
</el-tag>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
@@ -285,6 +290,20 @@ const handleFilter = () => {
|
|||||||
getDataList() // 查询后跳转到第一页
|
getDataList() // 查询后跳转到第一页
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 重置
|
||||||
|
const resetQuery = () => {
|
||||||
|
searchFormRef.value?.formRef?.resetFields()
|
||||||
|
Object.assign(search, {
|
||||||
|
teacherNo: '',
|
||||||
|
realName: '',
|
||||||
|
idCard: '',
|
||||||
|
nf: '',
|
||||||
|
yf: '',
|
||||||
|
stationTypeId: ''
|
||||||
|
})
|
||||||
|
handleFilter()
|
||||||
|
}
|
||||||
|
|
||||||
// 选择变化
|
// 选择变化
|
||||||
const selectionChange = (selection: any[]) => {
|
const selectionChange = (selection: any[]) => {
|
||||||
selectList.value = selection
|
selectList.value = selection
|
||||||
@@ -303,7 +322,7 @@ const handleImportBaseSalary = () => {
|
|||||||
// 批量删除
|
// 批量删除
|
||||||
const delbatch = () => {
|
const delbatch = () => {
|
||||||
if (selectList.value.length === 0) {
|
if (selectList.value.length === 0) {
|
||||||
message.info("请至少选择一名人员")
|
message.warning("请至少选择一名人员")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -315,7 +334,7 @@ const delbatch = () => {
|
|||||||
if (response.data.code == -1) {
|
if (response.data.code == -1) {
|
||||||
message.error(response.data.data)
|
message.error(response.data.data)
|
||||||
} else {
|
} else {
|
||||||
message.info("删除成功")
|
message.success("删除成功")
|
||||||
getDataList(false) // 删除后保持当前页
|
getDataList(false) // 删除后保持当前页
|
||||||
}
|
}
|
||||||
} catch (error: any) {
|
} catch (error: any) {
|
||||||
@@ -329,7 +348,7 @@ const delbatch = () => {
|
|||||||
// 设置可查询/不可查询
|
// 设置可查询/不可查询
|
||||||
const canSearch = (val: number) => {
|
const canSearch = (val: number) => {
|
||||||
if (selectList.value.length === 0) {
|
if (selectList.value.length === 0) {
|
||||||
message.info("请至少选择一名人员")
|
message.warning("请至少选择一名人员")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,73 +1,78 @@
|
|||||||
<template>
|
<template>
|
||||||
<el-dialog v-model="visible" width="100%" v-loading="baseLoading" top="0" :close-on-click-modal="false" destroy-on-close>
|
<el-dialog
|
||||||
<!--基本信息-->
|
v-model="visible"
|
||||||
<el-card shadow="hover">
|
width="95%"
|
||||||
<el-row :span="24">
|
v-loading="baseLoading"
|
||||||
<el-col>
|
top="2vh"
|
||||||
<el-table
|
:close-on-click-modal="false"
|
||||||
:data="salaryData.baseInfo"
|
destroy-on-close
|
||||||
style="width: 100%">
|
class="salary-info-dialog"
|
||||||
<el-table-column
|
>
|
||||||
prop="realName"
|
<div class="salary-info-container">
|
||||||
label="姓名"
|
<!--基本信息-->
|
||||||
width="80">
|
<div class="base-info-section">
|
||||||
</el-table-column>
|
<div class="base-info-content">
|
||||||
<el-table-column
|
<div class="info-group">
|
||||||
prop="idCard"
|
<div class="info-item">
|
||||||
label="身份证号"
|
<span class="info-label">姓名:</span>
|
||||||
width="200">
|
<el-tag v-if="salaryData.baseInfo[0]?.realName">{{ salaryData.baseInfo[0].realName }}</el-tag>
|
||||||
</el-table-column>
|
<span v-else class="info-value">-</span>
|
||||||
|
</div>
|
||||||
|
<div class="info-item">
|
||||||
|
<span class="info-label">身份证号:</span>
|
||||||
|
<el-tag v-if="salaryData.baseInfo[0]?.idCard">{{ salaryData.baseInfo[0].idCard }}</el-tag>
|
||||||
|
<span v-else class="info-value">-</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<el-form :model="nowUser" :inline="true" class="search-form">
|
||||||
|
<el-form-item label="年份">
|
||||||
|
<el-date-picker
|
||||||
|
v-model="nowUser.nf"
|
||||||
|
type="year"
|
||||||
|
format="YYYY"
|
||||||
|
value-format="YYYY"
|
||||||
|
placeholder="选择年"
|
||||||
|
style="width: 150px">
|
||||||
|
</el-date-picker>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="月份">
|
||||||
|
<el-date-picker
|
||||||
|
v-model="nowUser.yff"
|
||||||
|
type="month"
|
||||||
|
format="M"
|
||||||
|
value-format="M"
|
||||||
|
placeholder="选择月"
|
||||||
|
style="width: 150px">
|
||||||
|
</el-date-picker>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item>
|
||||||
|
<el-button @click="searchUserInfo" type="primary" icon="Search">
|
||||||
|
查询
|
||||||
|
</el-button>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<el-table-column
|
<el-card shadow="hover" class="info-card">
|
||||||
label="年份"
|
<template #header>
|
||||||
width="300">
|
<div class="card-header">
|
||||||
<template #default>
|
<el-icon><Money /></el-icon>
|
||||||
<el-date-picker
|
<span>工资明细</span>
|
||||||
v-model="nowUser.nf"
|
</div>
|
||||||
type="year"
|
</template>
|
||||||
format="YYYY"
|
<!--应发部分-->
|
||||||
value-format="YYYY"
|
<div class="section-title">
|
||||||
style="width: 200px"
|
<el-icon><TrendCharts /></el-icon>
|
||||||
placeholder="选择年">
|
<span>应发部分</span>
|
||||||
</el-date-picker>
|
</div>
|
||||||
</template>
|
<el-table
|
||||||
</el-table-column>
|
:data="salaryData.baseInfo"
|
||||||
|
size="small"
|
||||||
<el-table-column
|
border
|
||||||
label="月份"
|
class="salary-table"
|
||||||
width="300">
|
style="width: 100%"
|
||||||
<template #default>
|
>
|
||||||
<el-date-picker
|
|
||||||
v-model="nowUser.yff"
|
|
||||||
type="month"
|
|
||||||
format="M"
|
|
||||||
value-format="M"
|
|
||||||
style="width: 200px"
|
|
||||||
placeholder="选择月">
|
|
||||||
</el-date-picker>
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
<el-table-column
|
|
||||||
label="操作"
|
|
||||||
width="200">
|
|
||||||
<template #default>
|
|
||||||
<el-button @click="searchUserInfo" type="primary" size="small">搜索</el-button>
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
</el-table>
|
|
||||||
</el-col>
|
|
||||||
</el-row>
|
|
||||||
</el-card>
|
|
||||||
|
|
||||||
<el-card shadow="hover">
|
|
||||||
<!--应发部分-->
|
|
||||||
<el-row>
|
|
||||||
<el-col :span="24">
|
|
||||||
<el-table
|
|
||||||
:data="salaryData.baseInfo"
|
|
||||||
size="small"
|
|
||||||
border
|
|
||||||
>
|
|
||||||
<el-table-column label="应发部分">
|
<el-table-column label="应发部分">
|
||||||
<el-table-column prop="baseSalary" label="基础专项绩效" min-width="60" align="center"></el-table-column>
|
<el-table-column prop="baseSalary" label="基础专项绩效" min-width="60" align="center"></el-table-column>
|
||||||
<el-table-column prop="postSalary" label="岗位工资" min-width="60" align="center"></el-table-column>
|
<el-table-column prop="postSalary" label="岗位工资" min-width="60" align="center"></el-table-column>
|
||||||
@@ -97,41 +102,53 @@
|
|||||||
<el-table-column label="基础工资应税收入" prop="shouldTaxMoney" min-width="60" align="center"></el-table-column>
|
<el-table-column label="基础工资应税收入" prop="shouldTaxMoney" min-width="60" align="center"></el-table-column>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
<el-tag type="danger">基础工资应税收入= 岗位工资 +薪级工资+见习期工资+生活补贴+岗位津贴+教龄津贴+特教补贴+特级教师津贴+特岗津贴(1)+特岗津贴(2)+奖励绩效性工资+乡镇工作补贴+临时补贴+保留津贴+应休未休假-个人补缴-其他扣款-医疗救助金 </el-tag>
|
<div class="formula-tag">
|
||||||
</el-col>
|
<el-tag type="danger" size="small">基础工资应税收入= 岗位工资 +薪级工资+见习期工资+生活补贴+岗位津贴+教龄津贴+特教补贴+特级教师津贴+特岗津贴(1)+特岗津贴(2)+奖励绩效性工资+乡镇工作补贴+临时补贴+保留津贴+应休未休假-个人补缴-其他扣款-医疗救助金</el-tag>
|
||||||
</el-row>
|
</div>
|
||||||
<!--应扣部分-->
|
|
||||||
<el-row>
|
<!--应扣部分-->
|
||||||
<el-col :span="24">
|
<div class="section-title">
|
||||||
<el-table
|
<el-icon><Remove /></el-icon>
|
||||||
size="small"
|
<span>应扣部分</span>
|
||||||
border
|
</div>
|
||||||
:data="salaryData.baseInfo"
|
<el-table
|
||||||
style="width: 100%">
|
size="small"
|
||||||
|
border
|
||||||
|
:data="salaryData.baseInfo"
|
||||||
|
class="salary-table"
|
||||||
|
style="width: 100%">
|
||||||
<el-table-column label="应扣部分">
|
<el-table-column label="应扣部分">
|
||||||
<el-table-column label="住房公积金" width="90" prop="houseFund"></el-table-column>
|
<el-table-column label="住房公积金" min-width="90" prop="houseFund"></el-table-column>
|
||||||
<el-table-column label="医疗保险金" width="90" prop="medicalInsurance"></el-table-column>
|
<el-table-column label="医疗保险金" min-width="90" prop="medicalInsurance"></el-table-column>
|
||||||
<el-table-column label="失业保险金" width="90" prop="unemployInsurance"></el-table-column>
|
<el-table-column label="失业保险金" min-width="90" prop="unemployInsurance"></el-table-column>
|
||||||
<el-table-column label="养老保险金" width="90" prop="endowInsurance"></el-table-column>
|
<el-table-column label="养老保险金" min-width="90" prop="endowInsurance"></el-table-column>
|
||||||
<el-table-column label="工会费" width="60" prop="unionFee"></el-table-column>
|
<el-table-column label="工会费" min-width="60" prop="unionFee"></el-table-column>
|
||||||
<el-table-column label="儿童统筹" width="90" prop="childrenWhole"></el-table-column>
|
<el-table-column label="儿童统筹" min-width="90" prop="childrenWhole"></el-table-column>
|
||||||
<el-table-column label="个人所得税" width="90" prop="personalTax"></el-table-column>
|
<el-table-column label="个人所得税" width="90" prop="personalTax"></el-table-column>
|
||||||
<el-table-column label="其他扣款" width="90" prop="otherDeduction"></el-table-column>
|
<el-table-column label="其他扣款" min-width="90" prop="otherDeduction"></el-table-column>
|
||||||
<el-table-column label="病事假扣款" width="90" prop="sickDeduction"></el-table-column>
|
<el-table-column label="病事假扣款" min-width="90" prop="sickDeduction"></el-table-column>
|
||||||
<el-table-column label="医疗救助基金" width="90" prop="medicalFund"></el-table-column>
|
<el-table-column label="医疗救助基金" min-width="90" prop="medicalFund"></el-table-column>
|
||||||
<el-table-column label="工伤保险" width="90" prop="inductrialInjury"></el-table-column>
|
<el-table-column label="工伤保险" min-width="90" prop="inductrialInjury"></el-table-column>
|
||||||
<el-table-column label="个人补缴" width="90" prop="personalPay"></el-table-column>
|
<el-table-column label="个人补缴" min-width="90" prop="personalPay"></el-table-column>
|
||||||
<el-table-column label="应扣合计" width="90" prop="withhold"></el-table-column>
|
<el-table-column label="应扣合计" min-width="90" prop="withhold"></el-table-column>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
<el-tag>个人所得税 = 个税计算数据中的《 累计应补(退)税额 》</el-tag>
|
<div class="formula-tag">
|
||||||
</el-col>
|
<el-tag size="small">个人所得税 = 个税计算数据中的《 累计应补(退)税额 》</el-tag>
|
||||||
</el-row>
|
</div>
|
||||||
|
|
||||||
<!--劳务费-->
|
<!--劳务费-->
|
||||||
<el-row v-if="showAllContent">
|
<div v-if="showAllContent" class="section-title">
|
||||||
<el-col :span="24">
|
<el-icon><Document /></el-icon>
|
||||||
<el-table size="small" border :data="allProjectData">
|
<span>造单收入清单</span>
|
||||||
|
</div>
|
||||||
|
<el-table
|
||||||
|
v-if="showAllContent"
|
||||||
|
size="small"
|
||||||
|
border
|
||||||
|
:data="allProjectData"
|
||||||
|
class="salary-table"
|
||||||
|
style="width: 100%">
|
||||||
<el-table-column label="造单收入清单">
|
<el-table-column label="造单收入清单">
|
||||||
<el-table-column label="造单部门" prop="deptName"></el-table-column>
|
<el-table-column label="造单部门" prop="deptName"></el-table-column>
|
||||||
<el-table-column label="造单人" prop="createName"></el-table-column>
|
<el-table-column label="造单人" prop="createName"></el-table-column>
|
||||||
@@ -146,17 +163,19 @@
|
|||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
</el-col>
|
|
||||||
</el-row>
|
|
||||||
|
|
||||||
<!--专项扣除-->
|
<!--专项扣除-->
|
||||||
<el-row v-if="showAllContent">
|
<div v-if="showAllContent" class="section-title">
|
||||||
<el-col :span="24">
|
<el-icon><DataAnalysis /></el-icon>
|
||||||
<el-table
|
<span>个税计算数据</span>
|
||||||
size="small"
|
</div>
|
||||||
border
|
<el-table
|
||||||
:data="salaryExtendData"
|
v-if="showAllContent"
|
||||||
style="width: 100%">
|
size="small"
|
||||||
|
border
|
||||||
|
:data="salaryExtendData"
|
||||||
|
class="salary-table"
|
||||||
|
style="width: 100%">
|
||||||
<el-table-column label="个税计算数据">
|
<el-table-column label="个税计算数据">
|
||||||
<el-table-column prop="currentIncome" label="应税收入" min-width="60" align="center"></el-table-column>
|
<el-table-column prop="currentIncome" label="应税收入" min-width="60" align="center"></el-table-column>
|
||||||
<el-table-column prop="totalIncome" label="累计收入额" min-width="60" align="center"></el-table-column>
|
<el-table-column prop="totalIncome" label="累计收入额" min-width="60" align="center"></el-table-column>
|
||||||
@@ -178,37 +197,46 @@
|
|||||||
<el-table-column prop="totalRetrieveTax" label="累计应补(退)税额" min-width="60" align="center"></el-table-column>
|
<el-table-column prop="totalRetrieveTax" label="累计应补(退)税额" min-width="60" align="center"></el-table-column>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
<el-tag type="warning">应税收入= 基础工资应税收入+造单收入 </el-tag>
|
<div v-if="showAllContent" class="formula-tag">
|
||||||
<el-tag type="success">累计专项扣除=当年累计个人承担的住房公积金+医疗保险金+失业保险金+养老保险金 </el-tag>
|
<el-tag type="warning" size="small">应税收入= 基础工资应税收入+造单收入</el-tag>
|
||||||
</el-col>
|
<el-tag type="success" size="small" class="ml10">累计专项扣除=当年累计个人承担的住房公积金+医疗保险金+失业保险金+养老保险金</el-tag>
|
||||||
</el-row>
|
</div>
|
||||||
|
|
||||||
<!--实发合计-->
|
<!--实发合计-->
|
||||||
<el-row>
|
<div class="section-title">
|
||||||
<el-col :span="24">
|
<el-icon><Wallet /></el-icon>
|
||||||
<el-table
|
<span>实发合计</span>
|
||||||
size="small"
|
</div>
|
||||||
border
|
<el-table
|
||||||
:data="[staticsData]"
|
size="small"
|
||||||
empty-text=" ">
|
border
|
||||||
|
:data="[staticsData]"
|
||||||
|
class="salary-table summary-table"
|
||||||
|
empty-text=" "
|
||||||
|
style="width: 100%">
|
||||||
<el-table-column label="小计">
|
<el-table-column label="小计">
|
||||||
<el-table-column label="应发工资" prop="shouldPay"></el-table-column>
|
<el-table-column label="应发工资" prop="shouldPay"></el-table-column>
|
||||||
<el-table-column label="应扣合计" prop="shouldDedu"></el-table-column>
|
<el-table-column label="应扣合计" prop="shouldDedu"></el-table-column>
|
||||||
<el-table-column label="实发工资" prop="realWage"></el-table-column>
|
<el-table-column label="实发工资" prop="realWage"></el-table-column>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
<el-tag type="primary">实发工资= 应发工资-应扣合计 </el-tag>
|
<div class="formula-tag">
|
||||||
</el-col>
|
<el-tag type="primary" size="small">实发工资= 应发工资-应扣合计</el-tag>
|
||||||
</el-row>
|
</div>
|
||||||
</el-card>
|
</el-card>
|
||||||
|
</div>
|
||||||
</el-dialog>
|
</el-dialog>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { ref, reactive, nextTick } from 'vue'
|
import { ref, reactive, nextTick } from 'vue'
|
||||||
|
import { Money, TrendCharts, Remove, Document, DataAnalysis, Wallet, Search } from '@element-plus/icons-vue'
|
||||||
|
import { useMessage } from '/@/hooks/message'
|
||||||
import { queryUserInfo, queryExtendSalaryInfo } from '/@/api/professional/salaries/teacherpayslip'
|
import { queryUserInfo, queryExtendSalaryInfo } from '/@/api/professional/salaries/teacherpayslip'
|
||||||
import { checkAuth } from '/@/api/professional/salaries/teachersalary'
|
import { checkAuth } from '/@/api/professional/salaries/teachersalary'
|
||||||
|
|
||||||
|
const message = useMessage()
|
||||||
|
|
||||||
// 对话框显示状态
|
// 对话框显示状态
|
||||||
const visible = ref(false)
|
const visible = ref(false)
|
||||||
|
|
||||||
@@ -269,11 +297,25 @@ const queryExtendSalaryInfoMethod = async (row: any) => {
|
|||||||
|
|
||||||
// 搜索用户信息
|
// 搜索用户信息
|
||||||
const searchUserInfo = async () => {
|
const searchUserInfo = async () => {
|
||||||
|
if (!nowUser.value.idCard) {
|
||||||
|
message.warning('请输入身份证号')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if (!nowUser.value.nf) {
|
||||||
|
message.warning('请选择年份')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if (!nowUser.value.yff) {
|
||||||
|
message.warning('请选择月份')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
baseLoading.value = true
|
baseLoading.value = true
|
||||||
const data = { idCard: nowUser.value.idCard, nf: nowUser.value.nf, yf: nowUser.value.yff }
|
const data = { idCard: nowUser.value.idCard, nf: nowUser.value.nf, yf: nowUser.value.yff }
|
||||||
try {
|
try {
|
||||||
const response = await queryUserInfo(data)
|
const response = await queryUserInfo(data)
|
||||||
if (response.data.data == null) {
|
if (response.data.data == null) {
|
||||||
|
message.info('未查询到该时间段的数据')
|
||||||
salaryData.baseInfo = []
|
salaryData.baseInfo = []
|
||||||
const obj: any = {}
|
const obj: any = {}
|
||||||
obj.realName = nowUser.value.realName
|
obj.realName = nowUser.value.realName
|
||||||
@@ -291,11 +333,15 @@ const searchUserInfo = async () => {
|
|||||||
} else {
|
} else {
|
||||||
const resData = response.data.data
|
const resData = response.data.data
|
||||||
resData.realName = nowUser.value.realName
|
resData.realName = nowUser.value.realName
|
||||||
|
resData.nf = nowUser.value.nf
|
||||||
|
resData.yf = nowUser.value.yff
|
||||||
|
resData.teacherNo = nowUser.value.teacherNo
|
||||||
makeUserInfo(resData)
|
makeUserInfo(resData)
|
||||||
await queryExtendSalaryInfoMethod(resData)
|
await queryExtendSalaryInfoMethod(resData)
|
||||||
|
message.success('查询成功')
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error: any) {
|
||||||
// 查询失败
|
message.error(error?.msg || '查询失败')
|
||||||
} finally {
|
} finally {
|
||||||
baseLoading.value = false
|
baseLoading.value = false
|
||||||
}
|
}
|
||||||
@@ -319,5 +365,207 @@ defineExpose({
|
|||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped>
|
<style lang="scss" scoped>
|
||||||
|
.salary-info-dialog {
|
||||||
|
:deep(.el-dialog__body) {
|
||||||
|
padding: 10px !important;
|
||||||
|
max-height: calc(100vh - 120px);
|
||||||
|
overflow-y: auto;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.salary-info-container {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.section-header {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 8px;
|
||||||
|
margin-bottom: 16px;
|
||||||
|
padding-bottom: 12px;
|
||||||
|
border-bottom: 1px solid #ebeef5;
|
||||||
|
font-size: 16px;
|
||||||
|
font-weight: 600;
|
||||||
|
color: #303133;
|
||||||
|
|
||||||
|
.el-icon {
|
||||||
|
font-size: 18px;
|
||||||
|
color: var(--el-color-primary);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.section-header-inline {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 6px;
|
||||||
|
font-size: 14px;
|
||||||
|
font-weight: 600;
|
||||||
|
color: #303133;
|
||||||
|
margin-right: 16px;
|
||||||
|
|
||||||
|
.el-icon {
|
||||||
|
font-size: 16px;
|
||||||
|
color: var(--el-color-primary);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.info-card {
|
||||||
|
:deep(.el-card__header) {
|
||||||
|
padding: 16px 20px;
|
||||||
|
background: #f5f7fa;
|
||||||
|
border-bottom: 1px solid #ebeef5;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.el-card__body) {
|
||||||
|
padding: 20px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.base-info-content {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
gap: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.info-group {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
gap: 16px;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.info-item {
|
||||||
|
display: flex;
|
||||||
|
// align-items: center;
|
||||||
|
gap: 6px;
|
||||||
|
|
||||||
|
.info-label {
|
||||||
|
font-weight: 500;
|
||||||
|
color: #606266;
|
||||||
|
font-size: 13px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.info-value {
|
||||||
|
color: #303133;
|
||||||
|
font-size: 13px;
|
||||||
|
font-weight: 500;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.search-form {
|
||||||
|
margin-left: auto;
|
||||||
|
margin-bottom: 0;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.section-title {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 8px;
|
||||||
|
margin: 24px 0 12px 0;
|
||||||
|
padding-bottom: 8px;
|
||||||
|
border-bottom: 2px solid #e4e7ed;
|
||||||
|
font-size: 15px;
|
||||||
|
font-weight: 600;
|
||||||
|
color: #303133;
|
||||||
|
|
||||||
|
.el-icon {
|
||||||
|
font-size: 16px;
|
||||||
|
color: var(--el-color-primary);
|
||||||
|
}
|
||||||
|
|
||||||
|
&:first-child {
|
||||||
|
margin-top: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.salary-table {
|
||||||
|
margin-bottom: 16px;
|
||||||
|
|
||||||
|
:deep(.el-table__header) {
|
||||||
|
th {
|
||||||
|
background: #f5f7fa;
|
||||||
|
color: #606266;
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.el-table__body) {
|
||||||
|
td {
|
||||||
|
padding: 8px 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.el-table__cell) {
|
||||||
|
padding: 8px 4px;
|
||||||
|
font-size: 13px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.summary-table {
|
||||||
|
:deep(.el-table__body) {
|
||||||
|
td {
|
||||||
|
font-weight: 600;
|
||||||
|
font-size: 14px;
|
||||||
|
color: var(--el-color-primary);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.formula-tag {
|
||||||
|
margin-top: 12px;
|
||||||
|
margin-bottom: 8px;
|
||||||
|
line-height: 1.6;
|
||||||
|
|
||||||
|
.el-tag {
|
||||||
|
margin-right: 8px;
|
||||||
|
padding: 6px 12px;
|
||||||
|
font-size: 12px;
|
||||||
|
white-space: normal;
|
||||||
|
word-break: break-all;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ml10 {
|
||||||
|
margin-left: 10px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 响应式优化
|
||||||
|
@media (max-width: 1400px) {
|
||||||
|
.salary-info-dialog {
|
||||||
|
:deep(.el-dialog) {
|
||||||
|
width: 98% !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 滚动条优化
|
||||||
|
.salary-info-dialog {
|
||||||
|
:deep(.el-dialog__body) {
|
||||||
|
&::-webkit-scrollbar {
|
||||||
|
width: 8px;
|
||||||
|
height: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
&::-webkit-scrollbar-track {
|
||||||
|
background: #f1f1f1;
|
||||||
|
border-radius: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
&::-webkit-scrollbar-thumb {
|
||||||
|
background: #c1c1c1;
|
||||||
|
border-radius: 4px;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background: #a8a8a8;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -1,48 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="layout-padding">
|
<div class="layout-padding">
|
||||||
<div class="layout-padding-auto layout-padding-view">
|
<div class="layout-padding-auto layout-padding-view">
|
||||||
<!-- 操作按钮 -->
|
|
||||||
<el-row>
|
|
||||||
<div class="mb15" style="width: 100%;">
|
|
||||||
<el-button
|
|
||||||
size="small"
|
|
||||||
v-if="permissions.professional_salary_import"
|
|
||||||
type="primary"
|
|
||||||
@click="handleImportBaseSalary">人事薪资导入
|
|
||||||
</el-button>
|
|
||||||
<el-button
|
|
||||||
size="small"
|
|
||||||
v-if="permissions.professional_salary_finance_import"
|
|
||||||
type="primary"
|
|
||||||
@click="handleExportSalart">薪资导出
|
|
||||||
</el-button>
|
|
||||||
<el-button
|
|
||||||
size="small"
|
|
||||||
v-if="permissions.professional_salary_finance_import"
|
|
||||||
type="primary"
|
|
||||||
@click="handleImportTaxSalary">税金导入
|
|
||||||
</el-button>
|
|
||||||
<el-button
|
|
||||||
type="primary"
|
|
||||||
size="small"
|
|
||||||
v-if="permissions.professional_seach_auth"
|
|
||||||
@click="canSearch(1)">设置可查询
|
|
||||||
</el-button>
|
|
||||||
<el-button
|
|
||||||
type="primary"
|
|
||||||
size="small"
|
|
||||||
v-if="permissions.professional_seach_auth"
|
|
||||||
@click="canSearch(0)">设置不可查询
|
|
||||||
</el-button>
|
|
||||||
<el-button
|
|
||||||
type="primary"
|
|
||||||
size="small"
|
|
||||||
v-if="permissions.professional_professionalsalaries_del"
|
|
||||||
@click="delbatch">批量删除
|
|
||||||
</el-button>
|
|
||||||
</div>
|
|
||||||
</el-row>
|
|
||||||
|
|
||||||
<!-- 搜索表单 -->
|
<!-- 搜索表单 -->
|
||||||
<search-form
|
<search-form
|
||||||
v-show="showSearch"
|
v-show="showSearch"
|
||||||
@@ -121,8 +79,65 @@
|
|||||||
</el-form-item>
|
</el-form-item>
|
||||||
</template>
|
</template>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
<!-- 查询和重置按钮 -->
|
||||||
|
<template #actions>
|
||||||
|
<el-form-item>
|
||||||
|
<el-button type="primary" @click="handleFilter" icon="Search">查询</el-button>
|
||||||
|
<el-button @click="resetQuery" icon="Refresh">重置</el-button>
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
</search-form>
|
</search-form>
|
||||||
|
|
||||||
|
<!-- 操作按钮 -->
|
||||||
|
<el-row>
|
||||||
|
<div class="mb15">
|
||||||
|
<el-button
|
||||||
|
type="primary"
|
||||||
|
plain
|
||||||
|
icon="UploadFilled"
|
||||||
|
v-if="permissions.professional_salary_import"
|
||||||
|
@click="handleImportBaseSalary">人事薪资导入
|
||||||
|
</el-button>
|
||||||
|
<el-button
|
||||||
|
type="warning"
|
||||||
|
plain
|
||||||
|
icon="Download"
|
||||||
|
class="ml10"
|
||||||
|
v-if="permissions.professional_salary_finance_import"
|
||||||
|
@click="handleExportSalart">薪资导出
|
||||||
|
</el-button>
|
||||||
|
<el-button
|
||||||
|
type="primary"
|
||||||
|
plain
|
||||||
|
icon="UploadFilled"
|
||||||
|
class="ml10"
|
||||||
|
v-if="permissions.professional_salary_finance_import"
|
||||||
|
@click="handleImportTaxSalary">税金导入
|
||||||
|
</el-button>
|
||||||
|
<el-button
|
||||||
|
icon="View"
|
||||||
|
class="ml10"
|
||||||
|
v-if="permissions.professional_seach_auth"
|
||||||
|
@click="canSearch(1)">设置可查询
|
||||||
|
</el-button>
|
||||||
|
<el-button
|
||||||
|
icon="Hide"
|
||||||
|
class="ml10"
|
||||||
|
v-if="permissions.professional_seach_auth"
|
||||||
|
@click="canSearch(0)">设置不可查询
|
||||||
|
</el-button>
|
||||||
|
<el-button
|
||||||
|
type="danger"
|
||||||
|
plain
|
||||||
|
icon="Delete"
|
||||||
|
class="ml10"
|
||||||
|
v-if="permissions.professional_professionalsalaries_del"
|
||||||
|
@click="delbatch">批量删除
|
||||||
|
</el-button>
|
||||||
|
</div>
|
||||||
|
</el-row>
|
||||||
|
|
||||||
<!-- 表格 -->
|
<!-- 表格 -->
|
||||||
<el-table
|
<el-table
|
||||||
ref="tableRef"
|
ref="tableRef"
|
||||||
@@ -161,12 +176,12 @@
|
|||||||
<el-table-column prop="normalView" label="职工查看" width="120" align="center">
|
<el-table-column prop="normalView" label="职工查看" width="120" align="center">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<el-tag :type="scope.row.normalView === '1' ? 'success' : 'info'">
|
<el-tag :type="scope.row.normalView === '1' ? 'success' : 'info'">
|
||||||
{{ scope.row.normalView === '1' ? '是' : '否' }}
|
{{ scope.row.normalView === '1' ? '可查询' : '不可查询' }}
|
||||||
</el-tag>
|
</el-tag>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
|
|
||||||
<el-table-column label="操作" min-width="150" align="center" fixed="right">
|
<el-table-column label="操作" min-width="80" align="center" fixed="right">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<el-button
|
<el-button
|
||||||
icon="document"
|
icon="document"
|
||||||
@@ -299,6 +314,20 @@ const handleFilter = () => {
|
|||||||
getDataList() // 查询后跳转到第一页
|
getDataList() // 查询后跳转到第一页
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 重置
|
||||||
|
const resetQuery = () => {
|
||||||
|
searchFormRef.value?.formRef?.resetFields()
|
||||||
|
Object.assign(search, {
|
||||||
|
teacherNo: '',
|
||||||
|
realName: '',
|
||||||
|
idCard: '',
|
||||||
|
nf: '',
|
||||||
|
yf: '',
|
||||||
|
stationTypeId: ''
|
||||||
|
})
|
||||||
|
handleFilter()
|
||||||
|
}
|
||||||
|
|
||||||
// 选择变化
|
// 选择变化
|
||||||
const selectionChange = (selection: any[]) => {
|
const selectionChange = (selection: any[]) => {
|
||||||
selectList.value = selection
|
selectList.value = selection
|
||||||
@@ -327,7 +356,7 @@ const handleExportSalart = () => {
|
|||||||
// 批量删除
|
// 批量删除
|
||||||
const delbatch = () => {
|
const delbatch = () => {
|
||||||
if (selectList.value.length === 0) {
|
if (selectList.value.length === 0) {
|
||||||
message.info("请至少选择一名人员")
|
message.warning("请至少选择一名人员")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -339,7 +368,7 @@ const delbatch = () => {
|
|||||||
if (response.data.code == -1) {
|
if (response.data.code == -1) {
|
||||||
message.error(response.data.data)
|
message.error(response.data.data)
|
||||||
} else {
|
} else {
|
||||||
message.info("删除成功")
|
message.success("删除成功")
|
||||||
getDataList(false) // 删除后保持当前页
|
getDataList(false) // 删除后保持当前页
|
||||||
}
|
}
|
||||||
} catch (error: any) {
|
} catch (error: any) {
|
||||||
@@ -353,7 +382,7 @@ const delbatch = () => {
|
|||||||
// 设置可查询/不可查询
|
// 设置可查询/不可查询
|
||||||
const canSearch = (val: number) => {
|
const canSearch = (val: number) => {
|
||||||
if (selectList.value.length === 0) {
|
if (selectList.value.length === 0) {
|
||||||
message.info("请至少选择一名人员")
|
message.warning("请至少选择一名人员")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,73 +1,79 @@
|
|||||||
<template>
|
<template>
|
||||||
<el-dialog v-model="visible" width="100%" v-loading="baseLoading" top="0" :close-on-click-modal="false" destroy-on-close>
|
<el-dialog
|
||||||
<!--基本信息-->
|
v-model="visible"
|
||||||
<el-card shadow="hover">
|
width="95%"
|
||||||
<el-row :span="24">
|
v-loading="baseLoading"
|
||||||
<el-col>
|
top="2vh"
|
||||||
<el-table
|
:close-on-click-modal="false"
|
||||||
:data="salaryData.baseInfo"
|
destroy-on-close
|
||||||
style="width: 100%">
|
class="salary-info-dialog"
|
||||||
<el-table-column
|
>
|
||||||
prop="realName"
|
<div class="salary-info-container">
|
||||||
label="姓名"
|
<!--基本信息-->
|
||||||
width="80">
|
<div class="base-info-section">
|
||||||
</el-table-column>
|
<div class="base-info-content">
|
||||||
<el-table-column
|
<div class="info-group">
|
||||||
prop="idCard"
|
<div class="info-item">
|
||||||
label="身份证号"
|
<span class="info-label">姓名:</span>
|
||||||
width="200">
|
<el-tag v-if="salaryData.baseInfo[0]?.realName">{{ salaryData.baseInfo[0].realName }}</el-tag>
|
||||||
</el-table-column>
|
<span v-else class="info-value">-</span>
|
||||||
|
</div>
|
||||||
|
<div class="info-item">
|
||||||
|
<span class="info-label">身份证号:</span>
|
||||||
|
<el-tag v-if="salaryData.baseInfo[0]?.idCard">{{ salaryData.baseInfo[0].idCard }}</el-tag>
|
||||||
|
<span v-else class="info-value">-</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<el-form :model="nowUser" :inline="true" class="search-form">
|
||||||
|
<el-form-item label="年份">
|
||||||
|
<el-date-picker
|
||||||
|
v-model="nowUser.nf"
|
||||||
|
type="year"
|
||||||
|
format="YYYY"
|
||||||
|
value-format="YYYY"
|
||||||
|
placeholder="选择年"
|
||||||
|
style="width: 150px">
|
||||||
|
</el-date-picker>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="月份">
|
||||||
|
<el-date-picker
|
||||||
|
v-model="nowUser.yff"
|
||||||
|
type="month"
|
||||||
|
format="M"
|
||||||
|
value-format="M"
|
||||||
|
placeholder="选择月"
|
||||||
|
style="width: 150px">
|
||||||
|
</el-date-picker>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item>
|
||||||
|
<el-button @click="searchUserInfo" type="primary" icon="Search">
|
||||||
|
查询
|
||||||
|
</el-button>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<el-table-column
|
<el-card shadow="hover" class="info-card">
|
||||||
label="年份"
|
<template #header>
|
||||||
width="300">
|
<div class="card-header">
|
||||||
<template #default>
|
<el-icon><Money /></el-icon>
|
||||||
<el-date-picker
|
<span>工资明细</span>
|
||||||
v-model="nowUser.nf"
|
</div>
|
||||||
type="year"
|
</template>
|
||||||
format="YYYY"
|
<!--应发部分-->
|
||||||
value-format="YYYY"
|
<div v-if="showAllContent" class="section-title">
|
||||||
style="width: 200px"
|
<el-icon><TrendCharts /></el-icon>
|
||||||
placeholder="选择年">
|
<span>应发部分</span>
|
||||||
</el-date-picker>
|
</div>
|
||||||
</template>
|
<el-table
|
||||||
</el-table-column>
|
v-if="showAllContent"
|
||||||
|
:data="salaryData.baseInfo"
|
||||||
<el-table-column
|
size="small"
|
||||||
label="月份"
|
border
|
||||||
width="300">
|
class="salary-table"
|
||||||
<template #default>
|
style="width: 100%"
|
||||||
<el-date-picker
|
>
|
||||||
v-model="nowUser.yff"
|
|
||||||
type="month"
|
|
||||||
format="M"
|
|
||||||
value-format="M"
|
|
||||||
style="width: 200px"
|
|
||||||
placeholder="选择月">
|
|
||||||
</el-date-picker>
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
<el-table-column
|
|
||||||
label="操作"
|
|
||||||
width="200">
|
|
||||||
<template #default>
|
|
||||||
<el-button @click="searchUserInfo" type="primary" size="small">搜索</el-button>
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
</el-table>
|
|
||||||
</el-col>
|
|
||||||
</el-row>
|
|
||||||
</el-card>
|
|
||||||
|
|
||||||
<el-card shadow="hover">
|
|
||||||
<!--应发部分-->
|
|
||||||
<el-row v-if="showAllContent">
|
|
||||||
<el-col :span="24">
|
|
||||||
<el-table
|
|
||||||
:data="salaryData.baseInfo"
|
|
||||||
size="small"
|
|
||||||
border
|
|
||||||
>
|
|
||||||
<el-table-column label="应发部分">
|
<el-table-column label="应发部分">
|
||||||
<el-table-column prop="postSalary" label="岗位工资" min-width="60" align="center"></el-table-column>
|
<el-table-column prop="postSalary" label="岗位工资" min-width="60" align="center"></el-table-column>
|
||||||
<el-table-column prop="payWage" label="薪级工资" min-width="60" align="center"></el-table-column>
|
<el-table-column prop="payWage" label="薪级工资" min-width="60" align="center"></el-table-column>
|
||||||
@@ -96,41 +102,53 @@
|
|||||||
<el-table-column label="基础工资应税收入" prop="shouldTaxMoney" min-width="60" align="center"></el-table-column>
|
<el-table-column label="基础工资应税收入" prop="shouldTaxMoney" min-width="60" align="center"></el-table-column>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
<el-tag type="danger">基础工资应税收入= 岗位工资 +薪级工资+见习期工资+生活补贴+岗位津贴+教龄津贴+特教补贴+特级教师津贴+特岗津贴(1)+特岗津贴(2)+奖励绩效性工资+乡镇工作补贴+临时补贴+保留津贴+应休未休假-个人补缴-其他扣款-医疗救助金 </el-tag>
|
<div v-if="showAllContent" class="formula-tag">
|
||||||
</el-col>
|
<el-tag type="danger" size="small">基础工资应税收入= 岗位工资 +薪级工资+见习期工资+生活补贴+岗位津贴+教龄津贴+特教补贴+特级教师津贴+特岗津贴(1)+特岗津贴(2)+奖励绩效性工资+乡镇工作补贴+临时补贴+保留津贴+应休未休假-个人补缴-其他扣款-医疗救助金</el-tag>
|
||||||
</el-row>
|
</div>
|
||||||
<!--应扣部分-->
|
|
||||||
<el-row v-if="showAllContent">
|
<!--应扣部分-->
|
||||||
<el-col :span="24">
|
<div v-if="showAllContent" class="section-title">
|
||||||
<el-table
|
<el-icon><Remove /></el-icon>
|
||||||
size="small"
|
<span>应扣部分</span>
|
||||||
border
|
</div>
|
||||||
:data="salaryData.baseInfo"
|
<el-table
|
||||||
style="width: 100%">
|
v-if="showAllContent"
|
||||||
|
size="small"
|
||||||
|
border
|
||||||
|
:data="salaryData.baseInfo"
|
||||||
|
class="salary-table"
|
||||||
|
style="width: 100%">
|
||||||
<el-table-column label="应扣部分">
|
<el-table-column label="应扣部分">
|
||||||
<el-table-column label="住房公积金" width="90" prop="houseFund"></el-table-column>
|
<el-table-column label="住房公积金" min-width="90" prop="houseFund"></el-table-column>
|
||||||
<el-table-column label="医疗保险金" width="90" prop="medicalInsurance"></el-table-column>
|
<el-table-column label="医疗保险金" min-width="90" prop="medicalInsurance"></el-table-column>
|
||||||
<el-table-column label="失业保险金" width="90" prop="unemployInsurance"></el-table-column>
|
<el-table-column label="失业保险金" min-width="90" prop="unemployInsurance"></el-table-column>
|
||||||
<el-table-column label="养老保险金" width="90" prop="endowInsurance"></el-table-column>
|
<el-table-column label="养老保险金" min-width="90" prop="endowInsurance"></el-table-column>
|
||||||
<el-table-column label="工会费" width="60" prop="unionFee"></el-table-column>
|
<el-table-column label="工会费" min-width="60" prop="unionFee"></el-table-column>
|
||||||
<el-table-column label="儿童统筹" width="90" prop="childrenWhole"></el-table-column>
|
<el-table-column label="儿童统筹" min-width="90" prop="childrenWhole"></el-table-column>
|
||||||
<el-table-column label="个人所得税" width="90" prop="personalTax"></el-table-column>
|
<el-table-column label="个人所得税" width="90" prop="personalTax"></el-table-column>
|
||||||
<el-table-column label="其他扣款" width="90" prop="otherDeduction"></el-table-column>
|
<el-table-column label="其他扣款" min-width="90" prop="otherDeduction"></el-table-column>
|
||||||
<el-table-column label="病事假扣款" width="90" prop="sickDeduction"></el-table-column>
|
<el-table-column label="病事假扣款" min-width="90" prop="sickDeduction"></el-table-column>
|
||||||
<el-table-column label="医疗救助基金" width="90" prop="medicalFund"></el-table-column>
|
<el-table-column label="医疗救助基金" min-width="90" prop="medicalFund"></el-table-column>
|
||||||
<el-table-column label="工伤保险" width="90" prop="inductrialInjury"></el-table-column>
|
<el-table-column label="工伤保险" min-width="90" prop="inductrialInjury"></el-table-column>
|
||||||
<el-table-column label="个人补缴" width="90" prop="personalPay"></el-table-column>
|
<el-table-column label="个人补缴" min-width="90" prop="personalPay"></el-table-column>
|
||||||
<el-table-column label="应扣合计" width="90" prop="withhold"></el-table-column>
|
<el-table-column label="应扣合计" min-width="90" prop="withhold"></el-table-column>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
<el-tag>个人所得税 = 个税计算数据中的《 累计应补(退)税额 》</el-tag>
|
<div v-if="showAllContent" class="formula-tag">
|
||||||
</el-col>
|
<el-tag size="small">个人所得税 = 个税计算数据中的《 累计应补(退)税额 》</el-tag>
|
||||||
</el-row>
|
</div>
|
||||||
|
|
||||||
<!--劳务费-->
|
<!--劳务费-->
|
||||||
<el-row>
|
<div class="section-title">
|
||||||
<el-col :span="24">
|
<el-icon><Document /></el-icon>
|
||||||
<el-table size="small" border :data="allProjectData" show-summary>
|
<span>造单收入清单</span>
|
||||||
|
</div>
|
||||||
|
<el-table
|
||||||
|
size="small"
|
||||||
|
border
|
||||||
|
:data="allProjectData"
|
||||||
|
class="salary-table"
|
||||||
|
style="width: 100%">
|
||||||
<el-table-column label="造单收入清单">
|
<el-table-column label="造单收入清单">
|
||||||
<el-table-column label="造单部门" prop="deptName"></el-table-column>
|
<el-table-column label="造单部门" prop="deptName"></el-table-column>
|
||||||
<el-table-column label="造单人" prop="createName"></el-table-column>
|
<el-table-column label="造单人" prop="createName"></el-table-column>
|
||||||
@@ -145,17 +163,18 @@
|
|||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
</el-col>
|
|
||||||
</el-row>
|
|
||||||
|
|
||||||
<!--专项扣除-->
|
<!--专项扣除-->
|
||||||
<el-row>
|
<div class="section-title">
|
||||||
<el-col :span="24">
|
<el-icon><DataAnalysis /></el-icon>
|
||||||
<el-table
|
<span>个税计算数据</span>
|
||||||
size="small"
|
</div>
|
||||||
border
|
<el-table
|
||||||
:data="salaryExtendData"
|
size="small"
|
||||||
style="width: 100%">
|
border
|
||||||
|
:data="salaryExtendData"
|
||||||
|
class="salary-table"
|
||||||
|
style="width: 100%">
|
||||||
<el-table-column label="个税计算数据">
|
<el-table-column label="个税计算数据">
|
||||||
<el-table-column prop="currentIncome" label="应税收入" min-width="60" align="center"></el-table-column>
|
<el-table-column prop="currentIncome" label="应税收入" min-width="60" align="center"></el-table-column>
|
||||||
<el-table-column prop="totalIncome" label="累计收入额" min-width="60" align="center"></el-table-column>
|
<el-table-column prop="totalIncome" label="累计收入额" min-width="60" align="center"></el-table-column>
|
||||||
@@ -177,17 +196,24 @@
|
|||||||
<el-table-column prop="totalRetrieveTax" label="累计应补(退)税额" min-width="60" align="center"></el-table-column>
|
<el-table-column prop="totalRetrieveTax" label="累计应补(退)税额" min-width="60" align="center"></el-table-column>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
</el-col>
|
<div class="formula-tag">
|
||||||
</el-row>
|
<el-tag type="warning" size="small">应税收入= 基础工资应税收入+造单收入</el-tag>
|
||||||
|
<el-tag type="success" size="small" class="ml10">累计专项扣除=当年累计个人承担的住房公积金+医疗保险金+失业保险金+养老保险金</el-tag>
|
||||||
|
</div>
|
||||||
|
|
||||||
<!--实发合计-->
|
<!--实发合计-->
|
||||||
<el-row v-if="showAllContent">
|
<div v-if="showAllContent" class="section-title">
|
||||||
<el-col :span="24">
|
<el-icon><Wallet /></el-icon>
|
||||||
<el-table
|
<span>实发合计</span>
|
||||||
size="small"
|
</div>
|
||||||
border
|
<el-table
|
||||||
:data="[staticsData]"
|
v-if="showAllContent"
|
||||||
empty-text=" ">
|
size="small"
|
||||||
|
border
|
||||||
|
:data="[staticsData]"
|
||||||
|
class="salary-table summary-table"
|
||||||
|
empty-text=" "
|
||||||
|
style="width: 100%">
|
||||||
<el-table-column label="小计">
|
<el-table-column label="小计">
|
||||||
<el-table-column label="应发工资" prop="shouldPay"></el-table-column>
|
<el-table-column label="应发工资" prop="shouldPay"></el-table-column>
|
||||||
<el-table-column label="应扣合计" prop="shouldDedu"></el-table-column>
|
<el-table-column label="应扣合计" prop="shouldDedu"></el-table-column>
|
||||||
@@ -195,17 +221,22 @@
|
|||||||
<el-table-column label="造单收入" prop="orderMoney"></el-table-column>
|
<el-table-column label="造单收入" prop="orderMoney"></el-table-column>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
<el-tag type="primary">实发工资= 应发工资-应扣合计 </el-tag>
|
<div v-if="showAllContent" class="formula-tag">
|
||||||
</el-col>
|
<el-tag type="primary" size="small">实发工资= 应发工资-应扣合计</el-tag>
|
||||||
</el-row>
|
</div>
|
||||||
</el-card>
|
</el-card>
|
||||||
|
</div>
|
||||||
</el-dialog>
|
</el-dialog>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { ref, reactive, nextTick } from 'vue'
|
import { ref, reactive, nextTick } from 'vue'
|
||||||
|
import { Money, TrendCharts, Remove, Document, DataAnalysis, Wallet } from '@element-plus/icons-vue'
|
||||||
|
import { useMessage } from '/@/hooks/message'
|
||||||
import { queryUserInfo, queryExtendSalaryInfo, checkAuth } from '/@/api/professional/salaries/teachersalary'
|
import { queryUserInfo, queryExtendSalaryInfo, checkAuth } from '/@/api/professional/salaries/teachersalary'
|
||||||
|
|
||||||
|
const message = useMessage()
|
||||||
|
|
||||||
// 对话框显示状态
|
// 对话框显示状态
|
||||||
const visible = ref(false)
|
const visible = ref(false)
|
||||||
|
|
||||||
@@ -266,11 +297,25 @@ const queryExtendSalaryInfoMethod = async (row: any) => {
|
|||||||
|
|
||||||
// 搜索用户信息
|
// 搜索用户信息
|
||||||
const searchUserInfo = async () => {
|
const searchUserInfo = async () => {
|
||||||
|
if (!nowUser.value.idCard) {
|
||||||
|
message.warning('请输入身份证号')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if (!nowUser.value.nf) {
|
||||||
|
message.warning('请选择年份')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if (!nowUser.value.yff) {
|
||||||
|
message.warning('请选择月份')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
baseLoading.value = true
|
baseLoading.value = true
|
||||||
const data = { idCard: nowUser.value.idCard, nf: nowUser.value.nf, yf: nowUser.value.yff }
|
const data = { idCard: nowUser.value.idCard, nf: nowUser.value.nf, yf: nowUser.value.yff }
|
||||||
try {
|
try {
|
||||||
const response = await queryUserInfo(data)
|
const response = await queryUserInfo(data)
|
||||||
if (response.data.data == null) {
|
if (response.data.data == null) {
|
||||||
|
message.info('未查询到该时间段的数据')
|
||||||
salaryData.baseInfo = []
|
salaryData.baseInfo = []
|
||||||
const obj: any = {}
|
const obj: any = {}
|
||||||
obj.realName = nowUser.value.realName
|
obj.realName = nowUser.value.realName
|
||||||
@@ -288,11 +333,15 @@ const searchUserInfo = async () => {
|
|||||||
} else {
|
} else {
|
||||||
const resData = response.data.data
|
const resData = response.data.data
|
||||||
resData.realName = nowUser.value.realName
|
resData.realName = nowUser.value.realName
|
||||||
|
resData.nf = nowUser.value.nf
|
||||||
|
resData.yf = nowUser.value.yff
|
||||||
|
resData.teacherNo = nowUser.value.teacherNo
|
||||||
makeUserInfo(resData)
|
makeUserInfo(resData)
|
||||||
await queryExtendSalaryInfoMethod(resData)
|
await queryExtendSalaryInfoMethod(resData)
|
||||||
|
message.success('查询成功')
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error: any) {
|
||||||
// 查询失败
|
message.error(error?.msg || '查询失败')
|
||||||
} finally {
|
} finally {
|
||||||
baseLoading.value = false
|
baseLoading.value = false
|
||||||
}
|
}
|
||||||
@@ -316,5 +365,192 @@ defineExpose({
|
|||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped>
|
<style lang="scss" scoped>
|
||||||
|
.salary-info-dialog {
|
||||||
|
:deep(.el-dialog__body) {
|
||||||
|
padding: 10px !important;
|
||||||
|
max-height: calc(100vh - 120px);
|
||||||
|
overflow-y: auto;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.salary-info-container {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.base-info-section {
|
||||||
|
padding: 12px 16px;
|
||||||
|
background: #fff;
|
||||||
|
border-radius: 4px;
|
||||||
|
border: 1px solid #ebeef5;
|
||||||
|
}
|
||||||
|
|
||||||
|
.base-info-content {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
gap: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.info-group {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
gap: 16px;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.info-item {
|
||||||
|
display: flex;
|
||||||
|
gap: 6px;
|
||||||
|
|
||||||
|
.info-label {
|
||||||
|
font-weight: 500;
|
||||||
|
color: #606266;
|
||||||
|
font-size: 13px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.info-value {
|
||||||
|
color: #303133;
|
||||||
|
font-size: 13px;
|
||||||
|
font-weight: 500;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.search-form {
|
||||||
|
margin-left: auto;
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.info-card {
|
||||||
|
:deep(.el-card__header) {
|
||||||
|
padding: 16px 20px;
|
||||||
|
background: #f5f7fa;
|
||||||
|
border-bottom: 1px solid #ebeef5;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.el-card__body) {
|
||||||
|
padding: 20px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.card-header {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 8px;
|
||||||
|
font-size: 16px;
|
||||||
|
font-weight: 600;
|
||||||
|
color: #303133;
|
||||||
|
|
||||||
|
.el-icon {
|
||||||
|
font-size: 18px;
|
||||||
|
color: var(--el-color-primary);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.section-title {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 8px;
|
||||||
|
margin: 24px 0 12px 0;
|
||||||
|
padding-bottom: 8px;
|
||||||
|
border-bottom: 2px solid #e4e7ed;
|
||||||
|
font-size: 15px;
|
||||||
|
font-weight: 600;
|
||||||
|
color: #303133;
|
||||||
|
|
||||||
|
.el-icon {
|
||||||
|
font-size: 16px;
|
||||||
|
color: var(--el-color-primary);
|
||||||
|
}
|
||||||
|
|
||||||
|
&:first-child {
|
||||||
|
margin-top: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.salary-table {
|
||||||
|
margin-bottom: 16px;
|
||||||
|
|
||||||
|
:deep(.el-table__header) {
|
||||||
|
th {
|
||||||
|
background: #f5f7fa;
|
||||||
|
color: #606266;
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.el-table__body) {
|
||||||
|
td {
|
||||||
|
padding: 8px 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.el-table__cell) {
|
||||||
|
padding: 8px 4px;
|
||||||
|
font-size: 13px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.summary-table {
|
||||||
|
:deep(.el-table__body) {
|
||||||
|
td {
|
||||||
|
font-weight: 600;
|
||||||
|
font-size: 14px;
|
||||||
|
color: var(--el-color-primary);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.formula-tag {
|
||||||
|
margin-top: 12px;
|
||||||
|
margin-bottom: 8px;
|
||||||
|
line-height: 1.6;
|
||||||
|
|
||||||
|
.el-tag {
|
||||||
|
margin-right: 8px;
|
||||||
|
padding: 6px 12px;
|
||||||
|
font-size: 12px;
|
||||||
|
white-space: normal;
|
||||||
|
word-break: break-all;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ml10 {
|
||||||
|
margin-left: 10px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 响应式优化
|
||||||
|
@media (max-width: 1400px) {
|
||||||
|
.salary-info-dialog {
|
||||||
|
:deep(.el-dialog) {
|
||||||
|
width: 98% !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 滚动条优化
|
||||||
|
.salary-info-dialog {
|
||||||
|
:deep(.el-dialog__body) {
|
||||||
|
&::-webkit-scrollbar {
|
||||||
|
width: 8px;
|
||||||
|
height: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
&::-webkit-scrollbar-track {
|
||||||
|
background: #f1f1f1;
|
||||||
|
border-radius: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
&::-webkit-scrollbar-thumb {
|
||||||
|
background: #c1c1c1;
|
||||||
|
border-radius: 4px;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background: #a8a8a8;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -233,8 +233,9 @@ const handleSubmit = async () => {
|
|||||||
}
|
}
|
||||||
dialogVisible.value = false
|
dialogVisible.value = false
|
||||||
getDataList()
|
getDataList()
|
||||||
} catch (error) {
|
} catch (error: any) {
|
||||||
// 提交失败
|
// 处理业务错误
|
||||||
|
message.error(error.msg)
|
||||||
} finally {
|
} finally {
|
||||||
submitLoading.value = false
|
submitLoading.value = false
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user