<!-- [if !mso]> <style> v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VML);} .shape {behavior:url(#default#VML);} </style> <![endif]--><!-- [if gte mso 9]><xml> <w:WordDocument> <w:View>Normal</w:View> <w:Zoom>0</w:Zoom> <w:PunctuationKerning/> <w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing> <w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery> <w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery> <w:ValidateAgainstSchemas/> <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid> <w:IgnoreMixedContent>false</w:IgnoreMixedContent> <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText> <w:Compatibility> <w:SpaceForUL/> <w:BalanceSingleByteDoubleByteWidth/> <w:DoNotLeaveBackslashAlone/> <w:ULTrailSpace/> <w:DoNotExpandShiftReturn/> <w:AdjustLineHeightInTable/> <w:BreakWrappedTables/> <w:SnapToGridInCell/> <w:WrapTextWithPunct/> <w:UseAsianBreakRules/> <w:DontGrowAutofit/> <w:UseFELayout/> </w:Compatibility> <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel> </w:WordDocument> </xml><![endif]--><!-- [if gte mso 9]><xml> <w:LatentStyles DefLockedState="false" LatentStyleCount="156"> </w:LatentStyles> </xml><![endif]--><!-- [if gte mso 10]> <style> /* Style Definitions */ table.MsoNormalTable {mso-style-name:普通表格; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-parent:""; mso-padding-alt:0cm 5.4pt 0cm 5.4pt; mso-para-margin:0cm; mso-para-margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:10.0pt; font-family:"Times New Roman"; mso-ansi-language:#0400; mso-fareast-language:#0400; mso-bidi-language:#0400;} </style> <![endif]-->
服务端代码的编写主要针对 App 目录下的 PurOrderControllerBean 实现类,典型的代码有新增、修改、检验等操作,下面作分别介绍:
用户在编辑界面上点击‘保存’按钮时应用框架会调用 PurOrderControllerBean 的 submit 方法,通过重载 PurOrderControllerBean 父类的 submit 方法,可以对要新增、修改的数据进行校验、修正或做一些相关的判断:
protected IObjectPK _submit(Context ctx, IObjectValue model)
throws BOSException, EASBizException
{
PurOrderInfo purOrderInfo = (PurOrderInfo) model;
// 记录是否是新增, false 表示是修改,据此可以作相关操作
boolean isAddNew = true;
if(purOrderInfo.getId()!=null&&_exists(ctx,new ObjectUuidPK(purOrderInfo.getId())))
{
isAddNew = false;
}
// 检查是否设置 number
//checkNumber(ctx, otherBillInfo);
// 调用父类的方法检查是否有重号
//super._checkNumberDup(ctx, null, purOrderInfo );
// 设置值对象中的一些默认值
setDefaultValue(ctx, purOrderInfo);
// 校验值对象中的属性是否合法
checkValid(purOrderInfo);
// 调用框架的提交方法
return super._submit(ctx, purOrderInfo);
}
对于用户在编辑界面上点击‘暂存’按钮时调用 _save(Context ctx, IObjectValue model)
方法, 其操作过程与调用 _submit 方法类似
_update(Context ctx, IObjectPK pk, IObjectValue model) 方法供更新操作调用
先了解一下权限接口类提供的有关权限项检查的方法
/**
*
* 描述:返回用户是否具有某项功能的权限
* @param userPK 验权用户 PK
* @param orgPK 验权组织 PK
* @param permItemName 权限项名称
* @return true: 有权 false: 无权
* @throws BOSException
* @throws EASBizException
* @author:ryanzhou
*/
public boolean hasFunctionPermission(
IObjectPK userPK,
IObjectPK orgPK,
String permItemName)
throws BOSException, EASBizException;
/**
*
* 描述:返回用户是否具有某项功能的权限
* @param userPK 验权用户 PK
* @param orgPK 验权组织 PK
* @param uiPK UI 元数据 PK
* @param actionPK 业务操作的 PK
* @return true: 有权 false: 无权
* @throws BOSException
* @throws EASBizException
* @author:ryanzhou
*/
public boolean hasFunctionPermission(
IObjectPK userPK,
IObjectPK orgPK,
IMetaDataPK uiPK,
IMetaDataPK actionPK)
throws BOSException, EASBizException;
/**
*
* 描述:检查用户是否具有某项功能的权限 ,
* 无权时会抛出包含提示信息的业务异常
* @param userPK 验权用户 PK
* @param orgPK 验权组织 PK
* @param permItemName 权限项名称
* @throws BOSException
* @throws EASBizException
* @author:ryanzhou
*/
public void checkFunctionPermission(
IObjectPK userPK,
IObjectPK orgPK,
String permItemName)
throws BOSException, EASBizException;
/**
*
* 描述:检查用户是否具有某项功能的权限 ,
* 无权时会抛出包含提示信息的业务异常
* @param userPK 验权用户 PK
* @param orgPK 验权组织 PK
* @param uiPK UI 元数据 PK
* @param actionPK 业务操作的 PK
* @throws BOSException
* @throws EASBizException
* @author:ryanzhou
*/
public void checkFunctionPermission(
IObjectPK userPK,
IObjectPK orgPK,
IMetaDataPK uiPK,
IMetaDataPK actionPK)
throws BOSException, EASBizException;
具体调用方法:
com.kingdee.eas.base.permission.IPermission perm= null ;
perm =PermissionFactory.getLocalInstance(ctx );
perm.hasFunctionPermission(userPK, orgPK, uiPK , actionPK);
通过返回 boolean 值确定是否具有相应的权限项,根据不同的应用场景调用不同的应用方法检验操作的功能权限或数据权限。
1) 凭证生成前的控制
通过重载父类的 _createVoucher 方法实现其控制, 在做凭证生成动作之前进行相关的 断或则修改
例如:
protected void _createVoucher(Context ctx, String billId)
throws BOSException, EASBizException
{
IPurOrder purOrder= PurOrderFactory.getLocalInstance(ctx);
// 创建 pk 对象
ObjectUuidPK pk = new ObjectUuidPK(billId);
// 在客户端获取用户信息
UserInfo currentUser = (UserInfo) ctx.get(SysContextConstant.USERINFO)
// 根据 ID 返回当前的值对象
PurOrderInfo purOrderInfo ;
purOrderInfo = get PurOrderInfo (ctx, pk);
// 作相关判断
if (purOrderInfo!= null)
{
Date billDate = purOrderInfo.getBillDate();
if (billDate != null)
{
// 作相应处里
}
// 已生成凭证,不能重复生成凭证
if (purOrderInfo.isFiVouchered())
{
throw new lBizException( ‘ ***** ’ );
}
if (BillStatusEnum.AUDITED.equals(purOrderInfo.getBillStatus()))
{
// 此过程中自动生成凭证
purOrderInfo.setFiVouchered(true);
purOrderInfo.update(pk, otherBillInfo);
}
}
}
下面是具体生成凭证的典型代码,也可以通过 dap 平台配置生成凭证
protected IObjectValue _genVoucher(Context ctx, String billID)
throws BOSException, EASBizException {
// 生成凭证,并返回集合
IObjectCollection tmpCollection = null;
//dap 动态会计平台
IDAPTransformer iDAPTransformer = DAPTransformerFactory.getLocalInstance(ctx);
//
CoreBillBaseCollection coreTransCollection = new CoreBillBaseCollection();
ObjectUuidPK pk = new ObjectUuidPK(billID);
// 获取值对象
PurOrderInfo model = (PurOrderInfo) this.getValue(ctx, pk);
coreTransCollection.add(model);
// 获取转换后的凭证值对象
tmpCollection=iDAPTransformer.transformAuto(coreTransCollection,
DAPVoucherTypeEnum.FIVoucher
) ;
// 创建凭证实体对象接口
IVoucher vchCtrl = (IVoucher) VoucherFactory.getLocalInstance(ctx);
// 从集合众取出转换后凭证值对象
VoucherInfo vch = (VoucherInfo) tmpCollection.getObject(0);
VoucherInfo vch1 = new VoucherInfo();
vch1 = vchCtrl.exteriorLazyLoad(vch, VoucherInfo.getDefaultSelector());
return vch1;
}
通过重载父类的 _ audit 方法实现审核控制 , 如下代码所示:
protected void _audit(Context ctx, IObjectPK pk) throws BOSException, EASBizException {
// 对参数的常用判断
if ((pk == null)) {
throw new IllegalArgumentException();
}
// 当前用户
UserInfo currentUser = (UserInfo) ctx.get(SysContextConstant.USERINFO) ;
// 当前日期
Date currentDate = new Date();
// 检查单据是否存在
// PurOrderBizException 是用户定义的异常类
boolean exist = exists(ctx, pk);
if (!exist)
{
throw new PurOrderBizException(PurOrderBizException.BILL_NOTEXIST);
}
PurOrderInfo purOrderInfo= getPurOrderInfo (ctx, pk);
// 设置审核人
purOrderInfo.setAuditor(currentUser);
// 设置审核日期
purOrderInfo.setAuditDate(currentDate);
// 设置单据的状态为 — 已审核
purOrderInfo.setBillStatus(BillStatusEnum.AUDITED);
// 更新实体,完成审核标记
update(ctx, pk, purOrderInfo);
}
下面是判断是否定义了编码规则:
protected boolean isRuleAutoNumber( Context ctx,
PurOrderInfo purOrderInfo,
String strCompanyID)
throws EASBizException, BOSException
{
// 系统工具,判断字符窜是否为‘空’
if (StringUtils.isEmpty(strCompanyID)) {
CompanyOrgUnitInfo aCompanyOrgUnitInfo = null;
if (purOrderInfo.getCompany() != null)
{
// 获取公司信息
aCompanyOrgUnitInfo = purOrderInfo.getCompany();
}
Else
{
// 获取当前财务组织
// ContextUtil 系统工具类,提供常用信息的获取
aCompanyOrgUnitInfo = ContextUtil.getCurrentFIUnit(ctx);
}
strCompanyID = aCompanyOrgUnitInfo.getId().toString();
}
// 编码规则管理类
ICodingRuleManager iCodingRuleManager = null ;
iCodingRuleManager =CodingRuleManagerFactory.getLocalInstance(ctx);
// 调用具体方法判断规则是否存在
if (iCodingRuleManager.isExist(otherBillInfo, strCompanyID))
{
return true;
}
return false;
}
如图:
Bim 会添加一个 Ex 后缀的 java 类 , 该类继承自实现类。
如:
public class ReceiveBillControllerBeanEx
extends com.kingdee.eas.ma.crbg.app.ReceiveBillControllerBean ;
可以修改或覆盖 EAS 原有应用逻辑,应用框架会自动调用该类。
7) 对于工作流中人工节点修改完毕后通过调用服务端相应的方法出发下一个节点。