UDN-企业互联网技术人气社区

板块导航

浏览  : 14059
回复  : 64

[开发方案] 【UAPMobile专题】平台移动制单、审批案例

  [复制链接]
展翔的头像 楼主
本帖最后由 展翔 于 2015-7-8 15:54 编辑

UAPMobile平台移动制单、审批案例
一:需求场景:
    针对合肥泰源项目中销售模块中有商机提交、审批、驳回等需求;购机需求中有购机申请等等这些需求都需要进行移动流程开发、本案例是结合UAP Mobile平台和UAP的LFW业务系统开发的移动制单、审批案例;针对以后其他需求有使用到移动制单、审批的场景可以参考本案例进行实现。
二:LFW业务流程设计
2.1定义LFW业务流首先需要在LFW业务系统定义流程、LFW业务系统定义的流程是根据”业务类型”进行定义、如图:
1.png


2.2流程定义界面
一共有三级审核人、第一级审核人截图如下,提交人为”汪艳玲”
2.png

第二级审核人为”韩总”
3.png

第三级审核人为”张总”
4.png

三:手机UI端流程流转
3.1汪艳玲作为制单人在手机商机界面进行制单提交
手机制单界面如下:
5.png

先进行业务单据保存、然后手机提交单据操作
6.png
LFW业务系统同步的流程状态为
7.png


8.png


3.2韩总 手机登录以后可以在消息中获取代办任务
代办任务中有一条”汪艳玲提交的单据消息”
9.png

然后点击该消息进入到商机详情页面进行审核、驳回操作
审核通过以后手机端页面展现:
17.png

业务系统流程审核通过展现如下:
15.png

13.png

3.3张总手机登录以后从代办任务中获取代办任务
进行驳回操作:
业务系统对应的流程状态如下:
16.png


3.4韩总经过重审、张总最终审核通过
业务流程状态如下所示:
18.png

四:MA端Ctroll的设计
    MA上提供针对移动制单、审批的ctroll类为BusinessReviewCtroller.java里面包含制单提交、审批、驳回、不同意、查询审批历史、查询代办任务等方法
4.1根据用户id获取代办任务方法
         com.ty.controller.sales.BusinessReviewCtroller.getTaskList(String userid) throws Exception
4.2根据任务id获取单据内容
         com.ty.controller.sales.BusinessReviewCtroller.showApplyBusiinfo(String taskid)其中taskid为获取的代办任务中获取
4.3针对单据审核、驳回、不批准动作
         com.ty.controller.sales.BusinessReviewCtroller.doAction(String billinfo) throws Exception
4.4移动制单、手机端提交单据动作方法
         com.ty.controller.sales.BusinessReviewCtroller.commitSalesBo(String info) throws Exception
这里面注意的是手机端制单方法里面的info信息,里面要包含提交业务单据的pk即主表主键pk
五:MA上的conf下的配置文件配置
5.1 Datasource.xml配置
19.png

里面配置的为业务系统的ip地址加端口号、业务系统数据源名称
5.2 Service.xml文件配置
20.png

