18034727885
2026-06-11 e7b2b720ef95a7ca51bb35af34abe3ea4741e468
修复问题
2个文件已修改
460 ■■■■■ 已修改文件
app/src/main/java/com/xw/yunwei/model/TaskStatisticInfo.kt 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/xw/yunwei/ui/task/TaskFragment.kt 458 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/xw/yunwei/model/TaskStatisticInfo.kt
@@ -3,7 +3,7 @@
//任务统计信息
data class TaskStatisticInfo(
    var totalTableCount: Int?,//全部数量
    var completedCount: Int?,//已完成数量
    var reassignmentCount: Int?,//改派中数量
    var waitArriveCount: Int?,//待到达数量
    var waitHandleCount: Int?,//待处理数量
    var totalCount: Int?,//底部全部事故数量
app/src/main/java/com/xw/yunwei/ui/task/TaskFragment.kt
@@ -99,7 +99,7 @@
    val adapter by lazy {
        PagerAdapter(this)
    }
    private var tabLayoutMediator: TabLayoutMediator? = null
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // 初始化一次性定位,用于后续筛选或下发位置
@@ -125,9 +125,12 @@
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        binding.viewPager.adapter = adapter
        TabLayoutMediator(binding.tabLayout, binding.viewPager) { tab, position ->
            tab.text = tabTitles[position]
        }.attach()
        tabLayoutMediator =
            TabLayoutMediator(binding.tabLayout, binding.viewPager) { tab, position ->
                tab.text = tabTitles[position]
            }.apply {
                attach()
            }
    }
    /**
@@ -192,15 +195,14 @@
            val totalCountShow = it.totalTableCount.showCount(99)
            val waitArriveCountShow = it.waitArriveCount.showCount(99)
            val waitHandleCountShow = it.waitHandleCount.showCount(99)
            val completedCountShow = it.completedCount.showCount(99)
            val reassignmentCount = it.reassignmentCount.showCount(99)
            tabTitles[0] = "全部${if (totalCountShow.isEmpty()) "" else " $totalCountShow"}"
            tabTitles[1] =
                "待到达${if (waitArriveCountShow.isEmpty()) "" else " $waitArriveCountShow"}"
            tabTitles[2] =
                "待处理${if (waitHandleCountShow.isEmpty()) "" else " $waitHandleCountShow"}"
            tabTitles[3] =
                "已处理${if (completedCountShow.isEmpty()) "" else " $completedCountShow"}"
            tabTitles[4] = "改派中"
            tabTitles[3] = "已处理"
            tabTitles[4] = "改派中${if (reassignmentCount.isEmpty()) "" else " $reassignmentCount"}"
            adapter.notifyDataSetChanged()
            binding.tvAllCount.visibility =
                if ((it.totalCount ?: 0) > 0) View.VISIBLE else View.GONE
@@ -232,249 +234,262 @@
     * 首次创建时初始化各选项的默认选中状态及点击逻辑。
     */
    private fun showFilterDialog() {
        if (filterDialog == null) {
            filterDialog = DialogFactory.produce(requireActivity()).apply {
                customView(
                    com.xw.yunwei.R.layout.dialog_data_filter,
                    noVerticalPadding = true,
                    horizontalPadding = false
        filterDialog = DialogFactory.produce(requireActivity()).apply {
            customView(
                com.xw.yunwei.R.layout.dialog_data_filter,
                noVerticalPadding = true,
                horizontalPadding = false
            )
            cancelable(true)
            cornerRadius(12f)
            val bind: DialogDataFilterBinding? = DataBindingUtil.bind(getCustomView())
            with(bind!!) {
                // 移除默认的标题栏显示,改用自定义数据填充
                bind.stllTaskTime.remove()
                bind.stllTaskLevel.remove()
                bind.stllTaskType.remove()
                // 初始化派发时间筛选项
                bind.stllTaskTime.setData(
                    viewModel.filterTaskTime,
                    requireActivity(),
                    arrayListOf(
                        viewModel.filterTaskTime.indexOf(viewModel.selectTaskTime).toString()
                    ),
                    requireActivity().resources.getColor(R.color.blue_5),
                    "shape_blue1_bg_4"
                )
                cancelable(true)
                cornerRadius(12f)
                bind.tvStartTime.text = viewModel.startTime
                bind.tvEndTime.text = viewModel.endTime
                // 初始化优先级筛选项
                bind.stllTaskLevel.setData(
                    viewModel.filterTaskLevel,
                    requireActivity(),
                    arrayListOf(
                        viewModel.filterTaskLevel.indexOf(viewModel.selectTaskLevel).toString()
                    ),
                    requireActivity().resources.getColor(R.color.blue_5),
                    "shape_blue1_bg_4"
                )
                // 初始化任务类型筛选项
                bind.stllTaskType.setData(
                    viewModel.filterTaskType,
                    requireActivity(),
                    arrayListOf(
                        viewModel.filterTaskType.indexOf(viewModel.selectTaskType).toString()
                    ),
                    requireActivity().resources.getColor(R.color.blue_5),
                    "shape_blue1_bg_4"
                )
                val bind: DialogDataFilterBinding? = DataBindingUtil.bind(getCustomView())
                with(bind!!) {
                    // 移除默认的标题栏显示,改用自定义数据填充
                    bind.stllTaskTime.remove()
                    bind.stllTaskLevel.remove()
                    bind.stllTaskType.remove()
                    // 初始化派发时间筛选项
                    bind.stllTaskTime.setData(
                        viewModel.filterTaskTime,
                        requireActivity(),
                        arrayListOf("2"),
                        requireActivity().resources.getColor(R.color.blue_5),
                        "shape_blue1_bg_4"
                    )
                    // 初始化优先级筛选项
                    bind.stllTaskLevel.setData(
                        viewModel.filterTaskLevel,
                        requireActivity(),
                        arrayListOf("0"),
                        requireActivity().resources.getColor(R.color.blue_5),
                        "shape_blue1_bg_4"
                    )
                    // 初始化任务类型筛选项
                    bind.stllTaskType.setData(
                        viewModel.filterTaskType,
                        requireActivity(),
                        arrayListOf("0"),
                        requireActivity().resources.getColor(R.color.blue_5),
                        "shape_blue1_bg_4"
                    )
                    // 派发时间点击监听:单选切换并清空自定义时间
                    bind.stllTaskTime.setListener {
                        for (index in bind.stllTaskTime.selectIndexList) { // 先取消选中状态
                            bind.stllTaskTime.onTvClick(index)
                        }
                        val index = it.tag as Int // 当前点击的下标
                // 派发时间点击监听:单选切换并清空自定义时间
                bind.stllTaskTime.setListener {
                    for (index in bind.stllTaskTime.selectIndexList) { // 先取消选中状态
                        bind.stllTaskTime.onTvClick(index)
                        viewModel.selectTaskTime = viewModel.filterTaskTime[index]
                        viewModel.startTime = ""
                        viewModel.endTime = ""
                        bind.tvStartTime.text = viewModel.startTime
                        bind.tvEndTime.text = viewModel.endTime
                    }
                    // 优先级点击监听:单选切换
                    bind.stllTaskLevel.setListener {
                        for (index in bind.stllTaskLevel.selectIndexList) { // 先取消选中状态
                            bind.stllTaskLevel.onTvClick(index)
                        }
                        val index = it.tag as Int // 当前点击的下标
                    val index = it.tag as Int // 当前点击的下标
                    bind.stllTaskTime.onTvClick(index)
                    viewModel.selectTaskTime = viewModel.filterTaskTime[index]
                    viewModel.startTime = ""
                    viewModel.endTime = ""
                    bind.tvStartTime.text = viewModel.startTime
                    bind.tvEndTime.text = viewModel.endTime
                }
                // 优先级点击监听:单选切换
                bind.stllTaskLevel.setListener {
                    for (index in bind.stllTaskLevel.selectIndexList) { // 先取消选中状态
                        bind.stllTaskLevel.onTvClick(index)
                        viewModel.selectTaskLevel = viewModel.filterTaskLevel[index]
                    }
                    // 任务类型点击监听:单选切换
                    bind.stllTaskType.setListener {
                        for (index in bind.stllTaskType.selectIndexList) { // 先取消选中状态
                            bind.stllTaskType.onTvClick(index)
                        }
                        val index = it.tag as Int // 当前点击的下标
                    val index = it.tag as Int // 当前点击的下标
                    bind.stllTaskLevel.onTvClick(index)
                    viewModel.selectTaskLevel = viewModel.filterTaskLevel[index]
                }
                // 任务类型点击监听:单选切换
                bind.stllTaskType.setListener {
                    for (index in bind.stllTaskType.selectIndexList) { // 先取消选中状态
                        bind.stllTaskType.onTvClick(index)
                        viewModel.changeTaskType(index)
                    }
                    /**
                     * 排序选项点击回调
                     * @param name 排序字段名称
                     */
                    val onCheck: (String) -> Unit = { name ->
                        if (name == viewModel.selectTaskSort) {
                            // 同一字段再次点击,切换正序/倒序
                            viewModel.taskSort = if (viewModel.taskSort == 1) 2 else 1
                    val index = it.tag as Int // 当前点击的下标
                    bind.stllTaskType.onTvClick(index)
                    viewModel.changeTaskType(index)
                }
                val refresh: () -> Unit = {
                    viewModel.sortViews.forEach {
                        if (it.name.text == viewModel.selectTaskSort) {
                            it.layout.isSelected = true
                            it.name.isSelected = true
                            it.arrowUp.isSelected = viewModel.taskSort == 2
                            it.arrowDown.isSelected = viewModel.taskSort == 1
                        } else {
                            // 切换排序字段,默认正序
                            viewModel.selectTaskSort = name
                            viewModel.taskSort = 1
                        }
                        // 更新所有排序项的选中状态及箭头方向
                        viewModel.sortViews.forEach {
                            if (it.name.text == viewModel.selectTaskSort) {
                                it.layout.isSelected = true
                                it.name.isSelected = true
                                it.arrowUp.isSelected = viewModel.taskSort == 2
                                it.arrowDown.isSelected = viewModel.taskSort == 1
                            } else {
                                it.layout.isSelected = false
                                it.name.isSelected = false
                                it.arrowUp.isSelected = false
                                it.arrowDown.isSelected = false
                            }
                            it.layout.isSelected = false
                            it.name.isSelected = false
                            it.arrowUp.isSelected = false
                            it.arrowDown.isSelected = false
                        }
                    }
                    // 默认选中第一个排序项
                    val defaultSelectFirst: () -> Unit = {
                        viewModel.sortViews.forEachIndexed { index, itemBind ->
                            itemBind.layout.isSelected = index == 0
                            itemBind.name.isSelected = index == 0
                            itemBind.arrowUp.isSelected = index == 0 && viewModel.taskSort == 2
                            itemBind.arrowDown.isSelected = index == 0 && viewModel.taskSort == 1
                        }
                }
                /**
                 * 排序选项点击回调
                 * @param name 排序字段名称
                 */
                val onCheck: (String) -> Unit = { name ->
                    if (name == viewModel.selectTaskSort) {
                        // 同一字段再次点击,切换正序/倒序
                        viewModel.taskSort = if (viewModel.taskSort == 1) 2 else 1
                    } else {
                        // 切换排序字段,默认正序
                        viewModel.selectTaskSort = name
                        viewModel.taskSort = 1
                    }
                    // 更新所有排序项的选中状态及箭头方向
                    refresh()
                }
                    // 动态构建排序选项视图
                    bind.tagLayout.removeAllViews()
                    viewModel.sortViews.clear()
                    viewModel.filterTaskSort.forEachIndexed { index, name ->
                        val itemBind: ItemArrow2TextBinding = DataBindingUtil.inflate(
                            LayoutInflater.from(activity),
                            com.xw.yunwei.R.layout.item_arrow2_text,
                            null,
                            false
                        )
                        itemBind.name.text = name
                        viewModel.sortViews.add(itemBind)
                        itemBind.root.setOnClickListener { onCheck(name) }
                        bind.tagLayout.addView(itemBind.root)
                // 动态构建排序选项视图
                bind.tagLayout.removeAllViews()
                viewModel.sortViews.clear()
                viewModel.filterTaskSort.forEachIndexed { index, name ->
                    val itemBind: ItemArrow2TextBinding = DataBindingUtil.inflate(
                        LayoutInflater.from(activity),
                        com.xw.yunwei.R.layout.item_arrow2_text,
                        null,
                        false
                    )
                    itemBind.name.text = name
                    viewModel.sortViews.add(itemBind)
                    itemBind.root.setOnClickListener { onCheck(name) }
                    bind.tagLayout.addView(itemBind.root)
                }
                refresh()
                viewModel.sortViews.forEach {
                    if (it.name.text == viewModel.selectTaskSort) {
                        it.layout.isSelected = true
                        it.name.isSelected = true
                        it.arrowUp.isSelected = viewModel.taskSort == 2
                        it.arrowDown.isSelected = viewModel.taskSort == 1
                    } else {
                        it.layout.isSelected = false
                        it.name.isSelected = false
                        it.arrowUp.isSelected = false
                        it.arrowDown.isSelected = false
                    }
                    defaultSelectFirst()
                    // 开始时间选择:弹出日期选择器并校验不能大于结束时间
                    bind.tvStartTime.setOnClickListener {
                        val showTime = getTime(viewModel.startTime)
                        val minTime = getTime("2020-01-01")
                        dialogTime.show("选择日期", showTime, minTime) {
                            val odlIndex = mutableListOf<Int>()
                            for (index in bind.stllTaskTime.selectIndexList) { // 先取消选中状态
                                odlIndex.add(index)
                            }
                            odlIndex.forEach { bind.stllTaskTime.onTvClick(it) }
                            viewModel.selectTaskTime = ""
                            val selectTime = getTime(it)
                            if (viewModel.endTime.isNotEmpty()) {
                                if (selectTime.replace("-", "") > viewModel.endTime.replace(
                                        "-", ""
                                    )
                                ) {
                                    ToastUtilCommon.showWarn("开始时间不能大于结束时间")
                                    return@show
                                }
                            }
                            viewModel.startTime = selectTime
                            bind.tvStartTime.text = viewModel.startTime
                        }
                    }
                    // 结束时间选择:弹出日期选择器并校验不能小于开始时间
                    bind.tvEndTime.setOnClickListener {
                        val showTime = getTime(viewModel.endTime)
                        val minTime = getTime("2020-01-01")
                        dialogTime.show("选择日期", showTime, minTime) {
                            val odlIndex = mutableListOf<Int>()
                            for (index in bind.stllTaskTime.selectIndexList) { // 先取消选中状态
                                odlIndex.add(index)
                            }
                            odlIndex.forEach { bind.stllTaskTime.onTvClick(it) }
                            viewModel.selectTaskTime = ""
                            val selectTime = getTime(it)
                            if (viewModel.startTime.isNotEmpty()) {
                                if (selectTime.replace("-", "") < viewModel.startTime.replace(
                                        "-", ""
                                    )
                                ) {
                                    ToastUtilCommon.showWarn("开始时间不能大于结束时间")
                                    return@show
                                }
                            }
                            viewModel.endTime = getTime(it)
                            bind.tvEndTime.text = viewModel.endTime
                        }
                    }
                    // 取消:直接关闭弹窗
                    bind.cancel.setOnClickListener { dismiss() }
                    // 重置:恢复所有筛选项为默认状态
                    bind.btnLeft.setOnClickListener {
                }
                // 开始时间选择:弹出日期选择器并校验不能大于结束时间
                bind.tvStartTime.setOnClickListener {
                    val showTime = getTime(viewModel.startTime)
                    val minTime = getTime("2020-01-01")
                    dialogTime.show("选择日期", showTime, minTime) {
                        val odlIndex = mutableListOf<Int>()
                        for (index in bind.stllTaskTime.selectIndexList) { // 先取消选中状态
                            odlIndex.add(index)
                        }
                        odlIndex.forEach { bind.stllTaskTime.onTvClick(it) }
                        viewModel.selectTaskTime = viewModel.filterTaskTime[2]
                        bind.stllTaskTime.onTvClick(2)
                        viewModel.selectTaskTime = ""
                        odlIndex.clear()
                        for (index in bind.stllTaskLevel.selectIndexList) { // 先取消选中状态
                            odlIndex.add(index)
                        val selectTime = getTime(it)
                        if (viewModel.endTime.isNotEmpty()) {
                            if (selectTime.replace("-", "") > viewModel.endTime.replace(
                                    "-", ""
                                )
                            ) {
                                ToastUtilCommon.showWarn("开始时间不能大于结束时间")
                                return@show
                            }
                        }
                        odlIndex.forEach { bind.stllTaskLevel.onTvClick(it) }
                        viewModel.selectTaskLevel = viewModel.filterTaskLevel[0]
                        bind.stllTaskLevel.onTvClick(0)
                        odlIndex.clear()
                        for (index in bind.stllTaskType.selectIndexList) { // 先取消选中状态
                            odlIndex.add(index)
                        }
                        odlIndex.forEach { bind.stllTaskType.onTvClick(it) }
                        viewModel.changeTaskType(0)
                        bind.stllTaskType.onTvClick(0)
                        viewModel.startTime = ""
                        viewModel.startTime = selectTime
                        bind.tvStartTime.text = viewModel.startTime
                        viewModel.endTime = ""
                        bind.tvEndTime.text = viewModel.endTime
                        viewModel.selectTaskSort = viewModel.filterTaskSort[0]
                        defaultSelectFirst()
                    }
                    // 确定:校验时间合法性后下发筛选条件
                    bind.btnRight.setOnClickListener {
                        if (viewModel.selectTaskTime.isEmpty() && (viewModel.startTime.isEmpty() || viewModel.endTime.isEmpty())) {
                            ToastUtilCommon.showWarn("请正确选择时间")
                            return@setOnClickListener
                }
                // 结束时间选择:弹出日期选择器并校验不能小于开始时间
                bind.tvEndTime.setOnClickListener {
                    val showTime = getTime(viewModel.endTime)
                    val minTime = getTime("2020-01-01")
                    dialogTime.show("选择日期", showTime, minTime) {
                        val odlIndex = mutableListOf<Int>()
                        for (index in bind.stllTaskTime.selectIndexList) { // 先取消选中状态
                            odlIndex.add(index)
                        }
                        EventBus.getDefault().post(filterData)
                        viewModel.statistic()
                        odlIndex.forEach { bind.stllTaskTime.onTvClick(it) }
                        viewModel.selectTaskTime = ""
                        val selectTime = getTime(it)
                        if (viewModel.startTime.isNotEmpty()) {
                            if (selectTime.replace("-", "") < viewModel.startTime.replace(
                                    "-", ""
                                )
                            ) {
                                ToastUtilCommon.showWarn("开始时间不能大于结束时间")
                                return@show
                            }
                        }
                        viewModel.endTime = getTime(it)
                        bind.tvEndTime.text = viewModel.endTime
                    }
                }
                // 取消:直接关闭弹窗
                bind.cancel.setOnClickListener { dismiss() }
                // 重置:恢复所有筛选项为默认状态
                bind.btnLeft.setOnClickListener {
                    val odlIndex = mutableListOf<Int>()
                    for (index in bind.stllTaskTime.selectIndexList) { // 先取消选中状态
                        odlIndex.add(index)
                    }
                    odlIndex.forEach { bind.stllTaskTime.onTvClick(it) }
                    viewModel.selectTaskTime = viewModel.filterTaskTime[2]
                    bind.stllTaskTime.onTvClick(2)
                    odlIndex.clear()
                    for (index in bind.stllTaskLevel.selectIndexList) { // 先取消选中状态
                        odlIndex.add(index)
                    }
                    odlIndex.forEach { bind.stllTaskLevel.onTvClick(it) }
                    viewModel.selectTaskLevel = viewModel.filterTaskLevel[0]
                    bind.stllTaskLevel.onTvClick(0)
                    odlIndex.clear()
                    for (index in bind.stllTaskType.selectIndexList) { // 先取消选中状态
                        odlIndex.add(index)
                    }
                    odlIndex.forEach { bind.stllTaskType.onTvClick(it) }
                    viewModel.changeTaskType(0)
                    bind.stllTaskType.onTvClick(0)
                    viewModel.startTime = ""
                    bind.tvStartTime.text = viewModel.startTime
                    viewModel.endTime = ""
                    bind.tvEndTime.text = viewModel.endTime
                    viewModel.selectTaskSort = viewModel.filterTaskSort[0]
                    refresh()
                }
                // 确定:校验时间合法性后下发筛选条件
                bind.btnRight.setOnClickListener {
                    if (viewModel.selectTaskTime.isEmpty() && (viewModel.startTime.isEmpty() || viewModel.endTime.isEmpty())) {
                        ToastUtilCommon.showWarn("请正确选择时间")
                        return@setOnClickListener
                    }
                    EventBus.getDefault().post(filterData)
                    viewModel.statistic()
//                        requireActivity().supportFragmentManager.setFragmentResult(
//                            REQUEST_KEY_FILTER,
//                            bundleOf(KEY_FILTER_DATA to filterData)
//                        )
                        filterDialog?.dismiss()
                    }
                    // 底部确定按钮:同上
                    bind.sure.setOnClickListener {
                        EventBus.getDefault().post(filterData)
                        viewModel.statistic()
                    filterDialog?.dismiss()
                }
                // 底部确定按钮:同上
                bind.sure.setOnClickListener {
                    EventBus.getDefault().post(filterData)
                    viewModel.statistic()
//                        requireActivity().supportFragmentManager.setFragmentResult(
//                            REQUEST_KEY_FILTER,
//                            bundleOf(KEY_FILTER_DATA to filterData)
//                        )
                        filterDialog?.dismiss()
                    }
                    filterDialog?.dismiss()
                }
            }
        }
@@ -509,6 +524,11 @@
        }
    }
    override fun onDestroyView() {
        super.onDestroyView()
        tabLayoutMediator?.detach()
    }
    override fun onDestroy() {
        super.onDestroy()
        EventBus.getDefault().unregister(this)