18034727885
2026-04-14 370014cbb9ec1ef64e7e42bb4f9a12671461d8e4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
package com.xw.yunwei.ui.user.mine.checkin
 
import android.app.Application
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.map
import com.amap.api.location.AMapLocation
import com.amap.api.maps.model.LatLng
import com.xw.common.TimeDialog.Companion.getTime
import com.xw.common.base.BaseViewModel
import com.xw.common.utils.CalculatorLineDistance
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) {
 
    val userRepository: UserRepository by inject()
 
    var firstLocationStatus = false // 首次定位状态
    val pageType = MutableLiveData(1) // 页面类型  1:打卡  2:地图
    val title = pageType.map { if (it == 1) "排班与考勤" else "打卡点位" }
 
    var location: AMapLocation? = null
    val clockModel: MutableLiveData<ClockInStatusModel> = MutableLiveData()
 
    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>()
 
    val clockTips = canClock.map {
        if (it) "已进入打卡范围" else "未进入打卡范围"
    }
 
    /*位置检查*/
    fun locationCheck() {
        clockModel.value?.let {
            val lat = location?.latitude ?: 0.0
            val lng = location?.longitude ?: 0.0
 
            if (lat != 0.0 && lng != 0.0 && (it.xpCheckLocation?.locationLat
                    ?: 0.0) != 0.0 && (it.xpCheckLocation?.locationLon ?: 0.0) != 0.0
            ) {
                val dis = CalculatorLineDistance.calculate(
                    LatLng(lat, lng),
                    LatLng(it.xpCheckLocation!!.locationLat!!, it.xpCheckLocation.locationLon!!)
                )
                canClock.value = (it.xpCheckLocation.locationRange ?: 0.0) > dis.toDouble()
            }
        }
        getTipsAbout()
    }
 
    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!!) {
                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 = "今日打卡已完成"
            } else {
                if (canClock.value!!) {
                    tips.value = "您已在打卡范围内"
                } else {
                    tips.value = "当前设备GPS定位不在打卡范围内"
                    if (!alreadyTipsNoCanClock && location != null) {
                        alreadyTipsNoCanClock = true
                        ToastUtilCommon.showWarn("不在打卡范围内")
                    }
                }
            }
        }
    }
 
    fun clockIn() {
        launchRequest("打卡中") {
            val map = mutableMapOf<String, Any?>()
            map["userLat"] = location?.latitude
            map["userLon"] = location?.longitude
            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)
        }
    }
 
    fun clockOut() {
        launchRequest("打卡中") {
            val map = mutableMapOf<String, Any?>()
            map["userLat"] = location?.latitude
            map["userLon"] = location?.longitude
            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()))
        }
    }
 
    fun querySchedule(time: String) {
        launchRequest {
            userRepository.querySchedule(mapOf("schedulingDate" to time)).let {
                clockModel.postValue(it)
            }
        }
    }
}