|
@@ -17,23 +17,36 @@
|
|
|
@pagination-change="handlePaginationChange"
|
|
@pagination-change="handlePaginationChange"
|
|
|
@row-dblclick="handleRowDblclick"
|
|
@row-dblclick="handleRowDblclick"
|
|
|
>
|
|
>
|
|
|
|
|
+ <template slot="time">
|
|
|
|
|
+ <el-date-picker
|
|
|
|
|
+ v-model="daterRange"
|
|
|
|
|
+ size="mini"
|
|
|
|
|
+ type="daterange"
|
|
|
|
|
+ :picker-options="pickerOptions"
|
|
|
|
|
+ range-separator="至"
|
|
|
|
|
+ start-placeholder="开始日期"
|
|
|
|
|
+ end-placeholder="结束日期"
|
|
|
|
|
+ align="right"
|
|
|
|
|
+ value-format="yyyy-MM-dd"
|
|
|
|
|
+ />
|
|
|
|
|
+ </template>
|
|
|
<!-- 自定义多级表头 -->
|
|
<!-- 自定义多级表头 -->
|
|
|
<template #prepend-column>
|
|
<template #prepend-column>
|
|
|
<el-table-column key="ri_qi_" prop="ri_qi_" label="日期" width="100" />
|
|
<el-table-column key="ri_qi_" prop="ri_qi_" label="日期" width="100" />
|
|
|
- <el-table-column key="userName" prop="userName" label="姓名" width="80">
|
|
|
|
|
|
|
+ <el-table-column key="user_name_" prop="user_name_" label="姓名" width="80">
|
|
|
<template #default="{ row }">
|
|
<template #default="{ row }">
|
|
|
<el-tag style="margin: 2px;">
|
|
<el-tag style="margin: 2px;">
|
|
|
- {{ row.userName }}
|
|
|
|
|
|
|
+ {{ row.user_name_ }}
|
|
|
</el-tag>
|
|
</el-tag>
|
|
|
</template>
|
|
</template>
|
|
|
</el-table-column>
|
|
</el-table-column>
|
|
|
<!-- 基本信息分组 -->
|
|
<!-- 基本信息分组 -->
|
|
|
<el-table-column label="基本信息">
|
|
<el-table-column label="基本信息">
|
|
|
<!--<el-table-column prop="yong_hu_id_" title="姓名" key="yong_hu_id_" width="80" />-->
|
|
<!--<el-table-column prop="yong_hu_id_" title="姓名" key="yong_hu_id_" width="80" />-->
|
|
|
- <el-table-column key="deptName" prop="deptName" label="部门" width="100">
|
|
|
|
|
|
|
+ <el-table-column key="pos_name_" prop="pos_name_" label="部门" width="100">
|
|
|
<template #default="{ row }">
|
|
<template #default="{ row }">
|
|
|
<el-tag style="margin: 2px;">
|
|
<el-tag style="margin: 2px;">
|
|
|
- {{ row.deptName }}
|
|
|
|
|
|
|
+ {{ row.pos_name_ }}
|
|
|
</el-tag>
|
|
</el-tag>
|
|
|
</template>
|
|
</template>
|
|
|
</el-table-column>
|
|
</el-table-column>
|
|
@@ -41,15 +54,15 @@
|
|
|
</el-table-column>
|
|
</el-table-column>
|
|
|
<!-- 上班分组 -->
|
|
<!-- 上班分组 -->
|
|
|
<el-table-column label="考勤概况">
|
|
<el-table-column label="考勤概况">
|
|
|
- <el-table-column key="da_ka_shi_jian_1_" prop="da_ka_shi_jian_1_" label="最早" width="120" />
|
|
|
|
|
- <el-table-column key="da_ka_shi_jian_1_" prop="da_ka_shi_jian_1_" label="最晚" width="120" />
|
|
|
|
|
|
|
+ <el-table-column key="zui_zao" prop="zui_zao" label="最早" width="120" />
|
|
|
|
|
+ <el-table-column key="zui_wan" prop="zui_wan" label="最晚" width="120" />
|
|
|
<el-table-column key="da_ka_ci_shu_" prop="da_ka_ci_shu_" label="打卡次数" width="70" />
|
|
<el-table-column key="da_ka_ci_shu_" prop="da_ka_ci_shu_" label="打卡次数" width="70" />
|
|
|
- <el-table-column key="gong_zuo_shi_chan" prop="gong_zuo_shi_chan" label="标准工作时长" width="100" />
|
|
|
|
|
- <el-table-column key="gong_zuo_shi_chan" prop="gong_zuo_shi_chan" label="实际工作时长" width="100" />
|
|
|
|
|
- <el-table-column key="kao_qin_zhuang_ta" prop="kao_qin_zhuang_ta" label="考勤结果" width="80">
|
|
|
|
|
|
|
+ <el-table-column key="total_ban_ci_shi_chang" prop="total_ban_ci_shi_chang" label="标准工作时长" width="100" />
|
|
|
|
|
+ <el-table-column key="total_gong_zuo_shi_chan" prop="total_gong_zuo_shi_chan" label="实际工作时长" width="100" />
|
|
|
|
|
+ <el-table-column key="kao_qin_zhuang_tai" prop="kao_qin_zhuang_tai" label="考勤结果" width="80">
|
|
|
<template #default="{ row }">
|
|
<template #default="{ row }">
|
|
|
- <span :style="{ color: row.kao_qin_zhuang_ta=='异常' ? 'red' : 'inherit' }">
|
|
|
|
|
- {{ row.kao_qin_zhuang_ta }}
|
|
|
|
|
|
|
+ <span :style="{ color: row.kao_qin_zhuang_tai=='正常' ? 'inherit' : 'red' }">
|
|
|
|
|
+ {{ row.kao_qin_zhuang_tai }}
|
|
|
</span>
|
|
</span>
|
|
|
</template>
|
|
</template>
|
|
|
</el-table-column>
|
|
</el-table-column>
|
|
@@ -84,6 +97,7 @@ export default {
|
|
|
limit: 20
|
|
limit: 20
|
|
|
},
|
|
},
|
|
|
sorts: {},
|
|
sorts: {},
|
|
|
|
|
+ daterRange: [],
|
|
|
listConfig: {
|
|
listConfig: {
|
|
|
toolbars: [
|
|
toolbars: [
|
|
|
{ key: 'search', icon: 'ibps-icon-search', label: '查询', type: 'primary' },
|
|
{ key: 'search', icon: 'ibps-icon-search', label: '查询', type: 'primary' },
|
|
@@ -92,7 +106,7 @@ export default {
|
|
|
searchForm: {
|
|
searchForm: {
|
|
|
labelWidth: 100,
|
|
labelWidth: 100,
|
|
|
forms: [
|
|
forms: [
|
|
|
- { prop: ['Q^ri_qi_^DL', 'Q^ri_qi_^DG'], label: '日期范围', fieldType: 'daterange' },
|
|
|
|
|
|
|
+ { prop: '', label: '日期范围', fieldType: 'slot', slotName: 'time' },
|
|
|
{ prop: 'Q^kao_qin_zhuang_ta^SL', label: '考勤状态', fieldType: 'select', options: [{ value: '正常', label: '正常' }, { value: '异常', label: '异常' }] },
|
|
{ prop: 'Q^kao_qin_zhuang_ta^SL', label: '考勤状态', fieldType: 'select', options: [{ value: '正常', label: '正常' }, { value: '异常', label: '异常' }] },
|
|
|
{ prop: 'Q^yong_hu_id_^S', label: '姓名', fieldType: 'select', options: userOption },
|
|
{ prop: 'Q^yong_hu_id_^S', label: '姓名', fieldType: 'select', options: userOption },
|
|
|
{ prop: 'Q^bu_men_^SL', label: '部门', fieldType: 'select', options: deptOption }
|
|
{ prop: 'Q^bu_men_^SL', label: '部门', fieldType: 'select', options: deptOption }
|
|
@@ -105,6 +119,8 @@ export default {
|
|
|
computed: {
|
|
computed: {
|
|
|
},
|
|
},
|
|
|
created () {
|
|
created () {
|
|
|
|
|
+ const daterRange = this.getTodayDate()
|
|
|
|
|
+ this.daterRange = [daterRange.sDay, daterRange.eDay]
|
|
|
this.loadData()
|
|
this.loadData()
|
|
|
},
|
|
},
|
|
|
methods: {
|
|
methods: {
|
|
@@ -139,10 +155,38 @@ export default {
|
|
|
const { first, second } = this.$store.getters.level || {}
|
|
const { first, second } = this.$store.getters.level || {}
|
|
|
const searchParam = this.$refs['crud'] ? this.$refs['crud'].getSearcFormData() : {}
|
|
const searchParam = this.$refs['crud'] ? this.$refs['crud'].getSearcFormData() : {}
|
|
|
searchParam['Q^di_dian_^S'] = second || first
|
|
searchParam['Q^di_dian_^S'] = second || first
|
|
|
|
|
+ searchParam['Q^ri_qi_^DL'] = this.daterRange[0]
|
|
|
|
|
+ searchParam['Q^ri_qi_^DG'] = this.daterRange[1]
|
|
|
return ActionUtils.formatParams(searchParam, this.pagination, this.sorts)
|
|
return ActionUtils.formatParams(searchParam, this.pagination, this.sorts)
|
|
|
},
|
|
},
|
|
|
getSearchSql () {
|
|
getSearchSql () {
|
|
|
- let sql = `select * FROM t_attendance_detail`
|
|
|
|
|
|
|
+ let sql = `select
|
|
|
|
|
+ USER_ID_,
|
|
|
|
|
+ ri_qi_,
|
|
|
|
|
+ user_name_,
|
|
|
|
|
+ pos_name_,
|
|
|
|
|
+ gong_hao_,
|
|
|
|
|
+ MIN(da_ka_shi_jian_1_) AS zui_zao,
|
|
|
|
|
+ MAX(da_ka_shi_jian_2_) AS zui_wan,
|
|
|
|
|
+ SUM(ban_ci_shi_chang_) AS total_ban_ci_shi_chang,
|
|
|
|
|
+ SUM(gong_zuo_shi_chan) AS total_gong_zuo_shi_chan,
|
|
|
|
|
+ CASE
|
|
|
|
|
+ WHEN SUM(CASE WHEN zhuang_tai_1_ = '迟到' THEN 1 ELSE 0 END) +
|
|
|
|
|
+ SUM(CASE WHEN zhuang_tai_2_ = '迟到' THEN 1 ELSE 0 END) > 0
|
|
|
|
|
+ AND SUM(CASE WHEN zhuang_tai_1_ = '缺勤' OR zhuang_tai_1_ IS NULL THEN 1 ELSE 0 END) +
|
|
|
|
|
+ SUM(CASE WHEN zhuang_tai_2_ = '缺勤' OR zhuang_tai_2_ IS NULL THEN 1 ELSE 0 END) = 0
|
|
|
|
|
+ THEN CONCAT('迟到',
|
|
|
|
|
+ SUM(CASE WHEN zhuang_tai_1_ = '迟到' THEN 1 ELSE 0 END) +
|
|
|
|
|
+ SUM(CASE WHEN zhuang_tai_2_ = '迟到' THEN 1 ELSE 0 END), '次')
|
|
|
|
|
+ WHEN SUM(CASE WHEN zhuang_tai_1_ = '缺勤' OR zhuang_tai_1_ IS NULL THEN 1 ELSE 0 END) +
|
|
|
|
|
+ SUM(CASE WHEN zhuang_tai_2_ = '缺勤' OR zhuang_tai_2_ IS NULL THEN 1 ELSE 0 END) > 0
|
|
|
|
|
+ THEN CONCAT('缺勤',
|
|
|
|
|
+ SUM(CASE WHEN zhuang_tai_1_ = '缺勤' OR zhuang_tai_1_ IS NULL THEN 1 ELSE 0 END) +
|
|
|
|
|
+ SUM(CASE WHEN zhuang_tai_2_ = '缺勤' OR zhuang_tai_2_ IS NULL THEN 1 ELSE 0 END), '次')
|
|
|
|
|
+ ELSE '正常'
|
|
|
|
|
+ END AS kao_qin_zhuang_tai
|
|
|
|
|
+ FROM
|
|
|
|
|
+ v_attendance_statistics `
|
|
|
const params = this.getSearchFormData()
|
|
const params = this.getSearchFormData()
|
|
|
// 定义操作符映射
|
|
// 定义操作符映射
|
|
|
const operatorMap = {
|
|
const operatorMap = {
|
|
@@ -175,6 +219,7 @@ export default {
|
|
|
|
|
|
|
|
if (conditions.length > 0) {
|
|
if (conditions.length > 0) {
|
|
|
sql += ' WHERE ' + conditions.join(' AND ')
|
|
sql += ' WHERE ' + conditions.join(' AND ')
|
|
|
|
|
+ sql += ' GROUP BY USER_ID_, ri_qi_ ORDER BY ri_qi_ DESC,USER_ID_ '
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
// 添加分页
|
|
// 添加分页
|
|
@@ -190,7 +235,18 @@ export default {
|
|
|
ActionUtils.setSorts(this.sorts, sort)
|
|
ActionUtils.setSorts(this.sorts, sort)
|
|
|
this.loadData()
|
|
this.loadData()
|
|
|
},
|
|
},
|
|
|
-
|
|
|
|
|
|
|
+ getTodayDate () { // 获取初始化查询截止日期
|
|
|
|
|
+ const yesterday = new Date()
|
|
|
|
|
+ yesterday.setDate(yesterday.getDate() - 1) // 减去1天
|
|
|
|
|
+ const year = yesterday.getFullYear()
|
|
|
|
|
+ const month = String(yesterday.getMonth() + 1).padStart(2, '0') // 月份从0开始,需要+1
|
|
|
|
|
+ const day = String(yesterday.getDate()).padStart(2, '0')
|
|
|
|
|
+ const daterRange = {
|
|
|
|
|
+ sDay: `${year}-${month}-${day}`,
|
|
|
|
|
+ eDay: `${year}-${month}-${day}`
|
|
|
|
|
+ }
|
|
|
|
|
+ return daterRange
|
|
|
|
|
+ },
|
|
|
// 操作处理
|
|
// 操作处理
|
|
|
handleAction (command, _, selection) {
|
|
handleAction (command, _, selection) {
|
|
|
switch (command) {
|
|
switch (command) {
|