文件
chengduzhongchuliang/public/assets/js/backend/forecast.js

127 行
7.4 KiB
JavaScript

define(['jquery', 'bootstrap', 'backend', 'backend/forecast/components'], function ($, undefined, Backend, components) {
'use strict';
return { index: function () {
new Vue({
el: '#forecast-app',
components: {'forecast-list': components.list, 'forecast-create': components.create, 'forecast-detail': components.detail},
data: { rows: [], granaries: [], total: 0, page: 1, gid: '', site: '', siteOptions: Config.granarySites || [], loading: false, saving: false, creating: false, editing: false, editData: null, viewing: false, selected: null, loadSequence: 0 },
created: function () { this.load(); },
methods: {
api: function (action, data, method) {
var self = this;
return new Promise(function (resolve, reject) {
$.ajax({url: 'forecast/' + action, type: method || 'GET', data: data || {}, dataType: 'json', timeout: 45000,
success: function (res) {
if (res.code !== 200) { self.$message.error(res.msg || '操作失败,请刷新后重试'); reject(new Error(res.msg)); }
else resolve(res);
},
error: function () { self.$message.error('请求失败或登录已失效,请刷新查看记录后重试'); reject(new Error('request failed')); }
});
});
},
load: function () {
var self = this, sequence = ++this.loadSequence;
this.loading = true;
return this.api('index', {gid: this.gid, site: this.site, page: this.page}).then(function (res) {
if (sequence !== self.loadSequence) return;
self.rows = res.list; self.total = res.total; self.granaries = res.granaries;
}).catch(function () {}).then(function () { if (sequence === self.loadSequence) self.loading = false; });
},
siteChanged: function () { this.gid = ''; this.page = 1; this.load(); },
filterChanged: function () { this.page = 1; this.load(); },
changePage: function (page) { this.page = page; this.load(); },
newRecord: function () { this.creating = true; },
closeCreate: function (done) { if (!this.saving) { this.creating = false; if (typeof done === 'function') done(); } },
editRecord: function (row) {
var self = this;
this.api('detail', {id: row.id}).then(function (res) {
var d = res.data;
var horizons = (d.points || []).map(function (p) { return Number(p.horizon); });
self.editData = {
id: d.id,
gid: d.gid,
observed_date: d.observed_date,
horizons: horizons.length ? horizons : [7, 15, 30, 60],
tm_i: d.tm_i,
hm_i: d.hm_i,
tm_o: d.tm_o,
hm_o: d.hm_o
};
self.editing = true;
}).catch(function () {});
},
closeEdit: function (done) { if (!this.saving) { this.editing = false; this.editData = null; if (typeof done === 'function') done(); } },
closeDetail: function (done) {
var self = this;
if (this.saving) return;
this.$refs.detail.confirmDiscard().then(function () { self.viewing = false; if (typeof done === 'function') done(); }).catch(function () {});
},
openRecord: function (id) {
var self = this;
this.api('detail', {id: id}).then(function (res) { self.selected = res.data; self.viewing = true; }).catch(function () {});
},
deleteRecord: function (row) {
var self = this;
if (this.saving) return;
this.$confirm('确定要删除【' + (row.granary_name || '') + ' · ' + (row.observed_date || '') + '】的温湿度预测记录吗?删除后关联周期的预测与实测值将一并移除且不可恢复。', '删除记录确认', {
confirmButtonText: '确定删除',
cancelButtonText: '取消',
type: 'warning'
}).then(function () {
self.saving = true;
self.api('dell', {id: row.id}, 'POST').then(function () {
self.$message.success('删除成功');
if (self.viewing && self.selected && self.selected.id === row.id) {
self.viewing = false;
self.selected = null;
}
self.load();
}).catch(function () {}).then(function () {
self.saving = false;
});
}).catch(function () {});
},
deleteFromDetail: function () {
if (this.selected) {
this.deleteRecord(this.selected);
}
},
editFromDetail: function () {
var self = this;
if (this.selected) {
var rec = this.selected;
this.closeDetail(function () {
self.editRecord(rec);
});
}
},
write: function (action, data, callback) {
if (this.saving) return;
var self = this;
this.saving = true;
this.api(action, data, 'POST').then(function (res) {
self.selected = res.data;
if (action !== 'actual' && res.data.status === 'failed') self.$message.warning('温湿度已保存,算法暂不可用,可稍后重新生成');
else self.$message.success(action === 'actual' ? '实测值已保存' : action === 'edit' ? '修改成功并已更新预测' : res.data.status === 'ready' ? '预测已生成并保存' : '记录已保存');
if (callback) callback();
self.load();
}).catch(function () {}).then(function () { self.saving = false; });
},
createRecord: function (form) {
var self = this;
this.write('add', form, function () { self.creating = false; self.viewing = true; });
},
updateRecord: function (form) {
var self = this;
this.write('edit', form, function () { self.editing = false; self.editData = null; self.viewing = true; });
},
saveActual: function (form) { this.write('actual', form); },
retry: function (id) {
var self = this;
this.$refs.detail.confirmDiscard().then(function () { self.write('retry', {id: id}); }).catch(function () {});
}
}
});
} };
});