起步软件技术论坛
搜索
 找回密码
 注册

QQ登录

只需一步,快速开始

楼主: zsj5237

[结贴] 如何在流程流转结束步骤,调用自定义action

[复制链接]

67

主题

279

帖子

434

积分

中级会员

Rank: 3Rank: 3

积分
434
QQ
 楼主| 发表于 2014-11-17 10:20:52 | 显示全部楼层
jishuang 发表于 2014-11-14 16:36
/demo/components/data这样的data目录

就是这个db.config.m所在的data的目录

如何在leaveProcessAfterFinish事件获取流转单的信息(例如流转单的fNO,FID)

public static void leaveProcessAfterFinish() {
        Map parameters = new HashMap();
        Object result = ActionUtils.invokeAction("/xusteelOA/workTime/process/leave/leaveProcess", "businessActivity1", "feedbackLeave", null, parameters);
       
}


在调用的action中,如何获取出传递的parameters 参数呢?
回复 支持 反对

使用道具 举报

91

主题

13万

帖子

3万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
35942
发表于 2014-11-17 11:28:48 | 显示全部楼层
这个是你的action中定义的java中直接操作参数啊
远程的联系方法QQ1392416607,添加好友时,需在备注里注明其论坛名字及ID,公司等信息
发远程时同时也发一下帖子地址,方便了解要解决的问题  WeX5教程  WeX5下载



如按照该方法解决,请及时跟帖,便于版主结贴
回复 支持 反对

使用道具 举报

67

主题

279

帖子

434

积分

中级会员

Rank: 3Rank: 3

积分
434
QQ
 楼主| 发表于 2014-11-17 11:44:32 | 显示全部楼层
jishuang 发表于 2014-11-17 11:28
这个是你的action中定义的java中直接操作参数啊

我需要在onAfterFinish事件里,从UI界面中获取当前流转单的单号FNO和FID,在java类中,怎样获取,request?
回复 支持 反对

使用道具 举报

67

主题

279

帖子

434

积分

中级会员

Rank: 3Rank: 3

积分
434
QQ
 楼主| 发表于 2014-11-17 12:00:09 | 显示全部楼层
onAfterFinish中,已经可以通过
String bizID = ProcessUtils.getProcessData1();
获取到流转单的FID,
/**
         * 流转完成后事件
         * */
        public static void leaveProcessAfterFinish() {
                System.out.println(">>>>>>>>>>流传完成时间调用<<<<<<<<<<");
                String bizID = ProcessUtils.getProcessData1();
                System.out.println(">>>OK<<<");
                Map parameters = new HashMap();
                parameters.put("fid", bizID);
                System.out.println(bizID);
                Object result = ActionUtils.invokeAction("/xusteelOA/workTime/process/leave/leaveProcess", "businessActivity1", "feedbackLeave", null, parameters);
               
                System.out.println(result);
        }


这样调用自定义action,如何接收传递的map参数?
回复 支持 反对

使用道具 举报

91

主题

13万

帖子

3万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
35942
发表于 2014-11-17 14:23:35 | 显示全部楼层
zsj5237 发表于 2014-11-17 12:00
onAfterFinish中,已经可以通过
String bizID = ProcessUtils.getProcessData1();
获取到流转单的FID,

要bizID的id,直接到数据库中用sql或者ksql取数据遍历data就可以
参数是feedbackLeave这个action中定义的参数,在feedbackLeave这个action对应的java代码中根据java中定义的参数名直接操作这个参数就可以
远程的联系方法QQ1392416607,添加好友时,需在备注里注明其论坛名字及ID,公司等信息
发远程时同时也发一下帖子地址,方便了解要解决的问题  WeX5教程  WeX5下载



如按照该方法解决,请及时跟帖,便于版主结贴
回复 支持 反对

使用道具 举报

67

主题

279

帖子

434

积分

中级会员

Rank: 3Rank: 3

积分
434
QQ
 楼主| 发表于 2014-11-17 16:14:21 | 显示全部楼层
jishuang 发表于 2014-11-17 14:23
要bizID的id,直接到数据库中用sql或者ksql取数据遍历data就可以
参数是feedbackLeave这个action中定义的 ...

