package com.cabletech.business.workflow.common.service;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.commons.collections.MapUtils;
import org.apache.commons.lang.StringUtils;
import org.springframework.util.CollectionUtils;
import com.cabletech.baseinfo.business.entity.UserInfo;
import com.cabletech.business.contactletter.service.ContactLetterAuditService;
import com.cabletech.business.desktop.service.impl.DesktopServiceImpl;
import com.cabletech.business.flowservice.util.ProMockPo;
import com.cabletech.business.workflow.electricity.security.service.ElectricitySecurityWorkflowService;
import com.cabletech.business.workflow.fault.service.FaultWorkflowService;
import com.cabletech.business.workflow.workorder.service.WorkOrderWorkflowService;
import com.cabletech.business.wplan.plan.service.PatrolWorkflowService;
import com.cabletech.common.base.SysConstant;
/**
* 抽象工作流待办列表数量业务处理类
*
* @author 杨隽 2012-01-31 创建
* @author 杨隽 2012-02-09 添加setBusinessTypeList()抽象方法
* @author 杨隽 2012-04-27
* 添加existBusinessTypeInMap()方法并修改processWaitHandledListNumber()方法
*
*/
public abstract class AbstractWorkflowWaitHandledService {
// 空用户字符串
public static final String EMPTY_USER = "";
// 资源专业类型列表
protected List<Map<String, Object>> businessTypeList;
public List<Map<String, Object>> getBusinessTypeList() {
return businessTypeList;
}
/**
* 获取一个工作流的待办工作信息列表
*
* @param businessTypeList
* 专业类型列表
* @param userInfo
* 当前用户信息
* @return List<Map<String, Object>> 一个工作流的待办工作信息列表
*/
public List<Map<String, Object>> getOneWorkflowHandledTaskList(
List<Map<String, Object>> businessTypeList, UserInfo userInfo) {
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
if (CollectionUtils.isEmpty(businessTypeList)) {
return list;
}
// 从工作流待办任务列表中获取待办工作列表
List<ProMockPo> waitHandledTaskList = getProcessHandledTaskList(userInfo);
// 将工作流待办任务列表和业务数据获取列表进行合并
WorkflowEntityManager workflowEntityService = getWorkflowService()
.getWorkflowBusinessMananger();
workflowEntityService.setWaitHandledTaskList(waitHandledTaskList);
for (int i = 0; i < businessTypeList.size(); i++) {
Map<String, Object> businessTypeMap = businessTypeList.get(i);
workflowEntityService.setBusinessTypeMap(businessTypeMap);
List<Map<String, Object>> resultList = getOneBusinessTypeHandledTaskListInOneWorkflow(workflowEntityService);
list.addAll(resultList);
}
return list;
}
/**
* 获取一个工作流的待办工作信息列表数量
*
* @param userInfo
* 当前用户信息
* @param map
* Map<String, Object> 一个工作流的待办工作信息列表数量Map
*/
public void getOneWorkflowHandledTaskNumber(UserInfo userInfo,
Map<String, Object> map) {
// 从工作流待办任务列表中获取待办工作列表
List<ProMockPo> waitHandledTaskList = getProcessHandledTaskList(userInfo);
getWorkflowService().getWorkflowBusinessMananger()
.setWaitHandledTaskList(waitHandledTaskList);
for (int j = 0; j < businessTypeList.size(); j++) {
Map<String, Object> businessTypeMap = businessTypeList.get(j);
getWorkflowService().getWorkflowBusinessMananger()
.setBusinessTypeMap(businessTypeMap);
getOneBusinessTypeHandledTaskNumberInOneWorkflow(map);
}
}
/**
* 从工作流待办任务列表中获取待办工作列表
*
* @param userInfo
* UserInfo 当前用户信息
* @return List<ProMockPo> 待办工作列表
*/
public List<ProMockPo> getProcessHandledTaskList(UserInfo userInfo) {
ProMockPo taskPi = new ProMockPo();
setTaskPi(userInfo, taskPi);
List<ProMockPo> waitHandledTaskList = getWorkflowService()
.getWaitHandleList(taskPi);
return waitHandledTaskList;
}
/**
* 获取一个专业下的一个工作流待办工作信息列表
*
* @param workflowEntityService
* WorkflowEntityManager 工作流业务实体服务
* @return List<Map<String, Object>> 一个专业下的一个工作流待办工作信息列表
*/
public List<Map<String, Object>> getOneBusinessTypeHandledTaskListInOneWorkflow(
WorkflowEntityManager workflowEntityService) {
List<Map<String, Object>> resultList = getWaitHandledTaskResultList(workflowEntityService);
processWaitHandledList(workflowEntityService, resultList);
return resultList;
}
/**
* 获取一个专业下的一个工作流待办工作信息数量
*
* @param resultMap
* Map<String, Object> 存放一个专业下的一个工作流待办工作信息数量的Map
*/
public void getOneBusinessTypeHandledTaskNumberInOneWorkflow(
Map<String, Object> resultMap) {
WorkflowEntityManager workflowEntityService = getWorkflowService()
.getWorkflowBusinessMananger();
// 获取专业类型列表
List<Map<String, Object>> resultList = getWaitHandledTaskResultList(workflowEntityService);
if (CollectionUtils.isEmpty(resultList)) {
return;
}
processWaitHandledListNumber(workflowEntityService, resultMap,
resultList);
}
/**
* 获取具体的工作流业务处理类
*
* @return AbstractWorkflowService 具体的工作流业务处理类
*/
public abstract AbstractWorkflowService getWorkflowService();
/**
* 获取工作流流程定义文件的id
*
* @return String 工作流流程定义文件的id
*/
public abstract String getProcessDefName();
/**
* 获取工作流流程定义文件的中文流程说明
*
* @return String 工作流流程定义文件的中文流程说明
*/
public abstract String getProcessDefineName();
/**
* 获取工作流对应的业务操作服务KEY
*
* @return String 工作流对应的业务操作服务KEY
*/
public abstract String getBusinessManagerKey();
/**
* 设置待办任务的用户条件
*
* @param userInfo
* UserInfo 当前用户信息
* @param taskPi
* ProMockPo 工作流传入参数
*/
public abstract void setTaskPi(UserInfo userInfo, ProMockPo taskPi);
/**
* 设置资源专业类型列表
*
* @param businessTypeList
* List<Map<String, Object>> 资源专业类型列表
*/
public abstract void setBusinessTypeList(
List<Map<String, Object>> businessTypeList);
/**
* 根据专业类型获取专业对应的菜单名称
*
* @param businessType
* String 专业类型
* @return String 专业对应的菜单名称
*/
public static String getMapKey(String businessType) {
Map<String, String> map = new HashMap<String, String>();
map.put(SysConstant.DICTIONARY_FORMITEM_BUSINESSTYPE_C20, "通用模块");
map.put(SysConstant.DICTIONARY_FORMITEM_BUSINESSTYPE_C30, "传输线路维护");
map.put(SysConstant.DICTIONARY_FORMITEM_BUSINESSTYPE_C31, "基站维护");
map.put(SysConstant.DICTIONARY_FORMITEM_BUSINESSTYPE_C32, "综合覆盖维护");
map.put(SysConstant.DICTIONARY_FORMITEM_BUSINESSTYPE_C33, "铁塔维护");
map.put(SysConstant.DICTIONARY_FORMITEM_BUSINESSTYPE_C34, "集客家客维护");
return map.get(businessType);
}
/**
* 根据业务关键字获取工作流类型
*
* @param businessKey
* String
* @return String
*/
public String getWorkflowType(String businessKey) {
Map<String, String> map = new HashMap<String, String>();
map.put(ElectricitySecurityWorkflowService.OE_WORKFLOW_NAME, "task");
map.put(FaultWorkflowService.FAULT_WORKFLOW_NAME, "task");
map.put(WorkOrderWorkflowService.WORKORDER_WORKFLOW_NAME, "task");
map.put(PatrolWorkflowService.PATROL_WORKFLOW_NAME, "plan");
map.put(ContactLetterAuditService.WORKFLOW_NAME, "letter");
return map.get(businessKey);
}
/**
* 获取一个专业下的一个工作流待办工作列表
*
* @param workflowEntityService
* WorkflowEntityManager 工作流业务实体服务
* @return List<Map<String, Object>> 一个专业下的一个工作流待办工作列表
*/
private List<Map<String, Object>> getWaitHandledTaskResultList(
WorkflowEntityManager workflowEntityService) {
// 获取专业类型列表
Map<String, Object> businessTypeMap = workflowEntityService
.getBusinessTypeMap();
if (MapUtils.isEmpty(businessTypeMap)) {
return new ArrayList<Map<String, Object>>();
}
String businessType = (String) businessTypeMap
.get(SysConstant.DICTIONARY_KEY_COLUMN);
// 从工作流获取待办任务列表
List<ProMockPo> waitHandledTaskList = workflowEntityService
.getWaitHandledTaskList();
// 获取业务数据列表
List<Map<String, Object>> businessDataList = workflowEntityService
.getBusinessDataList(businessType);
// 进行待办任务列表和业务数据列表的合并
List<Map<String, Object>> resultList = workflowEntityService.mergeList(
waitHandledTaskList, businessDataList, getProcessDefName(),
getProcessDefineName());
return resultList;
}
/**
* 工作流待办工作列表数据后期处理(存放专业类型和访问地址)
*
* @param workflowEntityService
* WorkflowEntityManager 工作流业务实体服务
* @param resultList
* List<Map<String, Object>> 存放工作流待办工作列表的临时数据缓冲区
*/
private void processWaitHandledList(
WorkflowEntityManager workflowEntityService,
List<Map<String, Object>> resultList) {
// 获取专业类型列表
Map<String, Object> businessTypeMap = workflowEntityService
.getBusinessTypeMap();
if (MapUtils.isEmpty(businessTypeMap)) {
return;
}
if (CollectionUtils.isEmpty(resultList)) {
return;
}
String businessTypeName = (String) businessTypeMap
.get(SysConstant.DICTIONARY_VALUE_COLUMN);
for (int i = 0; i < resultList.size(); i++) {
resultList.get(i).put(SysConstant.BUSINESSTYPE_KEY,
businessTypeName);
resultList.get(i).put(DesktopServiceImpl.URL_KEY,
workflowEntityService.getAccessUrl());
}
}
/**
* 工作流待办工作列表数量数据后期处理
*
* @param workflowEntityService
* WorkflowEntityManager 工作流业务实体服务
* @param resultMap
* Map<String, Object> 存放待办工作列表数量数据的Map
* @param resultList
* List<Map<String, Object>> 存放工作流待办工作列表的临时数据缓冲区
*/
private void processWaitHandledListNumber(
WorkflowEntityManager workflowEntityService,
Map<String, Object> resultMap, List<Map<String, Object>> resultList) {
Map<String, Object> businessTypeMap = workflowEntityService
.getBusinessTypeMap();
if (MapUtils.isEmpty(businessTypeMap)) {
return;
}
String businessType = (String) businessTypeMap
.get(SysConstant.DICTIONARY_KEY_COLUMN);
String businessTypeName = (String) businessTypeMap
.get(SysConstant.DICTIONARY_VALUE_COLUMN);
Map<String, Object> map = getBusinessTypeValueMap(resultMap,
businessType);
Map<String, Object> numberMap = new HashMap<String, Object>();
numberMap.put(DesktopServiceImpl.URL_KEY,
workflowEntityService.getAccessUrl() + businessType);
numberMap.put(DesktopServiceImpl.WAIT_HANDLED_NUMBER,
Integer.toString(resultList.size()));
map.put(getProcessDefineName(), numberMap);
map.put(DesktopServiceImpl.BUSINESS_TYPE_NAME, businessTypeName);
map.put(DesktopServiceImpl.BUSINESS_TYPE, businessType);
resultMap
.put(AbstractWorkflowWaitHandledService.getMapKey(businessType),
map);
}
/**
* 判断结果map中是否包括了某专业类型的数据
*
* @param resultMap
* Map<String, Object> 结果map
* @param businessType
* String 某专业类型
* @return Map<String, Object> 某专业类型的结果map数据
*/
@SuppressWarnings("unchecked")
private Map<String, Object> getBusinessTypeValueMap(
Map<String, Object> resultMap, String businessType) {
Map<String, Object> map = new HashMap<String, Object>();
if (MapUtils.isEmpty(resultMap)) {
return map;
}
if (StringUtils.isBlank(businessType)) {
return map;
}
Set<String> keySet = resultMap.keySet();
Iterator<String> keyIt = keySet.iterator();
while (keyIt.hasNext()) {
String key = keyIt.next();
Map<String, Object> valueMap = (Map<String, Object>) resultMap
.get(key);
if (MapUtils.isEmpty(valueMap)) {
continue;
}
if (businessType.equals(valueMap
.get(DesktopServiceImpl.BUSINESS_TYPE))) {
return valueMap;
}
}
return map;
}
}