Index: ssts-web/src/main/webapp/systemmanage/workFlow/workFlowAuthorize/workFlowApprovalAuthorization.jsp =================================================================== diff -u --- ssts-web/src/main/webapp/systemmanage/workFlow/workFlowAuthorize/workFlowApprovalAuthorization.jsp (revision 0) +++ ssts-web/src/main/webapp/systemmanage/workFlow/workFlowAuthorize/workFlowApprovalAuthorization.jsp (revision 23468) @@ -0,0 +1,24 @@ +<%@page language="java" contentType="text/html; charset=UTF-8"%> +<%-- 引入JSP标签 --%> +<%@include file="/common/taglibs.jsp"%> +<%-- 引入ExtJs4.2.5框架 --%> +<%@include file="/common/include_ForgonGrid4.2.5_css.jsp"%> +<%@include file="/common/include_ForgonGrid4.2.5_Js.jsp"%> +<%@include file="/common/include_UseForgonGrid4_Js.jsp"%> + + + + <%-- 引入common.js --%> + + <%-- 引入本身的js --%> + + + + <%-- --%> + + 审批任务权限代理配置 + + + + + \ No newline at end of file Index: forgon-core/src/main/java/com/forgon/workflow/action/WorkFlowApprovalAuthorizationAction.java =================================================================== diff -u --- forgon-core/src/main/java/com/forgon/workflow/action/WorkFlowApprovalAuthorizationAction.java (revision 0) +++ forgon-core/src/main/java/com/forgon/workflow/action/WorkFlowApprovalAuthorizationAction.java (revision 23468) @@ -0,0 +1,154 @@ +package com.forgon.workflow.action; + +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +import javax.servlet.http.HttpServletResponse; + +import net.sf.json.JSONArray; +import net.sf.json.JSONObject; +import net.sf.json.util.JSONUtils; + +import org.apache.commons.lang.StringUtils; +import org.apache.struts2.convention.annotation.Action; +import org.apache.struts2.convention.annotation.Namespace; +import org.apache.struts2.convention.annotation.ParentPackage; + +import com.forgon.Constants; +import com.forgon.directory.acegi.tools.AcegiHelper; +import com.forgon.entity.ExtJsEntity; +import com.forgon.entity.PageEntity; +import com.forgon.security.model.User; +import com.forgon.security.service.UserManager; +import com.forgon.tools.StrutsParamUtils; +import com.forgon.tools.StrutsResponseUtils; +import com.forgon.tools.db.DatabaseUtil; +import com.forgon.tools.json.JSONUtil; +import com.forgon.tools.util.ExtJsUtil; +import com.forgon.tools.util.PageUtil; +import com.forgon.util.ExtGridUtils; +import com.forgon.workflow.model.NodeApproval; +import com.forgon.workflow.model.NodeDefinition; +import com.forgon.workflow.model.WorkFlow; +import com.forgon.workflow.model.WorkFlowApprovalAuthorization; +import com.forgon.workflow.service.NodeDefinitionManager; +import com.forgon.workflow.service.WorkFlowApprovalAuthorizationManager; +import com.forgon.workflow.service.WorkFlowManager; +import com.opensymphony.xwork2.ModelDriven; +import com.opensymphony.xwork2.Preparable; + +import edu.emory.mathcs.backport.java.util.Arrays; + +/** + * + * @author YanWeiNing + * + */ +@ParentPackage(value = "default") +@Namespace(value = "/disinfectSystem") +@Action(value = "workFlowApprovalAuthorizationAction") +public class WorkFlowApprovalAuthorizationAction implements ModelDriven, Preparable { + + private ExtGridUtils extGridUtils; + + private WorkFlowApprovalAuthorization workFlowApprovalAuthorization; + + private WorkFlowApprovalAuthorizationManager workFlowApprovalAuthorizationManager; + + + public void setWorkFlowApprovalAuthorizationManager(WorkFlowApprovalAuthorizationManager workFlowApprovalAuthorizationManager) { + this.workFlowApprovalAuthorizationManager = workFlowApprovalAuthorizationManager; + } + + public void setExtGridUtils(ExtGridUtils extGridUtils) { + this.extGridUtils = extGridUtils; + } + + @Override + public void prepare() throws Exception { + workFlowApprovalAuthorization = new WorkFlowApprovalAuthorization(); + } + + @Override + public WorkFlowApprovalAuthorization getModel() { + return workFlowApprovalAuthorization; + } + + /** + * 加载流程审批授权列表 + */ + public void loadWorkFlowApprovalAuthorizationList() { + String select = "select * "; + String where = " from WorkFlowApprovalAuthorization where 1=1 "; + ExtJsEntity entity = ExtJsUtil.buildSQLEntity(select, where, ""); + JSONObject result = extGridUtils.getPagedResult(entity); + StrutsResponseUtils.output(result); + } + + /** + * 保存流程审批授权 + */ + public void save(){ + StrutsParamUtils.getResponse().setCharacterEncoding("UTF-8"); + String authorizedUserIds = StrutsParamUtils.getPraramValue("authorizedUserIds", "");//(添加时:选择后用户获得的是工号) + String[] authorizedUserIdsArray = authorizedUserIds.split(Constants.IDS_SEPARATOR); + try { + if (workFlowApprovalAuthorization != null) { + List authorizedUserIdsList = Arrays.asList(authorizedUserIdsArray); + if (workFlowApprovalAuthorization.getId() == null) { + workFlowApprovalAuthorizationManager.saveWorkFlowApprovalAuthorization(workFlowApprovalAuthorization, authorizedUserIdsList); + } else { + workFlowApprovalAuthorizationManager.updateWorkFlowApprovalAuthorizationValidityTime(workFlowApprovalAuthorization); + } + StrutsResponseUtils.output(true, "保存成功"); + } + } catch (Exception e) { + e.printStackTrace(); + StrutsResponseUtils.output(false, e.getMessage()); + } + } + + /** + * 根据id获取流程审批授权信息 + */ + public void workFlowApprovalAuthorizationById() { + try { + String id = StrutsParamUtils.getPraramValue("id", ""); + if (StringUtils.isNotBlank(id)) { + workFlowApprovalAuthorization = workFlowApprovalAuthorizationManager.getWorkFlowApprovalAuthorizationById(id); + org.json.JSONObject jsonObject = new org.json.JSONObject(); + jsonObject.put("success", true); + jsonObject.put("data", new org.json.JSONObject(workFlowApprovalAuthorization)); + String jsonString = jsonObject.toString(); + StrutsResponseUtils.output(true, jsonString); + } + } catch (Exception e) { + e.printStackTrace(); + StrutsResponseUtils.output(false, "加载流程审批授权失败!"); + } + } + + + /** + * 删除流程 + */ + public void deleteWorkFlowApprovalAuthorization() { + StrutsParamUtils.getResponse().setCharacterEncoding("UTF-8"); + String ids = StrutsParamUtils.getPraramValue("ids", ""); + try { + String[] idArray = ids.split(";"); + List idList = Arrays.asList(idArray); + workFlowApprovalAuthorizationManager.deleteWorkFlowApprovalAuthorizationByIds(idList); + StrutsResponseUtils.output(true, "刪除成功"); + } catch (Exception e) { + e.printStackTrace(); + StrutsResponseUtils.output(false, e.getMessage()); + } + } +} Index: forgon-core/src/main/java/com/forgon/workflow/service/WorkFlowApprovalTaskManager.java =================================================================== diff -u -r22461 -r23468 --- forgon-core/src/main/java/com/forgon/workflow/service/WorkFlowApprovalTaskManager.java (.../WorkFlowApprovalTaskManager.java) (revision 22461) +++ forgon-core/src/main/java/com/forgon/workflow/service/WorkFlowApprovalTaskManager.java (.../WorkFlowApprovalTaskManager.java) (revision 23468) @@ -130,6 +130,10 @@ * @return */ public JSONObject loadFinishedApprovalTaskList(String startDateSearch, String endDateSearch, String approvalResult); - - + + /** + * 根据流程定义节点待执行人的待办任务生成该执行人下被授权有效用户的待办任务 + * @param workFlowApprovalTask + */ + public void createWorkFlowApprovalTask_Authorization(WorkFlowApprovalTask wFTaskForNodeDefinition); } Index: ssts-web/src/main/webapp/systemmanage/workFlow/workFlowAuthorize/workFlowAuthorizationAuthorizationForm.js =================================================================== diff -u --- ssts-web/src/main/webapp/systemmanage/workFlow/workFlowAuthorize/workFlowAuthorizationAuthorizationForm.js (revision 0) +++ ssts-web/src/main/webapp/systemmanage/workFlow/workFlowAuthorize/workFlowAuthorizationAuthorizationForm.js (revision 23468) @@ -0,0 +1,306 @@ +function deleteItem(nodeDefinitionName,nodeDefinitionSequenceNumber){ + var nodes = nodeDefinitionsStore.getRootNode().childNodes; + var items = []; + for (var i=0; i validityEndDate){ + showResult('开始时间不能大于结束时间!'); + return false; + } + var windowObj = top.Ext4.getCmp('workFlowAuthorizationWindow'); + var msgBox = new top.Ext4.window.MessageBox(); + //提交前,先将允许的申请人员的前缀"USERID_"去掉 + var authorizedUserIds = top.Ext4.getCmp("authorizedUserIds").getValue().replace(/USERID_/g,""); + top.Ext4.getCmp("authorizedUserIds").setValue(authorizedUserIds);//(添加时:选择后用户获得的是工号) + //根据名字判断是否授权等于被授权 + var authorizerName = top.Ext4.getCmp("authorizerUserName").getValue(); + var array = top.Ext4.getCmp("authorizedUserNames").getValue().split(";"); + for(j = 0;j < array.length;j++){ + if(authorizerName == array[j]){ + showResult(authorizerName+'不能授权给'+array[j]); + return false; + } + } +// console.log(top.Ext4.getCmp("authorizedUserIds").getValue()); + msgBox.confirm({ + title: '温馨提示', + padding: '0 10 10 10', + msg: '请确认保存?', + fn: function(btn){ + if (btn == 'yes'){ + top.Ext4.getCmp('saveBtn').disable(); + formObj.form.submit({ + url : WWWROOT + + '/disinfectSystem/workFlowApprovalAuthorizationAction!save.do', + method : 'POST', + waitMsg : '正在保存数据,请稍候', + waitTitle : '提交表单', +// params : { }, + success : function(form, action) { + windowObj.close(); + grid.reloadData(); + showResult(action.result.message); + }, + failure : function(form, action) { + top.Ext4.getCmp('saveBtn').enable(); + showResult(action.result.message); + } + }); + } + }, + buttons: top.Ext4.Msg.YESNO, + icon: top.Ext4.Msg.QUESTION + }); + } + + /** + * 若有id就加载数据 + */ + if (id) { + top.Ext4.Ajax.request({ + url : WWWROOT + + '/disinfectSystem/workFlowApprovalAuthorizationAction!workFlowApprovalAuthorizationById.do', + params : {id : id}, + success : function(response, options) { + var result = top.Ext4.decode(response.responseText); +// console.log(result); + if (result && result.success) { + top.Ext4.getCmp('id').setValue(result.message.data["id"]); + top.Ext4.getCmp('authorizerUserId').setValue(result.message.data["authorizerUserId"]);//授权id + top.Ext4.getCmp('authorizerUserName').setValue(result.message.data["authorizerUserName"]);//授权名字 + var startDate = result.message.data["validityStartDate"];//有效开始时间 + top.Ext4.getCmp('validityStartDate').setValue(convertDateFromString(startDate)) + var endDate = result.message.data["validityEndDate"];//有效结束时间 + top.Ext4.getCmp('validityEndDate').setValue(convertDateFromString(endDate)); + top.Ext4.getCmp('authorizedUserIds').setValue(result.message.data["authorizedUserId"]); + top.Ext4.getCmp('authorizedUserNames').setValue(result.message.data["authorizedUserName"]); + }else{ + showResult("加载失败!"); + } + }, + failure : function(response, options) { + showResult("加载失败!"); + } + }); + } + + /** + * 获得被授权用户 + */ + function openExt4SelectUser(){ + var userIdsElement; + var userNamesElement; + userIdsElement = top.Ext4.getCmp("authorizedUserIds"); + userNamesElement = top.Ext4.getCmp("authorizedUserNames"); + var arg = {}; + arg.userIds = userIdsElement.getValue(); + arg.userNames = userNamesElement.getValue(); + + arg.userIdsArray = arg.userIds.split(";"); + arg.userNamesArray = arg.userNames.split(";"); + arg.action = 'includeUsers'; + var selectedUsersArray = openModalWindow(WWWROOT+'/common/selPersonByOrgUnitByExt.jsp', arg, '700', '430'); + var userIds = ''; + var userNames = ''; + if(selectedUsersArray != null){ + if (selectedUsersArray.length > 0){ + for(var i = 0;i 1) { + showResult("一次只能修改一条记录!"); + return false; + } + var id = records[0].data['id']; + addAndEditWorkFlow(id); + grid.getSelectionModel().deselectAll();// grid reload() 后,getSelectionModel()不变 + +} + + +function deleteAuthorization(grid) { + var records = grid.getSelectionModel().selected.items; + if (records.length == 0) { + showResult("请选择要删除的记录!"); + return false; + } + var ids = null; + for (var i = 0, len = records.length; i < len; i++) { + if (ids == null) { + ids = records[i].data['id']; + } else { + ids = ids + ';' + records[i].data['id']; + } + } + top.Ext4.Msg.confirm("请确认","是否确定要删除选中的记录?", + function(button) { + if ('yes' == button) {Ext4.Ajax.request({ + url : WWWROOT+ '/disinfectSystem/workFlowApprovalAuthorizationAction!deleteWorkFlowApprovalAuthorization.do', + params:{ids:ids}, + success : function(response, options) { + var result = Ext4.decode(response.responseText); + if (result && result.success) { + showResult('删除成功!'); + grid.reloadData(); + grid.getSelectionModel().deselectAll(); + }else{ + showResult(result.message); + } + }, + failure : function(response, options) { + showResult('删除失败!'); + } + }); + } + }); +} + +function renderWorkFlowName(v, p, record) { + var str = "" + v + ""; + return str; +} + +Ext4.onReady(function() { + var fields = [ { + name : 'id', + mapping : 'id' + }, { + name : 'authorizerUserName', + mapping : 'authorizerUserName' + }, { + name : 'authorizedUserName', + mapping : 'authorizedUserName' + }, { + name : 'validityStartDate', + mapping : 'validityStartDate' + }, { + name : 'validityEndDate', + mapping : 'validityEndDate' + }, { + name : 'operatorName', + mapping : 'operatorName' + }, { + name : 'operatorDate', + mapping : 'operatorDate' + } ]; + + var columns = [ { + header : "授权用户", + dataIndex : 'authorizerUserName', + width : 150, + minWidth : 150, + maxWidth : 250, + filterable : true, + filter : { + type : 'string' + }, + renderer : renderWorkFlowName + }, { + header : "被授权用户", + dataIndex : 'authorizedUserName', + width : 150, + minWidth : 150, + maxWidth : 250, + filterable : true, + filter : { + type : 'string' + } + }, { + header : "有效开始时间", + dataIndex : 'validityStartDate', + width : 200, + minWidth : 200, + filterable : true, + filter : { + type : 'date' + }, + renderer : rendererTransitionTime + }, { + header : "有效结束时间", + dataIndex : 'validityEndDate', + width : 200, + minWidth : 200, + filterable : true, + filter : { + type : 'date' + }, + renderer : rendererTransitionTime + }, { + header : "创建人", + dataIndex : 'operatorName', + width : 150, + minWidth : 150, + filterable : true, + filter : { + type : 'string' + } + }, { + header : "创建时间", + dataIndex : 'operatorDate', + width : 200, + minWidth : 200, + filterable : true, + filter : { + type : 'date' + }, + renderer : rendererTransitionTime + } ]; + + grid = Ext4.create('ExtJs.forgon4.Grid', { + title : workFlowListEntityName, + dataUrl : WWWROOT + + '/disinfectSystem/workFlowApprovalAuthorizationAction!loadWorkFlowApprovalAuthorizationList.do', + fields : fields, + columns : columns, + sorters : { + property : 'authorizerUserName', + direction : 'DESC' + }, + extraParams : {}, // 如果你要自定义参数,这里一定要先给一个空的对象,要不然会报空异常 + showRightClick : false, + tbar : [ { + text : '添加', + iconCls : 'btn_add', + handler : function() { + addAndEditWorkFlow(); + } + }, '-', { + text : '修改', + iconCls : 'btn_edit', + handler : function() { + loadFormDataAndUpdate(grid); + } + }, '-', { + text : '删除', + iconCls : 'btn_delete', + handler : function() { + deleteAuthorization(grid); + } + } ] + }); + + var viewport = Ext4.create('Ext4.Viewport', { + layout : 'fit', + items : grid + }); +}); Index: forgon-core/src/main/java/com/forgon/log/model/Log.java =================================================================== diff -u -r22702 -r23468 --- forgon-core/src/main/java/com/forgon/log/model/Log.java (.../Log.java) (revision 22702) +++ forgon-core/src/main/java/com/forgon/log/model/Log.java (.../Log.java) (revision 23468) @@ -59,6 +59,7 @@ public static final String MODEL_PRINT = "打印"; public static final String MODEL_MATERIALDEFINITION = "材料定义"; public static final String MODEL_EXPENSIVEGOODS = "高值耗材"; + public static final String MODEL_WORKFLOW = "流程定义"; public static final String MODEL_USER = "用户定义"; public static final String MODEL_GoodsBinding = "物品绑定"; Index: ssts-web/src/main/webapp/homepage/menuconfigure.js =================================================================== diff -u -r23429 -r23468 --- ssts-web/src/main/webapp/homepage/menuconfigure.js (.../menuconfigure.js) (revision 23429) +++ ssts-web/src/main/webapp/homepage/menuconfigure.js (.../menuconfigure.js) (revision 23468) @@ -689,6 +689,7 @@ {hidden :SSTS_UrgentLevel_manager,text:"加急级别管理",href:WWWROOT+'/disinfectsystem/basedatamanager/urgentLevel/urgentLevelView.jsp',hrefTarget:linkTarget,leaf:true}, {hidden :SSTS_OperationRoom_manager,text:"手术间管理",href:WWWROOT+'/disinfectsystem/basedatamanager/operationRoom/operationRoom.jsp',hrefTarget:linkTarget,leaf:true}, {hidden :SSTS_ExpensiveGoods_Hidden_Menu || SSTS_ExpensiveGoodsWorkFlow_Hidden_Manager,text:"流程定义管理",href:WWWROOT+'/systemmanage/workFlow/workFlow.jsp',hrefTarget:linkTarget,leaf:true}, + {hidden :SSTS_ExpensiveGoods_Hidden_Menu || SSTS_ExpensiveGoodsWorkFloAuthorization_Hidden_Manager,text:"流程审批权限代理配置",href:WWWROOT+'/systemmanage/workFlow/workFlowAuthorize/workFlowApprovalAuthorization.jsp',hrefTarget:linkTarget,leaf:true}, {hidden :SSTS_UsedDoctor_manager,text:"常用医生设置",href:WWWROOT+'/disinfectsystem/basedatamanager/commonlyUsedDoctor/comUsedDoctorView.jsp',hrefTarget:linkTarget,leaf:true}, {hidden :SSTS_Handover_manager,text:"交接模块管理",href:WWWROOT+'/disinfectsystem/basedatamanager/handover/handoverView.jsp',hrefTarget:linkTarget,leaf:true}, {hidden :SSTS_SupplyRoomType_manager,text:"科室供应室设置",href:WWWROOT+'/disinfectsystem/basedatamanager/supplyroomtype/supplyRoomTypeView.jsp?editMode=true',hrefTarget:linkTarget,leaf:true} Index: ssts-web/src/main/webapp/expensivegoodshomepage/menuconfigure.js =================================================================== diff -u -r23429 -r23468 --- ssts-web/src/main/webapp/expensivegoodshomepage/menuconfigure.js (.../menuconfigure.js) (revision 23429) +++ ssts-web/src/main/webapp/expensivegoodshomepage/menuconfigure.js (.../menuconfigure.js) (revision 23468) @@ -56,6 +56,7 @@ {hidden :SSTS_ExpensiveGoods_Hidden_Menu,text:"高值耗材类型设置",href:WWWROOT+'/systemmanage/httpOption.mhtml?listId=expensiveGoodsType',hrefTarget:linkTarget,leaf:true}, {hidden :SSTS_ExpensiveGoodsSupplier_Hidden_Menu,text:"高值耗材供应商管理",href:WWWROOT+'/disinfectsystem/basedatamanager/supplier/expensiveGoodsSupplierView.jsp?editMode=true',hrefTarget:linkTarget,leaf:true}, {hidden :SSTS_ExpensiveGoods_Hidden_Menu || SSTS_ExpensiveGoodsWorkFlow_Hidden_Manager,text:"流程定义管理",href:WWWROOT+'/systemmanage/workFlow/workFlow.jsp',hrefTarget:linkTarget,leaf:true} + {hidden :SSTS_ExpensiveGoods_Hidden_Menu || SSTS_ExpensiveGoodsWorkFloAuthorization_Hidden_Manager,text:"流程审批权限代理配置",href:WWWROOT+'/systemmanage/workFlow/workFlowAuthorize/workFlowApprovalAuthorization.jsp',hrefTarget:linkTarget,leaf:true} ] },{ text:"个人设置", Index: ssts-web/src/main/resources/systemset/operationDefine.xml =================================================================== diff -u -r23429 -r23468 --- ssts-web/src/main/resources/systemset/operationDefine.xml (.../operationDefine.xml) (revision 23429) +++ ssts-web/src/main/resources/systemset/operationDefine.xml (.../operationDefine.xml) (revision 23468) @@ -599,6 +599,7 @@ + Index: forgon-core/src/main/java/com/forgon/workflow/service/WorkFlowApprovalTaskManagerImpl.java =================================================================== diff -u -r23455 -r23468 --- forgon-core/src/main/java/com/forgon/workflow/service/WorkFlowApprovalTaskManagerImpl.java (.../WorkFlowApprovalTaskManagerImpl.java) (revision 23455) +++ forgon-core/src/main/java/com/forgon/workflow/service/WorkFlowApprovalTaskManagerImpl.java (.../WorkFlowApprovalTaskManagerImpl.java) (revision 23468) @@ -7,6 +7,7 @@ import java.util.ArrayList; import java.util.Date; import java.util.List; +import java.util.stream.Collectors; import org.apache.commons.lang.StringUtils; @@ -26,6 +27,7 @@ import com.forgon.util.ExtGridUtils; import com.forgon.workflow.model.NodeApproval; import com.forgon.workflow.model.NodeDefinition; +import com.forgon.workflow.model.WorkFlowApprovalAuthorization; import com.forgon.workflow.model.WorkFlowApprovalTask; import com.forgon.workflow.vo.WorkFlowApprovalTaskVO; @@ -38,7 +40,18 @@ private DateQueryAdapter dateQueryAdapter; private NodeDefinitionManager nodeDefinitionManager; - + + private WorkFlowApprovalAuthorizationManager workFlowApprovalAuthorizationManager; + + public WorkFlowApprovalAuthorizationManager getWorkFlowApprovalAuthorizationManager() { + return workFlowApprovalAuthorizationManager; + } + + public void setWorkFlowApprovalAuthorizationManager( + WorkFlowApprovalAuthorizationManager workFlowApprovalAuthorizationManager) { + this.workFlowApprovalAuthorizationManager = workFlowApprovalAuthorizationManager; + } + public void setDbConnection(InitDbConnection dbConnection) { this.dbConnection = dbConnection; } @@ -94,7 +107,9 @@ List workFlowApprovalTaskList=new ArrayList(); //工单id不为空,则获取该工单id对应的待办任务,为了前台不传空值,当为空的时候,赋值为0 if(DatabaseUtil.isPoIdValid(formId)){ - workFlowApprovalTaskList=objectDao.findByProperty(WorkFlowApprovalTask.class.getSimpleName(), "formId", formId); +// workFlowApprovalTaskList=objectDao.findByProperty(WorkFlowApprovalTask.class.getSimpleName(), "formId", formId); + String sql = String.format("where po.formId = %s and (po.handlerId = po.userId or po.handlerId is NUll)", formId); + workFlowApprovalTaskList=objectDao.findBySql(WorkFlowApprovalTask.class.getSimpleName(),sql); if(workFlowApprovalTaskList.size()>0){ JSONObject jSONObject=new JSONObject(); for(WorkFlowApprovalTask workFlowApprovalTask:workFlowApprovalTaskList){ @@ -128,7 +143,12 @@ return jSONArray; } - //处理当前待办任务操作 + /** + * 处理当前待办任务操作 + * @param workFlowApprovalTaskVO + * @param workFlowApprovalTask + * @return + */ private WorkFlowApprovalTask dealWorkFlowApprovalTask(WorkFlowApprovalTaskVO workFlowApprovalTaskVO,WorkFlowApprovalTask workFlowApprovalTask){ workFlowApprovalTask.setHandlerId(workFlowApprovalTaskVO.getHandlerId()); workFlowApprovalTask.setHandler(workFlowApprovalTaskVO.getHandler()); @@ -138,6 +158,7 @@ //设是否省平台产品,是否院内目录产品,是否平台授权配送企业 setWorkFlowApprovalTaskOPTION(workFlowApprovalTaskVO,workFlowApprovalTask); save(workFlowApprovalTask); + updateWorkFlowApprovalTask_Authorization(workFlowApprovalTask); return workFlowApprovalTask; } @@ -163,10 +184,71 @@ }; } + /** + * 根据节点执行人的待办任务生成该执行人下被授权有效用户的待办任务 + * @param workFlowApprovalTask + */ @Override + public void createWorkFlowApprovalTask_Authorization(WorkFlowApprovalTask wFTaskForNodeDefinition){ + Long authorizerUserId = wFTaskForNodeDefinition.getUserId(); + if(DatabaseUtil.isPoIdValid(authorizerUserId)){ + // 1、根据待处理人获得被授权的用户审批授权信息 + List wfaaList = workFlowApprovalAuthorizationManager.findValidityAuthorizationListByAuthorizerUserId(authorizerUserId); + for (WorkFlowApprovalAuthorization wfaa : wfaaList) { + // 2、创建被授权用户的待办任务表 + WorkFlowApprovalTask wFATaskForAuthorized = new WorkFlowApprovalTask(); + wFATaskForAuthorized.setUserId(wfaa.getAuthorizedUserId()); + wFATaskForAuthorized.setFormId(wFTaskForNodeDefinition.getFormId()); + wFATaskForAuthorized.setApprovalResult(wFTaskForNodeDefinition.getApprovalResult()); + wFATaskForAuthorized.setFormType(wFTaskForNodeDefinition.getFormType()); + wFATaskForAuthorized.setNodeDefinition(wFTaskForNodeDefinition.getNodeDefinition()); + wFATaskForAuthorized.setTaskName(wFTaskForNodeDefinition.getTaskName()); + wFATaskForAuthorized.setTitle(wFTaskForNodeDefinition.getTitle()); + wFATaskForAuthorized.setCreateTaskTime(wFTaskForNodeDefinition.getCreateTaskTime()); + wFATaskForAuthorized.setStatus(wFTaskForNodeDefinition.getStatus()); + wFATaskForAuthorized.setSerialNumber(wFTaskForNodeDefinition.getSerialNumber()); + wFATaskForAuthorized.setHandleDepart(wFTaskForNodeDefinition.getHandleDepart()); + wFATaskForAuthorized.setIsHospitalProduct(wFTaskForNodeDefinition.getIsHospitalProduct()); + wFATaskForAuthorized.setIsProvinceProduct(wFTaskForNodeDefinition.getIsProvinceProduct()); + wFATaskForAuthorized.setIsPlatformAuthorizedEnterprise(wFTaskForNodeDefinition.getIsPlatformAuthorizedEnterprise()); + wFATaskForAuthorized.setIsNodeDefinitionWorkFlowApprovalTask(false);//表示是被授权用户的待办任务 + objectDao.save(wFATaskForAuthorized); + } + } + } + + /** + * 同时修改授权的待办任务状态 + * + */ + private void updateWorkFlowApprovalTask_Authorization(WorkFlowApprovalTask wFTaskForNodeDefinition){ + // 1、根据已处理的待办任务的节点和申请单id获得待办的任务 + String sqlWhere = String.format("where po.formId = %s and po.nodeDefinition.id = %s and po.id<>%s" + , wFTaskForNodeDefinition.getFormId(),wFTaskForNodeDefinition.getNodeDefinition().getId(),wFTaskForNodeDefinition.getId()); + + List otherWorkFlowApprovalTaskList = objectDao.findBySql(WorkFlowApprovalTask.class.getSimpleName(), sqlWhere); + List ids = otherWorkFlowApprovalTaskList.stream().map(WorkFlowApprovalTask::getId).collect(Collectors.toList()); + List workFlowApprovalTaskListForUpdate = objectDao.findByIds_ForUpdate(WorkFlowApprovalTask.class.getSimpleName(), ids); + // 2、修改 + for (WorkFlowApprovalTask wFATaskUpdate : workFlowApprovalTaskListForUpdate) { + wFATaskUpdate.setNodeDefinition(wFTaskForNodeDefinition.getNodeDefinition()); + wFATaskUpdate.setHandleOpinion(wFTaskForNodeDefinition.getHandleOpinion()); + wFATaskUpdate.setHandlerId(wFTaskForNodeDefinition.getHandlerId()); + wFATaskUpdate.setHandler(wFTaskForNodeDefinition.getHandler()); + wFATaskUpdate.setHandleTime(wFTaskForNodeDefinition.getHandleTime()); + wFATaskUpdate.setApprovalResult(wFTaskForNodeDefinition.getApprovalResult()); + wFATaskUpdate.setIsHospitalProduct(wFTaskForNodeDefinition.getIsHospitalProduct()); + wFATaskUpdate.setIsProvinceProduct(wFTaskForNodeDefinition.getIsProvinceProduct()); + wFATaskUpdate.setIsPlatformAuthorizedEnterprise(wFTaskForNodeDefinition.getIsPlatformAuthorizedEnterprise()); + wFATaskUpdate.setStatus(1); + objectDao.saveOrUpdate(wFATaskUpdate); + } + } + + @Override public void confirmNoticeWorkFlowApprovalTask(WorkFlowApprovalTaskVO workFlowApprovalTaskVO) { WorkFlowApprovalTask workFlowApprovalTask = getForUpdate(workFlowApprovalTaskVO.getWorkFlowApprovalTaskId()); - if(workFlowApprovalTask != null){ + if(workFlowApprovalTask != null || workFlowApprovalTask.getStatus() != 1){ //当前节点 NodeDefinition nodeDefinition = nodeDefinitionManager.get(workFlowApprovalTaskVO.getNodeDefinitionId()+""); //获取下一个节点 @@ -204,6 +286,8 @@ nextWorkFlowApprovalTask.setUserId(userId); } save(nextWorkFlowApprovalTask); + //根据节点执行人的待办任务生成该执行人下被授权有效用户的待办任务 + createWorkFlowApprovalTask_Authorization(nextWorkFlowApprovalTask); } } }else{ @@ -216,7 +300,8 @@ WorkFlowApprovalTaskVO workFlowApprovalTaskVO) { Long workFlowApprovalTaskId = workFlowApprovalTaskVO.getWorkFlowApprovalTaskId(); WorkFlowApprovalTask workFlowApprovalTask = getForUpdate(workFlowApprovalTaskId); - if(workFlowApprovalTask != null){ + //可能并发操作先被其他被授权用户先处理 + if(workFlowApprovalTask != null || workFlowApprovalTask.getStatus() != 1){ //如果是当前节点为空 if (DatabaseUtil.isPoIdValid(workFlowApprovalTaskVO.getNodeDefinitionId())) { //当前节点 @@ -258,6 +343,8 @@ setWorkFlowApprovalTaskOPTION(workFlowApprovalTaskVO,nextWorkFlowApprovalTask); //保存 save(nextWorkFlowApprovalTask); + //根据节点执行人的待办任务生成该执行人下被授权有效用户的待办任务 + createWorkFlowApprovalTask_Authorization(nextWorkFlowApprovalTask); } } }else{ @@ -406,7 +493,7 @@ */ public void failWorkFlowApprovalTask(WorkFlowApprovalTaskVO workFlowApprovalTaskVO) { WorkFlowApprovalTask workFlowApprovalTask=getForUpdate(workFlowApprovalTaskVO.getWorkFlowApprovalTaskId()); - if(workFlowApprovalTask!=null){ + if(workFlowApprovalTask!=null || workFlowApprovalTask.getStatus() !=1){ workFlowApprovalTask.setHandleOpinion(workFlowApprovalTaskVO.getHandleOpinion()); workFlowApprovalTask=dealWorkFlowApprovalTask(workFlowApprovalTaskVO,workFlowApprovalTask); @@ -441,7 +528,7 @@ @Override public void rollBackWorkFlowApprovalTask(WorkFlowApprovalTaskVO workFlowApprovalTaskVO) { WorkFlowApprovalTask workFlowApprovalTask=getForUpdate(workFlowApprovalTaskVO.getWorkFlowApprovalTaskId()); - if(workFlowApprovalTask!=null){ + if(workFlowApprovalTask!=null || workFlowApprovalTask.getStatus() !=1){ //获取上一个节点 NodeDefinition lastNodeDefinition=nodeDefinitionManager.getLastNodeDefinition(workFlowApprovalTaskVO.getNodeDefinitionId()); workFlowApprovalTask.setHandleOpinion(workFlowApprovalTaskVO.getHandleOpinion()); @@ -490,6 +577,10 @@ //设是否省平台产品,是否院内目录产品,是否平台授权配送企业 setWorkFlowApprovalTaskOPTION(workFlowApprovalTaskVO,newWorkFlowApprovalTask); save(newWorkFlowApprovalTask); + if(lastNodeDefinition != null){ + //根据节点执行人的待办任务生成该执行人下被授权有效用户的待办任务 + createWorkFlowApprovalTask_Authorization(newWorkFlowApprovalTask); + } }else{ throw new RuntimeException("待办任务已经被处理了"); } @@ -507,7 +598,7 @@ public void submitWorkFlowApprovalTask( WorkFlowApprovalTaskVO workFlowApprovalTaskVO) { WorkFlowApprovalTask workFlowApprovalTask=getForUpdate(workFlowApprovalTaskVO.getWorkFlowApprovalTaskId()); - if(workFlowApprovalTask!=null){ + if(workFlowApprovalTask!=null || workFlowApprovalTask.getStatus() !=1){ workFlowApprovalTask.setStatus(1); workFlowApprovalTask.setApprovalResult(WorkFlowApprovalTask.APPROVALRESULT_SUBMIT); workFlowApprovalTask.setHandleTime(new Date()); @@ -544,10 +635,10 @@ //2、获取当前用户对应的已办任务数据,关联的高值耗材申请数据 :与handlerId匹配; String select = " select po.id,po.formId,po.formType,po.title,po.createTaskTime,po.taskName,po.handleOpinion,po.handleTime,po.approvalResult,po.nodeDefinition_id " - + ",ip.depart,exIp.patient,exIp.hospitalNumber,exIp.doctor,exIp.operationTime " + + ",ip.depart,ip.patient,ip.hospitalNumber,exIp.doctor,exIp.operationTime " + "from WorkFlowApprovalTask po " + "left join ExpensiveGoodsApplication exIp on po.formId = exIp.id join InvoicePlan ip on exIp.id = ip.id "; - String where =" where po.status = 1 and po.handlerId ="+userId; + String where =" where po.status = 1 and po.handlerId ="+userId + " and po.handlerId = po.userId"; //转化为起始时间的00:00:00,到截止时间的最后一秒23:59:59 if (StringUtils.isNotBlank(startDateSearch) @@ -593,7 +684,7 @@ StringBuilder select=new StringBuilder(); // select.append("select w.id,w.formId,w.formType,w.title,w.createTaskTime,w.taskName,w.handleDepart,w.serialNumber,w.approvalResult,w.nodeDefinition_id,w.roleId,w.userId,u.fullName userName,r.descn roleName"); select.append("select w.*,u.fullName userName,r.descn roleName"); - select.append(" ,ip.depart,exIp.patient,exIp.hospitalNumber,exIp.doctor,exIp.operationTime ");//高值耗材申请单数据 + select.append(" ,ip.depart,ip.patient,ip.hospitalNumber,exIp.doctor,exIp.operationTime ");//高值耗材申请单数据 select.append(" from WorkFlowApprovalTask w left join SS_USERS u on w.userId=u.id left join SS_ROLES r on r.id=w.roleId"); select.append(" left join ExpensiveGoodsApplication exIp on w.formId = exIp.id join InvoicePlan ip on exIp.id = ip.id ");//关联申请单 //2.1状态为未处理 2.2当前用户存在于userid 或者 记录存储的角色id存在于当前用户对应角色列表 Index: ssts-web/src/main/webapp/expensivegoodshomepage/menu.jsp =================================================================== diff -u -r23429 -r23468 --- ssts-web/src/main/webapp/expensivegoodshomepage/menu.jsp (.../menu.jsp) (revision 23429) +++ ssts-web/src/main/webapp/expensivegoodshomepage/menu.jsp (.../menu.jsp) (revision 23468) @@ -1265,6 +1265,12 @@ SSTS_ExpensiveGoodsWorkFlow_Hidden_Manager = false; +//高值耗材流程审批授权管理 +var SSTS_ExpensiveGoodsWorkFloAuthorization_Hidden_Manager = true; + +SSTS_ExpensiveGoodsWorkFloAuthorization_Hidden_Manager = false; + + /* 高值耗材 */ /** Index: forgon-core/src/main/java/com/forgon/workflow/service/WorkFlowApprovalAuthorizationManager.java =================================================================== diff -u --- forgon-core/src/main/java/com/forgon/workflow/service/WorkFlowApprovalAuthorizationManager.java (revision 0) +++ forgon-core/src/main/java/com/forgon/workflow/service/WorkFlowApprovalAuthorizationManager.java (revision 23468) @@ -0,0 +1,44 @@ +package com.forgon.workflow.service; + +import java.util.List; + +import net.sf.json.JSONArray; + +import com.forgon.directory.model.OrgUnit; +import com.forgon.security.model.Role; +import com.forgon.security.model.User; +import com.forgon.tools.hibernate.BasePoManager; +import com.forgon.workflow.model.NodeApproval; +import com.forgon.workflow.model.NodeDefinition; +import com.forgon.workflow.model.WorkFlow; +import com.forgon.workflow.model.WorkFlowApprovalAuthorization; + + +/** + * + * @author YanWeiNing + * + */ +public interface WorkFlowApprovalAuthorizationManager extends BasePoManager{ + + public WorkFlowApprovalAuthorization getWorkFlowApprovalAuthorizationById(String id); + + public void saveWorkFlowApprovalAuthorization(WorkFlowApprovalAuthorization workFlowApprovalAuthorization,List authorizedUserIdsList); + + /** + * 修改审批权限的有效时间段 + * @param workFlowApprovalAuthorization + */ + public void updateWorkFlowApprovalAuthorizationValidityTime(WorkFlowApprovalAuthorization workFlowApprovalAuthorization); + + public void deleteWorkFlowApprovalAuthorizationByIds(List ids); + + /** + * 获得授权用户下的被授权用户数据 + * @param AuthorizerUserId + * @return List + */ + public List findValidityAuthorizationListByAuthorizerUserId(Long AuthorizerUserId); + + +} Index: ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/expensivegoodsapplication/service/ExpensiveGoodsApplicationManagerImpl.java =================================================================== diff -u -r23460 -r23468 --- ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/expensivegoodsapplication/service/ExpensiveGoodsApplicationManagerImpl.java (.../ExpensiveGoodsApplicationManagerImpl.java) (revision 23460) +++ ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/expensivegoodsapplication/service/ExpensiveGoodsApplicationManagerImpl.java (.../ExpensiveGoodsApplicationManagerImpl.java) (revision 23468) @@ -42,8 +42,10 @@ import com.forgon.tools.util.ForgonDateUtils; import com.forgon.tools.util.SqlUtils; import com.forgon.workflow.model.NodeDefinition; +import com.forgon.workflow.model.WorkFlowApprovalAuthorization; import com.forgon.workflow.model.WorkFlowApprovalTask; import com.forgon.workflow.service.NodeDefinitionManager; +import com.forgon.workflow.service.WorkFlowApprovalAuthorizationManager; import com.forgon.workflow.service.WorkFlowApprovalTaskManager; import com.forgon.workflow.vo.WorkFlowApprovalTaskVO; @@ -219,6 +221,8 @@ } } objectDao.saveOrUpdate(workFlowApprovalTask); + // 生成该节点的用户下被授权的待办任务 + workFlowApprovalTaskManager.createWorkFlowApprovalTask_Authorization(workFlowApprovalTask); } } Index: forgon-core/src/main/java/com/forgon/workflow/service/WorkFlowApprovalAuthorizationManagerImpl.java =================================================================== diff -u --- forgon-core/src/main/java/com/forgon/workflow/service/WorkFlowApprovalAuthorizationManagerImpl.java (revision 0) +++ forgon-core/src/main/java/com/forgon/workflow/service/WorkFlowApprovalAuthorizationManagerImpl.java (revision 23468) @@ -0,0 +1,232 @@ +package com.forgon.workflow.service; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Collections; +import java.util.Date; +import java.util.List; + +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang.StringUtils; + +import net.sf.json.JSONArray; +import net.sf.json.JSONObject; + +import com.forgon.Constants; +import com.forgon.databaseadapter.service.DateQueryAdapter; +import com.forgon.directory.acegi.tools.AcegiHelper; +import com.forgon.directory.vo.LoginUserData; +import com.forgon.entity.ExtJsEntity; +import com.forgon.log.model.Log; +import com.forgon.log.service.LogManager; +import com.forgon.security.model.User; +import com.forgon.tools.date.DateTools; +import com.forgon.tools.db.DatabaseUtil; +import com.forgon.tools.db.InitDbConnection; +import com.forgon.tools.hibernate.BasePoManagerImpl; +import com.forgon.tools.hibernate.ObjectDao; +import com.forgon.tools.util.ExtJsUtil; +import com.forgon.tools.util.ForgonDateUtils; +import com.forgon.tools.util.SqlUtils; +import com.forgon.util.ExtGridUtils; +import com.forgon.workflow.model.NodeApproval; +import com.forgon.workflow.model.NodeDefinition; +import com.forgon.workflow.model.WorkFlow; +import com.forgon.workflow.model.WorkFlowApprovalAuthorization; +import com.forgon.workflow.model.WorkFlowApprovalTask; +import com.forgon.workflow.vo.WorkFlowApprovalTaskVO; + +public class WorkFlowApprovalAuthorizationManagerImpl extends BasePoManagerImpl implements WorkFlowApprovalAuthorizationManager{ + + private ExtGridUtils extGridUtils; + + private InitDbConnection dbConnection; + + private DateQueryAdapter dateQueryAdapter; + + private LogManager appLogManager; + + public void setDbConnection(InitDbConnection dbConnection) { + this.dbConnection = dbConnection; + } + + public void setExtGridUtils(ExtGridUtils extGridUtils) { + this.extGridUtils = extGridUtils; + } + + public void setDateQueryAdapter(DateQueryAdapter dateQueryAdapter) { + this.dateQueryAdapter = dateQueryAdapter; + } + + public void setAppLogManager(LogManager appLogManager) { + this.appLogManager = appLogManager; + } + + @Override + public WorkFlowApprovalAuthorization getWorkFlowApprovalAuthorizationById(String id) { + return (WorkFlowApprovalAuthorization) objectDao.getByID_ForUpdate(WorkFlowApprovalAuthorization.class.getSimpleName(),id); + } + + @Override + public void saveWorkFlowApprovalAuthorization(WorkFlowApprovalAuthorization workFlowApprovalAuthorization,List authorizedUserIdsList) { + if(CollectionUtils.isNotEmpty(authorizedUserIdsList)){ + Long authorizerUserId = workFlowApprovalAuthorization.getAuthorizerUserId(); + if(DatabaseUtil.isPoIdValid(authorizerUserId)){ + // 2、检查授权开始时间和结束时间 + Date validityStartDate = workFlowApprovalAuthorization.getValidityStartDate(); + Date validityEndDate = workFlowApprovalAuthorization.getValidityEndDate(); + if(validityStartDate == null || validityEndDate == null){ + throw new RuntimeException("授权的有效开始时间和结束时间不能为空!"); + } + if(validityStartDate.compareTo(validityEndDate) == 1){ + throw new RuntimeException(String.format("授权的有效开始时间:%s不能大于有效结束时间:%s", validityStartDate,validityEndDate)); + } + // 3、获得授权用户对象 + User authorizerUser = (User) objectDao.getByProperty(User.class.getSimpleName(), "id", authorizerUserId); + if(authorizerUser == null){ + throw new RuntimeException("根据授权用户id:"+authorizerUserId+"获取不到用户对象!"); + } + // 4、获得被授权用户集合 + List authorizedUserList = new ArrayList(); + List authorizedUserIdList = new ArrayList<>(); + for (String authorizedUserIdStr : authorizedUserIdsList) { + User authorizeredUser = (User) objectDao.getByProperty(User.class.getSimpleName(), "name", authorizedUserIdStr); + if(authorizeredUser != null){ + authorizedUserList.add(authorizeredUser); + authorizedUserIdList.add(authorizeredUser.getId()); + }else{ + throw new RuntimeException("根据被授权用户id:"+authorizedUserIdStr+"获取不到用户对象!"); + } + } + // 1、检查授权用户是否授权给自己 + if(authorizedUserIdList.contains(authorizerUserId)){ + throw new RuntimeException("授权用户不能授权给自己!"); + } + // 5、检查是否有相同的审批授权(根据是否有相同的授权人和被授权人) + String sql = String.format("select count(*) from WorkFlowApprovalAuthorization po where po.authorizerUserId =%s and %s ", + authorizerUser.getId(),SqlUtils.getStringFieldInCollectionsPredicate("po.authorizedUserId", authorizedUserIdList)); + if(objectDao.countBySql(sql) > 0){ + throw new RuntimeException("已存在相同的授权记录!"); + } + // 6、根据被授权用户创建授权表 + for (User authorizeredUser : authorizedUserList) { + WorkFlowApprovalAuthorization newWFAAuthorization = new WorkFlowApprovalAuthorization(); + newWFAAuthorization.setOperatorName(AcegiHelper.getLoginUser().getUserFullName()); + newWFAAuthorization.setOperatorId(AcegiHelper.getLoginUser().getUserId()); + newWFAAuthorization.setOperatorDate(new Date()); + newWFAAuthorization.setAuthorizerUserId(authorizerUser.getId());//授权用户id + newWFAAuthorization.setAuthorizerUserName(authorizerUser.getFullName());//授权用户名称 + newWFAAuthorization.setAuthorizedUserId(authorizeredUser.getId());//被授权用户id + newWFAAuthorization.setAuthorizedUserName(authorizeredUser.getFullName());//被授权用户名字 + newWFAAuthorization.setValidityStartDate(validityStartDate);//开始时间 + newWFAAuthorization.setValidityEndDate(validityEndDate);//结束时间 + // 6.保存 + objectDao.save(newWFAAuthorization); + } + }else{ + throw new RuntimeException("授权用户参数:"+authorizerUserId+"有误!"); + } + }else{ + throw new RuntimeException("被授权用户不能为空!"); + } + + } + + @Override + public void updateWorkFlowApprovalAuthorizationValidityTime(WorkFlowApprovalAuthorization workFlowApprovalAuthorization) { + Long id = workFlowApprovalAuthorization.getId(); + Date validityStartDate = workFlowApprovalAuthorization.getValidityStartDate(); + Date validityEndDate = workFlowApprovalAuthorization.getValidityEndDate(); + if(DatabaseUtil.isPoIdValid(id)){ + // 1、根据id获得审批授权 + WorkFlowApprovalAuthorization woFAAuthorizationForUpdate = (WorkFlowApprovalAuthorization) objectDao.getByID_ForUpdate(WorkFlowApprovalAuthorization.class.getSimpleName(),id); + if(woFAAuthorizationForUpdate == null ){ + throw new RuntimeException("该审批授权表已被删除!"); + } + // 2、记录修改前的审批授权 + WorkFlowApprovalAuthorization wFAAuthorizationForClone = cloneWorkFlowApprovalAuthorization(woFAAuthorizationForUpdate); + // 3、 修改授权有效日期,操作人 + woFAAuthorizationForUpdate.setOperatorName(AcegiHelper.getLoginUser().getUserFullName()); + woFAAuthorizationForUpdate.setOperatorId(AcegiHelper.getLoginUser().getUserId()); + woFAAuthorizationForUpdate.setOperatorDate(new Date()); + woFAAuthorizationForUpdate.setValidityStartDate(validityStartDate);//开始有效时间 + woFAAuthorizationForUpdate.setValidityEndDate(validityEndDate);//结束有效时间 + objectDao.saveOrUpdate(woFAAuthorizationForUpdate); + // 4、记日志 + writeWorkFlowApprovalAuthorizationUpdateLog(wFAAuthorizationForClone,woFAAuthorizationForUpdate); + }else{ + throw new RuntimeException("审批授权表的id:"+id+"无效!"); + } + } + + @Override + public void deleteWorkFlowApprovalAuthorizationByIds(List ids) { + for (String id : ids) { + if(DatabaseUtil.isPoIdValid(id)){ + //获得要删除的审批权限 + WorkFlowApprovalAuthorization wFAAForDelete = (WorkFlowApprovalAuthorization) objectDao.getByID_ForUpdate(WorkFlowApprovalAuthorization.class .getSimpleName(),id); + objectDao.delete(wFAAForDelete); + }else{ + throw new RuntimeException("参数有误:"+id); + } + } + } + + @SuppressWarnings("unchecked") + @Override + public List findValidityAuthorizationListByAuthorizerUserId(Long AuthorizerUserId) { + if(DatabaseUtil.isPoIdValid(AuthorizerUserId)){ + Date now = new Date(); + String sqlWhere = String.format("where po.authorizerUserId = %s and (po.validityStartDate <= %s and po.validityEndDate >= %s) " + ,AuthorizerUserId,dateQueryAdapter.dateAdapter(now),dateQueryAdapter.dateAdapter(now)); + return objectDao.findBySql(WorkFlowApprovalAuthorization.class.getSimpleName(), sqlWhere); + } + return null; + } + + /** + * 克隆审批授权 + * @param wFAAuthorization + * @return + */ + private WorkFlowApprovalAuthorization cloneWorkFlowApprovalAuthorization(WorkFlowApprovalAuthorization wFAAuthorization){ + WorkFlowApprovalAuthorization wFAAuthorizationForClone = new WorkFlowApprovalAuthorization(); + wFAAuthorizationForClone.setOperatorName(wFAAuthorization.getOperatorName()); + wFAAuthorizationForClone.setOperatorId(wFAAuthorization.getOperatorId()); + wFAAuthorizationForClone.setOperatorDate(wFAAuthorization.getOperatorDate()); + wFAAuthorizationForClone.setAuthorizerUserId(wFAAuthorization.getAuthorizerUserId());//授权用户id + wFAAuthorizationForClone.setAuthorizerUserName(wFAAuthorization.getAuthorizerUserName());//授权用户名称 + wFAAuthorizationForClone.setAuthorizedUserId(wFAAuthorization.getAuthorizedUserId());//被授权用户id + wFAAuthorizationForClone.setAuthorizedUserName(wFAAuthorization.getAuthorizedUserName());//被授权用户名字 + wFAAuthorizationForClone.setValidityStartDate(wFAAuthorization.getValidityStartDate());//开始时间 + wFAAuthorizationForClone.setValidityEndDate(wFAAuthorization.getValidityEndDate());//结束时间 + return wFAAuthorizationForClone; + } + + /** + * 记录修改日志 + * @param wfaa + * @param wfaaUpdate + */ + private void writeWorkFlowApprovalAuthorizationUpdateLog(WorkFlowApprovalAuthorization wfaa,WorkFlowApprovalAuthorization wfaaUpdate) { + JSONObject obj = new JSONObject(); + obj.put("授权人id", String.format("修改前:%s , 修改后:%s", wfaa.getAuthorizerUserId(),wfaaUpdate.getAuthorizerUserId())); + obj.put("授权人名字",String.format("修改前:%s , 修改后:%s", wfaa.getAuthorizerUserName(),wfaaUpdate.getAuthorizerUserName())); + obj.put("被授权id",String.format("修改前:%s , 修改后:%s", wfaa.getAuthorizedUserId(),wfaaUpdate.getAuthorizedUserId())); + obj.put("被授权名字",String.format("修改前:%s , 修改后:%s", wfaa.getAuthorizedUserName(),wfaaUpdate.getAuthorizedUserName())); + obj.put("开始有效时间", String.format("修改前:%s , 修改后:%s" + , DateTools.getFormatDateStr(wfaa.getValidityStartDate(),DateTools.COMMON_DATE_HMS),DateTools.getFormatDateStr(wfaaUpdate.getValidityStartDate(),DateTools.COMMON_DATE_HMS))); + obj.put("结束有效时间", String.format("修改前:%s , 修改后:%s" + , DateTools.getFormatDateStr(wfaa.getValidityEndDate(),DateTools.COMMON_DATE_HMS), DateTools.getFormatDateStr(wfaaUpdate.getValidityEndDate(),DateTools.COMMON_DATE_HMS))); + obj.put("操作人id", String.format("修改前:%s , 修改后:%s", wfaa.getOperatorId(),wfaaUpdate.getOperatorId())); + obj.put("操作人名字", String.format("修改前:%s , 修改后:%s", wfaa.getOperatorName(),wfaaUpdate.getOperatorName())); + obj.put("操作时间", String.format("修改前:%s , 修改后:%s" + ,DateTools.getFormatDateStr(wfaa.getOperatorDate(),DateTools.COMMON_DATE_HMS), DateTools.getFormatDateStr(wfaaUpdate.getOperatorDate(),DateTools.COMMON_DATE_HMS))); + appLogManager.saveLog(AcegiHelper.getLoginUser(), Log.MODEL_WORKFLOW, Log.TYPE_UPDATE , obj.toString()); + } + +} Index: ssts-web/src/main/webapp/homepage/menu.jsp =================================================================== diff -u -r23429 -r23468 --- ssts-web/src/main/webapp/homepage/menu.jsp (.../menu.jsp) (revision 23429) +++ ssts-web/src/main/webapp/homepage/menu.jsp (.../menu.jsp) (revision 23468) @@ -1281,6 +1281,12 @@ SSTS_ExpensiveGoodsWorkFlow_Hidden_Manager = false; +//高值耗材流程审批授权管理 +var SSTS_ExpensiveGoodsWorkFloAuthorization_Hidden_Manager = true; + +SSTS_ExpensiveGoodsWorkFloAuthorization_Hidden_Manager = false; + + //高值耗材采购计划管理 var SSTS_ExpensiveGoodsPurcahsePlan_Hidden_Manager = true; Index: forgon-core/src/main/java/com/forgon/workflow/model/WorkFlowApprovalAuthorization.java =================================================================== diff -u --- forgon-core/src/main/java/com/forgon/workflow/model/WorkFlowApprovalAuthorization.java (revision 0) +++ forgon-core/src/main/java/com/forgon/workflow/model/WorkFlowApprovalAuthorization.java (revision 23468) @@ -0,0 +1,151 @@ +package com.forgon.workflow.model; + +import java.util.Date; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; + +import org.hibernate.annotations.Cache; +import org.hibernate.annotations.CacheConcurrencyStrategy; + + +/** + *审批任务授权表 + */ +@Entity +@Table(name = "WorkFlowApprovalAuthorization") +@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) +public class WorkFlowApprovalAuthorization { + + private Long id; + + /** + * 授权用户id + */ + private Long authorizerUserId; + + /** + * 授权用户名字 + */ + private String authorizerUserName; + + /** + * 被授权用户id + */ + private Long authorizedUserId; + + /** + * 被授权用户名字 + */ + private String authorizedUserName; + + /** + * 有效开始时间 + */ + private Date validityStartDate; + + /** + * 有效结束时间 + */ + private Date validityEndDate; + + /** + * 操作员id + */ + private Long operatorId; + + /** + * 操作员名字 + */ + private String operatorName; + + /** + * 操作时间 + */ + private Date operatorDate; + + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getAuthorizerUserId() { + return authorizerUserId; + } + + public void setAuthorizerUserId(Long authorizerUserId) { + this.authorizerUserId = authorizerUserId; + } + + public String getAuthorizerUserName() { + return authorizerUserName; + } + + public void setAuthorizerUserName(String authorizerUserName) { + this.authorizerUserName = authorizerUserName; + } + + public Long getAuthorizedUserId() { + return authorizedUserId; + } + + public void setAuthorizedUserId(Long authorizedUserId) { + this.authorizedUserId = authorizedUserId; + } + + public String getAuthorizedUserName() { + return authorizedUserName; + } + + public void setAuthorizedUserName(String authorizedUserName) { + this.authorizedUserName = authorizedUserName; + } + + public Date getValidityEndDate() { + return validityEndDate; + } + + public void setValidityEndDate(Date validityEndDate) { + this.validityEndDate = validityEndDate; + } + + public Date getValidityStartDate() { + return validityStartDate; + } + + public void setValidityStartDate(Date validityStartDate) { + this.validityStartDate = validityStartDate; + } + + public Long getOperatorId() { + return operatorId; + } + + public void setOperatorId(Long operatorId) { + this.operatorId = operatorId; + } + + public String getOperatorName() { + return operatorName; + } + + public void setOperatorName(String operatorName) { + this.operatorName = operatorName; + } + + public Date getOperatorDate() { + return operatorDate; + } + + public void setOperatorDate(Date operatorDate) { + this.operatorDate = operatorDate; + } +} Index: ssts-web/src/main/resources/spring/applicationContext-disinfectsystem-service.xml =================================================================== diff -u -r23269 -r23468 --- ssts-web/src/main/resources/spring/applicationContext-disinfectsystem-service.xml (.../applicationContext-disinfectsystem-service.xml) (revision 23269) +++ ssts-web/src/main/resources/spring/applicationContext-disinfectsystem-service.xml (.../applicationContext-disinfectsystem-service.xml) (revision 23468) @@ -2417,6 +2417,24 @@ class="com.forgon.workflow.service.WorkFlowApprovalTaskManagerImpl"> + + + + + + + + + PROPAGATION_REQUIRED + + + + + + +