现在action方法写到[size=13.63636302948px]onAfterFinish中,但是在调用存储过程时,无法回滚事务,方法如下:
private static void synchronousHr(Iterator<Row> rows) {
                // 创建连接
                Connection conn = null;
                try {
                        conn = ModelUtils.getConnectionInTransaction("/dngt/hr/data");
                        if (rows.hasNext()) {
                                Row row = rows.next();
                                String empNo = row.getString("fApplyPersonID"); //员工工号
                                Date startDate = row.getDateTime("fStartTime"); // 请假开始时间
                                Date endDate = row.getDateTime("fEndTime"); // 请假结束时间
                                String no = row.getString("fNo"); // 请假单号
                                // 日期相差天数
                                int dayTime = (int) ((endDate.getTime() / 86400000L) - (startDate.getTime() / 86400000L));
                                System.out.println("时间差" + dayTime);
                                SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
                                if (dayTime == 0) {

                                        System.out.println("day:" + sdf.format(startDate) + "type:" + getFirstDayType(startDate));
                                        // 同步HR
                                        executeProcedure(conn, empNo, sdf.format(startDate), getFirstDayType(startDate), no);
                                } else if (dayTime == 1) {
                                        System.out.println("day:" + sdf.format(startDate) + "type:" + getFirstDayType(startDate));
                                        System.out.println("day:" + sdf.format(endDate) + "type:" + getEndDayType(startDate));
                                        // 同步HR
                                        executeProcedure(conn, empNo, sdf.format(startDate), getFirstDayType(startDate), no);
                                        executeProcedure(conn, empNo, sdf.format(endDate), getEndDayType(endDate), no);
                                } else {
                                        Calendar calendar = new GregorianCalendar();
                                        calendar.setTime(startDate);
                                        for (int i = 0; i < dayTime; i++) {
                                                calendar.add(calendar.DATE, i);
                                                if (i == 0) {
                                                        System.out.println("day:" + sdf.format(calendar.getTime()) + "type:" + getFirstDayType(calendar.getTime()));
                                                        executeProcedure(conn, empNo, sdf.format(startDate), getFirstDayType(calendar.getTime()), no);
                                                } else {
                                                        System.out.println("day:" + sdf.format(calendar.getTime()) + "type:全天");
                                                        executeProcedure(conn, empNo, sdf.format(calendar.getTime()), "全天", no);
                                                }
                                        }
                                        System.out.println("day:" + sdf.format(endDate) + "type:" + getEndDayType(startDate));
                                        executeProcedure(conn, empNo, sdf.format(endDate), getEndDayType(endDate), no);
                                }

                        }
                        System.out.println(2/0);
                        conn.commit();
                } catch (Exception e) {
                        if(null != conn){
                                try{conn.rollback();} catch(SQLException ex) {ex.printStackTrace();}
                        }
                }
        }


报错:java.sql.SQLException: 模型事务下不支持Connection上的rollback
数据直接入库俩条。没有回滚.

请指点解决方案
回复 支持 反对

使用道具 举报

67

主题

279

帖子

434

积分

中级会员

Rank: 3Rank: 3

积分
434
QQ
 楼主| 发表于 2014-11-17 16:41:30 | 显示全部楼层
本帖最后由 zsj5237 于 2014-11-17 16:44 编辑

设置手动提交Connection。数据永远不保存,怎么解决?
回复 支持 反对

使用道具 举报

91

主题

13万

帖子

3万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
35942
发表于 2014-11-17 17:20:36 | 显示全部楼层
zsj5237 发表于 2014-11-17 16:14
现在action方法写到onAfterFinish中,但是在调用存储过程时,无法回滚事务,方法如下:
private static v ...

参考http://bbs.justep.com/thread-33592-1-1.html
远程的联系方法QQ1392416607,添加好友时,需在备注里注明其论坛名字及ID,公司等信息
发远程时同时也发一下帖子地址,方便了解要解决的问题  WeX5教程  WeX5下载



如按照该方法解决,请及时跟帖,便于版主结贴
回复 支持 反对

使用道具 举报

67

主题

279

帖子

434

积分

中级会员

Rank: 3Rank: 3

积分
434
QQ
 楼主| 发表于 2014-11-18 09:30:57 | 显示全部楼层
