Forráskód Böngészése

承办单位有传阅的功能,只能看不能改,并且不能看(区长、区领导、书记)批示内容。完成

wanyuan 9 hónapja
szülő
commit
fd0f1003c6
21 módosított fájl, 328 hozzáadás és 9 törlés
  1. 3 1
      tc-public/task-api/src/main/java/com/minto/app/task/enums/TaskEnum.java
  2. 2 0
      tc-service/tap-crm/src/main/resources/META-INF/module/crm/i18n/crm_en.properties
  3. 2 0
      tc-service/tap-crm/src/main/resources/META-INF/module/crm/i18n/crm_zh_CN.properties
  4. 2 0
      tc-service/tap-task/src/main/java/com/minto/app/task/dao/TaskListManagerDaoImpl.java
  5. 39 2
      tc-service/tap-task/src/main/java/com/minto/app/task/manager/TaskManagerImpl.java
  6. 1 1
      tc-service/tap-task/src/main/java/com/minto/app/task/mapper/ITaskSummaryMapper.java
  7. 6 0
      tc-service/tap-task/src/main/java/com/minto/app/task/mapper/ITaskSummaryMapper.xml
  8. 2 1
      tc-service/tap-task/src/main/java/com/minto/app/tc/community/manager/CommunityManagerImpl.java
  9. 2 0
      tip-api/src/main/java/com/minto/app/behavior/enums/BehaviorEnum.java
  10. 10 1
      tip-api/src/main/java/com/minto/app/task/manager/ITaskManager.java
  11. 62 0
      tip-api/src/main/java/com/minto/app/task/util/TaskMemberAgentUtil.java
  12. 34 0
      tip-api/src/main/java/com/minto/app/task/util/TaskMemberUtil.java
  13. 30 2
      tip-front/src/main/java/com/minto/app/task/controller/MtTaskController.java
  14. 33 1
      tip-front/src/main/java/com/minto/app/task/controller/TaskByTypeController.java
  15. 2 0
      tip-front/src/main/webapp/apps_res/common/js/workDynamicCommon.js
  16. 15 0
      tip-front/src/main/webapp/tc_suite/taskmt/doTaskIndex.jsp
  17. 61 0
      tip-front/src/main/webapp/tc_suite/taskmt/js/task_action.js
  18. 15 0
      tip-service/tip-common/src/main/java/com/minto/app/behavior/dao/BehSummaryDaoImpl.java
  19. 3 0
      tip-service/tip-common/src/main/java/com/minto/app/behavior/manager/BehManagerImpl.java
  20. 2 0
      tip-service/tip-common/src/main/resources/META-INF/module/behavior/i18n/behavior_en.properties
  21. 2 0
      tip-service/tip-common/src/main/resources/META-INF/module/behavior/i18n/behavior_zh_CN.properties

+ 3 - 1
tc-public/task-api/src/main/java/com/minto/app/task/enums/TaskEnum.java

