package cn.flightfeather.thirdappmodule.module.task
|
|
import android.app.AlertDialog
|
import android.arch.lifecycle.Observer
|
import android.os.Bundle
|
import android.support.v4.content.ContextCompat
|
import android.view.View
|
import android.widget.AdapterView
|
import android.widget.ArrayAdapter
|
import cn.flightfeather.thirdappmodule.R
|
import cn.flightfeather.thirdappmodule.adapter.AllRecyclerViewAdapter
|
import cn.flightfeather.thirdappmodule.bean.entity.Monitorobjectversion
|
import cn.flightfeather.thirdappmodule.bean.entity.Scense
|
import cn.flightfeather.thirdappmodule.bean.entity.Task
|
import cn.flightfeather.thirdappmodule.bean.vo.TaskVo
|
import cn.flightfeather.thirdappmodule.model.event.TopTaskEvent
|
import cn.flightfeather.thirdappmodule.util.Constant
|
import cn.flightfeather.thirdappmodule.util.Domain
|
import cn.flightfeather.thirdappmodule.util.UUIDGenerator
|
import com.amap.api.maps.model.LatLng
|
import com.amap.api.maps.model.Marker
|
import kotlinx.android.synthetic.main.activity_new_sub_task.*
|
import kotlinx.android.synthetic.main.layout_search_bar.*
|
import org.greenrobot.eventbus.EventBus
|
import org.greenrobot.eventbus.Subscribe
|
import org.jetbrains.anko.toast
|
import java.util.*
|
import kotlin.collections.ArrayList
|
|
/**
|
* @author riku
|
* Date:2019/8/4
|
*
|
*/
|
open class NewMonthTaskMapActivity : NewSubTaskActivity() {
|
|
//场景新增操作类型(0:替换原有的一个无效场景;1:插入原有的空缺编号中;2:按编号顺序插入至最后一位)
|
var operationType = 2
|
|
//选中的操作中的新场景
|
var selectedScene: Scense? = null
|
|
var topTask: Task? = null
|
|
override fun onCreate(savedInstanceState: Bundle?) {
|
EventBus.getDefault().register(this)
|
super.onCreate(savedInstanceState)
|
initData()
|
}
|
|
override fun onCreate() {
|
viewModel.totalSceneList.observe(this, Observer {
|
it?.run {
|
// notifyDataChanged()
|
// viewModel.refreshScene()
|
showUploadBtn(true)
|
}
|
})
|
|
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.getLastTopClassTask(it[position].taskVo2Task())//获取监管对象版本
|
}
|
}
|
}
|
})
|
|
}
|
|
/**
|
* 数据初始化
|
*/
|
open fun initData() {
|
val task = intent.getSerializableExtra(Constant.KEY_INTENT_TOPCLASS_TASK) as Task
|
topTask = task
|
viewModel.topTaskList.value = ArrayList<TaskVo>().apply { add(task.task2TaskVo()) }
|
}
|
|
override fun onMapInitStart() {
|
//初始化已选场景侧边栏
|
selectedSceneAdapter = object : AllRecyclerViewAdapter<Scense>(viewModel.selectedDisplaySceneList, R.layout.item_scene_new_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, if (obj?.extension1 == "0") "已完工场景" else "可用场景")
|
?.setText(R.id.tv_item_task_list_status, if (operationType != 0) "删除" else "替换")
|
?.setText(R.id.tv_scene_type, obj?.type ?: "无")
|
?.setOnClickListener(R.id.tv_item_task_list_status) {
|
if (enableDelete(obj)) {
|
deleteScene(obj, position)
|
if (operationType == 0) {
|
refreshIndex(obj, selectedScene)
|
addScene(selectedScene, obj, p = position)
|
notifyItemRangeChanged(position, viewModel.selectedDisplaySceneList.size - position)
|
operationType = 2
|
} else {
|
refreshMOV(0, oldScene = obj)
|
}
|
} else {
|
application.toast("该场景已经巡查过,无法删除或被替换")
|
}
|
}
|
?.setText(R.id.tv_monitor_num, obj?.monitorNum.toString())
|
?.setOnClickListener(R.id.btn_minus) {
|
val num = obj?.monitorNum ?: 1
|
obj?.monitorNum = if (num <= 1) 1 else num.minus(1)
|
viewModel.selectedSceneList.forEach {
|
if (it.guid == obj?.guid) {
|
it.monitorNum = obj?.monitorNum ?: 1
|
}
|
}
|
holder.setText(R.id.tv_monitor_num, obj?.monitorNum.toString())
|
}
|
?.setOnClickListener(R.id.btn_plus) {
|
val num = obj?.monitorNum ?: 1
|
obj?.monitorNum = num.plus(1)
|
viewModel.selectedSceneList.forEach {
|
if (it.guid == obj?.guid) {
|
it.monitorNum = obj?.monitorNum ?: 1
|
}
|
}
|
holder.setText(R.id.tv_monitor_num, obj?.monitorNum.toString())
|
}
|
?.apply {
|
if (obj?.extension1 == "0") {
|
setTextColor(R.id.tv_item_task_list_address, ContextCompat.getColor(this@NewMonthTaskMapActivity, R.color.red_btn_bg_color))
|
} else {
|
setTextColor(R.id.tv_item_task_list_address, ContextCompat.getColor(this@NewMonthTaskMapActivity, android.R.color.black))
|
}
|
}
|
}
|
}
|
ssb_selected.setTitle("已选场景")
|
ssb_selected.setAdapter(selectedSceneAdapter)
|
ssb_selected.onCloseClickListener = View.OnClickListener { operationType = 2 }
|
|
// 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, "${if(obj?.index == 0) "--" else obj?.index?: "--"}")
|
?.setText(R.id.tv_item_task_list_name, obj?.name ?: "未命名场景")
|
?.setText(R.id.tv_item_task_list_address, if (obj?.extension1 == "0") "已完工场景" else "可用场景")
|
?.setText(R.id.tv_item_task_list_status, "添加")
|
?.setText(R.id.tv_scene_type, obj?.type ?: "无")
|
?.setOnClickListener(R.id.tv_item_task_list_status) {
|
showOperationsDialog(obj)
|
selectedScene = obj
|
}
|
?.apply {
|
if (obj?.extension1 == "0") {
|
setTextColor(R.id.tv_item_task_list_address, ContextCompat.getColor(this@NewMonthTaskMapActivity, R.color.red_btn_bg_color))
|
} else {
|
setTextColor(R.id.tv_item_task_list_address, ContextCompat.getColor(this@NewMonthTaskMapActivity, android.R.color.black))
|
}
|
}
|
}
|
}
|
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 {
|
checkMOVInfo()
|
}
|
}
|
|
fun showOperationsDialog(s: Scense?) {
|
if (s==null) return
|
|
val items = arrayOf("替换", "插入", "递增")
|
AlertDialog.Builder(this)
|
.setTitle("请选择如何新增场景")
|
.setSingleChoiceItems(items, operationType) { dialog, which ->
|
operationType = which
|
when (which) {
|
0 -> {
|
viewModel.selectedTypeIndex = viewModel.sceneTypeList.indexOf(s.type)
|
viewModel.refreshScene()
|
ssb_selected.show()
|
}
|
1 -> {
|
showInsertDialog(s)
|
}
|
2 -> {
|
increase(s)
|
}
|
}
|
dialog.dismiss()
|
}
|
.show()
|
}
|
|
/**
|
* 展示空缺编号
|
*/
|
fun showInsertDialog(s: Scense?) {
|
val items = mutableListOf<String>()
|
val list = getOldSceneByType(s?.type ?: "")
|
list.let {
|
//首编号永远应该是1,所以列表的第一项需要和1做对比
|
if (it[0].index - 1 > 0) {
|
for (t in 1 until it[0].index) {
|
items.add(t.toString())
|
}
|
}
|
|
for (i in 1 until it.size) {
|
if (it[i].index - it[i - 1].index > 1) {
|
for (y in it[i - 1].index + 1 until it[i].index) {
|
items.add(y.toString())
|
}
|
}
|
}
|
}
|
|
|
if (items.size > 0) {
|
var index = items[0]
|
AlertDialog.Builder(this)
|
.setTitle("请选择插入的编号")
|
.setSingleChoiceItems(items.toTypedArray(), 0) { dialog, which ->
|
s?.let {
|
index = items[which]
|
}
|
}
|
.setNegativeButton(R.string.cancel, null)
|
.setPositiveButton(R.string.yes){_, _->
|
s?.let {
|
it.monitorNum = 1
|
it.index = index.toInt()
|
addScene(it)
|
}
|
}.show()
|
} else {
|
application.toast("没有空余编号")
|
}
|
}
|
|
fun increase(s: Scense?) {
|
//筛选与所选场景相同类型的所有场景
|
val list = getOldSceneByType(s?.type ?: "")
|
|
val lastIndex = if (list.isEmpty()) 0 else list.last().index
|
s?.let {
|
it.monitorNum = 1
|
it.index = lastIndex + 1
|
}
|
addScene(s)
|
}
|
|
/**
|
* 替换操作[operationType] == 0时,需要判断旧场景是否能被替换
|
*/
|
open fun enableDelete(oldScene: Scense?): Boolean = true
|
|
/**
|
* 替换操作[operationType] == 0中,更新新场景的编号
|
*/
|
fun refreshIndex(oldScene: Scense?, newScene: Scense?) {
|
oldScene?.index?.let {
|
newScene?.monitorNum = 1
|
newScene?.index = it
|
}
|
}
|
|
/**
|
* 更新监管版本列表MOV中的信息
|
* @param type 变更类型,0:删除了一个场景;1:替换了一个场景;2:新增了一个场景
|
* @param newScene 新场景,其编号属性[Scense.index] 已经跟据新增规则更新,直接对应在监管版本中的编号
|
*/
|
open fun refreshMOV(type: Int, oldScene: Scense? = null, newScene: Scense? = null) {
|
//do nothing
|
}
|
|
/**
|
* 按类型获取原监管版本中的所有场景
|
*/
|
fun getOldSceneByType(type: String): MutableList<Scense> {
|
val list = mutableListOf<Scense>()
|
viewModel.selectedSceneList.forEach {
|
if (it.type == type) {
|
list.add(it)
|
}
|
}
|
list.sortBy {
|
it.index
|
}
|
return list
|
}
|
|
override fun addScene(newScene: Scense?, oldScene: Scense?, p: Int?, marker: Marker?) {
|
newScene?.let {
|
if (p != null) {
|
viewModel.selectedDisplaySceneList.add(p, it)
|
} else {
|
viewModel.selectedDisplaySceneList.add(it)
|
}
|
viewModel.selectedSceneList.add(it)
|
viewModel.unSelectedSceneList.remove(it)
|
viewModel.selectedDisplaySceneList.sortBy { it1 ->
|
it1.index
|
}
|
viewModel.selectedDisplaySceneList.sortByDescending { it1 ->
|
it1.extension1
|
}
|
|
if (p != null) {
|
ssb_un_selected.notifyDataRemoved(p)
|
ssb_selected.notifyDataInserted(p)
|
} else {
|
notifyDataChanged()
|
}
|
showUploadBtn(true)
|
refreshLatLng(it.index.toString(), it.type, marker)
|
|
//更新mov列表
|
refreshMOV(if(operationType == 0) 1 else 2, oldScene, it)
|
}
|
}
|
|
/**
|
* 验证该监管对象版本信息是否合规,如监管频次不可为0等。
|
*/
|
fun checkMOVInfo() {
|
var disable = false
|
for (i in viewModel.selectedSceneList) {
|
if (i.extension1 == "0") {
|
disable = true
|
break
|
}
|
}
|
if (disable) {
|
application.toast("该监管对象版本存在不可用场景,请替换该场景。")
|
} else {
|
showAlertDialog()
|
}
|
}
|
|
/**
|
* 显示提交监管对象版本对话框
|
*/
|
open fun showAlertDialog() {
|
val desc = StringBuilder().append("所有场景:").append(viewModel.selectedSceneList.size)
|
.append("/").append(viewModel.totalSceneList.value?.size).append(" ")
|
|
var msg = "本次监管对象版本信息如下:"
|
//若存在监管多次的工地,则添加以下语句:其中,部分场景需监管多次;
|
msg += "总共需监管%d次。\n是否现在提交?"
|
var totalMonitorNum = 0
|
var typeID: Byte = 0
|
val movList = ArrayList<Monitorobjectversion>()
|
viewModel.selectedSceneList.forEach {
|
totalMonitorNum += it.monitorNum
|
movList.add(createMOV(it))
|
}
|
|
AlertDialog.Builder(this).setTitle("提交监管对象版本")
|
.setMessage(String.format(Locale.CHINA, msg, totalMonitorNum))
|
.setNegativeButton(R.string.cancel, null)
|
.setPositiveButton(R.string.yes) { _, _ ->
|
viewModel.putMonthTaskAndMOV(topTask, movList)
|
viewModel.updateSceneList(viewModel.totalSceneList.value)
|
}.show()
|
}
|
|
/**
|
* 创建单一监管对象版本信息
|
*
|
* @param scense 场景信息
|
*/
|
fun createMOV(scene: Scense): Monitorobjectversion = Monitorobjectversion().apply {
|
movid = UUIDGenerator.generate16ShortUUID()
|
tid = topTask?.tguid
|
sensename = scene.name
|
sguid = scene.guid
|
tasktypeid = topTask?.typeno
|
tasktype = topTask?.typename
|
monitornum = scene.monitorNum
|
displayid = scene.index
|
}
|
|
@Subscribe
|
open fun onPutTaskDone(topTaskEvent: TopTaskEvent) {
|
finish()
|
}
|
}
|