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 } })