Просмотр исходного кода

新增将工作转换为某项工作的子工作的单独服务

o2lee 5 лет назад
Родитель
Сommit
c01de7fcb5
15 измененных файлов с 494 добавлено и 60 удалено
  1. 1 1
      o2server/x_teamwork_assemble_control/src/main/java/com/x/teamwork/assemble/control/jaxrs/task/ActionSave.java
  2. 192 0
      o2server/x_teamwork_assemble_control/src/main/java/com/x/teamwork/assemble/control/jaxrs/task/ActionTransformAsSubTask.java
  3. 21 1
      o2server/x_teamwork_assemble_control/src/main/java/com/x/teamwork/assemble/control/jaxrs/task/TaskAction.java
  4. 20 0
      o2server/x_teamwork_assemble_control/src/main/java/com/x/teamwork/assemble/control/jaxrs/task/TaskTransformException.java
  5. 46 13
      o2server/x_teamwork_assemble_control/src/main/java/com/x/teamwork/assemble/control/service/DynamicPersistService.java
  6. 18 10
      o2server/x_teamwork_assemble_control/src/main/java/com/x/teamwork/assemble/control/service/DynamicService.java
  7. 29 2
      o2server/x_teamwork_assemble_control/src/main/java/com/x/teamwork/assemble/control/service/TaskPersistService.java
  8. 6 3
      o2server/x_teamwork_assemble_control/src/main/java/com/x/teamwork/assemble/control/service/TaskQueryService.java
  9. 40 0
      o2server/x_teamwork_assemble_control/src/main/webapp/describe/describe.json
  10. 1 1
      o2server/x_teamwork_assemble_control/src/main/webapp/describe/sources/com/x/teamwork/assemble/control/jaxrs/task/ActionSave.java
  11. 21 1
      o2server/x_teamwork_assemble_control/src/main/webapp/describe/sources/com/x/teamwork/assemble/control/jaxrs/task/TaskAction.java
  12. 46 13
      o2server/x_teamwork_assemble_control/src/main/webapp/describe/sources/com/x/teamwork/assemble/control/service/DynamicPersistService.java
  13. 18 10
      o2server/x_teamwork_assemble_control/src/main/webapp/describe/sources/com/x/teamwork/assemble/control/service/DynamicService.java
  14. 29 2
      o2server/x_teamwork_assemble_control/src/main/webapp/describe/sources/com/x/teamwork/assemble/control/service/TaskPersistService.java
  15. 6 3
      o2server/x_teamwork_assemble_control/src/main/webapp/describe/sources/com/x/teamwork/assemble/control/service/TaskQueryService.java

+ 1 - 1
o2server/x_teamwork_assemble_control/src/main/java/com/x/teamwork/assemble/control/jaxrs/task/ActionSave.java

@@ -713,7 +713,7 @@ public class ActionSave extends BaseAction {
 
 	}
 
-public static class Wo extends WoId {
+	public static class Wo extends WoId {
 		
 		@FieldDescribe("操作引起的动态内容")
 		List<WoDynamic> dynamics = new ArrayList<>();

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

@@ -0,0 +1,192 @@
+package com.x.teamwork.assemble.control.jaxrs.task;
+
+import com.google.gson.Gson;
+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.gson.XGsonBuilder;
+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 net.sf.ehcache.Element;
+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;
+		TaskDetail taskDetail = null;
+		TaskExtField taskExtField = null;
+		List<ProjectExtFieldRele> extFieldReleList = null;
+		List<TaskTag> tags = 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 (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 (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 );
+		} catch (Exception e) {
+			check = false;
+			Exception exception = new TaskPersistException(e, "工作上级任务ID信息更新时发生异常。");
+			result.error(exception);
+			logger.error(e, effectivePerson, request, null);
+		}
+
+
+		if (check) {
+			//记录工作任务信息变化记录
+			try {
+				dynamics = dynamicPersistService.subTaskTransformDynamic( sourceTask, parentTask, effectivePerson );
+			} catch (Exception e) {
+				logger.error(e, effectivePerson, request, null);
+			}
+		}
+
+		if (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 (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;
+		}
+	}
+}

+ 21 - 1
o2server/x_teamwork_assemble_control/src/main/java/com/x/teamwork/assemble/control/jaxrs/task/TaskAction.java

@@ -90,7 +90,27 @@ public class TaskAction extends StandardJaxrsAction {
 		}
 		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
 	}
