weixinxiaochengxu/pages/details/details.js

240 lines
6.6 KiB
JavaScript

var app = getApp()
Page({
data: {
persons: [],
currentPersonName: "",
items: [],
viewMode: "month",
filterMonth: "",
filterYear: "",
customStart: "",
customEnd: "",
tableData: [],
showEditModal: false,
editingDate: "",
editValues: {}
},
onLoad: function () {
var today = this.formatDate(new Date(), "day")
var month = today.slice(0, 7)
var year = today.slice(0, 4)
var person = app.getCurrentPerson()
this.setData({
persons: app.globalData.persons,
currentPersonName: person ? person.name : "",
items: app.getCurrentData().items,
filterMonth: month,
filterYear: year,
customStart: month,
customEnd: month
})
this.refreshData()
},
onShow: function () {
var items = app.getCurrentData().items
var person = app.getCurrentPerson()
this.setData({
persons: app.globalData.persons,
currentPersonName: person ? person.name : ""
})
if (items.length !== this.data.items.length ||
items.some(function (v, i) { return v !== this.data.items[i] }, this)) {
this.setData({ items: items })
}
this.refreshData()
},
getDateRange: function () {
var viewMode = this.data.viewMode
var filterMonth = this.data.filterMonth
var filterYear = this.data.filterYear
var customStart = this.data.customStart
var customEnd = this.data.customEnd
var start, end, parts, y, m, sy, sm, ey, em
if (viewMode === "month") {
parts = filterMonth.split("-")
y = Number(parts[0])
m = Number(parts[1])
start = new Date(y, m - 1, 1)
end = new Date(y, m, 0)
} else if (viewMode === "year") {
y = parseInt(filterYear)
start = new Date(y, 0, 1)
end = new Date(y, 11, 31)
} else {
parts = customStart.split("-")
sy = Number(parts[0])
sm = Number(parts[1])
parts = customEnd.split("-")
ey = Number(parts[0])
em = Number(parts[1])
start = new Date(sy, sm - 1, 1)
end = new Date(ey, em, 0)
}
return { start: start, end: end }
},
refreshData: function () {
var data = app.getCurrentData()
var records = data.records
var items = this.data.items
var range = this.getDateRange()
var start = range.start
var end = range.end
var inRange = function (r) {
var d = new Date(r.date + "T00:00:00")
return d >= start && d <= end
}
var filtered = records.filter(inRange)
this._filteredRecords = filtered
var dateMap = {}
filtered.forEach(function (r) {
if (!dateMap[r.date]) dateMap[r.date] = {}
if (!dateMap[r.date][r.item]) {
dateMap[r.date][r.item] = { sum: 0, count: 0 }
}
dateMap[r.date][r.item].sum += r.value
dateMap[r.date][r.item].count += 1
})
var dates = Object.keys(dateMap).sort()
var tableData = dates.map(function (d) {
var values = items.map(function (item) {
var entry = dateMap[d][item]
if (!entry) return undefined
return Math.round((entry.sum / entry.count) * 100) / 100
})
return { rowKey: d, values: values }
})
this.setData({ tableData: tableData })
},
onSwitchMode: function (e) {
var that = this
this.setData({ viewMode: e.currentTarget.dataset.mode }, function () { that.refreshData() })
},
onMonthChange: function (e) {
var that = this
this.setData({ filterMonth: e.detail.value }, function () { that.refreshData() })
},
onYearChange: function (e) {
var that = this
this.setData({ filterYear: e.detail.value }, function () { that.refreshData() })
},
onCustomStartChange: function (e) {
var that = this
this.setData({ customStart: e.detail.value }, function () { that.refreshData() })
},
onCustomEndChange: function (e) {
var that = this
this.setData({ customEnd: e.detail.value }, function () { that.refreshData() })
},
onDeleteRow: function (e) {
var dateKey = e.currentTarget.dataset.date
var that = this
wx.showModal({
title: "确认删除",
content: "删除「" + dateKey + "」的所有记录?",
confirmColor: "#e53e3e",
success: function (res) {
if (!res.confirm) return
var data = app.getCurrentData()
data.records = data.records.filter(function (r) { return r.date !== dateKey })
app.saveData()
that.refreshData()
wx.showToast({ title: "已删除", icon: "success", duration: 1000 })
}
})
},
onEditRow: function (e) {
var dateKey = e.currentTarget.dataset.date
var items = this.data.items
var editValues = {}
var records = this._filteredRecords || []
items.forEach(function (item) {
var related = records.filter(function (r) { return r.item === item && r.date === dateKey })
if (related.length > 0) {
var sum = related.reduce(function (s, r) { return s + r.value }, 0)
var avg = sum / related.length
editValues[item] = String(Math.round(avg * 100) / 100)
} else {
editValues[item] = ""
}
})
this.setData({
showEditModal: true,
editingDate: dateKey,
editValues: editValues
})
},
onEditValueInput: function (e) {
var item = e.currentTarget.dataset.item
var update = {}
update["editValues." + item] = e.detail.value
this.setData(update)
},
saveEdit: function () {
var editingDate = this.data.editingDate
var editValues = this.data.editValues
var items = this.data.items
var savedCount = 0
var that = this
var data = app.getCurrentData()
data.records = data.records.filter(function (r) { return r.date !== editingDate })
items.forEach(function (item) {
var raw = editValues[item]
if (!raw || raw.trim() === "") return
var v = parseFloat(raw)
if (isNaN(v) || v <= 0) return
data.records.push({
id: Date.now().toString(36) + Math.random().toString(36).slice(2, 6),
item: item,
date: editingDate,
value: v
})
savedCount++
})
app.saveData()
this.setData({ showEditModal: false, editingDate: "", editValues: {} }, function () {
that.refreshData()
wx.showToast({ title: "已保存 " + savedCount + " 项", icon: "success", duration: 1500 })
})
},
cancelEdit: function () {
this.setData({ showEditModal: false, editingDate: "", editValues: {} })
},
formatDate: function (d, mode) {
var y = d.getFullYear()
var m = String(d.getMonth() + 1)
if (m.length === 1) m = "0" + m
var day = String(d.getDate())
if (day.length === 1) day = "0" + day
if (mode === "year") return String(y)
if (mode === "month") return y + "-" + m
return y + "-" + m + "-" + day
}
})