@@ -2995,7 +2995,8 @@ public final class TaskEnum {
         FinishMember(1015,"单位办结",TaskActionType.BusinessManagement),
         Assigned(1030,"交办",TaskActionType.BusinessManagement),
         SendVideo(1031,"视频会商",TaskActionType.BusinessManagement),
-        EditPhase(1032,"修改阶段",TaskActionType.BusinessManagement)
+        EditPhase(1032,"修改阶段",TaskActionType.BusinessManagement),
+        Circulate(1033,"传阅",TaskActionType.Base)
         ;
 
         int id;
@@ -3102,6 +3103,7 @@ public final class TaskEnum {
                         taskActions.add(Report);
                         taskActions.add(Dispatch);
                         taskActions.add(Apply);
+                        taskActions.add(Circulate);
                         break;
                     case Participant:
                         taskActions.add(PushToLeader);

+ 2 - 0
tc-service/tap-crm/src/main/resources/META-INF/module/crm/i18n/crm_en.properties

@@ -19,6 +19,8 @@ behavior.sendmsg.task=
 behavior.sendmsg.task.desc=
 behavior.set.member.task=
 behavior.set.member.task.desc=
+behavior.member.circulate.task=
+behavior.member.circulate.task.desc=
 behavior.setprocess.task=
 behavior.setprocess.task.desc=
 behavior.setstate.task=

+ 2 - 0
tc-service/tap-crm/src/main/resources/META-INF/module/crm/i18n/crm_zh_CN.properties

@@ -18,6 +18,8 @@ behavior.sendmsg.task=\u610F\u89C1\u56DE\u590D
 behavior.sendmsg.task.desc=\u5728{1}\u4E2D\u5BF9{3}\u7684\u7559\u8A00\u56DE\u590D\u610F\u89C1\uFF1A{2}
 behavior.set.member.task=\u8C03\u6574\u6210\u5458
 behavior.set.member.task.desc=\u589E\u52A0\u4E8B\u9879\u6210\u5458\uFF1A{0}
+behavior.member.circulate.task=\u4F20\u9605\u4E8b\u9879
+behavior.member.circulate.task.desc=\u4F20\u9605\u4e8b\u9879\u6210\u5458\uFF1A{0}
 behavior.setprocess.task=\u6C47\u62A5\u4E8B\u9879\u8FDB\u5EA6
 behavior.setprocess.task.desc=\u5728\u4E8B\u9879\u4E2D\u6C47\u62A5\u8FDB\u5EA6\uFF1A{0}\uFF1B{2}
 behavior.setstate.task=\u6539\u53D8\u4E8B\u9879\u72B6\u6001

+ 2 - 0
tc-service/tap-task/src/main/java/com/minto/app/task/dao/TaskListManagerDaoImpl.java

@@ -3104,6 +3104,8 @@ public class TaskListManagerDaoImpl extends BaseDaoImpl implements ITaskListMana
 						codes.add(OrgEnum.OrgRoleEnum.DepManager.name());
 						codes.add(OrgEnum.OrgRoleEnum.DepLeader.name());
 						codes.add(OrgEnum.OrgRoleEnum.TaskManager.name());
+						//科长也可以看到部门数据
+						codes.add("KeZhang");
 						List<Long> relationTargetId = getAccountTargetIdByCodes(codes, accountId);
 						memberResourceId.append(" and m.mstate != 4 ");
 						if(bizType == TaskEnum.TaskSummaryListBusinessEnum.AllTask && statusEnum == TaskEnum.TaskSummaryListStatusEnum.WaitSign){

+ 39 - 2
tc-service/tap-task/src/main/java/com/minto/app/task/manager/TaskManagerImpl.java

@@ -146,6 +146,7 @@ import java.util.Map.Entry;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 import static com.minto.core.util.DateUtil.FORMAT_DATE_TIME4;
 
@@ -13021,11 +13022,11 @@ public class TaskManagerImpl implements ITaskManager {
 	}
 
 	@Override
-	public List<Map<String, Object>> findInstructionsAndLeavingaMessageCount(Long taskId)throws BusinessException {
+	public List<Map<String, Object>> findInstructionsAndLeavingaMessageCount(Long taskId, List<Long> excludedPersonIds)throws BusinessException {
 		List<Map<String, Object>> instructionsCount = null;
 		try {
 			ITaskSummaryMapper summaryMapper = AppContext.getBean(ITaskSummaryMapper.class);
-			instructionsCount = summaryMapper.findInstructionsAndLeavingaMessageCount(taskId);
+			instructionsCount = summaryMapper.findInstructionsAndLeavingaMessageCount(taskId, excludedPersonIds);
 		} catch (Exception e) {
 			throw new BusinessException(e);
 		}
@@ -20605,4 +20606,40 @@ public class TaskManagerImpl implements ITaskManager {
 		//移除批示留言
 		taskProcessSummaryDao.delete(TaskProcessSummaryBean.class,itemId);
 	}
+
+	@Override
+	public void updateTask4Circulate(Long taskId, String[] resourceIds){
+		TaskSummaryBean task = taskSummaryDao.findTaskSummaryById(taskId);
+		if(task == null){
+			throw new BusinessException("事项不存在,传阅失败!");
+		}
+		//排除掉已经存在的事项成员
+		List<TaskMemberBean> members = taskMemberDao.findTaskMembersByTaskId(taskId, false);
+		List<String> resourceKeys = members.stream().map(TaskMemberBean::getResourceKey).toList();
+		List<String> resources = Stream.of(resourceIds).filter(e -> !resourceKeys.contains(e)).toList();
+		if(CollectionUtils.isEmpty(resources)){
+			throw new BusinessException("该部门/人员已经是任务的成员了,不需要多次传阅!");
+		}
+		//增加成员
+		List<TaskMemberBean> addMembers = geTaskMemberBeans(resources.toArray(new String[0]), taskId,
+				task.getOrgCorporationId(), TaskMemberRelTypeEnum.NodeManager);
+		taskMemberDao.addTaskMember(addMembers);
+		//发送消息
+		String message =
+				AppContext.currentUserName() + "传阅了" + TaskEnum.TaskSummaryTcategoryEnum.Task.getDes() + ":《"
+						+ task.getTitle() + "》,请注意!";
+		TaskByTypeUtil.sendMessage4Task(MessageResourceTypeEnum.Supervise.getKey(), task.getOrgCorporationId(), taskId,
+				AppContext.currentUserId(), addMembers, message, TaskEnum.TaskSummaryTcategoryEnum.Task.getKey());
+		//行为记录
+		List<String> orgEntityNames = new ArrayList<>();
+		addMembers.forEach(e->{
+			String orgEntityName = orgManager.findOrgEntityName(e.getResourceType()+"_"+e.getResourceId());
+			orgEntityNames.add(orgEntityName);
+		});
+		BehaviorParam param = new BehaviorParam(AppContext.currentLoginCorporation(), BehSummaryBehTypeEnum.CirculateTask,
+				AppContext.currentUserId(), ResourceTypeEnum.Task.getKey(), taskId, new Date(), "", "", "");
+		param.setSubType(BehaviorEnum.BehSummarySubTypeEnum.TaskBeh.getKey());
+		behManager.addBehavior4Param(param,StringUtils.join(orgEntityNames,","));
+
+	}
 }

+ 1 - 1
tc-service/tap-task/src/main/java/com/minto/app/task/mapper/ITaskSummaryMapper.java

@@ -87,7 +87,7 @@ public interface ITaskSummaryMapper extends IBaseMapper {
      */
     List<Map<String,Object>> getInstructionsCount(@Param("taskId") Long taskId);
 
-    List<Map<String,Object>> findInstructionsAndLeavingaMessageCount(@Param("taskId") Long taskId);
+    List<Map<String,Object>> findInstructionsAndLeavingaMessageCount(@Param("taskId") Long taskId, @Param("excludedPersonIds")List<Long> excludedPersonIds);
 
     /**
      * 获取事项查看相关数据

+ 6 - 0
tc-service/tap-task/src/main/java/com/minto/app/task/mapper/ITaskSummaryMapper.xml

@@ -320,6 +320,12 @@
 		<if test="taskId != null">
 			and task_id = #{taskId}
 		</if>
+		<if test="excludedPersonIds != null and excludedPersonIds.size() > 0">
+			and person_id not in
+			<foreach collection="excludedPersonIds" item="pid" open="(" close=")" separator=",">
+				#{pid}
+			</foreach>
+		</if>
 		<!--<if test="personId != null">
 			and person_id = #{personId}
 		</if>-->

+ 2 - 1
tc-service/tap-task/src/main/java/com/minto/app/tc/community/manager/CommunityManagerImpl.java

@@ -2806,7 +2806,8 @@ public class CommunityManagerImpl implements ICommunityManager, SystemInitialize
             defaultBehTypes.addAll(Arrays.asList(10002016,10002001,10002002,10002003,30000014,100020121,10002004,10002005,10002007,
                     20002003,20002005,10002004,10002015,20002009,20002001,20002004,10002011,10002018,10002010,20002027,
                     100020152,20002005,20002006,20002007,100020041,10002052,20002008,20002030,20002016,20002024,10001009,10002022,
-                    20002023,20002025,20002026,200020019,20002011,10002050,10002051,200020032,200020033,200020034,200020036,10002013,10002014,20002018,10002019,200020035,20002017,20002028));
+                    20002023,20002025,20002026,200020019,20002011,10002050,10002051,200020032,200020033,200020034,
+                    200020036,10002013,10002014,20002018,10002019,200020035,20002017,20002028,10002020,10002024));
 
             conditions.computeIfAbsent("resType",id -> ResourceTypeEnum.Task.getKey());
             conditions.putIfAbsent("behType", defaultBehTypes);

+ 2 - 0
tip-api/src/main/java/com/minto/app/behavior/enums/BehaviorEnum.java

@@ -281,6 +281,8 @@ public final class BehaviorEnum {
         SetMemberTaskRel(10002106, "behavior.set.member.task", "behavior.set.member.task.rel.desc", BehSummaryBehCategoryEnum.Rel,"添加事项成员产生的关联,包含必须的行为参数:belongTo:调整人员人的id,res:被添加人员的关联资源,类型为枚举ResourceTypeEnum.OrgPerson ,id为被添加人员的id , ext1:事项id, ext2:调整人员id, ext3:被添加人员的id"),
         /** 分解事项 */
         SplitTaskRel(10002107, "behavior.split.task", "behavior.split.task.rel.desc", BehSummaryBehCategoryEnum.Rel,"分解事项产生的关联,包含必须的行为参数:belongTo:事项发送人的id,res:接收事项人的关联资源,类型为枚举ResourceTypeEnum.OrgPerson ,id为接收人的人员id , ext1:事项id , ext2:父事项id, ext3:接收人的id"),
+        CirculateTask(10002020, "behavior.member.circulate.task", "behavior.member.circulate.task.desc",
+                BehSummaryBehCategoryEnum.Biz,"添加事项成员,包含必须的行为参数:belongTo:调整事项成员人的id,res:事项资源,类型为枚举ResourceTypeEnum.Task ,id为当前事项的id, ext1:不启用 , ext2:不启用, ext3:不启用"),
 
 
         /** 空间-发布信息 */

+ 10 - 1
tip-api/src/main/java/com/minto/app/task/manager/ITaskManager.java

@@ -3037,11 +3037,13 @@ public interface ITaskManager {
 
     /**
      * 获取领导批示和留言的数量
+     *
      * @param taskId
+     * @param excludedPersonIds
      * @return
      * @throws BusinessException
      */
-    List<Map<String,Object>> findInstructionsAndLeavingaMessageCount(Long taskId)throws BusinessException;
+    List<Map<String,Object>> findInstructionsAndLeavingaMessageCount(Long taskId, List<Long> excludedPersonIds)throws BusinessException;
 
     /**
      * 获取事项查看相关数据
@@ -4658,6 +4660,13 @@ public interface ITaskManager {
      * @param pid
      */
     void deleteTaskProcess(Long itemId,Long pid) throws Exception;
+
+    /**
+     * 传阅任务
+     * @param taskId
+     * @param resourceIds
+     */
+    void updateTask4Circulate(Long taskId, String[] resourceIds);
 }
 
 

+ 62 - 0
tip-api/src/main/java/com/minto/app/task/util/TaskMemberAgentUtil.java

@@ -182,6 +182,68 @@ public class TaskMemberAgentUtil {
         return Collections.emptyList();
     }
 
+    /**
+     * 获取部门内指定角色的人员id
+     * @param depId
+     * @param roleCodes
+     * @return
+     * @throws BusinessException
+     */
+    public static List<Long> getDepPersonByRoleCodes(Long depId, List<String> roleCodes) throws BusinessException {
+        IOrgManager orgManager = ApplicationContextHolder.getBean(IOrgManager.class);
+        // 获取部门
+        OrgUnitBean orgUnitBean = orgManager.findDepartmentById(depId);
+        if(orgUnitBean==null){
+            return new ArrayList<>();
+        }
+        Long orgAccountId = orgUnitBean.getOrgAccountId();
+
+        // 获取单位下的角色
+        List<OrgRoleBean> orgRoleBeans = orgManager.findRolesByCode(roleCodes, orgAccountId);
+
+        // 查询关联关系
+        EnumMap<RelationValueName,Object> vis = Maps.newEnumMap(RelationValueName.class);
+        vis.put(RelationValueName.relationValue1,depId);
+        List<Long> targetIds = orgRoleBeans.stream().map(OrgRoleBean::getId).collect(Collectors.toList());
+        List<OrgRelationBean> orgRelation = orgManager.findOrgRelation(null, null,
+                ResourceEnum.ResourceTypeEnum.OrgRole.getKey(),
+                targetIds,
+                OrgEnum.OrgRelationCategoryEnum.Role.getKey(),
+                vis, orgAccountId
+        );
+        if(CollectionUtil.isNotEmpty(orgRelation)){
+            return OrgUtil.getOrgRelationSourceIdsByBeans(orgRelation);
+        }
+
+        return Collections.emptyList();
+    }
+
+    /**
+     * 根据单位角色code集合 获取成员的人员id
+     * @param accountId
+     * @return
+     * @throws BusinessException
+     */
+    public static List<Long> getAccountPersonByRoleCodes(Long accountId, List<String> codes) throws BusinessException {
+        IOrgManager orgManager = ApplicationContextHolder.getBean(IOrgManager.class);
+        // 获取单位下的角色
+        List<OrgRoleBean> orgRoleBeans = orgManager.findRolesByCode(codes, accountId);
+        // 查询关联关系
+        EnumMap<RelationValueName,Object> vis = Maps.newEnumMap(RelationValueName.class);
+        vis.put(RelationValueName.relationValue1,accountId);
+        List<Long> targetIds = orgRoleBeans.stream().map(OrgRoleBean::getId).collect(Collectors.toList());
+        List<OrgRelationBean> orgRelation = orgManager.findOrgRelation(null, null,
+                ResourceEnum.ResourceTypeEnum.OrgRole.getKey(),
+                targetIds,
+                OrgEnum.OrgRelationCategoryEnum.Role.getKey(),
+                vis, accountId
+        );
+        if(CollectionUtil.isNotEmpty(orgRelation)){
+            return OrgUtil.getOrgRelationSourceIdsByBeans(orgRelation);
+        }
+        return Collections.emptyList();
+    }
+
     /**
      * @author inspired (胡启林)
      * @param

+ 34 - 0
tip-api/src/main/java/com/minto/app/task/util/TaskMemberUtil.java

@@ -237,4 +237,38 @@ public class TaskMemberUtil {
         }
         return result;
     }
+
+    /**
+     * 判断是否是流程参与人,如果是流程参与人员,不能看书记区长、区领导的批示留言数据
+     * @see  com.minto.app.task.util.TaskMemberUtil#getMemberBeansByPid
+     * @param memberBeans 当前任务成员集合
+     * @param currentMemberBeans 通过 getMemberBeansByPid方法获取到的当前人员数据
+     * @param personId 人员id
+     * @return
+     */
+    public static boolean isNodeManager(List<TaskMemberBean> memberBeans, List<TaskMemberBean> currentMemberBeans,
+            Long personId){
+        boolean isNodeManager = false;
+        if(CollectionUtil.isEmpty(currentMemberBeans)){
+            IOrgManager orgManager = ApplicationContextHolder.getBean(IOrgManager.class);
+            //没找到对应的成员数据,检查一下流程参与者是部门的任务成员数据。如果是部门的部门长、分管领导、科长、经办人那么认定是流程参与人员
+            isNodeManager = memberBeans.stream().filter(e ->
+               TaskEnum.TaskMemberRelTypeEnum.NodeManager.getKey() == e.getRelationType()
+               && ResourceEnum.ResourceTypeEnum.OrgDepartment.getKey() == e.getResourceType()).anyMatch(e -> {
+                   //判断当前登录人是否是这些部门的部门长、分管领导、科长、经办人
+                   List<String> codes = Lists.newArrayList();
+                   codes.add(OrgEnum.OrgRoleEnum.DepLeader.name());
+                   codes.add(OrgEnum.OrgRoleEnum.DepManager.name());
+                   codes.add("KeZhang");
+                   codes.add(OrgEnum.OrgRoleEnum.TaskManager.name());
+                   List<Long> personIds = TaskMemberAgentUtil.getDepPersonByRoleCodes(e.getResourceId(), codes);
+                   return personIds.contains(personId);
+               });
+        } else{
+            //有对应的成员,那么检查是否是
+            isNodeManager = currentMemberBeans.stream().allMatch(
+                    e -> TaskEnum.TaskMemberRelTypeEnum.NodeManager.getKey() == e.getRelationType());
+        }
+        return isNodeManager;
+    }
 }

+ 30 - 2
tip-front/src/main/java/com/minto/app/task/controller/MtTaskController.java

@@ -1642,8 +1642,19 @@ public class MtTaskController extends BaseController {
 				}
 			}
 
+			//检查如果是流程参与人员,不能看书记区长、区领导的批示留言数据
+			List<TaskMemberBean> taskMemberBeans = taskManager.findTaskMembersByTaskId(id);
+			final List<TaskMemberBean> currentMemberBeans = TaskMemberUtil.getMemberBeansByPid(taskMemberBeans, userId);
+			List<Long> shujQuzhangQuLingDaoPersonIds = null;
+			if(!user.hasRole("ShujQuzhang", "QuLingDao")){
+				isNodeManager = TaskMemberUtil.isNodeManager(taskMemberBeans, currentMemberBeans, userId);
+				if(isNodeManager){
+					shujQuzhangQuLingDaoPersonIds = TaskMemberAgentUtil.getAccountPersonByRoleCodes(
+							AppContext.currentLoginAccount(), List.of("ShujQuzhang", "QuLingDao"));
+				}
+			}
             // 获得该事项的查看次数以及批示次数
-			List<Map<String, Object>> maps = taskManager.findInstructionsAndLeavingaMessageCount(id);
+			List<Map<String, Object>> maps = taskManager.findInstructionsAndLeavingaMessageCount(id, shujQuzhangQuLingDaoPersonIds);
             List<Map<String, Object>> instructionsCount = maps.stream().filter(map -> {
 				Integer ptype = (Integer) map.get("ptype");
 				boolean flag = TaskProcessTypeEnum.Instructions.getKey()==ptype || TaskProcessTypeEnum.ProgressReport.getKey() == ptype;
@@ -1668,6 +1679,7 @@ public class MtTaskController extends BaseController {
 			//model.put("instructionsCount",instructionsCount.size() == 0 ? "0" : String.valueOf(instructionsCount.get(0).get("count")));
 				model.put("instructionsCount", instructAndMsg);
             model.put("leavingaMessageCount",LeavingaMessageCount.size() == 0 ? "0" : String.valueOf(LeavingaMessageCount.get(0).get("count")));
+			AppContext.putThreadContext("notShowSJQZQLDpishi", shujQuzhangQuLingDaoPersonIds);
 			model.put("allTask",taskManager.countTaskProcess("-1","","",-1,-1,"","",cid,id,personId));
 
             //查询事项的类型是否允许显示汇报进度
@@ -6888,15 +6900,31 @@ public class MtTaskController extends BaseController {
 		Long id=ReqUtil.getLong(request, "id");
 		try {
 			Long cid = AppContext.currentLoginCorporation();
+			User user = AppContext.getCurrentUser();
+			Long userId = user.getId();
+
 			Long personId = AppContext.currentUserId();
 			ITaskManager manager = AppContext.getBean(ITaskManager.class);
 			List<ViewTaskVo> viewTaskVos = manager.findViewTaskVos(String.valueOf(id), BehaviorEnum.BehSummaryBehTypeEnum.ViewTask.getKey());
 			//			List<Map<String, Object>> instructionsCount = manager.findInstructionsCount(id);
 			//查批示和留言
-			List<Map<String, Object>> instructionsCount = manager.findInstructionsAndLeavingaMessageCount(id);
+			List<TaskMemberBean> taskMemberBeans = taskManager.findTaskMembersByTaskId(id);
+			final List<TaskMemberBean> currentMemberBeans = TaskMemberUtil.getMemberBeansByPid(taskMemberBeans, userId);
+			List<Long> shujQuzhangQuLingDaoPersonIds = null;
+			if(!user.hasRole("ShujQuzhang", "QuLingDao")){
+				boolean isNodeManager = TaskMemberUtil.isNodeManager(taskMemberBeans, currentMemberBeans, userId);
+				if(isNodeManager){
+					shujQuzhangQuLingDaoPersonIds = TaskMemberAgentUtil.getAccountPersonByRoleCodes(
+							AppContext.currentLoginAccount(), List.of("ShujQuzhang", "QuLingDao"));
+				}
+			}
+
+			List<Map<String, Object>> instructionsCount = manager.findInstructionsAndLeavingaMessageCount(id,
+					shujQuzhangQuLingDaoPersonIds);
 
 			modelMap.put("viewCount",viewTaskVos.size());
 			//modelMap.put("allTask",manager.countTaskProcessSummaryByTaskId(id));
+			AppContext.putThreadContext("notShowSJQZQLDpishi", shujQuzhangQuLingDaoPersonIds);
 			modelMap.put("allTask",taskManager.countTaskProcess("-1","","",-1,-1,"","",cid,id,personId));
 			modelMap.put("instructionsCount",instructionsCount.size() == 0 ? "0" : String.valueOf(instructionsCount.get(0).get("count")));
 			RespUtil.rendJson(response, modelMap);

+ 33 - 1
tip-front/src/main/java/com/minto/app/task/controller/TaskByTypeController.java

@@ -4509,6 +4509,29 @@ public class TaskByTypeController extends BaseController{
         RespUtil.rendJson(response,result);
     }
 
+    /**
+     * 传阅任务给某人,某部门
+     * @param request
+     * @param response
+     * @throws Exception
+     */
+    @RequestMapping(value = "/circulateTask", method = RequestMethod.POST)
+    public void circulateTask(HttpServletRequest request, HttpServletResponse response) throws Exception{
+        Map<String, Object> result = new HashMap<String, Object>();
+        try{
+            Long taskId = ReqUtil.getLong(request, "taskId");
+            String[] resourceIds = ReqUtil.getArray(request, "resources");
+            taskManager.updateTask4Circulate(taskId, resourceIds);
+            result.put("state", "success");
+        } catch(Exception e){
+            log.error("传阅错误:", e);
+            result.put("state", "error");
+            result.put("message", e.getMessage());
+        } finally{
+            RespUtil.rendJson(response, result);
+        }
+    }
+
     /**
      * 分派联络员
      * @param request
@@ -8029,10 +8052,19 @@ public class TaskByTypeController extends BaseController{
                         }
 
                     }
-
                     //大角色 领导 by zhangyu 2018-10-18
                     Boolean isLeader = TaskByTypeUtil.isLeader(pid, cid);
                     model.put("isLeader",isLeader || isSuperviseBoss);
+                    if(!user.hasRole("ShujQuzhang", "QuLingDao")){
+                        //检查如果是流程参与人员,不能看书记区长、区领导的批示留言数据
+                        boolean isNodeManager = TaskMemberUtil.isNodeManager(taskMemberBeans, currentMemberBeans, pid);
+                        if(isNodeManager){
+                            //找到所有的区长书记、区领导人员,不查询这些人员的数据
+                            List<Long> shujQuzhangQuLingDaoPersonIds = TaskMemberAgentUtil.getAccountPersonByRoleCodes(
+                                    AppContext.currentLoginAccount(), List.of("ShujQuzhang", "QuLingDao"));
+                            AppContext.putThreadContext("notShowSJQZQLDpishi", shujQuzhangQuLingDaoPersonIds);
+                        }
+                    }
 
                     // 查询动态
                     ListObject result = null;

+ 2 - 0
tip-front/src/main/webapp/apps_res/common/js/workDynamicCommon.js

@@ -61,6 +61,8 @@ function openDifferentBeh(resType, resId, title,behType,ext,params) {
         case 20002007:
         case 20002009:
         case 20002016:
+        case 10002020:
+        case 10002024:
             //任务分派
         case 20002018://上报计划
         case 20002023:

+ 15 - 0
tip-front/src/main/webapp/tc_suite/taskmt/doTaskIndex.jsp

@@ -2096,6 +2096,13 @@
 									$("#btns").append(data);
 									continue
 								}
+								else if(roleActions[i] == "Circulate"){
+									var data = "<div class=\"mt-btn\" data-event=\"circulate\" onclick=\"circulateTask()\">";
+									data += "<span class=\"btnName\">传阅</span>";
+									data +="</div>";
+									$("#btns").append(data);
+									continue;
+								}
 							}
 						}
 					}
@@ -2504,6 +2511,14 @@
 			})
 			// document.getElementById('mainIframe').contentWindow.endTask_c();
 		}
+		/**
+		* 传阅任务
+		 */
+		function circulateTask(){
+			circulate(taskId, function () {
+				window.location.reload();
+			});
+		}
 
 		/**
 		 * 签收事项

+ 61 - 0
tip-front/src/main/webapp/tc_suite/taskmt/js/task_action.js

@@ -1351,4 +1351,65 @@ function backCollect(taskId,extend,callback){
             }
         })
     });
+}
+
+/**
+ * 传阅事项
+ * @param taskId 任务id
+ * @param callback 回调处理
+ */
+function circulate(taskId, callback) {
+	var config = {
+		title: "请选择",
+		chooseModule: "ChooseInAll",
+		orgOrgUnitRange: ["OrgDepartment", "OrgTeam", "OrgPost", "OrgLevel",
+			"OrgRole", "RelationPerson", "OrgOutPerson", "MyAttention"],
+		orgChooseDataType: ["10000002","10000003"],
+		orgChooseCount: 0,
+	};
+
+	ChooseOrg.choosePerson("show3", config, null, function (w, results) {
+		var id = [];
+		var name = [];
+		var existName = [];
+		for (var i = 0; i < results.length; i++) {
+			id.push(results[i].key);
+			name.push(results[i].name);
+		}
+		var param = {
+			"taskId" : taskId,
+			"resources" : id,
+		};
+		if(id.length <= 0){
+			return;
+		}
+		debugger;
+		$.startProc();
+		TC.util.postAjaxData(
+				TC.config.baseUrl+"/taskByType/circulateTask",
+				param,
+				//defaultvalue 和value对比就可以
+				function(result){
+					if(result.state=="success"){
+						//签收成功,重新加载当前页
+						$.endProc();
+						//事项签收完成
+						$.ok("传阅成功!",function(){
+							TC.ui.progressBar();
+							if(!!callback && $.isFunction(callback)){
+								callback()
+							}
+						})
+					}else if(result.state=="error"){
+						$.error(result.message?result.message:"传阅失败!",function(){$.endProc();})
+					}
+				},
+				true,
+				"POST",
+				function(){
+					$.error("服务异常,请稍后重试!",function(){$.endProc();});
+				}
+		);
+	});
+
 }

+ 15 - 0
tip-service/tip-common/src/main/java/com/minto/app/behavior/dao/BehSummaryDaoImpl.java

@@ -21,6 +21,8 @@ import com.minto.core.ds.DBAgent;
 import com.minto.core.ds.enums.DSEnum;
 import com.minto.core.util.*;
 import com.minto.tip.common.exceptions.BusinessException;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.stream.Streams;
 import org.hibernate.criterion.Criterion;
 import org.hibernate.criterion.Order;
 import org.hibernate.criterion.Restrictions;
@@ -140,6 +142,19 @@ public class BehSummaryDaoImpl extends BaseDaoImpl implements IBehSummaryDao {
                 criterion = Restrictions.and(criterion, Restrictions.eq("belongToResId", o));
             }
         }
+        //流程参与人不看区长、书记、区领导的批示数据
+        if(conditions.get("notShowSJQZQLDpishi") != null){
+            Object o = conditions.get("notShowSJQZQLDpishi");
+            String sqlParam = null;
+            if (o.getClass().isArray()) {
+                sqlParam = "IN ( "+ Streams.of(o).map(Object::toString).collect(Collectors.joining(", ")) +" )";
+            }else if(o instanceof Collection){
+                sqlParam = "IN ( "+ ((Collection<?>)o).stream().map(Object::toString).collect(Collectors.joining(", ")) +" )";
+            }else{
+                sqlParam = "= " + o.toString();
+            }
+            criterion = Restrictions.and(criterion, Restrictions.sqlRestriction("id not in (select id from beh_summary where belong_to_res_id "+sqlParam+" AND beh_type = 10002004)"));
+        }
         // 行为所属资源ID
         if (conditions.get("resId") != null) {
             Object o = conditions.get("resId");

+ 3 - 0
tip-service/tip-common/src/main/java/com/minto/app/behavior/manager/BehManagerImpl.java

@@ -894,11 +894,13 @@ public class BehManagerImpl extends AsynchronousBatchTask<BehSummaryBean> implem
     @Override
     public ListObject<BehSummaryBean> findBehsOfResource(Long resourceId, Integer resourceType, Long[] perIds, Date startTime,
             Date endTime, Integer[] behType, Integer start, Integer range) throws BusinessException {
+        List<String> notPersonIds = AppContext.removeThreadContext("notShowSJQZQLDpishi");
         ListObject<BehSummaryBean> result = null;
         if (resourceType != null && resourceId != null) {
             Map<String, Object> condition = buildFindBehsOfResourceParam(resourceId, resourceType, perIds, startTime, endTime, behType);
             condition.put("start", start);
             condition.put("range", range);
+            condition.put("notShowSJQZQLDpishi", notPersonIds);
             result = behSummaryDao.findByCondition(condition);
         }
         return result;
@@ -909,6 +911,7 @@ public class BehManagerImpl extends AsynchronousBatchTask<BehSummaryBean> implem
             Date endTime, Integer[] behType) throws BusinessException {
         if (resourceType != null && resourceId != null) {
             Map<String, Object> condition = buildFindBehsOfResourceParam(resourceId, resourceType, perIds, startTime, endTime, behType);
+            condition.put("notShowSJQZQLDpishi", AppContext.removeThreadContext("notShowSJQZQLDpishi"));
             return behSummaryDao.countByCondition(condition);
         }
         return 0;

+ 2 - 0
tip-service/tip-common/src/main/resources/META-INF/module/behavior/i18n/behavior_en.properties

@@ -14,6 +14,8 @@ behavior.sendmsg.task=
 behavior.sendmsg.task.desc=
 behavior.set.member.task=
 behavior.set.member.task.desc=
+behavior.member.circulate.task=
+behavior.member.circulate.task.desc=
 behavior.setprocess.task=
 behavior.setprocess.task.desc=
 behavior.setstate.task=

+ 2 - 0
tip-service/tip-common/src/main/resources/META-INF/module/behavior/i18n/behavior_zh_CN.properties

@@ -13,6 +13,8 @@ behavior.sendmsg.task=\u610F\u89C1\u56DE\u590D
 behavior.sendmsg.task.desc=\u5728{1}\u4E2D\u5BF9{3}\u7684\u7559\u8A00\u56DE\u590D\u610F\u89C1\uFF1A{2}
 behavior.set.member.task=\u8C03\u6574\u6210\u5458
 behavior.set.member.task.desc=\u589E\u52A0\u4E8B\u9879\u6210\u5458\uFF1A{0}
+behavior.member.circulate.task=\u4F20\u9605\u4E8b\u9879
+behavior.member.circulate.task.desc=\u4F20\u9605\u4e8b\u9879\u6210\u5458\uFF1A{0}
 behavior.setprocess.task=\u6C47\u62A5\u4E8B\u9879\u8FDB\u5EA6
 behavior.setprocess.task.desc=\u5728\u4E8B\u9879\u4E2D\u6C47\u62A5\u8FDB\u5EA6\uFF1A{0}\uFF1B{2}
 behavior.setstate.task=\u6539\u53D8\u4E8B\u9879\u72B6\u6001