package foundation.state.approve; import java.util.List; import foundation.action.ActionContext; import foundation.action.SingletonActionProvider; import foundation.dao.DataPackage; import foundation.dao.DataReader; import foundation.dao.DataSource; import foundation.dao.DataWriter; import foundation.dao.Domain; import foundation.dao.Filter; import foundation.dao.OrderBy; import foundation.dao.Page; import foundation.data.entity.Entity; import foundation.data.entity.EntitySet; import foundation.data.entity.EntityTree; import foundation.data.object.DataObject; import foundation.json.JObjectReader; import foundation.json.JType; import foundation.persist.NamedSQL; import foundation.persist.SQLRunner; import foundation.state.MachineBucket; import foundation.state.StateMachine; import foundation.state.StateMachineLoader; import foundation.token.IOnlineUser; import foundation.util.ContentBuilder; import foundation.util.Util; public class ApproveCenter extends SingletonActionProvider { public static String Remark_Approve = "同意"; public static String Remark_Deny = "不同意"; private static ApproveCenter instance; private ApproveCenter() { } public static synchronized ApproveCenter getInstance() { if (instance == null) { instance = new ApproveCenter(); } return instance; } @Override protected void publishMethod() { //1.1 获取审批流图数据 addMethod("getOneApprove"); //1.2 保存审批流图数据 addMethod("saveOneApprove"); //1.3 保存审批组 addMethod("saveBoard"); //1.4 删除审批组 addMethod("deleteOneboard"); //1.5 修改审批组人员 addMethod("saveOneBoardUser"); //1.6 修改审批组人员 addMethod("deleteOneBoardUser"); //2.1 审批中心--树 addMethod("getOutline"); //2.2 审批中心—待审列表 addMethod("getDocumentList"); //2.3 审批中心—已审列表 addMethod("getDocumentHistory"); //2.4 审批中心——某个单据的当前申请流 addMethod("getAliveWorkflow"); //2.5 审批中心——某个单据的已审列表 addMethod("getWorkHistory"); //2.6 审批中心—当前步骤 addMethod("getWorkSetps"); //2.7 审批中心—审批历史 addMethod("getWorkHistory"); //2.9 审批中心—单据审批人转移 addMethod("transferWorkStepApprover"); } public void getOneApprove(ActionContext context) throws Exception { DataReader dataReader = context.getDataReader(); DataWriter dataWriter = context.getDataWriter(); String approveId = dataReader.getString("id"); ApproveTemplate approveTemplate = ApproveTemplate.getInstance(approveId); if (approveTemplate == null) { return; } dataWriter.addValue(approveTemplate); } public void saveOneApprove(ActionContext context) throws Exception { DataReader dataReader = context.getDataReader(); DataWriter dataWriter = context.getDataWriter(); ApproveTemplate newTemplate = new ApproveTemplate(); JObjectReader reader = dataReader.getReader("data", JType.Object); newTemplate.load(reader); ApproveTemplate original = ApproveTemplate.getInstance(newTemplate.getId()); //1. 如果是第一次保存,直接插入到数据库 if (original == null) { newTemplate.insertToDB(); dataWriter.addValue(newTemplate); } //2. 如果存在原始模版,合并后保存 else { original.updateToDB(newTemplate); dataWriter.addValue(original); } } public void saveBoard(ActionContext context) throws Exception { DataPackage dataPackage = context.getDataPackage(); dataPackage.saveOneDataToDB(DataSource.Request); String boardId = dataPackage.getMasterId(); StateMachineLoader.reloadStepBoard(boardId); } public void deleteOneBoard(ActionContext context) throws Exception { DataWriter dataWriter = context.getDataWriter(); DataPackage dataPackage = context.getDataPackage(); String boardId = dataPackage.getMasterId(); NamedSQL namedSQL = NamedSQL.getInstance("getApproverStepInUsing"); namedSQL.setParam("boardId", boardId); EntitySet entitySet = SQLRunner.getEntitySet(namedSQL); if (entitySet.isEmpty()) { dataPackage.deleteOneDataFromDB(); StateMachineLoader.reloadStepBoard(boardId); return; } ContentBuilder approveStep = new ContentBuilder(","); for (Entity entity: entitySet) { approveStep.append(entity.getString("name")); } dataWriter.reportOneError("checkBoardUsed", "当前审批组正在审批流:【" + approveStep.toString() + "】中使用,不允许删除。"); } public void saveOneBoardUser(ActionContext context) throws Exception { DataPackage dataPackage = context.getDataPackage(); dataPackage.saveOneDataToDB(DataSource.Request); dataPackage.loadOneDataFromDB(); Entity entity = dataPackage.getMasterEntity(); StepUser stepUser = new StepUser(); stepUser.load(entity); String boardId = entity.getString("board_id"); StepBoardBucket boardBucket = StepBoardBucket.getInstance(); StepBoard board = boardBucket.get(boardId); board.loadOneUser(stepUser.getId(), stepUser); board.reWriterNames(); } public void deleteOneBoardUser(ActionContext context) throws Exception { DataPackage dataPackage = context.getDataPackage(); Entity entity = dataPackage.getMasterEntity(); String boardId = entity.getString("board_id"); StepBoardBucket boardBucket = StepBoardBucket.getInstance(); StepBoard board = boardBucket.get(boardId); dataPackage.deleteOneDataFromDB(); board.removeOneUser(entity.getId()); board.reWriterNames(); } public void getOutline(ActionContext context) throws Exception { DataWriter dataWriter = context.getDataWriter(); NamedSQL namedSQL = NamedSQL.getInstance("getOutline"); IOnlineUser user = IOnlineUser.getInstance(); if (user.isAdmin()) { namedSQL.setParam("user_limit", "1=1"); } else { namedSQL.setParam("user_limit", "sys_state_working_user.user_id = " + Util.quotedStr(user.getId())); } namedSQL.setOrderBy(new OrderBy("parent_id")); EntityTree entityTree = SQLRunner.getEntityTree(namedSQL); dataWriter.addValue("data", entityTree); } public void getDocumentList(ActionContext context) throws Exception { DataReader dataReader = context.getDataReader(); DataWriter dataWriter = context.getDataWriter(); Domain domain = dataReader.getDomain(); String dataName = domain.getDataName(); StateMachine machine = MachineBucket.getMachineByDataName(dataName); if (machine == null) { return; } DataObject dataObject = DataObject.getInstance(dataName); //1. 从请求中获取Page和OrderBy Page page = new Page(); OrderBy orderBy = new OrderBy(); dataReader.loadPageOrderByFromJSON(dataObject, page, orderBy); if (orderBy.isEmpty()) { orderBy.add("update_time desc"); } //2. 生成过滤条件 String machineId = machine.getId(); Filter filter = new Filter(); dataReader.loadFilterFromJSON(dataObject, filter); dataObject.addDefaultFilter(filter); IOnlineUser user = IOnlineUser.getInstance(); String userLimit = " 1 = 1 "; if (!user.isAdmin()) { userLimit = "sys_state_working_user.user_id = " + Util.quotedStr(user.getId()); } NamedSQL namedSQL = NamedSQL.getInstance("getDocumentListFilter"); namedSQL.setParam("tableName", dataObject.getTableOrViewName()); namedSQL.setParam("machine_id", machineId); namedSQL.setParam("user_limit", userLimit); filter.add(namedSQL.toString()); //3. 计算分页 int batchCount = dataObject.getCount(filter); page.setRecordCount(batchCount); dataWriter.addValue("page", page); //4. 加载数据 EntitySet entitySet = dataObject.getBrowseEntitySet(filter, orderBy, page); dataWriter.addValue("data", entitySet); } public void getDocumentHistory(ActionContext context) throws Exception { DataReader dataReader = context.getDataReader(); DataWriter dataWriter = context.getDataWriter(); Domain domain = dataReader.getDomain(); String dataName = domain.getDataName(); StateMachine machine = MachineBucket.getMachineByDataName(dataName); if (machine == null) { return; } DataObject dataObject = DataObject.getInstance(dataName); //1. 从请求中获取Page和OrderBy Page page = new Page(); OrderBy orderBy = new OrderBy(); dataReader.loadPageOrderByFromJSON(dataObject, page, orderBy); if (orderBy.isEmpty()) { orderBy.add("update_time desc"); } //2. 生成过滤条件 String machineId = machine.getId(); Filter filter = new Filter(); dataReader.loadFilterFromJSON(dataObject, filter); dataObject.addDefaultFilter(filter); IOnlineUser user = IOnlineUser.getInstance(); String userLimit = " 1 = 1 "; if (!user.isAdmin()) { userLimit = "sys_state_working_user.user_id = " + Util.quotedStr(user.getId()); } NamedSQL namedSQL = NamedSQL.getInstance("getDocumentHistoryFilter"); namedSQL.setParam("tableName", dataObject.getTableOrViewName()); namedSQL.setParam("machine_id", machineId); namedSQL.setParam("user_limit", userLimit); filter.add(namedSQL.toString()); //3. 计算分页 int batchCount = dataObject.getCount(filter); page.setRecordCount(batchCount); dataWriter.addValue("page", page); //4. 加载数据 EntitySet entitySet = dataObject.getBrowseEntitySet(filter, orderBy, page); dataWriter.addValue("data", entitySet); } public void getAliveWorkflow(ActionContext context) throws Exception { DataReader dataReader = context.getDataReader(); DataWriter dataWriter = context.getDataWriter(); Domain domain = dataReader.getDomain(); String documnetId = domain.getId(); WorkingInstance flowInstance = new WorkingInstance(documnetId); flowInstance.loadActive(false, false); if (flowInstance.isEmpty()) { dataWriter.reportOneError("审批流查询", "没有查询到相关流程"); return; } dataWriter.addValue("data", flowInstance); } public void getWorkSetps(ActionContext context) throws Exception { DataReader dataReader = context.getDataReader(); DataWriter dataWriter = context.getDataWriter(); Domain domain = dataReader.getDomain(); String documnetId = domain.getId(); WorkingInstance workingInstance = new WorkingInstance(documnetId); workingInstance.loadActive(true, false); if (workingInstance.isEmpty()) { dataWriter.reportOneError("审批流查询", "没有查询到相关流程"); return; } List steps = workingInstance.getWorkingSteps(); dataWriter.addValue("data", steps); } public void getWorkHistory(ActionContext context) throws Exception { DataReader dataReader = context.getDataReader(); DataWriter dataWriter = context.getDataWriter(); Domain domain = dataReader.getDomain(); String documnetId = domain.getId(); WorkingInstance flowInstance = new WorkingInstance(documnetId); flowInstance.loadActive(false, true); if (flowInstance.isEmpty()) { dataWriter.reportOneError("审批流查询", "没有查询到相关流程"); return; } EntitySet histories = flowInstance.getHistories(); dataWriter.addValue("data", histories); } public void transferWorkStepApprover(ActionContext context) throws Exception { // 1. 更新审批人 String dataName = context.getDataName(); DataPackage dataPackage = context.getDataPackage(); dataPackage.loadDataFromRequest(); dataPackage.loadFilterPageOrderByFromJSON(); try { SQLRunner.beginTrans(); Entity entity = dataPackage.getItemEntity(dataName, DataSource.Request); Filter filter = dataPackage.getFilter(); DataObject dataObject = dataPackage.getDataObject(dataName); dataObject.updateByEntity(entity, filter); //2. 更新步骤 NamedSQL namedSQL = NamedSQL.getInstance("getWorkStep"); namedSQL.setFilter(filter); EntitySet entitySet = SQLRunner.getEntitySet(namedSQL); String workingStepId, documnetId; for (Entity step : entitySet) { documnetId = step.getString("doc_id"); workingStepId = step.getId(); WorkingInstance workingInstance = new WorkingInstance(documnetId); workingInstance.resetWorkingStep(workingStepId); workingInstance.loadActive(true, false); } }catch (Exception e) { SQLRunner.rollback(); e.printStackTrace(); } SQLRunner.commit(); } }