Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 框架 day58 BOS項目練習(基於activiti物流配送流程,啟動,查詢,辦理,項目知識點復習)

框架 day58 BOS項目練習(基於activiti物流配送流程,啟動,查詢,辦理,項目知識點復習)

編輯:關於Android編程

1. 設計物流配送流程

物流配送流程

基於組任務進行任務分配、使用排他網關,分支選擇使用流程變量實現

Activiti圖形界面中:

Process的Id值 對應流程定義表中的key值,可以用於啟動最新版本的流程實例

\

 

 

 

任務節點中:

General的 Id值對應任務表中的Task_def_key既 taskDefinitionKey值,用於定義項目中TaskAction中的任務辦理方法名

\

 

 

 

Main config的Candidate grops屬性的值對應角色Role的name名字,activiti表中Group的Id值(role和group同步保存的時候 group Id 的值應設定為role的name,因為id值為uuid不便於閱讀)

\

 

 

 

排他網關,分支選擇使用流程變量實現,條件中condition 的表達式獲取流程變量中的值來判定true or false 選擇分支

\

 

 

2. 啟動流程配送流程

第一步:在工作單管理WorkordermanageAction中提供list方法,查詢start狀態為"0"的工作單

Service代碼:

 

	public List findListNotStart() {
		DetachedCriteria detachedCriteria = DetachedCriteria
				.forClass(Workordermanage.class);
		// 添加條件:start == 0
		detachedCriteria.add(Restrictions.eq("start", "0"));
		return workordermanageDao.findByCondition(detachedCriteria);
	}

 

第二步:配置struts.xml

第三步:提供startranster.jsp頁面,展示工作單

第四步:在工作單管理Action中提供start方法,啟動物流配送流程

Service代碼:

通過id獲取Workordermanage對象設置start狀態為1啟動狀態,並且啟動物流配送流程實例

 

	@Resource
	private ProcessEngine processEngine;

	// 啟動物流配送流程,將工作單對象設置到流程變量中
	public void start(String id) {
		Workordermanage workordermanage = workordermanageDao.findById(id);
		workordermanage.setStart("1");
		String processDefinitionKey = "transfer";// 物流配送流程key
		Map variables = new HashMap();
		variables.put("業務數據", workordermanage);
		processEngine.getRuntimeService().startProcessInstanceByKey(
				processDefinitionKey, variables);
	}

 

 

3. 查詢組任務

第一步:創建一個TaskAction,提供findGroupTask,查詢當前登錄用戶的組(公共)任務

 

@Controller
@Scope("prototype")
public class TaskAction extends ActionSupport {
	@Resource
	private ProcessEngine processEngine;

	/**
	 * 查詢組任務
	 */
	public String findGroupTask() {
		// 任務查詢
		TaskQuery query = processEngine.getTaskService().createTaskQuery();
		String candidateUser = BOSContext.getLoginUser().getId();
		// 根據組任務過濾
		query.taskCandidateUser(candidateUser);
		query.orderByTaskCreateTime().desc();
		List list = query.list();
		ActionContext.getContext().getValueStack().set("list", list);
		return "groupTaskList";
	}

 

第二步:配置struts.xml

第三步:grouptask.jsp頁面展示組任務數據

 


 


	
	
		任務編號
	
		任務名稱
	
		業務數據
	
		拾取任務
	

<script type="text/javascript">
				function showData(taskId){
					$.post("${pageContext.request.contextPath}/taskAction_showData.action",{"taskId":taskId},function(data){
						$("#div"+taskId).html(data);
					});
				}
				
				function toggleData(taskId){
						$("#div"+taskId).toggle();
				}
			</script>

	
	 
	
	查看業務數據
	<script type="text/javascript">
									showData('${id}');
								</script>
	
	拾取  
	




 

第四步:在TaskAction中提供showData方法,根據任務ID查詢流程變量

 

	// 接收任務ID
	private String taskId;
	public String getTaskId() {
		return taskId;
	}

	public void setTaskId(String taskId) {
		this.taskId = taskId;
	}

	/**
	 * ajax查詢流程變量
	 * 
	 * @throws IOException
	 */
	public String showData() throws IOException {
		Map map = processEngine.getTaskService().getVariables(
				taskId);
		ServletActionContext.getResponse().setContentType(
				"text/html;charset=UTF-8");
		ServletActionContext.getResponse().getWriter().print(map);
		return NONE;
	}

 

效果:

toggle()[如果元素是可見的,切換為隱藏的;如果元素是隱藏的,切換為可見的。] 控制div的 style="display: none"

\

 

4. 拾取組任務

第一步:在TaskAction中提供拾取組任務的方法takeTask

 

	/**
	 * 拾取組任務
	 */
	public String takeTask() {
		processEngine.getTaskService().claim(taskId,
				BOSContext.getLoginUser().getId());
		return "toGroupTaskList";
	}

 

第二步:配置struts.xml

 

5. 查詢個人任務

第一步:在TaskAction中提供findPersonalTask方法,查詢個人任務

Assignee的值取決於用戶表同步時activiti的user_id值的同步設置

 

