package foundation.state.approve;
|
|
import java.util.ArrayList;
|
import java.util.Date;
|
import java.util.List;
|
|
import foundation.data.entity.Entity;
|
import foundation.data.entity.EntitySet;
|
import foundation.data.entity.Filter;
|
import foundation.data.entity.OrderBy;
|
import foundation.data.object.DataObject;
|
import foundation.data.object.EntitySaver;
|
import foundation.json.IJSONProvider;
|
import foundation.json.IJSONWriter;
|
import foundation.persist.NamedSQL;
|
import foundation.persist.SQLRunner;
|
import foundation.state.ReferObject;
|
import foundation.state.State;
|
import foundation.state.StateCenter;
|
import foundation.state.StateMachine;
|
import foundation.state.StateOperate;
|
import foundation.state.StatePoint;
|
import foundation.token.IOnlineUser;
|
import foundation.util.ContentBuilder;
|
import foundation.util.ID;
|
import foundation.util.Util;
|
import foundation.value.ValueType;
|
import foundation.workflow.Event;
|
import foundation.workflow.EventType;
|
import foundation.workflow.Moment;
|
import foundation.workflow.WorkStep;
|
import foundation.workflow.WorkflowDispatcher;
|
import foundation.workflow.reference.FlowSender;
|
|
public class WorkingInstance implements IJSONProvider {
|
|
private DataObject masterObject;
|
private StateMachine machine;
|
private String dataName;
|
private String docId;
|
private Date now;
|
private String masterId;
|
private Entity master;
|
private WorkingApproveStepList workingSteps;
|
private EntitySet histories;
|
private boolean builded;
|
private int pos;
|
|
|
public WorkingInstance(String dataName, String docId){
|
this.docId = docId;
|
masterObject = DataObject.getInstance("sys_state_working_main");
|
builded = true;
|
}
|
|
public WorkingInstance(StateMachine machine, String dataName, String docId) throws Exception {
|
this.machine = machine;
|
this.docId = docId;
|
this.dataName = dataName;
|
|
masterObject = DataObject.getInstance("sys_state_working_main");
|
now = new Date();
|
builded = false;
|
}
|
|
|
public static State start(String dataName, String docId, StatePoint statePoint, StatePoint hostPoint, StatePoint referPoint, ReferObject referObject, IOnlineUser user, WorkStep step) throws Exception {
|
StateMachine machine = statePoint.getMachine();
|
|
//1. 关闭指定单据先前流程的查询权限和审批权限(只能查询且审批新启动的审批流程)
|
closeTargetDocumentFlow(docId);
|
|
//2. 创建工作流实例
|
WorkingInstance flowInstance = new WorkingInstance(machine, dataName, docId);
|
|
//3. 插入审批流主记录
|
flowInstance.insertMaster(dataName, statePoint, hostPoint, referPoint, referObject);
|
|
//4. 插入审批流的执行步骤、执行人员
|
flowInstance.insertWorkingSteps(statePoint, user, step);
|
|
//5. 执行跳过
|
flowInstance.execSkip(step, statePoint, user);
|
//6.返回第一个步骤的明细状态
|
return statePoint.getToState();
|
}
|
|
public static WorkingInstance getInstance(StateMachine machine, String dataName, String docId) throws Exception {
|
WorkingInstance result = new WorkingInstance(machine, dataName, docId);
|
result.loadWorkingMaster();
|
return result;
|
}
|
|
private void init() throws Exception {
|
if (builded) {
|
return;
|
}
|
|
//1. 为主记录加锁
|
lockMaster();
|
|
//2. 加载步骤
|
loadWorkingSteps();
|
|
//3.
|
builded = true;
|
}
|
|
private void execSkip(WorkStep step, StatePoint statePoint, IOnlineUser onlineUser) throws Exception {
|
SkipType skipType = statePoint.getSkipType();
|
|
if (skipType != SkipType.ToPresenter) {
|
return ;
|
}
|
|
StepLocation position = null;
|
int stepIndex = getWorkingUserIndex(onlineUser.getId());
|
for (int i = 0; i < stepIndex; i++) {
|
ApprovalResult approvalResult = runStep(step, statePoint, onlineUser, ApproveOperate.Approve, "跳过");
|
position = approvalResult.getStepLoscation();
|
}
|
|
if (StepLocation.AtSuccess == position) {
|
close();
|
ReferObject referObject = new ReferObject(getMaster());
|
StateCenter.approveRunState(step, statePoint, this, StateOperate.StateEnd, referObject, null);
|
}
|
}
|
|
public int getWorkingUserIndex(String userId) throws Exception {
|
NamedSQL namedSQL = NamedSQL.getInstance("getWorkingUserIndex");
|
namedSQL.setParam("parent_id", masterId);
|
namedSQL.setParam("user_id", userId);
|
|
return SQLRunner.getInteger(namedSQL);
|
}
|
|
public void close() throws Exception {
|
EntitySaver saver = masterObject.createEntitySaver(master);
|
saver.set("is_working", "F");
|
saver.update();
|
}
|
|
public void loadActive(boolean loadStep, boolean loadHistory) throws Exception {
|
//1. 加载审批主记录
|
loadActiveMaster();
|
|
//2. 加载审批步骤
|
if (loadStep) {
|
loadWorkingSteps();
|
}
|
|
//3. 加载审批历史
|
if (loadHistory) {
|
loadStepHistorys();
|
}
|
}
|
|
public void gotoActiveStep() throws Exception {
|
//1.
|
if (!builded) {
|
synchronized (this) {
|
if (!builded) {
|
init();
|
}
|
}
|
}
|
|
//2.
|
int max = workingSteps.size();
|
pos = -1;
|
|
for (int i = 0; i < max; i++) {
|
WorkingApproveStep step = workingSteps.get(i);
|
|
if (step.isWorking()) {
|
pos = i;
|
}
|
}
|
}
|
|
public boolean validateCurrentUser(ApproveOperate operator, IOnlineUser onlineUser, String creatorId) throws Exception {
|
if (onlineUser == null) {
|
return false;
|
}
|
|
if ("admin".equalsIgnoreCase(onlineUser.getName())) {
|
return true;
|
}
|
|
WorkingApproveStep step = getCurrentStep();
|
|
if (step == null) {
|
return false;
|
}
|
|
String userId = onlineUser.getId();
|
if (step.includeUser(userId)) {
|
return true;
|
}
|
return (ApproveOperate.PullBack == operator) && userId.equals(creatorId);
|
}
|
|
public ApprovalResult runStep(WorkStep workStep, StatePoint statePoint, IOnlineUser onlineUser, ApproveOperate operator, String remark) throws Exception {
|
if (ApproveOperate.Approve == operator) {
|
return runApprove(workStep, statePoint, onlineUser, remark);
|
}
|
else if (ApproveOperate.GoEnd == operator) {
|
return runGoEnd(workStep, statePoint, onlineUser, remark);
|
}
|
else if (ApproveOperate.GoBack == operator) {
|
return runGoBack(workStep, statePoint, onlineUser, remark);
|
}
|
else if (ApproveOperate.GoHome == operator) {
|
return runGoHome(workStep, statePoint, onlineUser, remark);
|
}
|
else if (ApproveOperate.PullBack == operator) {
|
return runPullBack(workStep, statePoint, onlineUser, remark);
|
}
|
|
return null;
|
}
|
|
private ApprovalResult runApprove(WorkStep workStep, StatePoint statePoint, IOnlineUser user, String remark) throws Exception {
|
ApprovalResult approvalResult = new ApprovalResult();
|
WorkingApproveStep currentStep = getCurrentStep();
|
|
//1. 触发before event 事件
|
FlowSender sender = new FlowSender(currentStep.getApproveStepId());
|
Event event = new Event(EventType.Approve, dataName, masterId, Moment.Before, ApproveOperate.Approve.name(), sender);
|
WorkflowDispatcher.onFireEvent(workStep, event);
|
|
if (!workStep.isSimulate()) {
|
//2.完成当前步骤
|
closeOneStep(currentStep, user, remark);
|
insertOneHistory(currentStep, user, ApproveOperate.Approve, remark);
|
|
//3. 开启下一个步骤(如果当前步骤是最后一个步骤,就不需要开启下一个步骤)
|
WorkingApproveStep nextStep = goNextStep();
|
openOneStep(nextStep);
|
}
|
|
//4. 返回运行后,最新的位置
|
if (isAtSuccess()) {
|
//4.1 审批流完成(成功)
|
approvalResult.setStepLoscation(StepLocation.AtSuccess);
|
}
|
else if (isAtLast()) {
|
//4.2 审批停留在最后一个步骤
|
approvalResult.setStepLoscation(StepLocation.AtLast);
|
}
|
else {
|
//4.3 审批停留在中间步骤
|
approvalResult.setStepLoscation(StepLocation.InMiddle);
|
}
|
|
//5. fire after event
|
event = new Event(EventType.Approve, dataName, masterId, Moment.After, ApproveOperate.Approve.name(), sender);
|
WorkflowDispatcher.onFireEvent(workStep, event);
|
|
return approvalResult;
|
}
|
|
private ApprovalResult runGoEnd(WorkStep workStep, StatePoint statePoint, IOnlineUser user, String remark) throws Exception {
|
ApprovalResult approvalResult = new ApprovalResult();
|
WorkingApproveStep currentStep = getCurrentStep();
|
|
//1. 触发before event 事件
|
FlowSender reference = new FlowSender(currentStep.getId());
|
Event event = new Event(EventType.Approve, dataName, masterId, Moment.Before, ApproveOperate.GoEnd.name(), reference);
|
WorkflowDispatcher.onFireEvent(workStep, event);
|
|
if (!workStep.isSimulate()) {
|
//2. 完成当前步骤
|
closeOneStep(currentStep, user, remark);
|
insertOneHistory(currentStep, user, ApproveOperate.PullBack, remark);
|
}
|
|
//3. 跳出审批,进入提交完成状态(成功)
|
approvalResult.setStepLoscation(StepLocation.AtSuccess);
|
|
//4. fire after event
|
event = new Event(EventType.Approve, dataName, masterId, Moment.After, ApproveOperate.GoEnd.name(), reference);
|
WorkflowDispatcher.onFireEvent(workStep, event);
|
|
return approvalResult;
|
}
|
|
private ApprovalResult runGoBack(WorkStep workStep, StatePoint statePoint, IOnlineUser user, String remark) throws Exception {
|
ApprovalResult approvalResult = new ApprovalResult();
|
WorkingApproveStep currentStep = getCurrentStep();
|
|
//1. 触发before event 事件
|
FlowSender reference = new FlowSender(currentStep.getId());
|
Event event = new Event(EventType.Approve, dataName, masterId, Moment.Before, ApproveOperate.GoBack.name(), reference);
|
WorkflowDispatcher.onFireEvent(workStep, event);
|
|
//2. 完成当前步骤
|
if (!workStep.isSimulate()) {
|
closeOneStep(currentStep, user, remark);
|
insertOneHistory(currentStep, user, ApproveOperate.GoBack, remark);
|
|
//3. 开启下一个步骤(如果当前步骤是最后一个步骤,就不需要开启下一个步骤)
|
WorkingApproveStep priorStep = goPriorStep();
|
openOneStep(priorStep);
|
}
|
|
//4. 返回运行后,最新的位置
|
if (isAtHome()) {
|
//4.1 跳出审批,进入提交申请前的状态(Input)
|
approvalResult.setStepLoscation(StepLocation.AtHome);
|
}
|
else if (isAtFirst()) {
|
//4.2 审批停留在第一个步骤
|
approvalResult.setStepLoscation(StepLocation.AtFirst);
|
}
|
else {
|
//4.3 审批停留在中间步骤
|
approvalResult.setStepLoscation(StepLocation.InMiddle);
|
}
|
|
//5. fire after event
|
event = new Event(EventType.Approve, dataName, masterId, Moment.After, ApproveOperate.GoBack.name(), reference);
|
WorkflowDispatcher.onFireEvent(workStep, event);
|
|
return approvalResult;
|
}
|
|
private ApprovalResult runGoHome(WorkStep workStep, StatePoint statePoint, IOnlineUser user, String remark) throws Exception {
|
ApprovalResult approvalResult = new ApprovalResult();
|
WorkingApproveStep currentStep = getCurrentStep();
|
|
//1. 完成当前步骤
|
FlowSender reference = new FlowSender(currentStep.getId());
|
Event event = new Event(EventType.Approve, dataName, masterId, Moment.Before, ApproveOperate.GoHome.name(), reference);
|
WorkflowDispatcher.onFireEvent(workStep, event);
|
|
if (!workStep.isSimulate()) {
|
//2. 触发before event 事件
|
closeOneStep(currentStep, user, remark);
|
insertOneHistory(currentStep, user, ApproveOperate.GoHome, remark);
|
}
|
|
//3. 跳出审批,进入提交申请前的状态(Input)
|
approvalResult.setStepLoscation(StepLocation.AtHome);
|
|
//4. fire after event
|
event = new Event(EventType.Approve, dataName, masterId, Moment.After, ApproveOperate.GoHome.name(), reference);
|
WorkflowDispatcher.onFireEvent(workStep, event);
|
return approvalResult;
|
}
|
|
private ApprovalResult runPullBack(WorkStep workStep, StatePoint statePoint, IOnlineUser user, String remark) throws Exception {
|
ApprovalResult approvalResult = new ApprovalResult();
|
WorkingApproveStep step = new PullBackStep(statePoint);
|
|
//1. 触发before event 事件
|
FlowSender reference = new FlowSender(step.getId());
|
Event event = new Event(EventType.Approve, dataName, masterId, Moment.Before, ApproveOperate.PullBack.name(), reference);
|
WorkflowDispatcher.onFireEvent(workStep, event);
|
|
if (!workStep.isSimulate()) {
|
//2. 插入历史
|
insertOneHistory(step, user, ApproveOperate.PullBack, remark);
|
}
|
|
//3. 跳出审批,进入提交申请前的状态(Input)
|
approvalResult.setStepLoscation(StepLocation.AtHome);
|
|
//4. 触发before event 事件
|
event = new Event(EventType.Approve, dataName, masterId, Moment.After, ApproveOperate.PullBack.name(), reference);
|
WorkflowDispatcher.onFireEvent(workStep, event);
|
|
return approvalResult;
|
}
|
|
public boolean isAtFirst() throws Exception {
|
//1.
|
if (!builded) {
|
synchronized (this) {
|
if (!builded) {
|
init();
|
}
|
}
|
}
|
|
//2.
|
return pos == 0;
|
}
|
|
public boolean isAtHome() throws Exception {
|
//1.
|
if (!builded) {
|
synchronized (this) {
|
if (!builded) {
|
init();
|
}
|
}
|
}
|
|
//2.
|
return pos < 0;
|
}
|
|
public boolean isAtLast() throws Exception {
|
//1.
|
if (!builded) {
|
synchronized (this) {
|
if (!builded) {
|
init();
|
}
|
}
|
}
|
|
//2.
|
return pos == workingSteps.actualSize() - 1;
|
}
|
|
public boolean isAtSuccess() throws Exception {
|
//1.
|
if (!builded) {
|
synchronized (this) {
|
if (!builded) {
|
init();
|
}
|
}
|
}
|
|
//2.
|
return pos > workingSteps.actualSize() - 1;
|
}
|
|
public int getPos() throws Exception {
|
//1.
|
if (!builded) {
|
synchronized (this) {
|
if (!builded) {
|
init();
|
}
|
}
|
}
|
|
//2.
|
return pos;
|
}
|
|
private static void closeTargetDocumentFlow(String docId) throws Exception {
|
NamedSQL namedSQL = NamedSQL.getInstance("closeApproveFlowAll");
|
namedSQL.setParam("doc_id", docId);
|
namedSQL.execute();
|
|
namedSQL = NamedSQL.getInstance("closeApproveFlowSteps");
|
namedSQL.setParam("doc_id", docId);
|
namedSQL.execute();
|
}
|
|
private void insertMaster(String dataName, StatePoint masterPoint, StatePoint hostPoint, StatePoint referPoint, ReferObject referObject) throws Exception {
|
masterId = ID.newValue();
|
|
String hostPointId = hostPoint == null ? null : hostPoint.getId();
|
String referPointId = referPoint == null ? null : referPoint.getId();
|
|
DataObject dataObject = DataObject.getInstance("sys_state_working_main");
|
master = dataObject.createTableEntity(true);
|
|
master.set("id", masterId);
|
master.set("machine_id", machine.getId());
|
master.set("dataname", dataName);
|
master.set("operator", masterPoint.getOperator());
|
master.set("title", masterPoint.getStateOperate().getName());
|
master.set("point_master_id", masterPoint.getId());
|
master.set("point_host_id", hostPointId);
|
master.set("point_refer_id", referPointId);
|
master.set("doc_id", docId);
|
master.set("is_working", "T");
|
master.set("is_alive", "T");
|
|
DataObject docObject = DataObject.getInstance(dataName);
|
Entity entity = docObject.getBrowseEntity(docId);
|
String description = entity.getString("code");
|
|
if (Util.isEmpty(description)){
|
description = entity.getString("agreement_no");
|
}
|
|
if (Util.isEmpty(description)){
|
description = entity.getString("apply_no");
|
}
|
master.set("description", description);
|
|
if (referObject != null) {
|
master.set("refer_name", referObject.getDataName());
|
master.set("refer_id", referObject.getId());
|
}
|
|
dataObject.insertEntity(master);
|
}
|
|
private void loadWorkingMaster() throws Exception {
|
Filter filter = new Filter("doc_id", docId).add("is_working", "T");
|
master = masterObject.getTableEntity(filter);
|
|
if (master == null || master.isEmpty()) {
|
masterId = null;
|
return;
|
}
|
|
masterId = master.getId();
|
}
|
|
private void loadActiveMaster() throws Exception {
|
Filter filter = new Filter("doc_id", docId).add("is_alive", "T");
|
master = masterObject.getTableEntity(filter);
|
|
if (master == null || master.isEmpty()) {
|
masterId = null;
|
return;
|
}
|
|
masterId = master.getId();
|
}
|
|
private void lockMaster() throws Exception {
|
DataObject dataObject = DataObject.getInstance("sys_state_working_main");
|
|
EntitySaver saver = dataObject.createEntitySaver(master.getId());
|
saver.set("lock_stamp", ID.newValue());
|
saver.update();
|
}
|
|
private void closeOneStep(WorkingApproveStep step, IOnlineUser user, String remark) throws Exception {
|
if (step == null) {
|
return;
|
}
|
|
DataObject dataObject = DataObject.getInstance("sys_state_working_step");
|
|
EntitySaver saver = dataObject.createEntitySaver(step.getId());
|
saver.set("is_active", "F");
|
saver.set("end_time", now);
|
saver.set("writer_name", user.getEmployeeName());
|
saver.set("remark", remark);
|
saver.update();
|
}
|
|
private void openOneStep(WorkingApproveStep step) throws Exception {
|
if (step == null) {
|
return;
|
}
|
|
DataObject dataObject = DataObject.getInstance("sys_state_working_step");
|
|
EntitySaver saver = dataObject.createEntitySaver(step.getId());
|
saver.set("is_active", "T");
|
saver.set("begin_time", now);
|
saver.set("end_time", ValueType.Null);
|
saver.set("remark", ValueType.Null);
|
saver.update();
|
}
|
|
private void loadWorkingSteps() throws Exception {
|
workingSteps = new WorkingApproveStepList();
|
|
DataObject dataObject = DataObject.getInstance("sys_state_working_step");
|
EntitySet entitySet = dataObject.getTableEntitySet(new Filter("parent_id", masterId), new OrderBy("index_no, is_copy asc"));
|
|
if (entitySet == null) {
|
return;
|
}
|
|
pos = -1; int idx = 0;
|
|
for (Entity entity: entitySet) {
|
WorkingApproveStep workingStep = new WorkingApproveStep();
|
workingStep.load(entity);
|
workingSteps.loadOne(workingStep);
|
|
if (workingStep.isWorking()) {
|
pos = idx;
|
}
|
|
idx++;
|
}
|
}
|
|
public void resetWorkingStep(String workingStepId) throws Exception {
|
DataObject dataObject = DataObject.getInstance("sys_state_working_user");
|
EntitySet entitySet = dataObject.getTableEntitySet(new Filter("working_step_id", workingStepId));
|
|
String wtiterName;
|
ContentBuilder result = new ContentBuilder(",");
|
for (Entity step : entitySet) {
|
wtiterName = step.getString("writer_name");
|
|
if (Util.isEmpty(wtiterName)) {
|
continue;
|
}
|
|
result.append(wtiterName);
|
}
|
|
String writerNames = result.toString();
|
|
dataObject = DataObject.getInstance("sys_state_working_step");
|
EntitySaver saver = dataObject.createEntitySaver(workingStepId);
|
saver.set("writer_name", writerNames);
|
|
saver.update();
|
}
|
|
private void loadStepHistorys() throws Exception {
|
DataObject dataObject = DataObject.getInstance("sys_state_working_history");
|
histories = dataObject.getTableEntitySet(new Filter("parent_id", masterId), new OrderBy("create_time desc"));
|
}
|
|
private void insertWorkingSteps(StatePoint statePoint, IOnlineUser user, WorkStep step) throws Exception {
|
String machineId = machine.getId();
|
ApproveRuntime steps = statePoint.getSteps(user, step);
|
|
DataObject stepObject = DataObject.getInstance("sys_state_working_step");
|
EntitySet stepSet = stepObject.createTableEntitySet();
|
|
DataObject userObject = DataObject.getInstance("sys_state_working_user");
|
EntitySet userSet = userObject.createTableEntitySet();
|
|
String first = "T";
|
|
for (Step oneStep: steps) {
|
String id = ID.newValue();
|
|
Entity entity = stepSet.append();
|
entity.set("id", id);
|
entity.set("parent_id", masterId);
|
entity.set("machine_id", machine.getId());
|
entity.set("doc_id", docId);
|
entity.set("point_id", statePoint.getId());
|
entity.set("approve_id", oneStep.getParentId());
|
entity.set("approve_step_id", oneStep.getId());
|
entity.set("name", oneStep.getName());
|
entity.set("index_no", oneStep.getIndexNo());
|
entity.set("writer_name", oneStep.getWriterNames());
|
entity.set("is_copy", oneStep.isCopy());
|
entity.set("is_active", first);
|
entity.set("begin_time", "T".equals(first) ? new Date() : null);
|
|
List<StepUser> stepUsers = oneStep.getUsers();
|
for (StepUser stepUser: stepUsers) {
|
Entity userEntity = userSet.append();
|
|
userEntity.set("id", ID.newValue());
|
userEntity.set("parent_id", masterId);
|
userEntity.set("machine_id", machineId);
|
userEntity.set("doc_id", docId);
|
userEntity.set("point_id", statePoint.getId());
|
userEntity.set("working_step_id", id);
|
userEntity.set("user_id", stepUser.getUserId());
|
userEntity.set("writer_name", stepUser.getWriterName());
|
}
|
|
first = "F";
|
}
|
|
stepObject.insertEntitySet(stepSet);
|
userObject.insertEntitySet(userSet);
|
}
|
|
private void insertOneHistory(WorkingApproveStep step, IOnlineUser user, ApproveOperate operator, String remark) throws Exception {
|
String employeeName = user.getEmployeeName();
|
|
//4. 插入日志记录
|
DataObject dataObject = DataObject.getInstance("sys_state_working_history");
|
|
Entity entity = dataObject.createTableEntity(true);
|
entity.set("id", ID.newValue());
|
entity.set("parent_id", masterId);
|
entity.set("machine_id", machine.getId());
|
entity.set("doc_id", docId);
|
entity.set("point_id", step.getPointId());
|
entity.set("step_id", step.getId());
|
entity.set("step_name", step.getName());
|
entity.set("writer_name", employeeName);
|
entity.set("employee_id", user.getEmployeeId());
|
entity.set("employee_name", employeeName);
|
entity.set("remark", remark);
|
entity.set("user_id", user.getId());
|
entity.set("user_name", user.getName());
|
entity.set("result_code", operator.name());
|
entity.set("result_name", operator.getTitle());
|
entity.set("create_time", now);
|
|
dataObject.insertEntity(entity);
|
}
|
|
public WorkingApproveStep getCurrentStep() throws Exception {
|
//1.
|
if (!builded) {
|
synchronized (this) {
|
if (!builded) {
|
init();
|
}
|
}
|
}
|
|
//2.
|
if (pos < 0 || pos >= workingSteps.size()) {
|
return null;
|
}
|
|
return workingSteps.get(pos);
|
}
|
|
private WorkingApproveStep goNextStep() throws Exception {
|
//1.
|
if (!builded) {
|
synchronized (this) {
|
if (!builded) {
|
init();
|
}
|
}
|
}
|
|
//2.
|
pos = pos + 1;
|
|
if (pos < 0 || pos >= workingSteps.actualSize()) {
|
return null;
|
}
|
|
return workingSteps.get(pos);
|
}
|
|
public WorkingApproveStep goPriorStep() throws Exception {
|
//1.
|
if (!builded) {
|
synchronized (this) {
|
if (!builded) {
|
init();
|
}
|
}
|
}
|
|
//2.
|
pos = pos - 1;
|
|
if (pos < 0 || pos >= workingSteps.actualSize()) {
|
return null;
|
}
|
|
return workingSteps.get(pos);
|
}
|
|
public WorkingApproveStep getNextWorkingStep(String operator) {
|
StateOperate stateOperate = StateOperate.parse(operator);
|
int nextPos = -1;
|
if (StateOperate.Commit == stateOperate || StateOperate.toChange == stateOperate || StateOperate.toClose == stateOperate) {
|
nextPos = 0;
|
}
|
else if (StateOperate.StateEnd == stateOperate) {
|
nextPos = workingSteps.actualSize() - 1;
|
}
|
else if (StateOperate.StateFrom == stateOperate) {
|
nextPos = -1;
|
}
|
|
ApproveOperate approveOperate = ApproveOperate.parse(operator);
|
|
if (ApproveOperate.Approve == approveOperate) {
|
nextPos = pos + 1;
|
}
|
else if (ApproveOperate.GoEnd == approveOperate) {
|
nextPos = workingSteps.actualSize() - 1;
|
}
|
else if (ApproveOperate.GoHome == approveOperate || ApproveOperate.PullBack == approveOperate) {
|
nextPos = -1;
|
}
|
else if (ApproveOperate.GoBack == approveOperate) {
|
nextPos = pos - 1;
|
}
|
|
if (nextPos < 0 || nextPos >= workingSteps.actualSize()) {
|
return null;
|
}
|
|
WorkingApproveStep workingStep = workingSteps.get(nextPos);
|
if (workingStep == null) {
|
return null;
|
}
|
|
return workingStep;
|
}
|
|
public List<WorkingApproveStep> getNotifyStep() throws Exception {
|
List<WorkingApproveStep> notifySteps = new ArrayList<WorkingApproveStep>();
|
|
//1.
|
if (!builded) {
|
synchronized (this) {
|
if (!builded) {
|
init();
|
}
|
}
|
}
|
|
//2.
|
if (pos < 0 && !isWorking()) {
|
for (int indexNo = workingSteps.actualSize() - 1; indexNo < workingSteps.size(); indexNo++) {
|
WorkingApproveStep step = workingSteps.get(indexNo);
|
|
if (step.isCopy()) {
|
notifySteps.add(step);
|
}
|
}
|
}
|
|
return notifySteps;
|
}
|
|
public String getOutStateCode() throws Exception {
|
WorkingApproveStep step = getCurrentStep();
|
|
if (step == null) {
|
return null;
|
}
|
|
return step.getOutStateCode();
|
}
|
|
public EntitySet getHistories() {
|
return histories;
|
}
|
|
public boolean isEmpty() {
|
return master == null;
|
}
|
|
public List<WorkingApproveStep> getWorkingSteps() {
|
return workingSteps.getList();
|
}
|
|
public Entity getMaster() {
|
return master;
|
}
|
|
public String getMasterPointId() {
|
String pointId = master.getString("point_master_id");
|
return pointId;
|
}
|
|
public String getHostPointId() {
|
String pointId = master.getString("point_host_id");
|
return pointId;
|
}
|
|
public String getReferPointId() {
|
String pointId = master.getString("point_refer_id");
|
return pointId;
|
}
|
|
public boolean isWorking() {
|
return master.getBoolean("is_working", false);
|
}
|
|
@Override
|
public void writeJSON(IJSONWriter writer) {
|
writer.beginObject();
|
|
//1. steps
|
if (workingSteps == null) {
|
writer.writeNull("steps");
|
}
|
else {
|
writer.beginArray("steps");
|
workingSteps.writeJSONBody(writer);
|
writer.endArray();
|
}
|
|
//2. histories
|
if (histories == null) {
|
writer.writeNull("histories");
|
}
|
else {
|
writer.beginArray("histories");
|
histories.writeJSONBody(writer);
|
writer.endArray();
|
}
|
|
writer.endObject();
|
}
|
|
}
|