18034727885
2026-06-18 10c9a6e8e76feca89a701e09016679be1e014efa
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
package com.xw.yunwei.ui.task.accident.handle
 
import android.annotation.SuppressLint
import android.net.Uri
import androidx.recyclerview.widget.GridLayoutManager
import com.blankj.utilcode.util.UriUtils
import com.luck.picture.lib.config.PictureMimeType
import com.luck.picture.lib.entity.LocalMedia
import com.luck.picture.lib.interfaces.OnResultCallbackListener
import com.xw.common.CommonDialog
import com.xw.common.R
import com.xw.common.base.FileSelectBean
import com.xw.common.base.ImageEventListener
import com.xw.common.base.ImageSelectAdapter
import com.xw.common.base.ShowImgListDialog
import com.xw.yunwei.BR
import com.xw.yunwei.BaseBusinessActivity
import com.xw.yunwei.databinding.ActivityAccidentProcessBinding
import com.xw.yunwei.utils.PictureSelectorFactory
 
/**
 * 事故处理页面
 *
 * 提供事故处理信息录入功能,包括:
 * - 人员伤亡情况(死亡、重伤、轻伤)的增减操作
 * - 责任判定选择(我方主责 / 我方无责 / 双方同责)
 * - 现场情况与处置情况的多行文本描述
 * - 三组图片上传(交警判责照片、现场情况照片、处置情况照片)
 *
 * 图片支持拍照和从图库选择两种方式,提交时先上传图片再调用接口。
 */
class AccidentProcessActivity : BaseBusinessActivity<ActivityAccidentProcessBinding, AccidentProcessVM>(){
    override fun getBindingVariable() = BR.viewModel
 
    override fun init() {
        super.init()
        // 从Intent获取任务ID并保存到ViewModel
        viewModel.taskId = intent.getLongExtra("taskId", 0L)
        initAdapter()
        // 移除默认选中状态,由用户手动选择责任判定
        binding.stllZrpd.remove()
        binding.stllZrpd.setData(
            viewModel.dataZrpd,
            this,
            ArrayList(),
            resources.getColor(R.color.white),
            "shape_blue_5_bg_4"
        )
    }
 
    override fun setListener() {
        super.setListener()
        // 责任判定标签点击监听:单选逻辑,先取消全部选中,再选中当前点击项
        binding.stllZrpd.setListener {
            for (index in binding.stllZrpd.selectIndexList) { // 先取消选中状态
                binding.stllZrpd.onTvClick(index)
            }
            val index = it.tag as Int // 当前点击的下标
            binding.stllZrpd.onTvClick(index)
            viewModel.selectZrpd = viewModel.dataZrpd[index]
        }
    }
 
    /**
     * 初始化三组图片选择适配器
     *
     * 分别绑定到 rv1(交警判责照片)、rv2(现场情况照片)、rv3(处置情况照片),
     * 每组最多上传 [AccidentProcessVM.maxSizes] 张图片。
     */
    private fun initAdapter(){
        viewModel.adapters.clear()
        viewModel.imageEvents.clear()
        for (index in 0 until 3) {
            val imageEvent = object : ImageEventListener<FileSelectBean>() {
                override fun addImage(item: FileSelectBean) {
                    viewModel.operateIndex = index
                    showTypeDialog()
                }
 
                override fun viewImage(item: FileSelectBean) {
                    val imgList: MutableList<String> = ArrayList()
                    for (item1 in viewModel.adapters[index].data) {
                        imgList.add(item1.localPath.ifEmpty { item1.url })
                    }
                    ShowImgListDialog(
                        this@AccidentProcessActivity,
                        imgList,
                        imgList.indexOf(item.localPath)
                    ).show()
                }
 
                override fun deleteImage(item: FileSelectBean) {
                    viewModel.adapters[index].remove(item)
                }
            }
            viewModel.imageEvents.add(imageEvent)
 
            val adapter = ImageSelectAdapter(this, viewModel.maxSizes[index], 1, imageEvent)
            viewModel.adapters.add(adapter)
        }
 
        binding.rv1.adapter = viewModel.adapters[0]
        binding.rv1.layoutManager = GridLayoutManager(this, 5)
 
        binding.rv2.adapter = viewModel.adapters[1]
        binding.rv2.layoutManager = GridLayoutManager(this, 5)
 
        binding.rv3.adapter = viewModel.adapters[2]
        binding.rv3.layoutManager = GridLayoutManager(this, 5)
    }
 
    /**
     * 显示图片选择方式弹窗(拍照 / 图库)
     */
    private fun showTypeDialog() {
        CommonDialog.showTypeDialog(this) {
            if (it == 0) takeAPhotograph() else if (it == 1) enterGallery()
        }
    }
 
    /**
     * 进入图库选择图片
     *
     * 使用 PictureSelector 打开相册,最大可选数量为该组剩余可上传数量。
     */
    // 进入图库
    @SuppressLint("SourceLockedOrientationActivity")
    private fun enterGallery() {
        PictureSelectorFactory.enterGallery(
            this,
            viewModel.maxSizes[viewModel.operateIndex] - viewModel.adapters[viewModel.operateIndex].data.size,
            resultCallbackListener
        )
    }
 
    /**
     * 调用系统相机拍照
     */
    // 拍照
    private fun takeAPhotograph() {
        PictureSelectorFactory.takeAPhotograph(this,resultCallbackListener)
    }
 
    /**
     * 图片选择/拍照结果回调
     *
     * 将选中的图片路径转换为 [FileSelectBean] 并更新到当前操作组的适配器中。
     * 若为 Content URI 且未裁剪/压缩,则通过 [UriUtils.uri2File] 转为本地绝对路径。
     */
    private var resultCallbackListener = object : OnResultCallbackListener<LocalMedia> {
        override fun onResult(result: ArrayList<LocalMedia>?) {
            result?.let { selectList ->
                val dataList: MutableList<FileSelectBean> = ArrayList()
                dataList.addAll(viewModel.adapters[viewModel.operateIndex].data)
                for (item in selectList) {
                    val path: String = item.availablePath
                    var imgPath = if (PictureMimeType.isContent(path) && !item.isCut && !item.isCompressed) {
                        UriUtils.uri2File(Uri.parse(path)).absolutePath
                    } else {
                        path
                    }
                    dataList.add(FileSelectBean(localPath = imgPath, type = "img"))
                }
                viewModel.adapters[viewModel.operateIndex].setList(dataList)
            }
        }
        override fun onCancel() {}
    }
 
}