	/**
	 * 查詢當前登錄人的個人任務
	 */
	public String findPersonalTask() {
		TaskQuery query = processEngine.getTaskService().createTaskQuery();
		query.taskAssignee(BOSContext.getLoginUser().getId());
		query.orderByTaskCreateTime().desc();
		List list = query.list();
		ActionContext.getContext().getValueStack().set("list", list);
		return "personalTaskList";
	}

 

第二步:配置struts.xml

第三步:提供personaltask.jsp

 


 


	
	
		任務編號
	
		任務名稱
	
		業務數據
	
		辦理任務
	

<script type="text/javascript">
				function showData(taskId){
					$.post("${pageContext.request.contextPath}/taskAction_showData.action",{"taskId":taskId},function(data){
						$("#div"+taskId).html(data);
					});
				}
				
				function toggleData(taskId){
						$("#div"+taskId).toggle();
				}
			</script>

	
	 
	
	查看業務數據
	<script type="text/javascript">
									showData('${id}');
								</script>
	
	辦理任務  
	




 

 

6. 辦理任務

 

6.1 辦理審核工作單任務

 

第一步:在TaskAction中提供審核工作單辦理的方法

 

	private Integer check;// 審核結果
	public Integer getCheck() {
		return check;
	}

	public void setCheck(Integer check) {
		this.check = check;
	}
	@Resource
	private IWorkordermanageService workordermanageService;
	/**
	 * 辦理審核工作單任務
	 */
	public String checkWorkOrderManage() {
		if (check == null) {
			// 跳轉到審核工作單表單頁面
			// 根據任務的ID查詢流程變量
			Map map = processEngine.getTaskService()
					.getVariables(taskId);
			ActionContext.getContext().getValueStack().set("map", map);
			return "checkUI";
		} else {
			// 2、修改工作單中的managerCheck為“1”
			Workordermanage workOrderManage = (Workordermanage) processEngine
					.getTaskService().getVariable(taskId, "業務數據");
			workOrderManage.setManagerCheck("1");
			// 3、如果審核不通過,修改工作單的start為“0”
			if (check == 0) {
				workOrderManage.setStart("0");
			}
			workordermanageService.update(workOrderManage);
			// 1、根據任務ID辦理任務,設置流程變量check
			Map variables = new HashMap();
			variables.put("check", check);
			processEngine.getTaskService().complete(taskId, variables);
			return "toPersonalTaskList";
		}
	}

 

第二步:提供check.jsp頁面,作為審核工作單的表單頁面

 


審核工作單

${map } 審核結果:

 

6.2 辦理其他任務

 

	// 辦理出庫任務
	public String outStore() {
		Map variables = new HashMap();
		variables.put("倉庫管理員", BOSContext.getLoginUser().getUsername());
		processEngine.getTaskService().complete(taskId, variables);
		return "toPersonalTaskList";
	}

	// 辦理配送任務
	public String transferGoods() {
		Map variables = new HashMap();
		variables.put("取派員", BOSContext.getLoginUser().getUsername());
		processEngine.getTaskService().complete(taskId, variables);
		return "toPersonalTaskList";
	}

	// 辦理簽收任務
	public String receive() {
		Map variables = new HashMap();
		variables.put("取派員", BOSContext.getLoginUser().getUsername());
		processEngine.getTaskService().complete(taskId, variables);
		return "toPersonalTaskList";
	}

 

項目復習

1. 項目第一天

