Commit 1a06d676 authored by 赵啸非's avatar 赵啸非

Merge remote-tracking branch 'origin/master'

parents ac11ff46 202450cf
...@@ -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 = '智慧政务绩效管理系统'
<!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 -->
......
...@@ -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;
......
...@@ -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">
&nbsp;&nbsp;&nbsp;智慧政务绩效管理系统 &nbsp;&nbsp;&nbsp;{{ sysName ? sysName : "智慧政务绩效管理系统" }}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</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() {},
......
<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/images/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/images/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: { // 查询统计数据
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: 16px; padding: 50px 20px 0 20px;
.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: 18px; width: 40px;
margin-top: 10px; height: 40px;
} }
.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>
...@@ -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>
......
<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>
<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>
...@@ -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>
......
...@@ -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: #409EFF; border-color: #409eff;
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: #409EFF; color: #409eff;
} }
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>
...@@ -37,7 +37,7 @@ ...@@ -37,7 +37,7 @@
: item.subAddType == 2 : item.subAddType == 2
? "扣分方式:" ? "扣分方式:"
: "方式:" : "方式:"
}}{{ util_formatters("subMethod", item.subMethod) }}</span }}{{ util_formatter("subMethod", item.subMethod) }}</span
> >
</div> </div>
<div class="user-info"> <div class="user-info">
......
...@@ -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 "调休":
......
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
...@@ -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);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment