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
9aad480f
Commit
9aad480f
authored
Dec 30, 2025
by
yubin
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
离职时间添加
parent
30a96ce8
显示空白字符变更
内嵌
并排
正在显示
4 个修改的文件
包含
226 行增加
和
39 行删除
+226
-39
src/api/key-dm-user.js
+10
-0
src/view/key-person/key_dm_conf/index.vue
+1
-1
src/view/key-person/key_dm_leave/index.vue
+125
-36
src/view/key-person/key_dm_user/index.vue
+90
-2
没有找到文件。
src/api/key-dm-user.js
View file @
9aad480f
...
...
@@ -60,3 +60,12 @@ export const getUserMultiSelectorList = (param) => {
data
:
param
})
}
// 根据ID获取单个用户信息
export
const
getDmUserById
=
(
param
)
=>
{
return
axios
.
request
({
url
:
'/api/ac/jilinsscgsdp/keyDmUser/getById'
,
method
:
'post'
,
data
:
param
})
}
\ No newline at end of file
src/view/key-person/key_dm_conf/index.vue
View file @
9aad480f
...
...
@@ -1035,7 +1035,7 @@ export default {
user_ids
:
userIds
}).
then
(
ret
=>
{
if
(
ret
.
data
&&
ret
.
data
.
errcode
===
0
)
{
this
.
fetchList
(
"org"
)
this
.
fetchList
(
'org'
)
this
.
$Message
.
success
(
'保存成功'
)
this
.
userAssignModal
.
visible
=
false
}
else
{
...
...
src/view/key-person/key_dm_leave/index.vue
View file @
9aad480f
<
template
>
<div
class=
"key-dm-leave-wrapper"
>
<div
v-if=
"pendingCount > 0"
class=
"pushCls"
>
<div
class=
"pushIconCls"
>
!
</div>
</div>
<Tabs
v-model=
"activeTab"
@
on-click=
"handleTabChange"
class=
"tabsCls"
>
<TabPane
label=
"请假申请"
name=
"apply"
>
<div
class=
"search-div"
>
<Row
type=
"flex"
:gutter=
"16"
class=
"mt8"
>
<Col
span=
"
20
"
>
<Col
span=
"
12
"
>
<span>
开始:
</span>
<DatePicker
v-model=
"filters.apply.start_time"
type=
"date"
placeholder=
"开始日期"
style=
"min-width:110px;margin-right:20px"
/>
<span>
结束:
</span>
<DatePicker
v-model=
"filters.apply.end_time"
type=
"date"
placeholder=
"结束日期"
style=
"min-width:110px;margin-right:20px"
/>
</Col>
<Col
span=
"8"
>
<span>
状态:
</span>
<Select
v-model=
"filters.apply.status"
style=
"width:
150px
"
>
<Select
v-model=
"filters.apply.status"
style=
"width:
60%
"
>
<Option
v-for=
"opt in statusOptions"
:key=
"opt.id"
:value=
"opt.id"
>
{{
opt
.
name
}}
</Option>
</Select>
</Col>
<Col
span=
"4"
class=
"text-right"
>
<Button
type=
"primary"
class=
"mr10"
@
click=
"handleSearch('apply')"
>
搜索
</Button>
<Button
type=
"primary"
class=
"mr10"
@
click=
"handleReset('apply')"
>
重置
</Button>
<Button
type=
"
primary
"
@
click=
"openApplyModal"
>
申请
</Button>
<Button
class=
"mr10"
@
click=
"handleReset('apply')"
>
重置
</Button>
<Button
type=
"
success
"
@
click=
"openApplyModal"
>
申请
</Button>
</Col>
</Row>
</div>
...
...
@@ -36,12 +41,7 @@
show-total
show-sizer
@
on-change=
"pageChange('apply', $event)"
@
on-page-size-change=
"sizeChange('apply', $event)"
/>
</TabPane>
<TabPane
name=
"pending"
>
<
template
slot=
"label"
>
<span
class=
"tab-label"
>
请假待审核
<span
v-if=
"pendingCount > 0"
class=
"exclaim-inline"
>
!
</span>
</span>
</
template
>
<TabPane
:label=
"'请假待审核'"
name=
"pending"
>
<Table
border
:loading=
"loading.pending"
:columns=
"pendingColumns"
:data=
"tables.pending"
>
<
template
slot=
"action"
slot-scope=
"{ row }"
>
<div
class=
"action-buttons"
>
...
...
@@ -56,19 +56,21 @@
<TabPane
label=
"审核历史查询"
name=
"history"
>
<div
class=
"search-div"
>
<Row
type=
"flex"
:gutter=
"16"
align=
"middle"
>
<Col
span=
"
20
"
>
<Col
span=
"
12
"
>
<span>
开始:
</span>
<DatePicker
v-model=
"filters.history.start_time"
type=
"date"
placeholder=
"开始日期"
style=
"min-width:110px;margin-right:20px"
/>
<span>
结束:
</span>
<DatePicker
v-model=
"filters.history.end_time"
type=
"date"
placeholder=
"结束日期"
style=
"min-width:110px;margin-right:20px"
/>
</Col>
<Col
span=
"8"
>
<span>
状态:
</span>
<Select
v-model=
"filters.history.status"
style=
"width:
150px"
class=
"mr10
"
>
<Select
v-model=
"filters.history.status"
style=
"width:
60%
"
>
<Option
v-for=
"opt in statusOptions"
:key=
"opt.id"
:value=
"opt.id"
>
{{ opt.name }}
</Option>
</Select>
</Col>
<Col
span=
"4"
class=
"text-right"
>
<Button
type=
"primary"
class=
"mr10"
@
click=
"handleSearch('history')"
>
搜索
</Button>
<Button
type=
"primary"
@
click=
"handleReset('history')"
>
重置
</Button>
<Button
@
click=
"handleReset('history')"
>
重置
</Button>
</Col>
</Row>
</div>
...
...
@@ -84,19 +86,21 @@
<TabPane
label=
"请假申请查询"
name=
"query"
>
<div
class=
"search-div"
>
<Row
type=
"flex"
:gutter=
"16"
align=
"middle"
>
<Col
span=
"1
6
"
>
<Col
span=
"1
2
"
>
<span>
开始:
</span>
<DatePicker
v-model=
"filters.query.start_time"
type=
"date"
placeholder=
"开始日期"
style=
"min-width:110px;margin-right:20px"
/>
<span>
结束:
</span>
<DatePicker
v-model=
"filters.query.end_time"
type=
"date"
placeholder=
"结束日期"
style=
"min-width:110px;margin-right:20px"
/>
</Col>
<Col
span=
"8"
>
<span>
状态:
</span>
<Select
v-model=
"filters.query.status"
style=
"width:
150px
"
>
<Select
v-model=
"filters.query.status"
style=
"width:
60%
"
>
<Option
v-for=
"opt in statusOptions"
:key=
"opt.id"
:value=
"opt.id"
>
{{ opt.name }}
</Option>
</Select>
</Col>
<Col
span=
"
8
"
class=
"text-right"
>
<Col
span=
"
4
"
class=
"text-right"
>
<Button
type=
"primary"
class=
"mr10"
@
click=
"handleSearch('query')"
>
搜索
</Button>
<Button
type=
"primary"
@
click=
"handleReset('query')"
>
重置
</Button>
<Button
@
click=
"handleReset('query')"
>
重置
</Button>
</Col>
</Row>
</div>
...
...
@@ -117,12 +121,11 @@
<DatePicker
v-model=
"statsStart"
type=
"date"
placeholder=
"开始日期"
style=
"min-width:110px;margin-right:20px"
/>
<span>
结束:
</span>
<DatePicker
v-model=
"statsEnd"
type=
"date"
placeholder=
"结束日期"
style=
"min-width:110px;margin-right:20px"
/>
<span>
部门:
</span>
<Input
v-model=
"statsDept"
placeholder=
"请输入部门名称"
style=
"width: 200px"
/>
</Col>
<Col
span=
"8"
class=
"text-right"
>
<Button
type=
"primary"
class=
"mr10"
@
click=
"loadStats"
>
统计
</Button>
<Button
type=
"primary"
@
click=
"resetStats"
>
重置
</Button>
<Button
@
click=
"resetStats"
>
重置
</Button>
</Col>
</Row>
</div>
...
...
@@ -132,7 +135,7 @@
<!-- 申请弹窗 -->
<Modal
v-model=
"applyModal.visible"
:title=
"applyModal.isEdit ? '修改请假' : '新增请假'"
width=
"700"
>
<Form
:model=
"applyModal.form"
:label-width=
"120"
ref=
"applyForm"
>
<Form
:model=
"applyModal.form"
:
rules=
"applyRules"
:
label-width=
"120"
ref=
"applyForm"
>
<FormItem
label=
"请假类型"
prop=
"leave_type_id"
>
<Select
v-model=
"applyModal.form.leave_type_id"
style=
"width: 60%"
>
<Option
v-for=
"opt in leaveTypes"
:key=
"opt.id"
:value=
"opt.id"
>
{{ opt.type_name }}
</Option>
...
...
@@ -150,7 +153,7 @@
<FormItem
label=
"紧急联系人"
>
<Input
v-model=
"applyModal.form.emergency_contact"
/>
</FormItem>
<FormItem
label=
"紧急电话"
>
<FormItem
label=
"紧急电话"
prop=
"emergency_phone"
>
<Input
v-model=
"applyModal.form.emergency_phone"
/>
</FormItem>
<FormItem
label=
"指定审批人"
prop=
"approver_id"
>
...
...
@@ -312,10 +315,10 @@ export default {
{
title
:
'申请人'
,
key
:
'user_name'
,
align
:
'center'
},
{
title
:
'部门'
,
key
:
'department_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'
,
width
:
300
,
align
:
'center'
,
render
:
(
h
,
{
row
})
=>
h
(
'span'
,
`
${
row
.
start_time
||
'-'
}
~
${
row
.
end_time
||
'-'
}
`
)
},
{
title
:
'时长'
,
key
:
'duration'
,
align
:
'center'
},
{
title
:
'状态'
,
key
:
'status'
,
align
:
'center'
,
render
:
(
h
,
{
row
})
=>
h
(
'span'
,
this
.
mapStatusText
(
row
.
status
))
},
{
title
:
'操作'
,
slot
:
'action'
,
align
:
'center'
,
width
:
32
0
}
{
title
:
'操作'
,
slot
:
'action'
,
align
:
'center'
,
width
:
16
0
}
],
pendingColumns
:
[
{
type
:
'index'
,
title
:
'序号'
,
width
:
60
,
align
:
'center'
},
...
...
@@ -342,8 +345,8 @@ export default {
],
statsColumns
:
[
{
type
:
'index'
,
title
:
'序号'
,
width
:
60
,
align
:
'center'
},
{
title
:
'人员'
,
key
:
'user_name'
,
align
:
'center'
},
{
title
:
'部门'
,
key
:
'department_name'
,
align
:
'center'
},
{
title
:
'人员'
,
key
:
'user_name'
,
align
:
'center'
},
{
title
:
'已通过天数'
,
key
:
'passed_days'
,
align
:
'center'
}
],
detailApprovalColumns
:
[
...
...
@@ -376,7 +379,30 @@ export default {
detailModal
:
{
visible
:
false
,
loading
:
false
,
data
:
{},
approvals
:
[]
},
statsStart
:
new
Date
(
new
Date
().
getFullYear
(),
new
Date
().
getMonth
(),
1
),
statsEnd
:
new
Date
(),
statsDept
:
''
statsDept
:
''
,
// 表单验证规则
applyRules
:
{
leave_type_id
:
[
{
required
:
true
,
message
:
'请选择请假类型'
,
trigger
:
'change'
}
],
start_time
:
[
{
required
:
true
,
message
:
'请选择开始时间'
,
trigger
:
'change'
,
type
:
'date'
}
],
end_time
:
[
{
required
:
true
,
message
:
'请选择结束时间'
,
trigger
:
'change'
,
type
:
'date'
}
],
approver_id
:
[
{
required
:
true
,
message
:
'请选择指定审批人'
,
trigger
:
'change'
}
],
emergency_phone
:
[
{
message
:
'请输入紧急电话'
,
trigger
:
'blur'
},
{
pattern
:
/^
(
1
[
3-9
]\d{9})
|
((
0
\d{2,3}
-
?)?\d{7,8})
$/
,
message
:
'请输入有效的电话号码'
,
trigger
:
'blur'
}
]
}
}
},
created
()
{
...
...
@@ -419,7 +445,6 @@ export default {
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
:
getPendingList
,
history
:
getApprovalHistory
,
query
:
getLeaveList
}
...
...
@@ -519,6 +544,8 @@ export default {
* Prepare query params: normalize start_time/end_time into DB datetime strings.
* - If start_time exists, set to 00:00:00 of that day.
* - If end_time exists, set to 23:59:59 of that day.
* - If only end_time is selected, set start_time to a very early date (e.g., 1970-01-01)
* to ensure backend queries records before the end_time.
* Returns a shallow copy of filters[tab] with formatted strings.
*/
prepareQueryParams
(
tab
)
{
...
...
@@ -532,15 +559,21 @@ export default {
return
isNaN
(
d
.
getTime
())
?
null
:
d
}
catch
(
e
)
{
return
null
}
}
// Handle start_time
if
(
raw
.
start_time
)
{
const
sd
=
parseToDate
(
raw
.
start_time
)
if
(
sd
)
{
sd
.
setHours
(
0
,
0
,
0
,
0
)
raw
.
start_time
=
this
.
formatForDbDatetime
(
sd
)
}
}
else
if
(
raw
.
end_time
&&
!
raw
.
start_time
)
{
// If only end_time is selected, set start_time to a very early date
// to ensure backend queries all records before the end_time
raw
.
start_time
=
'1970-01-01 00:00:00'
}
// 只有当用户选择了结束时间时,才设置结束时间的查询条件
//
如果没有选择结束时间,则不设置 end_time,让后端查询从开始时间之后的所有记录
//
Handle end_time
if
(
raw
.
end_time
)
{
const
ed
=
parseToDate
(
raw
.
end_time
)
if
(
ed
)
{
...
...
@@ -600,6 +633,7 @@ export default {
},
loadLeaveApprovalOptions
()
{
// 从后端获取有请假审批权限的机构/人员列表,并映射为 { id, name } 供 Select 使用
// 如果返回数据中存在 leader===1 的条目,则默认将 selectedApprovalUser 设为该 id(优先使用 leader 标记的审批人)
getLeaveApprovalPermission
().
then
(
res
=>
{
const
d
=
res
&&
res
.
data
let
results
=
[]
...
...
@@ -610,6 +644,17 @@ export default {
else
if
(
d
.
data
&&
Array
.
isArray
(
d
.
data
.
results
))
results
=
d
.
data
.
results
}
// 先尝试找到 leader === 1 的条目(支持数字或字符串)
let
leaderId
=
''
for
(
let
it
of
(
results
||
[]))
{
if
(
!
it
)
continue
if
(
it
.
leader
===
1
||
it
.
leader
===
'1'
)
{
const
rawId
=
it
.
user_id
||
it
.
id
||
it
.
userId
||
''
leaderId
=
rawId
===
null
||
rawId
===
undefined
?
''
:
String
(
rawId
)
break
}
}
// 统一将 id 转为字符串,避免类型不一致导致 Select 无法正确匹配显示
this
.
leaveApprovalOptions
=
(
results
||
[]).
map
(
it
=>
{
const
rawId
=
it
.
user_id
||
it
.
id
||
it
.
userId
||
''
...
...
@@ -618,6 +663,14 @@ export default {
name
:
it
.
user_name
||
it
.
name
||
it
.
userName
||
it
.
nick
||
''
}
})
// 如果存在 leader,默认选中该用户(不覆盖已有已选值,除非为空)
if
(
leaderId
)
{
// 仅在当前未有已选审批人时设置默认值,避免影响编辑场景
if
(
!
this
.
selectedApprovalUser
||
String
(
this
.
selectedApprovalUser
).
trim
()
===
''
)
{
this
.
selectedApprovalUser
=
leaderId
}
}
}).
catch
(
err
=>
{
console
.
error
(
'loadLeaveApprovalOptions error'
,
err
)
})
...
...
@@ -674,7 +727,10 @@ export default {
this
.
applyModal
.
visible
=
true
},
saveApply
()
{
this
.
applyModal
.
saving
=
true
this
.
$refs
.
applyForm
.
validate
((
valid
)
=>
{
if
(
!
valid
)
{
return
false
}
// 验证开始/结束时间:结束时间必须大于开始时间
const
form
=
this
.
applyModal
.
form
||
{}
...
...
@@ -711,6 +767,7 @@ export default {
if
(
payload
.
start_time
)
payload
.
start_time
=
this
.
formatForDbDatetime
(
payload
.
start_time
)
if
(
payload
.
end_time
)
payload
.
end_time
=
this
.
formatForDbDatetime
(
payload
.
end_time
)
this
.
applyModal
.
saving
=
true
saveLeaveApplication
(
payload
).
then
(
ret
=>
{
if
(
ret
.
data
&&
ret
.
data
.
errcode
===
0
)
{
this
.
$Message
.
success
(
'保存成功'
)
...
...
@@ -718,6 +775,7 @@ export default {
this
.
fetchList
(
'apply'
)
}
else
this
.
$Notice
.
error
({
title
:
'保存失败'
,
desc
:
ret
.
data
&&
ret
.
data
.
errmsg
})
}).
finally
(()
=>
{
this
.
applyModal
.
saving
=
false
})
})
},
canEdit
(
row
)
{
const
status
=
row
&&
row
.
status
!==
null
&&
row
.
status
!==
undefined
?
Number
(
row
.
status
)
:
null
...
...
@@ -1005,13 +1063,44 @@ export default {
text-align
:
center
;
}
.tab-label
{
display
:
inline-flex
;
align-items
:
center
;
gap
:
6px
;
}
.exclaim-inline
{
color
:
#ff4d4f
;
font-weight
:
700
;
display
:
inline-block
;
/* badge positioning (like key-person-dual) */
.pushCls
{
position
:
absolute
;
z-index
:
10
;
left
:
202px
;
top
:
10px
;
}
.pushIconCls
{
position
:
relative
;
z-index
:
11
;
cursor
:
pointer
;
color
:
red
;
font-weight
:
bold
;
font-size
:
16px
;
margin-left
:
6px
;
transform
:
translateY
(
-6px
);
line-height
:
16px
;
}
</
style
>
<
style
>
/* ensure tab label content from slot (rendered by Tabs component) is visible */
.tab-label
{
display
:
inline-flex
;
align-items
:
center
;
gap
:
6px
;
color
:
#333
!important
;
font-weight
:
500
;
}
.exclaim-badge
{
background
:
#ff4d4f
!important
;
color
:
#fff
!important
;
border-radius
:
10px
!important
;
padding
:
0
6px
!important
;
font-weight
:
700
!important
;
display
:
inline-block
!important
;
line-height
:
18px
!important
;
margin-left
:
6px
;
min-width
:
14px
;
text-align
:
center
;
font-size
:
12px
;
}
</
style
>
src/view/key-person/key_dm_user/index.vue
View file @
9aad480f
...
...
@@ -61,11 +61,14 @@
<
Input
v
-
model
=
"editModal.form.leader_name"
readonly
placeholder
=
"点击选择直属领导"
@
click
.
native
=
"selectLeader"
style
=
"cursor: pointer"
/>
<
/FormItem
>
<
FormItem
label
=
"是否离职"
>
<
Select
v
-
model
=
"editModal.form.is_leave"
style
=
"width: 160px"
>
<
Select
v
-
model
=
"editModal.form.is_leave"
style
=
"width: 160px"
@
on
-
change
=
"onIsLeaveChange"
>
<
Option
:
value
=
"0"
>
未离职
<
/Option
>
<
Option
:
value
=
"1"
>
离职
<
/Option
>
<
/Select
>
<
/FormItem
>
<
FormItem
v
-
if
=
"editModal.form.is_leave === 1"
label
=
"离职时间"
>
<
Input
v
-
model
=
"editModal.form.leave_time"
type
=
"datetime"
placeholder
=
"请选择离职时间"
format
=
"yyyy-MM-dd HH:mm:ss"
disabled
/>
<
/FormItem
>
<
/Form
>
<
div
slot
=
"footer"
>
<
Button
@
click
=
"editModal.visible = false"
>
取消
<
/Button
>
...
...
@@ -127,6 +130,52 @@ export default {
renderIsExt
(
h
,
{
row
}
)
{
return
row
.
is_ext
===
1
?
'系统同步'
:
'手工录入'
}
,
formatLeaveTime
(
leaveTime
)
{
if
(
!
leaveTime
||
leaveTime
===
null
||
leaveTime
===
''
)
return
'-'
// 如果是数字时间戳
if
(
typeof
leaveTime
===
'number'
)
{
return
this
.
formatDateTime
(
new
Date
(
leaveTime
))
}
// 如果是字符串
if
(
typeof
leaveTime
===
'string'
)
{
// 处理纯数字字符串(可能是时间戳)
if
(
/^
\d
+$/
.
test
(
leaveTime
))
{
try
{
return
this
.
formatDateTime
(
new
Date
(
Number
(
leaveTime
)))
}
catch
(
e
)
{
return
leaveTime
}
}
// 处理带T的ISO字符串或其他可解析字符串
if
(
leaveTime
.
includes
(
'T'
))
{
return
this
.
formatDateTime
(
leaveTime
)
}
// 尝试直接解析
const
parsed
=
new
Date
(
leaveTime
)
if
(
!
isNaN
(
parsed
.
getTime
()))
{
return
this
.
formatDateTime
(
parsed
)
}
}
// 尝试解析为Date对象
const
parsed
=
new
Date
(
leaveTime
)
if
(
!
isNaN
(
parsed
.
getTime
()))
{
return
this
.
formatDateTime
(
parsed
)
}
return
leaveTime
}
,
formatDateTime
(
date
)
{
if
(
!
date
)
return
'-'
const
d
=
date
instanceof
Date
?
date
:
new
Date
(
date
)
if
(
isNaN
(
d
.
getTime
()))
return
'-'
const
pad
=
(
n
)
=>
(
n
<
10
?
'0'
+
n
:
String
(
n
))
return
d
.
getFullYear
()
+
'-'
+
pad
(
d
.
getMonth
()
+
1
)
+
'-'
+
pad
(
d
.
getDate
())
+
' '
+
pad
(
d
.
getHours
())
+
':'
+
pad
(
d
.
getMinutes
())
+
':'
+
pad
(
d
.
getSeconds
())
}
,
fetchList
()
{
this
.
loading
=
true
const
payload
=
Object
.
assign
({
}
,
{
pageNo
:
this
.
pager
.
pageNo
,
pageSize
:
this
.
pager
.
pageSize
}
,
this
.
filters
)
...
...
@@ -195,12 +244,25 @@ export default {
// 直接拷贝记录用于编辑,并保证小写 id 可用
const
copy
=
Object
.
assign
({
}
,
row
)
if
(
copy
.
Id
!=
null
&&
copy
.
id
==
null
)
copy
.
id
=
copy
.
Id
// 保存原始离职时间用于提交(保持后端原始格式),并将 leave_time 转为供前端显示的格式化字符串(disabled Input)
copy
.
_raw_leave_time
=
copy
.
leave_time
copy
.
leave_time
=
this
.
formatLeaveTime
(
copy
.
leave_time
)
this
.
editModal
.
form
=
copy
this
.
editModal
.
visible
=
true
}
,
selectLeader
()
{
this
.
userSelectorVisible
=
true
}
,
onIsLeaveChange
(
value
)
{
// 当切换为未离职,清理离职时间的显示与临时原始值,避免在提交时带上旧值
if
(
value
!==
1
)
{
if
(
this
.
editModal
&&
this
.
editModal
.
form
)
{
// 保证字段存在再删除
if
(
this
.
editModal
.
form
.
leave_time
!==
undefined
)
delete
this
.
editModal
.
form
.
leave_time
if
(
this
.
editModal
.
form
.
_raw_leave_time
!==
undefined
)
delete
this
.
editModal
.
form
.
_raw_leave_time
}
}
}
,
handleLeaderSelected
(
user
)
{
this
.
editModal
.
form
.
leader
=
user
.
id
this
.
editModal
.
form
.
leader_name
=
user
.
name
...
...
@@ -210,8 +272,34 @@ export default {
saveEdit
()
{
this
.
$refs
.
editForm
.
validate
(
valid
=>
{
// 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
saveDmUser
(
this
.
editModal
.
form
).
then
(
ret
=>
{
saveDmUser
(
formData
).
then
(
ret
=>
{
if
(
ret
.
data
&&
ret
.
data
.
errcode
===
0
)
{
this
.
$Message
.
success
(
'保存成功'
)
this
.
editModal
.
visible
=
false
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论