 項目概述

1、項目背景介紹、軟件開發流程(瀑布模型)、常見的軟件項目類型(OA、CRM、ERP、CMS)

2、搭建bos項目開發環境(SSH +mysql+tomcat)

3、主頁設計(easyUI中layout、accordion、tabs 、 ztree插件使用(使用標准json數據4、構造ztree、使用簡單json數據構造ztree樹))

4、使用PowerDesigner設計數據庫

 

2. 項目第二天

1、抽取BaseDao和BaseAction(泛型+反射)

2、實現用戶登錄(基於BaseDao和BaseAction)、驗證碼使用

3、easyUI的消息提示框messager(show、alert、confirm、prompt、progress)

4、easyUI的菜單按鈕menubutton

5、編寫struts2自定義攔截器(如果用戶沒有登錄,自動跳轉到登錄頁面)

6、使用easyUI的validatebox控件進行表單校驗

6、基於window窗口實現修改密碼功能

 

3. 項目第三天

1、基礎設置部分需求分析(取派員、區域、分區、定區)

整個bos項目分為基礎設置、取派、中轉、路由、報表部分

2、根據提供pdm文件導出sql文件,生成實體類和hbm

3、easyUI中datagrid的用法

方式一:將頁面中HTML代碼渲染為datagrid樣式

方式二:發送ajax請求加載服務端json數據構造datagrid數據

方式三:通過js代碼動態創建datagrid

4、基於datagrid實現取派員的分頁查詢(在BaseDao中實現通用的分頁查詢方法)

5、修改取派員回顯(基於form的load方法實現回顯)

6、添加取派員(擴展手機號的校驗規則)

7、刪除取派員(邏輯刪除)

 

4. 項目第四天

1、OCUpload一鍵上傳js插件的使用(模擬ajax異步效果)

2、使用apache的POI技術讀取excel文件中的數據

3、pinyin4j工具類使用

4、基於(一鍵上傳、POI、pinyin4j)實現區域的批量導入功能

5、區域的分頁查詢

6、重構分頁查詢代碼(BaseAction)

7、easyUI中combobox(下拉框)控件的使用

8、基於combobox實現分區的添加功能(combobox過濾功能)

9、實現分區的組合條件分頁查詢

10、基於POI實現分區數據導出功能

 

5. 項目第五天

1、定區的添加功能(添加窗口中使用combobox展示取派員數據、使用datagrid展示分區數據 )

2、定區分頁查詢

3、hessian框架的使用(遠程調用技術)

遠程調用技術:hessian、webservice(cxf 、axis2)、httpClient

4、在crm服務端使用hessian發布服務,提供查詢客戶信息的服務

5、在bos項目中遠程調用crm服務

a.在bos中提供一個接口,和crm中的接口對應

b.針對接口創建客戶端的代理對象,通過代理對象遠程調用crm

 

6. 項目第六天

1、業務受理(業務通知單、工單、工作單)

a.在bos項目中根據手機號遠程調用crm獲得客戶信息,並回顯到頁面中

b.根據客戶的取件地址實現自動分單

2、datagrid的編輯功能

a.設置editor屬性,指定那一列具有編輯功能

b.調用方法beginEdit開啟編輯功能

c.調用方法endEdit結束編輯功能

d.通過方法insertRow動態在數據表格中插入一行

e.通過方法getRowIndex獲得某一行的索引

f.通過事件onAfterEdit監聽結束編輯事件

3、基於數據表格編輯功能實現工作單快速錄入功能

 

7. 項目第七天

1、權限概述(認證、授權)

2、常見進行權限控制的方式(URL攔截、方法注解(代理)、頁面標簽控制)

3、shiro框架的入門

a.功能:認證、授權、會話管理、加密

b.shiro運行流程:Application Code----->>Subject-------->>SecurityManager------>Realm

4、將shiro應用到bos項目中進行認證和授權

a.在web.xml中配置一個過濾器,spring提供的用於整合shiro的

b.在applicationContext.xml中配置一個bean,ID為shiroFilter

c.在applicationContext.xml中配置一個安全管理器,並注入給shiroFilter

d.在applicationContext.xml中配置一個Realm,並注入給安全管理器

e.修改UserAction中的login方法,使用shiro的方式進行認證,最終調用到Realm

5、使用shiro注解進行權限控制

a.開啟注解功能(在spring配置文件中配置自動代理、切面類)

b.在Action方法上使用shiro的注解

c.修改BaseAction的構造方法

8. 項目第八天

1、初始化權限數據(通過sql腳本插入權限數據到權限表)

2、角色管理(添加、查詢)

3、用戶管理(添加、查詢)

4、修改BOSRealm中的授權方法,根據登錄人查詢對應的權限

5、使用ehcache緩存權限數據

a.導入ehcache的jar

b.提供ehcache的配置文件(從jar包中獲得)

c.在spring配置文件中配置一個緩存管理器,並注入給安全管理器

6、shiro標簽使用

7、系統左側菜單按照登錄人的權限展示

 

9. 項目第九天

1、工作流概念

2、安裝插件eclipse插件,設計流程

3、創建activiti框架的23張表(部署表、流程定義表、流程實例表、任務表、二進制表、流程變量表、組表、用戶表、關系表)

4、部署流程定義、查詢流程定義、啟動流程實例、查詢流程實例、流程圖片名稱和輸入流、查詢任務、辦理任務

5、網頁版流程設計器使用

 

10. 項目第十天

1、查詢歷史數據

2、流程變量設置、獲取

3、組任務(候選人、候選組)

4、監聽器(執行、任務)

5、網關(排他、並行)

6、spring整合activiti

 

11. 項目第十一天

1、部署流程定義(通過zip文件上傳到服務端,完成部署)

2、查詢最新版本的流程定義列表數據

3、基於struts2的文件下載實現查看png流程圖片功能

4、查看正在運行的流程實例(運行狀態,查詢任務節點的坐標)

5、將bos系統中的角色數據和用戶數據同步到activiti的表中

也可以通過數據庫的觸發器實現

 

12. 項目第十二天

1、設計物流配送流程(基於組任務進行任務分配、使用排他網關,分支選擇使用流程變量實現)

2、啟動物流配送流程(設置流程變量---工作單)

3、查詢組任務

4、拾取組任務,變為個人任務

5、查詢個人任務

6、辦理個人任務(每個任務的辦理對應一個action的方法)

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved