riku
2022-02-18 d59d55575d913646b7a90fca651904ab889c6723
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
package com.flightfeather.ducha.module.common
 
import android.app.DatePickerDialog
import android.arch.lifecycle.Observer
import android.arch.lifecycle.ViewModelProviders
import android.os.Bundle
import android.view.MenuItem
import android.view.View
import android.widget.AdapterView
import cn.flightfeather.thirdappmodule.adapter.AllListViewAdapter
import cn.flightfeather.thirdappmodule.bean.entity.*
import cn.flightfeather.thirdappmodule.bean.vo.TaskVo
import cn.flightfeather.thirdappmodule.model.bean.ExcelConfigVo
import cn.flightfeather.thirdappmodule.module.base.BaseActivity
import cn.flightfeather.thirdappmodule.module.task.NO_CHOICE
import cn.flightfeather.thirdappmodule.module.task.SceneDetailViewModel
import cn.flightfeather.thirdappmodule.module.task.TaskViewModel
import cn.flightfeather.thirdappmodule.util.DateFormatter
import cn.flightfeather.thirdappmodule.util.DialogUtil2
import com.flightfeather.ducha.R
import com.flightfeather.ducha.module.task.DCNewTempTaskActivity.Companion.DEFAULT_DISTRICT
import com.flightfeather.ducha.module.task.DCNewTempTaskActivity.Companion.DEFAULT_SCENE_TYPE
import kotlinx.android.synthetic.main.dc_activity_file_export.*
import java.text.SimpleDateFormat
import java.util.*
 
/**
 * @author riku
 * Date: 2020/6/15
 */
class FileExportActivity : BaseActivity(), View.OnClickListener {
 
    private lateinit var viewModel: FileExportViewModel
    private lateinit var sceneViewModel: SceneDetailViewModel
    private lateinit var taskViewModel: TaskViewModel
 
    private lateinit var provinceAdapter: AllListViewAdapter<Province>
    private lateinit var cityAdapter: AllListViewAdapter<City>
    private lateinit var districtAdapter: AllListViewAdapter<District>
    private lateinit var townAdapter: AllListViewAdapter<Town>
    private lateinit var problemTypeAdapter: AllListViewAdapter<String>
    private lateinit var problemDetailAdapter: AllListViewAdapter<String>
 
    private lateinit var sceneTypeAdapter: AllListViewAdapter<Domainitem>
 
    private lateinit var topTaskAdapter: AllListViewAdapter<TaskVo>
 
    private val calS = Calendar.getInstance()
    private  var calE: Calendar = Calendar.getInstance()
 
    private var subTaskDialog: DialogUtil2.MultiDialog? = null
    private var selectedSubTaskIds = mutableListOf<String>()//选择的子任务id
 
    override fun getLayoutId(): Int = R.layout.dc_activity_file_export
 
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        viewModel = ViewModelProviders.of(this).get(FileExportViewModel::class.java)
        sceneViewModel = ViewModelProviders.of(this).get(SceneDetailViewModel::class.java)
        taskViewModel = ViewModelProviders.of(this).get(TaskViewModel::class.java)
 
 
        supportActionBar?.apply {
            title = "导出文件"
            setDisplayHomeAsUpEnabled(true)
        }
 
        initSpinner()
        initObserver()
        initData()
 
