Elsaの技術日記(徒然なるままに)

主に自分で作ったアプリとかの報告・日記を記載

MENU

簡単なWebアプリ作成 ~無駄な会議を撲滅しよう!! ~ part5~

先日ご報告しました通り、日付毎の会議にて発生するお金をグラフ化するページを作成しましたので報告します!!
最終的に出来た成果物はこんな感じになりました!!
f:id:Elsammit:20200604222553j:plain

まずComboBoxには1週間ごとにデータのある週間だけ選択できるようにすること、そして1年分のデータを選択できるようにしたかったので、
Webアプリ表示時に1週間毎に1年分のデータを収集するための処理を実行しました。
まずはフロントエンドです。
サーバサイドへのpostリクエストにはajaxを用いました。
前回ご連絡しました通り、ループはフロントサイドで実行します。
ループ処理を行うにあたり、何も対策を打たないと非同期処理になってしまうため、async、awaitを用いて同期処理になるようにしました。
。。。勝手に非同期になるの結構めんどくさい!!

async function do_Init(days){
    var select = document.getElementById("Init");
    
    for(var i=0;i<50;i++){
      await Time_ajax(i,select);
    }
}

function Time_ajax(i,select){
  var flg = true;
  $.ajax({
    url:"http://192.168.56.2:3000/result_times",
    type:"POST",
    async:true,
    data:{"num":i*7},
    dataType:"json",
    success:function(result){
        for(var i=0;i<begin_buf.length;i++){
            if(begin_buf[i] == result["begin_day"]){
                flg = false;
                i = begin_buf.length;
            }
        }
        if(flg == true){
            var option = document.createElement("option");
            option.text = result["begin_day"] + "~" + result["end_day"];
            option.value = result["begin_day"] + "~" + result["end_day"];
            select.appendChild(option);
            begin_buf.push(result["begin_day"]);
        }else{
            flg = true;
        }
    }
  });
}

ここで、こちらのソースで週選択用のComboBoxを作成しています。
作成するサンプルはこちらになります。

    var select = document.getElementById("Init");
    var option = document.createElement("option");
    option.text = result["begin_day"] + "~" + result["end_day"]; 
    option.value = result["begin_day"] + "~" + result["end_day"]; 

そして、サーバサイド側のソースは下記になります!!
やっていることはpart2で実施した内容と同じになります。
postリクエストを受け取ったら、DB内のテーブルから必要なデータを読み取り、フロントサイドに返しています。
ここで、DBの読み出し処理は遅くなるのでこちらはPromise、.thenを用いて同期処理となるようにしました。

app.post('/result_times',(req,res)=>{
    var buf = req.body.num;
    p = Get_MeetingList_SplitWeek(buf);
    p.then(function(day_array){
        day_list ={day:day_array,begin_day:begin_arry,end_day:end_arry,num:buf};
        res.send(day_list); 
    });
});

function Get_MeetingList_SplitWeek_sub(GetMemSalary){
    return new Promise(resolve =>{
        var buf = null;
        var array_buf = [];
        db.all(GetMemSalary, function (err, rows) {
            rows.forEach(function(row){
                if(buf== null || row.date !=buf){
                    buf = row.date;
                    array_buf.push(row.date);
                }
            });
            resolve(array_buf);
        });
    });
}

これで1年分のデータを週ごとに選択できるComboBoxが出来ました。


次にcomboBoxで選択した週データから会議時間でのお金をグラフ化するためにサーバサイド側から日付毎に発生したお金を読み出します。
、、、といってもやっていることは先ほどのComboBoxと同じで、
フロントサイドで1日毎に日付データをサーバサイドにpost。
サーバサイドでは受け取った日付データを元にお金をresponse。
これを1週間分(7日分)実施しています。
同じようなコードを載せても面白くないかと思いますので、割愛!!


最後にグラフの表示です。
グラフ作成はこちらを参考にさせていただきました!!
qiita.com

実際に作成したコードはこちらになります。
今回は棒グラフで表示させたかったため、type: 'bar'としました。
また最大値は500にセット(特に理由はないですw)。

    var ctx = document.getElementById("myLineChart");
    var myLineChart = new Chart(ctx, {
      type: 'bar',
      data: {
        labels:weeks,
        datasets: [
          {
            label: '会議発生金額',
            data:m_meetingMoney,
            borderColor: "rgba(0,0,255,1)",
            backgroundColor: "rgba(219,39,91,0.5)"
          }
        ],
      },
      options: {
        title: {
          display: true,
          text: '会議により発生する費用'
        },
        scales: {
          yAxes: [{
            ticks: {
              suggestedMax: 500,
              suggestedMin: 0,
              stepSize: 50,
            }
          }]
        },
      }
    });

下記でx軸とY軸をセットしております。
weekには1週間分の配列。
m_meetingMoneyには各日毎のお金格納されています。

data: {
        labels:weeks, ←X軸
        datasets: [
          {
            label: '会議発生金額', ←グラフラベル名
            data:m_meetingMoney, ←Y軸
            borderColor: "rgba(0,0,255,1)", ←グラフの色
            backgroundColor: "rgba(219,39,91,0.5)" ←背景色
          }

ということで、、、part1~part5でで
会議時間により発生しているお金をサーバ側で保存しておき、結果をグラフ表示させるまで出来ました!!
結構時間かけてしまった。。。
特に番外編に記載した非同期処理にはかなり苦戦しました。。。(泣)

次回は、デバイス制御とかやっていこうかな?
Webアプリも作成していて面白いので、いいアイデア思いついたらまた作成したいと考えております!!
、、、色々作ってみたい物多くて大変だww。