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
package cn.flightfeather.thirdappmodule.dataanalysis
 
import android.content.Context
import android.graphics.Color
import android.os.Bundle
import android.support.v4.app.Fragment
import android.support.v7.widget.DividerItemDecoration
import android.support.v7.widget.LinearLayoutManager
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import butterknife.ButterKnife
import butterknife.Unbinder
import cn.flightfeather.thirdappmodule.R
import cn.flightfeather.thirdappmodule.adapter.AllRecyclerViewAdapter
import cn.flightfeather.thirdappmodule.bean.vo.TaskVo
import cn.flightfeather.thirdappmodule.util.CommonUtils
import com.github.mikephil.charting.animation.Easing
import com.github.mikephil.charting.components.AxisBase
import com.github.mikephil.charting.components.Description
import com.github.mikephil.charting.components.XAxis
import com.github.mikephil.charting.components.YAxis
import com.github.mikephil.charting.data.BarData
import com.github.mikephil.charting.data.BarDataSet
import com.github.mikephil.charting.data.BarEntry
import com.github.mikephil.charting.formatter.IAxisValueFormatter
import com.github.mikephil.charting.formatter.PercentFormatter
import kotlinx.android.synthetic.main.dialog_anysis_sub_progress.*
import java.text.DecimalFormat
import java.text.SimpleDateFormat
import java.util.*
 
/**
 * 2018.11.09
 * @author riku
 * 顶层任务的详细进度信息
 */
