From 59f0865332f4281de8b99380c7b593eddbf482c4 Mon Sep 17 00:00:00 2001 From: niushuai233 Date: Mon, 16 Mar 2026 16:26:28 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=8A=9F=E8=83=BD=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cc/niushuai/dididone/biz/BizGlobal.java | 39 +++++++++++++++++-- .../ui/calendar/CalendarFragment.java | 7 ++++ .../ui/component/ProjectPopupView.java | 28 +++++++++---- .../ui/component/TimeNotePopupView.java | 7 ++++ 4 files changed, 70 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/cc/niushuai/dididone/biz/BizGlobal.java b/app/src/main/java/cc/niushuai/dididone/biz/BizGlobal.java index aaacf2a..5833d9d 100644 --- a/app/src/main/java/cc/niushuai/dididone/biz/BizGlobal.java +++ b/app/src/main/java/cc/niushuai/dididone/biz/BizGlobal.java @@ -26,10 +26,13 @@ import cc.niushuai.dididone.biz.roomx.DBManager; import cc.niushuai.dididone.biz.vo.ProjectCount; import cc.niushuai.dididone.util.IntSnowflake; import cc.niushuai.dididone.util.XLog; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DatePattern; +import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUtil; import io.reactivex.Flowable; import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.disposables.Disposable; import io.reactivex.schedulers.Schedulers; import kotlin.Unit; import kotlin.jvm.functions.Function1; @@ -45,8 +48,7 @@ public class BizGlobal { public static final String PROJECT_ICON_COLOR = "projectIconColor"; public static final Map CACHE_PROJECT = new HashMap<>(); public static final Map CACHE_PROJECT_COUNT = new HashMap<>(); - public static final Map CACHE_PROJECT_TODAY_COUNT = new HashMap<>(); - public static final Map> CACHE_RECORD_LIST = new HashMap<>(); + public static final Map>> CACHE_RECORD_LIST = new HashMap<>(); public static final String EMPTY_PROJECT_TIPS = "先去添加打卡项吧~"; public static final String EMPTY_PROJECT_TIPS_ICON = "cmd_alert_decagram_outline"; public static final int REQUEST_CODE_GENERAL = 1; @@ -71,11 +73,39 @@ public class BizGlobal { // 按类别区分每一个打卡项 存在多少条打卡记录 buildProjectCountCache(); + + // 全部打卡项列表 + buildAllRecordCache(); + } + + private static void buildAllRecordCache() { + Flowable> listFlowable = DBManager.INSTANCE.recordDao().listAll(); + Disposable subscribe = listFlowable.subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(records -> { + XLog.d("build all record cache size: {}", records.size()); + + if (CollUtil.isNotEmpty(records)) { + CACHE_RECORD_LIST.clear(); + for (Record record : records) { + DateTime dateTime = DateUtil.date(record.getCreateDate()); + String dateStr = dateTime.toString("yyyy-MM-dd"); + + Map> currDateMap = CACHE_RECORD_LIST.getOrDefault(dateStr, new HashMap<>()); + List currDateList = currDateMap.getOrDefault(record.getProjectId(), new ArrayList<>()); + currDateList.add(record); + currDateMap.put(record.getProjectId(), currDateList); + + CACHE_RECORD_LIST.put(dateStr, currDateMap); + } + } + XLog.d("build record cache size: {}", CACHE_RECORD_LIST.size()); + }); } private static void buildProjectCountCache() { Flowable> listFlowable = DBManager.INSTANCE.recordDao().groupCountProject(); - listFlowable.subscribeOn(Schedulers.io()) + Disposable subscribe = listFlowable.subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(projectCountList -> { @@ -159,7 +189,8 @@ public class BizGlobal { checkDateLayout.addRule(RelativeLayout.BELOW, projectNameViewId); int checkDateViewId = IntSnowflake.next_id(); // 打卡时间文本view - TextView checkDateTextView = getTextView(context, checkDateViewId, DateUtil.date(record.getCheckDate()).toString(DatePattern.NORM_DATE_PATTERN), checkDateLayout, R.color._666666, 12, Gravity.TOP); +// TextView checkDateTextView = getTextView(context, checkDateViewId, DateUtil.date(record.getCheckDate()).toString(DatePattern.NORM_DATE_PATTERN), checkDateLayout, R.color._666666, 12, Gravity.TOP); + TextView checkDateTextView = getTextView(context, checkDateViewId, record.getDescription(), checkDateLayout, R.color._666666, 12, Gravity.TOP); itemLayout.addView(checkDateTextView); // 创建时间 diff --git a/app/src/main/java/cc/niushuai/dididone/ui/calendar/CalendarFragment.java b/app/src/main/java/cc/niushuai/dididone/ui/calendar/CalendarFragment.java index 5d684e8..5ec2922 100644 --- a/app/src/main/java/cc/niushuai/dididone/ui/calendar/CalendarFragment.java +++ b/app/src/main/java/cc/niushuai/dididone/ui/calendar/CalendarFragment.java @@ -36,7 +36,9 @@ import org.joda.time.format.DateTimeFormatter; import org.joda.time.format.ISODateTimeFormat; import org.reactivestreams.Subscription; +import java.util.ArrayList; import java.util.Comparator; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -320,6 +322,11 @@ public class CalendarFragment extends BaseFragment { XLog.i("[{}]打卡成功", project.getName()); Toasts.shortShow(getActivity(), "[{}]打卡成功", project.getName()); + // 更新缓存数据 +// Map> listMap = BizGlobal.CACHE_RECORD_LIST.getOrDefault(lastDate, new HashMap<>()); +// List list = listMap.getOrDefault(record.getProjectId(), new ArrayList<>()); +// list.add(record); + // 更新视图 add2Top(project, record); } diff --git a/app/src/main/java/cc/niushuai/dididone/ui/component/ProjectPopupView.java b/app/src/main/java/cc/niushuai/dididone/ui/component/ProjectPopupView.java index 9953c84..e56d370 100644 --- a/app/src/main/java/cc/niushuai/dididone/ui/component/ProjectPopupView.java +++ b/app/src/main/java/cc/niushuai/dididone/ui/component/ProjectPopupView.java @@ -28,6 +28,7 @@ import java.util.function.Consumer; import cc.niushuai.dididone.R; import cc.niushuai.dididone.biz.BizGlobal; import cc.niushuai.dididone.biz.entity.Project; +import cc.niushuai.dididone.biz.entity.Record; import cc.niushuai.dididone.util.GsonUtil; import cc.niushuai.dididone.util.XLog; import cn.hutool.core.collection.CollUtil; @@ -68,16 +69,23 @@ public class ProjectPopupView extends BottomPopupView { // data.sort(Comparator.comparing(Project::getCreateDate)); // data.sort((e1, e2) -> e2.getCreateDate().compareTo(e1.getCreateDate())); - Map countMap = new HashMap<>(); - for (Project item : data) { - Integer val = countMap.getOrDefault(item.getName(), 0); - countMap.put(item.getName(), val + 1); + Map>> cacheRecordMap = BizGlobal.CACHE_RECORD_LIST; + + Map countMap = new HashMap<>(); + for (Map> value : cacheRecordMap.values()) { + for (List list : value.values()) { + for (Record record : list) { + Integer val = countMap.getOrDefault(record.getProjectId(), 0); + countMap.put(record.getProjectId(), val + 1); + } + } } + XLog.d("构建出打卡项目: " + GsonUtil.toJson(countMap)); // 排序 data.sort((e1, e2) -> { - int diff = countMap.getOrDefault(e2.getName(), 0) - countMap.getOrDefault(e1.getName(), 0); + int diff = countMap.getOrDefault(e2.getId(), 0) - countMap.getOrDefault(e1.getId(), 0); if (diff != 0) { return diff; } @@ -111,8 +119,14 @@ public class ProjectPopupView extends BottomPopupView { TextView descView = holder.getView(R.id.ppv_item_desc); String count = BizGlobal.CACHE_PROJECT_COUNT.getOrDefault(project.getId(), 0).toString(); - Integer todayCount = BizGlobal.CACHE_PROJECT_TODAY_COUNT.getOrDefault(project.getId(), 0); - descView.setText(StrUtil.format("今日打卡{}次, 累计打卡{}次", todayCount, count)); + + Map selectedDayCountMap = new HashMap<>(); + String dateStr = DateUtil.date().toDateStr(); + Map> recordMapOrDefault = cacheRecordMap.getOrDefault(dateStr, new HashMap<>()); + recordMapOrDefault.forEach((k, v) -> selectedDayCountMap.put(k, v.size())); + + Integer todayCount = selectedDayCountMap.getOrDefault(project.getId(), 0); + descView.setText(StrUtil.format("当日打卡{}次, 累计打卡{}次", todayCount, count)); } }; commonAdapter.setOnItemClickListener(new MultiItemTypeAdapter.OnItemClickListener() { diff --git a/app/src/main/java/cc/niushuai/dididone/ui/component/TimeNotePopupView.java b/app/src/main/java/cc/niushuai/dididone/ui/component/TimeNotePopupView.java index 86755b1..cad65c7 100644 --- a/app/src/main/java/cc/niushuai/dididone/ui/component/TimeNotePopupView.java +++ b/app/src/main/java/cc/niushuai/dididone/ui/component/TimeNotePopupView.java @@ -41,8 +41,10 @@ public class TimeNotePopupView extends CenterPopupView { // 初始化时间选择器为当前时间 Calendar calendar = Calendar.getInstance(); + timePicker.setIs24HourView(true); timePicker.setHour(calendar.get(Calendar.HOUR_OF_DAY)); timePicker.setMinute(calendar.get(Calendar.MINUTE)); + timePicker.setActivated(false); btnConfirm.setOnClickListener(v -> { // 获取选择的时间(转换为毫秒时间戳) @@ -60,5 +62,10 @@ public class TimeNotePopupView extends CenterPopupView { }); btnCancel.setOnClickListener(v -> dismiss()); + + // 让备注获取到焦点 + etNote.requestFocus(); + // 让确定获取到焦点 + btnConfirm.requestFocus(); } }