package com.norteksoft.mms.custom.service;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;
import com.norteksoft.mms.custom.dao.CommonDao;
import com.norteksoft.mms.form.dao.ListColumnDao;
import com.norteksoft.mms.form.entity.FormControl;
import com.norteksoft.mms.form.entity.FormView;
import com.norteksoft.mms.form.entity.ListColumn;
import com.norteksoft.mms.form.entity.ListView;
import com.norteksoft.mms.form.entity.View;
import com.norteksoft.mms.form.enumeration.DataType;
import com.norteksoft.mms.form.service.FormHtmlParser;
import com.norteksoft.mms.form.service.FormViewManager;
import com.norteksoft.mms.module.entity.ModulePage;
import com.norteksoft.mms.module.service.ModulePageManager;
import com.norteksoft.product.api.ApiFactory;
import com.norteksoft.product.api.entity.Document;
import com.norteksoft.product.api.entity.WorkflowAttachment;
import com.norteksoft.product.orm.Page;
import com.norteksoft.product.util.ContextUtils;
import com.norteksoft.product.web.wf.WorkflowManagerSupport;
import com.norteksoft.task.base.enumeration.TaskProcessingResult;
import com.norteksoft.task.base.enumeration.TaskState;
import com.norteksoft.task.entity.WorkflowTask;
import com.norteksoft.wf.base.enumeration.CompleteTaskTipType;
import com.norteksoft.wf.engine.client.EndInstanceInterface;
import com.norteksoft.wf.engine.client.FormFlowable;
import com.norteksoft.wf.engine.client.FormFlowableDeleteInterface;
import com.norteksoft.wf.engine.client.RetrieveTaskInterface;
import com.norteksoft.wf.engine.dao.WorkflowAttachmentDao;
import com.norteksoft.wf.engine.entity.Opinion;
import com.norteksoft.wf.engine.entity.WorkflowDefinition;
import com.norteksoft.wf.engine.entity.WorkflowInstance;
import com.norteksoft.wf.engine.service.TaskService;
import com.norteksoft.wf.engine.service.WorkflowDefinitionManager;
import com.norteksoft.wf.engine.service.WorkflowInstanceManager;
import com.norteksoft.wf.engine.service.WorkflowRightsManager;
@Service
public class CommonManager extends WorkflowManagerSupport<FormFlowable> implements FormFlowableDeleteInterface,RetrieveTaskInterface,EndInstanceInterface {
@Autowired
private CommonDao commonDao;
@Autowired
private FormViewManager formViewManager;
@Autowired
private ListColumnDao listColumnDao;
@Autowired
private ModulePageManager modulePageManager;
@Autowired
private WorkflowInstanceManager workflowInstanceManager;
@Autowired
private WorkflowDefinitionManager workflowDefinitionManager;
@Autowired
private TaskService taskService;
@Autowired
private WorkflowRightsManager workflowRightsManager;
@Autowired
private WorkflowAttachmentDao workflowAttachmentDao;
/**
* 根据列表编号查询数据
* @param page
* @param listCode
* @return
*/
@Transactional
public Page<Object> list(Page<Object> page, View listView){
if(listView.getStandard()){
return commonDao.listEntity(page, listView.getDataTable().getEntityName());
}else{
if(StringUtils.isNotBlank(page.getOrderBy())){
if(!page.getOrderBy().startsWith("dt_") && !FormHtmlParser.isDefaultField(page.getOrderBy())){
page.setOrderBy("dt_"+page.getOrderBy());
}
}
commonDao.list(page, listView.getCode());
if(StringUtils.isNotBlank(page.getOrderBy())){
if(page.getOrderBy().startsWith("dt_")){
page.setOrderBy(page.getOrderBy().replaceFirst("dt_", ""));
}
}
return page;
}
}
public Long getCompanyId() {
return ContextUtils.getCompanyId();
}
/**
* 根据ID,表单视图查询数据
* @param formView
* @param id
* @return
*/
@Transactional
public Object getDateById(View formView, Long id){
if(formView.getStandard()){
return commonDao.getEntityById(formView.getDataTable().getEntityName(), id);
}else{
return commonDao.getDateById(formView.getDataTable().getName(), id);
}
}
/**
* 保存表单数据
*/
@Transactional
public Long save(Map<String,String[]> parameter){
String[] pageIds = parameter.get("pageId");
ModulePage modulePage = modulePageManager.getModulePage(Long.valueOf(pageIds[0]));
FormView form = (FormView) modulePage.getView();
return saveDate(parameter, form);
}
@Transactional
public Long saveDate(Map<String,String[]> parameter, FormView form){
String[] ids = parameter.get("id");
List<FormControl> controls = formViewManager.getControls(form);
Long id = null;
if(ids != null && StringUtils.isNotBlank(ids[0])){
id = commonDao.update(parameter, form, controls, Long.parseLong(ids[0]));
}else{
id = commonDao.save(parameter, form, controls);
}
return id;
}
/**
* 根据列表编号获取查询String
*/
@Transactional
public String getQueryString(String listCode){
List<ListColumn> columns = listColumnDao.getQueryColumnsByCode(listCode);
StringBuilder query = new StringBuilder();
query.append("[");
boolean isFirst = true;
for(ListColumn lc : columns){
if(!isFirst) query.append(",");
query.append("{");
query.append("enName:").append("dt_").append(lc.getTableColumn().getName());
query.append(",chName:").append(getInternation(lc.getHeaderName()));
if(DataType.TEXT == lc.getTableColumn().getDataType()){
query.append(",propertyType:").append("STRING");
}else{
query.append(",propertyType:").append(lc.getTableColumn().getDataType());
}
query.append(",fixedField:false");
query.append("}");
isFirst = false;
}
query.append("]");
return query.toString();
}
public String getInternation(String code){
return ApiFactory.getSettingService().getInternationOptionValue(code);
}
/**
* 删除
*/
@Transactional
public String delete(View formView, List<Long> ids){
if(ids != null && !ids.isEmpty()){
for(Long id : ids){
Object obj=commonDao.getDateById(formView.getDataTable().getName(),id);
com.norteksoft.product.api.entity.WorkflowInstance wi=ApiFactory.getInstanceService().getInstance((String)((Map)obj).get("instance_id"));
if(wi==null){
commonDao.delete(formView.getDataTable().getName(), id);
}else{
ApiFactory.getInstanceService().deleteInstance((String)((Map)obj).get("instance_id"));
}
}
}
return "删除成功";
}
/////////////////////////////////////////////////////////////////////////////////////
public List<WorkflowDefinition> getWorkflows(String code, Integer version){
return workflowDefinitionManager.getCommonEnableDefinitionsByformCodeAndVersion(code, version);
}
/**
* 保存表单,启动流程
*/
@Transactional
public Long startWorkflow(Map<String, String[]> parameter){
// 从参数中获取 instanceId
String instanceId = null;
String[] instanceIds = parameter.get("instance_id");
if(instanceIds != null && StringUtils.isNotEmpty(instanceIds[0])){
instanceId = instanceIds[0];
}
// jBPM流程定义ID
String processId = parameter.get("processId")[0];
if(StringUtils.isNotEmpty(instanceId)&&StringUtils.isEmpty(processId)){
WorkflowInstance wi = workflowInstanceManager.getWorkflowInstance(instanceId);
processId=wi.getProcessDefinitionId();
}
WorkflowDefinition def=workflowDefinitionManager.getWorkflowDefinitionByProcessId(processId);
Long dataId = null;
if(def!=null){
Map result = ApiFactory.getInstanceService().startCustomInstance(def.getId());
dataId = (Long)result.get("dataId");
com.norteksoft.product.api.entity.WorkflowInstance workflow = ApiFactory.getInstanceService().getInstance((String)result.get("instanceId"));
WorkflowTask task = getFirstTask(workflow.getProcessInstanceId());
parameter.put("taskId", new String[]{task.getId().toString()});
}
return dataId;
}
public WorkflowTask getFirstTask(String instanceId){
WorkflowInstance wi = workflowInstanceManager.getWorkflowInstance(instanceId);
return taskService.getFirstTask(instanceId, wi.getCreator());
}
/**
* 保存表单,启动流程,并提交第一环节任务
*/
@Transactional
public Map submitWorkflow(Map<String,String[]> parameter){
// jBPM流程定义ID
String processId = parameter.get("processId")[0];
WorkflowDefinition def=workflowDefinitionManager.getWorkflowDefinitionByProcessId(processId);
if(def!=null){
return ApiFactory.getInstanceService().submitCustomInstance(def.getId());
}
return null;
}
/**
* 根据任务查询流程对应的表单
* @param taskId
* @return
*/
public FormView getViewByTask(Long taskId){
WorkflowTask task = taskService.getTask(taskId);
WorkflowInstance wi = workflowInstanceManager.getWorkflowInstance(task.getProcessInstanceId());
FormView view = formViewManager.getFormView(wi.getFormId());
return view;
}
/**
* 根据任务ID查询数据
* @param taskId
* @return
*/
public Object getDataByTaskId(Long taskId){
WorkflowTask task = taskService.getTask(taskId);
WorkflowInstance wi = workflowInstanceManager.getWorkflowInstance(task.getProcessInstanceId());
FormView view = formViewManager.getFormView(wi.getFormId());
return commonDao.getDateById(view.getDataTable().getName(), wi.getDataId());
}
/**
* 提交任务
*/
@Transactional
public CompleteTaskTipType submitTask(Map<String,String[]> parameter){
ApiFactory.getFormService().saveData(parameter);
// 从参数中获取 instanceId
String[] taskIds = parameter.get("taskId");
Long taskId = Long.valueOf(taskIds[0]);
if(parameter.get("transactor")!=null&¶meter.get("transactor").length>0){
String tr = parameter.get("transactor")[0];
return ApiFactory.getTaskService().completeInteractiveWorkflowTask(taskId, "", tr);
}
WorkflowTask task = taskService.getTask(taskId);
TaskProcessingResult transact = TaskProcessingResult.valueOf(parameter.get("transact")[0]);
return taskService.completeWorkflowTask(task, transact);
}
/**
* 取回
* @param taskId
*/
public String getBack(Long taskId){
return taskService.retrieve(taskId);
}
/**
* 是否需要指定办理人
*/
public CompleteTaskTipType isNeedAssigningTransactor(Long taskId){
WorkflowTask task = taskService.getTask(taskId);
WorkflowInstance instance = workflowInstanceManager.getWorkflowInstance(task.getProcessInstanceId());
CompleteTaskTipType result = taskService.isNeedAssigningTransactor(instance, task);
if(result==null){
result=taskService.isSubProcessNeedChoiceTransactor(task);
}
return result;
}
/**
* 抄送
*/
public void createCopyTaches(Long taskId, List<String> transactors,String title,String url){
taskService.createCopyTaches(taskId, transactors, title, url);
}
/**
* 领取任务
* @return
*/
public String receive(Long taskId){
return ApiFactory.getTaskService().drawTask(taskId);
}
/**
* 放弃领取任务
* @param taskId
* @return
*/
public String abandonReceive(Long taskId){
return ApiFactory.getTaskService().abandonReceive(taskId);
}
/**
* 获取任务下环节办理人
*/
public Map<String[], List<String[]>> getNextTasksCandidates(Long taskId){
WorkflowTask task = taskService.getTask(taskId);
return taskService.getNextTasksCandidates(task);
}
/**
* 任务是否已完成
*/
public boolean isTaskComplete(Long taskId){
WorkflowTask task = taskService.getTask(taskId);
return TaskState.COMPLETED.getIndex().equals(task.getActive())||TaskState.CANCELLED.getIndex().equals(task.getActive())||TaskState.ASSIGNED.getIndex().equals(task.getActive())||TaskState.HAS_DRAW_OTHER.getIndex().equals(task.getActive());
}
/**
* 查询字段编辑权限
*/
public String getFieldPermision(Long taskId){
WorkflowTask task = taskService.getTask(taskId);
return workflowRightsManager.getFieldPermission(task);
}
/**
* 为任务的下环节指定办理人
*/
public CompleteTaskTipType setTasksTransactor(Long taskId, List<String> transactors ) {
return ApiFactory.getTaskService().completeInteractiveWorkflowTask(taskId, transactors, null);
}
/**
* 意见权限(查看、编辑、必填 read edit must)
*/
public List<String> opinionRightByTask(Long taskId){
List<String> result = new ArrayList<String>();
WorkflowTask task = taskService.getWorkflowTask(taskId);
if(workflowRightsManager.viewOpinionRight(task)){
result.add("view");
}
if(task.getActive()!=2){
if(workflowRightsManager.editOpinionRight(task)){
result.add("edit");
}
if(workflowRightsManager.mustOpinionRight(task)){
result.add("must");
}
}
return result;
}
/**
* 正文权限(创建,删除 create delete)
*/
public List<String> textRightByTask(Long taskId){
List<String> result = new ArrayList<String>();
WorkflowTask task = taskService.getWorkflowTask(taskId);
if(task.getActive()!=2&&task.getActive()!=3&&task.getActive()!=5&&task.getActive()!=7){
if(workflowRightsManager.officialTextCreateRight(task)){
result.add("create");
}
if(workflowRightsManager.officialTextDeleteRight(task)){
result.add("delete");
}
if(workflowRightsManager.officialTextDownloadRight(task)){
result.add("downLoad");
}
if(workflowRightsManager.officialTextEditRight(task)){
result.add("edit");
}
}else if(task.getActive()==2){
if(workflowRightsManager.officialTextDownloadRight(task)){
result.add("downLoad");
}
}
return result;
}
/**
* 附件权限
*/
public List<String> attachmentRightByTask(Long taskId){
List<String> result = new ArrayList<String>();
WorkflowTask task = taskService.getWorkflowTask(taskId);
if(task.getActive()!=2&&task.getActive()!=3&&task.getActive()!=5&&task.getActive()!=7){
if(workflowRightsManager.attachmentAddRight(task)){
result.add("create");
}
if(workflowRightsManager.attachmentDeleteRight(task)){
result.add("delete");
}
if(workflowRightsManager.attachmentDownloadRight(task)){
result.add("downLoad");
}
}else if(task.getActive()==2){
if(workflowRightsManager.attachmentDownloadRight(task)){
result.add("downLoad");
}
}
return result;
}
/**
* 根据taskId得到task
*/
public WorkflowTask getTaskByTaskId(Long taskId){
return taskService.getWorkflowTask(taskId);
}
/**
* 根据任务查询意见
*/
public List<Opinion> getOpinions(String workflowId,Long companyId){
return workflowInstanceManager.getOpinionsByInstanceId(workflowId, companyId);
}
/**
* 保存意见
*/
public void saveOpinion(Opinion opi){
WorkflowTask task = taskService.getTask(opi.getTaskId());
opi.setWorkflowId(task.getProcessInstanceId());
opi.setTaskName(task.getName());
workflowInstanceManager.saveOpinion(opi);
}
/**
* 通过流程定义的Key和version查询WorkflowDefinition
* @param key
* @param version
* @return
*/
public WorkflowDefinition getWorkflowDefinitionByProcessId(String processId){
return workflowDefinitionManager.getWorkflowDefinitionByProcessId(processId);
}
/**
* 发起前自动填写字段
*/
public void fillEntityByDefinition(Map data,String wfDefinationCode, Integer version,Long... systemId){
ApiFactory.getFormService().fillEntityByDefinition(data, wfDefinationCode, version,systemId);
}
/**
* 办理前自动填写字段
*/
public void fillEntityByTask(Map data,Long taskId){
ApiFactory.getFormService().fillEntityByTask(data, taskId);
}
public List<Document> getDocumentsByInstance(String instanceId){
return ApiFactory.getDocumentService().getDocuments(instanceId);
}
public List<WorkflowAttachment> getAttachments(String instanceId){
return ApiFactory.getAttachmentService().getAllAttachments(instanceId);
}
@Override
protected FormFlowable getEntity(Long entityId) {
// TODO Auto-generated method stub
return null;
}
@Override
protected void saveEntity(FormFlowable t) {
// TODO Auto-generated method stub
}
public void deleteFormFlowable(Long dataId) {
// TODO Auto-generated method stub
}
public void retrieveTaskExecute(Long entityId, Long taskId) {
// TODO Auto-generated method stub
}
public void endInstanceExecute(Long entityId) {
// TODO Auto-generated method stub
}
public WorkflowInstance getWorkflowInforById(String instanceId) {
return workflowInstanceManager.getWorkflowInstance(instanceId);
}
public void deleteAttachment(Long id){
Assert.notNull(id, "附件id不能为null");
this.workflowAttachmentDao.delete(id);
}
public Map<String, Object> getAmountTotal(List<String> names) {
return commonDao.getAmountTotal(names);
}
}