ProcdefinitionmodelsBusinessImpl.java 11.5 KB
Newer Older
罗绍泽 committed
1 2
package com.gaowj.business.procdefinitionmodels;

3 4
import java.io.IOException;
import java.io.UnsupportedEncodingException;
罗绍泽 committed
5 6 7 8 9 10 11
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

12 13 14 15 16 17 18 19 20
import org.activiti.bpmn.converter.BpmnXMLConverter;
import org.activiti.bpmn.model.BpmnModel;
import org.activiti.editor.constants.ModelDataJsonConstants;
import org.activiti.editor.language.json.converter.BpmnJsonConverter;
import org.activiti.engine.ManagementService;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.Model;
import org.activiti.engine.repository.NativeModelQuery;
罗绍泽 committed
21 22
import org.apache.commons.lang.StringUtils;

23 24 25
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
罗绍泽 committed
26 27
import com.gaowj.business.ProcdefinitionmodelsBusiness;
import com.gaowj.business.exception.BusinessException;
28
import com.gaowj.business.procdefinition.procdefinitionDAO;
罗绍泽 committed
29 30 31 32 33 34 35
import com.gaowj.business.util.Page;
import com.gaowj.business.util.SessionUtil;

public class ProcdefinitionmodelsBusinessImpl implements ProcdefinitionmodelsBusiness {

	private procdefinitionmodelsDAO procdefinitionmodelsDAO;

36 37 38 39 40 41
	private procdefinitionDAO procdefinitionDAO;

	private RepositoryService repositoryService;
	
	private ManagementService managementService;

罗绍泽 committed
42 43 44 45 46 47 48 49
	public procdefinitionmodelsDAO getProcdefinitionmodelsDAO() {
		return procdefinitionmodelsDAO;
	}

	public void setProcdefinitionmodelsDAO(procdefinitionmodelsDAO procdefinitionmodelsDAO) {
		this.procdefinitionmodelsDAO = procdefinitionmodelsDAO;
	}

50 51 52 53 54 55 56 57 58 59 60 61
	public void setRepositoryService(RepositoryService repositoryService) {
		this.repositoryService = repositoryService;
	}

	public void setProcdefinitionDAO(procdefinitionDAO procdefinitionDAO) {
		this.procdefinitionDAO = procdefinitionDAO;
	}

	public void setManagementService(ManagementService managementService) {
		this.managementService = managementService;
	}

罗绍泽 committed
62 63
	@Override
	public Map<String, Object> insert_procde_finition_models(Map<String, Object> entity) throws BusinessException {
64 65 66 67 68 69 70 71 72 73 74 75 76
		// 查询流程记录(为了获取该流程的流程部署key值)
		Map<String, Object> query = new HashMap<String, Object>();
		query.put("UUID", entity.get("PROCID"));
		String deploymentKey = procdefinitionDAO.list_procde_finition(query).get(0).get("DEPLOYMENT_KEY").toString();
		// 添加model
		Model model = createModel(entity.get("MODEL_NAME").toString(), entity.get("DESCRIPTION").toString(), deploymentKey);
		// 添加model和流程表的匹配
		Map<String, Object> procdefinitionmodels = new HashMap<String, Object>();
		procdefinitionmodels.put("MODEL_ID", model.getId());
		procdefinitionmodels.put("PROC_DEFINITION_ID", entity.get("PROCID"));

		if (procdefinitionmodels.get("UUID") == null) {
			procdefinitionmodels.put("UUID", java.util.UUID.randomUUID().toString());
罗绍泽 committed
77
		}
78 79
		if (procdefinitionmodels.get("CREATE_TIME") == null) {
			procdefinitionmodels.put("CREATE_TIME", new Date());
罗绍泽 committed
80
		}
81 82
		if (procdefinitionmodels.get("CREATE_ID") == null) {
			procdefinitionmodels.put("CREATE_ID", SessionUtil.getCode());
罗绍泽 committed
83
		}
84 85
		if (procdefinitionmodels.get("UPDATE_ID") == null) {
			procdefinitionmodels.put("UPDATE_ID", SessionUtil.getCode());
罗绍泽 committed
86
		}
87 88
		if (procdefinitionmodels.get("UPDATE_TIME") == null) {
			procdefinitionmodels.put("UPDATE_TIME", new Date());
罗绍泽 committed
89 90 91 92 93
		}

		// 动态传值插入
		List<String> infoListKey = new ArrayList<String>();
		List<Object> infoList = new ArrayList<Object>();
94 95
		if (procdefinitionmodels.keySet() != null) {
			Set<String> key = procdefinitionmodels.keySet();
罗绍泽 committed
96 97
			// 将map集合中的key和value 取出来分别放到list集合里
			for (String str : key) {
98
				infoList.add(procdefinitionmodels.get(str));
罗绍泽 committed
99 100
				infoListKey.add(str);
			}
101 102
			procdefinitionmodels.put("infoListKey", infoListKey);
			procdefinitionmodels.put("infoList", infoList);
罗绍泽 committed
103
		}
104
		procdefinitionmodelsDAO.insert_procde_finition_models(procdefinitionmodels);
罗绍泽 committed
105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
		return entity;
	}

