|
@@ -1,8 +1,11 @@
|
|
|
package com.persagy.calendar.handle;
|
|
|
|
|
|
import java.util.ArrayList;
|
|
|
+import java.util.Collections;
|
|
|
import java.util.Date;
|
|
|
+import java.util.HashMap;
|
|
|
import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
import java.util.Set;
|
|
|
|
|
|
import org.springframework.beans.BeanUtils;
|
|
@@ -98,7 +101,7 @@ public class WorkCalendarLabelHandler {
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 查询标签的有效期
|
|
|
+ * 查询标签的有效期,仅允许查询某一项目、某一标签对应的有效期
|
|
|
*
|
|
|
* @param queryVO
|
|
|
* @return
|
|
@@ -123,12 +126,89 @@ public class WorkCalendarLabelHandler {
|
|
|
.projectIdEq(queryVO.getProjectId(), dictTypeLevel).calendarIdEq(queryVO.getCalendarId(), dictTypeLevel)
|
|
|
.dictTypeEq(queryVO.getDictType()).dictCodeEq(queryVO.getDictCode()).diyLabelEq(queryVO.getDiyLabel())
|
|
|
.labelDateGe(queryVO.getLabelDateStart()).labelDateLe(queryVO.getLabelDateEnd()).builderQueryWrapper();
|
|
|
- queryWrapper.select(queryVO.getGroupBy() + ", MIN(LABEL_DATE) AS labelDateStart, MAX(LABEL_DATE) AS labelDateEnd");
|
|
|
- queryWrapper.groupBy(queryVO.getGroupBy());
|
|
|
- return this.workCalendarLabelService.list(queryWrapper);
|
|
|
+ queryWrapper.select("GROUP_CODE, PROJECT_ID, CALENDAR_ID, DICT_TYPE, DICT_CODE, LABEL_DATE, DIY_LABEL").orderByAsc("DICT_CODE");
|
|
|
+ List<WorkCalendarLabel> labels = this.workCalendarLabelService.list(queryWrapper);
|
|
|
+ return this.convert2Response(labels);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
+ * 结果封装
|
|
|
+ *
|
|
|
+ * @param labels 此集合内容,必须是同一项目、同一标签类型下的数据
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private List<WorkCalendarLabel> convert2Response(List<WorkCalendarLabel> labels) {
|
|
|
+ if (CollectionUtil.isEmpty(labels)) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 生成响应的数据结构
|
|
|
+ Map<String, WorkCalendarLabel> dictCode2Label = new HashMap<String, WorkCalendarLabel>();
|
|
|
+ Map<String, List<String>> dictCode2Date = new HashMap<String, List<String>>();
|
|
|
+ for (WorkCalendarLabel workCalendarLabel : labels) {
|
|
|
+ String dictCode = workCalendarLabel.getDictCode();
|
|
|
+
|
|
|
+ if (!dictCode2Label.containsKey(dictCode)) {
|
|
|
+ dictCode2Label.put(dictCode, workCalendarLabel);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (dictCode2Date.containsKey(dictCode)) {
|
|
|
+ dictCode2Date.get(dictCode).add(workCalendarLabel.getLabelDate());
|
|
|
+ } else {
|
|
|
+ dictCode2Date.put(dictCode, Lists.newArrayList(workCalendarLabel.getLabelDate()));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ List<WorkCalendarLabel> resultList = new ArrayList<WorkCalendarLabel>();
|
|
|
+
|
|
|
+ // 解析出对应code每个时间段内的最小日期和最大日期
|
|
|
+ Set<String> dictCodes = dictCode2Date.keySet();
|
|
|
+ for (String dictCode : dictCodes) {
|
|
|
+ List<String> labelDates = dictCode2Date.get(dictCode);
|
|
|
+ WorkCalendarLabel calendarLabel = dictCode2Label.get(dictCode);
|
|
|
+
|
|
|
+ if (labelDates.size() == 1) {
|
|
|
+ this.convert2Response(calendarLabel, null, null);
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ // 先排序
|
|
|
+ Collections.sort(labelDates);
|
|
|
+
|
|
|
+ int size = labelDates.size();
|
|
|
+ String preDate = labelDates.get(0);
|
|
|
+ String minDate = labelDates.get(0);
|
|
|
+
|
|
|
+ DateTime currentDate = null;
|
|
|
+ DateTime preDateTime = DateUtil.parse(labelDates.get(0), DateUtil.FORMAT_DATE_YYYYMMDD);
|
|
|
+ for (int i = 1; i < size; i++) {
|
|
|
+ // 获取当前时间和日期
|
|
|
+ String labelDate = labelDates.get(i);
|
|
|
+ currentDate = DateUtil.parse(labelDate, DateUtil.FORMAT_DATE_YYYYMMDD);
|
|
|
+
|
|
|
+ // 当前时间往前偏移一天,判断是否相等
|
|
|
+ currentDate.offset(DateField.DAY_OF_YEAR, -1);
|
|
|
+ if (preDateTime.equals(currentDate)) {
|
|
|
+ } else {
|
|
|
+ // 两个日期不相等的情况下,证明当前日期不连续,封装响应结果
|
|
|
+ resultList.add(this.convert2Response(calendarLabel, minDate, preDate));
|
|
|
+ minDate = labelDate;
|
|
|
+ }
|
|
|
+ // 无论哪种情况下,都需要为上一日期赋最新值
|
|
|
+ preDate = labelDate;
|
|
|
+ preDateTime = DateUtil.parse(labelDate, DateUtil.FORMAT_DATE_YYYYMMDD);
|
|
|
+
|
|
|
+ // 最后一天无论与之前的相不相等,都应该封装响应结果
|
|
|
+ if (i == (size - 1)) {
|
|
|
+ resultList.add(convert2Response(calendarLabel, minDate, labelDate));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return resultList;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
* 创建或更新日期标签属性
|
|
|
*
|
|
|
* @param createVO
|
|
@@ -271,4 +351,21 @@ public class WorkCalendarLabelHandler {
|
|
|
return null;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 转为响应数据
|
|
|
+ *
|
|
|
+ * @param temp
|
|
|
+ * @param labelDateStart
|
|
|
+ * @param labelDateEnd
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private WorkCalendarLabel convert2Response(WorkCalendarLabel temp, String labelDateStart, String labelDateEnd) {
|
|
|
+ WorkCalendarLabel result = new WorkCalendarLabel();
|
|
|
+ BeanUtils.copyProperties(temp, result);
|
|
|
+ result.setLabelDate(null);
|
|
|
+ result.setLabelDateStart(labelDateStart == null ? temp.getLabelDateStart() : labelDateStart);
|
|
|
+ result.setLabelDateEnd(labelDateEnd == null ? temp.getLabelDateEnd() : labelDateEnd);
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
}
|