18034727885
2026-04-27 22e141fc9fc860cf1a720a10bed98d1e83b49604
代客下单页优化兼容自主行程数据
增加代客支付逻辑和功能
11个文件已添加
19个文件已修改
2623 ■■■■■ 已修改文件
app/src/main/AndroidManifest.xml 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/cn/ptaxi/yuekeduocx/driver/bean/OrderPayBean.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/cn/ptaxi/yuekeduocx/driver/bean/ShiftDetail.kt 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/cn/ptaxi/yuekeduocx/driver/bean/UserInfoBean.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/cn/ptaxi/yuekeduocx/driver/bean/WxBean.kt 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/cn/ptaxi/yuekeduocx/driver/extension/FragmentExtension.kt 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/cn/ptaxi/yuekeduocx/driver/netUtls/Api.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/cn/ptaxi/yuekeduocx/driver/ui/DialogUtil.kt 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/cn/ptaxi/yuekeduocx/driver/ui/adapter/MainAdapter.kt 78 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/cn/ptaxi/yuekeduocx/driver/ui/main/MineOrderFragment.kt 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/cn/ptaxi/yuekeduocx/driver/ui/main/ReassignActivity.kt 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/cn/ptaxi/yuekeduocx/driver/ui/main/add_order/AddCityOrderActivity.kt 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/cn/ptaxi/yuekeduocx/driver/ui/main/add_order/SelectStartPointActivity.kt 202 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/cn/ptaxi/yuekeduocx/driver/ui/to_city/AddCityOrderActivity2.kt 521 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/cn/ptaxi/yuekeduocx/driver/ui/to_city/AddCityRouteLineActivity.kt 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/cn/ptaxi/yuekeduocx/driver/ui/to_city/ChangePriceActivity.kt 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/cn/ptaxi/yuekeduocx/driver/ui/to_city/SelectDriverActivity.kt 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/cn/ptaxi/yuekeduocx/driver/ui/widget/InputNumberView.kt 394 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/drawable/circle_994a4c59_bg.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/drawable/shape_1ad33233_bg_4.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/drawable/shape_d9d9d9_line_4.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/drawable/shape_ffe1e1_bg_30.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/activity_add_city_order2.xml 689 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/activity_change_price.xml 102 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/dialog_add_city_route_line_success.xml 110 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/dialog_input_number.xml 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/item_main_list.xml 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/mipmap-xxhdpi/icon_pan_orange.png 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/values/attrs.xml 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/values/colors.xml 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/AndroidManifest.xml
@@ -69,6 +69,9 @@
        tools:remove="android:dataExtractionRules"
        tools:replace="android:allowBackup,android:theme">
        <activity
            android:name=".ui.to_city.ChangePriceActivity"
            android:exported="false" />
        <activity
            android:name=".ui.to_city.AddCityRouteLineActivity"
            android:exported="false" />
        <activity
app/src/main/java/cn/ptaxi/yuekeduocx/driver/bean/OrderPayBean.java
@@ -17,12 +17,16 @@
     */
    private String timestamp;
    @SerializedName("package")
    @SerializedName(value = "package",alternate = "packageStr")
    private String packageX;
    @SerializedName(value = "appId")
    private String appid;
    private String sign;
    @SerializedName(value = "partnerId")
    private String partnerid;
    @SerializedName(value = "prepayId")
    private String prepayid;
    @SerializedName(value = "nonceStr")
    private String noncestr;
    public String tn;
