nc65审批后回写(单据刷新)
1. 需求
审批通过后将之前截止会计期间为空的单据,截止会计期间设置为当前单据的开始会计期间。
2. 功能实现
- 审批后规则
ApproveWriteBackRule.java
package nc.bs.jych.glfpzd.ace.bp.rule;
import java.util.List;
import nc.bs.dao.BaseDAO;
import nc.bs.framework.common.NCLocator;
import nc.impl.pubapp.pattern.rule.IRule;
import nc.itf.jych.IGlfpzdMaintain;
import nc.jdbc.framework.processor.ColumnListProcessor;
import nc.vo.jych.glfpzd.AggGlfpzdVO;
import nc.vo.pub.BusinessException;
import nc.vo.pubapp.pattern.exception.ExceptionUtils;
import nc.vo.pubapp.pattern.pub.SqlBuilder;
public class ApproveWriteBackRule implements IRule<AggGlfpzdVO>{
@Override
public void process(AggGlfpzdVO[] aggvos) {
for (int i = 0; i < aggvos.length; i++) {
try {
//审批通过后将之前截止会计期间为空的单据,截止会计期间设置为当前单据的开始会计期间
approveAfterWrite(aggvos[i]);
} catch (BusinessException e) {
ExceptionUtils.wrappBusinessException(e.getMessage());
}
}
}
//审批通过后将之前截止会计期间为空的单据,截止会计期间设置为当前单据的开始会计期间
private void approveAfterWrite(AggGlfpzdVO aggvo) throws BusinessException{
SqlBuilder sqlBuilder = new SqlBuilder();
sqlBuilder.append(" select h.pk_glfpzd ");
sqlBuilder.append(" from jych_glfpzd h ");
sqlBuilder.append(" inner join bd_accperiodmonth mon on h.kskjqj = mon.pk_accperiodmonth ");
sqlBuilder.append(" where nvl(h.dr, 0) = 0 ");
sqlBuilder.append(" and nvl(h.jzkjqj,'~') = '~' ");
sqlBuilder.append(" and billstatus = 1 ");
sqlBuilder.append(" and mon.yearmth < (select yearmth from bd_accperiodmonth where pk_accperiodmonth = '"+aggvo.getParentVO().getKskjqj()+"') ");
List<String> pklist = (List<String>) getDao().executeQuery(sqlBuilder.toString(), new ColumnListProcessor());
if(pklist != null && pklist.size() > 0){
SqlBuilder sb = new SqlBuilder();
sb.append(" update jych_glfpzd ");
sb.append(" set jzkjqj = '"+aggvo.getParentVO().getKskjqj()+"' ");
sb.append(" where nvl(dr, 0) = 0 ");
sb.append(" and nvl(jzkjqj,'~') = '~' ");
sb.append(" and pk_glfpzd", pklist.toArray(new String[0]));
getDao().executeUpdate(sb.toString());
}
}
private BaseDAO dao;
private BaseDAO getDao(){
if(dao == null){
dao = new BaseDAO();
}
return dao;
}
//要修改哪个单子调哪个单子的接口
private IGlfpzdMaintain service;
private IGlfpzdMaintain getService(){
if (service == null) {
service = NCLocator.getInstance().lookup(IGlfpzdMaintain.class);
}
return service;
}
}
- 重写审批按钮(审批后执行刷新操作)
ApproveScriptAction.java
package nc.ui.jych.glfpzd.ace.action;
import java.awt.event.ActionEvent;
import java.util.List;
import nc.bs.framework.common.NCLocator;
import nc.itf.jych.IGlfpzdMaintain;
import nc.vo.jych.glfpzd.AggGlfpzdVO;
public class ApproveScriptAction extends nc.ui.pubapp.uif2app.actions.pflow.ApproveScriptAction{
/**
*
*/
private static final long serialVersionUID = 1L;
@SuppressWarnings("unchecked")
@Override
public void doAction(ActionEvent e) throws Exception {
super.doAction(e);
List<AggGlfpzdVO> list = model.getData();
AggGlfpzdVO[] aggvos = getService().queryGlfpzd(list);
// 将数据显示到界面
if(aggvos != null && aggvos.length > 0){
this.getModel().initModel(aggvos);
}else{
this.getModel().initModel(null);
}
}
private IGlfpzdMaintain service;
private IGlfpzdMaintain getService(){
if(service == null){
service = NCLocator.getInstance().lookup(IGlfpzdMaintain.class);
}
return service;
}
}
- 单据刷新方法(刷新多行)
GlfpzdMaintainImpl.java
package nc.impl.jych;
import java.util.ArrayList;
import java.util.List;
import nc.bs.dao.BaseDAO;
import nc.impl.pub.ace.AceGlfpzdPubServiceImpl;
import nc.impl.pubapp.pattern.data.bill.BillQuery;
import nc.itf.jych.IGlfpzdMaintain;
import nc.ui.querytemplate.querytree.IQueryScheme;
import nc.vo.jych.glfpzd.AggGlfpzdVO;
import nc.vo.pub.BusinessException;
public class GlfpzdMaintainImpl extends AceGlfpzdPubServiceImpl
implements IGlfpzdMaintain {
@Override
public void delete(AggGlfpzdVO[] clientFullVOs,
AggGlfpzdVO[] originBills) throws BusinessException {
super.pubdeleteBills(clientFullVOs, originBills);
}
@Override
public AggGlfpzdVO[] insert(AggGlfpzdVO[] clientFullVOs,
AggGlfpzdVO[] originBills) throws BusinessException {
return super.pubinsertBills(clientFullVOs, originBills);
}
@Override
public AggGlfpzdVO[] update(AggGlfpzdVO[] clientFullVOs,
AggGlfpzdVO[] originBills) throws BusinessException {
return super.pubupdateBills(clientFullVOs, originBills);
}
@Override
public AggGlfpzdVO[] query(IQueryScheme queryScheme)
throws BusinessException {
return super.pubquerybills(queryScheme);
}
@Override
public AggGlfpzdVO[] save(AggGlfpzdVO[] clientFullVOs,
AggGlfpzdVO[] originBills) throws BusinessException {
return super.pubsendapprovebills(clientFullVOs, originBills);
}
@Override
public AggGlfpzdVO[] unsave(AggGlfpzdVO[] clientFullVOs,
AggGlfpzdVO[] originBills) throws BusinessException {
return super.pubunsendapprovebills(clientFullVOs, originBills);
}
@Override
public AggGlfpzdVO[] approve(AggGlfpzdVO[] clientFullVOs,
AggGlfpzdVO[] originBills) throws BusinessException {
return super.pubapprovebills(clientFullVOs, originBills);
}
@Override
public AggGlfpzdVO[] unapprove(AggGlfpzdVO[] clientFullVOs,
AggGlfpzdVO[] originBills) throws BusinessException {
return super.pubunapprovebills(clientFullVOs, originBills);
}
@Override
public AggGlfpzdVO[] queryGlfpzd(List<AggGlfpzdVO> list)
throws Exception {
// TODO 自动生成的方法存根
List<String> pklist = new ArrayList<>();
for(AggGlfpzdVO aggvo : list){
pklist.add(aggvo.getParentVO().getPk_glfpzd());
}
BillQuery<AggGlfpzdVO> billQuery = new BillQuery< AggGlfpzdVO>( AggGlfpzdVO.class);
AggGlfpzdVO[] aggvos = billQuery.query(pklist.toArray(new String[0]));
return aggvos;
}
private BaseDAO dao;
private BaseDAO getDao(){
if(dao == null){
dao = new BaseDAO();
}
return dao;
}
}
3. 总结
审批后回写完后需要调用刷新功能前台才能显示,刷新的本质实质上就是从前台获取到要刷新数据的主键,拿主键去后台查询该主键对应的aggvo,将查询到的aggvo重新初始化在界面上,单据刷新有两种刷新办法如下:
- 方法一:(一次刷新一张单据的时候使用)
package nc.ui.jych.clsbcbys.ace.action;
import java.awt.event.ActionEvent;
import nc.bs.framework.common.NCLocator;
import nc.itf.pubapp.pub.smart.IBillQueryService;
import nc.md.persist.framework.IMDPersistenceQueryService;
import nc.md.persist.framework.MDPersistenceService;
import nc.ui.ml.NCLangRes;
import nc.vo.pub.AggregatedValueObject;
import nc.vo.pub.BusinessException;
import nc.vo.pub.SuperVO;
import nc.vo.pubapp.pattern.model.entity.bill.AbstractBill;
public class SaveAction extends nc.ui.pubapp.uif2app.actions.pflow.SaveScriptAction{
private static final long serialVersionUID = 1L;
public SaveAction() {
// TODO 自动生成的构造函数存根
setCode("saveAction");
setBtnName("保存");
}
@Override
public void doAction(ActionEvent e) throws Exception {
// TODO 自动生成的方法存根
super.doAction(e);
doRefresh();
}
private void doRefresh() throws Exception {
// TODO 自动生成的方法存根
Object obj = model.getSelectedData();
if (obj != null)
if (obj instanceof SuperVO) {
SuperVO oldVO = (SuperVO) obj;
SuperVO newVO = (SuperVO) getMDQueryService()
.queryBillOfVOByPK(oldVO.getClass(),
oldVO.getPrimaryKey(), false);
if (newVO == null)
throw new BusinessException(NCLangRes.getInstance()
.getStrByID("uif2", "RefreshSingleAction-000000"));
model.directlyUpdate(newVO);
} else if (obj instanceof AbstractBill) {
AbstractBill oldVO = (AbstractBill) obj;
String pk = oldVO.getParentVO().getPrimaryKey();
IBillQueryService billQuery = (IBillQueryService) NCLocator
.getInstance()
.lookup(nc.itf.pubapp.pub.smart.IBillQueryService.class);
AggregatedValueObject newVO = billQuery.querySingleBillByPk(
oldVO.getClass(), pk);
if (newVO == null)
throw new BusinessException(NCLangRes.getInstance()
.getStrByID("uif2", "RefreshSingleAction-000000"));
model.directlyUpdate(newVO);
} else {
}
}
private IMDPersistenceQueryService getMDQueryService() {
return MDPersistenceService.lookupPersistenceQueryService();
}
}
- 方法二:(一次刷新多张单据的时候使用)
也就是该例子中用到的方法