227 lines
6.3 KiB
JavaScript
227 lines
6.3 KiB
JavaScript
var app = getApp()
|
|
|
|
Page({
|
|
data: {
|
|
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)
|
|
this.setData({
|
|
items: app.globalData.items,
|
|
filterMonth: month,
|
|
filterYear: year,
|
|
customStart: month,
|
|
customEnd: month
|
|
})
|
|
this.refreshData()
|
|
},
|
|
|
|
onShow: function () {
|
|
var items = app.globalData.items
|
|
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 records = app.globalData.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
|
|
app.globalData.records = app.globalData.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
|
|
|
|
app.globalData.records = app.globalData.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
|
|
app.globalData.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
|
|
}
|
|
})
|