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 && !viewModel.isClock}" show="@{!viewModel.canClock && !viewModel.isClock && !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 && !viewModel.isClock}" show="@{!viewModel.canClock && !viewModel.isClock && !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>