Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
A
attendance-performance-platform
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
赵啸非
attendance-performance-platform
Commits
c53922a6
Commit
c53922a6
authored
Apr 17, 2023
by
dll
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
海康打卡 假期余额
parent
ba2fd033
Changes
23
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
23 changed files
with
849 additions
and
385 deletions
+849
-385
attendance-performance-manager-ui/admin/src/assets/mixins/table.js
...e-performance-manager-ui/admin/src/assets/mixins/table.js
+2
-2
attendance-performance-manager-ui/admin/src/assets/utils/ajax.js
...nce-performance-manager-ui/admin/src/assets/utils/ajax.js
+1
-2
attendance-performance-manager-ui/admin/src/assets/utils/dateFormat.js
...rformance-manager-ui/admin/src/assets/utils/dateFormat.js
+2
-1
attendance-performance-manager-ui/admin/src/assets/utils/vaild.js
...ce-performance-manager-ui/admin/src/assets/utils/vaild.js
+9
-0
attendance-performance-manager-ui/admin/src/components/FormField.vue
...performance-manager-ui/admin/src/components/FormField.vue
+3
-3
attendance-performance-manager-ui/admin/src/components/SearchForm.vue
...erformance-manager-ui/admin/src/components/SearchForm.vue
+14
-8
attendance-performance-manager-ui/admin/src/views/attendance/group/groupTemplate.vue
...ger-ui/admin/src/views/attendance/group/groupTemplate.vue
+75
-41
attendance-performance-manager-ui/admin/src/views/attendance/record/error/drawershow.vue
...ui/admin/src/views/attendance/record/error/drawershow.vue
+194
-0
attendance-performance-manager-ui/admin/src/views/attendance/record/error/list.vue
...nager-ui/admin/src/views/attendance/record/error/list.vue
+49
-31
attendance-performance-manager-ui/admin/src/views/attendance/record/hik/list.vue
...manager-ui/admin/src/views/attendance/record/hik/list.vue
+103
-48
attendance-performance-manager-ui/admin/src/views/attendance/record/list.vue
...nce-manager-ui/admin/src/views/attendance/record/list.vue
+39
-30
attendance-performance-manager-ui/admin/src/views/attendance/staff/stat/list.vue
...manager-ui/admin/src/views/attendance/staff/stat/list.vue
+1
-1
attendance-performance-manager-ui/admin/src/views/attendance/stat/list.vue
...mance-manager-ui/admin/src/views/attendance/stat/list.vue
+44
-37
attendance-performance-manager-ui/admin/src/views/attendance/vacation/balance/drawershow.vue
...dmin/src/views/attendance/vacation/balance/drawershow.vue
+157
-97
attendance-performance-manager-ui/admin/src/views/attendance/vacation/balance/list.vue
...r-ui/admin/src/views/attendance/vacation/balance/list.vue
+27
-39
attendance-performance-manager-ui/admin/src/views/attendance/vacation/balance/view.vue
...r-ui/admin/src/views/attendance/vacation/balance/view.vue
+1
-1
attendance-performance-manager-ui/admin/src/views/job/drawershow.vue
...performance-manager-ui/admin/src/views/job/drawershow.vue
+6
-5
attendance-performance-manager-ui/admin/src/views/job/list.vue
...dance-performance-manager-ui/admin/src/views/job/list.vue
+48
-8
attendance-performance-manager-ui/admin/src/views/login/login.vue
...ce-performance-manager-ui/admin/src/views/login/login.vue
+2
-2
attendance-performance-manager-ui/admin/src/views/staff/care/list.vue
...erformance-manager-ui/admin/src/views/staff/care/list.vue
+10
-4
attendance-performance-manager-ui/admin/src/views/staff/contract/drawershow.vue
...-manager-ui/admin/src/views/staff/contract/drawershow.vue
+1
-1
attendance-performance-manager-ui/admin/src/views/staff/drawershow.vue
...rformance-manager-ui/admin/src/views/staff/drawershow.vue
+4
-13
attendance-performance-manager-ui/admin/src/views/staff/list.vue
...nce-performance-manager-ui/admin/src/views/staff/list.vue
+57
-11
No files found.
attendance-performance-manager-ui/admin/src/assets/mixins/table.js
View file @
c53922a6
...
...
@@ -219,8 +219,8 @@ export default {
// 查看天数
formatterDay
(
row
,
column
,
val
)
{
return
<
el
-
tag
onClick
=
{()
=>
{
this
.
handleCountDays
(
row
,
column
)
}}
>
{
((
val
||
0
)
/
1000
).
toFixed
(
2
)
}
<
/el-tag
>
this
.
handleCountDays
(
row
,
column
,
val
)
}}
>
{
val
}
<
/el-tag
>
},
// 格式化单元格数据
formatterDate
(
row
,
column
)
{
...
...
attendance-performance-manager-ui/admin/src/assets/utils/ajax.js
View file @
c53922a6
...
...
@@ -35,14 +35,13 @@ instance.interceptors.request.use(config => {
// 温
// http://192.168.0.116/17500
// 代
// http://192.168.0.108/17500
const
hostname
=
'
192.168.0.116
'
const
port
=
'
17500
'
// const hostname = '192.168.0.
9
8'
// const hostname = '192.168.0.
10
8'
// const port = '11039'
// 动态修改请求地址
...
...
attendance-performance-manager-ui/admin/src/assets/utils/dateFormat.js
View file @
c53922a6
...
...
@@ -40,3 +40,4 @@ export const transFormTime = (num) => {
return
"
0:00
"
;
}
}
// 时间戳 转 yyyy-MM-dd
\ No newline at end of file
attendance-performance-manager-ui/admin/src/assets/utils/vaild.js
View file @
c53922a6
// 前端正则验证方法
export
default
{
day
(
rule
,
value
,
callback
)
{
if
(
!
value
)
return
callback
();
if
(
/^
[
0-9
]
+
\.{0,1}[
0-9
]{0,1}
$/
.
test
(
value
))
{
callback
();
}
else
{
callback
(
new
Error
(
'
请输入正确的金额如 1.5
'
));
}
},
// 手机号码
phone
(
rule
,
value
,
callback
)
{
if
(
/^1
[
3456789
][
0-9
]{9}
$/
.
test
(
value
))
{
...
...
attendance-performance-manager-ui/admin/src/components/FormField.vue
View file @
c53922a6
...
...
@@ -4,12 +4,12 @@
<el-form-item
:label=
"label"
:prop=
"prop"
class=
'my-form-field'
>
<slot>
<el-input
:maxlength=
"maxLength"
:disabled=
'disabled'
:placeholder=
'placeholder'
v-model=
"field"
@
change=
"emit"
@
input=
"emit"
@
focus=
"emit"
v-if=
'type === "text"'
:class=
"inputClass"
:clearable=
'clearable'
></el-input>
<el-input
:maxlength=
"maxLength"
:disabled=
'disabled'
:placeholder=
'placeholder'
v-model=
"field"
@
change=
"emit"
@
input=
"emit"
type=
'password'
v-if=
'type === "password"'
></el-input>
<el-input
show-word-limit
:maxlength=
"maxLength"
:disabled=
'disabled'
:placeholder=
'placeholder'
v-model=
"field"
@
change=
"emit"
@
input=
"emit"
@
focus=
"emit"
v-if=
'type === "text"'
:class=
"inputClass"
:clearable=
'clearable'
></el-input>
<el-input
show-word-limit
:maxlength=
"maxLength"
:disabled=
'disabled'
:placeholder=
'placeholder'
v-model=
"field"
@
change=
"emit"
@
input=
"emit"
type=
'password'
v-if=
'type === "password"'
></el-input>
<el-input-number
:disabled=
'disabled'
v-model=
"field"
size=
"small"
:placeholder=
'placeholder'
@
change=
"emit"
@
input=
"emit"
v-if=
'type === "num"'
></el-input-number>
<el-input
:disabled=
'disabled'
:placeholder=
'placeholder'
v-model=
"field"
:maxlength=
"maxLength"
<el-input
show-word-limit
:disabled=
'disabled'
:placeholder=
'placeholder'
v-model=
"field"
:maxlength=
"maxLength"
@
change=
"emit"
:rows=
'rows'
@
input=
"emit"
v-if=
'type === "textarea"'
type=
'textarea'
:autosize=
"textareaSize"
:class=
"inputClass"
></el-input>
<!-- 一级 -->
...
...
attendance-performance-manager-ui/admin/src/components/SearchForm.vue
View file @
c53922a6
...
...
@@ -230,7 +230,6 @@ export default {
//初始化查询表单
let
newFormData
=
{};
// this.form = this.encode(data, this.form);
console
.
log
(
this
.
search
,
'
ddd
'
)
this
.
search
.
forEach
((
item
)
=>
{
//复选框
if
(
item
.
type
===
"
checkbox
"
)
{
...
...
@@ -256,7 +255,7 @@ export default {
});
this
.
form
=
Object
.
assign
({},
this
.
form
,
newFormData
);
this
.
form
=
Object
.
assign
({},
this
.
form
,
data
);
console
.
log
(
this
.
form
,
'
dddddd
'
)
//
console.log(this.form,'dddddd')
},
cleanForm
()
{
this
.
clean
();
...
...
@@ -276,11 +275,18 @@ export default {
},
onSubmit
()
{
let
{
path
,
query
}
=
this
.
$route
;
if
(
this
.
form
.
attendanceDateStart
&&
this
.
form
.
attendanceDateEnd
){
let
startValue
=
Date
.
parse
(
this
.
form
.
attendanceDateStart
)
let
endValue
=
Date
.
parse
(
this
.
form
.
attendanceDateEnd
)
if
(
startValue
>
endValue
){
this
.
$message
.
error
(
'
查询-结束的日期需大于开始日期
'
)
this
.
form
.
attendanceDateEnd
=
''
return
false
}
}
let
params
=
JSON
.
parse
(
JSON
.
stringify
(
this
.
form
))
//不更改原始数据
console
.
log
(
this
.
form
,
'
form参数
'
)
//
console.log(this.form,'form参数')
let
data
=
this
.
decode
(
params
);
console
.
log
(
data
,
'
参数
'
)
// Object.assign({}, query, data)
this
.
$router
.
push
({
path
:
path
,
...
...
@@ -369,11 +375,11 @@ export default {
data
()
{
return
{
form
:
{
groupList
:
[],
//
groupList: [],
},
remoteOptions
:
{},
}
;
}
,
}
}
};
</
script
>
...
...
attendance-performance-manager-ui/admin/src/views/attendance/group/groupTemplate.vue
View file @
c53922a6
This diff is collapsed.
Click to expand it.
attendance-performance-manager-ui/admin/src/views/attendance/record/error/drawershow.vue
0 → 100644
View file @
c53922a6
<
template
>
<!-- 弹出框表单 -->
<el-drawer
title=
"批量处理"
:visible.sync=
"open"
:direction=
"direction"
size=
"50%"
>
<div>
已选择6个:
</div>
<div
class=
"staffList"
>
<div
v-for=
"item in 5"
:key=
"item"
class=
"mt10"
>
将
<span>
刘德华
</span>
<span>
的下班时间18:00打卡异常状态
</span>
<span
class=
"ml10"
>
缺卡
</span>
<span
class=
"ml10"
>
修改为
</span>
</div>
<div>
<!-- 处理异常状态 -->
<el-select>
<el-option></el-option>
</el-select>
<!-- 早退/迟到 -->
<el-input
style=
"width:220px"
placeholder=
"请输入数字"
>
<template
slot=
"append"
>
分钟
</
template
>
</el-input>
</div>
<div>
<span>
备注:
</span>
<el-input
placeholder=
"请输入备注"
v-model=
"dealParams.remark"
></el-input>
</div>
</div>
</el-drawer>
</template>
<
script
>
import
form
from
"
@/assets/mixins/formdialog
"
;
export
default
{
name
:
"
AttendanceRecordDetail
"
,
mixins
:
[
form
],
components
:
{
},
created
()
{
this
.
changePath
(
"
attendance/record
"
)
},
data
()
{
return
{
// 子表选中数据
checkedAttendanceRecordDetail
:
[],
// 考勤打卡记录详细信息表格数据
attendanceRecordDetailList
:
[],
// 遮罩层
loading
:
true
,
// 弹出层标题
title
:
"
考勤打卡记录信息
"
,
// 是否显示弹出层
open
:
false
,
direction
:
"
rtl
"
,
toString
:[
],
toDate
:[
"
attendanceDate
"
,
],
// 表单校验
rules
:
{
staffName
:
[
{
required
:
true
,
message
:
"
请输入员工姓名
"
,
trigger
:
"
blur
"
},
{
max
:
64
,
message
:
"
最多只能录入64个字符
"
,
trigger
:
"
blur
"
,},
],
createTime
:
[
{
required
:
true
,
message
:
"
请选择创建时间
"
},
],
},
dealParams
:{
remark
:
''
,
errorStatus
:
''
}
}
},
methods
:
{
/** 考勤打卡记录详细信息序号 */
rowAttendanceRecordDetailIndex
({
row
,
rowIndex
})
{
row
.
index
=
rowIndex
+
1
;
},
/** 考勤打卡记录详细信息添加按钮操作 */
handleAddAttendanceRecordDetail
()
{
let
obj
=
{};
obj
.
shiftsId
=
""
;
obj
.
shiftsName
=
""
;
obj
.
goWorkDate
=
""
;
obj
.
goWorkResult
=
""
;
obj
.
offWorkDate
=
""
;
obj
.
offWorkResult
=
""
;
obj
.
remark
=
""
;
obj
.
createUserId
=
""
;
obj
.
createTime
=
""
;
obj
.
updateUserId
=
""
;
obj
.
updateTime
=
""
;
this
.
attendanceRecordDetailList
.
push
(
obj
);
},
/** 考勤打卡记录详细信息删除按钮操作 */
handleDeleteAttendanceRecordDetail
()
{
if
(
this
.
checkedAttendanceRecordDetail
.
length
==
0
)
{
this
.
$alert
(
"
请先选择要删除的考勤打卡记录详细信息数据
"
,
"
提示
"
,
{
confirmButtonText
:
"
确定
"
,
});
}
else
{
this
.
attendanceRecordDetailList
.
splice
(
this
.
checkedAttendanceRecordDetail
[
0
].
index
-
1
,
1
);
}
},
/** 单选框选中数据 */
handleAttendanceRecordDetailSelectionChange
(
selection
)
{
if
(
selection
.
length
>
1
)
{
this
.
$refs
.
attendanceRecordDetail
.
clearSelection
();
this
.
$refs
.
attendanceRecordDetail
.
toggleRowSelection
(
selection
.
pop
());
}
else
{
this
.
checkedAttendanceRecordDetail
=
selection
;
}
},
// 渲染前置处理
beforeRender
(
data
)
{
if
(
data
.
entity
.
attendanceRecordDetailList
)
{
this
.
attendanceRecordDetailList
=
data
.
entity
.
attendanceRecordDetailList
;
}
return
data
},
/** 编辑 */
edit
(
row
)
{
this
.
reset
()
this
.
query
=
{
id
:
row
.
id
};
this
.
urls
.
currUrl
=
"
attendance/record/edit
"
;
this
.
getData
();
this
.
pageInfo
.
type
=
"
edit
"
this
.
title
=
"
修改考勤打卡记录信息
"
;
},
/** 新增 */
add
(
row
)
{
this
.
reset
()
this
.
urls
.
currUrl
=
"
attendance/record/add
"
;
this
.
getData
();
this
.
pageInfo
.
type
=
"
add
"
this
.
title
=
"
新增考勤打卡记录信息
"
;
},
/** 查看*/
view
(
row
)
{
this
.
reset
()
this
.
query
=
{
id
:
row
.
id
};
this
.
urls
.
currUrl
=
"
attendance/record/view
"
;
this
.
getData
();
this
.
pageInfo
.
type
=
"
view
"
this
.
title
=
"
考勤打卡记录信息详细
"
;
},
/**取消按钮 */
cancel
()
{
this
.
open
=
false
;
},
/**获取数据后弹框 */
afterRender
(
data
)
{
this
.
open
=
true
;
},
afterSubmit
(
data
)
{
this
.
open
=
false
;
this
.
$emit
(
"
ok
"
);
},
// 表单重置
reset
()
{
this
.
form
=
{
staffId
:
null
,
staffName
:
""
,
workNum
:
""
,
deptId
:
null
,
deptName
:
""
,
positionId
:
null
,
positionName
:
""
,
attendanceGroupId
:
null
,
attendanceGroupName
:
""
,
shiftsId
:
null
,
shiftsName
:
""
,
attendanceDate
:
null
,
remark
:
""
,
};
this
.
resetForm
(
"
form
"
);
},
resetForm
(
refName
)
{
if
(
this
.
$refs
[
refName
])
{
this
.
$refs
[
refName
].
resetFields
();
}
},
},
};
</
script
>
attendance-performance-manager-ui/admin/src/views/attendance/record/error/list.vue
View file @
c53922a6
...
...
@@ -10,6 +10,14 @@
>
批量处理
</el-button>
</LayoutTable>
<dialog-show
ref=
"dialogform"
@
ok=
"getData"
/>
<!-- 撤销提示 -->
<el-dialog
:visible.sync=
"dialogVisible"
title=
"提示"
width=
"40%"
>
<div>
撤销异常处理结果后,当天的考勤结果将会重新计算,系统需要花费一点时间。
</div>
<div
class=
"flex flex_end"
>
<el-button
@
click=
"dialogVisible = false"
>
取消
</el-button>
<el-button
type=
"primary"
@
click=
"resetError"
>
确定
</el-button>
</div>
</el-dialog>
</div>
</
template
>
...
...
@@ -21,33 +29,44 @@
name
:
"
AttendanceRecordErrorList
"
,
components
:
{
dialogShow
},
},
mixins
:
[
table
],
created
()
{
},
methods
:
{
/** 重写新增方法 */
toAdd
(
row
)
{
this
.
$refs
.
dialogform
.
add
(
row
);
},
/** 重写编辑方法 */
toEdit
(
row
)
{
this
.
$refs
.
dialogform
.
edit
(
row
);
},
/** 重写查看方法 */
toView
(
row
)
{
this
.
$refs
.
dialogform
.
view
(
row
);
},
morehandle
(){
console
.
log
(
this
.
selection
)
},
// toAdd(row) {
// this.$refs.dialogform.add(row);
// },
// /** 重写编辑方法 */
// toEdit(row) {
// this.$refs.dialogform.edit(row);
// },
// /** 重写查看方法 */
// toView(row) {
// this.$refs.dialogform.view(row);
// },
// morehandle(row){
// console.log(this.selection)
// this.$refs.dialogform.edit(row);
// },
// 处理
handle
(
err
){
console
.
log
(
err
)
this
.
$refs
.
dialogform
.
edit
(
err
);
},
// 撤销
reCancle
(
err
){
console
.
log
(
err
)
this
.
dialogVisible
=
true
},
resetError
(
data
){
this
.
$get
(
'
attendance/record/error/delete
'
,{
id
:
data
.
id
}).
then
(
res
=>
{
if
(
res
.
code
==
1
){
this
.
dialogVisible
=
false
this
.
getData
()
}
})
}
},
data
()
{
...
...
@@ -59,57 +78,55 @@
name
:
"
deptId
"
,
type
:
"
select
"
,
label
:
"
全部部门
"
,
fuzzy
:
tru
e
fuzzy
:
fals
e
},
{
name
:
"
deptId
"
,
type
:
"
select
"
,
label
:
"
全部考勤组
"
,
fuzzy
:
tru
e
fuzzy
:
fals
e
},
{
name
:
"
deptId
"
,
type
:
"
select
"
,
label
:
"
全部班次
"
,
fuzzy
:
tru
e
fuzzy
:
fals
e
},
{
name
:
"
errorStatus
"
,
type
:
"
select
"
,
label
:
"
全部异常状态
"
,
fuzzy
:
tru
e
fuzzy
:
fals
e
},
{
name
:
"
error
Status
"
,
name
:
"
process
Status
"
,
type
:
"
select
"
,
label
:
"
全部处理状态
"
,
fuzzy
:
tru
e
fuzzy
:
fals
e
},
{
name
:
'
startTime
'
,
type
:
"
date
"
,
valueFormat
:
'
YYYY-dd-MM
'
,
label
:
"
考勤开始时间
"
,
fuzzy
:
tru
e
fuzzy
:
fals
e
},
{
name
:
'
endTime
'
,
type
:
"
date
"
,
valueFormat
:
'
YYYY-dd-MM
'
,
label
:
"
考勤结束时间
"
,
fuzzy
:
tru
e
fuzzy
:
fals
e
},
{
name
:
"
staffName
"
,
type
:
"
text
"
,
label
:
"
员工姓名
"
,
fuzzy
:
tru
e
fuzzy
:
fals
e
},
{
name
:
"
phoneNumber
"
,
type
:
"
text
"
,
label
:
"
手机号
"
,
fuzzy
:
tru
e
fuzzy
:
fals
e
},
],
columns
:
[
...
...
@@ -138,17 +155,18 @@
<
span
>
<
el
-
button
type
=
"
text
"
size
=
'
mini
'
onClick
=
{(
row
)
=>
{
this
.
handle
(
row
)
}}
>
处理
<
/el-button
>
}}
v
-
if
=
{
row
.
processStatus
==
0
}
>
处理
<
/el-button
>
<
el
-
button
type
=
"
text
"
size
=
'
mini
'
onClick
=
{(
row
)
=>
{
this
.
reCancle
(
row
)
}}
>
撤销
<
/el-button
>
}}
v
-
else
>
撤销
<
/el-button
>
<
/span
>
)
}
}
]
},
dialogVisible
:
false
}
};
}
};
</
script
>
\ No newline at end of file
attendance-performance-manager-ui/admin/src/views/attendance/record/hik/list.vue
View file @
c53922a6
...
...
@@ -73,13 +73,32 @@
:visible.sync=
"drawerhistory"
:direction=
"direction"
>
<div
class=
"hisList"
>
<div
class=
"list mt10"
v-for=
"
item in 10"
:key=
"item
"
>
<div
class=
"list mt10"
v-for=
"
(item,index) in exportList"
:key=
"index"
@
click=
"changeStatus(item)
"
>
<div
class=
"flex flex-align-center flex-pack-justify"
>
<div>
打卡记录汇总
</div>
<el-button
type=
"text"
>
导出成功
</el-button>
</div>
<div
class=
"times"
>
导出时间:2020-08-13
<div
class=
"details"
v-if=
"item.islook"
>
<div
class=
"mt10"
v-if=
"item.recordIdList"
>
选择列表id:
{{
item
.
recordIdList
}}
</div>
<div
class=
"mt10"
v-if=
"item.deptName"
>
选择部门:
{{
item
.
deptName
}}
</div>
<div
class=
"mt10"
v-if=
"item.groupName"
>
选择考勤组:
{{
item
.
groupName
}}
</div>
<div
class=
"mt10"
v-if=
"item.className"
>
选择班次:
{{
item
.
className
}}
</div>
<div
class=
"mt10"
>
<el-link
:href=
"baseUrl+item.filePath"
target=
"_blank"
type=
"primary"
>
重新下载
</el-link>
</div>
</div>
<div
class=
"times mt10"
>
导出时间:
{{
item
.
createTime
}}
</div>
</div>
</div>
...
...
@@ -91,6 +110,7 @@
/** 表单弹出框模式需引入 */
import
dialogShow
from
"
./dialogshow
"
;
import
table
from
"
@/assets/mixins/table
"
;
import
{
timestampToTime
}
from
'
@/assets/utils/dateFormat
'
export
default
{
name
:
"
AttendanceRecordHikList
"
,
components
:
{
...
...
@@ -101,7 +121,26 @@
// console.log(this.$route.query,'sssss')
},
methods
:
{
// 更改状态
changeStatus
(
item
){
this
.
$set
(
item
,
'
islook
'
,
!
item
.
islook
)
},
// 导出记录
lookexportHis
(){
this
.
$post
(
'
/attendance/export/record/list
'
,{
type
:
1
,
page
:
1
,
size
:
-
1
}).
then
(
res
=>
{
if
(
res
.
code
==
1
){
let
arr
=
res
.
data
.
data
this
.
exportList
=
arr
.
map
(
item
=>
{
item
.
createTime
=
timestampToTime
(
item
.
createTime
)
item
.
islook
=
false
return
item
})
}
})
// 导出记录
this
.
drawerhistory
=
true
},
...
...
@@ -139,8 +178,19 @@
/** 导出Excel */
doExport
()
{
this
.
isExport
=
true
;
let
params
=
{}
for
(
let
value
of
this
.
config
.
search
){
if
(
this
.
query
[
value
.
name
]){
params
[
value
.
name
]
=
this
.
query
[
value
.
name
]
}
}
if
(
this
.
selection
.
length
>
0
){
params
[
'
idList
'
]
=
this
.
selection
}
this
.
$download
(
"
/attendance/record/hik/exportExcel
"
,
{
"
idList
"
:
this
.
selection
,
...
params
,
},
{
type
:
"
excel
"
}).
then
(()
=>
this
.
isExport
=
false
).
catch
(
error
=>
{
this
.
isExport
=
false
;
this
.
$message
.
error
(
error
.
message
);
...
...
@@ -184,45 +234,43 @@
name
:
"
staffName
"
,
type
:
"
text
"
,
label
:
"
员工姓名
"
,
fuzzy
:
tru
e
fuzzy
:
fals
e
},
{
name
:
'
workN
ame
'
,
name
:
'
workN
um
'
,
type
:
'
text
'
,
label
:
'
工号
'
,
fuzzy
:
true
},
{
name
:
"
deptId
"
,
type
:
"
select
"
,
label
:
"
所属部门
"
,
fuzzy
:
true
},
{
name
:
"
attendanceGroupId
"
,
type
:
"
select
"
,
label
:
"
所属考勤组
"
,
fuzzy
:
true
},
{
name
:
"
shiftsId
"
,
type
:
"
select
"
,
label
:
"
班次
"
,
fuzzy
:
true
fuzzy
:
false
},
// {
// name: "deptId",
// type: "select",
// label: "所属部门",
// fuzzy: false
// },
// {
// name: "attendanceGroupId",
// type: "select",
// label: "所属考勤组",
// fuzzy: false
// },
// {
// name: "shiftsId",
// type: "select",
// label: "班次",
// fuzzy: false
// },
{
name
:
'
startTime
'
,
name
:
'
attendanceDateStart
'
,
type
:
"
date
"
,
valueFormat
:
'
YYYY-dd-MM
'
,
label
:
"
考勤开始时间
"
,
fuzzy
:
tru
e
fuzzy
:
fals
e
},
{
name
:
'
endTime
'
,
name
:
'
attendanceDateEnd
'
,
type
:
"
date
"
,
valueFormat
:
'
YYYY-dd-MM
'
,
label
:
"
考勤结束时间
"
,
fuzzy
:
tru
e
fuzzy
:
fals
e
}
],
columns
:
[
...
...
@@ -230,27 +278,29 @@
{
type
:
"
index
"
,
label
:
"
序号
"
,
width
:
50
},
{
label
:
"
员工姓名
"
,
prop
:
"
staffName
"
},
{
label
:
"
工号
"
,
prop
:
"
workNum
"
},
{
label
:
"
部门
"
,
prop
:
"
deptName
"
},
{
label
:
"
考勤组
"
,
prop
:
"
attendanceGroupName
"
},
{
label
:
"
职位
"
,
prop
:
"
positionName
"
},
{
label
:
"
班次
"
,
prop
:
"
shiftsName
"
},
//
{label: "部门", prop: "deptName"},
//
{label: "考勤组", prop: "attendanceGroupName"},
//
{label: "职位", prop: "positionName"},
//
{label: "班次", prop: "shiftsName"},
{
label
:
"
考勤时间
"
,
prop
:
"
attendanceDate
"
,
formatter
:
this
.
formatterDate
},
{
label
:
"
考勤点名称
"
,
prop
:
"
attendanceAddress
"
},
{
label
:
"
事件源
"
,
prop
:
"
eventSource
"
},
{
label
:
"
操作
"
,
width
:
240
,
formatter
:
row
=>
{
return
(
<
table
-
buttons
noAdd
noDel
noEdit
noView
row
=
{
row
}
onEdit
=
{
this
.
toEdit
}
onView
=
{
this
.
toView
}
onDel
=
{
this
.
toDel
}
/
>
)
}
}
//
{
//
label: "操作",
//
width: 240,
//
formatter: row => {
//
return (
//
<
table
-
buttons
noAdd
noDel
noEdit
noView
row
=
{
row
}
//
onEdit={this.toEdit} onView={this.toView} onDel={this.toDel} />
//
)
//
}
//
}
]
},
drawerhistory
:
false
};
drawerhistory
:
false
,
exportList
:[],
baseUrl
:
process
.
env
.
VUE_APP_API_BASE_URL
+
'
/
'
}
}
};
</
script
>
...
...
@@ -266,6 +316,11 @@
font-size
:
12px
;
color
:
#999
;
}
cursor
:
pointer
;
}
}
.details
{
cursor
:
pointer
;
}
</
style
>
\ No newline at end of file
attendance-performance-manager-ui/admin/src/views/attendance/record/list.vue
View file @
c53922a6
...
...
@@ -48,6 +48,7 @@
size=
"mini"
@
click=
"setdialog"
>
表格设置
</el-button>
</LayoutTable>
<drawer-show
ref=
"drawerform"
@
ok=
"getData"
/>
<!-- 导出记录查看 -->
...
...
@@ -181,8 +182,18 @@
/** 导出Excel */
doExport
()
{
this
.
isExport
=
true
;
let
params
=
{}
for
(
let
value
of
this
.
config
.
search
){
if
(
this
.
query
[
value
.
name
]){
params
[
value
.
name
]
=
this
.
query
[
value
.
name
]
}
}
if
(
this
.
selection
.
length
>
0
){
params
[
'
idList
'
]
=
this
.
selection
}
this
.
$download
(
"
/attendance/record/exportExcel
"
,
{
"
idList
"
:
this
.
selection
,
...
params
},
{
type
:
"
excel
"
}).
then
(()
=>
this
.
isExport
=
false
).
catch
(
error
=>
{
this
.
isExport
=
false
;
this
.
$message
.
error
(
error
.
message
);
...
...
@@ -278,13 +289,13 @@
fuzzy
:
true
},
{
name
:
"
attendanceG
roupId
"
,
name
:
"
g
roupId
"
,
type
:
"
select
"
,
label
:
"
所属考勤组
"
,
fuzzy
:
true
},
{
name
:
"
shift
sId
"
,
name
:
"
clas
sId
"
,
type
:
"
select
"
,
label
:
"
班次
"
,
fuzzy
:
true
...
...
@@ -292,14 +303,12 @@
{
name
:
'
startTime
'
,
type
:
"
date
"
,
valueFormat
:
'
YYYY-dd-MM
'
,
label
:
"
考勤开始时间
"
,
fuzzy
:
true
},
{
name
:
'
endTime
'
,
type
:
"
date
"
,
valueFormat
:
'
YYYY-dd-MM
'
,
label
:
"
考勤结束时间
"
,
fuzzy
:
true
}
...
...
@@ -313,31 +322,31 @@
{
label
:
"
部门
"
,
prop
:
"
deptName
"
},
{
label
:
"
职位
"
,
prop
:
"
positionName
"
},
{
label
:
"
班次
"
,
prop
:
"
shiftsName
"
},
{
label
:
"
考勤打卡记录详细信息
"
,
width
:
120
,
prop
:
"
subColumns
"
,
formatter
:
(
row
)
=>
{
let
widthsize
=
this
.
columnSet
.
reduce
((
pre
,
cur
)
=>
{
return
pre
+
Number
(
cur
.
width
);
},
50
);
return
(
<
el
-
popover
placement
=
"
right
"
width
=
{
widthsize
}
trigger
=
"
click
"
>
{
this
.
renderTable
(
row
.
attendanceRecordDetailList
)}
<
el
-
button
type
=
"
text
"
slot
=
"
reference
"
>
详细
<
/el-button
>
<
/el-popover
>
);
},
},
{
label
:
"
操作
"
,
width
:
240
,
formatter
:
row
=>
{
return
(
<
table
-
buttons
noAdd
noEdit
noView
noDel
row
=
{
row
}
onEdit
=
{
this
.
toEdit
}
onView
=
{
this
.
toView
}
onDel
=
{
this
.
toDel
}
/
>
);
}
}
//
{label: "考勤打卡记录详细信息",
//
width: 120,
//
prop: "subColumns",
//
formatter: (row) => {
//
let widthsize = this.columnSet.reduce((pre, cur) => {
//
return pre + Number(cur.width);
//
}, 50);
//
return (
//
<
el
-
popover
placement
=
"
right
"
width
=
{
widthsize
}
trigger
=
"
click
"
>
//
{this.renderTable(row.attendanceRecordDetailList)}
//
<
el
-
button
type
=
"
text
"
slot
=
"
reference
"
>
详细
<
/el-button
>
//
<
/el-popover
>
//
);
//
},
//
},
//
{
//
label: "操作",
//
width: 240,
//
formatter: row => {
//
return (
//
<
table
-
buttons
noAdd
noEdit
noView
noDel
//
row={row} onEdit={this.toEdit} onView={this.toView} onDel={this.toDel} />
//
);
//
}
//
}
]
},
drawerhistory
:
false
,
...
...
attendance-performance-manager-ui/admin/src/views/attendance/staff/stat/list.vue
View file @
c53922a6
...
...
@@ -42,7 +42,7 @@
name
:
"
staffName
"
,
type
:
"
text
"
,
label
:
"
员工姓名
"
,
fuzzy
:
tru
e
fuzzy
:
fals
e
},
],
columns
:
[
...
...
attendance-performance-manager-ui/admin/src/views/attendance/stat/list.vue
View file @
c53922a6
...
...
@@ -94,8 +94,17 @@
/** 导出Excel */
doExport
()
{
this
.
isExport
=
true
;
let
params
=
{}
for
(
let
value
of
this
.
config
.
search
){
if
(
this
.
query
[
value
.
name
]){
params
[
value
.
name
]
=
this
.
query
[
value
.
name
]
}
}
if
(
this
.
selection
.
length
>
0
){
params
[
'
idList
'
]
=
this
.
selection
}
this
.
$download
(
"
/attendance/stat/exportExcel
"
,
{
"
idList
"
:
this
.
selection
,
...
params
},
{
type
:
"
excel
"
}).
then
(()
=>
this
.
isExport
=
false
).
catch
(
error
=>
{
this
.
isExport
=
false
;
this
.
$message
.
error
(
error
.
message
);
...
...
@@ -111,45 +120,43 @@
name
:
"
deptId
"
,
type
:
"
select
"
,
label
:
"
全部部门
"
,
fuzzy
:
tru
e
fuzzy
:
fals
e
},
{
name
:
"
deptId
"
,
type
:
"
select
"
,
label
:
"
全部考勤组
"
,
fuzzy
:
tru
e
fuzzy
:
fals
e
},
{
name
:
"
deptId
"
,
type
:
"
select
"
,
label
:
"
全部班次
"
,
fuzzy
:
tru
e
fuzzy
:
fals
e
},
{
name
:
'
startTime
'
,
type
:
"
date
"
,
valueFormat
:
'
YYYY-dd-MM
'
,
label
:
"
考勤开始时间
"
,
fuzzy
:
tru
e
fuzzy
:
fals
e
},
{
name
:
'
endTime
'
,
type
:
"
date
"
,
valueFormat
:
'
YYYY-dd-MM
'
,
label
:
"
考勤结束时间
"
,
fuzzy
:
tru
e
fuzzy
:
fals
e
},
{
name
:
"
staffName
"
,
type
:
"
text
"
,
label
:
"
员工姓名
"
,
fuzzy
:
tru
e
fuzzy
:
fals
e
},
{
name
:
"
phoneNumber
"
,
type
:
"
text
"
,
label
:
"
手机号
"
,
fuzzy
:
tru
e
fuzzy
:
fals
e
}
],
columns
:
[
...
...
@@ -162,59 +169,59 @@
{
label
:
"
员工姓名
"
,
prop
:
"
staffName
"
},
{
label
:
"
回单位(天)
"
,
prop
:
"
backToUnit
"
,
formatter
:
this
.
formatterMoney
},
{
label
:
"
回单位(天)
"
,
prop
:
"
backToUnit
"
},
{
label
:
"
因公请假(天)
"
,
prop
:
"
onDutyLeave
"
,
formatter
:
this
.
formatterMoney
},
{
label
:
"
因公请假(天)
"
,
prop
:
"
onDutyLeave
"
},
{
label
:
"
外出勘验(天)
"
,
prop
:
"
outOfOffice
"
,
formatter
:
this
.
formatterMoney
},
{
label
:
"
外出勘验(天)
"
,
prop
:
"
outOfOffice
"
},
{
label
:
"
值班补班(天)
"
,
prop
:
"
shiftCompensation
"
,
formatter
:
this
.
formatterMoney
},
{
label
:
"
值班补班(天)
"
,
prop
:
"
shiftCompensation
"
},
{
label
:
"
体检(天)
"
,
prop
:
"
physicalExamination
"
,
formatter
:
this
.
formatterMoney
},
{
label
:
"
体检(天)
"
,
prop
:
"
physicalExamination
"
},
{
label
:
"
隔离(天)
"
,
prop
:
"
quarantine
"
,
formatter
:
this
.
formatterMoney
},
{
label
:
"
隔离(天)
"
,
prop
:
"
quarantine
"
},
{
label
:
"
因公外出(与窗口工作无关/天)
"
,
prop
:
"
businessTrip
"
,
formatter
:
this
.
formatterMoney
},
{
label
:
"
因公外出(与窗口工作无关/天)
"
,
prop
:
"
businessTrip
"
},
{
label
:
"
公休(天)
"
,
prop
:
"
publicHoliday
"
,
formatter
:
this
.
formatterMoney
},
{
label
:
"
公休(天)
"
,
prop
:
"
publicHoliday
"
},
{
label
:
"
病假(天)
"
,
prop
:
"
sickLeave
"
,
formatter
:
this
.
formatterMoney
},
{
label
:
"
病假(天)
"
,
prop
:
"
sickLeave
"
},
{
label
:
"
丧假(天)
"
,
prop
:
"
funeralLeave
"
,
formatter
:
this
.
formatterMoney
},
{
label
:
"
丧假(天)
"
,
prop
:
"
funeralLeave
"
},
{
label
:
"
婚假(天)
"
,
prop
:
"
marriageLeave
"
,
formatter
:
this
.
formatterMoney
},
{
label
:
"
婚假(天)
"
,
prop
:
"
marriageLeave
"
},
{
label
:
"
育儿假(天)
"
,
prop
:
"
childRearingLeave
"
,
formatter
:
this
.
formatterMoney
},
{
label
:
"
育儿假(天)
"
,
prop
:
"
childRearingLeave
"
},
{
label
:
"
产假(陪护假/天)
"
,
prop
:
"
maternityLeave
"
,
formatter
:
this
.
formatterMoney
},
{
label
:
"
产假(陪护假/天)
"
,
prop
:
"
maternityLeave
"
},
{
label
:
"
调回单位(或离职/天)
"
,
prop
:
"
transferBack
"
,
formatter
:
this
.
formatterMoney
},
{
label
:
"
调回单位(或离职/天)
"
,
prop
:
"
transferBack
"
},
{
label
:
"
探亲假(天)
"
,
prop
:
"
homeLeave
"
,
formatter
:
this
.
formatterMoney
},
{
label
:
"
探亲假(天)
"
,
prop
:
"
homeLeave
"
},
{
label
:
"
事假(天)
"
,
prop
:
"
personalLeave
"
,
formatter
:
this
.
formatterMoney
},
{
label
:
"
事假(天)
"
,
prop
:
"
personalLeave
"
},
{
label
:
"
旷工(天)
"
,
prop
:
"
absenteeismDays
"
,
formatter
:
this
.
formatterMoney
},
{
label
:
"
旷工(天)
"
,
prop
:
"
absenteeismDays
"
},
{
label
:
"
其他(天)
"
,
prop
:
"
otherDays
"
,
formatter
:
this
.
formatterMoney
},
{
label
:
"
其他(天)
"
,
prop
:
"
otherDays
"
},
{
label
:
"
出勤率%
"
,
prop
:
"
attendanceRate
"
,
formatter
:
this
.
formatterMoney
},
{
label
:
"
出勤率%
"
,
prop
:
"
attendanceRate
"
},
{
label
:
"
未按规定打卡(含忘记打卡)
"
,
prop
:
"
nonCompliancePunch
"
,
formatter
:
this
.
formatterMoney
},
{
label
:
"
未按规定打卡(含忘记打卡)
"
,
prop
:
"
nonCompliancePunch
"
},
{
label
:
"
迟到(次)
"
,
prop
:
"
lateTimes
"
,
formatter
:
this
.
formatter
},
{
label
:
"
迟到(次)
"
,
prop
:
"
lateTimes
"
},
{
label
:
"
上网耍手机(次)
"
,
prop
:
"
surfingMobileTimes
"
,
formatter
:
this
.
formatter
},
{
label
:
"
上网耍手机(次)
"
,
prop
:
"
surfingMobileTimes
"
},
{
label
:
"
溜班(次)
"
,
prop
:
"
overtimeTimes
"
,
formatter
:
this
.
formatter
},
{
label
:
"
溜班(次)
"
,
prop
:
"
overtimeTimes
"
},
{
label
:
"
空岗(次)
"
,
prop
:
"
vacancy
"
,
formatter
:
this
.
formatterMoney
},
{
label
:
"
空岗(次)
"
,
prop
:
"
vacancy
"
},
{
label
:
"
未规范着装(次)
"
,
prop
:
"
nonStandardDressTimes
"
,
formatter
:
this
.
formatter
},
{
label
:
"
未规范着装(次)
"
,
prop
:
"
nonStandardDressTimes
"
},
{
label
:
"
无故缺席会议(次)
"
,
prop
:
"
unexcusedMeetingAbsence
"
,
formatter
:
this
.
formatterMoney
},
{
label
:
"
无故缺席会议(次)
"
,
prop
:
"
unexcusedMeetingAbsence
"
},
{
label
:
"
会议早退
"
,
prop
:
"
earlyLeaveMeeting
"
,
formatter
:
this
.
formatterMoney
},
{
label
:
"
会议早退
"
,
prop
:
"
earlyLeaveMeeting
"
},
// {label: "创建用户", prop: "createUserId", formatter: this.formatter},
{
...
...
attendance-performance-manager-ui/admin/src/views/attendance/vacation/balance/drawershow.vue
View file @
c53922a6
<
template
>
<div>
<!-- 弹出框表单 -->
<el-drawer
title=
"假期使用记录"
:visible.sync=
"open"
:direction=
"direction"
size=
"50%"
>
<div
style=
"padding:20px"
>
<div
class=
"mt20"
>
<span>
当前假期余额:20
天
</span>
<el-tag
type=
"success"
size=
"mini"
>
修改余额
</el-tag
>
<span>
当前假期余额:
{{
days
}}
天
</span>
<el-button
type=
"success"
size=
"mini"
class=
"ml20"
@
click=
"editFn"
>
修改余额
</el-button
>
</div>
<div
class=
"mt20"
>
<el-steps
direction=
"vertical"
:active=
"1"
>
<el-step
title=
"步骤 1"
></el-step>
<el-step
title=
"步骤 2"
></el-step>
<el-step
title=
"步骤 3"
description=
"这是一段很长很长很长的描述性文字"
></el-step>
<el-steps
direction=
"vertical"
>
<el-step
:title=
"item.createTime"
v-for=
"(item,index) in recordList"
:key=
"index"
>
<i
class=
"el-icon-timer"
slot=
"icon"
></i>
<template
slot=
"description"
>
<div>
<span
style=
"color:#000"
>
{{
item
.
subOrAddDays
}}
</span>
<span
class=
"ml20"
>
{{
item
.
validityPeriod
}}
有效
</span>
</div>
<div>
<span
style=
"color:#000"
>
{{
item
.
content
}}
</span>
</div>
<div>
<span
style=
"color:#000"
>
理由:
{{
item
.
reason
}}
</span>
</div>
</
template
>
</el-step>
</el-steps>
</div>
<div
class=
"tips mt20"
>
当前病假规则:每年1月1日自动发放 30天
</div>
<!--
<el-form
ref=
"form"
:model=
"form"
:rules=
"rules"
label-width=
"120px"
>
<el-row>
<Field
label=
"员工id"
prop=
"staffId"
v-model=
"form.staffId"
placeholder=
"请输入员工id"
/>
<Field
label=
"员工姓名"
prop=
"staffName"
v-model=
"form.staffName"
type=
"textarea"
placeholder=
"请输入员工姓名"
/>
<Field
label=
"部门id"
prop=
"deptId"
v-model=
"form.deptId"
placeholder=
"请输入部门id"
/>
<Field
label=
"部门名称"
prop=
"deptName"
v-model=
"form.deptName"
type=
"textarea"
placeholder=
"请输入部门名称"
/>
<Field
label=
"入职时间"
prop=
"entryTime"
v-model=
"form.entryTime"
type=
"date"
/>
<Field
label=
"事假"
prop=
"personalLeaveDays"
v-model=
"form.personalLeaveDays"
placeholder=
"请输入事假"
/>
<Field
label=
"调休"
prop=
"compensatedLeaveDays"
v-model=
"form.compensatedLeaveDays"
placeholder=
"请输入调休"
/>
<Field
label=
"病假"
prop=
"sickLeaveDays"
v-model=
"form.sickLeaveDays"
placeholder=
"请输入病假"
/>
<Field
label=
"年假"
prop=
"annualLeaveDays"
v-model=
"form.annualLeaveDays"
placeholder=
"请输入年假"
/>
<Field
label=
"婚假"
prop=
"marriageLeaveDays"
v-model=
"form.marriageLeaveDays"
placeholder=
"请输入婚假"
/>
<Field
label=
"备注"
prop=
"remark"
v-model=
"form.remark"
type=
"textarea"
placeholder=
"请输入备注"
/>
</el-row>
<form-buttons
@
submit=
'submitForm'
noCancelBtn
/>
</el-form>
-->
</div>
</el-drawer>
<el-dialog
title=
"修改余额"
:show-close=
"false"
:visible.sync=
"isedit"
>
<el-form
ref=
"form"
:model=
"editParams"
:rules=
"rules"
label-width=
"120px"
>
<el-form-item
label=
"修改类型"
prop=
"subAddType"
>
<el-select
v-model=
"editParams.subAddType"
>
<el-option
v-for=
'($label, $value) in dict.subAddType'
:key=
"$value"
:label=
"$label"
:value=
"$value"
></el-option>
</el-select>
</el-form-item>
<el-form-item
label=
"修改天数"
prop=
"subOrAddDays"
>
<el-input
v-model=
"editParams.subOrAddDays"
style=
"width:220px"
></el-input>
<span>
天
</span>
</el-form-item>
<el-form-item
label=
"修改理由"
prop=
"reason"
>
<el-input
type=
"textarea"
placeholder=
"请输入理由"
v-model=
"editParams.reason"
></el-input>
</el-form-item>
<el-form-item>
<el-button
@
click=
"subMit"
type=
"primary"
size=
"mini"
>
确认
</el-button>
<el-button
@
click=
"cancle"
size=
"mini"
>
取消
</el-button>
</el-form-item>
</el-form>
</el-dialog>
</div>
</template>
<
script
>
import
form
from
"
@/assets/mixins/formdialog
"
;
import
{
timestampToTime
}
from
'
@/assets/utils/dateFormat
'
export
default
{
name
:
"
AttendanceVacationBalanceDetail
"
,
mixins
:
[
form
],
components
:
{},
created
()
{
this
.
changePath
(
"
attendance/vacation/balance
"
)
// this.changePath("attendance/vacation/record
")
},
data
()
{
var
day
=
(
rule
,
value
,
callback
)
=>
{
if
(
!
value
)
return
callback
();
if
(
/^
[
0-9
]
+
\.{0,1}[
0-9
]{0,1}
$/
.
test
(
value
))
{
callback
();
}
else
{
callback
(
new
Error
(
'
请输入正确的金额如 1.5
'
));
}
}
return
{
days
:
0
,
// 遮罩层
loading
:
true
,
// 弹出层标题
title
:
"
员工假期余额信息
"
,
// 是否显示弹出层
open
:
false
,
isedit
:
false
,
direction
:
"
rtl
"
,
toString
:[
],
...
...
@@ -62,36 +103,83 @@ export default {
],
// 表单校验
rules
:
{
subAddType
:[
{
required
:
true
,
message
:
"
请选择类型
"
,
trigger
:
'
change
'
},
],
subOrAddDays
:[
{
required
:
true
,
message
:
"
请输入天数
"
},
{
validator
:
day
,
trigger
:
'
blur
'
}
],
reason
:[
{
required
:
true
,
message
:
'
请输入理由
'
}
};
]
},
methods
:
{
/** 编辑 */
edit
(
row
)
{
this
.
reset
()
this
.
query
=
{
id
:
row
.
id
};
this
.
urls
.
currUrl
=
"
attendance/vacation/balance/edit
"
;
this
.
getData
();
this
.
pageInfo
.
type
=
"
edit
"
this
.
title
=
"
修改员工假期余额信息
"
;
recordList
:[],
editParams
:{
// id:'',
staffId
:
""
,
type
:
''
,
subAddType
:
""
,
subOrAddDays
:
''
,
reason
:
""
,
},
/** 新增 */
add
(
row
)
{
this
.
reset
()
this
.
urls
.
currUrl
=
"
attendance/vacation/balance/add
"
;
this
.
getData
();
this
.
pageInfo
.
type
=
"
add
"
this
.
title
=
"
新增员工假期余额信息
"
;
dict
:{},
//字典
}
},
methods
:
{
/** 查看*/
view
(
row
)
{
this
.
reset
()
this
.
query
=
{
id
:
row
.
id
};
this
.
urls
.
currUrl
=
"
attendance/vacation/balance/view
"
;
this
.
getData
();
this
.
pageInfo
.
type
=
"
view
"
this
.
title
=
"
员工假期余额信息详细
"
;
this
.
editParams
.
type
=
row
.
type
this
.
editParams
.
staffId
=
row
.
staffId
// this.editParams.id = row.id
this
.
days
=
row
.
val
this
.
$post
(
"
/attendance/vacation/record/list
"
,
{
page
:
1
,
size
:
-
1
,
type
:
row
.
type
,
staffId
:
row
.
staffId
})
.
then
((
res
)
=>
{
if
(
res
.
code
==
1
)
{
this
.
open
=
true
let
arr
=
res
.
data
.
data
this
.
recordList
=
arr
.
map
(
item
=>
{
item
.
createTime
=
timestampToTime
(
item
.
createTime
)
return
item
})
this
.
dict
=
res
.
data
.
dict
}
})
.
catch
((
error
)
=>
{
this
.
$message
.
error
(
error
.
msg
);
})
},
// 修改余额
editFn
(){
this
.
isedit
=
true
},
subMit
(){
this
.
$refs
[
'
form
'
].
validate
((
valid
)
=>
{
if
(
valid
){
this
.
$post
(
'
attendance/vacation/record/save
'
,
this
.
editParams
).
then
(
res
=>
{
if
(
res
.
code
==
1
){
this
.
afterSubmit
()
}
else
{
this
.
$message
.
error
(
res
.
msg
)
}
})
}
})
},
cancle
(){
this
.
editParams
.
subAddType
=
''
this
.
editParams
.
subOrAddDays
=
''
this
.
editParams
.
reason
=
''
this
.
isedit
=
false
},
/**取消按钮 */
cancel
()
{
...
...
@@ -101,41 +189,13 @@ export default {
afterRender
(
data
)
{
this
.
open
=
true
;
},
afterSubmit
(
data
)
{
this
.
isedit
=
false
this
.
open
=
false
;
this
.
$emit
(
"
ok
"
);
},
// 表单重置
reset
()
{
this
.
form
=
{
staffId
:
null
,
staffName
:
""
,
deptId
:
null
,
deptName
:
""
,
entryTime
:
null
,
personalLeaveDays
:
0
,
compensatedLeaveDays
:
0
,
sickLeaveDays
:
0
,
annualLeaveDays
:
0
,
maternityLeaveDays
:
0
,
paternityLeaveDays
:
0
,
marriageLeaveDays
:
0
,
menstrualLeaveDays
:
0
,
breastfeedingLeaveDays
:
0
,
bereavementLeaveDays
:
0
,
remark
:
""
,
};
this
.
resetForm
(
"
form
"
);
},
resetForm
(
refName
)
{
if
(
this
.
$refs
[
refName
])
{
this
.
$refs
[
refName
].
resetFields
();
}
},
},
};
}
}
</
script
>
<
style
scoped
lang=
"less"
>
.tips{
...
...
attendance-performance-manager-ui/admin/src/views/attendance/vacation/balance/list.vue
View file @
c53922a6
...
...
@@ -24,42 +24,29 @@ export default {
// 导出
doExport
(){
this
.
isExport
=
true
;
let
params
=
{}
for
(
let
value
of
this
.
config
.
search
){
if
(
this
.
query
[
value
.
name
]){
params
[
value
.
name
]
=
this
.
query
[
value
.
name
]
}
}
if
(
this
.
selection
.
length
>
0
){
params
[
'
idList
'
]
=
this
.
selection
}
this
.
$download
(
"
/attendance/vacation/balance/exportExcel
"
,
{
"
idList
"
:
this
.
selection
,
'
name
'
:
this
.
$route
.
query
[
'
name
'
],
...
params
},
{
type
:
"
excel
"
}).
then
(()
=>
this
.
isExport
=
false
).
catch
(
error
=>
{
this
.
isExport
=
false
;
this
.
$message
.
error
(
error
.
message
);
})
},
/** 重写新增方法 */
toAdd
(
row
)
{
this
.
$refs
.
drawerform
.
add
(
row
);
},
/** 重写编辑方法 */
toEdit
(
row
)
{
this
.
$refs
.
drawerform
.
edit
(
row
);
},
/** 重写查看方法 */
toView
(
row
)
{
this
.
$refs
.
drawerform
.
view
(
row
);
},
/** 查看不同类型假期记录 */
handleCountDays
(
row
,
leavetype
){
this
.
$post
(
"
/attendance/vacation/record/list
"
,
{
page
:
1
,
size
:
-
1
,
type
:
leavetype
,
staffId
:
row
.
staffId
})
.
then
((
res
)
=>
{
if
(
res
.
code
==
1
)
{
//todo 抽屉打开 假期明细信息
//this.$message.success("激活设备成功!");
}
})
.
catch
((
error
)
=>
{
this
.
$message
.
error
(
error
.
message
);
handleCountDays
(
row
,
column
,
val
){
this
.
$refs
.
drawerform
.
view
({
type
:
this
.
util_formatter
(
'
AllHolidays
'
,
column
.
property
),
staffId
:
row
.
staffId
,
id
:
row
.
id
,
val
})
}
...
...
@@ -93,17 +80,18 @@ export default {
{
label
:
"
病假(天)
"
,
prop
:
"
sickLeaveDays
"
,
formatter
:
this
.
formatterDay
},
{
label
:
"
年假(天)
"
,
prop
:
"
annualLeaveDays
"
,
formatter
:
this
.
formatterDay
},
{
label
:
"
婚假(天)
"
,
prop
:
"
marriageLeaveDays
"
,
formatter
:
this
.
formatterDay
},
{
label
:
"
哺乳假(天)
"
,
prop
:
"
breastfeedingLeaveDays
"
,
formatter
:
this
.
formatterDay
},
// {label: "创建用户", prop: "createUserId", formatter: this.formatter},
{
label
:
"
操作
"
,
width
:
240
,
formatter
:
row
=>
{
return
(
<
table
-
buttons
noAdd
noEdit
noView
noDel
row
=
{
row
}
onEdit
=
{
this
.
toEdit
}
onView
=
{
this
.
toView
}
onDel
=
{
this
.
toDel
}
/
>
)
}
}
//
{
//
label: "操作",
//
width: 240,
//
formatter: row => {
//
return (
//
<
table
-
buttons
noAdd
noEdit
noView
noDel
row
=
{
row
}
//
onEdit={this.toEdit} onView={this.toView} onDel={this.toDel} />
//
)
//
}
//
}
],
isExport
:
false
}
...
...
attendance-performance-manager-ui/admin/src/views/attendance/vacation/balance/view.vue
View file @
c53922a6
attendance-performance-manager-ui/admin/src/views/job/drawershow.vue
View file @
c53922a6
...
...
@@ -8,12 +8,13 @@
<el-form
ref=
"form"
:model=
"form"
:rules=
"rules"
label-width=
"120px"
style=
"padding:20px"
>
<el-row>
<Field
v-if=
"title == '新增职位信息'"
label=
"分组"
prop=
"groupId"
v-model=
"form.groupId"
type=
"select"
placeholder=
"请选择分组"
/>
<Field
label=
"分组名称"
prop=
"groupName"
v-model=
"form.groupName"
placeholder=
"请输入分组名称"
:maxLength=
"10"
v-if=
"title == '新增分组信息'"
/>
<Field
label=
"职位编码"
prop=
"jobCode"
:maxLength=
"10"
v-model=
"form.jobCode"
placeholder=
"请输入职位编码"
v-if=
"title == '新增职位信息'"
/>
<Field
label=
"职位名称"
prop=
"jobName"
:maxLength=
"10"
v-model=
"form.jobName"
placeholder=
"请输入职位名称"
v-if=
"title == '新增职位信息'"
/>
<Field
label=
"分组名称"
prop=
"groupName"
v-model=
"form.groupName"
placeholder=
"请输入分组名称"
/>
<Field
label=
"职位编码"
prop=
"jobCode"
v-model=
"form.jobCode"
placeholder=
"请输入职位编码"
/>
<Field
label=
"职位名称"
prop=
"jobName"
v-model=
"form.jobName"
placeholder=
"请输入职位名称"
/>
<Field
label=
"类型"
prop=
"type"
v-model=
"form.type"
type=
"select"
:enumData=
"dict.type"
placeholder=
"请选择类型"
/>
<Field
label=
"备注"
prop=
"remark"
v-model=
"form.remark"
type=
"textarea"
placeholder=
"请输入备注"
/>
<Field
label=
"备注"
prop=
"remark"
:maxLength=
"50"
v-model=
"form.remark"
type=
"textarea"
placeholder=
"请输入备注"
/>
</el-row>
<form-buttons
@
submit=
'submitForm'
noCancelBtn
/>
</el-form>
...
...
@@ -88,9 +89,9 @@
},
/**获取数据后弹框 */
afterRender
(
data
)
{
this
.
form
.
type
=
this
.
form
.
type
.
toString
()
this
.
open
=
true
;
},
afterSubmit
(
data
)
{
this
.
open
=
false
;
this
.
$emit
(
"
ok
"
);
...
...
attendance-performance-manager-ui/admin/src/views/job/list.vue
View file @
c53922a6
...
...
@@ -10,6 +10,7 @@
<el-button
type=
"success"
size=
"mini"
@
click=
"saveFn('position')"
>
新增职位
</el-button>
</div>
<el-scrollbar
style=
"height: 100%"
>
<!-- 区分分组和职位 -->
<el-tree
size=
"mini"
ref=
"siteTree"
...
...
@@ -25,6 +26,13 @@
:render-content=
"renderContent"
@
node-click=
"handleNodeClick"
>
<span
slot-scope=
"
{ node, data }">
<span
style=
"font-size:14px"
>
{{
node
.
label
}}
</span>
<span>
<i
class=
"el-icon-edit"
style=
"color:#409EFF"
@
click=
"editJob(node)"
></i>
<i
class=
"el-icon-delete"
style=
"color:#F56C6C"
@
click=
"deleteFn(node)"
></i>
</span>
</span>
</el-tree>
</el-scrollbar>
</el-col>
...
...
@@ -90,9 +98,17 @@
},
doExport
(){
this
.
isExport
=
true
;
let
params
=
{}
for
(
let
value
of
this
.
config
.
search
){
if
(
this
.
query
[
value
.
name
]){
params
[
value
.
name
]
=
this
.
query
[
value
.
name
]
}
}
if
(
this
.
selection
.
length
>
0
){
params
[
'
idList
'
]
=
this
.
selection
}
this
.
$download
(
"
/job/exportExcel
"
,
{
"
idList
"
:
this
.
selection
,
'
name
'
:
this
.
$route
.
query
[
'
name
'
],
...
params
},
{
type
:
"
excel
"
}).
then
(()
=>
this
.
isExport
=
false
).
catch
(
error
=>
{
this
.
isExport
=
false
;
this
.
$message
.
error
(
error
.
message
);
...
...
@@ -123,6 +139,29 @@
path
:
key
})
},
// 职位
editJob
(
row
){
// 编辑职位/分组
this
.
toEdit
(
row
)
},
// 删除
deleteFn
(
row
){
this
.
$confirm
(
'
此操作将永久删除该信息, 是否继续?
'
,
'
提示
'
,
{
confirmButtonText
:
'
确定
'
,
cancelButtonText
:
'
取消
'
,
type
:
'
warning
'
}).
then
(
res
=>
{
// 删除操作
this
.
$post
(
'
/job/delete
'
,{
id
:
row
.
id
}).
then
(
data
=>
{
if
(
data
.
code
===
1
){
this
.
$message
({
type
:
'
success
'
,
message
:
'
删除成功!
'
})
}
})
})
}
},
data
()
{
return
{
...
...
@@ -157,17 +196,18 @@
// {label: "职位编码", prop: "jobCode"},
// {label: "职位名称", prop: "jobName"},
{
label
:
"
姓名
"
,
prop
:
"
job
Name
"
},
{
label
:
"
部门
"
,
prop
:
"
job
Name
"
},
{
label
:
"
员工类型
"
,
prop
:
"
jobName
"
},
{
label
:
"
手机号
"
,
prop
:
"
jobName
"
},
{
label
:
"
添加时间
"
,
prop
:
"
jobName
"
},
{
label
:
"
姓名
"
,
prop
:
"
staff
Name
"
},
{
label
:
"
部门
"
,
prop
:
"
dept
Name
"
},
{
label
:
"
员工类型
"
,
prop
:
"
staffType
"
,
formatter
:
this
.
formatterType
},
{
label
:
"
手机号
"
,
prop
:
"
phoneNumber
"
},
{
label
:
"
添加时间
"
,
prop
:
"
createTime
"
,
formatter
:
this
.
formatterDateOnly
},
{
label
:
"
操作
"
,
width
:
240
,
formatter
:
row
=>
{
return
(
<
table
-
buttons
noAdd
noEdit
row
=
{
row
}
onEdit
=
{
this
.
toEdit
}
onView
=
{
this
.
toView
}
onDel
=
{
this
.
toDel
}
/
>
<
table
-
buttons
noAdd
noView
noEdit
row
=
{
row
}
onEdit
=
{
this
.
toEdit
}
onView
=
{
this
.
toView
}
onDel
=
{
this
.
toDel
}
/
>
)
}
}
...
...
attendance-performance-manager-ui/admin/src/views/login/login.vue
View file @
c53922a6
...
...
@@ -20,9 +20,9 @@
</el-form>
</div>
<div
class=
"footer"
>
<
!--
<
div
class=
"footer"
>
登陆
©
<a
href=
""
>
信宏翔网络科技有限公司
</a>
出品
</div>
</div>
-->
</div>
</
template
>
...
...
attendance-performance-manager-ui/admin/src/views/staff/care/list.vue
View file @
c53922a6
...
...
@@ -162,11 +162,17 @@ export default {
/** 导出Excel */
doExport
()
{
this
.
isExport
=
true
;
let
params
=
{}
for
(
let
value
of
this
.
config
.
search
){
if
(
this
.
query
[
value
.
name
]){
params
[
value
.
name
]
=
this
.
query
[
value
.
name
]
}
}
if
(
this
.
selection
.
length
>
0
){
params
[
'
idList
'
]
=
this
.
selection
}
this
.
$download
(
"
/staff/care/exportExcel
"
,
{
"
idList
"
:
this
.
selection
,
'
staffName
'
:
this
.
$route
.
query
[
'
staffName
'
],
'
careType
'
:
this
.
$route
.
query
[
'
careType
'
],
'
sendStatus
'
:
this
.
$route
.
query
[
'
sendStatus
'
],
...
params
},
{
type
:
"
excel
"
}).
then
(()
=>
this
.
isExport
=
false
).
catch
(
error
=>
{
this
.
isExport
=
false
;
this
.
$message
.
error
(
error
.
message
);
...
...
attendance-performance-manager-ui/admin/src/views/staff/contract/drawershow.vue
View file @
c53922a6
attendance-performance-manager-ui/admin/src/views/staff/drawershow.vue
View file @
c53922a6
...
...
@@ -18,15 +18,15 @@
<!--
<Field
label=
"政治面貌 "
prop=
"politicalstatus"
v-model=
"form.politicalstatus"
type=
"select"
:enumData=
"dict.politicalstatus"
placeholder=
"请选择政治面貌 "
/>
-->
<!--
<Field
label=
"所属部门名称"
prop=
"deptName"
v-model=
"form.deptName"
placeholder=
"请输入所属部门名称"
/>
-->
<Field
label=
"员工姓名"
prop=
"name"
v-model=
"form.name"
placeholder=
"请输入员工姓名"
/>
<Field
label=
"员工姓名"
:maxLength=
"10"
prop=
"name"
v-model=
"form.name"
placeholder=
"请输入员工姓名"
/>
<Field
label=
"手机号码"
prop=
"phoneNumber"
v-model=
"form.phoneNumber"
placeholder=
"请输入联系电话"
/>
<Field
label=
"手机号码"
:maxLength=
"11"
prop=
"phoneNumber"
v-model=
"form.phoneNumber"
placeholder=
"请输入联系电话"
/>
<Field
label=
"所属部门"
prop=
"deptName"
v-model=
"form.deptName"
placeholder=
"请选择所属部门"
@
focus=
"ishowBumen = true"
/>
<Field
label=
"所属部门"
:maxLength=
"10"
prop=
"deptName"
v-model=
"form.deptName"
placeholder=
"请选择所属部门"
@
focus=
"ishowBumen = true"
/>
<Field
label=
"职位"
prop=
"positionId"
v-model=
"form.positionId"
:enumData=
"dict.positionId"
type=
"select"
placeholder=
"请选择职位"
/>
<Field
label=
"工号"
prop=
"workNum"
v-model=
"form.workNum"
placeholder=
"请输入工号"
/>
<Field
label=
"工号"
:maxLength=
"15"
prop=
"workNum"
v-model=
"form.workNum"
placeholder=
"请输入工号"
/>
<!--
<Field
label=
"是否在政务大厅"
prop=
"positionId"
v-model=
"form.positionId"
placeholder=
"请选择"
type=
"select"
/>
-->
<!--
<Field
label=
"职位名称"
prop=
"positionName"
v-model=
"form.positionName"
placeholder=
"请输入职位名称"
/>
-->
...
...
@@ -101,7 +101,6 @@
},
created
()
{
this
.
changePath
(
"
staff
"
)
this
.
getjobSelect
()
},
data
()
{
return
{
...
...
@@ -175,9 +174,6 @@
},
// 点击
handleNodeClick
(
node
)
{
if
(
node
.
children
.
length
>
0
){
return
}
this
.
deptnode
=
node
},
comfirmbument
(){
...
...
@@ -257,11 +253,6 @@
},
cancledept
(){
this
.
deptnode
=
{}
},
getjobSelect
(){
this
.
$post
(
'
/job/list
'
).
then
(
res
=>
{
console
.
log
(
res
)
})
}
}
}
...
...
attendance-performance-manager-ui/admin/src/views/staff/list.vue
View file @
c53922a6
...
...
@@ -60,7 +60,7 @@
<el-button
type=
"text"
@
click=
"lookDetailHis"
>
历史花名册
</el-button>
</el-dropdown-item>
<el-dropdown-item>
<el-button
type=
"text"
>
自定义列表字段
</el-button>
<el-button
type=
"text"
@
click=
"SelectEXport"
>
自定义列表字段
</el-button>
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
...
...
@@ -117,7 +117,7 @@
<!-- 花名册记录查看 -->
<el-drawer
title=
"
花名册记录
"
title=
"
历史花名册
"
:visible.sync=
"drawerhistory"
direction=
"rtl"
>
<div
class=
"hisList"
>
...
...
@@ -133,6 +133,19 @@
</div>
</el-drawer>
<!-- 表格设置 -->
<el-dialog
:visible.sync=
"isdialog"
title=
"自定义列表字段设置"
>
<div
class=
"tipsword"
>
请选择表格展示字段,导出的表格中的内容选中的字段将保持一致。
</div>
<el-checkbox-group
v-model=
"checkList"
>
<el-checkbox
v-for=
"(item,index) in setcolum"
:key=
"index"
:label=
"item.label"
>
</el-checkbox>
</el-checkbox-group>
<div
class=
"mt20"
style=
"text-align:right"
>
<el-button>
取消
</el-button>
<el-button
type=
"primary"
>
确定
</el-button>
</div>
</el-dialog>
<drawer-show
ref=
"drawerform"
@
ok=
"getData"
:bumentree=
"areaData"
/>
</div>
</
template
>
...
...
@@ -156,6 +169,11 @@
})
},
methods
:
{
// 自定义字段
SelectEXport
(){
this
.
setcolum
=
this
.
config
.
columns
.
filter
(
item
=>
item
.
label
&&
item
.
prop
)
this
.
isdialog
=
true
},
/** 导入 */
handleImport
()
{
this
.
upload
.
title
=
"
员工导入
"
;
...
...
@@ -197,24 +215,49 @@
},
doExport
(){
this
.
isExport
=
true
;
let
params
=
{}
for
(
let
value
of
this
.
config
.
search
){
if
(
this
.
query
[
value
.
name
]){
params
[
value
.
name
]
=
this
.
query
[
value
.
name
]
}
}
if
(
this
.
selection
.
length
>
0
){
params
[
'
idList
'
]
=
this
.
selection
}
this
.
$download
(
"
/staff/exportExcel
"
,
{
"
idList
"
:
this
.
selection
,
'
name
'
:
this
.
$route
.
query
[
'
name
'
],
...
params
},
{
type
:
"
excel
"
}).
then
(()
=>
this
.
isExport
=
false
).
catch
(
error
=>
{
this
.
isExport
=
false
;
this
.
$message
.
error
(
error
.
message
);
})
},
/** 下载模板操作 */
downloadTemplate
()
{
this
.
isExport
=
true
;
this
.
$download
(
"
/staff/downloadTemplate
"
,
{},
{
type
:
"
excel
"
})
.
then
(()
=>
(
this
.
isExport
=
false
))
.
catch
((
error
)
=>
{
this
.
isExport
=
false
;
this
.
$message
.
error
(
error
.
message
);
})
},
// 导出花名册
lookDetailHis
(){
console
.
log
(
'
1111
'
)
this
.
drawerhistory
=
true
}
},
/** 提交上传文件 */
submitFileForm
()
{
this
.
$refs
.
upload
.
submit
();
},
},
data
()
{
return
{
// 用户导入参数
upload
:
{
headers
:{
Authorization
:
window
.
sessionStorage
.
getItem
(
'
token
'
)
||
''
},
// 是否显示弹出层(员工关怀信息导入)
open
:
false
,
// 弹出层标题(员工关怀信息导入)
...
...
@@ -224,7 +267,7 @@
// 是否更新已经存在的数据
updateSupport
:
0
,
// 上传的地址
url
:
"
/attendance/staff/list
/importData
"
,
url
:
process
.
env
.
VUE_APP_API_BASE_URL
+
"
/staff
/importData
"
,
},
config
:
{
search
:
[
...
...
@@ -232,13 +275,13 @@
name
:
"
name
"
,
type
:
"
text
"
,
label
:
"
员工姓名
"
,
fuzzy
:
tru
e
fuzzy
:
fals
e
},
{
name
:
'
phoneNumber
'
,
type
:
'
text
'
,
label
:
'
手机号
'
,
fuzzy
:
tru
e
fuzzy
:
fals
e
}
],
columns
:
[
...
...
@@ -247,11 +290,11 @@
{
label
:
"
员工姓名
"
,
prop
:
"
name
"
},
{
label
:
"
工号
"
,
prop
:
"
workNum
"
},
{
label
:
"
部门
"
,
prop
:
"
deptName
"
},
{
label
:
"
职位
"
,
prop
:
"
positionName
"
},
{
label
:
"
职位
"
,
prop
:
"
positionName
"
,
formatter
:
this
.
formatters
},
{
label
:
"
员工类型
"
,
prop
:
"
staffType
"
,
formatter
:
this
.
formatterType
},
{
label
:
"
员工状态
"
,
prop
:
"
status
"
,
formatter
:
this
.
formatter
},
{
label
:
"
是否在政务中心
"
,
prop
:
"
source
"
,
formatter
:
this
.
formatterSource
},
//未对
{
label
:
"
手机号
"
,
prop
:
"
phoneNumber
"
},
{
label
:
"
手机号
"
,
prop
:
"
phoneNumber
"
,
formatter
:
this
.
formatters
},
{
label
:
"
操作
"
,
width
:
240
,
...
...
@@ -268,7 +311,10 @@
personData
:[],
isExport
:
false
,
staffInfo
:{},
drawerhistory
:
false
drawerhistory
:
false
,
checkList
:[],
setcolum
:[],
isdialog
:
false
}
},
computed
:{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment