| | |
| | | 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) { |
| | | |
| | |
| | | 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>() |
| | |
| | | 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 |
| | | ) { |
| | |
| | | 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("不在打卡范围内") |
| | | } |
| | |
| | | } |
| | | } |
| | | } |
| | | |
| | | 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("打卡中") { |
| | |
| | | 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("成功打卡上班") |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | |
| | | 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() |
| | | } |
| | | } |
| | | } |