package cn.flightfeather.thirdapp.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.thirdapp.CommonApplication
|
import cn.flightfeather.thirdapp.R
|
import cn.flightfeather.thirdapp.adapter.AllRecyclerViewAdapter
|
import cn.flightfeather.thirdapp.bean.entity.Scense
|
import cn.flightfeather.thirdapp.module.base.BaseMapActivity
|
import cn.flightfeather.thirdapp.module.base.GROUP_POINT
|
import cn.flightfeather.thirdapp.util.Constant
|
import cn.flightfeather.thirdapp.util.DateFormatter
|
import cn.flightfeather.thirdapp.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 = true
|
|
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
|
}
|
}
|
}
|
}
|
|
override fun getLayoutId(): Int = R.layout.activity_new_sub_task
|
|
override fun getMapView(): MapView = map_view
|
|
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 = ids.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
|
}
|
}
|
}
|
}
|
|
}
|