瀏覽代碼

fix: 更新生产环境API地址,修改.gitignore以忽略新文件,优化考勤服务中的距离计算和状态处理,调整考勤打卡页面的状态显示逻辑,提升用户体验。

master
lizhuang 1 周之前
父節點
當前提交
b6ef9392d9
共有 5 個文件被更改,包括 47 次插入40 次删除
  1. 1
    1
      .env.production
  2. 1
    0
      .gitignore
  3. 1
    1
      src/router/index.js
  4. 36
    36
      src/utils/attendance/AttendanceService.js
  5. 8
    2
      src/views/m/checkin/index.vue

+ 1
- 1
.env.production 查看文件

@@ -14,7 +14,7 @@ VUE_APP_MONITRO_ADMIN = '/admin/login'
VUE_APP_XXL_JOB_ADMIN = '/xxl-job-admin'

# 逐世管理系统/生产环境
VUE_APP_BASE_API = '/prod-api'
VUE_APP_BASE_API = 'https://digital.sohomall.jp/prod-api'

# 积木报表
VUE_APP_JMREPORT_URL = '/jmreport'

+ 1
- 0
.gitignore 查看文件

@@ -21,3 +21,4 @@ selenium-debug.log

package-lock.json
yarn.lock
.cursorrules

+ 1
- 1
src/router/index.js 查看文件

@@ -91,7 +91,7 @@ export const constantRoutes = [
{
path: '/m/checkin',
component: () => import('@/views/m/checkin'),
hidden: true
meta: { title: '考勤打卡', icon: 'date' }
},
]


+ 36
- 36
src/utils/attendance/AttendanceService.js 查看文件

@@ -33,20 +33,22 @@ export class AttendanceService {
* @param {number} lng1 经度1
* @param {number} lat2 纬度2
* @param {number} lng2 经度2
* @returns {number} 距离,单位为公里
* @returns {number} 距离,
*/
static calculateDistance(lat1, lng1, lat2, lng2) {
const R = 6371 // 地球半径
const R = 6371000 // 地球半径,单位:米
const dLat = (lat2 - lat1) * (Math.PI / 180)
const dLng = (lng2 - lng1) * (Math.PI / 180)
const a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
Math.cos(lat1 * (Math.PI / 180)) *
Math.cos(lat2 * (Math.PI / 180)) *
Math.sin(dLng / 2) * Math.sin(dLng / 2)

const a =
Math.sin(dLat / 2) * Math.sin(dLat / 2) +
Math.cos(lat1 * (Math.PI / 180)) *
Math.cos(lat2 * (Math.PI / 180)) *
Math.sin(dLng / 2) *
Math.sin(dLng / 2)

const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a))
return R * c
return R * c // 返回单位:米
}

/**
@@ -58,11 +60,11 @@ export class AttendanceService {
static isInAttendanceRange(userLocation, attendanceGroup) {
const { latitude, longitude } = userLocation
const { lat, lng, radius } = attendanceGroup
if (!latitude || !longitude || !lat || !lng) {
return false
}
const distance = this.calculateDistance(latitude, longitude, lat, lng)
return distance <= radius
}
@@ -75,10 +77,10 @@ export class AttendanceService {
static compareTimeWithSchedule(scheduleTime) {
const now = new Date()
const [scheduleHour, scheduleMinute] = scheduleTime.split(':').map(Number)
const currentMinutes = now.getHours() * 60 + now.getMinutes()
const scheduleMinutes = scheduleHour * 60 + scheduleMinute
return Math.sign(currentMinutes - scheduleMinutes)
}

@@ -114,7 +116,7 @@ export class AttendanceService {
[PUNCH_STATUS.EARLY_OUT]: '早退打卡',
[PUNCH_STATUS.UPDATE_OUT]: '更新打卡'
}
return statusTexts[status] || '未打卡'
}

@@ -143,17 +145,17 @@ export class AttendanceService {
*/
static buildPunchData(params) {
const { type, userInfo, userLocation, remark } = params
const statusMap = {
morning: PUNCH_STATUS.CHECKED_IN,
evening: PUNCH_STATUS.CHECKED_OUT,
morning_late: PUNCH_STATUS.LATE_IN,
evening_early: PUNCH_STATUS.EARLY_OUT
}
const isClockIn = type.includes('morning')
const currentTime = this.formatDateTime(new Date())
return {
userId: userInfo.userId,
userName: userInfo.nickName,
@@ -178,17 +180,14 @@ export class AttendanceService {
clockInStatus: PUNCH_STATUS.NOT_CHECKED,
clockOutStatus: PUNCH_STATUS.NOT_CHECKED
}
records.forEach(record => {
if (record.checkInType === PUNCH_TYPE.CLOCK_IN) {
attendanceStatus.clockInTime = record.checkInTime
attendanceStatus.clockInStatus = parseInt(record.checkInStatus)
} else if (record.checkInType === PUNCH_TYPE.CLOCK_OUT) {
attendanceStatus.clockOutTime = record.checkInTime
attendanceStatus.clockOutStatus = parseInt(record.checkInStatus)
}

records.forEach((record) => {
attendanceStatus.clockInTime = record.clockIn
attendanceStatus.clockInStatus = parseInt(record.clockInStatus)
attendanceStatus.clockOutTime = record.clockOut
attendanceStatus.clockOutStatus = parseInt(record.clockOutStatus || 0)
})

return attendanceStatus
}

@@ -199,15 +198,15 @@ export class AttendanceService {
*/
static async getAttendanceGroup(userId) {
const response = await queryAttendanceGroupByUserId({ userId })
if (response.code !== 200) {
throw new Error(response.msg || '获取考勤组信息失败')
}
if (!response.data) {
throw new Error('未配置考勤组,请联系管理员')
}
return response.data
}

@@ -218,11 +217,11 @@ export class AttendanceService {
*/
static async getTodayAttendance(userId) {
const response = await getCurrentDayRecord({ userId })
if (response.code !== 200) {
throw new Error(response.msg || '获取考勤状态失败')
}
return response.data || []
}

@@ -232,13 +231,14 @@ export class AttendanceService {
* @returns {Promise<Object>} API响应
*/
static async submitPunch(punchData) {
const apiCall = punchData.checkInType === PUNCH_TYPE.CLOCK_IN ? checkIn : checkOut
const apiCall =
punchData.checkInType === PUNCH_TYPE.CLOCK_IN ? checkIn : checkOut
const response = await apiCall(punchData)
if (response.code !== 200) {
throw new Error(response.msg || '打卡失败')
}
return response
}
}
}

+ 8
- 2
src/views/m/checkin/index.vue 查看文件

@@ -162,10 +162,16 @@ export default {
punchButtonText() {
const { clockInStatus, clockOutStatus } = this.attendanceStatus

if (clockInStatus === PUNCH_STATUS.NOT_CHECKED) {
console.log(this.attendanceStatus)

if (clockInStatus == PUNCH_STATUS.NOT_CHECKED) {
return '上班打卡'
}
if (clockOutStatus === PUNCH_STATUS.NOT_CHECKED) {
if (
clockOutStatus == PUNCH_STATUS.NOT_CHECKED ||
clockOutStatus == PUNCH_STATUS.CHECKED_OUT ||
clockOutStatus == PUNCH_STATUS.LATE_IN
) {
return '下班打卡'
}
return '已打卡'

Loading…
取消
儲存