	@Override
	public void update_procde_finition_models(Map<String, Object> entity) throws BusinessException {
		// 动态传值修改
		if (entity.keySet() != null) {
			convertEntity(entity);
			procdefinitionmodelsDAO.update_procde_finition_models(entity);
			entity.remove("info");
		}
	}

	@Override
	public void delete_procde_finition_models(List<String> list) throws BusinessException {
		procdefinitionmodelsDAO.delete_procde_finition_models(list);
	}

	@Override
	public Page<Map<String, Object>> list_procde_finition_models(int pageNo, int pageSize, Map<String, Object> query) throws BusinessException {
		// 计算起始记录
		int pageStart = (pageNo - 1) * pageSize;

128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160
		// 获取列表(流程定义id下的全部模块id)
		Map<String, Object> query2=new HashMap<String, Object>();
		query2.put("PROC_DEFINITION_ID", query.get("PROCID"));
		List<Map<String, Object>> items = procdefinitionmodelsDAO.list_procde_finition_models(query2);
		List<String> listId = new ArrayList<String>();
		for (Map<String, Object> m : items) {
			listId.add(m.get("MODEL_ID").toString());
		}
		// 申明一个基于Model的自定义查询
		NativeModelQuery nativeModelQuery = repositoryService.createNativeModelQuery();
		String sql = " FROM " + managementService.getTableName(Model.class) + " T";
		StringBuffer where = new StringBuffer();
		if (listId.size() > 0) {
			StringBuffer condition = new StringBuffer();
			condition.append("T.ID_ IN (");
			for (int i = 0; i < listId.size(); i++) {
				if (i != 0) {
					condition.append(",");
				}
				condition.append("#{modelId" + i + "}");
				nativeModelQuery.parameter("modelId" + i, listId.get(i));
			}
			condition.append(")");
			addCondition(where, condition.toString());
		}

		// 设置查询条件
		if (query.get("modelName")!=null&&!"".equals(query.get("modelName"))) {
			addCondition(where, "NAME_ LIKE #{modelName}");
			nativeModelQuery.parameter("modelName", "%" + query.get("modelName") + "%");
		}
		sql += where.toString();

罗绍泽 committed
161
		// 获取列表个数
162
		int count = Integer.valueOf(nativeModelQuery.sql("SELECT count(*) " + sql).count() + "");
罗绍泽 committed
163

164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188
		List<Model> listModel=nativeModelQuery.sql("SELECT * "+sql).listPage((pageNo-1) * pageSize, pageSize);
		List<Map<String,Object>> listModelMap=new ArrayList<Map<String,Object>>();
		for(Model model:listModel){
			Map<String,Object> m=new HashMap<String, Object>();
			listModelMap.add(m);
			m.put("ID", model.getId());
			m.put("REVISION", model.getVersion());
			m.put("NAME", model.getName());
			m.put("KEY", model.getKey());
			m.put("CATEGORY", model.getCategory());
			m.put("CREATETIME", model.getCreateTime());
			m.put("LASTUPDATETIME", model.getLastUpdateTime());
			m.put("METAINFO", model.getMetaInfo());
			m.put("KEY", model.getKey());
			
			List<String> listKey=new ArrayList<String>();
			for(String k:m.keySet()){
				if(m.get(k)==null){
					listKey.add(k);
				}
			}
			for(String k:listKey){
				m.remove(k);
			}
		}
罗绍泽 committed
189 190 191 192 193
		// 创建分页对象
		Page<Map<String, Object>> page = new Page<Map<String, Object>>();
		page.setStart(pageStart);
		page.setLimit(pageSize);
		page.setCount(count);
194
		page.setItems(listModelMap);
罗绍泽 committed
195 196 197 198 199 200 201 202 203 204 205 206 207 208 209

		return page;
	}

	@Override
	public List<Map<String, Object>> list_procde_finition_models(Map<String, Object> query) throws BusinessException {
		machining(query);
		return procdefinitionmodelsDAO.list_procde_finition_models(query);
	}

	@Override
	public int listCount_procde_finition_models(Map<String, Object> query) throws BusinessException {
		machining(query);
		return procdefinitionmodelsDAO.listCount_procde_finition_models(query);
	}
210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238
	
