riku
2025-07-02 3013b813e5df6977c0be921928f73b1a3adde290
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
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
package cn.flightfeather.thirdappmodule.module.task
 
import android.app.AlertDialog
import android.app.DatePickerDialog
import android.arch.lifecycle.Observer
import android.arch.lifecycle.ViewModelProviders
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.animation.AnimationUtils
import android.widget.*
import cn.flightfeather.thirdappmodule.CommonApplication
import cn.flightfeather.thirdappmodule.R
import cn.flightfeather.thirdappmodule.adapter.AllRecyclerViewAdapter
import cn.flightfeather.thirdappmodule.bean.entity.Scense
import cn.flightfeather.thirdappmodule.module.base.BaseMapActivity
import cn.flightfeather.thirdappmodule.module.base.GROUP_POINT
import cn.flightfeather.thirdappmodule.util.Constant
import cn.flightfeather.thirdappmodule.util.DateFormatter
import cn.flightfeather.thirdappmodule.util.Domain
import com.amap.api.maps.MapView
import com.amap.api.maps.model.LatLng
import com.amap.api.maps.model.Marker
import kotlinx.android.synthetic.main.activity_base_map.*
import kotlinx.android.synthetic.main.activity_new_sub_task.*
import kotlinx.android.synthetic.main.layout_search_bar.*
import java.util.*
import kotlin.collections.ArrayList
 
/**
 * @author riku
 * Date:2019/7/22
 * 添加新子任务
 */
open class NewSubTaskActivity : BaseMapActivity() {
 
    lateinit var viewModel: NewSubTaskViewModel
 
    lateinit var selectedSceneAdapter:AllRecyclerViewAdapter<Scense>
 
    lateinit var unSelectedSceneAdapter:AllRecyclerViewAdapter<Scense>
 
    override var translucent: Boolean = false
 
    override fun getLayoutId(): Int = R.layout.activity_new_sub_task
 
    override fun getMapView(): MapView = map_view
 
    open fun getViewMode():NewSubTaskViewModel = ViewModelProviders.of(this).get(NewSubTaskViewModel::class.java)
 
    override fun onCreate(savedInstanceState: Bundle?) {
        viewModel = getViewMode()
        super.onCreate(savedInstanceState)
        onCreate()
    }
 
    open fun onCreate() {
        viewModel.totalSceneList.observe(this, Observer {
            it?.run {
                viewModel.selectedSceneList.clear()
                notifyDataChanged()
                showUploadBtn(false)
            }
        })
 
        viewModel.displaySceneList.observe(this, Observer { s->
            s?.let { notifyDataChanged(it) }
            myLatLngList.clear()
            s?.forEach {
                var drawableIndex = 0
                for (i in viewModel.sceneTypeList.indices) {
                    if (it.type == viewModel.sceneTypeList[i]) {
                        drawableIndex = if (i > 0) i - 1 else i
                        break
                    }
                }
                val latLng = LatLng(it.latitude ?: 31.230378, it.longitude ?: 121.473658)
                myLatLngList.add(
                        MyLatLng(
                                latLng,
                                it.index.toString(),
                                it.type,
                                drawableId = markerIDS[drawableIndex % markerIDS.size],
                                selected = viewModel.selectedSceneList.contains(it)
                        )
                )
            }
 
            viewModel.selectedTopTask?.let {
                zoomLevel = it.extension1?.toFloat() ?: 9F
                cityCode = it.citycode ?: "021"
                districtKeyWord = when (it.extension1) {
                    Domain.DOMAIN_SUITABLE_PROVINCE -> it.provincename
                    Domain.DOMAIN_SUITABLE_CITY -> it.cityname
                    Domain.DOMAIN_SUITABLE_DISTRICT -> it.districtname
                    Domain.DOMAIN_SUITABLE_TOWN -> it.townname
                    else -> it.districtname
                }
            }
            initLocation()
        })
 
        viewModel.topTaskList.observe(this, Observer {tops ->
            //初始化顶部下拉框
            tops?.let {
                val names = ArrayList<String>()
                it.forEach {task -> names.add(task.name) }
                val adapter = ArrayAdapter(this, android.R.layout.simple_spinner_dropdown_item, names)
                spinner_search.adapter = adapter
                spinner_search.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
                    override fun onNothingSelected(parent: AdapterView<*>?) = Unit
                    override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {
                        viewModel.selectedTopTask = it[position]
                        viewModel.getMOVList(it[position])//获取监管对象版本
                        viewModel.getSceneByTask(it[position].taskVo2Task(), 0)
                    }
                }
            }
        })
 