该服务提供文件里面这里面指明几点、nc.uap.wfm.exe.ILfwWmfMobileAppService该接口为LFW系统针对移动端提供的接口、可以直接调用该业务接口并传入配置文件中的参数调用到LFW业务系统后台获取代办、已办、办结列表;根据单据id获取单据详细信息,但其中的getMainBody()方法需要自己去实现、也可以自己定义业务系统接口单独去实现该方法返回需要的数据
六:业务系统接口设计
移动制单、审批核心代码
业务系统后台提交代码、经过单元测试、MA上的参数和业务接口的参数需要对照一致
6.1 LFW业务系统提交代码
String com.ty.itf.salesbo.IMobileCallItf.doSubmitAction(String masterPK, String pk_org, String pk_user) throws BusinessException
参数:
masterPK 商机评审单据主键
pk_org 组织
pk_user 用户PK
手机提交单据实现类核心代码如下:
@Override
         public String doSubmitAction(String masterPK, String pk_org, String pk_user)
                            throws BusinessException {
                   // TODO 自动生成的方法存根
                   try {

                            InvocationInfoProxy.getInstance().setUserCode(usercode);
                            String pk_group = "0001AA100000000005FN";// 集团
                            String pk_flowtype = getWfmFlwTypeVOs("APPSBA").getPk_flwtype();
                            NetStreamContext.setToken(token);
                            final Object proDef = WfmUtilFacade.getProDefByFlowType(pk_flowtype,
                                               pk_user, pk_org, pk_group);
                            if (null == WfmCPUtilFacade.getProDefByFlowTypeAndOrg(pk_flowtype,
                                               pk_user, pk_org, pk_group, null)) {
                                     throw new BusinessException("当前业务子类型未定义流程,或您非流程的提交人!");
                            }
                            if (null == proDef) {
                                     throw new BusinessException("您非流程发起人");
                            }
                            WfmParams params = new WfmParams();
                            String taskpk = null;
                            Object taskVO = WfmEngineUIAdapterFactory.getInstance()
                                               .getLasterTaskByBillIdAndUser(masterPK,
                                                                 InvocationInfoProxy.getInstance().getUserId());
                            // 根据单据号和当前登录人找到合适的任务
                            if (null == taskVO) { // 新制单提交
                                     ;
                            } else { // 被驳回 重新提交
                                     taskpk = WfmTaskUtil.getTaskPkByTaskVO(taskVO);
                            }
                            params.setTaskPk(taskpk);
                            params.setFlowTypePk(pk_flowtype);
                            params.setCurOrgPk(pk_org);
                            BaseDAO dao = new BaseDAO();

                            WfmFlwFormVO wfmVO = (WfmFlwFormVO) dao.retrieveByPK(
                                               WfmFlwFormVO.class, masterPK);
                            /**
                            * 提交单据以后回写业务VO //
                            */
                            WfmFlwFormVO wfmVO1 = new WfmFlwFormVO();
                            TtBoAuditVO hvo=CRUDHelper.getMdCRUDService().retrieveByPk(TtBoAuditVO.class, masterPK);
                            for (String attrName : hvo.getAttributeNames()) {
                                     wfmVO1.setAttributeValue(attrName, hvo.getAttributeValue(attrName));
                            }
                            params.setFormInfoCtx(wfmVO);
                            params.setProdef(proDef);
                            params.setCurGroupPk(pk_group);
                            params.setProdefPk(((ProDef) proDef).getPk_prodef());
                            params.setCurUserPk(pk_user);
                            params.setOperator("agree");
                            Object xx2 = WfmEngineCmdAdapterFactory.getInstance()
                                               .commitBuilderWfmFlowInfoCtx(params);
                            if (null != taskVO) {
                                     xx2 = WfmEngineCmdAdapterFactory.getInstance()
                                                        .nextBuilderWfmFlowInfoCtx(params);
                            }
                            return "ok";
                   } catch (Exception e) {
                            // TODO 自动生成的 catch 块
                            return "error";
                   }
         }
