目录目录................................................................1BOS移动商务开发使用说明........................................11.相关介绍.................................................12.数据表...................................................13.消息服务接口.............................................24.关于移动商务对于二次开发服务的框架支持...................75.短信平台在业务系统中的使用...............................136.开发步骤................................................157.移动商务设置与维护说明..................................391).集群相关设置...........................................392).关于EAS与通讯平台的自动连接...........................393).关于移动商务的控制参数.................................404).移动商务与通讯平台的注意事项说明.......................41BOS移动商务开发使用说明1.相关介绍金蝶EAS的移动业务由移动商务与通讯平台两部分组成。金蝶通讯平台是一个独立的产品。主要为业务系统的收发手机短信、电子邮件等提供底层的通讯支持。EAS移动商务封装了通讯平台的短信/邮件相关的服务接口,并提供了短信发送控制管理、工作流集成、EAS服务器重启重连、短信统计分析报告等ERP企业服务。EAS的各个业务系统可通过调用EAS移动商务层的服务接口来实现消息的收发;或者直接与金蝶通讯平台通信来实现,不过此时会失去EAS移动商务提供的ERP企业服务。通常情况下,不建议直接使用通讯平台的接口,应该都是基于EAS移动商务提供的服务接口进行相关服务调用。2.数据表发送短信的表:T_MO_SendMoMsg,包括发送短信/邮件的正文、标题、发送人、发送时间,是否发送成功等信息接收短信的表:T_MO_RecMoMsg,包括接收短信/邮件的正文、标题、接收时1间等信息二次开发的移动业务功能映射对象:T_MO_BizFunction,包括业务功能名称、实现类等信息二次开发的移动业务功能指令对象:T_MO_CommandObject,包括命令、命令参数说明等信息3.消息服务接口1)MsgUtil:说明:本服务工具类以静态方法的方式提供各种短信/邮件发送服务。具体业务系统可以直接调用这个类中的如下方法实现短信的发送以及回复。需要注意的是,本类只使用于服务端,每个接口都需要传递Context参数。·msgGroupSend(Contextctx,Stringtitle,intpriority,booleanrevertible,Stringcontent,ListuserList,intmsgType,KDMessageAttachment[]attachment)说明:短信或邮件群发Ctx:上下文Title:短信或邮件标题Priority:优先级,分为低、一般、高,取法为AppMsgUtil.getPriorityEnum(priority)其中,高为重要消息,低与一般为普通消息,这个与“个人消息设置”界面中的设置对应,可在那里设置接收/过滤普通消息与重要消息,缺省是都接收。revertible:是否可回复content:消息内容userList:接收人的ID列表,List中存放的是接收人的ID。Attachment:发邮件时的附件msgType:消息类型,分为邮件、短信等,从BOSMsgTypeEnu中取。·booleannewMsgMobile(Contextctx,booleanrevertible,Stringtitle,Stringcontent,intpriority,2UserInforeceiveUserInfo,StringreceiveMoNumber)说明:短信发送receiveUserInfo:消息接收人对象,存放接收人相关信息receiveMoNumber:接收手机号码·voidmsgMoblieByUserMap(Contextctx,Mapmap,intpriority,booleanrevertible)说明:短信发送,map中存放的是personId和信息内容·booleanmsgSend(Contextctx,Stringtitle,intpriority,booleanrevertible,Stringcontent,StringpersonId,intmsgType,KDMessageAttachment[]attachment,StringassignID)说明:发送短信或邮件msgType:BOSMsgTypeEnum类型的常量值personId:接收人IDassignID:工作流任务ID·booleanmobileMsgSend(Contextctx,Stringtitle,intpriority,booleanrevertible,Stringcontent,StringreceiveMobileNumber,StringassignID)说明:短信发送receiveMobileNumber:接受手机号码·booleansendMail(Contextctx,Stringtitle,intpriority,booleanrevertible,Stringcontent,Stringaddress,3KDMessageAttachment[]attachment,StringassignID)说明:邮件发送Address:邮件接收地址msgMailDerect(Contextctx,Stringtitle,Stringcontent,Stringreceiver,StringsecretReceiver,StringcopyReceiver,KDMessageAttachment[]attachment)说明:直接发送邮件,不存表。·booleansendMobileMsg(Contextctx,Stringtitle,intpriority,booleanrevertible,Stringcontent,StringreceiveMobileNumber,StringassignID)说明:短信发送,没有判断通讯平台是否连接,用mobileMsgSend方法替代此方法。·booleannewMsgMobileDerect(Contextctx,booleancanback,Stringcontent,UserInforeceiveUserInfo)说明:手工发送短信,指定接收的用户Canback:是否可回复booleannewMsgMobileDerect(Contextctx,booleancanback,Stringcontent,StringreceiveMobileNumber)说明:手工发送短信,指定接收的用户的手机号码·booleannewMsgMobileDerect(Contextctx,SendMessageParamInfomsgInfo)说明:发送短信msgInfo:SendMessageParamInfo类型的对象,保存了一些短信参数信息,例如canback是否可回复,isAppendRevert是否附带“可回复/不可回复“,isAppendUserName是否附带个人姓名,isAppendCompanyName是否附带公司名称,isAppendNumber回复短信时是否附带回复人手机号码,isAppendPersonName回复短信时是否附带回复人姓名4·booleannewMsgMobileDerect(Contextctx,booleancanback,booleanisAppendRevert,booleanisAppendUserName,booleanisAppendCompanyName,Stringcontent,StringreceiveMobileNumber)说明:发送短信·booleannewMsgMobileDirect(Contextctx,booleancanback,booleanisAppendNumber,booleanisAppendPersonName,Stringcontent,StringreceiveMobileNumber,UserInforeceiveUserInfo)说明:发送短信2)MsgFacade:说明:本类是一个BOSSTUDIO的功能对象,使用者在客户端和服务端都可以使用,调用方式与EAS其他的功能对象、实体对象一致。例如下面是客户端调用的一个代码片断:IMsgFacadeiMsgFacade=MsgFacadeFactory.getRemoteInstance();iMsgFacade.sendMsg("hello","13822462776");·booleansendMsg(Stringcontent,Stringreceivers)说明:发送短信Content:手机短信内容。Receivers:发送的手机号码列表,多个手机号码之间用“,”隔开。·booleansendMsg(booleancanBack,Stringcontent,Stringreceivers)说明:发送短信canBack:是否可回复。Content:手机短信内容。Receivers:发送的手机号码列表,多个手机号码之间用“,”隔开。·booleansendMsg(booleancanBack,booleanisAppendRevert,booleanisAppendUserName,booleanisAppendCompanyName,Stringcontent,Stringreceivers)5说明:发送短信canBack:是否可回复。isAppendRevert:是否附带“可回复/不可回复”。isAppendUserName:是否附带个人签名。isAppendCompanyName:是否附带公司签名。Content:手机短信内容。Receivers:发送的手机号码列表,多个手机号码之间用“,”隔开。·booleansendMsg(SendMessageParamInfomsgInfo)说明:发送短信msgInfo:包含了canback、isAppendRevert、isAppendUserName、isAppendCompanyName、isAppendNumber、isAppendPersonName、receiver、receiverInfo、phoneNumber、content属性的对象类,boolean类型的属性值默认为false。其它方法:saveBizConfig:保存通讯平台与业务功能命令的设置getAlreadySendCount:根据设置对象获得当前环境下已发送数量saveUserConfig:保存用户外部消息配置,如是否可接收重要/普通消息,用户自定义快捷键等deleteSendMoMsg:假删除指定id的短信getPhoneNumberByName:利用人员姓名得到手机号码getNameByPhoneNumber:根据手机号码得到人员姓名4.关于移动商务对于二次开发服务的框架支持客户的场景需求不尽相同,EAS移动商务除了提供固有的ERP服务外,还支持业务系统/客户进行二次开发。目前提供的手段有:1)使用BOS工作流,定义新的流程,可以设置发送短信/邮件,这样就可以支持新单据或者新流程的移动发送业务,进行流程控制处理;2)直接使用前面移动商务提供的二次开发服务框架,实现相应的接口。这种方式,可实现的功能超出工作流的范畴,理论上可以增加任意移动业务功能。例如,增加短信报价功能。二次开发只要实现业务处理的相应接口,而无需理会关于短信的发送、命令解析、参数解释等底层功能。具体流程如下图示:6需要实现的接口类图如下:7实现主发短信功能处理接口(ISendMsgFunction)与回复短信功能处理接口(IReplyMsgFunction),也可以直接继承于AbstractBaseBizFunction基类,然后覆盖需要处理的接口即可。1>AbstractBaseBizFunction类说明:执行短信业务功能接口的缺省实现抽象类,同时实现主发/回复两种短信的业务功能接口,建议所有消息执行业务功能的实现类都继承于此类。业务系统实例可以参考以下类:8·主发短信业务:booleanbeforeExecSendAction(BizFuncParamObjparamObj)方法说明:主发短信执行业务功能前的操作,具体业务类可以重载这个方法实现在主发短信执行业务功能执行前的逻辑处理,默认返回true,业务实现类可返回false,即取消此次的短信业务执行。其中,参数BizFuncParamObj有如下信息:/***返回Context。*/publicContextgetCtx();}/***返回命令。*/publicStringgetCommand();/***返回命令的参数组。*/publicString[]getCommandParams();/***@return返回assignID。*只对工作流发送的短信/邮件有效*/publicStringgetAssignID();/***返回接收到的短信/邮件。*/publicCoreReceiveMessageInfogetReceiveMsg();9/***短信/邮件的关联用户ID。*/publicStringgetUserID();有了移动商务框架传递过来的上述信息,业务实现类基本上可以处理任何的服务端业务。BizReturnObjexecuteSendAction(BizFuncParamObjparamObj)方法说明:主发短信执行业务功能,具体业务类重载这个方法实现主发短信执行业务功能,BizReturnObj是由业务实现类负责返回给移动商务的结果类,returnObj.isSucceed()返回true表示执行成功,false表示执行失败。其中,BizReturnObj可设置如下信息:/***业务功能执行的错误信息文本(有的话)*@paramerrorText要设置的errorText。*/publicvoidsetErrorText(StringerrorText){this.errorText=errorText;}/***@paramtitle要设置的title。*/publicvoidsetTitle(Stringtitle){this.title=title;}/***业务功能执行是否成功*@paramisSucceed要设置的isSucceed。*/publicvoidsetSucceed(booleanisSucceed){this.isSucceed=isSucceed;}/***业务功能执行后返回的文本(有的话)*@paramreturnText要设置的returnText。*/publicvoidsetReturnText(StringreturnText){this.returnText=returnText;10}/***系统是否要生成回复短信*@paramisMustReply要设置的isMustReply。*/publicvoidsetMustReply(booleanisMustReply){this.isMustReply=isMustReply;}/***@paramassignmentID要设置的assignmentID。*/publicvoidsetAssignmentID(StringassignmentID){this.assignmentID=assignmentID;}/***需要框架协助传送的暗文字符值*@paramcustomStr要设置的customStr。*/publicvoidsetCustomStr(StringcustomStr){this.customStr=customStr;}通过设置上述返回参数对象的各种值,移动商务框架会进行各种的自动处理。例如,把returnText的值设置为回复短信的内容(假设isMustReply为true的话),诸如“请回复1。。。,2。。。”,”你有3项待处理任务”,“你刚才的短信报价已成功保存”等等;根据isMustReply的值决定当前业务执行后,是否发送回复短信;根据isSucceed的值决定业务执行是否成功,根据errorText与isMustReply的值决定是否把错误信息回复给发送者,例如“你刚才发送的报价信息,数据有误”等等。booleanafterExecSendAction(BizFuncParamObjparamObj,BizReturnObjbizReturnObj)方法说明:主发短信执行业务功能后的操作,具体业务类可以重载这个方法实现在主发短信执行业务功能执行后的逻辑处理,默认返回true,业务实现类可返回false,即取消此次的短信业务执行。·回复短信业务:booleanvalidate(BizFuncParamObjparamObj)11方法说明:校验回复短信要执行的是否是本业务功能,由业务系统具体实现。booleanbeforeExecReplyAction(BizFuncParamObjparamObj)方法说明:回复短信执行业务功能前的操作,由业务系统具体实现,业务实现类可返回false,即取消此次的短信业务执行。BizReturnObjexecuteReplyAction(BizFuncParamObjparamObj)方法说明:回复短信执行业务功能,具体业务类重载这个方法实现回复短信执行业务功能,BizReturnObj是由业务实现类负责返回给移动商务的结果类,returnObj.isSucceed()返回true表示执行成功,false表示执行失败。booleanafterExecReplyAction(BizFuncParamObjparamObj,BizReturnObjbizReturnObj)方法说明:回复短信执行业务功能后的操作,具体业务类可以重载这个方法实现在回复短信执行业务功能执行后的逻辑处理,默认返回true,业务实现类可返回false,即取消此次的短信业务执行。5.短信平台在业务系统中的使用业务功能命令定义:系统平台—短信管理—短信业务配置Eas已提供的基于移动商务二次开发框架开发出来的业务功能有:通讯录名称,查询信用额度报表查询、在办流程查询等。12例如在此界面定义了通讯录查询的业务命令为aaa,保存后,启动通讯平台及eas服务器,通讯录查询的短信业务格式为“命令用户名“,并且此业务为主发业务,之前不需要预先执行相关业务。所以可以直接在短信平太模拟器中发送短信如下:手机号码要是一个eas系统用户,yaya是要查询的人名,AT_SCM_SQL_0113是配置Socket设备时填的短语。系统截获短信解析后会执行相关的查询业务逻辑,返回对应的查询信息。如下图:真实手机发送短信命令时,直接编辑具体内容,不需要用“短语*+命令“的格式。另外这里的短信命令在接收人外部短信编辑界面可以设置命令快捷键,当向此用户发送业务命令时,可以用快捷键的数字代替业务命令136.开发步骤1)通过脚本插入,在界面上提供新的二次开发移动业务功能前面提到,移动商务支持二次开发服务,只要继承于AbstractBaseBizFunction类,实现相应的业务接口即可。实现后,还需要在界面上展现出来。见下图:在T_MO_BizFunction业务功能表中添加有关业务功能的描述记录,以便在业务功能命令定义的时候在功能下拉类表中选功能。示例脚本:--通讯录14ifnotexists(select*fromT_MO_BizFunctionwherefid='/SJUxQEUEADgBAXcwKgQDa2Jzdc=')insertintoT_MO_BizFunction(FID,FFUNCTION,FIMPLCLASSNAME,FBIZMODULEID,FCOMMANDOBJID,FQUERYPANELCLASSNAME)values('/SJUxQEUEADgBAXcwKgQDa2Jzdc=','通讯录名称','com.kingdee.eas.basedata.person.app.PersonMobileBizFunction','MJGsAo5Xx6vgQAB/AQB6364CdCs=','/SJUxQEUEADgBAXZwKgQDZaTAzY=',null);ifnotexists(select*fromT_MO_CommandObjectwherefid='/SJUxQEUEADgBAXZwKgQDZaTAzY=')insertintoT_MO_CommandObject(FID,FCOMMANDNUMBER,FCOMMANDNAME)values('/SJUxQEUEADgBAXZwKgQDZaTAzY=','QP01','通讯录查询');SQL中的ID值都是由KSQL自动生成的,可以用newbosid(BosType)代替其中的ID值,ksql解释器会自动转化为ID值,其中BosType表对象对应实体的BOSType。目前是采取直接插入脚本的方式。后续版本中,会进行界面定义的支持。2)编写业务类继承AbstractBaseBizFunction实现其中的某些方法,执行具体的业务逻辑。可以用参数BizFuncParamObj中得到经过解析的短信内容、参数已经其他信息将需要返回给通讯平台的信息保存在BizReturnObj中,到达返回信息的目的。下面是一个完整的示例代码,可参考。示例类:通讯录查询的业务功能/**@(#)com.kingdee.eas.basedata.person.app.PersonMobileBizFunction.java**金蝶国际软件集团有限公司版权所有.*/packagecom.kingdee.eas.basedata.person.app;importcom.kingdee.eas.basedata.person.IPersonFacade;importcom.kingdee.eas.basedata.person.PersonFacadeFactory;importcom.kingdee.eas.mobile.biz.AbstractBaseBizFunction;importcom.kingdee.eas.mobile.biz.BizFuncParamObj;importcom.kingdee.eas.mobile.biz.BizReturnObj;15/***描述:职员信息提供给短信平台调用的接口*@authorEricXiedate:2008-08-18<p>*@versionEAS6.0SP*/publicclassPersonMobileBizFunctionextendsAbstractBaseBizFunction{//短信查询指令publicstaticStringPERSON_QUERY_COMMAND="QP01";/*(非Javadoc)*主发短信执行业务功能*@seecom.kingdee.eas.mobile.biz.ISendMsgFunction#executeSendAction(com.kingdee.eas.mobile.biz.BizFuncParamObj)*/publicBizReturnObjexecuteSendAction(BizFuncParamObjparamObj){if(paramObj.getCommandParams().length==0){BizReturnObjbizReturnObj=newBizReturnObj();bizReturnObj.setErrorText("没有输入要查询的人名!");bizReturnObj.setSucceed(false);bizReturnObj.setMustReply(true);returnbizReturnObj;}Stringname=paramObj.getCommandParams()[0];StringretnMsg=null;try{IPersonFacadeiPF=PersonFacadeFactory.getLocalInstance(paramObj.getCtx());retnMsg=iPF.getAddressList(name);}catch(Exceptione){e.printStackTrace();BizReturnObjbizReturnObj=newBizReturnObj();bizReturnObj.setErrorText("系统错误请联系管理员!");bizReturnObj.setSucceed(false);16bizReturnObj.setMustReply(true);returnbizReturnObj;}BizReturnObjbizReturnObj=newBizReturnObj();bizReturnObj.setErrorText("");bizReturnObj.setReturnText(retnMsg);bizReturnObj.setSucceed(true);bizReturnObj.setMustReply(true);//缺省处理returnbizReturnObj;}}示例二:回复型消息审批publicclassBIZMessageHandlerextendsAbstractBaseBizFunction{privatestaticfinalLoggerlogger=Logger.getLogger(BIZMessageHandler.class);privatestaticfinalStringRESOURCE="com.kingdee.eas.cp.eip.pc.processresource";privatestaticStringCOMMNAD_STR="myinprocess";17privatestaticStringPAGENUMBER="pageNum=";privatestaticStringASSIGN_ID="assignID";privatestaticintSTEP=3;//每条短信显示的条数privatestaticStringSLIP="#";//自定义串中的属性分隔符privatestaticStringDECISION="decision=";/*(非Javadoc)*@seecom.kingdee.eas.mobile.biz.AbstractBaseBizFunction#afterExecReplyAction(com.kingdee.eas.mobile.biz.BizFuncParamObj,com.kingdee.eas.mobile.biz.BizReturnObj)*/publicbooleanafterExecReplyAction(BizFuncParamObjparamObj,BizReturnObjbizReturnObj){//TODO自动生成方法存根returnsuper.afterExecReplyAction(paramObj,bizReturnObj);}/*(非Javadoc)*@seecom.kingdee.eas.mobile.biz.AbstractBaseBizFunction#afterExecSendAction(com.kingdee.eas.mobile.biz.BizFuncParamObj,com.kingdee.eas.mobile.biz.BizReturnObj)*/publicbooleanafterExecSendAction(BizFuncParamObjparamObj,BizReturnObjbizReturnObj){//TODO自动生成方法存根returnsuper.afterExecSendAction(paramObj,bizReturnObj);}/*(非Javadoc)*@seecom.kingdee.eas.mobile.biz.AbstractBaseBizFunction#beforeExecReplyAction(com.kingdee.eas.mobile.biz.BizFuncParamObj)*/publicbooleanbeforeExecReplyAction(BizFuncParamObjparamObj){//TODO自动生成方法存根18returnsuper.beforeExecReplyAction(paramObj);}/*(非Javadoc)*@seecom.kingdee.eas.mobile.biz.AbstractBaseBizFunction#beforeExecSendAction(com.kingdee.eas.mobile.biz.BizFuncParamObj)*/publicbooleanbeforeExecSendAction(BizFuncParamObjparamObj){//TODO自动生成方法存根returnsuper.beforeExecSendAction(paramObj);}/*(非Javadoc)*@seecom.kingdee.eas.mobile.biz.AbstractBaseBizFunction#executeReplyAction(com.kingdee.eas.mobile.biz.BizFuncParamObj)*/publicBizReturnObjexecuteReplyAction(BizFuncParamObjparamObj){BizReturnObjreturnObj=null;Stringcommand=paramObj.getCommand().toLowerCase();//本消息的父消息,即,本短信所要回复的短信CoreSendMessageInfocoreSendMessageInfo=null;if(paramObj.getReceiveMsg()instanceofReceiveMobileMessageInfo){coreSendMessageInfo=((ReceiveMobileMessageInfo)paramObj.getReceiveMsg()).getParentMsg();}elseif(paramObj.getReceiveMsg()instanceofEmailReceiveMessageInfo){coreSendMessageInfo=((EmailReceiveMessageInfo)paramObj.getReceiveMsg()).getParentMsg();}charnumKey=command.toLowerCase().charAt(0);switch(numKey){case'0':19//获取待办消息,并根据页数生成回复消息对象returnObj=execQuery(paramObj,coreSendMessageInfo);break;case'1':case'2':case'3':case'4':case'5':case'6':case'7':case'8':case'9'://error_numberintrecordNum=Integer.parseInt(numKey+"");if(recordNum<0||recordNum>STEP){returncreateReturnObjForError(paramObj,ResourceBase.getString(RESOURCE,"error_number",paramObj.getCtx().getLocale()));}else{//执行进一步查询的操作,返回决策项等提示信息returnObj=execQueryDetail(paramObj,coreSendMessageInfo,recordNum);}break;case'y':case'n':if(paramObj.getCommandParams().length<1){returncreateReturnObjForError(paramObj,ResourceBase.getString(RESOURCE,"error_command",paramObj.getCtx().getLocale()));}if(numKey=='y'){//执行审批操作,并返回是否正确处理returnObj=execProcess(paramObj,coreSendMessageInfo,"true");}20else{//执行审批操作,并返回是否正确处理returnObj=execProcess(paramObj,coreSendMessageInfo,"false");}break;default:returncreateReturnObjForError(paramObj,ResourceBase.getString(RESOURCE,"error_command",paramObj.getCtx().getLocale()));}returnreturnObj;}/***获取待办消息,并根据页数生成回复消息对象。*@throws**/privateBizReturnObjexecQuery(BizFuncParamObjparamObj,CoreSendMessageInfocoreSendMessageInfo){BizReturnObjreturnObj=null;intlastPageNum=-1;StringlastPageNumStr=null;if(coreSendMessageInfo!=null){//从自定义串中获取上次查询的页数lastPageNumStr=getPropertyFromCustomStr(coreSendMessageInfo.getCustomStr(),PAGENUMBER);try{if(!StringUtils.isEmpty(lastPageNumStr)){lastPageNum=Integer.parseInt(lastPageNumStr);}else{21returncreateReturnObjForError(paramObj,ResourceBase.getString(RESOURCE,"error_command",paramObj.getCtx().getLocale()));}}catch(NumberFormatExceptionerr){lastPageNum=-1;}}lastPageNum=lastPageNum>-1?lastPageNum:0;//获取该用户的待办消息IRowSetrowset;try{rowset=getMyInProccess(paramObj.getCtx(),paramObj.getUserID());}catch(BOSExceptione){logger.error("HassomeerrorwhengetInProccess("+paramObj.getReceiveMsg().getContent()+");"+e.toString());returncreateReturnObjForError(paramObj,ResourceBase.getString(RESOURCE,"hasserror_inprocess",paramObj.getCtx().getLocale()));}//无待办消息if(rowset==null||rowset.size()==0){returnObj=newBizReturnObj();returnObj.setReturnText(ResourceBase.getString(RESOURCE,"hasNoneInprocess",paramObj.getCtx().getLocale()));returnObj.setErrorText("");returnObj.setCustomStr("");returnObj.setSucceed(true);22returnObj.setMustReply(true);}else{//从上次查询页数+1开始,生成回复的消息文本,返回回复消息对象returnObj=makeQueryReplyObj(paramObj,rowset,lastPageNum+1);}returnreturnObj;}privateBizReturnObjcreateReturnObjForError(BizFuncParamObjparamObj,StringerrorTxt){BizReturnObjreturnObj=newBizReturnObj();returnObj.setReturnText("");returnObj.setErrorText(errorTxt);returnObj.setCustomStr("");returnObj.setSucceed(false);returnObj.setMustReply(true);returnreturnObj;}/***从自定义串中获取指定的属性,例如上次查询的页数,指定记录号码的工作流任务ID*@paramlastCustomStr*@return*/privateStringgetPropertyFromCustomStr(StringlastCustomStr,StringPropertyName){Stringnum=null;intlastPageNumber=-1;inti=lastCustomStr.indexOf(PropertyName);if(i>-1){23intj=lastCustomStr.indexOf(SLIP,i+PropertyName.length());if(j>-1){num=lastCustomStr.substring(i+PropertyName.length(),j);}else{num=lastCustomStr.substring(i+PropertyName.length());}}//CustomStrreturnnum;}/*(非Javadoc)*@seecom.kingdee.eas.mobile.biz.AbstractBaseBizFunction#executeSendAction(com.kingdee.eas.mobile.biz.BizFuncParamObj)*/publicBizReturnObjexecuteSendAction(BizFuncParamObjparamObj){//获取待办消息,并根据页数生成回复消息对象BizReturnObjbizReturnObj=execQuery(paramObj,null);//缺省处理returnbizReturnObj;}/*(非Javadoc)*@seecom.kingdee.eas.mobile.biz.AbstractBaseBizFunction#validate(com.kingdee.eas.mobile.biz.BizFuncParamObj)*/publicbooleanvalidate(BizFuncParamObjparamObj){24//if(super.validate(paramObj))//{Stringcommand=paramObj.getCommand().toLowerCase();//本消息的父消息,即,本短信所要回复的短信CoreSendMessageInfocoreSendMessageInfo=null;if(paramObj.getReceiveMsg()instanceofReceiveMobileMessageInfo){coreSendMessageInfo=((ReceiveMobileMessageInfo)paramObj.getReceiveMsg()).getParentMsg();}elseif(paramObj.getReceiveMsg()instanceofEmailReceiveMessageInfo){coreSendMessageInfo=((EmailReceiveMessageInfo)paramObj.getReceiveMsg()).getParentMsg();}//主发查询消息的校验if(coreSendMessageInfo==null){//主发询查的消息,必须符合查询的命令if(COMMNAD_STR.equals(command)){returntrue;}}//回复处理消息的校验else{//回复处理的消息,必须是0-9,Y/N中的一个charnumKey=command.toLowerCase().charAt(0);switch(numKey){case'0':case'1':case'2':case'3':case'4':case'5':case'6':case'7':case'8':25case'9':case'y':case'n':returntrue;default:}}//}returnfalse;}/***获取该用户的待办消息**@paramctx*@paramuserId*@return*@throwsBOSException*/privateIRowSetgetMyInProccess(Contextctx,StringuserId)throwsBOSException{IMessageCenteriMessageCenter=MessageCenterFactory.getLocalInstance(ctx);IRowSetrowset=iMessageCenter.getAcceptedTask(userId);returnrowset;}/***从上次查询页数+1开始,生成回复的消息文本,返回回复消息对象**@paramparamObj*@paramrowset*@parampageNumber本次要查询的页数*@return*/privateBizReturnObjmakeQueryReplyObj(BizFuncParamObjparamObj,IRowSetrowset,intpageNumber){26BizReturnObjreturnObj;StringBufferassignIdSB=newStringBuffer();StringBufferreplySB=newStringBuffer();intmsgNum=0;intpageNumCounter=0;//当前的页数intlineNum=0;//已生成的行数,不要超过STEPbooleanisEnd=true;//已到rowset末booleanisEnough=false;//已取了足够条数的消息try{if(pageNumber==1){//首页,加上“您有X条待办消息。”replySB.append(ResourceBase.getString(RESOURCE,"total1",paramObj.getCtx().getLocale())+rowset.size()+ResourceBase.getString(RESOURCE,"total2",paramObj.getCtx().getLocale())+"");}rowset.beforeFirst();while(rowset.next()){if(isEnough)//已取了足够条数的消息,可退出循环取数{isEnd=false;break;}msgNum++;if(((msgNum-1)%STEP)==0&&msgNum!=1){pageNumCounter++;}if(pageNumCounter==(pageNumber-1))//到达要查询的页数{lineNum++;System.out.println("hello");27replySB.append(lineNum+"."+rowset.getString("sender")+","+rowset.getString("title")+","+rowset.getTimestamp("receiveTime").toString()+".");assignIdSB.append(ASSIGN_ID+lineNum+"=").append(rowset.getString("AssignRead.assignID")+SLIP);}if(lineNum==STEP)//如果在查询的页数生成了STEP条数的信息,已足够,设置标志变量。{isEnough=true;}}}catch(SQLExceptionerr){logger.error("HassomeerrorwhenmakeReplyObj("+paramObj.getReceiveMsg().getContent()+");"+err.toString());returncreateReturnObjForError(paramObj,ResourceBase.getString(RESOURCE,"hasserror_inprocess",paramObj.getCtx().getLocale()));}//title、sender、receiveTime、AssignRead.assignID、//加上“请回复"消息号码"获取其处理项.”replySB.append(""+ResourceBase.getString(RESOURCE,"tip10",paramObj.getCtx().getLocale()));if(!isEnd){//加上“回复"0"查询下页.”replySB.append(ResourceBase.getString(RESOURCE,"tip11",paramObj.getCtx().getLocale()));}returnObj=newBizReturnObj();////正常执行,返回回复消息returnObj.setReturnText(replySB.toString());returnObj.setErrorText("");returnObj.setCustomStr(PAGENUMBER+pageNumber+SLIP+assignIdSB.toString());returnObj.setSucceed(true);28returnObj.setMustReply(true);//logger.error("HassomeerrorwhengetInProccess:"+e.toString());////returnObj.setReturnText("");//returnObj.setErrorText(ResourceBase.getString(RESOURCE,"hasserror_inprocess",paramObj.getCtx().getLocale()));//returnObj.setCustomStr("");//returnObj.setSucceed(false);//returnObj.setMustReply(true);//returnreturnObj;}/***执行进一步查询的操作,返回决策项等提示信息**@paramparamObj*@paramcoreSendMessageInfo*@paramrecordNum*@return*/privateBizReturnObjexecQueryDetail(BizFuncParamObjparamObj,CoreSendMessageInfocoreSendMessageInfo,intrecordNum){BizReturnObjreturnObj=null;//从自定义串中获取要处理的工作流任务IDStringassignID=getPropertyFromCustomStr(coreSendMessageInfo.getCustomStr(),ASSIGN_ID+recordNum+"=");if(!StringUtils.isEmpty(assignID)){//0;无;全部:1;打回修改;全部:2;中止申请;同意:3;申请者决定;不同意Stringdecision="";try{29IEnactmentServiceservice=newEnactmentServiceProxy(paramObj.getCtx());//返回决策项,格式:"0;无;全部:1;打回修改;全部:2;中止申请;同意:3;申请者决定;不同意"decision=service.getMultiApproveDecision(assignID);}catch(WfExceptionerr1){logger.error("HasWfExceptionwhenexecQueryDetail!("+paramObj.getReceiveMsg().getContent()+"):"+err1.toString());returncreateReturnObjForError(paramObj,ResourceBase.getString(RESOURCE,"cannot_process",paramObj.getCtx().getLocale()));}catch(BOSExceptionerr1){returncreateReturnObjForError(paramObj,ResourceBase.getString(RESOURCE,"error_process",paramObj.getCtx().getLocale()));}//正常执行,返回回复消息returnObj=newBizReturnObj();if(!StringUtils.isEmpty(decision)){decision=decision.replaceAll(":",".");returnObj.setReturnText(decision+""+ResourceBase.getString(RESOURCE,"tip2",paramObj.getCtx().getLocale()));}else{//none_decisiondecision=ResourceBase.getString(RESOURCE,"none_decision",paramObj.getCtx().getLocale());returnObj.setReturnText(decision+""+ResourceBase.getString(RESOURCE,"tip3",paramObj.getCtx().getLocale()));}30returnObj.setErrorText("");returnObj.setCustomStr(ASSIGN_ID+"="+assignID+SLIP+DECISION+decision);returnObj.setSucceed(true);returnObj.setMustReply(true);}else{logger.error("HasnoneassignID!:"+paramObj.getReceiveMsg().getContent());returnObj=createReturnObjForError(paramObj,ResourceBase.getString(RESOURCE,"error_process",paramObj.getCtx().getLocale()));}//tip2returnreturnObj;}/***执行审批操作,并返回是否正确处理**@paramparamObj*@paramcoreSendMessageInfo*@paramrecordNumStr*@return*/privateBizReturnObjexecProcess(BizFuncParamObjparamObj,CoreSendMessageInfocoreSendMessageInfo,StringisPass){BizReturnObjreturnObj=null;//从自定义串中获取要处理消息的决策项Stringdecision=getPropertyFromCustomStr(coreSendMessageInfo.getCustomStr(),DECISION);intmaxNum=0;booleanhasNum=false;//是否含有数字,如果无决策项,则没有数字charnumKey=paramObj.getCommandPa...