From 8107dedd85ceec29491293d8ebf69f7d7213aa6b Mon Sep 17 00:00:00 2001
From: 陈昶聿 <chychen@nbjetron.com>
Date: 星期一, 21 九月 2026 15:24:08 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'
---
smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskServiceImpl.java | 390 ++++++++++++++++++++++++++++++++++++++++++++++++++-----
1 files changed, 351 insertions(+), 39 deletions(-)
diff --git a/smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskServiceImpl.java b/smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskServiceImpl.java
index 580958d..5640854 100644
--- a/smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskServiceImpl.java
+++ b/smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskServiceImpl.java
@@ -21,6 +21,7 @@
import com.smartor.common.MtSubmitSmUtil;
import com.smartor.common.ScheduleSubtaskBuilder;
import com.smartor.config.PhoneUtils;
+import com.smartor.domain.DTO.MydTrendReqDTO;
import com.smartor.domain.DTO.QuestionCountKsOrBqDTO;
import com.smartor.domain.DTO.ServiceSubtaskDetailDTO;
import com.smartor.domain.*;
@@ -785,6 +786,7 @@
serviceSubtask.setUpdateTime(DateUtils.getNowDate());
if (serviceSubtask.getSendstate() != null && serviceSubtask.getSendstate() == 6)
serviceSubtask.setFinishtime(new Date());
+
return serviceSubtaskMapper.updateServiceSubtask(serviceSubtask);
}
@@ -5136,13 +5138,13 @@
}
@Override
- public List<ServiceSubtaskDetailRatioExport> statQuestionOption(List<Long> taskIds, Date startOutHospTime, Date endOutHospTime, String scriptContent, Double scoreStart, Double scoreEnd, String valueType) {
+ public List<ServiceSubtaskDetailRatioExport> statQuestionOption(List<Long> taskIds, Date startFinishTime, Date endFinishTime, Date startOutHospTime, Date endOutHospTime, String scriptContent, Double scoreStart, Double scoreEnd, String valueType) {
//鍏堟竻鐞嗕竴涓嬮噸澶嶆暟鎹�
List<Long> repeatIds = serviceSubtaskDetailMapper.selectRepeatDetailIds();
if (!CollectionUtils.isEmpty(repeatIds)) {
serviceSubtaskDetailMapper.deleteRepeatDetailByIds(repeatIds);
}
- List<ServiceSubtaskDetailRatioExport> serviceSubtaskDetailRatioExports = serviceSubtaskMapper.statQuestionOption(taskIds, startOutHospTime, endOutHospTime, scoreStart, scoreEnd, scriptContent, valueType);
+ List<ServiceSubtaskDetailRatioExport> serviceSubtaskDetailRatioExports = serviceSubtaskMapper.statQuestionOption(taskIds, startOutHospTime, endOutHospTime, startFinishTime, endFinishTime, scoreStart, scoreEnd, scriptContent, valueType);
// 澶勭悊 targetvalue锛氭寜 & 鍒嗗壊鎴愬鏉¤褰�
List<ServiceSubtaskDetailRatioExport> result = new ArrayList<>();
@@ -5187,88 +5189,135 @@
* 鏍规嵁绉戝鎴栫梾鍖虹粺璁¢棶鍗烽�夐」(绉戝銆侀鐩煡璇㈢殑绉戝璇勫垎琛�)
*/
@Override
- public List<QuestionCountKsOrBqDTO> statQuestionOptionByKsOrBq(QuestionCountKsOrBqVO vo) {
+ public Map<String, Map<String, List<QuestionCountKsOrBqDTO>>> statQuestionOptionByKsOrBq(QuestionCountKsOrBqVO vo) {
+
+ // 1. 鏌ユ槑缁�
List<QuestionCountKsOrBqDTO> sourceList = serviceSubtaskMapper.statQuestionOptionByKsOrBq(vo);
if (CollectionUtils.isEmpty(sourceList)) {
- return Collections.emptyList();
+ return Collections.emptyMap();
}
+ // 2. 鍒ゆ柇鎸夌瀹よ繕鏄寜鐥呭尯
boolean byDept = vo.getLeaveldeptcodes() != null;
boolean byDistrict = !byDept && vo.getLeavehospitaldistrictcodes() != null;
if (!byDept && !byDistrict) {
- return Collections.emptyList();
+ return Collections.emptyMap();
}
+ // 3. key = 绉戝/鐥呭尯 + 棰樼洰 + 閫夐」
Map<String, QuestionCountKsOrBqDTO> map = new LinkedHashMap<>();
for (QuestionCountKsOrBqDTO dto : sourceList) {
+
if (StringUtils.isEmpty(dto.getTargetvalue())) {
continue;
}
+ // 鍒嗙粍鍚嶏細绉戝 鎴� 鐥呭尯
String groupName = byDept ? dto.getDeptname() : dto.getLeavehospitaldistrictname();
if (StringUtils.isEmpty(groupName)) {
continue;
}
- // 鍏抽敭锛氫袱杈归兘鐢� trimAll锛屽吋瀹瑰叏瑙掔┖鏍�
- String asrtext = trimAll(dto.getAsrtext());
- String questionKey = dto.getTaskid() + "\u0001" + trimAll(dto.getQeustionText());
+ String asrtext = trimAll(dto.getAsrtext()); // 鐢ㄦ埛瀹為檯閫変腑鐨勯�夐」
+ String questionText = trimAll(dto.getQuestionText()); // 棰樼洰
+ if (StringUtils.isEmpty(questionText)) {
+ continue;
+ }
+ // 鎷嗗垎 targetvalue锛屾瘡涓�夐」閮借鏈変竴鏉¤褰�
for (String raw : dto.getTargetvalue().split("&")) {
- String option = trimAll(raw); // 鈫� 淇鐐癸細鐢� trimAll 鑰屼笉鏄� trim
+
+ String option = trimAll(raw);
if (option.isEmpty()) {
continue;
}
- String key = buildKey(groupName, option, questionKey);
+ // key = 绉戝/鐥呭尯 + 棰樼洰 + 閫夐」
+ String key = buildKey(groupName, questionText, option);
+
QuestionCountKsOrBqDTO item = map.get(key);
if (item == null) {
item = DtoConversionUtils.sourceToTarget(dto, QuestionCountKsOrBqDTO.class);
- item.setTargetvalue(option); // 杈撳嚭鐨� targetvalue 灏辨槸褰撳墠閫夐」
+ item.setTargetvalue(option);
item.setAsrtext(option);
+ item.setQuestionText(dto.getQuestionText());
item.setAnswerCount("0");
+ item.setSingleScore("0");
map.put(key, item);
}
+ // 鍙湁褰撳墠閫夐」 == 鐢ㄦ埛瀹為檯閫変腑鐨勯�夐」锛屾墠绱姞
if (option.equals(asrtext)) {
- item.setAnswerCount(String.valueOf(parseCount(item.getAnswerCount()) + 1));
- item.setSingleScore(String.valueOf(new BigDecimal(item.getSingleScore()).add(new BigDecimal(dto.getSingleScore()))));
+ int count = parseCount(item.getAnswerCount()) + 1;
+ item.setAnswerCount(String.valueOf(count));
+
+ BigDecimal totalScore = new BigDecimal(item.getSingleScore())
+ .add(new BigDecimal(dto.getSingleScore() == null ? "0" : dto.getSingleScore()));
+ item.setSingleScore(totalScore.toPlainString());
}
}
}
- ArrayList<QuestionCountKsOrBqDTO> questionCountKsOrBqDTOS = new ArrayList<>(map.values());
- for (QuestionCountKsOrBqDTO questionCountKsOrBqDTO : questionCountKsOrBqDTOS) {
- String singleScore = questionCountKsOrBqDTO.getSingleScore();
- String answerCount = questionCountKsOrBqDTO.getAnswerCount();
+
+ // 4. 璁$畻骞冲潎鍒�
+ for (QuestionCountKsOrBqDTO dto : map.values()) {
+ String answerCount = dto.getAnswerCount();
+ String singleScore = dto.getSingleScore();
BigDecimal avg;
if (StringUtils.isEmpty(answerCount)
|| BigDecimal.ZERO.compareTo(new BigDecimal(answerCount.trim())) == 0) {
- // 闄ゆ暟涓� 0锛岄伩鍏� / by zero
avg = BigDecimal.ZERO;
} else {
- avg = new BigDecimal(singleScore)
+ avg = new BigDecimal(singleScore == null ? "0" : singleScore)
.divide(new BigDecimal(answerCount.trim()), 2, RoundingMode.HALF_UP);
}
- questionCountKsOrBqDTO.setAvgScore(avg.toPlainString());
-
+ dto.setAvgScore(avg.toPlainString());
}
- return questionCountKsOrBqDTOS;
+ // 5. 杞垚 Map<String, Map<String, List<QuestionCountKsOrBqDTO>>>
+ // 绗竴灞� key锛氱瀹�/鐥呭尯
+ // 绗簩灞� key锛氶鐩�
+ // 绗簩灞� value锛氳棰樼洰涓嬬殑鎵�鏈夐�夐」鍒楄〃
+ Map<String, Map<String, List<QuestionCountKsOrBqDTO>>> result = new LinkedHashMap<>();
+
+ for (QuestionCountKsOrBqDTO dto : map.values()) {
+
+ // 鍒嗙粍鍚�
+ String groupName = byDept ? dto.getDeptname() : dto.getLeavehospitaldistrictname();
+ if (StringUtils.isEmpty(groupName)) {
+ continue;
+ }
+
+ // 棰樼洰鍚�
+ String questionText = dto.getQuestionText();
+ if (StringUtils.isEmpty(questionText)) {
+ continue;
+ }
+
+ // 绗竴灞傦細绉戝/鐥呭尯
+ Map<String, List<QuestionCountKsOrBqDTO>> questionMap =
+ result.computeIfAbsent(groupName, k -> new LinkedHashMap<>());
+
+ // 绗簩灞傦細棰樼洰
+ List<QuestionCountKsOrBqDTO> optionList =
+ questionMap.computeIfAbsent(questionText, k -> new ArrayList<>());
+
+ optionList.add(dto);
+ }
+
+ return result;
}
-
-
@Override
- public List<ServiceSubtaskDetailRatioExport> statQuestionOptionBySubtaskIds(List<Long> subtaskIds, Date startOutHospTime, Date endOutHospTime, String scriptContent, Double scoreStart, Double scoreEnd, String valueType) {
+ public List<ServiceSubtaskDetailRatioExport> statQuestionOptionBySubtaskIds(List<Long> subtaskIds, Date startOutHospTime, Date endOutHospTime, Date startFinishTime, Date endFinishTime, String scriptContent, Double scoreStart, Double scoreEnd, String valueType) {
//鍏堟竻鐞嗕竴涓嬮噸澶嶆暟鎹�
List<Long> repeatIds = serviceSubtaskDetailMapper.selectRepeatDetailIds();
if (!CollectionUtils.isEmpty(repeatIds)) {
serviceSubtaskDetailMapper.deleteRepeatDetailByIds(repeatIds);
}
- List<ServiceSubtaskDetailRatioExport> serviceSubtaskDetailRatioExports = serviceSubtaskMapper.statQuestionOptionBySubtaskIds(subtaskIds, startOutHospTime, endOutHospTime, scoreStart, scoreEnd, scriptContent, valueType);
+ List<ServiceSubtaskDetailRatioExport> serviceSubtaskDetailRatioExports = serviceSubtaskMapper.statQuestionOptionBySubtaskIds(subtaskIds, startOutHospTime, endOutHospTime, startFinishTime, endFinishTime, scoreStart, scoreEnd, scriptContent, valueType);
// 澶勭悊 targetvalue锛氭寜 & 鍒嗗壊鎴愬鏉¤褰�
List<ServiceSubtaskDetailRatioExport> result = new ArrayList<>();
for (ServiceSubtaskDetailRatioExport export : serviceSubtaskDetailRatioExports) {
@@ -5537,6 +5586,34 @@
}
return content;
}
+
+ /**
+ * 婊℃剰搴﹁秼鍔挎煡璇�
+ *
+ * @param mydTrendReqVO
+ * @return
+ */
+ @Override
+ public List<MydTrendReqDTO> mydTrend(MydTrendReqVO mydTrendReqVO) {
+ List<MydTrendReqDTO> list = serviceSubtaskMapper.mydTrend(mydTrendReqVO.getStartFinishTime(), mydTrendReqVO.getEndFinishTime(), mydTrendReqVO.getType());
+ if (mydTrendReqVO.getType().equals("week")) list = getWeekDate(mydTrendReqVO, list);
+ if (mydTrendReqVO.getType().equals("year")) list = getYearDate(mydTrendReqVO, list);
+ if (mydTrendReqVO.getType().equals("month")) list = getMonthDate(mydTrendReqVO, list);
+ if (mydTrendReqVO.getType().equals("day")) list = getDayDate(mydTrendReqVO, list);
+ return list;
+ }
+
+ @Override
+ public List<MydTrendReqDTO> sltdMydTotalByDimension(MydTrendReqVO mydTrendReqVO) {
+ List<MydTrendReqDTO> list = null;
+ if (mydTrendReqVO.getDimensionType().equals("1"))
+ list = serviceSubtaskMapper.sltdMydTotalByDimension(mydTrendReqVO.getStartFinishTime(), mydTrendReqVO.getEndFinishTime(), mydTrendReqVO.getType());
+ else if (mydTrendReqVO.getDimensionType().equals("2"))
+ list = serviceSubtaskMapper.sltdMydTotalByYQ(mydTrendReqVO.getStartFinishTime(), mydTrendReqVO.getEndFinishTime(), mydTrendReqVO.getType());
+
+ return list;
+ }
+
public ServiceSubtask boxedServiceSubtask(ServiceTask serviceTask, ServiceTaskdept serviceTaskdept, PatArchive patArchive) {
ServiceSubtask serviceSubtask = DtoConversionUtils.sourceToTarget(serviceTask, ServiceSubtask.class);
@@ -6006,20 +6083,23 @@
/**
* 闂缁撴灉鍗犳瘮
*
- * @param questionResultVO
+ * @param sltdMydTotalVO
* @param serviceSubtaskRes
* @return
*/
- public List<ServiceSubtaskDetailRatioExport> getDetailRatio(QuestionResultVO questionResultVO, List<ServiceSubtaskRes> serviceSubtaskRes) {
+ public List<ServiceSubtaskDetailRatioExport> getDetailRatio(SltdMydTotalVO sltdMydTotalVO, List<ServiceSubtaskRes> serviceSubtaskRes) {
List<ServiceSubtaskDetailRatioExport> serviceSubtaskDetailRatioExports = null;
- if (StringUtils.isNotEmpty(questionResultVO.getServiceType()) && questionResultVO.getServiceType().equals("2")) {
+ if (CollectionUtils.isNotEmpty(sltdMydTotalVO.getServiceTypeList()) && sltdMydTotalVO.getServiceTypeList().contains("2") && (sltdMydTotalVO.getServiceTypeList().contains("6") || sltdMydTotalVO.getServiceTypeList().contains("14"))) {
+ //serviceType锛屽嵆鏈夐殢璁垮張鏈夋弧鎰忓害锛屾殏鏃舵病娉曠粺璁�
+ return serviceSubtaskDetailRatioExports;
+ } else if (CollectionUtils.isNotEmpty(sltdMydTotalVO.getServiceTypeList()) && sltdMydTotalVO.getServiceTypeList().contains("2")) {
//鑾峰彇serviceSubtaskList涓殑鎵�鏈塼askid
List<Long> taskIds = serviceSubtaskRes.stream().map(ServiceSubtaskRes::getTaskid).filter(ObjectUtils::isNotEmpty).distinct().collect(Collectors.toList());
- serviceSubtaskDetailRatioExports = statQuestionOption(taskIds, questionResultVO.getStartOutHospTime(), questionResultVO.getEndOutHospTime(), questionResultVO.getQuestionContent(), questionResultVO.getStartScore(), questionResultVO.getEndScore(), questionResultVO.getValueType());
- } else if (StringUtils.isNotEmpty(questionResultVO.getServiceType()) && questionResultVO.getServiceType().equals("6")) {
+ serviceSubtaskDetailRatioExports = statQuestionOption(taskIds, sltdMydTotalVO.getStartFinishTime(), sltdMydTotalVO.getEndFinishTime(), sltdMydTotalVO.getStartOutHospTime(), sltdMydTotalVO.getEndOutHospTime(), sltdMydTotalVO.getQuestionContent(), sltdMydTotalVO.getStartScore(), sltdMydTotalVO.getEndScore(), sltdMydTotalVO.getValueType());
+ } else if (CollectionUtils.isNotEmpty(sltdMydTotalVO.getServiceTypeList()) && sltdMydTotalVO.getServiceTypeList().contains("6") || sltdMydTotalVO.getServiceTypeList().contains("14")) {
//婊℃剰搴︾粺璁� 锛堥�氳繃 subtask 鐨� id 鍘荤粺璁★級
List<Long> subtaskIds = serviceSubtaskRes.stream().map(ServiceSubtaskRes::getId).collect(Collectors.toList());
- serviceSubtaskDetailRatioExports = statQuestionOptionBySubtaskIds(subtaskIds, questionResultVO.getStartOutHospTime(), questionResultVO.getEndOutHospTime(), questionResultVO.getQuestionContent(), questionResultVO.getStartScore(), questionResultVO.getEndScore(), questionResultVO.getValueType());
+ serviceSubtaskDetailRatioExports = statQuestionOptionBySubtaskIds(subtaskIds, sltdMydTotalVO.getStartOutHospTime(), sltdMydTotalVO.getEndOutHospTime(), sltdMydTotalVO.getStartFinishTime(), sltdMydTotalVO.getEndFinishTime(), sltdMydTotalVO.getQuestionContent(), sltdMydTotalVO.getStartScore(), sltdMydTotalVO.getEndScore(), sltdMydTotalVO.getValueType());
}
return serviceSubtaskDetailRatioExports;
}
@@ -6082,15 +6162,12 @@
private static Boolean isBlankChar(char c) {
return c == '\u3000' // 鍏ㄨ绌烘牸
|| c == ' ' // 鍗婅绌烘牸
- || c == '\t'
- || c == '\n'
- || c == '\r'
- || c == '\f'
- || Character.isWhitespace(c);
+ || c == '\t' || c == '\n' || c == '\r' || c == '\f' || Character.isWhitespace(c);
}
- private String buildKey(String groupName, String option, String questionKey) {
- return questionKey + KEY_SEP + groupName + KEY_SEP + option;
+
+ private String buildKey(String groupName, String questionText, String option) {
+ return groupName + "\u0001" + questionText + "\u0001" + option;
}
private static int parseCount(String s) {
@@ -6103,4 +6180,239 @@
return 0;
}
}
+
+ private List<MydTrendReqDTO> getWeekDate(MydTrendReqVO mydTrendReqVO, List<MydTrendReqDTO> list) {
+ // 1. 璁$畻鎬诲懆鏁帮紙鍜� SQL 閲岀殑鍏紡淇濇寔涓�鑷达級
+ long days = (mydTrendReqVO.getEndFinishTime().getTime() - mydTrendReqVO.getStartFinishTime().getTime()) / (1000L * 60 * 60 * 24);
+ int totalWeeks = (int) (days / 7) + 1;
+
+ // 2. 宸叉湁鏁版嵁锛歱eriod -> totalScore
+ Map<Integer, String> exist = new HashMap<>();
+ for (MydTrendReqDTO row : list) {
+ // period 鏄暟瀛楋紝鍙兘鏄� Integer / Long / BigDecimal锛岀粺涓�杞� int
+ int p = Integer.parseInt(StringUtils.isNotEmpty(row.getPeriod()) ? row.getPeriod() : "0");
+ exist.put(p, row.getTotalScore() != null ? row.getTotalScore() : "0");
+ // 涓嬮潰杩欒鎸変綘鐨勫師閫昏緫淇濈暀锛堣櫧鐒剁湅璧锋潵鏈夌偣澶氫綑锛�
+ exist.put(p, String.valueOf(row.getTotalScore() != null ? row.getTotalScore() : 0));
+ }
+
+ // 3. 琛ュ叏 1..totalWeeks
+ List<MydTrendReqDTO> result = new ArrayList<>(totalWeeks);
+
+ // 鑾峰彇鏁翠綋鐨勫紑濮嬫椂闂�
+ long startTimeMillis = mydTrendReqVO.getStartFinishTime().getTime();
+ long endTimeMillis = mydTrendReqVO.getEndFinishTime().getTime();
+ long oneWeekMillis = 7L * 24 * 60 * 60 * 1000; // 涓�鍛ㄧ殑姣鏁�
+
+ for (int i = 1; i <= totalWeeks; i++) {
+ MydTrendReqDTO row = new MydTrendReqDTO();
+ row.setPeriod(String.valueOf(i));
+ row.setTotalScore(exist.getOrDefault(i, "0"));
+
+ // -------- 鏂板锛氳缃瘡鍛ㄧ殑 startDate 鍜� endDate --------
+ // 褰撳墠鍛ㄥ紑濮嬫椂闂� = 鏁翠綋寮�濮嬫椂闂� + (i - 1) * 7澶�
+ long currentStartMillis = startTimeMillis + (long) (i - 1) * oneWeekMillis;
+
+ // 褰撳墠鍛ㄧ粨鏉熸椂闂� = 褰撳墠鍛ㄥ紑濮嬫椂闂� + 7澶� - 1姣锛堜繚璇佹槸杩欎竴鍛ㄧ殑鏈�鍚庝竴鍒伙級
+ long currentEndMillis = currentStartMillis + oneWeekMillis - 1;
+
+ // 濡傛灉鏄渶鍚庝竴鍛紝缁撴潫鏃堕棿涓嶈兘瓒呰繃鏁翠綋鐨� endTime
+ if (i == totalWeeks) {
+ currentEndMillis = endTimeMillis;
+ }
+
+ row.setStartDate(new Date(currentStartMillis));
+ row.setEndDate(new Date(currentEndMillis));
+ // ----------------------------------------------------
+
+ result.add(row);
+ }
+
+ return result;
+ }
+
+ private List<MydTrendReqDTO> getYearDate(MydTrendReqVO mydTrendReqVO, List<MydTrendReqDTO> list) {
+ // 鑾峰彇鏁翠綋寮�濮嬪拰缁撴潫鏃堕棿
+ Date startTime = mydTrendReqVO.getStartFinishTime();
+ Date endTime = mydTrendReqVO.getEndFinishTime();
+
+ // 1. 璁$畻骞翠唤鑼冨洿
+ // 浣跨敤 Calendar 鑾峰彇璧峰骞翠唤鍜岀粨鏉熷勾浠�
+ Calendar cal = Calendar.getInstance();
+ cal.setTime(startTime);
+ int startYear = cal.get(Calendar.YEAR);
+
+ cal.setTime(endTime);
+ int endYear = cal.get(Calendar.YEAR);
+
+ // 鎬诲勾鏁� (鍖呭惈棣栧熬)
+ int totalYears = endYear - startYear + 1;
+
+ // 2. 宸叉湁鏁版嵁锛歱eriod -> totalScore (鍋囪 period 瀛樼殑鏄勾浠藉瓧绗︿覆锛屽 "2024")
+ Map<String, String> exist = new HashMap<>();
+ for (MydTrendReqDTO row : list) {
+ String period = row.getPeriod() != null ? row.getPeriod() : "";
+ exist.put(period, row.getTotalScore() != null ? row.getTotalScore() : "0");
+ }
+
+ // 3. 琛ュ叏鎵�鏈夊勾浠�
+ List<MydTrendReqDTO> result = new ArrayList<>(totalYears);
+
+ for (int i = 0; i < totalYears; i++) {
+ int currentYear = startYear + i;
+ String periodKey = String.valueOf(currentYear);
+
+ MydTrendReqDTO row = new MydTrendReqDTO();
+ row.setPeriod(periodKey);
+ // 濡傛灉娌℃湁璇ュ勾浠界殑鏁版嵁锛岄粯璁ょ粰 "0"
+ row.setTotalScore(exist.getOrDefault(periodKey, "0"));
+
+ // -------- 璁剧疆璇ュ勾浠界殑 startDate 鍜� endDate --------
+ Calendar yearCal = Calendar.getInstance();
+ // 璁剧疆涓鸿骞寸殑 1鏈�1鏃� 00:00:00
+ yearCal.set(currentYear, Calendar.JANUARY, 1, 0, 0, 0);
+ yearCal.set(Calendar.MILLISECOND, 0);
+ row.setStartDate(yearCal.getTime());
+
+ // 璁剧疆涓鸿骞寸殑 12鏈�31鏃� 23:59:59
+ yearCal.set(currentYear, Calendar.DECEMBER, 31, 23, 59, 59);
+ yearCal.set(Calendar.MILLISECOND, 999);
+ row.setEndDate(yearCal.getTime());
+ // ----------------------------------------------------
+
+ result.add(row);
+ }
+
+ return result;
+ }
+
+ private List<MydTrendReqDTO> getMonthDate(MydTrendReqVO mydTrendReqVO, List<MydTrendReqDTO> list) {
+ // 鑾峰彇鏁翠綋寮�濮嬪拰缁撴潫鏃堕棿
+ Date startTime = mydTrendReqVO.getStartFinishTime();
+ Date endTime = mydTrendReqVO.getEndFinishTime();
+
+ // 1. 璁$畻鏈堜唤鑼冨洿
+ Calendar cal = Calendar.getInstance();
+ cal.setTime(startTime);
+ int startYear = cal.get(Calendar.YEAR);
+ int startMonth = cal.get(Calendar.MONTH); // 娉ㄦ剰锛欳alendar.MONTH 浠� 0 寮�濮�
+
+ cal.setTime(endTime);
+ int endYear = cal.get(Calendar.YEAR);
+ int endMonth = cal.get(Calendar.MONTH);
+
+ // 鎬绘湀鏁� = (缁撴潫骞� - 寮�濮嬪勾) * 12 + (缁撴潫鏈� - 寮�濮嬫湀) + 1
+ int totalMonths = (endYear - startYear) * 12 + (endMonth - startMonth) + 1;
+
+ // 2. 宸叉湁鏁版嵁锛歱eriod -> totalScore (period 瀛樼殑鏄湀浠藉瓧绗︿覆锛屽 "2024-06")
+ Map<String, String> exist = new HashMap<>();
+ for (MydTrendReqDTO row : list) {
+ String period = row.getPeriod() != null ? row.getPeriod() : "";
+ exist.put(period, row.getTotalScore() != null ? row.getTotalScore() : "0");
+ }
+
+ // 3. 琛ュ叏鎵�鏈夋湀浠�
+ List<MydTrendReqDTO> result = new ArrayList<>(totalMonths);
+
+ Calendar monthCal = Calendar.getInstance();
+ monthCal.set(startYear, startMonth, 1, 0, 0, 0);
+ monthCal.set(Calendar.MILLISECOND, 0);
+
+ for (int i = 0; i < totalMonths; i++) {
+ int currentYear = monthCal.get(Calendar.YEAR);
+ int currentMonth = monthCal.get(Calendar.MONTH) + 1; // 杞垚 1-12 鏈�
+
+ // 鎷兼帴 period锛屾牸寮忥細yyyy-MM锛屾瘮濡� "2024-06"
+ // 濡傛灉浣犲笇鏈涙槸 "2024-6"锛屽彲浠ユ妸 String.format 鏀规垚 currentMonth
+ String periodKey = String.format("%04d-%02d", currentYear, currentMonth);
+
+ MydTrendReqDTO row = new MydTrendReqDTO();
+ row.setPeriod(periodKey);
+ row.setTotalScore(exist.getOrDefault(periodKey, "0"));
+
+ // -------- 璁剧疆璇ユ湀鐨� startDate 鍜� endDate --------
+ // 褰撴湀寮�濮嬫椂闂达細1鍙� 00:00:00.000
+ Calendar startCal = (Calendar) monthCal.clone();
+ row.setStartDate(startCal.getTime());
+
+ // 褰撴湀缁撴潫鏃堕棿锛氫笅涓湀1鍙� 00:00:00.000 鍑� 1 姣
+ Calendar endCal = (Calendar) monthCal.clone();
+ endCal.add(Calendar.MONTH, 1);
+ endCal.add(Calendar.MILLISECOND, -1);
+ row.setEndDate(endCal.getTime());
+ // ----------------------------------------------------
+
+ result.add(row);
+
+ // 杩涘叆涓嬩竴涓湀
+ monthCal.add(Calendar.MONTH, 1);
+ }
+
+ return result;
+ }
+
+ private List<MydTrendReqDTO> getDayDate(MydTrendReqVO mydTrendReqVO, List<MydTrendReqDTO> list) {
+ // 鑾峰彇鏁翠綋寮�濮嬪拰缁撴潫鏃堕棿
+ Date startTime = mydTrendReqVO.getStartFinishTime();
+ Date endTime = mydTrendReqVO.getEndFinishTime();
+
+ // 1. 璁$畻鎬诲ぉ鏁�
+ long oneDayMillis = 24L * 60 * 60 * 1000;
+ // 娉ㄦ剰锛氳繖閲屽彧绠楁棩鏈熷樊锛屼笉鑰冭檻鏃跺垎绉掞紝鍚﹀垯鍙兘宸竴澶�
+ Calendar startCal = Calendar.getInstance();
+ startCal.setTime(startTime);
+ startCal.set(Calendar.HOUR_OF_DAY, 0);
+ startCal.set(Calendar.MINUTE, 0);
+ startCal.set(Calendar.SECOND, 0);
+ startCal.set(Calendar.MILLISECOND, 0);
+
+ Calendar endCal = Calendar.getInstance();
+ endCal.setTime(endTime);
+ endCal.set(Calendar.HOUR_OF_DAY, 0);
+ endCal.set(Calendar.MINUTE, 0);
+ endCal.set(Calendar.SECOND, 0);
+ endCal.set(Calendar.MILLISECOND, 0);
+
+ long days = (endCal.getTimeInMillis() - startCal.getTimeInMillis()) / oneDayMillis;
+ int totalDays = (int) days + 1;
+
+ // 2. 宸叉湁鏁版嵁锛歱eriod -> totalScore (period 瀛樼殑鏄棩鏈熷瓧绗︿覆锛屽 "2024-06-01")
+ Map<String, String> exist = new HashMap<>();
+ for (MydTrendReqDTO row : list) {
+ String period = row.getPeriod() != null ? row.getPeriod() : "";
+ exist.put(period, row.getTotalScore() != null ? row.getTotalScore() : "0");
+ }
+
+ // 3. 琛ュ叏鎵�鏈夋棩鏈�
+ List<MydTrendReqDTO> result = new ArrayList<>(totalDays);
+
+ Calendar dayCal = (Calendar) startCal.clone();
+ for (int i = 0; i < totalDays; i++) {
+ // 鎷兼帴 period锛屾牸寮忥細yyyy-MM-dd
+ String periodKey = String.format("%04d-%02d-%02d", dayCal.get(Calendar.YEAR), dayCal.get(Calendar.MONTH) + 1, dayCal.get(Calendar.DAY_OF_MONTH));
+
+ MydTrendReqDTO row = new MydTrendReqDTO();
+ row.setPeriod(periodKey);
+ row.setTotalScore(exist.getOrDefault(periodKey, "0"));
+
+ // -------- 璁剧疆璇ュぉ鐨� startDate 鍜� endDate --------
+ Calendar startOfDay = (Calendar) dayCal.clone();
+ row.setStartDate(startOfDay.getTime());
+
+ Calendar endOfDay = (Calendar) dayCal.clone();
+ endOfDay.set(Calendar.HOUR_OF_DAY, 23);
+ endOfDay.set(Calendar.MINUTE, 59);
+ endOfDay.set(Calendar.SECOND, 59);
+ endOfDay.set(Calendar.MILLISECOND, 999);
+ row.setEndDate(endOfDay.getTime());
+ // ----------------------------------------------------
+
+ result.add(row);
+
+ // 杩涘叆涓嬩竴澶�
+ dayCal.add(Calendar.DAY_OF_MONTH, 1);
+ }
+
+ return result;
+ }
}
--
Gitblit v1.9.3