nc65用友uap开发-人力资源模块合同审批流开发
1.需求:在人力资本模块下的人员合同管理支持审批流,而合同签订等节点使用的元数据属于合同处理中心元数据下的劳动合同,属于ncvo,而在产品设计流程中ncvo是不支持审批流的,无法达到审批流效果。
2.解决思路:在无法绕过产品按钮设计的情况下,选择了自己写代码,达到审批流效果(1.发消息,2.按钮状态改变)
3.产品实现过程:
3.1  PfUtilClient类下的runAction方法,获取WorkflownoteVO worknoteVO。主要方法如下:

/*** 前台单据动作处理API,算法如下:* <li>1.动作执行前提示以及事前处理,如果用户取消,则方法直接返回* <li>2.查看扩展参数,判断是否需要审批流相关处理。如果为提交动作,则可能需要收集提交人的指派信息;* 如果为审批动作,则可能需要收集审批人的审批信息* <li>3.后台执行动作。并返回动作执行结果。 * * @param parent 父窗体 -- 需要LoginContext.EntranceUI* @param actionCode 动作编码,比如"SAVE"* @param billOrTranstype 单据(或交易)类型PK* @param billvo 单据聚合VO* @param userObj 用户自定义对象* @param checkVo 校验单据聚合VO* @param eParam 扩展参数* @return 动作处理的返回结果* @throws BusinessException * @throws Exception* @since 5.5*/public static Object runAction(Container parent, String actionCode, String billOrTranstype,AggregatedValueObject billvo, Object userObj, String strBeforeUIClass,AggregatedValueObject checkVo, HashMap eParam) throws BusinessException {eParam = initEParam(eParam);Logger.debug("*单据动作处理 开始");debugParams(actionCode, billOrTranstype, billvo, userObj);long start = System.currentTimeMillis();m_isSuccess = true;isOpenedInDialog = false;IFuncletWindow parentFuncletWindow = getParentFuncletWindow(parent, actionCode, billOrTranstype);//TODO 先注释掉,目前的调用方式有问题,会增加远程调用次数,不应该在这个时机判断,后续如果有人提问题了再分析一下具体场景
//      if (PfUtilBaseTools.isStartAction(actionCode, billOrTranstype)) {
//          String actionSignlCode = actionCode.replace(IPFActionName.START,
//                  IPFActionName.SIGNAL);
//          try {
//              WorkflownoteVO noteVO = NCLocator.getInstance().lookup(IWorkflowMachine.class).checkWorkFlow(actionSignlCode, billOrTranstype,billvo, eParam);
//              // 如果有代办任务
//              if (noteVO != null)
//                  actionCode = actionSignlCode;
//          } catch (BusinessException be) {
//              Logger.error("工作流回退业务处理,找不到工作项即不用替换动作代码,继续执行即可");
//          }
//      }// 1.动作执行前提示boolean isContinue = hintBeforeAction(parent, actionCode, billOrTranstype);if (!isContinue) {Logger.debug("*动作执行前提示,返回");m_isSuccess = false;return null;}// 2.查看扩展参数,是否要流程交互处理WorkflownoteVO worknoteVO = null;///批量审批出错(WorkflownoteVO)getParamFromMap(eParam, PfUtilBaseTools.PARAM_WORKNOTE);Object paramSilent = getParamFromMap(eParam, PfUtilBaseTools.PARAM_SILENTLY);///if(worknoteVO == null){//批量审批出错Object paramNoflow = getParamFromMap(eParam,PfUtilBaseTools.PARAM_NOFLOW);if (paramNoflow == null && paramSilent == null) {// 需要交互处理if (PfUtilBaseTools.isSaveAction(actionCode, billOrTranstype)|| PfUtilBaseTools.isApproveAction(actionCode,billOrTranstype)) {// 审批流交互处理worknoteVO = actionAboutApproveflow(parent, actionCode,billOrTranstype, billvo, eParam,0);if (!m_isSuccess)return null;} else if (PfUtilBaseTools.isStartAction(actionCode,billOrTranstype)|| PfUtilBaseTools.isSignalAction(actionCode,billOrTranstype)) {// 工作流互处理worknoteVO = actionAboutWorkflow(parent, actionCode,billOrTranstype, billvo, eParam,0);if (!m_isSuccess)return null;}//putParam(eParam, PfUtilBaseTools.PARAM_WORKNOTE, worknoteVO);}///}//批量审批出错//如果用户在交互处理时候选择加签或者改派,则无需驱动流程@2009-5if (worknoteVO != null && PfUtilClientAssistor.isAddApproverOrAppoint(worknoteVO)) {//zhouhenga 此时返回原始的单据vo,使得侧边栏刷新//liangyub 通过侧边栏加签操作,成功后加以提示if(eParam != null && eParam.get(PfUtilBaseTools.PARAM_BESIDEAPPROVE) != null){if(eParam.get(PfUtilBaseTools.PARAM_BESIDEAPPROVE) instanceof BesideApproveContext){BesideApproveContext besideContext = (BesideApproveContext) eParam.get(PfUtilBaseTools.PARAM_BESIDEAPPROVE);if(besideContext.isAddAssign()){MessageDialog.showHintDlg(parent, NCLangRes.getInstance().getStrByID("pfworkflow63","2PLATFORM-00082")/*操作成功*/,NCLangRes.getInstance().getStrByID("pfworkflow63","2PLATFORM-00083")/*单据加签成功*/);   }}}return billvo;}if (worknoteVO == null) {//检查不到工作项,则后台无需再次检查if (eParam == null)eParam = new HashMap<String, String>();if (paramSilent == null)eParam.put(PfUtilBaseTools.PARAM_NOTE_CHECKED, PfUtilBaseTools.PARAM_NOTE_CHECKED);}// 4.后台执行动作Object retObj = null;Logger.debug("*后台动作处理 开始");long start2 = System.currentTimeMillis();IplatFormEntry iIplatFormEntry = (IplatFormEntry) NCLocator.getInstance().lookup(IplatFormEntry.class.getName());retObj = iIplatFormEntry.processAction(actionCode, billOrTranstype, worknoteVO, billvo,userObj, eParam);Logger.debug("*后台动作处理 结束=" + (System.currentTimeMillis() - start2) + "ms");m_isSuccess = true;// 5.返回对象执行//retObjRun(parent, retObj);Logger.debug("*单据动作处理 结束=" + (System.currentTimeMillis() - start) + "ms");if(m_isSuccess && worknoteVO != null) {//更新消息的状态MessageProcessorContext.setHandledWithProcessor(worknoteVO);}if (m_isSuccess && isOpenedInDialog&& isAutoCloseParentDialog&& parentFuncletWindow != null&& PfUtilBaseTools.isApproveAction(actionCode, billOrTranstype)) {// 审批成功、单据为对话框打开、且审批时选择了自动关闭单据界面// yanke1 2012-7-18 那么关闭单据界面final IFuncletWindow p = parentFuncletWindow;// 放到swing线程里,否则界面会卡死掉SwingUtilities.invokeLater(new Runnable() {@Overridepublic void run() {p.forceCloseWindow();                   }});}return retObj;}

3.2 启动审批流主要类PFBusiAction中的processAction

public Object processAction(String actionName, String billOrTranstype, WorkflownoteVO workflowVo, AggregatedValueObject billvo, Object userObj, HashMap eParam) throws BusinessException {Logger.init("workflow");Logger.debug("*后台单据动作处理PFBusiAction.processAction开始");debugParams(actionName, billOrTranstype, workflowVo, billvo, userObj, eParam);long start = System.currentTimeMillis();Hashtable hashBilltypeToParavo = new Hashtable();Hashtable hashMethodReturn = new Hashtable();if (eParam == null) {eParam = new HashMap();}// -1. 如果为forcestart, 那么重置一下单据vo的审批状态if (eParam != null && eParam.get(PfUtilBaseTools.PARAM_FORCESTART) != null) {resetApproveStatus(billvo, IPfRetCheckInfo.NOSTATE);}// 0.处理工作项(上传附件)processWorknote(workflowVo);// 1.构造动作处理的参数VOAggregatedValueObject[] inVos = null;if (billvo != null) {inVos = PfUtilBaseTools.pfInitVos(billvo.getClass().getName(), 1);inVos[0] = billvo;}PfParameterVO paraVoOfBilltype = PfUtilBaseTools.getVariableValue(billOrTranstype, actionName, billvo, inVos, userObj, null, workflowVo, eParam, hashBilltypeToParavo);try {// 2.如果为删除动作,则删除流程信息if (PfUtilBaseTools.isDeleteAction(paraVoOfBilltype.m_actionName, paraVoOfBilltype.m_billType))deleteWorkFlow(paraVoOfBilltype);// 3.进行动作前约束检查IPFActionConstrict aConstrict = new PFActionConstrict();aConstrict.actionConstrictBefore(paraVoOfBilltype);// 4.执行动作脚本Object retObj = actionOnStep(paraVoOfBilltype.m_actionName, paraVoOfBilltype);// 5.进行动作后约束检查aConstrict.actionConstrictAfter(paraVoOfBilltype);// 6.脚本返回值的处理if (retObj instanceof nc.bs.pub.compiler.IWorkFlowRet) {// XXX::只有脚本调用procActionFlow@@,且在流程审批进行中时才返回该对象return ((nc.bs.pub.compiler.IWorkFlowRet) retObj).m_inVo;}try {Object[] tmpObj = (Object[]) retObj;Hashtable hasNoProc = null;// XXX::必须保证批量的动作脚本具有这样的返回值 ljif (tmpObj != null && tmpObj.length > 0 && tmpObj[0] instanceof IWorkflowBatch) {IWorkflowBatch wfBatch = (IWorkflowBatch) tmpObj[0];hasNoProc = wfBatch.getNoPassAndGoing();Object[] userObjs = (Object[]) wfBatch.getUserObj();retObj = userObjs[0];}if (hasNoProc != null && hasNoProc.containsKey("0"))return null;} catch (Exception e) {// FIXME::如果动作脚本返回值非数组或其他异常,都忽略之}// 7.上游消息处理backMsg(paraVoOfBilltype, retObj);// 8.动作驱动if (isDriveAction(paraVoOfBilltype.m_billType, paraVoOfBilltype.m_actionName)&&isNeedDriveAction(retObj)) {actiondrive(paraVoOfBilltype.m_preValueVo, userObj, hashBilltypeToParavo, hashMethodReturn, paraVoOfBilltype, eParam);}String src_billtypePK =paraVoOfBilltype.m_preValueVo!=null?StringUtil.isEmptyWithTrim(paraVoOfBilltype.m_preValueVo.getParentVO().getPrimaryKey())?"":paraVoOfBilltype.m_preValueVo.getParentVO().getPrimaryKey():"";// 9.如果动作为提交,尝试启动审批流或工作流if (PfUtilBaseTools.isSaveAction(paraVoOfBilltype.m_actionName, paraVoOfBilltype.m_billType)){retObj = startApproveFlowAfterAction(paraVoOfBilltype.m_billType, paraVoOfBilltype.m_preValueVo, userObj, retObj, eParam, hashBilltypeToParavo, hashMethodReturn,src_billtypePK)[1];sendMessageWhenStartWorkflow(paraVoOfBilltype,WorkflowTypeEnum.Approveflow.getIntValue());}                else if (PfUtilBaseTools.isStartAction(paraVoOfBilltype.m_actionName, paraVoOfBilltype.m_billType)){startWorkflowAfterAction(paraVoOfBilltype.m_billType, paraVoOfBilltype.m_preValueVo, userObj, retObj, eParam, hashBilltypeToParavo, hashMethodReturn,src_billtypePK);sendMessageWhenStartWorkflow(paraVoOfBilltype,WorkflowTypeEnum.Workflow.getIntValue());}//10 .如果业务流符合跳转的条件,执行流程的跳转jumpBusitype(lastParamVO);    // 清空引擎实例池中的数据,否则无法释放WfInstancePool.getInstance().clear();Logger.debug("*后台单据动作处理PFBusiAction.processAction结束,耗时" + (System.currentTimeMillis() - start) + "ms");return retObj;} catch (BusinessException ex) {logWorkflowExptInfo(ex, paraVoOfBilltype);throw ex;}}

其中审批和取消审批,收回在第四步发送消息,提交在第九步发送消息。

3.3 发送消息类 PfMessageUtil的sendMessageOfWorknote方法
public static void sendMessageOfWorknote(WorkflownoteVO workflownoteVO)throws BusinessException {if (workflownoteVO == null)return;if (checkmanIsVirtual(workflownoteVO))return;NCMessage ncMsg = transferToNCMessage(workflownoteVO);try {String[] msgpk = MessageCenter.sendMessage(new NCMessage[] { ncMsg });String pk_message = msgpk[0];WFTask task = getWFTask(workflownoteVO.getPk_wf_task());MessageMetaVO metavo = createMessageMeta(workflownoteVO, task, pk_message);NCLocator.getInstance().lookup(IPFMessageMetaService.class).insert(metavo);} catch (Exception e) {Logger.error(e.getMessage(), e);throw new BusinessException(e);}}

调用NCMessage ncMsg = transferToNCMessage(workflownoteVO);方法后调用fill(ncmsg, workflownote);

4.实现过程:
4.1:修改元数据,添加审批流字段属性,修改vo,修改数据库。
alter table hi_psndoc_ctrt add
billid varchar(50) NULL add
billno varchar(50) NULL add
pkorg varchar(50) NULL add
busitype varchar(50) NULL add
billmaker varchar(50) NULL add
approver varchar(50) NULL add
approvestatus int NULL add
approvenote varchar(50) NULL add
approvedate char(19) NULL add
transtype varchar(50) NULL add
billtype varchar(50) NULL add
transtypepk varchar(50) NULL add
srcbilltype varchar(50) NULL add
srcbillid varchar(50) NULL add
emendenum int NULL add
billversionpk varchar(50) NULL;

4.2   参考资料——审批流设置    在单据类型管理配置支持审批流和节点编号(对应功能编码),在单据动作管理添加动作代码

4.3  编写代码,实现按钮状态改变和发送消息。
@Overridepublic void doAction(ActionEvent arg0) throws Exception {Integer[] row=this.model.getSelectedOperaRows();if (row.length>1) {MessageDialog.showErrorDlg(getModel().getContext().getEntranceUI(),"提示","请选择一行数据进行操作!");return;}CtrtVO tempData = (CtrtVO) this.model.getSelectedData();if (tempData==null) {MessageDialog.showErrorDlg(getModel().getContext().getEntranceUI(),"提示","请选中行后进行操作");return;}AggHRHeTongVO aggVo=new AggHRHeTongVO();aggVo.setParentVO(tempData);I6201Maintain service = NCLocator.getInstance().lookup(I6201Maintain.class);// 1.修改状态CtrtVO vo=(CtrtVO) tempData.clone();vo.setStatus(VOStatus.UNCHANGED);
//      通过按钮的名字《当前操作》来确定审批状态的变更写入int btnstatus=JudgementSubmissionStatus.isSubmit(this.getActionName());vo.setAttributeValue("approvestatus", btnstatus);//提交aggVo.setParentVO(vo);//更新后的VO// 2.发送消息AbstractFunclet funclet = (AbstractFunclet) getModel().getContext().getEntranceUI();HashMap<String, Object> hmParam = new HashMap<String, Object>();hmParam.put("reload_vo", aggVo);String billtype=JudgementSubmissionStatus.getBillType(this.model.getContext().getNodeCode());WorkflownoteVO worknoteVO = MyAppActionScriptService.getWorkflownoteVO(funclet, "SAVE", billtype, aggVo, null, null, null, hmParam);Object obj=service.processAction(actionName, billType, worknoteVO, aggVo, null, null);service.update(vo);//修改状态getModel().directlyUpdate(vo);ShowStatusBarMsgUtil.showStatusBarMsg("所有单据操作成功!", this.getModel().getContext());}

nc65用友uap开发-人力资源模块合同审批流开发相关推荐

  1. nc65用友uap开发节点通过按钮调用打开另外一个节点并传数据跳编辑态(推单)

    nc65用友uap开发节点通过按钮调用打开另外一个节点并传数据跳编辑态(推单) 目标:如图所示,通过合同续约按钮调用打开合同管理中心节点,并且把相应数据传入到合同管理中心节点(编辑态) 1.按钮代码: ...

  2. nc65用友uap平台按钮怎样设置快捷键的实现方式

    nc65用友uap平台按钮怎样设置快捷键的实现方式 public class CloseAction extends NCAction {private static final long seria ...

  3. nc65用友uap开发节点通过按钮调用打开另外一个节点并传数据跳编辑态

    点击按钮弹框,出现以下界面 1.按钮代码: try{if(billVO != null){FuncletInitData initDataa = new FuncletInitData();initD ...

  4. UG软件中针对汽车产品开发的模块

    UG软件中针对汽车产品开发的模块 1 汽车产品开发技术及发展方向 目前对先进制造技术尚没有一个明确的.一致公认的定义,经过近年来对发展先进制造技术方面开展的工作,通过对其特征的分析研究,可以认为:先进 ...

  5. 用友nc65 uap开发刷新按钮二次开发

    用友nc65 uap开发刷新按钮二次开发 1.问题现象:卡片刷新,直接返回列表,且定位成第一条,且执行的是全部刷新 2.问题分析: 65向导生成的按钮,刷新按钮使用的同一个 nc.ui.pubapp. ...

  6. 用友uap nc65开发 二次登陆节点打开控制校验

    用友uap nc65开发  二次登陆节点打开前控制校验 前面一次博客讲了二次登陆节点的产生,现在对二次登陆节点打开前进行控制. 在未登陆服务中心打开节点时提示如下 主要代码:重写FuncletWind ...

  7. 用友uap nc65开发-单据联查相关开发

    用友uap nc65开发-单据联查相关开发 1.单据联查:针对有上下游数据单据,通过单据联查使用图形化界面显示该单据上下游.本教程分两部分,上游和下游. 2.前期配置:xml配置对应的按钮,这里指定当 ...

  8. 用友uap nc65开发自定义档案开发

    用友uap  nc65开发自定义档案开发 1.概况:自定义档案类似nc65中的参照,与参照不同的是,自定义档案更易维护,不需要建立单独节点,但具有参照的功能,缺点是无法像参照那样维护更多信息.下面说明 ...

  9. 用友uap开发nc65按钮配置

    用友uap开发nc65按钮配置 1.在xml文件中配置按钮 <!--======= 动作:[newActions] [修改] ===========--> <bean id=&quo ...

最新文章

  1. leetcode C++ 45. 跳跃游戏 II 给定一个非负整数数组,你最初位于数组的第一个位置。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 你的目标是使用最少的跳跃次数到达数组的最后
  2. 【PP生产订单】入门介绍(七)
  3. java实现数据库内容修改_数据库更改到Java环境中实现可持续和平
  4. 括号匹配问题(c和c++版本实现)
  5. 如何在报表中实现算法的可挂接需求
  6. C++|STL学习笔记-对STL中关联容器map的进一步认识
  7. 7-47 对称排序 (25 分)
  8. BetterZip使用教程:Mac用户如何提取压缩文件?
  9. antd 轮播图样式_antd-design 的轮播图组件Carousel如何在初始化的时候自动跳转到特定图片...
  10. MySQL报错The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents .....
  11. GameofMir__游戏Mod制作【1】
  12. USB redirection
  13. 液晶屏接口定义_简介TFT-LCD液晶屏接口类型之LVDS接口
  14. 腾讯云云服务器的功能与优势-Unirech腾讯云代充
  15. 10款神奇的字符图案 词汇云生成工具
  16. 打开计算机页面只有上面一半,我电脑打开网页总是打开一半,不知道是为什么,请高手指教,谢谢!...
  17. C++11多线程:thread头文件
  18. 计算机/软件等专业【调剂信息】集合!
  19. 《系统功能测试报告》
  20. android化学制图软件,化学工具箱最新版

热门文章

  1. 后端开发二维码接口供前端调用
  2. 软件需求分析方法收集
  3. Go-ICP: A Globally Optimal Solutionto 3D ICP Point-Set Registration(2016)
  4. 深度|未来电竞产业的新“十倍空间”
  5. 机器学习第五周神经网络 反向传播 嗷嗷好
  6. ABB机器人引导应用程序详解
  7. bitwig编曲软件linux,BITWIG教程
  8. 创业第27天,开始规划把SEO功能加进竞价助手
  9. 网吧:连锁网吧是行业快速发展主因
  10. Java应用程序生成JAR包,部署到Hadoop平台上运行