Commit db41784e authored by “yiyousong”'s avatar “yiyousong”
parents c475638e 8667e872
......@@ -31,7 +31,8 @@ export default {
</script>
<style lang="less" scoped>
#app {
#app {
height:100vh;
.loading {
display: flex;
align-items: center;
......
......@@ -11,8 +11,8 @@ html * {
}
html,
body {
height: 100%;
min-height: 100%;
/* height: 100%; */
/* min-height: 100%; */
font-family: "Microsoft Yahei", "Helvetica Neue", Helvetica, STHeiTi, Arial, sans-serif;
}
body {
......
......@@ -13,13 +13,13 @@ html * {
html,
body {
height: 100%;
min-height: 100%;
// height: 100%;
// min-height: 100%;
font-family: "Microsoft Yahei", "Helvetica Neue", Helvetica, STHeiTi, Arial,
sans-serif;
}
body {
overflow-y: scroll;
// overflow-y: scroll;
}
body,
div,
......
......@@ -8,12 +8,26 @@ export default {
methods: {
// 渲染前置处理
beforeRender(data) {
if (data.entity.attachmentPath) {
data.entity.attachmentPathList = [
{
url: data.entity.attachmentPath,
name: data.entity.attachmentPath,
},
];
}
console.log(data);
return data;
},
// 渲染后置处理
afterRender(data) {},
// 提交表单的前置处理
beforeSubmit(data) {
data.attachmentPathList && data.attachmentPathList.length > 0
? (data.attachmentPath = data.attachmentPathList[0].url)
: (data.attachmentPath = "");
console.log(data);
return data;
},
// 提交表单的后置处理, 会阻断默认的回退行为
......@@ -33,6 +47,7 @@ export default {
// 默认拉取数据
getData() {
this.loading = true;
this.$get(this.urls.currUrl || this.pageInfo.currUrl, this.query)
.then(({ data }) => {
const res = this.beforeRender(data);
......@@ -43,6 +58,7 @@ export default {
//
res.entity = this.util_toDateStr(res.entity, this.toDate);
this.form = Object.assign({}, this.form, res.entity);
this.dict = Object.assign({}, this.dict, res.dict);
this.afterRender(res);
})
......
......@@ -205,10 +205,26 @@ export default {
<el-tag type={"success"} size="mini">
{content}
</el-tag>
) : row.checkStatus == 1 || row.processStatus == 1 ? (
row.subAddType == 1 && column.label.includes("分值") ? (
<el-link type={"info"}>(+{content})</el-link>
) : row.subAddType == 2 && column.label.includes("分值") ? (
<el-link type={"info"}>({-content})</el-link>
) : (
<p>{content}</p>
)
) : row.checkStatus == 2 || row.processStatus == 2 ? (
row.subAddType == 1 && column.label.includes("分值") ? (
<el-link>+{content}</el-link>
) : row.subAddType == 2 && column.label.includes("分值") ? (
<el-link>{-content}</el-link>
) : (
<p>{content}</p>
)
) : row.subAddType == 1 && column.label.includes("分值") ? (
<p>{content}</p>
<el-link>+{content}</el-link>
) : row.subAddType == 2 && column.label.includes("分值") ? (
<p>{-content}</p>
<el-link>{-content}</el-link>
) : (
<p>{content}</p>
)
......@@ -330,7 +346,7 @@ export default {
},
// 格式化单元格数据
formatterDate(row, column) {
console.log("date:",row,column)
// console.log("date:",row,column)
return formatterDate(row, column);
},
// 格式化单元格数据 只要年月日
......@@ -457,13 +473,14 @@ export default {
const regular = new RegExp(`.*\.${suffix}`);
if (regular.test(val)) {
return (
<el-image
src={val.indexOf("http") == -1 ? baseUrl + val : val}
preview-src-list={
val.indexOf("http") == -1 ? [baseUrl + val] : [val]
}
style="width: 100px"
></el-image>
// <el-image
// src={val.indexOf("http") == -1 ? baseUrl + val : val}
// preview-src-list={
// val.indexOf("http") == -1 ? [baseUrl + val] : [val]
// }
// style="width: 100px"
// ></el-image>
<filepReview src={val}/>
);
} else {
return <el-link type="primary">{val}</el-link>;
......@@ -565,7 +582,7 @@ export default {
},
// 查看
toView(row, query) {
console.log(this.pageInfo.view);
// console.log(this.pageInfo.view);
this.$router.push({
path: this.pageInfo.view,
query: Object.assign({}, { id: row.id }, query),
......
......@@ -15,6 +15,7 @@ import FileUpload from '@/components/FileUpload';
import Editor from '@/components/Editor';
import Map from '@/components/Map';
import MapDetail from '@/components/MapDetail';
import filepReview from '@/components/filepReview';
const Prototype = function() {};
Prototype.install = (Vue, options) => {
......@@ -34,6 +35,7 @@ Prototype.install = (Vue, options) => {
Vue.component('Editor', Editor) // 富文本
Vue.component('Map', Map) // 地图
Vue.component('MapDetail', MapDetail) // 地图
Vue.component('filepReview', filepReview) // 图片文件预览
}
export default Prototype;
......@@ -13,7 +13,6 @@
:empty-text="emptytxt ? emptytxt : emptyText"
border
style="width: 100%"
height="530"
>
<el-table-column
v-for="column in columns"
......
......@@ -8,7 +8,7 @@
:row-class-name="tableRowClassName"
:default-expand-all="expand"
:tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
height="520"
height="630px"
>
<el-table-column
......
......@@ -226,7 +226,6 @@ export default {
},
maxLength: {
type: Number,
default: 256,
},
},
methods: {
......
......@@ -226,7 +226,7 @@ export default {
}
}
.controllBar {
background-color: rgba(170, 170, 170, 0.4);
background-color: rgba(255, 255, 255, 0.2);
width: 120px;
height: 44px;
line-height: 44px;
......
......@@ -344,6 +344,7 @@ export default {
let newData = { page: 1 };
Object.keys(data).forEach((item) => {
let val = data[item];
console.log(item,this.search)
this.search.forEach((obj) => {
if (
obj.name === item &&
......@@ -363,6 +364,7 @@ export default {
});
newData[item] = this.decodeVal(val);
});
return newData;
},
decodeVal(val) {
......
<template>
<div class="img-flex">
<el-image
:src="urlVal(item)"
:preview-src-list="[urlVal(item)]" alt="" v-for="item in fileList" :key="item"/>
</div>
</template>
<script>
const baseUrl = process.env.VUE_APP_API_BASE_URL + "/";
export default {
props:['src'],
data() {
return {}
},
created() {
console.log(this.src)
},
computed: {
fileList:function(v){
return this.src?this.src.split(","):[]
}
},
methods: {
urlVal(val){
console.log(val,"2222")
return val.indexOf("http") == -1 ? baseUrl + val : val
}
},
}
</script>
<style lang="less" scoped>
.img-flex{
overflow: hidden;
display: inline-block;
vertical-align: middle;
.el-image{
width: 50px;
float: left;
border:1px solid #ddd;
margin: 2px;
}
}
</style>
\ No newline at end of file
<template>
<div :style="menuPageCss" class="pages page-layout">
<LayoutHeader
v-if="menuPage !== 'left'"
@changePath="changePath"
></LayoutHeader>
<LayoutHeaderLeft
@toggle="toggle"
:isOpen="isOpen"
v-if="menuPage === 'left'"
/>
<div style="padding:15px">
<LayoutHeader v-if="menuPage !== 'left'" @changePath="changePath"></LayoutHeader>
<LayoutHeaderLeft @toggle="toggle" :isOpen="isOpen" v-if="menuPage === 'left'" />
<div class="layout">
<router-view :class="{ active: !isOpen }" />
</div>
</div>
......@@ -57,6 +50,12 @@ export default {
</script>
<style lang="less">
.layout {
padding: 15px 15px 0 15px;
box-sizing: border-box;
}
.page {
min-height: calc(100vh - 100px);
width: 100%;
......@@ -65,12 +64,32 @@ export default {
// var(--padding-top) 5px 5px 5px;
// margin-left: 60px;
padding: 10px;
&.active {
margin-left: var(--margin-left);
}
}
.page-layout {
background: #eee;
height: 100vh;
overflow: auto;
}
/* 侧边滚动条 */
.page-layout::-webkit-scrollbar {
width: 3px;
}
/* 滚动条上的滚动滑块 */
.page-layout::-webkit-scrollbar-thumb {
background: #CCCCCC;
border-radius: 4px;
}
/* 滚动条轨道 */
.page-layout::-webkit-scrollbar-track {
background: #EEEEEE;
border-radius: 4px;
}
</style>
......@@ -239,7 +239,6 @@
return
}
if(arr.length > 1 && index>0){
console.log(11111)
// 上一次比较
let lastoffTime = transFormMinut(arr[index-1].offWorkDate) +
transFormMinut(arr[index - 1 ].offWorkDateAfter)
......
......@@ -39,15 +39,16 @@
label="开始时间"
prop="startTime"
v-model="form.startTime"
type="date"
type="datetime"
/>
<Field
disabled
label="结束时间"
prop="endTime"
v-model="form.endTime"
type="date"
type="datetime"
disabled
/>
<Field
disabled
label="时长,单位秒"
......@@ -66,8 +67,8 @@
<Field
disabled
label="审批负责人"
prop="approver"
v-model="form.approver"
prop="approverId"
v-model="form.approverId"
placeholder="请输入审批负责人"
/>
<Field
......@@ -147,6 +148,7 @@ export default {
open: false,
// urls: { saveUrl: "/check/attend/record/examine" },
toString: ["leaveType", "auditResult", "processStatus"],
toDate: ["startTime", "endTime"],
// 表单校验
rules: {},
};
......@@ -157,8 +159,11 @@ export default {
edit(row) {
this.reset();
this.query = { id: row.id };
this.urls.currUrl = "attendance/leave/record/edit";
this.getData();
// this.urls.currUrl = "attendance/leave/record/edit";
// this.getData();
this.$post("attendance/leave/record/edit", { id: row.id }).then((res) => {
console.log(res);
});
this.pageInfo.type = "edit";
this.title = "修改请假记录信息";
},
......@@ -176,8 +181,8 @@ export default {
this.query = { id: row.id };
this.urls.currUrl = "attendance/leave/record/view";
this.getData();
this.pageInfo.type = "view";
this.title = "请假记录信息详细";
this.pageInfo.type = "check";
this.title = "审核请假记录";
},
/**取消按钮 */
cancel() {
......
......@@ -16,6 +16,7 @@
v-model="form.leavePerson"
placeholder="请输入请假人"
:maxLength="10"
:disabled="pageInfo.type == 'view'"
/>
<Field
label="所属部门"
......@@ -24,6 +25,7 @@
type="select"
placeholder="请选择所属部门"
:enumData="dict.deptId"
:disabled="pageInfo.type == 'view'"
/>
<!-- <Field label="所属部门" prop="deptName" v-model="form.deptName" type="textarea" placeholder="请输入所属部门"/> -->
<Field
......@@ -32,6 +34,7 @@
v-model="form.phoneNumber"
placeholder="请输入电话号码"
:maxLength="11"
:disabled="pageInfo.type == 'view'"
/>
<Field
label="请假类型"
......@@ -40,13 +43,16 @@
type="select"
:enumData="dict.leaveType"
placeholder="请选择请假类型"
:disabled="pageInfo.type == 'view'"
/>
<Field
label="开始时间"
prop="startTime"
v-model="form.startTime"
type="datetime"
@change="changedate"
:disabled="pageInfo.type == 'view'"
/>
<Field
label="结束时间"
......@@ -54,6 +60,7 @@
v-model="form.endTime"
type="datetime"
@change="changedate"
:disabled="pageInfo.type == 'view'"
/>
<Field
......@@ -70,6 +77,23 @@
v-model="form.reason"
type="textarea"
placeholder="请输入请假事由"
:disabled="pageInfo.type == 'view'"
/>
<Field
label="审核结果"
prop="auditResult"
v-model="form.auditResult"
type="radio"
:enumData="dict.auditResult"
placeholder="请选择审核结果"
:disabled="pageInfo.type == 'view'"
/>
<Field
label="审核说明"
prop="auditDesc"
v-model="form.auditDesc"
placeholder="请输入审核说明"
:disabled="pageInfo.type == 'view'"
/>
<Field
label="审批负责人"
......@@ -78,6 +102,7 @@
v-model="form.approverId"
placeholder="请选择审批负责人"
:enumData="dict.approverId"
:disabled="pageInfo.type == 'view'"
/>
<!-- <Field label="审批负责人" prop="approver" v-model="form.approver" placeholder="请输入审批负责人"/> -->
<!-- <Field label="附件" prop="attachment" v-model="form.attachment" type="textarea" placeholder="请输入附件"/> -->
......@@ -87,16 +112,29 @@
v-model="form.remark"
type="textarea"
placeholder="请输入备注"
:disabled="pageInfo.type == 'view'"
/>
<Field
label="申请时间"
prop="createTime"
v-model="form.createTime"
type="datetime"
disabled
/>
</el-row>
<el-form-item label="附件路径" prop="attachmentPath">
<el-form-item label="附件路径" prop="attachmentPathList">
<FileUpload
@input="uploadFn"
:value="attachmentPath"
:value="form.attachmentPathList"
:fileNumber="1"
:disabled="pageInfo.type == 'view'"
/>
</el-form-item>
<form-buttons @submit="submitForm" noCancelBtn />
<form-buttons
@submit="submitForm"
noCancelBtn
v-if="pageInfo.type !== 'view'"
/>
</el-form>
</div>
</el-drawer>
......@@ -123,8 +161,8 @@ export default {
// 是否显示弹出层
open: false,
direction: "rtl",
toString: ["leaveType", "deptId", "approverId"],
toDate: ["startTime", "endTime"],
toString: ["leaveType", "deptId", "approverId", "auditResult"],
toDate: ["startTime", "endTime", "createTime"],
// 表单校验
rules: {
leavePerson: [
......@@ -155,14 +193,17 @@ export default {
approverId: [
{ required: true, message: "请选择审批人", trigger: "change" },
],
attachmentPath: [
{ required: true, message: "请上传附件文件", trigger: "change" },
// attachmentPathList: [
// { required: true, message: "请上传附件文件", trigger: "change" },
// ],
auditResult: [
{ required: true, message: "请选择审核结果", trigger: "change" },
],
},
attachmentPath: "",
};
},
watch: {},
methods: {
// beforeSubmit() {
// if (this.form.endTime.valueOf() > this.form.startTime.valueOf()) {
......@@ -172,8 +213,8 @@ export default {
// }
// },
uploadFn(e) {
this.attachmentPath = e;
this.form.attachmentPath = this.attachmentPath[0].url;
this.form.attachmentPathList = e;
this.$forceUpdate(this.form.attachmentPathList);
},
/** 编辑 */
edit(row) {
......@@ -181,6 +222,23 @@ export default {
this.query = { id: row.id };
this.urls.currUrl = "attendance/leave/record/edit";
this.getData();
// this.$get("attendance/leave/record/edit", { id: row.id }).then((res) => {
// if (res.code == 1) {
// this.form = res.data.entity;
// this.attachmentPath = res.data
// ? [
// {
// url: res.data.entity.attachmentPath,
// name: res.data.entity.attachmentPath,
// },
// ]
// : "";
// this.dict = res.data.dict;
// this.open = true;
// } else {
// this.reset();
// }
// });
this.pageInfo.type = "edit";
this.title = "修改请假记录信息";
},
......@@ -198,6 +256,7 @@ export default {
this.query = { id: row.id };
this.urls.currUrl = "attendance/leave/record/view";
this.getData();
this.pageInfo.type = "view";
this.title = "请假记录信息详细";
},
......
<template>
<div class="page">
<LayoutTable :data="tableData" :config="tableConfig" notDel>
<el-button type="primary" @click="doExport" :disabled="isExport"
size="mini" slot="table-head-left2">导出
<el-button
type="primary"
@click="doExport"
:disabled="isExport"
size="mini"
slot="table-head-left2"
>导出
</el-button>
</LayoutTable>
<drawer-show ref="drawerform" @ok="getData"/>
<drawer-audit ref="draweraudit" @ok="getData"/>
<drawer-show ref="drawerform" @ok="getData" />
<drawer-audit ref="draweraudit" @ok="getData" />
</div>
</template>
<script>
/** 表单弹出框模式需引入 */
import drawerShow from "./drawershow";
import drawerAudit from "./draweraudit";
import table from "@/assets/mixins/table";
export default {
name: "AttendanceLeaveRecordList",
components: {
drawerShow
drawerShow,
drawerAudit,
},
mixins: [table],
created() {
},
created() {},
methods: {
/** 重写新增方法 */
toAdd(row) {
......@@ -39,18 +44,24 @@ export default {
},
audit(row) {
//todo 审核页面进行审核
this.$refs.draweraudit.view(row);
this.$refs.drawerform.edit(row);
// this.$refs.draweraudit.view(row);
},
doExport() {
this.isExport = true;
this.$download("/attendance/leave/record/exportExcel", {
"idList": this.selection,
'name': this.$route.query['name'],
}, {type: "excel"}).then(() => this.isExport = false).catch(error => {
this.isExport = false;
this.$message.error(error.message);
})
this.$download(
"/attendance/leave/record/exportExcel",
{
idList: this.selection,
name: this.$route.query["name"],
},
{ type: "excel" }
)
.then(() => (this.isExport = false))
.catch((error) => {
this.isExport = false;
this.$message.error(error.message);
});
},
},
data() {
......@@ -63,101 +74,123 @@ export default {
name: "leavePerson",
type: "text",
label: "请假人",
fuzzy: true
fuzzy: true,
},
{
name: "phoneNumber",
type: "text",
label: "电话号码",
fuzzy: true
fuzzy: true,
},
{
name: "deptId",
type: "select",
label: "全部部门",
fuzzy: false
fuzzy: false,
},
{
name: "leaveType",
type: "select",
label: "请假类型",
fuzzy: false
fuzzy: false,
},
{
name: "startTime",
type: "date",
label: "开始时间",
fuzzy: false
fuzzy: false,
},
{
name: "endTime",
type: "date",
label: "结束时间",
fuzzy: false
fuzzy: false,
},
],
columns: [
{type: "selection", width: 60},
{type: "index", label: "序号", width: 50},
{ type: "selection", width: 60 },
{ type: "index", label: "序号", width: 50 },
// {label: "请假人id", prop: "leavePersonId", formatter: this.formatter},
{label: "请假人", prop: "leavePerson"},
{ label: "请假人", prop: "leavePerson" },
// {label: "所属部门id", prop: "deptId", formatter: this.formatter},
{label: "所属部门", prop: "deptName"},
{ label: "所属部门", prop: "deptName" },
{label: "电话号码", prop: "phoneNumber"},
{ label: "电话号码", prop: "phoneNumber" },
{label: "请假类型", prop: "leaveType", formatter: this.formatterLeaveType},
{
label: "请假类型",
prop: "leaveType",
formatter: this.formatterLeaveType,
},
{label: "开始时间", prop: "startTime", formatter: this.formatterDate},
{
label: "开始时间",
prop: "startTime",
formatter: this.formatterDate,
},
{label: "结束时间", prop: "endTime", formatter: this.formatterDate},
{ label: "结束时间", prop: "endTime", formatter: this.formatterDate },
{label: "时长", prop: "duration", formatter: this.formatter},
{ label: "时长", prop: "duration", formatter: this.formatter },
// {label: "审批负责人Id", prop: "approverId", formatter: this.formatter},
/* {label: "处理状态", prop: "processStatus", formatter: this.formatter},*/
/* {label: "处理状态", prop: "processStatus", formatter: this.formatter},*/
{label: "状态", prop: "auditResult", formatter: this.formatter},
{label: "审批负责人", prop: "approver"},
{ label: "状态", prop: "auditResult", formatter: this.formatter },
{ label: "审批负责人", prop: "approver" },
{label: "创建用户", prop: "createUserId", formatter: this.formatter},
{
label: "创建用户",
prop: "createUserId",
formatter: this.formatter,
},
{label: "创建时间", prop: "createTime", formatter: this.formatterDate},
{
label: "创建时间",
prop: "createTime",
formatter: this.formatterDate,
},
{
label: "操作",
width: 240,
formatter: row => {
formatter: (row) => {
return (
<div>
<table-buttons noAdd row={row} onEdit={this.toEdit} onView={this.toView} onDel={this.toDel}/>
<span> </span>
{row.processStatus === 1 ? (
<el-button
size="mini"
type="text"
icon="el-icon-open"
onClick={() => {
this.audit(row);
}}
>
审核
</el-button>
) : (
""
)}
</div>
<div>
<table-buttons
noAdd
row={row}
onEdit={this.toEdit}
onView={this.toView}
onDel={this.toDel}
/>
<span> </span>
{row.processStatus === 1 ? (
<el-button
size="mini"
type="text"
icon="el-icon-open"
onClick={() => {
this.audit(row);
}}
>
审核
</el-button>
) : (
""
)}
</div>
);
}
}
]
}
},
},
],
},
};
}
},
};
</script>
<template>
<div class="page">
<div style="margin:10px 0">
<div>
<tab-pane
:thirdList="thirdList"
:activeName="activeName"
......@@ -189,7 +189,7 @@ import drawerShow from "./drawershow";
import table from "@/assets/mixins/table";
import TabPane from "@/components/tabPane.vue";
import { timestampToTime } from "@/assets/utils/dateFormat";
import {formatterDateOnly} from "@/assets/utils/table";
import { formatterDateOnly } from "@/assets/utils/table";
export default {
name: "AttendanceRecordList",
components: {
......@@ -401,12 +401,30 @@ export default {
/** 子表列元素 */
columnSet: [
{ prop: "shiftsName", label: "班次名称", width: 150 },
{ prop: "goWorkDate", label: "上班打卡时间", width: 100 , formatter: this.formatterDate},
{ prop: "goWorkResult", label: "上班打卡结果", width: 100, formatter: this.formatterString },
{ prop: "offWorkDate", label: "下班打卡时间", width: 100 , formatter: this.formatterDate},
{ prop: "offWorkResult", label: "下班打卡结果", width: 100 , formatter: this.formatterString}
{
prop: "goWorkDate",
label: "上班打卡时间",
width: 100,
formatter: this.formatterDate,
},
{
prop: "goWorkResult",
label: "上班打卡结果",
width: 100,
formatter: this.formatterString,
},
{
prop: "offWorkDate",
label: "下班打卡时间",
width: 100,
formatter: this.formatterDate,
},
{
prop: "offWorkResult",
label: "下班打卡结果",
width: 100,
formatter: this.formatterString,
},
],
config: {
search: [
......@@ -459,7 +477,6 @@ export default {
label: "考勤结束时间",
fuzzy: false,
},
],
columns: [
{ type: "selection", width: 60 },
......@@ -479,24 +496,35 @@ export default {
{ label: "部门", prop: "deptName", formatter: this.formatters },
{ label: "职位", prop: "positionName", formatter: this.formatters },
{ label: "班次", prop: "shiftsName", formatter: this.formatters },
{ label: "签到结果", prop: "signInResult", formatter: this.formatter },
{ label: "签退结果", prop: "signOutResult", formatter: this.formatter },
{
label: "签到结果",
prop: "signInResult",
formatter: this.formatter,
},
{
label: "签退结果",
prop: "signOutResult",
formatter: this.formatter,
},
{ label: "打卡结果", prop: "punchResult", formatter: this.formatter },
{ label: "考勤类型", prop: "attendType", formatter: this.formatter },
{label: "考勤打卡记录详细信息",
{
label: "考勤打卡记录详细信息",
width: 120,
prop: "subColumns",
formatter: (row) => {
let widthsize = this.columnSet.reduce((pre, cur) => {
return pre + Number(cur.width);
}, 50);
return (
<el-popover placement="right" width={widthsize} trigger="click">
{this.renderTable(row.attendanceRecordDetailList)}
<el-button type="text" slot="reference">详细</el-button>
</el-popover>
);
let widthsize = this.columnSet.reduce((pre, cur) => {
return pre + Number(cur.width);
}, 50);
return (
<el-popover placement="right" width={widthsize} trigger="click">
{this.renderTable(row.attendanceRecordDetailList)}
<el-button type="text" slot="reference">
详细
</el-button>
</el-popover>
);
},
},
// {
......
......@@ -69,10 +69,20 @@
{{ form.subAddType == 1 ? "加分人员:" : "扣分人员:" }}
{{ form.deductPerson ? form.deductPerson : "--" }}</el-col
>
<el-col :span="12">
巡查人员:
{{
form.createUserId
? util_formatter("createUserId", form.createUserId)
: "--"
}}
</el-col>
</el-row>
<el-row>
<el-col :span="12"
>图片凭证:
<el-image
<!-- <el-image
v-if="form.filePaths"
style="width: 100px; height: 100px"
:src="
......@@ -88,7 +98,8 @@
: [form.filePaths]
"
>
</el-image>
</el-image> -->
<filepReview v-if="form.filePaths" :src="form.filePaths"/>
<span v-else>--</span>
</el-col>
</el-row>
......
......@@ -83,9 +83,19 @@
{{ form.deductTime ? form.deductTime : "--" }}</el-col
>
<el-col :span="12">
巡查人员:
{{
form.createUserId
? util_formatter("createUserId", form.createUserId)
: "--"
}}
</el-col>
</el-row>
<el-row>
<el-col :span="12"
>图片凭证:
<el-image
<!-- <el-image
v-if="form.filePaths"
style="width: 100px; height: 100px"
:src="
......@@ -101,7 +111,8 @@
: [form.filePaths]
"
>
</el-image>
</el-image> -->
<filepReview v-if="form.filePaths" :src="form.filePaths"/>
<span v-else>--</span>
</el-col>
</el-row>
......
......@@ -60,9 +60,17 @@
>
</el-row>
<el-row>
<el-col :span="24">
<el-col :span="12">
巡查人员:
{{
form.createUserId
? util_formatter("createUserId", form.createUserId)
: "--"
}}
</el-col>
<el-col :span="12">
图片凭证:
<el-image
<!-- <el-image
v-if="form.filePaths"
style="width: 100px; height: 100px"
:src="
......@@ -78,7 +86,8 @@
: [form.filePaths]
"
>
</el-image>
</el-image> -->
<filepReview v-if="form.filePaths" :src="form.filePaths"/>
<span v-else>--</span>
</el-col>
</el-row>
......
......@@ -62,9 +62,17 @@
>
</el-row>
<el-row>
<el-col :span="24">
<el-col :span="12">
巡查人员:
{{
form.createUserId
? util_formatter("createUserId", form.createUserId)
: "--"
}}
</el-col>
<el-col :span="12">
图片凭证:
<el-image
<!-- <el-image
v-if="form.filePaths"
style="width: 100px; height: 100px"
:src="
......@@ -80,7 +88,8 @@
: [form.filePaths]
"
>
</el-image>
</el-image> -->
<filepReview v-if="form.filePaths" :src="form.filePaths"/>
<span v-else>--</span>
</el-col>
</el-row>
......
......@@ -58,9 +58,17 @@
</el-col>
</el-row>
<el-row>
<el-col :span="24"
<el-col :span="12">
巡查人员:
{{
form.createUserId
? util_formatter("createUserId", form.createUserId)
: "--"
}}
</el-col>
<el-col :span="12"
>图片凭证:
<el-image
<!-- <el-image
v-if="form.filePaths"
style="width: 100px; height: 100px"
:src="
......@@ -76,7 +84,8 @@
: [form.filePaths]
"
>
</el-image>
</el-image> -->
<filepReview v-if="form.filePaths" :src="form.filePaths"/>
<span v-else>--</span>
</el-col>
</el-row>
......
......@@ -63,9 +63,17 @@
</el-row>
<el-row>
<el-col :span="12">
巡查人员:
{{
form.createUserId
? util_formatter("createUserId", form.createUserId)
: "--"
}}
</el-col>
<el-col :span="12"
>图片凭证:
<el-image
<!-- <el-image
v-if="form.filePaths"
style="width: 100px; height: 100px"
:src="
......@@ -81,7 +89,8 @@
: [form.filePaths]
"
>
</el-image>
</el-image> -->
<filepReview v-if="form.filePaths" :src="form.filePaths"/>
<span v-else>--</span>
</el-col>
</el-row>
......@@ -414,6 +423,7 @@ export default {
kaoqinCateArr: [],
kaoqinArr: [],
urls: { saveUrl: "/check/review/record/examine" }, //重写核查地址
baseUrl: process.env.VUE_APP_API_BASE_URL + "/",
};
},
......
......@@ -4,6 +4,7 @@
<el-button class="backBtn" size="small" @click="$router.back()">返回上一级</el-button>
<el-tabs v-model="tabs">
<el-tab-pane label="设计问卷" name="1">
<!-- 步骤1 填写问卷名称 -->
<div style="width: 800px;margin: 100px auto;" v-show="step">
<el-form :model="titleForm" :rules="titleRules" ref="titleForm">
<el-form-item label="问卷名称:" prop="title" label-width="125px">
......@@ -20,20 +21,22 @@
</div>
</el-form>
</div>
<!-- 动态表单配置 -->
<div v-show="!step">
<fc-designer style="height: 79vh;" ref="designer">
<template slot="handle">
<ElButton style="margin-left: 10px;" icon="el-icon-upload" type="primary" size="small"
@click="issueBtn" round>问卷发布
@click="issueBtn" round>问卷配置发布
</ElButton>
<!-- <ElButton style="margin-left: 10px;" icon="el-icon-upload" type="primary" size="small"
@click="issueBtn" round>外部链接
</ElButton> -->
<ElButton icon="el-icon-view" type="success" size="small" @click="showDrawer" round>手机模拟预览
<ElButton style="margin-left: 10px;" icon="el-icon-position" type="warning" size="small"
@click="outsideBtn" round>外部链接发布
</ElButton>
<ElButton icon="el-icon-view" type="success" size="small" @click="showDrawer" round>手机预览
</ElButton>
</template>
</fc-designer>
</div>
<!-- 手机模拟预览 -->
<el-drawer :visible.sync="drawer" title="预览">
<div class="showPhone">
<div class="phone">
......@@ -44,13 +47,16 @@
</div>
</div>
</el-drawer>
<!-- 问卷发布弹出框 -->
<el-dialog title="问卷发布" :visible.sync="issueDialog" width="30%" top="25vh">
<el-form :model="issueForm" :rules="issueRules" ref="issueForm">
<el-form-item label="链接地址:" label-width="125px" prop="webUrl" v-if="weblink">
<el-input v-model="issueForm.webUrl" placeholder="请输入链接地址"></el-input>
</el-form-item>
<el-form-item label="问卷封面:" label-width="125px">
<div style="display: flex;align-items: center;">
<img style="width:80px; height: 80px; margin-right: 10px;cursor: pointer;"
v-for="(i, j) in coverImg" :key="j" :src="ImgUrl + '/' + i.url" alt=""
v-for="(i, j) in coverImg" :key="j" :src="showImgUrl + '/' + i.url" alt=""
:class="selImg == j ? 'selImg' : ''" @click="selImg = j">
<el-upload v-show="coverImg.length < 4" :action="ImgUrl + '/attendance/file/commonupload'"
accept="image/jpeg,image/png,image/jpg" list-type="picture-card" class="upload"
......@@ -75,8 +81,8 @@
</div>
</el-form>
</el-dialog>
<el-dialog title="人员选择" :visible.sync="treeDialog">
<!-- 人员选择弹出框 -->
<el-dialog title="人员选择" :visible.sync="treeDialog" width="40%">
<div class="treeDialog">
<el-tree class="treeCss" :data="treeData" node-key="id" :props="defaultProps"
@node-click="handleNodeClick"></el-tree>
......@@ -158,6 +164,10 @@ export default {
issueRules: {
time: [
{ required: true, message: '请输入选择反馈期限', trigger: 'blur' },
],
webUrl: [
{ required: true, message: '请输入链接地址', trigger: 'blur' },
{ pattern: /^https?:\/\/((.)+(\.)?)*(:\d+)?(\/((\.)?(\?)?=?&?.(\?)?)*)*$/i, message: '请输入正确的链接 例:https://www.baidu.com', trigger: 'change' }
]
},
treeData: [],
......@@ -175,7 +185,25 @@ export default {
editStyle: false,
loadingstate: false,
ImgUrl: process.env.VUE_APP_API_BASE_URL,
coverImg: []
showImgUrl:'',
coverImg: [],
weblink: 0,
webUrl: '',
}
},
watch: {
issueDialog(val) { //监听关闭外联状态
if (!val) {
this.weblink = 0
}
}
},
created(){
if(process.env.NODE_ENV == "development"){
this.showImgUrl= process.env.VUE_APP_API_BASE_URL
}else{
this.showImgUrl=''
}
},
mounted() {
......@@ -199,6 +227,10 @@ export default {
this.getFile()
},
methods: {
outsideBtn() {
this.weblink = 1
this.issueDialog = 1
},
handleUploadSuccess(res) {
console.log(res)
this.coverImg.push(res)
......@@ -250,7 +282,6 @@ export default {
console.log(file)
}
},
//获取问卷封面
getFile() {
this.$post('/feedback/file/list', { page: 1, size: 3 }).then(res => {
......@@ -357,12 +388,12 @@ export default {
return JSON.stringify(FcDesignerOptions)
},
issueFormBtn(formName) {
if (this.checkedUser.length < 1) {
this.$message.warning('请选择人员后发布问卷')
return
}
this.$refs[formName].validate((valid) => {
if (valid) {
if (this.checkedUser.length < 1) {
this.$message.warning('请选择人员后发布问卷')
return
}
console.log(this.issueForm)
this.Frule.forEach(i => {
i.remark = i.field
......@@ -381,7 +412,8 @@ export default {
})
let sub = {
weblink: this.weblink,
webUrl: this.issueForm.webUrl,
staffList: this.checkedUser,
id: this.feedbackId,
...this.titleForm,
......
......@@ -15,9 +15,8 @@
</div>
<div style="margin: 10px 0;">
<el-tag
:type="feedbackData.processStatus ? feedbackData.processStatus = 1 ? 'success' : 'info' : 'danger'">
{{ feedbackData.processStatus ? feedbackData.processStatus
== 1 ? '进行中' : '已结束' : '未开始' }}</el-tag>
:type="feedbackData.processStatus ? feedbackData.processStatus == 1 ? 'success' : 'info' : 'danger'">
{{ feedbackData.processStatus ? feedbackData.processStatus == 1 ? '进行中' : '已结束' : '未开始' }}</el-tag>
反馈时间:{{ feedbackData.timeStart }} ~ {{ feedbackData.timeEnd }}
</div>
......
<template>
<!-- 弹出框表单 -->
<el-drawer
:title="title"
:visible.sync="open"
:direction="direction"
size="50%">
<el-form ref="form" :model="form" :rules="rules" label-width="120px" style="padding:20px">
<el-row>
<Field v-if="from == 'job'" label="分组" prop="groupId" v-model="form.groupId"
:enumData="dict.group" type="select" placeholder="请选择分组"/>
<!-- 弹出框表单 -->
<el-drawer
:title="title"
:visible.sync="open"
:direction="direction"
size="50%"
>
<el-form
ref="form"
:model="form"
:rules="rules"
label-width="120px"
style="padding:20px"
>
<el-row>
<Field
v-if="from == 'job'"
label="分组"
prop="groupId"
v-model="form.groupId"
:enumData="dict.groupId"
type="select"
placeholder="请选择分组"
/>
<Field label="分组名称" prop="groupName" v-model="form.groupName" placeholder="请输入分组名称" :maxLength="10" v-if="from == 'group'"/>
<Field
label="分组名称"
prop="groupName"
v-model="form.groupName"
placeholder="请输入分组名称"
:maxLength="10"
v-if="from == 'group'"
/>
<Field label="职位编码" prop="jobCode" :maxLength="10" v-model="form.jobCode" placeholder="请输入职位编码" v-if="from == 'job'"/>
<Field label="职位名称" prop="jobName" :maxLength="10" v-model="form.jobName" placeholder="请输入职位名称" v-if="from == 'job'" />
<Field
label="职位编码"
prop="jobCode"
:maxLength="10"
v-model="form.jobCode"
placeholder="请输入职位编码"
v-if="from == 'job'"
/>
<Field
label="职位名称"
prop="jobName"
:maxLength="10"
v-model="form.jobName"
placeholder="请输入职位名称"
v-if="from == 'job'"
/>
<Field label="类型" disabled prop="type" v-model="form.type" type="select" :enumData="dict.type" placeholder="请选择类型"/>
<Field label="备注" prop="remark" :maxLength="50" v-model="form.remark" type="textarea" placeholder="请输入备注"/>
</el-row>
<form-buttons @submit='submitForm' noCancelBtn />
</el-form>
</el-drawer>
<Field
label="类型"
disabled
prop="type"
v-model="form.type"
type="select"
:enumData="dict.type"
placeholder="请选择类型"
/>
<Field
label="备注"
prop="remark"
:maxLength="50"
v-model="form.remark"
type="textarea"
placeholder="请输入备注"
/>
</el-row>
<form-buttons @submit="submitForm" noCancelBtn />
</el-form>
</el-drawer>
</template>
<script>
import form from "@/assets/mixins/formdialog";
export default {
name: "JobDetail",
mixins: [form],
components: {
},
created() {
this.changePath("job")
},
data() {
return {
// 遮罩层
loading: true,
// 弹出层标题
title: "职位信息",
// 是否显示弹出层
open: false,
direction:"rtl",
toString:[
],
toDate:[
],
// 表单校验
rules: {
},
from:''
};
},
methods: {
/** 编辑 */
edit(from,row) {
this.reset()
this.query = { id: row.id };
this.urls.currUrl ="job/edit";
this.getData();
this.pageInfo.type="edit"
this.from = from
import form from "@/assets/mixins/formdialog";
export default {
name: "JobDetail",
mixins: [form],
components: {},
created() {
this.changePath("job");
},
data() {
return {
// 遮罩层
loading: true,
// 弹出层标题
title: "职位信息",
// 是否显示弹出层
open: false,
direction: "rtl",
toString: [],
toDate: [],
// 表单校验
rules: {
groupId: [{ required: true, message: "请选择分组", trigger: "change" }],
},
from: "",
};
},
this.title = from === 'group'?"修改分组信息":'修改职位信息';
},
/** 新增 */
add(row) {
console.log(row,'添加')
this.from = row
this.title = row === 'group'?"新增分组信息":'新增职位信息';
this.reset()
this.urls.currUrl = "job/add";
this.getData();
this.pageInfo.type="add"
},
/** 查看*/
view(row) {
this.reset()
this.query = { id: row.id };
this.urls.currUrl ="job/view";
this.getData();
this.pageInfo.type="view"
this.title = "职位信息详细";
},
/**取消按钮 */
cancel() {
this.open = false;
},
/**获取数据后弹框 */
afterRender(data) {
methods: {
/** 编辑 */
edit(from, row) {
this.reset();
this.query = { id: row.id };
this.urls.currUrl = "job/edit";
this.getData();
this.pageInfo.type = "edit";
this.from = from;
// 固定新增类型
if(this.from == 'group'){
this.form.type = '1'
}else{
this.form.type = '2'
}
this.open = true;
},
afterSubmit(data) {
this.open = false;
this.$emit("ok");
},
this.title = from === "group" ? "修改分组信息" : "修改职位信息";
},
/** 新增 */
add(row) {
console.log(row, "添加");
this.from = row;
this.title = row === "group" ? "新增分组信息" : "新增职位信息";
this.reset();
this.urls.currUrl = "job/add";
this.getData();
this.pageInfo.type = "add";
},
/** 查看*/
view(row) {
this.reset();
this.query = { id: row.id };
this.urls.currUrl = "job/view";
this.getData();
this.pageInfo.type = "view";
this.title = "职位信息详细";
},
/**取消按钮 */
cancel() {
this.open = false;
},
/**获取数据后弹框 */
afterRender(data) {
// 固定新增类型
if (this.from == "group") {
this.form.type = "1";
} else {
this.form.type = "2";
}
this.open = true;
},
afterSubmit(data) {
this.open = false;
this.$emit("ok");
},
// 表单重置
reset() {
this.form = {
groupId : null,
groupName : "",
jobCode : "",
jobName : "",
remark : "",
};
this.resetForm("form");
},
resetForm(refName) {
if (this.$refs[refName]) {
this.$refs[refName].resetFields();
}
},
},
};
// 表单重置
reset() {
this.form = {
groupId: "",
groupName: "",
jobCode: "",
jobName: "",
remark: "",
};
this.resetForm("form");
},
resetForm(refName) {
if (this.$refs[refName]) {
this.$refs[refName].resetFields();
}
},
},
};
</script>
......@@ -70,13 +70,27 @@ export default {
color: "#000",
},
},
dataZoom: [
{
show: true,
realtime: true,
start: 0,
end: 100
},
{
type: 'inside',
realtime: true,
start: 0,
end: 100
}
],
tooltip: {},
xAxis: {
data: this.chartsData.map(i => {
// console.log(i)
if(this.title == "申诉次数部门排名TOP20") return i.deptName
if(this.title == "申诉次数个人排名TOP20") return i.staffName
if(this.title == "申诉次数规则排名TOP20") return i.ruleName
if (this.title == "申诉次数部门排名TOP20") return i.deptName
if (this.title == "申诉次数个人排名TOP20") return i.staffName
if (this.title == "申诉次数规则排名TOP20") return i.ruleName
// return i.ruleName || i.deptName || i.staffName
})
// this.title == "申诉次数部门排名TOP20"
......@@ -151,7 +165,7 @@ export default {
grid: {
left: "5%",
right: "4%",
bottom: "2%",
// bottom: "1%",
containLabel: true,
},
// color:[ "#61a0a8",],
......
......@@ -122,7 +122,7 @@
<el-col :span="22">
<el-form-item label="图片凭证:">
<div v-if="form.view == '查看'">
<el-image
<!-- <el-image
v-if="form.filePaths"
style="width: 100px; height: 100px"
:src="
......@@ -138,7 +138,8 @@
: [form.filePaths]
"
>
</el-image>
</el-image> -->
<filepReview v-if="form.filePaths" :src="form.filePaths"/>
<span v-else>--</span>
</div>
<ImageUpload
......
......@@ -175,7 +175,7 @@
<el-col :span="22">
<el-form-item label="图片凭证:">
<div v-if="form.view == '查看'">
<el-image
<!-- <el-image
v-if="form.filePaths"
style="width: 100px; height: 100px"
:src="
......@@ -191,7 +191,8 @@
: [form.filePaths]
"
>
</el-image>
</el-image> -->
<filepReview v-if="form.filePaths" :src="form.filePaths"/>
<span v-else>--</span>
</div>
<ImageUpload
......
......@@ -150,7 +150,7 @@
<el-col :span="22">
<el-form-item label="图片凭证:">
<div v-if="form.view == '查看'">
<el-image
<!-- <el-image
v-if="form.filePaths"
style="width: 100px; height: 100px"
:src="
......@@ -166,7 +166,8 @@
: [form.filePaths]
"
>
</el-image>
</el-image> -->
<filepReview v-if="form.filePaths" :src="form.filePaths"/>
<span v-else>--</span>
</div>
<ImageUpload
......
......@@ -127,7 +127,7 @@
<el-col :span="22">
<el-form-item label="图片凭证:">
<div v-if="form.view == '查看'">
<el-image
<!-- <el-image
v-if="form.filePaths"
style="width: 100px; height: 100px"
:src="
......@@ -143,7 +143,8 @@
: [form.filePaths]
"
>
</el-image>
</el-image> -->
<filepReview v-if="form.filePaths" :src="form.filePaths"/>
<span v-else>--</span>
</div>
<ImageUpload
......
......@@ -87,7 +87,7 @@
<el-col :span="22">
<el-form-item label="图片凭证:">
<div v-if="form.view == '查看'">
<el-image
<!-- <el-image
v-if="form.filePaths"
style="width: 100px; height: 100px"
:src="
......@@ -103,7 +103,8 @@
: [form.filePaths]
"
>
</el-image>
</el-image> -->
<filepReview v-if="form.filePaths" :src="form.filePaths"/>
<span v-else>--</span>
</div>
<ImageUpload
......
......@@ -140,7 +140,7 @@
<el-col :span="22">
<el-form-item label="图片凭证:">
<div v-if="form.view == '查看'">
<el-image
<!-- <el-image
v-if="form.filePaths"
style="width: 100px; height: 100px"
:src="
......@@ -156,7 +156,8 @@
: [form.filePaths]
"
>
</el-image>
</el-image> -->
<filepReview v-if="form.filePaths" :src="form.filePaths"/>
<span v-else>--</span>
</div>
<ImageUpload
......
......@@ -121,7 +121,7 @@ export default {
{ label: "增减类型", prop: "subAddType", formatter: this.formatter },
{ label: "分值", prop: "score" },
{ label: "分值", prop: "score", formatter: this.formatter },
{ label: "负责人分值", prop: "ownerScore" },
......@@ -226,7 +226,9 @@ export default {
type: this.activeName,
page: this.query.page,
orderColList: this.typeArr,
name: `%${this.searchValue}%`,
andConditionList: [
{ content: `%${this.searchValue}%`, name: `%${this.searchValue}%` },
],
}).then((res) => {
if (res.code == 1) {
this.tableData = res.data;
......
......@@ -52,6 +52,7 @@
:expand-on-click-node="false"
:render-content="renderContent"
@node-click="handleNodeClick"
:default-expand-all="true"
>
</el-tree>
</el-scrollbar>
......@@ -151,13 +152,13 @@
<!-- 花名册记录查看 -->
<el-drawer title="历史花名册" :visible.sync="drawerhistory" direction="rtl">
<div class="hisList">
<div class="list mt10" v-for="item in 10" :key="item">
<div class="list mt10" v-for="item in 1" :key="item">
<div class="flex flex-align-center flex-pack-justify">
<div>花名册记录</div>
<el-button type="text">查看</el-button>
<!-- <el-button type="text">查看</el-button> -->
</div>
<div class="times">
导出时间:2020-08-13
导出时间:2023-07-19
</div>
</div>
</div>
......@@ -182,7 +183,12 @@
</div>
</el-dialog>
<drawer-show ref="drawerform" @ok="getData" :bumentree="areaData" :currentNode="currentNode"/>
<drawer-show
ref="drawerform"
@ok="getData"
:bumentree="areaData"
:currentNode="currentNode"
/>
</div>
</template>
......@@ -248,7 +254,7 @@ export default {
},
handleNodeClick(node) {
console.log(node,123123);
console.log(node, 123123);
this.currentNode = node;
this.query = { deptId: node.id };
this.getData();
......@@ -327,13 +333,13 @@ export default {
name: "name",
type: "text",
label: "员工姓名",
fuzzy: false,
fuzzy: true,
},
{
name: "phoneNumber",
type: "text",
label: "手机号",
fuzzy: false,
fuzzy: true,
},
],
columns: [
......
......@@ -80,7 +80,7 @@ export default {
name: '目标线',
yAxis: this.markLine,
label: {
formatter: '{b}:'+this.legendName+'不高于20.0%,',
formatter: '{b}:' + this.legendName + '不高于20.0%,',
position: 'insideStartTop'
},
lineStyle: {
......@@ -188,6 +188,10 @@ export default {
]
})
}
myChart.on('click', (params)=>{
this.$emit("click",params)
})
},
},
};
......
<template>
<div class="page">
<LayoutTable :data="tableData" notAdd notDel :config="tableConfig">
<el-button
slot="table-head-left2"
style="margin-left: 10px"
icon="el-icon-tickets"
size="mini"
@click="doExport"
:disabled="isExport"
>导出</el-button
>
<el-button slot="table-head-left2" style="margin-left: 10px" icon="el-icon-tickets" size="mini" @click="doExport"
:disabled="isExport">导出</el-button>
</LayoutTable>
<dialog-show ref="dialogform" @ok="getData" />
......@@ -26,7 +19,7 @@ export default {
dialogShow,
},
mixins: [table],
created() {},
created() { },
methods: {
/** 导出Excel */
doExport() {
......@@ -92,7 +85,7 @@ export default {
{ label: "姓名", prop: "staffName" },
{ label: "工号", prop: "workNum" },
{ label: "手机号", prop: "phoneNumber" },
{ label: "所属部门", prop: "deptName" },
......@@ -103,15 +96,16 @@ export default {
},
},
{ label: "考勤绩效", prop: "attendScore", formatter: this.formatter },
{ label: "考勤绩效指标分数", prop: "attendScore", formatter: this.formatter },
{ label: "评价绩效", prop: "assessScore", formatter: this.formatter },
{ label: "评价绩效指标分数", prop: "reviewScore", formatter: this.formatter },
{ label: "投诉绩效指标分数", prop: "reviewScore", formatter: this.formatter },
{ label: "办件绩效", prop: "workScore", formatter: this.formatter },
{ label: "办件绩效分数", prop: "workScore", formatter: this.formatter },
{ label: "效能绩效", prop: "effectScore", formatter: this.formatter },
{ label: "效能绩效分数", prop: "effectScore", formatter: this.formatter },
{ label: "其它绩效", prop: "otherScore", formatter: this.formatter },
{ label: "其它绩效分数", prop: "otherScore", formatter: this.formatter },
{
label: "累计异常分数",
......
......@@ -68,6 +68,7 @@
<profiles.hik.appSecret>2m9RcPJOKq5j2QPQM4v5</profiles.hik.appSecret>
<profiles.dingtalk.domain>https://oapi.dingtalk.com</profiles.dingtalk.domain>
<profiles.dingtalk.oaUrl>api.dingtalk.com</profiles.dingtalk.oaUrl>
<profiles.dingtalk.agentId>2652674890</profiles.dingtalk.agentId>
<profiles.dingtalk.appKey>dingpqzradgfr4efdi2j</profiles.dingtalk.appKey>
<profiles.dingtalk.appSecret>bF2WALmo5_Wuj3hg5gXeWqezrYnZChUJ88HjzNWpkA9ivdOxfBDGOGYcfVRfB3vd</profiles.dingtalk.appSecret>
......@@ -98,6 +99,7 @@
<profiles.hik.appSecret>2m9RcPJOKq5j2QPQM4v5</profiles.hik.appSecret>
<profiles.dingtalk.domain>http://172.15.28.113:8918</profiles.dingtalk.domain>
<profiles.dingtalk.oaUrl>172.15.28.113:8919</profiles.dingtalk.oaUrl>
<profiles.dingtalk.agentId>2652674890</profiles.dingtalk.agentId>
<profiles.dingtalk.appKey>dingpqzradgfr4efdi2j</profiles.dingtalk.appKey>
<profiles.dingtalk.appSecret>bF2WALmo5_Wuj3hg5gXeWqezrYnZChUJ88HjzNWpkA9ivdOxfBDGOGYcfVRfB3vd</profiles.dingtalk.appSecret>
......
......@@ -158,11 +158,12 @@ public class LoginController extends BaseCRUDJsonBodyMappingController<UserServi
homeStatInfo.setTotalDeptNum(totalDeptNum);
//todo
homeStatInfo.setAttendRadio(new BigDecimal(91.00));
homeStatInfo.setAttendRadio(new BigDecimal(98.00));
homeStatInfo.setLevealPersonNum(6);
homeStatInfo.setLatePersonNum(2);
homeStatInfo.setLeftEarlyPersonNum(1);
homeStatInfo.setMissCardPersonNum(0);
homeStatInfo.setMissCardPersonNum(23);
homeStatInfo.setAttendPersonNum(426);
data.put("homeStat", homeStatInfo);
data.put("token", token);
......
......@@ -19,8 +19,6 @@ public abstract class BaseReq implements Serializable {
*/
private Integer size;
/**
* 工号
*/
......
package com.mortals.xhx.busiz;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.util.Date;
@Data
public class TestReq {
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTimeStart;
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTimeEnd;
}
......@@ -27,4 +27,9 @@ public class EffectSaveReq extends BaseReq {
* 报警时间
*/
private Date alarmTime;
/**
* 窗口编号
*/
private String windowNum;
}
......@@ -28,6 +28,9 @@ public class ReviewSaveReq extends BaseReq {
*/
private String reviewDevice;
/**
* 窗口编号
*/
private String windowNum;
}
......@@ -219,7 +219,7 @@ public class ApiWebPerformController extends AbstractBaseController<PerformReq>
recordEntity.setRuleName(rule.getName());
recordEntity.setCategoryId(rule.getCategoryId());
recordEntity.setCategoryName(rule.getCategoryName());
recordEntity.setDeductPerson("admin");
recordEntity.setDeductPerson("系统管理员");
recordEntity.setDeductTime(new Date());
recordEntity.setCreateUserId(1L);
recordEntity.setCreateTime(new Date());
......@@ -254,11 +254,12 @@ public class ApiWebPerformController extends AbstractBaseController<PerformReq>
recordEntity.setRuleName(rule.getName());
recordEntity.setCategoryId(rule.getCategoryId());
recordEntity.setCategoryName(rule.getCategoryName());
recordEntity.setDeductPerson("admin");
recordEntity.setDeductPerson("系统管理员");
recordEntity.setDeductTime(new Date());
recordEntity.setCreateUserId(1L);
recordEntity.setCreateTime(new Date());
recordEntity.setWorkNum(staffEntity.getWorkNum());
recordEntity.setWindowNum(req.getWindowNum());
PerformRulesCategoryEntity categoryEntity = categoryService.get(rule.getCategoryId());
recordEntity.setCategoryName(categoryEntity == null ? "" : categoryEntity.getName());
PerformReviewRecordEntity save = reviewRecordService.save(recordEntity);
......@@ -285,7 +286,7 @@ public class ApiWebPerformController extends AbstractBaseController<PerformReq>
recordEntity.setRuleName(rule.getName());
recordEntity.setCategoryId(rule.getCategoryId());
recordEntity.setCategoryName(rule.getCategoryName());
recordEntity.setDeductPerson("admin");
recordEntity.setDeductPerson("系统管理员");
recordEntity.setDeductTime(new Date());
recordEntity.setWorkNum(staffEntity.getWorkNum());
......@@ -317,7 +318,7 @@ public class ApiWebPerformController extends AbstractBaseController<PerformReq>
recordEntity.setRuleName(rule.getName());
recordEntity.setCategoryId(rule.getCategoryId());
recordEntity.setCategoryName(rule.getCategoryName());
recordEntity.setDeductPerson("admin");
recordEntity.setDeductPerson("系统管理员");
recordEntity.setDeductTime(new Date());
recordEntity.setWorkNum(staffEntity.getWorkNum());
......@@ -350,10 +351,12 @@ public class ApiWebPerformController extends AbstractBaseController<PerformReq>
recordEntity.setRuleName(rule.getName());
recordEntity.setCategoryId(rule.getCategoryId());
recordEntity.setCategoryName(rule.getCategoryName());
recordEntity.setDeductPerson("admin");
recordEntity.setDeductPerson("系统管理员");
recordEntity.setDeductTime(new Date());
recordEntity.setWorkNum(staffEntity.getWorkNum());
recordEntity.setWindowNum(req.getWindowNum());
recordEntity.setCreateUserId(1L);
recordEntity.setCreateTime(new Date());
PerformRulesCategoryEntity categoryEntity = categoryService.get(rule.getCategoryId());
......@@ -384,7 +387,7 @@ public class ApiWebPerformController extends AbstractBaseController<PerformReq>
recordEntity.setCategoryName(rule.getCategoryName());
recordEntity.setWorkNum(staffEntity.getWorkNum());
recordEntity.setDeductPerson("admin");
recordEntity.setDeductPerson("系统管理员");
recordEntity.setDeductTime(new Date());
recordEntity.setCreateUserId(1L);
......
......@@ -8,6 +8,7 @@ import com.alibaba.fastjson.JSONObject;
import com.mortals.framework.common.Rest;
import com.mortals.framework.exception.AppException;
import com.mortals.framework.model.Context;
import com.mortals.framework.model.OrderCol;
import com.mortals.framework.model.PageInfo;
import com.mortals.framework.model.Result;
import com.mortals.xhx.busiz.h5.req.AppealReq;
......@@ -29,6 +30,7 @@ import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
......@@ -131,6 +133,7 @@ public class AppealApiController extends AbstractBaseController<PerformReq> {
query.setCreateTimeStart(appealReq.getApperalStartDate());
query.setCreateTimeEnd(appealReq.getAppealEndDate());
query.setStaffId(context.getUser().getCustomerId());
query.setOrderColList(Arrays.asList(new OrderCol("createTime",OrderCol.DESCENDING)));
Result<PerformAttendAppealEntity> result = appealService.find(query, pageInfo, context);
model.put(KEY_RESULT_DATA, result.getList());
......
......@@ -6,6 +6,7 @@ import com.alibaba.fastjson.JSONObject;
import com.mortals.framework.common.Rest;
import com.mortals.framework.exception.AppException;
import com.mortals.framework.model.Context;
import com.mortals.framework.model.OrderCol;
import com.mortals.framework.model.PageInfo;
import com.mortals.framework.model.Result;
import com.mortals.xhx.busiz.h5.req.FeedbackReq;
......@@ -93,6 +94,8 @@ public class FeedbackApiController extends AbstractBaseController<FeedbackReq> {
feedbackQuery.setIdList(feedbackIdList);
feedbackQuery.setCreateTimeStart(feedbackReq.getFeedBackStartDate());
feedbackQuery.setCreateTimeEnd(feedbackReq.getFeedBackEndDate());
feedbackQuery.setOrderColList(Arrays.asList(new OrderCol("createTime",OrderCol.DESCENDING)));
Result<FeedbackEntity> result = feedbackService.find(feedbackQuery, pageAllInfo, null);
model.put(PAGEINFO_KEY, result.getPageInfo());
model.put(KEY_RESULT_DATA, result.getList());
......@@ -113,6 +116,7 @@ public class FeedbackApiController extends AbstractBaseController<FeedbackReq> {
feedbackQuery.setCreateTimeStart(feedbackReq.getFeedBackStartDate());
feedbackQuery.setCreateTimeEnd(feedbackReq.getFeedBackEndDate());
feedbackQuery.setOrderColList(Arrays.asList(new OrderCol("createTime",OrderCol.DESCENDING)));
Result<FeedbackEntity> result = feedbackService.find(feedbackQuery, pageAllInfo, null);
......@@ -136,6 +140,7 @@ public class FeedbackApiController extends AbstractBaseController<FeedbackReq> {
feedbackQuery.setIdList(unfinFeedbackList);
feedbackQuery.setCreateTimeStart(feedbackReq.getFeedBackStartDate());
feedbackQuery.setCreateTimeEnd(feedbackReq.getFeedBackEndDate());
feedbackQuery.setOrderColList(Arrays.asList(new OrderCol("createTime",OrderCol.DESCENDING)));
Result<FeedbackEntity> result = feedbackService.find(feedbackQuery, pageAllInfo, null);
model.put(PAGEINFO_KEY, result.getPageInfo());
model.put(KEY_RESULT_DATA, result.getList());
......
......@@ -6,6 +6,7 @@ import com.alibaba.fastjson.JSONObject;
import com.mortals.framework.common.Rest;
import com.mortals.framework.exception.AppException;
import com.mortals.framework.model.Context;
import com.mortals.framework.model.OrderCol;
import com.mortals.framework.model.PageInfo;
import com.mortals.framework.model.Result;
import com.mortals.xhx.busiz.h5.req.InspectSaveReq;
......@@ -164,6 +165,7 @@ public class InspectApiController extends AbstractBaseController<PerformReq> {
query.setCreateTimeEnd(performReq.getPerformEndDate());
query.setCreateUserId(context.getUser().getId());
query.setSubMethod(SubMethodEnum.大厅巡查.getValue());
query.setOrderColList(Arrays.asList(new OrderCol("createTime",OrderCol.DESCENDING)));
log.info("inspect query:{}",JSONObject.toJSONString(query));
......
......@@ -10,6 +10,7 @@ import com.alibaba.fastjson.JSONObject;
import com.mortals.framework.common.Rest;
import com.mortals.framework.exception.AppException;
import com.mortals.framework.model.Context;
import com.mortals.framework.model.OrderCol;
import com.mortals.framework.model.PageInfo;
import com.mortals.framework.model.Result;
import com.mortals.xhx.busiz.h5.req.PerformReq;
......@@ -36,10 +37,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.ObjectUtils;
import org.springframework.web.bind.annotation.*;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.stream.Collectors;
import static com.mortals.framework.ap.SysConstains.*;
......@@ -182,6 +180,7 @@ public class PerformApiController extends AbstractBaseController<PerformReq> {
query.setCheckTimeEnd(performReq.getPerformEndDate());
query.setStaffId(context.getUser().getCustomerId());
query.setCheckStatus(CheckStatusEnum.已处理.getValue());
query.setOrderColList(Arrays.asList(new OrderCol("createTime",OrderCol.DESCENDING)));
Result<CheckAllRecordVo> result = checkAllRecordService.getAllCheckRecord(query, pageInfo);
List<CheckAllRecordVo> allCheckRecord = result.getList();
......@@ -202,6 +201,8 @@ public class PerformApiController extends AbstractBaseController<PerformReq> {
query.setCheckTimeEnd(performReq.getPerformEndDate());
query.setStaffId(context.getUser().getCustomerId());
query.setCheckStatus(CheckStatusEnum.已处理.getValue());
query.setOrderColList(Arrays.asList(new OrderCol("createTime",OrderCol.DESCENDING)));
Result<CheckAttendRecordEntity> result = checkAttendRecordService.find(query, pageInfo, context);
List<PerformInfo> collect = result.getList().stream().map(item -> {
PerformInfo performInfo = new PerformInfo();
......@@ -222,6 +223,8 @@ public class PerformApiController extends AbstractBaseController<PerformReq> {
query.setCheckTimeEnd(performReq.getPerformEndDate());
query.setStaffId(context.getUser().getCustomerId());
query.setCheckStatus(CheckStatusEnum.已处理.getValue());
query.setOrderColList(Arrays.asList(new OrderCol("createTime",OrderCol.DESCENDING)));
Result<CheckReviewRecordEntity> result = checkReviewRecordService.find(query, pageInfo, context);
List<PerformInfo> collect = result.getList().stream().map(item -> {
PerformInfo performInfo = new PerformInfo();
......@@ -242,6 +245,8 @@ public class PerformApiController extends AbstractBaseController<PerformReq> {
query.setCheckTimeEnd(performReq.getPerformEndDate());
query.setStaffId(context.getUser().getCustomerId());
query.setCheckStatus(CheckStatusEnum.已处理.getValue());
query.setOrderColList(Arrays.asList(new OrderCol("createTime",OrderCol.DESCENDING)));
Result<CheckComplainRecordEntity> result = checkComplainRecordService.find(query, pageInfo, context);
List<PerformInfo> collect = result.getList().stream().map(item -> {
PerformInfo performInfo = new PerformInfo();
......@@ -262,6 +267,8 @@ public class PerformApiController extends AbstractBaseController<PerformReq> {
query.setCheckTimeEnd(performReq.getPerformEndDate());
query.setStaffId(context.getUser().getCustomerId());
query.setCheckStatus(CheckStatusEnum.已处理.getValue());
query.setOrderColList(Arrays.asList(new OrderCol("createTime",OrderCol.DESCENDING)));
Result<CheckGoworkRecordEntity> result = checkGoworkRecordService.find(query, pageInfo, context);
List<PerformInfo> collect = result.getList().stream().map(item -> {
PerformInfo performInfo = new PerformInfo();
......@@ -282,6 +289,8 @@ public class PerformApiController extends AbstractBaseController<PerformReq> {
query.setCheckTimeEnd(performReq.getPerformEndDate());
query.setStaffId(context.getUser().getCustomerId());
query.setCheckStatus(CheckStatusEnum.已处理.getValue());
query.setOrderColList(Arrays.asList(new OrderCol("createTime",OrderCol.DESCENDING)));
Result<CheckEffectRecordEntity> result = checkEffectRecordService.find(query, pageInfo, context);
List<PerformInfo> collect = result.getList().stream().map(item -> {
PerformInfo performInfo = new PerformInfo();
......
package com.mortals.xhx.daemon.task;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.PageUtil;
import cn.hutool.core.util.StrUtil;
import com.mortals.framework.common.Rest;
import com.mortals.framework.exception.AppException;
import com.mortals.framework.model.Context;
import com.mortals.framework.service.ITask;
import com.mortals.framework.service.ITaskExcuteService;
import com.mortals.framework.util.DateUtils;
import com.mortals.xhx.base.system.user.model.UserEntity;
import com.mortals.xhx.common.code.YesNoEnum;
import com.mortals.xhx.module.attendance.model.AttendanceRecordHikEntity;
import com.mortals.xhx.module.attendance.model.AttendanceRecordHikQuery;
import com.mortals.xhx.module.attendance.service.AttendanceRecordHikService;
import com.mortals.xhx.module.hik.door.model.req.door.DoorEventReq;
import com.mortals.xhx.module.hik.door.model.rsp.door.DoorEventDataInfo;
import com.mortals.xhx.module.hik.door.service.IHikDoorService;
import com.mortals.xhx.module.staff.model.StaffEntity;
import com.mortals.xhx.module.staff.service.StaffService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
/**
* 同步获取下午海康门禁事件
*/
@Slf4j
@Service("SyncDoorsEventAfterTask")
public class SyncDoorsEventAfterTaskImpl implements ITaskExcuteService {
@Autowired
private AttendanceRecordHikService recordHikService;
@Autowired
private StaffService staffService;
@Autowired
private IHikDoorService hikDoorService;
@Override
public void excuteTask(ITask task) throws AppException {
syncDoorEvents();
calculateAttendByDay();
}
private void calculateAttendByDay() {
Context context = new Context();
UserEntity userEntity = new UserEntity();
userEntity.setCreateUserId(1L);
userEntity.setCreateUserName("system");
userEntity.setCreateTime(new Date());
context.setUser(userEntity);
AttendanceRecordHikQuery recordHikEntity = new AttendanceRecordHikQuery();
// Date todayStart = DateUtil.offsetHour(new Date(), -5).toJdkDate();
// recordHikEntity.setAttendanceDateStart(DateUtils.getCurrStrDate());
recordHikEntity.setAttendanceDateStart(DateUtil.offsetHour(new Date(), -5).toString());
recordHikEntity.setAttendanceDateEnd(DateUtils.getCurrStrDate());
try {
recordHikService.addAttendanceRecordByQuery(recordHikEntity, context);
} catch (Exception e) {
log.error("计算考勤异常", e);
}
}
private void syncDoorEvents() {
DoorEventReq doorEventReq = new DoorEventReq();
List<Integer> eventTypes = new ArrayList<>();
eventTypes.add(196885);
eventTypes.add(196887);
eventTypes.add(196893);
eventTypes.add(196888);
eventTypes.add(196889);
eventTypes.add(196890);
eventTypes.add(196891);
doorEventReq.setEventTypes(eventTypes);
// 获取当天的开始时间
Date todayStart = DateUtil.offsetHour(new Date(), -5).toJdkDate();
// Date todayStart = DateUtil.beginOfDay(new Date());
// 获取当天的结束时间
Date todayEnd = DateUtil.endOfDay(new Date());
doorEventReq.setStartTime(todayStart);
doorEventReq.setEndTime(todayEnd);
doorEventReq.setPageNo(1);
doorEventReq.setPageSize(1);
Rest<DoorEventDataInfo> doorEventsRest = hikDoorService.getDoorEvents(doorEventReq);
log.info("doorEventsRest:{} msg:{}", doorEventsRest.getCode(), doorEventsRest.getMsg());
if (doorEventsRest.getCode() == YesNoEnum.YES.getValue()) {
//分页获取考勤数据
Integer total = doorEventsRest.getData().getTotal();
int pageCount = PageUtil.totalPage(total, 1000);
for (int i = 1; i <= pageCount; i++) {
doorEventReq.setPageNo(i);
doorEventReq.setPageSize(1000);
doorEventsRest = hikDoorService.getDoorEvents(doorEventReq);
log.info("doorEventsRest:{} msg:{},page:{}", doorEventsRest.getCode(), doorEventsRest.getMsg(), doorEventReq.getPageNo());
getDoorEvents(doorEventsRest);
}
}
}
private void getDoorEvents(Rest<DoorEventDataInfo> doorEventsRest) {
//同步当前考勤数据
List<AttendanceRecordHikEntity> attRecords = doorEventsRest.getData().getList().stream().map(item -> {
AttendanceRecordHikEntity recordHikEntity = new AttendanceRecordHikEntity();
recordHikEntity.initAttrValue();
StaffEntity staffCache = staffService.getExtCache(StrUtil.padPre(item.getJobNo(), 8, "0"));
if (ObjectUtils.isEmpty(staffCache)) {
log.info("staff is null !staffCode:{}", item.getJobNo());
return null;
}
recordHikEntity.setStaffId(staffCache.getId());
recordHikEntity.setStaffName(staffCache.getName());
recordHikEntity.setWorkNum(staffCache.getWorkNum());
recordHikEntity.setDeptId(staffCache.getDeptId());
recordHikEntity.setDeptName(staffCache.getDeptName());
recordHikEntity.setPositionId(staffCache.getPositionId());
recordHikEntity.setPositionName(staffCache.getPositionName());
recordHikEntity.setAttendanceDate(item.getEventTime());
recordHikEntity.setAttendanceAddress(item.getDoorName());
recordHikEntity.setEventSource("门禁点");
recordHikEntity.setRemark(item.getEventId());
recordHikEntity.setCreateTime(new Date());
recordHikEntity.setCreateUserName("系统管理员");
recordHikEntity.setCreateUserId(1L);
return recordHikEntity;
}).filter(f -> f != null).collect(Collectors.toList());
log.info("attRecords size:{}", attRecords.size());
List<String> eventIds = attRecords.parallelStream().filter(f -> !ObjectUtils.isEmpty(f) && !ObjectUtils.isEmpty(f.getRemark())).map(i -> i.getRemark()).collect(Collectors.toList());
//查询当天考勤记录是否有重复的 有的 则不添加
AttendanceRecordHikQuery recordHikQuery = new AttendanceRecordHikQuery();
recordHikQuery.setAttendanceDateStart(DateUtil.format(DateUtil.beginOfDay(new Date()), "yyyy-MM-dd"));
recordHikQuery.setAttendanceDateEnd(DateUtil.format(DateUtil.beginOfDay(new Date()), "yyyy-MM-dd"));
recordHikQuery.setRemarkList(eventIds);
Set<String> eventIdSet = recordHikService.find(recordHikQuery).parallelStream().map(i -> i.getRemark()).collect(Collectors.toSet());
//去重 时分秒打卡的 也要去掉重复。
List<AttendanceRecordHikEntity> saveRecordList = attRecords.stream().filter(f -> !eventIdSet.contains(f.getRemark())).collect(Collectors.toList());
if (!ObjectUtils.isEmpty(saveRecordList)) {
//单个插入 去掉重复时间段的打卡记录
for (AttendanceRecordHikEntity recordHikEntity : saveRecordList) {
try {
recordHikService.save(recordHikEntity);
} catch (Exception e) {
log.error("基础考勤数据保存异常", e.getMessage());
}
}
// recordHikService.save(saveRecordList);
}
log.info("saveRecordList size:{}", saveRecordList.size());
}
@Override
public void stopTask(ITask task) throws AppException {
}
}
......@@ -3,8 +3,6 @@ package com.mortals.xhx.daemon.task;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.PageUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.mortals.framework.common.Rest;
import com.mortals.framework.exception.AppException;
import com.mortals.framework.model.Context;
......@@ -22,12 +20,10 @@ import com.mortals.xhx.module.hik.door.service.IHikDoorService;
import com.mortals.xhx.module.staff.model.StaffEntity;
import com.mortals.xhx.module.staff.service.StaffService;
import lombok.extern.slf4j.Slf4j;
import org.checkerframework.checker.units.qual.A;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
import java.time.Year;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
......@@ -66,10 +62,13 @@ public class SyncDoorsEventTaskImpl implements ITaskExcuteService {
userEntity.setCreateTime(new Date());
context.setUser(userEntity);
AttendanceRecordHikQuery recordHikEntity = new AttendanceRecordHikQuery();
recordHikEntity.setAttendanceDateStart(DateUtils.getCurrStrDate());
// Date todayStart = DateUtil.offsetHour(new Date(), -5).toJdkDate();
// recordHikEntity.setAttendanceDateStart(DateUtils.getCurrStrDate());
recordHikEntity.setAttendanceDateStart(DateUtil.offsetHour(new Date(), -5).toString());
recordHikEntity.setAttendanceDateEnd(DateUtils.getCurrStrDate());
try {
recordHikService.addAttendanceRecord(recordHikEntity, context);
recordHikService.addAttendanceRecordByQuery(recordHikEntity, context);
} catch (Exception e) {
log.error("计算考勤异常", e);
}
......@@ -87,7 +86,8 @@ public class SyncDoorsEventTaskImpl implements ITaskExcuteService {
eventTypes.add(196891);
doorEventReq.setEventTypes(eventTypes);
// 获取当天的开始时间
Date todayStart = DateUtil.beginOfDay(new Date());
Date todayStart = DateUtil.offsetHour(new Date(), -5).toJdkDate();
// Date todayStart = DateUtil.beginOfDay(new Date());
// 获取当天的结束时间
Date todayEnd = DateUtil.endOfDay(new Date());
doorEventReq.setStartTime(todayStart);
......@@ -118,7 +118,7 @@ public class SyncDoorsEventTaskImpl implements ITaskExcuteService {
recordHikEntity.initAttrValue();
StaffEntity staffCache = staffService.getExtCache(StrUtil.padPre(item.getJobNo(), 8, "0"));
if (ObjectUtils.isEmpty(staffCache)) {
log.info("staff is null !staffCode:{}",item.getJobNo());
log.info("staff is null !staffCode:{}", item.getJobNo());
return null;
}
......@@ -135,13 +135,11 @@ public class SyncDoorsEventTaskImpl implements ITaskExcuteService {
recordHikEntity.setEventSource("门禁点");
recordHikEntity.setRemark(item.getEventId());
recordHikEntity.setCreateTime(new Date());
recordHikEntity.setCreateUserName("system");
recordHikEntity.setCreateUserName("系统管理员");
recordHikEntity.setCreateUserId(1L);
return recordHikEntity;
}).filter(f->f!=null).collect(Collectors.toList());
}).filter(f -> f != null).collect(Collectors.toList());
log.info("attRecords size:{}", attRecords.size());
List<String> eventIds = attRecords.parallelStream().filter(f -> !ObjectUtils.isEmpty(f) && !ObjectUtils.isEmpty(f.getRemark())).map(i -> i.getRemark()).collect(Collectors.toList());
//查询当天考勤记录是否有重复的 有的 则不添加
......@@ -151,9 +149,18 @@ public class SyncDoorsEventTaskImpl implements ITaskExcuteService {
recordHikQuery.setRemarkList(eventIds);
Set<String> eventIdSet = recordHikService.find(recordHikQuery).parallelStream().map(i -> i.getRemark()).collect(Collectors.toSet());
//去重 时分秒打卡的 也要去掉重复。
List<AttendanceRecordHikEntity> saveRecordList = attRecords.stream().filter(f -> !eventIdSet.contains(f.getRemark())).collect(Collectors.toList());
if (!ObjectUtils.isEmpty(saveRecordList)) {
recordHikService.save(saveRecordList);
//单个插入 去掉重复时间段的打卡记录
for (AttendanceRecordHikEntity recordHikEntity : saveRecordList) {
try {
recordHikService.save(recordHikEntity);
} catch (Exception e) {
log.error("基础考勤数据保存异常", e.getMessage());
}
}
// recordHikService.save(saveRecordList);
}
log.info("saveRecordList size:{}", saveRecordList.size());
}
......@@ -163,20 +170,4 @@ public class SyncDoorsEventTaskImpl implements ITaskExcuteService {
public void stopTask(ITask task) throws AppException {
}
public static void main(String[] args) {
// 获取当前时间的小时数
int hour = DateUtil.hour(new Date(), true);
// 获取当前时间所在小时的开始时间和结束时间
Date startTime = DateUtil.beginOfHour(new Date());
Date endTime = DateUtil.endOfHour(new Date());
// 格式化时间为指定格式
String startTimeStr = DateUtil.format(startTime, "yyyy-MM-dd HH:00:00");
String endTimeStr = DateUtil.format(endTime, "yyyy-MM-dd HH:59:59");
// 输出结果
System.out.println("当前时间所在小时的开始时间:" + startTimeStr);
System.out.println("当前时间所在小时的结束时间:" + endTimeStr);
}
}
......@@ -74,7 +74,7 @@ public class SyncUserTaskImpl implements ITaskExcuteService {
for (PersonInfo personInfo : personInfoList) {
StaffEntity staffEntity = staffService.getExtCache(StrUtil.padPre(personInfo.getJobNo(), 8, "0"));
DeptEntity deptEntity = deptService.selectOne(new DeptQuery().deptCode(personInfo.getOrgIndexCode()));
// AttendanceVacationBalanceEntity balanceEntity = balanceService.selectOne(new AttendanceVacationBalanceQuery().staffId(staffEntity.getId()));
// AttendanceVacationBalanceEntity balanceEntity = balanceService.selectOne(new AttendanceVacationBalanceQuery().staffId(staffEntity.getId()));
// AttendanceStatEntity statEntity = attendanceStatService.selectOne(new AttendanceStatQuery().staffId(staffEntity.getId()));
//判断本地数据是否为空
if (ObjectUtils.isEmpty(staffEntity)) {
......@@ -106,7 +106,7 @@ public class SyncUserTaskImpl implements ITaskExcuteService {
balanceEntity.setCreateUserId(1L);
balanceEntity.setCreateTime(new Date());
balanceService.save(balanceEntity);
//AttendanceVacationBalanceEntity balanceEntity = balanceService.selectOne(new AttendanceVacationBalanceQuery().staffId(staffEntity.getId()));
//AttendanceVacationBalanceEntity balanceEntity = balanceService.selectOne(new AttendanceVacationBalanceQuery().staffId(staffEntity.getId()));
AttendanceStatEntity attendanceStatEntity = new AttendanceStatEntity();
attendanceStatEntity.initAttrValue();
......@@ -139,16 +139,7 @@ public class SyncUserTaskImpl implements ITaskExcuteService {
attendanceStatEntity.setHomeLeave(balanceEntity.getHomeLeave());
attendanceStatEntity.setPersonalLeave(balanceEntity.getPersonalLeaveDays());
attendanceStatService.save(attendanceStatEntity);
//统计各级部门员工数量 todo 优化统计
String ancestor = deptEntity.getAncestors().split(",", 2)[1];
String[] ancestors = ancestor.split(",");
for (String newAncestor : ancestors) {
DeptEntity deptEntity2 = deptService.get(Long.valueOf(newAncestor));
if (Objects.nonNull(deptEntity2)) {
deptEntity2.setPersonNum(deptEntity2.getPersonNum() + 1);
deptService.update(deptEntity2);
}
}
} else {
//更新
if (!ObjectUtils.isEmpty(deptEntity)) {
......@@ -165,16 +156,7 @@ public class SyncUserTaskImpl implements ITaskExcuteService {
staffEntity.setUpdateUserId(1L);
staffEntity.setUpdateTime(new Date());
staffService.update(staffEntity);
//统计各级部门员工数量
String ancestor = deptEntity.getAncestors().split(",", 2)[1];
String[] ancestors = ancestor.split(",");
for (String newAncestor : ancestors) {
DeptEntity deptEntity2 = deptService.get(Long.valueOf(newAncestor));
if (Objects.nonNull(deptEntity2)) {
deptEntity2.setPersonNum(deptEntity2.getPersonNum() + 1);
deptService.update(deptEntity2);
}
}
}
}
}
......@@ -220,6 +202,7 @@ public class SyncUserTaskImpl implements ITaskExcuteService {
}
}
}
@Override
public void stopTask(ITask task) throws AppException {
......
package com.mortals.xhx.module.attendance.model;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.ArrayList;
import cn.hutool.core.date.DateUtil;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.mortals.framework.annotation.Excel;
import com.mortals.framework.model.BaseEntityLong;
......@@ -29,6 +32,7 @@ public class AttendanceStatEntity extends AttendanceStatVo {
/**
* 员工姓名
*/
@Excel(name = "员工姓名")
private String staffName;
/**
* 所属部门
......@@ -37,6 +41,7 @@ public class AttendanceStatEntity extends AttendanceStatVo {
/**
* 所属部门名称
*/
@Excel(name = "部门名称")
private String deptName;
/**
* 回单位(天)
......@@ -312,11 +317,11 @@ public class AttendanceStatEntity extends AttendanceStatVo {
this.earlyLeaveMeeting = BigDecimal.valueOf(0);
this.year = -1;
this.year = DateUtil.year(new Date());
this.month = -1;
this.month = DateUtil.month(new Date())+1;
this.day = -1;
this.day = DateUtil.dayOfMonth(new Date());
this.remark = "";
......@@ -338,4 +343,8 @@ public class AttendanceStatEntity extends AttendanceStatVo {
this.afternoonTimes = 0;
}
public static void main(String[] args) {
System.out.println(DateUtil.dayOfMonth(new Date()));
}
}
\ No newline at end of file
package com.mortals.xhx.module.attendance.service;
import com.mortals.framework.model.Context;
import com.mortals.framework.service.ICRUDService;
import com.mortals.xhx.module.attendance.dao.AttendanceRecordHikDao;
import com.mortals.xhx.module.attendance.model.AttendanceRecordHikEntity;
import java.util.List;
/**
* AttendanceRecordHikService
*
......@@ -13,10 +16,29 @@ import com.mortals.xhx.module.attendance.model.AttendanceRecordHikEntity;
*/
public interface AttendanceRecordHikService extends ICRUDService<AttendanceRecordHikEntity,Long>{
AttendanceRecordHikDao getDao();
/**
* 根据查询条件生成打卡记录
* @param attendanceRecordHikQuery
*/
void addAttendanceRecordByQuery(AttendanceRecordHikEntity attendanceRecordHikQuery, Context context) throws Exception;
/**
* 将原始数据导入打卡记录表
* @param entity
* 根据查询条件生成打卡记录
* @param hikEntity
*/
void addAttendanceRecord(AttendanceRecordHikEntity entity, Context context) throws Exception;
void addAttendanceRecord(AttendanceRecordHikEntity hikEntity, Context context) throws Exception;
/**
* 根据查原始记录列表生成打卡记录
* @param hikEntityList
*/
void addAttendanceRecordList(List<AttendanceRecordHikEntity> hikEntityList, Context context) throws Exception;
}
package com.mortals.xhx.module.attendance.web;
import com.mortals.framework.exception.AppException;
import com.mortals.framework.model.OrderCol;
import com.mortals.framework.web.BaseCRUDJsonBodyMappingController;
import com.mortals.xhx.base.system.param.service.ParamService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.ObjectUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
......@@ -47,5 +50,13 @@ public class AttendanceExportRecordController extends BaseCRUDJsonBodyMappingCon
super.init(model, context);
}
@Override
protected void doListBefore(AttendanceExportRecordEntity query, Map<String, Object> model, Context context) throws AppException {
if (ObjectUtils.isEmpty(query.getOrderColList())) {
query.setOrderColList(Arrays.asList(new OrderCol("createTime", OrderCol.DESCENDING),new OrderCol("staffName", OrderCol.DESCENDING)));
} else {
query.getOrderColList().add(new OrderCol("createTime", OrderCol.DESCENDING));
}
}
}
......@@ -127,7 +127,7 @@ public class AttendanceRecordHikController extends BaseCRUDJsonBodyMappingContro
if (ObjectUtils.isEmpty(hikEntity.getAttendanceDateStart())) {
throw new AppException("请选择开始日期");
}
hikService.addAttendanceRecord(hikEntity, getContext());
hikService.addAttendanceRecordByQuery(hikEntity, getContext());
model.put("message_info", busiDesc + "成功");
this.recordSysLog(this.request, busiDesc + " 【成功】");
} catch (Exception e) {
......
package com.mortals.xhx.module.check.model;
import com.mortals.framework.model.OrderCol;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
@Data
public class CheckAllRecordQuery {
/**
......@@ -34,5 +38,6 @@ public class CheckAllRecordQuery {
*/
private Integer subAddType;
private transient List<OrderCol> orderColList = new ArrayList();
}
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