Explorar el Código

查询标签有效期BUG修复

zhangqiankun hace 3 años
padre
commit
3e247a60bc

+ 4 - 3
doc/docker/Dockerfile

@@ -1,12 +1,13 @@
-FROM java:8-jre
-MAINTAINER fanzhongyuan<fanzhongyuan@persagy.com>
+FROM openjdk:8u312-jdk-buster
+MAINTAINER zhangqiankun<zhangqiankun@persagy.com>
 
 LABEL tier backend
 LABEL product integrated
 LABEL project calendar-center
 LABEL name 工作历
 
-ENV JAVA_OPTS -Dfile.encoding=UTF-8 -Xms2048m -Xmx2048m
+# 不再指定内存大小限制,采用容器,请结合k8s yaml文件limits memory使用
+ENV JAVA_OPTS -Dfile.encoding=UTF-8 -XX:+UseContainerSupport -XX:InitialRAMPercentage=100 -XX:MaxRAMPercentage=100 -XX:MinRAMPercentage=100
 ENV TZ Asia/Shanghai
 ARG WORKER_HOME
 

+ 5 - 0
doc/docker/calendar-center.yaml

@@ -33,6 +33,11 @@ spec:
       containers: 
       - name: calendar-center
         image: labisenlin.persagy.com/library/calendar-center:latest
+        resources:
+          limits:
+            memory: "2048Mi"
+          requests:
+            memory: "2048Mi"
         ports: 
         - containerPort: 8080
           name: server-port

+ 3 - 0
src/main/java/com/persagy/calendar/controller/WorkCalendarLabelController.java

@@ -74,6 +74,9 @@ public class WorkCalendarLabelController {
 			queryVO.setGroupCode(defaultGroupCode);
 		}
     	
+    	if (StringUtil.isBlank(queryVO.getProjectId())) {
+    		return ResponseUtil.errorResult(ResponseCode.A0400.getCode(), "项目ID,不可为空");
+		}
     	if (StringUtil.isBlank(queryVO.getDictType())) {
     		return ResponseUtil.errorResult(ResponseCode.A0400.getCode(), "标签类型,不可为空");
 		}

+ 101 - 4
src/main/java/com/persagy/calendar/handle/WorkCalendarLabelHandler.java

@@ -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;
+	}
+	
 }

+ 81 - 2
src/main/java/com/persagy/calendar/pojo/dto/WorkCalendarLabel.java

@@ -16,7 +16,6 @@ import com.persagy.common.enums.IdGeneratorAlgorithm;
 import com.persagy.common.utils.StringUtil;
 import com.persagy.db.model.BaseEntity;
 
-import lombok.EqualsAndHashCode;
 import lombok.Getter;
 import lombok.Setter;
 import lombok.ToString;
@@ -31,7 +30,6 @@ import lombok.ToString;
 @Getter
 @Setter
 @ToString
-@EqualsAndHashCode(callSuper = false)
 @TableName(value = "work_calendar_label", autoResultMap = true)
 @IdGenerator(prefix = WorkCalendarConstant.WORK_CALENDAR_LABEL_ID_PREFIX, algorithm = IdGeneratorAlgorithm.SNOW_STR)
 public class WorkCalendarLabel extends BaseEntity<WorkCalendarLabel> {
@@ -250,4 +248,85 @@ public class WorkCalendarLabel extends BaseEntity<WorkCalendarLabel> {
 			return updateWrapper;
 		}
 	}
+
+	// 不要加labelDate字段
+	@Override
+	public int hashCode() {
+		final int prime = 31;
+		int result = 1;
+		result = prime * result + ((StringUtil.isBlank(calendarId)) ? 0 : calendarId.hashCode());
+		result = prime * result + ((StringUtil.isBlank(dictCode)) ? 0 : dictCode.hashCode());
+		result = prime * result + ((StringUtil.isBlank(dictType)) ? 0 : dictType.hashCode());
+		result = prime * result + ((StringUtil.isBlank(diyLabel)) ? 0 : diyLabel.hashCode());
+		result = prime * result + ((StringUtil.isBlank(groupCode)) ? 0 : groupCode.hashCode());
+		result = prime * result + ((StringUtil.isBlank(projectId)) ? 0 : projectId.hashCode());
+		return result;
+	}
+
+	// 不要加labelDate字段
+	@Override
+	public boolean equals(Object obj) {
+		if (this == obj) {
+			return true;
+		}
+		if (obj == null) {
+			return false;
+		}
+		
+		if (getClass() != obj.getClass()) {
+			return false;
+		}
+		
+		WorkCalendarLabel other = (WorkCalendarLabel) obj;
+		if (StringUtil.isBlank(groupCode)) {
+			if (StringUtil.isNotBlank(other.groupCode)) {
+				return false;
+			}
+		} else if (!groupCode.equals(other.groupCode == null ? "" : other.groupCode)) {
+			return false;
+		}
+
+		if (StringUtil.isBlank(projectId)) {
+			if (StringUtil.isNotBlank(other.projectId)) {
+				return false;
+			}
+		} else if (!projectId.equals(other.projectId == null ? "" : other.projectId)) {
+			return false;
+		}
+		
+		if (StringUtil.isBlank(calendarId)) {
+			if (StringUtil.isNotBlank(other.calendarId)) {
+				return false;
+			}
+		} else if (!calendarId.equals(other.calendarId == null ? "" : other.calendarId)) {
+			return false;
+		}
+		
+		if (StringUtil.isBlank(dictType)) {
+			if (StringUtil.isNotBlank(other.dictType)) {
+				return false;
+			}
+		} else if (!dictType.equals(other.dictType == null ? "" : other.dictType)) {
+			return false;
+		}
+		
+		if (StringUtil.isBlank(dictCode)) {
+			if (StringUtil.isNotBlank(other.dictCode)) {
+				return false;
+			}
+		} else if (!dictCode.equals(other.dictCode == null ? "" : other.dictCode)) {
+			return false;
+		}
+		
+		if (StringUtil.isBlank(diyLabel)) {
+			if (StringUtil.isNotBlank(other.diyLabel)) {
+				return false;
+			}
+		} else if (!diyLabel.equals(other.diyLabel == null ? "" : other.diyLabel)) {
+			return false;
+		}
+		
+		return true;
+	}
+	
 }