app/src/main/java/cn/ptaxi/yuekeduocx/driver/bean/ShiftDetail.kt
@@ -1,11 +1,17 @@
package cn.ptaxi.yuekeduocx.driver.bean
import android.os.Parcelable
import com.amap.api.maps.AMapUtils
import com.amap.api.maps.model.LatLng
import kotlinx.android.parcel.Parcelize
data class ShiftDetail(
    val code: Int,
    val `data`: ShiftDetailData,
    val msg: String
)
@Parcelize
data class ShiftDetailData(
    val carBrand: String,
    val carColor: String,
@@ -40,5 +46,33 @@
    val endLonLat: String,
    val startTime: String,
    val totalSeat: Int,
    val unitPrice: Double
)
    val unitPrice: Double,
    val sex: String,//性别
    val endDetailList: List<SelfEndAddressPriceInfo>?,//终点详情列表
) : Parcelable {
    //是否是自主行程
    fun isSelfCityRouteLine() = lineId == -1
    //匹配目的地信息
    fun matchEndInfo(endLat: String, endLon: String): SelfEndAddressPriceInfo? {
        return endDetailList?.find {
            AMapUtils.calculateLineDistance(
                LatLng(endLat.toDoubleOrNull() ?: 0.0, endLon.toDoubleOrNull() ?: 0.0),
                LatLng(it.endLat?.toDoubleOrNull() ?: 0.0, it.endLon?.toDoubleOrNull() ?: 0.0)
            ) <= (it.range?.toDoubleOrNull() ?: 0.0)
        }
    }
    //获取显示性别
    fun getShowSex() = if (sex == "1") "男" else "女"
}
@Parcelize
data class SelfEndAddressPriceInfo(
    val endAddress: String?,
    val endCityName: String?,
    val endLon: String?,
    val endLat: String?,
    val price: String?,
    val range: String?,
) : Parcelable {}
app/src/main/java/cn/ptaxi/yuekeduocx/driver/bean/UserInfoBean.java
@@ -389,7 +389,21 @@
    }
    /**
     * 是否能够下线支付
     * 是否允许选座
     */
    public boolean couldSelectSeat() {
        return "1".equalsIgnoreCase(isCanSelectSeat);
    }
    /**
     * 是否可修改金额(1=是,2=否)
     */
    public boolean couldModifyAmount() {
        return "1".equalsIgnoreCase(isCanModifyAmount);
    }
    /**
     * 是否能够线下支付
     */
    public boolean couldOfflinePay() {
        return "1".equalsIgnoreCase(isOfflinePay);
app/src/main/java/cn/ptaxi/yuekeduocx/driver/bean/WxBean.kt
@@ -1,5 +1,7 @@
package cn.ptaxi.yuekeduocx.driver.bean
import com.google.gson.Gson
/**
 * @ClassName WxBean
 * @Description TODO
@@ -9,8 +11,25 @@
 */
data class WxBean(
    val code: Int,
    val `data`: OrderPayBean,
    val `data`: ResultBean,
    val msg: String
)
data class ResultBean(
    val code: Int,
    val `data`: PayBean,
    val msg: String
)
data class PayBean(
    val res: String,
    val paymentOrderId: String,
    val payProductEnum: String,
    val merchantSerialNo: String,
) {
    fun getPayInfoModel(): OrderPayBean {
        return Gson().fromJson(res, OrderPayBean::class.java)
    }
}
app/src/main/java/cn/ptaxi/yuekeduocx/driver/extension/FragmentExtension.kt
New file
@@ -0,0 +1,20 @@
package cn.ptaxi.yuekeduocx.driver.extension
import android.app.Activity
import androidx.fragment.app.Fragment
import org.jetbrains.anko.internals.AnkoInternals.createIntent
//扩展函数 跳转页面并接收结果
inline fun <reified T : Activity> Fragment.extStartActivityForResult(
    requestCode: Int,
    vararg params: Pair<String, Any?>
) = extStartActivityForResult(T::class.java, requestCode, params)
//扩展函数 跳转页面并接收结果
fun Fragment.extStartActivityForResult(
    activity: Class<out Activity>,
    requestCode: Int,
    params: Array<out Pair<String, Any?>>
) {
    this.startActivityForResult(createIntent(context!!, activity, params), requestCode)
}
app/src/main/java/cn/ptaxi/yuekeduocx/driver/netUtls/Api.java
@@ -70,6 +70,7 @@
    public static String queryHistoryActivity = "api/driver/queryHistoryActivity"; //api/driver/queryHistoryActivity 获取历史活动列表
    public static String queryHistoryActivityInfo = "api/driver/queryHistoryActivityInfo"; //api/driver/queryHistoryActivityInfo 获取历史日期中的活动内容
    public static String queryNeedCertificate = "base/driver/queryNeedCertificate"; //base/driver/queryNeedCertificate 注册完善个人信息根据选择的从业地判断是否需要网约车资格证
    public static String addSelfTrip = "api/crossCity/addSelfTrip"; //api/crossCity/addSelfTrip 添加自主行程
    /***
     * 订单中
@@ -148,9 +149,12 @@
    public static String queryDriver = "api/lineSite/queryDriver"; // api/lineSite/queryDriver 根据线路id获取线路排班数据
    public static String queryLines = "api/line/scanCodeQueryLines"; ///api/line/scanCodeQueryLines 获取司机对应的线路
    public static String queryLocation = "api/lineSite/queryLocation"; // /api/lineSite/queryLocation 根据站点id获取站点的区域范围数据(设置上车点和下车点)
    public static String selfLineQueryLocation = "api/selfLine/queryLocation"; // /api/selfLine/queryLocation 根据线路司机id获取区域范围数据(设置上车点和下车点)
    public static String areaMonitoring = "api/lineSite/areaMonitoring"; ///api/lineSite/areaMonitoring 判断一个点是是否在区域范围内
    public static String selfLineAreaMonitoring = "api/selfLine/areaMonitoring"; ///api/selfLine/areaMonitoring 判断一个点是是否在区域范围内
    public static String queryOrderMoney = "api/line/queryOrderMoney"; ///api/line/queryOrderMoney 获取跨城的支付金额
    public static String payTaxiOrder = "api/order/payTaxiOrder"; ///api/order/payTaxiOrder 订单完成支付订单操作
    public static String orderOnBehalfPay = "api/orderCrossCity/orderOnBehalfPay"; ///api/order/payTaxiOrder 代客下单订单完成支付订单操作
    public static String queryLines_by_line = "api/line/queryLines"; ////api/line/queryLines
    public static String querySeat = "api/lineSite/querySeat"; //api/lineSite/querySeat 根据司机的排班id获取剩余座位数据
app/src/main/java/cn/ptaxi/yuekeduocx/driver/ui/DialogUtil.kt
@@ -23,12 +23,13 @@
import cn.ptaxi.yuekeduocx.driver.utils.citypickerview.picker.widget.listener.OnOptionsSelectListener
import cn.ptaxi.yuekeduocx.driver.utils.clickDelay
import cn.ptaxi.yuekeduocx.driver.utils.gone
import cn.ptaxi.yuekeduocx.driver.utils.visible
import cn.sinata.xldutils.utils.DensityUtil
import com.zlzf.zl_payaccount.citypicker.Interface.OnCityItemClickListener
import com.zlzf.zl_payaccount.citypicker.citywheel.CityConfig
import com.zlzf.zl_payaccount.citypicker.style.citylist.Toast.ToastUtils
import com.zlzf.zl_payaccount.citypicker.style.citypickerview.CityPickerView
import kotlinx.android.synthetic.main.dialog_input_number.view.inv_number
import kotlinx.android.synthetic.main.dialog_input_number.view.tv_input_label
import kotlinx.android.synthetic.main.dialog_server_mode.view.rl_server_mode
import kotlinx.android.synthetic.main.dialog_server_mode.view.tv_cancel_server_mode
import kotlinx.android.synthetic.main.dialog_server_mode.view.tv_ok_server_mode
@@ -450,12 +451,6 @@
    ): EasyPopup {
        var pop = getPopupwindow(activity, R.layout.pop_pay)
        pop.showDown(activity.window.decorView)
        val couldOfflinePay = CacheKey.getUserInfo().couldOfflinePay()
        if (couldOfflinePay) {
            pop.contentView.btn_money.visible()
        } else {
            pop.contentView.btn_money.gone()
        }
        pop.contentView.btn_money.clickDelay {
            resultListener.invoke("3")
            pop.dismiss()
@@ -491,6 +486,8 @@
    ): EasyPopup {
        var pop = getPopupwindow(activity, R.layout.popup_window_choice_valet_pay_type)
        pop.showDown(activity.window.decorView)
        pop.contentView.ll_offline_pay.visibility =
            if (CacheKey.getUserInfo().couldOfflinePay()) View.VISIBLE else View.GONE
        var type = ""
        pop.contentView.ll_driver_pay.clickDelay {
            pop.contentView.iv_driver_pay.setImageResource(R.mipmap.icon_tick_circle_red)
@@ -523,4 +520,23 @@
        }
        return pop
    }
    //获取显示输入数字弹窗
    fun getInputNumberDialog(
        context: Context,
        value: String,
        digitCount: Int,
        completeListener: (String) -> Unit,
    ): Dialog {
        val dialog = getDialog(context, R.layout.dialog_input_number)
        val view = getView(dialog)
        view.tv_input_label.text = "请输入客户手机后${digitCount}位"
        view.inv_number.digitCount = digitCount
        view.inv_number.value = value
        view.inv_number.setOnInputCompleteListener {
            completeListener.invoke(it)
            dialog.dismiss()
        }
        return dialog
    }
}
app/src/main/java/cn/ptaxi/yuekeduocx/driver/ui/adapter/MainAdapter.kt
@@ -3,26 +3,23 @@
import android.view.View
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import cn.ptaxi.yuekeduocx.driver.R
import cn.ptaxi.yuekeduocx.driver.base.BaseRvAdapter
import cn.ptaxi.yuekeduocx.driver.base.BaseViewHolder
import cn.ptaxi.yuekeduocx.driver.base.Const
import cn.ptaxi.yuekeduocx.driver.base.MyBaseActivity
import cn.sinata.xldutils.utils.*
import cn.ptaxi.yuekeduocx.driver.R
import cn.ptaxi.yuekeduocx.driver.base.*
import cn.ptaxi.yuekeduocx.driver.bean.OrderListBean
import cn.ptaxi.yuekeduocx.driver.netUtls.Api
import cn.ptaxi.yuekeduocx.driver.netUtls.callNet
import cn.ptaxi.yuekeduocx.driver.netUtls.getMapByAny
import cn.ptaxi.yuekeduocx.driver.ui.DialogUtil
import cn.ptaxi.yuekeduocx.driver.ui.main.*
import cn.ptaxi.yuekeduocx.driver.ui.main.add_order.PayQrCodeActivity
import cn.ptaxi.yuekeduocx.driver.ui.main.OrderOverActivity
import cn.ptaxi.yuekeduocx.driver.ui.main.ReassignNewActivity
import cn.ptaxi.yuekeduocx.driver.ui.main.TripActivity
import cn.ptaxi.yuekeduocx.driver.ui.main.TripPoolingActivity
import cn.ptaxi.yuekeduocx.driver.ui.main.major.MajorSureMoneyActivity
import cn.ptaxi.yuekeduocx.driver.ui.main.small_cargo.SmallCargoActivity
import cn.ptaxi.yuekeduocx.driver.ui.main.small_cargo.SmallOverActivity
import cn.ptaxi.yuekeduocx.driver.ui.pub.ImageActivity
import cn.ptaxi.yuekeduocx.driver.ui.to_city.TripCityActivity
import cn.ptaxi.yuekeduocx.driver.utils.Cache.CacheKey
import cn.ptaxi.yuekeduocx.driver.utils.clickDelay
import cn.ptaxi.yuekeduocx.driver.utils.doubleTwo
import cn.ptaxi.yuekeduocx.driver.utils.glide.GlideUtil
@@ -30,14 +27,30 @@
import cn.ptaxi.yuekeduocx.driver.utils.setDrawableLeft
import cn.ptaxi.yuekeduocx.driver.utils.textColor
import cn.ptaxi.yuekeduocx.driver.utils.visible
import com.tencent.mm.opensdk.modelbiz.WXLaunchMiniProgram
import com.tencent.mm.opensdk.openapi.WXAPIFactory
import kotlinx.android.synthetic.main.activity_reassign.*
import kotlinx.android.synthetic.main.item_main_list.view.*
import kotlinx.android.synthetic.main.pop_pay_city.view.*
import kotlinx.android.synthetic.main.item_main_list.view.iv_image_mine
import kotlinx.android.synthetic.main.item_main_list.view.ll_drover_img
import kotlinx.android.synthetic.main.item_main_list.view.ll_small_cargo
import kotlinx.android.synthetic.main.item_main_list.view.ll_user_img
import kotlinx.android.synthetic.main.item_main_list.view.recycler_view_user_img2
import kotlinx.android.synthetic.main.item_main_list.view.rl_overtime
import kotlinx.android.synthetic.main.item_main_list.view.tv_cancel
import kotlinx.android.synthetic.main.item_main_list.view.tv_end
import kotlinx.android.synthetic.main.item_main_list.view.tv_money_cargo
import kotlinx.android.synthetic.main.item_main_list.view.tv_overtime
import kotlinx.android.synthetic.main.item_main_list.view.tv_pay
import kotlinx.android.synthetic.main.item_main_list.view.tv_people_num
import kotlinx.android.synthetic.main.item_main_list.view.tv_pooling
import kotlinx.android.synthetic.main.item_main_list.view.tv_remark
import kotlinx.android.synthetic.main.item_main_list.view.tv_smart_time_show
import kotlinx.android.synthetic.main.item_main_list.view.tv_start
import kotlinx.android.synthetic.main.item_main_list.view.tv_statue
import kotlinx.android.synthetic.main.item_main_list.view.tv_time
import kotlinx.android.synthetic.main.item_main_list.view.tv_type
import org.jetbrains.anko.startActivity
class MainAdapter : BaseRvAdapter<OrderListBean.DataBean>() {
    //代客支付监听
    private var valetPayListener: ((item: OrderListBean.DataBean) -> Unit)? = null
    override fun getLayoutResId(viewType: Int): Int {
        return R.layout.item_main_list
    }
@@ -47,7 +60,6 @@
            it.itemView.rl_overtime.gone()
            it.itemView.tv_cancel.gone()
            it.itemView.tv_pay.gone()
            it.itemView.tv_qr.gone()
            it.itemView.tv_people_num.setDrawableLeft(R.drawable.bg_point_black)
            it.itemView.tv_remark.setDrawableLeft(R.drawable.bg_point_black)
            it.itemView.ll_drover_img.visible()
@@ -69,7 +81,7 @@
                    if (item.rideType == "3") {
                        it.itemView.tv_statue.text = item.statePinStr()
//                        it.itemView.tv_statue.textColor(context, if (it.itemView.tv_statue.getContent() == "服务中") R.color.main_blue else R.color.gray_93)
                        it.itemView.tv_statue.textColor(context,R.color.main_blue)
                        it.itemView.tv_statue.textColor(context, R.color.main_blue)
                        it.itemView.tv_type.text = "专车拼车订单"
                        it.itemView.tv_people_num.visible()
                        it.itemView.tv_people_num.setDrawableLeft(R.mipmap.icon_people_gray)
@@ -79,14 +91,17 @@
                            context,
                            if (item.spellSuccess == "0") R.color.white else R.color.main_blue
                        )
                        it.itemView.tv_pooling.text = if (item.spellSuccess == "0") "未拼成" else "已拼成"
                        it.itemView.tv_pooling.text =
                            if (item.spellSuccess == "0") "未拼成" else "已拼成"
                        it.itemView.tv_pooling.isSelected = item.spellSuccess == "0"
                    }
                }
                2 -> {
                    it.itemView.tv_people_num.gone()
                    it.itemView.tv_remark.gone()
                }
                3 -> {
                    it.itemView.tv_people_num.visible()
                    it.itemView.tv_remark.visible()
@@ -100,7 +115,6 @@
                    if (item.state == 7) {
                        it.itemView.tv_cancel.visible()
                        it.itemView.tv_pay.visible()
                        it.itemView.tv_qr.visible()
                        it.itemView.tv_cancel.setOnClickListener {
                            DialogUtil.getDelAndSureDialog(context, "是否取消此订单?", {}, {
                                var map = getMapByAny()
@@ -115,23 +129,16 @@
                            })
                        }
                        it.itemView.tv_pay.setOnClickListener {
                            val api = WXAPIFactory.createWXAPI(context, Const.WX_APP_ID, true)
                            val req = WXLaunchMiniProgram.Req()
                            req.userName = "gh_b291a8beb1cb"
                            req.path = "pages/orderDetail/orderDetail?orderId=${item.id}&driverId=${CacheKey.getUserId()}"
                            req.miniprogramType = Api.MINI_TYPE
                            api.sendReq(req)
                        }
                        it.itemView.tv_qr.setOnClickListener {
                            val act = context as MyBaseActivity
                            act.startActivity<PayQrCodeActivity>("money" to item!!.payMoney)
                            valetPayListener?.invoke(item)
                        }
                    }
                }
                4, 5 -> {
                    it.itemView.rl_overtime.visible()
                    if (item.arriveTimeExpect.isNotEmpty()) {
                        it.itemView.tv_smart_time_show.text = "要求送达时间:" + item.arriveTimeExpect
                        it.itemView.tv_smart_time_show.text =
                            "要求送达时间:" + item.arriveTimeExpect
                    } else {
                        it.itemView.rl_overtime.gone()
                    }
@@ -180,12 +187,14 @@
                                "orderType" to item.type.toString()
                            )
                        }
                        6, 9,10 -> {
                        6, 9, 10 -> {
                            context.startActivity<SmallOverActivity>(
                                "orderId" to item.id.toString(),
                                "orderType" to item.type.toString()
                            )
                        }
                        11 -> {
                            context.startActivity<ReassignNewActivity>(
                                "orderId" to item.id.toString(),
@@ -204,6 +213,7 @@
                                "orderType" to item.type.toString()
                            )
                        }
                        6 -> {
                            if (item.type.toString() == "1") {
                                context.startActivity<MajorSureMoneyActivity>(
@@ -218,18 +228,21 @@
                                )
                            }
                        }
                        7, 12 -> {
                            context.startActivity<OrderOverActivity>(
                                "orderId" to item.id.toString(),
                                "orderType" to item.type.toString()
                            )
                        }
                        8, 9, 10 -> {
                            context.startActivity<OrderOverActivity>(
                                "orderId" to item.id.toString(),
                                "orderType" to item.type.toString()
                            )
                        }
                        11 -> {
                            context.startActivity<ReassignNewActivity>(
                                "orderId" to item.id.toString(),
@@ -274,9 +287,11 @@
                            11 -> {
                                toast("订单改派中")
                            }
                            7, 12 -> {
                                toast("订单待支付")
                            }
                            10 -> {
                                toast("订单已取消")
                            }
@@ -294,4 +309,9 @@
            }
        }
    }
    //设置代客支付监听
    fun setValetPayListener(valetPayListener: ((item: OrderListBean.DataBean) -> Unit)?) {
        this.valetPayListener = valetPayListener
    }
}
app/src/main/java/cn/ptaxi/yuekeduocx/driver/ui/main/MineOrderFragment.kt
@@ -1,14 +1,24 @@
package cn.ptaxi.yuekeduocx.driver.ui.main
import android.app.Activity
import android.content.Intent
import android.view.View
import cn.ptaxi.yuekeduocx.driver.base.BaseEvent
import cn.ptaxi.yuekeduocx.driver.base.BaseRecyclerFragment
import cn.ptaxi.yuekeduocx.driver.bean.AlipayBean
import cn.ptaxi.yuekeduocx.driver.bean.OrderListBean
import cn.ptaxi.yuekeduocx.driver.bean.WxBean
import cn.ptaxi.yuekeduocx.driver.extension.extStartActivityForResult
import cn.ptaxi.yuekeduocx.driver.netUtls.Api
import cn.ptaxi.yuekeduocx.driver.netUtls.callNet
import cn.ptaxi.yuekeduocx.driver.netUtls.getMapByAny
import cn.ptaxi.yuekeduocx.driver.ui.DialogUtil
import cn.ptaxi.yuekeduocx.driver.ui.adapter.MainAdapter
import java.util.HashMap
import cn.ptaxi.yuekeduocx.driver.ui.main.add_order.PayQrCodeActivity
import cn.ptaxi.yuekeduocx.driver.utils.toast
import cn.ptaxi.yuekeduocx.driver.wxapi.WXPayEntryActivity
class MineOrderFragment:BaseRecyclerFragment<OrderListBean.DataBean>(MainAdapter()) {
class MineOrderFragment : BaseRecyclerFragment<OrderListBean.DataBean>(MainAdapter()) {
    var state = 1 //1=全部,2=待支付,3=已取消
@@ -17,7 +27,7 @@
    }
    override fun mapObject(): HashMap<String?, Any?>? {
        var map = getMapByAny()
        val map = getMapByAny()
        map["state"] = state
        return map
    }
@@ -27,7 +37,7 @@
    }
    override fun getDatas(t: String?): List<OrderListBean.DataBean> {
        var data = gson.fromJson<OrderListBean>(t,OrderListBean::class.java)
        val data = gson.fromJson<OrderListBean>(t, OrderListBean::class.java)
        return data.data
    }
@@ -35,7 +45,51 @@
    }
    override fun initView() {
        (adapter as MainAdapter).setValetPayListener {
            DialogUtil.getValetPayTypeChoiceDialog(context as Activity) { type ->
                pay(type, it.id.toString())
            }
        }
    }
    //支付
    private fun pay(type: String, orderId: String) {
        val map = getMapByAny()
        map["crossCityOrderId"] = orderId
        map["orderType"] = "3"
        map["type"] = type
        callNet(Api.orderOnBehalfPay, map) {
            if (type == "1") {//微信支付
                val data = gson.fromJson<WxBean>(it, WxBean::class.java)
                WXPayEntryActivity.to(context, 1, data.data.data.getPayInfoModel())
            }
            if (type == "2") {//乘客
                val data = gson.fromJson<AlipayBean>(it, AlipayBean::class.java)
                if (data.data.isNullOrEmpty()) {
                    toast("无法使用二维码支付")
                    return@callNet
                }
                extStartActivityForResult<PayQrCodeActivity>(1, "url" to data.data)
            }
            if (type == "3") {//线下
                refresh()
            }
        }
    }
    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (requestCode == 1) {
            refresh()
        }
    }
    override fun onEventMainThread(event: BaseEvent?) {
        super.onEventMainThread(event)
        when (event!!.code) {
            BaseEvent.PAY_SUCCESS -> {
                refresh()
            }
        }
    }
}
app/src/main/java/cn/ptaxi/yuekeduocx/driver/ui/main/ReassignActivity.kt
@@ -1,5 +1,6 @@
package cn.ptaxi.yuekeduocx.driver.ui.main
import android.app.Activity
import android.content.Intent
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
@@ -45,6 +46,8 @@
        ReassignAdapter()
    }
    //支付类型
    var payType = ""
    override fun setContentView() {
        setContentView(R.layout.activity_reassign)
    }
@@ -103,6 +106,7 @@
    }
    private fun showPat(payType: String) {
        this.payType = payType
        if (orderType == "3") {
            callGp(payType)
            return
@@ -126,11 +130,11 @@
            if (payType == "4") {
                var data = gson.fromJson<WxBean>(it, WxBean::class.java)
                MyApplication.isPlayVoice = false
                UPPayAssistEx.startPay(this, null, null, data.data.tn, "00")
                UPPayAssistEx.startPay(this, null, null, data.data.data.getPayInfoModel().tn, "00")
            }
            if (payType == "1") {
                var data = gson.fromJson<WxBean>(it, WxBean::class.java)
                WXPayEntryActivity.to(this, 1, data.data)
                WXPayEntryActivity.to(this, 1, data.data.data.getPayInfoModel())
            }
            if (payType == "3" || payType.isEmpty()) {
                toast("改派申请已提交")
@@ -141,6 +145,7 @@
                        orderId!!.toString()
                    )
                )
                setResult(Activity.RESULT_OK, Intent())
                finish()
            }
@@ -165,7 +170,7 @@
            }
            if (payType == "1") {
                var data = gson.fromJson<WxBean>(it, WxBean::class.java)
                WXPayEntryActivity.to(this, 1, data.data)
                WXPayEntryActivity.to(this, 1, data.data.data.getPayInfoModel())
            }
            if (payType == "3" || payType.isEmpty()) {
                toast("改派申请已提交")
@@ -176,13 +181,14 @@
                        orderId!!.toString()
                    )
                )
                setResult(Activity.RESULT_OK,Intent())
                finish()
            }
            if (payType == "4") {
                var data = gson.fromJson<WxBean>(it, WxBean::class.java)
                MyApplication.isPlayVoice = false
                UPPayAssistEx.startPay(this, null, null, data.data.tn, "00")
                UPPayAssistEx.startPay(this, null, null, data.data.data.getPayInfoModel().tn, "00")
            }
        }
    }
@@ -204,6 +210,7 @@
                orderId!!.toString()
            )
        )
        setResult(Activity.RESULT_OK,Intent())
        finish()
    }
@@ -217,6 +224,7 @@
//            if(orderBean.data.orderState == 11){
//                toast("改派申请已提交")
//                EventBus.getDefault().post(BaseEvent(BaseEvent.REAGASSIGN_SUCCESS))
//                setResult(Activity.RESULT_OK,Intent())
//                finish()
//            }
//        }
@@ -224,6 +232,9 @@
    override fun onRestart() {
        super.onRestart()
        if (payType == "1") {
            return
        }
        var map = getMapByAny()
        map["orderId"] = orderId
        map["orderType"] = orderType
@@ -238,6 +249,7 @@
                        orderId!!.toString()
                    )
                )
                setResult(Activity.RESULT_OK,Intent())
                finish()
            }
        }
@@ -255,4 +267,25 @@
            MyApplication.isPlayVoice = true
        }
    }
    override fun onEventMainThread(event: BaseEvent?) {
        super.onEventMainThread(event)
        when (event!!.code) {
            BaseEvent.PAY_SUCCESS -> {
                if (isFinishing || isDestroy) {
                    return
                }
                toast("改派申请已提交")
                EventBus.getDefault().post(
                    BaseEvent(
                        BaseEvent.REAGASSIGN_SUCCESS,
                        orderId!!.toString(),
                        orderId!!.toString()
                    )
                )
                setResult(Activity.RESULT_OK,Intent())
                finish()
            }
        }
    }
}
app/src/main/java/cn/ptaxi/yuekeduocx/driver/ui/main/add_order/AddCityOrderActivity.kt
@@ -425,7 +425,7 @@
        callNet(Api.payTaxiOrder, map) {
            if (paytype == "1"){
                var data = gson.fromJson<WxBean>(it,WxBean::class.java)
                WXPayEntryActivity.to(this, 1, data.data)
                WXPayEntryActivity.to(this, 1, data.data.data.getPayInfoModel())
            }
            if (paytype == "2") {
                var data = gson.fromJson<AlipayBean>(it, AlipayBean::class.java)
@@ -434,7 +434,7 @@
            if (paytype == "4") {
                var data = gson.fromJson<WxBean>(it, WxBean::class.java)
                MyApplication.isPlayVoice = false
                UPPayAssistEx.startPay(this,null,null,data.data.tn,"00")
                UPPayAssistEx.startPay(this,null,null,data.data.data.getPayInfoModel().tn,"00")
            }
            if (paytype == "3" || paytype.isEmpty()) {
                var data = gson.fromJson<AlipayBean>(it, AlipayBean::class.java)
app/src/main/java/cn/ptaxi/yuekeduocx/driver/ui/main/add_order/SelectStartPointActivity.kt
@@ -15,7 +15,6 @@
import cn.ptaxi.yuekeduocx.driver.netUtls.getMapByAny
import cn.ptaxi.yuekeduocx.driver.utils.clickDelay
import com.amap.api.fence.GeoFence
import com.amap.api.fence.GeoFenceListener
import com.amap.api.maps.AMap
import com.amap.api.maps.model.LatLng
import com.amap.api.maps.model.Marker
@@ -59,6 +58,10 @@
        intent.getStringExtra("cityName")
    }
    val lineShiftDriverId by lazy {
        intent.getStringExtra("lineShiftDriverId")
    }
    val lonLat by lazy {
        intent.getStringExtra("lonLat")
    }
@@ -70,11 +73,6 @@
    //标题
    val title by lazy {
        intent.getStringExtra("title")
    }
    //是否使用站点
    val useSite by lazy {
        intent.getBooleanExtra("useSite", true)
    }
    var map: AMap? = null
@@ -101,64 +99,75 @@
        tv_city_name.text = ""
        callDistrict()
        searchByCityName()
        searchByLineShiftDriverId()
        tv_sure.clickDelay {
            if (currentPosition == null) {
                toast("加载中请稍等...")
                return@clickDelay
            }
            AMapKit.getAddress(
                this,
                currentPosition!!.latitude,
                currentPosition!!.longitude
            ) { adcode ->
                if (adcode.isNullOrEmpty()) {
                    toast("查询失败,请重试")
                    return@getAddress
                }
                if (!useSite) {
                    currentPosition?.let {
                        EventBus.getDefault().post(
                            BaseEvent(
                                BaseEvent.SELECT_POINT_SITE_DETAIL,
                                currentSiteStr,
                                currentPosition!!.latitude.toString(),
                                it.longitude.toString()
                            )
                        )
                        onBackPressed()
                    }
                    return@getAddress
                }
                var map = getMapByAny()
                map["code"] = adcode
            validateAddress(currentPosition!!)
        }
    }
    //验证地址
    private fun validateAddress(currentPosition: LatLng) {
        if (TextUtils.isEmpty(startCityId) && TextUtils.isEmpty(endCityId)) {
            if (TextUtils.isEmpty(lineShiftDriverId)) {
                selectSuccess(currentPosition)
            } else {
                val map = getMapByAny()
                map["lonLat"] =
                    currentPosition!!.longitude.toString() + "," + currentPosition!!.latitude.toString()
                map["siteId"] = if (startCityId.isNullOrEmpty()) endCityId else startCityId
                callNet(Api.areaMonitoring, map) {
                    var bean = gson.fromJson<QueryPositionBean>(it, QueryPositionBean::class.java)
                    currentPosition.longitude.toString() + "," + currentPosition.latitude.toString()
                map["lineShiftDriverId"] = lineShiftDriverId
                map["type"] = type
                callNet(Api.selfLineAreaMonitoring, map) {
                    val bean = gson.fromJson<QueryPositionBean>(it, QueryPositionBean::class.java)
                    if (bean.data == -1) {
                        toast("您选择的地址不在服务范围内")
                        return@callNet
                    } else {
                        currentPosition?.let {
                            EventBus.getDefault().post(
                                BaseEvent(
                                    BaseEvent.SELECT_POINT_SITE_DETAIL,
                                    currentSiteStr,
                                    currentPosition!!.latitude.toString(),
                                    it.longitude.toString()
                                )
                            )
                            onBackPressed()
                        }
                        selectSuccess(currentPosition)
                    }
                }
            }
            return
        }
        AMapKit.getAddress(this, currentPosition.latitude, currentPosition.longitude) { adcode ->
            if (adcode.isNullOrEmpty()) {
                toast("查询失败,请重试")
                return@getAddress
            }
            val map = getMapByAny()
            map["code"] = adcode
            map["lonLat"] =
                currentPosition.longitude.toString() + "," + currentPosition.latitude.toString()
            map["siteId"] = if (startCityId.isNullOrEmpty()) endCityId else startCityId
            callNet(Api.areaMonitoring, map) {
                val bean = gson.fromJson<QueryPositionBean>(it, QueryPositionBean::class.java)
                if (bean.data == -1) {
                    toast("您选择的地址不在服务范围内")
                    return@callNet
                } else {
                    selectSuccess(currentPosition)
                }
            }
        }
    }
    private fun moveLisener() {
    //选择成功
    private fun selectSuccess(currentPosition: LatLng) {
        EventBus.getDefault().post(
            BaseEvent(
                BaseEvent.SELECT_POINT_SITE_DETAIL,
                currentSiteStr,
                currentPosition.latitude.toString(),
                currentPosition.longitude.toString()
            )
        )
        onBackPressed()
    }
    private fun moveListener() {
        AMapKit.addMapMoveListener(map!!, marker!!) { position ->
            currentPosition = LatLng(position.latitude, position.longitude)
            searchPoint(position)
@@ -205,7 +214,7 @@
            }?.also { it ->
                if (!lonLat.isNullOrEmpty()) {
                    val split = lonLat.split(",")
                    val latLng = LatLng(split[0].toDouble(), split[1].toDouble())
                    val latLng = LatLng(split[1].toDouble(), split[0].toDouble())
                    AMapKit.moveCamera(map!!, latLng) {
                        if (isFinishing || isDestroy) {
                            return@moveCamera
@@ -214,22 +223,60 @@
                    }
                    return@also
                }
                AMapKit.searchByText(this, "${it}火车站", it, object : PoiSearch.OnPoiSearchListener {
                    override fun onPoiSearched(p0: PoiResult?, p1: Int) {
                        p0?.pois?.firstOrNull()?.also {
                            val latLng = LatLng(it.latLonPoint.latitude, it.latLonPoint.longitude)
                            AMapKit.moveCamera(map!!, latLng) {
                                if (isFinishing || isDestroy) {
                                    return@moveCamera
                AMapKit.searchByText(
                    this,
                    "${it}火车站",
                    it,
                    object : PoiSearch.OnPoiSearchListener {
                        override fun onPoiSearched(p0: PoiResult?, p1: Int) {
                            p0?.pois?.firstOrNull()?.also {
                                val latLng =
                                    LatLng(it.latLonPoint.latitude, it.latLonPoint.longitude)
                                AMapKit.moveCamera(map!!, latLng) {
                                    if (isFinishing || isDestroy) {
                                        return@moveCamera
                                    }
                                    addMk(latLng)
                                }
                                addMk(latLng)
                            }
                        }
                    }
                    override fun onPoiItemSearched(p0: PoiItem?, p1: Int) {
                        override fun onPoiItemSearched(p0: PoiItem?, p1: Int) {
                        }
                    })
            }
        }
    }
    //通过线路司机id搜索
    private fun searchByLineShiftDriverId() {
        map_view.post {
            lineShiftDriverId?.takeIf {
                it.isNotEmpty()
            }?.also { it ->
                val map = getMapByAny()
                map["lineShiftDriverId"] = it
                map["type"] = type
                callNet(Api.selfLineQueryLocation, map) {
                    val bean = gson.fromJson<DistrictQueryBean>(it, DistrictQueryBean::class.java)
                    for (item in bean.data) {
                        if (item.type == 1) { //    integer($int32)  区域类型(1=行政区域,2=电子围栏)
                            var contentStr = ""
                            if (item.province.isNotEmpty()) {
                                contentStr = item.province
                            }
                            if (item.city.isNotEmpty()) {
                                contentStr = item.city
                            }
                            if (item.district.isNotEmpty()) {
                                contentStr = item.district
                            }
                            searchName(contentStr)
                        } else {
                            addPointList(item.coordinate)
                        }
                    }
                })
                }
            }
        }
    }
@@ -241,7 +288,7 @@
        val map = getMapByAny()
        map["siteId"] = if (startCityId.isNullOrEmpty()) endCityId else startCityId
        callNet(Api.queryLocation, map) {
            var bean = gson.fromJson<DistrictQueryBean>(it, DistrictQueryBean::class.java)
            val bean = gson.fromJson<DistrictQueryBean>(it, DistrictQueryBean::class.java)
            for (item in bean.data) {
                if (item.type == 1) { //    integer($int32)  区域类型(1=行政区域,2=电子围栏)
                    var contentStr = ""
@@ -263,13 +310,13 @@
    }
    private fun addPointList(coordinate: String) {
        var latAll = coordinate.split(";")
        val latAll = coordinate.split(";")
        if (latAll.size > 2) {
            var allLat = mutableListOf<LatLng>()
            val allLat = mutableListOf<LatLng>()
            for (item in latAll) {
                var point = item.split(",")
                val point = item.split(",")
                if (point.size == 2) {
                    var lat = LatLng(point[1].toDouble(), point[0].toDouble())
                    val lat = LatLng(point[1].toDouble(), point[0].toDouble())
                    allLat.add(lat)
                }
            }
@@ -291,8 +338,8 @@
//            })
        }
        if (latAll.size == 2) {
            var point = latAll[0].split(",")
            var dpoint = LatLng(point[1].toDouble(), point[0].toDouble())
            val point = latAll[0].split(",")
            val dpoint = LatLng(point[1].toDouble(), point[0].toDouble())
            AMapKit.drawCricle(this, map!!, dpoint, latAll[1].toDouble())
            AMapKit.moveCamera(map!!, dpoint)
            addMk(LatLng(dpoint.latitude, dpoint.longitude))
@@ -304,8 +351,8 @@
    }
    fun searchName(str: String) {
        AMapKit.drawFenceByCity(this, str, GeoFenceListener { p0, p1, p2 ->
    private fun searchName(str: String) {
        AMapKit.drawFenceByCity(this, str) { p0, p1, _ ->
            if (p1 == GeoFence.ADDGEOFENCE_SUCCESS) {
                for (item in p0) {
                    for (itemP in item.pointList) {
@@ -324,18 +371,15 @@
                    }
                }
            }
        })
        }
    }
    fun addFirstMarket() {
    }
    fun addMk(lat: LatLng) {
    private fun addMk(lat: LatLng) {
        if (marker == null) {
            val view = createView(R.layout.item_map_point, this)
            marker = AMapKit.addMarker(map!!, lat.latitude, lat.longitude, view, "12")
            currentPosition = marker?.position
            moveLisener()
            moveListener()
            getAddress(this, currentPosition!!.latitude, currentPosition!!.longitude) {
                tv_city_name.text = it
            }
@@ -345,10 +389,10 @@
    /***
     * 逆地址编码
     */
    fun getAddress(context: Context, lat: Double, lon: Double, function: (String) -> Unit) {
        var geocoderSearch = GeocodeSearch(context);
    private fun getAddress(context: Context, lat: Double, lon: Double, function: (String) -> Unit) {
        val geocoderSearch = GeocodeSearch(context);
        // 第一个参数表示一个Latlng,第二参数表示范围多少米,第三个参数表示是火系坐标系还是GPS原生坐标系
        var query = RegeocodeQuery(LatLonPoint(lat, lon), 500f, GeocodeSearch.AMAP);
        val query = RegeocodeQuery(LatLonPoint(lat, lon), 500f, GeocodeSearch.AMAP);
        geocoderSearch.getFromLocationAsyn(query);
        geocoderSearch.setOnGeocodeSearchListener(object : GeocodeSearch.OnGeocodeSearchListener {
            override fun onRegeocodeSearched(p0: RegeocodeResult?, p1: Int) {
@@ -393,7 +437,7 @@
        when (event!!.code) {
            BaseEvent.SELECT_SEARCH_SITE -> {
                isSelectFirst = true
                var list = event!!.msgthree.split(",")
                val list = event.msgthree.split(",")
                if (list.size == 2) {
                    tv_site.text = list[0]
                    tv_site_detail.text = list[1]
app/src/main/java/cn/ptaxi/yuekeduocx/driver/ui/to_city/AddCityOrderActivity2.kt
@@ -1,50 +1,71 @@
package cn.ptaxi.yuekeduocx.driver.ui.to_city
import android.Manifest
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.os.Environment
import android.provider.MediaStore
import androidx.core.view.drawToBitmap
import android.app.Activity
import android.content.Intent
import android.text.TextUtils
import android.view.View
import androidx.core.widget.addTextChangedListener
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.LinearLayoutManager
import cn.ptaxi.yuekeduocx.driver.R
import cn.sinata.xldutils.utils.SpanBuilder
import cn.sinata.xldutils.utils.StringUtils
import cn.ptaxi.yuekeduocx.driver.utils.clickDelay
import com.amap.api.location.AMapLocationClient
import com.amap.api.location.AMapLocationListener
import cn.ptaxi.yuekeduocx.driver.base.BaseEvent
import cn.ptaxi.yuekeduocx.driver.base.Const
import cn.ptaxi.yuekeduocx.driver.base.MyBaseActivity
import cn.ptaxi.yuekeduocx.driver.base.gaode.AMapKit
import cn.ptaxi.yuekeduocx.driver.bean.AddOrderBean
import cn.ptaxi.yuekeduocx.driver.bean.AlipayBean
import cn.ptaxi.yuekeduocx.driver.bean.SeatBean
import cn.ptaxi.yuekeduocx.driver.bean.ShiftDetail
import cn.ptaxi.yuekeduocx.driver.bean.ShiftDetailData
import cn.ptaxi.yuekeduocx.driver.bean.WxBean
import cn.ptaxi.yuekeduocx.driver.netUtls.Api
import cn.ptaxi.yuekeduocx.driver.netUtls.callNet
import cn.ptaxi.yuekeduocx.driver.netUtls.callNetGet
import cn.ptaxi.yuekeduocx.driver.netUtls.getMapByAny
import cn.ptaxi.yuekeduocx.driver.ui.DialogUtil
import cn.ptaxi.yuekeduocx.driver.ui.adapter.SeatAdapter
import cn.ptaxi.yuekeduocx.driver.ui.adapter.PopPeopleNUmAdapter
import cn.ptaxi.yuekeduocx.driver.ui.adapter.SelectNumberAdapter
import cn.ptaxi.yuekeduocx.driver.ui.main.add_order.PayQrCodeActivity
import cn.ptaxi.yuekeduocx.driver.ui.main.add_order.SelectStartPointActivity
import cn.ptaxi.yuekeduocx.driver.ui.pub.ImageActivity
import cn.ptaxi.yuekeduocx.driver.utils.Cache.CacheKey
import cn.ptaxi.yuekeduocx.driver.utils.glide.GlideUtil
import com.tbruyelle.rxpermissions2.RxPermissions
import com.tencent.mm.opensdk.modelbiz.WXLaunchMiniProgram
import com.tencent.mm.opensdk.modelmsg.SendMessageToWX
import com.tencent.mm.opensdk.modelmsg.WXMediaMessage
import com.tencent.mm.opensdk.modelmsg.WXMiniProgramObject
import com.tencent.mm.opensdk.openapi.WXAPIFactory
import kotlinx.android.synthetic.main.activity_add_city_order2.*
import kotlinx.android.synthetic.main.dialog_pay_cross.view.*
import kotlinx.android.synthetic.main.pop_share.view.*
import cn.ptaxi.yuekeduocx.driver.utils.clickDelay
import cn.ptaxi.yuekeduocx.driver.utils.gone
import cn.ptaxi.yuekeduocx.driver.utils.visible
import cn.ptaxi.yuekeduocx.driver.wxapi.WXPayEntryActivity
import cn.sinata.xldutils.utils.SpanBuilder
import cn.sinata.xldutils.utils.StringUtils
import com.amap.api.location.AMapLocationClient
import com.amap.api.location.AMapLocationListener
import kotlinx.android.synthetic.main.activity_add_city_order2.et_more_fee
import kotlinx.android.synthetic.main.activity_add_city_order2.et_phone
import kotlinx.android.synthetic.main.activity_add_city_order2.ll_edit_price
import kotlinx.android.synthetic.main.activity_add_city_order2.ll_passengers_num
import kotlinx.android.synthetic.main.activity_add_city_order2.ll_seat
import kotlinx.android.synthetic.main.activity_add_city_order2.tv_action
import kotlinx.android.synthetic.main.activity_add_city_order2.tv_car_no
import kotlinx.android.synthetic.main.activity_add_city_order2.tv_date
import kotlinx.android.synthetic.main.activity_add_city_order2.tv_end
import kotlinx.android.synthetic.main.activity_add_city_order2.tv_end_point
import kotlinx.android.synthetic.main.activity_add_city_order2.tv_had_change_price
import kotlinx.android.synthetic.main.activity_add_city_order2.tv_passengers_num
import kotlinx.android.synthetic.main.activity_add_city_order2.tv_price
import kotlinx.android.synthetic.main.activity_add_city_order2.tv_seat
import kotlinx.android.synthetic.main.activity_add_city_order2.tv_sex
import kotlinx.android.synthetic.main.activity_add_city_order2.tv_start
import kotlinx.android.synthetic.main.activity_add_city_order2.tv_start_point
import kotlinx.android.synthetic.main.activity_add_city_order2.tv_time
import kotlinx.android.synthetic.main.activity_add_city_order2.tv_total
import kotlinx.android.synthetic.main.activity_add_city_order2.tv_unit
import kotlinx.android.synthetic.main.pop_select_car_num.view.recycler_view_people_num
import kotlinx.android.synthetic.main.pop_select_car_num.view.tv_pop_sure_people_num
import kotlinx.android.synthetic.main.pop_select_car_num.view.view_top
import kotlinx.android.synthetic.main.pop_select_number.view.iv_leat_num
import kotlinx.android.synthetic.main.pop_select_number.view.recycler_view_people_number
import kotlinx.android.synthetic.main.pop_select_number.view.tv_pop_sure_people_number
import kotlinx.android.synthetic.main.pop_select_number.view.view_top_number
import org.jetbrains.anko.startActivity
import org.jetbrains.anko.startActivityForResult
import org.jetbrains.anko.toast
import java.io.ByteArrayOutputStream
import java.io.File
import java.io.FileOutputStream
import java.text.SimpleDateFormat
class AddCityOrderActivity2 : MyBaseActivity() {
@@ -58,7 +79,6 @@
    private val id by lazy { intent.getStringExtra("id") }
    private var shiftDetail: ShiftDetailData? = null
    private val seatAdapter = SeatAdapter()
    var startAddress = "" //起点
    var startLat = ""//起点纬度
@@ -76,9 +96,14 @@
    var mLocationClient: AMapLocationClient? = null
    //改价
    var changePrice: String? = null
    val selectNumberAdapter: SelectNumberAdapter by lazy {
        SelectNumberAdapter()
    }
    override fun initView() {
        setTitleText("代客下单")
        setTitleText("推荐预约")
        mLocationClient = AMapKit.initLocation(this, AMapLocationListener {
            if (it.errorCode == 0) {
                if (!it.address.isNullOrEmpty()) {
@@ -89,25 +114,28 @@
            }
        })
        getData()
        ll_seat.visibility =
            if (CacheKey.getUserInfo().couldSelectSeat()) View.VISIBLE else View.GONE
        ll_edit_price.visibility =
            if (CacheKey.getUserInfo().couldModifyAmount()) View.VISIBLE else View.GONE
    }
    private fun getData() {
        val map = HashMap<String,String>()
        val map = HashMap<String, String>()
        map["lineShiftDriverId"] = id
        callNetGet(this, Api.queryDriverShifDetail,map){
        callNetGet(this, Api.queryDriverShifDetail, map) {
            shiftDetail = gson.fromJson(it, ShiftDetail::class.java).data
            shiftDetail?.apply {
                tv_start.text = lineName.split("-")[0]
                tv_end.text = lineName.split("-")[1]
                tv_time.text = day.split("-")[1]+"月"+day.split("-")[2]+"日 $startTime-$endTime"
                val unit = "¥%.2f/人".format(unitPrice)
                tv_unit.text = SpanBuilder.content(unit).sizeSpan(0,1,14).sizeSpan(unit.length-2,unit.length,14).build()
                rv_seat.layoutManager = GridLayoutManager(this@AddCityOrderActivity2,totalSeat)
                rv_seat.adapter = seatAdapter
                seatAdapter.max = laveSeat
                seatAdapter.data.clear()
                seatAdapter.data.addAll(1 .. totalSeat)
                seatAdapter.notifyDataSetChanged()
                tv_car_no.text = carLicensePlate
                tv_sex.text = "${getShowSex()}师傅"
                val parse = SimpleDateFormat("yyyy-MM-dd").parse(day)
                tv_date.text = "出发日期:${SimpleDateFormat("MM月dd日").format(parse)}"
                tv_time.text = "出发时间:${startTime}"
                val unit = "¥%.2f/人".format(unitPrice)
                tv_unit.text = SpanBuilder.content(unit).sizeSpan(0, 1, 14)
                    .sizeSpan(unit.length - 2, unit.length, 14).build()
                //默认起终点
                startAddress = startDefaultPointAddress
                startLat = startDefaultPointLat
@@ -122,51 +150,91 @@
    }
    override fun setOnclick() {
        seatAdapter.setOnItemClickListener { view, position ->
            if (position+1 > shiftDetail?.laveSeat?:0){
                showToast("最多可选择${shiftDetail?.laveSeat?:0}人")
            }else{
                seatAdapter.checked = position
                seatAdapter.notifyDataSetChanged()
                refreshPrice()
        tv_start_point.clickDelay {
            shiftDetail?.also {
                currentSiteType = 1
                if (it.isSelfCityRouteLine()) {
                    startActivity<SelectStartPointActivity>(
                        "lineShiftDriverId" to it.lineShiftDriverId.toString(),
                        "type" to "1",
                        "lonLat" to it.startLonLat
                    )
                } else {
                    startActivity<SelectStartPointActivity>(
                        "startCityId" to it.startSiteId,
                        "lonLat" to it.startLonLat
                    )
                }
            }
        }
        tv_start_point.setOnClickListener {
            currentSiteType = 1
            startActivity<SelectStartPointActivity>(
                "startCityId" to shiftDetail?.startSiteId,
                "name" to shiftDetail?.startCityName,
                "lonLat" to shiftDetail?.startLonLat
            )
        tv_end_point.clickDelay {
            shiftDetail?.also {
                currentSiteType = 2
                if (it.isSelfCityRouteLine()) {
                    startActivity<SelectStartPointActivity>(
                        "lineShiftDriverId" to it.lineShiftDriverId.toString(),
                        "type" to "2",
                        "lonLat" to it.endLonLat
                    )
                } else {
                    startActivity<SelectStartPointActivity>(
                        "endCityId" to it.endSiteId,
                        "lonLat" to it.endLonLat,
                    )
                }
            }
        }
        tv_end_point.setOnClickListener {
            currentSiteType = 2
            startActivity<SelectStartPointActivity>("endCityId" to shiftDetail?.endSiteId
                , "name" to shiftDetail?.endCityName, "lonLat" to shiftDetail?.endLonLat)
        ll_passengers_num.clickDelay {
            showSelectPassengersNumberDialog()
        }
        tv_action.clickDelay {
            if (seatAdapter.checked == -1){
        ll_seat.clickDelay {
            if (TextUtils.isEmpty(tv_passengers_num.text)) {
                toast("请先选择乘车人数")
                return@clickDelay
            }
            shiftDetail?.also {
                callSeat(it.lineShiftDriverId.toString()) { data ->
                    showSelectSearDialog(it, data)
                }
            }
        }
        ll_edit_price.clickDelay {
            if ((tv_passengers_num.tag?.toString()?.toIntOrNull() ?: 0) <= 0) {
                showToast("请选择乘车人数")
                return@clickDelay
            }
            val phone = et_phone.text.toString()
            if (phone.isNullOrEmpty()){
                showToast("请填写乘车人手机")
            shiftDetail?.also {
                startActivityForResult<ChangePriceActivity>(
                    2,
                    "data" to it,
                    "personNumber" to tv_passengers_num.tag?.toString(),
                    "otherPrice" to et_more_fee.text.toString(),
                    "changePrice" to changePrice,
                )
            }
        }
        tv_action.clickDelay {
            if (startAddress.isEmpty()) {
                showToast("请选择出发地")
                return@clickDelay
            }
            if (!StringUtils.isPhoneNumberValid(phone)){
            if (endAddress.isEmpty()) {
                showToast("请选择目的地")
                return@clickDelay
            }
            val phone = et_phone.text?.toString()
            if (phone.isNullOrEmpty()) {
                showToast("请输入乘车人联系电话")
                return@clickDelay
            }
            if (!StringUtils.isPhoneNumberValid(phone)) {
                showToast("手机格式错误")
                return@clickDelay
            }
            if (startAddress.isEmpty()){
                showToast("请选择上车点")
                return@clickDelay
            }
            if (endAddress.isEmpty()){
                showToast("请选择下车点")
            if ((tv_passengers_num.tag?.toString()?.toIntOrNull() ?: 0) <= 0) {
                showToast("请选择乘车人数")
                return@clickDelay
            }
            val map = getMapByAny()
@@ -182,55 +250,17 @@
            map["lineShiftDriverId"] = shiftDetail?.lineShiftDriverId
            map["otherFee"] = morefee
            map["passengersPhone"] = phone
            map["peopleNumber"] = seatAdapter.checked+1
            callNet(Api.orderOnBehalf,map){
                var bean = gson.fromJson<AddOrderBean>(it, AddOrderBean::class.java)
                recover()
                val dialog = DialogUtil.getDialog(this, R.layout.dialog_pay_cross)
                val view = DialogUtil.getView(dialog)
                GlideUtil.load(this,url,view.iv_code,0)
                view.iv_close.setOnClickListener {
                    dialog.dismiss()
                }
                view.tv_save.clickDelay {
                    val rrx = RxPermissions(this).request(Manifest.permission.WRITE_EXTERNAL_STORAGE).subscribe {
                        if (it)
                            try {
                                val copyPath =
                                    getExternalFilesDir(Environment.DIRECTORY_DCIM)!!.absolutePath + "/" + System.currentTimeMillis() + ".png"
                                val file = File(copyPath)
                                if (!file.exists()) {
                                    file.createNewFile()
                                }
                                val fors = FileOutputStream(file)
                                view.iv_code.drawToBitmap()?.compress(Bitmap.CompressFormat.PNG, 0, fors)
                                fors.flush()
                                fors.close()
                                MediaStore.Images.Media.insertImage(this.contentResolver, file.absolutePath, copyPath, null);
                                toast("保存成功")
                            } catch (e: Exception) {
                                toast("保存失败")
                            }
                    }
                }
                view.tv_scale.clickDelay {
                    startActivity<ImageActivity>("url" to url)
                }
                view.tv_share.clickDelay {
                    showShareDialog()
                }
                view.tv_action.clickDelay {
                    val api = WXAPIFactory.createWXAPI(this, Const.WX_APP_ID, true)
                    val req = WXLaunchMiniProgram.Req()
                    req.userName = "gh_b291a8beb1cb"
                    req.path = "pages/orderDetail/orderDetail?orderId=${bean.data.id}&driverId=${CacheKey.getUserId()}"
                    req.miniprogramType = Api.MINI_TYPE
                    api.sendReq(req)
                    dialog.dismiss()
                    finish()
            map["peopleNumber"] = tv_passengers_num.tag
            map["seatNumber"] = tv_seat.tag
            changePrice?.takeIf {
                it.isNotEmpty()
            }?.also {
                map["changePrice"] = it
            }
            callNet(Api.orderOnBehalf, map) {
                val bean = gson.fromJson<AddOrderBean>(it, AddOrderBean::class.java)
                DialogUtil.getValetPayTypeChoiceDialog(this) { type ->
                    pay(type, bean.data.id.toString())
                }
            }
        }
@@ -240,103 +270,145 @@
        }
    }
    private fun recover() {
        seatAdapter.checked = -1
        morefee = 0.0
        et_phone.setText("")
        et_more_fee.setText("")
        getData()
    }
    fun showShareDialog() {
        var dialog = DialogUtil.getDialog(mContext, R.layout.pop_share)
        var view = DialogUtil.getView(dialog)
        view.tv_item_right_share.setOnClickListener {
            dialog!!.dismiss()
        }
        view.view_close_share.setOnClickListener {
            dialog!!.dismiss()
        }
        view.ll_wechat.setOnClickListener {
//            share(
//                this,
//                "您有一条城际专线订单待支付",
//                "约客多司机端",
//                url,
//                UMImage(mContext, R.mipmap.icon),
//                SHARE_MEDIA.WEIXIN
//            )
            val api = WXAPIFactory.createWXAPI(this, Const.WX_APP_ID, true)
            val miniProgramObj   = WXMiniProgramObject()
            miniProgramObj.webpageUrl = url // 兼容低版本的网页链接
            miniProgramObj.miniprogramType = Api.MINI_TYPE // 正式版:0,测试版:1,体验版:2
            miniProgramObj.userName = "gh_b291a8beb1cb" // 小程序原始id
            miniProgramObj.path = "pages/home/home"//小程序页面路径;对于小游戏,可以只传入 query 部分,来实现传参效果,如:传入 "?foo=bar"
            val msg = WXMediaMessage(miniProgramObj)
            msg.title = "约客多司机端" // 小程序消息title
            msg.description = "您有一条城际专线订单待支付" // 小程序消息desc
            msg.thumbData = getThumb() // 小程序消息封面图片,小于128k
            val req = SendMessageToWX.Req()
            req.transaction = System.currentTimeMillis().toString()
            req.message = msg
            req.scene = SendMessageToWX.Req.WXSceneSession
            api.sendReq(req)
            dialog!!.dismiss()
        }
        view.ll_wechat_q.setOnClickListener {
            val api = WXAPIFactory.createWXAPI(this, Const.WX_APP_ID, true)
            val miniProgramObj   = WXMiniProgramObject()
            miniProgramObj.webpageUrl = url // 兼容低版本的网页链接
            miniProgramObj.miniprogramType = Api.MINI_TYPE // 正式版:0,测试版:1,体验版:2
            miniProgramObj.userName = "gh_b291a8beb1cb" // 小程序原始id
            miniProgramObj.path = "pages/home/home"//小程序页面路径;对于小游戏,可以只传入 query 部分,来实现传参效果,如:传入 "?foo=bar"
            val msg = WXMediaMessage(miniProgramObj)
            msg.title = "约客多司机端" // 小程序消息title
            msg.description = "您有一条城际专线订单待支付" // 小程序消息desc
            msg.thumbData = getThumb() // 小程序消息封面图片,小于128k
            val req = SendMessageToWX.Req()
            req.transaction = System.currentTimeMillis().toString()
            req.message = msg
            req.scene = SendMessageToWX.Req.WXSceneTimeline
            api.sendReq(req)
            dialog!!.dismiss()
    //支付
    private fun pay(type: String, orderId: String) {
        val map = getMapByAny()
        map["crossCityOrderId"] = orderId
        map["orderType"] = "3"
        map["type"] = type
        callNet(Api.orderOnBehalfPay, map) {
            if (type == "1") {//微信支付
                val data = gson.fromJson<WxBean>(it, WxBean::class.java)
                WXPayEntryActivity.to(this, 1, data.data.data.getPayInfoModel())
            }
            if (type == "2") {//乘客
                val data = gson.fromJson<AlipayBean>(it, AlipayBean::class.java)
                if (data.data.isNullOrEmpty()) {
                    toast("无法使用二维码支付")
                    return@callNet
                }
                startActivityForResult<PayQrCodeActivity>(1, "url" to data.data)
            }
            if (type == "3") {//线下
                setResult(Activity.RESULT_OK, Intent())
                finish()
            }
        }
    }
    private fun getThumb():ByteArray{
        val bitmap: Bitmap =
            BitmapFactory.decodeResource(getResources(), R.mipmap.ic_share)
        val sendBitmap = Bitmap.createScaledBitmap(bitmap, 200, 200, true)
        bitmap.recycle()
        val stream = ByteArrayOutputStream()
        sendBitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream)
        return stream.toByteArray()
    //显示选择乘客人数弹窗
    private fun showSelectPassengersNumberDialog() {
        shiftDetail?.also {
            val pop = DialogUtil.getPopupwindow(this, R.layout.pop_select_car_num)
            pop.contentView.recycler_view_people_num.layoutManager = LinearLayoutManager(this)
            val popPeopleNumAdapter = PopPeopleNUmAdapter(it.laveSeat)
            pop.contentView.recycler_view_people_num.adapter = popPeopleNumAdapter
            popPeopleNumAdapter.selectPosition = 0
            pop.contentView.view_top.clickDelay {
                pop.dismiss()
            }
            popPeopleNumAdapter.setOnItemClickListener { view, position ->
                popPeopleNumAdapter.selectPosition = position
                popPeopleNumAdapter.notifyDataSetChanged()
            }
            pop.contentView.tv_pop_sure_people_num.clickDelay {
                val number = popPeopleNumAdapter.selectPosition + 1
                tv_passengers_num.text = number.toString()
                tv_passengers_num.tag = number
                refreshPrice()
                pop.dismiss()
            }
            pop.showDown(window.decorView)
        }
    }
    //显示选择座位弹窗
    private fun showSelectSearDialog(detailData: ShiftDetailData, data: SeatBean.DataBeanX) {
        val list = mutableListOf<String>()
        val listHave = data.content.split(",")
        val pop = DialogUtil.getPopupwindow(this, R.layout.pop_select_number)
        if (detailData.totalSeat < 6) {
            addSeat(4, list)
            pop.contentView.iv_leat_num.setImageResource(R.mipmap.seat_five)
        } else {
            addSeat(6, list)
            pop.contentView.iv_leat_num.setImageResource(R.mipmap.seat_seven)
        }
        pop.contentView.recycler_view_people_number.layoutManager =
            GridLayoutManager(this, 4)
        pop.contentView.recycler_view_people_number.adapter = selectNumberAdapter
        selectNumberAdapter.haveContent.clear()
        selectNumberAdapter.selectPosition.clear()
        selectNumberAdapter.haveContent.addAll(listHave)
        selectNumberAdapter.data.clear()
        selectNumberAdapter.data.addAll(list)
        selectNumberAdapter.notifyDataSetChanged()
        pop.contentView.tv_pop_sure_people_number.clickDelay {
            if ((tv_passengers_num.tag?.toString()?.toIntOrNull()
                    ?: 0) != selectNumberAdapter.selectPosition.size
            ) {
                toast("请选择" + tv_passengers_num.text + "个座位")
                return@clickDelay
            }
            if (selectNumberAdapter.selectPosition.size == 0) {
                toast("请选择位置")
                return@clickDelay
            }
            tv_seat.text =
                selectNumberAdapter.getPeopleStr().split(",")
                    .joinToString(",") { "${it}号" }
            tv_seat.tag = selectNumberAdapter.getPeopleStr()
            pop.dismiss()
        }
        pop.contentView.view_top_number.clickDelay {
            pop.dismiss()
        }
        pop.showDown(window.decorView)
    }
    private fun addSeat(i: Int, list: MutableList<String>) {
        var c = 0
        while (c < i) {
            c++
            list.add(c.toString())
        }
    }
    private fun callSeat(lineShiftDriverId: String, function: (SeatBean.DataBeanX) -> Unit) {
        val map = getMapByAny()
        map["id"] = lineShiftDriverId
        callNet(Api.querySeat, map) {
            var bean = gson.fromJson<SeatBean>(it, SeatBean::class.java)
            function(bean!!.data)
        }
    }
    private fun refreshPrice() {
        val ticketFee = (seatAdapter.checked + 1) * (shiftDetail?.unitPrice ?: 0.0)
        tv_price.text = "¥%.2f".format(ticketFee)
        val more = et_more_fee.text.toString()
        morefee = 0.0
        morefee = try {
            more.toDouble()
        }catch (e:Exception){
            0.0
        shiftDetail?.also { it ->
            val unitPrice = if (it.isSelfCityRouteLine()) {
                it.matchEndInfo(endLat, endLon)?.let {
                    it.price?.toDoubleOrNull()
                }
            } else {
                it.unitPrice
            }
            if (unitPrice == null || (tv_passengers_num.tag?.toString()?.toIntOrNull() ?: 0) <= 0) {
                return@also
            }
            //原价
            val oldPrice = (tv_passengers_num.tag.toString().toIntOrNull() ?: 0) * unitPrice
            //改价
            val newPrice = changePrice?.toDoubleOrNull()
            if (newPrice == null || newPrice == oldPrice) {
                tv_had_change_price.gone()
            } else {
                tv_had_change_price.visible()
            }
            val ticketFee = newPrice ?: oldPrice
            tv_price.text = "¥%.2f".format(ticketFee)
            morefee = et_more_fee.text?.toString()?.toDoubleOrNull() ?: 0.0
            tv_total.text = "¥%.2f".format(ticketFee + morefee)
        }
        tv_total.text = SpanBuilder.content("¥%.2f".format(ticketFee+morefee)).sizeSpan(0,1,22).build()
    }
    override fun onEventMainThread(event: BaseEvent?) {
@@ -348,8 +420,8 @@
                    startLat = event.msgTwo
                    startLon = event.msgthree
                    tv_start_point.text = startAddress
                    if (startAddress.length > 15){
                        tv_start_point.text = startAddress.substring(0,15)+"..."
                    if (startAddress.length > 15) {
                        tv_start_point.text = startAddress.substring(0, 15) + "..."
                    }
                }
                if (currentSiteType == 2) {
@@ -357,11 +429,32 @@
                    endLat = event.msgTwo
                    endLon = event.msgthree
                    tv_end_point.text = endAddress
                    if (endAddress.length > 15){
                        tv_end_point.text = endAddress.substring(0,15)+"..."
                    if (endAddress.length > 15) {
                        tv_end_point.text = endAddress.substring(0, 15) + "..."
                    }
                    refreshPrice()
                }
            }
            BaseEvent.PAY_SUCCESS -> {
                if (isFinishing || isDestroy) {
                    return
                }
                setResult(Activity.RESULT_OK, Intent())
                finish()
            }
        }
    }
    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (requestCode == 1) {
            setResult(Activity.RESULT_OK, Intent())
            finish()
        }
        if (requestCode == 2 && resultCode == Activity.RESULT_OK && data != null) {
            changePrice = data.getStringExtra("changePrice")
            refreshPrice()
        }
    }
app/src/main/java/cn/ptaxi/yuekeduocx/driver/ui/to_city/AddCityRouteLineActivity.kt
@@ -17,13 +17,13 @@
import cn.ptaxi.yuekeduocx.driver.netUtls.Api
import cn.ptaxi.yuekeduocx.driver.netUtls.callNet
import cn.ptaxi.yuekeduocx.driver.netUtls.getMapByAny
import cn.ptaxi.yuekeduocx.driver.ui.DialogUtil
import cn.ptaxi.yuekeduocx.driver.ui.main.add_order.SelectCityStartActivity
import cn.ptaxi.yuekeduocx.driver.ui.main.add_order.SelectStartPointActivity
import cn.ptaxi.yuekeduocx.driver.utils.citypickerview.picker.widget.builder.TimePickerBuilder
import cn.ptaxi.yuekeduocx.driver.utils.clickDelay
import cn.ptaxi.yuekeduocx.driver.utils.gone
import cn.ptaxi.yuekeduocx.driver.utils.visible
import com.amap.api.maps.model.LatLng
import kotlinx.android.synthetic.main.activity_add_city_route_line.ll_add_other_destination_price
import kotlinx.android.synthetic.main.activity_add_city_route_line.ll_date
import kotlinx.android.synthetic.main.activity_add_city_route_line.ll_destination_price_list
@@ -38,6 +38,11 @@
import kotlinx.android.synthetic.main.activity_add_city_route_line.tv_start_city
import kotlinx.android.synthetic.main.activity_add_city_route_line.tv_start_point
import kotlinx.android.synthetic.main.activity_add_city_route_line.tv_time
import kotlinx.android.synthetic.main.dialog_add_city_route_line_success.view.tv_confirm
import kotlinx.android.synthetic.main.dialog_add_city_route_line_success.view.tv_destination_city
import kotlinx.android.synthetic.main.dialog_add_city_route_line_success.view.tv_start_city
import kotlinx.android.synthetic.main.dialog_add_city_route_line_success.view.tv_start_time
import kotlinx.android.synthetic.main.dialog_add_city_route_line_success.view.view_hint_close_base
import org.jetbrains.anko.startActivity
import org.jetbrains.anko.toast
import java.text.SimpleDateFormat
@@ -118,10 +123,9 @@
                val event1 = tv_start_point.tag as BaseEvent?
                startActivity<SelectStartPointActivity>(
                    "cityName" to event.msg,
                    "lonLat" to if (event1 == null) null else "${event1.msgTwo},${event1.msgthree}",
                    "lonLat" to if (event1 == null) null else "${event1.msgthree},${event1.msgTwo}",
                    "type" to "1",
                    "title" to "选择出发地",
                    "useSite" to false,
                )
            } else {
                toast("请先选择出发城市")
@@ -140,6 +144,11 @@
                return@clickDelay
            }
            if (TextUtils.isEmpty(tv_car_seat.text)) {
                toast("座位数不能为空")
                return@clickDelay
            }
            if (((tv_car_seat.tag as MyCarInfo).seat.toString().toIntOrNull() ?: 0) <= 1) {
                toast("座位数不能小于1")
                return@clickDelay
            }
            if (TextUtils.isEmpty(tv_start_city.text)) {
@@ -157,7 +166,7 @@
            val destinationPriceInfos = (0 until ll_destination_price_list.childCount).map {
                ll_destination_price_list.getChildAt(it).tag as DestinationPriceInfo
            }
            val filter = destinationPriceInfos.filter { it.address?.isNotEmpty() == true }
            val filter = destinationPriceInfos.filter { it.endAddress?.isNotEmpty() == true }
            if (filter.isEmpty()) {
                toast("请选择目的地")
                return@clickDelay
@@ -210,10 +219,9 @@
                    val event1 = tvEndPoint.tag as BaseEvent?
                    startActivity<SelectStartPointActivity>(
                        "cityName" to event.msg,
                        "lonLat" to if (event1 == null) null else "${event1.msgTwo},${event1.msgthree}",
                        "lonLat" to if (event1 == null) null else "${event1.msgthree},${event1.msgTwo}",
                        "type" to "2",
                        "title" to "选择目的地",
                        "useSite" to false,
                    )
                } else {
                    toast("请先选择目的城市")
@@ -307,7 +315,44 @@
        val startCity = tv_start_city.tag as BaseEvent
        val endCity = tv_end_city.tag as BaseEvent
        val startPoint = tv_start_point.tag as BaseEvent
        val map = getMapByAny()
        map["day"] = SimpleDateFormat("yyyy-MM-dd").format(date)
        map["startTime"] = SimpleDateFormat("HH:mm").format(time)
        map["seat"] = 0.coerceAtLeast((carInfo.seat?.toIntOrNull() ?: 0) - 1)
        map["startCityCode"] = startCity.msgTwo
        map["startCityName"] = startCity.msg
        map["endCityCode"] = endCity.msgTwo
        map["endCityName"] = endCity.msg
        map["startAddress"] = startPoint.msg
        map["startLon"] = startPoint.msgthree
        map["startLat"] = startPoint.msgTwo
        map["destJson"] = gson.toJson(destinationPriceInfos)
        callNet(Api.addSelfTrip, map) {
            showAddSuccessDialog(
                startCity.msg, endCity.msg,
                SimpleDateFormat("yyyy-MM-dd").format(date),
                SimpleDateFormat("HH:mm").format(time)
            )
        }
    }
    //显示添加成功弹窗
    private fun showAddSuccessDialog(
        startCity: String, endCity: String,
        date: String, time: String
    ) {
        val dialog = DialogUtil.getDialog(this, R.layout.dialog_add_city_route_line_success)
        val view = DialogUtil.getView(dialog)
        view.tv_start_city.text = startCity
        view.tv_destination_city.text = endCity
        view.tv_start_time.text = "出发时间:${date} ${time}"
        view.view_hint_close_base.setOnClickListener { dialog.dismiss() }
        view.tv_confirm.setOnClickListener { dialog.dismiss() }
        dialog.setCancelable(false)
        dialog.setCanceledOnTouchOutside(false)
        dialog.setOnDismissListener {
            finish()
        }
    }
    override fun onEventMainThread(event: BaseEvent?) {
@@ -329,12 +374,13 @@
                    tv_start_point.tag = event
                } else {
                    currentEndPointView?.also {
                        val tvEndPoint = findViewById<TextView>(R.id.tv_end_point)
                        val tvEndPoint = it.findViewById<TextView>(R.id.tv_end_point)
                        tvEndPoint.text = event.msg
                        tvEndPoint.tag = event
                        val info = it.tag as DestinationPriceInfo
                        info.address = event.msg
                        info.location = LatLng(event.msgTwo.toDouble(), event.msgthree.toDouble())
                        info.endAddress = event.msg
                        info.endLat = event.msgTwo
                        info.endLon = event.msgthree
                    }
                }
            }
@@ -344,7 +390,8 @@
//目的地价格信息
class DestinationPriceInfo(
    var address: String? = null,
    var location: LatLng? = null,
    var endAddress: String? = null,
    var endLon: String? = null,
    var endLat: String? = null,
    var price: String? = null,
)
app/src/main/java/cn/ptaxi/yuekeduocx/driver/ui/to_city/ChangePriceActivity.kt
New file
@@ -0,0 +1,53 @@
package cn.ptaxi.yuekeduocx.driver.ui.to_city
import android.app.Activity
import android.content.Intent
import android.text.TextUtils
import android.util.Log
import cn.ptaxi.yuekeduocx.driver.R
import cn.ptaxi.yuekeduocx.driver.base.MyBaseActivity
import cn.ptaxi.yuekeduocx.driver.bean.ShiftDetailData
import cn.ptaxi.yuekeduocx.driver.utils.clickDelay
import kotlinx.android.synthetic.main.activity_change_price.et_price
import kotlinx.android.synthetic.main.activity_change_price.tv_confirm
import kotlinx.android.synthetic.main.activity_change_price.tv_person_num
import kotlinx.android.synthetic.main.activity_change_price.tv_price
import org.jetbrains.anko.toast
//改价页
class ChangePriceActivity : MyBaseActivity() {
    private val data by lazy { intent.getParcelableExtra("data") as ShiftDetailData }
    private val personNumber by lazy { intent.getStringExtra("personNumber") }
    private val otherPrice by lazy { intent.getStringExtra("otherPrice") }
    private val changePrice by lazy { intent.getStringExtra("changePrice") }
    override fun setContentView() {
        setContentView(R.layout.activity_change_price)
    }
    override fun initView() {
        tv_person_num.text = "${personNumber}人价"
        tv_price.text = "¥%.2f".format(
            (personNumber?.toDoubleOrNull()
                ?: 0.0) * (data.unitPrice) + (otherPrice?.toDoubleOrNull() ?: 0.0)
        )
        et_price.setText(changePrice ?: "")
    }
    override fun setOnclick() {
        tv_confirm.clickDelay {
            val s = et_price.text?.toString() ?: ""
            if (TextUtils.isEmpty(s)) {
                toast("请输入金额")
                return@clickDelay
            }
            if ((s.toDoubleOrNull() ?: 0.0) <= 0) {
                toast("请输入正确金额")
                return@clickDelay
            }
            setResult(Activity.RESULT_OK, Intent().apply {
                putExtra("changePrice", s)
            })
            finish()
        }
    }
}
app/src/main/java/cn/ptaxi/yuekeduocx/driver/ui/to_city/SelectDriverActivity.kt
@@ -137,7 +137,7 @@
            }
            if (payType == "1") {
                var data = gson.fromJson<WxBean>(it, WxBean::class.java)
                WXPayEntryActivity.to(this, 1, data.data)
                WXPayEntryActivity.to(this, 1, data.data.data.getPayInfoModel())
            }
            if (payType == "3" || payType.isEmpty()) {
                EventBus.getDefault().post(
@@ -154,7 +154,7 @@
            if (payType == "4") {
                var data = gson.fromJson<WxBean>(it, WxBean::class.java)
                MyApplication.isPlayVoice = false
                UPPayAssistEx.startPay(this, null, null, data.data.tn, "00")
                UPPayAssistEx.startPay(this, null, null, data.data.data.getPayInfoModel().tn, "00")
            }
        }
    }
@@ -210,6 +210,9 @@
        super.onEventMainThread(event)
        when (event!!.code) {
            BaseEvent.PAY_SUCCESS -> {
                if (isFinishing || isDestroy) {
                    return
                }
                setResult(Activity.RESULT_OK, Intent())
                finish()
            }
app/src/main/java/cn/ptaxi/yuekeduocx/driver/ui/widget/InputNumberView.kt
New file
@@ -0,0 +1,394 @@
package cn.ptaxi.yuekeduocx.driver.ui.widget
import android.animation.ValueAnimator
import android.content.Context
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Paint
import android.graphics.RectF
import android.graphics.Typeface
import android.text.InputFilter
import android.text.InputType
import android.text.method.DigitsKeyListener
import android.util.AttributeSet
import android.util.TypedValue
import android.view.Gravity
import android.view.View
import android.view.inputmethod.InputMethodManager
import android.widget.EditText
import android.widget.FrameLayout
import android.widget.LinearLayout
import androidx.appcompat.widget.AppCompatTextView
import androidx.core.widget.addTextChangedListener
import cn.ptaxi.yuekeduocx.driver.R
import cn.ptaxi.yuekeduocx.driver.extension.extDpToPx
/**
 * 输入数字控件
 * 支持动态设置数字位数,自动聚焦,键盘控制
 */
class InputNumberView @JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null,
    defStyleAttr: Int = 0
) : FrameLayout(context, attrs, defStyleAttr) {
    // 属性
    var value: String? = null
        set(value) {
            if (field != value) {
                field = value
                post {
                    setupView()
                }
            }
        }
    var digitCount = 4
        set(value) {
            if (value > 0 && value != field) {
                field = value
                post {
                    setupView()
                }
            }
        }
    var rectWidth = 48
        set(value) {
            field = value
            post {
                setupView()
            }
        }
    var rectHeight = 56
        set(value) {
            field = value
            post {
                setupView()
            }
        }
    var rectRadius = 8
        set(value) {
            field = value
            requestLayout()
        }
    var normalBorderWidth = 1
        set(value) {
            field = value
            requestLayout()
        }
    var activeBorderWidth = 1
        set(value) {
            field = value
            requestLayout()
        }
    var normalBorderColor = Color.TRANSPARENT
        set(value) {
            field = value
            requestLayout()
        }
    var activeBorderColor = Color.TRANSPARENT
        set(value) {
            field = value
            requestLayout()
        }
    var emptyRectColor = Color.TRANSPARENT
        set(value) {
            field = value
            requestLayout()
        }
    var valueRectColor = Color.TRANSPARENT
        set(value) {
            field = value
            requestLayout()
        }
    var digitTextSize = 20f
        set(value) {
            field = value
            digitBoxes.forEach {
                it.setTextSize(TypedValue.COMPLEX_UNIT_PX, value)
            }
        }
    var digitTextColor = Color.BLACK
        set(value) {
            field = value
            digitBoxes.forEach {
                it.setTextColor(value)
            }
        }
    var digitTextStyle = 0
        set(value) {
            field = value
            digitBoxes.forEach {
                it.typeface = when (digitTextStyle) {
                    1 -> Typeface.DEFAULT_BOLD
                    else -> Typeface.DEFAULT
                }
            }
        }
    // 隐藏的EditText用于接收输入
    private lateinit var hiddenEditText: EditText
    private val digitBoxes: MutableList<DigitBox> = mutableListOf()
    private var onInputCompleteListener: ((String) -> Unit)? = null
    private var onInputChangeListener: ((String) -> Unit)? = null
    init {
        attrs?.let {
            val typedArray = context.obtainStyledAttributes(it, R.styleable.InputNumberView)
            value = typedArray.getString(R.styleable.InputNumberView_value)
            digitCount = typedArray.getInt(R.styleable.InputNumberView_digitCount, digitCount)
            rectWidth = typedArray.getDimensionPixelSize(
                R.styleable.InputNumberView_rectWidth,
                rectWidth
            )
            rectHeight = typedArray.getDimensionPixelSize(
                R.styleable.InputNumberView_rectHeight,
                rectHeight
            )
            rectRadius = typedArray.getDimensionPixelSize(
                R.styleable.InputNumberView_rectRadius,
                rectRadius
            )
            normalBorderWidth = typedArray.getDimensionPixelSize(
                R.styleable.InputNumberView_normalBorderWidth,
                normalBorderWidth
            )
            activeBorderWidth = typedArray.getDimensionPixelSize(
                R.styleable.InputNumberView_activeBorderWidth,
                activeBorderWidth
            )
            normalBorderColor = typedArray.getColor(
                R.styleable.InputNumberView_normalBorderColor,
                normalBorderColor
            )
            activeBorderColor = typedArray.getColor(
                R.styleable.InputNumberView_activeBorderColor,
                activeBorderColor
            )
            emptyRectColor = typedArray.getColor(
                R.styleable.InputNumberView_emptyRectColor,
                emptyRectColor
            )
            valueRectColor = typedArray.getColor(
                R.styleable.InputNumberView_valueRectColor,
                valueRectColor
            )
            digitTextSize = typedArray.getDimensionPixelSize(
                R.styleable.InputNumberView_digitTextSize,
                digitTextSize.toInt()
            ).toFloat()
            digitTextColor = typedArray.getColor(
                R.styleable.InputNumberView_digitTextColor,
                digitTextColor
            )
            digitTextStyle = typedArray.getInt(
                R.styleable.InputNumberView_digitTextStyle,
                digitTextStyle
            )
            typedArray.recycle()
        }
        setupView()
    }
    private fun setupView() {
        removeAllViews()
        // 创建隐藏的EditText
        hiddenEditText = EditText(context).apply {
            isClickable = true
            isFocusable = true
            layoutParams = LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)
            inputType = InputType.TYPE_CLASS_NUMBER
            filters = arrayOf(InputFilter.LengthFilter(digitCount))
            setKeyListener(DigitsKeyListener.getInstance("0123456789"))
            isCursorVisible = false
            setBackgroundColor(Color.TRANSPARENT)
            setTextColor(Color.TRANSPARENT)
            // 输入监听
            addTextChangedListener {
                val currentText = it?.toString() ?: ""
                updateDigitBoxes()
                onInputChangeListener?.invoke(currentText)
                if (currentText.length == digitCount) {
                    onInputCompleteListener?.invoke(currentText)
                }
            }
        }
        addView(hiddenEditText)
        digitBoxes.clear()
        val group = LinearLayout(context).apply {
            gravity = Gravity.CENTER
            orientation = LinearLayout.HORIZONTAL
            layoutParams = LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)
            // 创建数字框
            for (i in 0 until digitCount) {
                val digitBox = DigitBox(context).apply {
                    layoutParams = LinearLayout.LayoutParams(rectWidth, rectHeight)
                }
                addView(digitBox)
                digitBoxes.add(digitBox)
                if (i < digitCount - 1) {
                    addView(View(context).apply {
                        layoutParams = LinearLayout.LayoutParams(0, 1, 1f)
                    })
                }
            }
        }
        addView(group)
        hiddenEditText.setText(value)
        if (!value.isNullOrEmpty()) {
            hiddenEditText.setSelection(value!!.length)
        }
        // 初始聚焦
        hiddenEditText.postDelayed(Runnable {
            hiddenEditText.requestFocus()
            val imm =
                hiddenEditText.context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
            imm.showSoftInput(hiddenEditText, InputMethodManager.SHOW_IMPLICIT)
        }, 500)
    }
    /**
     * 清空输入
     */
    fun clear() {
        hiddenEditText.text?.clear()
    }
    /**
     * 设置输入完成监听
     */
    fun setOnInputCompleteListener(listener: (String) -> Unit) {
        this.onInputCompleteListener = listener
    }
    /**
     * 设置输入变化监听
     */
    fun setOnInputChangeListener(listener: (String) -> Unit) {
        this.onInputChangeListener = listener
    }
    /**
     * 更新数字框显示
     */
    private fun updateDigitBoxes() {
        val text = hiddenEditText.text?.toString() ?: ""
        for (i in 0 until digitCount) {
            digitBoxes[i].also {
                it.text = text.elementAtOrNull(i)?.toString()
                it.setActive(i == text.length)
            }
        }
    }
    /**
     * 数字框控件
     */
    private inner class DigitBox(context: Context) : AppCompatTextView(context) {
        private var isActive = false
        private val borderPaint = Paint(Paint.ANTI_ALIAS_FLAG).apply {
            style = Paint.Style.STROKE
        }
        private val rect = RectF(0f, 0f, 0f, 0f)
        private val backgroundPaint = Paint(Paint.ANTI_ALIAS_FLAG).apply {
            style = Paint.Style.FILL
        }
        private val cursorPaint = Paint(Paint.ANTI_ALIAS_FLAG).apply {
            strokeWidth = 2f.extDpToPx(context)
            strokeCap = Paint.Cap.ROUND
        }
        private val blinkDuration = 1200L // 闪烁周期(毫秒)
        private val blinkAnimator = ValueAnimator.ofInt(0, 255, 0).apply {
            duration = blinkDuration
            repeatCount = ValueAnimator.INFINITE
            repeatMode = ValueAnimator.RESTART
            addUpdateListener { animator ->
                val alpha = animator.animatedValue as Int
                cursorPaint.color = Color.argb(
                    alpha,
                    Color.red(digitTextColor),
                    Color.green(digitTextColor),
                    Color.blue(digitTextColor)
                )
                invalidate()
            }
        }
        init {
            gravity = Gravity.CENTER
            setTextSize(TypedValue.COMPLEX_UNIT_PX, digitTextSize)
            setTextColor(digitTextColor)
            typeface = when (digitTextStyle) {
                1 -> Typeface.DEFAULT_BOLD
                else -> Typeface.DEFAULT
            }
        }
        fun setActive(active: Boolean) {
            this.isActive = active
            startCursorAnimate()
        }
        //开始光标动画
        private fun startCursorAnimate() {
            if (!isActive) {
                if (blinkAnimator.isRunning) {
                    blinkAnimator.cancel()
                }
                return
            }
            if (!blinkAnimator.isRunning) {
                blinkAnimator.start()
            }
        }
        override fun onDraw(canvas: Canvas) {
            rect.apply {
                right = width.toFloat()
                bottom = height.toFloat()
            }
            // 绘制背景
            backgroundPaint.apply {
                color = if (text.isNullOrEmpty()) emptyRectColor else valueRectColor
            }
            canvas.drawRoundRect(
                rect,
                rectRadius.toFloat(),
                rectRadius.toFloat(),
                backgroundPaint
            )
            // 绘制边框
            borderPaint.apply {
                color = if (isActive) activeBorderColor else normalBorderColor
                strokeWidth =
                    if (isActive) activeBorderWidth.toFloat() else normalBorderWidth.toFloat()
            }
            canvas.drawRoundRect(rect, rectRadius.toFloat(), rectRadius.toFloat(), borderPaint)
            // 绘制光标
            if (isActive && text.isNullOrEmpty()) {
                val centerX = width / 2f
                val centerY = height / 2f
                val cursorHeight = height * 0.4f
                canvas.drawLine(
                    centerX,
                    centerY - cursorHeight / 2,
                    centerX,
                    centerY + cursorHeight / 2,
                    cursorPaint
                )
            }
            super.onDraw(canvas)
        }
    }
}
app/src/main/res/drawable/circle_994a4c59_bg.xml
New file
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval">
    <solid android:color="@color/black_994A4C59" />
</shape>
app/src/main/res/drawable/shape_1ad33233_bg_4.xml
New file
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="@color/color_1ad33233" />
    <corners android:radius="4dp" />
</shape>
app/src/main/res/drawable/shape_d9d9d9_line_4.xml
New file
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <corners android:radius="4dp"/>
    <stroke android:color="@color/bg_gray_dfd9d9" android:width="1dp"/>
</shape>
app/src/main/res/drawable/shape_ffe1e1_bg_30.xml
New file
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="@color/color_ffe1e1" />
    <corners android:radius="30dp" />
</shape>
app/src/main/res/layout/activity_add_city_order2.xml
@@ -1,303 +1,470 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#F3F4F5">
    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        >
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginBottom="20dp"
        app:layout_constraintBottom_toTopOf="@id/tv_action"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">
            <androidx.constraintlayout.widget.ConstraintLayout
            <LinearLayout
                android:layout_width="match_parent"
                android:background="@drawable/bg_white_10"
                android:layout_height="wrap_content"
                android:background="@color/white"
                android:orientation="vertical"
                android:padding="16dp">
                <LinearLayout
                    android:id="@+id/ll_start_end_city"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:background="@color/white"
                    android:gravity="center_vertical"
                    android:orientation="horizontal">
                    <TextView
                        android:id="@+id/tv_start"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:textColor="@color/text_gray_car"
                        android:textSize="16sp"
                        android:textStyle="bold"
                        tools:text="遵义" />
                    <ImageView
                        android:layout_width="24dp"
                        android:layout_height="24dp"
                        android:layout_marginHorizontal="18dp"
                        android:src="@mipmap/icon_arrow_circle_red" />
                    <TextView
                        android:id="@+id/tv_end"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:textColor="@color/text_gray_car"
                        android:textSize="16sp"
                        android:textStyle="bold"
                        tools:text="正安" />
                </LinearLayout>
                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="14dp"
                    android:background="@color/white"
                    android:gravity="center_vertical"
                    android:orientation="horizontal">
                    <TextView
                        android:id="@+id/tv_car_no"
                        android:layout_width="wrap_content"
                        android:layout_height="30dp"
                        android:background="@drawable/shape_1ad33233_bg_4"
                        android:gravity="center"
                        android:paddingHorizontal="8dp"
                        android:textColor="@color/text_gray_car"
                        android:textSize="16sp"
                        android:textStyle="bold"
                        tools:text="川A 89Q91" />
                    <View
                        android:layout_width="3dp"
                        android:layout_height="3dp"
                        android:layout_marginHorizontal="8dp"
                        android:background="@drawable/circle_994a4c59_bg" />
                    <TextView
                        android:id="@+id/tv_sex"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:textColor="@color/text_gray_car"
                        android:textSize="13sp"
                        android:textStyle="bold"
                        tools:text="男师傅" />
                </LinearLayout>
                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="12dp"
                    android:orientation="horizontal">
                    <TextView
                        android:id="@+id/tv_date"
                        android:layout_width="0dp"
                        android:layout_height="wrap_content"
                        android:layout_weight="1"
                        android:textColor="@color/black_666666"
                        android:textSize="12sp"
                        tools:text="出发日期:2026-09-09" />
                    <TextView
                        android:id="@+id/tv_time"
                        android:layout_width="0dp"
                        android:layout_height="wrap_content"
                        android:layout_weight="1"
                        android:gravity="end"
                        android:textColor="@color/black_666666"
                        android:textSize="12sp"
                        tools:text="出发时间:12:30" />
                </LinearLayout>
            </LinearLayout>
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="50dp"
                android:layout_marginTop="10dp"
                android:layout_marginHorizontal="10dp"
                android:layout_height="wrap_content">
                <ImageView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:src="@mipmap/path"
                    app:layout_constraintStart_toStartOf="parent"
                    app:layout_constraintTop_toTopOf="@id/tv_start"
                    app:layout_constraintBottom_toBottomOf="@id/tv_start"
                    app:layout_constraintEnd_toEndOf="parent"
                    android:id="@+id/center"
                    />
                android:background="@color/white"
                android:gravity="center_vertical"
                android:orientation="horizontal"
                android:paddingHorizontal="16dp">
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:id="@+id/tv_start"
                    android:textSize="19sp"
                    android:textColor="@color/textColor"
                    android:textStyle="bold"
                    android:text="起点"
                    app:layout_constraintStart_toStartOf="parent"
                    app:layout_constraintEnd_toStartOf="@id/center"
                    app:layout_constraintTop_toTopOf="parent"
                    android:layout_marginTop="14dp"
                    android:drawablePadding="5dp"
                    android:drawableStart="@drawable/bg_point_main_color"/>
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:id="@+id/tv_end"
                    android:textSize="19sp"
                    android:textColor="@color/textColor"
                    android:textStyle="bold"
                    android:text="终点"
                    app:layout_constraintEnd_toEndOf="parent"
                    app:layout_constraintStart_toEndOf="@id/center"
                    app:layout_constraintTop_toTopOf="parent"
                    android:layout_marginTop="14dp"
                    android:drawablePadding="5dp"
                    android:drawableStart="@drawable/bg_point_end"/>
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:id="@+id/tv_unit"
                    android:textColor="@color/red_deep"
                    app:layout_constraintTop_toBottomOf="@id/tv_start"
                    android:layout_marginTop="18dp"
                    app:layout_constraintEnd_toEndOf="parent"
                    android:layout_marginEnd="20dp"
                    android:textStyle="bold"
                    android:textSize="18sp"
                    android:text="0.00"/>
                <TextView
                    android:layout_width="match_parent"
                    android:layout_height="24dp"
                    app:layout_constraintBaseline_toBaselineOf="@id/tv_unit"
                    app:layout_constraintStart_toStartOf="parent"
                    android:layout_marginStart="14dp"
                    android:gravity="center_vertical"
                    android:paddingHorizontal="10dp"
                    android:textColor="@color/textColor"
                    android:text="出发地"
                    android:textColor="@color/black_333333"
                    android:textSize="14sp"
                    android:textStyle="bold"
                    android:id="@+id/tv_time"
                    tools:text="12月23日 06:00-12:00"
                    android:background="@drawable/bg_gradiant_gray_h"/>
                <View
                    android:layout_width="20dp"
                    android:layout_height="20dp"
                    android:id="@+id/v1"
                    app:layout_constraintTop_toBottomOf="@id/tv_unit"
                    android:layout_marginStart="-15dp"
                    app:layout_constraintStart_toStartOf="parent"
                    android:layout_marginTop="7dp"
                    android:background="@drawable/bg_gray_10"/>
                <View
                    android:layout_width="20dp"
                    android:layout_height="20dp"
                    android:id="@+id/v2"
                    app:layout_constraintTop_toBottomOf="@id/tv_unit"
                    android:layout_marginEnd="-15dp"
                    app:layout_constraintEnd_toEndOf="parent"
                    android:layout_marginTop="7dp"
                    android:background="@drawable/bg_gray_10"/>
                <View
                    android:layout_width="match_parent"
                    android:layout_height="1px"
                    android:background="@color/dividing_line_color"
                    android:layout_marginTop="16dp"
                    android:layout_marginHorizontal="20dp"
                    app:layout_constraintTop_toBottomOf="@id/tv_unit"/>
                    android:textStyle="bold" />
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:id="@+id/tv_1"
                    android:text="乘车人数"
                    android:textColor="@color/textColor"
                    android:textStyle="bold"
                    app:layout_constraintTop_toBottomOf="@id/v1"
                    android:layout_marginTop="10dp"
                    android:layout_marginStart="14dp"
                    app:layout_constraintStart_toStartOf="parent"
                    android:textSize="16sp"/>
                <androidx.recyclerview.widget.RecyclerView
                    android:layout_width="match_parent"
                    android:layout_height="52dp"
                    android:id="@+id/rv_seat"
                    android:layout_marginHorizontal="10dp"
                    app:layout_constraintTop_toBottomOf="@id/tv_1"
                    android:layout_marginTop="14dp"/>
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:id="@+id/tv_2"
                    android:text="乘车手机号"
                    android:textColor="@color/textColor"
                    android:textStyle="bold"
                    app:layout_constraintTop_toBottomOf="@id/rv_seat"
                    android:layout_marginTop="20dp"
                    android:layout_marginStart="14dp"
                    app:layout_constraintStart_toStartOf="parent"
                    android:textSize="16sp"/>
                <EditText
                    android:layout_width="match_parent"
                    android:layout_height="50dp"
                    android:id="@+id/et_phone"
                    app:layout_constraintTop_toBottomOf="@id/tv_2"
                    android:layout_margin="14dp"
                    android:gravity="center_vertical"
                    android:paddingHorizontal="16dp"
                    android:maxLength="11"
                    android:inputType="number"
                    android:textColor="@color/textColor"
                    android:textSize="14sp"
                    android:textStyle="bold"
                    android:background="@drawable/bg_gray_11"/>
                <View
                    android:layout_width="match_parent"
                    android:layout_height="1px"
                    android:background="@color/dividing_line_color"
                    app:layout_constraintTop_toBottomOf="@id/et_phone"
                    android:layout_marginTop="20dp"/>
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:id="@+id/tv_3"
                    android:text="上车点"
                    android:textColor="@color/textColor"
                    android:textStyle="bold"
                    app:layout_constraintTop_toBottomOf="@id/et_phone"
                    android:layout_marginTop="40dp"
                    android:layout_marginStart="14dp"
                    app:layout_constraintStart_toStartOf="parent"
                    android:textSize="16sp"/>
                <TextView
                    android:layout_width="match_parent"
                    android:layout_height="50dp"
                    android:id="@+id/tv_start_point"
                    app:layout_constraintTop_toBottomOf="@id/tv_3"
                    android:layout_margin="14dp"
                    android:gravity="center_vertical"
                    android:paddingHorizontal="16dp"
                    android:textColor="@color/textColor"
                    android:textSize="14sp"
                    android:textStyle="bold"
                    android:drawableEnd="@mipmap/more_gray"
                    android:background="@drawable/bg_gray_11"/>
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_marginStart="40dp"
                    android:layout_marginEnd="13dp"
                    android:layout_weight="1"
                    android:gravity="center_vertical|end"
                    android:hint="请选择出发地"
                    android:singleLine="true"
                    android:textColor="@color/black"
                    android:textColorHint="@color/black4"
                    android:textSize="14sp" />
                <ImageView
                    android:layout_width="6dp"
                    android:layout_height="11dp"
                    android:src="@mipmap/more_black" />
            </LinearLayout>
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="50dp"
                android:layout_marginTop="1dp"
                android:background="@color/white"
                android:gravity="center_vertical"
                android:orientation="horizontal"
                android:paddingHorizontal="16dp">
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:id="@+id/tv_4"
                    android:text="下车点"
                    android:textColor="@color/textColor"
                    android:textStyle="bold"
                    app:layout_constraintTop_toBottomOf="@id/tv_start_point"
                    android:layout_marginTop="20dp"
                    android:layout_marginStart="14dp"
                    app:layout_constraintStart_toStartOf="parent"
                    android:textSize="16sp"/>
                <TextView
                    android:layout_width="match_parent"
                    android:layout_height="50dp"
                    android:id="@+id/tv_end_point"
                    app:layout_constraintTop_toBottomOf="@id/tv_4"
                    android:layout_margin="14dp"
                    android:gravity="center_vertical"
                    android:paddingHorizontal="16dp"
                    android:textColor="@color/textColor"
                    android:text="目的地"
                    android:textColor="@color/black_333333"
                    android:textSize="14sp"
                    android:textStyle="bold"
                    android:drawableEnd="@mipmap/more_gray"
                    android:background="@drawable/bg_gray_11"/>
                    android:textStyle="bold" />
                <TextView
                    android:id="@+id/tv_end_point"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_marginStart="40dp"
                    android:layout_marginEnd="13dp"
                    android:layout_weight="1"
                    android:gravity="center_vertical|end"
                    android:hint="请选择目的地"
                    android:singleLine="true"
                    android:textColor="@color/black"
                    android:textColorHint="@color/black4"
                    android:textSize="14sp" />
                <ImageView
                    android:layout_width="6dp"
                    android:layout_height="11dp"
                    android:src="@mipmap/more_black" />
            </LinearLayout>
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="50dp"
                android:layout_marginTop="10dp"
                android:background="@color/white"
                android:gravity="center_vertical"
                android:orientation="horizontal"
                android:paddingHorizontal="16dp">
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="乘车人联系电话"
                    android:textColor="@color/black_333333"
                    android:textSize="14sp"
                    android:textStyle="bold" />
                <EditText
                    android:id="@+id/et_phone"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:background="@null"
                    android:gravity="center_vertical|end"
                    android:hint="请输入联系电话"
                    android:inputType="number"
                    android:maxLength="11"
                    android:singleLine="true"
                    android:textColor="@color/black"
                    android:textColorHint="@color/black4"
                    android:textSize="14sp" />
            </LinearLayout>
            <LinearLayout
                android:id="@+id/ll_passengers_num"
                android:layout_width="match_parent"
                android:layout_height="50dp"
                android:layout_marginTop="1dp"
                android:background="@color/white"
                android:gravity="center_vertical"
                android:orientation="horizontal"
                android:paddingHorizontal="16dp">
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="乘车人数"
                    android:textColor="@color/black_333333"
                    android:textSize="14sp"
                    android:textStyle="bold" />
                <TextView
                    android:id="@+id/tv_passengers_num"
                    android:layout_width="0dp"
                    android:layout_height="match_parent"
                    android:layout_marginStart="40dp"
                    android:layout_marginEnd="13dp"
                    android:layout_weight="1"
                    android:gravity="center_vertical|end"
                    android:hint="请选择乘车人数"
                    android:textColor="@color/black"
                    android:textColorHint="@color/black4"
                    android:textSize="14sp" />
                <ImageView
                    android:layout_width="6dp"
                    android:layout_height="11dp"
                    android:src="@mipmap/more_black" />
            </LinearLayout>
            <LinearLayout
                android:id="@+id/ll_seat"
                android:layout_width="match_parent"
                android:layout_height="50dp"
                android:layout_marginTop="1dp"
                android:background="@color/white"
                android:gravity="center_vertical"
                android:orientation="horizontal"
                android:paddingHorizontal="16dp"
                android:visibility="gone"
                tools:visibility="visible">
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="选择座位"
                    android:textColor="@color/black_333333"
                    android:textSize="14sp"
                    android:textStyle="bold" />
                <TextView
                    android:id="@+id/tv_seat"
                    android:layout_width="0dp"
                    android:layout_height="match_parent"
                    android:layout_marginStart="40dp"
                    android:layout_marginEnd="13dp"
                    android:layout_weight="1"
                    android:gravity="center_vertical|end"
                    android:hint="请选择座位"
                    android:textColor="@color/black"
                    android:textColorHint="@color/black4"
                    android:textSize="14sp" />
                <ImageView
                    android:layout_width="6dp"
                    android:layout_height="11dp"
                    android:src="@mipmap/more_black" />
            </LinearLayout>
            <LinearLayout
                android:id="@+id/ll_more_fee"
                android:layout_width="match_parent"
                android:layout_height="50dp"
                android:layout_marginTop="1dp"
                android:background="@color/white"
                android:gravity="center_vertical"
                android:orientation="horizontal"
                android:paddingHorizontal="16dp"
                android:visibility="gone"
                tools:visibility="visible">
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="其他费用"
                    android:textColor="@color/black_333333"
                    android:textSize="14sp"
                    android:textStyle="bold" />
                <EditText
                    android:id="@+id/et_more_fee"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:background="@null"
                    android:gravity="center_vertical|end"
                    android:hint="请输入远程费、高速费、等待费等"
                    android:inputType="number"
                    android:maxLength="11"
                    android:singleLine="true"
                    android:textColor="@color/black"
                    android:textColorHint="@color/black4"
                    android:textSize="14sp" />
            </LinearLayout>
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal"
                android:layout_marginTop="32dp"
                android:text="订单金额"
                android:textColor="@color/black"
                android:textSize="14sp"
                android:textStyle="bold" />
            <TextView
                android:id="@+id/tv_had_change_price"
                android:layout_width="wrap_content"
                android:layout_height="20dp"
                android:layout_gravity="center_horizontal"
                android:layout_marginTop="4dp"
                android:background="@drawable/shape_ffe1e1_bg_30"
                android:gravity="center"
                android:paddingHorizontal="8dp"
                android:text="司机已修改金额"
                android:textColor="@color/main_yellow_shen"
                android:textSize="12sp"
                android:visibility="gone"
                tools:visibility="visible" />
            <RelativeLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal"
                android:layout_marginTop="4dp"
                android:orientation="horizontal">
                <TextView
                    android:id="@+id/tv_price"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="20dp"
                    android:layout_marginEnd="11dp"
                    android:text="-"
                    android:textColor="@color/textColor"
                    android:textSize="16sp"
                    android:textColor="@color/main_yellow_shen"
                    android:textSize="38sp"
                    android:textStyle="bold"
                    app:layout_constraintEnd_toEndOf="parent"
                    app:layout_constraintTop_toBottomOf="@id/tv_end_point" />
                    tools:text="¥78.00" />
                <TextView
                    android:id="@+id/tv_unit"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="票价合计"
                    android:textColor="@color/textColor"
                    android:textStyle="bold"
                    app:layout_constraintTop_toBottomOf="@id/tv_end_point"
                    android:layout_marginTop="20dp"
                    android:layout_marginEnd="11dp"
                    app:layout_constraintStart_toStartOf="@id/tv_1"
                    android:textSize="16sp"/>
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:id="@+id/tv_5"
                    android:text="其他费用"
                    android:textColor="@color/textColor"
                    android:textStyle="bold"
                    app:layout_constraintTop_toBottomOf="@id/tv_price"
                    android:layout_marginTop="20dp"
                    android:layout_marginStart="14dp"
                    app:layout_constraintStart_toStartOf="parent"
                    android:textSize="16sp"/>
                <EditText
                    android:layout_width="match_parent"
                    android:layout_height="50dp"
                    android:id="@+id/et_more_fee"
                    app:layout_constraintTop_toBottomOf="@id/tv_5"
                    android:layout_margin="14dp"
                    android:gravity="center_vertical"
                    android:paddingHorizontal="16dp"
                    android:textColor="@color/textColor"
                    android:textSize="14sp"
                    android:hint="请输入远程费、高速费、等待费等"
                    android:textColorHint="@color/black_999999"
                    android:inputType="numberDecimal"
                    android:textStyle="bold"
                    android:background="@drawable/bg_gray_11"/>
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:id="@+id/tv_total"
                    app:layout_constraintStart_toStartOf="parent"
                    app:layout_constraintEnd_toEndOf="parent"
                    android:layout_marginTop="19dp"
                    android:layout_alignBaseline="@id/tv_price"
                    android:layout_marginStart="10dp"
                    android:layout_toEndOf="@id/tv_price"
                    android:textColor="@color/red_deep"
                    android:textSize="30sp"
                    android:textSize="18sp"
                    android:textStyle="bold"
                    android:text="-"
                    app:layout_constraintTop_toBottomOf="@id/et_more_fee"/>
                    android:visibility="gone"
                    tools:text="0.00"
                    tools:visibility="visible" />
            </RelativeLayout>
            <LinearLayout
                android:id="@+id/ll_edit_price"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal"
                android:layout_marginTop="4dp"
                android:gravity="center_vertical"
                android:orientation="horizontal">
                <ImageView
                    android:layout_width="16dp"
                    android:layout_height="16dp"
                    android:src="@mipmap/icon_pan_orange" />
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="费用合计"
                    android:textStyle="bold"
                    app:layout_constraintBottom_toBottomOf="parent"
                    android:layout_marginBottom="20dp"
                    android:textSize="14sp"
                    android:textColor="@color/textColor"
                    app:layout_constraintTop_toBottomOf="@id/tv_total"
                    app:layout_constraintStart_toStartOf="parent"
                    app:layout_constraintEnd_toEndOf="parent"/>
            </androidx.constraintlayout.widget.ConstraintLayout>
                    android:layout_marginStart="4dp"
                    android:text="修改订单金额"
                    android:textColor="@color/color_fb692a" />
            </LinearLayout>
            <TextView
                android:id="@+id/tv_action"
                android:layout_width="match_parent"
                android:layout_height="50dp"
                android:gravity="center"
                android:text="立即下单"
                android:textColor="@color/white"
                android:textSize="16sp"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal"
                android:layout_marginTop="32dp"
                android:text="费用合计"
                android:textColor="@color/black"
                android:textSize="14sp"
                android:textStyle="bold"
                android:layout_marginTop="30dp"
                android:layout_marginHorizontal="55dp"
                android:layout_marginBottom="30dp"
                android:background="@drawable/bg_gradiant_25"/>
                android:visibility="gone"
                tools:visibility="visible" />
            <RelativeLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal"
                android:layout_marginTop="4dp"
                android:visibility="gone"
                tools:visibility="visible">
                <TextView
                    android:id="@+id/tv_total"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="-"
                    android:textColor="@color/main_yellow_shen"
                    android:textSize="38sp"
                    android:textStyle="bold"
                    tools:text="¥78.00" />
            </RelativeLayout>
        </LinearLayout>
    </ScrollView>
    <TextView
        android:id="@+id/tv_action"
        android:layout_width="0dp"
        android:layout_height="50dp"
        android:layout_marginHorizontal="56dp"
        android:layout_marginBottom="34dp"
        android:background="@drawable/car_get_start"
        android:gravity="center"
        android:text="确认发布"
        android:textColor="@color/white"
        android:textSize="16sp"
        android:textStyle="bold"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
app/src/main/res/layout/activity_change_price.xml
New file
@@ -0,0 +1,102 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/white"
    android:gravity="center_horizontal"
    android:orientation="vertical"
    tools:context=".ui.to_city.ChangePriceActivity">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="60dp"
        android:text="系统计算金额"
        android:textColor="@color/black"
        android:textSize="14sp" />
    <TextView
        android:id="@+id/tv_person_num"
        android:layout_width="wrap_content"
        android:layout_height="20dp"
        android:layout_marginTop="4dp"
        android:background="@drawable/shape_ffe1e1_bg_30"
        android:gravity="center"
        android:paddingHorizontal="8dp"
        android:textColor="@color/main_yellow_shen"
        android:textSize="12sp"
        tools:text="2人价" />
    <TextView
        android:id="@+id/tv_price"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="4dp"
        android:textColor="@color/main_yellow_shen"
        android:textSize="38sp"
        android:textStyle="bold"
        tools:text="¥99.26" />
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginHorizontal="45dp"
        android:layout_marginTop="36dp"
        android:text="修改金额"
        android:textColor="@color/black_333333"
        android:textSize="14sp" />
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:layout_marginHorizontal="45dp"
        android:layout_marginTop="4dp"
        android:background="@drawable/shape_d9d9d9_line_4"
        android:gravity="center"
        android:orientation="horizontal"
        android:paddingHorizontal="12dp">
        <EditText
            android:id="@+id/et_price"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:background="@null"
            android:digits="0123456789."
            android:gravity="center_vertical"
            android:hint="请输入金额"
            android:inputType="number"
            android:maxLength="6"
            android:singleLine="true"
            android:textColor="@color/black"
            android:textColorHint="@color/black10"
            android:textSize="14sp" />
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="元"
            android:textColor="@color/black11"
            android:textSize="14sp" />
    </LinearLayout>
    <View
        android:layout_width="1dp"
        android:layout_height="0dp"
        android:layout_weight="1" />
    <TextView
        android:id="@+id/tv_confirm"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_marginHorizontal="55dp"
        android:layout_marginBottom="34dp"
        android:background="@drawable/car_get_start"
        android:gravity="center"
        android:text="确认"
        android:textColor="@color/white"
        android:textSize="16sp"
        android:textStyle="bold" />
</LinearLayout>
app/src/main/res/layout/dialog_add_city_route_line_success.xml
New file
@@ -0,0 +1,110 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:layout_marginStart="35dp"
        android:layout_marginEnd="35dp"
        android:background="@drawable/bg_white_round_5">
        <ImageView
            android:id="@+id/view_hint_close_base"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentEnd="true"
            android:padding="20dp"
            android:src="@mipmap/icon_close" />
        <TextView
            android:id="@+id/tv_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="24dp"
            android:text="改派选择"
            android:textColor="@color/black_4A4C59"
            android:textSize="18sp"
            android:textStyle="bold" />
        <LinearLayout
            android:id="@+id/ll_start_end_city"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@id/tv_title"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="28dp"
            android:gravity="center_vertical"
            android:orientation="horizontal">
            <TextView
                android:id="@+id/tv_start_city"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textColor="@color/text_gray_car"
                android:textSize="16sp"
                android:textStyle="bold"
                tools:text="遵义" />
            <ImageView
                android:layout_width="24dp"
                android:layout_height="24dp"
                android:layout_marginHorizontal="18dp"
                android:src="@mipmap/icon_arrow_circle_red" />
            <TextView
                android:id="@+id/tv_destination_city"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textColor="@color/text_gray_car"
                android:textSize="16sp"
                android:textStyle="bold"
                tools:text="正安" />
        </LinearLayout>
        <LinearLayout
            android:id="@+id/ll_start_time"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@id/ll_start_end_city"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="22dp"
            android:gravity="center_vertical"
            android:orientation="horizontal">
            <ImageView
                android:layout_width="14dp"
                android:layout_height="14dp"
                android:src="@mipmap/icon_clock_gray" />
            <TextView
                android:id="@+id/tv_start_time"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginStart="4dp"
                android:textColor="@color/black_666666"
                android:textSize="14sp"
                tools:text="出发时间:2026-09-09 11:0" />
        </LinearLayout>
        <TextView
            android:id="@+id/tv_confirm"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:layout_below="@id/ll_start_time"
            android:layout_marginHorizontal="20dp"
            android:layout_marginTop="48dp"
            android:layout_marginBottom="20dp"
            android:background="@drawable/car_get_start"
            android:gravity="center"
            android:text="确认"
            android:textColor="@color/white"
            android:textSize="16sp"
            android:textStyle="bold" />
    </RelativeLayout>
</RelativeLayout>
app/src/main/res/layout/dialog_input_number.xml
New file
@@ -0,0 +1,42 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:layout_marginHorizontal="35dp"
        android:background="@drawable/bg_white_round_5"
        android:orientation="vertical">
        <TextView
            android:id="@+id/tv_input_label"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:layout_marginTop="36dp"
            android:text="请输入客户手机后4位"
            android:textColor="@color/black"
            android:textSize="18sp"
            android:textStyle="" />
        <cn.ptaxi.yuekeduocx.driver.ui.widget.InputNumberView
            android:id="@+id/inv_number"
            android:layout_width="match_parent"
            android:layout_height="59dp"
            android:layout_marginHorizontal="24dp"
            android:layout_marginVertical="36dp"
            app:digitCount="4"
            app:digitTextColor="@color/black"
            app:digitTextSize="24sp"
            app:digitTextStyle="bold"
            app:emptyRectColor="@color/color_f4f5f9"
            app:rectHeight="59dp"
            app:rectRadius="8dp"
            app:rectWidth="56dp"
            app:valueRectColor="@color/color_f4f5f9" />
    </LinearLayout>
</RelativeLayout>
app/src/main/res/layout/item_main_list.xml
@@ -254,19 +254,6 @@
            android:layout_toStartOf="@id/tv_cancel"
            android:background="@drawable/bg_login"
            android:paddingHorizontal="10dp"/>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="乘客支付"
            android:layout_marginEnd="10dp"
            android:paddingVertical="6dp"
            android:textSize="14sp"
            android:id="@+id/tv_qr"
            android:visibility="gone"
            android:textColor="@color/white"
            android:layout_toStartOf="@id/tv_pay"
            android:background="@drawable/bg_login"
            android:paddingHorizontal="10dp"/>
    </RelativeLayout>
</LinearLayout>
app/src/main/res/mipmap-xxhdpi/icon_pan_orange.png
app/src/main/res/values/attrs.xml
@@ -37,32 +37,32 @@
    </declare-styleable>
    <declare-styleable name="TextBannerViewStyle">
        <attr name="setInterval" format="integer|reference"/>
        <attr name="setAnimDuration" format="integer|reference"/>
        <attr name="setTextSize" format="dimension|reference"/>
        <attr name="setTextColor" format="color|reference"/>
        <attr name="setSingleLine" format="boolean"/>
        <attr name="setInterval" format="integer|reference" />
        <attr name="setAnimDuration" format="integer|reference" />
        <attr name="setTextSize" format="dimension|reference" />
        <attr name="setTextColor" format="color|reference" />
        <attr name="setSingleLine" format="boolean" />
        <attr name="setFlags">
            <enum name="strike" value="0"/>
            <enum name="underline" value="1"/>
            <enum name="strike" value="0" />
            <enum name="underline" value="1" />
        </attr>
        <attr name="setGravity">
            <enum name="left" value="0"/>
            <enum name="center" value="1"/>
            <enum name="right" value="2"/>
            <enum name="left" value="0" />
            <enum name="center" value="1" />
            <enum name="right" value="2" />
        </attr>
        <attr name="setDirection">
            <enum name="bottom_to_top" value="0"/>
            <enum name="top_to_bottom" value="1"/>
            <enum name="right_to_left" value="2"/>
            <enum name="left_to_right" value="3"/>
            <enum name="bottom_to_top" value="0" />
            <enum name="top_to_bottom" value="1" />
            <enum name="right_to_left" value="2" />
            <enum name="left_to_right" value="3" />
        </attr>
        <attr name="setTypeface">
            <enum name="normal" value="0"/>
            <enum name="bold" value="1"/>
            <enum name="italic" value="2"/>
            <enum name="italic_bold" value="3"/>
            <enum name="normal" value="0" />
            <enum name="bold" value="1" />
            <enum name="italic" value="2" />
            <enum name="italic_bold" value="3" />
        </attr>
    </declare-styleable>
@@ -73,16 +73,16 @@
    <declare-styleable name="WaveSideBar">
        <attr name="sidebar_lazy_respond" format="boolean"/>
        <attr name="sidebar_text_color" format="color"/>
        <attr name="sidebar_max_offset" format="dimension"/>
        <attr name="sidebar_lazy_respond" format="boolean" />
        <attr name="sidebar_text_color" format="color" />
        <attr name="sidebar_max_offset" format="dimension" />
        <attr name="sidebar_position" format="enum">
            <enum name="right" value="0"/>
            <enum name="left" value="1"/>
            <enum name="right" value="0" />
            <enum name="left" value="1" />
        </attr>
        <attr name="sidebar_text_alignment" format="enum">
            <enum name="center" value="0"/>
            <enum name="left" value="1"/>
            <enum name="center" value="0" />
            <enum name="left" value="1" />
            <enum name="right" value="2" />
        </attr>
    </declare-styleable>
@@ -96,4 +96,23 @@
        <attr name="progFirstColor" format="color" />   <!--进度圆环结束颜色-->
        <attr name="progress" format="integer" />       <!--圆环进度-->
    </declare-styleable>
    <declare-styleable name="InputNumberView">
        <attr name="value" format="string" />
        <attr name="digitCount" format="integer" />
        <attr name="rectWidth" format="dimension" />
        <attr name="rectHeight" format="dimension" />
        <attr name="rectRadius" format="dimension" />
        <attr name="normalBorderWidth" format="dimension" />
        <attr name="activeBorderWidth" format="dimension" />
        <attr name="normalBorderColor" format="color" />
        <attr name="activeBorderColor" format="color" />
        <attr name="emptyRectColor" format="color" />
        <attr name="valueRectColor" format="color" />
        <attr name="digitTextSize" format="dimension" />
        <attr name="digitTextColor" format="color" />
        <attr name="digitTextStyle">
            <flag name="normal" value="0" />
            <flag name="bold" value="1" />
        </attr>
    </declare-styleable>
</resources>
app/src/main/res/values/colors.xml
@@ -37,10 +37,13 @@
    <color name="black3">#4D000000</color>
    <color name="black35">#59000000</color>
    <color name="black1">#15000000</color>
    <color name="black10">#40000000</color>
    <color name="black11">#d9000000</color>
    <color name="black_333333">#333333</color><!--黑色 -->
    <color name="black_666666">#666666</color><!--黑色 -->
    <color name="black_999999">#999999</color><!--黑色 -->
    <color name="black_4A4C59">#4A4C59</color><!--黑色 -->
    <color name="black_994A4C59">#994A4C59</color><!--黑色 -->
    <color name="write">#FFFFFF</color>
    <color name="write_10">#1AFFFFFF</color>
@@ -121,4 +124,8 @@
    <color name="color_f07207">#F07207</color>
    <color name="color_f0f0f6">#f0f0f6</color>
    <color name="color_ececec">#ececec</color>
    <color name="color_1ad33233">#1ad33233</color>
    <color name="color_fb692a">#fb692a</color>
    <color name="color_ffe1e1">#ffe1e1</color>
    <color name="color_f4f5f9">#f4f5f9</color>
</resources>