18034727885
2026-06-02 e3d63d26b7299402bd33b75ed0422f2144a6197a
修复问题
12个文件已修改
714 ■■■■■ 已修改文件
app/src/main/java/com/xw/yunwei/model/ClockInStatusModel.kt 142 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/xw/yunwei/model/CruiseCheckInOperationResult.kt 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/xw/yunwei/ui/user/mine/MineVM.kt 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/xw/yunwei/ui/user/mine/checkin/CheckInVM.kt 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/xw/yunwei/ui/user/mine/scheduling/SchedulingActivity.kt 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/xw/yunwei/ui/work/checkInMission/CruiseCheckInActivity.kt 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/xw/yunwei/ui/work/checkInMission/viewmodel/CruiseCheckInOperationViewModel.kt 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/xw/yunwei/ui/work/checkInMission/viewmodel/CruiseCheckInViewModel.kt 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/xw/yunwei/ui/work/site/SiteNavVM.kt 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/xw/yunwei/websocket/WebSocketClient.kt 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/activity_check_in.xml 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/activity_site_nav.xml 414 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/xw/yunwei/model/ClockInStatusModel.kt
@@ -3,6 +3,7 @@
import android.os.Parcelable
import com.google.gson.annotations.SerializedName
import kotlinx.parcelize.Parcelize
import java.util.Calendar
/**
 * 打卡状态VO
@@ -41,7 +42,23 @@
    @SerializedName("xpClockIn")
    val xpClockIn: XpClockInVO? = null
) : Parcelable
) : 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
    }
}
/**
 * 打卡地址管理VO
@@ -116,7 +133,7 @@
     */
    @SerializedName("upStringTime")
    val upStringTime: String? = null
): Parcelable
) : Parcelable
/**
 * 班次管理VO
@@ -202,8 +219,103 @@
     * 记录修改时间(前端忽略)
     */
    @SerializedName("upStringTime")
    val upStringTime: String? = null
): Parcelable
    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
        }
    }
}
/**
@@ -299,4 +411,24 @@
    @SerializedName("clockInAddress")
    val clockInAddress: String? = null,
    ): Parcelable
    ) : 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
    }
}
app/src/main/java/com/xw/yunwei/model/CruiseCheckInOperationResult.kt
@@ -9,6 +9,7 @@
@Parcelize
data class CruiseCheckInOperationResult(
    val id: String,
    val cruiseCheckInRuleId: String?,//巡游打卡任务id
    val checkLocationId: String?,//打卡点位id
    val checkIn: String?,//是否已打卡(0=否,1=是)
    val checkInResult: String?,//打卡结果(1=正常打卡,2=超时打卡)
app/src/main/java/com/xw/yunwei/ui/user/mine/MineVM.kt
@@ -15,6 +15,7 @@
import com.xw.yunwei.model.ClockInStatusModel
import com.xw.yunwei.model.CruiseCheckInMissionInfo
import com.xw.yunwei.model.UserInfo
import com.xw.yunwei.model.UserInfoRealtime
import com.xw.yunwei.net.UserRepository
import com.xw.yunwei.net.WorkRepository
import com.xw.yunwei.ui.user.mine.checkin.CheckInActivity
@@ -31,8 +32,7 @@
    val userRepository: UserRepository by inject()
    val workRepository: WorkRepository by inject()
    val userInfo =
        MutableLiveData(MMKVManager.getInstance().getModel<UserInfo>(KeyPreferences.USER))
    val userInfo = MutableLiveData<UserInfoRealtime>()
    val avatar = MutableLiveData(ImageDefault("", com.xw.common.R.drawable.svg_avatar))
@@ -62,7 +62,7 @@
                CheckInActivity::class.java,
                CheckInActivity.getParams(
                    clockModel.value!!,
                    if (!(clockModel.value?.clockIn ?: false)) 1 else 2
                    if (clockModel.value?.needWorkCheckIn() == true) 1 else 2
                )
            )
@@ -79,6 +79,7 @@
            showLoading = false,
            flowBlock = { userRepository.getUserInfo() },
            onCollect = {
                userInfo.postValue(it)
                avatar.postValue(avatar.value!!.apply { this.url = it?.avatar?.getUrl() ?: "" })
                workFlag.postValue(it?.workFlag ?: 0)
                roleName.postValue(it?.roles?.getOrNull(0)?.roleName ?: "未分配")
app/src/main/java/com/xw/yunwei/ui/user/mine/checkin/CheckInVM.kt
@@ -24,6 +24,8 @@
    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:下班
@@ -40,6 +42,10 @@
        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
@@ -48,7 +54,12 @@
                    LatLng(lat, lng),
                    LatLng(it.xpCheckLocation!!.locationLat!!, it.xpCheckLocation.locationLon!!)
                )
                couldCheck = (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)
            }
//            val clockType = if (it.clockIn != true) 1 else 2
@@ -68,8 +79,8 @@
                if (couldCheck) {
                    tips.postValue("您已在打卡范围内")
                } else {
                    tips.postValue("当前设备GPS定位不在打卡范围内")
                    if (!alreadyTipsNoCanClock && location != null) {
                    tips.postValue(if (!distanceEffective) "当前设备GPS定位不在打卡范围内" else "您不在打卡时间范围内")
                    if (!alreadyTipsNoCanClock && location != null && !distanceEffective) {
                        alreadyTipsNoCanClock = true
                        ToastUtilCommon.showWarn("不在打卡范围内")
                    }
@@ -81,7 +92,8 @@
    var alreadyTipsNoCanClock = false
    fun isClock() = enterType?.let { // 是否已打卡
        if (it == 1) clockModel.value!!.clockIn ?: false else clockModel.value!!.clockOut ?: false
        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() {
app/src/main/java/com/xw/yunwei/ui/user/mine/scheduling/SchedulingActivity.kt
@@ -4,8 +4,6 @@
import androidx.appcompat.widget.AppCompatTextView
import androidx.core.content.ContextCompat
import com.amap.api.maps.model.LatLng
import com.blankj.utilcode.util.TimeUtils
import com.blankj.utilcode.util.TimeUtils.getSafeDateFormat
import com.xw.common.R
import com.xw.common.TimeDialog
import com.xw.common.TimeDialog.Companion.getTime
@@ -19,7 +17,7 @@
/**
 * 排班考勤
 */
