編輯:關於Android編程
物流配送流程
基於組任務進行任務分配、使用排他網關,分支選擇使用流程變量實現
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 選擇分支
第一步:在工作單管理WorkordermanageAction中提供list方法,查詢start狀態為"0"的工作單
Service代碼:
public ListfindListNotStart() { 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 Mapvariables = new HashMap (); variables.put("業務數據", workordermanage); processEngine.getRuntimeService().startProcessInstanceByKey( processDefinitionKey, variables); }
第一步:創建一個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(); Listlist = query.list(); ActionContext.getContext().getValueStack().set("list", list); return "groupTaskList"; }
第二步:配置struts.xml
第三步:grouptask.jsp頁面展示組任務數據
第四步:在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 { Mapmap = processEngine.getTaskService().getVariables( taskId); ServletActionContext.getResponse().setContentType( "text/html;charset=UTF-8"); ServletActionContext.getResponse().getWriter().print(map); return NONE; }
效果:
toggle()[如果元素是可見的,切換為隱藏的;如果元素是隱藏的,切換為可見的。] 控制div的 style="display: none"
第一步:在TaskAction中提供拾取組任務的方法takeTask
/** * 拾取組任務 */ public String takeTask() { processEngine.getTaskService().claim(taskId, BOSContext.getLoginUser().getId()); return "toGroupTaskList"; }
第二步:配置struts.xml
第一步:在TaskAction中提供findPersonalTask方法,查詢個人任務
Assignee的值取決於用戶表同步時activiti的user_id值的同步設置
/** * 查詢當前登錄人的個人任務 */ public String findPersonalTask() { TaskQuery query = processEngine.getTaskService().createTaskQuery(); query.taskAssignee(BOSContext.getLoginUser().getId()); query.orderByTaskCreateTime().desc(); Listlist = query.list(); ActionContext.getContext().getValueStack().set("list", list); return "personalTaskList"; }
第二步:配置struts.xml
第三步:提供personaltask.jsp
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查詢流程變量 Mapmap = 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頁面,作為審核工作單的表單頁面
6.2 辦理其他任務
// 辦理出庫任務 public String outStore() { Mapvariables = 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的方法)
隨著網絡購物的流行,我們經常要和不同的快遞公司打交道,大多數人都知道通過快遞單號可以在快遞公司網站上查詢快遞的狀態。但是如果自己不在電腦旁邊,是不是就查詢不
GPUImage 是iOS下一個開源的基於GPU的圖像處理庫,提供各種各樣的圖像處理濾鏡,並且支持照相機和攝像機的實時濾鏡。GPUImage for Android是它在
Android CoordinatorLayout詳解一、CoordinatorLayout有什麼作用CoordinatorLayout作為“super-powered
頭部用的是TabLayout和ViewPager實現的 底部用的是FragmentTabHost和Fragment實現的先看底部的實現:底部布局: <fram