	@Override
	public void deploy(Map<String, Object> query) throws BusinessException {
		String procId=query.get("PROCID").toString();
		String modelId=query.get("MODELID").toString();
		
		Model modelData = repositoryService.getModel(modelId);
		ObjectNode modelNode = null;
		try {
			modelNode = (ObjectNode) new ObjectMapper().readTree(repositoryService.getModelEditorSource(modelData.getId()));
		} catch (JsonProcessingException e) {
			throw new BusinessException(e.getMessage());
		} catch (IOException e) {
			throw new BusinessException(e.getMessage());
		}
		byte[] bpmnBytes = null;

		BpmnModel model = new BpmnJsonConverter().convertToBpmnModel(modelNode);
		bpmnBytes = new BpmnXMLConverter().convertToXML(model);

		String processName = modelData.getName() + ".bpmn20.xml";
		Deployment deployment = repositoryService.createDeployment().name(modelData.getName()).addString(processName, new String(bpmnBytes)).deploy();
		//将部署id存入流程定义表
		Map<String,Object> entity=new HashMap<String, Object>();
		entity.put("UUID", procId);
		entity.put("DEPLOYMENT_ID", deployment.getId());
		convertEntity(entity);
		procdefinitionDAO.update_procde_finition(entity);
	}
罗绍泽 committed
239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262

	/**
	 * 更新或者插入时,处理map对象的形式(将字段信息存储为list,便于mybatis代码调用)
	 * 
	 * @param entity
	 */
	private void convertEntity(Map<String, Object> entity, String... ignoreKeys) {
		List<Map<String, Object>> updateList = new ArrayList<Map<String, Object>>();
		Set<String> key = entity.keySet();
		// 将map集合中的key和value 取出来分别放到list集合里
		for (String str : key) {
			Map<String, Object> updateMap = new HashMap<String, Object>();

			for (String k : ignoreKeys) {
				if (StringUtils.equalsIgnoreCase("UUID", str))
					continue;
			}
			updateMap.put("key", str);
			updateMap.put("value", entity.get(str));

			updateList.add(updateMap);
		}
		entity.put("info", updateList);
	}
263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309

	private void machining(Map<String, Object> query) {
		if (query.get("PROC_NAME") != null && !"".equals(query.get("PROC_NAME"))) {
			query.put("PROC_NAME", "%" + query.get("PROC_NAME") + "%");
		}
	}

	/**
	 * 添加model
	 * 
	 * @param modelName
	 * @param description
	 * @param modelKey
	 * @return
	 */
	private Model createModel(String modelName, String description, String deploymentKey) {
		ObjectMapper objectMapper = new ObjectMapper();
		ObjectNode editorNode = objectMapper.createObjectNode();
		editorNode.put("id", "canvas");
		editorNode.put("resourceId", "canvas");
		ObjectNode stencilSetNode = objectMapper.createObjectNode();
		stencilSetNode.put("namespace", "http://b3mn.org/stencilset/bpmn2.0#");
		editorNode.put("stencilset", stencilSetNode);
		ObjectNode properties = objectMapper.createObjectNode();
		properties.put("process_id", deploymentKey);
		editorNode.put("properties", properties);

		Model modelData = repositoryService.newModel();
		ObjectNode modelObjectNode = objectMapper.createObjectNode();
		modelObjectNode.put(ModelDataJsonConstants.MODEL_NAME, modelName);
		modelObjectNode.put(ModelDataJsonConstants.MODEL_REVISION, 1);
		description = org.apache.commons.lang3.StringUtils.defaultString(description);
		modelObjectNode.put(ModelDataJsonConstants.MODEL_DESCRIPTION, description);

		modelData.setMetaInfo(modelObjectNode.toString());
		modelData.setName(modelName);
		modelData.setKey(org.apache.commons.lang3.StringUtils.defaultString(deploymentKey));

		repositoryService.saveModel(modelData);
		try {
			repositoryService.addModelEditorSource(modelData.getId(), editorNode.toString().getBytes("utf-8"));
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return repositoryService.createModelQuery().modelId(modelData.getId()).singleResult();
	}
罗绍泽 committed
310
	
311 312 313 314 315 316 317 318 319 320
	/**
	 * 添加条件
	 * @param where
	 * @param condition
	 */
	private void addCondition(StringBuffer where, String condition) {
		if (where.length() == 0) {
			where.append(" WHERE");
		}else{
			where.append(" AND");
罗绍泽 committed
321
		}
322
		where.append(" ").append(condition).toString();
罗绍泽 committed
323 324
	}
}