jishuang 发表于 2014-11-17 17:20
参考http://bbs.justep.com/thread-33592-1-1.html

private static void synchronousHr(Iterator<Row> rows) {
                // 创建连接
                java.sql.Connection conn = null;
                com.justep.system.data.Transaction tx = null;
                CallableStatement proc = null;
                try {
                        // 取得数据库连接
                        tx = new com.justep.system.data.Transaction();
                        //conn = ModelUtils.getConnectionInTransaction("/dngt/hr/data");
                        conn = tx.getConnection("/dngt/hr/data");
                        tx.begin();
                        // 存储过程对象
                        proc = conn.prepareCall("{ call HR_Interface_Generate1(?,?,?,?) }");
                        if (rows.hasNext()) {
                                Row row = rows.next();
                                String empNo = row.getString("fApplyPersonID"); //员工工号
                                Date startDate = row.getDateTime("fStartTime"); // 请假开始时间
                                Date endDate = row.getDateTime("fEndTime"); // 请假结束时间
                                String no = row.getString("fNo"); // 请假单号
                                // 日期相差天数
                                int dayTime = (int) ((endDate.getTime() / 86400000L) - (startDate.getTime() / 86400000L));
                                System.out.println("时间差" + dayTime);
                                SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
                                if (dayTime == 0) {
                                        // 同步HR
                                        executeProcedure(conn, proc, empNo, sdf.format(startDate), getFirstDayType(startDate), no);
                                } else if (dayTime == 1) {
                                        // 同步HR
                                        executeProcedure(conn, proc, empNo, sdf.format(startDate), getFirstDayType(startDate), no);
                                        executeProcedure(conn, proc, empNo, sdf.format(endDate), getEndDayType(endDate), no);
                                } else {
                                        Calendar calendar = new GregorianCalendar();
                                        calendar.setTime(startDate);
                                        for (int i = 0; i < dayTime; i++) {
                                                calendar.add(calendar.DATE, i);
                                                if (i == 0) {
                                                        executeProcedure(conn, proc, empNo, sdf.format(startDate), getFirstDayType(calendar.getTime()), no);
                                                } else {
                                                        executeProcedure(conn, proc, empNo, sdf.format(calendar.getTime()), "全天", no);
                                                }
                                        }
                                        // 异常情况
                                        int abc = 2 / 0;
                                        executeProcedure(conn, proc, empNo, sdf.format(endDate), getEndDayType(endDate), no);
                                }
                                tx.commit();
                        }
                } catch (Exception e) {
                        System.out.println("execute exception");
                        try {
                                tx.rollback();
                        } catch (SQLException ex) {
                                System.out.println("rollback exception");
                        }
                } finally {
                        try {
                                if (proc != null) {
                                        proc.close();
                                }
                                if (conn != null) {
                                        conn.close();
                                }
                        } catch (SQLException e) {
                                System.out.println("close exception");
                        }
                }
        }

        private static void executeProcedure(Connection conn, CallableStatement proc, String empNo, String date, String type, String no) throws Exception {
                //赋值参数
                proc.setString(1, empNo); //@EmpNo 工号
                proc.setString(2, date); //@Date 请假时间
                proc.setString(3, type); //@Type 请假半天类型
                proc.setString(4, no); //@No 请假单号
                proc.execute();
        }

上述代码是事务管理模块,执行到异常情况时(背景蓝色部分),数据仍能入库,事务不会滚?而且finally里的关闭,也有异常,提示:
java.sql.SQLException: Connection is closed.

回复 支持 反对

使用道具 举报

91

主题

13万

帖子

3万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
35942
发表于 2014-11-18 10:35:08 | 显示全部楼层
// 异常情况
                                        int abc = 2 / 0;
                                        executeProcedure(conn, proc, empNo, sdf.format(endDate), getEndDayType(endDate), no);
前面出错了后面红色的还会执行?
控制台不报错?
远程的联系方法QQ1392416607,添加好友时,需在备注里注明其论坛名字及ID,公司等信息
发远程时同时也发一下帖子地址,方便了解要解决的问题  WeX5教程  WeX5下载



如按照该方法解决,请及时跟帖,便于版主结贴
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|X3技术论坛|Justep Inc.    

GMT+8, 2024-5-19 22:58 , Processed in 0.058687 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表