1.AceHeadTailAfterEditHandler.java
package nc.ui.cjkcmg.cjtbxmbg.ace.handler;
import nc.bs.framework.common.NCLocator;
import nc.itf.uap.IUAPQueryBS;
import nc.jdbc.framework.processor.BeanProcessor;
import nc.ui.cjkcmg.pub.translate.Addresstranslate;
import nc.ui.pubapp.uif2app.event.IAppEventHandler;
import nc.ui.pubapp.uif2app.event.card.CardHeadTailAfterEditEvent;
import nc.vo.cjkcmg.cjtbxmbg.CjtbxmbgBVO;
import nc.vo.cjkcmg.cjtbxmdj.CjtbxmdjVO;
import nc.vo.pub.BusinessException;
import nc.vo.pub.lang.UFDate;
import nc.vo.pubapp.pattern.exception.ExceptionUtils;
import nc.vo.wgbfb.utils.NullValueUtils;
/**
* 单据表头表尾字段编辑后事件处理类
* @author hh
*/
public class AceHeadTailAfterEditHandler implements IAppEventHandler<CardHeadTailAfterEditEvent> {
@Override
public void handleAppEvent(CardHeadTailAfterEditEvent e) {
//当前编辑字段的名称
String key=e.getKey();
//判断当前编辑字段的名称是yxxm营销项目
if(key.equals("code")){
try {
//营销项目编辑后带出表头表体信息
yxxmBringoutXx(e);
} catch (BusinessException e1) {
// TODO 自动生成的 catch 块
ExceptionUtils.wrappBusinessException(e1.getMessage());
}
}
}
/**
* 单据表头表尾字段编辑后事件处理类
*
* @since 6.0
* @version 2023-08-15
* @author hh
* @throws BusinessException
*/
private void yxxmBringoutXx(CardHeadTailAfterEditEvent e) throws BusinessException {
//获取表头营销项目字段的值
String code = NullValueUtils.getNullStringValue(e.getBillCardPanel().getHeadItem("code").getValueObject());
//通过营销项目编码查询投标项目登记表头信息
String sql = "select * from cj_tbxmdj where nvl(dr,0) = 0 and code = '" + code + "'";
//将数据库查到的该条记录赋值给headvo
CjtbxmdjVO headvo = (CjtbxmdjVO) getService().executeQuery(sql, new BeanProcessor(CjtbxmdjVO.class));
if(headvo != null){
//给投标项目信息变更 营销项目名称 字段赋值
e.getBillCardPanel().setHeadItem("name", headvo.getName());
//给投标项目信息变更 预计营销额 字段赋值
e.getBillCardPanel().setHeadItem("expectedvolume", headvo.getExpectedvolume());
//给投标项目信息变更 部门 字段赋值
e.getBillCardPanel().setHeadItem("pk_jbdept", headvo.getPk_jbdept());
//给投标项目信息变更 项目类型 字段赋值
e.getBillCardPanel().setHeadItem("pk_markprotype", headvo.getPk_markprotype());
//给投标项目信息变更 专业类型 字段赋值
e.getBillCardPanel().setHeadItem("pk_promajor", headvo.getPk_promajor());
//给投标项目信息变更 项目地点 字段赋值
e.getBillCardPanel().setHeadItem("proposition", headvo.getProposition());
//给投标项目信息变更 招标人名称 字段赋值
e.getBillCardPanel().setHeadItem("zbrname", headvo.getZbrname());
//给投标项目信息变更 招标代理名称 字段赋值
e.getBillCardPanel().setHeadItem("zbdlname", headvo.getZbdlname());
//给投标项目信息变更 联系人 字段赋值
e.getBillCardPanel().setHeadItem("linkman", headvo.getLinkman());
//给投标项目信息变更 联系人电话 字段赋值
e.getBillCardPanel().setHeadItem("linkmaninfo", headvo.getLinkmaninfo());
//给投标项目信息变更 项目控制价(投标) 字段赋值
e.getBillCardPanel().setHeadItem("prokzj", headvo.getProkzj());
//给投标项目信息变更 报名截止时间 字段赋值
e.getBillCardPanel().setHeadItem("bmjzsj", headvo.getBmjzsj());
//给投标项目信息变更 开标时间 字段赋值
e.getBillCardPanel().setHeadItem("kbsj", headvo.getKbsj());
//给投标项目信息变更 标书编制人总体负责人 字段赋值
e.getBillCardPanel().setHeadItem("bsbzrztfzr", headvo.getBsbzrztfzr());
//给投标项目信息变更 拟投入的项目负责人 字段赋值
e.getBillCardPanel().setHeadItem("ntrdxmfzr", headvo.getNtrdxmfzr());
//给投标项目信息变更 拟投入的技术负责人 字段赋值
e.getBillCardPanel().setHeadItem("ntrdjsfzr", headvo.getNtrdjsfzr());
//给投标项目信息变更 版本 字段赋值
e.getBillCardPanel().setHeadItem("version", NullValueUtils.getNullStringValue(Integer.parseInt(headvo.getVersion())+1));
//给投标项目信息变更 备注 字段赋值
e.getBillCardPanel().setHeadItem("memo", headvo.getMemo());
//给投标项目信息变更 附件说明 字段赋值
e.getBillCardPanel().setHeadItem("fjsm", headvo.getFjsm());
//修改前项目地点拼接:邮政编码+国家+省份+城市+县区+详细地址
String beforexmdd = Addresstranslate.getAddressname(NullValueUtils.getNullStringValue(e.getBillCardPanel().getHeadItem("proposition").getValueObject()));
//给投标项目信息变更 营销项目名称 字段赋值
e.getBillCardPanel().setHeadItem("def2", beforexmdd);
//清空表体,目的是为了防止换选营销项目时表体数据累加
int rowCount = e.getBillCardPanel().getBillModel("id_cjtbxmbgbvo").getRowCount();
int[] rows = new int[rowCount];
for (int i = 0; i < rowCount; i++) {
rows[i] = i;
}
e.getBillCardPanel().getBillModel("id_cjtbxmbgbvo").delLine(rows);
//新建投标项目信息变更子表VO
CjtbxmbgBVO tbxmbgBVO=new CjtbxmbgBVO();
//变更人
String userId = e.getContext().getPk_loginUser();
tbxmbgBVO.setBgr(userId);
//变更时间
tbxmbgBVO.setBgsj(new UFDate());
//给页签编码为CjtbxmdjVO增行
e.getBillCardPanel().getBillModel("id_cjtbxmbgbvo").addLine();
e.getBillCardPanel().getBillModel("id_cjtbxmbgbvo").setBodyRowVO(tbxmbgBVO, 0);
e.getBillCardPanel().getBillModel("id_cjtbxmbgbvo").setValueAt((0+1)*10+"", 0, "rowno");
}else{
//如果表头营销项目为空,就清空后面字段以及表体字段的值
emptyXx(e);
}
}
private void emptyXx(CardHeadTailAfterEditEvent e) {
//给投标项目信息变更 营销项目名称 字段赋值
e.getBillCardPanel().setHeadItem("name", null);
//给投标项目信息变更 预计营销额 字段赋值
e.getBillCardPanel().setHeadItem("expectedvolume", null);
//给投标项目信息变更 部门 字段赋值
e.getBillCardPanel().setHeadItem("pk_jbdept", null);
//给投标项目信息变更 项目类型 字段赋值
e.getBillCardPanel().setHeadItem("pk_markprotype", null);
//给投标项目信息变更 专业类型 字段赋值
e.getBillCardPanel().setHeadItem("pk_promajor", null);
//给投标项目信息变更 项目地点 字段赋值
e.getBillCardPanel().setHeadItem("proposition", null);
//给投标项目信息变更 招标人名称 字段赋值
e.getBillCardPanel().setHeadItem("zbrname", null);
//给投标项目信息变更 招标代理名称 字段赋值
e.getBillCardPanel().setHeadItem("zbdlname", null);
//给投标项目信息变更 联系人 字段赋值
e.getBillCardPanel().setHeadItem("linkman", null);
//给投标项目信息变更 联系人电话 字段赋值
e.getBillCardPanel().setHeadItem("linkmaninfo", null);
//给投标项目信息变更 项目控制价(投标) 字段赋值
e.getBillCardPanel().setHeadItem("prokzj", null);
//给投标项目信息变更 报名截止时间 字段赋值
e.getBillCardPanel().setHeadItem("bmjzsj", null);
//给投标项目信息变更 开标时间 字段赋值
e.getBillCardPanel().setHeadItem("kbsj", null);
//给投标项目信息变更 标书编制人总体负责人 字段赋值
e.getBillCardPanel().setHeadItem("bsbzrztfzr", null);
//给投标项目信息变更 拟投入的项目负责人 字段赋值
e.getBillCardPanel().setHeadItem("ntrdxmfzr", null);
//给投标项目信息变更 拟投入的技术负责人 字段赋值
e.getBillCardPanel().setHeadItem("ntrdjsfzr", null);
//给投标项目信息变更 版本 字段赋值
e.getBillCardPanel().setHeadItem("version", null);
//给投标项目信息变更 备注 字段赋值
e.getBillCardPanel().setHeadItem("memo", null);
//给投标项目信息变更 附件说明 字段赋值
e.getBillCardPanel().setHeadItem("fjsm", null);
//清空表体
int rowCount = e.getBillCardPanel().getBillModel("id_cjtbxmbgbvo").getRowCount();
int[] rows = new int[rowCount];
for (int i = 0; i < rowCount; i++) {
rows[i] = i;
}
e.getBillCardPanel().getBillModel("id_cjtbxmbgbvo").delLine(rows);
}
//前端使用数据库查询语句必须增加的方法
private IUAPQueryBS service;
private IUAPQueryBS getService() {
if (service == null) {
service = NCLocator.getInstance().lookup(IUAPQueryBS.class);
}
return service;
}
}
2.SaveWriteBackBillsRule.java
package nc.bs.cjkcmg.cjtbxmbg.ace.bp.rule;
import java.util.HashMap;
import java.util.Map;
import nc.bs.dao.BaseDAO;
import nc.impl.pubapp.pattern.rule.IFilterRule;
import nc.jdbc.framework.processor.BeanProcessor;
import nc.ui.cjkcmg.pub.translate.Addresstranslate;
import nc.vo.cjkcmg.cjtbxmbg.AggCjtbxmbgVO;
import nc.vo.cjkcmg.cjtbxmbg.CjtbxmbgVO;
import nc.vo.pub.BusinessException;
import nc.vo.pub.SuperVOUtil;
import nc.vo.pub.lang.UFDouble;
import nc.vo.pubapp.pattern.exception.ExceptionUtils;
import nc.vo.pubapp.pattern.pub.SqlBuilder;
import nc.vo.wgbfb.utils.NullValueUtils;
public class SaveWriteBackBillsRule implements IFilterRule<AggCjtbxmbgVO> {
@Override
public AggCjtbxmbgVO[] process(AggCjtbxmbgVO[] aggvos) {
for (int i = 0; i < aggvos.length; i++) {
try {
saveWriteBackBills(aggvos[i]);
} catch (BusinessException e) {
ExceptionUtils.wrappBusinessException("保存回写变更前和变更后内容失败:" + e.getMessage());
}
}
return aggvos;
}
/*
*回写变更前内容和变更后内容字段
*/
private void saveWriteBackBills(AggCjtbxmbgVO aggvo) throws BusinessException{
if(aggvo.getParentVO().getVersion().equals("1")){
return;
}
//营销项目
String code = NullValueUtils.getNullStringValue(aggvo.getParentVO().getCode());
//获取变更前VO
SqlBuilder sql = new SqlBuilder();
sql.append(" select code, ");//营销项目编码
sql.append(" name, ");//营销项目名称
sql.append(" expectedvolume, ");//预计营销额
sql.append(" pk_jbdept, ");//部门
sql.append(" pk_markprotype, ");//项目类型
sql.append(" pk_promajor, ");//专业类型
sql.append(" proposition, ");//项目地点
sql.append(" zbrname, ");//招标人名称
sql.append(" zbdlname, ");//招标代理名称
sql.append(" linkman, ");//联系人
sql.append(" linkmaninfo, ");//联系人电话
sql.append(" prokzj, ");//项目控制价(投资)
sql.append(" bmjzsj, ");//报名截止时间
sql.append(" kbsj, ");//开标时间
sql.append(" bsbzrztfzr, ");//标书编制人总体负责人
sql.append(" ntrdxmfzr, ");//拟投入的项目负责人
sql.append(" ntrdjsfzr, ");//拟投入的技术负责人
sql.append(" memo, ");//备注
sql.append(" fjsm ");//附件说明
sql.append(" from cj_tbxmdj ");
sql.append(" where nvl(dr,0) = 0 ");
sql.append(" and code = '"+ code +"' ");
//获取变更前VO
CjtbxmbgVO beforevo = (CjtbxmbgVO) getDao().executeQuery(sql.toString(), new BeanProcessor(CjtbxmbgVO.class));
//获取变更后VO
CjtbxmbgVO aftervo = aggvo.getParentVO();
//翻译变更前的参照类型
CjtbxmbgVO exebeforevo = execFormulaWithVOs(beforevo);
//处理UFDouble类型数据
//处理预计营销额
exebeforevo.setAttributeValue("expectedvolume",NullValueUtils.getNullUFdoubleValue(exebeforevo.getExpectedvolume()).setScale(2, UFDouble.ROUND_HALF_UP));
//处理项目控制价
exebeforevo.setAttributeValue("prokzj",NullValueUtils.getNullUFdoubleValue(exebeforevo.getProkzj()).setScale(2, UFDouble.ROUND_HALF_UP));
//翻译变更后的参照类型
CjtbxmbgVO exeaftervo = execFormulaWithVOs(aftervo);
//处理UFDouble类型数据
//处理预计营销额
exeaftervo.setAttributeValue("expectedvolume",NullValueUtils.getNullUFdoubleValue(exeaftervo.getExpectedvolume()).setScale(2, UFDouble.ROUND_HALF_UP));
//处理项目控制价
exeaftervo.setAttributeValue("prokzj",NullValueUtils.getNullUFdoubleValue(exeaftervo.getProkzj()).setScale(2, UFDouble.ROUND_HALF_UP));
//修改前项目地点拼接:邮政编码+国家+省份+城市+县区+详细地址
String beforexmdd = NullValueUtils.getNullStringValue(exeaftervo.getDef2());
//修改后项目地点拼接:邮政编码+国家+省份+城市+县区+详细地址
String afterxmdd = Addresstranslate.getAddressname(NullValueUtils.getNullStringValue(exeaftervo.getProposition()));
//新建map,键存放字段编码,值存放字段名称
Map<String, String> bmmcmap = new HashMap<>();
//map中的键:编码
String[] bm = new String[] {"code","name","expectedvolume","pk_jbdept","pk_markprotype","pk_promajor",
"proposition","zbrname","zbdlname","linkman","linkmaninfo","prokzj","bmjzsj","kbsj","bsbzrztfzr",
"ntrdxmfzr","ntrdjsfzr","memo","fjsm"};
//map中的值:名称
String[] mc = new String[] {"营销项目编码","营销项目名称","预计营销额","部门","项目类型","专业类型","项目地点",
"招标人名称","招标代理名称","联系人","联系人电话","项目控制价(投资)","报名截止时间","开标时间","标书编制人总体负责人",
"拟投入的项目负责人","拟投入的技术负责人","备注","附件说明"};
//将数组中的编码和名称存放到map中
for(int i=0; i<bm.length; i++){
bmmcmap.put(bm[i], mc[i]);
}
//存储变更前内容
StringBuilder bgq = new StringBuilder();
//存储变更后内容
StringBuilder bgh = new StringBuilder();
//判断变更前和变更后的内容是否相同
for(int i=0; i<bm.length; i++){
if(!NullValueUtils.getNullStringValue(exebeforevo.getAttributeValue(bm[i])).equals(NullValueUtils.getNullStringValue(exeaftervo.getAttributeValue(bm[i])))){
bgq.append(bmmcmap.get(bm[i])).append(":").append(NullValueUtils.getNullStringValue(exebeforevo.getAttributeValue(bm[i]))).append(";");
bgh.append(bmmcmap.get(bm[i])).append(":").append(NullValueUtils.getNullStringValue(exeaftervo.getAttributeValue(bm[i]))).append(";");
}
}
if(!NullValueUtils.getNullStringValue(beforexmdd).equals(NullValueUtils.getNullStringValue(afterxmdd))){
bgq.append("项目地点").append(":").append(beforexmdd).append(";");
bgh.append("项目地点").append(":").append(afterxmdd).append(";");
}
//清空报存后的自定义项
// aggvo.getParentVO().setDef2(null);
if(bgq.length() > 0){
//去除拼接后字符串尾部的“;”
bgq.deleteCharAt(bgq.lastIndexOf(";"));
bgh.deleteCharAt(bgh.lastIndexOf(";"));
}
if(aggvo.getChildrenVO().length > 0){
//将变更前内容和变更后内容赋值到表体变更前内容和变更后内容字段
aggvo.getChildrenVO()[0].setAttributeValue("bgqnr", bgq.toString());
aggvo.getChildrenVO()[0].setAttributeValue("bghnr", bgh.toString());
}else{
throw new BusinessException("当前表体为空!");
}
}
/**
* @desc: 档案翻译
* @author: hanh
* @date 2023年8月18日 下午10:55:22
*/
private CjtbxmbgVO execFormulaWithVOs(CjtbxmbgVO hvo) {
CjtbxmbgVO clonevo = (CjtbxmbgVO) hvo.clone();
SuperVOUtil.execFormulaWithVOs(new CjtbxmbgVO[] {clonevo}, new String[] {
//营销项目
"code->getcolvalue(cj_yxproject,code,pk_yxproject,code)",
//部门
"pk_jbdept->getcolvalue(org_dept,name,pk_dept,pk_jbdept)",
//项目类型
"pk_markprotype->getcolvalue(bd_defdoc,name,pk_defdoc,pk_markprotype)",
//专业类型
"pk_promajor->getcolvalue(bd_defdoc,name,pk_defdoc,pk_promajor)",
//标书编制人总体负责人
"bsbzrztfzr->getcolvalue(bd_psndoc,name,pk_psndoc,bsbzrztfzr)",
//拟投入的项目负责人
"ntrdxmfzr->getcolvalue(bd_psndoc,name,pk_psndoc,ntrdxmfzr)",
//拟投入的技术负责人
"ntrdjsfzr->getcolvalue(bd_psndoc,name,pk_psndoc,ntrdjsfzr)"
});
return clonevo;
}
private BaseDAO dao;
private BaseDAO getDao(){
if(dao == null){
dao = new BaseDAO();
}
return dao;
}
}
3.Addresstranslate.java
package nc.ui.cjkcmg.pub.translate;
import nc.bs.framework.common.NCLocator;
import nc.itf.uap.IUAPQueryBS;
import nc.jdbc.framework.processor.ArrayProcessor;
import nc.vo.pub.BusinessException;
import nc.vo.pubapp.pattern.pub.SqlBuilder;
import nc.vo.util.NullUtils;
/**
* 地址簿翻译
* @author sh
* @date : 2023-08-25
*/
public class Addresstranslate {
public static String getAddressname(String value) throws BusinessException {
IUAPQueryBS service = NCLocator.getInstance().lookup(IUAPQueryBS.class);
// TODO 自动生成的方法存根
SqlBuilder aftersb = new SqlBuilder();
aftersb.append(" select bs.postcode, ");//邮政编码0
aftersb.append(" be.name, ");//国家1
aftersb.append(" bn.name, ");//省份2
aftersb.append(" bon.name, ");//城市3
aftersb.append(" bdn.name, ");//县区4
aftersb.append(" bs.detailinfo ");//详细地址5
aftersb.append(" from bd_address bs ");
aftersb.append(" left join bd_countryzone be ");//国家地区
aftersb.append(" on be.pk_country = bs.country ");
aftersb.append(" left join bd_region bn ");//省份
aftersb.append(" on bn.pk_region = bs.province ");
aftersb.append(" left join bd_region bon ");//城市
aftersb.append(" on bon.pk_region = bs.city ");
aftersb.append(" left join bd_region bdn ");//县区
aftersb.append(" on bdn.pk_region = bs.vsection ");
aftersb.append(" where nvl(bs.dr,0) = 0 ");
aftersb.append(" and nvl(be.dr,0) = 0 ");
aftersb.append(" and nvl(bn.dr,0) = 0 ");
aftersb.append(" and nvl(bon.dr,0) = 0 ");
aftersb.append(" and nvl(bdn.dr,0) = 0 ");
aftersb.append(" and bs.pk_address = '"+ value +"' ");
Object[] afterobjs = (Object[]) service.executeQuery(aftersb.toString(), new ArrayProcessor());
String xmdd = "";
if(afterobjs != null && afterobjs.length > 0) {
xmdd = NullUtils.getStringNullValue(afterobjs[0]) + NullUtils.getStringNullValue(afterobjs[1])
+ NullUtils.getStringNullValue(afterobjs[2]) + NullUtils.getStringNullValue(afterobjs[3])
+ NullUtils.getStringNullValue(afterobjs[4]) + NullUtils.getStringNullValue(afterobjs[5]);
return xmdd;
}
return null;
}
}