var RealtimePanel = function (parent) { this.Parent = parent; this.ResultList = new ResultList(this, '#realtime-result-list'); this.TaskInfo = null; this.TaskStateCheckTimer = null; this.isDecimal = true; this.PullGroundData = null; this.PreValues = { Longitude: 0, Latitude: 0, Height: 0 }; this.Startup = function () { this.ResultList.Startup(); this.InitReleaseTime(); this.InputChange(); this.OnFileOnchange('#param-upload'); this.OnFileOnchange('#file-input'); $('#calc-btn').on('click', this.OnCalcButtonClick.bind(this)); $('#reset-btn').on('click', this.OnResetButtonClick.bind(this)); $('#add-label').on('click', this.OnAddLabelButtonClick.bind(this)); $('#control-switch a').on('click', this.OnSwitchButtonClick.bind(this)); $('.type-select span').on('click', this.OnTypeSelectClick.bind(this)); }; this.InitReleaseTime = function () { $('#release-date').datetimebox({ panelWidth: 190, panelHeight: 230, panelAlign: 'right', showSeconds: false, currentText: '现在' }); }; this.OnSwitchButtonClick = function (event) { if ($(event.target).is('a')) $(event.target).parent().toggleClass('control-switch-on'); else $(event.target).toggleClass('control-switch-on'); let isPullDown = $("#control-switch").hasClass("control-switch-on"); this.Parent.Map.IsPullGround(isPullDown); }; this.SwitchValues = function (isPullDown) { let longitude = $('#longitude').val(); let latitude = $('#latitude').val(); let height = $('#height').val(); if (isPullDown) { var data = this.PullGroundData[this.PullGroundData.length - 1]; $('#longitude').val(data[0]); $('#latitude').val(data[1]); $('#height').val(data[2]); } else { $('#longitude').val(this.PreValues.Longitude); $('#latitude').val(this.PreValues.Latitude); $('#height').val(this.PreValues.Height); } this.PreValues.Longitude = longitude; this.PreValues.Latitude = latitude; this.PreValues.Height = height; }; this.OnFileOnchange = function (id) { var uploader = $(id); uploader.fileinput({ language: 'zh', uploadUrl: '/Beijing/UploadFile', showUpload: false, showRemove: false, showCancel: false, showCaption: false, showPreview: false, uploadClass: "btn btn-primary" }); uploader.on('change', function (event) { uploader.fileinput("upload"); $('.kv-upload-progress').hide(); }); if (id === '#param-upload') { uploader.on('fileuploaded', function (event, data, previewId, index) { this.Parent.Map.ClearLiveLayer('compare-layer'); var pullGroundData = []; $(data.response).each(function (index, point) { pullGroundData.push([point.Longitude, point.Latitude, point.Height, moment(point.DateTime).format("YYYYMMDD_HHmmss")]); }.bind(this)); console.log(pullGroundData); this.PullGroundData = pullGroundData; var value = this.PullGroundData[this.PullGroundData.length - 1]; var time = moment(value[3], "YYYYMMDD_HHmmss"); var type = $('.type-select span.active').attr('type'); if (type === 'decimal') { $('#longitude').val(value[0]); $('#latitude').val(value[1]); } else { $('#lng-degree').val(this.getLngLatDecimal(value[0]).degree); $('#lng-minute').val(this.getLngLatDecimal(value[0]).minute); $('#lng-second').val(this.getLngLatDecimal(value[0]).second.toFixed(2)); $('#lat-degree').val(this.getLngLatDecimal(value[1]).degree); $('#lat-minute').val(this.getLngLatDecimal(value[1]).minute); $('#lat-second').val(this.getLngLatDecimal(value[1]).second.toFixed(2)); } $('#height').val(value[2]); $("#release-date").datetimebox('setValue', moment(time).format('YYYY/MM/DD HH:mm')); }.bind(this)); } else { uploader.on('fileuploaded', function (event, data, previewId, index) { var marks = []; var newArray = []; data.response.forEach(function (item, index) { marks.push(item.Longitude, item.Latitude, moment(item.DateTime).format("YYYYMMDD_HHmmss")); }); $(data.response).each(function (index, point) { newArray.push([point.Longitude, point.Latitude, point.Height, moment(point.DateTime).format("YYYYMMDD_HHmmss")]); }); this.PullGroundData = newArray; this.Parent.Map.LoadRealTimeData('compare-layer', newArray); }.bind(this)); } $('.hidden-xs').text('上传...'); $('.hidden-xs').addClass('realtime-btn'); $('.hidden-xs').css({ 'marginLeft': '-2px', 'position': 'absolute', 'text-align': 'center', 'float': 'left' }); $('.file-input').css({ 'width': '86px', 'float': 'left' }); $('.live-file .hidden-xs').text('实况数据...'); }; this.OnCalcButtonClick = function () { // Close details this.ResultList.Reset(); // Prepare task info this.TaskInfo = { Id: this.CreateId(), Result: null, CreateTime: new Date() }; // Submit task if (Config.InProductionMode) this.SubmitTask(this.TaskInfo.Id); else this.SubmitTest(this.TaskInfo.Id, 39.917, 116.405); }; this.OnResetButtonClick = function () { this.Reboot('success', null); }; this.OnAddLabelButtonClick = function () { var value = $('#label-input').val().trim(); if (value.length === 0) return; $.ajax({ type: "POST", dataType: 'json', data: { userId: parseInt($('#user-info').attr('userid')), taskId: this.TaskInfo.Id, name: value }, url: '/Beijing/AddTag', success: function (result) { var label = $('{1}'.format(result, value)); label.on('click', this.SetActiveLabel.bind(this)); label.find('.clear-btn').on('click', this.RemoveLabel.bind(this)); $('#realtime-slider').find('.label-list:first').append(label); this.Relayout(); }.bind(this) }); }; this.CheckTaskState = function () { $.ajax({ type: "GET", dataType: 'json', url: this.getCheckUrl(this.TaskInfo.Id), success: function (result) { this.TaskInfo.Result = result; if (result.code === 200) { this.AddTask(this.TaskInfo.Id); this.LoadData(result); this.TaskStopped(); } else if (this.IsTaskTimeout()) { this.Reboot("error", "任务计算已超时,请重新提交计算。"); this.TaskStopped(); } }.bind(this) }); }; this.getCheckUrl = function (taskId) { if (Config.InProductionMode) return 'http://{0}/bj/check?num={1}'.format(Config.ApiRoot, taskId); else return '/Content/json/beijing/check.json'.format(taskId); }; this.getJsonUrl = function (taskId) { if (Config.InProductionMode) return "http://{0}/bj/getresult/{1}.json".format(Config.ApiRoot, taskId); else return '/Content/json/beijing/{0}.json'.format(taskId); }; this.LoadData = function (result) { $.getJSON(this.getJsonUrl(result.num), function (data) { var param = this.GetTaskParams(this.TaskInfo.Id); this.Parent.Map.LoadAverageData('realtime-layer', { ReleaseTime: param.releaseTime, Longitude: param.longitude, Latitude: param.latitude, Height: param.height }, data); this.Parent.Map.GetTargetPolygon(data); this.Parent.Map.SetForecastData(data); this.ResultList.SetData('realtime-layer', [param.latitude, param.longitude], data); }.bind(this)); }; this.Reboot = function (type, text) { $.ajax({ type: "GET", dataType: 'json', url: 'http://{0}/bj/reboot'.format(Config.ApiRoot), success: function (data) { this.MessageBox(type, text !== null ? text : data.info); }.bind(this) }); }; this.TaskStarted = function (taskId) { this.TaskStateCheckTimer = setInterval(this.CheckTaskState.bind(this), 10000); $('#task-id-span').text(taskId); $('.shade').show(); }; this.TaskStopped = function () { clearInterval(this.TaskStateCheckTimer); $('.shade').hide(); }; this.CreateId = function () { var time = this.GetReleaseTime(); time = time.replace(new RegExp('-', 'g'), ""); var now = new Date(); return time + now.getMilliseconds(); }; this.IsTaskTimeout = function () { var fromTime = this.TaskInfo.CreateTime.getTime(); var toTime = (new Date).getTime(); var seconds = (toTime - fromTime) / 1000; return seconds > 600; }; this.GetCalcPramas = function (taskId) { var type = $('.type-select span.active').attr('type'); var lngDegree = $('#lng-degree').val(); var lngMinute = $('#lng-minute').val(); var lngSecond = $('#lng-second').val(); var latDegree = $('#lat-degree').val(); var latMinute = $('#lat-minute').val(); var latSecond = $('#lat-second').val(); return { lon: type === 'decimal' ? $('#longitude').val() : this.getLngLatDegree(lngDegree, lngMinute, lngSecond), lat: type === 'decimal' ? $('#latitude').val() : this.getLngLatDegree(latDegree, latMinute, latSecond), num: taskId, hgt: $('#height').val(), rlen: $('#time-length-input').val(), tlen: $('#interval-length-input').val(), rlen2: $('#spread-length-input').val(), tlen2: $('#interval-spread-input').val(), tpoint: this.GetReleaseTime(), pullGround: $("#control-switch").hasClass("control-switch-on") ? 1 : -1 }; }; this.getLngLatDegree = function (degree, minute, second) { var str = parseFloat(minute) + parseFloat(second / 60); var value = parseFloat(str / 60) + parseFloat(degree); return value.toFixed(6); }; this.getLngLatDecimal = function (value) { var text = value.split("."); var degree = text[0]; var temp = "0." + text[1]; temp = String(temp * 60); var str = temp.split("."); var minute = str[0]; temp = "0." + str[1]; temp = temp * 60; var second = temp; return { degree: degree, minute: minute, second: second }; }; this.GetTaskParams = function (taskId) { var type = $('.type-select span.active').attr('type'); var lngDegree = $('#lng-degree').val(); var lngMinute = $('#lng-minute').val(); var lngSecond = $('#lng-second').val(); var latDegree = $('#lat-degree').val(); var latMinute = $('#lat-minute').val(); var latSecond = $('#lat-second').val(); return { taskId: taskId, region: 'bj', longitude: type === 'decimal' ? $('#longitude').val() : this.getLngLatDegree(lngDegree, lngMinute, lngSecond), latitude: type === 'decimal' ? $('#latitude').val() : this.getLngLatDegree(latDegree, latMinute, latSecond), height: $('#height').val(), simulatedDuration: $('#time-length-input').val(), simulatedInterval: $('#interval-length-input').val(), releaseTime: $("#release-date").datetimebox('getValue'), resultState: this.TaskInfo.Result.code, resultMessage: this.TaskInfo.Result.code === '200' ? '成功' : this.TaskInfo.Result.info }; }; this.GetReleaseTime = function () { var time = $('#release-date').datetimebox('getValue'); return moment(time, 'YYYY/MM/DD HH:mm').format('YYYY-MM-DD-HH-mm'); }; this.SubmitTask = function (taskId) { var params = this.GetCalcPramas(taskId); var partten = 'http://{0}/bj/{1}?lon={2}&lat={3}&num={4}&hgt={5}&rlen={6}&tlen={7}&tpoint={8}&rlen2={9}&tlen2={10}&fac={11}'; var url = partten.format(Config.ApiRoot, 'backward', params.lon, params.lat, params.num, params.hgt, params.rlen, params.tlen, params.tpoint, params.rlen2, params.tlen2, params.pullGround); $.ajax({ type: "GET", dataType: 'json', url: url, beforeSend: function () { this.Parent.Map.CenterMap(parseFloat(params.lat), parseFloat(params.lon)); this.TaskStarted(taskId); }.bind(this), success: function (result) { this.TaskStopped(); this.MessageBox("warning", result.info); }.bind(this), complete: function () { $('.param-label').removeClass('label-shade'); }.bind(this) }); }; this.SubmitTest = function (taskId, lat, lon) { $.ajax({ type: "GET", dataType: 'json', url: this.getCheckUrl(taskId), success: function (result) { this.TaskInfo.Id = taskId; this.TaskInfo.Result = result; this.Parent.Map.CenterMap(lat, lon); this.AddTask(this.TaskInfo.Id); this.LoadData(result); }.bind(this) }); }; this.AddTask = function (taskId) { $.ajax({ type: "POST", dataType: 'json', url: '/Beijing/AddTask', data: this.GetTaskParams(taskId), success: function (result) { this.Parent.HistoryPanel.InitDateTimes(); this.Parent.HistoryPanel.ReloadDataGrid(); }.bind(this) }); }; this.MessageBox = function (type, text) { swal({ title: "", text: text, type: type, icon: type, showCancelButton: false, confirmButtonText: "确定", closeOnConfirm: true }); }; this.SetActiveLabel = function (event) { $(event.target).toggleClass('active'); }; this.RemoveLabel = function (event) { if ($(event.target).parent().is('a')) $(event.target).parent().remove(); else $(event.target).parents('a').remove(); this.Relayout(); }; this.Relayout = function () { var windowHeight = $(window).height(); var labelHeight = $('#realtime-slider').find('.label-list:first').height(); var resultList = $('#realtime-result-list'); resultList.find('.calc-list ul').height(windowHeight - labelHeight - (this.isDecimal ? 742 : 790)); }; this.OnTypeSelectClick = function (event) { $('.type-select span').removeClass("active"); $(event.target).addClass("active"); if ($(event.target).attr('type') === 'decimal') { this.isDecimal = true; this.Relayout(); $('#lng-decimal').show(); $('#lat-decimal').show(); $('#lng-degrees').hide(); $('#lat-degrees').hide(); $('.degree-text').hide(); } else { this.isDecimal = false; this.Relayout(); $('#lng-decimal').hide(); $('#lat-decimal').hide(); $('#lng-degrees').show(); $('#lat-degrees').show(); $('.degree-text').show(); } }; this.InputChange = function () { $('#lng-degree').on('change', this.checkInput.bind(this, $('#lng-minute'), $('#lng-second'), 180)); $('#lng-minute').on('change', this.checkInput.bind(this, $('#lng-degree'), $('#lng-second'), 60)); $('#lng-second').on('change', this.checkInput.bind(this, $('#lng-degree'), $('#lng-minute'), 60)); $('#lat-degree').on('change', this.checkInput.bind(this, $('#lat-minute'), $('#lng-second'), 180)); $('#lat-minute').on('change', this.checkInput.bind(this, $('#lat-degree'), $('#lng-second'), 60)); $('#lat-second').on('change', this.checkInput.bind(this, $('#lat-degree'), $('#lng-minute'), 60)); }; this.checkInput = function (value1, value2, maxNumber, event) { $('#lng-degree-text').text(''); $('#lng-degree-text').removeClass('degree-text-error'); if ($(event.target).val().trim() === '' || value1.val().trim() === '' || value2.val().trim() === '' || $(event.target).val() > maxNumber || $(event.target).val() < 0) { $('#lng-degree-text').text('请输入正确的值。'); $('#lng-degree-text').addClass('degree-text-error'); return; } if ($(event.target).attr('id') === 'lng-degree') $('#lng-degree-text').text(this.getLngLatDegree($(event.target).val(), value1.val(), value2.val())); else if ($(event.target).attr('id') === 'lng-minute') $('#lng-degree-text').text(this.getLngLatDegree(value1.val(), $(event.target).val(), value2.val())); else if ($(event.target).attr('id') === 'lng-second') $('#lng-degree-text').text(this.getLngLatDegree(value1.val(), value2.val(), $(event.target).val())); else if ($(event.target).attr('id') === 'lat-degree') $('#lng-degree-text').text(this.getLngLatDegree($(event.target).val(), value1.val(), value2.val())); else if ($(event.target).attr('id') === 'lat-minute') $('#lng-degree-text').text(this.getLngLatDegree(value1.val(), $(event.target).val(), value2.val())); else if ($(event.target).attr('id') === 'lat-second') $('#lng-degree-text').text(this.getLngLatDegree(value1.val(), value2.val(), $(event.target).val())); } };