Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
J
jilinzhongdianrenqun-web
概览
Overview
Details
Activity
Cycle Analytics
版本库
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
问题
0
Issues
0
列表
Board
标记
里程碑
合并请求
0
Merge Requests
0
CI / CD
CI / CD
流水线
作业
日程表
图表
维基
Wiki
代码片段
Snippets
成员
Members
Collapse sidebar
Close sidebar
活动
图像
聊天
创建新问题
作业
提交
Issue Boards
Open sidebar
吴超
jilinzhongdianrenqun-web
Commits
8a78816c
Commit
8a78816c
authored
Dec 31, 2025
by
yubin
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
修改
parent
5b0860eb
隐藏空白字符变更
内嵌
并排
正在显示
2 个修改的文件
包含
86 行增加
和
160 行删除
+86
-160
src/view/key-person/key_dm_leave/index.vue
+85
-136
src/view/key-person/key_dm_user/index.vue
+1
-24
没有找到文件。
src/view/key-person/key_dm_leave/index.vue
View file @
8a78816c
...
...
@@ -28,7 +28,9 @@
<template
slot=
"action"
slot-scope=
"
{ row }">
<Button
size=
"small"
class=
"mr10"
@
click=
"openDetail(row)"
>
详细
</Button>
<Button
size=
"small"
type=
"primary"
class=
"mr10"
@
click=
"openEdit(row)"
v-if=
"canEdit(row)"
>
修改
</Button>
<Button
size=
"small"
type=
"success"
class=
"mr10"
@
click=
"submit(row)"
v-if=
"canSubmit(row)"
>
提交
</Button>
<Poptip
confirm
title=
"确认提交此请假申请进入审批流程?"
transfer
@
on-ok=
"submit(row)"
v-if=
"canSubmit(row)"
>
<Button
size=
"small"
type=
"success"
class=
"mr10"
>
提交
</Button>
</Poptip>
<Poptip
confirm
title=
"确认删除?"
transfer
@
on-ok=
"deleteApply(row)"
v-if=
"canDelete(row)"
>
<Button
size=
"small"
type=
"error"
class=
"mr10"
>
删除
</Button>
</Poptip>
...
...
@@ -42,7 +44,7 @@
show-total
show-sizer
@
on-change=
"pageChange('apply', $event)"
@
on-page-size-change=
"sizeChange('apply', $event)"
/>
</TabPane>
<TabPane
:label=
"'请假待审核'"
name=
"pending"
>
<TabPane
:label=
"'请假待审核'"
name=
"pending"
v-if=
"power.leave_approval"
>
<Table
border
:loading=
"loading.pending"
:columns=
"pendingColumns"
:data=
"tables.pending"
>
<
template
slot=
"action"
slot-scope=
"{ row }"
>
<div
class=
"action-buttons"
>
...
...
@@ -54,7 +56,7 @@
show-total
show-sizer
@
on-change=
"pageChange('pending', $event)"
@
on-page-size-change=
"sizeChange('pending', $event)"
/>
</TabPane>
<TabPane
label=
"审核历史查询"
name=
"history"
>
<TabPane
label=
"审核历史查询"
name=
"history"
v-if=
"power.leave_view"
>
<div
class=
"search-div"
>
<Row
type=
"flex"
:gutter=
"16"
align=
"middle"
>
<Col
span=
"18"
>
...
...
@@ -62,10 +64,8 @@
<DatePicker
v-model=
"filters.history.start_time"
type=
"date"
placeholder=
"开始日期"
style=
"width: 200px"
class=
"mr10"
/>
<span>
结束:
</span>
<DatePicker
v-model=
"filters.history.end_time"
type=
"date"
placeholder=
"结束日期"
style=
"width: 200px"
class=
"mr10"
/>
<span>
状态:
</span>
<Select
v-model=
"filters.history.status"
style=
"width: 200px"
>
<Option
v-for=
"opt in statusOptionsFor('history')"
:key=
"opt.id"
:value=
"opt.id"
>
{{ opt.name }}
</Option>
</Select>
<span>
审批人:
</span>
<Input
v-model=
"filters.history.approver_name"
placeholder=
"请输入审批人姓名"
style=
"width: 200px"
/>
</Col>
<Col
span=
"6"
class=
"text-right"
>
<Button
type=
"primary"
class=
"mr10"
@
click=
"handleSearch('history')"
>
搜索
</Button>
...
...
@@ -82,7 +82,7 @@
show-total
show-sizer
@
on-change=
"pageChange('history', $event)"
@
on-page-size-change=
"sizeChange('history', $event)"
/>
</TabPane>
<TabPane
label=
"请假申请查询"
name=
"query"
>
<TabPane
label=
"请假申请查询"
name=
"query"
v-if=
"power.leave_view"
>
<div
class=
"search-div"
>
<Row
type=
"flex"
:gutter=
"16"
align=
"middle"
>
<Col
span=
"18"
>
...
...
@@ -110,7 +110,7 @@
show-total
show-sizer
@
on-change=
"pageChange('query', $event)"
@
on-page-size-change=
"sizeChange('query', $event)"
/>
</TabPane>
<TabPane
label=
"请假统计"
name=
"stats"
>
<TabPane
label=
"请假统计"
name=
"stats"
v-if=
"power.leave_view"
>
<div
class=
"search-div"
>
<Row
type=
"flex"
:gutter=
"16"
align=
"middle"
>
<Col
span=
"18"
>
...
...
@@ -156,7 +156,7 @@
<Input
v-model=
"applyModal.form.emergency_phone"
/>
</FormItem>
<FormItem
label=
"审批人"
prop=
"approver_id"
>
<Select
v-if=
"leaveApprovalOptions.length > 0"
v-model=
"applyModal.form.approver_id"
style=
"width: 60%"
>
<Select
v-if=
"leaveApprovalOptions.length > 0"
v-model=
"applyModal.form.approver_id"
style=
"width: 60%"
filterable
>
<Option
v-for=
"opt in leaveApprovalOptions"
:key=
"opt.id"
:value=
"opt.id"
>
{{ opt.name }}
</Option>
</Select>
<span
v-else
style=
"color: #999; font-style: italic;"
>
请先进行审批人配置
</span>
...
...
@@ -180,6 +180,9 @@
<FormItem
label=
"起止时间"
>
<span>
{{ formatDatetime(approveModal.record.start_time) }} - {{ formatDatetime(approveModal.record.end_time) }}
</span>
</FormItem>
<FormItem
label=
"请假时长(天)"
>
<span>
{{ approveModal.record.duration || '-' }}
</span>
</FormItem>
<FormItem
label=
"请假事由"
>
<span>
{{ approveModal.record.reason }}
</span>
</FormItem>
...
...
@@ -203,7 +206,7 @@
<Checkbox
v-model=
"approveModal.transferEnabled"
>
转审核
</Checkbox>
</FormItem>
<FormItem
v-if=
"approveModal.transferEnabled"
label=
"选择审批人"
prop=
"transferApprover"
>
<Select
v-if=
"leaveApprovalOptions.length > 0"
v-model=
"approveModal.transferApprover"
style=
"width: 60%"
placeholder=
"请选择审批人"
>
<Select
v-if=
"leaveApprovalOptions.length > 0"
v-model=
"approveModal.transferApprover"
style=
"width: 60%"
placeholder=
"请选择审批人"
filterable
>
<Option
v-for=
"opt in leaveApprovalOptions"
:key=
"opt.id"
:value=
"opt.id"
>
{{ opt.name }}
</Option>
</Select>
<span
v-else
style=
"color: #999; font-style: italic;"
>
请先进行审批人配置
</span>
...
...
@@ -235,6 +238,7 @@
</Row>
<Row
class=
"mt8"
><Col
span=
"24"
><p><strong>
请假类型:
</strong>
{{ detailModal.data.leave_type_name || '-' }}
</p></Col></Row>
<Row
class=
"mt8"
><Col
span=
"24"
><p><strong>
起止时间:
</strong>
{{ formatDatetime(detailModal.data.start_time) }} - {{ formatDatetime(detailModal.data.end_time) }}
</p></Col></Row>
<Row
class=
"mt8"
><Col
span=
"24"
><p><strong>
请假时长(天):
</strong>
{{ detailModal.data.duration || '-' }}
</p></Col></Row>
<Row
class=
"mt8"
><Col
span=
"24"
><p><strong>
请假事由:
</strong>
{{ detailModal.data.reason || '-' }}
</p></Col></Row>
<Row
class=
"mt8"
><Col
span=
"24"
><p><strong>
状态:
</strong>
{{ mapStatusText(detailModal.data.status) }}
</p></Col></Row>
<Row
v-if=
"detailModal.data.status === -1 || String(detailModal.data.status) === '-1'"
class=
"mt8"
><Col
span=
"24"
><p><strong>
驳回理由:
</strong>
{{ detailModal.data.back_reason || detailModal.data.backReason || '-' }}
</p></Col></Row>
...
...
@@ -282,6 +286,7 @@ import {
getLeaveById
,
getLeaveTypeList
,
deleteLeaveById
,
getUserDmPermissionList
,
selectTransferApprovalList
,
transferLeaveApproval
,
getLeaveApprovalPermission
...
...
@@ -293,7 +298,7 @@ export default {
data
()
{
return
{
activeTab
:
'apply'
,
filters
:
{
apply
:
{
start_time
:
null
,
end_time
:
null
,
status
:
''
},
history
:
{
start_time
:
null
,
end_time
:
null
,
status
:
''
},
query
:
{
start_time
:
null
,
end_time
:
null
,
status
:
''
}
},
filters
:
{
apply
:
{
start_time
:
null
,
end_time
:
null
,
status
:
''
},
history
:
{
start_time
:
null
,
end_time
:
null
,
approver_id
:
''
},
query
:
{
start_time
:
null
,
end_time
:
null
,
status
:
''
}
},
// 下拉:请假审核权限可选人员
leaveApprovalOptions
:
[],
// 下拉:转审核审批人列表
...
...
@@ -336,14 +341,16 @@ export default {
{
type
:
'index'
,
title
:
'序号'
,
width
:
60
,
align
:
'center'
},
{
title
:
'申请人'
,
key
:
'user_name'
,
align
:
'center'
},
{
title
:
'请假类型'
,
key
:
'leave_type_name'
,
align
:
'center'
},
{
title
:
'起止时间'
,
key
:
'start_time'
,
align
:
'center'
,
render
:
(
h
,
{
row
})
=>
h
(
'span'
,
`
${
row
.
start_time
||
'-'
}
~
${
row
.
end_time
||
'-'
}
`
)
},
{
title
:
'起止时间'
,
key
:
'start_time'
,
align
:
'center'
,
width
:
300
,
render
:
(
h
,
{
row
})
=>
h
(
'span'
,
`
${
row
.
start_time
||
'-'
}
~
${
row
.
end_time
||
'-'
}
`
)
},
{
title
:
'审批完成时间'
,
key
:
'approval_complete_time'
,
align
:
'center'
},
{
title
:
'处理结果'
,
key
:
'op_result'
,
align
:
'center'
,
render
:
(
h
,
{
row
})
=>
h
(
'span'
,
this
.
renderApproveResult
(
row
.
op_result
))
},
{
title
:
'操作'
,
slot
:
'action'
,
align
:
'center'
,
width
:
100
}
],
queryColumns
:
[
{
type
:
'index'
,
title
:
'序号'
,
width
:
60
,
align
:
'center'
},
{
title
:
'申请人'
,
key
:
'user_name'
,
align
:
'center'
},
{
title
:
'状态'
,
key
:
'status'
,
align
:
'center'
,
render
:
(
h
,
{
row
})
=>
h
(
'span'
,
this
.
mapStatusText
(
row
.
status
))
},
{
title
:
'提交时间'
,
key
:
'submit_time'
,
align
:
'center'
},
{
title
:
'操作'
,
slot
:
'action'
,
align
:
'center'
,
width
:
100
}
],
...
...
@@ -378,78 +385,43 @@ export default {
}
],
applyModal
:
{
visible
:
false
,
isEdit
:
false
,
saving
:
false
,
form
:
{}
},
// 控制是否在赋值时触发自动计算(true = 允许计算;false = 赋值时不计算)
suppressDurationCalc
:
false
,
// NOTE: 自动计算时长逻辑已移除,保留字段移除
approveModal
:
{
visible
:
false
,
record
:
{},
comment
:
''
,
submitting
:
false
,
transferEnabled
:
false
,
transferApprover
:
''
,
approvalFlow
:
[]
},
transferModal
:
{
visible
:
false
,
selectedApprover
:
''
,
comment
:
''
,
processing
:
false
,
record
:
{}
},
detailModal
:
{
visible
:
false
,
loading
:
false
,
data
:
{},
approvals
:
[]
},
statsStart
:
new
Date
(
new
Date
().
getFullYear
(),
new
Date
().
getMonth
(),
1
),
statsEnd
:
new
Date
(),
statsDept
:
''
,
power
:
{
leave_approval
:
false
,
// 请假审核
leave_view
:
false
,
// 请假查询(统计)
supply_approval
:
false
,
// 用品申领审核
supply_view
:
false
,
// 用品查询(统计)
inventory_manager
:
false
// 库存管理
},
// 表单验证规则
applyRules
:
{
leave_type_id
:
[
{
required
:
true
,
message
:
'请选择请假类型'
,
trigger
:
'
change
'
}
{
required
:
true
,
message
:
'请选择请假类型'
,
trigger
:
'
input
'
}
],
start_time
:
[
{
required
:
true
,
message
:
'请选择开始时间'
,
trigger
:
'
change
'
,
type
:
'date'
}
{
required
:
true
,
message
:
'请选择开始时间'
,
trigger
:
'
input
'
,
type
:
'date'
}
],
end_time
:
[
{
required
:
true
,
message
:
'请选择结束时间'
,
trigger
:
'
change
'
,
type
:
'date'
}
{
required
:
true
,
message
:
'请选择结束时间'
,
trigger
:
'
input
'
,
type
:
'date'
}
],
duration
:
[
{
validator
:
function
(
rule
,
value
,
callback
)
{
const
form
=
(
this
&&
this
.
applyModal
&&
this
.
applyModal
.
form
)
?
this
.
applyModal
.
form
:
{}
const
parseToDateLocal
=
(
v
)
=>
{
if
(
v
===
null
||
v
===
undefined
||
v
===
''
)
return
null
if
(
typeof
v
===
'number'
)
return
new
Date
(
v
)
if
(
typeof
v
===
'string'
)
{
if
(
/^
\d
+$/
.
test
(
v
))
return
new
Date
(
Number
(
v
))
const
s
=
v
.
includes
(
'T'
)
?
v
:
v
.
replace
(
' '
,
'T'
)
const
parsed
=
new
Date
(
s
)
return
isNaN
(
parsed
.
getTime
())
?
null
:
parsed
}
if
(
v
instanceof
Date
)
return
isNaN
(
v
.
getTime
())
?
null
:
v
const
parsed
=
new
Date
(
v
)
return
isNaN
(
parsed
.
getTime
())
?
null
:
parsed
}
// 解析起止时间的整天差
const
sd
=
parseToDateLocal
(
form
.
start_time
)
const
ed
=
parseToDateLocal
(
form
.
end_time
)
let
fullDays
=
0
if
(
sd
&&
ed
)
{
const
diff
=
ed
.
getTime
()
-
sd
.
getTime
()
fullDays
=
Math
.
floor
(
diff
/
(
1000
*
60
*
60
*
24
))
}
// 如果不足整天,不校验(允许用户填写任意时长)
if
(
fullDays
<
1
)
{
callback
();
return
}
// 整天或以上时,必须填写且整数部分需与计算天数一致
if
(
value
===
null
||
value
===
undefined
||
String
(
value
).
trim
()
===
''
)
{
callback
(
new
Error
(
'请填写请假时长'
));
return
}
const
num
=
Number
(
value
)
if
(
isNaN
(
num
)
||
num
<=
0
)
{
callback
(
new
Error
(
'请假天数必须为大于 0 的数字'
));
return
}
const
integerPart
=
Math
.
floor
(
num
)
if
(
integerPart
!==
fullDays
)
{
callback
(
new
Error
(
`请假整数天应为
${
fullDays
}
天,请确认`
));
return
}
callback
()
},
trigger
:
'blur'
}
required
:
true
,
message
:
'请填写请假时长'
,
trigger
:
'input'
},
],
approver_id
:
[
{
required
:
true
,
message
:
'请选择审批人'
,
trigger
:
'
change
'
}
{
required
:
true
,
message
:
'请选择审批人'
,
trigger
:
'
input
'
}
],
reason
:
[
{
required
:
true
,
message
:
'请填写请假事由'
,
trigger
:
'
change
'
}
{
required
:
true
,
message
:
'请填写请假事由'
,
trigger
:
'
input
'
}
],
emergency_phone
:
[
{
message
:
'请输入紧急电话'
,
trigger
:
'blur'
},
...
...
@@ -459,7 +431,6 @@ export default {
trigger
:
'blur'
}
],
// (必填性与具体数值由上面的 validator 决定)
}
}
},
...
...
@@ -469,23 +440,11 @@ export default {
this
.
loadLeaveApprovalOptions
()
// 加载待审批计数,用于页面顶部/选项卡徽章显示
this
.
loadPendingCount
()
//
将 duration 的 validator 绑定到组件实例的方法,确保内部能访问 this.applyModal.form
this
.
applyRules
.
duration
=
[{
validator
:
this
.
validateDuration
,
trigger
:
'blur'
}]
//
已移除自动计算时长,保留表单规则在 data 中定义(不在 created 中覆盖)
this
.
getUserDmPermission
()
},
watch
:
{
// 监听开始时间和结束时间变化,自动计算天数
'applyModal.form.start_time'
(
newVal
)
{
if
(
this
.
suppressDurationCalc
)
return
// 用户修改起始时间时,先清空已有时长(避免与新时间不符),再进行自动计算
if
(
this
.
applyModal
&&
this
.
applyModal
.
form
)
this
.
applyModal
.
form
.
duration
=
''
this
.
calculateDuration
()
},
'applyModal.form.end_time'
(
newVal
)
{
if
(
this
.
suppressDurationCalc
)
return
// 用户修改结束时间时,先清空已有时长(避免与新时间不符),再进行自动计算
if
(
this
.
applyModal
&&
this
.
applyModal
.
form
)
this
.
applyModal
.
form
.
duration
=
''
this
.
calculateDuration
()
},
// 自动计算时长逻辑已移除:开始/结束时间变化不再自动修改 duration 字段
// 当弹窗关闭时清理选择的审批人,确保下次打开时下拉框能正确刷新显示
'applyModal.visible'
(
val
)
{
if
(
!
val
&&
this
.
applyModal
&&
this
.
applyModal
.
form
)
{
...
...
@@ -513,7 +472,22 @@ export default {
}
},
methods
:
{
// validator 方法:确保能通过 this 访问组件数据
getUserDmPermission
()
{
getUserDmPermissionList
({}).
then
(
ret
=>
{
console
.
log
(
'ret'
,
ret
)
if
(
ret
.
data
&&
ret
.
data
.
errcode
===
0
)
{
const
data
=
ret
.
data
.
data
||
[]
for
(
let
i
=
0
;
i
<
data
.
length
;
i
++
)
{
var
ele
=
data
[
i
]
if
(
this
.
power
.
hasOwnProperty
(
ele
.
code
))
{
this
.
power
[
ele
.
code
]
=
true
}
}
}
else
{
this
.
$Notice
.
error
({
title
:
'查询失败'
,
desc
:
ret
.
data
.
errmsg
||
'请稍后重试'
})
}
})
},
validateDuration
(
rule
,
value
,
callback
)
{
const
form
=
this
.
applyModal
&&
this
.
applyModal
.
form
?
this
.
applyModal
.
form
:
{}
const
parseToDateLocal
=
(
v
)
=>
{
...
...
@@ -561,36 +535,13 @@ export default {
// 过滤掉 id 为 '0' 或 0 的未提交选项
return
(
this
.
statusOptions
||
[]).
filter
(
opt
=>
String
(
opt
.
id
)
!==
'0'
)
},
// 计算请假天数(只计算整天,忽略零点几部分)
calculateDuration
()
{
const
form
=
this
.
applyModal
.
form
if
(
!
form
||
!
form
.
start_time
||
!
form
.
end_time
)
return
const
startDate
=
new
Date
(
form
.
start_time
)
const
endDate
=
new
Date
(
form
.
end_time
)
if
(
isNaN
(
startDate
.
getTime
())
||
isNaN
(
endDate
.
getTime
()))
return
if
(
endDate
.
getTime
()
<=
startDate
.
getTime
())
return
// 计算整天数(向下取整),只要整天 >=1 则自动填充为整数天
const
diffTime
=
endDate
.
getTime
()
-
startDate
.
getTime
()
const
fullDays
=
Math
.
floor
(
diffTime
/
(
1000
*
60
*
60
*
24
))
const
existing
=
form
.
duration
!==
null
&&
form
.
duration
!==
undefined
&&
String
(
form
.
duration
).
trim
()
!==
''
if
(
fullDays
>=
1
)
{
// 只有当表单中尚未填写时才自动填充,避免覆盖后端/用户已有值
if
(
!
existing
)
form
.
duration
=
String
(
fullDays
)
}
else
{
// 少于整天时不自动计算,交由用户手动填写(例如半天、几小时)
// 不覆盖已有用户填写的值
if
(
!
existing
)
form
.
duration
=
''
}
},
// 自动计算请假时长逻辑已移除,duration 由用户手动填写/后端计算
handleTabChange
(
name
)
{
this
.
activeTab
=
name
if
(
name
===
'pending'
)
this
.
fetchList
(
'pending'
)
if
(
name
===
'history'
)
this
.
fetchList
(
'history'
)
if
(
name
===
'query'
)
this
.
fetchList
(
'query'
)
if
(
name
===
'stats'
)
this
.
loadStats
()
},
fetchList
(
tab
)
{
const
apiMap
=
{
apply
:
getLeaveListByUserId
,
pending
:
getPendingLeaveList
,
history
:
getLeaveApprovalHistory
,
query
:
getLeaveList
}
...
...
@@ -750,7 +701,15 @@ export default {
return
String
(
status
)
},
handleSearch
(
tab
)
{
(
this
.
pagers
[
tab
]
||
{}).
pageNo
=
1
;
this
.
fetchList
(
tab
)
},
handleReset
(
tab
)
{
this
.
filters
[
tab
]
=
{};
(
this
.
pagers
[
tab
]
||
{}).
pageNo
=
1
;
this
.
fetchList
(
tab
)
},
handleReset
(
tab
)
{
if
(
tab
===
'history'
)
{
this
.
filters
.
history
=
{
start_time
:
null
,
end_time
:
null
,
approver_id
:
''
}
}
else
{
this
.
filters
[
tab
]
=
{}
}
(
this
.
pagers
[
tab
]
||
{}).
pageNo
=
1
this
.
fetchList
(
tab
)
},
pageChange
(
tab
,
pageNo
)
{
(
this
.
pagers
[
tab
]
||
{}).
pageNo
=
pageNo
;
this
.
fetchList
(
tab
)
},
sizeChange
(
tab
,
size
)
{
(
this
.
pagers
[
tab
]
||
{}).
pageSize
=
size
;
(
this
.
pagers
[
tab
]
||
{}).
pageNo
=
1
;
this
.
fetchList
(
tab
)
},
loadLeaveTypes
()
{
...
...
@@ -856,18 +815,14 @@ export default {
// 默认开始时间为当天(时分秒置为 0),精确到天
const
today
=
new
Date
()
today
.
setHours
(
0
,
0
,
0
,
0
)
// 在赋值期间禁止自动计算,直到下一个 tick 再恢复,避免渲染期间 watcher 覆盖表单值
this
.
suppressDurationCalc
=
true
// 不再自动计算时长,表单由用户手动填写 duration
this
.
applyModal
.
form
=
{
user_id
:
''
,
user_name
:
''
,
leave_type_id
:
''
,
start_time
:
today
,
end_time
:
''
,
duration_unit
:
2
,
duration
:
''
,
reason
:
''
,
emergency_contact
:
''
,
emergency_phone
:
''
,
approver_id
:
this
.
selectedApprovalUser
||
''
}
this
.
$nextTick
(()
=>
{
this
.
suppressDurationCalc
=
false
})
this
.
applyModal
.
visible
=
true
},
openEdit
(
row
)
{
this
.
applyModal
.
isEdit
=
true
// 在赋值期间禁止自动计算,直到渲染稳定后再恢复,避免覆盖已有 duration
this
.
suppressDurationCalc
=
true
// 编辑模式:直接将行数据赋值到表单,不再触发自动计算
this
.
applyModal
.
form
=
Object
.
assign
({},
row
)
this
.
$nextTick
(()
=>
{
this
.
suppressDurationCalc
=
false
})
// ensure approver_id exists on form when editing
if
(
!
this
.
applyModal
.
form
.
approver_id
)
this
.
applyModal
.
form
.
approver_id
=
row
.
approver_id
||
row
.
approverId
||
row
.
transfer_to_id
||
''
// 保证与 leaveApprovalOptions 中 id 的类型一致(字符串)
...
...
@@ -946,13 +901,9 @@ export default {
return
status
===
0
},
submit
(
row
)
{
this
.
$Modal
.
confirm
({
title
:
'确认提交'
,
content
:
'确认提交此请假申请进入审批流程?'
,
onOk
:
()
=>
{
submitLeaveApplication
({
id
:
row
.
id
,
leave_id
:
row
.
leave_id
}).
then
(
ret
=>
{
if
(
ret
.
data
&&
ret
.
data
.
errcode
===
0
)
{
this
.
$Message
.
success
(
'提交成功'
);
this
.
fetchList
(
'apply'
)
}
else
this
.
$Notice
.
error
({
title
:
'提交失败'
,
desc
:
ret
.
data
&&
ret
.
data
.
errmsg
})
})
}
})
submitLeaveApplication
({
id
:
row
.
id
,
leave_id
:
row
.
leave_id
}).
then
(
ret
=>
{
if
(
ret
.
data
&&
ret
.
data
.
errcode
===
0
)
{
this
.
$Message
.
success
(
'提交成功'
);
this
.
fetchList
(
'apply'
)
}
else
this
.
$Notice
.
error
({
title
:
'提交失败'
,
desc
:
ret
.
data
&&
ret
.
data
.
errmsg
})
})
},
revoke
(
row
)
{
revokeLeaveApplication
({
id
:
row
.
id
,
leave_id
:
row
.
leave_id
}).
then
(
ret
=>
{
...
...
@@ -1090,8 +1041,6 @@ export default {
refillApply
()
{
// 将批准记录数据反显到申请表单,清除 id 和 leave_id
this
.
applyModal
.
isEdit
=
false
// 在赋值期间禁止自动计算,直到渲染稳定后再恢复
this
.
suppressDurationCalc
=
true
this
.
applyModal
.
form
=
{
leave_type_id
:
this
.
approveModal
.
record
.
leave_type_id
||
''
,
start_time
:
this
.
approveModal
.
record
.
start_time
||
''
,
...
...
@@ -1102,7 +1051,6 @@ export default {
approver_id
:
this
.
approveModal
.
record
.
approver_id
||
this
.
selectedApprovalUser
||
''
}
// 不保留 id 和 leave_id,保持为空
this
.
$nextTick
(()
=>
{
this
.
suppressDurationCalc
=
false
})
this
.
applyModal
.
visible
=
true
// 关闭审批弹窗
this
.
approveModal
.
visible
=
false
...
...
@@ -1110,8 +1058,6 @@ export default {
refillApplyDirect
(
row
)
{
// 直接从列表行数据进行重新填报,清除 id 和 leave_id
this
.
applyModal
.
isEdit
=
false
// 在赋值期间禁止自动计算,直到渲染稳定后再恢复
this
.
suppressDurationCalc
=
true
this
.
applyModal
.
form
=
{
leave_type_id
:
row
.
leave_type_id
||
''
,
start_time
:
row
.
start_time
||
''
,
...
...
@@ -1122,7 +1068,6 @@ export default {
approver_id
:
row
.
approver_id
||
this
.
selectedApprovalUser
||
''
}
// 不保留 id 和 leave_id,保持为空
this
.
$nextTick
(()
=>
{
this
.
suppressDurationCalc
=
false
})
this
.
applyModal
.
visible
=
true
},
openDetail
(
row
)
{
...
...
@@ -1164,16 +1109,20 @@ export default {
}).
finally
(()
=>
{
this
.
detailModal
.
loading
=
false
})
},
openHistoryDetail
(
row
)
{
this
.
openDetail
(
row
)
},
renderApproveResult
(
h
,
{
row
})
{
return
row
.
approver_result
===
1
?
'通过'
:
(
row
.
approver_result
===
-
1
?
'驳回'
:
'未处理'
)
},
renderApproveResult
(
result
)
{
if
(
result
===
1
||
result
===
'1'
)
return
'通过'
if
(
result
===
-
1
||
result
===
'-1'
)
return
'驳回'
if
(
result
===
2
||
result
===
'2'
)
return
'转审'
return
'未处理'
},
formatDatetime
(
val
)
{
if
(
!
val
)
return
'-'
;
return
String
(
val
).
replace
(
'T'
,
' '
)
},
loadStats
()
{
this
.
loading
.
stats
=
true
const
params
=
{
start
:
this
.
statsStart
,
end
:
this
.
statsEnd
,
getLeaveStats
(
{
start
:
this
.
statsStart
?
this
.
formatForDbDatetime
(
this
.
statsStart
)
:
null
,
end
:
this
.
statsEnd
?
this
.
formatForDbDatetime
(
this
.
statsEnd
)
:
null
,
department
:
this
.
statsDept
}
getLeaveStats
({
params
}).
then
(
ret
=>
{
}).
then
(
ret
=>
{
if
(
ret
.
data
&&
ret
.
data
.
errcode
===
0
)
{
console
.
log
(
'ret.data.data'
,
ret
.
data
.
data
)
this
.
tables
.
stats
=
ret
.
data
.
data
||
[]
...
...
@@ -1183,10 +1132,10 @@ export default {
}).
finally
(()
=>
{
this
.
loading
.
stats
=
false
})
},
resetStats
()
{
this
.
statsStart
=
n
ull
this
.
statsEnd
=
n
ull
this
.
statsStart
=
n
ew
Date
(
new
Date
().
getFullYear
(),
new
Date
().
getMonth
(),
1
)
this
.
statsEnd
=
n
ew
Date
()
this
.
statsDept
=
''
this
.
tables
.
stats
=
[]
this
.
loadStats
()
},
deleteApply
(
row
)
{
...
...
src/view/key-person/key_dm_user/index.vue
View file @
8a78816c
...
...
@@ -275,30 +275,7 @@ export default {
// no strict validation here, just save
const
formData
=
Object
.
assign
({
}
,
this
.
editModal
.
form
)
// 如果当前为未离职状态,不提交离职时间字段
if
(
formData
.
is_leave
!==
1
)
{
if
(
formData
.
leave_time
!==
undefined
)
delete
formData
.
leave_time
if
(
formData
.
_raw_leave_time
!==
undefined
)
delete
formData
.
_raw_leave_time
}
else
{
// is_leave === 1 时按原逻辑处理离职时间
if
(
formData
.
_raw_leave_time
!==
undefined
)
{
formData
.
leave_time
=
formData
.
_raw_leave_time
}
else
if
(
formData
.
leave_time
&&
typeof
formData
.
leave_time
===
'string'
)
{
// 纯数字字符串(时间戳)
if
(
/^
\d
+$/
.
test
(
formData
.
leave_time
))
{
formData
.
leave_time
=
Number
(
formData
.
leave_time
)
}
else
{
// 尝试将常见格式 yyyy-MM-dd HH:mm:ss 转为 ISO 再解析
const
parsed
=
new
Date
(
formData
.
leave_time
.
replace
(
' '
,
'T'
))
if
(
!
isNaN
(
parsed
.
getTime
()))
{
formData
.
leave_time
=
parsed
.
getTime
()
}
}
}
else
if
(
formData
.
leave_time
instanceof
Date
)
{
formData
.
leave_time
=
formData
.
leave_time
.
getTime
()
}
// 清理临时字段
if
(
formData
.
_raw_leave_time
!==
undefined
)
delete
formData
.
_raw_leave_time
}
this
.
editModal
.
saving
=
true
formData
.
in_work_time
=
formData
.
in_work_time
?
normalizeVisitTimeValue
(
formData
.
in_work_time
)
:
null
formData
.
leave_time
=
formData
.
leave_time
?
normalizeVisitTimeValue
(
formData
.
leave_time
)
:
null
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论