Browse Source

流程耗时

xiaoshushu 2 years ago
parent
commit
df12847202

+ 28 - 9
src/main/java/com/lsw/controller/ReportController.java

@@ -15,31 +15,37 @@ public class ReportController extends Controller {
 
     public void index() {
         String op = getPara("op", "finish");
-        String ID = getPara("ID", "__HZPWsyc0ZOqvua4Lwwg");//部门ID
-        set("begin", TimeUtil.getDay("firstDay"));
-        set("end", TimeUtil.getDay("lastDay"));
+        String ID = getPara("ID", "ZMMMGm5mnGCE4WvWFeI");//部门ID
+        set("url", "http://192.168.0.251/obpm/portal/good/html/view.html?appId=__gAPYBW4YxB3UePM3lqO&viewId=__qTB1jbQVLUOib2npaBj&opentarget=target&containTitle=%E8%A7%86%E5%9B%BE");
+        set("begin", "2021-06-01");//TimeUtil.getDay("firstDay")
+        set("end", "2022-12-12");//TimeUtil.getDay("lastDay")
         set("DOMAINID", getPara("DOMAINID", "uumsxrgm1KEEqSZIoHs"));
         set("ID", ID);
         List<Record> department_list = Db.template("department", Kv.by("ID", ID)).find();
         List<Record> list = department_list.stream().filter(r -> r.get("ID").equals(ID)).collect(Collectors.toList());
         for (Record record : list) {
+            set("value",record.getStr("ID"));
             //二级
-            List<Record> list2 = department_list.stream().filter(r -> r.get("SUPERIOR")!=null&&r.get("SUPERIOR").equals(record.get("ID"))).collect(Collectors.toList());
+            List<Record> list2 = department_list.stream().filter(r -> r.get("SUPERIOR") != null && r.get("SUPERIOR").equals(record.get("ID"))).collect(Collectors.toList());
             record.set("children", list2);
             for (Record record2 : list2) {
                 //三级
-                List<Record> list3 = department_list.stream().filter(r ->r.get("SUPERIOR")!=null&&r.get("SUPERIOR").equals(record2.get("ID"))).collect(Collectors.toList());
+                List<Record> list3 = department_list.stream().filter(r -> r.get("SUPERIOR") != null && r.get("SUPERIOR").equals(record2.get("ID"))).collect(Collectors.toList());
                 record2.set("children", list3);
+                for (Record record3 : list3) {
+                    //三级
+                    List<Record> list4 = department_list.stream().filter(r -> r.get("SUPERIOR") != null && r.get("SUPERIOR").equals(record3.get("ID"))).collect(Collectors.toList());
+                    record3.set("children", list4);
+                }
             }
 
         }
-
-        System.out.println("asd:" + JsonKit.toJson(list));
-        set("department",JsonKit.toJson(list));
+        set("department", JsonKit.toJson(list));
         render(op + ".html");
     }
 
-    public void getData() {
+    //实验完成率
+    public void finish() {
         long start = System.currentTimeMillis();
         Kv kv = Kv.create();
         kv.set("DOMAINID", getPara("DOMAINID"));
@@ -50,4 +56,17 @@ public class ReportController extends Controller {
         long end = System.currentTimeMillis();
         renderJson(Kv.by("data", list).set("time", StringUtil.mul((end - start), (float) 0.001) + "s"));
     }
+
+    //各流程耗时
+    public void process() {
+        long start = System.currentTimeMillis();
+        Kv kv = Kv.create();
+        kv.set("DOMAINID", getPara("DOMAINID"));
+        kv.set("ID", getPara("ID"));
+        kv.set("begin", getPara("begin", TimeUtil.getDay("firstDay")));
+        kv.set("end", getPara("end", TimeUtil.getDay("lastDay")));
+        List<Record> list = Db.template("process", kv).find();
+        long end = System.currentTimeMillis();
+        renderJson(Kv.by("data", list).set("time", StringUtil.mul((end - start), (float) 0.001) + "s"));
+    }
 }

+ 10 - 0
src/main/resources/report.sql

@@ -11,4 +11,14 @@
 ###选择部门
 #sql("department")
  select ID,NAME,SUPERIOR from t_department start with ID=#para(ID) connect by prior ID=superior
+#end
+
+###各流程耗时
+#sql("process")
+ select round(sum((cast(PROCESSTIME as date)-cast(ACTIONTIME as date))*86400)/60) interval,FLOWNAME from T_RELATIONHIS e
+ left outer join t_user on t_user.ID=auditor
+ left outer join t_department on t_user.defaultdepartment=t_department.ID
+ where  t_department.ID=#para(ID)
+ and e.PROCESSTIME between to_date(#para(begin),'yyyy-mm-dd hh24:mi:ss') and to_date(#para(end),'yyyy-mm-dd hh24:mi:ss')
+ group by  FLOWNAME
 #end

+ 31 - 17
src/main/webapp/WEB-INF/view/report/finish.html

@@ -6,7 +6,7 @@
     <link href="#(path)/static/js/element-ui.css" rel="stylesheet"/>
     <style>
         body {background-color: #f1f1f4;}
-        .bar{height:600px;margin-top: 50px;}
+        .bar{height:570px;margin-top: 50px;}
         [v-cloak] {display: none;}
     </style>
 </head>
@@ -48,6 +48,7 @@
 <script src="#(path)/static/js/echarts.min.js"></script>
 <script src="#(path)/static/js/element-ui.js"></script>
 <script>
+    let myChart = null;
     let vm = new Vue({
         el: "#app",
         data: {
@@ -66,10 +67,22 @@
         },
         mounted() {
             this.getData();
+            myChart = echarts.init(document.getElementById('echart'));
+            myChart.on('click', function (params) {
+                layer.open({
+                    type: 2,
+                    title: '',
+                    scrollbar: false, //屏蔽浏览器滚动条
+                    shade: 0.8,
+                    maxmin: false, // 开启最大化最小化按钮
+                    area: ['92%', '95%'],
+                    content: '#(url)' + '&state=' + params.data.name + "&DEPARTMENT_ID=" + vm.param.ID,
+                });
+            })
         },
         methods: {
             handleChange(value) {
-                this.param.ID=value[value.length-1]
+                this.param.ID = value[value.length - 1]
             },
             search() {
                 this.param.begin = this.created[0];
@@ -77,20 +90,23 @@
                 this.getData();
             },
             getData() {
-                sendAjax("#(path)/report/getData", this.param, res => {
+                sendAjax("#(path)/report/finish", this.param, res => {
                     cancelLoding();
-                    this.initEcharts(res.data);
-                    console.log("asd:" + JSON.stringify(res));
+                    vm.initEcharts(res.data);
                 })
             },
             initEcharts(data) {
-                let myChart = echarts.init(document.getElementById('echart'));
-                let legend = [];
-                let series = [];
+                let legend = ['未结束', '结束'];
+                let series = [{name: '未结束', value: 0}, {name: '结束', value: 0}];
                 data.forEach(item => {
-                    legend.push(item.TAG);
-                    series.push({name: item.TAG, value: item.COUNT, id: 'asd'});
-                })
+                    console.log("")
+                    if (item.TAG == '未结束') {
+                        series[0].value = item.COUNT;
+                    }
+                    if (item.TAG == '结束') {
+                        series[1].value = item.COUNT;
+                    }
+                });
                 let option = {
                     title: [{
                         text: '实验完成率',
@@ -123,9 +139,10 @@
                         center: ['50%', '42%'],
                         radius: ['40%', '60%'],
                         label: {
-                            show: true,
-                            textStyle: {
-                                fontSize: '15',
+                            normal: {
+                                show: true,
+                                formatter: '{b}: {d}%',
+                                fontSize: '17',
                             }
                         },
                         labelLine: {
@@ -138,9 +155,6 @@
                 window.addEventListener("resize", function () {
                     myChart.resize();
                 });
-                myChart.on('click', function (params) {
-                    console.log(params)
-                })
             }
         }
     })

+ 142 - 0
src/main/webapp/WEB-INF/view/report/process.html

@@ -0,0 +1,142 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8">
+    <title>流程耗时</title>
+    <link href="#(path)/static/js/element-ui.css" rel="stylesheet"/>
+    <style>
+        body {background-color: #f1f1f4;}
+        .bar{height:570px;margin-top: 50px;}
+        .el-table thead{color: #515151!important;font-weight:bold;}
+        [v-cloak] {display: none;}
+    </style>
+</head>
+<body>
+<div id="app" v-cloak>
+    <el-form :inline="true" label-width="auto">
+        <el-form-item label="实验部门" prop="state">
+            <el-cascader
+                    v-model="param.value"
+                    :options="options"
+                    :props="props"
+                    @change="handleChange"
+                    :show-all-levels="false"
+                    clearable>
+            </el-cascader>
+        </el-form-item>
+        <el-form-item label="时间范围">
+            <el-date-picker
+                    v-model="param.created"
+                    style="width: 240px"
+                    value-format="yyyy-MM-dd"
+                    type="daterange"
+                    range-separator="-"
+                    start-placeholder="开始日期"
+                    end-placeholder="结束日期"
+            ></el-date-picker>
+        </el-form-item>
+        <el-form-item>
+            <el-button type="primary" icon="el-icon-search" @click="search()">搜索</el-button>
+        </el-form-item>
+    </el-form>
+    <div id="echart" class="bar"></div>
+    <el-dialog  title="流程耗时明细" :visible.sync="dialogVisible" width="50%">
+        <el-table :data="tableData" style="width: 100%;background-color: red">
+            <el-table-column prop="FLOWNAME" label="流程名称"></el-table-column>
+            <el-table-column prop="INTERVAL" label="流程耗时(分钟)"></el-table-column>
+        </el-table>
+    </el-dialog>
+</div>
+</body>
+<script src="#(path)/static/js/jquery.min.js"></script>
+<script src="#(path)/static/js/layer/layer.js"></script>
+<script src="#(path)/static/js/vue.min.js"></script>
+<script src="#(path)/static/js/common.js"></script>
+<script src="#(path)/static/js/echarts.min.js"></script>
+<script src="#(path)/static/js/element-ui.js"></script>
+<script>
+    let myChart = null;
+    let vm = new Vue({
+        el: "#app",
+        data: {
+            dialogVisible:false,
+            tableData:[],
+            param: {
+                DOMAINID: '#(DOMAINID)',
+                ID: '#(ID)',
+                value:['ZMMMGm5mnGCE4WvWFeI'],
+                begin:'#(begin)',
+                end:'#(end)',
+                created: ['#(begin)', '#(end)']
+            },
+            props: {
+                value: 'ID',
+                label: 'NAME',
+                checkStrictly: true
+            },
+            options: #(department)
+        },
+        mounted() {
+            this.getData();
+            myChart = echarts.init(document.getElementById('echart'));
+            myChart.on('click', function (params) {
+                vm.dialogVisible=true;
+            })
+        },
+        methods: {
+            handleChange(value) {
+                this.param.ID = value[value.length - 1]
+            },
+            search() {
+                this.param.begin = this.param.created[0];
+                this.param.end = this.param.created[1];
+                this.getData();
+            },
+            getData() {
+                sendAjax("#(path)/report/process", this.param, res => {
+                    cancelLoding();
+                    vm.tableData=res.data;
+                    vm.initEcharts(res.data);
+                })
+            },
+            initEcharts(data) {
+                let legend = [];
+                let series = [];
+                data.forEach(item => {
+                    legend.push(item.FLOWNAME);
+                    series.push(item.INTERVAL);
+               });
+               let option = {
+                   title: {
+                       text: '各流程耗时',
+                    },
+                   tooltip: {
+                       trigger: 'axis',
+                       axisPointer: {
+                           type: 'shadow'
+                       }
+                   },
+                    xAxis: {
+                        type: 'category',
+                        data:legend
+                    },
+                    yAxis: {
+                        name: '分钟',
+                        type: 'value'
+                    },
+                    series: [
+                        {
+                            data:series,
+                            type: 'bar'
+                        }
+                    ]
+                };
+                myChart.setOption(option);
+                window.addEventListener("resize", function () {
+                    myChart.resize();
+                });
+            }
+        }
+    })
+</script>
+</html>

+ 132 - 0
src/main/webapp/WEB-INF/view/report/process_view.html

@@ -0,0 +1,132 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8">
+    <title>流程耗时</title>
+    <link href="#(path)/static/js/element-ui.css" rel="stylesheet"/>
+    <style>
+        body {background-color: #f1f1f4;}
+        .bar{height:570px;margin-top: 50px;}
+        [v-cloak] {display: none;}
+    </style>
+</head>
+<body>
+<div id="app" v-cloak>
+    <el-form :inline="true" label-width="auto">
+        <el-form-item label="实验部门" prop="state">
+            <el-cascader
+                    v-model="value"
+                    :options="options"
+                    :props="props"
+                    @change="handleChange"
+                    :show-all-levels="false"
+                    clearable>
+            </el-cascader>
+        </el-form-item>
+        <el-form-item label="时间范围">
+            <el-date-picker
+                    v-model="created"
+                    style="width: 240px"
+                    value-format="yyyy-MM-dd"
+                    type="daterange"
+                    range-separator="-"
+                    start-placeholder="开始日期"
+                    end-placeholder="结束日期"
+            ></el-date-picker>
+        </el-form-item>
+        <el-form-item>
+            <el-button type="primary" icon="el-icon-search" @click="search()">搜索</el-button>
+        </el-form-item>
+    </el-form>
+    <div id="echart" class="bar"></div>
+</div>
+</body>
+<script src="#(path)/static/js/jquery.min.js"></script>
+<script src="#(path)/static/js/layer/layer.js"></script>
+<script src="#(path)/static/js/vue.min.js"></script>
+<script src="#(path)/static/js/common.js"></script>
+<script src="#(path)/static/js/echarts.min.js"></script>
+<script src="#(path)/static/js/element-ui.js"></script>
+<script>
+    let myChart = null;
+    let vm = new Vue({
+        el: "#app",
+        data: {
+            created: ['#(begin)', '#(end)'],
+            value: '',
+            param: {
+                DOMAINID: '#(DOMAINID)',
+                ID: '#(ID)'
+            },
+            props: {
+                value: 'ID',
+                label: 'NAME',
+                checkStrictly: true
+            },
+            options: #(department)
+        },
+        mounted() {
+            this.getData();
+            myChart = echarts.init(document.getElementById('echart'));
+            myChart.on('click', function (params) {
+                console.log("asd:"+params.name);
+                /*layer.open({
+                    type: 2,
+                    title: '',
+                    scrollbar: false, //屏蔽浏览器滚动条
+                    shade: 0.8,
+                    maxmin: false, // 开启最大化最小化按钮
+                    area: ['92%', '95%'],
+                    content: '#(url)' + '&state=' + params.data.name + "&DEPARTMENT_ID=" + vm.param.ID,
+                });*/
+            })
+        },
+        methods: {
+            handleChange(value) {
+                this.param.ID = value[value.length - 1]
+            },
+            search() {
+                this.param.begin = this.created[0];
+                this.param.end = this.created[1];
+                this.getData();
+            },
+            getData() {
+                sendAjax("#(path)/report/process", this.param, res => {
+                    cancelLoding();
+                    vm.initEcharts(res.data);
+                })
+            },
+            initEcharts(data) {
+                let legend = [];
+                let series = [];
+                data.forEach(item => {
+                    legend.push(item.FLOWNAME);
+                    series.push(item.INTERVAL);
+               });
+               let option = {
+                   title: {
+                       text: '各流程耗时',
+                    },
+                    xAxis: {
+                        type: 'category',
+                        data:legend
+                    },
+                    yAxis: {
+                        type: 'value'
+                    },
+                    series: [
+                        {
+                            data:series,
+                            type: 'bar'
+                        }
+                    ]
+                };
+                myChart.setOption(option);
+                window.addEventListener("resize", function () {
+                    myChart.resize();
+                });
+            }
+        }
+    })
+</script>
+</html>