U8C单据相关知识点总结
增加单据按钮
继承AddAction类重写execute()方法:点击该按钮的时候会执行相关动作
@Override
public void execute() throws Exception {
super.execute();
TrUI ui = (TrUI) this.getFrameUI();
//设置当前单据的值
ui.getBillCardPanel().setHeadItem(SpectacleFramesVO.PK_CORP, PubEnv.getPk_corp()); // 默认当前公司
//点击增加按钮的时候表体增加一行数据
//setBodyValueAt(单元格显示的内容,表体第几行,表体行的单元格字段)
ui.getBillCardPanel().setBodyValueAt("镜框颜色", 0, LensVO.LENS_COLOR);
//表体增行
ui.getBillCardPanel().getBillModel().addLine();
}
前台校验
@Override
public boolean validate() throws ValidationException {
return super.validate();
}
插入一行数据
//row为在表体第几行下面插入一行
ui.getBillCardPanel().getBillModel().insertRow(row);
判断是否为卡片
ui.getBillCardPanel().isShowing()
弹窗 (在哪个UI进行弹窗,弹窗标题,弹窗内容),会阻止程序继续进行
MessageDialog.showErrorDlg(frameUI, "错误", "不能在首行插入行");
显示在单据UI左下角
getFrameUI().showHintMessage("确认完毕");
卡片状态下获取选中的表体行
int row = ui.getBillCardPanel().getBillTable().getSelectedRow();
获取当前单据状态
ui.getDataModel().getState().getCurrentState()
获取卡片状态下表头的具体字段的值
//ForecastMainVO.VOPERATORID = 表头具体字段名
ui.getBillCardPanel().getHeadItem(ForecastMainVO.VOPERATORID)
获取当前单据的值
- 第一种,从主面板获取
AgVatMainPanel mainMgrPanel = (AgVatMainPanel) (ui.getMainPanel());// 获取主面板
//必须用HRAggVO ,不能用AggForecastMainVO,否则造成系统卡死
HRAggVO agg = (HRAggVO)getMainPanel().getData();//聚合VO
ForecastMainVO cta=(ForecastMainVO)agg.getParentVO();//获取表头的VO
获取卡片状态单据的表体具体行的数据
int[] row = mainMgrPanel.getBillCardPanel().getBillTable()
.getSelectedRows();//卡片状态,当前表体有几行
ForecastSubVO namesa = (ForecastSubVO) mainMgrPanel
.getBillCardPanel()
.getBillModel()
.getBodyValueRowVO(row[j], //第几行
ForecastSubVO.class.getName()); //表体VO
2.从卡片面板获取卡片数据
//获取表头数据 -表头绑定的vo类的全路径名
SpectacleFramesVO headerValueVO = (SpectacleFramesVO)frameUI.getBillCardPanel().getBillData().getHeaderValueVO("u8c.vo.so.SpectacleFramesVO");
//获取表体数据 -表体绑定的vo类表名和全路径名
frameUI.getBillCardPanel().getBillData().getBodyValueVOs(tableCode, bodyVOName)
列表获取选中行
// 获取选中行
int selectedRow = ((MyMainPanel) getMainPanel()).getSelectedRow();
//获取选中行的聚合VO
HRAggVO [] s = (HRAggVO[]) mainMgrPanel.getMainBillListPanel().getData();
//获取表头VO
TmApplyMainVO cta = (TmApplyMainVO) s[selectedRow].getParentVO();
//获取表体VO
TmApplySubVO[] bt = (TmApplySubVO[])s[selectedRow].getChildrenVO();
设置列表面板数据
//列表面板--> 第一个表头选择表体是不是也跟着被选中,第二个参数是否开启一键全选,一键取消全选
BillListPanel listpanelon = new BillListPanel(true,true);
//设置列表的表头数据
listpanelon.getHeadBillModel().setBodyDataVO((SaleorderHVO[]) list.toArray(new SaleorderHVO[0]));
//设置列表的表体数据
listpanelon.getBodyBillModel().setBodyDataVO((SaleorderBVO[]) vo.toArray(new SaleorderBVO[0]));
获取已有的列表面板
private Component getListPanelOn() throws Exception {
// 加载模板
// listpanelon.loadTemplet("104002", "", ClientEnvironment.getInstance()
// .getUser().getPrimaryKey(), ClientEnvironment.getInstance()
// .getCorporation().getPrimaryKey());
IBillTemplateQry templetService = NCLocator.getInstance().lookup(
IBillTemplateQry.class);
IUAPQueryBS bsDao = (IUAPQueryBS) NCLocator
.getInstance().lookup(
IUAPQueryBS.class.getName());
//根据节点编码查询单据模板主键
// String sql = "select pk_billtemplet from pub_billtemplet where nodecode ='10229002'";
// String TemplateId = (String) bsDao.executeQuery(sql,
// new ColumnProcessor());
listpanelon.setListData(new BillListData(templetService
.findTempletData("so000000000saleorder")));//so000000000saleorder为单据模板主键
}
设置列表面板某一字段可编辑同样适用于卡片
//参数为该字段对应的字段名
BillItem headItem = listpanelon.getHeadItem("ntotalnum");
headItem.setEnabled(true);
//获取该字段对应的输入框面板
nc.ui.pub.beans.UIRefPane component = (nc.ui.pub.beans.UIRefPane)headItem.getComponent();
//获取面板上的输入框
UITextField uiTextField = component.getUITextField();
获取列表面板选中的表头数据
ForecastHzbVO[] vos = (ForecastHzbVO[]) listpanelon.getHeadBillModel()
.getBodySelectedVOs(ForecastHzbVO.class.getName());
返回到列表面板
AgVatUI ui = (AgVatUI) this.getFrameUI();
AgVatMainPanel mainPanel = (AgVatMainPanel) (ui.getMainPanel());// 获取主面板
//清除数据
mainPanel.clearView();
//展示页面 -->列表页面
mainPanel.show("LIST_PANEL");
mainPanel.setMainPanelEnabled(false);
int iSelectRowIndex = mainPanel.getMainBillListPanel()
.getHeadSelectedRow();
if (iSelectRowIndex != -1) {
mainPanel.getMainBillListPanel().setHeadSelectedRow(-1, -1);
mainPanel.getMainBillListPanel().setHeadSelectedRow(
iSelectRowIndex, iSelectRowIndex);
}
/*
设置回滚状态
getDataModel().setRollBackState(getDataModel().getCurrentState());
**/
// 设置单据状态 8是STATE_LINE_SELECTED 0是STATE_INIT
getDataModel().setCurrentState(iSelectRowIndex != -1 ? 8 : 0);
super.execute();
设置主面板可见不可见
ui. getMainPanel().setMainPanelEnabled(true);//可见
获取登录信息
String userID = InvocationInfoProxy.getInstance().getUserId();//获取当前系统登录用户
String groupId = InvocationInfoProxy.getInstance().getGroupId()//获取当前系统登录组织
String corpId = PubEnv.getPk_corp()//获取当前系统登陆公司
发送消息
CommonMessageVO msgVO=new CommonMessageVO();
/** 消息内容 */
msgVO.setMessageContent("销售["+ClientEnvironment.getInstance().getUser()
.getUserName()+"]已提交forecast单据"+cta.getCcode()+",待PM审核");
/** 接收人pk ->代码在下面 */
UserNameObject[] cno=ipti.queryMsgUsers("'602'");//审核角色
msgVO.setReceiver(cno);
/** 发送人PK sm_user.cuserid */
msgVO.setSender(ClientEnvironment.getInstance().getUser().getPrimaryKey());
/** 发送时间 */
msgVO.setSendDataTime(PubEnv.getServerTime());
/** 标题 */
msgVO.setTitle("销售["+ClientEnvironment.getInstance().getUser()
.getUserName()+"]已提交forecast单据"+cta.getCcode()+",待PM审核");
/**单据类型*/
msgVO.setBilltype("FORE");
/**消息优先级*/
msgVO.setPriority( MessagePriority.PRI_NORMAL);
IPFMessage ipf = (IPFMessage) NCLocator
.getInstance()
.lookup(IPFMessage.class.getName());
ipf.insertCommonMsg(msgVO);
接收人角色查询----根据角色code查询具体人员
public UserNameObject[] queryMsgUsers(String role_code) throws BusinessException {
try {
BaseDAO dao = new BaseDAO();
String sql = "select distinct sm_user.cuserid pk, sm_user.user_code code, sm_user.user_name name, sm_user.pk_corp pkcorp ";
sql =sql+" from sm_user inner join sm_user_role on sm_user.cuserid = sm_user_role.cuserid ";
sql =sql+" inner join sm_role on sm_role.pk_role=sm_user_role.pk_role where role_code in ("+role_code+")";
UserNameObject[] itemVOs =new UserNameObject[]{};
ArrayList<UserNameObject> itemvos = new ArrayList<UserNameObject>();
UserNameObject bvo = null;
List list = (List)dao.executeQuery(sql, new ArrayListProcessor());
for (int i = 0; i < list.size(); i++) {
Object[] arry = (Object[])list.get(i);
bvo=new UserNameObject(arry[2].toString());
bvo.setUserPK(arry[0].toString());
bvo.setUserCode(arry[1].toString());
bvo.setUserName(arry[2].toString());
bvo.setPkcorp(arry[3].toString());
itemvos.add(bvo);
}
return (UserNameObject[]) itemvos.toArray(new UserNameObject[0]);
//return (UserNameObject[]) list.toArray(new UserNameObject[list.size()]);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
卡片状态下表体变颜色
int r = BillUtil.getBillItemIndex(ui.getBillCardPanel().getHeadItems(), SpectacleFramesVO.FRAMES_COLOR);
//变成什么颜色 , selectedRow->选中行 , 选中行的第几个字段
ui.getBillCardPanel().getBillModel().setBackground(Color.red, selectedRow, 1);
参考链接
表体变色
取其精华,去其糟粕
标题u8c中的upm定义
<?xml version="1.0" encoding="UTF-8"?>
<!---->
<module name="hrlb">
<public>
<component priority="0" singleton="true" remote="true" tx="CMT" supportAlias="true">
<interface>u8c.itf.hr.lb.INewPayTotalInfo</interface>
<implementation>u8c.impl.lb.lb_011.NewPayTotalInfoImpl</implementation>
</component>
</public>
</module>
参数介绍
属性名称 | 属性作用 |
---|---|
name | 组件的名称,如果没配,默认为第一个接口的名称,如果没有接口,为实现类的名称 |
singleton | 组件级别是否为单例,默认为true |
remote | 组件是否未远程组件,默认为false,远程组件必须要有接口 |
tx | 事务属性, NONE表示没有事务,CMT表示容器管理的事务,BMT表示Bean管理的事务 |
cluster | 标志组件的集群属性,默认为NORMAL,表示不是集群组件,SP表示为运行于主节点,其它表示与某个服务运行在同一个节点 |
tx | 事务属性, NONE表示没有事务,CMT表示容器管理的事务,BMT表示Bean管理的事务 |
cluster | 标志组件的集群属性,默认为NORMAL,表示不是集群组件,SP表示为运行于主节点,其它表示与某个服务运行在同一个节点 |
supportAlias | 默认为false,表示是否能够按照接口进行查找组件 |
priority | 组件的属性,按照JavaBean的规范 |
accessProtected | 接口在系统中是否受保护,即是否校验token。需要改底层代码,请设置accessProtected=“false” |
public | 可以被NCLocator查找到,支持所有component组件属性 |
private | 私有组件只能被当前组件所部署的模块通过ComponentContext查找到,私有组件没有remote、tx属性,其余component组件属性都支持 |
singleton | 设置为true的时候有并发风险,单例模式 |
生成主键和单据号
最简单的办法,调用用友的类
------------------------------------------------
import nc.jdbc.framework.generator.SequenceGenerator;
IdGenerator idGenerator = new SequenceGenerator();
System.out.println(idGenerator.generate());
算法分析:
--------------------------------------------------
PK=4位(集团编码)+2位(数据源ID)+14位(流水号)
4位(集团编码)=select groupno from org_group where code='集团代码'
2位(数据源ID)=自己运行sysConfig.bat,看标识ID
14位(流水号)=select idnumber from PUB_OID where pk_corp='集团编码',注意这个idnumber是基础流水号
基础流水号+1后,通过一些转换,就生成了流水号,主要是限制每位流水号字符在0~9|A-Z之间.
//生成单据号
IBillcodeManage iBillcodeManage = (IBillcodeManage)NCLocator
.getInstance().lookup(IBillcodeManage.class.getName());
//(单据类型,pk_group,pk_org,单据VO)
String standardCode = iBillcodeManage
.getBillCode_RequiresNew("6113", pk_fa, pk_fa, new StapplyVO());