package com.xw.yunwei.model import android.os.Parcelable import com.google.gson.annotations.SerializedName import com.xw.yunwei.extension.dateChangePattern import kotlinx.parcelize.Parcelize import java.util.Calendar /** * 打卡状态VO * 包含上下班打卡状态及关联的打卡地址、班次信息 */ @Parcelize data class ClockInStatusModel( /** * 是否已上班打卡 */ @SerializedName("clockIn") val clockIn: Boolean? = null, /** * 是否已下班打卡 */ @SerializedName("clockOut") val clockOut: Boolean? = null, /** * 打卡地址信息 */ @SerializedName("xpCheckLocation") val xpCheckLocation: XpCheckLocationVO? = null, /** * 班次信息 */ @SerializedName("xpShift") val xpShift: XpShiftVO? = null, /** * 打卡信息 */ @SerializedName("xpClockIn") val xpClockIn: XpClockInVO? = null ) : Parcelable { //是否需要上班打卡 fun needWorkCheckIn(): Boolean { if (clockIn == true) { return false } return xpClockIn?.hadLostWorkCheckedIn() != true } //是否需要下班打卡 fun needOffWorkCheckIn(): Boolean { if (clockOut == true) { return false } return xpClockIn?.hadLostOffWorkCheckedIn() != true } //是否配置打卡信息 fun hadConfigCheckInfo(): Boolean { return (xpShift?.id ?: 0) > 0 } } /** * 打卡地址管理VO */ @Parcelize data class XpCheckLocationVO( /** * 记录创建人(前端忽略) */ @SerializedName("createBy") val createBy: String? = null, /** * 记录创建时间(前端忽略) */ @SerializedName("createTime") val createTime: String? = null, /** * 是否删除:false-未删除,true-已删除 */ @SerializedName("deleted") val deleted: Boolean? = null, /** * 地址ID */ @SerializedName("id") val id: Long? = null, /** * 打卡地址 */ @SerializedName("locationAddress") val locationAddress: String? = null, /** * 纬度 */ @SerializedName("locationLat") val locationLat: Double? = null, /** * 经度 */ @SerializedName("locationLon") val locationLon: Double? = null, /** * 打卡范围(米) */ @SerializedName("locationRange") val locationRange: Double? = null, /** * 状态 * 1 = 启用 * 0 = 禁用 */ @SerializedName("status") val status: Int? = null, /** * 记录修改人(前端忽略) */ @SerializedName("upStringBy") val upStringBy: String? = null, /** * 记录修改时间(前端忽略) */ @SerializedName("upStringTime") val upStringTime: String? = null ) : Parcelable /** * 班次管理VO */ @Parcelize data class XpShiftVO( /** * 记录创建人(前端忽略) */ @SerializedName("createBy") val createBy: String? = null, /** * 记录创建时间(前端忽略) */ @SerializedName("createTime") val createTime: String? = null, /** * 是否删除:false-未删除,true-已删除 */ @SerializedName("deleted") val deleted: Boolean? = null, /** * 结束时间(HH:mm 格式) */ @SerializedName("endTime") val endTime: String? = null, /** * 班次ID */ @SerializedName("id") val id: Long? = null, /** * 是否开启休息 * true = 是 * false = 否 */ @SerializedName("isRest") val isRest: Boolean? = null, /** * 休息结束时间(HH:mm 格式) */ @SerializedName("restEndTime") val restEndTime: String? = null, /** * 休息开始时间(HH:mm 格式) */ @SerializedName("restStartTime") val restStartTime: String? = null, /** * 班次颜色(色号,如 #FF5733) */ @SerializedName("shiftColor") val shiftColor: String? = null, /** * 班次名称 */ @SerializedName("shiftName") val shiftName: String? = null, /** * 开始时间(HH:mm 格式) */ @SerializedName("startTime") val startTime: String? = null, /** * 记录修改人(前端忽略) */ @SerializedName("upStringBy") val upStringBy: String? = null, /** * 记录修改时间(前端忽略) */ @SerializedName("upStringTime") val upStringTime: String? = null, //上班最早打卡时间 val maxStartTime: String?, //上班最晚打卡时间 val minStartTime: String?, //下班最早打卡时间 val maxEndTime: String?, //下班最晚打卡时间 val minEndTime: String?, //是否跨天 val crossDay: Boolean?, ) : Parcelable { //是否当前时间打卡上班有效 fun isNowTimeCheckInWorkEffective(): Boolean { return isNowTimeAfterCheckInWorkStartTime() && isNowTimeBeforeCheckInWorkEndTime() } //是否当前时间在打卡上班最早时间之前 fun isNowTimeAfterCheckInWorkStartTime(): Boolean { return try { val now = Calendar.getInstance() val current = now.timeInMillis val min = now.apply { set(Calendar.HOUR_OF_DAY, maxStartTime!!.split(":").first().toInt()) set(Calendar.MINUTE, maxStartTime.split(":").last().toInt()) set(Calendar.SECOND, 0) set(Calendar.MILLISECOND, 0) }.timeInMillis current >= min } catch (e: Exception) { e.printStackTrace() false } } //是否当前时间在打卡上班最晚时间之后 fun isNowTimeBeforeCheckInWorkEndTime(): Boolean { return try { val now = Calendar.getInstance() val current = now.timeInMillis val max = now.apply { set(Calendar.HOUR_OF_DAY, minStartTime!!.split(":").first().toInt()) set(Calendar.MINUTE, minStartTime.split(":").last().toInt()) set(Calendar.SECOND, 0) set(Calendar.MILLISECOND, 0) }.timeInMillis current <= max } catch (e: Exception) { e.printStackTrace() false } } //是否当前时间打卡下班有效 fun isNowTimeCheckInOffWorkEffective(): Boolean { return isNowTimeAfterCheckInOffWorkStartTime() && isNowTimeBeforeCheckInOffWorkEndTime() } //是否当前时间在下班打卡最早时间之前 fun isNowTimeAfterCheckInOffWorkStartTime(): Boolean { return try { val now = Calendar.getInstance() val current = now.timeInMillis val min = now.apply { set(Calendar.HOUR_OF_DAY, maxEndTime!!.split(":").first().toInt()) set(Calendar.MINUTE, maxEndTime.split(":").last().toInt()) set(Calendar.SECOND, 0) set(Calendar.MILLISECOND, 0) }.timeInMillis current >= min } catch (e: Exception) { e.printStackTrace() false } } //是否当前时间在下班打卡最晚时间之前 fun isNowTimeBeforeCheckInOffWorkEndTime(): Boolean { return try { val now = Calendar.getInstance() val current = now.timeInMillis val max = now.apply { set(Calendar.HOUR_OF_DAY, minEndTime!!.split(":").first().toInt()) set(Calendar.MINUTE, minEndTime.split(":").last().toInt()) if (crossDay == true) { add(Calendar.DAY_OF_MONTH, 1) } set(Calendar.SECOND, 0) set(Calendar.MILLISECOND, 0) }.timeInMillis current <= max } catch (e: Exception) { e.printStackTrace() false } } } /** * 用户打卡记录实体类 * 包含上下班打卡的完整信息及打卡结果 */ @Parcelize data class XpClockInVO( /** * 主键ID */ @SerializedName("id") val id: Long? = null, /** * 用户ID */ @SerializedName("appUserId") val appUserId: Long? = null, /** * 上班打卡时间 * 格式:yyyy-MM-dd HH:mm:ss */ @SerializedName("clockInTime") val clockInTime: String? = null, /** * 下班打卡时间 * 格式:yyyy-MM-dd HH:mm:ss */ @SerializedName("clockOutTime") val clockOutTime: String? = null, /** * 班次ID */ @SerializedName("shiftId") val shiftId: Long? = null, /** * 上班打卡结果 * 1 = 正常 * 2 = 迟到 * 3 = 缺卡 */ @SerializedName("clockInResult") val clockInResult: Int? = null, /** * 下班打卡结果 * 1 = 正常 * 2 = 早退 * 3 = 缺卡 */ @SerializedName("clockOutResult") val clockOutResult: Int? = null, /** * 上班打卡经度 */ @SerializedName("clockInLon") val clockInLon: Double? = null, /** * 上班打卡纬度 */ @SerializedName("clockInLat") val clockInLat: Double? = null, /** * 下班打卡经度 */ @SerializedName("clockOutLon") val clockOutLon: Double? = null, /** * 下班打卡纬度 */ @SerializedName("clockOutLat") val clockOutLat: Double? = null, /** * 下班打卡纬度 */ @SerializedName("clockOutAddress") val clockOutAddress: String? = null, /** * 上班打卡纬度 */ @SerializedName("clockInAddress") val clockInAddress: String? = null, ) : Parcelable { //是否已经上班打卡 fun hadWorkCheckedIn(): Boolean { return clockInResult == 1 || clockInResult == 2 } //是否缺失上班打卡 fun hadLostWorkCheckedIn(): Boolean { return clockInResult == 3 } //是否已经下班打卡 fun hadOffWorkCheckedIn(): Boolean { return clockOutResult == 1 || clockOutResult == 2 } //是否缺失下班打卡 fun hadLostOffWorkCheckedIn(): Boolean { return clockOutResult == 3 } //获取上班打卡成功时间 fun getFormateClockInTime(): String { return try { clockInTime?.let { val split = it.split(" ") val ymd = split[0].dateChangePattern("yyyy-MM-dd", "yyyy/MM/dd") "$ymd ${split[1]}" } ?: "" } catch (e: Exception) { e.printStackTrace() "" } } //获取下班打卡成功时间 fun getFormateClockOutTime(): String { return try { clockOutTime?.let { val split = it.split(" ") val ymd = split[0].dateChangePattern("yyyy-MM-dd", "yyyy/MM/dd") "$ymd ${split[1]}" } ?: "" } catch (e: Exception) { e.printStackTrace() "" } } }