        txt_start_time.setOnClickListener(this)
        txt_end_time.setOnClickListener(this)
        txt_submit.setOnClickListener(this)
    }
 
    override fun onOptionsItemSelected(item: MenuItem?): Boolean {
        when (item?.itemId) {
            android.R.id.home -> onBackPressed()
        }
        return super.onOptionsItemSelected(item)
    }
 
    override fun onDestroy() {
        viewModel.disposableList.forEach {
            it.dispose()
        }
        super.onDestroy()
    }
 
    private fun initSpinner() {
        provinceAdapter = object : AllListViewAdapter<Province>(sceneViewModel.provinceList.value, R.layout.item_scense_detail_list) {
            override fun bindView(holder: ViewHolder?, obj: Province?) {
                holder?.setText(R.id.tv_item, obj?.provincename)
            }
        }
        cityAdapter = object : AllListViewAdapter<City>(sceneViewModel.cityList, R.layout.item_scense_detail_list) {
            override fun bindView(holder: ViewHolder?, obj: City?) {
                holder?.setText(R.id.tv_item, obj?.cityname)
            }
        }
        districtAdapter = object : AllListViewAdapter<District>(sceneViewModel.districtList, R.layout.item_scense_detail_list) {
            override fun bindView(holder: ViewHolder?, obj: District?) {
                holder?.setText(R.id.tv_item, obj?.districtname)
            }
        }
        townAdapter = object : AllListViewAdapter<Town>(sceneViewModel.townList, R.layout.item_scense_detail_list) {
            override fun bindView(holder: ViewHolder?, obj: Town?) {
                holder?.setText(R.id.tv_item, obj?.townname)
            }
        }
        sceneTypeAdapter = object : AllListViewAdapter<Domainitem>(sceneViewModel.allSceneTypeList.value, R.layout.item_scense_detail_list) {
            override fun bindView(holder: ViewHolder?, obj: Domainitem?) {
                holder?.setText(R.id.tv_item, obj?.text)
            }
        }
        topTaskAdapter = object : AllListViewAdapter<TaskVo>(taskViewModel.topTaskList.value, R.layout.item_scense_detail_list) {
            override fun bindView(holder: ViewHolder?, obj: TaskVo?) {
                holder?.setText(R.id.tv_item, obj?.name)
            }
        }
        problemTypeAdapter = object : AllListViewAdapter<String>(taskViewModel.problemTypeList.value, R.layout.item_scense_detail_list) {
            override fun bindView(holder: ViewHolder?, obj: String?) {
                holder?.setText(R.id.tv_item, obj)
            }
        }
        problemDetailAdapter = object : AllListViewAdapter<String>(taskViewModel.problemDetailList.value, R.layout.item_scense_detail_list) {
            override fun bindView(holder: ViewHolder?, obj: String?) {
                holder?.setText(R.id.tv_item, obj)
            }
        }
        sp_province.apply {
            adapter = provinceAdapter
            onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
                override fun onNothingSelected(parent: AdapterView<*>?) = Unit
                override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {
                    sceneViewModel.cityList.apply {
                        clear()
                        val pId = (sp_province.selectedItem as Province).provinceid
                        sceneViewModel.allCityList.forEach {
                            if (it.pronvinceid == pId) {
                                add(it)
                            }
                        }
                    }
 
                    cityAdapter.notifyDataSetChanged()
                }
            }
        }
 
        sp_city.apply {
            adapter = cityAdapter
            onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
                override fun onNothingSelected(parent: AdapterView<*>?) = Unit
                override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {
                    sceneViewModel.districtList.apply {
                        clear()
                        add(District().apply { districtname = NO_CHOICE })
                        val cId = (sp_city.selectedItem as City).cityId
                        sceneViewModel.allDistrictList.forEach {
                            if (it.cityid == cId) {
                                add(it)
                            }
                        }
                    }
                    var index = 0
                    for (i in sceneViewModel.districtList.indices) {
                        if (sceneViewModel.districtList[i].districtname == DEFAULT_DISTRICT) {
                            index = i
                            break
                        }
                    }
 
                    districtAdapter.notifyDataSetChanged()
                    sp_district.setSelection(index)
                }
            }
        }
 
        sp_district.apply {
            adapter = districtAdapter
            onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
                override fun onNothingSelected(parent: AdapterView<*>?) = Unit
                override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {
                    sceneViewModel.townList.apply {
                        clear()
                        add(Town().apply { townname = NO_CHOICE })
                        val dId = (sp_district.selectedItem as District).districtid
                        sceneViewModel.allTownList.forEach {
                            if (it.districtid == dId) {
                                add(it)
                            }
                        }
                    }
 
                    townAdapter.notifyDataSetChanged()
                }
            }
        }
 
        sp_town.adapter = townAdapter
        sp_scene_type.adapter = sceneTypeAdapter
        sp_top_task.apply {
            adapter = topTaskAdapter
            onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
                override fun onNothingSelected(parent: AdapterView<*>?) = Unit
                override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {
                    getSubTask()
                }
            }
        }
 
        sp_problem_type.apply {
            adapter = problemTypeAdapter
            onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
                override fun onNothingSelected(parent: AdapterView<*>?) = Unit
                override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {
                    val pName = sp_problem_type.selectedItem as String
                    taskViewModel.onProblemTypeSelected(pName)
                }
            }
        }
 
        sp_problem_detail.apply {
            adapter = problemDetailAdapter
            onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
                override fun onNothingSelected(parent: AdapterView<*>?) = Unit
                override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {
                    getSubTask()
                }
            }
        }
    }
 
    private fun initObserver() {
        sceneViewModel.provinceList.observe(this, Observer {
            provinceAdapter.notifyDataSetChanged()
        })
 
        sceneViewModel.allSceneTypeList.observe(this, Observer {
            sceneTypeAdapter.notifyDataSetChanged()
            it?.let {
                it.add(0, Domainitem().apply {
                    text = DEFAULT_SCENE_TYPE
                    value = "0"
                })
                var index = 0
                for (i in it.indices) {
                    if (it[i].text == DEFAULT_SCENE_TYPE) {
                        index = i
                        break
                    }
                }
                sp_scene_type.setSelection(index)
            }
        })
 
        taskViewModel.topTaskList.observe(this, Observer {
            topTaskAdapter.notifyDataSetChanged()
        })
 
        viewModel.progress.observe(this, Observer {
            it?.let {
                circularProgressBar.visibility = View.VISIBLE
                txt_submit.visibility = View.GONE
                txt_download.visibility = View.VISIBLE
                circularProgressBar.progress = it.first.toFloat()
                circularProgressBar.progressMax = it.second.toFloat()
 
                if (it.first < it.second) {
                    txt_download.text = "文件下载中..."
                } else {
                    txt_download.text = "文件下载完成"
                }
            }
        })
 
        taskViewModel.problemTypeList.observe(this, Observer {
            problemTypeAdapter.notifyDataSetChanged()
        })
 
        taskViewModel.problemDetailList.observe(this, Observer {
            problemDetailAdapter.notifyDataSetChanged()
        })
 
        taskViewModel.subTaskNameList.observe(this, Observer {
            txt_subTask_content.setOnClickListener(this)
            createSubTaskDialog()
        })
    }
 
    private fun initData() {
        calS.apply {
            set(Calendar.HOUR_OF_DAY, 0)
            set(Calendar.MINUTE, 0)
            set(Calendar.SECOND, 0)
            set(Calendar.MILLISECOND, 0)
        }
        calE.apply {
            set(Calendar.HOUR_OF_DAY, 23)
            set(Calendar.MINUTE, 59)
            set(Calendar.SECOND, 59)
            set(Calendar.MILLISECOND, 999)
        }
        val dateStart = DateFormatter.dateTimeFormat2.format(calS.time)
        txt_start_time.text = dateStart
        val dateEnd = DateFormatter.dateTimeFormat2.format(calE.time)
        txt_end_time.text = dateEnd
 
        sceneViewModel.getData()
        sceneViewModel.getSceneType()
        taskViewModel.getTopTask(0)
        taskViewModel.getProblemType()
    }
 
    private var lastTopTaskId = ""
    private var lastStartTime = ""
    private var lastEndTime = ""
    private fun getSubTask() {
        val topTaskId = (sp_top_task.selectedItem as TaskVo).tguid
        val startTime = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA).format(calS.time)
        val endTime = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA).format(calE.time)
        if (topTaskId != lastTopTaskId || startTime != lastStartTime || endTime != lastEndTime) {
            taskViewModel.getSubTask(topTaskId, startTime, endTime)
            lastTopTaskId = topTaskId
            lastStartTime = startTime
            lastEndTime = endTime
        }
    }
 
    private fun createSubTaskDialog() {
        val dataArray = taskViewModel.subTaskNameList.value?.toTypedArray() ?: emptyArray()
        subTaskDialog = DialogUtil2.createMultiDialog(this, "选择子任务", dataArray) {
            val text = StringBuilder()
            selectedSubTaskIds.clear()
            for (i in it.indices) {
                if (i > 0) {
                    text.append("\r\n")
                }
                text.append(it[i].second)
                selectedSubTaskIds.add(it[i].first)
            }
            if (text.isNotEmpty()) {
                txt_subTask_content.text = text.toString()
            }
        }
    }
 
    private fun showDatePickerDialog(cal: Calendar, isStartTime: Boolean) {
        val mYear = cal[Calendar.YEAR]
        val mMonth = cal[Calendar.MONTH]
        val mDay = cal[Calendar.DAY_OF_MONTH]
 
        val dpDialog = DatePickerDialog(this, DatePickerDialog.OnDateSetListener { _, year, month, dayOfMonth ->
            if (isStartTime) {
                calS.set(year, month, dayOfMonth, 0, 0, 0)
                val dateString = DateFormatter.dateTimeFormat2.format(calS.time)
                txt_start_time.text = dateString
            }
//            calE.set(year, month, dayOfMonth, 23, 59, 59)
//            val dateString = DateFormatter.dateTimeFormat2.format(calE.time)
//            txt_end_time.text = dateString
 
            getSubTask()
        }, mYear, mMonth, mDay)
 
        //结束时间的选择不能小于开始时间
        if (!isStartTime) {
            try {
                dpDialog.datePicker.minDate = DateFormatter.dateTimeFormat2.parse(txt_start_time.text.toString()).time
            } catch (e: Exception) {
                e.printStackTrace()
            }
        }
        dpDialog.show()
    }
 
    override fun onClick(v: View?) {
        when (v?.id) {
            R.id.txt_start_time -> {
                showDatePickerDialog(calS, true)
            }
            R.id.txt_end_time -> {
                showDatePickerDialog(calE, false)
            }
            R.id.txt_subTask_content -> {
                subTaskDialog?.dialog?.show()
 
            }
            R.id.txt_submit -> {
                try {
                    val topTaskId = (sp_top_task.selectedItem as TaskVo).tguid
                    val startTime = calS.time
                    val endTime = calE.time
                    val pCode = (sp_province.selectedItem as Province).provincecode
                    val cCode = (sp_city.selectedItem as City).citycode
                    val dCode = (sp_district.selectedItem as District).districtcode
                    val tCode = (sp_town.selectedItem as Town).towncode
                    val sceneType = if ((sp_scene_type.selectedItem as Domainitem).value == DEFAULT_SCENE_TYPE) {
                        null
                    } else {
                        (sp_scene_type.selectedItem as Domainitem).value.toIntOrNull()
                    }
                    val problemTypeName = if ((sp_problem_type.selectedItem as String) == TaskViewModel.ALL_PROBLEM) {
                        null
                    } else {
                        sp_problem_type.selectedItem as String
                    }
                    val problemDetail = if ((sp_problem_detail.selectedItem as String) == TaskViewModel.ALL_PROBLEM) {
                        null
                    } else {
                        sp_problem_detail.selectedItem as String
                    }
 
//                    val pCode = null
//                    val cCode = null
//                    val dCode = null
//                    val tCode = null
//                    val sceneType = null
                    val config = ExcelConfigVo(topTaskId, startTime, endTime, pCode, cCode, dCode, tCode, sceneType, selectedSubTaskIds, problemTypeName, problemDetail)
                    viewModel.exportFile(config) {
                        onBackPressed()
                    }
                } catch (e: Exception) {
                    e.printStackTrace()
                }
            }
        }
    }
}