-	
+
+	@JaxrsMethodDescribe(value = "将指定的工作转换为子工作.", action = ActionTransformAsSubTask.class)
+	@GET
+	@Path("transform/{tid}/parent/{pid}")
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void transformAsSubTask(@Suspended final AsyncResponse asyncResponse,
+								  @Context HttpServletRequest request,
+								  @JaxrsParameterDescribe("指定任务ID") @PathParam("tid") String tid,
+								  @JaxrsParameterDescribe("上级任务ID") @PathParam("pid") String pid) {
+		ActionResult<ActionTransformAsSubTask.Wo> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		try {
+			result = new ActionTransformAsSubTask().execute( request, effectivePerson, tid, pid );
+		} catch (Exception e) {
+			logger.error(e, effectivePerson, request, null);
+			result.error(e);
+		}
+		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
+	}
+
 	@JaxrsMethodDescribe(value = "查询我的项目首页中工作任务视图信息.", action = ActionStatisticMyTaskViews.class)
 	@GET
 	@Path("statitic/group/{projectId}")

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

+ 46 - 13
o2server/x_teamwork_assemble_control/src/main/java/com/x/teamwork/assemble/control/service/DynamicPersistService.java

@@ -82,7 +82,6 @@ public class DynamicPersistService {
 	
 	/**
 	 * 保存项目创建或者更新动态信息
-	 * @param old_object
 	 * @param object
 	 * @param effectivePerson
 	 * @param content
@@ -132,9 +131,7 @@ public class DynamicPersistService {
 	 * 保存项目扩展信息保存操作动态信息
 	 * @param object_old
 	 * @param object
-	 * @param optType
 	 * @param effectivePerson
-	 * @param content
 	 * @return
 	 * @throws Exception
 	 */
@@ -179,8 +176,8 @@ public class DynamicPersistService {
 	
 	/**
 	 * 保存动态信息
+	 * @param object_old
 	 * @param object
-	 * @param optType
 	 * @param effectivePerson
 	 * @param content
 	 * @return
@@ -230,7 +227,6 @@ public class DynamicPersistService {
 	 * @param object_old
 	 * @param object_new
 	 * @param effectivePerson
-	 * @param content
 	 * @return
 	 * @throws Exception
 	 */
@@ -257,11 +253,53 @@ public class DynamicPersistService {
 		}
 		return result;
 	}
-	
+
 	/**
-	 * 保存动态信息
-	 * @param dynamic
+	 * 保存转换子工作的动态信息
+	 * @param subTask
+	 * @param parentTask
+	 * @param effectivePerson
+	 * @return
+	 * @throws Exception
+	 */
+	public List<Dynamic> subTaskTransformDynamic( Task subTask, Task parentTask, EffectivePerson effectivePerson ) throws Exception {
+		if ( subTask == null) {
+			throw new Exception("sourceTask is null.");
+		}
+		if ( parentTask == null) {
+			throw new Exception("parentTask is null.");
+		}
+		if ( effectivePerson == null ) {
+			throw new Exception("effectivePerson is null.");
+		}
+		List<Dynamic> result = new ArrayList<>();
+		List<Dynamic> dynamics = null;
+
+		//记录一个添加子任务转换的动态信息
+		result.add(dynamicService.getTaskTransformDynamic( parentTask, subTask, effectivePerson));
+
+		//记录一个为上级任务添加子任务的动态信息
+		result.add(dynamicService.getTaskSplitDynamic( parentTask, subTask, effectivePerson));
+
+		try ( EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			if( ListTools.isNotEmpty( result )) {
+				for( Dynamic dynamic : result ) {
+					//持久化工作操作动态
+					dynamicService.save( emc, dynamic, "" );
+				}
+			}
+		} catch (Exception e) {
+			throw e;
+		}
+		return result;
+	}
+
+	/**
+	 * 保存项目工作组信息动态
+	 * @param object_old
+	 * @param object
 	 * @param effectivePerson
+	 * @param content
 	 * @return
 	 * @throws Exception
 	 */
@@ -287,7 +325,6 @@ public class DynamicPersistService {
 	 * 保存项目组删除动态信息
 	 * @param object
 	 * @param effectivePerson
-	 * @param content
 	 * @return
 	 * @throws Exception
 	 */
@@ -311,7 +348,6 @@ public class DynamicPersistService {
 	 * 保存工作任务删除动态信息
 	 * @param object
 	 * @param effectivePerson
-	 * @param content
 	 * @return
 	 * @throws Exception
 	 */
@@ -338,7 +374,6 @@ public class DynamicPersistService {
 	 * @param addManagers
 	 * @param removeManagers
 	 * @param effectivePerson
-	 * @param content
 	 * @throws Exception
 	 */
 	public List<Dynamic> taskManagerUpdateDynamic(Task task, List<String> addManagers, List<String> removeManagers, EffectivePerson effectivePerson ) throws Exception {
@@ -421,7 +456,6 @@ public class DynamicPersistService {
 	 * @param addParticipants
 	 * @param removeParticipants
 	 * @param effectivePerson
-	 * @param content
 	 * @throws Exception
 	 */
 	public List<Dynamic> taskParticipantsUpdateDynamic(Task task, List<String> addParticipants, List<String> removeParticipants, EffectivePerson effectivePerson ) throws Exception {
@@ -570,7 +604,6 @@ public class DynamicPersistService {
 	 * 保存工作任务评论删除动态信息
 	 * @param object
 	 * @param effectivePerson
-	 * @param content
 	 * @return
 	 * @throws Exception
 	 */

+ 18 - 10
o2server/x_teamwork_assemble_control/src/main/java/com/x/teamwork/assemble/control/service/DynamicService.java

@@ -103,8 +103,6 @@ class DynamicService {
 	 * @param maxCount
 	 * @param orderField
 	 * @param orderType
-	 * @param projectIds
-	 * @param taskIds
 	 * @return
 	 * @throws Exception
 	 */
@@ -116,7 +114,7 @@ class DynamicService {
 	/**
 	 * 向数据库持久化动态信息
 	 * @param emc
-	 * @param dynamic
+	 * @param object
 	 * @return
 	 * @throws Exception 
 	 */
@@ -480,7 +478,6 @@ class DynamicService {
 	 * 保存和根据项目组信息操作动态
 	 * @param object_old
 	 * @param object
-	 * @param optType
 	 * @param effectivePerson
 	 * @return
 	 */
@@ -734,7 +731,7 @@ class DynamicService {
 	
 	/**
 	 * 更新工作任务管理者信息操作动态
-	 * @param task
+	 * @param object
 	 * @param addManagers
 	 * @param removeManagers
 	 * @param effectivePerson
@@ -768,7 +765,7 @@ class DynamicService {
 	
 	/**
 	 * 更新工作任务参与者操作动态
-	 * @param task
+	 * @param object
 	 * @param addParticipants
 	 * @param removeParticipants
 	 * @param effectivePerson
@@ -805,11 +802,22 @@ class DynamicService {
 		String title =  "工作任务分解";
 		String viewUrl = task.getId();
 		String optType =  "SPLIT";
-		String description = effectivePerson.getName() +"为工作添加了一个子任务:" + task.getName();
+		String description = effectivePerson.getName() +"为工作添加了一个子任务:[" + task.getName() + "]";
 		Dynamic dynamic =  composeNewDynamic( objectType, title, description, viewUrl, optType, parentTask, effectivePerson, false );
 		dynamic.setTarget( parentTask.getExecutor() );		
 		return dynamic;
 	}
+
+	public Dynamic getTaskTransformDynamic(Task parentTask, Task task, EffectivePerson effectivePerson) {
+		String objectType =  "TASK";
+		String title =  "转换为子工作";
+		String viewUrl = task.getId();
+		String optType =  "TRANSFORM";
+		String description = effectivePerson.getName() +"将工作转换为工作[" +parentTask.getName() + "]的一个子任务。";
+		Dynamic dynamic =  composeNewDynamic( objectType, title, description, viewUrl, optType, task, effectivePerson, false );
+		dynamic.setTarget( task.getExecutor() );
+		return dynamic;
+	}
 	
 	public Dynamic subTaskDeleteDynamic(Task parentTask, Task task, EffectivePerson effectivePerson) {
 		String objectType =  "TASK";
@@ -888,7 +896,7 @@ class DynamicService {
 	
 	/**
 	 * 工作任务附件上传操作动态信息
-	 * @param attachment
+	 * @param object
 	 * @param effectivePerson
 	 * @return
 	 */
@@ -903,7 +911,7 @@ class DynamicService {
 	
 	/**
 	 * 工作任务附件下载操作动态信息
-	 * @param attachment
+	 * @param object
 	 * @param effectivePerson
 	 * @return
 	 */
@@ -918,7 +926,7 @@ class DynamicService {
 
 	/**
 	 * 工作任务附件删除操作动态信息
-	 * @param attachment
+	 * @param object
 	 * @param effectivePerson
 	 * @return
 	 */

+ 29 - 2
o2server/x_teamwork_assemble_control/src/main/java/com/x/teamwork/assemble/control/service/TaskPersistService.java

@@ -190,7 +190,34 @@ public class TaskPersistService {
 			throw e;
 		}
 	}
-	
+
+
+	/**
+	 * 更新任务的上级任务ID信息
+	 * @param taskId
+	 * @param parentId
+	 * @param effectivePerson
+	 * @throws Exception
+	 */
+	public void updateParentId( String taskId, String parentId, EffectivePerson effectivePerson) throws Exception {
+
+		if( StringUtils.isEmpty( taskId )) {
+			throw new Exception("taskId can not empty in update parentId.");
+		}
+		try ( EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			Task task = emc.find( taskId, Task.class );
+			if( task != null ){
+				task.setParent( parentId );
+			}
+			emc.beginTransaction( Task.class );
+			emc.check( task, CheckPersistType.all );
+			emc.commit();
+		} catch (Exception e) {
+			throw e;
+		}
+
+	}
+
 	/**
 	 * 查询用户是否拥有创建工作任务的权限
 	 * @param effectivePerson
@@ -588,5 +615,5 @@ public class TaskPersistService {
 		}
 	}
 
-	
+
 }

+ 6 - 3
o2server/x_teamwork_assemble_control/src/main/java/com/x/teamwork/assemble/control/service/TaskQueryService.java

@@ -217,7 +217,9 @@ public class TaskQueryService {
 					for( TaskListRele rele : taskListReles ) {
 						task = emc.find( rele.getTaskId(), Task.class );
 						//只查询自己负责的任务
-						if( personName.equalsIgnoreCase( task.getExecutor() )) {
+						if( personName.equalsIgnoreCase( task.getExecutor() ) ||
+								( task.getParticipantList() !=null && task.getParticipantList().contains( personName ))
+						) {
 							task.setOrder( rele.getOrder() );
 							resultList.add( task );
 						}
@@ -252,7 +254,9 @@ public class TaskQueryService {
 				if( ListTools.isNotEmpty( taskListTmp )) {
 					for( Task _task : taskListTmp ) {
 						//只查询自己负责的任务
-						if( personName.equalsIgnoreCase( _task.getExecutor() )) {
+						if( personName.equalsIgnoreCase( _task.getExecutor() )||
+								( _task.getParticipantList() !=null && _task.getParticipantList().contains( personName )))
+						{
 							resultList.add( _task );
 						}
 					}
@@ -266,7 +270,6 @@ public class TaskQueryService {
 	
 	/**
 	 * 在人员的可见范围之类,根据指定的工作任务ID,查询子任务列表
-	 * @param project
 	 * @param taskId
 	 * @param effectivePerson
 	 * @return

+ 40 - 0
o2server/x_teamwork_assemble_control/src/main/webapp/describe/describe.json

@@ -7790,6 +7790,46 @@
             }
           ]
         },
+        {
+          "name": "transformAsSubTask",
+          "className": "com.x.teamwork.assemble.control.jaxrs.task.ActionTransformAsSubTask",
+          "description": "将指定的工作转换为子工作.",
+          "type": "GET",
+          "path": "jaxrs/task/transform/{tid}/parent/{pid}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "tid",
+              "type": "String",
+              "description": "指定任务ID"
+            },
+            {
+              "name": "pid",
+              "type": "String",
+              "description": "上级任务ID"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "dynamics",
+              "type": "List\u003cWoDynamic\u003e",
+              "isCollection": true,
+              "description": "操作引起的动态内容"
+            },
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "id"
+            }
+          ]
+        },
         {
           "name": "updateManager",
           "className": "com.x.teamwork.assemble.control.jaxrs.task.ActionManagerUpdate",

+ 1 - 1
o2server/x_teamwork_assemble_control/src/main/webapp/describe/sources/com/x/teamwork/assemble/control/jaxrs/task/ActionSave.java

@@ -713,7 +713,7 @@ public class ActionSave extends BaseAction {
 
 	}
 
-public static class Wo extends WoId {
+	public static class Wo extends WoId {
 		
 		@FieldDescribe("操作引起的动态内容")
 		List<WoDynamic> dynamics = new ArrayList<>();

+ 21 - 1
o2server/x_teamwork_assemble_control/src/main/webapp/describe/sources/com/x/teamwork/assemble/control/jaxrs/task/TaskAction.java

@@ -90,7 +90,27 @@ public class TaskAction extends StandardJaxrsAction {
 		}
 		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
 	}
-	
+
+	@JaxrsMethodDescribe(value = "将指定的工作转换为子工作.", action = ActionTransformAsSubTask.class)
+	@GET
+	@Path("transform/{tid}/parent/{pid}")
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void transformAsSubTask(@Suspended final AsyncResponse asyncResponse,
+								  @Context HttpServletRequest request,
+								  @JaxrsParameterDescribe("指定任务ID") @PathParam("tid") String tid,
+								  @JaxrsParameterDescribe("上级任务ID") @PathParam("pid") String pid) {
+		ActionResult<ActionTransformAsSubTask.Wo> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		try {
+			result = new ActionTransformAsSubTask().execute( request, effectivePerson, tid, pid );
+		} catch (Exception e) {
+			logger.error(e, effectivePerson, request, null);
+			result.error(e);
+		}
+		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
+	}
+
 	@JaxrsMethodDescribe(value = "查询我的项目首页中工作任务视图信息.", action = ActionStatisticMyTaskViews.class)
 	@GET
 	@Path("statitic/group/{projectId}")

+ 46 - 13
o2server/x_teamwork_assemble_control/src/main/webapp/describe/sources/com/x/teamwork/assemble/control/service/DynamicPersistService.java

@@ -82,7 +82,6 @@ public class DynamicPersistService {
 	
 	/**
 	 * 保存项目创建或者更新动态信息
-	 * @param old_object
 	 * @param object
 	 * @param effectivePerson
 	 * @param content
@@ -132,9 +131,7 @@ public class DynamicPersistService {
 	 * 保存项目扩展信息保存操作动态信息
 	 * @param object_old
 	 * @param object
-	 * @param optType
 	 * @param effectivePerson
-	 * @param content
 	 * @return
 	 * @throws Exception
 	 */
@@ -179,8 +176,8 @@ public class DynamicPersistService {
 	
 	/**
 	 * 保存动态信息
+	 * @param object_old
 	 * @param object
-	 * @param optType
 	 * @param effectivePerson
 	 * @param content
 	 * @return
@@ -230,7 +227,6 @@ public class DynamicPersistService {
 	 * @param object_old
 	 * @param object_new
 	 * @param effectivePerson
-	 * @param content
 	 * @return
 	 * @throws Exception
 	 */
@@ -257,11 +253,53 @@ public class DynamicPersistService {
 		}
 		return result;
 	}
-	
+
 	/**
-	 * 保存动态信息
-	 * @param dynamic
+	 * 保存转换子工作的动态信息
+	 * @param subTask
+	 * @param parentTask
+	 * @param effectivePerson
+	 * @return
+	 * @throws Exception
+	 */
+	public List<Dynamic> subTaskTransformDynamic( Task subTask, Task parentTask, EffectivePerson effectivePerson ) throws Exception {
+		if ( subTask == null) {
+			throw new Exception("sourceTask is null.");
+		}
+		if ( parentTask == null) {
+			throw new Exception("parentTask is null.");
+		}
+		if ( effectivePerson == null ) {
+			throw new Exception("effectivePerson is null.");
+		}
+		List<Dynamic> result = new ArrayList<>();
+		List<Dynamic> dynamics = null;
+
+		//记录一个添加子任务转换的动态信息
+		result.add(dynamicService.getTaskTransformDynamic( parentTask, subTask, effectivePerson));
+
+		//记录一个为上级任务添加子任务的动态信息
+		result.add(dynamicService.getTaskSplitDynamic( parentTask, subTask, effectivePerson));
+
+		try ( EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			if( ListTools.isNotEmpty( result )) {
+				for( Dynamic dynamic : result ) {
+					//持久化工作操作动态
+					dynamicService.save( emc, dynamic, "" );
+				}
+			}
+		} catch (Exception e) {
+			throw e;
+		}
+		return result;
+	}
+
+	/**
+	 * 保存项目工作组信息动态
+	 * @param object_old
+	 * @param object
 	 * @param effectivePerson
+	 * @param content
 	 * @return
 	 * @throws Exception
 	 */
@@ -287,7 +325,6 @@ public class DynamicPersistService {
 	 * 保存项目组删除动态信息
 	 * @param object
 	 * @param effectivePerson
-	 * @param content
 	 * @return
 	 * @throws Exception
 	 */
@@ -311,7 +348,6 @@ public class DynamicPersistService {
 	 * 保存工作任务删除动态信息
 	 * @param object
 	 * @param effectivePerson
-	 * @param content
 	 * @return
 	 * @throws Exception
 	 */
@@ -338,7 +374,6 @@ public class DynamicPersistService {
 	 * @param addManagers
 	 * @param removeManagers
 	 * @param effectivePerson
-	 * @param content
 	 * @throws Exception
 	 */
 	public List<Dynamic> taskManagerUpdateDynamic(Task task, List<String> addManagers, List<String> removeManagers, EffectivePerson effectivePerson ) throws Exception {
@@ -421,7 +456,6 @@ public class DynamicPersistService {
 	 * @param addParticipants
 	 * @param removeParticipants
 	 * @param effectivePerson
-	 * @param content
 	 * @throws Exception
 	 */
 	public List<Dynamic> taskParticipantsUpdateDynamic(Task task, List<String> addParticipants, List<String> removeParticipants, EffectivePerson effectivePerson ) throws Exception {
@@ -570,7 +604,6 @@ public class DynamicPersistService {
 	 * 保存工作任务评论删除动态信息
 	 * @param object
 	 * @param effectivePerson
-	 * @param content
 	 * @return
 	 * @throws Exception
 	 */

+ 18 - 10
o2server/x_teamwork_assemble_control/src/main/webapp/describe/sources/com/x/teamwork/assemble/control/service/DynamicService.java

@@ -103,8 +103,6 @@ class DynamicService {
 	 * @param maxCount
 	 * @param orderField
 	 * @param orderType
-	 * @param projectIds
-	 * @param taskIds
 	 * @return
 	 * @throws Exception
 	 */
@@ -116,7 +114,7 @@ class DynamicService {
 	/**
 	 * 向数据库持久化动态信息
 	 * @param emc
-	 * @param dynamic
+	 * @param object
 	 * @return
 	 * @throws Exception 
 	 */
@@ -480,7 +478,6 @@ class DynamicService {
 	 * 保存和根据项目组信息操作动态
 	 * @param object_old
 	 * @param object
-	 * @param optType
 	 * @param effectivePerson
 	 * @return
 	 */
@@ -734,7 +731,7 @@ class DynamicService {
 	
 	/**
 	 * 更新工作任务管理者信息操作动态
-	 * @param task
+	 * @param object
 	 * @param addManagers
 	 * @param removeManagers
 	 * @param effectivePerson
@@ -768,7 +765,7 @@ class DynamicService {
 	
 	/**
 	 * 更新工作任务参与者操作动态
-	 * @param task
+	 * @param object
 	 * @param addParticipants
 	 * @param removeParticipants
 	 * @param effectivePerson
@@ -805,11 +802,22 @@ class DynamicService {
 		String title =  "工作任务分解";
 		String viewUrl = task.getId();
 		String optType =  "SPLIT";
-		String description = effectivePerson.getName() +"为工作添加了一个子任务:" + task.getName();
+		String description = effectivePerson.getName() +"为工作添加了一个子任务:[" + task.getName() + "]";
 		Dynamic dynamic =  composeNewDynamic( objectType, title, description, viewUrl, optType, parentTask, effectivePerson, false );
 		dynamic.setTarget( parentTask.getExecutor() );		
 		return dynamic;
 	}
+
+	public Dynamic getTaskTransformDynamic(Task parentTask, Task task, EffectivePerson effectivePerson) {
+		String objectType =  "TASK";
+		String title =  "转换为子工作";
+		String viewUrl = task.getId();
+		String optType =  "TRANSFORM";
+		String description = effectivePerson.getName() +"将工作转换为工作[" +parentTask.getName() + "]的一个子任务。";
+		Dynamic dynamic =  composeNewDynamic( objectType, title, description, viewUrl, optType, task, effectivePerson, false );
+		dynamic.setTarget( task.getExecutor() );
+		return dynamic;
+	}
 	
 	public Dynamic subTaskDeleteDynamic(Task parentTask, Task task, EffectivePerson effectivePerson) {
 		String objectType =  "TASK";
@@ -888,7 +896,7 @@ class DynamicService {
 	
 	/**
 	 * 工作任务附件上传操作动态信息
-	 * @param attachment
+	 * @param object
 	 * @param effectivePerson
 	 * @return
 	 */
@@ -903,7 +911,7 @@ class DynamicService {
 	
 	/**
 	 * 工作任务附件下载操作动态信息
-	 * @param attachment
+	 * @param object
 	 * @param effectivePerson
 	 * @return
 	 */
@@ -918,7 +926,7 @@ class DynamicService {
 
 	/**
 	 * 工作任务附件删除操作动态信息
-	 * @param attachment
+	 * @param object
 	 * @param effectivePerson
 	 * @return
 	 */

+ 29 - 2
o2server/x_teamwork_assemble_control/src/main/webapp/describe/sources/com/x/teamwork/assemble/control/service/TaskPersistService.java

@@ -190,7 +190,34 @@ public class TaskPersistService {
 			throw e;
 		}
 	}
-	
+
+
+	/**
+	 * 更新任务的上级任务ID信息
+	 * @param taskId
+	 * @param parentId
+	 * @param effectivePerson
+	 * @throws Exception
+	 */
+	public void updateParentId( String taskId, String parentId, EffectivePerson effectivePerson) throws Exception {
+
+		if( StringUtils.isEmpty( taskId )) {
+			throw new Exception("taskId can not empty in update parentId.");
+		}
+		try ( EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			Task task = emc.find( taskId, Task.class );
+			if( task != null ){
+				task.setParent( parentId );
+			}
+			emc.beginTransaction( Task.class );
+			emc.check( task, CheckPersistType.all );
+			emc.commit();
+		} catch (Exception e) {
+			throw e;
+		}
+
+	}
+
 	/**
 	 * 查询用户是否拥有创建工作任务的权限
 	 * @param effectivePerson
@@ -588,5 +615,5 @@ public class TaskPersistService {
 		}
 	}
 
-	
+
 }

+ 6 - 3
o2server/x_teamwork_assemble_control/src/main/webapp/describe/sources/com/x/teamwork/assemble/control/service/TaskQueryService.java

@@ -217,7 +217,9 @@ public class TaskQueryService {
 					for( TaskListRele rele : taskListReles ) {
 						task = emc.find( rele.getTaskId(), Task.class );
 						//只查询自己负责的任务
-						if( personName.equalsIgnoreCase( task.getExecutor() )) {
+						if( personName.equalsIgnoreCase( task.getExecutor() ) ||
+								( task.getParticipantList() !=null && task.getParticipantList().contains( personName ))
+						) {
 							task.setOrder( rele.getOrder() );
 							resultList.add( task );
 						}
@@ -252,7 +254,9 @@ public class TaskQueryService {
 				if( ListTools.isNotEmpty( taskListTmp )) {
 					for( Task _task : taskListTmp ) {
 						//只查询自己负责的任务
-						if( personName.equalsIgnoreCase( _task.getExecutor() )) {
+						if( personName.equalsIgnoreCase( _task.getExecutor() )||
+								( _task.getParticipantList() !=null && _task.getParticipantList().contains( personName )))
+						{
 							resultList.add( _task );
 						}
 					}
@@ -266,7 +270,6 @@ public class TaskQueryService {
 	
 	/**
 	 * 在人员的可见范围之类,根据指定的工作任务ID,查询子任务列表
-	 * @param project
 	 * @param taskId
 	 * @param effectivePerson
 	 * @return