Răsfoiți Sursa

Merge branch 'feature/Teamwork.taskMoveService' into 'develop'

Merge of feature/Teamwork.taskMoveService工作管理新添加了一些服务

See merge request o2oa/o2oa!200
李义 5 ani în urmă
părinte
comite
bc1a35cf10

+ 1 - 0
o2server/.gitignore

@@ -0,0 +1 @@
+/x_teamwork_assemble_control/src/main/webapp/describe/

+ 1 - 1
o2server/x_teamwork_assemble_control/src/main/java/com/x/teamwork/assemble/control/ThisApplication.java

@@ -35,7 +35,7 @@ public class ThisApplication {
 			context.schedule( Timertask_RefreshAllTaskReview.class, "0 0 2 * * ?" );
 			
 			//每30分钟核对一次所有的工作任务,判断工作任务是否已经超时
-			context.schedule( Timertask_CheckAllTaskOverTime.class, "0 0/30 * * * ?" );
+			//context.schedule( Timertask_CheckAllTaskOverTime.class, "0 0/30 * * * ?" );
 			
 		} catch (Exception e) {
 			e.printStackTrace();

+ 190 - 0
o2server/x_teamwork_assemble_control/src/main/java/com/x/teamwork/assemble/control/jaxrs/task/ActionCopyTask.java

@@ -0,0 +1,190 @@
+package com.x.teamwork.assemble.control.jaxrs.task;
+
+import com.x.base.core.entity.JpaObject;
+import com.x.base.core.project.annotation.FieldDescribe;
+import com.x.base.core.project.bean.WrapCopier;
+import com.x.base.core.project.bean.WrapCopierFactory;
+import com.x.base.core.project.cache.ApplicationCache;
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.jaxrs.WoId;
+import com.x.base.core.project.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
+import com.x.base.core.project.tools.ListTools;
+import com.x.teamwork.assemble.control.service.BatchOperationPersistService;
+import com.x.teamwork.assemble.control.service.BatchOperationProcessService;
+import com.x.teamwork.core.entity.*;
+import org.apache.commons.lang3.StringUtils;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 将指定的任务复制为新的工作任务
+ */
+public class ActionCopyTask extends BaseAction {
+
+	private static Logger logger = LoggerFactory.getLogger(ActionCopyTask.class);
+
+	/**
+	 * 将指定的任务复制为新的工作任务
+	 * 1、确认ID是否合法
+	 * 2、将Task,TaskDetail,以及TaskExtField复制一份
+	 * 3、调整ID,并且进行新任务的存储工作
+	 * 4、记录动态信息
+	 *
+	 * @param request
+	 * @param effectivePerson
+	 * @param sourceTaskId
+	 * @return
+	 * @throws Exception
+	 */
+	protected ActionResult<Wo> execute(HttpServletRequest request, EffectivePerson effectivePerson, String sourceTaskId ) throws Exception {
+		ActionResult<Wo> result = new ActionResult<>();
+		Wo wo = new Wo();
+		Task sourceTask = null;
+		TaskDetail taskDetail = null;
+		TaskExtField taskExtField = null;
+		List<Dynamic> dynamics  = new ArrayList<>();
+		Boolean check = true;
+
+		if ( StringUtils.isEmpty( sourceTaskId ) ) {
+			check = false;
+			Exception exception = new TaskTransformException("需要复制的工作任务ID不允许为空!");
+			result.error( exception );
+		}
+
+		if( Boolean.TRUE.equals( check ) ){
+			try {
+				sourceTask = taskQueryService.get( sourceTaskId );
+				if ( sourceTask == null) {
+					check = false;
+					Exception exception = new TaskNotExistsException(sourceTaskId);
+					result.error( exception );
+				}
+			} catch (Exception e) {
+				check = false;
+				Exception exception = new TaskQueryException(e, "根据指定ID查询工作任务信息对象时发生异常。ID:" + sourceTaskId );
+				result.error(exception);
+				logger.error(e, effectivePerson, request, null);
+			}
+		}
+
+		if( Boolean.TRUE.equals( check ) ){
+			try {
+				taskDetail = taskQueryService.getDetail( sourceTaskId );
+			} catch (Exception e) {
+				check = false;
+				Exception exception = new TaskQueryException(e, "根据指定ID查询工作任务信息对象时发生异常。ID:" + sourceTaskId);
+				result.error(exception);
+				logger.error(e, effectivePerson, request, null);
+			}
+		}
+
+		if( Boolean.TRUE.equals( check ) ){
+			try {
+				taskExtField = taskQueryService.getExtField( sourceTaskId );
+			} catch (Exception e) {
+				check = false;
+				Exception exception = new TaskQueryException(e, "根据指定ID查询工作任务扩展属性信息对象时发生异常。ID:" + sourceTaskId);
+				result.error(exception);
+				logger.error(e, effectivePerson, request, null);
+			}
+		}
+
+		Task newTask = new Task();
+		TaskDetail newTaskDetail = new TaskDetail();
+		TaskExtField newTaskExtField = new TaskExtField();
+		if( Boolean.TRUE.equals( check ) ){
+			//COPY对象
+			sourceTask.copyTo( newTask );
+			taskDetail.copyTo( newTaskDetail );
+			taskExtField.copyTo( newTaskExtField );
+
+			//重新命名
+			newTask.setName( sourceTask.getName() + " - 副本");
+
+			//调整ID
+			newTask.setId( Task.createId() );
+			newTaskDetail.setId( newTask.getId() );
+			newTaskExtField.setId( newTask.getId() );
+
+			try {
+				newTask = taskPersistService.save( newTask, newTaskDetail, newTaskExtField, effectivePerson );
+				wo.setId( newTask.getId() );
+			} catch (Exception e) {
+				check = false;
+				Exception exception = new TaskPersistException(e, "工作上级任务ID信息更新时发生异常。");
+				result.error(exception);
+				logger.error(e, effectivePerson, request, null);
+			}
+		}
+
+		if( Boolean.TRUE.equals( check ) ){
+			try {
+				dynamics = dynamicPersistService.taskCopyDynamic( sourceTask, newTask, effectivePerson );
+			} catch (Exception e) {
+				logger.error(e, effectivePerson, request, null);
+			}
+		}
+
+		if( Boolean.TRUE.equals( check ) ){
+			try {
+				new BatchOperationPersistService().addOperation(
+						BatchOperationProcessService.OPT_OBJ_TASK,
+						BatchOperationProcessService.OPT_TYPE_PERMISSION,  newTask.getId(),  newTask.getId(), "刷新文档权限:ID=" +   sourceTask.getId() );
+			} catch (Exception e) {
+				logger.error(e, effectivePerson, request, null);
+			}
+		}
+
+		if( ListTools.isNotEmpty( dynamics ) ) {
+			wo.setDynamics( WoDynamic.copier.copy( dynamics ) );
+		}
+
+		// 更新缓存
+		ApplicationCache.notify( Task.class );
+		ApplicationCache.notify( TaskList.class );
+		ApplicationCache.notify( TaskView.class );
+		ApplicationCache.notify( Review.class );
+		ApplicationCache.notify( TaskGroup.class );
+		ApplicationCache.notify( Dynamic.class );
+
+		result.setData( wo );
+		return result;
+	}
+
+
+	public static class Wo extends WoId {
+
+		@FieldDescribe("操作引起的动态内容")
+		List<ActionSave.WoDynamic> dynamics = new ArrayList<>();
+
+		public List<ActionSave.WoDynamic> getDynamics() {
+			return dynamics;
+		}
+
+		public void setDynamics(List<ActionSave.WoDynamic> dynamics) {
+			this.dynamics = dynamics;
+		}
+
+	}
+
+	public static class WoDynamic extends Dynamic{
+
+		private static final long serialVersionUID = -5076990764713538973L;
+
+		public static WrapCopier<Dynamic, ActionSave.WoDynamic> copier = WrapCopierFactory.wo( Dynamic.class, ActionSave.WoDynamic.class, null, JpaObject.FieldsInvisible);
+
+		private Long rank = 0L;
+
+		public Long getRank() {
+			return rank;
+		}
+
+		public void setRank(Long rank) {
+			this.rank = rank;
+		}
+	}
+}

+ 191 - 0
o2server/x_teamwork_assemble_control/src/main/java/com/x/teamwork/assemble/control/jaxrs/task/ActionMoveToList.java

@@ -0,0 +1,191 @@
+package com.x.teamwork.assemble.control.jaxrs.task;
+
+import com.x.base.core.entity.JpaObject;
+import com.x.base.core.project.annotation.FieldDescribe;
+import com.x.base.core.project.bean.WrapCopier;
+import com.x.base.core.project.bean.WrapCopierFactory;
+import com.x.base.core.project.cache.ApplicationCache;
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.jaxrs.WoId;
+import com.x.base.core.project.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
+import com.x.base.core.project.tools.ListTools;
+import com.x.teamwork.assemble.control.service.BatchOperationPersistService;
+import com.x.teamwork.assemble.control.service.BatchOperationProcessService;
+import com.x.teamwork.core.entity.*;
+import org.apache.commons.lang3.StringUtils;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 将指定的任务移动到其他的泳道里
+ */
+public class ActionMoveToList extends BaseAction {
+
+	private static Logger logger = LoggerFactory.getLogger(ActionMoveToList.class);
+
+	/**
+	 * 将指定的任务移动到其他的泳道(TaskList)里
+	 * 1、查询 参数是否合法
+	 * 2、转移Task的泳道关联
+	 * 3、调整TaskList和TaskGroup的相关统计数据
+	 * 4、记录动态信息
+	 *
+	 * @param request
+	 * @param effectivePerson
+	 * @param sourceTaskId
+	 * @return
+	 * @throws Exception
+	 */
+	protected ActionResult<Wo> execute(HttpServletRequest request, EffectivePerson effectivePerson, String sourceTaskId, String targetListId ) throws Exception {
+		ActionResult<Wo> result = new ActionResult<>();
+		Wo wo = new Wo();
+		Task sourceTask = null;
+		TaskList targetTaskList = null;
+		TaskDetail taskDetail = null;
+		TaskExtField taskExtField = null;
+		List<Dynamic> dynamics  = new ArrayList<>();
+		Boolean check = true;
+
+		if ( StringUtils.isEmpty( sourceTaskId ) ) {
+			check = false;
+			Exception exception = new TaskTransformException("需要复制的工作任务ID不允许为空!");
+			result.error( exception );
+		}
+
+		if ( StringUtils.isEmpty( targetListId ) ) {
+			check = false;
+			Exception exception = new TaskTransformException("需要复制到的目标任务列表ID不允许为空!");
+			result.error( exception );
+		}
+
+		if( Boolean.TRUE.equals( check ) ){
+			try {
+				sourceTask = taskQueryService.get( sourceTaskId );
+				if ( sourceTask == null) {
+					check = false;
+					Exception exception = new TaskNotExistsException(sourceTaskId);
+					result.error( exception );
+				}
+			} catch (Exception e) {
+				check = false;
+				Exception exception = new TaskQueryException(e, "根据指定ID查询工作任务信息对象时发生异常。ID:" + sourceTaskId );
+				result.error(exception);
+				logger.error(e, effectivePerson, request, null);
+			}
+		}
+
+		if( Boolean.TRUE.equals( check ) ){
+			try {
+				targetTaskList = taskListQueryService.get( targetListId );
+				if ( targetTaskList == null) {
+					check = false;
+					Exception exception = new TaskListNotExistsException(targetListId);
+					result.error( exception );
+				}
+			} catch (Exception e) {
+				check = false;
+				Exception exception = new TaskQueryException( e, "根据指定ID查询工作任务列表信息对象时发生异常。ID:" + targetListId );
+				result.error(exception);
+				logger.error(e, effectivePerson, request, null);
+			}
+		}
+
+		Task newTask = new Task();
+		TaskDetail newTaskDetail = new TaskDetail();
+		TaskExtField newTaskExtField = new TaskExtField();
+		if( Boolean.TRUE.equals( check ) ){
+			//COPY对象
+			sourceTask.copyTo( newTask );
+			taskDetail.copyTo( newTaskDetail );
+			taskExtField.copyTo( newTaskExtField );
+
+			//重新命名
+			newTask.setName( sourceTask.getName() + " - 副本");
+
+			//调整ID
+			newTask.setId( Task.createId() );
+			newTaskDetail.setId( newTask.getId() );
+			newTaskExtField.setId( newTask.getId() );
+
+			try {
+				newTask = taskPersistService.save( newTask, newTaskDetail, newTaskExtField, effectivePerson );
+				wo.setId( newTask.getId() );
+			} catch (Exception e) {
+				check = false;
+				Exception exception = new TaskPersistException(e, "工作上级任务ID信息更新时发生异常。");
+				result.error(exception);
+				logger.error(e, effectivePerson, request, null);
+			}
+		}
+
+		if( Boolean.TRUE.equals( check ) ){
+			try {
+				dynamics = dynamicPersistService.taskCopyDynamic( sourceTask, newTask, effectivePerson );
+			} catch (Exception e) {
+				logger.error(e, effectivePerson, request, null);
+			}
+		}
+
+		if( Boolean.TRUE.equals( check ) ){
+			try {
+				new BatchOperationPersistService().addOperation(
+						BatchOperationProcessService.OPT_OBJ_TASK,
+						BatchOperationProcessService.OPT_TYPE_PERMISSION,  newTask.getId(),  newTask.getId(), "刷新文档权限:ID=" +   sourceTask.getId() );
+			} catch (Exception e) {
+				logger.error(e, effectivePerson, request, null);
+			}
+		}
+
+		if( ListTools.isNotEmpty( dynamics ) ) {
+			wo.setDynamics( WoDynamic.copier.copy( dynamics ) );
+		}
+
+		// 更新缓存
+		ApplicationCache.notify( Task.class );
+		ApplicationCache.notify( TaskList.class );
+		ApplicationCache.notify( TaskView.class );
+		ApplicationCache.notify( Review.class );
+		ApplicationCache.notify( TaskGroup.class );
+		ApplicationCache.notify( Dynamic.class );
+
+		result.setData( wo );
+		return result;
+	}
+
+
+	public static class Wo extends WoId {
+
+		@FieldDescribe("操作引起的动态内容")
+		List<ActionSave.WoDynamic> dynamics = new ArrayList<>();
+
+		public List<ActionSave.WoDynamic> getDynamics() {
+			return dynamics;
+		}
+
+		public void setDynamics(List<ActionSave.WoDynamic> dynamics) {
+			this.dynamics = dynamics;
+		}
+
+	}
+
+	public static class WoDynamic extends Dynamic{
+
+		private static final long serialVersionUID = -5076990764713538973L;
+
+		public static WrapCopier<Dynamic, ActionSave.WoDynamic> copier = WrapCopierFactory.wo( Dynamic.class, ActionSave.WoDynamic.class, null, JpaObject.FieldsInvisible);
+
+		private Long rank = 0L;
+
+		public Long getRank() {
+			return rank;
+		}
+
+		public void setRank(Long rank) {
+			this.rank = rank;
+		}
+	}
+}

+ 186 - 0
o2server/x_teamwork_assemble_control/src/main/java/com/x/teamwork/assemble/control/jaxrs/task/ActionTransformAsSubTask.java

@@ -0,0 +1,186 @@
+package com.x.teamwork.assemble.control.jaxrs.task;
+
+import com.x.base.core.entity.JpaObject;
+import com.x.base.core.project.annotation.FieldDescribe;
+import com.x.base.core.project.bean.WrapCopier;
+import com.x.base.core.project.bean.WrapCopierFactory;
+import com.x.base.core.project.cache.ApplicationCache;
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.jaxrs.WoId;
+import com.x.base.core.project.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
+import com.x.base.core.project.tools.ListTools;
+import com.x.teamwork.assemble.control.service.BatchOperationPersistService;
+import com.x.teamwork.assemble.control.service.BatchOperationProcessService;
+import com.x.teamwork.core.entity.*;
+import org.apache.commons.lang3.StringUtils;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 将任务转为子任务
+ */
+public class ActionTransformAsSubTask extends BaseAction {
+
+	private static Logger logger = LoggerFactory.getLogger(ActionTransformAsSubTask.class);
+
+	/**
+	 * 将任务转换为子任务的服务
+	 * 1、确认ID是否合法
+	 * 2、将任务的parentId设置为parentId
+	 * 3、保存任务信息
+	 * 4、记录动态信息
+	 *
+	 * @param request
+	 * @param effectivePerson
+	 * @param sourceTaskId
+	 * @param parentId
+	 * @return
+	 * @throws Exception
+	 */
+	protected ActionResult<Wo> execute(HttpServletRequest request, EffectivePerson effectivePerson, String sourceTaskId, String parentId ) throws Exception {
+		ActionResult<Wo> result = new ActionResult<>();
+		Wo wo = new Wo();
+		Task sourceTask = null;
+		Task parentTask = null;
+		List<Dynamic> dynamics  = new ArrayList<>();
+		Boolean check = true;
+
+		if ( StringUtils.isEmpty( sourceTaskId ) ) {
+			check = false;
+			Exception exception = new TaskTransformException("需要转换的工作任务ID不允许为空!");
+			result.error( exception );
+		}
+
+		if ( StringUtils.isEmpty( parentId ) ) {
+			check = false;
+			Exception exception = new TaskTransformException("上级任务ID不允许为空!");
+			result.error( exception );
+		}
+
+		if( Boolean.TRUE.equals( check ) ){
+			//查询需要转换为子任务的任务是否存在
+			try {
+				sourceTask = taskQueryService.get( sourceTaskId );
+				if ( sourceTask == null) {
+					check = false;
+					Exception exception = new TaskNotExistsException(sourceTaskId);
+					result.error( exception );
+				}
+			} catch (Exception e) {
+				check = false;
+				Exception exception = new TaskQueryException(e, "根据指定ID查询工作任务信息对象时发生异常。sourceTaskId:" + sourceTaskId );
+				result.error(exception);
+				logger.error(e, effectivePerson, request, null);
+			}
+		}
+
+		if( Boolean.TRUE.equals( check ) ){
+			//查询上级任务是否存在
+			try {
+				parentTask = taskQueryService.get( parentId );
+				if ( parentTask == null) {
+					check = false;
+					Exception exception = new TaskNotExistsException( parentId );
+					result.error( exception );
+				}
+			} catch (Exception e) {
+				check = false;
+				Exception exception = new TaskQueryException(e, "根据指定ID查询工作任务信息对象时发生异常。parentId:" + parentId );
+				result.error(exception);
+				logger.error(e, effectivePerson, request, null);
+			}
+		}
+
+		try {
+			taskPersistService.updateParentId( sourceTask.getId(), parentTask.getId(), effectivePerson );
+			wo.setId( sourceTask.getId() );
+		} catch (Exception e) {
+			check = false;
+			Exception exception = new TaskPersistException(e, "工作上级任务ID信息更新时发生异常。");
+			result.error(exception);
+			logger.error(e, effectivePerson, request, null);
+		}
+
+
+		if( Boolean.TRUE.equals( check ) ){
+			//记录工作任务信息变化记录
+			try {
+				dynamics = dynamicPersistService.subTaskTransformDynamic( sourceTask, parentTask, effectivePerson );
+			} catch (Exception e) {
+				logger.error(e, effectivePerson, request, null);
+			}
+		}
+
+		if( Boolean.TRUE.equals( check ) ){
+			try {
+				new BatchOperationPersistService().addOperation(
+						BatchOperationProcessService.OPT_OBJ_TASK,
+						BatchOperationProcessService.OPT_TYPE_PERMISSION,  sourceTask.getId(),  sourceTask.getId(), "刷新文档权限:ID=" +   sourceTask.getId() );
+			} catch (Exception e) {
+				logger.error(e, effectivePerson, request, null);
+			}
+		}
+
+		if( Boolean.TRUE.equals( check ) ){
+			try {
+				new BatchOperationPersistService().addOperation(
+						BatchOperationProcessService.OPT_OBJ_TASK,
+						BatchOperationProcessService.OPT_TYPE_PERMISSION,  parentTask.getId(),  parentTask.getId(), "刷新文档权限:ID=" +   parentTask.getId() );
+			} catch (Exception e) {
+				logger.error(e, effectivePerson, request, null);
+			}
+		}
+
+		if( ListTools.isNotEmpty( dynamics ) ) {
+			wo.setDynamics( WoDynamic.copier.copy( dynamics ) );
+		}
+
+		// 更新缓存
+		ApplicationCache.notify( Task.class );
+		ApplicationCache.notify( TaskList.class );
+		ApplicationCache.notify( TaskView.class );
+		ApplicationCache.notify( Review.class );
+		ApplicationCache.notify( TaskGroup.class );
+		ApplicationCache.notify( Dynamic.class );
+
+		result.setData( wo );
+		return result;
+	}
+
+
+	public static class Wo extends WoId {
+
+		@FieldDescribe("操作引起的动态内容")
+		List<ActionSave.WoDynamic> dynamics = new ArrayList<>();
+
+		public List<ActionSave.WoDynamic> getDynamics() {
+			return dynamics;
+		}
+
+		public void setDynamics(List<ActionSave.WoDynamic> dynamics) {
+			this.dynamics = dynamics;
+		}
+
+	}
+
+	public static class WoDynamic extends Dynamic{
+
+		private static final long serialVersionUID = -5076990764713538973L;
+
+		public static WrapCopier<Dynamic, ActionSave.WoDynamic> copier = WrapCopierFactory.wo( Dynamic.class, ActionSave.WoDynamic.class, null, JpaObject.FieldsInvisible);
+
+		private Long rank = 0L;
+
+		public Long getRank() {
+			return rank;
+		}
+
+		public void setRank(Long rank) {
+			this.rank = rank;
+		}
+	}
+}

+ 12 - 0
o2server/x_teamwork_assemble_control/src/main/java/com/x/teamwork/assemble/control/jaxrs/task/TaskListNotExistsException.java

@@ -0,0 +1,12 @@
+package com.x.teamwork.assemble.control.jaxrs.task;
+
+import com.x.base.core.project.exception.PromptException;
+
+class TaskListNotExistsException extends PromptException {
+
+	private static final long serialVersionUID = 1859164370743532895L;
+
+	TaskListNotExistsException(String id ) {
+		super("指定ID的工作任务列表信息不存在。ID:" + id );
+	}
+}

+ 20 - 0
o2server/x_teamwork_assemble_control/src/main/java/com/x/teamwork/assemble/control/jaxrs/task/TaskTransformException.java

@@ -0,0 +1,20 @@
+package com.x.teamwork.assemble.control.jaxrs.task;
+
+import com.x.base.core.project.exception.PromptException;
+
+class TaskTransformException extends PromptException {
+
+	private static final long serialVersionUID = 1859164370743532895L;
+
+	TaskTransformException(Throwable e ) {
+		super("系统在转换工作任务为子任务时发生异常。" , e );
+	}
+
+	TaskTransformException(Throwable e, String message ) {
+		super("系统在转换工作任务为子任务时发生异常。Message:" + message, e );
+	}
+
+	TaskTransformException(String message ) {
+		super("系统在转换工作任务为子任务时发生异常。Message:" + message );
+	}
+}