要实现效果:已发出的工作流,谁都不可以修改流程里的单子(可以查看,不可以保存),除了特殊权限的人(maxadmin),或状态为审核不通过(即,返回给申请人);已发出且未结束的工作流,审批人(节点接收人)必须添加自己的审批意见。
////////AppBean类
public int SAVE() throws MXException, RemoteException {
MboRemote mr = getMbo();// 获取主表对象
MboSetRemote msr = mr.getMboSet("zzid");// 通过关联关系获取子表对象,zi表
MboSetRemote msrsp = mr.getMboSet("zhushenpi");// 通过关联关系获取子表对象,zhushenpi主子表的关联关系名
String loginPerson = getMbo().getUserInfo().getPersonId();// 得到当前登录人的名字
String zhuStatus = mr.getString("status"); // 得到主表里的审批状态,status为主表里存储状态的字段
//hasAuth()方法判断是够有权限修改保存单子
if (!hasAuth()) { // 当hasAuth()返回为false时,没有权限修改单子
throw new MXApplicationException("您没有权限修改此计划单子", "");
}
//判断是否要添加审批意见
else if (!(zhuStatus.equals("新建") || zhuStatus.equals("审批不通过"))) {//单子在审批人这里时,不需要有审批意见
//此时需要有审批意见,如果JZSHENPI表为空,说明没有审批意见,则提示
if (!msrsp.isEmpty()) {
for (int i = 0; i < msrsp.count(); i++) {
// 当前登录人在审批表里有没有记录,当前审批表里的状态和主表里的状态是不是一致的
if (!(loginPerson.equalsIgnoreCase(msrsp.getMbo(i) .getString("SHENPIREN")) &&
zhuStatus.equalsIgnoreCase(msrsp.getMbo(i).getString( "SHENPISTATUS")))) {
msrsp.setValue("HASLD", false, 11L);
throw new MXApplicationException("还没有填写你的审批意见", "");
}
}
} else {
throw new MXApplicationException("还没有填写你的审批意见", "");
}
}
if (!msr.isEmpty()) {
mr.setValue("allout", msr.sum("outmoney"));
mr.setValue("allin", msr.sum("inmoney")); mr.setValue("yue", msr.sum("gerenyue"));
}
return super.SAVE();
}
// 这个方法判断当前登录人的权限
public boolean hasAuth() throws MXException, RemoteException {
MboRemote thisMbo = getMbo(); // 得到主表对象
String tableId = thisMbo.getName() + "id"; // 得到主表的id字段名
long codeid = thisMbo.getLong(tableId);// 通过字段名得到这个字段的值,这字段是long类型
String status = thisMbo.getString("status");// 通过字段名去得到该字段的值
String personid = thisMbo.getUserInfo().getPersonId();// 得到当前登录人的名字
if (personid.equalsIgnoreCase("maxadmin")) { // 如果登陆人是maxadmin(或者其他有权限的人),返回true,可以修改单子
return true;
}
// 如果这个app名是prplan并且登录人是jianglei,返回true,可以修改单子(prplan这个应用程序也绑定了这个类,jainglei是特殊权限的)
/* * if ((this.app.getApp().toString().equalsIgnoreCase("PRPLAN")) && (personid.equalsIgnoreCase("jianglei"))) {
return true;
} */
// 如果这个单子的状态是“新建”或者“wappr(表示初始状态)”,返回requestedby字段值和登陆人的比较结果,如果相同,可以修改单子//如果有其他可以修改单子的状态可以再加上
if ((status.equals("新建")) || (status.equals("WAPPR"))) {
return thisMbo.getString("createby").equalsIgnoreCase(personid);
}
if(status.equals("取消操作")){ //如果是创建人取消了操作(结束流程),那么就谁都不可以进行任何操作
return false;
}
// 根据后面的条件从wfinstance表里得到对应的MboSet,==》查有没有符合下列条件的流程 //wfinstance表是保留流程实例信息的
MboSetRemote woinstance = thisMbo.getMboSet("instance", "WFINSTANCE", "ownertable=‘" + thisMbo.getName() + "‘ and ownerid=‘" + codeid + "‘ and active = 1"); // active = 1表示这个流程是活动的(在流程中,已经开始还没有结束)
// 如果这个MboSet为空,直接跳过if,如果不为空,则执行if里面的代码
if (!woinstance.isEmpty()) {
String sql = "ownerid=‘" + codeid + "‘ and ownertable=‘" + thisMbo.getName() + "‘ and assignstatus=‘ACTIVE‘ and assigncode=‘" + personid + "‘";// assigncode=‘" + personid + "‘"
// 根据sql条件从wfassignment表里得到一个MboSet,==》查找这个流程里有没有这个人
MboSetRemote mbosetremote = thisMbo.getMboSet("assigncode", "WFASSIGNMENT", sql);
return !mbosetremote.isEmpty();
}
// 返回requestedby字段值和登陆人的比较结果,如果相同,可以修改单子
return thisMbo.getString("createby").equalsIgnoreCase(personid);
}
////如果有判断不严谨的地方,请大家留言提出,谢谢!
原文:http://www.cnblogs.com/hanyuqin/p/3683077.html