Переглянути джерело

工作历服务逻辑大改,字典类型进行级别分类

zhangqiankun 3 роки тому
батько
коміт
36c143b972
43 змінених файлів з 1375 додано та 895 видалено
  1. 7 3
      doc/calendar-center.sql
  2. 64 14
      src/main/java/com/persagy/calendar/controller/CommonController.java
  3. 8 8
      src/main/java/com/persagy/calendar/controller/OldWorkCalendarController.java
  4. 54 7
      src/main/java/com/persagy/calendar/controller/WorkCalendarController.java
  5. 31 6
      src/main/java/com/persagy/calendar/controller/WorkCalendarDateController.java
  6. 10 2
      src/main/java/com/persagy/calendar/controller/WorkCalendarLabelController.java
  7. 36 15
      src/main/java/com/persagy/calendar/controller/WorkCalendarRuleController.java
  8. 425 300
      src/main/java/com/persagy/calendar/handle/WorkCalendarDateHandler.java
  9. 92 50
      src/main/java/com/persagy/calendar/handle/WorkCalendarHandler.java
  10. 60 27
      src/main/java/com/persagy/calendar/handle/WorkCalendarLabelHandler.java
  11. 39 25
      src/main/java/com/persagy/calendar/handle/WorkCalendarRuleHandler.java
  12. 0 19
      src/main/java/com/persagy/calendar/mapper/WorkCalendarDictMapper.java
  13. 1 1
      src/main/java/com/persagy/calendar/pojo/dto/WorkCalendar.java
  14. 108 13
      src/main/java/com/persagy/calendar/pojo/dto/WorkCalendarDate.java
  15. 174 47
      src/main/java/com/persagy/calendar/pojo/dto/WorkCalendarDict.java
  16. 17 5
      src/main/java/com/persagy/calendar/pojo/dto/WorkCalendarLabel.java
  17. 22 10
      src/main/java/com/persagy/calendar/pojo/dto/WorkCalendarRule.java
  18. 6 3
      src/main/java/com/persagy/calendar/pojo/vo/DictQueryVO.java
  19. 2 0
      src/main/java/com/persagy/calendar/pojo/vo/WorkCalendarDateQueryVO.java
  20. 1 1
      src/main/java/com/persagy/calendar/pojo/vo/WorkCalendarLabelUpdateVO.java
  21. 4 1
      src/main/java/com/persagy/calendar/pojo/vo/WorkCalendarUpdateVO.java
  22. 2 5
      src/main/java/com/persagy/calendar/service/IWorkCalendarDateService.java
  23. 21 11
      src/main/java/com/persagy/calendar/service/IWorkCalendarDictService.java
  24. 1 1
      src/main/java/com/persagy/calendar/service/IWorkCalendarObjectService.java
  25. 25 10
      src/main/java/com/persagy/calendar/service/IWorkCalendarRuleService.java
  26. 2 1
      src/main/java/com/persagy/calendar/service/IWorkCalendarService.java
  27. 12 12
      src/main/java/com/persagy/calendar/service/impl/OldWorkCalendarDateServiceImpl.java
  28. 7 20
      src/main/java/com/persagy/calendar/service/impl/WorkCalendarDateServiceImpl.java
  29. 49 8
      src/main/java/com/persagy/calendar/service/impl/WorkCalendarDictServiceImpl.java
  30. 2 0
      src/main/java/com/persagy/calendar/service/impl/WorkCalendarLabelServiceImpl.java
  31. 3 2
      src/main/java/com/persagy/calendar/service/impl/WorkCalendarObjectServiceImpl.java
  32. 29 54
      src/main/java/com/persagy/calendar/service/impl/WorkCalendarRuleServiceImpl.java
  33. 6 10
      src/main/java/com/persagy/calendar/service/impl/WorkCalendarServiceImpl.java
  34. 15 8
      src/main/java/com/persagy/dye/controller/DyeRuleCustomController.java
  35. 15 7
      src/main/java/com/persagy/dye/controller/DyeRuleDefaultController.java
  36. 4 2
      src/main/java/com/persagy/dye/pojo/dto/DyeBasic.java
  37. 5 2
      src/main/java/com/persagy/dye/pojo/dto/DyeRuleCustom.java
  38. 5 2
      src/main/java/com/persagy/dye/pojo/dto/DyeRuleDefault.java
  39. 2 1
      src/main/java/com/persagy/dye/pojo/vo/DyeScaleplateVO.java
  40. 4 1
      src/main/resources/application.yml
  41. 5 27
      src/main/resources/mapper/WorkCalendarDictMapper.xml
  42. 0 32
      src/main/resources/sql/data.sql
  43. 0 122
      src/main/resources/sql/schema.sql

+ 7 - 3
doc/calendar-center.sql

