Merge branch 'MCUT' of https://gitea.mjm-staging.developers-homelab.net/BIMS/BIMS into MCUT
This commit is contained in:
		
						commit
						d2f6005fcc
					
				@ -468,7 +468,7 @@ namespace Backend.Controllers
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
                if (!string.IsNullOrEmpty(buildFloor.InitMapName))
 | 
					                if (!string.IsNullOrEmpty(buildFloor.InitMapName))
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    buildFloor.MapUrl = "/upload/floor_map/" + buildFloor.Floor_guid + ".svg";
 | 
					                    buildFloor.MapUrl = baseURL + "upload/floor_map/" + buildFloor.Floor_map_name + ".svg";
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                apiResult.Code = "0000";
 | 
					                apiResult.Code = "0000";
 | 
				
			||||||
 | 
				
			|||||||
@ -531,24 +531,33 @@ namespace Backend.Controllers
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
                if (device_Item.id == 0)
 | 
					                if (device_Item.id == 0)
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    
 | 
					                    var building = await backendRepository.GetAllAsync<string>("select building_tag from building where deleted = 0;");
 | 
				
			||||||
 | 
					                    var parentPath = await backendRepository.GetOneAsync<string>("select system_value from variable where deleted = 0 and system_type = 'obixStatus'");
 | 
				
			||||||
 | 
					                    List<Dictionary<string, object>> device_iteDic = new List<Dictionary<string, object>>();
 | 
				
			||||||
                    //新增
 | 
					                    //新增
 | 
				
			||||||
                    Dictionary<string, object> Device_itemDic = new Dictionary<string, object>()
 | 
					                    foreach (var b in building)
 | 
				
			||||||
                    {
 | 
					                    {
 | 
				
			||||||
                        { "@device_system_tag", main_tag},
 | 
					                        Dictionary<string, object> Device_itemDic = new Dictionary<string, object>()
 | 
				
			||||||
                        { "@device_name_tag", sub_tag},
 | 
					                        {
 | 
				
			||||||
                        { "@full_name", device_Item.full_name},
 | 
					                            { "@device_system_tag", main_tag},
 | 
				
			||||||
                        { "@points", device_Item.points},
 | 
					                            { "@device_name_tag", sub_tag},
 | 
				
			||||||
                        { "@unit", device_Item.unit},
 | 
					                            { "@full_name", device_Item.full_name},
 | 
				
			||||||
                        { "@is_show", device_Item.is_show},
 | 
					                            { "@points", device_Item.points},
 | 
				
			||||||
                        { "@is_show_riserDiagram", device_Item.is_show_riserDiagram},
 | 
					                            { "@unit", device_Item.unit},
 | 
				
			||||||
                        { "@is_controll", device_Item.is_controll},
 | 
					                            { "@device_building_tag", b},
 | 
				
			||||||
                        { "@is_bool", device_Item.is_bool},
 | 
					                            { "@parent_path", parentPath},
 | 
				
			||||||
                        { "@is_show_history", device_Item.is_show_history},
 | 
					                            { "@is_link", 1},
 | 
				
			||||||
                        { "@created_by", myUserInfo.Userinfo_guid},
 | 
					                            { "@is_show", device_Item.is_show},
 | 
				
			||||||
                    };
 | 
					                            { "@is_show_riserDiagram", device_Item.is_show_riserDiagram},
 | 
				
			||||||
                    await backendRepository.AddOneByCustomTable(Device_itemDic, "device_item");
 | 
					                            { "@is_controll", device_Item.is_controll},
 | 
				
			||||||
 | 
					                            { "@is_bool", device_Item.is_bool},
 | 
				
			||||||
 | 
					                            { "@is_show_history", device_Item.is_show_history},
 | 
				
			||||||
 | 
					                            { "@created_by", myUserInfo.Userinfo_guid},
 | 
				
			||||||
 | 
					                        };
 | 
				
			||||||
 | 
					                        device_iteDic.Add(Device_itemDic);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    await backendRepository.AddMutiByCustomTable(device_iteDic, "device_item");
 | 
				
			||||||
                    apiResult.Code = "0000";
 | 
					                    apiResult.Code = "0000";
 | 
				
			||||||
                    apiResult.Msg = "新增成功";
 | 
					                    apiResult.Msg = "新增成功";
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
				
			|||||||
@ -88,4 +88,10 @@ namespace Backend.Models
 | 
				
			|||||||
        public int Value { get; set; } //通常放id
 | 
					        public int Value { get; set; } //通常放id
 | 
				
			||||||
        public string Name { get; set; }
 | 
					        public string Name { get; set; }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public class BuildStation
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        public string system_value { get; set; }
 | 
				
			||||||
 | 
					        public string system_key { get; set; }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -108,6 +108,9 @@
 | 
				
			|||||||
                        //樓層設定上方選單
 | 
					                        //樓層設定上方選單
 | 
				
			||||||
                        $("#BuildList").empty();
 | 
					                        $("#BuildList").empty();
 | 
				
			||||||
                        $.each(data, function (key, value) {
 | 
					                        $.each(data, function (key, value) {
 | 
				
			||||||
 | 
					                            if (value.building_tag.includes("$3"))
 | 
				
			||||||
 | 
					                                value.building_tag = value.building_tag.replace("$3", "");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                            $("#BuildList").append(`<button type="button" class="btn btn-outline-success waves-effect waves-themed ml-2 mb-2 btn-station" id="${value.building_tag}" onclick="clickBuilding('${value.building_tag}')">${value.full_name}</button>`);
 | 
					                            $("#BuildList").append(`<button type="button" class="btn btn-outline-success waves-effect waves-themed ml-2 mb-2 btn-station" id="${value.building_tag}" onclick="clickBuilding('${value.building_tag}')">${value.full_name}</button>`);
 | 
				
			||||||
                            @*if (key == 0) {
 | 
					                            @*if (key == 0) {
 | 
				
			||||||
                                selected_build_guid_top_name = value.full_name;
 | 
					                                selected_build_guid_top_name = value.full_name;
 | 
				
			||||||
@ -454,7 +457,7 @@
 | 
				
			|||||||
                    var file = input3Dfile;
 | 
					                    var file = input3Dfile;
 | 
				
			||||||
                    var formData = new FormData();
 | 
					                    var formData = new FormData();
 | 
				
			||||||
                    formData.append('fileToUpload', file);
 | 
					                    formData.append('fileToUpload', file);
 | 
				
			||||||
               formData.append('bucketKey', "zo4zguyalhjrl5o81va39pkdgr82wamq-202305_bim");//forge上傳平台-資料夾
 | 
					                    formData.append('bucketKey', "zo4zguyalhjrl5o81va39pkdgr82wamq-202305_bim");//forge上傳平台-資料夾
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    $.ajax({
 | 
					                    $.ajax({
 | 
				
			||||||
                        url: '/api/forge/oss/objects',
 | 
					                        url: '/api/forge/oss/objects',
 | 
				
			||||||
@ -530,7 +533,10 @@
 | 
				
			|||||||
                    var url = "/BuildInfo/EditBuildInfo";
 | 
					                    var url = "/BuildInfo/EditBuildInfo";
 | 
				
			||||||
                    var formData = new FormData();
 | 
					                    var formData = new FormData();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    formData.append("building_tag", selected_build_guid);
 | 
					                    if ($.isNumeric(selected_build_guid[0]))
 | 
				
			||||||
 | 
					                        formData.append("building_tag", "$3" + selected_build_guid);
 | 
				
			||||||
 | 
					                    else
 | 
				
			||||||
 | 
					                        formData.append("building_tag", selected_build_guid);
 | 
				
			||||||
                    formData.append("Full_name", $('#build_name_modal').val());
 | 
					                    formData.append("Full_name", $('#build_name_modal').val());
 | 
				
			||||||
                    formData.append("Ip_address", $('#ip_address_modal').val());
 | 
					                    formData.append("Ip_address", $('#ip_address_modal').val());
 | 
				
			||||||
                    formData.append("Ip_port", $('#ip_port_modal').val());
 | 
					                    formData.append("Ip_port", $('#ip_port_modal').val());
 | 
				
			||||||
@ -682,7 +688,10 @@
 | 
				
			|||||||
                    "url": "/BuildInfo/BuildFloorList",
 | 
					                    "url": "/BuildInfo/BuildFloorList",
 | 
				
			||||||
                    "type": "POST",
 | 
					                    "type": "POST",
 | 
				
			||||||
                    "data": function (d) {
 | 
					                    "data": function (d) {
 | 
				
			||||||
                        d.build_tag = selected_build_guid_top;
 | 
					                        if ($.isNumeric(selected_build_guid_top[0]))
 | 
				
			||||||
 | 
					                            d.build_tag = selected_build_guid_top = "$3" + selected_build_guid_top;
 | 
				
			||||||
 | 
					                        else
 | 
				
			||||||
 | 
					                            d.build_tag = selected_build_guid_top;
 | 
				
			||||||
                    },
 | 
					                    },
 | 
				
			||||||
                    "dataSrc": function (rel) {
 | 
					                    "dataSrc": function (rel) {
 | 
				
			||||||
                        if (rel.code == "9999") {
 | 
					                        if (rel.code == "9999") {
 | 
				
			||||||
@ -762,11 +771,14 @@
 | 
				
			|||||||
                        return;
 | 
					                        return;
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    else {
 | 
					                    else {
 | 
				
			||||||
 | 
					                        $('#floor-modal').modal();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                        $("#BuildName").html(selected_build_guid_top_name);
 | 
					                        $("#BuildName").html(selected_build_guid_top_name);
 | 
				
			||||||
                        $("#floor_name_modal").val(rel.data.full_name);
 | 
					                        $("#floor_name_modal").val(rel.data.full_name);
 | 
				
			||||||
                        @*$("#map_file_preview_modal").attr("data-original", rel.data.mapUrl);*@
 | 
					                        if (rel.data.mapUrl)
 | 
				
			||||||
 | 
					                            loadURLToInputFiled(rel.data.mapUrl, rel.data.initMapName + ".svg");
 | 
				
			||||||
                        $('#floor-modal').modal();
 | 
					                        else
 | 
				
			||||||
 | 
					                            $('#floor_map_file_modal')[0].value = "";
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }, 'json');
 | 
					                }, 'json');
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
@ -962,7 +974,7 @@
 | 
				
			|||||||
        function translateObject(urn) {
 | 
					        function translateObject(urn) {
 | 
				
			||||||
            $("#forgeViewer").empty();
 | 
					            $("#forgeViewer").empty();
 | 
				
			||||||
            //if (node == null) node = $('#appBuckets').jstree(true).get_selected(true)[0];
 | 
					            //if (node == null) node = $('#appBuckets').jstree(true).get_selected(true)[0];
 | 
				
			||||||
       var bucketKey = "zo4zguyalhjrl5o81va39pkdgr82wamq-202305_bim";//forge上傳平台-資料夾
 | 
					            var bucketKey = "zo4zguyalhjrl5o81va39pkdgr82wamq-202305_bim";//forge上傳平台-資料夾
 | 
				
			||||||
            var objectKey = urn;
 | 
					            var objectKey = urn;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            jQuery.post({
 | 
					            jQuery.post({
 | 
				
			||||||
@ -977,6 +989,26 @@
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
        //#endregion
 | 
					        //#endregion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        function loadURLToInputFiled(url, filesName){
 | 
				
			||||||
 | 
					            getImgURL(url, (imgBlob)=>{
 | 
				
			||||||
 | 
					                // Load img blob to input
 | 
				
			||||||
 | 
					                // WIP: UTF8 character error
 | 
				
			||||||
 | 
					                let fileName = filesName
 | 
				
			||||||
 | 
					                let file = new File([imgBlob], fileName,{type:"image/svg+xml", lastModified:new Date().getTime()}, 'utf-8');
 | 
				
			||||||
 | 
					                let container = new DataTransfer(); 
 | 
				
			||||||
 | 
					                container.items.add(file);
 | 
				
			||||||
 | 
					                $('#floor_map_file_modal')[0].files = container.files;
 | 
				
			||||||
 | 
					            })
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        // xmlHTTP return blob respond
 | 
				
			||||||
 | 
					        function getImgURL(url, callback){
 | 
				
			||||||
 | 
					            var xhr = new XMLHttpRequest();
 | 
				
			||||||
 | 
					            xhr.onload = function() {
 | 
				
			||||||
 | 
					                callback(xhr.response);
 | 
				
			||||||
 | 
					            };
 | 
				
			||||||
 | 
					            xhr.open('GET', url);
 | 
				
			||||||
 | 
					            xhr.responseType = 'blob';
 | 
				
			||||||
 | 
					            xhr.send();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
    </script>
 | 
					    </script>
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -111,8 +111,17 @@
 | 
				
			|||||||
                        }
 | 
					                        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                        var data = rel.data;
 | 
					                        var data = rel.data;
 | 
				
			||||||
                        ds = data;
 | 
					                        ds = $.extend(true, [], data);
 | 
				
			||||||
                        console.log(ds)
 | 
					                        $.each(data, function (i, v)
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            if (v.value.includes("$3"))
 | 
				
			||||||
 | 
					                            {
 | 
				
			||||||
 | 
					                                v.value = v.value.replace("$3", "");
 | 
				
			||||||
 | 
					                                v.tag_name = v.tag_name.replace("$3", "");
 | 
				
			||||||
 | 
					                                v.point_name = v.point_name.replace("$3", "");
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
 | 
					                        })
 | 
				
			||||||
 | 
					                        //console.log(ds)
 | 
				
			||||||
                        if (data == null || data.length == 0) {
 | 
					                        if (data == null || data.length == 0) {
 | 
				
			||||||
                            this.data = [];
 | 
					                            this.data = [];
 | 
				
			||||||
                            document.getElementById('loadDataText').innerText = "";
 | 
					                            document.getElementById('loadDataText').innerText = "";
 | 
				
			||||||
 | 
				
			|||||||
@ -594,13 +594,13 @@
 | 
				
			|||||||
        //#endregion
 | 
					        //#endregion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        //#region 新增設備項目
 | 
					        //#region 新增設備項目
 | 
				
			||||||
        function Adddevice_item() {
 | 
					        //function Adddevice_item() {
 | 
				
			||||||
            //SubDeviceItemValidate.resetForm();
 | 
					        //    //SubDeviceItemValidate.resetForm();
 | 
				
			||||||
            selected_system_device_item_guid = "";
 | 
					        //    selected_system_device_item_guid = "";
 | 
				
			||||||
            $("#device-sub-modal .modal-title").html("設備項目 - 新增");
 | 
					        //    $("#device-sub-modal .modal-title").html("設備項目 - 新增");
 | 
				
			||||||
            $("#device-item-sub-form").trigger("reset");
 | 
					        //    $("#device-item-sub-form").trigger("reset");
 | 
				
			||||||
            $("#device-sub-modal").modal();
 | 
					        //    $("#device-sub-modal").modal();
 | 
				
			||||||
        }
 | 
					        //}
 | 
				
			||||||
        //#endregion
 | 
					        //#endregion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        $('#system_sub_table').on("click", "tbody>tr", function () {
 | 
					        $('#system_sub_table').on("click", "tbody>tr", function () {
 | 
				
			||||||
 | 
				
			|||||||
@ -32,11 +32,11 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<div class="card border mb-g w-100 mb-5" id="submenucard">
 | 
					<div class="card border mb-g w-100 mb-5" id="submenucard">
 | 
				
			||||||
    <div class="card-header bg-fusion-25 py-2 pr-3 d-flex align-items-center flex-wrap justify-content-end">
 | 
					    @*<div class="card-header bg-fusion-25 py-2 pr-3 d-flex align-items-center flex-wrap justify-content-end">
 | 
				
			||||||
        <div class="text-right ">
 | 
					        <div class="text-right ">
 | 
				
			||||||
            <a href="javascript:;" class="btn btn-success waves-effect waves-themed" id="adddevice_item-btn" onclick="Adddevice_item()"><span class="fal fa-plus mr-1"></span>新增</a>
 | 
					            <a href="javascript:;" class="btn btn-success waves-effect waves-themed" id="adddevice_item-btn" onclick="Adddevice_item()"><span class="fal fa-plus mr-1"></span>新增</a>
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
    </div>
 | 
					    </div>*@
 | 
				
			||||||
    <div class="card-body">
 | 
					    <div class="card-body">
 | 
				
			||||||
        <div class="w-100">
 | 
					        <div class="w-100">
 | 
				
			||||||
            <div class="col-12">
 | 
					            <div class="col-12">
 | 
				
			||||||
 | 
				
			|||||||
@ -142,12 +142,12 @@ namespace BackendWorkerService
 | 
				
			|||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    #endregion
 | 
					                    #endregion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    #region 定時取得氣象API
 | 
					                    //#region 定時取得氣象API
 | 
				
			||||||
                    services.AddSingleton<Quartz.Jobs.WeatherAPIJob>();
 | 
					                    //services.AddSingleton<Quartz.Jobs.WeatherAPIJob>();
 | 
				
			||||||
                    services.AddSingleton(
 | 
					                    //services.AddSingleton(
 | 
				
			||||||
                    new JobSchedule(jobType: typeof(Quartz.Jobs.WeatherAPIJob), cronExpression: configuration.GetValue<string>("BackgroundServiceCron:WeatherAPIJob"))
 | 
					                    //new JobSchedule(jobType: typeof(Quartz.Jobs.WeatherAPIJob), cronExpression: configuration.GetValue<string>("BackgroundServiceCron:WeatherAPIJob"))
 | 
				
			||||||
                    );
 | 
					                    //);
 | 
				
			||||||
                    #endregion
 | 
					                    //#endregion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                }).ConfigureLogging((hostContext, logFactory) => {
 | 
					                }).ConfigureLogging((hostContext, logFactory) => {
 | 
				
			||||||
                    IConfiguration configuration = hostContext.Configuration;
 | 
					                    IConfiguration configuration = hostContext.Configuration;
 | 
				
			||||||
 | 
				
			|||||||
@ -61,6 +61,7 @@ namespace BackendWorkerService.Quartz.Jobs
 | 
				
			|||||||
                    var variableArchive = await backgroundServiceRepository.GetAllAsync<KeyValue>(sqlArchive);
 | 
					                    var variableArchive = await backgroundServiceRepository.GetAllAsync<KeyValue>(sqlArchive);
 | 
				
			||||||
                    var electricMeterGuid = variableArchive.Where(x => x.Name == "ElectricMeterGuid").Select(x => x.Value).FirstOrDefault();
 | 
					                    var electricMeterGuid = variableArchive.Where(x => x.Name == "ElectricMeterGuid").Select(x => x.Value).FirstOrDefault();
 | 
				
			||||||
                    var waterMeterGuid = variableArchive.Where(x => x.Name == "WaterMeterGuid").Select(x => x.Value).FirstOrDefault();
 | 
					                    var waterMeterGuid = variableArchive.Where(x => x.Name == "WaterMeterGuid").Select(x => x.Value).FirstOrDefault();
 | 
				
			||||||
 | 
					                    var buildingStation = await backgroundServiceRepository.GetAllAsync<BuildStation>("select SUBSTRING_INDEX(system_value, '/', 1) system_value, system_key from variable where system_type = 'dashboard_total_elec' and deleted = 0 and (SUBSTRING_INDEX(system_value, '/', 1) != '' and SUBSTRING_INDEX(system_value, '/', 1) is not null)");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    #region http variable 
 | 
					                    #region http variable 
 | 
				
			||||||
                    HttpWebRequest archiveRequest = null;
 | 
					                    HttpWebRequest archiveRequest = null;
 | 
				
			||||||
@ -127,7 +128,6 @@ namespace BackendWorkerService.Quartz.Jobs
 | 
				
			|||||||
                    obixApiConfig.ApiBase = variableObix.Where(x => x.Name == "ApiBase").Select(x => x.Value).FirstOrDefault();
 | 
					                    obixApiConfig.ApiBase = variableObix.Where(x => x.Name == "ApiBase").Select(x => x.Value).FirstOrDefault();
 | 
				
			||||||
                    obixApiConfig.UserName = ed.AESDecrypt(variableObix.Where(x => x.Name == "UserName").Select(x => x.Value).FirstOrDefault());
 | 
					                    obixApiConfig.UserName = ed.AESDecrypt(variableObix.Where(x => x.Name == "UserName").Select(x => x.Value).FirstOrDefault());
 | 
				
			||||||
                    obixApiConfig.Password = ed.AESDecrypt(variableObix.Where(x => x.Name == "Password").Select(x => x.Value).FirstOrDefault());
 | 
					                    obixApiConfig.Password = ed.AESDecrypt(variableObix.Where(x => x.Name == "Password").Select(x => x.Value).FirstOrDefault());
 | 
				
			||||||
                    var station = await backgroundServiceRepository.GetOneAsync<string>($@"select system_value from variable where system_type = 'obixStatus' and deleted = 0");
 | 
					 | 
				
			||||||
                    String encoded = System.Convert.ToBase64String(System.Text.Encoding.GetEncoding("ISO-8859-1").GetBytes(obixApiConfig.UserName + ":" + obixApiConfig.Password));
 | 
					                    String encoded = System.Convert.ToBase64String(System.Text.Encoding.GetEncoding("ISO-8859-1").GetBytes(obixApiConfig.UserName + ":" + obixApiConfig.Password));
 | 
				
			||||||
                    #endregion 取得obix 設定
 | 
					                    #endregion 取得obix 設定
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -159,7 +159,7 @@ namespace BackendWorkerService.Quartz.Jobs
 | 
				
			|||||||
                            List<Dictionary<string, object>> waterArchiveDayRawDatas = new List<Dictionary<string, object>>();
 | 
					                            List<Dictionary<string, object>> waterArchiveDayRawDatas = new List<Dictionary<string, object>>();
 | 
				
			||||||
                            foreach (var deviceNumberPoint in electricDeviceNumberPoints)
 | 
					                            foreach (var deviceNumberPoint in electricDeviceNumberPoints)
 | 
				
			||||||
                            {
 | 
					                            {
 | 
				
			||||||
 | 
					                                var station = buildingStation.Where(x => x.system_key == deviceNumberPoint.DeviceNumber.Split("_")[1]).Select(x => x.system_value).FirstOrDefault();
 | 
				
			||||||
                                archiveRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/{station}/{deviceNumberPoint.FullDeviceNumberPoint}/~historyRollup/");
 | 
					                                archiveRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/{station}/{deviceNumberPoint.FullDeviceNumberPoint}/~historyRollup/");
 | 
				
			||||||
                                //HttpWebRequest archiveDayRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/{station}/H_E1_B1F_MVCB_MVCBH_V1/~historyRollup/");
 | 
					                                //HttpWebRequest archiveDayRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/{station}/H_E1_B1F_MVCB_MVCBH_V1/~historyRollup/");
 | 
				
			||||||
                                archiveRequest.Method = "POST";
 | 
					                                archiveRequest.Method = "POST";
 | 
				
			||||||
@ -216,7 +216,7 @@ namespace BackendWorkerService.Quartz.Jobs
 | 
				
			|||||||
                            }
 | 
					                            }
 | 
				
			||||||
                            foreach (var deviceNumberPoint in waterDeviceNumberPoints)
 | 
					                            foreach (var deviceNumberPoint in waterDeviceNumberPoints)
 | 
				
			||||||
                            {
 | 
					                            {
 | 
				
			||||||
 | 
					                                var station = buildingStation.Where(x => x.system_key == deviceNumberPoint.DeviceNumber.Split("_")[1]).Select(x => x.system_value).FirstOrDefault();
 | 
				
			||||||
                                archiveRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/{station}/{deviceNumberPoint.FullDeviceNumberPoint}/~historyRollup/");
 | 
					                                archiveRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/{station}/{deviceNumberPoint.FullDeviceNumberPoint}/~historyRollup/");
 | 
				
			||||||
                                //HttpWebRequest archiveDayRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/{station}/H_E1_B1F_MVCB_MVCBH_V1/~historyRollup/");
 | 
					                                //HttpWebRequest archiveDayRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/{station}/H_E1_B1F_MVCB_MVCBH_V1/~historyRollup/");
 | 
				
			||||||
                                archiveRequest.Method = "POST";
 | 
					                                archiveRequest.Method = "POST";
 | 
				
			||||||
@ -628,6 +628,7 @@ namespace BackendWorkerService.Quartz.Jobs
 | 
				
			|||||||
                            List<Dictionary<string, object>> waterArchiveWeekRawDatas = new List<Dictionary<string, object>>();
 | 
					                            List<Dictionary<string, object>> waterArchiveWeekRawDatas = new List<Dictionary<string, object>>();
 | 
				
			||||||
                            foreach (var deviceNumberPoint in electricDeviceNumberPoints)
 | 
					                            foreach (var deviceNumberPoint in electricDeviceNumberPoints)
 | 
				
			||||||
                            {
 | 
					                            {
 | 
				
			||||||
 | 
					                                var station = buildingStation.Where(x => x.system_key == deviceNumberPoint.DeviceNumber.Split("_")[1]).Select(x => x.system_value).FirstOrDefault();
 | 
				
			||||||
                                archiveRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/{station}/{deviceNumberPoint.FullDeviceNumberPoint}/~historyRollup/");
 | 
					                                archiveRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/{station}/{deviceNumberPoint.FullDeviceNumberPoint}/~historyRollup/");
 | 
				
			||||||
                                //HttpWebRequest archiveWeekRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/{station}/H_E1_B1F_MVCB_MVCBH_V1/~historyRollup/");
 | 
					                                //HttpWebRequest archiveWeekRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/{station}/H_E1_B1F_MVCB_MVCBH_V1/~historyRollup/");
 | 
				
			||||||
                                archiveRequest.Method = "POST";
 | 
					                                archiveRequest.Method = "POST";
 | 
				
			||||||
@ -685,6 +686,7 @@ namespace BackendWorkerService.Quartz.Jobs
 | 
				
			|||||||
                            }
 | 
					                            }
 | 
				
			||||||
                            foreach (var deviceNumberPoint in waterDeviceNumberPoints)
 | 
					                            foreach (var deviceNumberPoint in waterDeviceNumberPoints)
 | 
				
			||||||
                            {
 | 
					                            {
 | 
				
			||||||
 | 
					                                var station = buildingStation.Where(x => x.system_key == deviceNumberPoint.DeviceNumber.Split("_")[1]).Select(x => x.system_value).FirstOrDefault();
 | 
				
			||||||
                                archiveRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/{station}/{deviceNumberPoint.FullDeviceNumberPoint}/~historyRollup/");
 | 
					                                archiveRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/{station}/{deviceNumberPoint.FullDeviceNumberPoint}/~historyRollup/");
 | 
				
			||||||
                                //HttpWebRequest archiveWeekRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/{station}/H_E1_B1F_MVCB_MVCBH_V1/~historyRollup/");
 | 
					                                //HttpWebRequest archiveWeekRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/{station}/H_E1_B1F_MVCB_MVCBH_V1/~historyRollup/");
 | 
				
			||||||
                                archiveRequest.Method = "POST";
 | 
					                                archiveRequest.Method = "POST";
 | 
				
			||||||
@ -993,6 +995,7 @@ namespace BackendWorkerService.Quartz.Jobs
 | 
				
			|||||||
                            List<Dictionary<string, object>> waterArchiveMonthRawDatas = new List<Dictionary<string, object>>();
 | 
					                            List<Dictionary<string, object>> waterArchiveMonthRawDatas = new List<Dictionary<string, object>>();
 | 
				
			||||||
                            foreach (var deviceNumberPoint in electricDeviceNumberPoints)
 | 
					                            foreach (var deviceNumberPoint in electricDeviceNumberPoints)
 | 
				
			||||||
                            {
 | 
					                            {
 | 
				
			||||||
 | 
					                                var station = buildingStation.Where(x => x.system_key == deviceNumberPoint.DeviceNumber.Split("_")[1]).Select(x => x.system_value).FirstOrDefault();
 | 
				
			||||||
                                archiveRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/{station}/{deviceNumberPoint.FullDeviceNumberPoint}/~historyRollup/");
 | 
					                                archiveRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/{station}/{deviceNumberPoint.FullDeviceNumberPoint}/~historyRollup/");
 | 
				
			||||||
                                //HttpWebRequest archiveMonthRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/{station}/H_E1_B1F_MVCB_MVCBH_V1/~historyRollup/");
 | 
					                                //HttpWebRequest archiveMonthRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/{station}/H_E1_B1F_MVCB_MVCBH_V1/~historyRollup/");
 | 
				
			||||||
                                archiveRequest.Method = "POST";
 | 
					                                archiveRequest.Method = "POST";
 | 
				
			||||||
@ -1049,6 +1052,7 @@ namespace BackendWorkerService.Quartz.Jobs
 | 
				
			|||||||
                            }
 | 
					                            }
 | 
				
			||||||
                            foreach (var deviceNumberPoint in waterDeviceNumberPoints)
 | 
					                            foreach (var deviceNumberPoint in waterDeviceNumberPoints)
 | 
				
			||||||
                            {
 | 
					                            {
 | 
				
			||||||
 | 
					                                var station = buildingStation.Where(x => x.system_key == deviceNumberPoint.DeviceNumber.Split("_")[1]).Select(x => x.system_value).FirstOrDefault();
 | 
				
			||||||
                                archiveRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/{station}/{deviceNumberPoint.FullDeviceNumberPoint}/~historyRollup/");
 | 
					                                archiveRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/{station}/{deviceNumberPoint.FullDeviceNumberPoint}/~historyRollup/");
 | 
				
			||||||
                                //HttpWebRequest archiveMonthRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/{station}/H_E1_B1F_MVCB_MVCBH_V1/~historyRollup/");
 | 
					                                //HttpWebRequest archiveMonthRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/{station}/H_E1_B1F_MVCB_MVCBH_V1/~historyRollup/");
 | 
				
			||||||
                                archiveRequest.Method = "POST";
 | 
					                                archiveRequest.Method = "POST";
 | 
				
			||||||
 | 
				
			|||||||
@ -55,6 +55,7 @@ namespace BackendWorkerService.Services.Implement
 | 
				
			|||||||
                var variableArchive = await backgroundServiceRepository.GetAllAsync<KeyValue>(sqlArchive);
 | 
					                var variableArchive = await backgroundServiceRepository.GetAllAsync<KeyValue>(sqlArchive);
 | 
				
			||||||
                repeatTimes = Convert.ToInt32(variableArchive.Where(x => x.Name == "RepeatTimes").Select(x => x.Value).FirstOrDefault());
 | 
					                repeatTimes = Convert.ToInt32(variableArchive.Where(x => x.Name == "RepeatTimes").Select(x => x.Value).FirstOrDefault());
 | 
				
			||||||
                var saveToMSDB = await backgroundServiceRepository.GetOneAsync<string>("select system_value from variable where system_type = 'save_to_ms_db' and deleted = 0");
 | 
					                var saveToMSDB = await backgroundServiceRepository.GetOneAsync<string>("select system_value from variable where system_type = 'save_to_ms_db' and deleted = 0");
 | 
				
			||||||
 | 
					                var buildingStation = await backgroundServiceRepository.GetAllAsync<BuildStation>("select SUBSTRING_INDEX(system_value, '/', 1) system_value, system_key from variable where system_type = 'dashboard_total_elec' and deleted = 0 and (SUBSTRING_INDEX(system_value, '/', 1) != '' and SUBSTRING_INDEX(system_value, '/', 1) is not null)");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                #region 取得obix 設定
 | 
					                #region 取得obix 設定
 | 
				
			||||||
                var sqlObix = $@"SELECT system_value as Value, system_key as Name FROM variable WHERE deleted = 0 AND system_type = 'obixConfig'";
 | 
					                var sqlObix = $@"SELECT system_value as Value, system_key as Name FROM variable WHERE deleted = 0 AND system_type = 'obixConfig'";
 | 
				
			||||||
@ -63,7 +64,6 @@ namespace BackendWorkerService.Services.Implement
 | 
				
			|||||||
                obixApiConfig.ApiBase = variableObix.Where(x => x.Name == "ApiBase").Select(x => x.Value).FirstOrDefault();
 | 
					                obixApiConfig.ApiBase = variableObix.Where(x => x.Name == "ApiBase").Select(x => x.Value).FirstOrDefault();
 | 
				
			||||||
                obixApiConfig.UserName = variableObix.Where(x => x.Name == "UserName").Select(x => x.Value).FirstOrDefault();
 | 
					                obixApiConfig.UserName = variableObix.Where(x => x.Name == "UserName").Select(x => x.Value).FirstOrDefault();
 | 
				
			||||||
                obixApiConfig.Password = variableObix.Where(x => x.Name == "Password").Select(x => x.Value).FirstOrDefault();
 | 
					                obixApiConfig.Password = variableObix.Where(x => x.Name == "Password").Select(x => x.Value).FirstOrDefault();
 | 
				
			||||||
                var station = await backgroundServiceRepository.GetOneAsync<string>($@"select system_value from variable where system_type = 'obixStatus' and deleted = 0");
 | 
					 | 
				
			||||||
                encoded = System.Convert.ToBase64String(System.Text.Encoding.GetEncoding("ISO-8859-1").GetBytes(obixApiConfig.UserName + ":" + obixApiConfig.Password));
 | 
					                encoded = System.Convert.ToBase64String(System.Text.Encoding.GetEncoding("ISO-8859-1").GetBytes(obixApiConfig.UserName + ":" + obixApiConfig.Password));
 | 
				
			||||||
                #endregion 取得obix 設定
 | 
					                #endregion 取得obix 設定
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -280,6 +280,7 @@ namespace BackendWorkerService.Services.Implement
 | 
				
			|||||||
                                                    <reltime name='interval' val = 'PT1D' />
 | 
					                                                    <reltime name='interval' val = 'PT1D' />
 | 
				
			||||||
                                                </obj>";
 | 
					                                                </obj>";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                            var station = buildingStation.Where(x => x.system_key == deviceNumberPoint.DeviceNumber.Split("_")[1]).Select(x => x.system_value).FirstOrDefault();
 | 
				
			||||||
                            HttpWebRequest archiveDayRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/{station}/{deviceNumberPoint.FullDeviceNumberPoint}/~historyRollup/");
 | 
					                            HttpWebRequest archiveDayRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/{station}/{deviceNumberPoint.FullDeviceNumberPoint}/~historyRollup/");
 | 
				
			||||||
                            //HttpWebRequest archiveDayRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/{station}/H_E1_B1F_MVCB_MVCBH_V1/~historyRollup/");
 | 
					                            //HttpWebRequest archiveDayRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/{station}/H_E1_B1F_MVCB_MVCBH_V1/~historyRollup/");
 | 
				
			||||||
                            archiveDayRequest.Method = "POST";
 | 
					                            archiveDayRequest.Method = "POST";
 | 
				
			||||||
@ -354,84 +355,85 @@ namespace BackendWorkerService.Services.Implement
 | 
				
			|||||||
                    var water_error_days = await backgroundServiceRepository.GetAllAsync<ArchiveElectricMeter>(sql_error_day, new { RepeatTimes = repeatTimes });
 | 
					                    var water_error_days = await backgroundServiceRepository.GetAllAsync<ArchiveElectricMeter>(sql_error_day, new { RepeatTimes = repeatTimes });
 | 
				
			||||||
                    List<Dictionary<string, object>> waterArchiveDayRawDatas = new List<Dictionary<string, object>>();
 | 
					                    List<Dictionary<string, object>> waterArchiveDayRawDatas = new List<Dictionary<string, object>>();
 | 
				
			||||||
                    if (water_error_days.Count() > 0)
 | 
					                    if (water_error_days.Count() > 0)
 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    foreach (var error_day in water_error_days)
 | 
					 | 
				
			||||||
                    {
 | 
					                    {
 | 
				
			||||||
                        DeviceNumberPoint deviceNumberPoint = new DeviceNumberPoint();
 | 
					                        foreach (var error_day in water_error_days)
 | 
				
			||||||
                        deviceNumberPoint.DeviceNumber = error_day.Device_number;
 | 
					 | 
				
			||||||
                        deviceNumberPoint.Point = error_day.Point;
 | 
					 | 
				
			||||||
                        deviceNumberPoint.FullDeviceNumberPoint = string.Format("{0}_{1}", error_day.Device_number, error_day.Point);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                        var startTimestamp = string.Format("{0}+08:00", error_day.Start_timestamp.Replace(" ", "T"));
 | 
					 | 
				
			||||||
                        var endTimestamp = string.Format("{0}+08:00", error_day.End_timestamp.Replace(" ", "T"));
 | 
					 | 
				
			||||||
                        var historyQueryFilter = $@"<obj is='obix: HistoryFilter'>
 | 
					 | 
				
			||||||
                                                <abstime name='start' val='{startTimestamp}' />
 | 
					 | 
				
			||||||
                                                <abstime name='end' val='{endTimestamp}' />
 | 
					 | 
				
			||||||
                                                <reltime name='interval' val = 'PT1D' />
 | 
					 | 
				
			||||||
                                            </obj>";
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                        HttpWebRequest archiveDayRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/{station}/{deviceNumberPoint.FullDeviceNumberPoint}/~historyRollup/");
 | 
					 | 
				
			||||||
                        //HttpWebRequest archiveDayRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/{station}/H_E1_B1F_MVCB_MVCBH_V1/~historyRollup/");
 | 
					 | 
				
			||||||
                        archiveDayRequest.Method = "POST";
 | 
					 | 
				
			||||||
                        archiveDayRequest.Headers.Add("Authorization", "Basic " + encoded);
 | 
					 | 
				
			||||||
                        archiveDayRequest.PreAuthenticate = true;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                        byte[] byteArray = Encoding.UTF8.GetBytes(historyQueryFilter);
 | 
					 | 
				
			||||||
                        using (Stream reqStream = archiveDayRequest.GetRequestStream())
 | 
					 | 
				
			||||||
                        {
 | 
					                        {
 | 
				
			||||||
                            reqStream.Write(byteArray, 0, byteArray.Length);
 | 
					                            DeviceNumberPoint deviceNumberPoint = new DeviceNumberPoint();
 | 
				
			||||||
                        }
 | 
					                            deviceNumberPoint.DeviceNumber = error_day.Device_number;
 | 
				
			||||||
 | 
					                            deviceNumberPoint.Point = error_day.Point;
 | 
				
			||||||
 | 
					                            deviceNumberPoint.FullDeviceNumberPoint = string.Format("{0}_{1}", error_day.Device_number, error_day.Point);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                        HttpWebResponse archiveDayResponse = (HttpWebResponse)archiveDayRequest.GetResponse();
 | 
					                            var startTimestamp = string.Format("{0}+08:00", error_day.Start_timestamp.Replace(" ", "T"));
 | 
				
			||||||
                        var archiveDayResponseContent = new StreamReader(archiveDayResponse.GetResponseStream()).ReadToEnd();
 | 
					                            var endTimestamp = string.Format("{0}+08:00", error_day.End_timestamp.Replace(" ", "T"));
 | 
				
			||||||
 | 
					                            var historyQueryFilter = $@"<obj is='obix: HistoryFilter'>
 | 
				
			||||||
 | 
					                                                    <abstime name='start' val='{startTimestamp}' />
 | 
				
			||||||
 | 
					                                                    <abstime name='end' val='{endTimestamp}' />
 | 
				
			||||||
 | 
					                                                    <reltime name='interval' val = 'PT1D' />
 | 
				
			||||||
 | 
					                                                </obj>";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                        xmlDocument.LoadXml(archiveDayResponseContent);
 | 
					                            var station = buildingStation.Where(x => x.system_key == deviceNumberPoint.DeviceNumber.Split("_")[1]).Select(x => x.system_value).FirstOrDefault();
 | 
				
			||||||
                        string archiveDayJson = JsonConvert.SerializeXmlNode(xmlDocument);
 | 
					                            HttpWebRequest archiveDayRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/{station}/{deviceNumberPoint.FullDeviceNumberPoint}/~historyRollup/");
 | 
				
			||||||
                        JObject archiveDayJsonResult = (JObject)JsonConvert.DeserializeObject(archiveDayJson);
 | 
					                            //HttpWebRequest archiveDayRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/{station}/H_E1_B1F_MVCB_MVCBH_V1/~historyRollup/");
 | 
				
			||||||
 | 
					                            archiveDayRequest.Method = "POST";
 | 
				
			||||||
 | 
					                            archiveDayRequest.Headers.Add("Authorization", "Basic " + encoded);
 | 
				
			||||||
 | 
					                            archiveDayRequest.PreAuthenticate = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                        if (archiveDayJsonResult.ContainsKey("err")) //抓取錯誤
 | 
					                            byte[] byteArray = Encoding.UTF8.GetBytes(historyQueryFilter);
 | 
				
			||||||
                        {
 | 
					                            using (Stream reqStream = archiveDayRequest.GetRequestStream())
 | 
				
			||||||
                            Dictionary<string, object> archiveDayRawData = new Dictionary<string, object>();
 | 
					 | 
				
			||||||
                            archiveDayRawData.Add("@device_number", error_day.Device_number);
 | 
					 | 
				
			||||||
                            archiveDayRawData.Add("@point", error_day.Point);
 | 
					 | 
				
			||||||
                            archiveDayRawData.Add("@start_timestamp", DateTime.Parse(error_day.Start_timestamp, System.Globalization.CultureInfo.CurrentCulture));
 | 
					 | 
				
			||||||
                            archiveDayRawData.Add("@end_timestamp", DateTime.Parse(error_day.End_timestamp, System.Globalization.CultureInfo.CurrentCulture));
 | 
					 | 
				
			||||||
                            archiveDayRawData.Add("@is_complete", 0);
 | 
					 | 
				
			||||||
                            archiveDayRawData.Add("@repeat_times", ++error_day.Repeat_times);
 | 
					 | 
				
			||||||
                            archiveDayRawData.Add("@fail_reason", archiveDayJson);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                            archiveDayRawData.Add("@count_rawdata", 0);
 | 
					 | 
				
			||||||
                            archiveDayRawData.Add("@min_rawdata", 0);
 | 
					 | 
				
			||||||
                            archiveDayRawData.Add("@max_rawdata", 0);
 | 
					 | 
				
			||||||
                            archiveDayRawData.Add("@avg_rawdata", 0);
 | 
					 | 
				
			||||||
                            archiveDayRawData.Add("@sum_rawdata", 0);
 | 
					 | 
				
			||||||
                            archiveDayRawData.Add("@updated_at", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                            waterArchiveDayRawDatas.Add(archiveDayRawData);
 | 
					 | 
				
			||||||
                        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                        if (archiveDayJsonResult.ContainsKey("obj")) //表示可以讀取到內容
 | 
					 | 
				
			||||||
                        {
 | 
					 | 
				
			||||||
                            var ArrangeRawDatas = ArrangeRawData(deviceNumberPoint, archiveDayJsonResult);
 | 
					 | 
				
			||||||
                            if (ArrangeRawDatas != null && ArrangeRawDatas.Count() > 0)
 | 
					 | 
				
			||||||
                            {
 | 
					                            {
 | 
				
			||||||
                                waterArchiveDayRawDatas.AddRange(ArrangeRawDatas);
 | 
					                                reqStream.Write(byteArray, 0, byteArray.Length);
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                            HttpWebResponse archiveDayResponse = (HttpWebResponse)archiveDayRequest.GetResponse();
 | 
				
			||||||
 | 
					                            var archiveDayResponseContent = new StreamReader(archiveDayResponse.GetResponseStream()).ReadToEnd();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                            xmlDocument.LoadXml(archiveDayResponseContent);
 | 
				
			||||||
 | 
					                            string archiveDayJson = JsonConvert.SerializeXmlNode(xmlDocument);
 | 
				
			||||||
 | 
					                            JObject archiveDayJsonResult = (JObject)JsonConvert.DeserializeObject(archiveDayJson);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                            if (archiveDayJsonResult.ContainsKey("err")) //抓取錯誤
 | 
				
			||||||
 | 
					                            {
 | 
				
			||||||
 | 
					                                Dictionary<string, object> archiveDayRawData = new Dictionary<string, object>();
 | 
				
			||||||
 | 
					                                archiveDayRawData.Add("@device_number", error_day.Device_number);
 | 
				
			||||||
 | 
					                                archiveDayRawData.Add("@point", error_day.Point);
 | 
				
			||||||
 | 
					                                archiveDayRawData.Add("@start_timestamp", DateTime.Parse(error_day.Start_timestamp, System.Globalization.CultureInfo.CurrentCulture));
 | 
				
			||||||
 | 
					                                archiveDayRawData.Add("@end_timestamp", DateTime.Parse(error_day.End_timestamp, System.Globalization.CultureInfo.CurrentCulture));
 | 
				
			||||||
 | 
					                                archiveDayRawData.Add("@is_complete", 0);
 | 
				
			||||||
 | 
					                                archiveDayRawData.Add("@repeat_times", ++error_day.Repeat_times);
 | 
				
			||||||
 | 
					                                archiveDayRawData.Add("@fail_reason", archiveDayJson);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                                archiveDayRawData.Add("@count_rawdata", 0);
 | 
				
			||||||
 | 
					                                archiveDayRawData.Add("@min_rawdata", 0);
 | 
				
			||||||
 | 
					                                archiveDayRawData.Add("@max_rawdata", 0);
 | 
				
			||||||
 | 
					                                archiveDayRawData.Add("@avg_rawdata", 0);
 | 
				
			||||||
 | 
					                                archiveDayRawData.Add("@sum_rawdata", 0);
 | 
				
			||||||
 | 
					                                archiveDayRawData.Add("@updated_at", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                                waterArchiveDayRawDatas.Add(archiveDayRawData);
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                            if (archiveDayJsonResult.ContainsKey("obj")) //表示可以讀取到內容
 | 
				
			||||||
 | 
					                            {
 | 
				
			||||||
 | 
					                                var ArrangeRawDatas = ArrangeRawData(deviceNumberPoint, archiveDayJsonResult);
 | 
				
			||||||
 | 
					                                if (ArrangeRawDatas != null && ArrangeRawDatas.Count() > 0)
 | 
				
			||||||
 | 
					                                {
 | 
				
			||||||
 | 
					                                    waterArchiveDayRawDatas.AddRange(ArrangeRawDatas);
 | 
				
			||||||
 | 
					                                }
 | 
				
			||||||
                            }
 | 
					                            }
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    if (waterArchiveDayRawDatas.Count() > 0)
 | 
					                        if (waterArchiveDayRawDatas.Count() > 0)
 | 
				
			||||||
                    {
 | 
					 | 
				
			||||||
                        var Mysql_error_update = string.Format(MYsql_update_format, targetTable);
 | 
					 | 
				
			||||||
                        var sql_error_update = string.Format(sql_update_format, targetTable);
 | 
					 | 
				
			||||||
                        if (!string.IsNullOrEmpty(saveToMSDB) && saveToMSDB == "1")
 | 
					 | 
				
			||||||
                        {
 | 
					                        {
 | 
				
			||||||
                            await backgroundServiceMsSqlRepository.ExecuteSql(sql_error_update, waterArchiveDayRawDatas);
 | 
					                            var Mysql_error_update = string.Format(MYsql_update_format, targetTable);
 | 
				
			||||||
 | 
					                            var sql_error_update = string.Format(sql_update_format, targetTable);
 | 
				
			||||||
 | 
					                            if (!string.IsNullOrEmpty(saveToMSDB) && saveToMSDB == "1")
 | 
				
			||||||
 | 
					                            {
 | 
				
			||||||
 | 
					                                await backgroundServiceMsSqlRepository.ExecuteSql(sql_error_update, waterArchiveDayRawDatas);
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
 | 
					                            await backgroundServiceRepository.ExecuteSql(Mysql_error_update, waterArchiveDayRawDatas);
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                        await backgroundServiceRepository.ExecuteSql(Mysql_error_update, waterArchiveDayRawDatas);
 | 
					 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
                #endregion 天歸檔補償
 | 
					                #endregion 天歸檔補償
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                #region 週歸檔補償
 | 
					                #region 週歸檔補償
 | 
				
			||||||
@ -458,6 +460,7 @@ namespace BackendWorkerService.Services.Implement
 | 
				
			|||||||
                                                <reltime name='interval' val = 'PT7D' />
 | 
					                                                <reltime name='interval' val = 'PT7D' />
 | 
				
			||||||
                                            </obj>";
 | 
					                                            </obj>";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        var station = buildingStation.Where(x => x.system_key == deviceNumberPoint.DeviceNumber.Split("_")[1]).Select(x => x.system_value).FirstOrDefault();
 | 
				
			||||||
                        HttpWebRequest archiveWeekRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/{station}/{deviceNumberPoint.FullDeviceNumberPoint}/~historyRollup/");
 | 
					                        HttpWebRequest archiveWeekRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/{station}/{deviceNumberPoint.FullDeviceNumberPoint}/~historyRollup/");
 | 
				
			||||||
                        //HttpWebRequest archiveWeekRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/{station}/H_E1_B1F_MVCB_MVCBH_V1/~historyRollup/");
 | 
					                        //HttpWebRequest archiveWeekRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/{station}/H_E1_B1F_MVCB_MVCBH_V1/~historyRollup/");
 | 
				
			||||||
                        archiveWeekRequest.Method = "POST";
 | 
					                        archiveWeekRequest.Method = "POST";
 | 
				
			||||||
@ -542,6 +545,7 @@ namespace BackendWorkerService.Services.Implement
 | 
				
			|||||||
                                                <reltime name='interval' val = 'PT7D' />
 | 
					                                                <reltime name='interval' val = 'PT7D' />
 | 
				
			||||||
                                            </obj>";
 | 
					                                            </obj>";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        var station = buildingStation.Where(x => x.system_key == deviceNumberPoint.DeviceNumber.Split("_")[1]).Select(x => x.system_value).FirstOrDefault();
 | 
				
			||||||
                        HttpWebRequest archiveWeekRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/{station}/{deviceNumberPoint.FullDeviceNumberPoint}/~historyRollup/");
 | 
					                        HttpWebRequest archiveWeekRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/{station}/{deviceNumberPoint.FullDeviceNumberPoint}/~historyRollup/");
 | 
				
			||||||
                        //HttpWebRequest archiveWeekRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/{station}/H_E1_B1F_MVCB_MVCBH_V1/~historyRollup/");
 | 
					                        //HttpWebRequest archiveWeekRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/{station}/H_E1_B1F_MVCB_MVCBH_V1/~historyRollup/");
 | 
				
			||||||
                        archiveWeekRequest.Method = "POST";
 | 
					                        archiveWeekRequest.Method = "POST";
 | 
				
			||||||
@ -632,6 +636,7 @@ namespace BackendWorkerService.Services.Implement
 | 
				
			|||||||
                                                <reltime name='interval' val = 'PT{dayInMonth}D' />
 | 
					                                                <reltime name='interval' val = 'PT{dayInMonth}D' />
 | 
				
			||||||
                                            </obj>";
 | 
					                                            </obj>";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        var station = buildingStation.Where(x => x.system_key == deviceNumberPoint.DeviceNumber.Split("_")[1]).Select(x => x.system_value).FirstOrDefault();
 | 
				
			||||||
                        HttpWebRequest archiveMonthRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/{station}/{deviceNumberPoint.FullDeviceNumberPoint}/~historyRollup/");
 | 
					                        HttpWebRequest archiveMonthRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/{station}/{deviceNumberPoint.FullDeviceNumberPoint}/~historyRollup/");
 | 
				
			||||||
                        //HttpWebRequest archiveMonthRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/{station}/H_E1_B1F_MVCB_MVCBH_V1/~historyRollup/");
 | 
					                        //HttpWebRequest archiveMonthRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/{station}/H_E1_B1F_MVCB_MVCBH_V1/~historyRollup/");
 | 
				
			||||||
                        archiveMonthRequest.Method = "POST";
 | 
					                        archiveMonthRequest.Method = "POST";
 | 
				
			||||||
@ -719,6 +724,7 @@ namespace BackendWorkerService.Services.Implement
 | 
				
			|||||||
                                                <reltime name='interval' val = 'PT{dayInMonth}D' />
 | 
					                                                <reltime name='interval' val = 'PT{dayInMonth}D' />
 | 
				
			||||||
                                            </obj>";
 | 
					                                            </obj>";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        var station = buildingStation.Where(x => x.system_key == deviceNumberPoint.DeviceNumber.Split("_")[1]).Select(x => x.system_value).FirstOrDefault();
 | 
				
			||||||
                        HttpWebRequest archiveMonthRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/{station}/{deviceNumberPoint.FullDeviceNumberPoint}/~historyRollup/");
 | 
					                        HttpWebRequest archiveMonthRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/{station}/{deviceNumberPoint.FullDeviceNumberPoint}/~historyRollup/");
 | 
				
			||||||
                        //HttpWebRequest archiveMonthRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/{station}/H_E1_B1F_MVCB_MVCBH_V1/~historyRollup/");
 | 
					                        //HttpWebRequest archiveMonthRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/{station}/H_E1_B1F_MVCB_MVCBH_V1/~historyRollup/");
 | 
				
			||||||
                        archiveMonthRequest.Method = "POST";
 | 
					                        archiveMonthRequest.Method = "POST";
 | 
				
			||||||
 | 
				
			|||||||
@ -875,7 +875,7 @@
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function setAuthPage() {
 | 
					    function setAuthPage() {
 | 
				
			||||||
        $(`#accAuthPageTable input[type=checkbox]`).prop('disabled', false);
 | 
					        $(`#accAuthPageTable input[type=checkbox]`).removeClass();
 | 
				
			||||||
        $.each($(`#accAuthPageTable input[type=checkbox]:checked`), function (i, v) {
 | 
					        $.each($(`#accAuthPageTable input[type=checkbox]:checked`), function (i, v) {
 | 
				
			||||||
            $(v).click();
 | 
					            $(v).click();
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
@ -886,7 +886,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        $.each(pageAct.authCode, function (i, v) {
 | 
					        $.each(pageAct.authCode, function (i, v) {
 | 
				
			||||||
            $(`#accAuthPageTable input[id=${v}]`).click();
 | 
					            $(`#accAuthPageTable input[id=${v}]`).click();
 | 
				
			||||||
            $(`#accAuthPageTable input[id=${v}]`).attr('disabled', true);
 | 
					            $(`#accAuthPageTable input[id=${v}]`).addClass("disabledBox");
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -19,10 +19,8 @@
 | 
				
			|||||||
            <div class="row bg-dark p-2">
 | 
					            <div class="row bg-dark p-2">
 | 
				
			||||||
                <div>
 | 
					                <div>
 | 
				
			||||||
                    <div class="py-2 col-12" id="his_building">
 | 
					                    <div class="py-2 col-12" id="his_building">
 | 
				
			||||||
                        <div
 | 
					                        <div class="item btn-group btn-group-toggle"
 | 
				
			||||||
                        class="item btn-group btn-group-toggle"
 | 
					                             data-toggle="buttons"></div>
 | 
				
			||||||
                        data-toggle="buttons"
 | 
					 | 
				
			||||||
                        ></div>
 | 
					 | 
				
			||||||
                    </div>
 | 
					                    </div>
 | 
				
			||||||
                </div>
 | 
					                </div>
 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
@ -81,11 +79,14 @@
 | 
				
			|||||||
<script>
 | 
					<script>
 | 
				
			||||||
    var historyTable = null;
 | 
					    var historyTable = null;
 | 
				
			||||||
    var buildingTag = null;
 | 
					    var buildingTag = null;
 | 
				
			||||||
 | 
					    pageAct.hisBuiName = "";
 | 
				
			||||||
 | 
					    hisFirst = true;
 | 
				
			||||||
    $(function () {
 | 
					    $(function () {
 | 
				
			||||||
 | 
					        console.log(1);
 | 
				
			||||||
        let html = "";
 | 
					        let html = "";
 | 
				
			||||||
        for (let building of pageAct.buildList) {
 | 
					        for (let building of pageAct.buildList) {
 | 
				
			||||||
            html += `<label class="btn btn-secondary">
 | 
					            html += `<label class="btn btn-secondary">
 | 
				
			||||||
                            <input type="radio" name="buildingRadio" id="radio_${building.building_tag}" value="${building.building_tag}" onChange="SelectBuild(this,'${building.building_tag}')"> ${building.full_name}
 | 
					                            <input type="radio" name="buildingRadio" id="radio-${building.getway}" value="${building.building_tag}" onChange="SelectBuild(this,'${building.building_tag}')"> ${building.full_name}
 | 
				
			||||||
                        </label>`;
 | 
					                        </label>`;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        $("#his_building").find(".item").empty();
 | 
					        $("#his_building").find(".item").empty();
 | 
				
			||||||
@ -186,7 +187,6 @@
 | 
				
			|||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function initList() {
 | 
					    function initList() {
 | 
				
			||||||
        $(loadEle).Loading("start");
 | 
					 | 
				
			||||||
        let sendData = {
 | 
					        let sendData = {
 | 
				
			||||||
            building_tag: buildingTag
 | 
					            building_tag: buildingTag
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@ -273,29 +273,44 @@
 | 
				
			|||||||
                    strHtml += `<button onClick="setValue(null, null, '${val.points}', this)" type="button" class="btn btn-info waves-effect waves-themed">${val.full_name || val.points}</button>`;
 | 
					                    strHtml += `<button onClick="setValue(null, null, '${val.points}', this)" type="button" class="btn btn-info waves-effect waves-themed">${val.full_name || val.points}</button>`;
 | 
				
			||||||
                    pageAct.deviceItem = val.points;
 | 
					                    pageAct.deviceItem = val.points;
 | 
				
			||||||
                    pageAct.devicePoiName = val.full_name + ' ' + val.points;
 | 
					                    pageAct.devicePoiName = val.full_name + ' ' + val.points;
 | 
				
			||||||
                    pageAct.deviceComName = val.parent_path;
 | 
					 | 
				
			||||||
                    getData();
 | 
					 | 
				
			||||||
                } else {
 | 
					                } else {
 | 
				
			||||||
                    strHtml += `<button onClick="setValue(null, null, '${val.points}', this)" type="button" class="btn btn-secondary waves-effect waves-themed">${val.full_name || val.points}</button>`;
 | 
					                    strHtml += `<button onClick="setValue(null, null, '${val.points}', this)" type="button" class="btn btn-secondary waves-effect waves-themed">${val.full_name || val.points}</button>`;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            $('#devPointsList').html(strHtml);
 | 
					            $('#devPointsList').html(strHtml);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (!hisFirst) {
 | 
				
			||||||
 | 
					                let start = new Date($('#his_startdate').val());
 | 
				
			||||||
 | 
					                let end = new Date(new Date().setDate(new Date($('#his_enddate input').val()).getDate() + 1));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if (pageAct.dateType == "today" || pageAct.dateType == "day" || pageAct.dateType == "ytd")
 | 
				
			||||||
 | 
					                    end = new Date(new Date(start.valueOf()).setDate(start.getDate() + 1));
 | 
				
			||||||
 | 
					                else if (pageAct.dateType == "month") {
 | 
				
			||||||
 | 
					                    start = new Date($('#getmonth').val());
 | 
				
			||||||
 | 
					                    end = new Date(new Date(start.valueOf()).setDate(start.getDate() + 30));
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                else if (pageAct.dateType != "range")
 | 
				
			||||||
 | 
					                    return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                getData(formatDate(start, "date", true), formatDate(end, "date", true));
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        ytAjax = new YourTeam.Ajax(url, objSendData, success, null, "POST").send();
 | 
					        ytAjax = new YourTeam.Ajax(url, objSendData, success, null, "POST").send();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function getData(start = null, end = null) {
 | 
					    function getData(start = null, end = null) {
 | 
				
			||||||
 | 
					        $(loadEle).Loading("start");
 | 
				
			||||||
        var sdt = new Date();
 | 
					        var sdt = new Date();
 | 
				
			||||||
        var edt = new Date(new Date().setDate(sdt.getDate() + 1));
 | 
					        var edt = new Date(new Date().setDate(sdt.getDate() + 1));
 | 
				
			||||||
        start = start ?? sdt.toLocaleDateString();
 | 
					        start = start ?? sdt.toLocaleDateString();
 | 
				
			||||||
        end = end ?? edt.toLocaleDateString();
 | 
					        end = end ?? edt.toLocaleDateString();
 | 
				
			||||||
        callBackFromHistory()
 | 
					        // callBackFromHistory();
 | 
				
			||||||
        getHistoryDataByBaja(pageAct.deviceNumber + "_" + pageAct.deviceItem,
 | 
					        getHistoryDataByBaja(pageAct.deviceNumber + "_" + pageAct.deviceItem,
 | 
				
			||||||
            new Date(start).getTime(),
 | 
					            new Date(start).getTime(),
 | 
				
			||||||
            new Date(end).getTime(),
 | 
					            new Date(end).getTime(),
 | 
				
			||||||
            pageAct.deviceName,
 | 
					            pageAct.deviceName,
 | 
				
			||||||
            pageAct.deviceComName,
 | 
					            pageAct.hisBuiName,
 | 
				
			||||||
            callBackFromHistory);
 | 
					            callBackFromHistory);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -304,14 +319,15 @@
 | 
				
			|||||||
        loadTable(res.data);
 | 
					        loadTable(res.data);
 | 
				
			||||||
        if (historyTable != null) {
 | 
					        if (historyTable != null) {
 | 
				
			||||||
            let t = $('#historyTable').dataTable();
 | 
					            let t = $('#historyTable').dataTable();
 | 
				
			||||||
 | 
					 | 
				
			||||||
            t.fnClearTable();
 | 
					            t.fnClearTable();
 | 
				
			||||||
            if (res.data.length > 0)
 | 
					            if (res.data.length > 0)
 | 
				
			||||||
                t.fnAddData(res.data);
 | 
					                t.fnAddData(res.data);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function setValue(deviceNumber, deviceName, deviceItem, elem) {
 | 
					    function setValue(deviceNumber, deviceName, deviceItem, elem) {
 | 
				
			||||||
 | 
					        hisFirst = false;
 | 
				
			||||||
        btnSelCss(elem);
 | 
					        btnSelCss(elem);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if ((deviceNumber != null && deviceNumber != undefined) && (deviceName != null && deviceName != undefined)) {
 | 
					        if ((deviceNumber != null && deviceNumber != undefined) && (deviceName != null && deviceName != undefined)) {
 | 
				
			||||||
@ -322,7 +338,20 @@
 | 
				
			|||||||
        else if (deviceItem != null && deviceItem != undefined) {
 | 
					        else if (deviceItem != null && deviceItem != undefined) {
 | 
				
			||||||
            pageAct.devicePoiName = $(elem).text();
 | 
					            pageAct.devicePoiName = $(elem).text();
 | 
				
			||||||
            pageAct.deviceItem = deviceItem;
 | 
					            pageAct.deviceItem = deviceItem;
 | 
				
			||||||
            getData();
 | 
					
 | 
				
			||||||
 | 
					            let start = new Date($('#his_startdate').val());
 | 
				
			||||||
 | 
					            let end = new Date(new Date().setDate(new Date($('#his_enddate input').val()).getDate() + 1));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (pageAct.dateType == "today" || pageAct.dateType == "day" || pageAct.dateType == "ytd")
 | 
				
			||||||
 | 
					                end = new Date(new Date(start.valueOf()).setDate(start.getDate() + 1));
 | 
				
			||||||
 | 
					            else if (pageAct.dateType == "month") {
 | 
				
			||||||
 | 
					                start = new Date($('#getmonth').val());
 | 
				
			||||||
 | 
					                end = new Date(new Date(start.valueOf()).setDate(start.getDate() + 30));
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            else if (pageAct.dateType != "range")
 | 
				
			||||||
 | 
					                return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            getData(formatDate(start, "date", true), formatDate(end, "date", true));
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -383,11 +412,11 @@
 | 
				
			|||||||
        let start = new Date($('#his_startdate').val());
 | 
					        let start = new Date($('#his_startdate').val());
 | 
				
			||||||
        let end = new Date(new Date().setDate(new Date($('#his_enddate input').val()).getDate() + 1));
 | 
					        let end = new Date(new Date().setDate(new Date($('#his_enddate input').val()).getDate() + 1));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (pageAct.dateType == "day")
 | 
					        if (pageAct.dateType == "today" || pageAct.dateType == "day" || pageAct.dateType == "ytd")
 | 
				
			||||||
            end = new Date(new Date().setDate(start.getDate() + 1));
 | 
					            end = new Date(new Date(start.valueOf()).setDate(start.getDate() + 1));
 | 
				
			||||||
        else if (pageAct.dateType == "month") {
 | 
					        else if (pageAct.dateType == "month") {
 | 
				
			||||||
            start = new Date($('#getmonth').val());
 | 
					            start = new Date($('#getmonth').val());
 | 
				
			||||||
            end = new Date(new Date().setDate(start.getDate() + 30));
 | 
					            end = new Date(new Date(start.valueOf()).setDate(start.getDate() + 30));
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        else if (pageAct.dateType != "range")
 | 
					        else if (pageAct.dateType != "range")
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
@ -408,89 +437,118 @@
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function loadTable(data) {
 | 
					    function loadTable(data) {
 | 
				
			||||||
        $(loadEle).Loading("start");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if (data) {
 | 
					        if (data) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            $.each(data, function (i, v) {
 | 
					            $.each(data, function (i, v) {
 | 
				
			||||||
                v.type = pageAct.devicePoiName.split(" ")[0];
 | 
					                v.type = pageAct.devicePoiName.split(" ")[0];
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			let tag = "#historyTable";
 | 
					            let tag = "#historyTable";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			let column_defs = [
 | 
					            let column_defs = [
 | 
				
			||||||
				{ "targets": [0], "width": "20%", "sortable": true },
 | 
					                { "targets": [0], "width": "20%", "sortable": true },
 | 
				
			||||||
				{ "targets": [1], "width": "20%", "sortable": true },
 | 
					                { "targets": [1], "width": "20%", "sortable": true },
 | 
				
			||||||
				{ "targets": [2], "width": "20%", "sortable": true }
 | 
					                { "targets": [2], "width": "20%", "sortable": true }
 | 
				
			||||||
			];
 | 
					            ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			let columns = [
 | 
					            let columns = [
 | 
				
			||||||
				{
 | 
					                {
 | 
				
			||||||
					"title": "類別",
 | 
					                    "title": "類別",
 | 
				
			||||||
					"data": "type"
 | 
					                    "data": "type"
 | 
				
			||||||
				},
 | 
					                },
 | 
				
			||||||
				{
 | 
					                {
 | 
				
			||||||
					"title": "設備名稱",
 | 
					                    "title": "設備名稱",
 | 
				
			||||||
					"data": "deviceName",
 | 
					                    "data": "deviceName",
 | 
				
			||||||
				},
 | 
					                },
 | 
				
			||||||
				{
 | 
					                {
 | 
				
			||||||
					"title": "數值",
 | 
					                    "title": "數值",
 | 
				
			||||||
					"data": "value",
 | 
					                    "data": "value",
 | 
				
			||||||
					"render": function (data) {
 | 
					                    "render": function (data) {
 | 
				
			||||||
						if (isNaN(data.toString())) {
 | 
					                        if (isNaN(data.toString())) {
 | 
				
			||||||
							return data
 | 
					                            return data
 | 
				
			||||||
						}
 | 
					                        }
 | 
				
			||||||
						return data.roundDecimal(2);
 | 
					                        return data.roundDecimal(2);
 | 
				
			||||||
					}
 | 
					                    }
 | 
				
			||||||
				},
 | 
					                },
 | 
				
			||||||
				{
 | 
					                {
 | 
				
			||||||
					"title": "紀錄時間",
 | 
					                    "title": "紀錄時間",
 | 
				
			||||||
					"data": "timestamp",
 | 
					                    "data": "timestamp",
 | 
				
			||||||
					"render": function (data) {
 | 
					                    "render": function (data) {
 | 
				
			||||||
						return displayDate(data, "datetime");
 | 
					                        return displayDate(data, "datetime");
 | 
				
			||||||
					}
 | 
					                    }
 | 
				
			||||||
				}
 | 
					                }
 | 
				
			||||||
			];
 | 
					            ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			historyTable = new YourTeam.JqDataTables.getTableByStatic(tag, data, columns, column_defs, null, null, null, null, "tpi");
 | 
					            historyTable = new YourTeam.JqDataTables.getTableByStatic(tag, data, columns, column_defs, null, null, null, null, "tpi");
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        $(loadEle).Loading("close");
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function exportExcel() {
 | 
					    function exportExcel() {
 | 
				
			||||||
        let url = baseApiUrl + "/History/OpeExportExcel";
 | 
					        $(loadEle).Loading("start");
 | 
				
			||||||
        objSendData.Data = $('#historyTable').dataTable().fnGetData();
 | 
					        let token = cookies.get("JWT-Authorization");
 | 
				
			||||||
 | 
					        let url = baseApiUrl + "/api/ExportHistory";
 | 
				
			||||||
 | 
					        let v = {};
 | 
				
			||||||
 | 
					        v.starttime = (pageAct.dateType == "month" ? new Date($('#getmonth').val()) : new Date($('#his_startdate').val()));
 | 
				
			||||||
 | 
					        v.endtime = $('#his_enddate input').val() === "" ? null : new Date($('#his_enddate input').val());
 | 
				
			||||||
 | 
					        v.dateType = pageAct.dateType;
 | 
				
			||||||
 | 
					        objSendData.Data = v;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        $.each(objSendData.Data, function (i, v) {
 | 
					        $.ajax({
 | 
				
			||||||
            v.starttime = (pageAct.dateType == "month" ? new Date($('#getmonth').val()) : new Date($('#his_startdate').val()));
 | 
					            type: "POST",
 | 
				
			||||||
            v.endtime = $('#his_enddate input').val() === "" ? null : new Date($('#his_enddate input').val());
 | 
					            url: url,
 | 
				
			||||||
            v.dateType = pageAct.dateType;
 | 
					            data: JSON.stringify(objSendData.Data),
 | 
				
			||||||
 | 
					            aysnc: true,
 | 
				
			||||||
 | 
					            headers: {
 | 
				
			||||||
 | 
					                Authorization: "Bearer " + token,
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            contentType: "application/json; charset=utf-8",
 | 
				
			||||||
 | 
					            xhrFields: {
 | 
				
			||||||
 | 
					                responseType: "blob", // to avoid binary data being mangled on charset conversion
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            success: function (rel, text, xhr) {
 | 
				
			||||||
 | 
					                if (rel) {
 | 
				
			||||||
 | 
					                    downloadByBlob(xhr, rel);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                $(loadEle).Loading("close");
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            error: function () {
 | 
				
			||||||
 | 
					                $(loadEle).Loading("close");
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            complete: (xhr) => {
 | 
				
			||||||
 | 
					                setLoading(false);
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
 | 
					        // ytAjax = new YourTeam.Ajax(url, objSendData, function (rel) {
 | 
				
			||||||
 | 
					        //     $(loadEle).Loading("close");
 | 
				
			||||||
 | 
					        // }, function (rel) {
 | 
				
			||||||
 | 
					        //     if (rel) {
 | 
				
			||||||
 | 
					        //        downloadByBlob(xhr, rel);
 | 
				
			||||||
 | 
					        //     }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        ytAjax = new YourTeam.Ajax(url, objSendData, function (rel) {
 | 
					        //     $(loadEle).Loading("close");
 | 
				
			||||||
            if (rel.code == "0000")
 | 
					        // }, "POST",true).send();
 | 
				
			||||||
                location.href = baseApiUrl + "/api/df?path=" + rel.data.split('/')[0] + "&fileName=" + rel.data.split('/')[1] + "&token=" + cookies.get("JWT-Authorization");
 | 
					 | 
				
			||||||
        }, null, "POST").send();
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    //選擇棟別
 | 
					    //選擇棟別
 | 
				
			||||||
  function SelectBuild(e, building_tag) {
 | 
					    function SelectBuild(e, building_tag) {
 | 
				
			||||||
    checkIsSelectedBuilding();
 | 
					        $(loadEle).Loading("start");
 | 
				
			||||||
  }
 | 
					        checkIsSelectedBuilding();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
  function checkIsSelectedBuilding() {
 | 
					
 | 
				
			||||||
    let result = false;
 | 
					    function checkIsSelectedBuilding() {
 | 
				
			||||||
    let buildingRadios = $("[name=buildingRadio]:checked");
 | 
					        let result = false;
 | 
				
			||||||
    buildingTag = null;
 | 
					        let buildingRadios = $("[name=buildingRadio]:checked");
 | 
				
			||||||
    if (buildingRadios && buildingRadios.length > 0) {
 | 
					        buildingTag = null;
 | 
				
			||||||
        $("[name=buildingRadio]").parent().removeClass("btn-info");
 | 
					        if (buildingRadios && buildingRadios.length > 0) {
 | 
				
			||||||
        $("[name=buildingRadio]").parent().addClass("btn-secondary");
 | 
					            $("[name=buildingRadio]").parent().removeClass("btn-info");
 | 
				
			||||||
        $("[name=buildingRadio]:checked").parent().removeClass("btn-secondary");
 | 
					            $("[name=buildingRadio]").parent().addClass("btn-secondary");
 | 
				
			||||||
        $("[name=buildingRadio]:checked").parent().addClass("btn-info");
 | 
					            $("[name=buildingRadio]:checked").parent().removeClass("btn-secondary");
 | 
				
			||||||
        buildingTag = buildingRadios.prop("id").split("_")[1]; //building tag
 | 
					            $("[name=buildingRadio]:checked").parent().addClass("btn-info");
 | 
				
			||||||
        initList();
 | 
					            buildingTag = buildingRadios.val(); //building tag
 | 
				
			||||||
        result = true;
 | 
					            pageAct.hisBuiName = buildingRadios.prop('id').split("-")[1];
 | 
				
			||||||
    } else {
 | 
					            initList();
 | 
				
			||||||
 | 
					            result = true;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return result;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    return result;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
</script>
 | 
					</script>
 | 
				
			||||||
@ -45,6 +45,8 @@ input.toggle:checked { background: #97c193; }
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
.lds-ring div:nth-child(3) { animation-delay: -0.15s; }
 | 
					.lds-ring div:nth-child(3) { animation-delay: -0.15s; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					input.disabledBox { pointer-events: none; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* js-tree */
 | 
					/* js-tree */
 | 
				
			||||||
.jstree-node { padding-bottom: 3px; }
 | 
					.jstree-node { padding-bottom: 3px; }
 | 
				
			||||||
.jstree-default-dark { background-color: transparent; }
 | 
					.jstree-default-dark { background-color: transparent; }
 | 
				
			||||||
 | 
				
			|||||||
@ -1,9 +1,13 @@
 | 
				
			|||||||
using FrontendWebApi.Models;
 | 
					using FrontendWebApi.Models;
 | 
				
			||||||
using Microsoft.AspNetCore.Mvc;
 | 
					using Microsoft.AspNetCore.Mvc;
 | 
				
			||||||
 | 
					using Microsoft.AspNetCore.Routing;
 | 
				
			||||||
using Microsoft.Extensions.Logging;
 | 
					using Microsoft.Extensions.Logging;
 | 
				
			||||||
using Microsoft.Extensions.Options;
 | 
					using Microsoft.Extensions.Options;
 | 
				
			||||||
using Newtonsoft.Json;
 | 
					using Newtonsoft.Json;
 | 
				
			||||||
using Newtonsoft.Json.Linq;
 | 
					using Newtonsoft.Json.Linq;
 | 
				
			||||||
 | 
					using NPOI.HPSF;
 | 
				
			||||||
 | 
					using NPOI.SS.UserModel;
 | 
				
			||||||
 | 
					using NPOI.XSSF.UserModel;
 | 
				
			||||||
using Repository.BackendRepository.Interface;
 | 
					using Repository.BackendRepository.Interface;
 | 
				
			||||||
using Repository.FrontendRepository.Interface;
 | 
					using Repository.FrontendRepository.Interface;
 | 
				
			||||||
using System;
 | 
					using System;
 | 
				
			||||||
@ -14,12 +18,8 @@ using System.Net;
 | 
				
			|||||||
using System.Text;
 | 
					using System.Text;
 | 
				
			||||||
using System.Threading.Tasks;
 | 
					using System.Threading.Tasks;
 | 
				
			||||||
using System.Xml;
 | 
					using System.Xml;
 | 
				
			||||||
using NPOI.XSSF.UserModel;
 | 
					using Decimal = System.Decimal;
 | 
				
			||||||
using NPOI.SS.UserModel;
 | 
					
 | 
				
			||||||
using Microsoft.AspNetCore.Mvc.Infrastructure;
 | 
					 | 
				
			||||||
using Microsoft.AspNetCore.StaticFiles;
 | 
					 | 
				
			||||||
using NPOI.HPSF;
 | 
					 | 
				
			||||||
using Google.Protobuf.WellKnownTypes;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace FrontendWebApi.ApiControllers
 | 
					namespace FrontendWebApi.ApiControllers
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@ -47,72 +47,184 @@ namespace FrontendWebApi.ApiControllers
 | 
				
			|||||||
        /// <param name="lhe"></param>
 | 
					        /// <param name="lhe"></param>
 | 
				
			||||||
        /// <returns></returns>
 | 
					        /// <returns></returns>
 | 
				
			||||||
        [HttpPost]
 | 
					        [HttpPost]
 | 
				
			||||||
        public async Task<ActionResult<ApiResult<string>>> OpeExportExcel([FromBody] List<HistoryExport> lhe)
 | 
					        [Route("api/ExportHistory")]
 | 
				
			||||||
 | 
					        public FileResult OpeExportExcel([FromBody] HistoryExport lhe)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            ApiResult<string> apiResult = new ApiResult<string>();
 | 
					            ApiResult<string> apiResult = new ApiResult<string>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if (lhe == null)
 | 
					            //if (lhe == null)
 | 
				
			||||||
            {
 | 
					            //{
 | 
				
			||||||
                apiResult.Code = "0001";
 | 
					            //    apiResult.Code = "0001";
 | 
				
			||||||
                apiResult.Msg = "沒有資料匯入";
 | 
					            //    apiResult.Msg = "沒有資料匯入";
 | 
				
			||||||
                return apiResult;
 | 
					            //    return apiResult;
 | 
				
			||||||
            }
 | 
					            //}
 | 
				
			||||||
 | 
					            var fileDateName = lhe.dateType == "today" ? lhe.starttime.ToString("yyyy-MM-dd")
 | 
				
			||||||
 | 
					                                    : lhe.dateType == "month" ? lhe.starttime.ToString("yyyy-MM")
 | 
				
			||||||
 | 
					                                    : lhe.starttime.ToString("yyyy-MM-dd") + "_" + ((DateTime)lhe.endtime).ToString("yyyy-MM-dd");
 | 
				
			||||||
 | 
					            var fileName = "歷史資料_" + fileDateName + ".xlsx";
 | 
				
			||||||
 | 
					            XSSFWorkbook workbook = new XSSFWorkbook();
 | 
				
			||||||
            try
 | 
					            try
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                var fileDateName = lhe.FirstOrDefault().dateType == "month" ? lhe.FirstOrDefault().starttime.ToString("yyyy-MM") : lhe.FirstOrDefault().endtime == null ? lhe.FirstOrDefault().starttime.ToString("yyyy-MM-dd") : lhe.FirstOrDefault().starttime.ToString("yyyy-MM-dd") + "_" + ((DateTime)lhe.FirstOrDefault().endtime).ToString("yyyy-MM-dd");
 | 
					                #region 取得obix 設定
 | 
				
			||||||
                var fileName = "歷史資料_"+fileDateName+".xlsx";
 | 
					                EDFunction ed = new EDFunction();
 | 
				
			||||||
                var filePath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "excel", "history");
 | 
					                var obixApiConfig = new ObixApiConfig();
 | 
				
			||||||
 | 
					                var sqlObix = $@"SELECT system_value as Value, system_key as Name FROM variable WHERE deleted = 0 AND system_type = 'obixConfig'";
 | 
				
			||||||
 | 
					                var variableObix = backendRepository.GetAllAsync<KeyValue>(sqlObix).Result;
 | 
				
			||||||
 | 
					                obixApiConfig.ApiBase = variableObix.Where(x => x.Name == "ApiBase").Select(x => x.Value).FirstOrDefault();
 | 
				
			||||||
 | 
					                obixApiConfig.UserName = ed.AESDecrypt(variableObix.Where(x => x.Name == "UserName").Select(x => x.Value).FirstOrDefault());
 | 
				
			||||||
 | 
					                obixApiConfig.Password = ed.AESDecrypt(variableObix.Where(x => x.Name == "Password").Select(x => x.Value).FirstOrDefault());
 | 
				
			||||||
 | 
					                String encoded = System.Convert.ToBase64String(System.Text.Encoding.GetEncoding("ISO-8859-1").GetBytes(obixApiConfig.UserName + ":" + obixApiConfig.Password));
 | 
				
			||||||
 | 
					                #endregion 取得obix 設定
 | 
				
			||||||
 | 
					                var building = backendRepository.GetAllAsync<BuildList>("select * from building where deleted = 0").Result;
 | 
				
			||||||
 | 
					                var buildStation = backendRepository.GetAllAsync<BuildStation>("select SUBSTRING_INDEX(system_value, '/', 1) system_value, system_key from variable where system_type = 'dashboard_total_elec' and deleted = 0 and (SUBSTRING_INDEX(system_value, '/', 1) != '' and SUBSTRING_INDEX(system_value, '/', 1) is not null)").Result;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                if (!System.IO.Directory.Exists(filePath))
 | 
					                #region get device and device_item(point)
 | 
				
			||||||
                    System.IO.Directory.CreateDirectory(filePath);
 | 
					                var device = backendRepository.GetAllAsync<Device>($"select * from device where deleted = 0 and is_link = 1 and device_building_tag in ('{string.Join("','", building.Select(x => x.building_tag))}')").Result;
 | 
				
			||||||
 | 
					                var devicePoint = backendRepository.GetAllAsync<Device_item>($"select * from device_item where deleted = 0 and is_link = 1 and is_show_history = 1 and device_building_tag in ('{string.Join("','", building.Select(x => x.building_tag))}')").Result;
 | 
				
			||||||
 | 
					                #endregion
 | 
				
			||||||
 | 
					                List<DeviceNumberPoint> listDevicePoint = new List<DeviceNumberPoint>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                using (var fs = new FileStream(Path.Combine(filePath, fileName), FileMode.Create, FileAccess.Write))
 | 
					                #region combine device and point
 | 
				
			||||||
 | 
					                foreach (var d in device)
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    IWorkbook workbook = new XSSFWorkbook();
 | 
					                    var dp = devicePoint.Where(x => x.device_building_tag == d.device_building_tag).ToList();
 | 
				
			||||||
                    #region excel設定
 | 
					                    foreach (var point in dp)
 | 
				
			||||||
                    IFont font12 = workbook.CreateFont();
 | 
					                    {
 | 
				
			||||||
                    font12.FontName = "新細明體";
 | 
					                        DeviceNumberPoint deviceNumberPoint = new DeviceNumberPoint();
 | 
				
			||||||
                    font12.FontHeightInPoints = 12;
 | 
					                        deviceNumberPoint.DeviceNumber = d.device_number;
 | 
				
			||||||
                    ICellStyle style12 = workbook.CreateCellStyle();
 | 
					                        deviceNumberPoint.Point = point.points;
 | 
				
			||||||
                    style12.SetFont(font12);
 | 
					                        deviceNumberPoint.FullDeviceNumberPoint = string.Format("{0}_{1}", d.device_number, point.points);
 | 
				
			||||||
                    style12.Alignment = HorizontalAlignment.Center;
 | 
					 | 
				
			||||||
                    style12.VerticalAlignment = VerticalAlignment.Center;
 | 
					 | 
				
			||||||
                    IFont font12Times = workbook.CreateFont();
 | 
					 | 
				
			||||||
                    font12Times.FontName = "Times New Roman";
 | 
					 | 
				
			||||||
                    font12Times.FontHeightInPoints = 12;
 | 
					 | 
				
			||||||
                    IFont font18 = workbook.CreateFont();
 | 
					 | 
				
			||||||
                    font18.FontName = "新細明體";
 | 
					 | 
				
			||||||
                    font18.FontHeightInPoints = 18;
 | 
					 | 
				
			||||||
                    font18.IsBold = true;
 | 
					 | 
				
			||||||
                    ICellStyle styleTitle18 = workbook.CreateCellStyle();
 | 
					 | 
				
			||||||
                    styleTitle18.SetFont(font18);
 | 
					 | 
				
			||||||
                    styleTitle18.Alignment = HorizontalAlignment.Center;
 | 
					 | 
				
			||||||
                    styleTitle18.VerticalAlignment = VerticalAlignment.Center;
 | 
					 | 
				
			||||||
                    ICellStyle styleLeft12 = workbook.CreateCellStyle();
 | 
					 | 
				
			||||||
                    styleLeft12.SetFont(font12);
 | 
					 | 
				
			||||||
                    styleLeft12.Alignment = HorizontalAlignment.Left;
 | 
					 | 
				
			||||||
                    styleLeft12.VerticalAlignment = VerticalAlignment.Center;
 | 
					 | 
				
			||||||
                    ICellStyle styleLine12 = workbook.CreateCellStyle();
 | 
					 | 
				
			||||||
                    styleLine12.SetFont(font12);
 | 
					 | 
				
			||||||
                    styleLine12.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;
 | 
					 | 
				
			||||||
                    styleLine12.VerticalAlignment = VerticalAlignment.Center;
 | 
					 | 
				
			||||||
                    styleLine12.BorderTop = NPOI.SS.UserModel.BorderStyle.Thin;
 | 
					 | 
				
			||||||
                    styleLine12.BorderBottom = NPOI.SS.UserModel.BorderStyle.Thin;
 | 
					 | 
				
			||||||
                    styleLine12.BorderRight = NPOI.SS.UserModel.BorderStyle.Thin;
 | 
					 | 
				
			||||||
                    styleLine12.BorderLeft = NPOI.SS.UserModel.BorderStyle.Thin;
 | 
					 | 
				
			||||||
                    ICellStyle stylein12 = workbook.CreateCellStyle();
 | 
					 | 
				
			||||||
                    stylein12.SetFont(font12Times);
 | 
					 | 
				
			||||||
                    stylein12.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Left;
 | 
					 | 
				
			||||||
                    stylein12.VerticalAlignment = VerticalAlignment.Center;
 | 
					 | 
				
			||||||
                    stylein12.BorderTop = NPOI.SS.UserModel.BorderStyle.Thin;
 | 
					 | 
				
			||||||
                    stylein12.BorderBottom = NPOI.SS.UserModel.BorderStyle.Thin;
 | 
					 | 
				
			||||||
                    stylein12.BorderRight = NPOI.SS.UserModel.BorderStyle.Thin;
 | 
					 | 
				
			||||||
                    stylein12.BorderLeft = NPOI.SS.UserModel.BorderStyle.Thin;
 | 
					 | 
				
			||||||
                    stylein12.WrapText = true;
 | 
					 | 
				
			||||||
                    #endregion
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    ISheet sheet = workbook.CreateSheet("歷史資料");
 | 
					                        listDevicePoint.Add(deviceNumberPoint);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                #endregion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                #region get data from niagara
 | 
				
			||||||
 | 
					                lhe.endtime = lhe.dateType == "today" ? lhe.starttime : lhe.dateType == "month" ? lhe.starttime.AddMonths(1) : lhe.endtime;
 | 
				
			||||||
 | 
					                var startTimestamp = string.Format("{0}T00:00:00.000+08:00", lhe.starttime.ToString("yyyy-MM-dd"));
 | 
				
			||||||
 | 
					                var endTimestamp = string.Format("{0}T23:59:59.000+08:00", lhe.endtime?.ToString("yyyy-MM-dd"));
 | 
				
			||||||
 | 
					                var historyQueryFilter = $@"<obj is='obix: HistoryFilter'>
 | 
				
			||||||
 | 
					                                                <abstime name='start' val='{startTimestamp}' />
 | 
				
			||||||
 | 
					                                                <abstime name='end' val='{endTimestamp}' />
 | 
				
			||||||
 | 
					                                                <reltime name='interval' val='PT1M' />
 | 
				
			||||||
 | 
					                                            </obj>";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                List<HistoryExport> he = new List<HistoryExport>();
 | 
				
			||||||
 | 
					                List<JsonDevice> jd = new List<JsonDevice>();
 | 
				
			||||||
 | 
					                if (listDevicePoint.Count > 0)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    foreach (var d in listDevicePoint)
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        string buildingTag = d.DeviceNumber.Split("_")[1];
 | 
				
			||||||
 | 
					                        var station = buildStation.Where(x => x.system_key == buildingTag).Select(x => x.system_value).FirstOrDefault();
 | 
				
			||||||
 | 
					                        var archiveRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/{station}/{d.FullDeviceNumberPoint}/~historyRollup/");
 | 
				
			||||||
 | 
					                        archiveRequest.Method = "POST";
 | 
				
			||||||
 | 
					                        archiveRequest.Headers.Add("Authorization", "Basic " + encoded);
 | 
				
			||||||
 | 
					                        archiveRequest.PreAuthenticate = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        byte[] byteArray = Encoding.UTF8.GetBytes(historyQueryFilter);
 | 
				
			||||||
 | 
					                        using (Stream reqStream = archiveRequest.GetRequestStream())
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            reqStream.Write(byteArray, 0, byteArray.Length);
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        var archiveResponse = (HttpWebResponse)archiveRequest.GetResponse();
 | 
				
			||||||
 | 
					                        var archiveResponseContent = new StreamReader(archiveResponse.GetResponseStream()).ReadToEnd();
 | 
				
			||||||
 | 
					                        archiveResponse.Dispose();
 | 
				
			||||||
 | 
					                        archiveResponse.Close();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        XmlDocument xmlDocument = new XmlDocument();
 | 
				
			||||||
 | 
					                        xmlDocument.LoadXml(archiveResponseContent);
 | 
				
			||||||
 | 
					                        var archiveJson = JsonConvert.SerializeXmlNode(xmlDocument);
 | 
				
			||||||
 | 
					                        var archiveJsonResult = (JObject)JsonConvert.DeserializeObject(archiveJson);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        if (!archiveJsonResult.ContainsKey("err"))
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            var jsonDevice = new JsonDevice();
 | 
				
			||||||
 | 
					                            jsonDevice.deviceNumberPoint = d;
 | 
				
			||||||
 | 
					                            jsonDevice.json = archiveJsonResult;
 | 
				
			||||||
 | 
					                            jsonDevice.building_tag = buildingTag;
 | 
				
			||||||
 | 
					                            jd.Add(jsonDevice);
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if (jd != null && jd.Count > 0)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    foreach (var d in jd)
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        var ArrangeRawDatas = ArrangeRawData(d.deviceNumberPoint, d.json);
 | 
				
			||||||
 | 
					                        if (ArrangeRawDatas != null && ArrangeRawDatas.Count > 0)
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            foreach (var ard in ArrangeRawDatas)
 | 
				
			||||||
 | 
					                            {
 | 
				
			||||||
 | 
					                                HistoryExport hed = new HistoryExport();
 | 
				
			||||||
 | 
					                                hed.type = devicePoint.Where(x => x.device_building_tag == d.building_tag && x.points == ard["@point"].ToString()).Select(x => x.full_name).FirstOrDefault();
 | 
				
			||||||
 | 
					                                hed.deviceName = device.Where(x => x.device_number == ard["@device_number"].ToString()).Select(x => x.full_name).FirstOrDefault();
 | 
				
			||||||
 | 
					                                hed.value = (double)((decimal)ard["@avg_rawdata"]);
 | 
				
			||||||
 | 
					                                hed.timestamp = Convert.ToDateTime(ard["@start_timestamp"].ToString());
 | 
				
			||||||
 | 
					                                hed.building_tag = d.building_tag;
 | 
				
			||||||
 | 
					                                he.Add(hed);
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                #endregion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                #region export file progress
 | 
				
			||||||
 | 
					                //var filePath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "excel", "history");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                //if (!System.IO.Directory.Exists(filePath))
 | 
				
			||||||
 | 
					                //    System.IO.Directory.CreateDirectory(filePath);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                
 | 
				
			||||||
 | 
					                #region excel設定
 | 
				
			||||||
 | 
					                IFont font12 = workbook.CreateFont();
 | 
				
			||||||
 | 
					                font12.FontName = "新細明體";
 | 
				
			||||||
 | 
					                font12.FontHeightInPoints = 12;
 | 
				
			||||||
 | 
					                ICellStyle style12 = workbook.CreateCellStyle();
 | 
				
			||||||
 | 
					                style12.SetFont(font12);
 | 
				
			||||||
 | 
					                style12.Alignment = HorizontalAlignment.Center;
 | 
				
			||||||
 | 
					                style12.VerticalAlignment = VerticalAlignment.Center;
 | 
				
			||||||
 | 
					                IFont font12Times = workbook.CreateFont();
 | 
				
			||||||
 | 
					                font12Times.FontName = "Times New Roman";
 | 
				
			||||||
 | 
					                font12Times.FontHeightInPoints = 12;
 | 
				
			||||||
 | 
					                IFont font18 = workbook.CreateFont();
 | 
				
			||||||
 | 
					                font18.FontName = "新細明體";
 | 
				
			||||||
 | 
					                font18.FontHeightInPoints = 18;
 | 
				
			||||||
 | 
					                font18.IsBold = true;
 | 
				
			||||||
 | 
					                ICellStyle styleTitle18 = workbook.CreateCellStyle();
 | 
				
			||||||
 | 
					                styleTitle18.SetFont(font18);
 | 
				
			||||||
 | 
					                styleTitle18.Alignment = HorizontalAlignment.Center;
 | 
				
			||||||
 | 
					                styleTitle18.VerticalAlignment = VerticalAlignment.Center;
 | 
				
			||||||
 | 
					                ICellStyle styleLeft12 = workbook.CreateCellStyle();
 | 
				
			||||||
 | 
					                styleLeft12.SetFont(font12);
 | 
				
			||||||
 | 
					                styleLeft12.Alignment = HorizontalAlignment.Left;
 | 
				
			||||||
 | 
					                styleLeft12.VerticalAlignment = VerticalAlignment.Center;
 | 
				
			||||||
 | 
					                ICellStyle styleLine12 = workbook.CreateCellStyle();
 | 
				
			||||||
 | 
					                styleLine12.SetFont(font12);
 | 
				
			||||||
 | 
					                styleLine12.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;
 | 
				
			||||||
 | 
					                styleLine12.VerticalAlignment = VerticalAlignment.Center;
 | 
				
			||||||
 | 
					                styleLine12.BorderTop = NPOI.SS.UserModel.BorderStyle.Thin;
 | 
				
			||||||
 | 
					                styleLine12.BorderBottom = NPOI.SS.UserModel.BorderStyle.Thin;
 | 
				
			||||||
 | 
					                styleLine12.BorderRight = NPOI.SS.UserModel.BorderStyle.Thin;
 | 
				
			||||||
 | 
					                styleLine12.BorderLeft = NPOI.SS.UserModel.BorderStyle.Thin;
 | 
				
			||||||
 | 
					                ICellStyle stylein12 = workbook.CreateCellStyle();
 | 
				
			||||||
 | 
					                stylein12.SetFont(font12Times);
 | 
				
			||||||
 | 
					                stylein12.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Left;
 | 
				
			||||||
 | 
					                stylein12.VerticalAlignment = VerticalAlignment.Center;
 | 
				
			||||||
 | 
					                stylein12.BorderTop = NPOI.SS.UserModel.BorderStyle.Thin;
 | 
				
			||||||
 | 
					                stylein12.BorderBottom = NPOI.SS.UserModel.BorderStyle.Thin;
 | 
				
			||||||
 | 
					                stylein12.BorderRight = NPOI.SS.UserModel.BorderStyle.Thin;
 | 
				
			||||||
 | 
					                stylein12.BorderLeft = NPOI.SS.UserModel.BorderStyle.Thin;
 | 
				
			||||||
 | 
					                stylein12.WrapText = true;
 | 
				
			||||||
 | 
					                #endregion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                foreach (var b in building)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    var data = he.Where(x => x.building_tag == b.building_tag).ToList();
 | 
				
			||||||
 | 
					                    ISheet sheet = workbook.CreateSheet($"{b.full_name}歷史資料");
 | 
				
			||||||
                    int RowPosition = 0;
 | 
					                    int RowPosition = 0;
 | 
				
			||||||
                    #region set cell
 | 
					                    #region set cell
 | 
				
			||||||
                    IRow row = sheet.CreateRow(RowPosition);
 | 
					                    IRow row = sheet.CreateRow(RowPosition);
 | 
				
			||||||
@ -133,9 +245,9 @@ namespace FrontendWebApi.ApiControllers
 | 
				
			|||||||
                    cell.CellStyle = styleLine12;
 | 
					                    cell.CellStyle = styleLine12;
 | 
				
			||||||
                    #endregion
 | 
					                    #endregion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    if (lhe.Count > 0)
 | 
					                    if (data.Count > 0)
 | 
				
			||||||
                    {
 | 
					                    {
 | 
				
			||||||
                        foreach (var he in lhe)
 | 
					                        foreach (var d in data)
 | 
				
			||||||
                        {
 | 
					                        {
 | 
				
			||||||
                            RowPosition += 1;
 | 
					                            RowPosition += 1;
 | 
				
			||||||
                            row = sheet.CreateRow(RowPosition);
 | 
					                            row = sheet.CreateRow(RowPosition);
 | 
				
			||||||
@ -144,40 +256,57 @@ namespace FrontendWebApi.ApiControllers
 | 
				
			|||||||
                                cell = row.CreateCell(i);
 | 
					                                cell = row.CreateCell(i);
 | 
				
			||||||
                                if (i == 0)
 | 
					                                if (i == 0)
 | 
				
			||||||
                                {
 | 
					                                {
 | 
				
			||||||
                                    cell.SetCellValue(he.type);
 | 
					                                    cell.SetCellValue(d.type);
 | 
				
			||||||
                                }
 | 
					                                }
 | 
				
			||||||
                                if (i == 1)
 | 
					                                if (i == 1)
 | 
				
			||||||
                                {
 | 
					                                {
 | 
				
			||||||
                                    cell.SetCellValue(he.deviceName);
 | 
					                                    cell.SetCellValue(d.deviceName);
 | 
				
			||||||
                                }
 | 
					                                }
 | 
				
			||||||
                                if (i == 2)
 | 
					                                if (i == 2)
 | 
				
			||||||
                                {
 | 
					                                {
 | 
				
			||||||
                                    cell.SetCellValue(he.value);
 | 
					                                    cell.SetCellValue(d.value);
 | 
				
			||||||
                                }
 | 
					                                }
 | 
				
			||||||
                                if (i == 3)
 | 
					                                if (i == 3)
 | 
				
			||||||
                                {
 | 
					                                {
 | 
				
			||||||
                                    cell.SetCellValue(he.timestamp.ToString("yyyy-MM-dd HH:mm") + ":00");//
 | 
					                                    cell.SetCellValue(d.timestamp.ToString("yyyy-MM-dd HH:mm") + ":00");//
 | 
				
			||||||
                                }
 | 
					                                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                                cell.CellStyle = style12;
 | 
					                                cell.CellStyle = style12;
 | 
				
			||||||
                            }
 | 
					                            }
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
 | 
					 | 
				
			||||||
                    workbook.Write(fs);
 | 
					 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                apiResult.Code = "0000";
 | 
					                
 | 
				
			||||||
                apiResult.Data = "history/" + fileName;
 | 
					                
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                //using (var fs = new FileStream(Path.Combine(filePath, fileName), FileMode.Create, FileAccess.Write))
 | 
				
			||||||
 | 
					                //{
 | 
				
			||||||
 | 
					                    //workbook.Write(fs);
 | 
				
			||||||
 | 
					                    
 | 
				
			||||||
 | 
					                //}
 | 
				
			||||||
 | 
					                #endregion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                //apiResult.Code = "0000";
 | 
				
			||||||
 | 
					                //apiResult.Data = "history/" + fileName;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            catch (Exception exception)
 | 
					            catch (Exception exception)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                apiResult.Code = "9999";
 | 
					                apiResult.Code = "9999";
 | 
				
			||||||
                apiResult.Msg = "系統內部錯誤,請聯絡管理者。 Msg: " + exception.Message;
 | 
					                apiResult.Msg = "系統內部錯誤,請聯絡管理者。 Msg: " + exception.Message;
 | 
				
			||||||
                Logger.LogError("【" + controllerName + "/" + actionName + "】" + exception.Message);
 | 
					                Logger.LogError("【" + controllerName + "/" + actionName + "】" + exception.Message);
 | 
				
			||||||
                return Ok(apiResult);
 | 
					                throw exception;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            return Ok(apiResult);
 | 
					
 | 
				
			||||||
 | 
					            var ms = new NpoiMemoryStream
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                AllowClose = false
 | 
				
			||||||
 | 
					            };
 | 
				
			||||||
 | 
					            workbook.Write(ms);
 | 
				
			||||||
 | 
					            ms.Flush();
 | 
				
			||||||
 | 
					            ms.Seek(0, SeekOrigin.Begin);
 | 
				
			||||||
 | 
					            Response.Headers.Add("Access-Control-Expose-Headers", "Content-Disposition");
 | 
				
			||||||
 | 
					            return File(ms, "application/vnd.ms-excel", fileName);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /// <summary>
 | 
					        /// <summary>
 | 
				
			||||||
@ -1204,5 +1333,160 @@ namespace FrontendWebApi.ApiControllers
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
            return Ok(apiResult);
 | 
					            return Ok(apiResult);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        private List<Dictionary<string, object>> ArrangeRawData(DeviceNumberPoint deviceNumberPoint, JObject jsonResult)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            List<Dictionary<string, object>> arrangeRawDatas = new List<Dictionary<string, object>>();
 | 
				
			||||||
 | 
					            var histories = jsonResult["obj"]["list"]["obj"];
 | 
				
			||||||
 | 
					            var rawdateCount = Convert.ToInt32(jsonResult["obj"]["int"]["@val"].ToString());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (rawdateCount == 0)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                return null;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (histories != null && histories.HasValues)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                if (rawdateCount > 1)
 | 
				
			||||||
 | 
					                {   //多筆資料
 | 
				
			||||||
 | 
					                    foreach (var history in histories)
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        Dictionary<string, object> arrangeRawData = new Dictionary<string, object>();
 | 
				
			||||||
 | 
					                        arrangeRawData.Add("@device_number", deviceNumberPoint.DeviceNumber);
 | 
				
			||||||
 | 
					                        arrangeRawData.Add("@point", deviceNumberPoint.Point);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        //時間
 | 
				
			||||||
 | 
					                        if (history["abstime"] != null && history["abstime"].HasValues)
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            foreach (var abstime in history["abstime"])
 | 
				
			||||||
 | 
					                            {
 | 
				
			||||||
 | 
					                                var name = abstime["@name"].ToString();
 | 
				
			||||||
 | 
					                                switch (name)
 | 
				
			||||||
 | 
					                                {
 | 
				
			||||||
 | 
					                                    case "start":
 | 
				
			||||||
 | 
					                                        var startTimstamp = Convert.ToDateTime(abstime["@val"].ToString()).ToString("yyyy-MM-dd HH:mm:ss");
 | 
				
			||||||
 | 
					                                        arrangeRawData.Add("@start_timestamp", startTimstamp);
 | 
				
			||||||
 | 
					                                        break;
 | 
				
			||||||
 | 
					                                    case "end":
 | 
				
			||||||
 | 
					                                        var endTimstamp = Convert.ToDateTime(abstime["@val"].ToString()).ToString("yyyy-MM-dd HH:mm:ss");
 | 
				
			||||||
 | 
					                                        arrangeRawData.Add("@end_timestamp", endTimstamp);
 | 
				
			||||||
 | 
					                                        break;
 | 
				
			||||||
 | 
					                                }
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        //區間內資料筆數
 | 
				
			||||||
 | 
					                        if (history["int"] != null && history["int"].HasValues)
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            var count = Convert.ToInt32(history["int"]["@val"].ToString());
 | 
				
			||||||
 | 
					                            arrangeRawData.Add("@count_rawdata", count);
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        //整合數值(最大、最小、平均、總和)
 | 
				
			||||||
 | 
					                        if (history["real"] != null && history["real"].HasValues)
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            foreach (var real in history["real"])
 | 
				
			||||||
 | 
					                            {
 | 
				
			||||||
 | 
					                                var name = real["@name"].ToString();
 | 
				
			||||||
 | 
					                                switch (name)
 | 
				
			||||||
 | 
					                                {
 | 
				
			||||||
 | 
					                                    case "min":
 | 
				
			||||||
 | 
					                                        var min = Convert.ToDecimal(real["@val"].ToString());
 | 
				
			||||||
 | 
					                                        arrangeRawData.Add("@min_rawdata", min);
 | 
				
			||||||
 | 
					                                        break;
 | 
				
			||||||
 | 
					                                    case "max":
 | 
				
			||||||
 | 
					                                        var max = Convert.ToDecimal(real["@val"].ToString());
 | 
				
			||||||
 | 
					                                        arrangeRawData.Add("@max_rawdata", max);
 | 
				
			||||||
 | 
					                                        break;
 | 
				
			||||||
 | 
					                                    case "avg":
 | 
				
			||||||
 | 
					                                        var avg = Convert.ToDecimal(real["@val"].ToString());
 | 
				
			||||||
 | 
					                                        arrangeRawData.Add("@avg_rawdata", avg);
 | 
				
			||||||
 | 
					                                        break;
 | 
				
			||||||
 | 
					                                    case "sum":
 | 
				
			||||||
 | 
					                                        var sum = Decimal.Parse(real["@val"].ToString(), System.Globalization.NumberStyles.Float);
 | 
				
			||||||
 | 
					                                        arrangeRawData.Add("@sum_rawdata", sum);
 | 
				
			||||||
 | 
					                                        break;
 | 
				
			||||||
 | 
					                                }
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                        arrangeRawData.Add("@is_complete", 1);
 | 
				
			||||||
 | 
					                        arrangeRawData.Add("@repeat_times", 0);
 | 
				
			||||||
 | 
					                        arrangeRawData.Add("@fail_reason", null);
 | 
				
			||||||
 | 
					                        arrangeRawData.Add("@updated_at", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        arrangeRawDatas.Add(arrangeRawData);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                else
 | 
				
			||||||
 | 
					                {   //單筆資料
 | 
				
			||||||
 | 
					                    Dictionary<string, object> arrangeRawData = new Dictionary<string, object>();
 | 
				
			||||||
 | 
					                    arrangeRawData.Add("@device_number", deviceNumberPoint.DeviceNumber);
 | 
				
			||||||
 | 
					                    arrangeRawData.Add("@point", deviceNumberPoint.Point);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    //時間
 | 
				
			||||||
 | 
					                    if (histories["obj"]["abstime"] != null && histories["obj"]["abstime"].HasValues)
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        foreach (var abstime in histories["obj"]["abstime"])
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            var name = abstime["@name"].ToString();
 | 
				
			||||||
 | 
					                            switch (name)
 | 
				
			||||||
 | 
					                            {
 | 
				
			||||||
 | 
					                                case "start":
 | 
				
			||||||
 | 
					                                    var startTimstamp = Convert.ToDateTime(abstime["@val"].ToString()).ToString("yyyy-MM-dd HH:mm:ss");
 | 
				
			||||||
 | 
					                                    arrangeRawData.Add("@start_timestamp", startTimstamp);
 | 
				
			||||||
 | 
					                                    break;
 | 
				
			||||||
 | 
					                                case "end":
 | 
				
			||||||
 | 
					                                    var endTimstamp = Convert.ToDateTime(abstime["@val"].ToString()).ToString("yyyy-MM-dd HH:mm:ss");
 | 
				
			||||||
 | 
					                                    arrangeRawData.Add("@end_timestamp", endTimstamp);
 | 
				
			||||||
 | 
					                                    break;
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    //區間內資料筆數
 | 
				
			||||||
 | 
					                    if (histories["obj"]["int"] != null && histories["obj"]["int"].HasValues)
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        var count = Convert.ToInt32(histories["obj"]["int"]["@val"].ToString());
 | 
				
			||||||
 | 
					                        arrangeRawData.Add("@count_rawdata", count);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    //整合數值(最大、最小、平均、總和)
 | 
				
			||||||
 | 
					                    if (histories["obj"]["real"] != null && histories["obj"]["real"].HasValues)
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        foreach (var real in histories["obj"]["real"])
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            var name = real["@name"].ToString();
 | 
				
			||||||
 | 
					                            switch (name)
 | 
				
			||||||
 | 
					                            {
 | 
				
			||||||
 | 
					                                case "min":
 | 
				
			||||||
 | 
					                                    var min = Convert.ToDecimal(real["@val"].ToString());
 | 
				
			||||||
 | 
					                                    arrangeRawData.Add("@min_rawdata", min);
 | 
				
			||||||
 | 
					                                    break;
 | 
				
			||||||
 | 
					                                case "max":
 | 
				
			||||||
 | 
					                                    var max = Convert.ToDecimal(real["@val"].ToString());
 | 
				
			||||||
 | 
					                                    arrangeRawData.Add("@max_rawdata", max);
 | 
				
			||||||
 | 
					                                    break;
 | 
				
			||||||
 | 
					                                case "avg":
 | 
				
			||||||
 | 
					                                    var avg = Convert.ToDecimal(real["@val"].ToString());
 | 
				
			||||||
 | 
					                                    arrangeRawData.Add("@avg_rawdata", avg);
 | 
				
			||||||
 | 
					                                    break;
 | 
				
			||||||
 | 
					                                case "sum":
 | 
				
			||||||
 | 
					                                    var sum = Decimal.Parse(real["@val"].ToString(), System.Globalization.NumberStyles.Float);
 | 
				
			||||||
 | 
					                                    arrangeRawData.Add("@sum_rawdata", sum);
 | 
				
			||||||
 | 
					                                    break;
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    arrangeRawData.Add("@is_complete", 1);
 | 
				
			||||||
 | 
					                    arrangeRawData.Add("@repeat_times", 0);
 | 
				
			||||||
 | 
					                    arrangeRawData.Add("@fail_reason", null);
 | 
				
			||||||
 | 
					                    arrangeRawData.Add("@updated_at", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    arrangeRawDatas.Add(arrangeRawData);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            return arrangeRawDatas;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -462,11 +462,11 @@ namespace FrontendWebApi.ApiControllers
 | 
				
			|||||||
            #endregion
 | 
					            #endregion
 | 
				
			||||||
            foreach (var r in result)
 | 
					            foreach (var r in result)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                string buildingName = r.Select(x => x.building_name).FirstOrDefault();
 | 
					                if (r.Count > 0)
 | 
				
			||||||
                var sheet = workbook.CreateSheet($"{buildingName}電表報表");
 | 
					 | 
				
			||||||
                int RowPosition = 0;
 | 
					 | 
				
			||||||
                if (result.Count > 0)
 | 
					 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
 | 
					                    string buildingName = r.Select(x => x.building_name).FirstOrDefault();
 | 
				
			||||||
 | 
					                    var sheet = workbook.CreateSheet($"{buildingName}電表報表");
 | 
				
			||||||
 | 
					                    int RowPosition = 0;
 | 
				
			||||||
                    #region set cell
 | 
					                    #region set cell
 | 
				
			||||||
                    IRow row = sheet.CreateRow(RowPosition);
 | 
					                    IRow row = sheet.CreateRow(RowPosition);
 | 
				
			||||||
                    sheet.SetColumnWidth(0, 4 * 160 * 12);
 | 
					                    sheet.SetColumnWidth(0, 4 * 160 * 12);
 | 
				
			||||||
 | 
				
			|||||||
@ -1,4 +1,5 @@
 | 
				
			|||||||
using System;
 | 
					using Newtonsoft.Json.Linq;
 | 
				
			||||||
 | 
					using System;
 | 
				
			||||||
using System.Collections.Generic;
 | 
					using System.Collections.Generic;
 | 
				
			||||||
using System.Linq;
 | 
					using System.Linq;
 | 
				
			||||||
using System.Threading.Tasks;
 | 
					using System.Threading.Tasks;
 | 
				
			||||||
@ -297,6 +298,7 @@ namespace FrontendWebApi.Models
 | 
				
			|||||||
        public DateTime? endtime { get; set; }
 | 
					        public DateTime? endtime { get; set; }
 | 
				
			||||||
        public string dateType { get; set; }
 | 
					        public string dateType { get; set; }
 | 
				
			||||||
        public string type { get; set; }
 | 
					        public string type { get; set; }
 | 
				
			||||||
 | 
					        public string building_tag { get; set; }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public class History_Building
 | 
					    public class History_Building
 | 
				
			||||||
@ -305,4 +307,43 @@ namespace FrontendWebApi.Models
 | 
				
			|||||||
        public string building_name { get; set; }
 | 
					        public string building_name { get; set; }
 | 
				
			||||||
        public List<History_Main_system> history_Main_Systems { get; set; }
 | 
					        public List<History_Main_system> history_Main_Systems { get; set; }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public class DeviceNumberPoint
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        public string DeviceNumber { get; set; }
 | 
				
			||||||
 | 
					        public string Point { get; set; }
 | 
				
			||||||
 | 
					        public string FullDeviceNumberPoint { get; set; }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    public class BuildStation
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        public string system_value { get; set; }
 | 
				
			||||||
 | 
					        public string system_key { get; set; }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public class Device_item : Actor
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        public int id { get; set; }
 | 
				
			||||||
 | 
					        public string device_item_guid { get; set; }
 | 
				
			||||||
 | 
					        public string device_area_tag { get; set; }
 | 
				
			||||||
 | 
					        public string device_building_tag { get; set; }
 | 
				
			||||||
 | 
					        public string device_system_tag { get; set; }
 | 
				
			||||||
 | 
					        public string device_name_tag { get; set; }
 | 
				
			||||||
 | 
					        public string full_name { get; set; }
 | 
				
			||||||
 | 
					        public string points { get; set; }
 | 
				
			||||||
 | 
					        public string unit { get; set; }
 | 
				
			||||||
 | 
					        public byte is_show { get; set; }
 | 
				
			||||||
 | 
					        public byte is_show_riserDiagram { get; set; }
 | 
				
			||||||
 | 
					        public byte is_controll { get; set; }
 | 
				
			||||||
 | 
					        public byte is_bool { get; set; }
 | 
				
			||||||
 | 
					        public byte is_link { get; set; }
 | 
				
			||||||
 | 
					        public int is_show_history { get; set; }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public class JsonDevice
 | 
				
			||||||
 | 
					    { 
 | 
				
			||||||
 | 
					        public DeviceNumberPoint deviceNumberPoint { get; set; }
 | 
				
			||||||
 | 
					        public JObject json { get; set; }
 | 
				
			||||||
 | 
					        public string building_tag { get; set; }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										
											BIN
										
									
								
								FrontendWebApi/wwwroot/excel/history/歷史資料_2023-06-29.xlsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								FrontendWebApi/wwwroot/excel/history/歷史資料_2023-06-29.xlsx
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
		Loading…
	
		Reference in New Issue
	
	Block a user