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
1a06d676
Commit
1a06d676
authored
Aug 03, 2023
by
赵啸非
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'origin/master'
parents
ac11ff46
202450cf
Changes
14
Hide whitespace changes
Inline
Side-by-side
Showing
14 changed files
with
1048 additions
and
803 deletions
+1048
-803
attendance-performance-manager-ui/admin/.env
attendance-performance-manager-ui/admin/.env
+1
-0
attendance-performance-manager-ui/admin/public/index.html
attendance-performance-manager-ui/admin/public/index.html
+12
-6
attendance-performance-manager-ui/admin/src/App.vue
attendance-performance-manager-ui/admin/src/App.vue
+4
-3
attendance-performance-manager-ui/admin/src/components/Header.vue
...ce-performance-manager-ui/admin/src/components/Header.vue
+8
-2
attendance-performance-manager-ui/admin/src/views/Home.vue
attendance-performance-manager-ui/admin/src/views/Home.vue
+288
-266
attendance-performance-manager-ui/admin/src/views/SSO.vue
attendance-performance-manager-ui/admin/src/views/SSO.vue
+43
-32
attendance-performance-manager-ui/admin/src/views/attendance/record/hik/dialogshow.vue
...r-ui/admin/src/views/attendance/record/hik/dialogshow.vue
+200
-124
attendance-performance-manager-ui/admin/src/views/attendance/record/hik/list.vue
...manager-ui/admin/src/views/attendance/record/hik/list.vue
+357
-325
attendance-performance-manager-ui/admin/src/views/check/effect/record/drawershow.vue
...ger-ui/admin/src/views/check/effect/record/drawershow.vue
+3
-1
attendance-performance-manager-ui/admin/src/views/login/login.vue
...ce-performance-manager-ui/admin/src/views/login/login.vue
+61
-25
attendance-performance-manager-ui/admin/src/views/staff/perform/summary/dialogshow.vue
...r-ui/admin/src/views/staff/perform/summary/dialogshow.vue
+1
-1
attendance-performance-manager/src/main/java/com/mortals/xhx/module/attendance/dingmsg/api/DingMessageController.java
.../module/attendance/dingmsg/api/DingMessageController.java
+22
-11
attendance-performance-manager/src/main/java/com/mortals/xhx/module/attendance/service/impl/AttendanceVacationBalanceServiceImpl.java
...ce/service/impl/AttendanceVacationBalanceServiceImpl.java
+42
-1
attendance-performance-manager/src/main/java/com/mortals/xhx/module/dingding/personal/service/impl/DingPersonServiceImpl.java
...dingding/personal/service/impl/DingPersonServiceImpl.java
+6
-6
No files found.
attendance-performance-manager-ui/admin/.env
View file @
1a06d676
...
@@ -11,4 +11,5 @@ VUE_APP_WEBSOCKET_API =127.0.0.1:18222/m
...
@@ -11,4 +11,5 @@ VUE_APP_WEBSOCKET_API =127.0.0.1:18222/m
VUE_APP_PORTAL_URL = /portal_home
VUE_APP_PORTAL_URL = /portal_home
VUE_APP_PORTAL_PORT = 17300
VUE_APP_PORTAL_PORT = 17300
VUE_APP_API_appName = '智慧政务绩效管理系统'
attendance-performance-manager-ui/admin/public/index.html
View file @
1a06d676
<!DOCTYPE html>
<!DOCTYPE html>
<html>
<html>
<head>
<head>
<meta
charset=
"utf-8"
>
<meta
charset=
"utf-8"
/
>
<meta
http-equiv=
"X-UA-Compatible"
content=
"IE=edge"
>
<meta
http-equiv=
"X-UA-Compatible"
content=
"IE=edge"
/
>
<meta
name=
"viewport"
content=
"width=device-width,initial-scale=1.0"
>
<meta
name=
"viewport"
content=
"width=device-width,initial-scale=1.0"
/
>
<link
rel=
"icon"
href=
"<%= BASE_URL %>favicon.ico"
>
<link
rel=
"icon"
href=
"<%= BASE_URL %>favicon.ico"
/
>
<title>
智慧政务绩效管理系统
</title>
<title>
智慧政务绩效管理系统
</title>
<link
rel=
"stylesheet"
href=
"https://unpkg.com/element-ui@2.15.5/lib/theme-chalk/index.css"
>
<link
rel=
"stylesheet"
href=
"https://unpkg.com/element-ui@2.15.5/lib/theme-chalk/index.css"
/>
</head>
</head>
<body>
<body>
<noscript>
<noscript>
<strong>
We're sorry but app doesn't work properly without JavaScript enabled. Please enable it to continue.
</strong>
<strong
>
We're sorry but app doesn't work properly without JavaScript enabled.
Please enable it to continue.
</strong
>
</noscript>
</noscript>
<div
id=
"app"
></div>
<div
id=
"app"
></div>
<!-- built files will be auto injected -->
<!-- built files will be auto injected -->
...
...
attendance-performance-manager-ui/admin/src/App.vue
View file @
1a06d676
...
@@ -24,15 +24,16 @@ export default {
...
@@ -24,15 +24,16 @@ export default {
beforeCreate
()
{
beforeCreate
()
{
Vue
.
prototype
.
$app
=
this
;
Vue
.
prototype
.
$app
=
this
;
},
},
created
()
{},
created
()
{
},
methods
:
{},
methods
:
{},
};
};
</
script
>
</
script
>
<
style
lang=
"less"
scoped
>
<
style
lang=
"less"
scoped
>
#app {
#app {
height:100vh;
height:
100vh;
.loading {
.loading {
display: flex;
display: flex;
align-items: center;
align-items: center;
...
...
attendance-performance-manager-ui/admin/src/components/Header.vue
View file @
1a06d676
...
@@ -10,13 +10,13 @@
...
@@ -10,13 +10,13 @@
</i>
</i>
<router-link
to=
"/"
>
<router-link
to=
"/"
>
<img
<img
src=
"../assets/images/logo.png
"
:src=
"sysLogo ? sysLogo : require('../assets/images/logo.png')
"
style=
"margin-bottom: 5px; margin-left: 24px"
style=
"margin-bottom: 5px; margin-left: 24px"
height=
"40"
height=
"40"
alt=
""
alt=
""
/>
/>
<b
style=
"color: white; font-size: 20px"
>
<b
style=
"color: white; font-size: 20px"
>
智慧政务绩效管理系统
{{
sysName
?
sysName
:
"
智慧政务绩效管理系统
"
}}
</b>
</b>
</router-link>
</router-link>
...
@@ -172,6 +172,12 @@ export default {
...
@@ -172,6 +172,12 @@ export default {
data
()
{
data
()
{
return
{
return
{
showMobileMenu
:
false
,
showMobileMenu
:
false
,
sysName
:
localStorage
.
getItem
(
"
sysName
"
)
?
localStorage
.
getItem
(
"
sysName
"
)
:
""
,
sysLogo
:
localStorage
.
getItem
(
"
sysLogo
"
)
?
localStorage
.
getItem
(
"
sysLogo
"
)
:
""
,
};
};
},
},
created
()
{},
created
()
{},
...
...
attendance-performance-manager-ui/admin/src/views/Home.vue
View file @
1a06d676
<
template
>
<
template
>
<div
class=
"page page-home"
>
<div
class=
"page page-home"
>
<!-- 欢迎你,
{{
userData
}}
-->
<!-- 欢迎你,
{{
userData
}}
-->
<el-row
type=
"flex"
align=
"top"
justify=
"space-between"
:gutter=
"40"
>
<el-row
type=
"flex"
align=
"top"
justify=
"space-between"
:gutter=
"40"
>
<el-col
:span=
"6"
:xs=
"12"
>
<el-col
:span=
"6"
:xs=
"12"
>
<el-card>
<el-card>
<div
class=
"data_left"
>
<div
class=
"data_left"
>
<div
class=
"title"
style=
"margin-bottom:40px"
>
今日数据洞察
</div>
<div
class=
"title"
style=
"margin-bottom:40px"
>
今日数据洞察
</div>
<div
class=
"cell1"
>
<div
class=
"cell1"
>
<div
class=
"title"
>
人事数据
</div>
<div
class=
"title"
>
人事数据
</div>
<div
class=
"datas flex flex-align-center flex-pack-justify flex_warp"
>
<div
<div
class=
"item"
>
class=
"datas flex flex-align-center flex-pack-justify flex_warp"
<div>
总人数
</div>
>
<div>
{{
homeStat
.
totalPersonNum
}}
</div>
<div
class=
"item"
>
</div>
<div>
总人数
</div>
<div
class=
"item"
>
<div>
{{
homeStat
.
totalPersonNum
}}
</div>
<div>
部门人数
</div>
</div>
<div>
{{
homeStat
.
totalDeptNum
}}
</div>
<div
class=
"item"
>
</div>
<div>
部门人数
</div>
</div>
<div>
{{
homeStat
.
totalDeptNum
}}
</div>
</div>
</div>
<div
class=
"cell1"
>
</div>
<div
class=
"title"
>
考勤数据
</div>
</div>
<div
class=
"datas flex flex-align-center flex-pack-justify flex_warp"
>
<div
class=
"cell1"
>
<div
class=
"item"
>
<div
class=
"title"
>
考勤数据
</div>
<div>
打卡人数
</div>
<div
<div>
{{
homeStat
.
attendPersonNum
}}
</div>
class=
"datas flex flex-align-center flex-pack-justify flex_warp"
</div>
>
<div
class=
"item"
>
<div
class=
"item"
>
<div>
出勤率
</div>
<div>
打卡人数
</div>
<div>
{{
homeStat
.
attendRadio
}}
%
</div>
<div>
{{
homeStat
.
attendPersonNum
}}
</div>
</div>
</div>
<div
class=
"item"
>
<div
class=
"item"
>
<div>
请假人数
</div>
<div>
出勤率
</div>
<div>
{{
homeStat
.
levealPersonNum
}}
</div>
<div>
{{
homeStat
.
attendRadio
}}
%
</div>
</div>
</div>
<div
class=
"item"
>
<div
class=
"item"
>
<div>
迟到人数
</div>
<div>
请假人数
</div>
<div>
{{
homeStat
.
latePersonNum
}}
</div>
<div>
{{
homeStat
.
levealPersonNum
}}
</div>
</div>
</div>
<div
class=
"item"
>
<div
class=
"item"
>
<div>
早退人数
</div>
<div>
迟到人数
</div>
<div>
{{
homeStat
.
leftEarlyPersonNum
}}
</div>
<div>
{{
homeStat
.
latePersonNum
}}
</div>
</div>
</div>
<div
class=
"item"
>
<div
class=
"item"
>
<div>
缺卡人数
</div>
<div>
早退人数
</div>
<div>
{{
homeStat
.
missCardPersonNum
}}
</div>
<div>
{{
homeStat
.
leftEarlyPersonNum
}}
</div>
</div>
</div>
</div>
<div
class=
"item"
>
</div>
<div>
缺卡人数
</div>
</div>
<div>
{{
homeStat
.
missCardPersonNum
}}
</div>
</el-card>
</div>
</el-col>
</div>
<el-col
:span=
"18"
:xs=
"12"
>
</div>
<el-card
class=
"right_card"
>
</div>
<div
class=
"data_right"
>
</el-card>
<div
class=
"title"
>
科学化、精细化、以人为本知行合一的管理理念
</div>
</el-col>
<div
class=
"textWord"
>
<el-col
:span=
"18"
:xs=
"12"
>
坚持政治性与人民性的根本遵循、制度化与规范化的根本依托、考人与考事的相互结合
<br>
<el-card
class=
"right_card"
>
创新性与技术性的重要支撑以及效能性与发展性的不懈追求
<div
class=
"data_right"
>
</div>
<div
class=
"title"
>
科学化、精细化、以人为本知行合一的管理理念
</div>
<div
class=
"selectBars flex flex-align-center flex-pack-justify flex_warp"
>
<div
class=
"textWord"
>
<div
class=
"Bar_item"
v-for=
"(item, index) in barList"
:key=
"index"
坚持政治性与人民性的根本遵循、制度化与规范化的根本依托、考人与考事的相互结合
<br
/>
@
click=
"tabChildren(item.barName)"
>
创新性与技术性的重要支撑以及效能性与发展性的不懈追求
<div
class=
"icon"
>
</div>
<img
:src=
"item.icon"
>
<div
</div>
class=
"selectBars flex flex-align-center flex-pack-justify flex_warp"
<div
class=
"barnam"
>
{{
item
.
barName
}}
</div>
>
<div
class=
"des"
v-html=
"item.desc"
></div>
<div
</div>
class=
"Bar_item"
</div>
v-for=
"(item, index) in barList"
</div>
:key=
"index"
</el-card>
@
click=
"tabChildren(item.barName)"
</el-col>
>
</el-row>
<div
class=
"icon"
>
</div>
<img
:src=
"item.icon"
/>
</div>
<div
class=
"barnam"
>
{{
item
.
barName
}}
</div>
<div
class=
"des"
v-html=
"item.desc"
></div>
</div>
</div>
</div>
</el-card>
</el-col>
</el-row>
</div>
</
template
>
</
template
>
<
script
>
<
script
>
export
default
{
export
default
{
computed
:
{
computed
:
{
userData
()
{
userData
()
{
return
this
.
$store
.
state
.
userData
;
return
this
.
$store
.
state
.
userData
;
},
menu
()
{
return
this
.
mapMenu
(
this
.
userData
.
barList
);
},
},
data
()
{
return
{
// 数据洞察
homeStat
:
{
totalPersonNum
:
0
,
//总人数
totalDeptNum
:
0
,
//部门数
attendPersonNum
:
0
,
//考勤人数
attendRadio
:
0
,
//出勤率
levealPersonNum
:
0
,
//请假人数
latePersonNum
:
0
,
//迟到人数
leftEarlyPersonNum
:
0
,
//早退人数
missCardPersonNum
:
0
,
//缺卡人数
},
barList
:
[
{
icon
:
require
(
"
@/assets/images/u148.png
"
),
barName
:
"
智能人事
"
,
desc
:
"
提供包括组织管理、职位管理、人事管理、人事<br>统计报表等相关功能
"
,
navList
:
[],
},
{
icon
:
require
(
"
@/assets/images/u153.png
"
),
barName
:
"
考勤打卡
"
,
desc
:
"
提供包括组织管理、职位管理、人事管理、人事<br>统计报表等相关功能
"
,
navList
:
[],
},
{
icon
:
require
(
"
@/assets/images/u158.png
"
),
barName
:
"
绩效管理
"
,
desc
:
"
根据部门/个人承担的目标和任务完成情况以及工作<br>评价结果、加减分纪实现考核结果自动生成。
"
,
navList
:
[],
},
},
menu
()
{
// {
return
this
.
mapMenu
(
this
.
userData
.
barList
)
// icon: require('@/assets/images/u167.png'),
// barName: 'OA审批',
// desc: '无纸化审批流程,轻松完成打卡请假、移动审批等
<
br
>
操作,审批资料查找方便
'
,
// navList: []
// },
// {
// icon: require(
'
@
/assets/im
ages
/
u172
.
png
'
),
// barName:
'
数据分析
'
,
// desc:
'
完整团队经营状态的数字化,人财物事数据分析
<
br
>
展示,为管理提供智能决策依据
'
,
// navList: []
// },
{
icon: require("@/assets/images/u177.png"),
barName: "系统设置",
desc:
"提供包括RBAC用户-角色-权限管理、版本管理、<br>操作及登录日志管理等功能",
navList: [],
},
],
};
},
created() {
this.$store.commit("setHeadBar", []);
this.$store.commit("setCurrentParentName", "");
this.$store.commit("setCurrentThirdArr", []);
this.$store.commit("setCurrentSecondPath", "");
this.$store.commit("setThirdPath", "");
this.homeNum();
},
methods: {
tabChildren(name) {
console.log("name:" + name);
this.$store.commit("setCurrentParentName", name); //存储选择路由
let result = this.menu.find((item) => item.name === name);
this.$store.commit("setHeadBar", result);
console.log("result:", result);
if (result) {
// 路由跳转
if (result.children.length > 0) {
this.$store.commit("setCurrentThirdArr", result.children[0].children);
this.$store.commit("setCurrentSecondPath", result.children[0].path);
this.$store.commit("setThirdPath", result.children[0].path);
this.$router.push({ path: result.children[0].path });
} else {
this.$message.error("暂未完成添加");
}
}
} else {
this.$message.error("暂无权限");
}
},
},
data
()
{
mapMenu(arr) {
if (arr.length === 0) return [];
let result = arr.map((item) => {
const url = item.url
? item.url
: item.childList[0]
? item.childList[0].url || ""
: "";
return {
return {
// 数据洞察
name: item.name,
homeStat
:{
path: url,
totalPersonNum
:
0
,
//总人数
id: item.id,
totalDeptNum
:
0
,
//部门数
icon: item.imgPath,
attendPersonNum
:
0
,
//考勤人数
children:
attendRadio
:
0
,
//出勤率
item.childList.length === 0 ? [] : this.mapMenu(item.childList),
levealPersonNum
:
0
,
//请假人数
};
latePersonNum
:
0
,
//迟到人数
});
leftEarlyPersonNum
:
0
,
//早退人数
return result;
missCardPersonNum
:
0
,
//缺卡人数
},
barList
:
[
{
icon
:
require
(
'
@/assets/images/u148.png
'
),
barName
:
'
智能人事
'
,
desc
:
'
提供包括组织管理、职位管理、人事管理、人事<br>统计报表等相关功能
'
,
navList
:
[]
},
{
icon
:
require
(
'
@/assets/images/u153.png
'
),
barName
:
'
考勤打卡
'
,
desc
:
'
提供包括组织管理、职位管理、人事管理、人事<br>统计报表等相关功能
'
,
navList
:
[]
},
{
icon
:
require
(
'
@/assets/images/u158.png
'
),
barName
:
'
绩效管理
'
,
desc
:
'
根据部门/个人承担的目标和任务完成情况以及工作<br>评价结果、加减分纪实现考核结果自动生成。
'
,
navList
:
[]
},
// {
// icon: require('@/assets/images/u167.png'),
// barName: 'OA审批',
// desc: '无纸化审批流程,轻松完成打卡请假、移动审批等
<
br
>
操作,审批资料查找方便
'
,
// navList: []
// },
// {
// icon: require(
'
@
/assets/im
ages
/
u172
.
png
'
),
// barName:
'
数据分析
'
,
// desc:
'
完整团队经营状态的数字化,人财物事数据分析
<
br
>
展示,为管理提供智能决策依据
'
,
// navList: []
// },
{
icon: require(
'
@
/assets/im
ages
/
u177
.
png
'
),
barName:
'
系统设置
'
,
desc:
'
提供包括
RBAC
用户
-
角色
-
权限管理、版本管理、
<
br
>
操作及登录日志管理等功能
'
,
navList: []
}
]
}
},
created() {
this.$store.commit(
'
setHeadBar
'
, [])
this.$store.commit("setCurrentParentName",
''
)
this.$store.commit(
'
setCurrentThirdArr
'
, [])
this.$store.commit(
'
setCurrentSecondPath
'
,
''
)
this.$store.commit(
'
setThirdPath
'
,
''
)
this.homeNum()
},
},
methods: {
// 查询统计数据
homeNum() {
tabChildren(name) {
this.$post("/login/index").then((res) => {
console.log("name:" + name)
const { code, data } = res;
this.$store.commit("setCurrentParentName", name)//存储选择路由
if (code == 1) {
let result = this.menu.find(item => item.name === name)
this.homeStat = Object.assign({}, this.homeStat, data.homeStat);
this.$store.commit(
'
setHeadBar
'
, result)
console.log(data, "####");
console.log("result:", result)
// 路由跳转
if (result.children.length > 0) {
this.$store.commit(
'
setCurrentThirdArr
'
, result.children[0].children)
this.$store.commit(
'
setCurrentSecondPath
'
, result.children[0].path)
this.$store.commit(
'
setThirdPath
'
, result.children[0].path)
this.$router.push({ path: result.children[0].path })
} else {
this.$message.error(
'
暂未完成添加
'
);
}
},
mapMenu(arr) {
if (arr.length === 0) return []
let result = arr.map(item => {
const url = item.url
? item.url
: item.childList[0]
? item.childList[0].url || ""
: "";
return {
name: item.name,
path: url,
id: item.id,
icon: item.imgPath,
children: item.childList.length === 0 ? [] : this.mapMenu(item.childList)
}
})
return result
},
// 查询统计数据
homeNum() {
this.$post("/login/index").then((res) => {
const { code, data } = res
if (code == 1) {
this.homeStat = Object.assign({},this.homeStat,data.homeStat)
console.log(data,"####")
}
});
}
}
}
});
}
},
},
};
</
script
>
</
script
>
<
style
scoped
lang=
"less"
>
<
style
scoped
lang=
"less"
>
.page-home {
.page-home {
width: 100%;
width: 100%;
min-width: 1400px;
min-width: 1400px;
height: 100vh;
height: 100vh;
box-sizing: border-box;
box-sizing: border-box;
// padding: 2% 5%;
// padding: 2% 5%;
background-color: #f3f2f2;
background-color: #f3f2f2;
.data_left {
padding: 50px 20px 0 20px;
.cell1
{
.data_left
{
font-size: 16
px;
padding: 50px 20px 0 20
px;
.title {
.cell1 {
color: #409EFF;
font-size: 16px;
margin-bottom: 20px;
}
.item {
.title {
text-align: left;
color: #409eff;
width: 50%;
margin-bottom: 20px;
margin-bottom: 20px;
}
}
.item div:first-child {
.item {
color: gray;
text-align: left;
margin-bottom: 20px;
width: 50%;
}
margin-bottom: 20px;
}
border-bottom: 1px solid rgb(245, 245, 245);
.item div:first-child {
padding: 10px 0;
color: gray;
}
margin-bottom: 20px;
}
.cell1:last-child {
border-bottom: 1px solid rgb(245, 245, 245);
border: none
padding: 10px 0;
}
}
}
// 数据标题
.cell1:last-child {
.data_left>.title,
border: none;
.data_right>.title {
text-align: center;
font-size: 22px;
font-weight: bold;
}
}
}
.right_card {
// 数据标题
background-image: url('~@/assets/images/u162.svg');
.data_left > .title,
background-repeat: no-repeat;
.data_right > .title {
background-size: 100% auto;
text-align: center;
background-position: bottom;
font-size: 22px;
}
font-weight: bold;
}
// 导航栏
.right_card {
.data_right {
background-image: url("~@/assets/images/u162.svg");
padding-top: 40px;
background-repeat: no-repeat;
.textWord {
background-size: 100% auto;
text-align: center;
background-position: bottom;
margin-top: 30px;
}
font-size: 16px;
line-height: 1.5em;
}
}
.selectBars {
// 导航栏
padding: 0 20px;
.data_right {
padding-top: 40px;
.textWord {
text-align: center;
margin-top: 30px;
font-size: 16px;
line-height: 1.5em;
}
}
}
.Bar_item {
.selectBars {
width: 30%;
padding: 0 20px;
margin-top: 50px;
}
border-radius: 10px;
padding: 20px 0;
text-align: center;
background: linear-gradient(90deg, rgba(187, 193, 255, 0.3), rgb(235, 235, 235));
cursor: pointer;
.icon img {
.Bar_item {
width: 40px;
width: 30%;
height: 40px;
margin-top: 50px;
}
border-radius: 10px;
padding: 20px 0;
text-align: center;
background: linear-gradient(
90deg,
rgba(187, 193, 255, 0.3),
rgb(235, 235, 235)
);
cursor: pointer;
.barnam
{
.icon img
{
font-size: 18
px;
width: 40
px;
margin-top: 1
0px;
height: 4
0px;
}
}
.des {
.barnam {
font-size: 14px;
font-size: 18px;
color: #666;
margin-top: 10px;
margin-top: 15px;
}
}
}
.des {
font-size: 14px;
color: #666;
margin-top: 15px;
}
}
}
}
::v-deep .el-row,
::v-deep .el-row,
::v-deep .el-col {
::v-deep .el-col {
height: 100%;
height: 100%;
}
}
::v-deep .el-card {
::v-deep .el-card {
height: 100%;
height: 100%;
}
</
style
>
}
</
style
>
attendance-performance-manager-ui/admin/src/views/SSO.vue
View file @
1a06d676
...
@@ -5,50 +5,61 @@
...
@@ -5,50 +5,61 @@
</
template
>
</
template
>
<
script
>
<
script
>
import
jwt_decode
from
"
jwt-decode
"
;
import
jwt_decode
from
"
jwt-decode
"
;
export
default
{
export
default
{
name
:
'
sso
'
,
name
:
"
sso
"
,
created
()
{
created
()
{},
},
mounted
()
{
mounted
()
{
let
token
=
this
.
$route
.
query
.
token
let
token
=
this
.
$route
.
query
.
token
;
console
.
log
(
"
token:
"
+
token
)
console
.
log
(
"
token:
"
+
token
);
console
.
log
(
"
解析后的token:
"
,
jwt_decode
(
token
))
console
.
log
(
"
解析后的token:
"
,
jwt_decode
(
token
));
//const decode = jwt_decode(data.normal_login_token).accountId; // 解析
//const decode = jwt_decode(data.normal_login_token).accountId; // 解析
if
(
token
)
{
if
(
token
)
{
//本地登录后跳转
//本地登录后跳转
this
.
form
.
loginName
=
jwt_decode
(
token
).
userInfo
.
account
this
.
form
.
loginName
=
jwt_decode
(
token
).
userInfo
.
account
;
this
.
form
.
password
=
jwt_decode
(
token
).
userInfo
.
password
this
.
form
.
password
=
jwt_decode
(
token
).
userInfo
.
password
;
/* this.form.loginName="admin"
this
.
$route
.
query
.
sysName
?
localStorage
.
setItem
(
"
sysName
"
,
this
.
$route
.
query
.
sysName
)
:
""
;
this
.
$route
.
query
.
sysLogo
?
localStorage
.
setItem
(
"
sysLogo
"
,
this
.
$route
.
query
.
sysLogo
)
:
""
;
this
.
$route
.
query
.
sysName
?
(
document
.
title
=
this
.
$route
.
query
.
sysName
)
:
""
;
/* this.form.loginName="admin"
this.form.password="scsmile"*/
this.form.password="scsmile"*/
this
.
login
()
this
.
login
();
//window.sessionStorage.setItem("token", token);
//window.sessionStorage.setItem("token", token);
// this.$router.push('/index') // 有token直接跳转首页
// this.$router.push('/index') // 有token直接跳转首页
}
else
{
}
else
{
this
.
$message
({
this
.
$message
({
message
:
'
没有权限,正在跳转登录页面...
'
,
message
:
"
没有权限,正在跳转登录页面...
"
,
center
:
true
center
:
true
,
});
});
setTimeout
(
function
(){
setTimeout
(
function
()
{
window
.
location
.
href
=
process
.
env
.
VUE_APP_PORTAL_URL
==
'
undefined
'
?
'
http://192.168.0.98:11072
'
:
process
.
env
.
VUE_APP_PORTAL_URL
window
.
location
.
href
=
//this.$router.push('/login')
process
.
env
.
VUE_APP_PORTAL_URL
==
"
undefined
"
},
1000
)
?
"
http://192.168.0.98:11072
"
:
process
.
env
.
VUE_APP_PORTAL_URL
;
//this.$router.push('/login')
},
1000
);
}
}
},
},
methods
:
{
methods
:
{
login
()
{
login
()
{
this
.
loading
=
true
;
this
.
loading
=
true
;
this
.
$post
(
"
/login/login
"
,
this
.
form
)
this
.
$post
(
"
/login/login
"
,
this
.
form
)
.
then
(
this
.
loginSuccess
)
.
then
(
this
.
loginSuccess
)
.
catch
(
this
.
loginFail
);
.
catch
(
this
.
loginFail
);
},
},
loginSuccess
({
data
})
{
loginSuccess
({
data
})
{
console
.
log
(
"
userData
"
,
data
);
console
.
log
(
"
userData
"
,
data
);
this
.
$store
.
commit
(
"
setUserData
"
,
data
);
this
.
$store
.
commit
(
"
setUserData
"
,
data
);
this
.
$router
.
push
(
'
/index
'
)
// 有token直接跳转首页
this
.
$router
.
push
(
"
/index
"
);
// 有token直接跳转首页
/* this.$router.replace({
/* this.$router.replace({
path: this.redirect,
path: this.redirect,
});*/
});*/
},
},
...
@@ -60,15 +71,15 @@ export default {
...
@@ -60,15 +71,15 @@ export default {
data
()
{
data
()
{
return
{
return
{
form
:
{
form
:
{
loginName
:
''
,
loginName
:
""
,
password
:
''
,
password
:
""
,
securityCode
:
''
,
securityCode
:
""
,
},
},
redirect
:
this
.
$route
.
query
.
redirect
,
redirect
:
this
.
$route
.
query
.
redirect
,
loading
:
true
,
loading
:
true
,
}
}
;
}
}
,
}
}
;
</
script
>
</
script
>
<
style
>
<
style
>
...
...
attendance-performance-manager-ui/admin/src/views/attendance/record/hik/dialogshow.vue
View file @
1a06d676
<
template
>
<
template
>
<!-- 弹出框表单 -->
<!-- 弹出框表单 -->
<el-dialog
:title=
"title"
:visible.sync=
"open"
width=
"90%"
append-to-body
>
<el-dialog
:title=
"title"
:visible.sync=
"open"
width=
"90%"
append-to-body
>
<el-form
ref=
"form"
:model=
"form"
:rules=
"rules"
label-width=
"120px"
>
<el-form
ref=
"form"
:model=
"form"
:rules=
"rules"
label-width=
"120px"
>
<el-row>
<el-row>
<Field
label=
"员工ID"
prop=
"staffId"
v-model=
"form.staffId"
placeholder=
"请输入员工ID"
/>
<Field
<Field
label=
"员工姓名"
prop=
"staffName"
v-model=
"form.staffName"
placeholder=
"请输入员工姓名"
/>
label=
"员工ID"
<Field
label=
"工号"
prop=
"workNum"
v-model=
"form.workNum"
placeholder=
"请输入工号"
/>
prop=
"staffId"
<Field
label=
"所属部门"
prop=
"deptId"
v-model=
"form.deptId"
placeholder=
"请输入所属部门"
/>
v-model=
"form.staffId"
<Field
label=
"所属部门名称"
prop=
"deptName"
v-model=
"form.deptName"
placeholder=
"请输入所属部门名称"
/>
placeholder=
"请输入员工ID"
<Field
label=
"职位ID"
prop=
"positionId"
v-model=
"form.positionId"
placeholder=
"请输入职位ID"
/>
/>
<Field
label=
"职位名称"
prop=
"positionName"
v-model=
"form.positionName"
placeholder=
"请输入职位名称"
/>
<Field
<Field
label=
"所属考勤组ID"
prop=
"attendanceGroupId"
v-model=
"form.attendanceGroupId"
placeholder=
"请输入所属考勤组ID"
/>
label=
"员工姓名"
<Field
label=
"所属考勤组名称"
prop=
"attendanceGroupName"
v-model=
"form.attendanceGroupName"
placeholder=
"请输入所属考勤组名称"
/>
prop=
"staffName"
<Field
label=
"班次ID"
prop=
"shiftsId"
v-model=
"form.shiftsId"
placeholder=
"请输入班次ID"
/>
v-model=
"form.staffName"
<Field
label=
"班次名称"
prop=
"shiftsName"
v-model=
"form.shiftsName"
placeholder=
"请输入班次名称"
/>
placeholder=
"请输入员工姓名"
<Field
label=
"考勤日期"
prop=
"attendanceDate"
v-model=
"form.attendanceDate"
type=
"date"
/>
/>
<Field
label=
"考勤点名称"
prop=
"attendanceAddress"
v-model=
"form.attendanceAddress"
placeholder=
"请输入考勤点名称"
/>
<Field
<Field
label=
"事件源"
prop=
"eventSource"
v-model=
"form.eventSource"
placeholder=
"请输入事件源"
/>
label=
"工号"
<Field
label=
"备注"
prop=
"remark"
v-model=
"form.remark"
type=
"textarea"
placeholder=
"请输入备注"
/>
prop=
"workNum"
v-model=
"form.workNum"
</el-row>
placeholder=
"请输入工号"
/>
</el-form>
<Field
<div
slot=
"footer"
class=
"dialog-footer"
>
label=
"所属部门"
<el-button
type=
"primary"
v-if=
"pageInfo.type !== 'view'"
@
click=
"submitForm"
>
确 定
</el-button>
prop=
"deptId"
<el-button
@
click=
"cancel"
>
取 消
</el-button>
v-model=
"form.deptId"
</div>
placeholder=
"请输入所属部门"
</el-dialog>
/>
<Field
label=
"所属部门名称"
prop=
"deptName"
v-model=
"form.deptName"
placeholder=
"请输入所属部门名称"
/>
<Field
label=
"职位ID"
prop=
"positionId"
v-model=
"form.positionId"
placeholder=
"请输入职位ID"
/>
<Field
label=
"职位名称"
prop=
"positionName"
v-model=
"form.positionName"
placeholder=
"请输入职位名称"
/>
<Field
label=
"所属考勤组ID"
prop=
"attendanceGroupId"
v-model=
"form.attendanceGroupId"
placeholder=
"请输入所属考勤组ID"
/>
<Field
label=
"所属考勤组名称"
prop=
"attendanceGroupName"
v-model=
"form.attendanceGroupName"
placeholder=
"请输入所属考勤组名称"
/>
<Field
label=
"班次ID"
prop=
"shiftsId"
v-model=
"form.shiftsId"
placeholder=
"请输入班次ID"
/>
<Field
label=
"班次名称"
prop=
"shiftsName"
v-model=
"form.shiftsName"
placeholder=
"请输入班次名称"
/>
<Field
label=
"考勤日期"
prop=
"attendanceDate"
v-model=
"form.attendanceDate"
type=
"date"
/>
<Field
label=
"考勤点名称"
prop=
"attendanceAddress"
v-model=
"form.attendanceAddress"
placeholder=
"请输入考勤点名称"
/>
<Field
label=
"事件源"
prop=
"eventSource"
v-model=
"form.eventSource"
placeholder=
"请输入事件源"
/>
<Field
label=
"备注"
prop=
"remark"
v-model=
"form.remark"
type=
"textarea"
placeholder=
"请输入备注"
/>
</el-row>
</el-form>
<div
slot=
"footer"
class=
"dialog-footer"
>
<el-button
type=
"primary"
v-if=
"pageInfo.type !== 'view'"
@
click=
"submitForm"
>
确 定
</el-button
>
<el-button
@
click=
"cancel"
>
取 消
</el-button>
</div>
</el-dialog>
</
template
>
</
template
>
<
script
>
<
script
>
import
form
from
"
@/assets/mixins/formdialog
"
;
import
form
from
"
@/assets/mixins/formdialog
"
;
import
dialogShow
from
"
./dialogshow
"
;
import
dialogShow
from
"
./dialogshow
"
;
export
default
{
export
default
{
mixins
:
[
form
],
mixins
:
[
form
],
components
:
{
components
:
{
dialogShow
,
dialogShow
,
},
},
data
()
{
data
()
{
return
{
return
{
// 遮罩层
// 遮罩层
loading
:
true
,
loading
:
true
,
// 弹出层标题
// 弹出层标题
title
:
"
海康考勤打卡记录汇总信息
"
,
title
:
"
海康考勤打卡记录汇总信息
"
,
// 是否显示弹出层
// 是否显示弹出层
open
:
false
,
open
:
false
,
toString
:[
toString
:
[],
],
// 表单校验
// 表单校验
rules
:
{
rules
:
{
staffName
:
[
staffName
:
[
{
required
:
true
,
message
:
"
请输入员工姓名
"
,
trigger
:
"
blur
"
},
{
required
:
true
,
message
:
"
请输入员工姓名
"
,
trigger
:
"
blur
"
},
{
max
:
64
,
message
:
"
最多只能录入64个字符
"
,
trigger
:
"
blur
"
},
{
max
:
64
,
message
:
"
最多只能录入64个字符
"
,
trigger
:
"
blur
"
,},
],
],
createTime
:
[{
required
:
true
,
message
:
"
请选择创建时间
"
}],
createTime
:
[
},
{
required
:
true
,
message
:
"
请选择创建时间
"
},
};
],
},
}
};
},
methods
:
{
methods
:
{
/** 编辑 */
/** 编辑 */
edit
(
row
)
{
edit
(
row
)
{
this
.
reset
()
this
.
reset
();
this
.
query
=
{
id
:
row
.
id
};
this
.
query
=
{
id
:
row
.
id
};
this
.
urls
.
currUrl
=
"
attendance/record/hik/edit
"
;
this
.
urls
.
currUrl
=
"
attendance/record/hik/edit
"
;
this
.
getData
();
this
.
getData
();
this
.
pageInfo
.
type
=
"
edit
"
this
.
pageInfo
.
type
=
"
edit
"
;
this
.
title
=
"
修改海康考勤打卡记录汇总信息
"
;
this
.
title
=
"
修改海康考勤打卡记录汇总信息
"
;
},
},
/** 新增 */
/** 新增 */
add
(
row
)
{
add
(
row
)
{
this
.
reset
()
this
.
reset
();
this
.
urls
.
currUrl
=
"
attendance/record/hik/add
"
;
this
.
urls
.
currUrl
=
"
attendance/record/hik/add
"
;
this
.
getData
();
this
.
getData
();
this
.
pageInfo
.
type
=
"
add
"
this
.
pageInfo
.
type
=
"
add
"
;
this
.
title
=
"
新增海康考勤打卡记录汇总信息
"
;
this
.
title
=
"
新增海康考勤打卡记录汇总信息
"
;
},
},
/** 查看*/
/** 查看*/
view
(
row
)
{
view
(
row
)
{
this
.
reset
()
this
.
reset
();
this
.
query
=
{
id
:
row
.
id
};
this
.
query
=
{
id
:
row
.
id
};
this
.
urls
.
currUrl
=
"
attendance/record/hik/view
"
;
this
.
urls
.
currUrl
=
"
attendance/record/hik/view
"
;
this
.
getData
();
this
.
getData
();
this
.
pageInfo
.
type
=
"
view
"
this
.
pageInfo
.
type
=
"
view
"
;
this
.
title
=
"
海康考勤打卡记录汇总信息详细
"
;
this
.
title
=
"
海康考勤打卡记录汇总信息详细
"
;
},
},
/**取消按钮 */
/**取消按钮 */
cancel
()
{
cancel
()
{
this
.
open
=
false
;
this
.
open
=
false
;
},
},
/**获取数据后弹框 */
/**获取数据后弹框 */
afterRender
(
data
)
{
afterRender
(
data
)
{
this
.
open
=
true
;
this
.
open
=
true
;
},
},
afterSubmit
(
data
)
{
afterSubmit
(
data
)
{
this
.
open
=
false
;
this
.
open
=
false
;
this
.
$emit
(
"
ok
"
);
this
.
$emit
(
"
ok
"
);
},
},
// 表单重置
// 表单重置
reset
()
{
reset
()
{
this
.
form
=
{
this
.
form
=
{
staffId
:
null
,
staffId
:
null
,
staffName
:
""
,
staffName
:
""
,
workNum
:
""
,
workNum
:
""
,
deptId
:
null
,
deptId
:
null
,
deptName
:
""
,
deptName
:
""
,
positionId
:
null
,
positionId
:
null
,
positionName
:
""
,
positionName
:
""
,
attendanceGroupId
:
null
,
attendanceGroupId
:
null
,
attendanceGroupName
:
""
,
attendanceGroupName
:
""
,
shiftsId
:
null
,
shiftsId
:
null
,
shiftsName
:
""
,
shiftsName
:
""
,
attendanceDate
:
null
,
attendanceDate
:
null
,
attendanceAddress
:
""
,
attendanceAddress
:
""
,
eventSource
:
""
,
eventSource
:
""
,
remark
:
""
,
remark
:
""
,
};
};
this
.
resetForm
(
"
form
"
);
this
.
resetForm
(
"
form
"
);
},
},
resetForm
(
refName
)
{
resetForm
(
refName
)
{
if
(
this
.
$refs
[
refName
])
{
if
(
this
.
$refs
[
refName
])
{
this
.
$refs
[
refName
].
resetFields
();
this
.
$refs
[
refName
].
resetFields
();
}
}
},
},
},
},
};
};
</
script
>
</
script
>
attendance-performance-manager-ui/admin/src/views/attendance/record/hik/list.vue
View file @
1a06d676
<
template
>
<
template
>
<div
class=
"page"
>
<div
class=
"page"
>
<LayoutTable
:data=
"tableData"
:config=
"tableConfig"
notDel
notAdd
>
<LayoutTable
:data=
"tableData"
:config=
"tableConfig"
notDel
notAdd
>
<el-button
<el-button
slot=
"table-head-left2"
slot=
"table-head-left2"
style=
"margin-left: 10px"
style=
"margin-left: 10px"
icon=
"el-icon-tickets"
icon=
"el-icon-tickets"
size=
"mini"
size=
"mini"
@
click=
"handleImport"
@
click=
"handleImport"
>
导入
</el-button>
>
导入
</el-button
<el-button
>
slot=
"table-head-left2"
<el-button
style=
"margin-left: 10px"
slot=
"table-head-left2"
icon=
"el-icon-tickets"
style=
"margin-left: 10px"
size=
"mini"
icon=
"el-icon-tickets"
type=
"primary"
size=
"mini"
@
click=
"doExport"
type=
"primary"
:disabled=
"isExport"
@
click=
"doExport"
>
导出
</el-button>
:disabled=
"isExport"
<el-button
>
导出
</el-button
slot=
"table-head-left2"
>
style=
"margin-left: 10px"
<el-button
icon=
"el-icon-tickets"
slot=
"table-head-left2"
size=
"mini"
style=
"margin-left: 10px"
type=
"success"
icon=
"el-icon-tickets"
@
click=
"lookexportHis"
size=
"mini"
>
导出记录
</el-button>
type=
"success"
<el-button
type=
"primary"
size=
"mini"
slot=
"table-head-left2"
@
click=
"lookexportHis"
style=
"margin-left: 10px"
@
click=
"formatData"
>
生成打卡记录
</el-button>
>
导出记录
</el-button
</LayoutTable>
>
<dialog-show
ref=
"dialogform"
@
ok=
"getData"
/>
<!--
<el-button
<el-dialog
type=
"primary"
:title=
"upload.title"
size=
"mini"
:visible.sync=
"upload.open"
slot=
"table-head-left2"
width=
"400px"
style=
"margin-left: 10px"
append-to-body
@
click=
"formatData"
>
>
生成打卡记录
</el-button
<el-upload
>
-->
ref=
"upload"
</LayoutTable>
:limit=
"1"
<dialog-show
ref=
"dialogform"
@
ok=
"getData"
/>
accept=
".xlsx, .xls"
<el-dialog
:headers=
"upload.headers"
:title=
"upload.title"
:action=
"upload.url + '?updateSupport=' + upload.updateSupport"
:visible.sync=
"upload.open"
:disabled=
"upload.isUploading"
width=
"400px"
:on-progress=
"handleFileUploadProgress"
append-to-body
:on-success=
"handleFileSuccess"
>
:auto-upload=
"false"
<el-upload
drag
ref=
"upload"
:limit=
"1"
accept=
".xlsx, .xls"
:headers=
"upload.headers"
:action=
"upload.url + '?updateSupport=' + upload.updateSupport"
:disabled=
"upload.isUploading"
:on-progress=
"handleFileUploadProgress"
:on-success=
"handleFileSuccess"
:auto-upload=
"false"
drag
>
<i
class=
"el-icon-upload"
></i>
<div
class=
"el-upload__text"
>
将文件拖到此处,或
<em>
点击上传
</em>
</div>
<div
class=
"el-upload__tip"
slot=
"tip"
>
<el-checkbox
v-model=
"upload.updateSupport"
/>
是否更新已经存在的数据
<el-link
type=
"primary"
style=
"font-size: 14px"
@
click=
"downloadTemplate"
>
下载模板
</el-link
>
</div>
<div
class=
"el-upload__tip"
style=
"color: red"
slot=
"tip"
>
提示:仅允许导入“xls”或“xlsx”格式文件!
</div>
</el-upload>
<div
slot=
"footer"
class=
"dialog-footer"
>
<el-button
type=
"primary"
@
click=
"submitFileForm"
>
确 定
</el-button>
<el-button
@
click=
"upload.open = false"
>
取 消
</el-button>
</div>
</el-dialog>
<!-- 导出记录查看 -->
<el-drawer
title=
"导出记录"
:visible.sync=
"drawerhistory"
:direction=
"direction"
>
<div
class=
"hisList"
>
<div
class=
"list mt10"
v-for=
"(item, index) in exportList"
:key=
"index"
@
click=
"changeStatus(item)"
>
>
<i
class=
"el-icon-upload"
></i>
<div
class=
"flex flex-align-center flex-pack-justify"
>
<div
class=
"el-upload__text"
>
<div>
打卡记录汇总
</div>
将文件拖到此处,或
<el-button
type=
"text"
>
导出成功
</el-button>
<em>
点击上传
</em>
</div>
<div
class=
"details"
v-if=
"item.islook"
>
<div
class=
"mt10"
v-if=
"item.recordIdList"
>
选择列表id:
{{
item
.
recordIdList
}}
</div>
</div>
<div
class=
"el-upload__tip"
slot=
"tip"
>
<div
class=
"mt10"
v-if=
"item.deptName"
>
<el-checkbox
选择部门:
{{
item
.
deptName
}}
v-model=
"upload.updateSupport"
/>
是否更新已经存在的数据
<el-link
type=
"primary"
style=
"font-size: 14px"
@
click=
"downloadTemplate"
>
下载模板
</el-link
>
</div>
</div>
<div
class=
"el-upload__tip"
style=
"color: red"
slot=
"tip"
>
<div
class=
"mt10"
v-if=
"item.groupName"
>
提示:仅允许导入“xls”或“xlsx”格式文件!
选择考勤组:
{{
item
.
groupName
}}
</div>
<div
class=
"mt10"
v-if=
"item.className"
>
选择班次:
{{
item
.
className
}}
</div>
</div>
</el-upload>
<div
slot=
"footer"
class=
"dialog-footer"
>
<el-button
type=
"primary"
@
click=
"submitFileForm"
>
确 定
</el-button>
<el-button
@
click=
"upload.open = false"
>
取 消
</el-button>
</div>
</el-dialog>
<!-- 导出记录查看 -->
<el-drawer
title=
"导出记录"
:visible.sync=
"drawerhistory"
:direction=
"direction"
>
<div
class=
"hisList"
>
<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=
"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"
>
<div
class=
"mt10"
>
<el-link
:href=
"item.filePath"
target=
"_blank"
type=
"primary"
>
重新下载
</el-link>
<el-link
:href=
"item.filePath"
target=
"_blank"
type=
"primary"
</div>
>
重新下载
</el-link
</div>
>
<div
class=
"times mt10"
>
导出时间:
{{
item
.
createTime
}}
</div>
</div>
</div>
</div>
</el-drawer>
</div>
</div>
<div
class=
"times mt10"
>
导出时间:
{{
item
.
createTime
}}
</div>
</div>
</div>
</el-drawer>
</div>
</
template
>
</
template
>
<
script
>
<
script
>
/** 表单弹出框模式需引入 */
/** 表单弹出框模式需引入 */
import
dialogShow
from
"
./dialogshow
"
;
import
dialogShow
from
"
./dialogshow
"
;
import
table
from
"
@/assets/mixins/table
"
;
import
table
from
"
@/assets/mixins/table
"
;
import
{
timestampToTime
}
from
'
@/assets/utils/dateFormat
'
import
{
timestampToTime
}
from
"
@/assets/utils/dateFormat
"
;
export
default
{
export
default
{
name
:
"
AttendanceRecordHikList
"
,
name
:
"
AttendanceRecordHikList
"
,
components
:
{
components
:
{
dialogShow
dialogShow
,
},
},
mixins
:
[
table
],
mixins
:
[
table
],
created
()
{
created
()
{},
},
methods
:
{
methods
:
{
// 生成打卡记录
// 生成打卡记录
formatData
()
{
formatData
(){
let
params
=
{};
let
params
=
{}
for
(
let
value
of
this
.
config
.
search
)
{
for
(
let
value
of
this
.
config
.
search
){
if
(
this
.
query
[
value
.
name
])
{
if
(
this
.
query
[
value
.
name
]){
params
[
value
.
name
]
=
this
.
query
[
value
.
name
];
params
[
value
.
name
]
=
this
.
query
[
value
.
name
]
}
}
}
}
if
(
this
.
selection
.
length
>
0
)
{
if
(
this
.
selection
.
length
>
0
){
params
[
"
idList
"
]
=
this
.
selection
;
params
[
'
idList
'
]
=
this
.
selection
}
}
this
.
$post
(
"
/attendance/record/hik/addAttendanceRecord
"
,
{
this
.
$post
(
'
/attendance/record/hik/addAttendanceRecord
'
,{...
params
}).
then
(
res
=>
{
...
params
,
if
(
res
.
code
==
1
){
}).
then
((
res
)
=>
{
this
.
$message
.
success
(
"
生成打卡记录成功!
"
)
if
(
res
.
code
==
1
)
{
}
this
.
$message
.
success
(
"
生成打卡记录成功!
"
);
})
}
},
});
// 更改状态
},
changeStatus
(
item
){
// 更改状态
this
.
$set
(
changeStatus
(
item
)
{
item
,
this
.
$set
(
item
,
"
islook
"
,
!
item
.
islook
);
'
islook
'
,
},
!
item
.
islook
// 导出记录
)
lookexportHis
()
{
},
this
.
$post
(
"
/attendance/export/record/list
"
,
{
// 导出记录
type
:
1
,
lookexportHis
(){
page
:
1
,
this
.
$post
(
'
/attendance/export/record/list
'
,{
type
:
1
,
page
:
1
,
size
:
-
1
}).
then
(
res
=>
{
size
:
-
1
,
if
(
res
.
code
==
1
){
}).
then
((
res
)
=>
{
let
arr
=
res
.
data
.
data
if
(
res
.
code
==
1
)
{
this
.
exportList
=
arr
.
map
(
item
=>
{
let
arr
=
res
.
data
.
data
;
item
.
createTime
=
timestampToTime
(
item
.
createTime
,
6
)
this
.
exportList
=
arr
.
map
((
item
)
=>
{
item
.
islook
=
false
item
.
createTime
=
timestampToTime
(
item
.
createTime
,
6
);
return
item
item
.
islook
=
false
;
})
return
item
;
}
});
})
}
// 导出记录
});
this
.
drawerhistory
=
true
// 导出记录
},
this
.
drawerhistory
=
true
;
/** 导入 */
},
handleImport
()
{
/** 导入 */
this
.
upload
.
title
=
"
打卡记录导入
"
;
handleImport
()
{
this
.
upload
.
open
=
true
;
this
.
upload
.
title
=
"
打卡记录导入
"
;
},
this
.
upload
.
open
=
true
;
/** 下载模板操作 */
},
downloadTemplate
()
{
/** 下载模板操作 */
this
.
isExport
=
true
;
downloadTemplate
()
{
this
.
$download
(
"
/attendance/record/hik/downloadTemplate
"
,
{},
{
type
:
"
excel
"
})
this
.
isExport
=
true
;
.
then
(()
=>
(
this
.
isExport
=
false
))
this
.
$download
(
.
catch
((
error
)
=>
{
"
/attendance/record/hik/downloadTemplate
"
,
this
.
isExport
=
false
;
{},
this
.
$message
.
error
(
error
.
message
);
{
type
:
"
excel
"
}
})
)
},
.
then
(()
=>
(
this
.
isExport
=
false
))
/** 文件上传中处理 */
.
catch
((
error
)
=>
{
handleFileUploadProgress
(
event
,
file
,
fileList
)
{
this
.
isExport
=
false
;
this
.
upload
.
isUploading
=
true
;
this
.
$message
.
error
(
error
.
message
);
},
});
/** 文件上传成功处理 */
},
handleFileSuccess
(
response
,
file
,
fileList
)
{
/** 文件上传中处理 */
this
.
upload
.
open
=
false
;
handleFileUploadProgress
(
event
,
file
,
fileList
)
{
this
.
upload
.
isUploading
=
false
;
this
.
upload
.
isUploading
=
true
;
this
.
$refs
.
upload
.
clearFiles
();
},
this
.
$alert
(
response
.
msg
,
"
导入结果
"
,
{
dangerouslyUseHTMLString
:
true
});
/** 文件上传成功处理 */
this
.
getData
();
handleFileSuccess
(
response
,
file
,
fileList
)
{
},
this
.
upload
.
open
=
false
;
/** 提交上传文件 */
this
.
upload
.
isUploading
=
false
;
submitFileForm
()
{
this
.
$refs
.
upload
.
clearFiles
();
this
.
$refs
.
upload
.
submit
();
this
.
$alert
(
response
.
msg
,
"
导入结果
"
,
{
dangerouslyUseHTMLString
:
true
});
},
this
.
getData
();
/** 导出Excel */
},
doExport
()
{
/** 提交上传文件 */
this
.
isExport
=
true
;
submitFileForm
()
{
let
params
=
{}
this
.
$refs
.
upload
.
submit
();
for
(
let
value
of
this
.
config
.
search
){
},
if
(
this
.
query
[
value
.
name
]){
/** 导出Excel */
params
[
value
.
name
]
=
this
.
query
[
value
.
name
]
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
)
{
if
(
this
.
selection
.
length
>
0
)
{
params
[
'
idList
'
]
=
this
.
selection
params
[
"
idList
"
]
=
this
.
selection
;
}
}
this
.
$download
(
"
/attendance/record/hik/exportExcel
"
,
{
this
.
$download
(
...
params
,
"
/attendance/record/hik/exportExcel
"
,
},
{
type
:
"
excel
"
}).
then
(()
=>
this
.
isExport
=
false
).
catch
(
error
=>
{
{
this
.
isExport
=
false
;
...
params
,
this
.
$message
.
error
(
error
.
message
);
})
},
/** 重写新增方法 */
toAdd
(
row
)
{
this
.
$refs
.
dialogform
.
add
(
row
);
},
/** 重写编辑方法 */
toEdit
(
row
)
{
this
.
$refs
.
dialogform
.
edit
(
row
);
},
/** 重写查看方法 */
toView
(
row
)
{
this
.
$refs
.
dialogform
.
view
(
row
);
},
afterRender
(
data
)
{
console
.
log
(
this
.
tableData
.
data
)
},
},
},
data
()
{
{
type
:
"
excel
"
}
return
{
)
upload
:
{
.
then
(()
=>
(
this
.
isExport
=
false
))
headers
:{
.
catch
((
error
)
=>
{
Authorization
:
window
.
sessionStorage
.
getItem
(
'
token
'
)
||
''
this
.
isExport
=
false
;
},
this
.
$message
.
error
(
error
.
message
);
// 是否显示弹出层(员工关怀信息导入)
});
open
:
false
,
},
// 弹出层标题(员工关怀信息导入)
/** 重写新增方法 */
title
:
"
导入员工关怀信息数据
"
,
toAdd
(
row
)
{
// 是否禁用上传
this
.
$refs
.
dialogform
.
add
(
row
);
isUploading
:
false
,
},
// 是否更新已经存在的数据
/** 重写编辑方法 */
updateSupport
:
0
,
toEdit
(
row
)
{
// 上传的地址
this
.
$refs
.
dialogform
.
edit
(
row
);
url
:
process
.
env
.
VUE_APP_API_BASE_URL
+
"
/attendance/attendance/record/hik/importData
"
,
},
},
/** 重写查看方法 */
config
:
{
toView
(
row
)
{
isshowTabPane
:
true
,
this
.
$refs
.
dialogform
.
view
(
row
);
search
:
[
},
{
afterRender
(
data
)
{
name
:
"
staffName
"
,
console
.
log
(
this
.
tableData
.
data
);
type
:
"
text
"
,
},
label
:
"
员工姓名
"
,
},
fuzzy
:
false
data
()
{
},
return
{
{
upload
:
{
name
:
'
workNum
'
,
headers
:
{
type
:
'
text
'
,
Authorization
:
window
.
sessionStorage
.
getItem
(
"
token
"
)
||
""
,
label
:
'
工号
'
,
},
fuzzy
:
false
// 是否显示弹出层(员工关怀信息导入)
},
open
:
false
,
// {
// 弹出层标题(员工关怀信息导入)
// name: "deptId",
title
:
"
导入员工关怀信息数据
"
,
// type: "select",
// 是否禁用上传
// label: "所属部门",
isUploading
:
false
,
// fuzzy: false
// 是否更新已经存在的数据
// },
updateSupport
:
0
,
// {
// 上传的地址
// name: "attendanceGroupId",
url
:
// type: "select",
process
.
env
.
VUE_APP_API_BASE_URL
+
// label: "所属考勤组",
"
/attendance/attendance/record/hik/importData
"
,
// fuzzy: false
},
// },
config
:
{
// {
isshowTabPane
:
true
,
// name: "shiftsId",
search
:
[
// type: "select",
{
// label: "班次",
name
:
"
staffName
"
,
// fuzzy: false
type
:
"
text
"
,
// },
label
:
"
员工姓名
"
,
{
fuzzy
:
false
,
name
:
'
attendanceDateStart
'
,
},
type
:
"
date
"
,
{
label
:
"
考勤开始时间
"
,
name
:
"
workNum
"
,
fuzzy
:
false
type
:
"
text
"
,
},
label
:
"
工号
"
,
{
fuzzy
:
false
,
name
:
'
attendanceDateEnd
'
,
},
type
:
"
date
"
,
// {
label
:
"
考勤结束时间
"
,
// name: "deptId",
fuzzy
:
false
// type: "select",
}
// label: "所属部门",
],
// fuzzy: false
columns
:
[
// },
{
type
:
"
selection
"
,
width
:
60
},
// {
{
type
:
"
index
"
,
label
:
"
序号
"
,
width
:
50
},
// name: "attendanceGroupId",
{
label
:
"
员工姓名
"
,
prop
:
"
staffName
"
},
// type: "select",
{
label
:
"
工号
"
,
prop
:
"
workNum
"
},
// label: "所属考勤组",
{
label
:
"
部门
"
,
prop
:
"
deptName
"
},
// fuzzy: false
// {label: "考勤组", prop: "attendanceGroupName"},
// },
// {label: "职位", prop: "positionName"},
// {
// {label: "班次", prop: "shiftsName"},
// name: "shiftsId",
{
label
:
"
考勤时间
"
,
prop
:
"
attendanceDate
"
,
formatter
:
this
.
formatterDate
},
// type: "select",
{
label
:
"
考勤点名称
"
,
prop
:
"
attendanceAddress
"
},
// label: "班次",
{
label
:
"
事件源
"
,
prop
:
"
eventSource
"
},
// fuzzy: false
// {
// },
// label: "操作",
{
// width: 240,
name
:
"
attendanceDateStart
"
,
// formatter: row => {
type
:
"
date
"
,
// return (
label
:
"
考勤开始时间
"
,
//
<
table
-
buttons
noAdd
noDel
noEdit
noView
row
=
{
row
}
fuzzy
:
false
,
// onEdit={this.toEdit} onView={this.toView} onDel={this.toDel} />
},
// )
{
// }
name
:
"
attendanceDateEnd
"
,
// }
type
:
"
date
"
,
]
label
:
"
考勤结束时间
"
,
},
fuzzy
:
false
,
drawerhistory
:
false
,
},
exportList
:[],
],
baseUrl
:
process
.
env
.
VUE_APP_API_BASE_URL
+
'
/
'
columns
:
[
}
{
type
:
"
selection
"
,
width
:
60
},
}
{
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
:
"
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} />
// )
// }
// }
],
},
drawerhistory
:
false
,
exportList
:
[],
baseUrl
:
process
.
env
.
VUE_APP_API_BASE_URL
+
"
/
"
,
};
};
},
};
</
script
>
</
script
>
<
style
scoped
lang=
"scss"
>
<
style
scoped
lang=
"scss"
>
.hisList
{
.hisList
{
padding
:
15px
;
padding
:
15px
;
.list
{
.list
{
background-color
:
rgba
(
64
,
158
,
255
,
0
.1
);
background-color
:
rgba
(
64
,
158
,
255
,
0
.1
);
font-size
:
14px
;
font-size
:
14px
;
border-radius
:
10px
;
border-radius
:
10px
;
padding
:
10px
;
padding
:
10px
;
.times
{
.times
{
font-size
:
12px
;
font-size
:
12px
;
color
:
#999
;
color
:
#999
;
}
cursor
:
pointer
;
}
}
}
.details
{
cursor
:
pointer
;
cursor
:
pointer
;
}
}
.details
{
cursor
:
pointer
;
}
}
</
style
>
</
style
>
attendance-performance-manager-ui/admin/src/views/check/effect/record/drawershow.vue
View file @
1a06d676
...
@@ -24,7 +24,9 @@
...
@@ -24,7 +24,9 @@
>
>
<el-col
:span=
"12"
<el-col
:span=
"12"
>
违规类型:
{{
>
违规类型:
{{
form
.
irregularType
?
form
.
irregularType
:
"
--
"
form
.
irregularType
?
util_formatter
(
"
irregularType
"
,
form
.
irregularType
)
:
"
--
"
}}
</el-col
}}
</el-col
>
>
</el-row>
</el-row>
...
...
attendance-performance-manager-ui/admin/src/views/login/login.vue
View file @
1a06d676
...
@@ -3,20 +3,43 @@
...
@@ -3,20 +3,43 @@
<
template
>
<
template
>
<div
class=
"page page-login flex flex-v"
>
<div
class=
"page page-login flex flex-v"
>
<div
class=
"form-wrap flex flex-1"
>
<div
class=
"form-wrap flex flex-1"
>
<el-form
@
submit.prevent=
'onSubmit'
ref=
"form"
:model=
"form"
label-width=
"0px"
size=
"small"
>
<el-form
<h1>
智慧政务绩效管理系统
</h1>
@
submit.prevent=
"onSubmit"
ref=
"form"
:model=
"form"
label-width=
"0px"
size=
"small"
>
<h1>
{{
sysName
?
sysName
:
"
智慧政务绩效管理系统
"
}}
</h1>
<div
class=
"des"
>
数据驱动绩效改善,强化从指标到目标全过程管理
</div>
<div
class=
"des"
>
数据驱动绩效改善,强化从指标到目标全过程管理
</div>
<el-form-item
label=
""
>
<el-form-item
label=
""
>
<el-input
v-model=
"form.loginName"
placeholder=
"请输入用户名"
class=
"input"
></el-input>
<el-input
v-model=
"form.loginName"
placeholder=
"请输入用户名"
class=
"input"
></el-input>
</el-form-item>
</el-form-item>
<el-form-item
label=
""
>
<el-form-item
label=
""
>
<el-input
v-model=
"form.password"
type=
'password'
placeholder=
"请输入密码"
class=
"input"
></el-input>
<el-input
v-model=
"form.password"
type=
"password"
placeholder=
"请输入密码"
class=
"input"
></el-input>
</el-form-item>
</el-form-item>
<el-form-item
size=
"large"
>
<el-form-item
size=
"large"
>
<el-button
type=
"primary"
native-type=
'submit'
:loading=
'loading'
@
click=
'onSubmit'
>
登录
</el-button>
<el-button
type=
"primary"
native-type=
"submit"
:loading=
"loading"
@
click=
"onSubmit"
>
登录
</el-button
>
</el-form-item>
</el-form-item>
<div
class=
"tips"
>
温馨提示:请使用谷歌或火狐等非ie内核浏览器,观看效果更佳
</div>
<div
class=
"tips"
>
温馨提示:请使用谷歌或火狐等非ie内核浏览器,观看效果更佳
</div>
</el-form>
</el-form>
</div>
</div>
...
@@ -31,7 +54,15 @@ import { createSocket } from "@/assets/utils/websocket";
...
@@ -31,7 +54,15 @@ import { createSocket } from "@/assets/utils/websocket";
export
default
{
export
default
{
name
:
"
login
"
,
name
:
"
login
"
,
created
()
{},
created
()
{
this
.
$route
.
query
.
sysName
?
localStorage
.
setItem
(
"
sysName
"
,
this
.
$route
.
query
.
sysName
)
:
""
;
this
.
$route
.
query
.
sysName
?
(
document
.
title
=
this
.
$route
.
query
.
sysName
)
:
""
;
localStorage
.
setItem
(
"
sysLogo
"
,
this
.
$route
.
query
.
sysLogo
);
},
methods
:
{
methods
:
{
login
()
{
login
()
{
this
.
loading
=
true
;
this
.
loading
=
true
;
...
@@ -41,11 +72,11 @@ export default {
...
@@ -41,11 +72,11 @@ export default {
},
},
loginSuccess
({
data
})
{
loginSuccess
({
data
})
{
console
.
log
(
"
userData
"
,
data
);
console
.
log
(
"
userData
"
,
data
);
console
.
log
(
"
redirect
"
,
this
.
redirect
)
console
.
log
(
"
redirect
"
,
this
.
redirect
);
this
.
$store
.
commit
(
"
setUserData
"
,
data
);
this
.
$store
.
commit
(
"
setUserData
"
,
data
);
this
.
$router
.
replace
({
this
.
$router
.
replace
({
path
:
this
.
redirect
,
path
:
this
.
redirect
,
})
})
;
//成功 创建websocket连接 process.env.VUE_WEBSOCKET_BASE_API +
//成功 创建websocket连接 process.env.VUE_WEBSOCKET_BASE_API +
console
.
log
(
"
process
"
,
process
.
env
);
console
.
log
(
"
process
"
,
process
.
env
);
...
@@ -81,10 +112,11 @@ export default {
...
@@ -81,10 +112,11 @@ export default {
form
:
{
form
:
{
loginName
:
""
,
loginName
:
""
,
password
:
""
,
password
:
""
,
}
},
}
sysName
:
localStorage
.
getItem
(
"
sysName
"
),
}
};
}
},
};
</
script
>
</
script
>
<
style
lang=
"less"
>
<
style
lang=
"less"
>
...
@@ -94,14 +126,15 @@ export default {
...
@@ -94,14 +126,15 @@ export default {
border-top: 2px solid #e8eaec;
border-top: 2px solid #e8eaec;
}
}
.page-login {
.page-login {
background-image: url(
'~@/assets/images/login_bg.jpg'
);
background-image: url(
"~@/assets/images/login_bg.jpg"
);
background-repeat: no-repeat;
background-repeat: no-repeat;
background-size: cover;
background-size: cover;
margin: 0;
margin: 0;
height: 100%;
height: 100%;
overflow: hidden;
overflow: hidden;
text-align: center;
text-align: center;
.des,.tips{
.des,
.tips {
font-size: 14px;
font-size: 14px;
white-space: nowrap;
white-space: nowrap;
margin-bottom: 20px;
margin-bottom: 20px;
...
@@ -123,33 +156,37 @@ export default {
...
@@ -123,33 +156,37 @@ export default {
margin-top: 10px;
margin-top: 10px;
width: 240px;
width: 240px;
}
}
.el-form-item{
.el-form-item
{
margin-bottom: 28px;
margin-bottom: 28px;
}
}
.el-input-group__append {
.el-input-group__append {
padding: 0;
padding: 0;
font-size: 0;
font-size: 0;
}
}
.el-input{
.el-input
{
width: 80%;
width: 80%;
}
}
.el-input__inner{
.el-input__inner
{
border-color: #409
EFF
;
border-color: #409
eff
;
border-radius: 20px;
border-radius: 20px;
}
}
.el-input--small .el-input__inner{
.el-input--small .el-input__inner
{
height: 52px;
height: 52px;
line-height: 1em;
line-height: 1em;
font-size: 15px;
font-size: 15px;
}
}
.el-input__inner::placeholder{
.el-input__inner::placeholder
{
color: #409
EFF
;
color: #409
eff
;
}
}
button{
button
{
width: 80%;
width: 80%;
border-radius: 20px;
border-radius: 20px;
height: 52px;
height: 52px;
background: linear-gradient(90deg, rgba(24, 69, 198, 1) 0%, rgba(41, 153, 255, 1) 100%);
background: linear-gradient(
90deg,
rgba(24, 69, 198, 1) 0%,
rgba(41, 153, 255, 1) 100%
);
}
}
}
}
.footer {
.footer {
...
@@ -168,4 +205,3 @@ export default {
...
@@ -168,4 +205,3 @@ export default {
// border-color: #409EFF;
// border-color: #409EFF;
// }
// }
</
style
>
</
style
>
attendance-performance-manager-ui/admin/src/views/staff/perform/summary/dialogshow.vue
View file @
1a06d676
...
@@ -37,7 +37,7 @@
...
@@ -37,7 +37,7 @@
:
item
.
subAddType
==
2
:
item
.
subAddType
==
2
?
"
扣分方式:
"
?
"
扣分方式:
"
:
"
方式:
"
:
"
方式:
"
}}{{
util_formatter
s
(
"
subMethod
"
,
item
.
subMethod
)
}}
</span
}}{{
util_formatter
(
"
subMethod
"
,
item
.
subMethod
)
}}
</span
>
>
</div>
</div>
<div
class=
"user-info"
>
<div
class=
"user-info"
>
...
...
attendance-performance-manager/src/main/java/com/mortals/xhx/module/attendance/dingmsg/api/DingMessageController.java
View file @
1a06d676
...
@@ -47,6 +47,7 @@ import java.text.ParseException;
...
@@ -47,6 +47,7 @@ import java.text.ParseException;
import
java.text.SimpleDateFormat
;
import
java.text.SimpleDateFormat
;
import
java.time.Duration
;
import
java.time.Duration
;
import
java.util.Date
;
import
java.util.Date
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.Map
;
import
static
cn
.
hutool
.
core
.
date
.
DatePattern
.*;
import
static
cn
.
hutool
.
core
.
date
.
DatePattern
.*;
...
@@ -278,9 +279,10 @@ public class DingMessageController {
...
@@ -278,9 +279,10 @@ public class DingMessageController {
leaveRecordEntity
.
setProcessStatus
(
2
);
leaveRecordEntity
.
setProcessStatus
(
2
);
}
}
if
(
result
.
getResult
().
compareToIgnoreCase
(
"AGREE"
)
==
0
){
if
(
result
.
getResult
().
compareToIgnoreCase
(
"AGREE"
)
==
0
){
if
(
result
.
getTasks
().
size
()
>
1
){
if
(
result
.
getTasks
().
size
()
>
1
){
if
(
result
.
getTasks
().
get
(
1
).
getStatus
().
compareToIgnoreCase
(
"CANCELED"
)
=
=
0
){
if
(
result
.
getTasks
().
get
(
1
).
getStatus
().
compareToIgnoreCase
(
"CANCELED"
)
!
=
0
){
leaveRecordEntity
.
setAuditResult
(
4
);
//撤销审批完成
leaveRecordEntity
.
setAuditResult
(
4
);
//撤销审批完成
}
else
{
}
else
{
leaveRecordEntity
.
setAuditResult
(
1
);
leaveRecordEntity
.
setAuditResult
(
1
);
...
@@ -288,7 +290,8 @@ public class DingMessageController {
...
@@ -288,7 +290,8 @@ public class DingMessageController {
}
}
}
else
if
(
result
.
equals
(
""
)){
//撤销假期审批中result会为空 撤销审批通过后result为AGREE
}
else
if
(
result
.
equals
(
""
)){
//撤销假期审批中result会为空 撤销审批通过后result为AGREE
if
(
result
.
getTasks
().
size
()
>
1
){
if
(
result
.
getTasks
().
size
()
>
1
){
if
(
result
.
getTasks
().
get
(
1
).
getStatus
().
compareToIgnoreCase
(
"CANCELED"
)
==
0
){
log
.
info
(
"status"
+
result
.
getTasks
().
get
(
1
).
getStatus
());
if
(
result
.
getTasks
().
get
(
1
).
getStatus
().
compareToIgnoreCase
(
"CANCELED"
)
!=
0
){
leaveRecordEntity
.
setAuditResult
(
3
);
//撤销审批中
leaveRecordEntity
.
setAuditResult
(
3
);
//撤销审批中
}
}
}
}
...
@@ -301,7 +304,7 @@ public class DingMessageController {
...
@@ -301,7 +304,7 @@ public class DingMessageController {
log
.
info
(
"钉钉返回的result:"
+
result
.
getResult
()+
"---auditresult:"
+
leaveRecordEntity
.
getAuditResult
());
log
.
info
(
"钉钉返回的result:"
+
result
.
getResult
()+
"---auditresult:"
+
leaveRecordEntity
.
getAuditResult
());
leaveRecordEntity
.
setAuditDesc
(
result
.
getOperationRecords
().
get
(
0
).
getRemark
());
leaveRecordEntity
.
setAuditDesc
(
result
.
getOperationRecords
().
get
(
0
).
getRemark
());
leaveRecordEntity
.
setReason
(
result
.
getOperationRecords
().
get
(
0
).
getRemark
());
//更新请假记录表
//更新请假记录表
AttendanceLeaveRecordEntity
recordEntity
=
attendanceLeaveRecordService
.
selectOne
(
new
AttendanceLeaveRecordQuery
().
remark
(
processInstanceId
));
AttendanceLeaveRecordEntity
recordEntity
=
attendanceLeaveRecordService
.
selectOne
(
new
AttendanceLeaveRecordQuery
().
remark
(
processInstanceId
));
if
(
ObjectUtils
.
isEmpty
(
recordEntity
)){
if
(
ObjectUtils
.
isEmpty
(
recordEntity
)){
...
@@ -335,14 +338,22 @@ public class DingMessageController {
...
@@ -335,14 +338,22 @@ public class DingMessageController {
if
(
leaveRecordsResponseBodyResultRest
.
getCode
()
==
Rest
.
SUCCESS
){
if
(
leaveRecordsResponseBodyResultRest
.
getCode
()
==
Rest
.
SUCCESS
){
OapiAttendanceVacationQuotaListResponse
.
OapiLeaveQuotaUserListVo
result1
=
leaveRecordsResponseBodyResultRest
.
getData
();
OapiAttendanceVacationQuotaListResponse
.
OapiLeaveQuotaUserListVo
result1
=
leaveRecordsResponseBodyResultRest
.
getData
();
double
leaveBlance
=
0
;
double
leaveBlance
=
0
;
//如果钉钉有假期余额就写入钉钉返回的余额 否则用数据库表数据减去当前请假的天数
// //如果钉钉有假期余额就写入钉钉返回的余额 否则用数据库表数据减去当前请假的天数
if
(
result1
.
getLeaveQuotas
()
!=
null
&&
result1
.
getLeaveQuotas
().
size
()
>
0
){
// if(result1.getLeaveQuotas() != null && result1.getLeaveQuotas().size() > 0){
if
(
leaveRecordEntity
.
getAuditResult
()
==
4
)
{
//撤销休假 要把已经扣除的假期加回来
// if(leaveRecordEntity.getAuditResult() == 4) { //撤销休假 要把已经扣除的假期加回来
leaveBlance
=
(
result1
.
getLeaveQuotas
().
get
(
0
).
getQuotaNumPerDay
()
+
result1
.
getLeaveQuotas
().
get
(
0
).
getUsedNumPerDay
())/
100
;
// if(!ObjectUtils.isEmpty(balanceEntity) && balanceEntity.getCompensatedLeaveDays() != null){
}
else
{
// leaveBlance = balanceEntity.getCompensatedLeaveDays().floatValue() + result1.getLeaveQuotas().get(0).getUsedNumPerDay()/100;
leaveBlance
=
(
result1
.
getLeaveQuotas
().
get
(
0
).
getQuotaNumPerDay
()
-
result1
.
getLeaveQuotas
().
get
(
0
).
getUsedNumPerDay
())/
100
;
// }else {
}
// leaveBlance = result1.getLeaveQuotas().get(0).getUsedNumPerDay()/100; //秒转换为天
}
// }
// }else {
// if(!ObjectUtils.isEmpty(balanceEntity) && balanceEntity.getCompensatedLeaveDays() != null){
// leaveBlance = balanceEntity.getCompensatedLeaveDays().floatValue() - result1.getLeaveQuotas().get(0).getUsedNumPerDay()/100;
// }else {
// leaveBlance = - result1.getLeaveQuotas().get(0).getUsedNumPerDay()/100; //秒转换为天
// }
// }
// }
switch
(
leave_name
)
{
switch
(
leave_name
)
{
case
"调休"
:
case
"调休"
:
...
...
attendance-performance-manager/src/main/java/com/mortals/xhx/module/attendance/service/impl/AttendanceVacationBalanceServiceImpl.java
View file @
1a06d676
package
com.mortals.xhx.module.attendance.service.impl
;
package
com.mortals.xhx.module.attendance.service.impl
;
import
com.mortals.xhx.module.attendance.model.AttendanceVacationBalanceQuery
;
import
com.mortals.xhx.module.staff.model.StaffEntity
;
import
com.mortals.xhx.module.staff.service.StaffService
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
org.springframework.stereotype.Service
;
import
com.mortals.framework.service.impl.AbstractCRUDServiceImpl
;
import
com.mortals.framework.service.impl.AbstractCRUDServiceImpl
;
import
com.mortals.framework.exception.AppException
;
import
com.mortals.framework.exception.AppException
;
...
@@ -15,5 +19,42 @@ import com.mortals.xhx.module.attendance.service.AttendanceVacationBalanceServic
...
@@ -15,5 +19,42 @@ import com.mortals.xhx.module.attendance.service.AttendanceVacationBalanceServic
*/
*/
@Service
(
"attendanceVacationBalanceService"
)
@Service
(
"attendanceVacationBalanceService"
)
public
class
AttendanceVacationBalanceServiceImpl
extends
AbstractCRUDServiceImpl
<
AttendanceVacationBalanceDao
,
AttendanceVacationBalanceEntity
,
Long
>
implements
AttendanceVacationBalanceService
{
public
class
AttendanceVacationBalanceServiceImpl
extends
AbstractCRUDServiceImpl
<
AttendanceVacationBalanceDao
,
AttendanceVacationBalanceEntity
,
Long
>
implements
AttendanceVacationBalanceService
{
@Autowired
private
StaffService
staffService
;
@Override
protected
void
saveBefore
(
AttendanceVacationBalanceEntity
entity
,
Context
context
)
throws
AppException
{
super
.
saveBefore
(
entity
,
context
);
if
(
entity
.
getStaffId
()==
null
){
throw
new
AppException
(
"员工ID不能为空"
);
}
StaffEntity
staff
=
staffService
.
get
(
entity
.
getStaffId
());
if
(
staff
==
null
){
throw
new
AppException
(
"员工ID不正确"
);
}
entity
.
setStaffName
(
staff
.
getName
());
entity
.
setDeptId
(
staff
.
getDeptId
());
entity
.
setDeptName
(
staff
.
getDeptName
());
}
@Override
public
AttendanceVacationBalanceEntity
save
(
AttendanceVacationBalanceEntity
entity
,
Context
context
)
throws
AppException
{
this
.
saveBefore
(
entity
,
context
);
AttendanceVacationBalanceEntity
temp
=
this
.
selectOne
(
new
AttendanceVacationBalanceQuery
().
staffId
(
entity
.
getStaffId
()));
int
iRet
=
0
;
if
(
temp
!=
null
){
entity
.
setId
(
temp
.
getId
());
iRet
=
this
.
dao
.
update
(
entity
);
}
else
{
iRet
=
this
.
dao
.
insert
(
entity
);
}
if
(
iRet
==
0
)
{
throw
new
AppException
(-
1001
,
"写入数据库失败!"
);
}
else
{
this
.
saveAfter
(
entity
,
context
);
return
entity
;
}
}
}
}
\ No newline at end of file
attendance-performance-manager/src/main/java/com/mortals/xhx/module/dingding/personal/service/impl/DingPersonServiceImpl.java
View file @
1a06d676
...
@@ -141,9 +141,9 @@ public class DingPersonServiceImpl extends AbstractDingTalkService implements ID
...
@@ -141,9 +141,9 @@ public class DingPersonServiceImpl extends AbstractDingTalkService implements ID
*/
*/
public
com
.
aliyun
.
teaopenapi
.
models
.
Config
setConfig
()
{
public
com
.
aliyun
.
teaopenapi
.
models
.
Config
setConfig
()
{
com
.
aliyun
.
teaopenapi
.
models
.
Config
config
=
new
com
.
aliyun
.
teaopenapi
.
models
.
Config
();
com
.
aliyun
.
teaopenapi
.
models
.
Config
config
=
new
com
.
aliyun
.
teaopenapi
.
models
.
Config
();
config
.
protocol
=
"http"
;
//
config.protocol = "http";
config
.
regionId
=
"central"
;
//
config.regionId = "central";
config
.
endpoint
=
oaUrl
;
//
config.endpoint = oaUrl;
return
config
;
return
config
;
}
}
...
@@ -153,9 +153,9 @@ public class DingPersonServiceImpl extends AbstractDingTalkService implements ID
...
@@ -153,9 +153,9 @@ public class DingPersonServiceImpl extends AbstractDingTalkService implements ID
com
.
aliyun
.
dingtalkworkflow_1_0
.
Client
client
=
new
com
.
aliyun
.
dingtalkworkflow_1_0
.
Client
(
setConfig
());
com
.
aliyun
.
dingtalkworkflow_1_0
.
Client
client
=
new
com
.
aliyun
.
dingtalkworkflow_1_0
.
Client
(
setConfig
());
com
.
aliyun
.
dingtalkworkflow_1_0
.
models
.
GetProcessInstanceHeaders
getProcessInstanceHeaders
=
new
com
.
aliyun
.
dingtalkworkflow_1_0
.
models
.
GetProcessInstanceHeaders
();
com
.
aliyun
.
dingtalkworkflow_1_0
.
models
.
GetProcessInstanceHeaders
getProcessInstanceHeaders
=
new
com
.
aliyun
.
dingtalkworkflow_1_0
.
models
.
GetProcessInstanceHeaders
();
getProcessInstanceHeaders
.
xAcsDingtalkAccessToken
=
getToken
();
getProcessInstanceHeaders
.
xAcsDingtalkAccessToken
=
getToken
();
HashMap
<
String
,
String
>
map
=
new
HashMap
<>();
//
HashMap<String, String> map = new HashMap<>();
getProcessInstanceHeaders
.
setCommonHeaders
(
map
);
//
getProcessInstanceHeaders.setCommonHeaders(map);
getProcessInstanceHeaders
.
getCommonHeaders
().
put
(
"host"
,
"172.15.28.113:8919"
);
//
getProcessInstanceHeaders.getCommonHeaders().put("host", "172.15.28.113:8919");
com
.
aliyun
.
dingtalkworkflow_1_0
.
models
.
GetProcessInstanceRequest
getProcessInstanceRequest
=
new
com
.
aliyun
.
dingtalkworkflow_1_0
.
models
.
GetProcessInstanceRequest
()
com
.
aliyun
.
dingtalkworkflow_1_0
.
models
.
GetProcessInstanceRequest
getProcessInstanceRequest
=
new
com
.
aliyun
.
dingtalkworkflow_1_0
.
models
.
GetProcessInstanceRequest
()
.
setProcessInstanceId
(
processInstanceId
);
.
setProcessInstanceId
(
processInstanceId
);
...
...
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