class ProgressDetailFragment : Fragment() {
    //需要activity传入一个具体的顶层任务对象,用于显示其详细进度信息
    private var taskProgressVo: TaskVo? = null
    private var unbinder: Unbinder? = null
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        if (arguments != null) {
            taskProgressVo = arguments!!.getSerializable(ARG_PARAM1) as TaskVo
        }
    }
 
    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        val view = inflater.inflate(R.layout.dialog_anysis_sub_progress, container, false)
        unbinder = ButterKnife.bind(this, view)
        initUI()
        initStandardBarchart()
        return view
    }
 
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
    }
 
    override fun onAttach(context: Context) {
        super.onAttach(context)
    }
 
    override fun onDetach() {
        super.onDetach()
    }
 
    override fun onDestroyView() {
        super.onDestroyView()
        unbinder!!.unbind()
    }
 
    private fun initUI() {
        val decimalFormat = DecimalFormat("#0.00")
        tv_total_progress!!.isSelected = true
        tv_top_task!!.text = taskProgressVo!!.name
        //根据任务类型选择不同的图标
        iv_top_task!!.setImageResource(CommonUtils.getIconByTaskType(taskProgressVo!!.typeno.toString()))
        //数据
        val daytaskprogresslist = ArrayList<TaskVo>()
        daytaskprogresslist.addAll(taskProgressVo!!.daytaskList) //当前顶层任务的所有日任务
 
        //设置列表显示对其方式
        val layoutManager1 = LinearLayoutManager(activity)
        layoutManager1.orientation = LinearLayoutManager.VERTICAL
        rv_dialog_task_progress!!.layoutManager = layoutManager1
        rv_dialog_task_progress!!.addItemDecoration(DividerItemDecoration(activity, DividerItemDecoration.VERTICAL))
        //**总进度列表
        val adapter1: AllRecyclerViewAdapter<TaskVo> = object : AllRecyclerViewAdapter<TaskVo>(daytaskprogresslist, R.layout.item_day_task_progress, activity) {
            override fun bindView(holder: MyViewHolder, obj: TaskVo, bool: Boolean, position: Int) {
                val simpleDateFormat = SimpleDateFormat("MM月dd日")
                holder.setText(R.id.tv_item1, simpleDateFormat.format(obj.starttime))
                holder.setText(R.id.tv_item2, obj.completetask.toString() + "/" + obj.totaltask.toString())
                if (obj.totaltask == 0) holder.setText(R.id.tv_item3, NOTASK) else holder.setText(R.id.tv_item3, decimalFormat.format((obj.completetask.toFloat() / obj.totaltask.toFloat() * 100).toDouble()) + "%")
            }
        }
        //**用户进度列表
        val adapter2: AllRecyclerViewAdapter<TaskVo> = object : AllRecyclerViewAdapter<TaskVo>(daytaskprogresslist, R.layout.item_day_task_progress, activity) {
            override fun bindView(holder: MyViewHolder, obj: TaskVo, bool: Boolean, position: Int) {
                val simpleDateFormat = SimpleDateFormat("MM月dd日")
                holder.setText(R.id.tv_item1, simpleDateFormat.format(obj.starttime))
                holder.setText(R.id.tv_item2, obj.mycompletetask.toString() + "/" + obj.mytotaltask.toString())
                if (obj.mytotaltask == 0) holder.setText(R.id.tv_item3, NOTASK) else holder.setText(R.id.tv_item3, decimalFormat.format((obj.mycompletetask.toFloat() / obj.mytotaltask.toFloat() * 100).toDouble()) + "%")
            }
        }
        rv_dialog_task_progress!!.adapter = adapter1
        tv_total_progress!!.setOnClickListener {
            tv_total_progress!!.isSelected = true
            tv_my_progress!!.isSelected = false
            tv_total_progress!!.setTextColor(Color.WHITE)
            tv_my_progress!!.setTextColor(Color.BLACK)
            rv_dialog_task_progress!!.adapter = adapter1
        }
        tv_my_progress!!.setOnClickListener {
            tv_my_progress!!.isSelected = true
            tv_total_progress!!.isSelected = false
            tv_my_progress!!.setTextColor(Color.WHITE)
            tv_total_progress!!.setTextColor(Color.BLACK)
            rv_dialog_task_progress!!.adapter = adapter2
        }
    }
 
    //</editor-fold>
    //<editor-fold desc="初始化任务进度直方图">
    /*
    柱状图,顶层任务的完成百分比
     */
    private fun initStandardBarchart() {
        val daytaskprogresslist = taskProgressVo!!.daytaskList //当前顶层任务的所有日任务
 
        //坐标轴
        val xAxis = barChart_progress!!.xAxis
        xAxis.position = XAxis.XAxisPosition.BOTTOM
        xAxis.setDrawGridLines(false)
        xAxis.granularity = 1f //坐标间隔
        //        xAxis.setLabelCount(2, true);//进入时的标签个数
        xAxis.setCenterAxisLabels(true) //标签处于图表中间
        xAxis.axisMinimum = 0f
        xAxis.valueFormatter = MyDateFormmater(daytaskprogresslist)
        val rightAxis = barChart_progress!!.axisRight
        rightAxis.isEnabled = false
        //        rightAxis.setDrawGridLines(false);
//        rightAxis.setDrawAxisLine(false);
//        rightAxis.setDrawLabels(false);
        val leftAxis = barChart_progress!!.axisLeft
        leftAxis.setDrawGridLines(false)
        leftAxis.setDrawAxisLine(false)
        leftAxis.setDrawLabels(false)
        leftAxis.setDrawTopYLabelEntry(true)
        leftAxis.zeroLineColor = Color.BLACK
        leftAxis.setDrawZeroLine(true)
        leftAxis.axisMinimum = 0f
        leftAxis.axisMaximum = 100f
        leftAxis.valueFormatter = PercentFormatter()
        //        LimitLine limitLine = new LimitLine(100f);
//        limitLine.setLineColor(Color.BLACK);
//        leftAxis.addLimitLine(limitLine);
 
        //Entry数据
        val totalEntries: MutableList<BarEntry> = ArrayList()
        //每日总任务进度
        val userEntries: MutableList<BarEntry> = ArrayList()
        //每日用户进度
        //Test*********
//        totalEntries.add(new BarEntry(0f, 0f));
//        totalEntries.add(new BarEntry(1f, 0f));
//        totalEntries.add(new BarEntry(2f, 40f));
//        totalEntries.add(new BarEntry(3f, 70f));
//        totalEntries.add(new BarEntry(4f, 80f));
//        totalEntries.add(new BarEntry(5f, 50f));
//        totalEntries.add(new BarEntry(6f, 30f));
//        totalEntries.add(new BarEntry(7f, 10f));
//
//        userEntries.add(new BarEntry(0f, 0f));
//        userEntries.add(new BarEntry(1f, 60f));
//        userEntries.add(new BarEntry(2f, 70));
//        userEntries.add(new BarEntry(3f, 70));
//        userEntries.add(new BarEntry(4f, 35));
//        userEntries.add(new BarEntry(5f, 35));
//        userEntries.add(new BarEntry(6f, 35));
//        userEntries.add(new BarEntry(7f, 35));
        //*************
        for (i in daytaskprogresslist.indices) { //初始化数据
            var y1 = daytaskprogresslist[i].totaltask.toFloat()
            y1 = if (y1 != 0f) daytaskprogresslist[i].completetask.toFloat() / daytaskprogresslist[i].totaltask.toFloat() * 100 else 100f
            totalEntries.add(BarEntry(i.toFloat(), y1))
            var y2 = daytaskprogresslist[i].mytotaltask.toFloat()
            y2 = if (y2 != 0f) daytaskprogresslist[i].mycompletetask.toFloat() / daytaskprogresslist[i].mytotaltask.toFloat() * 100 else 100f
            userEntries.add(BarEntry(i.toFloat(), y2))
        }
        val barDataSetTotal = BarDataSet(totalEntries, "总进度")
        val barDataSetUser = BarDataSet(userEntries, "我的进度")
        barDataSetTotal.axisDependency = YAxis.AxisDependency.LEFT
        //        barDataSetTotal.setAxisDependency(YAxis.AxisDependency.RIGHT);
        barDataSetUser.axisDependency = YAxis.AxisDependency.LEFT
        //        barDataSetUser.setAxisDependency(YAxis.AxisDependency.RIGHT);
        barDataSetTotal.color = Color.argb(128, 255, 0, 0)
        barDataSetUser.color = Color.argb(128, 0, 255, 0)
        val groupSpace = 0.06f
        val barSpace = 0.02f // x2 dataset
        val barWidth = 0.45f // x2 dataset
        // (0.02 + 0.45) * 2 + 0.06 = 1.00 -> interval per "group"
        val barData = BarData(barDataSetTotal, barDataSetUser)
        //        BarData barData = new BarData(barDataSetTotal);
        barData.setValueFormatter(PercentFormatter())
        barData.setValueTextSize(8f)
        barData.isHighlightEnabled = false //高亮
        barData.barWidth = barWidth
        if (!totalEntries.isEmpty() || !userEntries.isEmpty()) { //数据全为空时,不显示
            barChart_progress!!.data = barData
            barChart_progress!!.setFitBars(true) //x轴坐标显示对应每个bar
            barChart_progress!!.groupBars(0f, groupSpace, barSpace)
        }
 
        //General Chart Settings & Styling
        barChart_progress!!.setNoDataText("任务还未开始执行,暂无数据") //Sets the title that should appear if the chart is empty.
        //        mStandardChart.setDrawBorders(false);//Enables / disables drawing the chart borders (lines surrounding the chart).
        //图标描述
        val description = Description()
        description.text = ""
        barChart_progress!!.description = description
 
//        mStandardChart.setTouchEnabled(true);//触摸
//        mStandardChart.setDragEnabled(true);//拖拽
        barChart_progress!!.setScaleEnabled(false) //缩放
        barChart_progress!!.animateY(1400, Easing.EasingOption.EaseOutSine)
        barChart_progress!!.fitScreen()
 
        //视图设置
        barChart_progress!!.setVisibleXRangeMaximum(6f)
        barChart_progress!!.setVisibleXRangeMinimum(6f)
 
//        mStandardChart.invalidate();
    }
 
    //</editor-fold>
    internal inner class MyDateFormmater(daytaskprogresslist: List<TaskVo>) : IAxisValueFormatter {
        var mFormat: DecimalFormat
        var daytaskprogresslist: List<TaskVo>
        var simpleDateFormat = SimpleDateFormat("dd日")
        override fun getFormattedValue(value: Float, axis: AxisBase): String {
            return try {
                simpleDateFormat.format(daytaskprogresslist[value.toInt()].starttime)
            } catch (e: Exception) {
                e.printStackTrace()
                ""
            }
        }
 
        init {
            mFormat = DecimalFormat("###,###,##0")
            this.daytaskprogresslist = daytaskprogresslist
        }
    }
 
    companion object {
        private const val ARG_PARAM1 = "taskProgressVo" //参数标签
 
        /**
         * Use this factory method to create a new instance of
         * this fragment using the provided parameters.
         *
         * @param taskProgressVo
         * @return A new instance of fragment ProgressDetailFragment.
         */
        // TODO: Rename and change types and number of parameters
        fun newInstance(taskProgressVo: TaskVo?): ProgressDetailFragment {
            val fragment = ProgressDetailFragment()
            val args = Bundle()
            args.putSerializable(ARG_PARAM1, taskProgressVo)
            fragment.arguments = args
            return fragment
        }
 
        //<editor-fold desc="初始化界面UI">
        private const val NOTASK = "无任务"
    }
}