|
|
@@ -13,8 +13,6 @@
|
|
|
:pagination="pagination"
|
|
|
:loading="loading"
|
|
|
:index-row="false"
|
|
|
- :show-checkbox="true"
|
|
|
- :row-key="pkKey"
|
|
|
@action-event="handleAction"
|
|
|
@sort-change="handleSortChange"
|
|
|
@pagination-change="handlePaginationChange"
|
|
|
@@ -83,21 +81,22 @@
|
|
|
<el-table-column
|
|
|
key="paiBanMingChen"
|
|
|
prop="paiBanMingChen"
|
|
|
- label="排班名称"
|
|
|
+ label="配置名称"
|
|
|
min-width="140"
|
|
|
/>
|
|
|
<el-table-column
|
|
|
key="banCiMing"
|
|
|
prop="banCiMing"
|
|
|
- label="班次名称"
|
|
|
- width="100"
|
|
|
+ label="排班类型"
|
|
|
+ width="140"
|
|
|
/>
|
|
|
+ <!--
|
|
|
<el-table-column
|
|
|
key="banCiBieMing"
|
|
|
prop="banCiBieMing"
|
|
|
label="班次别名"
|
|
|
width="100"
|
|
|
- />
|
|
|
+ />-->
|
|
|
</el-table-column>
|
|
|
<el-table-column key="riQi" prop="riQi" label="日期" width="100" />
|
|
|
<!-- 上班分组 -->
|
|
|
@@ -128,7 +127,7 @@
|
|
|
>
|
|
|
{{
|
|
|
(!row.daKaShiJian1 && row.banCiMing != '休息')
|
|
|
- ? '缺勤'
|
|
|
+ ? '未打卡'
|
|
|
: row.zhuangTai1 === '异常'
|
|
|
? '迟到'
|
|
|
: row.zhuangTai1
|
|
|
@@ -165,9 +164,9 @@
|
|
|
>
|
|
|
{{
|
|
|
(!row.daKaShiJian2 && row.banCiMing != '休息')
|
|
|
- ? '缺勤'
|
|
|
+ ? '未打卡'
|
|
|
: row.zhuangTai2 === '异常'
|
|
|
- ? '迟到'
|
|
|
+ ? '早退'
|
|
|
: row.zhuangTai2
|
|
|
}}
|
|
|
</span>
|
|
|
@@ -202,13 +201,62 @@
|
|
|
</span>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
+
|
|
|
+ <!-- 操作列:仅质量负责人可见 -->
|
|
|
+ <el-table-column
|
|
|
+ v-if="isQualityManager"
|
|
|
+ label="操作"
|
|
|
+ width="90"
|
|
|
+ fixed="right"
|
|
|
+ >
|
|
|
+ <template #default="{ row }">
|
|
|
+ <el-button type="text" size="small" @click="openEditDialog(row)">
|
|
|
+ 编辑
|
|
|
+ </el-button>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
</template>
|
|
|
</ibps-crud>
|
|
|
+
|
|
|
+ <!-- 编辑上下班时间的弹窗 -->
|
|
|
+ <el-dialog
|
|
|
+ title="修改上下班时间"
|
|
|
+ :visible.sync="editDialogVisible"
|
|
|
+ width="500px"
|
|
|
+ @close="closeEditDialog"
|
|
|
+ >
|
|
|
+ <el-form :model="editForm" label-width="120px" size="small">
|
|
|
+ <el-form-item label="上班打卡时间">
|
|
|
+ <el-date-picker
|
|
|
+ v-model="editForm.daKaShiJian1"
|
|
|
+ type="datetime"
|
|
|
+ placeholder="选择上班打卡时间"
|
|
|
+ value-format="yyyy-MM-dd HH:mm:ss"
|
|
|
+ style="width: 100%"
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="下班打卡时间">
|
|
|
+ <el-date-picker
|
|
|
+ v-model="editForm.daKaShiJian2"
|
|
|
+ type="datetime"
|
|
|
+ placeholder="选择下班打卡时间"
|
|
|
+ value-format="yyyy-MM-dd HH:mm:ss"
|
|
|
+ style="width: 100%"
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+ </el-form>
|
|
|
+ <span slot="footer" class="dialog-footer">
|
|
|
+ <el-button @click="editDialogVisible = false">取消</el-button>
|
|
|
+ <el-button type="primary" :loading="saveLoading" @click="saveEditTime">
|
|
|
+ 确认
|
|
|
+ </el-button>
|
|
|
+ </span>
|
|
|
+ </el-dialog>
|
|
|
</div>
|
|
|
</template>
|
|
|
|
|
|
<script>
|
|
|
-import { queryAttendanceDetail, removeAttendanceDetail } from '@/api/business/attendance'
|
|
|
+import { queryAttendanceDetail, gdUpdateAttendce,removeAttendanceDetail } from '@/api/business/attendance'
|
|
|
import ibpsUserSelector from '@/business/platform/org/selector'
|
|
|
import FixHeight from '@/mixins/height'
|
|
|
import IbpsExport from '@/plugins/export'
|
|
|
@@ -233,7 +281,7 @@ export default {
|
|
|
userOption,
|
|
|
deptOption,
|
|
|
title: '考勤明细',
|
|
|
- pkKey: 'id', // 主键对应数据库字段
|
|
|
+ pkKey: 'id_', // 主键对应数据库字段
|
|
|
loading: true,
|
|
|
height: document.clientHeight,
|
|
|
listData: [],
|
|
|
@@ -254,14 +302,16 @@ export default {
|
|
|
userType: 'position'
|
|
|
}
|
|
|
],
|
|
|
- sorts: {},
|
|
|
+ sorts:{
|
|
|
+ "ri_qi_": "DESC"
|
|
|
+ },
|
|
|
daterRange: [],
|
|
|
searchXinMing: '',
|
|
|
pickerOptions: {
|
|
|
disabledDate(time) {
|
|
|
const today = new Date()
|
|
|
today.setHours(0, 0, 0, 0)
|
|
|
- // 禁用未来的日期
|
|
|
+ // 禁用今天及未来的日期
|
|
|
return time.getTime() > today.getTime()
|
|
|
}
|
|
|
},
|
|
|
@@ -312,9 +362,9 @@ export default {
|
|
|
fieldType: 'select',
|
|
|
options: deptOption
|
|
|
},
|
|
|
- { prop: 'Q^pai_ban_ming_chen^SL', label: '排班名称' },
|
|
|
- { prop: 'Q^ban_ci_ming_^SL', label: '班次名称' },
|
|
|
- { prop: 'Q^ban_ci_bie_ming_^SL', label: '班次别名' },
|
|
|
+ { prop: 'Q^pai_ban_ming_chen^SL', label: '配置名称' },
|
|
|
+ { prop: 'Q^ban_ci_ming_^SL', label: '排班类型' },
|
|
|
+ //{ prop: 'Q^ban_ci_bie_ming_^SL', label: '班次别名' },
|
|
|
{
|
|
|
prop: '',
|
|
|
label: '日期范围',
|
|
|
@@ -324,10 +374,19 @@ export default {
|
|
|
]
|
|
|
},
|
|
|
columns: []
|
|
|
- }
|
|
|
+ },
|
|
|
+ // 编辑弹窗相关
|
|
|
+ editDialogVisible: false,
|
|
|
+ currentEditRow: null, // 当前正在编辑的行数据
|
|
|
+ editForm: {
|
|
|
+ id: '',
|
|
|
+ daKaShiJian1: '',
|
|
|
+ daKaShiJian2: ''
|
|
|
+ },
|
|
|
+ saveLoading: false
|
|
|
}
|
|
|
},
|
|
|
- computed: {
|
|
|
+ computed: {
|
|
|
computedDateRange: {
|
|
|
get() {
|
|
|
return this.daterRange;
|
|
|
@@ -335,6 +394,11 @@ export default {
|
|
|
set(newValue) {
|
|
|
this.daterRange = newValue || [];
|
|
|
}
|
|
|
+ },
|
|
|
+ // 判断当前用户是否为质量负责人
|
|
|
+ isQualityManager() {
|
|
|
+ const userInfo = this.$store.getters.userInfo
|
|
|
+ return userInfo.role.some(role => role.alias === 'zlfzr') || userInfo.role.some(role => role.alias === 'xtgljs')
|
|
|
}
|
|
|
},
|
|
|
created() {
|
|
|
@@ -348,11 +412,9 @@ export default {
|
|
|
.then((res) => {
|
|
|
this.listData = res.data.dataResult
|
|
|
if (this.listData.length > 0) {
|
|
|
- // 做部门和姓名处理
|
|
|
this.listData.forEach((item) => {
|
|
|
item.userName = this.getUserLabel(item.yongHuId)
|
|
|
item.deptName = this.getDeptLabel(item.buMen)
|
|
|
- // 考勤状态-缺勤
|
|
|
if (item.kaoQinZhuangTa === '') {
|
|
|
if(item.banCiMing == '休息'){
|
|
|
item.kaoQinZhuangTa = '无需打卡'
|
|
|
@@ -385,7 +447,7 @@ export default {
|
|
|
? this.$refs['crud'].getSearcFormData()
|
|
|
: {}
|
|
|
searchParam['Q^di_dian_^S'] = second || first
|
|
|
- searchParam['Q^ri_qi_^DG'] = this.getYesterday()
|
|
|
+ searchParam['Q^ri_qi_^DG'] = this.getToday()
|
|
|
if (this.daterRange.length > 0) {
|
|
|
searchParam['Q^ri_qi_^DL'] = this.getPrevDateString(this.daterRange[0])
|
|
|
searchParam['Q^ri_qi_^DG'] = this.daterRange[1]
|
|
|
@@ -420,8 +482,8 @@ export default {
|
|
|
break
|
|
|
}
|
|
|
},
|
|
|
- // 删除记录
|
|
|
- handleRemove(selection) {
|
|
|
+ // 删除记录
|
|
|
+ handleRemove(selection) {
|
|
|
if (!selection || selection.length === 0) {
|
|
|
ActionUtils.warning('请至少选择一条记录')
|
|
|
return
|
|
|
@@ -453,87 +515,35 @@ export default {
|
|
|
// 导出数据
|
|
|
exportData() {
|
|
|
const exportColumns = [
|
|
|
- {
|
|
|
- field_name: 'userName',
|
|
|
- label: '姓名',
|
|
|
- name: 'userName'
|
|
|
- },
|
|
|
- {
|
|
|
- field_name: 'deptName',
|
|
|
- label: '部门',
|
|
|
- name: 'deptName'
|
|
|
- },
|
|
|
- {
|
|
|
- field_name: 'gongHao',
|
|
|
- label: '工号',
|
|
|
- name: 'gongHao'
|
|
|
- },
|
|
|
+ { field_name: 'userName', label: '姓名', name: 'userName' },
|
|
|
+ { field_name: 'deptName', label: '部门', name: 'deptName' },
|
|
|
+ { field_name: 'gongHao', label: '工号', name: 'gongHao' },
|
|
|
{
|
|
|
field_name: 'paiBanMingChen',
|
|
|
- label: '排班名称',
|
|
|
+ label: '配置名称',
|
|
|
name: 'paiBanMingChen'
|
|
|
},
|
|
|
- {
|
|
|
- field_name: 'banCiMing',
|
|
|
- label: '班次名称',
|
|
|
- name: 'banCiMing'
|
|
|
- },
|
|
|
- {
|
|
|
- field_name: 'banCiBieMing',
|
|
|
- label: '班次别名',
|
|
|
- name: 'banCiBieMing'
|
|
|
- },
|
|
|
- {
|
|
|
- field_name: 'riQi',
|
|
|
- label: '日期',
|
|
|
- name: 'riQi'
|
|
|
- },
|
|
|
- {
|
|
|
- field_name: 'daKaShiJian1',
|
|
|
- label: '上班打卡时间',
|
|
|
- name: 'daKaShiJian1'
|
|
|
- },
|
|
|
- {
|
|
|
- field_name: 'zhuangTai1',
|
|
|
- label: '上班打卡状态',
|
|
|
- name: 'zhuangTai1'
|
|
|
- },
|
|
|
- {
|
|
|
- field_name: 'daKaShiJian2',
|
|
|
- label: '下班打卡时间',
|
|
|
- name: 'daKaShiJian2'
|
|
|
- },
|
|
|
- {
|
|
|
- field_name: 'zhuangTai2',
|
|
|
- label: '下班打卡状态',
|
|
|
- name: 'zhuangTai2'
|
|
|
- },
|
|
|
- {
|
|
|
- field_name: 'chiDaoShiChang',
|
|
|
- label: '迟到时长(分钟)',
|
|
|
- name: 'chiDaoShiChang'
|
|
|
- },
|
|
|
- {
|
|
|
- field_name: 'daKaCiShu',
|
|
|
- label: '打卡次数',
|
|
|
- name: 'daKaCiShu'
|
|
|
- },
|
|
|
- {
|
|
|
- field_name: 'kaoQinZhuangTa',
|
|
|
- label: '考勤状态',
|
|
|
- name: 'kaoQinZhuangTa'
|
|
|
- }
|
|
|
+ { field_name: 'banCiMing', label: '排班类型', name: 'banCiMing' },
|
|
|
+ //{ field_name: 'banCiBieMing', label: '班次别名', name: 'banCiBieMing' },
|
|
|
+ { field_name: 'riQi', label: '日期', name: 'riQi' },
|
|
|
+ { field_name: 'daKaShiJian1', label: '上班打卡时间', name: 'daKaShiJian1' },
|
|
|
+ { field_name: 'zhuangTai1', label: '上班打卡状态', name: 'zhuangTai1' },
|
|
|
+ { field_name: 'daKaShiJian2', label: '下班打卡时间', name: 'daKaShiJian2' },
|
|
|
+ { field_name: 'zhuangTai2', label: '下班打卡状态', name: 'zhuangTai2' },
|
|
|
+ { field_name: 'chiDaoShiChang', label: '迟到时长(分钟)', name: 'chiDaoShiChang' },
|
|
|
+ { field_name: 'daKaCiShu', label: '打卡次数', name: 'daKaCiShu' },
|
|
|
+ { field_name: 'kaoQinZhuangTa', label: '考勤状态', name: 'kaoQinZhuangTa' }
|
|
|
]
|
|
|
this.handleExport(exportColumns, this.listData, `考勤明细统计数据`)
|
|
|
},
|
|
|
- getYesterday(){
|
|
|
+ getToday(){
|
|
|
const date = new Date(this.$common.getDateNow())
|
|
|
date.setDate(date.getDate())
|
|
|
return date.toISOString().split('T')[0]
|
|
|
},
|
|
|
getPrevDateString(riqi) {
|
|
|
const previousDay = new Date(riqi)
|
|
|
- previousDay.setDate(previousDay.getDate() - 1); // 减去1天
|
|
|
+ previousDay.setDate(previousDay.getDate() - 1);
|
|
|
return [previousDay.getFullYear(),
|
|
|
String(previousDay.getMonth() + 1).padStart(2, '0'),
|
|
|
String(previousDay.getDate()).padStart(2, '0')
|
|
|
@@ -553,6 +563,48 @@ export default {
|
|
|
const msg = message || '导出成功'
|
|
|
ActionUtils.success(msg)
|
|
|
})
|
|
|
+ },
|
|
|
+
|
|
|
+ // ========= 编辑上下班时间相关方法 =========
|
|
|
+ openEditDialog(row) {
|
|
|
+ this.currentEditRow = row
|
|
|
+ this.editForm = {
|
|
|
+ id: row.id,
|
|
|
+ daKaShiJian1: row.daKaShiJian1 || '',
|
|
|
+ daKaShiJian2: row.daKaShiJian2 || ''
|
|
|
+ }
|
|
|
+ this.editDialogVisible = true
|
|
|
+ },
|
|
|
+ closeEditDialog() {
|
|
|
+ this.editDialogVisible = false
|
|
|
+ this.currentEditRow = null
|
|
|
+ this.editForm = { id:'',daKaShiJian1: '', daKaShiJian2: '' }
|
|
|
+ },
|
|
|
+ saveEditTime() {
|
|
|
+ if (!this.currentEditRow) return
|
|
|
+ this.saveLoading = true
|
|
|
+ // 调用 gdUpdateAttendce 接口,传递需要更新的字段
|
|
|
+ const postData = {
|
|
|
+ id: this.editForm.id, // 主键字段名 id_
|
|
|
+ daKaShiJian1: this.editForm.daKaShiJian1,
|
|
|
+ daKaShiJian2: this.editForm.daKaShiJian2
|
|
|
+ }
|
|
|
+ gdUpdateAttendce(postData)
|
|
|
+ .then(() => {
|
|
|
+ this.$message.success('修改成功')
|
|
|
+ this.editDialogVisible = false
|
|
|
+ // 刷新列表以显示最新数据
|
|
|
+ this.loadData()
|
|
|
+ })
|
|
|
+ .catch((err) => {
|
|
|
+ console.error(err)
|
|
|
+ if(!err.cause){
|
|
|
+ this.$message.error('修改异常')
|
|
|
+ }
|
|
|
+ })
|
|
|
+ .finally(() => {
|
|
|
+ this.saveLoading = false
|
|
|
+ })
|
|
|
}
|
|
|
}
|
|
|
}
|