puzhibing
2026-08-21 5fa94b3718b4a78a4fcea4c97652b0ef20b7de3a
app/src/main/java/com/xw/yunwei/ui/user/mine/checkin/CheckInVM.kt
@@ -11,9 +11,7 @@
import com.xw.common.utils.ToastUtilCommon
import com.xw.yunwei.model.ClockInStatusModel
import com.xw.yunwei.net.UserRepository
import com.xw.yunwei.ui.MainActivity
import org.koin.core.component.inject
import kotlin.getValue
class CheckInVM(application: Application) : BaseViewModel(application) {
@@ -26,15 +24,11 @@
    var location: AMapLocation? = null
    val clockModel: MutableLiveData<ClockInStatusModel> = MutableLiveData()
    val distanceEffective = MutableLiveData(false) // 位置是否合适
    val timeEffective = MutableLiveData(false) // 是否打卡时间有效
    val canClock = MutableLiveData(false) // 是否能打卡
    var enterType: Int? = null // 页面传入类型 1:上班  2:下班
    val clockType = clockModel.map { // 打卡类型 1:上班  2:下班
        enterType ?: if (it.clockIn != true) 1 else 2
    }
    val isClock = clockType.map { // 是否已打卡
        if (it == 1) clockModel.value!!.clockIn ?: false else clockModel.value!!.clockOut ?: false
    }
    val tipsId = MutableLiveData<Int>()
    val tips = MutableLiveData<String>()
@@ -48,7 +42,11 @@
        clockModel.value?.let {
            val lat = location?.latitude ?: 0.0
            val lng = location?.longitude ?: 0.0
            //位置是否合适
            var distanceEffective = false
            //时间是否合适
            var timeEffective = false
            var couldCheck = false
            if (lat != 0.0 && lng != 0.0 && (it.xpCheckLocation?.locationLat
                    ?: 0.0) != 0.0 && (it.xpCheckLocation?.locationLon ?: 0.0) != 0.0
            ) {
@@ -56,34 +54,33 @@
                    LatLng(lat, lng),
                    LatLng(it.xpCheckLocation!!.locationLat!!, it.xpCheckLocation.locationLon!!)
                )
                canClock.value = (it.xpCheckLocation.locationRange ?: 0.0) > dis.toDouble()
                distanceEffective = (it.xpCheckLocation.locationRange ?: 0.0) > dis.toDouble()
                timeEffective =
                    if (enterType == 1) it.xpShift?.isNowTimeCheckInWorkEffective() == true else it.xpShift?.isNowTimeCheckInOffWorkEffective() == true
                this.distanceEffective.postValue(distanceEffective)
                this.timeEffective.postValue(timeEffective)
                couldCheck = distanceEffective && timeEffective
                canClock.postValue(couldCheck)
            }
        }
        getTipsAbout()
    }
//            val clockType = if (it.clockIn != true) 1 else 2
//            val isClock = if (clockType == 1) clockModel.value!!.clockIn
//                ?: false else clockModel.value!!.clockOut ?: false
    var alreadyTipsNoCanClock = false
    fun getTipsAbout() {
        clockModel.value?.let {
            val clockType = if (it.clockIn != true) 1 else 2
            val isClock = if (clockType == 1) clockModel.value!!.clockIn
                ?: false else clockModel.value!!.clockOut ?: false
            if (isClock || canClock.value!!) {
            if (isClock() || couldCheck) {
                tipsId.value = com.xw.common.R.drawable.svg_checkin_location
            } else {
                tipsId.value = com.xw.common.R.drawable.svg_toast_warn
            }
            if (isClock) {
                tips.value = "今日打卡已完成"
            if (isClock()) {
                tips.postValue(if (enterType == 1) "成功打卡上班" else "今日打卡已完成")
            } else {
                if (canClock.value!!) {
                    tips.value = "您已在打卡范围内"
                if (couldCheck) {
                    tips.postValue("您已在打卡范围内")
                } else {
                    tips.value = "当前设备GPS定位不在打卡范围内"
                    if (!alreadyTipsNoCanClock && location != null) {
                    tips.postValue(if (!distanceEffective) "当前设备GPS定位不在打卡范围内" else "您不在打卡时间范围内")
                    if (!alreadyTipsNoCanClock && location != null && !distanceEffective) {
                        alreadyTipsNoCanClock = true
                        ToastUtilCommon.showWarn("不在打卡范围内")
                    }
@@ -91,6 +88,13 @@
            }
        }
    }
    var alreadyTipsNoCanClock = false
    fun isClock() = enterType?.let { // 是否已打卡
        if (it == 1) (clockModel.value!!.clockIn == true && clockModel.value!!.xpClockIn?.hadLostWorkCheckedIn() != true) else
            (clockModel.value!!.clockOut == true && clockModel.value!!.xpClockIn?.hadLostOffWorkCheckedIn() != true)
    } ?: false
    fun clockIn() {
        launchRequest("打卡中") {
@@ -100,10 +104,12 @@
            map["clockInAddress"] = location?.address
            map["shiftId"] = clockModel.value?.xpShift?.id
            map["locationId"] = clockModel.value?.xpCheckLocation?.id
            userRepository.clockIn(map)
            ToastUtilCommon.showSuc("打卡成功")
//            querySchedule(getTime(System.currentTimeMillis()))
            startActivity(MainActivity::class.java)
            userRepository.clockIn(map)?.also {
                ToastUtilCommon.showSuc("打卡成功")
                querySchedule(getTime(System.currentTimeMillis())) {
                    tips.postValue("成功打卡上班")
                }
            }
        }
    }
@@ -115,16 +121,20 @@
            map["clockOutAddress"] = location?.address
            map["shiftId"] = clockModel.value?.xpShift?.id
            map["locationId"] = clockModel.value?.xpCheckLocation?.id
            userRepository.clockOut(map)
            ToastUtilCommon.showSuc("打卡成功")
            querySchedule(getTime(System.currentTimeMillis()))
            userRepository.clockOut(map)?.also {
                ToastUtilCommon.showSuc("打卡成功")
                querySchedule(getTime(System.currentTimeMillis())) {
                    tips.postValue("今日打卡已完成")
                }
            }
        }
    }
    fun querySchedule(time: String) {
    fun querySchedule(time: String, successListener: () -> Unit) {
        launchRequest {
            userRepository.querySchedule(mapOf("schedulingDate" to time)).let {
                clockModel.postValue(it)
                successListener.invoke()
            }
        }
    }