        viewModel.getTopClassTaskList(1, this)
    }
 
    override fun onMapInitStart() {
        //初始化已选场景侧边栏
        selectedSceneAdapter = object : AllRecyclerViewAdapter<Scense>(viewModel.selectedSceneList, R.layout.item_scene_task, this) {
            override fun bindView(holder: MyViewHolder?, obj: Scense?, isSelected: Boolean, position: Int) {
                holder?.setText(R.id.tv_item_task_list_time, "${obj?.index}")
                        ?.setText(R.id.tv_item_task_list_name, obj?.name ?: "未命名场景")
                        ?.setText(R.id.tv_item_task_list_address, "已巡查:${obj?.inspectedNum}次   需巡查:${obj?.monitorNum}次")
                        ?.setText(R.id.tv_item_task_list_status, "删除")
                        ?.setText(R.id.tv_scene_type, obj?.type ?: "无")
                        ?.setOnClickListener(R.id.tv_item_task_list_status){
                            deleteScene(obj, position)
                        }
                        ?.apply {
                            if (obj?.inspectedNum ?: 0 >= obj?.monitorNum ?: 0) {
                                itemView.alpha = 0.3F
                            } else {
                                itemView.alpha = 1.0F
                            }
                        }
            }
        }
        ssb_selected.setTitle("已选场景")
        ssb_selected.setAdapter(selectedSceneAdapter)
 
//        val callback = PlusItemSlideCallback2(WItemTouchHelperPlus.SLIDE_ITEM_TYPE_ITEMVIEW, ScreenUtils.dp2px(this, 100f))
//        val extension = WItemTouchHelperPlus(callback)
//        extension.attachToRecyclerView(ssb_selected.contentView)
 
        //初始化剩余场景侧边栏
        unSelectedSceneAdapter = object : AllRecyclerViewAdapter<Scense>(viewModel.unSelectedSceneList, R.layout.item_scene_task, this) {
            override fun bindView(holder: MyViewHolder?, obj: Scense?, isSelected: Boolean, position: Int) {
                holder?.setText(R.id.tv_item_task_list_time, "${obj?.index}")
                        ?.setText(R.id.tv_item_task_list_name, obj?.name ?: "未命名场景")
                        ?.setText(R.id.tv_item_task_list_address, "已巡查:${obj?.inspectedNum}次   需巡查:${obj?.monitorNum}次")
                        ?.setText(R.id.tv_item_task_list_status, "添加")
                        ?.setText(R.id.tv_scene_type, obj?.type ?: "无")
                        ?.setOnClickListener(R.id.tv_item_task_list_status) {
                            addScene(obj, p = position)
                        }
                        ?.apply {
                            if (obj?.inspectedNum ?: 0 >= obj?.monitorNum ?: 0) {
                                itemView.alpha = 0.3F
                            } else {
                                itemView.alpha = 1.0F
                            }
                        }
            }
        }
        ssb_un_selected.setTitle("剩余监管场景")
        ssb_un_selected.setAdapter(unSelectedSceneAdapter)
 
        cv_filter.setOnClickListener {
            showSceneTypeDialog()
        }
        cv_filter_monitor_num.setOnClickListener {
            showMonitorNumDialog()
        }
        cv_upload.visibility = View.GONE
        cv_upload.setOnClickListener {
            submitDialog()
        }
    }
 
    override fun onMarkerClick(marker: Marker) {
        val type = marker.snippet
        val index = marker.title
        if (type == GROUP_POINT) {
            //组合点
 
        } else {
            //场景点
            viewModel.displaySceneList.value?.forEach s@{
                if (it.type == type && it.index.toString() == index) {
                    if (marker.alpha == 0.3F) {
                        addScene(it, marker = marker)
                    } else {
                        deleteScene(it, marker = marker)
                    }
                    return@s
                }
            }
        }
    }
 
    fun submitDialog() {
        viewModel.generateTodayTask()
 
        val sceneNames = ArrayList<String>()
        viewModel.selectedSceneList.forEach { sceneNames.add(it.name) }
        val view = LayoutInflater.from(this).inflate(R.layout.dialog_plansubtask, null)
        view.apply {
            findViewById<Spinner>(R.id.spinner_scenselist).adapter = ArrayAdapter(this@NewSubTaskActivity, android.R.layout.simple_spinner_dropdown_item, sceneNames)
            val tvExecDate =  findViewById<TextView>(R.id.tv_exec_date).apply {
                text = DateFormatter.dateFormat.format(viewModel.todayTask.starttime)
            }
 
            // fixme: 2021/5/31 初始任务执行者默认为当前用户
            val ids = viewModel.selectedTopTask?.executorguids?.split(Constant.CONNECTOR)
            val userNames = viewModel.selectedTopTask?.executorusernames?.split(Constant.CONNECTOR)
            val realNames = viewModel.selectedTopTask?.executorrealnames?.split(Constant.CONNECTOR)
            var size = ids?.size
            size = when {
                userNames?.size!! > size ?: 0 -> userNames.size
                realNames?.size!! > size ?: 0 -> realNames.size
                else -> size
            }
            val mCheckedArray = BooleanArray(size ?: 0)
 
            val id = StringBuilder()
            val userName = StringBuilder()
            val realName = StringBuilder()
            for (i in ids?.indices ?: 0..0) {
                if (CommonApplication.getInstance().currentUser.guid == ids?.get(i)) {
                    mCheckedArray[i] = true
                    if (id.isNotEmpty()) {
                        id.append(Constant.CONNECTOR)
                        userName.append(Constant.CONNECTOR)
                        realName.append(Constant.CONNECTOR)
                    }
                    id.append(ids?.get(i))
                    userName.append(userNames?.get(i))
                    realName.append(realNames?.get(i))
                } else {
                    mCheckedArray[i] = false
                }
            }
 
            val tvTaskExecutors = findViewById<TextView>(R.id.tv_task_executors).apply {
                text = realName.toString().replace(Constant.CONNECTOR, Constant.CONNECTOR_FOR_VIEW)
            }
            viewModel.subTaskExecutor.apply {
                this.executorGuids = id.toString()
                this.executorUserNames = userName.toString()
                this.executorRealNames = realName.toString()
            }
            findViewById<LinearLayout>(R.id.ll_exec_date).setOnClickListener{
                showDatePickerDialog(tvExecDate)
            }
            findViewById<LinearLayout>(R.id.ll_task_executors).setOnClickListener{
                showExecutorsDialog(tvTaskExecutors, mCheckedArray)
            }
        }
 
        AlertDialog.Builder(this).setTitle("任务制定")
                .setView(view)
                .setNegativeButton(R.string.cancel, null)
                .setPositiveButton(R.string.yes){_, _->
                    if (!viewModel.hasDayTask()) {
                        viewModel.updateDayTask()
                    }
                    viewModel.updateSubTask()
                    viewModel.updateMov(this)
                }.show()
    }
 
    fun showSceneTypeDialog() {
        val items = viewModel.sceneTypeList.toTypedArray()
        AlertDialog.Builder(this)
                .setTitle("场景类型")
                .setSingleChoiceItems(items, viewModel.selectedTypeIndex){dialog, which ->
                    if (viewModel.selectedTypeIndex != which) {
                        viewModel.selectedTypeIndex = which
                        viewModel.refreshScene()
                    }
                    dialog.dismiss()
                }.show()
    }
 
    fun showMonitorNumDialog() {
        val items = arrayOf("全部", "未完成监管", "已完成监管")
        AlertDialog.Builder(this)
                .setTitle("是否监管")
                .setSingleChoiceItems(items, viewModel.selectedInspectedIndex){dialog, which ->
                    if (viewModel.selectedInspectedIndex != which) {
                        viewModel.selectedInspectedIndex = which
                        viewModel.refreshScene()
                    }
                    dialog.dismiss()
                }.show()
    }
 
    private fun showDatePickerDialog(t:TextView) {
        val cal = Calendar.getInstance()
        val year= cal.get(Calendar.YEAR)
        val month = cal.get(Calendar.MONTH)
        val day = cal.get(Calendar.DAY_OF_MONTH)
        //日历控件
        val dp = DatePickerDialog(this, DatePickerDialog.OnDateSetListener { datePicker, iyear, monthOfYear, dayOfMonth ->
            val cal_s = Calendar.getInstance()
            cal_s.set(Calendar.YEAR, iyear)
            cal_s.set(Calendar.MONTH, monthOfYear)
            cal_s.set(Calendar.DAY_OF_MONTH, dayOfMonth)
            cal_s.set(Calendar.HOUR_OF_DAY, 0)
            cal_s.set(Calendar.MINUTE, 0)
            cal_s.set(Calendar.SECOND, 0)
            viewModel.todayTask.starttime = cal_s.time
            val cal_e = Calendar.getInstance()
            cal_e.set(Calendar.YEAR, iyear)
            cal_e.set(Calendar.MONTH, monthOfYear)
            cal_e.set(Calendar.DAY_OF_MONTH, dayOfMonth)
            cal_e.set(Calendar.HOUR_OF_DAY, 23)
            cal_e.set(Calendar.MINUTE, 59)
            cal_e.set(Calendar.SECOND, 59)
            viewModel.todayTask.endtime = cal_e.time
            t.text = DateFormatter.dateFormat.format(viewModel.todayTask.starttime)
        }, year, month, day)
        val datePicker = dp.datePicker
        viewModel.selectedTopTask?.starttime?.time?.let { datePicker.minDate = it }
        viewModel.selectedTopTask?.endtime?.time?.let { datePicker.maxDate = it }
        dp.show()
    }
 
    /**
     * 显示任务执行者多选对话框
     */
    private fun showExecutorsDialog(t: TextView, mCheckedArray: BooleanArray) {
        // 设置默认选中的选项,全为false默认均未选中
        val executorGuids = viewModel.selectedTopTask?.executorguids?.split(Constant.CONNECTOR)
        val executorUNames = viewModel.selectedTopTask?.executorusernames?.split(Constant.CONNECTOR)?.toTypedArray()
        val executorRNames = viewModel.selectedTopTask?.executorrealnames?.split(Constant.CONNECTOR)?.toTypedArray()
 
        val multiChoiceDialog = AlertDialog.Builder(this)
        multiChoiceDialog.setTitle("选择任务执行者")
        multiChoiceDialog.setMultiChoiceItems(executorRNames, mCheckedArray) { _, which, isChecked ->
            mCheckedArray[which] = isChecked
        }
        multiChoiceDialog.setPositiveButton("确定") { _, _ ->
            val sb = StringBuilder()
            val sbUn = StringBuilder() //用户名字符串
            val sbRn = StringBuilder() //真实姓名字符串,用于界面显示
            for ((i, isChecked) in mCheckedArray.withIndex()) {
                if (isChecked) {
                    sb.append(executorGuids?.get(i) ?: "").append(Constant.CONNECTOR)
                    sbUn.append(executorUNames?.get(i) ?: "").append(Constant.CONNECTOR)
                    sbRn.append(executorRNames?.get(i) ?: "").append(Constant.CONNECTOR)
                }
            }
            if (sb.isNotEmpty()) {
                val executors = sb.deleteCharAt(sb.length - 1).toString()
                val executors_un = sbUn.deleteCharAt(sbUn.length - 1).toString()
                val executors_rn = sbRn.deleteCharAt(sbRn.length - 1).toString()
                viewModel.subTaskExecutor.apply {
                    this.executorGuids = executors
                    this.executorUserNames = executors_un
                    this.executorRealNames = executors_rn
                }
                val names = executors_rn.replace((Constant.CONNECTOR).toRegex(), Constant.CONNECTOR_FOR_VIEW)
                t.text = names
            }
        }
        multiChoiceDialog.show()
    }
 
    fun clearData() {
        viewModel.unSelectedSceneList.clear()
    }
 
    fun notifyDataChanged(s: ArrayList<Scense>) {
        clearData()
        viewModel.unSelectedSceneList.addAll(viewModel.deleteSelectedScene())
        notifyDataChanged()
    }
 
    open fun addScene(newScene: Scense?, oldScene: Scense? = null, p: Int? = null, marker: Marker? = null) {
        newScene?.let {
            viewModel.selectedSceneList.add(it)
            viewModel.selectedDisplaySceneList.add(it)
            viewModel.unSelectedSceneList.remove(it)
            if (p != null) {
                ssb_un_selected.notifyDataRemoved(p)
                ssb_selected.notifyDataChanged()
                selectedSceneAdapter.notifyDataSetChanged()
            } else {
                notifyDataChanged()
            }
            showUploadBtn(true)
            refreshLatLng(it.index.toString(), it.type, marker)
        }
    }
 
    fun deleteScene(s: Scense?, p: Int? = null, marker: Marker? = null) {
        s?.let {
            viewModel.selectedSceneList.remove(it)
            viewModel.selectedDisplaySceneList.remove(it)
            viewModel.unSelectedSceneList.add(it)
            if (p != null) {
                ssb_selected.notifyDataRemoved(p)
                ssb_un_selected.notifyDataChanged()
            } else {
                notifyDataChanged()
            }
 
            if (viewModel.selectedSceneList.isEmpty()) {
                showUploadBtn(false)
            }
            refreshLatLng(s.index.toString(), s.type, marker)
        }
    }
 
    fun notifyDataChanged() {
        ssb_selected.notifyDataChanged()
        ssb_un_selected.notifyDataChanged()
    }
 
    fun showUploadBtn(show: Boolean) {
        if (show) {
            cv_upload.run{
                if (visibility == View.GONE) {
                    startAnimation(AnimationUtils.loadAnimation(this@NewSubTaskActivity, R.anim.scale_zoom_in))
                    visibility = View.VISIBLE
                }
            }
        } else {
            cv_upload.run {
                if (visibility == View.VISIBLE) {
                    startAnimation(AnimationUtils.loadAnimation(this@NewSubTaskActivity, R.anim.scale_zoom_out))
                    visibility = View.GONE
                }
            }
        }
    }
 
}