手机审批、驳回、不同意核心代码如下
public String  doAction(String pk_group, String userid, String approveNote,
                            String taskid, String actioncode) throws BusinessException {
                   List<Map> actiondes = new ArrayList<Map>();
                   Map<String, Object> actionmap = new HashMap<String, Object>();
                   actionmap.put("taskid", taskid);
                   // 动作编码
                   actionmap.put("actioncode", actioncode);
                   // 审批意见
                   actionmap.put("note", approveNote);
                   // (List<String>) // 转发人员列表
                   List<String> userids = new ArrayList<String>();
                   if(actioncode.equalsIgnoreCase("doAgree")){
                            //获取流程下级接收人
                            List<Map<String, Object>> resultList = WfmEngineCmdAdapterFactory.getInstance().getNextHumUsers(taskid, null);
                            if(resultList.size()>0){
                                     String nextuserid=resultList.get(0).get("id").toString();
                                     userids.add(nextuserid);
                            }else{
                                     userids.add("");
                            }
                   }else{
                            userids.add("");
                   }
                   actionmap.put("userids", userids);
                   actiondes.add(actionmap);
                   Map<String, Object> activity = new HashMap<String, Object>();
                   if (actioncode.equalsIgnoreCase("doAgree")
                                     || actioncode.equalsIgnoreCase("doDisAgree")
                                     || actioncode.equalsIgnoreCase("doReject")) {
                            activity = ExternalFacade.getActivityList(pk_group, userid, taskid,
                                               null, null, actioncode, "1", "2");
                            ArrayList list = (ArrayList) activity.get("list");
                            Map<String, String> map = (Map<String, String>) list.get(0);
                            List<Map> activityids = new ArrayList();
                            Map<String, Object> activityid = new HashMap<String, Object>();
                            activityid.put("activityid", map.get("id"));
                            activityid.put("usrids", userids);
                            activityids.add(activityid);
                            actionmap.put("activityids", activityids);
                   }
                   ExternalFacade.doAction(pk_group, userid, actiondes);
                   return "ok";
         }
在轻量向导生成的代码WfmFlwFormOper类中添加getMainBody()方法
@Override
                   public Map<String, Object> getMainBody(String groupid, String userid,
                                     Task task) throws BusinessException {
                            Map<String, Object> map = new HashMap<String, Object>();
                            PtBaseDAO dao = new PtBaseDAO();
                            TtBoAuditVO vo = (TtBoAuditVO) dao.retrieveByPK(TtBoAuditVO.class, task.getPk_frmins());

                            SalesBoItf service = NCLocator.getInstance().lookup(SalesBoItf.class);
                            List<Map<String,String>> retr=new ArrayList<Map<String,String>>();
                            retr=service.querySalesVoByPk(vo.getPk_sales_bo());
                            map.put("head", vo);
                            map.put("salesBo", retr);
                            return map;
                   }
当然这里也可以自己定义接口去实现根据单据id获取具体单据信息的方法,然后配置到配置文件中即可
备注:
1.在该项目中的移动制单、审批功能中针对获取代办任务使用ILfwWmfMobileAppService接口进行;
2.移动制单、审批、驳回、不同意使用IMobileCallItf接口以及实现类进行实现


10.png
11.png
12.png
14.png

相关帖子

发表于 2015-7-6 18:08:14 | 显示全部楼层
收藏,学习
使用道具 举报

回复

发表于 2015-7-6 21:30:51 | 显示全部楼层
收藏
使用道具 举报

回复

发表于 2015-7-6 22:32:47 | 显示全部楼层
不错的帖子,顶顶
使用道具 举报

回复

发表于 2015-7-6 23:17:36 | 显示全部楼层
不错的帖子,顶顶
使用道具 举报

回复

发表于 2015-7-6 23:25:12 | 显示全部楼层
精品贴,赞
使用道具 举报

回复

发表于 2015-7-7 08:15:17 | 显示全部楼层
路过
使用道具 举报

回复

发表于 2015-7-8 15:53:09 | 显示全部楼层
好文章,多谢分享。
使用道具 举报

回复

发表于 2015-7-8 15:54:00 | 显示全部楼层
使用道具 举报

回复

发表于 2015-7-8 16:05:41 | 显示全部楼层
DING  DUANG  DING  DUANG
使用道具 举报

回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于我们
联系我们
  • 电话:010-86393388
  • 邮件:udn@yonyou.com
  • 地址:北京市海淀区北清路68号
移动客户端下载
关注我们
  • 微信公众号:yonyouudn
  • 扫描右侧二维码关注我们
  • 专注企业互联网的技术社区
版权所有:用友网络科技股份有限公司82041 京ICP备05007539号-11 京公网网备安1101080209224 Powered by Discuz!
快速回复 返回列表 返回顶部