@@ -54,12 +54,16 @@ CREATE TABLE `work_calendar_date`  (
 -- ----------------------------
 DROP TABLE IF EXISTS `work_calendar_dict`;
 CREATE TABLE `work_calendar_dict`  (
+  `ID` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主键ID',
   `GROUP_CODE` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '集团编码',
-  `CALENDAR_ID` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '工作历ID',
+  `PROJECT_ID` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '项目ID,集团级别的字典,此值为0',
+  `CALENDAR_ID` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '工作历ID,项目级别的字典,此值为0',
   `DICT_TYPE` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '字典类型',
-  `DICT_CODE` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '字典数据的code',
+  `DICT_CODE` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '字典类型的code',
   `DICT_DESC` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '字典类型描述',
-  UNIQUE INDEX `UK_DICT_CALENDAR_TYPE`(`DICT_TYPE`, `CALENDAR_ID`, `DICT_DESC`) USING BTREE
+  PRIMARY KEY (`ID`) USING BTREE,
+  INDEX `NK_DICT_GROUP_PROJECT_CALENDAR`(`GROUP_CODE`, `PROJECT_ID`, `CALENDAR_ID`) USING BTREE,
+  INDEX `NK_DICT_TYPE_CODE`(`DICT_TYPE`, `DICT_CODE`) USING BTREE
 ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '工作历字典表,后台维护,没有前端' ROW_FORMAT = Dynamic;
 
 -- ----------------------------

+ 64 - 14
src/main/java/com/persagy/calendar/controller/CommonController.java

@@ -1,28 +1,34 @@
 package com.persagy.calendar.controller;
 
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
-import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RestController;
 
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.google.common.collect.Lists;
 import com.persagy.calendar.constant.WorkCalendarConstant;
 import com.persagy.calendar.handle.WorkCalendarDateHandler;
+import com.persagy.calendar.pojo.dto.WorkCalendarDate;
 import com.persagy.calendar.pojo.dto.WorkCalendarDict;
+import com.persagy.calendar.pojo.dto.WorkCalendarRule;
 import com.persagy.calendar.pojo.vo.DictCodeCreate;
 import com.persagy.calendar.pojo.vo.DictCreateVO;
 import com.persagy.calendar.pojo.vo.DictQueryVO;
 import com.persagy.calendar.pojo.vo.WorkCalendarDateQueryVO;
 import com.persagy.calendar.service.IWorkCalendarDictService;
+import com.persagy.common.enums.ResponseCode;
+import com.persagy.common.exception.BusinessException;
 import com.persagy.common.utils.DateUtil;
+import com.persagy.common.utils.IdGenerator;
 import com.persagy.common.utils.ResponseResult;
 import com.persagy.common.utils.ResponseUtil;
 import com.persagy.common.utils.StringUtil;
@@ -30,6 +36,7 @@ import com.persagy.common.utils.StringUtil;
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.date.DateField;
 import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUnit;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 
@@ -45,6 +52,9 @@ import io.swagger.annotations.ApiOperation;
 @RequestMapping(value = "/v2.0/common", method = RequestMethod.POST)
 public class CommonController {
 
+	@Value("${integrated.calendar.group-code:BR}")
+	private String defaultGroupCode;
+	
 	@Autowired
 	private IWorkCalendarDictService workCalendarDictService;
 	
@@ -52,6 +62,8 @@ public class CommonController {
 	private WorkCalendarDateHandler workCalendarDateHandler;
 	
 	/**
+	 * 规则解析可以不需要集团编码和项目ID
+	 * 当日的作息时间,在查询时,实时解析
      * 手动解析规则信息
      * 非自定义已存在的作息时间信息被更新,不存在的被插入,自定义的不动
      */
@@ -61,13 +73,33 @@ public class CommonController {
     	if ("Pj1111111111".equalsIgnoreCase(queryVO.getProjectId())) {
     		queryVO.setProjectId(null);
 		}
-    	// 相等时,往前偏移一天,临时方案,后续可删除,在xxl-job更新后
-    	if (queryVO.getWorkDateStart().equals(queryVO.getWorkDateEnd())) {
-    		DateTime dateStart = DateUtil.parse(queryVO.getWorkDateStart(), DateUtil.FORMAT_DATE_YYYYMMDD);
+    	
+    	DateTime dateStart = DateUtil.parse(queryVO.getWorkDateStart(), DateUtil.FORMAT_DATE_YYYYMMDD);
+		DateTime dateEnd = DateUtil.parse(queryVO.getWorkDateEnd(), DateUtil.FORMAT_DATE_YYYYMMDD);
+		if (dateEnd.before(dateStart)) {
+			throw new BusinessException(ResponseCode.A0400.getCode(), "结束日期不能早于开始日期");
+		}
+		
+		// 相等时,往前偏移一天,临时方案,后续可删除,在xxl-job更新后
+		if (dateStart.equals(dateEnd)) {
     		dateStart.offset(DateField.DAY_OF_YEAR, -1);
     		queryVO.setWorkDateStart(dateStart.toString(DateUtil.FORMAT_DATE_YYYYMMDD));
 		}
-    	boolean result = this.workCalendarDateHandler.handleParseCalendarRule(queryVO);
+    	
+    	// 2.获取此段时间内的自定义的规则信息
+    	List<WorkCalendarDate> customDateList = this.workCalendarDateHandler.selectWorkCalendarDateList(queryVO, WorkCalendarConstant.CUSTOM_CALENDAR_DATE_YES, null);
+    	
+    	// 3.获取此段时间内的规则信息
+		Map<String, List<WorkCalendarDate>> calendarDateMap = new HashMap<String, List<WorkCalendarDate>>();
+		List<WorkCalendarRule> ruleList = this.workCalendarDateHandler.selectWorkCalendarRuleList(queryVO, null);
+		long betweenDay = DateUtil.between(dateStart, dateEnd, DateUnit.DAY) + 1;
+		this.workCalendarDateHandler.paserWorkCalendarRule(calendarDateMap, ruleList, dateStart, betweenDay);
+		
+		// 4.自定义与规则的进行判断,存在的自定义的将不再进行插入
+		List<WorkCalendarDate> workCalendarDates = this.workCalendarDateHandler.handleParseCalendarRule(queryVO, customDateList, calendarDateMap);
+		
+		// 5.删除更新
+    	boolean result = this.workCalendarDateHandler.createCalendarDateByDelete(workCalendarDates, queryVO.getWorkDateStart(), queryVO.getWorkDateEnd());
 		return result ? ResponseUtil.successResult("执行成功") : ResponseUtil.errorResult("执行失败");
     }
     
@@ -77,15 +109,18 @@ public class CommonController {
     @ApiOperation(value = "字典查询")
     @RequestMapping(value = "dictQuery")
     public ResponseResult dictQuery(@RequestBody @Validated DictQueryVO queryVO) {
-    	QueryWrapper<WorkCalendarDict> queryWrapper = new WorkCalendarDict.Builder().createQueryWrapper()
-    			.groupCodeEq(queryVO.getGroupCode()).calendarIdEq(queryVO.getCalendarId())
-    			.dictTypeEq(queryVO.getDictType()).builderQueryWrapper();
+    	if (StringUtil.isBlank(queryVO.getGroupCode())) {
+			queryVO.setGroupCode(defaultGroupCode);
+		}
+    	int dictTypeLevel = this.workCalendarDictService.getDictTypeLevel(queryVO.getGroupCode(), queryVO.getDictType());
+    	
+    	LambdaQueryWrapper<WorkCalendarDict> queryWrapper = new WorkCalendarDict.BuilderQueryWrapper().groupCodeEq(queryVO.getGroupCode())
+    			.calendarIdEq(queryVO.getCalendarId(), dictTypeLevel).dictTypeEq(queryVO.getDictType()).builder();
     	List<WorkCalendarDict> list = this.workCalendarDictService.list(queryWrapper);
     	if (CollectionUtil.isEmpty(list)) {
 			return ResponseUtil.successResult(Lists.newArrayList());
 		}
     	
-    	//Map<String, Map<String, String>> dictTypeMap = new HashMap<String, Map<String, String>>(2);
     	Map<String, String> dictTypeCode = new HashMap<String, String>(8);
     	String dictType = null;
     	for (WorkCalendarDict dict : list) {
@@ -96,16 +131,31 @@ public class CommonController {
 				dictTypeCode.put(dict.getDictCode(), dict.getDictDesc());
 			}
 		}
-    	//dictTypeMap.put(dictType, dictTypeCode);
 		return ResponseUtil.successResult(dictTypeCode);
     }
     
     @ApiOperation(value = "字典值创建")
     @RequestMapping(value = "dictCreate")
     public ResponseResult dictCreate(@RequestBody @Validated DictCreateVO<DictCodeCreate> createVO) {
-    	WorkCalendarDict calendarDict = new WorkCalendarDict();
-    	BeanUtils.copyProperties(createVO, calendarDict);
-    	boolean result = this.workCalendarDictService.batchCreateOrUpdateDict(calendarDict, createVO.getCodes());
+    	if (StringUtil.isBlank(createVO.getGroupCode())) {
+			createVO.setGroupCode(defaultGroupCode);
+		}
+    	
+    	List<WorkCalendarDict> calendarDicts = new ArrayList<WorkCalendarDict>();
+    	List<DictCodeCreate> codes = createVO.getCodes();
+    	for (DictCodeCreate dictCodeCreate : codes) {
+    		WorkCalendarDict calendarDict = new WorkCalendarDict();
+    		calendarDict.setGroupCode(createVO.getGroupCode());
+    		calendarDict.setProjectId(createVO.getProjectId());
+    		calendarDict.setCalendarId(createVO.getCalendarId());
+    		calendarDict.setId(IdGenerator.getUUID());
+    		calendarDict.setDictType(createVO.getDictType());
+    		calendarDict.setDictCode(dictCodeCreate.getDictCode());
+    		calendarDict.setDictDesc(dictCodeCreate.getDictDesc());
+    		calendarDicts.add(calendarDict);
+		}
+    	
+    	boolean result = this.workCalendarDictService.batchCreateDictTypeByDelete(calendarDicts);
     	return result ? ResponseUtil.successResult("创建成功") : ResponseUtil.successResult("创建失败");
     }
     

+ 8 - 8
src/main/java/com/persagy/calendar/controller/OldWorkCalendarController.java

@@ -93,7 +93,7 @@ public class OldWorkCalendarController {
 			return ResponseOldResultUtil.errorResultMsg("from_id不可为空");
 		}
 		//判断原信息是否存在
-		WorkCalendar calendar = workCalendarService.getById(from_id, DEFAULT_PROJECT_ID);
+		WorkCalendar calendar = workCalendarService.getById(from_id, null, DEFAULT_PROJECT_ID);
 		if (calendar == null) {
 			return ResponseOldResultUtil.errorResultMsg("原工作历信息不存在");
 		}
@@ -197,7 +197,7 @@ public class OldWorkCalendarController {
 	@RequestMapping(value = "update_rule")
 	public ResponseOldResult updateRule(@RequestBody @Validated OldCalendarRuleCreateVO requestData) {
 		// 判断工作历信息是否存在
-		WorkCalendar calendar = workCalendarService.getById(requestData.getId(), DEFAULT_PROJECT_ID);
+		WorkCalendar calendar = workCalendarService.getById(requestData.getId(), null, DEFAULT_PROJECT_ID);
 		if (calendar == null) {
 			return ResponseOldResultUtil.errorResultMsg("工作历信息不存在");
 		}
@@ -229,7 +229,7 @@ public class OldWorkCalendarController {
 	@RequestMapping(value = "set_tags")
 	public ResponseOldResult setTags(@RequestBody @Validated OldCalendarTagsVO requestData) {
 		// 判断工作历信息是否存在
-		WorkCalendar calendar = workCalendarService.getById(requestData.getId(), DEFAULT_PROJECT_ID);
+		WorkCalendar calendar = workCalendarService.getById(requestData.getId(), null, DEFAULT_PROJECT_ID);
 		if (calendar == null) {
 			return ResponseOldResultUtil.errorResultMsg("工作历信息不存在");
 		}
@@ -245,7 +245,7 @@ public class OldWorkCalendarController {
 	@RequestMapping(value = "unset_tags")
 	public ResponseOldResult unsetTags(@RequestBody @Validated OldCalendarTagsVO requestData) {
 		// 判断工作历信息是否存在
-		WorkCalendar calendar = workCalendarService.getById(requestData.getId(), DEFAULT_PROJECT_ID);
+		WorkCalendar calendar = workCalendarService.getById(requestData.getId(), null, DEFAULT_PROJECT_ID);
 		if (calendar == null) {
 			return ResponseOldResultUtil.errorResultMsg("工作历信息不存在");
 		}
@@ -262,7 +262,7 @@ public class OldWorkCalendarController {
 	@RequestMapping(value = "set_intervals")
 	public ResponseOldResult setIntervals(@RequestBody @Validated OldCalendarIntervalsVO<OldCalendarIntervalCreateVO> requestData) {
 		// 判断工作历信息是否存在
-		WorkCalendar calendar = workCalendarService.getById(requestData.getId(), DEFAULT_PROJECT_ID);
+		WorkCalendar calendar = workCalendarService.getById(requestData.getId(), null, DEFAULT_PROJECT_ID);
 		if (calendar == null) {
 			return ResponseOldResultUtil.errorResultMsg("工作历信息不存在");
 		}
@@ -279,7 +279,7 @@ public class OldWorkCalendarController {
 	@RequestMapping(value = "unset_intervals")
 	public ResponseOldResult unsetIntervals(@RequestBody @Validated OldCalendarIntervalsVO<OldCalendarIntervalDeleteVO> requestData) {
 		// 判断工作历信息是否存在
-		WorkCalendar calendar = workCalendarService.getById(requestData.getId(), DEFAULT_PROJECT_ID);
+		WorkCalendar calendar = workCalendarService.getById(requestData.getId(), null, DEFAULT_PROJECT_ID);
 		if (calendar == null) {
 			return ResponseOldResultUtil.errorResultMsg("工作历信息不存在");
 		}
@@ -296,7 +296,7 @@ public class OldWorkCalendarController {
 	@RequestMapping(value = "set_intervals_by_tag")
 	public ResponseOldResult setIntervalsByTag(@RequestBody @Validated OldCalendarIntervalsByTag requestData) {
 		// 判断工作历信息是否存在
-		WorkCalendar calendar = workCalendarService.getById(requestData.getId(), DEFAULT_PROJECT_ID);
+		WorkCalendar calendar = workCalendarService.getById(requestData.getId(), null, DEFAULT_PROJECT_ID);
 		if (calendar == null) {
 			return ResponseOldResultUtil.errorResultMsg("工作历信息不存在");
 		}
@@ -315,7 +315,7 @@ public class OldWorkCalendarController {
 	@RequestMapping(value = "query_details")
 	public ResponseOldResult queryDetails(@RequestBody @Validated OldCalendarQueryVO requestData) {
 		// 判断工作历信息是否存在
-		WorkCalendar calendar = workCalendarService.getById(requestData.getId(), DEFAULT_PROJECT_ID);
+		WorkCalendar calendar = workCalendarService.getById(requestData.getId(), null, DEFAULT_PROJECT_ID);
 		if (calendar == null) {
 			return ResponseOldResultUtil.errorResultMsg("工作历信息不存在");
 		}

+ 54 - 7
src/main/java/com/persagy/calendar/controller/WorkCalendarController.java

@@ -1,9 +1,12 @@
 package com.persagy.calendar.controller;
 
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -45,6 +48,9 @@ import io.swagger.annotations.ApiOperation;
 @RequestMapping(value = "/v2.0/workCalendar", method = RequestMethod.POST)
 public class WorkCalendarController {
     
+	@Value("${integrated.calendar.group-code:BR}")
+	private String defaultGroupCode;
+	
     @Autowired
     private IWorkCalendarService workCalendarService;
     
@@ -60,6 +66,10 @@ public class WorkCalendarController {
     @ApiOperation(value = "普通列表查询")
     @RequestMapping(value = "queryWorkCalendarList")
     public ResponseResult queryWorkCalendarList(@RequestBody @Validated WorkCalendarQueryVO queryVO) {
+    	if (StringUtil.isBlank(queryVO.getGroupCode())) {
+			queryVO.setGroupCode(defaultGroupCode);
+		}
+    	
     	if (StringUtil.isNotBlank(queryVO.getObjId()) && StringUtil.isBlank(queryVO.getId())) {
     		QueryWrapper<WorkCalendarObject> queryWrapper = new WorkCalendarObject.Builder().createQueryWrapper()
     				.groupCodeEq(queryVO.getGroupCode()).projectIdEq(queryVO.getProjectId())
@@ -85,11 +95,15 @@ public class WorkCalendarController {
     @ApiOperation(value = "根据原有的工作历创建")
     @RequestMapping(value = "createWorkCalendarFromId")
     public ResponseResult createWorkCalendarFromId(@RequestBody @Validated WorkCalendarUpdateVO updateVO) {
+    	if (StringUtil.isBlank(updateVO.getGroupCode())) {
+			updateVO.setGroupCode(defaultGroupCode);
+		}
+    	
     	if (StringUtil.isBlank(updateVO.getFromId())) {
 			return ResponseUtil.errorResult(ResponseCode.A0400.getCode(), "工作历来源ID不可为空");
 		}
     	// 判断原有的工作历信息是否存在
-		WorkCalendar workCalendar = workCalendarService.getById(updateVO.getFromId(), updateVO.getProjectId());
+		WorkCalendar workCalendar = workCalendarService.getById(updateVO.getFromId(), updateVO.getGroupCode(), updateVO.getProjectId());
 		if (workCalendar == null) {
 			return ResponseUtil.errorResult(ResponseCode.C0320.getCode(), "原工作历信息不存在");
 		}
@@ -102,7 +116,10 @@ public class WorkCalendarController {
 		BeanUtils.copyProperties(updateVO, workCalendar);
 		workCalendar.setId(null);	// 置空
 		workCalendar.setUpdateUser(updateVO.getUserId());
-    	return this.workCalendarHandler.createWorkCalendarFromId(updateVO.getFromId(), workCalendar);
+		if (StringUtil.isNotBlank(updateVO.getNewProjectId())) {
+			workCalendar.setProjectId(updateVO.getNewProjectId());
+		}
+    	return this.workCalendarHandler.createWorkCalendarFromId(workCalendar, updateVO.getFromId(), workCalendar.getProjectId());
     }
     
     /**
@@ -111,6 +128,10 @@ public class WorkCalendarController {
 	@ApiOperation(value = "新增")
 	@RequestMapping(value = "createWorkCalendar")
     public ResponseResult createWorkCalendar(@RequestBody @Validated WorkCalendarUpdateVO updateVO) {
+		if (StringUtil.isBlank(updateVO.getGroupCode())) {
+			updateVO.setGroupCode(defaultGroupCode);
+		}
+		
 		// 判断projectId和name是否联合唯一
 		boolean result = workCalendarService.checkProjetcIdAndName(null, updateVO.getProjectId(), updateVO.getGroupCode(), updateVO.getCalendarName());
 		if (!result) {
@@ -131,11 +152,15 @@ public class WorkCalendarController {
 	@ApiOperation(value = "更新")
 	@RequestMapping(value = "updateWorkCalendar")
     public ResponseResult updateWorkCalendar(@RequestBody @Validated WorkCalendarUpdateVO updateVO) {
+		if (StringUtil.isBlank(updateVO.getGroupCode())) {
+			updateVO.setGroupCode(defaultGroupCode);
+		}
+		
 		if (StringUtil.isBlank(updateVO.getId())) {
 			return ResponseUtil.errorResult(ResponseCode.A0400.getCode(), "工作历ID不可为空");
 		}
 		// 判断原数据是否存在
-		WorkCalendar calendar = workCalendarService.getById(updateVO.getId(), updateVO.getProjectId());
+		WorkCalendar calendar = workCalendarService.getById(updateVO.getId(), updateVO.getGroupCode(), updateVO.getProjectId());
 		if (calendar == null) {
 			return ResponseUtil.errorResult(ResponseCode.C0320.getCode(), ResponseCode.C0320.getDesc());
 		}
@@ -159,12 +184,34 @@ public class WorkCalendarController {
     @ApiOperation(value = "删除")
     @RequestMapping(value = "deleteWorkCalendar")
     public ResponseResult deleteWorkCalendar(@RequestBody @Validated BaseUpdateVO baseUpdateVO) {
-    	// 判断原数据是否存在
-		WorkCalendar calendar = workCalendarService.getById(baseUpdateVO.getId(), baseUpdateVO.getProjectId());
-		if (calendar == null) {
+    	if (StringUtil.isBlank(baseUpdateVO.getGroupCode())) {
+			baseUpdateVO.setGroupCode(defaultGroupCode);
+		}
+    	
+    	// 获取此集团下所有的工作历类型,并判断原数据是否存在
+    	QueryWrapper<WorkCalendar> queryWrapper = new WorkCalendar.Builder().createQueryWrapper()
+    			.groupCodeEq(baseUpdateVO.getGroupCode()).builderQueryWrapper();
+    	List<WorkCalendar> workCalendars = this.workCalendarService.list(queryWrapper);
+		if (CollectionUtil.isEmpty(workCalendars)) {
+			return ResponseUtil.errorResult(ResponseCode.C0320.getCode(), ResponseCode.C0320.getDesc());
+		}
+		boolean result = false;
+		String projectId = baseUpdateVO.getProjectId();
+		Set<String> allCalendarIds = new HashSet<String>();
+		for (WorkCalendar workCalendar : workCalendars) {
+			if (projectId.equals(workCalendar.getProjectId())) {
+				allCalendarIds.add(workCalendar.getId());
+				
+				if (!result && baseUpdateVO.getId().equals(workCalendar.getId())) {
+					result = true;
+				}
+			}
+		}
+		if (!result) {
 			return ResponseUtil.errorResult(ResponseCode.C0320.getCode(), ResponseCode.C0320.getDesc());
 		}
-		return workCalendarHandler.deleteWorkCalendar(baseUpdateVO);
+		// 执行级联删除
+		return workCalendarHandler.deleteWorkCalendar(baseUpdateVO, workCalendars.size() == 1, allCalendarIds.size() == 1);
     }
     
 }

+ 31 - 6
src/main/java/com/persagy/calendar/controller/WorkCalendarDateController.java

@@ -3,6 +3,7 @@ package com.persagy.calendar.controller;
 import java.util.List;
 
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -23,6 +24,7 @@ import com.persagy.calendar.pojo.vo.WorkCalendarDateQueryVO;
 import com.persagy.calendar.pojo.vo.WorkCalendarDateUpdateVO;
 import com.persagy.calendar.pojo.vo.WorkCalendarMoreDateCreateVO;
 import com.persagy.calendar.service.IWorkCalendarDateService;
+import com.persagy.calendar.service.IWorkCalendarDictService;
 import com.persagy.calendar.service.IWorkCalendarObjectService;
 import com.persagy.calendar.service.IWorkCalendarService;
 import com.persagy.common.enums.ResponseCode;
@@ -48,6 +50,9 @@ import io.swagger.annotations.ApiOperation;
 @RequestMapping(value = "/v2.0/workCalendarDate", method = RequestMethod.POST)
 public class WorkCalendarDateController {
   
+	@Value("${integrated.calendar.group-code:BR}")
+	private String defaultGroupCode;
+	
     @Autowired
     private IWorkCalendarService workCalendarService;
 	
@@ -57,11 +62,14 @@ public class WorkCalendarDateController {
     @Autowired
     private IWorkCalendarDateService workCalendarDateService;
     
+	@Autowired
+	private IWorkCalendarDictService workCalendarDictService;
+    
     @Autowired
     private IWorkCalendarObjectService workCalendarObjectService;
     
     /**
-     * 列表查询
+     * 列表查询,这里可不需要集团编码
      */
     @ApiOperation(value = "列表查询")
     @RequestMapping(value = "queryWorkCalendarDateList")
@@ -69,6 +77,7 @@ public class WorkCalendarDateController {
     	/*if (StringUtil.isBlank(queryVO.getProjectId())) {
 			return ResponseUtil.errorResult("项目ID不可为空");
 		}*/
+    	
     	if (StringUtil.isNotBlank(queryVO.getObjId())) {
     		QueryWrapper<WorkCalendarObject> queryWrapper = new WorkCalendarObject.Builder().createQueryWrapper()
     				.projectIdEq(queryVO.getProjectId()).objectIdEq(queryVO.getObjId()).builderQueryWrapper();
@@ -87,17 +96,24 @@ public class WorkCalendarDateController {
     
 	/**
      * 添加自定义作息时间
-     * 同项目下,同天、同类型+code只允许存在一条自定义信息,且自定义的时间需大于当日
+     * 
+     * 自定义作息时间,一定是属于工作历级别的,这一点不允许修改,不然规则解析需要推翻重来,改动很大
      */
 	@ApiOperation(value = "添加自定义作息时间")
 	@RequestMapping(value = "createCustomCalendarDate")
     public ResponseResult createCustomCalendarDate(@RequestBody @Validated CustomCalendarVO<WorkCalendarDateCreateVO> createVO) {
+		if (StringUtil.isBlank(createVO.getGroupCode())) {
+			createVO.setGroupCode(defaultGroupCode);
+		}
+		
 		this.workCalendarDateHandler.batchCreateCalendarDate(createVO);
 		return ResponseUtil.successResult("添加成功");
 	}
 	
 	/**
      * 多时间段添加工作历作息时间信息,且自定义的开始时间需大于当日,先删除此dictType下数据,再添加
+     * 
+     * 自定义作息时间,一定是属于工作历级别的,这一点不允许修改,不然规则解析需要推翻重来,改动很大
      */
 	@ApiOperation(value = "多时间段添加工作历作息时间信息")
 	@RequestMapping(value = "createCustomCalendarMoreDate")
@@ -105,6 +121,9 @@ public class WorkCalendarDateController {
 		/*if (BooleanUtil.isFalse(createVO.getIsDelete()) && CollectionUtil.isEmpty(createVO.getTimetable())) {
 			return ResponseUtil.errorResult(ResponseCode.A0400.getCode(), "作息时间点集合timetable,不可为空");
 		}*/
+		if (StringUtil.isBlank(createVO.getGroupCode())) {
+			createVO.setGroupCode(defaultGroupCode);
+		}
 		
 		// 判断日期是否合法
 		boolean thanToday = WorkCalendarDateHandler.isMoreThanToday(createVO.getWorkDateStart());
@@ -112,7 +131,7 @@ public class WorkCalendarDateController {
 			return ResponseUtil.errorResult(ResponseCode.A0402.getCode(), "开始作息日期不合法,历史时间不允许再添加自定义作息时间点");
 		}
 		// 判断工作历类型是否存在
-		WorkCalendar calendar = this.workCalendarService.getById(createVO.getCalendarId(), createVO.getProjectId());
+		WorkCalendar calendar = this.workCalendarService.getById(createVO.getCalendarId(), createVO.getGroupCode(), createVO.getProjectId());
 		if (calendar == null) {
 			throw new BusinessException("工作历类型不存在");
 		}
@@ -122,7 +141,8 @@ public class WorkCalendarDateController {
 	
     /**
      * 更新自定义作息时间
-     * 同项目下,同天、同类型+code只允许存在一条自定义信息,且自定义的时间需大于当日
+     * 
+     * 自定义作息时间,一定是属于工作历级别的,这一点不允许修改,不然规则解析需要推翻重来,改动很大
      */
 	@ApiOperation(value = "更新自定义作息时间")
 	@RequestMapping(value = "updateCustomCalendarDate")
@@ -137,14 +157,19 @@ public class WorkCalendarDateController {
 	@ApiOperation(value = "物理删除自定义作息时间")
 	@RequestMapping(value = "deleteCustomCalendarDate")
     public ResponseResult deleteCustomCalendarDate(@RequestBody @Validated WorkCalendarDateDeleteVO deleteVO) {
+		if (StringUtil.isBlank(deleteVO.getGroupCode())) {
+			deleteVO.setGroupCode(defaultGroupCode);
+		}
+		int dictTypeLevel = this.workCalendarDictService.getDictTypeLevel(deleteVO.getGroupCode(), deleteVO.getDictType());
+		
 		// 判断日期是否合法
 		boolean thanToday = WorkCalendarDateHandler.isMoreThanToday(deleteVO.getWorkDateStart());
 		if (!thanToday) {
 			return ResponseUtil.errorResult(ResponseCode.A0402.getCode(), "作息日期不合法,历史数据不允许被删除");
 		}
-		QueryWrapper<WorkCalendarDate> queryWrapper = new WorkCalendarDate.Builder().createQueryWrapper()
+		QueryWrapper<WorkCalendarDate> queryWrapper = new WorkCalendarDate.Builder().createQueryWrapper().groupCodeEq(deleteVO.getGroupCode())
 				.workDateGe(deleteVO.getWorkDateStart()).workDateLe(deleteVO.getWorkDateEnd())
-				.projectIdEq(deleteVO.getProjectId()).idEq(deleteVO.getId())
+				.projectIdEq(deleteVO.getProjectId(), dictTypeLevel).idEq(deleteVO.getId())
 				.dictTypeEq(deleteVO.getDictType()).dictCodeIn(deleteVO.getDictCode())
 				.customFlagEq(WorkCalendarConstant.CUSTOM_CALENDAR_DATE_YES).builderQueryWrapper();
 		boolean result = this.workCalendarDateService.remove(queryWrapper);

+ 10 - 2
src/main/java/com/persagy/calendar/controller/WorkCalendarLabelController.java

@@ -17,8 +17,10 @@ import com.persagy.calendar.pojo.vo.WorkCalendarLabelQueryVO;
 import com.persagy.calendar.pojo.vo.WorkCalendarLabelUpdateVO;
 import com.persagy.calendar.pojo.vo.WorkCalendarMoreDateCreateVO;
 import com.persagy.calendar.pojo.vo.WorkLabelBatchUpdateVO;
+import com.persagy.common.enums.ResponseCode;
 import com.persagy.common.utils.ResponseResult;
 import com.persagy.common.utils.ResponseUtil;
+import com.persagy.common.utils.StringUtil;
 
 import cn.hutool.core.collection.CollectionUtil;
 import io.swagger.annotations.Api;
@@ -53,11 +55,17 @@ public class WorkCalendarLabelController {
     }
     
 	/**
-     * 查询标签的有效期
-     */
+	 * 查询标签的有效期 dictType必须存在
+	 * 
+	 * @param queryVO 
+	 * @return
+	 */
     @ApiOperation(value = "查询标签的有效期")
     @RequestMapping(value = "queryCalendarLabelValid")
     public ResponseResult queryCalendarLabelValid(@RequestBody @Validated WorkCalendarLabelQueryVO queryVO) {
+    	if (StringUtil.isBlank(queryVO.getDictType())) {
+    		return ResponseUtil.errorResult(ResponseCode.A0400.getCode(), "标签类型,不可为空");
+		}
 		List<WorkCalendarLabel> dateList = this.workCalendarLabelHandler.queryCalendarLabelValid(queryVO);
 		if (CollectionUtil.isEmpty(dateList)) {
 			return ResponseUtil.successResult(Lists.newArrayList(), 0L);

+ 36 - 15
src/main/java/com/persagy/calendar/controller/WorkCalendarRuleController.java

@@ -20,6 +20,7 @@ import com.persagy.calendar.pojo.vo.WorkCalendarRuleCreateVO;
 import com.persagy.calendar.pojo.vo.WorkCalendarRuleDeleteVO;
 import com.persagy.calendar.pojo.vo.WorkCalendarRuleQueryVO;
 import com.persagy.calendar.pojo.vo.WorkCalendarRuleUpdateVO;
+import com.persagy.calendar.service.IWorkCalendarDictService;
 import com.persagy.calendar.service.IWorkCalendarRuleService;
 import com.persagy.calendar.service.IWorkCalendarService;
 import com.persagy.common.enums.ResponseCode;
@@ -49,28 +50,32 @@ public class WorkCalendarRuleController {
     private IWorkCalendarService workCalendarService;
     
     @Autowired
+    private WorkCalendarRuleHandler workCalendarRuleHandler;
+    
+    @Autowired
     private IWorkCalendarRuleService workCalendarRuleService;
     
     @Autowired
-    private WorkCalendarRuleHandler workCalendarRuleHandler;
+	private IWorkCalendarDictService workCalendarDictService;
     
     /**
      * 普通列表查询
      */
     @ApiOperation(value = "普通列表查询")
     @RequestMapping(value = "queryWorkCalendarRuleList")
-    public ResponseResult queryWorkCalendarRuleList(@RequestBody @Validated WorkCalendarRuleQueryVO workCalendarRuleQueryVO) {
-    	QueryWrapper<WorkCalendarRule> queryWrapper = new WorkCalendarRule.Builder().createQueryWrapper()
-    			.idEq(workCalendarRuleQueryVO.getId()).calendarIdEq(workCalendarRuleQueryVO.getCalendarId())
-    			.dictTypeEq(workCalendarRuleQueryVO.getDictType()).dictCodeIn(workCalendarRuleQueryVO.getDictCode())
+    public ResponseResult queryWorkCalendarRuleList(@RequestBody @Validated WorkCalendarRuleQueryVO queryVO) {
+    	int dictTypeLevel = this.workCalendarDictService.getDictTypeLevel(queryVO.getGroupCode(), queryVO.getDictType());
+    	
+    	QueryWrapper<WorkCalendarRule> queryWrapper = new WorkCalendarRule.Builder().createQueryWrapper().groupCodeEq(queryVO.getGroupCode())
+    			.idEq(queryVO.getId()).calendarIdEq(queryVO.getCalendarId(), dictTypeLevel).projectIdEq(queryVO.getProjectId(), dictTypeLevel)
+    			.dictTypeEq(queryVO.getDictType()).dictCodeIn(queryVO.getDictCode())
     			.delFlagEq(WorkCalendarConstant.WORK_CALENDAR_DEL_FLAG_NOR).builderQueryWrapper();
-    	List<WorkCalendarRule> list = workCalendarRuleService.list(queryWrapper);
+    	List<WorkCalendarRule> list = this.workCalendarRuleService.list(queryWrapper);
     	return ResponseUtil.successResult(list, CollectionUtil.isEmpty(list) ? 0L : list.size());
     }
     
     /**
      * 新增
-     * isValid为true时,同项目同工作历类型下,dictType+dictCode唯一
      */
 	@ApiOperation(value = "保存")
 	@RequestMapping(value = "createWorkCalendarRule")
@@ -81,7 +86,6 @@ public class WorkCalendarRuleController {
     
     /**
      * 更新
-     * isValid为true时,同项目同工作历类型下,dictType+dictCode唯一
      */
 	@ApiOperation(value = "更新")
 	@RequestMapping(value = "updateWorkCalendarRule")
@@ -102,24 +106,41 @@ public class WorkCalendarRuleController {
     	if (StringUtil.isBlank(ruleId) && StringUtil.isBlank(calendarId)) {
     		return ResponseUtil.errorResult(ResponseCode.A0400.getCode(), "规则ID和工作历ID至少存在其一");
 		}
-    	if (ruleId != null) {
+    	if (StringUtil.isNotBlank(ruleId)) {
     		//先判断原规则数据是否存在
-    		WorkCalendarRule calendarRule = workCalendarRuleService.getById(ruleId, deleteVO.getProjectId());
+    		WorkCalendarRule calendarRule = this.workCalendarRuleService.getById(ruleId);
     		if (calendarRule == null) {
     			return ResponseUtil.errorResult(ResponseCode.C0320.getCode(), "规则信息不存在");
     		}
 		}
-    	if (calendarId != null) {
-    		// 判断工作历信息是否存在
-    		WorkCalendar workCalendar = workCalendarService.getById(calendarId, deleteVO.getProjectId());
-    		if (workCalendar == null) {
+    	
+    	boolean result = false;
+    	Integer dictTypeLevel = null;
+    	if (StringUtil.isNotBlank(calendarId)) {
+    		// 获取项目下所有的工作历信息
+    		QueryWrapper<WorkCalendar> queryWrapper = new WorkCalendar.Builder().createQueryWrapper().groupCodeEq(deleteVO.getGroupCode())
+    				.projectIdEq(deleteVO.getProjectId()).builderQueryWrapper();
+    		List<WorkCalendar> workCalendars = this.workCalendarService.list(queryWrapper);
+    		if (CollectionUtil.isEmpty(workCalendars)) {
     			return ResponseUtil.errorResult(ResponseCode.C0320.getCode(), "工作历主信息不存在");
     		}
+    		// 判断此项目下,还有没有额外的工作历类型了,没有,删除项目下全部
+    		for (WorkCalendar workCalendar : workCalendars) {
+				if (calendarId.equals(workCalendar.getId())) {
+					result = true;
+					break;
+				}
+			}
+    		if (!result) {
+    			return ResponseUtil.errorResult(ResponseCode.C0320.getCode(), "工作历主信息不存在");
+			}
+    		dictTypeLevel = workCalendars.size() == 1 ? 1 : 2;
 		}
+    	
     	WorkCalendarRule workCalendarRule = new WorkCalendarRule();
     	BeanUtils.copyProperties(deleteVO, workCalendarRule);
     	workCalendarRule.setUpdateUser(deleteVO.getUserId());
-    	boolean result = workCalendarRuleService.deleteWorkCalendarRule(workCalendarRule);
+    	result = workCalendarRuleService.deleteWorkCalendarRule(workCalendarRule, dictTypeLevel);
         return result ? ResponseUtil.successResult("删除成功") : ResponseUtil.errorResult("删除失败");
     }
     

+ 425 - 300
src/main/java/com/persagy/calendar/handle/WorkCalendarDateHandler.java

@@ -27,8 +27,10 @@ import com.persagy.calendar.pojo.vo.WorkCalendarDateQueryVO;
 import com.persagy.calendar.pojo.vo.WorkCalendarDateUpdateVO;
 import com.persagy.calendar.pojo.vo.WorkCalendarMoreDateCreateVO;
 import com.persagy.calendar.service.IWorkCalendarDateService;
+import com.persagy.calendar.service.IWorkCalendarDictService;
 import com.persagy.calendar.service.IWorkCalendarRuleService;
 import com.persagy.calendar.service.IWorkCalendarService;
+import com.persagy.common.enums.ResponseCode;
 import com.persagy.common.exception.BusinessException;
 import com.persagy.common.utils.DateUtil;
 import com.persagy.common.utils.IdGenerator;
@@ -38,7 +40,6 @@ import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.date.DateField;
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUnit;
-import cn.hutool.core.util.BooleanUtil;
 import lombok.extern.slf4j.Slf4j;
 
 /**
@@ -61,174 +62,298 @@ public class WorkCalendarDateHandler {
     @Autowired
     private IWorkCalendarDateService workCalendarDateService;
     
+	@Autowired
+	private IWorkCalendarDictService workCalendarDictService;
+    
+	/**
+	 * 创建工作历作息时间信息,先删除在创建
+	 * 
+	 * @param workCalendarDates
+	 * @param workDateStart 不能为空
+	 * @param workDateEnd 不能为空
+	 * @return
+	 */
+	@Transactional
+	public boolean createCalendarDateByDelete(List<WorkCalendarDate> workCalendarDates, String workDateStart, String workDateEnd) {
+		// 1.防止重复执行,优先删除从今日开始的非自定义的作息时间信息
+		QueryWrapper<WorkCalendarDate> queryWrapper = new WorkCalendarDate.Builder().createQueryWrapper()
+				.customFlagEq(WorkCalendarConstant.CUSTOM_CALENDAR_DATE_NO)
+				.workDateGe(workDateStart).workDateLe(workDateEnd).builderQueryWrapper();
+		this.workCalendarDateService.remove(queryWrapper);
+		
+		// 2.信息插入
+		boolean result = this.workCalendarDateService.batchCreateCalendarDate(workCalendarDates);
+		return result;
+	}
+	
     /**
-     * 实时查询作息时间信息,包括自定义的
+     * 实时查询作息时间信息,包括自定义的,当日的作息时间,走规则解析
+     * 
      * @param queryVO
      * @return
      */
     public List<CalendarDateResult> queryWorkCalendarDateList(WorkCalendarDateQueryVO queryVO) {
-    	// key-日期,value-此日对应的作息时间集合
-    	Map<String, List<WorkCalendarDate>> resultMap = new HashMap<String, List<WorkCalendarDate>>();
-    	// key-项目+日期+type+code,value-true存在自定义信息,false 不存在自定义信息
-    	Map<String, Boolean> existsCustom = new HashMap<String, Boolean>();
-    	
-    	// 1.优先获取start~end的作息时间信息,包含自定义的,判断对应日期内是否包含自定义的
-    	this.selectHistoryDate(resultMap, existsCustom, queryVO);
-    	
-    	// 2.获取满足 明日/start~end日期 的规则信息集合
-    	String format = DateUtil.format(new Date(), DateUtil.FORMAT_DATE_YYYYMMDD);
-    	DateTime currentDate = DateUtil.parse(format, DateUtil.FORMAT_DATE_YYYYMMDD);
+    	// 优先进行时间调整解析,所有的时间都必须是 YYYYMMDD 格式
     	String dateStartStr = queryVO.getWorkDateStart();
     	String dateEndStr = queryVO.getWorkDateEnd();
+    	
+    	// 中间时间
+    	String now = DateUtil.format(new Date(), DateUtil.FORMAT_DATE_YYYYMMDD);
     	DateTime dateStart = DateUtil.parse(dateStartStr, DateUtil.FORMAT_DATE_YYYYMMDD);
 		DateTime dateEnd = DateUtil.parse(dateEndStr, DateUtil.FORMAT_DATE_YYYYMMDD);
-		if (currentDate.before(dateStart)) {
-			currentDate = dateStart;
-		} else {
-			// 验证此日是否已存在数据,已存在,这里往后偏移一日
-			if (resultMap.containsKey(currentDate.toString(DateUtil.FORMAT_DATE_YYYYMMDD))) {
-				currentDate.offset(DateField.DAY_OF_YEAR, 1);
+		
+		Map<String, DateTime> parseWorkDate = this.parseWorkDate(dateStart, dateEnd, now);
+		
+		DateTime historyStart = parseWorkDate.get("historyStart");
+		DateTime historyEnd = parseWorkDate.get("historyEnd");
+		DateTime parseRuleStart = parseWorkDate.get("parseRuleStart");
+		DateTime parseRuleEnd = parseWorkDate.get("parseRuleEnd");
+		
+		// 判断字典类型,TODO 这里该不该判断??后续再做修改
+		int dictTypeLevel = this.workCalendarDictService.getDictTypeLevel(null, queryVO.getDictType());
+    	
+		// 1.取历史作息时间记录
+		Map<String, List<WorkCalendarDate>> calendarDateMap = new HashMap<String, List<WorkCalendarDate>>();
+		if (historyStart != null && historyEnd != null) {
+			queryVO.setWorkDateStart(DateUtil.format(historyStart, DateUtil.FORMAT_DATE_YYYYMMDD));
+			queryVO.setWorkDateEnd(DateUtil.format(historyEnd, DateUtil.FORMAT_DATE_YYYYMMDD));
+			List<WorkCalendarDate> historyDateList = this.selectWorkCalendarDateList(queryVO, null, dictTypeLevel);
+	    	if (CollectionUtil.isNotEmpty(historyDateList)) {
+				for (WorkCalendarDate historyDate : historyDateList) {
+					if (calendarDateMap.containsKey(historyDate.getWorkDate())) {
+						calendarDateMap.get(historyDate.getWorkDate()).add(historyDate);
+					} else {
+						calendarDateMap.put(historyDate.getWorkDate(), Lists.newArrayList(historyDate));
+					}
+				}
 			}
 		}
 		
-		// 因为dataEnd时分秒一定是000000,所以这里只要当前日期时间点在dateEnd之前,就说明偏移后最坏与dateEnd相同
-    	if (currentDate.before(dateEnd) || currentDate.equals(dateEnd)) {
-    		String offsetStr = currentDate.toString(DateUtil.FORMAT_DATE_YYYYMMDD);
-    		List<WorkCalendarRule> ruleList = this.selectWorkCalendarRuleList(offsetStr, dateEndStr, queryVO);
-    		if (CollectionUtil.isNotEmpty(ruleList)) {
-				// 3.实时解析规则,并判断是否存在自定义的作息时间信息,最后封装返回数据
-				long betweenDay = DateUtil.between(currentDate, dateEnd, DateUnit.DAY) + 1;
-				this.paserWorkCalendarRule(betweenDay, currentDate, ruleList, resultMap, existsCustom);
-			}
-    	}
-    	
+		// 2.取当日往后的自定义作息时间
+		List<WorkCalendarDate> customDateList = null;
+		if (parseRuleStart != null && parseRuleEnd != null) {
+			queryVO.setWorkDateStart(DateUtil.format(parseRuleStart, DateUtil.FORMAT_DATE_YYYYMMDD));
+			queryVO.setWorkDateEnd(DateUtil.format(parseRuleEnd, DateUtil.FORMAT_DATE_YYYYMMDD));
+			customDateList = this.selectWorkCalendarDateList(queryVO, WorkCalendarConstant.CUSTOM_CALENDAR_DATE_YES, dictTypeLevel);
+		}
+		
+		// 3.获取当日往后的规则信息中的作息时间
+		if (parseRuleStart != null && parseRuleEnd != null) {
+			List<WorkCalendarRule> ruleList = this.selectWorkCalendarRuleList(queryVO, dictTypeLevel);
+			long betweenDay = DateUtil.between(parseRuleStart, parseRuleEnd, DateUnit.DAY) + 1;
+			this.paserWorkCalendarRule(calendarDateMap, ruleList, parseRuleStart, betweenDay);
+		}
+		
 		// 获取start~end之间的天数,+1 包括首尾
     	dateStart = DateUtil.parse(dateStartStr, DateUtil.FORMAT_DATE_YYYYMMDD);
 		long betweenDay = DateUtil.between(dateStart, dateEnd, DateUnit.DAY) + 1;
 		
-		return this.setResultList(queryVO.getCalendarId(), betweenDay, dateStart, resultMap);
+		// 4.结果加工处理返回
+		return this.setResultList(calendarDateMap, customDateList, dateStart, betweenDay);
     }
     
     /**
-     * 响应数据,最后处理加工,根据dictCode,剔除某天多余的数据
-     * @param calendarId
-     * @param betweenDay
+     * 响应数据,最后处理加工,自定义的将会覆盖掉非自定义的
+     * 
+     * @param calendarDateMap 包含历史与实时规则中的作息时间集合
+     * @param customDateList
      * @param dateStart
-     * @param resultMap
+     * @param betweenDay
      * @return
      */
-    private List<CalendarDateResult> setResultList(String calendarId, long betweenDay, DateTime dateStart, 
-    		Map<String, List<WorkCalendarDate>> resultMap) {
+    private List<CalendarDateResult> setResultList(Map<String, List<WorkCalendarDate>> calendarDateMap, List<WorkCalendarDate> customDateList, 
+    		DateTime dateStart, long betweenDay) {
+    	// 结果集
     	List<CalendarDateResult> resultList = new ArrayList<CalendarDateResult>();
     	
-    	String nextDay = null;
+    	// 自定义作息时间 当日~end时间内的
+    	Map<String, List<WorkCalendarDate>> customDateMap = new HashMap<String, List<WorkCalendarDate>>();
+    	if (CollectionUtil.isNotEmpty(customDateList)) {
+			for (WorkCalendarDate customDate : customDateList) {
+				if (customDateMap.containsKey(customDate.getWorkDate())) {
+					customDateMap.get(customDate.getWorkDate()).add(customDate);
+				} else {
+					customDateMap.put(customDate.getWorkDate(), Lists.newArrayList(customDate));
+				}
+			}
+		}
+    	
+    	String workDate = null;
 		for (int i = 0; i < betweenDay; i++) {
-			nextDay = dateStart.toString(DateUtil.FORMAT_DATE_YYYYMMDD);
+			workDate = dateStart.toString(DateUtil.FORMAT_DATE_YYYYMMDD);
+			List<WorkCalendarDate> historyOrRuleDates = calendarDateMap.get(workDate);
+			List<WorkCalendarDate> customDates = customDateMap.get(workDate);
+			
 			CalendarDateResult result = new CalendarDateResult();
 			int dayOfWeek = DateUtil.dayOfWeek(dateStart);
 			if (dayOfWeek == 1 || dayOfWeek == 7) {
 				result.setWorkday(false);
 			}
-			result.setWorkDate(nextDay);
-			result.setCalendarId(calendarId);
+			result.setWorkDate(workDate);
+			
+			// 判断是否需要覆盖掉非自定义的作息时间信息
+			if (CollectionUtil.isNotEmpty(customDates)) {
+				historyOrRuleDates = this.coverCalendarDate(historyOrRuleDates, customDates, true);
+			}
+			
 			result.setDate(DateUtil.dayOfMonth(dateStart));
 			result.setWeek(WorkCalendarConstant.DAY_OF_WEEK.get(dayOfWeek));
-			List<WorkCalendarDate> list = resultMap.get(nextDay);
-			if (CollectionUtil.isNotEmpty(list)) {
-				for (int j = list.size() - 1; j >= 0; j--) {
-					WorkCalendarDate calendarDate = list.get(j);
+			if (CollectionUtil.isNotEmpty(historyOrRuleDates)) {
+				for (int j = historyOrRuleDates.size() - 1; j >= 0; j--) {
+					WorkCalendarDate calendarDate = historyOrRuleDates.get(j);
 					// 是工作日,剔除非工作日的数据,目前仅有OpenTime-1,工作日,OpenTime-2,休息日
 					if (result.isWorkday() && "OpenTime-2".equals(calendarDate.getDictCode())) {
-						list.remove(j);
+						historyOrRuleDates.remove(j);
 					} else if (!result.isWorkday() && "OpenTime-1".equals(calendarDate.getDictCode())) {
-						list.remove(j);
+						historyOrRuleDates.remove(j);
 					}
 				}
 			}
 			
-			result.setTimeTable(CollectionUtil.isEmpty(list) ? Lists.newArrayList() : list);
+			result.setTimeTable(CollectionUtil.isEmpty(historyOrRuleDates) ? Lists.newArrayList() : historyOrRuleDates);
 			resultList.add(result);
 			dateStart.offset(DateField.DAY_OF_YEAR, 1);	 	// 下一天
 		}
-		resultMap.clear();   //释放
+		
+		customDateMap.clear();   //释放
+		calendarDateMap.clear();
 		return resultList;
     }
     
+    
+    /**
+	 * 自定义与规则的进行判断,存在的自定义的将不再进行插入
+	 * 
+	 * @param queryVO
+	 * @param customDateList
+	 * @param calendarDateMap
+	 * @return
+	 */
+	public List<WorkCalendarDate> handleParseCalendarRule(WorkCalendarDateQueryVO queryVO, List<WorkCalendarDate> customDateList,
+			Map<String, List<WorkCalendarDate>> calendarDateMap) {
+		List<WorkCalendarDate> resultList = new ArrayList<WorkCalendarDate>();
+		
+		Set<String> keySet = calendarDateMap.keySet();
+		if (CollectionUtil.isEmpty(customDateList)) {
+			for (String key : keySet) {
+				resultList.addAll(calendarDateMap.get(key));
+			}
+		} else {
+			for (String key : keySet) {
+				List<WorkCalendarDate> ruleDates = calendarDateMap.get(key);
+				ruleDates = this.coverCalendarDate(ruleDates, customDateList, false);
+				resultList.addAll(ruleDates);
+			}
+		}
+		
+		resultList.forEach(calendarDate -> calendarDate.setId(IdGenerator.getUUID()));
+		return resultList;
+	}
+	
     /**
-     * 获取此段日期内,所有的历史数据,包含自定义的,同一天存在自定义和非自定义的,将剔除非自定义的数据
+     * 是否需要覆盖掉非自定义的作息时间,自定义覆盖掉规则的
      * 
-     * @param resultMap	key-日期,value-此日对应的作息时间集合,包含未来自定义的
-     * @param existsCustom key-项目+日期+type+code,value-true存在自定义信息,false 不存在自定义信息
+     * @param ruleDates 允许为空
+     * @param customDates 不能为空
+     * @param isCover true-自定义的覆盖非自定义的,false-当天存在自定义的信息时,非自定义的丢弃
+     * @return 不会返回null
      */
-    public void selectHistoryDate(Map<String, List<WorkCalendarDate>> resultMap, Map<String, Boolean> existsCustom, WorkCalendarDateQueryVO queryVO) {
-		List<WorkCalendarDate> dates = this.selectWorkCalendarDateList(queryVO);
-		for (WorkCalendarDate calendarDate : dates) {
-			// 是否存在自定义,存在true就不在更新
-			String existsKey = this.getCustomKey(calendarDate);
-			boolean exists = WorkCalendarConstant.CUSTOM_CALENDAR_DATE_YES.equals(calendarDate.getCustomFlag());
-			if (!BooleanUtil.isTrue(existsCustom.get(existsKey))) {
-				existsCustom.put(existsKey, exists);
+	private List<WorkCalendarDate> coverCalendarDate(List<WorkCalendarDate> ruleDates, List<WorkCalendarDate> customDates, boolean isCover) {
+		if (CollectionUtil.isEmpty(ruleDates)) {
+			return customDates;
+		}
+		
+		// 开始验证
+		List<WorkCalendarDate> result = new ArrayList<WorkCalendarDate>();
+		Map<String, Integer> dictTypeLevelMap = new HashMap<String, Integer>();
+		
+		for (int i = ruleDates.size() - 1; i >= 0; i--) {
+			WorkCalendarDate ruleDate = ruleDates.get(i);
+			// 判断当前字典类型级别
+			Integer dictTypeLevel = dictTypeLevelMap.get(ruleDate.getDictType());
+			if (dictTypeLevel == null) {
+				dictTypeLevel = this.workCalendarDictService.getDictTypeLevel(ruleDate.getGroupCode(), ruleDate.getDictType());
+				dictTypeLevelMap.put(ruleDate.getDictType(), dictTypeLevel);
 			}
-			// 将自定义的或历史的,按照日期,分组
-			if (resultMap != null) {
-				if (BooleanUtil.isTrue(existsCustom.get(existsKey))) {
-					resultMap.put(calendarDate.getWorkDate(), Lists.newArrayList(calendarDate));
-					continue;
+			
+			// 项目ID和工作历ID转换
+			if (dictTypeLevel == 0) {
+				ruleDate.setProjectId("0");
+				ruleDate.setCalendarId("0");
+			} else if (dictTypeLevel == 1) {
+				ruleDate.setCalendarId("0");
+			}
+			
+			boolean isCustom = false;
+			for (WorkCalendarDate customDate : customDates) {
+				// 项目ID和工作历ID转换
+				if (dictTypeLevel == 0) {
+					customDate.setProjectId("0");
+					customDate.setCalendarId("0");
+				} else if (dictTypeLevel == 1) {
+					customDate.setCalendarId("0");
 				}
-				if (resultMap.containsKey(calendarDate.getWorkDate())) {
-					resultMap.get(calendarDate.getWorkDate()).add(calendarDate);
-				} else {
-					resultMap.put(calendarDate.getWorkDate(), Lists.newArrayList(calendarDate));
+				// 相等,证明非自定义的需要被覆盖
+				if (customDate.equals(ruleDate)) {
+					isCustom = true;
+					if (isCover) {	// 是否需要将自定义的加入到结果集中
+						result.add(customDate);
+					} else {
+						// 移除这一作息时间
+						ruleDates.remove(i);
+					}
+					break;
 				}
 			}
+			// 如果没有找到自定义的,加入到结果集
+			if (!isCustom) {
+				result.add(ruleDate);
+			}
 		}
-    }
-    
-	 /**
-     * 获取满足条件的所有已存在的作息时间信息,包括自定义的
-     * @param workCalendarDateQueryVO
-     * @return
-     */
-	public List<WorkCalendarDate> selectWorkCalendarDateList(WorkCalendarDateQueryVO workCalendarDateQueryVO) {
-		QueryWrapper<WorkCalendarDate> queryWrapper = new WorkCalendarDate.Builder().createQueryWrapper()
-				.projectIdEq(workCalendarDateQueryVO.getProjectId())
-				.idEq(workCalendarDateQueryVO.getId())
-				.ruleIdEq(workCalendarDateQueryVO.getRuleId())
-				.calendarIdEq(workCalendarDateQueryVO.getCalendarId())
-				.workDateGe(workCalendarDateQueryVO.getWorkDateStart())
-				.workDateLe(workCalendarDateQueryVO.getWorkDateEnd())
-				.dictTypeEq(workCalendarDateQueryVO.getDictType())
-				.dictTypeIn(workCalendarDateQueryVO.getDictTypes())
-				.dictCodeIn(workCalendarDateQueryVO.getDictCode())
-				.calendarNameLike(workCalendarDateQueryVO.getCalendarName())
-				.builderQueryWrapper();
-		queryWrapper.select("ID, RULE_ID, CALENDAR_ID, PROJECT_ID, CALENDAR_NAME, CALENDAR_DESC, DICT_TYPE, "
-				+ "DICT_CODE, WORK_DATE, WORK_TIME, CUSTOM_FLAG");
-    	List<WorkCalendarDate> list = workCalendarDateService.list(queryWrapper);
-    	return list == null ? new ArrayList<WorkCalendarDate>() : list;
+		
+		return result;
 	}
-	
+
     /**
 	 * 解析此段时间的规则
-	 * @param betweenDay 时间范围
-     * @param workDateEnd 
-     * @param workDateStart 
+	 * 
 	 * @param ruleList 规则信息
-	 * @param resultMap 已有的作息时间信息
-	 * @param existsCusetom key-项目+日期+type+code,value-true存在自定义信息,false 不存在自定义信息
+	 * @param dateStart 开始时间
+	 * @param betweenDay 时间范围
+	 * @return 这里返回的结果,一定要在后续判断当日是否存在自定义的作息时间,才能继续使用,此处不会返回null
 	 */
-	public void paserWorkCalendarRule(long betweenDay, DateTime currentDate, List<WorkCalendarRule> ruleList, 
-			Map<String, List<WorkCalendarDate>> resultMap, Map<String, Boolean> existsCustom) {
+	public void paserWorkCalendarRule(Map<String, List<WorkCalendarDate>> calendarDateMap, List<WorkCalendarRule> ruleList, 
+			DateTime dateStart, long betweenDay) {
 		Map<String, WorkCalendar> calendarMap = new HashMap<String, WorkCalendar>();
 		for(int i = 0; i < betweenDay; i++) {
 			// 判断此天有没有对应的规则信息,每次都要循环全部,生成多条信息
 			for (WorkCalendarRule rule : ruleList) {
-				// 判断当前规则是否
-				this.parseWorkCalendarRule(rule, currentDate, calendarMap, resultMap, existsCustom);
+				// 验证对应的工作历类型是否存,假若为工作历级别的规则配置
+				WorkCalendar calendar = null;
+				if (!"0".equals(rule.getCalendarId())) {
+					calendar = this.workCalendarService.getById(rule.getCalendarId(), rule.getGroupCode(), rule.getProjectId());
+					if (calendar == null) {
+						log.warn("规则ID为[{}]的规则,所对应的工作历信息不存在", rule.getId());
+						continue;
+					}
+				}
+				// 判断当前规则是否生效
+				WorkCalendarDate calendarDate = this.parseWorkCalendarRule(rule, calendar, dateStart);
+				if (calendarDate == null) {
+					continue;
+				}
+				// 数据添加
+				String workDate = dateStart.toString(DateUtil.FORMAT_DATE_YYYYMMDD);
+				if (calendarDateMap.containsKey(workDate)) {
+					calendarDateMap.get(workDate).add(calendarDate);
+				} else {
+					calendarDateMap.put(workDate, Lists.newArrayList(calendarDate));
+				}
 			}
 			
-			currentDate.offset(DateField.DAY_OF_YEAR, 1);
+			dateStart.offset(DateField.DAY_OF_YEAR, 1);
 		}
+		
 		calendarMap.clear();
 	}
 	
@@ -236,14 +361,10 @@ public class WorkCalendarDateHandler {
 	 * 解析规则信息,生成对应作息时间记录
 	 * 
 	 * @param rule
-	 * @param currentDate 日期
-	 * @param calendarMap 工作历类型集合
-	 * @param resultMap 等于null时,插库,否则添加进此map
-	 * @param existsCusetom key-项目+日期+type+code,value-true存在自定义信息,false 不存在自定义信息
-	 * @return
+	 * @param workCalendar 为null, 代表非工作历级别的规则配置
+	 * @param dateStart
 	 */
-	private void parseWorkCalendarRule(WorkCalendarRule rule, DateTime currentDate, Map<String, WorkCalendar> calendarMap, 
-			Map<String, List<WorkCalendarDate>> resultMap, Map<String, Boolean> existsCustom) {
+	private WorkCalendarDate parseWorkCalendarRule(WorkCalendarRule rule, WorkCalendar workCalendar, DateTime currentDate) {
 		String workDate = currentDate.toString(DateUtil.FORMAT_DATE_YYYYMMDD);
 		String dictCode = StringUtil.isBlank(rule.getDictCode()) ? "" : rule.getDictCode();
 		int indexOf = dictCode.indexOf(WorkCalendarConstant.WORK_CALENDAR_D_OF_W);
@@ -256,13 +377,7 @@ public class WorkCalendarDateHandler {
 		if (indexOf > 0) {
 			dictCode = dictCode.substring(0, indexOf - 1);
 		}
-		String existsKey = this.getCustomKey(rule, workDate, dictCode); 
-		// 优先判断当日是否存在同类型 同编码的自定义作息时间
-		if (existsCustom != null && BooleanUtil.isTrue(existsCustom.get(existsKey))) {
-			return;
-		}
 		
-		// 当不存在自定义的作息时间时
 		// 解析规则,生成数据
 		int work = Integer.valueOf(workDate);
 		String ruleStart = rule.getRuleDateStart();
@@ -276,17 +391,136 @@ public class WorkCalendarDateHandler {
 					// 验证value是否存在,存在按周 月 解析,判断是否生效
 					boolean result = this.parseRuleValue(rule, currentDate, workDate);
 					if (!result) {
-						return;
+						return null;
 					}
 				}
 				
 				// 组合数据
-				WorkCalendarDate calendarDate = this.comWorkCalendarOrRule(rule, workDate, dictCode, calendarMap);
-				if (calendarDate == null) {
-					return;
-				}
-				// 数据添加
-				this.addCalendarDateResult(workDate, calendarDate, resultMap);
+				WorkCalendarDate calendarDate = this.comWorkCalendarOrRule(rule, workDate, dictCode, workCalendar);
+				return calendarDate;
+			}
+		}
+		
+		return null;
+	}
+	
+	
+	/**
+	 * 获取满足条件的所有新版规则信息
+	 * TODO 这里工作历和项目ID不传参,则无影响,若传参了,目前仅支持工作历级别的规则解析
+	 * 
+	 * @param workCalendarDateQueryVO
+	 * @param dictTypeLevel 0-集团级别,1-项目级别,2-工作历级别,null-默认工作历级别
+	 * @return
+	 */
+	public List<WorkCalendarRule> selectWorkCalendarRuleList(WorkCalendarDateQueryVO queryVO, Integer dictTypeLevel) {
+		QueryWrapper<WorkCalendarRule> queryWrapper = new WorkCalendarRule.Builder().createQueryWrapper().projectIdEq(queryVO.getProjectId(), dictTypeLevel)
+				.calendarIdEq(queryVO.getCalendarId(), dictTypeLevel).ruleDateBetween(queryVO.getWorkDateStart(), queryVO.getWorkDateEnd())
+				.dictTypeEq(queryVO.getDictType()).dictCodeIn(queryVO.getDictCode()).dictTypeIn(queryVO.getDictTypes())
+				.idEq(queryVO.getRuleId()).delFlagEq(WorkCalendarConstant.WORK_CALENDAR_DEL_FLAG_NOR)
+				.ruleFlagEq(WorkCalendarConstant.WORK_CALENDAR_RULE_FLAG_NEW).builderQueryWrapper();
+    	return this.workCalendarRuleService.list(queryWrapper);
+	}
+	
+	 /**
+     * 获取满足条件的所有已存在的作息时间信息,包括自定义的
+     * @param workCalendarDateQueryVO
+     * @return
+     */
+	public List<WorkCalendarDate> selectWorkCalendarDateList(WorkCalendarDateQueryVO workCalendarDateQueryVO, String customFlag, Integer dictTypeLevel) {
+		QueryWrapper<WorkCalendarDate> queryWrapper = new WorkCalendarDate.Builder().createQueryWrapper()
+				.projectIdEq(workCalendarDateQueryVO.getProjectId(), dictTypeLevel).idEq(workCalendarDateQueryVO.getId())
+				.ruleIdEq(workCalendarDateQueryVO.getRuleId()).calendarIdEq(workCalendarDateQueryVO.getCalendarId(), dictTypeLevel)
+				.workDateGe(workCalendarDateQueryVO.getWorkDateStart()).workDateLe(workCalendarDateQueryVO.getWorkDateEnd())
+				.dictTypeEq(workCalendarDateQueryVO.getDictType()).dictTypeIn(workCalendarDateQueryVO.getDictTypes())
+				.dictCodeIn(workCalendarDateQueryVO.getDictCode()).calendarNameLike(workCalendarDateQueryVO.getCalendarName())
+				.customFlagEq(customFlag).builderQueryWrapper();
+		queryWrapper.select("ID, GROUP_CODE, RULE_ID, CALENDAR_ID, PROJECT_ID, CALENDAR_NAME, CALENDAR_DESC, DICT_TYPE, "
+				+ "DICT_CODE, WORK_DATE, WORK_TIME, CUSTOM_FLAG, UPDATE_USER");
+    	List<WorkCalendarDate> list = workCalendarDateService.list(queryWrapper);
+    	return list == null ? new ArrayList<WorkCalendarDate>() : list;
+	}
+	
+	/**
+	 * 组合出作息时间对象
+	 * 
+	 * @param rule
+	 * @param workDate
+	 * @param dictCode
+	 * @param workCalendar
+	 * @return
+	 */
+	public WorkCalendarDate comWorkCalendarOrRule(WorkCalendarRule rule, String workDate, String dictCode, WorkCalendar workCalendar) {
+		// 首先判断工作历是否还存在
+		WorkCalendarDate workCalendarDate = new WorkCalendarDate();
+		workCalendarDate.setGroupCode(rule.getGroupCode());
+		workCalendarDate.setCalendarId(workCalendar == null ? "0" : workCalendar.getId());
+		workCalendarDate.setRuleId(rule.getId());
+		workCalendarDate.setCalendarName(workCalendar == null ? "" : workCalendar.getCalendarName());
+		workCalendarDate.setCalendarDesc(workCalendar == null ? "" : workCalendar.getCalendarDesc());
+		workCalendarDate.setProjectId(rule.getProjectId());
+		workCalendarDate.setDictType(rule.getDictType());
+		workCalendarDate.setDictCode(dictCode);
+		workCalendarDate.setWorkDateStart(rule.getRuleDateStart());
+		workCalendarDate.setWorkDateEnd(rule.getRuleDateEnd());
+		workCalendarDate.setWorkDate(workDate);
+		
+		workCalendarDate.setWorkTime(StringUtil.isBlank(rule.getRuleTime()) ? 
+				(CollectionUtil.isEmpty(rule.getValue()) ? null : rule.getValue().stream().collect(Collectors.joining(","))) 
+				: rule.getRuleTime());
+		// 自定义的一定是查出来的,封装的一定是非自定义添加的
+		workCalendarDate.setCustomFlag(WorkCalendarConstant.CUSTOM_CALENDAR_DATE_NO);
+		workCalendarDate.setUpdateUser(rule.getUpdateUser());
+		return workCalendarDate;
+	}
+	
+	
+	/**
+	 * 批量自定义作息时间信息
+	 * @return 
+	 */
+	public void batchCreateCalendarDate(CustomCalendarVO<WorkCalendarDateCreateVO> createVO) {
+		boolean result = false;
+		List<WorkCalendarDateCreateVO> batchInfos = createVO.getBatchInfo();
+		// 判断日期是否合法
+		DateTime now = DateUtil.date();
+		//now = now.offset(DateField.DAY_OF_YEAR, 1);	//明天
+		String format = DateUtil.format(now, DateUtil.FORMAT_DATE_YYYYMMDD);
+		Integer current = Integer.valueOf(format);
+		for (WorkCalendarDateCreateVO batchInfo : batchInfos) {
+			int dictTypeLevel = this.workCalendarDictService.getDictTypeLevel(createVO.getGroupCode(), batchInfo.getDictType());
+			
+			Integer workDate = Integer.valueOf(batchInfo.getWorkDate());
+			if (workDate < current) {
+				throw new BusinessException("作息日期不合法,必须大于等于当日");
+			}
+			// 判断工作历类型是否存在
+			WorkCalendar calendar = this.workCalendarService.getById(batchInfo.getCalendarId(), createVO.getGroupCode(), createVO.getProjectId());
+			if (calendar == null) {
+				throw new BusinessException("工作历类型不存在");
+			}
+			
+			WorkCalendarDate calendarDate = new WorkCalendarDate();
+			BeanUtils.copyProperties(batchInfo, calendarDate);
+			// 验证数据有效性
+			result = this.workCalendarDateService.checkWorkDateValid(calendarDate, dictTypeLevel);
+			if (!result) {
+				throw new BusinessException("当天已存在相同类型额定义,不可重复添加");
+			}
+			calendarDate.setGroupCode(createVO.getGroupCode());
+			calendarDate.setCalendarName(calendar.getCalendarName());
+			calendarDate.setCalendarDesc(calendar.getCalendarDesc());
+			calendarDate.setProjectId(dictTypeLevel == 0 ? "0" : createVO.getProjectId());
+			if (dictTypeLevel != 2) {
+				calendarDate.setCalendarId("0");
+				calendarDate.setCalendarName(null);
+				calendarDate.setCalendarDesc(null);
+			}
+			calendarDate.setUpdateUser(createVO.getUserId());
+			calendarDate.setCustomFlag(WorkCalendarConstant.CUSTOM_CALENDAR_DATE_YES);
+			result = this.workCalendarDateService.save(calendarDate);
+			if (!result) {
+				throw new BusinessException("自定义工作历作息时间添加失败");
 			}
 		}
 	}
@@ -362,171 +596,6 @@ public class WorkCalendarDateHandler {
 		}
 		return false;
 	}
-
-	/**
-	 * 响应数据添加
-	 * @param resultMap 为null时插库
-	 */
-	public void addCalendarDateResult(String workDate, WorkCalendarDate calendarDate, Map<String, List<WorkCalendarDate>> resultMap) {
-		if (resultMap == null) {
-			boolean result = this.workCalendarDateService.save(calendarDate);
-			//boolean result = this.workCalendarDateService.replaceIntoCalendarDate(calendarDate);
-			if (!result) {
-				throw new BusinessException("新增作息时间信息失败,规则ID: " + calendarDate.getRuleId());
-			}
-			return;
-		}
-		
-		if (!resultMap.containsKey(workDate)) {
-			List<WorkCalendarDate> list = new ArrayList<WorkCalendarDate>();
-			list.add(calendarDate);
-			resultMap.put(workDate, list);
-			return;
-		}
-		
-		List<WorkCalendarDate> list = resultMap.get(workDate);
-		list.add(calendarDate);
-	}
-	
-	/**
-	 * 组合出作息时间对象
-	 * @param workCalendar
-	 * @param rule
-	 * @param calendarIds 
-	 * @return
-	 */
-	public WorkCalendarDate comWorkCalendarOrRule(WorkCalendarRule rule, String workDate, String dictCode, 
-			Map<String, WorkCalendar> calendarMap) {
-		// 首先判断工作历是否还存在
-		WorkCalendar workCalendar = null;
-		if (calendarMap.containsKey(rule.getCalendarId())) {
-			workCalendar = calendarMap.get(rule.getCalendarId());
-		} else {
-			workCalendar = this.workCalendarService.getById(rule.getCalendarId(), rule.getProjectId());
-			calendarMap.put(rule.getCalendarId(), workCalendar);
-		}
-		if (workCalendar == null) {
-			log.warn("规则ID为[{}]的规则,所对应的工作历信息不存在", rule.getId());
-			return null;
-		}
-				
-		WorkCalendarDate workCalendarDate = new WorkCalendarDate();
-		workCalendarDate.setGroupCode(rule.getGroupCode());
-		workCalendarDate.setCalendarId(workCalendar.getId());
-		workCalendarDate.setRuleId(rule.getId());
-		workCalendarDate.setCalendarName(workCalendar.getCalendarName());
-		workCalendarDate.setCalendarDesc(workCalendar.getCalendarDesc());
-		workCalendarDate.setProjectId(rule.getProjectId());
-		workCalendarDate.setDictType(rule.getDictType());
-		workCalendarDate.setDictCode(dictCode);
-		workCalendarDate.setWorkDateStart(rule.getRuleDateStart());
-		workCalendarDate.setWorkDateEnd(rule.getRuleDateEnd());
-		workCalendarDate.setWorkDate(workDate);
-		
-		workCalendarDate.setWorkTime(StringUtil.isBlank(rule.getRuleTime()) ? 
-				(CollectionUtil.isEmpty(rule.getValue()) ? null : rule.getValue().stream().collect(Collectors.joining(","))) 
-				: rule.getRuleTime());
-		// 自定义的一定是查出来的,封装的一定是非自定义添加的
-		workCalendarDate.setCustomFlag(WorkCalendarConstant.CUSTOM_CALENDAR_DATE_NO);
-		workCalendarDate.setUpdateUser(rule.getUpdateUser());
-		return workCalendarDate;
-	}
-	
-	/**
-	 * 获取满足条件的所有新版规则信息
-	 * @param workDatestart
-	 * @param workDateEnd
-	 * @param workCalendarDateQueryVO
-	 * @return
-	 */
-	public List<WorkCalendarRule> selectWorkCalendarRuleList(String workDatestart, String workDateEnd, WorkCalendarDateQueryVO queryVO) {
-		QueryWrapper<WorkCalendarRule> queryWrapper = new WorkCalendarRule.Builder().createQueryWrapper()
-				.projectIdEq(queryVO.getProjectId()).idEq(queryVO.getRuleId())
-				.calendarIdEq(queryVO.getCalendarId()).ruleDateBetween(workDatestart, workDateEnd)
-				.dictTypeEq(queryVO.getDictType()).dictCodeIn(queryVO.getDictCode())
-				.dictTypeIn(queryVO.getDictTypes())
-				.delFlagEq(WorkCalendarConstant.WORK_CALENDAR_DEL_FLAG_NOR)
-				.ruleFlagEq(WorkCalendarConstant.WORK_CALENDAR_RULE_FLAG_NEW).builderQueryWrapper();
-    	return this.workCalendarRuleService.list(queryWrapper);
-	}
-	
-	/**
-	 * 解析规则信息,并插库
-	 * @param queryVO
-	 * @return
-	 */
-	@Transactional
-	public boolean handleParseCalendarRule(WorkCalendarDateQueryVO queryVO) {
-		// 1.防止重复执行,优先删除从今日开始的非自定义的作息时间信息
-		QueryWrapper<WorkCalendarDate> queryWrapper = new WorkCalendarDate.Builder().createQueryWrapper()
-				.projectIdEq(queryVO.getProjectId()).calendarIdEq(queryVO.getCalendarId())
-				.calendarNameEq(queryVO.getCalendarName()).dictTypeEq(queryVO.getDictType())
-				.dictCodeIn(queryVO.getDictCode()).workDateGe(queryVO.getWorkDateStart())
-				.workDateLe(queryVO.getWorkDateEnd()).customFlagEq(WorkCalendarConstant.CUSTOM_CALENDAR_DATE_NO)
-				.builderQueryWrapper();
-		this.workCalendarDateService.remove(queryWrapper);
-		
-		// 1.查询出满足条件的所有的规则信息
-		List<WorkCalendarRule> ruleList = this.selectWorkCalendarRuleList(queryVO.getWorkDateStart(), queryVO.getWorkDateEnd(), queryVO);
-		if (CollectionUtil.isNotEmpty(ruleList)) {
-			// 2.获取此日期内,已存在的自定义的作息时间
-			// key-项目+日期+type+code,value-true存在自定义信息,false 不存在自定义信息
-	    	Map<String, Boolean> existsCustom = new HashMap<String, Boolean>();
-	    	// 1.优先获取start~end的作息时间信息,包含自定义的,判断对应日期内是否包含自定义的
-	    	this.selectHistoryDate(null, existsCustom, queryVO);
-	    	
-			// 3.解析规则信息
-			DateTime dateStart = DateUtil.parse(queryVO.getWorkDateStart(), DateUtil.FORMAT_DATE_YYYYMMDD);
-			DateTime dateEnd = DateUtil.parse(queryVO.getWorkDateEnd(), DateUtil.FORMAT_DATE_YYYYMMDD);
-			long between = DateUtil.between(dateStart, dateEnd, DateUnit.DAY) + 1;
-			this.paserWorkCalendarRule(between, dateStart, ruleList, null, existsCustom);
-		}
-		return true;
-	}
-	
-	
-	/**
-	 * 批量自定义作息时间信息
-	 * @return 
-	 */
-	public void batchCreateCalendarDate(CustomCalendarVO<WorkCalendarDateCreateVO> createVO) {
-		boolean result = false;
-		List<WorkCalendarDateCreateVO> batchInfos = createVO.getBatchInfo();
-		// 判断日期是否合法
-		DateTime now = DateUtil.date();
-		//now = now.offset(DateField.DAY_OF_YEAR, 1);	//明天
-		String format = DateUtil.format(now, DateUtil.FORMAT_DATE_YYYYMMDD);
-		Integer current = Integer.valueOf(format);
-		for (WorkCalendarDateCreateVO batchInfo : batchInfos) {
-			Integer workDate = Integer.valueOf(batchInfo.getWorkDate());
-			if (workDate < current) {
-				throw new BusinessException("作息日期不合法,必须大于等于当日");
-			}
-			// 判断工作历类型是否存在
-			WorkCalendar calendar = this.workCalendarService.getById(batchInfo.getCalendarId(), createVO.getProjectId());
-			if (calendar == null) {
-				throw new BusinessException("工作历类型不存在");
-			}
-			
-			WorkCalendarDate calendarDate = new WorkCalendarDate();
-			BeanUtils.copyProperties(batchInfo, calendarDate);
-			// 验证数据有效性
-			result = this.workCalendarDateService.checkWorkDateValid(calendarDate);
-			if (!result) {
-				throw new BusinessException("当天已存在相同类型额定义,不可重复添加");
-			}
-			calendarDate.setGroupCode(createVO.getGroupCode());
-			calendarDate.setProjectId(createVO.getProjectId());
-			calendarDate.setUpdateUser(createVO.getUserId());
-			calendarDate.setCalendarName(calendar.getCalendarName());
-			calendarDate.setCalendarDesc(calendar.getCalendarDesc());
-			calendarDate.setCustomFlag(WorkCalendarConstant.CUSTOM_CALENDAR_DATE_YES);
-			result = this.workCalendarDateService.save(calendarDate);
-			if (!result) {
-				throw new BusinessException("自定义工作历作息时间添加失败");
-			}
-		}
-	}
 	
 	/**
 	 * 批量自定义作息时间信息
@@ -541,12 +610,14 @@ public class WorkCalendarDateHandler {
 		String format = DateUtil.format(now, DateUtil.FORMAT_DATE_YYYYMMDD);
 		Integer current = Integer.valueOf(format);
 		for (WorkCalendarDateUpdateVO batchInfo : batchInfos) {
+			int dictTypeLevel = this.workCalendarDictService.getDictTypeLevel(updateVO.getGroupCode(), batchInfo.getDictType());
+			
 			Integer workDate = Integer.valueOf(batchInfo.getWorkDate());
 			if (workDate < current) {
 				throw new BusinessException("作息日期不合法,必须大于等于当日");
 			}
 			// 判断工作历类型是否存在
-			WorkCalendar calendar = this.workCalendarService.getById(batchInfo.getCalendarId(), updateVO.getProjectId());
+			WorkCalendar calendar = this.workCalendarService.getById(batchInfo.getCalendarId(), updateVO.getGroupCode(), updateVO.getProjectId());
 			if (calendar == null) {
 				throw new BusinessException("工作历类型不存在");
 			}
@@ -554,15 +625,21 @@ public class WorkCalendarDateHandler {
 			WorkCalendarDate calendarDate = new WorkCalendarDate();
 			BeanUtils.copyProperties(batchInfo, calendarDate);
 			// 验证数据有效性
-			result = this.workCalendarDateService.checkWorkDateValid(calendarDate);
+			result = this.workCalendarDateService.checkWorkDateValid(calendarDate, dictTypeLevel);
 			if (!result) {
 				throw new BusinessException("当天已存在相同类型的定义,不可重复添加");
 			}
 			calendarDate.setGroupCode(updateVO.getGroupCode());
-			calendarDate.setProjectId(updateVO.getProjectId());
-			calendarDate.setUpdateUser(updateVO.getUserId());
 			calendarDate.setCalendarName(calendar.getCalendarName());
 			calendarDate.setCalendarDesc(calendar.getCalendarDesc());
+			calendarDate.setProjectId(dictTypeLevel == 0 ? "0" : updateVO.getProjectId());
+			if (dictTypeLevel != 2) {
+				calendarDate.setCalendarId("0");
+				calendarDate.setCalendarName(null);
+				calendarDate.setCalendarDesc(null);
+			}
+			
+			calendarDate.setUpdateUser(updateVO.getUserId());
 			calendarDate.setCustomFlag(WorkCalendarConstant.CUSTOM_CALENDAR_DATE_YES);
 			result = this.workCalendarDateService.updateById(calendarDate);
 			if (!result) {
@@ -573,11 +650,14 @@ public class WorkCalendarDateHandler {
 
 	/**
 	 * 多时间段添加工作历作息时间信息,先删除此dictType下数据,再添加
+	 * 
 	 * @param createVO
 	 * @param calendar 
 	 */
 	@Transactional
 	public void batchCreateCalendarMoreDate(WorkCalendarMoreDateCreateVO createVO, WorkCalendar calendar) {
+		int dictTypeLevel = this.workCalendarDictService.getDictTypeLevel(createVO.getGroupCode(), createVO.getDictType());
+		
 		String calendarId = createVO.getCalendarId();
 		String projectId = createVO.getProjectId();
 		String now = DateUtil.format(new Date(), DateUtil.FORMAT_DATE_YYYYMMDDHHMMSS);
@@ -605,7 +685,7 @@ public class WorkCalendarDateHandler {
 		}
 		// 先删除
 		QueryWrapper<WorkCalendarDate> queryWrapper = new WorkCalendarDate.Builder().createQueryWrapper()
-				.calendarIdEq(calendarId).projectIdEq(projectId).dictTypeEq(createVO.getDictType())
+				.calendarIdEq(calendarId, dictTypeLevel).projectIdEq(projectId, dictTypeLevel).dictTypeEq(createVO.getDictType())
 				.workDateGe(createVO.getWorkDateStart()).workDateLe(createVO.getWorkDateEnd())
 				.customFlagEq(createVO.getCustomFlag()).builderQueryWrapper();
 		this.workCalendarDateService.remove(queryWrapper);
@@ -662,15 +742,60 @@ public class WorkCalendarDateHandler {
 	}
 	
 	/**
+	 * 解析起止时间,判读当前时间位于哪里
+	 * @param dateStart yyyyMMdd
+	 * @param dateEnd yyyyMMdd
+	 * @param now yyyyMMdd
+	 * @return
+	 */
+	private Map<String, DateTime> parseWorkDate(DateTime dateStart, DateTime dateEnd, String now) {
+		if (dateEnd.before(dateStart)) {
+			throw new BusinessException(ResponseCode.A0400.getCode(), "结束日期不能早于开始日期");
+		}
+		
+		DateTime historyStart = null;
+		DateTime historyEnd = null;
+		DateTime parseRuleStart = null;
+		DateTime parseRuleEnd = null;
+		
+		Map<String, DateTime> result = new HashMap<String, DateTime>();
+		
+		DateTime currentDate = DateUtil.parse(now, DateUtil.FORMAT_DATE_YYYYMMDD);
+		// 第一种情况,当日在start之前
+		if (!dateStart.before(currentDate)) {
+			// 开始日期,不早于当日,全部走解析
+			parseRuleStart = dateStart;
+			parseRuleEnd = dateEnd;
+		} else if (dateStart.before(currentDate) && !dateEnd.before(currentDate)) {
+			// 第二种情况,当日在start~end之间,包含等于dateEnd 的情况
+			historyStart = dateStart;
+			historyEnd = currentDate.offset(DateField.DAY_OF_YEAR, -1);
+			parseRuleStart = DateUtil.parse(now, DateUtil.FORMAT_DATE_YYYYMMDD);
+			parseRuleEnd = dateEnd;
+		} else {
+			// 第三种情况,当日在dataEnd之后,全部查历史即可
+			historyStart = dateStart;
+			historyEnd = dateEnd;
+		}
+		
+		result.put("historyStart", historyStart);
+		result.put("historyEnd", historyEnd);
+		result.put("parseRuleStart", parseRuleStart);
+		result.put("parseRuleEnd", parseRuleEnd);
+		return result;
+	}
+	
+	/**
 	 * 判断是否存在自动作息时间的依据key
 	 * 
-	 * @param calendarDate
+	 * @param calendarId 工作历类型ID
+	 * @param workDate 当日
+	 * @param dictType 字典类型,不可为空
+	 * @param dictCode 字典类型下的编码,允许为空
 	 * @return
 	 */
-	public String getCustomKey(WorkCalendarDate calendarDate) {
-		String customKey = calendarDate.getCalendarId() + calendarDate.getProjectId() + calendarDate.getWorkDate() + calendarDate.getDictType() + 
-					(StringUtil.isBlank(calendarDate.getDictCode()) ? "" : calendarDate.getDictCode());
-		return customKey;
+	public String getCustomCalendarDateTempKey(String calendarId, String workDate, String dictType, String dictCode) {
+		return workDate + dictType + (StringUtil.isBlank(dictCode) ? "" : dictCode);
 	}
 	
 	/**
@@ -685,5 +810,5 @@ public class WorkCalendarDateHandler {
 		String customKey = rule.getCalendarId() + rule.getProjectId() + workDate + rule.getDictType() + (StringUtil.isBlank(dictCode) ? "" : dictCode);
 		return customKey;
 	}
-	
+
 }

+ 92 - 50
src/main/java/com/persagy/calendar/handle/WorkCalendarHandler.java

@@ -13,6 +13,7 @@ import org.springframework.stereotype.Component;
 import org.springframework.transaction.annotation.Transactional;
 
 import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.persagy.calendar.constant.WorkCalendarConstant;
 import com.persagy.calendar.pojo.dto.WorkCalendar;
@@ -75,9 +76,16 @@ public class WorkCalendarHandler {
 	
 	/**
 	 * 根据原有的工作历ID创建新的工作历信息和规则信息
+	 * 
+	 * @param workCalendar 其中的项目ID可能与原项目ID不一致
+	 * @param fromId 原工作历类型ID
+	 * @param oldProjectId 原项目ID
+	 * @return
 	 */
     @Transactional
-	public ResponseResult createWorkCalendarFromId(String fromId, WorkCalendar workCalendar) {
+	public ResponseResult createWorkCalendarFromId(WorkCalendar workCalendar, String fromId, String oldProjectId) {
+    	boolean isSameProjectId = oldProjectId.equals(workCalendar.getProjectId());
+    	
 		// 1.添加工作历和对象信息
     	boolean result = this.workCalendarService.save(workCalendar);
     	if (!result) {
@@ -92,16 +100,23 @@ public class WorkCalendarHandler {
 			object.setCreateTime(workCalendar.getCreateTime());
 			object.setUpdateUser(workCalendar.getUpdateUser());
 			object.setProjectId(workCalendar.getProjectId());
-			this.workCalendarObjectService.batchInsertObjects(object, workCalendar.getObjIds());
+			result = this.workCalendarObjectService.batchInsertObjects(object, workCalendar.getObjIds());
+			if (!result) {
+				throw new BusinessException(ResponseCode.B0001.getCode(), "物理世界对象关联工作历失败");
+	    	}
 		}
     	// 3.复制规则信息
-		List<WorkCalendarRule> ruleList = this.workCalendarRuleService.queryRuleByCalendarId(fromId, workCalendar.getProjectId());
+    	List<WorkCalendarRule> ruleList = this.workCalendarRuleService.queryRuleByCalendarId(workCalendar.getGroupCode(), fromId, workCalendar.getProjectId(), null);
 		if (result && CollectionUtil.isNotEmpty(ruleList)) {
 			for (WorkCalendarRule workCalendarRule : ruleList) {
+				if (isSameProjectId && "0".equals(workCalendarRule.getCalendarId())) {
+					continue;	// 属于项目或者集团级别的,不在进行复制
+				}
 				workCalendarRule.setId(null);
 				workCalendarRule.setGroupCode(workCalendar.getGroupCode());
 				workCalendarRule.setCalendarId(workCalendar.getId());
 				workCalendarRule.setUpdateUser(workCalendar.getUpdateUser());
+				workCalendarRule.setProjectId(workCalendar.getProjectId());
 				workCalendarRule.setCreateTime(null);
 				workCalendarRule.setUpdateTime(null);
 				result = workCalendarRuleService.save(workCalendarRule);
@@ -110,30 +125,37 @@ public class WorkCalendarHandler {
 				}
 			}
 		}
-		// 4.复制自定义作息时间信息
-		this.copyCustomCalendarDate(fromId, workCalendar);
+		// 4.复制自定义作息时间信息,自定义的作息时间,一定是属于工作历级别的,这里不需要在判断
+		this.copyCustomCalendarDate(workCalendar, fromId, oldProjectId);
 		// 5.复制自定义标签信息
-		this.copyCustomCalendarLabel(fromId, workCalendar);
+		this.copyCustomCalendarLabel(workCalendar, fromId, oldProjectId);
 		// 6.复制属于工作历类型级别的字典值
-		this.copyCustomCalendarDict(fromId, workCalendar);
+		this.copyCustomCalendarDict(workCalendar, fromId, oldProjectId);
 		
 		return ResponseUtil.successResult("新增成功", workCalendar.getId());
     }
     
     /**
-     * 复制自定义的作息时间信息
-     * @param fromId
-     * @param workCalendar
-     */
-    private void copyCustomCalendarDate(String fromId, WorkCalendar workCalendar) {
-    	QueryWrapper<WorkCalendarDate> queryWrapper = new WorkCalendarDate.Builder().createQueryWrapper()
-    			.calendarIdEq(fromId).projectIdEq(workCalendar.getProjectId())
-    			.customFlagEq(WorkCalendarConstant.CUSTOM_CALENDAR_DATE_YES).builderQueryWrapper();
+	 * 复制自定义的作息时间信息,
+	 * 后续若是要连历史的一起复制的话,需更新RULE_ID、WORK_DATE_START、WORK_DATE_END,但是要兼容字典类型级别这一字段
+	 * 
+	 * @param workCalendar 其中的项目ID可能与原项目ID不一致
+	 * @param fromId 原工作历类型ID
+	 * @param oldProjectId 原项目ID
+	 * @return
+	 */
+    private void copyCustomCalendarDate(WorkCalendar workCalendar, String fromId, String oldProjectId) {
+    	// 先获取原项目、原工作历下的自定义作息时间
+    	QueryWrapper<WorkCalendarDate> queryWrapper = new WorkCalendarDate.Builder().createQueryWrapper().calendarIdEq(fromId, null)
+    			.projectIdEq(oldProjectId, null).customFlagEq(WorkCalendarConstant.CUSTOM_CALENDAR_DATE_YES).builderQueryWrapper();
     	List<WorkCalendarDate> calendarDates = this.workCalendarDateService.list(queryWrapper);
     	if (CollectionUtil.isNotEmpty(calendarDates)) {
     		calendarDates.forEach(calendarDate -> {
     			calendarDate.setId(IdGenerator.getSnowIdStr(WorkCalendarConstant.WORK_CALENDAR_DATE_ID_PREFIX));
     			calendarDate.setCalendarId(workCalendar.getId());
+    			calendarDate.setProjectId(workCalendar.getProjectId());
+    			calendarDate.setCalendarName(workCalendar.getCalendarName());
+    			calendarDate.setCalendarDesc(workCalendar.getCalendarDesc());
     			calendarDate.setCreateTime(workCalendar.getCreateTime());
     			calendarDate.setUpdateTime(workCalendar.getUpdateTime());
     			calendarDate.setUpdateUser(workCalendar.getUpdateUser());
@@ -143,18 +165,24 @@ public class WorkCalendarHandler {
     }
     
     /**
-     * 复制自定义标签信息
+     * 复制标签信息,仅复制属于工作历的标签,复制属于项目的标签的前提是跨项目复制了
+     * 
      * @param fromId
      * @param workCalendar
      */
-    private void copyCustomCalendarLabel(String fromId, WorkCalendar workCalendar) {
-    	QueryWrapper<WorkCalendarLabel> queryWrapper = new WorkCalendarLabel.Builder().createQueryWrapper()
-    			.calendarIdEq(fromId).projectIdEq(workCalendar.getProjectId()).builderQueryWrapper();
+    private void copyCustomCalendarLabel(WorkCalendar workCalendar, String fromId, String oldProjectId) {
+    	boolean isSameProjectId = oldProjectId.equals(workCalendar.getProjectId());
+    	
+    	// 这里的项目ID必须,一直作为查询条件,工作历ID,根据是否是同一项目来,集团级的永远不会被复制
+    	QueryWrapper<WorkCalendarLabel> queryWrapper = new WorkCalendarLabel.Builder().createQueryWrapper().groupCodeEq(workCalendar.getGroupCode())
+    			.calendarIdEq(fromId, isSameProjectId ? null : 1).projectIdEq(oldProjectId, null).builderQueryWrapper();
     	List<WorkCalendarLabel> calendarLabels = this.workCalendarLabelService.list(queryWrapper);
+    	
     	if (CollectionUtil.isNotEmpty(calendarLabels)) {
     		calendarLabels.forEach(calendarLabel -> {
     			calendarLabel.setId(IdGenerator.getSnowIdStr(WorkCalendarConstant.WORK_CALENDAR_LABEL_ID_PREFIX));
-    			calendarLabel.setCalendarId(workCalendar.getId());
+    			calendarLabel.setCalendarId("0".equals(calendarLabel.getCalendarId()) ? "0" : workCalendar.getId());
+    			calendarLabel.setProjectId("0".equals(calendarLabel.getProjectId()) ? "0" : workCalendar.getProjectId());
     			calendarLabel.setDiyValueStr(CollectionUtil.isEmpty(calendarLabel.getDiyValue()) ? null : JSON.toJSONString(calendarLabel.getDiyValue()));
     			calendarLabel.setCreateTime(workCalendar.getCreateTime());
     			calendarLabel.setUpdateTime(workCalendar.getUpdateTime());
@@ -165,17 +193,23 @@ public class WorkCalendarHandler {
     }
     
     /**
-     * 复制属于工作历类型字典数据
+     * 复制字典数据信息,仅复制属于工作历的标签,复制属于项目的标签的前提是跨项目复制了
+     * 
      * @param fromId
      * @param workCalendar
      */
-    private void copyCustomCalendarDict(String fromId, WorkCalendar workCalendar) {
-    	QueryWrapper<WorkCalendarDict> queryWrapper = new WorkCalendarDict.Builder().createQueryWrapper()
-    			.groupCodeEq(workCalendar.getGroupCode()).calendarIdEq(fromId).builderQueryWrapper();
+    private void copyCustomCalendarDict(WorkCalendar workCalendar, String fromId, String oldProjectId) {
+    	boolean isSameProjectId = oldProjectId.equals(workCalendar.getProjectId());
+    	
+    	// 获取原有的字典数据
+    	LambdaQueryWrapper<WorkCalendarDict> queryWrapper = new WorkCalendarDict.BuilderQueryWrapper().groupCodeEq(workCalendar.getGroupCode())
+    			.calendarIdEq(fromId, isSameProjectId ? null : 1).builder();
     	List<WorkCalendarDict> calendarDicts = this.workCalendarDictService.list(queryWrapper);
     	if (CollectionUtil.isNotEmpty(calendarDicts)) {
     		calendarDicts.forEach(calendarDict -> {
-    			calendarDict.setCalendarId(workCalendar.getId());
+    			calendarDict.setId(IdGenerator.getUUID());
+    			calendarDict.setCalendarId("0".equals(calendarDict.getCalendarId()) ? "0" : workCalendar.getId());
+    			calendarDict.setProjectId("0".equals(calendarDict.getProjectId()) ? "0" : workCalendar.getProjectId());
     		});
 			this.workCalendarDictService.batchCreateCalendarDict(calendarDicts);
 		}
@@ -183,9 +217,14 @@ public class WorkCalendarHandler {
     
     /**
      * 逻辑删除工作历类型数据,且级联删除规则、对象、标签、自定义作息时间
+     * 
+     * @param baseUpdateVO
+     * @param onlyCalendarByGroup true-该集团下最后一个工作历类型
+     * @param onlyCalendarByProject true-该项目下最后一个工作历类型
+     * @return
      */
     @Transactional
-	public ResponseResult deleteWorkCalendar(BaseUpdateVO baseUpdateVO) {
+	public ResponseResult deleteWorkCalendar(BaseUpdateVO baseUpdateVO, boolean onlyCalendarByGroup, boolean onlyCalendarByProject) {
     	String id = baseUpdateVO.getId();
     	String projectId = baseUpdateVO.getProjectId();
     	String updateUser = baseUpdateVO.getUserId();
@@ -195,34 +234,40 @@ public class WorkCalendarHandler {
 			return ResponseUtil.errorResult("删除工作历类型失败");
 		}
     	// 2.取消关联的对象数据信息
-    	QueryWrapper<WorkCalendarObject> objectWrapper = new WorkCalendarObject.Builder().createQueryWrapper()
-    			.groupCodeEq(baseUpdateVO.getGroupCode()).projectIdEq(projectId)
-    			.calendarIdEq(baseUpdateVO.getId()).builderQueryWrapper();
+    	QueryWrapper<WorkCalendarObject> objectWrapper = new WorkCalendarObject.Builder().createQueryWrapper().groupCodeEq(baseUpdateVO.getGroupCode())
+    			.projectIdEq(projectId).calendarIdEq(baseUpdateVO.getId()).builderQueryWrapper();
     	this.workCalendarObjectService.remove(objectWrapper);
     	// 3.逻辑删除规则信息
     	WorkCalendarRule workCalendarRule = new WorkCalendarRule();
+    	if (!onlyCalendarByProject) {
+    		workCalendarRule.setCalendarId(id);
+		} else if (!onlyCalendarByGroup) {
+			workCalendarRule.setProjectId(baseUpdateVO.getProjectId());
+		}
+    	workCalendarRule.setGroupCode(baseUpdateVO.getGroupCode());
     	workCalendarRule.setCalendarId(id);
     	workCalendarRule.setUpdateUser(updateUser);
-    	this.workCalendarRuleService.deleteWorkCalendarRule(workCalendarRule);
-    	// 4.物理删除自动义作息时间信息
-    	QueryWrapper<WorkCalendarDate> dateWrapper = new WorkCalendarDate.Builder().createQueryWrapper()
-    			.calendarIdEq(id).projectIdEq(projectId).builderQueryWrapper();
+    	this.workCalendarRuleService.deleteWorkCalendarRule(workCalendarRule, null);
+    	// 4.物理删除作息时间信息,包含自定义的
+    	QueryWrapper<WorkCalendarDate> dateWrapper = new WorkCalendarDate.Builder().createQueryWrapper().groupCodeEq(baseUpdateVO.getGroupCode())
+    			.calendarIdEq(id, onlyCalendarByProject ? 1 : null).projectIdEq(projectId, onlyCalendarByGroup ? 0 : null).builderQueryWrapper();
     	this.workCalendarDateService.remove(dateWrapper);
-		// 5.物理删除自定义标签信息
-    	QueryWrapper<WorkCalendarLabel> labelWrapper = new WorkCalendarLabel.Builder().createQueryWrapper()
-    			.calendarIdEq(id).projectIdEq(projectId).builderQueryWrapper();
+		// 5.物理删除标签信息,剩余仅此一个工作历类型时,工作历ID,不在作为查询条件,该项目下全部删除
+    	QueryWrapper<WorkCalendarLabel> labelWrapper = new WorkCalendarLabel.Builder().createQueryWrapper().groupCodeEq(baseUpdateVO.getGroupCode())
+    			.calendarIdEq(id, onlyCalendarByProject ? 1 : null).projectIdEq(projectId, onlyCalendarByGroup ? 0 : null).builderQueryWrapper();
     	this.workCalendarLabelService.remove(labelWrapper);
 		// 6.物理删除属于工作历类型级别的字典值
-    	QueryWrapper<WorkCalendarDict> dictWrapper = new WorkCalendarDict.Builder().createQueryWrapper()
-    			.calendarIdEq(id).builderQueryWrapper();
+    	LambdaQueryWrapper<WorkCalendarDict> dictWrapper = new WorkCalendarDict.BuilderQueryWrapper().groupCodeEq(baseUpdateVO.getGroupCode())
+    			.calendarIdEq(id, onlyCalendarByProject ? 1 : null).projectIdEq(projectId, onlyCalendarByGroup ? 0 : null).builder();
     	this.workCalendarDictService.remove(dictWrapper);
-		
+    	
 		return ResponseUtil.successResult("删除工作历类型成功");
     }
     
     
     /**
      * 模板创建工作历信息--老版服务
+     * 
      * @param from_id 来源ID
      * @param workCalendar
      * @return
@@ -239,7 +284,7 @@ public class WorkCalendarHandler {
     	
     	// 获取规则信息
     	QueryWrapper<WorkCalendarRule> queryRule = new WorkCalendarRule.Builder().createQueryWrapper()
-    			.calendarIdEq(from_id).projectIdEq(workCalendar.getProjectId())
+    			.calendarIdEq(from_id, null).projectIdEq(workCalendar.getProjectId(), null)
     			.delFlagEq(WorkCalendarConstant.WORK_CALENDAR_DEL_FLAG_NOR).builderQueryWrapper();
     	List<WorkCalendarRule> ruleList = this.workCalendarRuleService.list(queryRule);
     	
@@ -261,7 +306,7 @@ public class WorkCalendarHandler {
 		}
     	// 获取作息时间信息
     	QueryWrapper<WorkCalendarDate> queryDate = new WorkCalendarDate.Builder().createQueryWrapper()
-    			.calendarIdEq(from_id).projectIdEq(workCalendar.getProjectId()).builderQueryWrapper();
+    			.calendarIdEq(from_id, null).projectIdEq(workCalendar.getProjectId(), null).builderQueryWrapper();
     	List<WorkCalendarDate> dateList = this.workCalendarDateService.list(queryDate);
     	
     	WorkCalendarDate calendarDate = null;
@@ -297,7 +342,7 @@ public class WorkCalendarHandler {
 		if (result) {
 			WorkCalendarRule workCalendarRule = new WorkCalendarRule();
 			workCalendarRule.setCalendarId(id);
-			result = workCalendarRuleService.deleteWorkCalendarRule(workCalendarRule);
+			result = workCalendarRuleService.deleteWorkCalendarRule(workCalendarRule, null);
 			if (!result) {
 				return ResponseOldResultUtil.errorResultMsg("工作历删除成功,对应规则删除失败");
 			}
@@ -312,11 +357,9 @@ public class WorkCalendarHandler {
      */
 	public List<OldCalendarResponseVO> queryOldCalendarDetails(OldCalendarQueryVO requestData) {
 		// 获取数据,tag由于需要like in 不在sql语句中处理,在此对返回结果做处理
-		QueryWrapper<WorkCalendarDate> queryWrapper = new WorkCalendarDate.Builder()
-				.createQueryWrapper().calendarIdEq(requestData.getId())
-				.dictCodeIn(requestData.getIntervals())
-				.workDateStartGe(requestData.getDates().getFrom())
-				.workDateEndLe(requestData.getDates().getTo())
+		QueryWrapper<WorkCalendarDate> queryWrapper = new WorkCalendarDate.Builder().createQueryWrapper()
+				.calendarIdEq(requestData.getId(), null).dictCodeIn(requestData.getIntervals())
+				.workDateStartGe(requestData.getDates().getFrom()).workDateEndLe(requestData.getDates().getTo())
 				.builderQueryWrapper();
 		// 其中的数据包括作息日期 作息时间段
 		List<WorkCalendarDate> dateList = this.workCalendarDateService.list(queryWrapper);
@@ -326,7 +369,7 @@ public class WorkCalendarHandler {
 		
 		// 再获取规则数据
 		QueryWrapper<WorkCalendarRule> queryRule = new WorkCalendarRule.Builder()
-				.createQueryWrapper().calendarIdEq(requestData.getId())
+				.createQueryWrapper().calendarIdEq(requestData.getId(), null)
 				.delFlagEq(WorkCalendarConstant.WORK_CALENDAR_DEL_FLAG_NOR)
 				.ruleFlagEq(WorkCalendarConstant.WORK_CALENDAR_RULE_FLAG_OLD).builderQueryWrapper();
 		List<WorkCalendarRule> ruleList = this.workCalendarRuleService.list(queryRule);
@@ -431,8 +474,7 @@ public class WorkCalendarHandler {
 	 * @param offsetDate 这一天
 	 * @param formatDate 这一天的字符串形式,YYYYMMDDHHMMSS
 	 */
-	private void parseCalendarRules(List<WorkCalendarRule> ruleList, Set<String> tags, Date offsetDate,
-			String formatDate) {
+	private void parseCalendarRules(List<WorkCalendarRule> ruleList, Set<String> tags, Date offsetDate, String formatDate) {
 		// 获取月日
 		String mmddStr = formatDate.substring(4, 8);
 		Integer mmdd = Integer.valueOf(mmddStr);

+ 60 - 27
src/main/java/com/persagy/calendar/handle/WorkCalendarLabelHandler.java

@@ -1,7 +1,9 @@
 package com.persagy.calendar.handle;
 
+import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
+import java.util.Set;
 
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -27,6 +29,7 @@ import com.persagy.calendar.service.IWorkCalendarService;
 import com.persagy.common.enums.ResponseCode;
 import com.persagy.common.exception.BusinessException;
 import com.persagy.common.utils.DateUtil;
+import com.persagy.common.utils.IdGenerator;
 import com.persagy.common.utils.ResponseResult;
 import com.persagy.common.utils.ResponseUtil;
 import com.persagy.common.utils.StringUtil;
@@ -66,11 +69,16 @@ public class WorkCalendarLabelHandler {
 
 	/**
 	 * 日期标签属性列表查询
+	 * 
 	 * @param queryVO
 	 * @return
 	 */
 	public List<WorkCalendarLabel> queryCalendarLabelList(WorkCalendarLabelQueryVO queryVO) {
-		if (StringUtil.isNotBlank(queryVO.getObjId())) {
+		// 获取字典类型的级别
+		int dictTypeLevel = this.workCalendarDictService.getDictTypeLevel(queryVO.getGroupCode(), queryVO.getDictType());
+		
+		// 如果条件为对象ID,且属于工作历级别的类型,反查出工作历ID,再进行查询
+		if (StringUtil.isNotBlank(queryVO.getObjId()) && dictTypeLevel == 2) {
 			//查询出此对象对应的工作历ID和项目ID
 			QueryWrapper<WorkCalendarObject> objectWrapper = new WorkCalendarObject.Builder().createQueryWrapper()
 					.groupCodeEq(queryVO.getGroupCode()).objectIdEq(queryVO.getObjId())
@@ -81,21 +89,25 @@ public class WorkCalendarLabelHandler {
 			}
 			queryVO.setCalendarId(calendarObject.getCalendarId());
 		}
-		QueryWrapper<WorkCalendarLabel> queryWrapper = new WorkCalendarLabel.Builder().createQueryWrapper()
-				.calendarIdEq(queryVO.getCalendarId()).projectIdEq(queryVO.getProjectId())
-				.dictTypeEq(queryVO.getDictType()).dictCodeEq(queryVO.getDictCode())
-				.labelDateGe(queryVO.getLabelDateStart()).labelDateLe(queryVO.getLabelDateEnd())
-				.builderQueryWrapper();
+		
+		QueryWrapper<WorkCalendarLabel> queryWrapper = new WorkCalendarLabel.Builder().createQueryWrapper().groupCodeEq(queryVO.getGroupCode())
+				.projectIdEq(queryVO.getProjectId(), dictTypeLevel).calendarIdEq(queryVO.getCalendarId(), dictTypeLevel)
+				.dictTypeEq(queryVO.getDictType()).dictCodeEq(queryVO.getDictCode()).diyLabelEq(queryVO.getDiyLabel())
+				.labelDateGe(queryVO.getLabelDateStart()).labelDateLe(queryVO.getLabelDateEnd()).builderQueryWrapper();
 		return this.workCalendarLabelService.list(queryWrapper.select(LABEL_COLUMN).orderByAsc(Lists.newArrayList("LABEL_DATE", "ID")));
 	}
 	
 	/**
 	 * 查询标签的有效期
+	 * 
 	 * @param queryVO
 	 * @return
 	 */
 	public List<WorkCalendarLabel> queryCalendarLabelValid(WorkCalendarLabelQueryVO queryVO) {
-		if (StringUtil.isNotBlank(queryVO.getObjId())) {
+		// 获取字典类型的级别
+		int dictTypeLevel = this.workCalendarDictService.getDictTypeLevel(queryVO.getGroupCode(), queryVO.getDictType());
+		
+		if (StringUtil.isNotBlank(queryVO.getObjId()) && dictTypeLevel == 2) {
 			//查询出此对象对应的工作历ID和项目ID
 			QueryWrapper<WorkCalendarObject> objectWrapper = new WorkCalendarObject.Builder().createQueryWrapper()
 					.groupCodeEq(queryVO.getGroupCode()).objectIdEq(queryVO.getObjId())
@@ -106,12 +118,11 @@ public class WorkCalendarLabelHandler {
 			}
 			queryVO.setCalendarId(calendarObject.getCalendarId());
 		}
-		QueryWrapper<WorkCalendarLabel> queryWrapper = new WorkCalendarLabel.Builder().createQueryWrapper()
-				.groupCodeEq(queryVO.getGroupCode()).calendarIdEq(queryVO.getCalendarId())
-				.projectIdEq(queryVO.getProjectId()).dictTypeEq(queryVO.getDictType())
-				.dictCodeEq(queryVO.getDictCode()).diyLabelEq(queryVO.getDiyLabel())
-				.labelDateGe(queryVO.getLabelDateStart()).labelDateLe(queryVO.getLabelDateEnd())
-				.builderQueryWrapper();
+		
+		QueryWrapper<WorkCalendarLabel> queryWrapper = new WorkCalendarLabel.Builder().createQueryWrapper().groupCodeEq(queryVO.getGroupCode())
+				.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);
@@ -119,25 +130,29 @@ public class WorkCalendarLabelHandler {
 	
 	/**
 	 * 创建或更新日期标签属性
+	 * 
 	 * @param createVO
 	 */
 	@Transactional
 	public void updateLabelInfo(WorkCalendarLabelUpdateVO updateVO) {
+		// 获取字典类型的级别
+		int dictTypeLevel = this.workCalendarDictService.getDictTypeLevel(updateVO.getGroupCode(), updateVO.getDictType());
+		
 		boolean result = false;
 		if (BooleanUtil.isTrue(updateVO.getIsDelete())) {
 			Builder builder = new WorkCalendarLabel.Builder().createQueryWrapper();
-			QueryWrapper<WorkCalendarLabel> queryWrapper = builder.labelDateGe(updateVO.getLabelDateStart())
-					.labelDateLe(updateVO.getLabelDateEnd()).calendarIdEq(updateVO.getCalendarId())
-					.projectIdEq(updateVO.getProjectId()).dictTypeEq(updateVO.getDictType())
-					.diyLabelEq(updateVO.getDiyLabel()).builderQueryWrapper();
+			QueryWrapper<WorkCalendarLabel> queryWrapper = builder.groupCodeEq(updateVO.getGroupCode())
+					.projectIdEq(updateVO.getProjectId(), dictTypeLevel).calendarIdEq(updateVO.getCalendarId(), dictTypeLevel)
+					.labelDateGe(updateVO.getLabelDateStart()).labelDateLe(updateVO.getLabelDateEnd())
+					.dictTypeEq(updateVO.getDictType()).diyLabelEq(updateVO.getDiyLabel()).builderQueryWrapper();
 			this.workCalendarLabelService.remove(queryWrapper);
 			return;
 		} else if (BooleanUtil.isTrue(updateVO.getIsUpdate())) {
 			Builder builder = new WorkCalendarLabel.Builder().createQueryWrapper();
-			QueryWrapper<WorkCalendarLabel> queryWrapper = builder.labelDateGe(updateVO.getLabelDateStart())
-					.labelDateLe(updateVO.getLabelDateEnd()).calendarIdEq(updateVO.getCalendarId())
-					.projectIdEq(updateVO.getProjectId()).dictTypeEq(updateVO.getDictType())
-					.diyLabelEq(updateVO.getDiyLabel()).builderQueryWrapper();
+			QueryWrapper<WorkCalendarLabel> queryWrapper = builder.groupCodeEq(updateVO.getGroupCode())
+					.projectIdEq(updateVO.getProjectId(), dictTypeLevel).calendarIdEq(updateVO.getCalendarId(), dictTypeLevel)
+					.labelDateGe(updateVO.getLabelDateStart()).labelDateLe(updateVO.getLabelDateEnd())
+					.dictTypeEq(updateVO.getDictType()).diyLabelEq(updateVO.getDiyLabel()).builderQueryWrapper();
 			this.workCalendarLabelService.remove(queryWrapper);
 		}
 		
@@ -148,6 +163,14 @@ public class WorkCalendarLabelHandler {
 		calendarLabel.setUpdateTime(now);
 		calendarLabel.setUpdateUser(updateVO.getUserId());
 		calendarLabel.setGroupCode(updateVO.getGroupCode());
+		if (dictTypeLevel == 0) {
+			// 集团级
+			calendarLabel.setCalendarId("0");
+			calendarLabel.setProjectId("0");
+		} else if (dictTypeLevel == 1) {
+			// 项目级
+			calendarLabel.setCalendarId("0");
+		}
 		
 		DateTime dateStart = DateUtil.parse(updateVO.getLabelDateStart(), DateUtil.FORMAT_DATE_YYYYMMDD);
 		DateTime dateEnd = DateUtil.parse(updateVO.getLabelDateEnd(), DateUtil.FORMAT_DATE_YYYYMMDD);
@@ -169,26 +192,36 @@ public class WorkCalendarLabelHandler {
 		// 设置成功后,将自定义的标签插入到字典表中
 		if (WorkCalendarConstant.CUSTOM_CALENDAR_DATE_YES.equals(updateVO.getDiyLabel())) {
 			// 当自定义标签时,存入字典表
-			WorkCalendarDict calendarDict = new WorkCalendarDict();
-			calendarDict.setCalendarId(updateVO.getCalendarId());
-			calendarDict.setGroupCode(updateVO.getGroupCode());
-			calendarDict.setDictType(WorkCalendarConstant.CUSTOM_CALENDAR_DICT_TYPE);
-			this.workCalendarDictService.batchCreateOrUpdateDictType(calendarDict, updateVO.getDiyValue());
+			List<WorkCalendarDict> calendarDicts = new ArrayList<WorkCalendarDict>();
+			Set<String> diyValues = updateVO.getDiyValue();
+			for (String diyValue : diyValues) {
+				WorkCalendarDict calendarDict = new WorkCalendarDict();
+				calendarDict.setId(IdGenerator.getUUID());
+				calendarDict.setCalendarId(updateVO.getCalendarId());
+				calendarDict.setProjectId(updateVO.getProjectId());
+				calendarDict.setGroupCode(updateVO.getGroupCode());
+				calendarDict.setDictType(WorkCalendarConstant.CUSTOM_CALENDAR_DICT_TYPE);
+	    		calendarDict.setDictDesc(diyValue);
+	    		calendarDicts.add(calendarDict);
+			}
+			this.workCalendarDictService.batchCreateDictTypeByDelete(calendarDicts);
 		}
 		
 	}
 
 	/**
 	 * 重新定义日期段内每天的属性标签
+	 * 
 	 * @param updateVO
 	 */
 	@Transactional
 	public void updateCalendarDateAttribute(WorkLabelBatchUpdateVO updateVO) {
 		List<WorkCalendarMoreDateCreateVO> times = updateVO.getTimes();
 		if (CollectionUtil.isNotEmpty(times)) {
+			// 自定义时间时,一定是属于某个工作历下的,不用判断标签所属
 			for (WorkCalendarMoreDateCreateVO moreDateCreateVO : times) {
 				// 判断工作历类型是否存在
-				WorkCalendar calendar = this.workCalendarService.getById(moreDateCreateVO.getCalendarId(), moreDateCreateVO.getProjectId());
+				WorkCalendar calendar = this.workCalendarService.getById(moreDateCreateVO.getCalendarId(), moreDateCreateVO.getGroupCode(), moreDateCreateVO.getProjectId());
 				if (calendar == null) {
 					throw new BusinessException("工作历类型不存在");
 				}

+ 39 - 25
src/main/java/com/persagy/calendar/handle/WorkCalendarRuleHandler.java

@@ -1,7 +1,9 @@
 package com.persagy.calendar.handle;
 
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
 import org.springframework.beans.BeanUtils;
@@ -14,12 +16,12 @@ import com.persagy.calendar.pojo.dto.WorkCalendarRule;
 import com.persagy.calendar.pojo.vo.CustomCalendarVO;
 import com.persagy.calendar.pojo.vo.WorkCalendarRuleCreateVO;
 import com.persagy.calendar.pojo.vo.WorkCalendarRuleUpdateVO;
+import com.persagy.calendar.service.IWorkCalendarDictService;
 import com.persagy.calendar.service.IWorkCalendarRuleService;
 import com.persagy.calendar.service.IWorkCalendarService;
 import com.persagy.common.enums.ResponseCode;
 import com.persagy.common.exception.BusinessException;
 
-import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.util.BooleanUtil;
 
 /**
@@ -36,10 +38,15 @@ public class WorkCalendarRuleHandler {
 	private IWorkCalendarService workCalendarService;
 	
 	@Autowired
+	private IWorkCalendarDictService workCalendarDictService;
+	
+	@Autowired
 	private IWorkCalendarRuleService workCalendarRuleService;
 	
 	/**
 	 * 批量创建规则信息
+	 * 
+	 * @param createVO
 	 */
 	@Transactional
 	public void batchCreateCalednarRule(CustomCalendarVO<WorkCalendarRuleCreateVO> createVO) {
@@ -47,38 +54,35 @@ public class WorkCalendarRuleHandler {
 		WorkCalendarRule workCalendarRule = null;
 		List<WorkCalendarRuleCreateVO> batchInfo = createVO.getBatchInfo();
 		Set<String> calendarIds = new HashSet<String>();
+		Map<String, Integer> dictTypeLevelMap = new HashMap<String, Integer>();
 		for (WorkCalendarRuleCreateVO rule : batchInfo) {
 			// 优先判断工作历信息是否存在
 			if (!calendarIds.contains(rule.getCalendarId())) {
-				WorkCalendar workCalendar = this.workCalendarService.getById(rule.getCalendarId(), createVO.getProjectId());
+				WorkCalendar workCalendar = this.workCalendarService.getById(rule.getCalendarId(), createVO.getGroupCode(), createVO.getProjectId());
 				if (workCalendar == null) {
 					throw new BusinessException("工作历主信息不存在");
 				}
 			}
+			// 判断当前字典类型级别
+			Integer dictTypeLevel = dictTypeLevelMap.get(rule.getDictType());
+			if (dictTypeLevel == null) {
+				dictTypeLevel = this.workCalendarDictService.getDictTypeLevel(createVO.getGroupCode(), rule.getDictType());
+				dictTypeLevelMap.put(rule.getDictType(), dictTypeLevel);
+			}
+			
 			workCalendarRule = new WorkCalendarRule();
 			BeanUtils.copyProperties(rule, workCalendarRule);
 			workCalendarRule.setId(null);
 			workCalendarRule.setGroupCode(createVO.getGroupCode());
-			workCalendarRule.setProjectId(createVO.getProjectId());
-			workCalendarRule.setUpdateUser(createVO.getUserId());
-			// 为兼容IBMS,紧急修改内容: shop 类型的工作历规则,一个项目的dictType+dictCode+value已存在的话,直接更新
-			if ("shop".equals(rule.getDictType()) && CollectionUtil.isNotEmpty(workCalendarRule.getValue())) {
-				String ruleId = this.workCalendarRuleService.getCalendarRule(workCalendarRule);
-				if (ruleId != null ) {
-					// 直接更新
-					workCalendarRule.setId(ruleId);
-					result = workCalendarRuleService.updateWorkCalendarRule(workCalendarRule);
-					if (!result) {
-						throw new BusinessException("工作历规则信息保存失败");
-					}
-					calendarIds.add(rule.getCalendarId());
-					continue;
-				}
+			workCalendarRule.setProjectId(dictTypeLevel == 0 ? "0" : createVO.getProjectId());
+			if (dictTypeLevel != 2) {
+				workCalendarRule.setCalendarId("0");
 			}
+			workCalendarRule.setUpdateUser(createVO.getUserId());
+			
 			// 是否需要删除旧规则
 			if (BooleanUtil.isTrue(createVO.getIsDelete()) && !calendarIds.contains(rule.getCalendarId())) {
-				workCalendarRuleService.removeWorkCalendarRule(null, rule.getCalendarId(), rule.getDictType());
-				//throw new BusinessException("工作历ID为:" + rule.getCalendarId() + "的工作历,删除规则信息失败");
+				this.workCalendarRuleService.removeWorkCalendarRule(createVO.getGroupCode(), createVO.getProjectId(), null, rule.getCalendarId(), rule.getDictType(), dictTypeLevel);
 			}
 			result = this.workCalendarRuleService.createWorkCalendarRule(workCalendarRule);
 			if (!result) {
@@ -98,30 +102,40 @@ public class WorkCalendarRuleHandler {
 		WorkCalendarRule workCalendarRule = null;
 		List<WorkCalendarRuleUpdateVO> batchInfo = updateVO.getBatchInfo();
 		Set<String> calendarIds = new HashSet<String>();
+		Map<String, Integer> dictTypeLevelMap = new HashMap<String, Integer>();
 		for (WorkCalendarRuleUpdateVO rule : batchInfo) {
 			// 优先判断工作历信息是否存在
 			if (!calendarIds.contains(rule.getCalendarId())) {
-				WorkCalendar workCalendar = this.workCalendarService.getById(rule.getCalendarId(), updateVO.getProjectId());
+				WorkCalendar workCalendar = this.workCalendarService.getById(rule.getCalendarId(), updateVO.getGroupCode(), updateVO.getProjectId());
 				if (workCalendar == null) {
 					throw new BusinessException("工作历主信息不存在");
 				}
 			}
 			// 再判断原规则数据是否存在
-			WorkCalendarRule calendar = workCalendarRuleService.getById(rule.getId(), updateVO.getProjectId());
+			WorkCalendarRule calendar = this.workCalendarRuleService.getById(rule.getId());
 			if (calendar == null) {
 				throw new BusinessException(ResponseCode.C0320.getDesc());
 			}
+			// 判断当前字典类型级别
+			Integer dictTypeLevel = dictTypeLevelMap.get(rule.getDictType());
+			if (dictTypeLevel == null) {
+				dictTypeLevel = this.workCalendarDictService.getDictTypeLevel(updateVO.getGroupCode(), rule.getDictType());
+				dictTypeLevelMap.put(rule.getDictType(), dictTypeLevel);
+			}
+			
 			// 是否需要删除旧规则
 			if (BooleanUtil.isTrue(updateVO.getIsDelete()) && !calendarIds.contains(rule.getCalendarId())) {
-				workCalendarRuleService.removeWorkCalendarRule(null, rule.getCalendarId(), rule.getDictCode());
-				//throw new BusinessException("工作历ID为:" + rule.getCalendarId() + "的工作历,删除规则信息失败");
+				this.workCalendarRuleService.removeWorkCalendarRule(updateVO.getGroupCode(), updateVO.getProjectId(), null, rule.getCalendarId(), rule.getDictType(), dictTypeLevel);
 			}
 			workCalendarRule = new WorkCalendarRule();
 			BeanUtils.copyProperties(rule, workCalendarRule);
 			workCalendarRule.setGroupCode(updateVO.getGroupCode());
-			workCalendarRule.setProjectId(updateVO.getProjectId());
+			workCalendarRule.setProjectId(dictTypeLevel == 0 ? "0" : updateVO.getProjectId());
+			if (dictTypeLevel != 2) {
+				workCalendarRule.setCalendarId("0");
+			}
 			workCalendarRule.setUpdateUser(updateVO.getUserId());
-			result = workCalendarRuleService.updateWorkCalendarRule(workCalendarRule);
+			result = this.workCalendarRuleService.updateWorkCalendarRule(workCalendarRule);
 			if (!result) {
 				throw new BusinessException("工作历规则信息更新失败");
 			}

+ 0 - 19
src/main/java/com/persagy/calendar/mapper/WorkCalendarDictMapper.java

@@ -1,14 +1,12 @@
 package com.persagy.calendar.mapper;
 
 import java.util.List;
-import java.util.Set;
 
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.persagy.calendar.pojo.dto.WorkCalendarDict;
-import com.persagy.calendar.pojo.vo.DictCodeCreate;
 
 /**
  * @version 
@@ -21,23 +19,6 @@ import com.persagy.calendar.pojo.vo.DictCodeCreate;
 public interface WorkCalendarDictMapper extends BaseMapper<WorkCalendarDict> {
 
 	/**
-	 * 批量创建字典类型,此接口,不存在dictCode
-	 * 
-	 * @param calendarDict
-	 * @param diyValue
-	 */
-	Integer batchCreateOrUpdateDictType(@Param("calendarDict") WorkCalendarDict calendarDict, @Param("diyValues") Set<String> diyValues);
-
-	/**
-	 * 批量创建字典类型
-	 * 
-	 * @param calendarDict
-	 * @param codes
-	 * @return
-	 */
-	Integer batchCreateOrUpdateDict(@Param("calendarDict") WorkCalendarDict calendarDict, @Param("codes") List<DictCodeCreate> codes);
-
-	/**
 	 * 批量创建字典类型
 	 * 
 	 * @param calendarDicts

+ 1 - 1
src/main/java/com/persagy/calendar/pojo/dto/WorkCalendar.java

@@ -13,8 +13,8 @@ import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.persagy.calendar.constant.WorkCalendarConstant;
 import com.persagy.common.annotation.IdGenerator;
 import com.persagy.common.enums.IdGeneratorAlgorithm;
-import com.persagy.common.model.BaseEntity;
 import com.persagy.common.utils.StringUtil;
+import com.persagy.db.model.BaseEntity;
 
 import lombok.EqualsAndHashCode;
 import lombok.Getter;

+ 108 - 13
src/main/java/com/persagy/calendar/pojo/dto/WorkCalendarDate.java

@@ -11,11 +11,10 @@ import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.persagy.calendar.constant.WorkCalendarConstant;
 import com.persagy.common.annotation.IdGenerator;
 import com.persagy.common.enums.IdGeneratorAlgorithm;
-import com.persagy.common.model.BaseEntity;
 import com.persagy.common.utils.StringUtil;
+import com.persagy.db.model.BaseEntity;
 
 import cn.hutool.core.collection.CollectionUtil;
-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("work_calendar_date")
 @IdGenerator(prefix = WorkCalendarConstant.WORK_CALENDAR_DATE_ID_PREFIX, algorithm = IdGeneratorAlgorithm.SNOW_STR)
 public class WorkCalendarDate extends BaseEntity<WorkCalendarDate> {
@@ -133,24 +131,36 @@ public class WorkCalendarDate extends BaseEntity<WorkCalendarDate> {
 			}
 			return this;
 		}
-
-		public Builder calendarIdEq(String calendarId) {
-			if (StringUtil.isNotBlank(calendarId)) {
+		
+		/**
+		 * 
+		 * @param projectId
+		 * @param dictTypeLevel 当为null,或者不为0时,才会生效 
+		 * @return
+		 */
+		public Builder projectIdEq(String projectId, Integer dictTypeLevel) {
+			if (StringUtil.isNotBlank(projectId) && (dictTypeLevel == null || dictTypeLevel != 0)) {
 				if (updateWrapper != null) {
-					updateWrapper.eq("CALENDAR_ID", calendarId);
+					updateWrapper.eq("PROJECT_ID", projectId);
 				} else {
-					queryWrapper.eq("CALENDAR_ID", calendarId);
+					queryWrapper.eq("PROJECT_ID", projectId);
 				}
+				
 			}
 			return this;
 		}
-
-		public Builder projectIdEq(String projectId) {
-			if (StringUtil.isNotBlank(projectId)) {
+		
+		/**
+		 * @param calendarId
+		 * @param dictTypeLevel 当为2 或者null时,才会生效
+		 * @return
+		 */
+		public Builder calendarIdEq(String calendarId, Integer dictTypeLevel) {
+			if (StringUtil.isNotBlank(calendarId) && (dictTypeLevel == null || dictTypeLevel == 2)) {
 				if (updateWrapper != null) {
-					updateWrapper.eq("PROJECT_ID", projectId);
+					updateWrapper.eq("CALENDAR_ID", calendarId);
 				} else {
-					queryWrapper.eq("PROJECT_ID", projectId);
+					queryWrapper.eq("CALENDAR_ID", calendarId);
 				}
 			}
 			return this;
@@ -395,4 +405,89 @@ public class WorkCalendarDate extends BaseEntity<WorkCalendarDate> {
 			return updateWrapper;
 		}
 	}
+
+	/**
+	 * 调用之前转换一下项目ID和工作历ID,按照字典类型级别
+	 */
+	@Override
+	public boolean equals(Object obj) {
+		if (this == obj) {
+			return true;
+		}
+		if (obj == null) {
+			return false;
+		}
+		
+		if (getClass() != obj.getClass()) {
+			return false;
+		}
+		
+		WorkCalendarDate other = (WorkCalendarDate) obj;
+		if (calendarId == null) {
+			if (other.calendarId != null) {
+				return false;
+			}
+		} else if (!calendarId.equals(other.calendarId)) {
+			return false;
+		}
+		
+		if (dictCode == null) {
+			if (other.dictCode != null) {
+				return false;
+			}
+		} else if (!dictCode.equals(other.dictCode)) {
+			return false;
+		}
+
+		if (dictType == null) {
+			if (other.dictType != null) {
+				return false;
+			}
+		} else if (!dictType.equals(other.dictType)) {
+			return false;
+		}
+
+		if (groupCode == null) {
+			if (other.groupCode != null) {
+				return false;
+			}
+		} else if (!groupCode.equals(other.groupCode)) {
+			return false;
+		}
+		
+		if (projectId == null) {
+			if (other.projectId != null) {
+				return false;
+			}
+		} else if (!projectId.equals(other.projectId)) {
+			return false;
+		}
+		
+		if (workDate == null) {
+			if (other.workDate != null) {
+				return false;
+			}
+		} else if (!workDate.equals(other.workDate)) {
+			return false;
+		}
+		
+		return true;
+	}
+
+	/**
+	 * 调用之前转换一下项目ID和工作历ID,按照字典类型级别
+	 */
+	@Override
+	public int hashCode() {
+		final int prime = 31;
+		int result = 1;
+		result = prime * result + ((calendarId == null) ? 0 : calendarId.hashCode());
+		result = prime * result + ((dictCode == null) ? 0 : dictCode.hashCode());
+		result = prime * result + ((dictType == null) ? 0 : dictType.hashCode());
+		result = prime * result + ((groupCode == null) ? 0 : groupCode.hashCode());
+		result = prime * result + ((projectId == null) ? 0 : projectId.hashCode());
+		result = prime * result + ((workDate == null) ? 0 : workDate.hashCode());
+		return result;
+	}
+	
 }

+ 174 - 47
src/main/java/com/persagy/calendar/pojo/dto/WorkCalendarDict.java

@@ -3,10 +3,12 @@ package com.persagy.calendar.pojo.dto;
 import com.baomidou.mybatisplus.annotation.FieldStrategy;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
-import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.persagy.common.annotation.IdGenerator;
+import com.persagy.common.enums.IdGeneratorAlgorithm;
 import com.persagy.common.utils.StringUtil;
+import com.persagy.db.model.BaseEntity;
 
 import lombok.EqualsAndHashCode;
 import lombok.Getter;
@@ -14,6 +16,9 @@ import lombok.Setter;
 import lombok.ToString;
 
 /**
+ * 这里定义了字典的级别,属于集团、项目、工作历等等,不存在此表中的一律默认为属于工作历级别
+ * 且仅定义到 dictType这一级别 
+ * 
  * @version
  * @description
  * @company persagy
@@ -25,90 +30,212 @@ import lombok.ToString;
 @ToString
 @EqualsAndHashCode(callSuper = false)
 @TableName("work_calendar_dict")
-public class WorkCalendarDict extends Model<WorkCalendarDict> {
-	private static final long serialVersionUID = -4969298760644522850L;
+@IdGenerator(algorithm = IdGeneratorAlgorithm.UUID)
+public class WorkCalendarDict extends BaseEntity<WorkCalendarDict> {
+	private static final long serialVersionUID = -2320309460723341358L;
 
 	@TableField(updateStrategy = FieldStrategy.NOT_EMPTY)
-	private String groupCode; 	// 集团编码
+	private String groupCode; // 集团编码
 
 	@TableField(updateStrategy = FieldStrategy.NOT_EMPTY)
-	private String calendarId; // 工作历ID
-	
+	private String projectId; // 项目ID,集团级别的字典,此值为0
+
+	@TableField(updateStrategy = FieldStrategy.NOT_EMPTY)
+	private String calendarId; // 工作历ID,项目级别的字典,此值为0
+
 	@TableField(updateStrategy = FieldStrategy.NOT_EMPTY)
 	private String dictType; // 字典类型
 
 	@TableField(updateStrategy = FieldStrategy.NOT_EMPTY)
-	private String dictCode; // 字典数据的code
+	private String dictCode; // 字典类型的code
 
 	@TableField(updateStrategy = FieldStrategy.NOT_EMPTY)
-	private String dictDesc; // 字典类型的描述
-	
-	public static class Builder {
+	private String dictDesc; // 字典类型描述
+
+	public static Builder builder() {
+		return new Builder();
+	}
 
-		private QueryWrapper<WorkCalendarDict> queryWrapper = null;
+	public static class BuilderQueryWrapper {
 
-		private UpdateWrapper<WorkCalendarDict> updateWrapper = null;
+		private LambdaQueryWrapper<WorkCalendarDict> queryWrapper = new LambdaQueryWrapper<WorkCalendarDict>();
 
-		public Builder createQueryWrapper() {
-			queryWrapper = new QueryWrapper<WorkCalendarDict>();
+		public BuilderQueryWrapper idEq(String id) {
+			if (StringUtil.isNotBlank(id)) {
+				queryWrapper.eq(WorkCalendarDict::getId, id);
+			}
 			return this;
 		}
 
-		public Builder createUpdateWrapper() {
-			updateWrapper = new UpdateWrapper<WorkCalendarDict>();
+		public BuilderQueryWrapper groupCodeEq(String groupCode) {
+			if (StringUtil.isNotBlank(groupCode)) {
+				queryWrapper.eq(WorkCalendarDict::getGroupCode, groupCode);
+			}
 			return this;
 		}
 
-		public Builder groupCodeEq(String groupCode) {
-			if (StringUtil.isNotBlank(groupCode)) {
-				if (updateWrapper != null) {
-					updateWrapper.eq("GROUP_CODE", groupCode);
-				} else {
-					queryWrapper.eq("GROUP_CODE", groupCode);
-				}
+		/**
+		 * @param projectId
+		 * @param dictTypeLevel 当为null,或者不为0时,才会生效 
+		 * @return
+		 */
+		public BuilderQueryWrapper projectIdEq(String projectId, Integer dictTypeLevel) {
+			if (StringUtil.isNotBlank(projectId) && (dictTypeLevel == null || dictTypeLevel != 0)) {
+				queryWrapper.eq(WorkCalendarDict::getProjectId, projectId);
 			}
 			return this;
 		}
 
-		public Builder calendarIdEq(String calendarId) {
-			if (StringUtil.isNotBlank(calendarId)) {
-				if (updateWrapper != null) {
-					updateWrapper.eq("CALENDAR_ID", calendarId);
-				} else {
-					queryWrapper.eq("CALENDAR_ID", calendarId);
-				}
+		/**
+		 * @param calendarId
+		 * @param dictTypeLevel 当为null,或者不为0时,才会生效 
+		 * @return
+		 */
+		public BuilderQueryWrapper calendarIdEq(String calendarId, Integer dictTypeLevel) {
+			if (StringUtil.isNotBlank(calendarId) && (dictTypeLevel == null || dictTypeLevel == 2)) {
+				queryWrapper.eq(WorkCalendarDict::getCalendarId, calendarId);
 			}
 			return this;
 		}
 		
-		public Builder dictTypeEq(String dictType) {
+		public BuilderQueryWrapper dictTypeEq(String dictType) {
 			if (StringUtil.isNotBlank(dictType)) {
-				if (updateWrapper != null) {
-					updateWrapper.eq("DICT_TYPE", dictType);
-				} else {
-					queryWrapper.eq("DICT_TYPE", dictType);
-				}
+				queryWrapper.eq(WorkCalendarDict::getDictType, dictType);
 			}
 			return this;
 		}
 
-		public Builder dictCodeEq(String dictCode) {
+		public BuilderQueryWrapper dictCodeEq(String dictCode) {
 			if (StringUtil.isNotBlank(dictCode)) {
-				if (updateWrapper != null) {
-					updateWrapper.eq("DICT_CODE", dictCode);
-				} else {
-					queryWrapper.eq("DICT_CODE", dictCode);
-				}
+				queryWrapper.eq(WorkCalendarDict::getDictCode, dictCode);
 			}
 			return this;
 		}
-		
-		public QueryWrapper<WorkCalendarDict> builderQueryWrapper() {
+
+		public BuilderQueryWrapper dictDescEq(String dictDesc) {
+			if (StringUtil.isNotBlank(dictDesc)) {
+				queryWrapper.eq(WorkCalendarDict::getDictDesc, dictDesc);
+			}
+			return this;
+		}
+
+		public LambdaQueryWrapper<WorkCalendarDict> builder() {
 			return queryWrapper;
 		}
 
-		public UpdateWrapper<WorkCalendarDict> builderUpdateWrapper() {
+	}
+
+	public static class BuilderUpdateWrapper {
+
+		private LambdaUpdateWrapper<WorkCalendarDict> updateWrapper = new LambdaUpdateWrapper<WorkCalendarDict>();
+
+		public BuilderUpdateWrapper idEq(String id) {
+			if (StringUtil.isNotBlank(id)) {
+				updateWrapper.eq(WorkCalendarDict::getId, id);
+			}
+			return this;
+		}
+
+		public BuilderUpdateWrapper groupCodeEq(String groupCode) {
+			if (StringUtil.isNotBlank(groupCode)) {
+				updateWrapper.eq(WorkCalendarDict::getGroupCode, groupCode);
+			}
+			return this;
+		}
+
+		/**
+		 * @param projectId
+		 * @param dictTypeLevel 当为null,或者不为0时,才会生效 
+		 * @return
+		 */
+		public BuilderUpdateWrapper projectIdEq(String projectId, Integer dictTypeLevel) {
+			if (StringUtil.isNotBlank(projectId) && (dictTypeLevel == null || dictTypeLevel != 0)) {
+				updateWrapper.eq(WorkCalendarDict::getProjectId, projectId);
+			}
+			return this;
+		}
+
+		/**
+		 * @param calendarId
+		 * @param dictTypeLevel 当为null,或者不为0时,才会生效 
+		 * @return
+		 */
+		public BuilderUpdateWrapper calendarIdEq(String calendarId, Integer dictTypeLevel) {
+			if (StringUtil.isNotBlank(calendarId) && (dictTypeLevel == null || dictTypeLevel == 2)) {
+				updateWrapper.eq(WorkCalendarDict::getCalendarId, calendarId);
+			}
+			return this;
+		}
+
+		public BuilderUpdateWrapper dictTypeEq(String dictType) {
+			if (StringUtil.isNotBlank(dictType)) {
+				updateWrapper.eq(WorkCalendarDict::getDictType, dictType);
+			}
+			return this;
+		}
+
+		public BuilderUpdateWrapper dictCodeEq(String dictCode) {
+			if (StringUtil.isNotBlank(dictCode)) {
+				updateWrapper.eq(WorkCalendarDict::getDictCode, dictCode);
+			}
+			return this;
+		}
+
+		public BuilderUpdateWrapper dictDescEq(String dictDesc) {
+			if (StringUtil.isNotBlank(dictDesc)) {
+				updateWrapper.eq(WorkCalendarDict::getDictDesc, dictDesc);
+			}
+			return this;
+		}
+
+		public LambdaUpdateWrapper<WorkCalendarDict> builder() {
 			return updateWrapper;
 		}
+
+	}
+
+	public static class Builder {
+
+		private WorkCalendarDict workCalendarDict = new WorkCalendarDict();
+
+		public Builder id(String id) {
+			workCalendarDict.setId(id);
+			return this;
+		}
+
+		public Builder groupCode(String groupCode) {
+			workCalendarDict.setGroupCode(groupCode);
+			return this;
+		}
+
+		public Builder projectId(String projectId) {
+			workCalendarDict.setProjectId(projectId);
+			return this;
+		}
+
+		public Builder calendarId(String calendarId) {
+			workCalendarDict.setCalendarId(calendarId);
+			return this;
+		}
+
+		public Builder dictType(String dictType) {
+			workCalendarDict.setDictType(dictType);
+			return this;
+		}
+
+		public Builder dictCode(String dictCode) {
+			workCalendarDict.setDictCode(dictCode);
+			return this;
+		}
+
+		public Builder dictDesc(String dictDesc) {
+			workCalendarDict.setDictDesc(dictDesc);
+			return this;
+		}
+
+		public WorkCalendarDict build() {
+			return workCalendarDict;
+		}
 	}
+
 }

+ 17 - 5
src/main/java/com/persagy/calendar/pojo/dto/WorkCalendarLabel.java

@@ -13,8 +13,8 @@ import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
 import com.persagy.calendar.constant.WorkCalendarConstant;
 import com.persagy.common.annotation.IdGenerator;
 import com.persagy.common.enums.IdGeneratorAlgorithm;
-import com.persagy.common.model.BaseEntity;
 import com.persagy.common.utils.StringUtil;
+import com.persagy.db.model.BaseEntity;
 
 import lombok.EqualsAndHashCode;
 import lombok.Getter;
@@ -109,19 +109,31 @@ public class WorkCalendarLabel extends BaseEntity<WorkCalendarLabel> {
 			return this;
 		}
 		
-		public Builder projectIdEq(String projectId) {
-			if (StringUtil.isNotBlank(projectId)) {
+		/**
+		 * 
+		 * @param projectId
+		 * @param dictTypeLevel 当为null,或者不为0时,才会生效 
+		 * @return
+		 */
+		public Builder projectIdEq(String projectId, Integer dictTypeLevel) {
+			if (StringUtil.isNotBlank(projectId) && (dictTypeLevel == null || dictTypeLevel != 0)) {
 				if (updateWrapper != null) {
 					updateWrapper.eq("PROJECT_ID", projectId);
 				} else {
 					queryWrapper.eq("PROJECT_ID", projectId);
 				}
+				
 			}
 			return this;
 		}
 		
-		public Builder calendarIdEq(String calendarId) {
-			if (StringUtil.isNotBlank(calendarId)) {
+		/**
+		 * @param calendarId
+		 * @param dictTypeLevel 当为2 或者null时,才会生效
+		 * @return
+		 */
+		public Builder calendarIdEq(String calendarId, Integer dictTypeLevel) {
+			if (StringUtil.isNotBlank(calendarId) && (dictTypeLevel == null || dictTypeLevel == 2)) {
 				if (updateWrapper != null) {
 					updateWrapper.eq("CALENDAR_ID", calendarId);
 				} else {

+ 22 - 10
src/main/java/com/persagy/calendar/pojo/dto/WorkCalendarRule.java

@@ -12,8 +12,8 @@ import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
 import com.persagy.calendar.constant.WorkCalendarConstant;
 import com.persagy.common.annotation.IdGenerator;
 import com.persagy.common.enums.IdGeneratorAlgorithm;
-import com.persagy.common.model.BaseEntity;
 import com.persagy.common.utils.StringUtil;
+import com.persagy.db.model.BaseEntity;
 
 import cn.hutool.core.collection.CollectionUtil;
 import lombok.EqualsAndHashCode;
@@ -118,23 +118,35 @@ public class WorkCalendarRule extends BaseEntity<WorkCalendarRule> {
 			return this;
 		}
 		
-		public Builder calendarIdEq(String calendarId) {
-			if (StringUtil.isNotBlank(calendarId)) {
+		/**
+		 * 
+		 * @param projectId
+		 * @param dictTypeLevel 当为null,或者不为0时,才会生效 
+		 * @return
+		 */
+		public Builder projectIdEq(String projectId, Integer dictTypeLevel) {
+			if (StringUtil.isNotBlank(projectId) && (dictTypeLevel == null || dictTypeLevel != 0)) {
 				if (updateWrapper != null) {
-					updateWrapper.eq("CALENDAR_ID", calendarId);
+					updateWrapper.eq("PROJECT_ID", projectId);
 				} else {
-					queryWrapper.eq("CALENDAR_ID", calendarId);
+					queryWrapper.eq("PROJECT_ID", projectId);
 				}
+				
 			}
 			return this;
 		}
-
-		public Builder projectIdEq(String projectId) {
-			if (StringUtil.isNotBlank(projectId)) {
+		
+		/**
+		 * @param calendarId
+		 * @param dictTypeLevel 当为2 或者null时,才会生效
+		 * @return
+		 */
+		public Builder calendarIdEq(String calendarId, Integer dictTypeLevel) {
+			if (StringUtil.isNotBlank(calendarId) && (dictTypeLevel == null || dictTypeLevel == 2)) {
 				if (updateWrapper != null) {
-					updateWrapper.eq("PROJECT_ID", projectId);
+					updateWrapper.eq("CALENDAR_ID", calendarId);
 				} else {
-					queryWrapper.eq("PROJECT_ID", projectId);
+					queryWrapper.eq("CALENDAR_ID", calendarId);
 				}
 			}
 			return this;

+ 6 - 3
src/main/java/com/persagy/calendar/pojo/vo/DictQueryVO.java

@@ -25,13 +25,16 @@ public class DictQueryVO {
 	@ApiModelProperty(value = "用户ID", required = true)
 	private String userId;
 	
-	@ApiModelProperty(value = "集团编码", required = true)
+	@ApiModelProperty(value = "集团编码")
 	private String groupCode;
 	
-	@ApiModelProperty(value = "字典类型", required = true)
+	@ApiModelProperty(value = "项目ID")
+	private String projectId;
+	
+	@ApiModelProperty(value = "字典类型")
 	private String dictType; // 字典类型
 	
-	@ApiModelProperty(value = "工作历ID", required = true)
+	@ApiModelProperty(value = "工作历ID")
 	private String calendarId; // 工作历ID
 	
 }

+ 2 - 0
src/main/java/com/persagy/calendar/pojo/vo/WorkCalendarDateQueryVO.java

@@ -11,6 +11,8 @@ import lombok.Setter;
 import lombok.ToString;
 
 /**
+ * 注意,此类不能添加集团编码作为查询条件,因为规则解析需要解析所有集团下的规则,除非后续修改了xxl-job的规则解析功能
+ * 
  * @version 
  * @description 
  * @company persagy

+ 1 - 1
src/main/java/com/persagy/calendar/pojo/vo/WorkCalendarLabelUpdateVO.java

@@ -52,7 +52,7 @@ public class WorkCalendarLabelUpdateVO extends BaseVO {
 	@ApiModelProperty(value = "是否自定义,0-非自定义,1-自定义", required = true)
 	private String diyLabel;
 	
-	@ApiModelProperty(value = "字典编码,自定义时,必填")
+	@ApiModelProperty(value = "字典描述,自定义时,必填")
 	private Set<String> diyValue;
 	
 }

+ 4 - 1
src/main/java/com/persagy/calendar/pojo/vo/WorkCalendarUpdateVO.java

@@ -17,7 +17,6 @@ import lombok.ToString;
  * @author zhangqiankun
  * @since 2020年10月2日:	下午12:22:08
  */
-
 @Getter
 @Setter
 @ToString
@@ -36,4 +35,8 @@ public class WorkCalendarUpdateVO extends BaseQueryVO {
 	
 	@ApiModelProperty(value = "对象ID集合,空间、建筑、楼层、项目", example = "Sp4403070003f55c8b33cf1f45e5bfc699caaba4eedc")
 	private Set<String> objIds;
+	
+	@ApiModelProperty(value = "新项目ID,可支持跨项目复制")
+	private String newProjectId; 		// 新项目ID
+	
 }

+ 2 - 5
src/main/java/com/persagy/calendar/service/IWorkCalendarDateService.java

@@ -15,21 +15,18 @@ import com.persagy.db.service.ISuperService;
  */
 public interface IWorkCalendarDateService extends ISuperService<WorkCalendarDate> {
 	
-	WorkCalendarDate getById(String id, String projectId);
-	
 	boolean createWorkCalendarDate(WorkCalendarDate workCalendarDate);
 	
 	boolean updateWorkCalendarDate(WorkCalendarDate workCalendarDate);
 	
-	boolean deleteWorkCalendarDate(WorkCalendarDate workCalendarDate);
-	
 	boolean deleteWorkCalendarDate(String id);
 	
 	/**
 	 * 同项目下,同天、同类型+code只允许存在一条自定义信息
 	 * @param calendarDate 将本身已存在的作息时间ID赋值给了此对象,方便使用
+	 * @param dictTypeLevel
 	 */
-	boolean checkWorkDateValid(WorkCalendarDate calendarDate);
+	boolean checkWorkDateValid(WorkCalendarDate calendarDate, Integer dictTypeLevel);
 
 	/**
 	 * 不存在新增,存在更新

+ 21 - 11
src/main/java/com/persagy/calendar/service/IWorkCalendarDictService.java

@@ -1,10 +1,8 @@
 package com.persagy.calendar.service;
 
 import java.util.List;
-import java.util.Set;
 
 import com.persagy.calendar.pojo.dto.WorkCalendarDict;
-import com.persagy.calendar.pojo.vo.DictCodeCreate;
 import com.persagy.db.service.ISuperService;
 
 /**
@@ -17,24 +15,36 @@ import com.persagy.db.service.ISuperService;
 public interface IWorkCalendarDictService extends ISuperService<WorkCalendarDict> {
 
 	/**
-	 * 批量创建字典类型
+	 * 查询出对应条件下的字典数据,不在此字典定义中的,一律默认属于工作历级别
 	 * 
-	 * @param calendarDict
-	 * @param diyValue
+	 * @param groupCode
+	 * @param projectId
+	 * @param calendarId
+	 * @param dictType
+	 * @param dictCode
+	 * @return
 	 */
-	boolean batchCreateOrUpdateDictType(WorkCalendarDict calendarDict, Set<String> diyValues);
-
+	List<WorkCalendarDict> queryWorkCalendarDictList(String groupCode, String projectId, String calendarId, String dictType, String dictCode);
+	
+	/**
+	 * 获取字典类型对应的字典级别
+	 * 
+	 * @param groupCode
+	 * @param dictType
+	 * @return 0-集团级别,1-项目级别,2-工作历级别
+	 */
+	int getDictTypeLevel(String groupCode, String dictType);
+	
 	/**
 	 * 批量创建字典类型
 	 * 
-	 * @param calendarDict
-	 * @param codes
-	 * @return
+	 * @param calendarDicts
 	 */
-	boolean batchCreateOrUpdateDict(WorkCalendarDict calendarDict, List<DictCodeCreate> codes);
+	boolean batchCreateDictTypeByDelete(List<WorkCalendarDict> calendarDicts);
 
 	/**
 	 * 批量创建字典类型
+	 * 
 	 * @param calendarDicts
 	 * @return
 	 */

+ 1 - 1
src/main/java/com/persagy/calendar/service/IWorkCalendarObjectService.java

@@ -20,7 +20,7 @@ public interface IWorkCalendarObjectService extends ISuperService<WorkCalendarOb
 	 * @param object
 	 * @param objIds
 	 */
-	void batchInsertObjects(WorkCalendarObject object, Set<String> objIds);
+	boolean batchInsertObjects(WorkCalendarObject object, Set<String> objIds);
 
 	/**
 	 * 对象变更所属工作历

+ 25 - 10
src/main/java/com/persagy/calendar/service/IWorkCalendarRuleService.java

@@ -17,25 +17,29 @@ public interface IWorkCalendarRuleService extends ISuperService<WorkCalendarRule
 	
 	/**
 	 * 根据工作历ID查询规则信息
+	 * 
+	 * @param groupCode
 	 * @param calendarId
-	 * @param projectId 项目ID
+	 * @param projectId
+	 * @param dictTypeLevel 0-集团级别,1-项目级别,2-工作历级别,null-默认工作历级别
 	 * @return
 	 */
-	List<WorkCalendarRule> queryRuleByCalendarId(String calendarId, String projectId);
+	List<WorkCalendarRule> queryRuleByCalendarId(String groupCode, String calendarId, String projectId, Integer dictTypeLevel);
 	
 	/**
 	 * 查询出与value相同的工作历规则ID,目前IBMS专用,其余方法不要调用
 	 * @param workCalendarRule
+	 * @param dictTypeLevel 0-集团级别,1-项目级别,2-工作历级别,null-默认工作历级别
 	 * @return 
 	 */
-	String getCalendarRule(WorkCalendarRule workCalendarRule);
+	String getCalendarRule(WorkCalendarRule workCalendarRule, Integer dictTypeLevel);
 	
 	/**
 	 * @param id 规则ID
-	 * @param projectId 项目ID
+	 * 
 	 * @return
 	 */
-	WorkCalendarRule getById(String id, String projectId);
+	WorkCalendarRule getById(String id);
 	
 	boolean createWorkCalendarRule(WorkCalendarRule workCalendarRule);
 	
@@ -43,27 +47,38 @@ public interface IWorkCalendarRuleService extends ISuperService<WorkCalendarRule
 	
 	/**
 	 * 当规则ID不为空时,主键删除;当工作历ID不为空时,根据工作历ID删除;同时存在,主键删除,逻辑删除
+	 * 
 	 * @param workCalendarRule
+	 * @param dictTypeLevel 0-集团级别,1-项目级别,2-工作历级别,null-默认工作历级别
 	 * @return
 	 */
-	boolean deleteWorkCalendarRule(WorkCalendarRule workCalendarRule);
+	boolean deleteWorkCalendarRule(WorkCalendarRule workCalendarRule, Integer dictTypeLevel);
+	
 	/**
-	 * 当规则ID不为空时,主键删除;当工作历ID不为空时,根据工作历ID删除;同时存在,主键删除,物理删除
-	 * @param workCalendarRule
+	 * 当规则ID不为空时,主键删除;当工作历ID不为空时,根据工作历ID删除;同时存在,主键删除,均为物理删除
+	 * 
+	 * @param groupCode
+	 * @param projectId
+	 * @param id
+	 * @param calendarId
+	 * @param dictType
+	 * @param dictTypeLevel 0-集团级别,1-项目级别,2-工作历级别,null-默认工作历级别
 	 * @return
 	 */
-	boolean removeWorkCalendarRule(String id, String calendarId, String dictType);
+	boolean removeWorkCalendarRule(String groupCode, String projectId, String id, String calendarId, String dictType, Integer dictTypeLevel);
 
 	/**
 	 * 同工作历类型下,dictType+dictCode 唯一
 	 * 
+	 * @param groupCode
 	 * @param projectId
 	 * @param dictType
 	 * @param dictCode
 	 * @param id 存在为修改,修改略过自身
+	 * @param dictTypeLevel 0-集团级别,1-项目级别,2-工作历级别,null-默认工作历级别
 	 * @return
 	 */
-	boolean checkDictRuleValid(String projectId, String calendarId, String dictType, String dictCode, String id);
+	boolean checkDictRuleValid(String groupCode, String projectId, String calendarId, String dictType, String dictCode, String id, Integer dictTypeLevel);
 
 }
 

+ 2 - 1
src/main/java/com/persagy/calendar/service/IWorkCalendarService.java

@@ -25,10 +25,11 @@ public interface IWorkCalendarService extends ISuperService<WorkCalendar> {
 	
 	/**
 	 * @param id
+	 * @param groupCode 允许为空
 	 * @param projectId 允许为空
 	 * @return
 	 */
-	WorkCalendar getById(String id, String projectId);
+	WorkCalendar getById(String id, String groupCode, String projectId);
 	
 	/**
 	 * 判断对应的groupId和calendarName,是否可以被插入或更新

+ 12 - 12
src/main/java/com/persagy/calendar/service/impl/OldWorkCalendarDateServiceImpl.java

@@ -80,7 +80,7 @@ public class OldWorkCalendarDateServiceImpl implements OldWorkCalendarDateServic
 			}
 			// 判断id tag 的唯一性
 	    	queryWrapper = new WorkCalendarRule.Builder().createQueryWrapper()
-	    			.calendarIdEq(rule.getId()).dictTypeEq(rule.getTag()).projectIdEq(rule.getProjectId())
+	    			.calendarIdEq(rule.getId(), null).dictTypeEq(rule.getTag()).projectIdEq(rule.getProjectId(), null)
 	    			.delFlagEq(WorkCalendarConstant.WORK_CALENDAR_DEL_FLAG_NOR).builderQueryWrapper();
 	    	selectCount = workCalendarRuleMapper.selectCount(queryWrapper);
 			if (selectCount == null || selectCount < 1) {
@@ -117,8 +117,8 @@ public class OldWorkCalendarDateServiceImpl implements OldWorkCalendarDateServic
 		for (OldCalendarRuleDeleteVO rule : rules) {
 			// where 条件
 			builder = new WorkCalendarRule.Builder().createUpdateWrapper();
-			updateWrapper = builder.calendarIdEq(rule.getId())
-					.projectIdEq(rule.getProjectId()).dictTypeEq(rule.getTag())
+			updateWrapper = builder.calendarIdEq(rule.getId(), null)
+					.projectIdEq(rule.getProjectId(), null).dictTypeEq(rule.getTag())
 					.delFlagEq(WorkCalendarConstant.WORK_CALENDAR_DEL_FLAG_NOR)
 					.ruleFlagEq(rule.getRuleFlag()).builderUpdateWrapper();
 			result = this.workCalendarRuleMapper.update(calendarRule, updateWrapper);
@@ -143,8 +143,8 @@ public class OldWorkCalendarDateServiceImpl implements OldWorkCalendarDateServic
 		
 		// where条件
 		UpdateWrapper<WorkCalendarRule> updateWrapper = new WorkCalendarRule.Builder().createUpdateWrapper()
-				.calendarIdEq(requestData.getId()).dictTypeEq(requestData.getTag())
-				.projectIdEq(requestData.getProjectId()).ruleFlagEq(requestData.getRuleFlag())
+				.calendarIdEq(requestData.getId(), null).dictTypeEq(requestData.getTag())
+				.projectIdEq(requestData.getProjectId(), null).ruleFlagEq(requestData.getRuleFlag())
     			.delFlagEq(WorkCalendarConstant.WORK_CALENDAR_DEL_FLAG_NOR).builderUpdateWrapper();
 		Integer result = workCalendarRuleMapper.update(calendarRule, updateWrapper);
 		return SqlHelper.retBool(result);
@@ -195,8 +195,8 @@ public class OldWorkCalendarDateServiceImpl implements OldWorkCalendarDateServic
 			for (DataRangeVO date : dates) {
 				// 组装where条件语句
 				queryWrapper = new WorkCalendarDate.Builder().createQueryWrapper()
-						.calendarIdEq(id).dictTypeEq(tag.getTag())
-						.projectIdEq(tag.getProjectId())
+						.calendarIdEq(id, null).dictTypeEq(tag.getTag())
+						.projectIdEq(tag.getProjectId(), null)
 						.workDateStartEq(date.getFrom()).workDateEndEq(date.getTo())
 		    			.builderQueryWrapper();
 				// 更新
@@ -229,7 +229,7 @@ public class OldWorkCalendarDateServiceImpl implements OldWorkCalendarDateServic
 			for (DataRangeVO date : dates) {
 				// 组装where条件语句
 				updateWrapper = new WorkCalendarDate.Builder().createUpdateWrapper()
-						.calendarIdEq(id).projectIdEq(interval.getProjectId())
+						.calendarIdEq(id, null).projectIdEq(interval.getProjectId(), null)
 						.workDateStartEq(date.getFrom()).workDateEndEq(date.getTo())
 		    			.builderUpdateWrapper();
 				// 更新
@@ -255,8 +255,8 @@ public class OldWorkCalendarDateServiceImpl implements OldWorkCalendarDateServic
 			for (DataRangeVO date : dates) {
 				// 组装where条件语句
 				queryWrapper = new WorkCalendarDate.Builder().createQueryWrapper()
-						.calendarIdEq(id).dictTypeEq(interval.getCode())
-						.projectIdEq(interval.getProjectId())
+						.calendarIdEq(id, null).dictTypeEq(interval.getCode())
+						.projectIdEq(interval.getProjectId(), null)
 						.workDateStartEq(date.getFrom()).workDateEndEq(date.getTo())
 		    			.builderQueryWrapper();
 				// 更新
@@ -278,8 +278,8 @@ public class OldWorkCalendarDateServiceImpl implements OldWorkCalendarDateServic
 		OldCalendarSetIntervalVO interval = requestData.getSet_interval();
 		// 组装where条件语句
 		UpdateWrapper<WorkCalendarDate> updateWrapper = new WorkCalendarDate.Builder().createUpdateWrapper()
-				.calendarIdEq(requestData.getId())
-				.projectIdEq(requestData.getProjectId()).dictTypeEq(query.getTag())
+				.calendarIdEq(requestData.getId(), null)
+				.projectIdEq(requestData.getProjectId(), null).dictTypeEq(query.getTag())
 				.workDateStartEq(query.getDates().getFrom()).workDateEndEq(query.getDates().getTo())
     			.builderUpdateWrapper();
 		// 组装 要更新的字段值

+ 7 - 20
src/main/java/com/persagy/calendar/service/impl/WorkCalendarDateServiceImpl.java

@@ -14,6 +14,8 @@ import com.persagy.calendar.service.IWorkCalendarDateService;
 import com.persagy.common.utils.StringUtil;
 import com.persagy.db.service.impl.SuperServiceImpl;
 
+import cn.hutool.core.collection.CollectionUtil;
+
 /**
  * 工作历作息时间表
  * 
@@ -28,13 +30,6 @@ public class WorkCalendarDateServiceImpl extends SuperServiceImpl<WorkCalendarDa
 	@Autowired
 	private WorkCalendarDateMapper workCalendarDateMapper;
  	
- 	@Override
-	public WorkCalendarDate getById(String id, String projectId) {
-    	QueryWrapper<WorkCalendarDate> queryWrapper = new WorkCalendarDate.Builder().createQueryWrapper()
-    			.idEq(id).projectIdEq(projectId).builderQueryWrapper();
-		return workCalendarDateMapper.selectOne(queryWrapper);
-	}
- 	
 	@Override
 	@Transactional
 	public boolean createWorkCalendarDate(WorkCalendarDate workCalendarDate) {
@@ -51,26 +46,15 @@ public class WorkCalendarDateServiceImpl extends SuperServiceImpl<WorkCalendarDa
 
 	@Override
 	@Transactional
-	public boolean deleteWorkCalendarDate(WorkCalendarDate workCalendarDate) {
-		QueryWrapper<WorkCalendarDate> queryWrapper = new WorkCalendarDate.Builder().createQueryWrapper()
-				.projectIdEq(workCalendarDate.getProjectId()).idEq(workCalendarDate.getId())
-				.dictTypeEq(workCalendarDate.getDictType()).dictCodeEq(workCalendarDate.getDictCode())
-				.customFlagEq(workCalendarDate.getCustomFlag()).builderQueryWrapper();
-		Integer result = workCalendarDateMapper.delete(queryWrapper);
-		return SqlHelper.retBool(result);
-	}
-
-	@Override
-	@Transactional
 	public boolean deleteWorkCalendarDate(String id) {
 		Integer result = workCalendarDateMapper.deleteById(id);
 		return SqlHelper.retBool(result);
 	}
 
 	@Override
-	public boolean checkWorkDateValid(WorkCalendarDate calendarDate) {
+	public boolean checkWorkDateValid(WorkCalendarDate calendarDate, Integer dictTypeLevel) {
 		QueryWrapper<WorkCalendarDate> queryWrapper = new WorkCalendarDate.Builder().createQueryWrapper()
-				.groupCodeEq(calendarDate.getGroupCode()).projectIdEq(calendarDate.getProjectId())
+				.groupCodeEq(calendarDate.getGroupCode()).projectIdEq(calendarDate.getProjectId(), dictTypeLevel)
 				.workDateEq(calendarDate.getWorkDate()).dictCodeEq(calendarDate.getDictCode())
 				.dictTypeEq(calendarDate.getDictType()).customFlagEq(calendarDate.getCustomFlag())
 				.builderQueryWrapper();
@@ -93,6 +77,9 @@ public class WorkCalendarDateServiceImpl extends SuperServiceImpl<WorkCalendarDa
 	@Override
 	@Transactional
 	public boolean batchCreateCalendarDate(List<WorkCalendarDate> datas) {
+		if (CollectionUtil.isEmpty(datas)) {
+			return true;
+		}
 		Integer result = this.workCalendarDateMapper.batchCreateCalendarDate(datas);
 		return SqlHelper.retBool(result);
 	}

+ 49 - 8
src/main/java/com/persagy/calendar/service/impl/WorkCalendarDictServiceImpl.java

@@ -1,17 +1,20 @@
 package com.persagy.calendar.service.impl;
 
 import java.util.List;
-import java.util.Set;
 
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;
 import com.persagy.calendar.mapper.WorkCalendarDictMapper;
 import com.persagy.calendar.pojo.dto.WorkCalendarDict;
-import com.persagy.calendar.pojo.vo.DictCodeCreate;
 import com.persagy.calendar.service.IWorkCalendarDictService;
+import com.persagy.common.utils.StringUtil;
 import com.persagy.db.service.impl.SuperServiceImpl;
 
+import cn.hutool.core.collection.CollectionUtil;
+
 /**
  * @version 
  * @description 
@@ -23,19 +26,57 @@ import com.persagy.db.service.impl.SuperServiceImpl;
 public class WorkCalendarDictServiceImpl extends SuperServiceImpl<WorkCalendarDictMapper, WorkCalendarDict> implements IWorkCalendarDictService {
 
 	@Override
-	public boolean batchCreateOrUpdateDictType(WorkCalendarDict calendarDict, Set<String> diyValues) {
-		Integer result = this.baseMapper.batchCreateOrUpdateDictType(calendarDict, diyValues);
-		return SqlHelper.retBool(result);
+	public List<WorkCalendarDict> queryWorkCalendarDictList(String groupCode, String projectId, String calendarId, String dictType, String dictCode) {
+		LambdaQueryWrapper<WorkCalendarDict> queryWrapper = new WorkCalendarDict.BuilderQueryWrapper().groupCodeEq(groupCode)
+				.projectIdEq(projectId, null).calendarIdEq(calendarId, null).dictTypeEq(dictType).dictCodeEq(dictCode).builder();
+		List<WorkCalendarDict> selectList = this.baseMapper.selectList(queryWrapper);
+		return selectList;
 	}
-
+	
 	@Override
-	public boolean batchCreateOrUpdateDict(WorkCalendarDict calendarDict, List<DictCodeCreate> codes) {
-		Integer result = this.baseMapper.batchCreateOrUpdateDict(calendarDict, codes);
+	public int getDictTypeLevel(String groupCode, String dictType) {
+		if (StringUtil.isBlank(dictType)) {
+			return 2;	// 默认工作历级别
+		}
+		LambdaQueryWrapper<WorkCalendarDict> queryWrapper = new WorkCalendarDict.BuilderQueryWrapper().groupCodeEq(groupCode).dictTypeEq(dictType).builder();
+		queryWrapper.select(WorkCalendarDict::getGroupCode, WorkCalendarDict::getProjectId, WorkCalendarDict::getCalendarId, WorkCalendarDict::getDictType);
+		List<WorkCalendarDict> selectList = this.baseMapper.selectList(queryWrapper);
+		if (CollectionUtil.isEmpty(selectList)) {
+			return 2;	// 默认工作历级别
+		}
+		
+		for (WorkCalendarDict workCalendarDict : selectList) {
+			if ("0".equals(workCalendarDict.getProjectId()) && dictType.equals(workCalendarDict.getDictType())) {
+				return 0; 	// 集团级别
+			} else if ("0".equals(workCalendarDict.getCalendarId()) && dictType.equals(workCalendarDict.getDictType())) {
+				return 1;	// 项目级别
+			}
+		}
+		return 2;	// 默认工作历级别
+	}
+	
+	@Override
+	@Transactional
+	public boolean batchCreateDictTypeByDelete(List<WorkCalendarDict> calendarDicts) {
+		if (CollectionUtil.isEmpty(calendarDicts)) {
+			return true;
+		}
+		for (WorkCalendarDict calendarDict : calendarDicts) {
+			LambdaQueryWrapper<WorkCalendarDict> queryWrapper = new WorkCalendarDict.BuilderQueryWrapper()
+					.groupCodeEq(calendarDict.getGroupCode()).dictTypeEq(calendarDict.getDictType()).builder();
+			this.baseMapper.delete(queryWrapper);
+		}
+		
+		Integer result = this.baseMapper.batchCreateCalendarDict(calendarDicts);
 		return SqlHelper.retBool(result);
 	}
 	
 	@Override
+	@Transactional
 	public boolean batchCreateCalendarDict(List<WorkCalendarDict> calendarDicts) {
+		if (CollectionUtil.isEmpty(calendarDicts)) {
+			return true;
+		}
 		Integer result = this.baseMapper.batchCreateCalendarDict(calendarDicts);
 		return SqlHelper.retBool(result);
 	}

+ 2 - 0
src/main/java/com/persagy/calendar/service/impl/WorkCalendarLabelServiceImpl.java

@@ -3,6 +3,7 @@ package com.persagy.calendar.service.impl;
 import java.util.List;
 
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;
 import com.persagy.calendar.mapper.WorkCalendarLabelMapper;
@@ -21,6 +22,7 @@ import com.persagy.db.service.impl.SuperServiceImpl;
 public class WorkCalendarLabelServiceImpl extends SuperServiceImpl<WorkCalendarLabelMapper, WorkCalendarLabel> implements IWorkCalendarLabelService {
 
 	@Override
+	@Transactional
 	public boolean batchCreateCalendarLabel(List<WorkCalendarLabel> calendarLabels) {
 		Integer result = this.baseMapper.batchCreateCalendarLabel(calendarLabels);
 		return SqlHelper.retBool(result);

+ 3 - 2
src/main/java/com/persagy/calendar/service/impl/WorkCalendarObjectServiceImpl.java

@@ -21,8 +21,9 @@ import com.persagy.db.service.impl.SuperServiceImpl;
 public class WorkCalendarObjectServiceImpl extends SuperServiceImpl<WorkCalendarObjectMapper, WorkCalendarObject> implements IWorkCalendarObjectService {
 
 	@Override
-	public void batchInsertObjects(WorkCalendarObject object, Set<String> objIds) {
-		this.baseMapper.batchInsertObjects(object, objIds);
+	public boolean batchInsertObjects(WorkCalendarObject object, Set<String> objIds) {
+		Integer result = this.baseMapper.batchInsertObjects(object, objIds);
+		return SqlHelper.retBool(result);
 	}
 
 	@Override

+ 29 - 54
src/main/java/com/persagy/calendar/service/impl/WorkCalendarRuleServiceImpl.java

@@ -1,9 +1,7 @@
 package com.persagy.calendar.service.impl;
 
-import java.util.Date;
 import java.util.List;
 
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -11,13 +9,10 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;
 import com.persagy.calendar.constant.WorkCalendarConstant;
-import com.persagy.calendar.mapper.WorkCalendarDateMapper;
 import com.persagy.calendar.mapper.WorkCalendarRuleMapper;
-import com.persagy.calendar.pojo.dto.WorkCalendarDate;
 import com.persagy.calendar.pojo.dto.WorkCalendarRule;
 import com.persagy.calendar.pojo.dto.WorkCalendarRule.Builder;
 import com.persagy.calendar.service.IWorkCalendarRuleService;
-import com.persagy.common.utils.DateUtil;
 import com.persagy.common.utils.StringUtil;
 import com.persagy.db.service.impl.SuperServiceImpl;
 
@@ -34,27 +29,21 @@ import cn.hutool.core.collection.CollectionUtil;
 @Service
 public class WorkCalendarRuleServiceImpl extends SuperServiceImpl<WorkCalendarRuleMapper, WorkCalendarRule> implements IWorkCalendarRuleService {
 	
-	@Autowired
-	private WorkCalendarRuleMapper workCalendarRuleMapper;
-	
-	@Autowired
-	private WorkCalendarDateMapper workCalendarDateMapper;
- 	
 	@Override
-	public List<WorkCalendarRule> queryRuleByCalendarId(String calendarId, String projectId) {
-    	QueryWrapper<WorkCalendarRule> queryWrapper = new WorkCalendarRule.Builder().createQueryWrapper()
-    			.calendarIdEq(calendarId).projectIdEq(projectId)
+	public List<WorkCalendarRule> queryRuleByCalendarId(String groupCode, String calendarId, String projectId, Integer dictTypeLevel) {
+    	QueryWrapper<WorkCalendarRule> queryWrapper = new WorkCalendarRule.Builder().createQueryWrapper().groupCodeEq(groupCode)
+    			.calendarIdEq(calendarId, dictTypeLevel).projectIdEq(projectId, dictTypeLevel)
     			.delFlagEq(WorkCalendarConstant.WORK_CALENDAR_DEL_FLAG_NOR).builderQueryWrapper();
-		return workCalendarRuleMapper.selectList(queryWrapper);
+		return this.baseMapper.selectList(queryWrapper);
 	}
 	
 	@Override
-	public String getCalendarRule(WorkCalendarRule workCalendarRule) {
-		QueryWrapper<WorkCalendarRule> queryWrapper = new WorkCalendarRule.Builder().createQueryWrapper()
-    			.projectIdEq(workCalendarRule.getProjectId()).dictTypeEq(workCalendarRule.getDictType())
+	public String getCalendarRule(WorkCalendarRule workCalendarRule, Integer dictTypeLevel) {
+		QueryWrapper<WorkCalendarRule> queryWrapper = new WorkCalendarRule.Builder().createQueryWrapper().groupCodeEq(workCalendarRule.getGroupCode())
+    			.projectIdEq(workCalendarRule.getProjectId(), dictTypeLevel).dictTypeEq(workCalendarRule.getDictType())
     			.dictCodeEq(workCalendarRule.getDictCode()).delFlagEq(WorkCalendarConstant.WORK_CALENDAR_DEL_FLAG_NOR)
     			.builderQueryWrapper();
-		List<WorkCalendarRule> selectList = workCalendarRuleMapper.selectList(queryWrapper);
+		List<WorkCalendarRule> selectList = this.baseMapper.selectList(queryWrapper);
 		if (CollectionUtil.isEmpty(selectList)) {
 			return null;
 		}
@@ -67,81 +56,67 @@ public class WorkCalendarRuleServiceImpl extends SuperServiceImpl<WorkCalendarRu
 	}
 	
 	@Override
-	public WorkCalendarRule getById(String id, String projectId) {
-    	QueryWrapper<WorkCalendarRule> queryWrapper = new WorkCalendarRule.Builder().createQueryWrapper()
-    			.idEq(id).projectIdEq(projectId)
+	public WorkCalendarRule getById(String id) {
+    	QueryWrapper<WorkCalendarRule> queryWrapper = new WorkCalendarRule.Builder().createQueryWrapper().idEq(id)
     			.delFlagEq(WorkCalendarConstant.WORK_CALENDAR_DEL_FLAG_NOR).builderQueryWrapper();
-		return workCalendarRuleMapper.selectOne(queryWrapper);
+		return this.baseMapper.selectOne(queryWrapper);
 	}
 	
 	@Override
 	@Transactional
 	public boolean createWorkCalendarRule(WorkCalendarRule workCalendarRule) {
-		Integer result = workCalendarRuleMapper.insert(workCalendarRule);
+		Integer result = this.baseMapper.insert(workCalendarRule);
 		return SqlHelper.retBool(result);
 	}
 	
 	@Override
 	@Transactional
 	public boolean updateWorkCalendarRule(WorkCalendarRule workCalendarRule) {
-		Integer result = workCalendarRuleMapper.updateById(workCalendarRule);
+		Integer result = this.baseMapper.updateById(workCalendarRule);
 		return SqlHelper.retBool(result);
 	}
 	
 	@Override
 	@Transactional
-	public boolean deleteWorkCalendarRule(WorkCalendarRule workCalendarRule) {
+	public boolean deleteWorkCalendarRule(WorkCalendarRule workCalendarRule, Integer dictTypeLevel) {
 		workCalendarRule.setDelFlag(WorkCalendarConstant.WORK_CALENDAR_DEL_FLAG_DEL);
+		
 		Integer result = null;
 		if (StringUtil.isNotBlank(workCalendarRule.getId())) {
-			result = workCalendarRuleMapper.updateById(workCalendarRule);
+			result = this.baseMapper.updateById(workCalendarRule);
 		} else {
-			Builder builder = new WorkCalendarRule.Builder().createUpdateWrapper();
-	    	UpdateWrapper<WorkCalendarRule> updateWrapper = builder
-	    			.calendarIdEq(workCalendarRule.getCalendarId())
+	    	UpdateWrapper<WorkCalendarRule> updateWrapper = new WorkCalendarRule.Builder().createUpdateWrapper().groupCodeEq(workCalendarRule.getGroupCode())
+	    			.projectIdEq(workCalendarRule.getProjectId(), dictTypeLevel).calendarIdEq(workCalendarRule.getCalendarId(), dictTypeLevel)
 	    			.delFlagEq(WorkCalendarConstant.WORK_CALENDAR_DEL_FLAG_NOR).builderUpdateWrapper();
-			result = workCalendarRuleMapper.update(workCalendarRule, updateWrapper);
+			result = this.baseMapper.update(workCalendarRule, updateWrapper);
 		}
 		return SqlHelper.retBool(result);
 	}
 	
 	@Override
 	@Transactional
-	public boolean removeWorkCalendarRule(String id, String calendarId, String dictType) {
+	public boolean removeWorkCalendarRule(String groupCode, String projectId, String id, String calendarId, String dictType, Integer dictTypeLevel) {
 		Integer result = null;
 		UpdateWrapper<WorkCalendarRule> updateWrapper = null;
 		Builder builder = new WorkCalendarRule.Builder().createUpdateWrapper();
 		if (StringUtil.isNotBlank(id)) {
-			updateWrapper = builder.idEq(id).delFlagEq(WorkCalendarConstant.WORK_CALENDAR_DEL_FLAG_NOR)
-					.builderUpdateWrapper();
-			result = workCalendarRuleMapper.delete(updateWrapper);
-			if (SqlHelper.retBool(result)) {
-				// 删除此工作历规则下当天的非自定义的作息时间数据
-				 QueryWrapper<WorkCalendarDate> wrapper = new WorkCalendarDate.Builder().createQueryWrapper().ruleIdEq(id).dictTypeEq(dictType)
-						 .workDateEq(DateUtil.format(new Date(), DateUtil.FORMAT_DATE_YYYYMMDD)).builderQueryWrapper();
-				 result = this.workCalendarDateMapper.delete(wrapper);
-			}
+			updateWrapper = builder.idEq(id).delFlagEq(WorkCalendarConstant.WORK_CALENDAR_DEL_FLAG_NOR).builderUpdateWrapper();
+			result = this.baseMapper.delete(updateWrapper);
 		} else {
-	    	updateWrapper = builder.calendarIdEq(calendarId).dictTypeEq(dictType)
-	    			.delFlagEq(WorkCalendarConstant.WORK_CALENDAR_DEL_FLAG_NOR).builderUpdateWrapper();
-			result = workCalendarRuleMapper.delete(updateWrapper);
-			if (SqlHelper.retBool(result)) {
-				// 删除此工作历规则下当天的非自定义的作息时间数据
-				 QueryWrapper<WorkCalendarDate> wrapper = new WorkCalendarDate.Builder().createQueryWrapper().calendarIdEq(calendarId)
-						 .dictTypeEq(dictType).workDateEq(DateUtil.format(new Date(), DateUtil.FORMAT_DATE_YYYYMMDD)).builderQueryWrapper();
-				 result = this.workCalendarDateMapper.delete(wrapper);
-			}
+	    	updateWrapper = builder.groupCodeEq(groupCode).projectIdEq(projectId, dictTypeLevel).calendarIdEq(calendarId, dictTypeLevel)
+	    			.dictTypeEq(dictType).delFlagEq(WorkCalendarConstant.WORK_CALENDAR_DEL_FLAG_NOR).builderUpdateWrapper();
+			result = this.baseMapper.delete(updateWrapper);
 		}
 		
 		return SqlHelper.retBool(result);
 	}
 
 	@Override
-	public boolean checkDictRuleValid(String projectId, String calendarId, String dictType, String dictCode, String id) {
-		QueryWrapper<WorkCalendarRule> queryWrapper = new WorkCalendarRule.Builder().createQueryWrapper()
-    			.projectIdEq(projectId).calendarIdEq(calendarId).dictTypeEq(dictType).dictCodeEq(dictCode)
+	public boolean checkDictRuleValid(String groupCode, String projectId, String calendarId, String dictType, String dictCode, String id, Integer dictTypeLevel) {
+		QueryWrapper<WorkCalendarRule> queryWrapper = new WorkCalendarRule.Builder().createQueryWrapper().groupCodeEq(groupCode)
+    			.projectIdEq(projectId, dictTypeLevel).calendarIdEq(calendarId, dictTypeLevel).dictTypeEq(dictType).dictCodeEq(dictCode)
     			.delFlagEq(WorkCalendarConstant.WORK_CALENDAR_DEL_FLAG_NOR).builderQueryWrapper();
-		WorkCalendarRule calendarRule = this.workCalendarRuleMapper.selectOne(queryWrapper);
+		WorkCalendarRule calendarRule = this.baseMapper.selectOne(queryWrapper);
 		if (calendarRule == null) {
 			return true;
 		}

+ 6 - 10
src/main/java/com/persagy/calendar/service/impl/WorkCalendarServiceImpl.java

@@ -15,7 +15,6 @@ import com.persagy.calendar.mapper.WorkCalendarDateMapper;
 import com.persagy.calendar.mapper.WorkCalendarMapper;
 import com.persagy.calendar.mapper.WorkCalendarObjectMapper;
 import com.persagy.calendar.pojo.dto.WorkCalendar;
-import com.persagy.calendar.pojo.dto.WorkCalendar.Builder;
 import com.persagy.calendar.pojo.dto.WorkCalendarDate;
 import com.persagy.calendar.pojo.dto.WorkCalendarObject;
 import com.persagy.calendar.service.IWorkCalendarService;
@@ -50,19 +49,16 @@ public class WorkCalendarServiceImpl extends SuperServiceImpl<WorkCalendarMapper
 	}
 	
 	@Override
-	public WorkCalendar getById(String id, String projectId) {
-		Builder builder = new WorkCalendar.Builder().createQueryWrapper();
-    	QueryWrapper<WorkCalendar> queryWrapper = builder.idEq(id).projectIdEq(projectId)
-    			.delFlagEq(WorkCalendarConstant.WORK_CALENDAR_DEL_FLAG_NOR).builderQueryWrapper();
+	public WorkCalendar getById(String id, String groupCode, String projectId) {
+    	QueryWrapper<WorkCalendar> queryWrapper = new WorkCalendar.Builder().createQueryWrapper().idEq(id).projectIdEq(projectId)
+    			.groupCodeEq(groupCode).delFlagEq(WorkCalendarConstant.WORK_CALENDAR_DEL_FLAG_NOR).builderQueryWrapper();
 		return workCalendarMapper.selectOne(queryWrapper);
 	}
 	
 	@Override
 	public boolean checkProjetcIdAndName(String id, String projectId, String groupCode, String calendarName) {
-		Builder builder = new WorkCalendar.Builder().createQueryWrapper();
-		QueryWrapper<WorkCalendar> queryWrapper = builder.groupCodeEq(groupCode)
-				.projectIdEq(projectId).calendarNameEq(calendarName)
-				.delFlagEq(WorkCalendarConstant.WORK_CALENDAR_DEL_FLAG_NOR)
+		QueryWrapper<WorkCalendar> queryWrapper = new WorkCalendar.Builder().createQueryWrapper().groupCodeEq(groupCode)
+				.projectIdEq(projectId).calendarNameEq(calendarName).delFlagEq(WorkCalendarConstant.WORK_CALENDAR_DEL_FLAG_NOR)
 				.builderQueryWrapper();
 		WorkCalendar workCalendar = workCalendarMapper.selectOne(queryWrapper);
 		// 数据不存在允许,允许被插入或更新
@@ -109,7 +105,7 @@ public class WorkCalendarServiceImpl extends SuperServiceImpl<WorkCalendarMapper
 			calendarDate.setCalendarDesc(workCalendar.getCalendarDesc());
 			calendarDate.setUpdateTime(workCalendar.getUpdateTime());
 			UpdateWrapper<WorkCalendarDate> updateWrapper = new WorkCalendarDate.Builder().createUpdateWrapper()
-					.calendarIdEq(workCalendar.getId()).projectIdEq(workCalendar.getProjectId()).builderUpdateWrapper();
+					.calendarIdEq(workCalendar.getId(), null).projectIdEq(workCalendar.getProjectId(), null).builderUpdateWrapper();
 			this.workCalendarDateMapper.update(calendarDate, updateWrapper);
 		}
 		return SqlHelper.retBool(result);

+ 15 - 8
src/main/java/com/persagy/dye/controller/DyeRuleCustomController.java

@@ -1,6 +1,15 @@
 package com.persagy.dye.controller;
 
-import cn.hutool.core.collection.CollectionUtil;
+import java.util.Date;
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.google.common.collect.Lists;
 import com.persagy.common.utils.DateUtil;
@@ -9,13 +18,10 @@ import com.persagy.common.utils.ResponseUtil;
 import com.persagy.dye.pojo.dto.DyeRuleCustom;
 import com.persagy.dye.service.IDyeRuleCustomService;
 import com.persagy.dye.service.impl.DyeSdkServiceImpl;
+
+import cn.hutool.core.collection.CollectionUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.Date;
-import java.util.List;
 
 /**
  * 染色规则自定义表
@@ -44,8 +50,9 @@ public class DyeRuleCustomController {
     @RequestMapping(value = "queryDyeRuleCustomList")
     public ResponseResult queryDyeRuleCustomList(@RequestBody DyeRuleCustom dyeRuleCustom) {
         LambdaQueryWrapper<DyeRuleCustom> queryWrapper = new DyeRuleCustom.BuilderQueryWrapper().builder();
-
-        List<DyeRuleCustom> list = this.dyeRuleCustomService.list(queryWrapper.orderByAsc(DyeRuleCustom::getBasicId, DyeRuleCustom::getOrderNum));
+        queryWrapper.orderByAsc(DyeRuleCustom::getBasicId);
+        queryWrapper.orderByAsc(DyeRuleCustom::getOrderNum);
+		List<DyeRuleCustom> list = this.dyeRuleCustomService.list(queryWrapper);
         if (CollectionUtil.isEmpty(list)) {
             return ResponseUtil.successResult(Lists.newArrayList(), 0L);
         }

+ 15 - 7
src/main/java/com/persagy/dye/controller/DyeRuleDefaultController.java

@@ -1,6 +1,15 @@
 package com.persagy.dye.controller;
 
-import cn.hutool.core.collection.CollectionUtil;
+import java.util.Date;
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.google.common.collect.Lists;
 import com.persagy.common.utils.DateUtil;
@@ -9,13 +18,10 @@ import com.persagy.common.utils.ResponseUtil;
 import com.persagy.dye.pojo.dto.DyeRuleDefault;
 import com.persagy.dye.service.IDyeRuleDefaultService;
 import com.persagy.dye.service.impl.DyeSdkServiceImpl;
+
+import cn.hutool.core.collection.CollectionUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.Date;
-import java.util.List;
 
 /**
  * 默认染色规则
@@ -44,7 +50,9 @@ public class DyeRuleDefaultController {
     @RequestMapping(value = "queryDyeRuleDefaultList")
     public ResponseResult queryDyeRuleDefaultList(@RequestBody DyeRuleDefault dyeRuleDefault) {
         LambdaQueryWrapper<DyeRuleDefault> queryWrapper = new DyeRuleDefault.BuilderQueryWrapper().builder();
-        List<DyeRuleDefault> list = this.dyeRuleDefaultService.list(queryWrapper.orderByAsc(DyeRuleDefault::getBasicId, DyeRuleDefault::getOrderNum));
+        queryWrapper.orderByAsc(DyeRuleDefault::getBasicId);
+        queryWrapper.orderByAsc(DyeRuleDefault::getOrderNum);
+		List<DyeRuleDefault> list = this.dyeRuleDefaultService.list(queryWrapper);
         if (CollectionUtil.isEmpty(list)) {
             return ResponseUtil.successResult(Lists.newArrayList(), 0L);
         }

+ 4 - 2
src/main/java/com/persagy/dye/pojo/dto/DyeBasic.java

@@ -5,8 +5,9 @@ import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
-import com.persagy.common.model.BaseEntity;
 import com.persagy.common.utils.StringUtil;
+import com.persagy.db.model.BaseEntity;
+
 import lombok.EqualsAndHashCode;
 import lombok.Getter;
 import lombok.Setter;
@@ -26,8 +27,9 @@ import lombok.ToString;
 @EqualsAndHashCode(callSuper = false)
 @TableName("dye_basic")
 public class DyeBasic extends BaseEntity<DyeBasic> {
+	private static final long serialVersionUID = 1L;
 
-    @TableField(updateStrategy = FieldStrategy.NOT_EMPTY)
+	@TableField(updateStrategy = FieldStrategy.NOT_EMPTY)
     private String typeCode;            // 染色类型编码,对应rwd_def_funcid的type字段
 
     @TableField(updateStrategy = FieldStrategy.NOT_EMPTY)

+ 5 - 2
src/main/java/com/persagy/dye/pojo/dto/DyeRuleCustom.java

@@ -5,8 +5,9 @@ import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
-import com.persagy.common.model.BaseEntity;
 import com.persagy.common.utils.StringUtil;
+import com.persagy.db.model.BaseEntity;
+
 import lombok.EqualsAndHashCode;
 import lombok.Getter;
 import lombok.Setter;
@@ -26,7 +27,9 @@ import lombok.ToString;
 @EqualsAndHashCode(callSuper = false)
 @TableName("dye_rule_custom")
 public class DyeRuleCustom extends BaseEntity<DyeRuleCustom> {
-    @TableField(updateStrategy = FieldStrategy.NOT_EMPTY)
+	private static final long serialVersionUID = 1L;
+
+	@TableField(updateStrategy = FieldStrategy.NOT_EMPTY)
     private String basicId;            // 基础表ID
 
     @TableField(updateStrategy = FieldStrategy.NOT_EMPTY)

+ 5 - 2
src/main/java/com/persagy/dye/pojo/dto/DyeRuleDefault.java

@@ -5,8 +5,9 @@ import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
-import com.persagy.common.model.BaseEntity;
 import com.persagy.common.utils.StringUtil;
+import com.persagy.db.model.BaseEntity;
+
 import lombok.EqualsAndHashCode;
 import lombok.Getter;
 import lombok.Setter;
@@ -26,7 +27,9 @@ import lombok.ToString;
 @EqualsAndHashCode(callSuper = false)
 @TableName("dye_rule_default")
 public class DyeRuleDefault extends BaseEntity<DyeRuleDefault> {
-    @TableField(updateStrategy = FieldStrategy.NOT_EMPTY)
+	private static final long serialVersionUID = 1L;
+
+	@TableField(updateStrategy = FieldStrategy.NOT_EMPTY)
     private String basicId;            // 染色基础表ID
 
     @TableField(updateStrategy = FieldStrategy.NOT_EMPTY)

+ 2 - 1
src/main/java/com/persagy/dye/pojo/vo/DyeScaleplateVO.java

@@ -20,8 +20,9 @@ import java.util.Map;
 @ToString
 @ApiModel
 public class DyeScaleplateVO extends DyeBasic {
+	private static final long serialVersionUID = 1L;
 
-    @ApiModelProperty(value = "动态监测数据")
+	@ApiModelProperty(value = "动态监测数据")
     private List<Map<String, Object>> dynamicArray;
 
     @ApiModelProperty(value = "参数查询日期")

+ 4 - 1
src/main/resources/application.yml

@@ -8,4 +8,7 @@ integrated:
     title: 工作历中心
     description: 工作历中心接口文档
     version: 1.0
-    base-package: com.persagy.calendar.controller
+    base-package: com.persagy.calendar.controller
+    
+  calendar:
+    group-code: ${INTEGRATED_CALENDAR_GROUP_CODE:BR}

+ 5 - 27
src/main/resources/mapper/WorkCalendarDictMapper.xml

@@ -4,46 +4,24 @@
 <mapper namespace="com.persagy.calendar.mapper.WorkCalendarDictMapper">
 
 	<resultMap id="BaseResultMap" type="com.persagy.calendar.pojo.dto.WorkCalendarDict">
+		<result column="ID" property="id" jdbcType="VARCHAR" />
 		<result column="GROUP_CODE" property="groupCode" jdbcType="VARCHAR" />
+		<result column="PROJECT_ID" property="projectId" jdbcType="VARCHAR" />
 		<result column="CALENDAR_ID" property="calendarId" jdbcType="VARCHAR" />
 		<result column="DICT_TYPE" property="dictType" jdbcType="VARCHAR" />
 		<result column="DICT_CODE" property="dictCode" jdbcType="VARCHAR" />
 		<result column="DICT_DESC" property="dictDesc" jdbcType="VARCHAR" />
-		<result column="DIY_LABEL" property="diyLabel" jdbcType="VARCHAR" />
 	</resultMap>
-	
-	<insert id="batchCreateOrUpdateDictType">
-		REPLACE INTO work_calendar_dict
-		(
-			GROUP_CODE, CALENDAR_ID, DICT_TYPE, DICT_DESC
-		) VALUES
-		<foreach collection="diyValues" index="index" item="diyValue" separator="," >
-			(
-				#{calendarDict.groupCode}, #{calendarDict.calendarId}, #{calendarDict.dictType}, #{diyValue}
-			)
-		</foreach>
-	</insert>
-
-	<insert id="batchCreateOrUpdateDict">
-		REPLACE INTO work_calendar_dict
-		(
-			GROUP_CODE, CALENDAR_ID, DICT_TYPE, DICT_CODE, DICT_DESC
-		) VALUES
-		<foreach collection="codes" index="index" item="code" separator="," >
-			(
-				#{calendarDict.groupCode}, #{calendarDict.calendarId}, #{calendarDict.dictType}, #{code.dictCode}, #{code.dictDesc}
-			)
-		</foreach>
-	</insert>
 
 	<insert id="batchCreateCalendarDict">
 		REPLACE INTO work_calendar_dict
 		(
-			GROUP_CODE, CALENDAR_ID, DICT_TYPE, DICT_CODE, DICT_DESC
+			ID, GROUP_CODE, PROJECT_ID, CALENDAR_ID, DICT_CODE, DICT_DESC, DICT_TYPE
 		) VALUES
 		<foreach collection="calendarDicts" index="index" item="calendarDict" separator="," >
 			(
-				#{calendarDict.groupCode}, #{calendarDict.calendarId}, #{calendarDict.dictType}, #{calendarDict.dictCode}, #{calendarDict.dictDesc}
+				#{calendarDict.id}, #{calendarDict.groupCode}, #{calendarDict.projectId}, #{calendarDict.calendarId}, 
+				#{calendarDict.dictCode}, #{calendarDict.dictDesc}, #{calendarDict.dictType}
 			)
 		</foreach>
 	</insert>

+ 0 - 32
src/main/resources/sql/data.sql

@@ -1,49 +0,0 @@
-INSERT INTO `calendar-center`.`dye_basic`(`id`, `group_code`, `project_id`, `type_code`, `type_name`, `season_code`, `season_name`, `create_time`, `update_time`, `update_user_id`, `is_delete`) VALUES ('1afa744ee32a45da8af67f704c8c4207', 'YL', 'Pj4403050002', 'cO2', '空气CO2浓度', 'ACSeason-1', '供冷季', '2021-10-26 09:46:57', NULL, '423594c93c8f45ee904269f4d8d14743', '0');
-INSERT INTO `calendar-center`.`dye_basic`(`id`, `group_code`, `project_id`, `type_code`, `type_name`, `season_code`, `season_name`, `create_time`, `update_time`, `update_user_id`, `is_delete`) VALUES ('775518f3555242b6af01c41c8b52984b', 'YL', 'Pj4403050002', 'cO', '空气CO浓度', 'ACSeason-1', '供冷季', '2021-10-26 09:48:14', NULL, '423594c93c8f45ee904269f4d8d14743', '0');
-INSERT INTO `calendar-center`.`dye_basic`(`id`, `group_code`, `project_id`, `type_code`, `type_name`, `season_code`, `season_name`, `create_time`, `update_time`, `update_user_id`, `is_delete`) VALUES ('80f7672d0da24ddf9485c09738746678', 'YL', 'Pj4403050002', 'rH', '湿度', 'ACSeason-2', '供暖季', '2021-10-26 09:46:33', NULL, '423594c93c8f45ee904269f4d8d14743', '0');
-INSERT INTO `calendar-center`.`dye_basic`(`id`, `group_code`, `project_id`, `type_code`, `type_name`, `season_code`, `season_name`, `create_time`, `update_time`, `update_user_id`, `is_delete`) VALUES ('87b5353842234aa88366954eb5dcacba', 'YL', 'Pj4403050002', 'tdb', '温度', 'ACSeason-1', '供冷季', '2021-10-26 09:45:40', '2021-10-26 09:51:54', '423594c93c8f45ee904269f4d8d14743', '0');
-INSERT INTO `calendar-center`.`dye_basic`(`id`, `group_code`, `project_id`, `type_code`, `type_name`, `season_code`, `season_name`, `create_time`, `update_time`, `update_user_id`, `is_delete`) VALUES ('8a5ec9d1c28d4804b69de317f635752d', 'YL', 'Pj4403050002', 'rH', '湿度', 'ACSeason-1', '供冷季', '2021-10-26 09:46:40', NULL, '423594c93c8f45ee904269f4d8d14743', '0');
-INSERT INTO `calendar-center`.`dye_basic`(`id`, `group_code`, `project_id`, `type_code`, `type_name`, `season_code`, `season_name`, `create_time`, `update_time`, `update_user_id`, `is_delete`) VALUES ('8a625b6e64344fd084486f7b20fe7199', 'YL', 'Pj4403050002', 'pM2d5', '空气PM2.5浓度', 'ACSeason-2', '供暖季', '2021-10-26 09:48:48', NULL, '423594c93c8f45ee904269f4d8d14743', '0');
-INSERT INTO `calendar-center`.`dye_basic`(`id`, `group_code`, `project_id`, `type_code`, `type_name`, `season_code`, `season_name`, `create_time`, `update_time`, `update_user_id`, `is_delete`) VALUES ('98af9c276010410aa56a8053f678fd8f', 'YL', 'Pj4403050002', 'tdb', '温度', 'ACSeason-3', '过渡季', '2021-10-26 09:45:04', '2021-10-26 09:52:50', '423594c93c8f45ee904269f4d8d14743', '0');
-INSERT INTO `calendar-center`.`dye_basic`(`id`, `group_code`, `project_id`, `type_code`, `type_name`, `season_code`, `season_name`, `create_time`, `update_time`, `update_user_id`, `is_delete`) VALUES ('c06ead288b0044d0a873743cbb384132', 'YL', 'Pj4403050002', 'cO2', '空气CO2浓度', 'ACSeason-3', '过渡季', '2021-10-26 09:47:20', NULL, '423594c93c8f45ee904269f4d8d14743', '0');
-INSERT INTO `calendar-center`.`dye_basic`(`id`, `group_code`, `project_id`, `type_code`, `type_name`, `season_code`, `season_name`, `create_time`, `update_time`, `update_user_id`, `is_delete`) VALUES ('ca48540a47d54e3a8e01413f9a818645', 'YL', 'Pj4403050002', 'cO', '空气CO浓度', 'ACSeason-3', '过渡季', '2021-10-26 09:47:46', NULL, '423594c93c8f45ee904269f4d8d14743', '0');
-INSERT INTO `calendar-center`.`dye_basic`(`id`, `group_code`, `project_id`, `type_code`, `type_name`, `season_code`, `season_name`, `create_time`, `update_time`, `update_user_id`, `is_delete`) VALUES ('cdc9ca8bba7b4462a93ee601205b4cdc', 'YL', 'Pj4403050002', 'cO2', '空气CO2浓度', 'ACSeason-2', '供暖季', '2021-10-26 09:47:08', NULL, '423594c93c8f45ee904269f4d8d14743', '0');
-INSERT INTO `calendar-center`.`dye_basic`(`id`, `group_code`, `project_id`, `type_code`, `type_name`, `season_code`, `season_name`, `create_time`, `update_time`, `update_user_id`, `is_delete`) VALUES ('e101200c05094f30af34c741b10e7069', 'YL', 'Pj4403050002', 'pM2d5', '空气PM2.5浓度', 'ACSeason-1', '供冷季', '2021-10-26 09:48:41', NULL, '423594c93c8f45ee904269f4d8d14743', '0');
-INSERT INTO `calendar-center`.`dye_basic`(`id`, `group_code`, `project_id`, `type_code`, `type_name`, `season_code`, `season_name`, `create_time`, `update_time`, `update_user_id`, `is_delete`) VALUES ('e13d4c9ed86f4662af2f77869da7b9dd', 'YL', 'Pj4403050002', 'pM2d5', '空气PM2.5浓度', 'ACSeason-3', '过渡季', '2021-10-26 09:48:55', NULL, '423594c93c8f45ee904269f4d8d14743', '0');
-INSERT INTO `calendar-center`.`dye_basic`(`id`, `group_code`, `project_id`, `type_code`, `type_name`, `season_code`, `season_name`, `create_time`, `update_time`, `update_user_id`, `is_delete`) VALUES ('e3faf2642a5e4bb9ab194bd366352d31', 'YL', 'Pj4403050002', 'cO', '空气CO浓度', 'ACSeason-2', '供暖季', '2021-10-26 09:48:04', NULL, '423594c93c8f45ee904269f4d8d14743', '0');
-INSERT INTO `calendar-center`.`dye_basic`(`id`, `group_code`, `project_id`, `type_code`, `type_name`, `season_code`, `season_name`, `create_time`, `update_time`, `update_user_id`, `is_delete`) VALUES ('faf0533dc5464b4898ba07708e40f9e5', 'YL', 'Pj4403050002', 'rH', '湿度', 'ACSeason-3', '过渡季', '2021-10-26 09:46:26', NULL, '423594c93c8f45ee904269f4d8d14743', '0');
-INSERT INTO `calendar-center`.`dye_basic`(`id`, `group_code`, `project_id`, `type_code`, `type_name`, `season_code`, `season_name`, `create_time`, `update_time`, `update_user_id`, `is_delete`) VALUES ('fb7c8df3350747abb098b93c143646d2', 'YL', 'Pj4403050002', 'tdb', '温度', 'ACSeason-2', '供暖季', '2021-10-26 09:45:33', '2021-10-26 09:52:29', '423594c93c8f45ee904269f4d8d14743', '0');
-
-INSERT INTO `calendar-center`.`dye_rule_default`(`id`, `basic_id`, `upper_limit`, `upper_symbol`, `lower_limit`, `lower_symbol`, `name`, `color_value`, `create_time`, `update_time`, `update_user_id`, `is_delete`, `order_num`, `num_symbol`) VALUES ('03e3cfc6c6134505a50e2aaadfd66717', '1afa744ee32a45da8af67f704c8c4207', 99, ')', 1000, '(', '浓度过高', '#FF0000', '2021-10-27 15:17:39', '2021-10-27 15:19:35', '423594c93c8f45ee904269f4d8d14743', '0', 1, 'PPM');
-INSERT INTO `calendar-center`.`dye_rule_default`(`id`, `basic_id`, `upper_limit`, `upper_symbol`, `lower_limit`, `lower_symbol`, `name`, `color_value`, `create_time`, `update_time`, `update_user_id`, `is_delete`, `order_num`, `num_symbol`) VALUES ('8bbd77c4a4ff41b499ffd83fc2207d63', '1afa744ee32a45da8af67f704c8c4207', 1000, ']', 800, '[', '达标', '#C5E0B3', '2021-10-27 15:19:15', NULL, '423594c93c8f45ee904269f4d8d14743', '0', 2, 'PPM');
-INSERT INTO `calendar-center`.`dye_rule_default`(`id`, `basic_id`, `upper_limit`, `upper_symbol`, `lower_limit`, `lower_symbol`, `name`, `color_value`, `create_time`, `update_time`, `update_user_id`, `is_delete`, `order_num`, `num_symbol`) VALUES ('93a20dd6fdc440ad8b4376c153ae1e19', '1afa744ee32a45da8af67f704c8c4207', 800, ')', -99, '(', '良好', '#00B050', '2021-10-27 15:17:39', NULL, '423594c93c8f45ee904269f4d8d14743', '0', 3, 'PPM');
-INSERT INTO `calendar-center`.`dye_rule_default`(`id`, `basic_id`, `upper_limit`, `upper_symbol`, `lower_limit`, `lower_symbol`, `name`, `color_value`, `create_time`, `update_time`, `update_user_id`, `is_delete`, `order_num`, `num_symbol`) VALUES ('1660936da3204bb6b8df5bb0212d771d', '87b5353842234aa88366954eb5dcacba', 99, ')', 27, '(', '高温报警', '#FF0000', '2021-10-27 15:31:02', NULL, '423594c93c8f45ee904269f4d8d14743', '0', 5, '℃');
-INSERT INTO `calendar-center`.`dye_rule_default`(`id`, `basic_id`, `upper_limit`, `upper_symbol`, `lower_limit`, `lower_symbol`, `name`, `color_value`, `create_time`, `update_time`, `update_user_id`, `is_delete`, `order_num`, `num_symbol`) VALUES ('51c48b9de8ab417695bd5f65d2a13155', '87b5353842234aa88366954eb5dcacba', 26, ']', 24, '(', '良好', '#00B050', '2021-10-27 15:28:01', NULL, '423594c93c8f45ee904269f4d8d14743', '0', 3, '℃');
-INSERT INTO `calendar-center`.`dye_rule_default`(`id`, `basic_id`, `upper_limit`, `upper_symbol`, `lower_limit`, `lower_symbol`, `name`, `color_value`, `create_time`, `update_time`, `update_user_id`, `is_delete`, `order_num`, `num_symbol`) VALUES ('52690df8af524e79941515e4125deeab', '87b5353842234aa88366954eb5dcacba', 23, ')', -99, '(', '低温报警', '#4472C4', '2021-10-27 15:23:49', NULL, '423594c93c8f45ee904269f4d8d14743', '0', 1, '℃');
-INSERT INTO `calendar-center`.`dye_rule_default`(`id`, `basic_id`, `upper_limit`, `upper_symbol`, `lower_limit`, `lower_symbol`, `name`, `color_value`, `create_time`, `update_time`, `update_user_id`, `is_delete`, `order_num`, `num_symbol`) VALUES ('61257f9924374c3ca98a97fd84ad2665', '87b5353842234aa88366954eb5dcacba', 27, ']', 26, '(', '高温预警', '#F4B083', '2021-10-27 15:30:13', NULL, '423594c93c8f45ee904269f4d8d14743', '0', 4, '℃');
-INSERT INTO `calendar-center`.`dye_rule_default`(`id`, `basic_id`, `upper_limit`, `upper_symbol`, `lower_limit`, `lower_symbol`, `name`, `color_value`, `create_time`, `update_time`, `update_user_id`, `is_delete`, `order_num`, `num_symbol`) VALUES ('f159d0f0964e41949397b60e96345c67', '87b5353842234aa88366954eb5dcacba', 24, ']', 23, '[', '低温预警', '#D9E2F3', '2021-10-27 15:25:44', NULL, '423594c93c8f45ee904269f4d8d14743', '0', 2, '℃');
-INSERT INTO `calendar-center`.`dye_rule_default`(`id`, `basic_id`, `upper_limit`, `upper_symbol`, `lower_limit`, `lower_symbol`, `name`, `color_value`, `create_time`, `update_time`, `update_user_id`, `is_delete`, `order_num`, `num_symbol`) VALUES ('5589aa8bfd1141bb9cfd519eba872090', '8a5ec9d1c28d4804b69de317f635752d', 40, ']', -99, '(', '达标', '#C5E0B3', '2021-10-27 15:32:39', NULL, '423594c93c8f45ee904269f4d8d14743', '0', 1, '%');
-INSERT INTO `calendar-center`.`dye_rule_default`(`id`, `basic_id`, `upper_limit`, `upper_symbol`, `lower_limit`, `lower_symbol`, `name`, `color_value`, `create_time`, `update_time`, `update_user_id`, `is_delete`, `order_num`, `num_symbol`) VALUES ('9dabc82afd134220a57bf9a899d3ddd5', '8a5ec9d1c28d4804b69de317f635752d', 45, ']', 40, '(', '潮湿预警', '#F4B083', '2021-10-27 15:33:36', NULL, '423594c93c8f45ee904269f4d8d14743', '0', 2, '%');
-INSERT INTO `calendar-center`.`dye_rule_default`(`id`, `basic_id`, `upper_limit`, `upper_symbol`, `lower_limit`, `lower_symbol`, `name`, `color_value`, `create_time`, `update_time`, `update_user_id`, `is_delete`, `order_num`, `num_symbol`) VALUES ('e3d49936e1534e7190868c12520bdcdb', '8a5ec9d1c28d4804b69de317f635752d', 99, ')', 45, '(', '潮湿报警', '#FF0000', '2021-10-27 15:34:30', NULL, '423594c93c8f45ee904269f4d8d14743', '0', 3, '%');
-INSERT INTO `calendar-center`.`dye_rule_default`(`id`, `basic_id`, `upper_limit`, `upper_symbol`, `lower_limit`, `lower_symbol`, `name`, `color_value`, `create_time`, `update_time`, `update_user_id`, `is_delete`, `order_num`, `num_symbol`) VALUES ('0e7024ae696b44e38dbafacc86c28d18', 'e101200c05094f30af34c741b10e7069', 99, ')', 35, '(', '高', '#FF0000', '2021-10-27 15:17:39', NULL, '423594c93c8f45ee904269f4d8d14743', '0', 1, 'μg/m3 每24小时');
-INSERT INTO `calendar-center`.`dye_rule_default`(`id`, `basic_id`, `upper_limit`, `upper_symbol`, `lower_limit`, `lower_symbol`, `name`, `color_value`, `create_time`, `update_time`, `update_user_id`, `is_delete`, `order_num`, `num_symbol`) VALUES ('b0e884ff3a5141a189f4f40b2878b83c', 'e101200c05094f30af34c741b10e7069', 35, ']', 15, '[', '达标', '#C5E0B3', '2021-10-27 15:17:39', NULL, '423594c93c8f45ee904269f4d8d14743', '0', 2, 'μg/m3 每24小时');
-INSERT INTO `calendar-center`.`dye_rule_default`(`id`, `basic_id`, `upper_limit`, `upper_symbol`, `lower_limit`, `lower_symbol`, `name`, `color_value`, `create_time`, `update_time`, `update_user_id`, `is_delete`, `order_num`, `num_symbol`) VALUES ('bec61d651b184609b4e62b4cc02b60b8', 'e101200c05094f30af34c741b10e7069', 15, ')', -99, '(', '良好', '#00B050', '2021-10-27 15:17:39', NULL, '423594c93c8f45ee904269f4d8d14743', '0', 3, 'μg/m3 每24小时');
-
-

+ 0 - 122
src/main/resources/sql/schema.sql

@@ -1,131 +0,0 @@
-/*
- Navicat Premium Data Transfer
-
- Source Server         : 192.168.100.94
- Source Server Type    : MySQL
- Source Server Version : 50723
- Source Host           : 192.168.100.94:9934
- Source Schema         : calendar-center
-
- Target Server Type    : MySQL
- Target Server Version : 50723
- File Encoding         : 65001
-
- Date: 27/10/2021 11:47:10
-*/
-
-SET NAMES utf8mb4;
-SET FOREIGN_KEY_CHECKS = 0;
-
-DROP TABLE IF EXISTS `dye_rule_custom`;
-CREATE TABLE `dye_rule_custom`  (
-  `id` varchar(60) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
-  `basic_id` varchar(60) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '基础表ID',
-  `upper_limit` int(50) NOT NULL COMMENT '上限',
-  `upper_symbol` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '上限符号',
-  `lower_limit` int(50) NOT NULL COMMENT '下限',
-  `lower_symbol` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '下限符号',
-  `name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '名称',
-  `color_value` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '色值',
-  `create_time` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建时间',
-  `update_time` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '修改时间',
-  `update_user_id` varchar(60) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '最后修改人ID',
-  `is_delete` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '0' COMMENT '是否删除(0:否 1:是)',
-  `order_num` int(10) NULL DEFAULT NULL COMMENT '排序',
-  `num_symbol` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '数值单位符号',
-  PRIMARY KEY (`id`) USING BTREE,
-  UNIQUE INDEX `id`(`id`) USING BTREE COMMENT '主键索引',
-  INDEX `basic_id`(`basic_id`) USING BTREE COMMENT '外键索引',
-  CONSTRAINT `fk_custom` FOREIGN KEY (`basic_id`) REFERENCES `dye_basic` (`id`) ON DELETE RESTRICT ON UPDATE NO ACTION
-) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '染色规则自定义表' ROW_FORMAT = Dynamic;
-
-SET FOREIGN_KEY_CHECKS = 1;
-
-/*
- Navicat Premium Data Transfer
-
- Source Server         : 192.168.100.94
- Source Server Type    : MySQL
- Source Server Version : 50723
- Source Host           : 192.168.100.94:9934
- Source Schema         : calendar-center
-
- Target Server Type    : MySQL
- Target Server Version : 50723
- File Encoding         : 65001
-
- Date: 27/10/2021 11:47:17
-*/
-
-SET NAMES utf8mb4;
-SET FOREIGN_KEY_CHECKS = 0;
-
-DROP TABLE IF EXISTS `dye_rule_default`;
-CREATE TABLE `dye_rule_default`  (
-  `id` varchar(60) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主键',
-  `basic_id` varchar(60) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '染色基础表ID',
-  `upper_limit` int(50) NOT NULL COMMENT '上限',
-  `upper_symbol` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '上限符号',
-  `lower_limit` int(50) NOT NULL COMMENT '下限',
-  `lower_symbol` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '下限符号',
-  `name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '名称',
-  `color_value` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '色值',
-  `create_time` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建时间',
-  `update_time` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '更新时间',
-  `update_user_id` varchar(60) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '最后更新人ID',
-  `is_delete` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '0' COMMENT '是否删除(0:否  1:是)',
-  `order_num` int(10) NULL DEFAULT NULL COMMENT '排序',
-  `num_symbol` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '数值单位符号',
-  PRIMARY KEY (`id`) USING BTREE,
-  UNIQUE INDEX `id`(`id`) USING BTREE COMMENT '主键索引',
-  INDEX `basic_id`(`basic_id`) USING BTREE COMMENT '外键索引',
-  CONSTRAINT `fk_default` FOREIGN KEY (`basic_id`) REFERENCES `dye_basic` (`id`) ON DELETE RESTRICT ON UPDATE NO ACTION
-) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '默认染色规则' ROW_FORMAT = Dynamic;
-
-SET FOREIGN_KEY_CHECKS = 1;
-
-/*
- Navicat Premium Data Transfer
-
- Source Server         : 192.168.100.94
- Source Server Type    : MySQL
- Source Server Version : 50723
- Source Host           : 192.168.100.94:9934
- Source Schema         : calendar-center
-
- Target Server Type    : MySQL
- Target Server Version : 50723
- File Encoding         : 65001
-
- Date: 27/10/2021 11:47:02
-*/
-
-SET NAMES utf8mb4;
-SET FOREIGN_KEY_CHECKS = 0;
-
-DROP TABLE IF EXISTS `dye_basic`;
-CREATE TABLE `dye_basic`  (
-  `id` varchar(60) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
-  `group_code` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '集团编码',
-  `project_id` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '项目ID',
-  `type_code` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '染色类型编码,对应rwd_def_funcid的type字段',
-  `type_name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '染色类型名称',
-  `season_code` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '季节编码',
-  `season_name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '季节名称',
-  `create_time` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建时间',
-  `update_time` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '更新时间',
-  `update_user_id` varchar(60) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '最后创建人ID',
-  `is_delete` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '0' COMMENT '是否删除(0:否 1:是)',
-  PRIMARY KEY (`id`) USING BTREE
-) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '染色基础表' ROW_FORMAT = Dynamic;
-
-SET FOREIGN_KEY_CHECKS = 1;