class SchedulingActivity: BaseBusinessActivity<ActivitySchedulingBinding, SchedulingVM>() {
class SchedulingActivity : BaseBusinessActivity<ActivitySchedulingBinding, SchedulingVM>() {
    override fun getBindingVariable() = BR.viewModel
    val dialogTime: TimeDialog by lazy { TimeDialog(this) }
@@ -66,7 +64,9 @@
        }
        binding.nav.setOnClickListener {
            viewModel.clockModel.value?.let {
                if ((it.xpCheckLocation?.locationLat ?: 0.0) != 0.0 && (it.xpCheckLocation?.locationLon ?: 0.0) != 0.0) {
                if ((it.xpCheckLocation?.locationLat
                        ?: 0.0) != 0.0 && (it.xpCheckLocation?.locationLon ?: 0.0) != 0.0
                ) {
                    navigate(
                        end = LatLng(
                            it.xpCheckLocation?.locationLat!!,
@@ -90,7 +90,7 @@
    override fun setObservable() {
        super.setObservable()
        viewModel.selectTime.observe(this){
        viewModel.selectTime.observe(this) {
            viewModel.querySchedule(it)
        }
        val setStatus: (AppCompatTextView, Int, Int, String) -> Unit = { tv, color, bg, text ->
@@ -101,65 +101,25 @@
        viewModel.clockModel.observe(this) {
            it?.let {
                // 状态提示控制
                if (it.clockIn != true) {
                    setStatus(
                        binding.clockIntStatus,
                        getResColor(R.color.orange_5),
                        R.color.orange_1,
                        "未打卡"
                    )
                } else {
                    it.xpClockIn?.let {
                        when (it.clockInResult) { // 上班打卡结果 1 = 正常 2 = 迟到 3 = 缺卡
                            3 -> setStatus(
                                binding.clockIntStatus,
                                getResColor(R.color.orange_5),
                                R.color.orange_1,
                                "未打卡"
                            )
                            else -> setStatus(
                                binding.clockIntStatus,
                                getResColor(R.color.gray_7),
                                R.color.gray_3,
                                "已打卡"
                            )
                        }
                    }
                }
                setStatus(
                    binding.clockIntStatus,
                    getResColor(if (it.xpClockIn?.hadLostWorkCheckedIn() == true) R.color.red_5 else if (it.clockIn == true) R.color.gray_7 else R.color.orange_5),
                    if (it.xpClockIn?.hadLostWorkCheckedIn() == true) R.color.red_1 else if (it.clockIn == true) R.color.gray_3 else R.color.orange_1,
                    if (it.xpClockIn?.hadLostWorkCheckedIn() == true) "缺卡" else if (it.clockIn == true) "已打卡" else "未打卡"
                )
                setStatus(
                    binding.clockOutStatus,
                    getResColor(if (it.xpClockIn?.hadLostOffWorkCheckedIn() == true) R.color.red_5 else if (it.clockOut == true) R.color.gray_7 else R.color.orange_5),
                    if (it.xpClockIn?.hadLostOffWorkCheckedIn() == true) R.color.red_1 else if (it.clockOut == true) R.color.gray_3 else R.color.orange_1,
                    if (it.xpClockIn?.hadLostOffWorkCheckedIn() == true) "缺卡" else if (it.clockOut == true) "已打卡" else "未打卡"
                )
                // 未上班打卡或缺卡 可上班打卡
                binding.clockIn.isEnabled =
                    it.clockIn != true || it.xpClockIn?.hadLostWorkCheckedIn() == true
                if (it.clockOut != true) {
                    setStatus(
                        binding.clockOutStatus,
                        getResColor(R.color.orange_5),
                        R.color.orange_1,
                        "未打卡"
                    )
                } else {
                    it.xpClockIn?.let {
                        when (it.clockOutResult) { // 下班打卡结果 1 = 正常 2 = 早退 3 = 缺卡
                            3 -> setStatus(
                                binding.clockOutStatus,
                                getResColor(R.color.orange_5),
                                R.color.orange_1,
                                "未打卡"
                            )
                            else -> setStatus(
                                binding.clockOutStatus,
                                getResColor(R.color.gray_7),
                                R.color.gray_3,
                                "已打卡"
                            )
                        }
                    }
                }
                // 未打卡 且 状态不为缺卡 可上班打卡
                binding.clockIn.isEnabled = it.clockIn != true && it.xpClockIn?.clockInResult != 3
                val startTime = it.xpShift?.startTime ?: "23:59" // 接口不配置 就不让能打卡
                val currentTime = TimeUtils.millis2String(System.currentTimeMillis(),getSafeDateFormat("HH:mm"))
                // 已打上班卡 或 (未下班打卡 且 状态不为缺卡 且 已过上班时间) 可下班打卡
                binding.clockOut.isEnabled = (it.clockIn == true && it.xpClockIn?.clockInResult != 3) ||
                        (it.clockOut != true && it.xpClockIn?.clockOutResult != 3 && currentTime > startTime)
                // 未下班打卡或缺卡 可下班打卡
                binding.clockOut.isEnabled =
                    it.clockOut != true || it.xpClockIn?.hadLostOffWorkCheckedIn() == true
            }
        }
    }
app/src/main/java/com/xw/yunwei/ui/work/checkInMission/CruiseCheckInActivity.kt
@@ -143,7 +143,7 @@
                carOverlay = CarOverlay(this, binding.amapView).apply {
                    setLock(false)
                }
                viewModel.needCalculateRideRoute.postValue(true)
                viewModel.needCalculateRoute.postValue(true)
            }
            it.setOnMarkerClickListener { marker ->
                val poi = marker.`object` as NaviPoi?
@@ -160,7 +160,7 @@
    override fun setObservable() {
        super.setObservable()
        viewModel.needCalculateRideRoute.observe(this) { it ->
        viewModel.needCalculateRoute.observe(this) { it ->
            if (!it || viewModel.getEndPoint() == null) {
                return@observe
            }
@@ -759,7 +759,7 @@
    @Suppress("unused")
    @Subscribe(threadMode = ThreadMode.MAIN)
    fun onMessageEvent(event: CruiseCheckInOperationResult) {
        if (event.id != viewModel.id) {
        if (event.cruiseCheckInRuleId != viewModel.id) {
            return
        }
        viewModel.refreshPoints(event.checkLocationId, event.checkIn, event.checkInResult)
app/src/main/java/com/xw/yunwei/ui/work/checkInMission/viewmodel/CruiseCheckInOperationViewModel.kt
@@ -207,16 +207,19 @@
                desc.value ?: "",
                urls
            )?.also { it ->
                EventBus.getDefault().post(it)
                val list = workRepository.getCheckInMissionPointsList(id)
                if (list == null || list.count { !it.hadCheckIn() } > 0) {
                    withContext(Dispatchers.Main) {
                        CruiseCheckInSuccessDialog.show(context, it).apply {
                            setOnDismissListener { finish() }
                            setOnDismissListener { _ ->
                                EventBus.getDefault().post(it)
                                finish()
                            }
                        }
                    }
                    return@also
                }
                EventBus.getDefault().post(it)
                startActivity(
                    CruiseCheckInMissionCompleteActivity::class.java,
                    CruiseCheckInMissionCompleteActivity.getParams(it)
app/src/main/java/com/xw/yunwei/ui/work/checkInMission/viewmodel/CruiseCheckInViewModel.kt
@@ -23,7 +23,7 @@
    var type: Int = 0
    //是否需要算路
    var needCalculateRideRoute = MutableLiveData(false)
    var needCalculateRoute = MutableLiveData(false)
    //是否在播放语音
    var hadPlayTTS = false;
@@ -119,21 +119,23 @@
    //刷新点
    fun refreshPoints(locationId: String?, checkIn: String?, checkInResult: String?) {
        val find = points.value?.find { it.locationId == locationId }?.apply {
        points.value?.find { it.locationId == locationId }?.apply {
            this.checkIn = checkIn
            this.checkInResult = checkInResult
        }
        points.postValue((points.value ?: mutableListOf()).toMutableList())
        if (getNextPoint() == null) {
        val endPoint = getEndPoint()
        if (endPoint == null) {
            finish()
        } else {
            val endPoint = getEndPoint()
            find?.takeIf {
                it.lat?.toDoubleOrNull() == endPoint?.coordinate?.latitude &&
                        it.lon?.toDoubleOrNull() == endPoint?.coordinate?.longitude
            }?.also {
                finish()
            points.postValue((points.value ?: mutableListOf()).toMutableList())
            aMapNaviLocation?.also {
                startPoint = NaviPoi(
                    "起点",
                    LatLng(it.coord.latitude, it.coord.longitude),
                    ""
                )
            }
            needCalculateRoute.postValue(true)
        }
    }
}
app/src/main/java/com/xw/yunwei/ui/work/site/SiteNavVM.kt
@@ -2,6 +2,7 @@
import android.app.Application
import androidx.lifecycle.MutableLiveData
import com.xw.common.Constants
import com.xw.common.base.BaseViewModel
import com.xw.yunwei.model.FenceInfoModel
import com.xw.yunwei.model.SiteModel
@@ -37,6 +38,8 @@
//            map["pointType"] = null  // 点位类型1运营点位 2测试点位
            map["queryParams"] = search.value  // 查询参数
            map["cityCode"] = cityCode
            map["longitude"] = Constants.longitude
            map["latitude"] = Constants.latitude
            workRepository.querySites(map)?.let {
                dataList.postValue(it)
            }
app/src/main/java/com/xw/yunwei/websocket/WebSocketClient.kt
@@ -3,6 +3,7 @@
import com.google.gson.Gson
import com.xw.common.utils.LogUtils
import com.xw.yunwei.BuildConfig
import com.xw.yunwei.Constants
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
@@ -226,6 +227,7 @@
            "position", mapOf(
                "longitude" to com.xw.common.Constants.longitude,
                "latitude" to com.xw.common.Constants.latitude,
                "userId" to (Constants.user?.id ?: "0"),
            )
        )
    }
app/src/main/res/layout/activity_check_in.xml
@@ -271,7 +271,7 @@
            <LinearLayout
                android:id="@+id/viewDetail"
                show="@{!viewModel.canClock &amp;&amp; !viewModel.isClock}"
                show="@{!viewModel.canClock &amp;&amp; !viewModel.isClock &amp;&amp; !viewModel.distanceEffective}"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="end"
@@ -302,7 +302,7 @@
            <LinearLayout
                android:id="@+id/refreshLayout"
                show="@{!viewModel.canClock &amp;&amp; !viewModel.isClock}"
                show="@{!viewModel.canClock &amp;&amp; !viewModel.isClock &amp;&amp; !viewModel.distanceEffective}"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="@dimen/dp_24"
app/src/main/res/layout/activity_site_nav.xml
@@ -125,6 +125,7 @@
            <!-- 底部滑动面板 -->
            <LinearLayout
                android:id="@+id/bottom_sheet"
                showAnim="@{viewModel.siteItem==null}"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:background="@drawable/shape_update"
@@ -159,39 +160,10 @@
                        <androidx.appcompat.widget.AppCompatImageView
                            android:id="@+id/arrow"
                            showAnim="@{viewModel.siteItem==null}"
                            android:layout_width="@dimen/dp_24"
                            android:layout_height="@dimen/dp_24"
                            android:layout_centerInParent="true"
                            android:background="@drawable/svg_arrow_d1" />
                        <androidx.appcompat.widget.AppCompatTextView
                            android:id="@+id/title1"
                            showAnim="@{viewModel.siteItem!=null}"
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_centerInParent="true"
                            android:gravity="center_vertical"
                            android:paddingHorizontal="@dimen/dp_20"
                            android:text="点位信息"
                            android:textColor="@color/gray_10"
                            android:textSize="@dimen/sp_16"
                            android:textStyle="bold"
                            android:visibility="gone" />
                        <androidx.appcompat.widget.AppCompatTextView
                            android:id="@+id/back1"
                            showAnim="@{viewModel.siteItem!=null}"
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_centerVertical="true"
                            android:layout_marginStart="@dimen/dp_20"
                            android:drawableStart="@drawable/svg_arrow_l"
                            android:drawablePadding="@dimen/dp_5"
                            android:text="返回"
                            android:textColor="@color/blue_5"
                            android:textSize="@dimen/sp_14"
                            android:visibility="gone" />
                    </RelativeLayout>
@@ -211,180 +183,6 @@
                                android:layout_height="wrap_content"
                                android:nestedScrollingEnabled="false"
                                tools:visibility="gone" />
                            <LinearLayout
                                android:id="@+id/siteDetail"
                                showAnim="@{viewModel.siteItem!=null}"
                                android:layout_width="match_parent"
                                android:layout_height="wrap_content"
                                android:orientation="vertical"
                                android:visibility="gone"
                                tools:visibility="visible">
                                <androidx.constraintlayout.widget.ConstraintLayout
                                    android:layout_width="match_parent"
                                    android:layout_height="wrap_content">
                                    <com.makeramen.roundedimageview.RoundedImageView
                                        android:id="@+id/icon"
                                        android:layout_width="@dimen/dp_68"
                                        android:layout_height="@dimen/dp_92"
                                        android:layout_marginStart="@dimen/dp_20"
                                        android:layout_marginTop="@dimen/dp_8"
                                        android:adjustViewBounds="true"
                                        android:scaleType="centerCrop"
                                        android:src="@mipmap/img_site_bg"
                                        app:layout_constraintBottom_toBottomOf="parent"
                                        app:layout_constraintLeft_toLeftOf="parent"
                                        app:layout_constraintTop_toTopOf="parent"
                                        app:riv_corner_radius="@dimen/dp_5" />
                                    <androidx.appcompat.widget.AppCompatTextView
                                        android:id="@+id/name"
                                        android:layout_width="0dp"
                                        android:layout_height="wrap_content"
                                        android:layout_marginStart="@dimen/dp_8"
                                        android:layout_marginEnd="@dimen/dp_20"
                                        android:maxLines="1"
                                        android:text="广州市白云机场T2航站楼"
                                        android:textColor="@color/gray_9"
                                        android:textSize="@dimen/sp_14"
                                        android:textStyle="bold"
                                        app:layout_constraintLeft_toRightOf="@+id/icon"
                                        app:layout_constraintRight_toLeftOf="@+id/nav"
                                        app:layout_constraintTop_toTopOf="@+id/icon" />
                                    <androidx.appcompat.widget.AppCompatTextView
                                        android:id="@+id/address"
                                        android:layout_width="0dp"
                                        android:layout_height="wrap_content"
                                        android:layout_marginTop="@dimen/dp_4"
                                        android:layout_marginRight="@dimen/dp_20"
                                        android:maxLines="2"
                                        android:text="深圳市宝安区西大街阳光绿色温馨家园17号楼313"
                                        android:textColor="@color/gray_6"
                                        android:textSize="@dimen/sp_12"
                                        app:layout_constraintLeft_toLeftOf="@+id/name"
                                        app:layout_constraintRight_toLeftOf="@+id/nav"
                                        app:layout_constraintTop_toBottomOf="@+id/name" />
                                    <com.xw.common.custom.ShowTextLinearLayout
                                        android:id="@+id/stllTag"
                                        android:layout_width="0dp"
                                        android:layout_height="wrap_content"
                                        android:layout_marginTop="@dimen/dp_4"
                                        android:layout_marginEnd="@dimen/dp_10"
                                        android:orientation="vertical"
                                        app:layout_constraintLeft_toLeftOf="@+id/name"
                                        app:layout_constraintRight_toLeftOf="@+id/arrow1"
                                        app:layout_constraintTop_toBottomOf="@+id/address"
                                        app:margin_width="@dimen/dp_8"
                                        app:max_padding_width="@dimen/dp_12"
                                        app:min_padding_width="@dimen/dp_12"
                                        app:padding_height="@dimen/dp_6"
                                        app:padding_left="0dp"
                                        app:padding_right="0dp"
                                        app:text_bg="@drawable/shape_blue1_bg_4"
                                        app:text_color="@color/blue_5"
                                        app:text_size="@dimen/sp_12" />
                                    <androidx.appcompat.widget.AppCompatImageView
                                        android:id="@+id/arrow1"
                                        android:layout_width="wrap_content"
                                        android:layout_height="wrap_content"
                                        android:layout_marginTop="@dimen/dp_8"
                                        android:layout_marginEnd="@dimen/dp_20"
                                        android:src="@drawable/svg_arrow_r"
                                        android:visibility="gone"
                                        app:layout_constraintRight_toRightOf="parent"
                                        app:layout_constraintTop_toBottomOf="@+id/address" />
                                    <LinearLayout
                                        android:id="@+id/nav"
                                        android:layout_width="wrap_content"
                                        android:layout_height="wrap_content"
                                        android:layout_marginTop="@dimen/dp_8"
                                        android:layout_marginEnd="@dimen/dp_20"
                                        android:orientation="vertical"
                                        app:layout_constraintRight_toRightOf="parent"
                                        app:layout_constraintTop_toTopOf="parent">
                                        <androidx.appcompat.widget.AppCompatImageView
                                            android:layout_width="@dimen/dp_20"
                                            android:layout_height="@dimen/dp_20"
                                            android:layout_gravity="end|center_vertical"
                                            android:src="@drawable/svg_map_nav" />
                                        <androidx.appcompat.widget.AppCompatTextView
                                            android:layout_width="wrap_content"
                                            android:layout_height="wrap_content"
                                            android:text="导航"
                                            android:textColor="@color/blue_5"
                                            android:textSize="@dimen/sp_10"
                                            android:visibility="gone"
                                            app:layout_constraintRight_toRightOf="parent" />
                                    </LinearLayout>
                                </androidx.constraintlayout.widget.ConstraintLayout>
                                <View
                                    android:layout_width="match_parent"
                                    android:layout_height="1px"
                                    android:layout_marginHorizontal="@dimen/dp_20"
                                    android:layout_marginTop="@dimen/dp_8"
                                    android:background="@color/gray_4"
                                    app:layout_constraintBottom_toBottomOf="parent" />
                                <com.xw.common.custom.ShowTextLinearLayout
                                    android:id="@+id/stllTag1"
                                    android:layout_width="match_parent"
                                    android:layout_height="wrap_content"
                                    android:layout_marginHorizontal="20dp"
                                    android:layout_marginTop="@dimen/dp_12"
                                    android:orientation="vertical"
                                    app:margin_width="@dimen/dp_8"
                                    app:max_padding_width="@dimen/dp_12"
                                    app:min_padding_width="@dimen/dp_12"
                                    app:padding_height="@dimen/dp_6"
                                    app:padding_left="0dp"
                                    app:padding_right="0dp"
                                    app:text_bg="@drawable/shape_f8f9fa_bg_4"
                                    app:text_color="@color/gray_9"
                                    app:text_size="@dimen/sp_12" />
                                <androidx.appcompat.widget.AppCompatTextView
                                    android:id="@+id/remark"
                                    android:layout_width="match_parent"
                                    android:layout_height="wrap_content"
                                    android:layout_marginHorizontal="@dimen/dp_20"
                                    android:layout_marginTop="@dimen/dp_8"
                                    android:background="@drawable/shape_gray_3_bg_4"
                                    android:padding="@dimen/dp_12"
                                    android:text="深圳市宝安区西大街阳光绿色温馨家园17号楼313深圳市宝安区西大街阳光绿色温馨家园17号楼313深圳市宝安区西大街阳光绿色温馨家园17号楼313"
                                    android:textColor="@color/gray_7"
                                    android:textSize="@dimen/sp_14" />
                                <View
                                    android:layout_width="match_parent"
                                    android:layout_height="1px"
                                    android:layout_marginTop="@dimen/dp_38"
                                    android:background="@color/gray_4" />
                                <com.google.android.material.button.MaterialButton
                                    android:id="@+id/btn_error_upload"
                                    android:layout_width="match_parent"
                                    android:layout_height="wrap_content"
                                    android:layout_marginHorizontal="@dimen/dp_20"
                                    android:layout_marginVertical="@dimen/dp_12"
                                    android:backgroundTint="@color/blue_5"
                                    android:text="现场情况上报"
                                    android:textSize="@dimen/sp_16"
                                    android:textStyle="bold"
                                    app:cornerRadius="@dimen/dp_4" />
                            </LinearLayout>
                        </RelativeLayout>
                    </androidx.core.widget.NestedScrollView>
@@ -395,5 +193,215 @@
        </androidx.coordinatorlayout.widget.CoordinatorLayout>
        <LinearLayout
            showAnim="@{viewModel.siteItem!=null}"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@drawable/shape_white_bg_top_12"
            android:elevation="@dimen/dp_2"
            android:orientation="vertical"
            app:layout_constraintBottom_toBottomOf="parent">
            <RelativeLayout
                android:layout_width="match_parent"
                android:layout_height="@dimen/dp_50">
                <androidx.appcompat.widget.AppCompatTextView
                    android:id="@+id/title1"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_centerInParent="true"
                    android:gravity="center_vertical"
                    android:paddingHorizontal="@dimen/dp_20"
                    android:text="点位信息"
                    android:textColor="@color/gray_10"
                    android:textSize="@dimen/sp_16"
                    android:textStyle="bold" />
                <androidx.appcompat.widget.AppCompatTextView
                    android:id="@+id/back1"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_centerVertical="true"
                    android:layout_marginStart="@dimen/dp_20"
                    android:drawableStart="@drawable/svg_arrow_l"
                    android:drawablePadding="@dimen/dp_5"
                    android:text="返回"
                    android:textColor="@color/blue_5"
                    android:textSize="@dimen/sp_14" />
            </RelativeLayout>
            <LinearLayout
                android:id="@+id/siteDetail"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical">
                <androidx.constraintlayout.widget.ConstraintLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content">
                    <com.makeramen.roundedimageview.RoundedImageView
                        android:id="@+id/icon"
                        android:layout_width="@dimen/dp_68"
                        android:layout_height="@dimen/dp_92"
                        android:layout_marginStart="@dimen/dp_20"
                        android:layout_marginTop="@dimen/dp_8"
                        android:adjustViewBounds="true"
                        android:scaleType="centerCrop"
                        android:src="@mipmap/img_site_bg"
                        app:layout_constraintBottom_toBottomOf="parent"
                        app:layout_constraintLeft_toLeftOf="parent"
                        app:layout_constraintTop_toTopOf="parent"
                        app:riv_corner_radius="@dimen/dp_5" />
                    <androidx.appcompat.widget.AppCompatTextView
                        android:id="@+id/name"
                        android:layout_width="0dp"
                        android:layout_height="wrap_content"
                        android:layout_marginStart="@dimen/dp_8"
                        android:layout_marginEnd="@dimen/dp_20"
                        android:maxLines="1"
                        android:text="广州市白云机场T2航站楼"
                        android:textColor="@color/gray_9"
                        android:textSize="@dimen/sp_14"
                        android:textStyle="bold"
                        app:layout_constraintLeft_toRightOf="@+id/icon"
                        app:layout_constraintRight_toLeftOf="@+id/nav"
                        app:layout_constraintTop_toTopOf="@+id/icon" />
                    <androidx.appcompat.widget.AppCompatTextView
                        android:id="@+id/address"
                        android:layout_width="0dp"
                        android:layout_height="wrap_content"
                        android:layout_marginTop="@dimen/dp_4"
                        android:layout_marginRight="@dimen/dp_20"
                        android:maxLines="2"
                        android:text="深圳市宝安区西大街阳光绿色温馨家园17号楼313"
                        android:textColor="@color/gray_6"
                        android:textSize="@dimen/sp_12"
                        app:layout_constraintLeft_toLeftOf="@+id/name"
                        app:layout_constraintRight_toLeftOf="@+id/nav"
                        app:layout_constraintTop_toBottomOf="@+id/name" />
                    <com.xw.common.custom.ShowTextLinearLayout
                        android:id="@+id/stllTag"
                        android:layout_width="0dp"
                        android:layout_height="wrap_content"
                        android:layout_marginTop="@dimen/dp_4"
                        android:layout_marginEnd="@dimen/dp_10"
                        android:orientation="vertical"
                        app:layout_constraintLeft_toLeftOf="@+id/name"
                        app:layout_constraintRight_toLeftOf="@+id/arrow1"
                        app:layout_constraintTop_toBottomOf="@+id/address"
                        app:margin_width="@dimen/dp_8"
                        app:max_padding_width="@dimen/dp_12"
                        app:min_padding_width="@dimen/dp_12"
                        app:padding_height="@dimen/dp_6"
                        app:padding_left="0dp"
                        app:padding_right="0dp"
                        app:text_bg="@drawable/shape_blue1_bg_4"
                        app:text_color="@color/blue_5"
                        app:text_size="@dimen/sp_12" />
                    <androidx.appcompat.widget.AppCompatImageView
                        android:id="@+id/arrow1"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_marginTop="@dimen/dp_8"
                        android:layout_marginEnd="@dimen/dp_20"
                        android:src="@drawable/svg_arrow_r"
                        android:visibility="gone"
                        app:layout_constraintRight_toRightOf="parent"
                        app:layout_constraintTop_toBottomOf="@+id/address" />
                    <LinearLayout
                        android:id="@+id/nav"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_marginTop="@dimen/dp_8"
                        android:layout_marginEnd="@dimen/dp_20"
                        android:orientation="vertical"
                        app:layout_constraintRight_toRightOf="parent"
                        app:layout_constraintTop_toTopOf="parent">
                        <androidx.appcompat.widget.AppCompatImageView
                            android:layout_width="@dimen/dp_20"
                            android:layout_height="@dimen/dp_20"
                            android:layout_gravity="end|center_vertical"
                            android:src="@drawable/svg_map_nav" />
                        <androidx.appcompat.widget.AppCompatTextView
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:text="导航"
                            android:textColor="@color/blue_5"
                            android:textSize="@dimen/sp_10"
                            android:visibility="gone"
                            app:layout_constraintRight_toRightOf="parent" />
                    </LinearLayout>
                </androidx.constraintlayout.widget.ConstraintLayout>
                <View
                    android:layout_width="match_parent"
                    android:layout_height="1px"
                    android:layout_marginHorizontal="@dimen/dp_20"
                    android:layout_marginTop="@dimen/dp_8"
                    android:background="@color/gray_4"
                    app:layout_constraintBottom_toBottomOf="parent" />
                <com.xw.common.custom.ShowTextLinearLayout
                    android:id="@+id/stllTag1"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginHorizontal="20dp"
                    android:layout_marginTop="@dimen/dp_12"
                    android:orientation="vertical"
                    app:margin_width="@dimen/dp_8"
                    app:max_padding_width="@dimen/dp_12"
                    app:min_padding_width="@dimen/dp_12"
                    app:padding_height="@dimen/dp_6"
                    app:padding_left="0dp"
                    app:padding_right="0dp"
                    app:text_bg="@drawable/shape_f8f9fa_bg_4"
                    app:text_color="@color/gray_9"
                    app:text_size="@dimen/sp_12" />
                <androidx.appcompat.widget.AppCompatTextView
                    android:id="@+id/remark"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginHorizontal="@dimen/dp_20"
                    android:layout_marginTop="@dimen/dp_8"
                    android:background="@drawable/shape_gray_3_bg_4"
                    android:padding="@dimen/dp_12"
                    android:text="深圳市宝安区西大街阳光绿色温馨家园17号楼313深圳市宝安区西大街阳光绿色温馨家园17号楼313深圳市宝安区西大街阳光绿色温馨家园17号楼313"
                    android:textColor="@color/gray_7"
                    android:textSize="@dimen/sp_14" />
                <View
                    android:layout_width="match_parent"
                    android:layout_height="1px"
                    android:layout_marginTop="@dimen/dp_38"
                    android:background="@color/gray_4" />
                <com.google.android.material.button.MaterialButton
                    android:id="@+id/btn_error_upload"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginHorizontal="@dimen/dp_20"
                    android:layout_marginVertical="@dimen/dp_12"
                    android:backgroundTint="@color/blue_5"
                    android:text="现场情况上报"
                    android:textSize="@dimen/sp_16"
                    android:textStyle="bold"
                    app:cornerRadius="@dimen/dp_4" />
            </LinearLayout>
        </LinearLayout>
    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>