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)
|
}
|
}
|
}
|
}
|