From b0d4df5f39525ae7fe252e8ee65d85fd71dca721 Mon Sep 17 00:00:00 2001
From: zouyu <2723363702@qq.com>
Date: 星期四, 07 五月 2026 14:53:32 +0800
Subject: [PATCH] 手动下单:检验中订单撤销报错问题修复
---
src/views/performance/attendance/index.vue | 175 +++++++++++++++++++++++++++++++++++++---------------------
1 files changed, 112 insertions(+), 63 deletions(-)
diff --git a/src/views/performance/attendance/index.vue b/src/views/performance/attendance/index.vue
index 3726bc0..c5865eb 100644
--- a/src/views/performance/attendance/index.vue
+++ b/src/views/performance/attendance/index.vue
@@ -30,12 +30,12 @@
</div>
</div>
<div class="search_thing">
- <el-button size="mini" type="primary" @click="refreshTable()"
- >鏌� 璇�</el-button
+ <el-button icon="el-icon-search" size="mini" type="primary" @click="refreshTable()">鏌� 璇�</el-button
>
- <el-button size="mini" @click="resetQuery">閲嶇疆</el-button>
- <el-button size="mini" type="primary" @click="openAddAttendanceDialog()">鎵嬪姩鏂板</el-button>
- <el-button size="mini" type="success" @click="openSyncAttendanceDialog()">鍚屾鑰冨嫟璁板綍</el-button>
+ <el-button icon="el-icon-refresh-left" size="mini" @click="resetQuery">閲嶇疆</el-button>
+ <el-button icon="el-icon-plus" size="mini" type="primary" @click="openAddAttendanceDialog()">鎵嬪姩鏂板</el-button>
+ <el-button icon="el-icon-refresh" size="mini" type="success" @click="openSyncAttendanceDialog()">鍚屾鑰冨嫟璁板綍</el-button>
+ <el-button plain icon="el-icon-download" size="mini" type="primary" @click="openAttendanceRecordDialog()">瀵煎嚭</el-button>
</div>
</div>
<div class="container">
@@ -64,14 +64,14 @@
</el-table-column>
<el-table-column prop="swingDate" label="鑰冨嫟鏃堕棿" min-width="150" width="150"></el-table-column>
<el-table-column label="绛惧叆/绛惧嚭鎯呭喌">
- <el-table-column prop="workDateTime" label="涓婄彮鏃堕棿" min-width="160" width="160">
+ <el-table-column prop="workDateTime" label="涓婄彮鏃堕棿" min-width="160" >
<template slot-scope="scope">
<el-tag type="success" v-if="scope.row.workDateTime && scope.row.workClockInState===1">{{ scope.row.workDateTime }}</el-tag>
<el-tag type="danger" v-else-if="scope.row.workDateTime && scope.row.workClockInState===0">{{ scope.row.workDateTime }}</el-tag>
<span v-else>{{ scope.row.workDateTime }}</span>
</template>
</el-table-column>
- <el-table-column prop="offWorkDateTime" label="涓嬬彮鏃堕棿" min-width="160" width="160">
+ <el-table-column prop="offWorkDateTime" label="涓嬬彮鏃堕棿" min-width="160" >
<template slot-scope="scope">
<el-tag type="success" v-if="scope.row.offWorkDateTime && scope.row.offClockInState===1">{{ scope.row.offWorkDateTime }}</el-tag>
<el-tag type="danger" v-else-if="scope.row.offWorkDateTime && scope.row.offClockInState===0">{{ scope.row.offWorkDateTime }}</el-tag>
@@ -80,19 +80,19 @@
</el-table-column>
</el-table-column>
<el-table-column label="鑰冨嫟鏃堕暱(h)">
- <el-table-column prop="plannedWorkHours" label="搴斿嫟鏃堕暱" min-width="80" width="80"></el-table-column>
- <el-table-column prop="actualWorkHours" label="瀹為檯鏃堕暱" min-width="80" width="80"></el-table-column>
- <el-table-column prop="absenceWorkHours" label="缂哄嫟鏃堕暱" min-width="80" width="80"></el-table-column>
+ <el-table-column prop="plannedWorkHours" label="搴斿嫟鏃堕暱" min-width="100" ></el-table-column>
+ <el-table-column prop="actualWorkHours" label="瀹為檯鏃堕暱" min-width="100"></el-table-column>
+ <el-table-column prop="absenceWorkHours" label="缂哄嫟鏃堕暱" min-width="100" ></el-table-column>
</el-table-column>
- <el-table-column prop="isSync" label="鏁版嵁鏉ユ簮" min-width="120">
+ <el-table-column prop="isSync" label="鏁版嵁鏉ユ簮" min-width="120" width="120">
<template slot-scope="scope">
<el-tag v-if="scope.row.isSync===0" type="success">ICC鍚屾</el-tag>
<el-tag v-else-if="scope.row.isSync===1" type="info">鎵嬪姩鏂板</el-tag>
</template>
</el-table-column>
- <el-table-column prop="createUser" label="鍒涘缓浜�" min-width="150" width="150" :formatter="(row)=>formatterUserName(row.createUser)"></el-table-column>
+ <el-table-column prop="createUser" label="鍒涘缓浜�" min-width="120" width="120" :formatter="(row)=>formatterUserName(row.createUser)"></el-table-column>
<el-table-column prop="createTime" label="鍒涘缓鏃堕棿" min-width="180" width="180"></el-table-column>
- <el-table-column prop="updateUser" label="鏇存柊浜�" min-width="150" width="150" :formatter="(row)=>formatterUserName(row.updateUser)"></el-table-column>
+ <el-table-column prop="updateUser" label="鏇存柊浜�" min-width="120" width="120" :formatter="(row)=>formatterUserName(row.updateUser)"></el-table-column>
<el-table-column prop="updateTime" label="鏇存柊鏃堕棿" min-width="180" width="180"></el-table-column>
<el-table-column fixed="right" width="180" label="鎿嶄綔">
<template slot-scope="scope">
@@ -114,7 +114,7 @@
title="杩涘嚭璁板綍"
:visible.sync="dialogVisible"
width="60%">
- <staff-clock-in-record :key="Math.random()" :query-params="clockInQueryParams" ></staff-clock-in-record>
+ <staff-clock-in-record :query-params="clockInQueryParams" @changeEnable="refreshTable()"></staff-clock-in-record>
</el-dialog>
<el-dialog
:title="attendanceForm.id?'缂栬緫鑰冨嫟璁板綍':'鏂板鑰冨嫟璁板綍'"
@@ -158,18 +158,11 @@
</el-select>
</el-form-item>
</el-col>
- <el-col :span="12">
-<!-- <el-form-item label="鑰冨嫟缁撴灉" prop="result">-->
-<!-- <el-select size="small" style="width:100%" clearable v-model="attendanceForm.result" placeholder="璇烽�夋嫨鑰冨嫟缁撴灉">-->
-<!-- <el-option v-for="(item,index) in resultList" :key="index" :label="item.label" :value="item.value"/>-->
-<!-- </el-select>-->
-<!-- </el-form-item>-->
- </el-col>
</el-row>
<el-divider content-position="left">绛惧叆/绛惧嚭鎯呭喌</el-divider>
<el-row>
<el-col :span="12">
- <el-form-item label="涓婄彮鏃堕棿" prop="workTime">
+ <el-form-item label="涓婄彮鏃堕棿" prop="workDateTime">
<el-time-picker
style="width:100%"
value-format="HH:mm"
@@ -180,7 +173,7 @@
</el-form-item>
</el-col>
<el-col :span="12">
- <el-form-item label="涓嬬彮鏃堕棿" prop="offWorkTime">
+ <el-form-item label="涓嬬彮鏃堕棿" prop="offWorkDateTime">
<el-time-picker
style="width:100%"
value-format="HH:mm"
@@ -218,21 +211,62 @@
<el-button type="primary" @click="confirmSyncAttendance">纭� 瀹�</el-button>
</span>
</el-dialog>
+ <el-dialog
+ title="瀵煎嚭鑰冨嫟璁板綍"
+ :visible.sync="attendanceRecordVisible"
+ width="40%">
+ <el-row>
+ <el-col :span="4">
+ <label>缁熻缁村害:</label>
+ </el-col>
+ <el-col :span="20">
+ <el-radio-group v-model="reportType" size="mini" disabled>
+ <el-radio label="YEAR">骞村害</el-radio>
+ <el-radio label="MONTH">鏈堝害</el-radio>
+ </el-radio-group>
+ </el-col>
+ </el-row>
+ <el-row style="margin-top:20px">
+ <el-col :span="4">
+ <label>缁熻鏃ユ湡:</label>
+ </el-col>
+ <el-col :span="20">
+ <el-date-picker
+ size="small"
+ v-model="reportDateRange"
+ style="width:100%"
+ @change="changeReportDateRange"
+ type="datetimerange"
+ value-format="yyyy-MM-dd HH:mm:ss"
+ :default-time="['00:00:00','23:59:59']"
+ range-separator="鑷�"
+ start-placeholder="寮�濮嬫棩鏈�"
+ end-placeholder="缁撴潫鏃ユ湡">
+ </el-date-picker>
+ </el-col>
+ </el-row>
+ <span slot="footer" class="dialog-footer">
+ <el-button @click="attendanceRecordVisible = false">鍙� 娑�</el-button>
+ <el-button :loading="exportLoading" type="primary" @click="exportStaffAttendanceRecords()">纭� 瀹�</el-button>
+ </span>
+ </el-dialog>
</div>
</template>
<script>
import StaffClockInRecord from "./components/staffClockInRecord.vue";
-import {selectAllUser} from '@/api/system/user'
+import {selectUserListByPerformance} from '@/api/system/user'
import {
pageAttendanceRecord,
checkDutyDate,
saveOrUpdateStaffAttendanceTrackingRecord,
removeStaffAttendanceTrackingRecord,
- syncAttendanceRecord
+ syncAttendanceRecord,
+ exportStaffAttendanceRecords
} from '@/api/performance/attendance'
import {getDicts} from "@/api/system/dict/data";
-import dayjs from 'dayjs';
+import {getTimeRange,isOverOneMonth} from "@/utils/date";
+import {transformExcel} from '@/utils/file'
export default {
name: "Attendance",
components: {
@@ -240,8 +274,12 @@
},
data() {
return {
+ reportDateRange:[],
+ reportType:"MONTH",
+ attendanceRecordVisible:false,
syncDateRange:[],
syncAttendanceVisible: false,
+ exportLoading: false,
attendanceForm:{
workDataId: null,
offWorkDataId: null,
@@ -306,7 +344,7 @@
this.selectEnumByCategory()
this.getUserList()
this.getTableHeight();
- this.dateRange = this.getTimeRange()
+ this.dateRange = getTimeRange()
this.resizeHandler = this.debounce(() => {
this.getTableHeight();
}, 200);
@@ -320,6 +358,41 @@
window.removeEventListener("resize",this.resizeHandler)
},
methods: {
+ changeReportDateRange(val){
+ //鍒ゆ柇鏃堕棿鍖洪棿鏄惁瓒呰繃涓�涓湀
+ if(val && val.length===2){
+ const flag = isOverOneMonth(val[0],val[1]);
+ this.reportType = flag?'YEAR':'MONTH'
+ }
+ },
+ openAttendanceRecordDialog (){
+ this.reportDateRange = getTimeRange()
+ this.$nextTick(()=>{
+ this.attendanceRecordVisible = true
+ })
+ },
+ //瀵煎嚭鑰冨嫟璁板綍
+ exportStaffAttendanceRecords(){
+ this.exportLoading = true
+ let params = {
+ attendanceReportType:this.reportType,
+ }
+ if (this.reportDateRange && this.reportDateRange.length === 2) {
+ params.startDate = this.reportDateRange[0];
+ params.endDate = this.reportDateRange[1];
+ } else {
+ params.startDate = "";
+ params.endDate = "";
+ }
+ exportStaffAttendanceRecords({...params}).then(res=>{
+ transformExcel(res, "涓ぉ鑰愪笣璐ㄩ噺鑰冨嫟姹囨��.xlsx")
+ this.$message.success("瀵煎嚭鎴愬姛")
+ }).catch(error=>{
+ console.error(error)
+ }).finally(()=>{
+ this.exportLoading = false
+ })
+ },
getShiftByDic(e) {
let obj = this.dailyTypeList.find((m) => m.dictValue == e);
if (obj) {
@@ -339,35 +412,7 @@
this.dailyTypeList = response.data;
});
},
- /**
- * 鍒濆鍖栭粯璁ゆ棩鏈熻寖鍥达細杩戜竴涓湀锛堝綋鍓嶆棩鏈� - 30澶� 鑷� 褰撳墠鏃ユ湡锛�
- */
- getTimeRange(format = 'YYYY-MM-DD HH:mm:ss') {
- // 鑾峰彇褰撳墠鏃堕棿
- const now = dayjs();
- // 鑾峰彇褰撳墠鏃ユ湡鐨勩�屾棩銆嶏紙1-31锛�
- const currentDate = now.date();
- let startTime, endTime;
-
- // 鏍稿績閫昏緫锛氬垽鏂綋鍓嶆棩鏈熸槸鍚﹀ぇ浜�25鍙�
- if (currentDate > 25) {
- // 鉁� 鎯呭喌1锛氬綋鍓嶆棩>25 鈫� 褰撴湀26鍙� ~ 娆℃湀25鍙�
- startTime = now.startOf('month').add(25, 'day'); // 褰撴湀1鍙� +25澶� = 26鍙�
- endTime = startTime.add(1, 'month').date(25).hour(23)
- .minute(59)
- .second(59); // 娆℃湀25鍙凤紙dayjs鑷姩澶勭悊璺ㄥ勾锛�
- } else {
- // 鉁� 鎯呭喌2锛氬綋鍓嶆棩鈮�25 鈫� 涓婃湀26鍙� ~ 褰撴湀25鍙�
- startTime = now.subtract(1, 'month').startOf('month').add(25, 'day'); // 涓婃湀26鍙�
- endTime = now.date(25).hour(23)
- .minute(59)
- .second(59); // 褰撴湀25鍙�
- }
-
- // 杩斿洖鏍煎紡鍖栧悗鐨勬椂闂存暟缁�
- return [startTime.format(format), endTime.format(format)];
- },
//鍚屾鑰冨嫟璁板綍
confirmSyncAttendance(){
if(!this.syncDateRange || this.syncDateRange.length<2){
@@ -391,7 +436,10 @@
},
//鎵撳紑鍚屾鑰冨嫟璁板綍寮规
openSyncAttendanceDialog(){
- this.syncAttendanceVisible = true
+ this.syncDateRange = getTimeRange()
+ this.$nextTick(()=>{
+ this.syncAttendanceVisible = true
+ })
},
//鍒犻櫎鑰冨嫟璁板綍
confirmRemoveRecord(row){
@@ -492,11 +540,12 @@
openAddAttendanceDialog(row){
if(row){
//澶勭悊涓�/涓嬬彮鏃堕棿鏍煎紡
- let workTime = row.workDateTime&&row.workDateTime.length>8?row.workDateTime.substring(11,16):row.workDateTime
- let offWorkTime = row.offWorkDateTime&&row.offWorkDateTime.length>8?row.offWorkDateTime.substring(11,16):row.offWorkDateTime
- row.workDateTime = workTime
- row.offWorkDateTime = offWorkTime
- this.attendanceForm = {...row}
+ let formData = {...row}
+ let workTime = formData.workDateTime&&formData.workDateTime.length>8?formData.workDateTime.substring(11,16):formData.workDateTime
+ let offWorkTime = formData.offWorkDateTime&&formData.offWorkDateTime.length>8?formData.offWorkDateTime.substring(11,16):formData.offWorkDateTime
+ formData.workDateTime = workTime
+ formData.offWorkDateTime = offWorkTime
+ this.attendanceForm = formData
}
this.addAttendanceVisible = true
},
@@ -573,7 +622,7 @@
},
//鏌ヨ鐢ㄦ埛鍒楄〃
getUserList(){
- selectAllUser().then(res=>{
+ selectUserListByPerformance().then(res=>{
this.userList = res.data
}).catch(error=>{
console.error(error)
@@ -581,7 +630,7 @@
},
//閲嶇疆鎸夐挳
resetQuery() {
- this.dateRange = this.getTimeRange();
+ this.dateRange = getTimeRange();
this.queryParams = {
startDate: "",
endDate: "",
--
Gitblit v1.9.3