Jelajahi Sumber

git-svn-id: https://192.168.57.71/svn/jsgkj@927 931142cf-59ea-a443-aa0e-51397b428577

xt_yuanxd 8 tahun lalu
induk
melakukan
fa116da46c
19 mengubah file dengan 1865 tambahan dan 4 penghapusan
  1. 8 0
      gkaqv2/trunk/modules/frame/src/main/java/com/xt/js/gkaq/frame/mappers/TaskModelMapper.java
  2. 10 0
      gkaqv2/trunk/modules/frame/src/main/java/com/xt/js/gkaq/frame/mappers/WfPropModelMapper.java
  3. 200 0
      gkaqv2/trunk/modules/frame/src/main/java/com/xt/js/gkaq/frame/model/TaskModel.java
  4. 148 0
      gkaqv2/trunk/modules/frame/src/main/java/com/xt/js/gkaq/frame/model/WfPropModel.java
  5. 8 0
      gkaqv2/trunk/modules/frame/src/main/java/com/xt/js/gkaq/frame/service/TaskModelService.java
  6. 27 0
      gkaqv2/trunk/modules/frame/src/main/java/com/xt/js/gkaq/frame/service/WFPropService.java
  7. 1 1
      gkaqv2/trunk/modules/frame/src/main/java/com/xt/js/gkaq/frame/service/impl/GroupButtonServiceImpl.java
  8. 1 1
      gkaqv2/trunk/modules/frame/src/main/java/com/xt/js/gkaq/frame/service/impl/GroupMenuServiceImpl.java
  9. 1 1
      gkaqv2/trunk/modules/frame/src/main/java/com/xt/js/gkaq/frame/service/impl/RoleButtonServiceImpl.java
  10. 1 1
      gkaqv2/trunk/modules/frame/src/main/java/com/xt/js/gkaq/frame/service/impl/RoleMenuServiceImpl.java
  11. 27 0
      gkaqv2/trunk/modules/frame/src/main/java/com/xt/js/gkaq/frame/service/impl/TaskModelServiceImpl.java
  12. 41 0
      gkaqv2/trunk/modules/frame/src/main/java/com/xt/js/gkaq/frame/service/impl/WFPropServiceImpl.java
  13. 60 0
      gkaqv2/trunk/modules/frame/src/main/java/com/xt/js/gkaq/frame/system/Utils.java
  14. 71 0
      gkaqv2/trunk/modules/frame/src/main/java/com/xt/js/gkaq/frame/wf/SinglePageRequest.java
  15. 85 0
      gkaqv2/trunk/modules/frame/src/main/java/com/xt/js/gkaq/frame/wf/TaskVarListener.java
  16. 49 0
      gkaqv2/trunk/modules/frame/src/main/java/com/xt/js/gkaq/frame/wf/WorkFlowParam.java
  17. 191 0
      gkaqv2/trunk/modules/frame/src/main/java/com/xt/js/gkaq/frame/wf/WorkItem.java
  18. 158 0
      gkaqv2/trunk/modules/frame/src/main/java/com/xt/js/gkaq/frame/wf/WorkflowMangerService.java
  19. 778 0
      gkaqv2/trunk/modules/frame/src/main/java/com/xt/js/gkaq/frame/wf/impl/WorkflowMangerServiceImpl.java

+ 8 - 0
gkaqv2/trunk/modules/frame/src/main/java/com/xt/js/gkaq/frame/mappers/TaskModelMapper.java

@@ -0,0 +1,8 @@
+package com.xt.js.gkaq.frame.mappers;
+
+import com.xt.js.gkaq.common.BaseMapper;
+import com.xt.js.gkaq.frame.model.TaskModel;
+
+public interface TaskModelMapper extends BaseMapper<TaskModel> {
+    TaskModel selectByTaskId(String taskId);
+}

+ 10 - 0
gkaqv2/trunk/modules/frame/src/main/java/com/xt/js/gkaq/frame/mappers/WfPropModelMapper.java

@@ -0,0 +1,10 @@
+package com.xt.js.gkaq.frame.mappers;
+
+import java.util.List;
+
+import com.xt.js.gkaq.common.BaseMapper;
+import com.xt.js.gkaq.frame.model.WfPropModel;
+
+public interface WfPropModelMapper extends BaseMapper<WfPropModel> {
+    List<WfPropModel> selectByCondition(String wfKey, String activity, String propName);
+}

+ 200 - 0
gkaqv2/trunk/modules/frame/src/main/java/com/xt/js/gkaq/frame/model/TaskModel.java

@@ -0,0 +1,200 @@
+package com.xt.js.gkaq.frame.model;
+
+import java.util.Date;
+
+import com.xt.js.gkaq.common.BaseUUIDModel;
+
+public class TaskModel extends BaseUUIDModel{
+    /** serialVersionUID */
+    private static final long serialVersionUID = -5741510162455977323L;
+
+    private String taskId;
+
+    private String busId;
+
+    private String step;
+
+    private Date startTime;
+
+    private String startUser;
+
+    private String currName;
+
+    private String runner;
+
+    private Date runTime;
+
+    private Date auditTime;
+
+    private String auditMsg;
+
+    private String auditResult;
+
+    private String qylb;
+
+    private Short ssqy;
+
+    private String busKey;
+
+    private String auditUser;
+
+    private String taskKey;
+
+    private String roleCode;
+
+    private String auditUsername;
+
+    private Short szd;
+
+    public String getTaskId() {
+        return taskId;
+    }
+
+    public void setTaskId(String taskId) {
+        this.taskId = taskId == null ? null : taskId.trim();
+    }
+
+    public String getBusId() {
+        return busId;
+    }
+
+    public void setBusId(String busId) {
+        this.busId = busId == null ? null : busId.trim();
+    }
+
+    public String getStep() {
+        return step;
+    }
+
+    public void setStep(String step) {
+        this.step = step == null ? null : step.trim();
+    }
+
+    public Date getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(Date startTime) {
+        this.startTime = startTime;
+    }
+
+    public String getStartUser() {
+        return startUser;
+    }
+
+    public void setStartUser(String startUser) {
+        this.startUser = startUser == null ? null : startUser.trim();
+    }
+
+    public String getCurrName() {
+        return currName;
+    }
+
+    public void setCurrName(String currName) {
+        this.currName = currName == null ? null : currName.trim();
+    }
+
+    public String getRunner() {
+        return runner;
+    }
+
+    public void setRunner(String runner) {
+        this.runner = runner == null ? null : runner.trim();
+    }
+
+    public Date getRunTime() {
+        return runTime;
+    }
+
+    public void setRunTime(Date runTime) {
+        this.runTime = runTime;
+    }
+
+    public Date getAuditTime() {
+        return auditTime;
+    }
+
+    public void setAuditTime(Date auditTime) {
+        this.auditTime = auditTime;
+    }
+
+    public String getAuditMsg() {
+        return auditMsg;
+    }
+
+    public void setAuditMsg(String auditMsg) {
+        this.auditMsg = auditMsg == null ? null : auditMsg.trim();
+    }
+
+    public String getAuditResult() {
+        return auditResult;
+    }
+
+    public void setAuditResult(String auditResult) {
+        this.auditResult = auditResult == null ? null : auditResult.trim();
+    }
+
+    public String getQylb() {
+        return qylb;
+    }
+
+    public void setQylb(String qylb) {
+        this.qylb = qylb == null ? null : qylb.trim();
+    }
+
+    public Short getSsqy() {
+        return ssqy;
+    }
+
+    public void setSsqy(Short ssqy) {
+        this.ssqy = ssqy;
+    }
+
+    public String getBusKey() {
+        return busKey;
+    }
+
+    public void setBusKey(String busKey) {
+        this.busKey = busKey == null ? null : busKey.trim();
+    }
+
+    public String getAuditUser() {
+        return auditUser;
+    }
+
+    public void setAuditUser(String auditUser) {
+        this.auditUser = auditUser == null ? null : auditUser.trim();
+    }
+
+    public String getTaskKey() {
+        return taskKey;
+    }
+
+    public void setTaskKey(String taskKey) {
+        this.taskKey = taskKey == null ? null : taskKey.trim();
+    }
+
+    public String getRoleCode() {
+        return roleCode;
+    }
+
+    public void setRoleCode(String roleCode) {
+        this.roleCode = roleCode == null ? null : roleCode.trim();
+    }
+
+    public String getAuditUsername() {
+        return auditUsername;
+    }
+
+    public void setAuditUsername(String auditUsername) {
+        this.auditUsername = auditUsername == null ? null : auditUsername.trim();
+    }
+
+    public Short getSzd() {
+        return szd;
+    }
+
+    public void setSzd(Short szd) {
+        this.szd = szd;
+    }
+}

+ 148 - 0
gkaqv2/trunk/modules/frame/src/main/java/com/xt/js/gkaq/frame/model/WfPropModel.java

@@ -0,0 +1,148 @@
+package com.xt.js.gkaq.frame.model;
+
+import com.xt.js.gkaq.common.BaseUUIDModel;
+
+public class WfPropModel extends BaseUUIDModel {
+    /** serialVersionUID  */
+    private static final long serialVersionUID = 4926178660975118495L;
+
+    private String wfKey;
+
+    private String wfName;
+
+    private String acitivty;
+
+    private String acitivtyName;
+
+    private String name;
+
+    private String value;
+
+    private String disp;
+
+    private String qylb;
+
+    private Short ssqy;
+
+    private String byzd1;
+
+    private String byzd2;
+
+    private String byzd3;
+
+    private String byzd4;
+
+    private String byzd5;
+
+    public String getWfKey() {
+        return wfKey;
+    }
+
+    public void setWfKey(String wfKey) {
+        this.wfKey = wfKey == null ? null : wfKey.trim();
+    }
+
+    public String getWfName() {
+        return wfName;
+    }
+
+    public void setWfName(String wfName) {
+        this.wfName = wfName == null ? null : wfName.trim();
+    }
+
+    public String getAcitivty() {
+        return acitivty;
+    }
+
+    public void setAcitivty(String acitivty) {
+        this.acitivty = acitivty == null ? null : acitivty.trim();
+    }
+
+    public String getAcitivtyName() {
+        return acitivtyName;
+    }
+
+    public void setAcitivtyName(String acitivtyName) {
+        this.acitivtyName = acitivtyName == null ? null : acitivtyName.trim();
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name == null ? null : name.trim();
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    public void setValue(String value) {
+        this.value = value == null ? null : value.trim();
+    }
+
+    public String getDisp() {
+        return disp;
+    }
+
+    public void setDisp(String disp) {
+        this.disp = disp == null ? null : disp.trim();
+    }
+
+    public String getQylb() {
+        return qylb;
+    }
+
+    public void setQylb(String qylb) {
+        this.qylb = qylb == null ? null : qylb.trim();
+    }
+
+    public Short getSsqy() {
+        return ssqy;
+    }
+
+    public void setSsqy(Short ssqy) {
+        this.ssqy = ssqy;
+    }
+
+    public String getByzd1() {
+        return byzd1;
+    }
+
+    public void setByzd1(String byzd1) {
+        this.byzd1 = byzd1 == null ? null : byzd1.trim();
+    }
+
+    public String getByzd2() {
+        return byzd2;
+    }
+
+    public void setByzd2(String byzd2) {
+        this.byzd2 = byzd2 == null ? null : byzd2.trim();
+    }
+
+    public String getByzd3() {
+        return byzd3;
+    }
+
+    public void setByzd3(String byzd3) {
+        this.byzd3 = byzd3 == null ? null : byzd3.trim();
+    }
+
+    public String getByzd4() {
+        return byzd4;
+    }
+
+    public void setByzd4(String byzd4) {
+        this.byzd4 = byzd4 == null ? null : byzd4.trim();
+    }
+
+    public String getByzd5() {
+        return byzd5;
+    }
+
+    public void setByzd5(String byzd5) {
+        this.byzd5 = byzd5 == null ? null : byzd5.trim();
+    }
+}

+ 8 - 0
gkaqv2/trunk/modules/frame/src/main/java/com/xt/js/gkaq/frame/service/TaskModelService.java

@@ -0,0 +1,8 @@
+package com.xt.js.gkaq.frame.service;
+
+import com.xt.js.gkaq.common.BaseUUIDModelService;
+import com.xt.js.gkaq.frame.model.TaskModel;
+
+public interface TaskModelService extends BaseUUIDModelService<TaskModel> {
+    TaskModel findByTaskId(String taskId);
+}

+ 27 - 0
gkaqv2/trunk/modules/frame/src/main/java/com/xt/js/gkaq/frame/service/WFPropService.java

@@ -0,0 +1,27 @@
+package com.xt.js.gkaq.frame.service;
+
+import com.xt.js.gkaq.common.BaseUUIDModelService;
+import com.xt.js.gkaq.frame.model.WfPropModel;
+
+/**
+ * 工作流控制接口
+ * 
+ * @author 袁晓冬
+ * 
+ */
+public interface WFPropService extends BaseUUIDModelService<WfPropModel> {
+    /**
+     * 检查属性值是否等于指定值
+     * 
+     * @param wfKey
+     *            流程编码
+     * @param activity
+     *            活动ID
+     * @param propName
+     *            属性名称
+     * @param value
+     *            属性验证值
+     * @return
+     */
+    public boolean checkProp(String wfKey, String activity, String propName, String value);
+}

+ 1 - 1
gkaqv2/trunk/modules/frame/src/main/java/com/xt/js/gkaq/frame/service/impl/GroupButtonServiceImpl.java

@@ -36,7 +36,7 @@ public class GroupButtonServiceImpl extends BaseServiceImpl<GroupButtonModel> im
         Date now = new Date();
         record.setCreateTime(now);
         record.setUpdateTime(now);
-        record.setState(BaseUUIDModel.STATE_ADD);
+        record.setState(BaseUUIDModel.STATE_DRAFT);
         return mapper.insert(record);
     }
 

+ 1 - 1
gkaqv2/trunk/modules/frame/src/main/java/com/xt/js/gkaq/frame/service/impl/GroupMenuServiceImpl.java

@@ -36,7 +36,7 @@ public class GroupMenuServiceImpl extends BaseServiceImpl<GroupMenuModel> implem
         Date now = new Date();
         record.setCreateTime(now);
         record.setUpdateTime(now);
-        record.setState(BaseUUIDModel.STATE_ADD);
+        record.setState(BaseUUIDModel.STATE_DRAFT);
         return mapper.insert(record);
     }
 

+ 1 - 1
gkaqv2/trunk/modules/frame/src/main/java/com/xt/js/gkaq/frame/service/impl/RoleButtonServiceImpl.java

@@ -32,7 +32,7 @@ public class RoleButtonServiceImpl extends BaseServiceImpl<RoleButtonModel> impl
     @Override
     public int add(RoleButtonModel record) {
         record.setId(idGenerator.generateStringId());
-        record.setState(BaseUUIDModel.STATE_ADD);
+        record.setState(BaseUUIDModel.STATE_DRAFT);
         return mapper.insert(record);
     }
 

+ 1 - 1
gkaqv2/trunk/modules/frame/src/main/java/com/xt/js/gkaq/frame/service/impl/RoleMenuServiceImpl.java

@@ -36,7 +36,7 @@ public class RoleMenuServiceImpl extends BaseServiceImpl<RoleMenuModel> implemen
         Date now = new Date();
         record.setCreateTime(now);
         record.setUpdateTime(now);
-        record.setState(BaseUUIDModel.STATE_ADD);
+        record.setState(BaseUUIDModel.STATE_DRAFT);
         return mapper.insert(record);
     }
 

+ 27 - 0
gkaqv2/trunk/modules/frame/src/main/java/com/xt/js/gkaq/frame/service/impl/TaskModelServiceImpl.java

@@ -0,0 +1,27 @@
+package com.xt.js.gkaq.frame.service.impl;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.xt.js.gkaq.common.BaseMapper;
+import com.xt.js.gkaq.common.BaseUUIDModelServiceImpl;
+import com.xt.js.gkaq.frame.mappers.TaskModelMapper;
+import com.xt.js.gkaq.frame.model.TaskModel;
+import com.xt.js.gkaq.frame.service.TaskModelService;
+
+@Service
+public class TaskModelServiceImpl extends BaseUUIDModelServiceImpl<TaskModel> implements TaskModelService {
+    @Autowired
+    private TaskModelMapper taskModelMapper;
+
+    @Override
+    protected BaseMapper<TaskModel> getMapper() {
+        return taskModelMapper;
+    }
+
+    @Override
+    public TaskModel findByTaskId(String taskId) {
+        return taskModelMapper.selectByTaskId(taskId);
+    }
+
+}

+ 41 - 0
gkaqv2/trunk/modules/frame/src/main/java/com/xt/js/gkaq/frame/service/impl/WFPropServiceImpl.java

@@ -0,0 +1,41 @@
+package com.xt.js.gkaq.frame.service.impl;
+
+import java.util.List;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.xt.js.gkaq.common.BaseMapper;
+import com.xt.js.gkaq.common.BaseUUIDModelServiceImpl;
+import com.xt.js.gkaq.frame.mappers.WfPropModelMapper;
+import com.xt.js.gkaq.frame.model.WfPropModel;
+import com.xt.js.gkaq.frame.service.WFPropService;
+
+/**
+ * 流程控制服务实现类
+ * 
+ * @author 袁晓冬
+ * 
+ */
+@Service
+public class WFPropServiceImpl extends BaseUUIDModelServiceImpl<WfPropModel> implements WFPropService {
+    @Autowired
+    private WfPropModelMapper mapper;
+
+    @Override
+    protected BaseMapper<WfPropModel> getMapper() {
+        return mapper;
+    }
+
+    @Override
+    public boolean checkProp(String wfKey, String activity, String propName, String value) {
+        List<WfPropModel> props = mapper.selectByCondition(wfKey, activity, propName);
+        if (props != null && props.size() > 0) {
+            for (WfPropModel p : props) {
+                if (StringUtils.equalsIgnoreCase(p.getValue(), value)) { return true; }
+            }
+        }
+        return false;
+    }
+}

+ 60 - 0
gkaqv2/trunk/modules/frame/src/main/java/com/xt/js/gkaq/frame/system/Utils.java

@@ -0,0 +1,60 @@
+package com.xt.js.gkaq.frame.system;
+
+import java.util.Calendar;
+import java.util.Date;
+
+import org.apache.shiro.SecurityUtils;
+import org.apache.shiro.subject.Subject;
+import org.springframework.stereotype.Component;
+
+import com.xt.js.gkaq.frame.model.UserModel;
+
+/**
+ * 系统静态工具方法类。
+ */
+@Component
+public abstract class Utils {
+    /**
+     * 获取当前登录人
+     * 
+     * @return
+     */
+    public static UserModel getCurrentUser() {
+        Subject subject = SecurityUtils.getSubject();
+        if (null == subject || subject.getPrincipal() == null) { return null; }
+        return (UserModel) subject.getPrincipal();
+    }
+
+    /**
+     * 该天最早的时候
+     * 
+     * @param date
+     * @return
+     */
+    public static Date getDateFirstTime(Date date) {
+        if (null == date) { return null; }
+        Calendar c = Calendar.getInstance();
+        c.setTime(date);
+        c.set(java.util.Calendar.HOUR_OF_DAY, 0);
+        c.set(java.util.Calendar.MINUTE, 0);
+        c.set(java.util.Calendar.SECOND, 0);
+        return c.getTime();
+    }
+    /**
+     * 该天最迟的时候
+     * 
+     * @param date
+     * @return
+     */
+    public static Date getDateLastTime(Date date) {
+        if (null == date) {
+            return null;
+        }
+        Calendar c = Calendar.getInstance();
+        c.setTime(date);
+        c.set(java.util.Calendar.HOUR_OF_DAY, 23);
+        c.set(java.util.Calendar.MINUTE, 59);
+        c.set(java.util.Calendar.SECOND, 59);
+        return c.getTime();
+    }
+}

+ 71 - 0
gkaqv2/trunk/modules/frame/src/main/java/com/xt/js/gkaq/frame/wf/SinglePageRequest.java

@@ -0,0 +1,71 @@
+package com.xt.js.gkaq.frame.wf;
+
+import java.io.Serializable;
+
+/**
+ * 分页处理对象,单字段排序
+ * 
+ * @author 袁晓冬
+ * 
+ */
+public class SinglePageRequest implements Serializable {
+    /** serialVersionUID */
+    private static final long serialVersionUID = -8842412227660495154L;
+    /** 当前页码 */
+    private int page;
+    /** 每页条数 */
+    private int size;
+    /** 排序方向 */
+    private String direction;
+    /** 排序字段 */
+    private String sortField;
+
+    public SinglePageRequest() {
+
+    }
+
+    public SinglePageRequest(int page, int size, String direction, String sortField) {
+        this.page = page;
+        this.size = size;
+        this.direction = direction;
+        this.sortField = sortField;
+    }
+
+    public int getPage() {
+        return page;
+    }
+
+    public void setPage(int page) {
+        this.page = page;
+    }
+
+    public int getSize() {
+        return size;
+    }
+
+    public void setSize(int size) {
+        this.size = size;
+    }
+
+    public String getDirection() {
+        return direction;
+    }
+
+    public void setDirection(String direction) {
+        this.direction = direction;
+    }
+
+    public String getSortField() {
+        return sortField;
+    }
+
+    public void setSortField(String sortField) {
+        this.sortField = sortField;
+    }
+
+    @Override
+    public String toString() {
+        return "SinglePageRequest [page=" + page + ", size=" + size + ", direction=" + direction + ", sortField="
+                + sortField + "]";
+    }
+}

+ 85 - 0
gkaqv2/trunk/modules/frame/src/main/java/com/xt/js/gkaq/frame/wf/TaskVarListener.java

@@ -0,0 +1,85 @@
+package com.xt.js.gkaq.frame.wf;
+
+import org.activiti.engine.delegate.DelegateExecution;
+import org.activiti.engine.delegate.DelegateTask;
+import org.activiti.engine.delegate.ExecutionListener;
+import org.activiti.engine.delegate.Expression;
+import org.activiti.engine.delegate.TaskListener;
+import org.springframework.stereotype.Component;
+
+/**
+ * 属性设置监听器
+ * 
+ * @author 袁晓冬
+ * 
+ */
+@Component("taskVarBean")
+public class TaskVarListener implements TaskListener, ExecutionListener {
+	/** serialVersionUID */
+	private static final long serialVersionUID = 6091499437303404090L;
+	// key-组织
+	public static final String KEY_ORG = "var_org";
+	// key-功能
+	public static final String KEY_PERMANTION = "var_permantion";
+	// key-流程描述
+	public static final String KEY_DESCRIPTION = "var_description";
+	// key-签收时间
+	public static final String KEY_CLAIM_DATE = "var_claim_date";
+	// key-自动完成
+	public static final String KEY_AUTO_COMPLETE = "var_autoComplete";
+
+	// 属性名称
+	private Expression varName = null;
+	// 属性值
+	private Expression varValue = null;
+
+	public Expression getVarName() {
+		return varName;
+	}
+
+	public Expression getVarValue() {
+		return varValue;
+	}
+	
+
+	/**
+	 * 参数设置<br>
+	 * 如果参数已经存在则忽略设置
+	 * 
+	 * @param execution
+	 *            DelegateExecution
+	 */
+	public void notify(DelegateExecution execution) throws Exception {
+		String paramName = varName.getValue(execution).toString();
+		Object value = execution.getVariableLocal(paramName);
+		if (null == value) {
+			Object newValue = varValue.getValue(execution);
+			execution.setVariableLocal(paramName, newValue);
+		}
+	}
+
+	/**
+	 * 参数设置<br>
+	 * 如果参数已经存在则忽略设置
+	 * 
+	 * @param delegateTask
+	 *            DelegateTask
+	 */
+	public void notify(DelegateTask delegateTask) {
+		String paramName = varName.getValue(delegateTask).toString();
+		Object value = delegateTask.getVariableLocal(paramName);
+		if (null == value) {
+			Object newValue = varValue.getValue(delegateTask);
+			delegateTask.setVariableLocal(paramName, newValue);
+		}
+	}
+
+	public void setVarName(Expression varName) {
+		this.varName = varName;
+	}
+
+	public void setVarValue(Expression varValue) {
+		this.varValue = varValue;
+	}
+
+}

+ 49 - 0
gkaqv2/trunk/modules/frame/src/main/java/com/xt/js/gkaq/frame/wf/WorkFlowParam.java

@@ -0,0 +1,49 @@
+package com.xt.js.gkaq.frame.wf;
+
+import java.util.HashMap;
+
+public class WorkFlowParam extends HashMap<String, Object> {
+    /** serialVersionUID */
+    private static final long serialVersionUID = -4709617141931848927L;
+    public static final String AUDIT_PASS = "auditPass";
+    /** 流程是否需要上级审核,一般由WorkflowManagerService读取流程属性来设置 */
+    public static final String AUDIT_SJSH = "audit_sjsh";
+    /** 上级审核判断域 */
+    public static final String AUDIT_SJSH_Field = "audit_sjsh_field";
+    /** 审核时间 */
+    public static final String AUDIT_DATE = "audit_date";
+    /** 审核意见(结束流程时通过此字段带入结束原因,可空) */
+    public static final String AUDIT_TEXT = "audit_text";
+    /** 审核结果 */
+    public static final String AUDIT_RESULT = "audit_result";
+    /** 业务对象 */
+    public static final String AUDIT_ENTITY = "audit_entity";
+    /** 审核人 */
+    public static final String AUDIT_USER = "audit_user";
+    /** 任务描述 */
+    public static final String DESCRIPTION = "description";
+    /** 是否审核步骤 */
+    public static final String IS_AUDIT = "isAudit";
+    /** 任务ID */
+    public static final String TASK_ID = "taskId";
+    /** 业务主键 */
+    public static final String BUSINESS_KEY = "businessKey";
+    /** 任务定义主键 */
+    public static final String TASK_DEFINITIONKEY = "taskDefinitionKey";
+    /** 流程编码 */
+    public static final String PROCESS_DEFINITIONKEY = "process_DefinitionKey";
+    /** 权力阳光内部编号 */
+    public static final String QLYG_INTERNAL_NO = "internalNo";
+
+    /**
+     * 返回key对应参数的字符串值
+     * @param key
+     * @return
+     */
+    public String getString(String key) {
+        if (!this.containsKey(key)) {
+            return null;
+        }
+        return String.valueOf(this.get(key));
+    }
+}

+ 191 - 0
gkaqv2/trunk/modules/frame/src/main/java/com/xt/js/gkaq/frame/wf/WorkItem.java

@@ -0,0 +1,191 @@
+package com.xt.js.gkaq.frame.wf;
+
+/**
+ * 代办任务记录
+ * 
+ * @author �晓�
+ * 
+ */
+public class WorkItem {
+	/** task任务ID */
+	private String id;
+	/** �程代� */
+	private String processKey;
+	/** �程�称 */
+	private String processName;
+	/** �程步骤代� */
+	private String definitionKey;
+	/** �程步骤�*/
+	private String definitionName;
+	/** å�‘é?人ID */
+	private String senderID;
+	/** å�‘é?人å��ç§?*/
+	private String senderName;
+	/** å�‘é?å�•ä½� */
+	private String sendDept;
+	/** 任务�述 */
+	private String description;
+	/** 创建时间 */
+	private String createTime;
+	/** 任务接收时间 */
+	private String receiveTime;
+	/** æµ�程状æ?(签收ã?处ç�†ï¼?*/
+	private String status;
+	/** �程编� */
+	private String pid;
+	/** 任务KEY */
+	private String businessKey;
+	/** �程�起�*/
+	private String applyUserName;
+	/** �程当�接收�*/
+	private String currUserName;
+	/** 接收时间 */
+	private String jssj;
+
+	public String getApplyUserName() {
+		return applyUserName;
+	}
+
+	public String getBusinessKey() {
+		return businessKey;
+	}
+
+	public String getCreateTime() {
+		return createTime;
+	}
+
+	public String getCurrUserName() {
+		return currUserName;
+	}
+
+	public String getDefinitionKey() {
+		return definitionKey;
+	}
+
+	public String getDefinitionName() {
+		return definitionName;
+	}
+
+	public String getDescription() {
+		return description;
+	}
+
+	public String getId() {
+		return id;
+	}
+
+	public String getJssj() {
+		return jssj;
+	}
+
+	public String getPid() {
+		return pid;
+	}
+
+	public String getProcessKey() {
+		return processKey;
+	}
+
+	public String getProcessName() {
+		return processName;
+	}
+
+	public String getReceiveTime() {
+		return receiveTime;
+	}
+
+	public String getSenderID() {
+		return senderID;
+	}
+
+	public String getSenderName() {
+		return senderName;
+	}
+
+	public String getStatus() {
+		return status;
+	}
+
+	public void setApplyUserName(String applyUserName) {
+		this.applyUserName = applyUserName;
+	}
+
+	public void setBusinessKey(String businessKey) {
+		this.businessKey = businessKey;
+	}
+
+	public void setCreateTime(String createTime) {
+		this.createTime = createTime;
+	}
+
+	public void setCurrUserName(String currUserName) {
+		this.currUserName = currUserName;
+	}
+
+	public void setDefinitionKey(String definitionKey) {
+		this.definitionKey = definitionKey;
+	}
+
+	public void setDefinitionName(String definitionName) {
+		this.definitionName = definitionName;
+	}
+
+	public void setDescription(String description) {
+		this.description = description;
+	}
+
+	public void setId(String id) {
+		this.id = id;
+	}
+
+	public void setJssj(String jssj) {
+		this.jssj = jssj;
+	}
+
+	public void setPid(String pid) {
+		this.pid = pid;
+	}
+
+	public void setProcessKey(String processKey) {
+		this.processKey = processKey;
+	}
+
+	public void setProcessName(String processName) {
+		this.processName = processName;
+	}
+
+	public void setReceiveTime(String receiveTime) {
+		this.receiveTime = receiveTime;
+	}
+
+	public void setSenderID(String senderID) {
+		this.senderID = senderID;
+	}
+
+	public void setSenderName(String senderName) {
+		this.senderName = senderName;
+	}
+
+	public void setStatus(String status) {
+		this.status = status;
+	}
+
+	@Override
+	public String toString() {
+		return "WorkItem [id=" + id + ", processKey=" + processKey
+				+ ", definitionKey=" + definitionKey + ", description="
+				+ description + ", createTime=" + createTime + ", receiveTime="
+				+ receiveTime + ", status=" + status + ", pid=" + pid
+				+ ", businessKey=" + businessKey + ", applyUserName="
+				+ applyUserName + ", currUserName=" + currUserName + ", jssj="
+				+ jssj + "]";
+	}
+
+	public String getSendDept() {
+		return sendDept;
+	}
+
+	public void setSendDept(String sendDept) {
+		this.sendDept = sendDept;
+	}
+}

+ 158 - 0
gkaqv2/trunk/modules/frame/src/main/java/com/xt/js/gkaq/frame/wf/WorkflowMangerService.java

@@ -0,0 +1,158 @@
+package com.xt.js.gkaq.frame.wf;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+import org.activiti.engine.task.Task;
+
+import com.xt.js.gkaq.frame.model.TaskModel;
+import com.yuanxd.tools.io.http.JsonResult;
+
+/**
+ * 工作流服务基类接口<br>
+ * 需要使用工作流的服务实现此接口,并集成WfBaseServiceImpl类
+ * 
+ * @author 袁晓冬
+ * 
+ */
+public interface WorkflowMangerService {
+    /** 日期格式化 */
+    String DATA_TIME_FMART = "yyyy-MM-dd HH:mm:ss";
+    /** 业务key分隔符 */
+    public static final String BUSKEYSEP = "-";
+    /** 任务状态-签收 */
+    public static final String STATUS_CLAIM = "claim";
+    /** 任务状态-处理 */
+    public static final String STATUS_TODO = "todo";
+    /** 任务步骤变量名 */
+    public static final String KEY_TASK_STEP = "task_step";
+    public static final String KEY_SENDER_ID = "senderID";
+    public static final String KEY_SZD_ID = "_szd";
+    public static final String KEY_SENDER_NAME = "senderNAME";
+    public static final String KEY_SEND_DEPT = "sendDEPT";
+    /** 任务执行ID */
+    public static final String KEY_EXECUTION_ID = "executionID";
+
+    /**
+     * 提交记录,发起工作流<br>
+     * 根据业务主键、流程变量列表、发起人、流程定义发起流程
+     * 
+     * @param auditForm
+     *            audit from<br>
+     *            user is required
+     * @param variables
+     *            the variables to pass, can be null.
+     * @param processDefinitionKey
+     *            key of process definition, cannot be null.
+     * @return String The unique identifier of the execution.
+     */
+    public String create(WorkFlowParam param, Map<String, Object> variables, String processDefinitionKey);
+
+    /**
+     * 自动完成流程下一步处理,一般流程发起时调用<br>
+     * 
+     * @param auditForm
+     *            工作流表单
+     * @param processInstanceId
+     *            流程ID
+     */
+    public void autoComplete(WorkFlowParam param, String processInstanceId, Map<String, Object> variables);
+
+    /**
+     * get task object by task's id
+     * 
+     * @param taskId
+     *            task id
+     * @return Task
+     */
+    public Task getTaskByTaskId(String taskId);
+
+    /**
+     * 根据用户及业务key查询当前任务
+     * 
+     * @param user
+     * @param businessKey
+     * @param processDefinitionKey
+     * @return
+     */
+    public Task getTaskByUserAndBusKey(String user, String businessKey, String processDefinitionKey);
+
+    /**
+     * 根据用户及业务key查询当前候选任务
+     * 
+     * @param user
+     * @param businessKey
+     * @param processDefinitionKey
+     * @return
+     */
+    public Task getCandidateTaskByUserAndBusKey(String user, String businessKey, String processDefinitionKey);
+
+    /**
+     * 提交下一步处理<br>
+     * 
+     */
+    public List<Task> complete(WorkFlowParam auditForm, Map<String, Object> variables, Task task);
+
+    /**
+     * 签收工作流
+     * 
+     * @param businessKey
+     *            a key that uniquely identifies the process instance in the
+     *            context or the given process definition.
+     * @param userid
+     *            authenticated user id.
+     */
+    public void claim(String taskId, String userId);
+
+    /**
+     * 待办任务查询
+     * 
+     * @param userid
+     *            authenticated user id.
+     * @return List<Map<String, Object>> 以map方式存放待办列表数据
+     */
+    public JsonResult todoList(SinglePageRequest pageRequest, String userid, String busKey, Date begin, Date end);
+
+    /**
+     * 计算该用户的待办流程数量
+     * 
+     * @param userid
+     * @param busKey
+     * @param begin
+     * @param end
+     * @return
+     */
+    public int todoListCount(String userid, String busKey, Date begin, Date end);
+
+    public List<TaskModel> doneList(String busKey, Long userid);
+
+    public List<TaskModel> doneList(Long runnerId);
+
+    /**
+     * 查询流程实例的当前任务
+     * 
+     * @param processInstanceId
+     * @return
+     */
+    public List<Task> getProcessActiveTasks(String processInstanceId);
+
+    /**
+     * 获得流程参数
+     * 
+     * @param busId
+     * @param processDefinitionKey
+     * @return
+     */
+    public Map<String, Object> getProcessInstanceVariables(String busId, String processDefinitionKey);
+
+    /**
+     * 获得流程参数
+     * 
+     * @param busId
+     * @param variableName
+     * @param processDefinitionKey
+     * @return
+     */
+    public Object getProcessInstanceVariables(String busId, String processDefinitionKey, String variableName);
+}

+ 778 - 0
gkaqv2/trunk/modules/frame/src/main/java/com/xt/js/gkaq/frame/wf/impl/WorkflowMangerServiceImpl.java

@@ -0,0 +1,778 @@
+package com.xt.js.gkaq.frame.wf.impl;
+
+import java.awt.print.Pageable;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.activiti.engine.ActivitiException;
+import org.activiti.engine.HistoryService;
+import org.activiti.engine.IdentityService;
+import org.activiti.engine.ManagementService;
+import org.activiti.engine.ProcessEngine;
+import org.activiti.engine.RepositoryService;
+import org.activiti.engine.RuntimeService;
+import org.activiti.engine.TaskService;
+import org.activiti.engine.history.HistoricProcessInstance;
+import org.activiti.engine.history.HistoricTaskInstance;
+import org.activiti.engine.history.HistoricVariableInstance;
+import org.activiti.engine.impl.Page;
+import org.activiti.engine.impl.persistence.entity.UserEntity;
+import org.activiti.engine.repository.ProcessDefinition;
+import org.activiti.engine.runtime.ProcessInstance;
+import org.activiti.engine.task.IdentityLink;
+import org.activiti.engine.task.NativeTaskQuery;
+import org.activiti.engine.task.Task;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.jdbc.support.rowset.SqlRowSet;
+import org.springframework.stereotype.Service;
+import org.springframework.util.Assert;
+import org.springframework.util.StringUtils;
+
+import com.xt.js.gkaq.common.BaseUUIDModel;
+import com.xt.js.gkaq.common.Constants;
+import com.xt.js.gkaq.common.IdGenerator;
+import com.xt.js.gkaq.common.SinglePageRequest;
+import com.xt.js.gkaq.common.UUIDGenerator;
+import com.xt.js.gkaq.frame.model.TaskModel;
+import com.xt.js.gkaq.frame.model.UserModel;
+import com.xt.js.gkaq.frame.service.TaskModelService;
+import com.xt.js.gkaq.frame.service.UserService;
+import com.xt.js.gkaq.frame.service.WFPropService;
+import com.xt.js.gkaq.frame.system.Utils;
+import com.xt.js.gkaq.frame.wf.TaskVarListener;
+import com.xt.js.gkaq.frame.wf.WorkFlowParam;
+import com.xt.js.gkaq.frame.wf.WorkItem;
+import com.xt.js.gkaq.frame.wf.WorkflowMangerService;
+import com.yuanxd.tools.io.http.JsonResult;
+import com.yuanxd.tools.utils.BizException;
+
+/**
+ * 工作流服务基类<br>
+ * 注入的服务:
+ * <li>用户服务SnpecUserService、
+ * <li>流程记录服务GzljlService、
+ * <li>
+ * 菜单服务SnpecMenuService
+ * <li>工作流服务<br>
+ * 实现的功能:
+ * <li>签收处理
+ * <li>提交处理
+ * <li>流程发起
+ * <li>读取流程定义图
+ * <li>待办任务一览查询
+ * <li>流程转发
+ * <li>流程强制结束
+ * 
+ * @author 袁晓冬
+ * 
+ */
+@Service
+public class WorkflowMangerServiceImpl implements WorkflowMangerService {
+    /** 流程定义缓存 */
+    protected static Map<String, ProcessDefinition> PROCESS_DEFINITION_CACHE = new HashMap<String, ProcessDefinition>();
+    @Autowired
+    protected IdentityService identityService;
+    @Autowired
+    protected RuntimeService runtimeService;
+    @Autowired
+    protected ManagementService managementService;
+    @Autowired
+    protected TaskService taskService;
+    @Autowired
+    protected ProcessEngine processEngine;
+    @Autowired
+    protected HistoryService historyService;
+    @Autowired
+    protected RepositoryService repositoryService;
+    @Autowired
+    protected TaskModelService taskModelService;
+    @Autowired
+    protected UserService userService;
+    @Autowired
+    protected WFPropService wfPropService;
+    /** ID主键生成器 */
+    protected IdGenerator idGenerator = new UUIDGenerator();
+
+    @Autowired
+    private JdbcTemplate jdbcTemplate;
+
+    @Override
+    public void autoComplete(WorkFlowParam param, String processInstanceId, Map<String, Object> variables) {
+        List<Task> taskList = getProcessActiveTasks(processInstanceId);
+        if (null == taskList) { return; }
+        for (Task t : taskList) {
+            Object autoComplete = taskService.getVariableLocal(t.getId(), TaskVarListener.KEY_AUTO_COMPLETE);
+            if ("true".equals(String.valueOf(autoComplete))) {
+                autoComplete(t, param, variables);
+            }
+        }
+    }
+
+    /**
+     * 自动完成任务
+     * 
+     * @param param
+     * @param task
+     */
+    public void autoComplete(Task task, WorkFlowParam param, Map<String, Object> variables) {
+        if (variables == null) variables = new HashMap<String, Object>();
+        if (null == param) {
+            param = new WorkFlowParam();
+        }
+        // 设置审核结果为通过
+        if (!variables.containsKey(WorkFlowParam.AUDIT_PASS)) variables.put(WorkFlowParam.AUDIT_PASS, true);
+        // 任务执行时间
+        variables.put(TaskVarListener.KEY_CLAIM_DATE, new Date());
+        SimpleDateFormat sdf = new SimpleDateFormat(DATA_TIME_FMART);
+        // 设置审核时间为当前时间
+        if (param.get(WorkFlowParam.AUDIT_DATE) == null) {
+            param.put(WorkFlowParam.AUDIT_DATE, sdf.format(new Date()));
+        }
+        // 设置审核意见为空
+        if (StringUtils.isEmpty(param.get(WorkFlowParam.AUDIT_TEXT))) {
+            param.put(WorkFlowParam.AUDIT_TEXT, "");
+        }
+        // 设置审核结果为通过
+        if (StringUtils.isEmpty(param.get(WorkFlowParam.AUDIT_RESULT))) {
+            param.put(WorkFlowParam.AUDIT_RESULT, "1");
+        }
+        // 设置完成人
+        if (StringUtils.isEmpty(param.get(WorkFlowParam.AUDIT_USER))) {
+            if (Utils.getCurrentUser() != null) param.put(WorkFlowParam.AUDIT_USER, Utils.getCurrentUser().getId());
+        }
+        // 完成当前任务
+        complete(param, variables, task);
+    }
+
+    /**
+     * 提交下一步处理<br>
+     * 
+     */
+    public List<Task> complete(WorkFlowParam param, Map<String, Object> variables, Task task) {
+        // initialize variables
+        if (null == variables) {
+            variables = new HashMap<String, Object>();
+        }
+        if (Utils.getCurrentUser() != null) {
+            UserModel user = Utils.getCurrentUser();
+            variables.put(KEY_SENDER_ID, user.getId().toString());
+            variables.put(KEY_SENDER_NAME, user.getRealName());
+        }
+        // set audit result
+        Object auditRes = variables.get(WorkFlowParam.AUDIT_PASS);
+        if (null != auditRes) {
+            variables.remove(WorkFlowParam.AUDIT_PASS);
+            variables.put(WorkFlowParam.AUDIT_PASS + "_" + task.getTaskDefinitionKey(), auditRes);
+        }
+        // 设置上级审核变量
+        String sjshParam = param.getString(WorkFlowParam.AUDIT_SJSH_Field);
+        if (sjshParam == null) {
+            sjshParam = WorkFlowParam.AUDIT_SJSH;
+        }
+        boolean sjsh = !wfPropService.checkProp(param.getString(WorkFlowParam.PROCESS_DEFINITIONKEY),
+                task.getTaskDefinitionKey(), sjshParam, "false");
+        variables.put(WorkFlowParam.AUDIT_SJSH, sjsh);
+        // 完成任务
+        taskService.complete(task.getId(), variables);
+        // 更新工作流记录审核信息
+        TaskModel taskInfo = updateTaskAudit(task.getId(), param);
+        taskInfo.setState(String.valueOf(BaseUUIDModel.STATE_COMPLETED));
+        taskModelService.update(taskInfo);
+        /** 保存下级任务的工作流记录 */
+        List<Task> taskList = getProcessActiveTasks(task.getProcessInstanceId());
+        if (null == taskList) { return null; }
+        // 更新权力阳光办件过程信息
+        for (Task t : taskList) {
+            // 判断task是否已存在,会签时平级的task都会检索出来,此类task不需要更新工作流记录
+            //省级用户根据所在地和
+            TaskModel theTaskInfo = taskModelService.findByTaskId(t.getId());
+            if (null != theTaskInfo) {
+                continue;
+            }
+            if (!StringUtils.isEmpty(t.getAssignee())) {
+                // 设置任务接收时间
+                Date jssj = new Date();
+                taskService.setVariableLocal(t.getId(), TaskVarListener.KEY_CLAIM_DATE, jssj);
+            }
+            // 任务描述延续存储
+            if (StringUtils.isEmpty(param.get(WorkFlowParam.DESCRIPTION))) {
+                t.setDescription(task.getDescription());
+            }
+            else {
+                t.setDescription(param.get(WorkFlowParam.DESCRIPTION).toString());
+            }
+            taskService.saveTask(t);
+            TaskModel subTask = getTaskInfoFromTask(t);
+            subTask.setStartTime(taskInfo.getStartTime());
+            subTask.setStartUser(taskInfo.getStartUser());
+            taskModelService.save(subTask);
+        }
+        return taskList;
+    }
+
+    public Long generateEntityId(String seqName) {
+        if (seqName != null) {
+            String sql = "SELECT " + seqName + ".nextval FROM dual";
+            try {
+                SqlRowSet rs = jdbcTemplate.queryForRowSet(sql);
+                if (rs.next()) {
+                    String seq = rs.getString(1);
+                    if (null != seq && seq.length() > 0) { return Long.parseLong(seq); }
+                }
+            }
+            catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+        return 0l;
+    }
+
+    /**
+     * 生成唯一编号,供权力阳光使用
+     * 
+     * 部门编码(10位)+0000000001(流水号10位)
+     * 
+     * @param seqName
+     * @return
+     */
+    public String generateQlygNo(String dept_code, Long entityId) {
+        StringBuffer no = new StringBuffer();
+        // if (null != seqName) {
+        no.append(dept_code);
+        String seq = entityId.toString();
+        if (null != seq && seq.length() > 0) {
+            if (seq.length() < 10) {
+                for (int i = seq.length(); i < 10; i++) {
+                    no.append("0");
+                }
+                no.append(seq);
+            }
+            else {
+                no.append(seq.substring(seq.length() - 10, seq.length()));
+            }
+        }
+        return no.toString();
+    }
+
+    @Override
+    public String create(WorkFlowParam param, Map<String, Object> variables, String processDefinitionKey) {
+        // 流程定义key存在判断
+        Assert.hasLength(processDefinitionKey);
+        // 设置流程启动人
+        identityService.setAuthenticatedUserId(param.get(WorkFlowParam.AUDIT_USER).toString());
+        ProcessInstance processInstance = null;
+        String businessKey = param.get(WorkFlowParam.BUSINESS_KEY).toString();
+        if (!StringUtils.hasLength(businessKey)) {
+            businessKey = System.currentTimeMillis() + "";
+        }
+        else {
+            businessKey = processDefinitionKey + BUSKEYSEP + businessKey;
+        }
+        // 判断业务key是否已存在
+        List<ProcessInstance> processList_0 = runtimeService.createProcessInstanceQuery()
+                .processInstanceBusinessKey(businessKey, processDefinitionKey).list();
+        if (null != processList_0 && processList_0
+                .size() > 0) { throw new BizException("record had already started process!" + processList_0); }
+        if (Utils.getCurrentUser() != null) {
+            UserModel user = Utils.getCurrentUser();
+            variables.put(WorkflowMangerServiceImpl.KEY_SENDER_ID, user.getId().toString());
+            variables.put(WorkflowMangerServiceImpl.KEY_SENDER_NAME, user.getRealName());
+        }
+        // 启动流程
+        processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey, businessKey, variables);
+        // 查询当前任务
+        List<Task> taskList = getProcessActiveTasks(processInstance.getId());
+        if (null != taskList) {
+            for (Task t : taskList) {
+                // 设置任务名称(任务描述)
+                t.setDescription(param.getString(WorkFlowParam.DESCRIPTION));
+                taskService.saveTask(t);
+                // 保存工作流记录
+                taskModelService.add(getTaskInfoFromTask(t));
+                // 更新权力阳光办件过程信息 TODO
+            }
+        }
+        return processInstance.getId();
+    }
+
+    public List<Task> getProcessActiveTasks(String processInstanceId) {
+        return taskService.createTaskQuery().processInstanceId(processInstanceId).active().orderByTaskCreateTime().asc()
+                .list();
+    }
+
+    public Map<String, Object> getProcessInstanceVariables(String busId, String processDefinitionKey) {
+        Map<String, Object> variables = new HashMap<String, Object>();
+        String businessKey = processDefinitionKey + BUSKEYSEP + busId;
+        HistoricProcessInstance pi = historyService.createHistoricProcessInstanceQuery()
+                .processDefinitionKey(processDefinitionKey).processInstanceBusinessKey(businessKey).singleResult();
+        if (pi != null) {
+            List<HistoricVariableInstance> hisVariables = historyService.createHistoricVariableInstanceQuery()
+                    .processInstanceId(pi.getId()).list();
+            if (hisVariables != null && hisVariables.size() > 0) {
+                for (HistoricVariableInstance ins : hisVariables) {
+                    variables.put(ins.getVariableName(), ins.getValue());
+                }
+            }
+        }
+        return variables;
+    }
+
+    @Override
+    public Object getProcessInstanceVariables(String busId, String processDefinitionKey, String variableName) {
+        String businessKey = processDefinitionKey + BUSKEYSEP + busId;
+        HistoricProcessInstance pi = historyService.createHistoricProcessInstanceQuery()
+                .processDefinitionKey(processDefinitionKey).processInstanceBusinessKey(businessKey).singleResult();
+        if (pi != null) {
+            HistoricVariableInstance ins = historyService.createHistoricVariableInstanceQuery()
+                    .processInstanceId(pi.getId()).variableName(variableName).singleResult();
+            if (ins != null) return ins.getValue();
+        }
+        return null;
+    }
+
+    /**
+     * 获取真实业务KEY<br>
+     * 流程中的业务key有流程前缀
+     * 
+     * @param processInstance
+     * @return
+     */
+    public String getRealBusinessKey(ProcessInstance processInstance) {
+        String prefix = repositoryService.createProcessDefinitionQuery()
+                .processDefinitionId(processInstance.getProcessDefinitionId()).singleResult().getKey() + BUSKEYSEP;
+        String businessKey = processInstance.getBusinessKey();
+        if (StringUtils.isEmpty(businessKey) || !businessKey.startsWith(prefix)) { return null; }
+        return businessKey.substring(prefix.length());
+    }
+
+    /**
+     * 获取真实业务KEY<br>
+     * 流程中的业务key有流程前缀
+     * 
+     * @param processInstance
+     * @return
+     */
+    public String getRealBusinessKey(HistoricProcessInstance processInstance) {
+        String prefix = repositoryService.createProcessDefinitionQuery()
+                .processDefinitionId(processInstance.getProcessDefinitionId()).singleResult().getKey() + BUSKEYSEP;
+        String businessKey = processInstance.getBusinessKey();
+        if (StringUtils.isEmpty(businessKey) || !businessKey.startsWith(prefix)) { return null; }
+        return businessKey.substring(prefix.length());
+    }
+
+    /**
+     * 根据工作流任务保存工作流记录
+     * 
+     * @param task
+     */
+    private TaskModel getTaskInfoFromTask(Task task) {
+        // 判断task是否已有工作流记录
+        if (null == task) return null;
+        TaskModel taskInfo = taskModelService.findById(task.getId());
+        if (null == taskInfo) {
+            // 工作流记录
+            taskInfo = new TaskModel();
+        }
+        taskInfo.setTaskKey(task.getTaskDefinitionKey());
+        // 设置任务ID
+        taskInfo.setTaskId(task.getId());
+        // 设置business Id
+        ProcessInstance processInstance = runtimeService.createProcessInstanceQuery()
+                .processInstanceId(task.getProcessInstanceId()).singleResult();
+        taskInfo.setBusKey(repositoryService.createProcessDefinitionQuery()
+                .processDefinitionId(processInstance.getProcessDefinitionId()).singleResult().getKey());
+        taskInfo.setBusId(getRealBusinessKey(processInstance));
+        // 步骤
+        taskInfo.setStep(String.valueOf(getNextStep(task.getId())));
+        // 工作流状态
+        taskInfo.setState(String.valueOf(BaseUUIDModel.STATE_COMPLETED));
+        // 当前任务名称
+        taskInfo.setCurrName(task.getName());
+        // 创建时间
+        taskInfo.setStartTime(task.getCreateTime());
+        // 创建人
+        UserModel createUser = userService.findById(historyService.createHistoricProcessInstanceQuery()
+                .processInstanceId(processInstance.getId()).singleResult().getStartUserId());
+        taskInfo.setStartUser(historyService.createHistoricProcessInstanceQuery()
+                .processInstanceId(processInstance.getId()).singleResult().getStartUserId());
+        // 设置执行人
+        String runner = task.getAssignee();
+        if (!StringUtils.isEmpty(runner)) {
+            taskInfo.setRunner(runner);
+            taskInfo.setRunTime((Date) taskService.getVariableLocal(task.getId(), TaskVarListener.KEY_CLAIM_DATE));
+        }
+        else {
+            // 执行者为空时设置任务执行角色
+            List<IdentityLink> identityLinks = taskService.getIdentityLinksForTask(task.getId());
+            if (null != identityLinks && identityLinks.size() > 0) {
+                IdentityLink identityLink = identityLinks.get(0);
+                taskInfo.setRoleCode(identityLink.getGroupId());
+            }
+        }
+        return taskInfo;
+    }
+
+    /**
+     * 更新工作流记录的审核信息
+     * 
+     * @param taskId
+     * @param param
+     * @return
+     */
+    private TaskModel updateTaskAudit(String taskId, WorkFlowParam param) {
+        TaskModel taskInfo = taskModelService.findById(taskId);
+        SimpleDateFormat sdf = new SimpleDateFormat(DATA_TIME_FMART);
+        // 审核模式设置审核时间、意见、结果
+        if (!"false".equals(param.get(WorkFlowParam.IS_AUDIT))) {
+            try {
+                // 设置审核时间
+                taskInfo.setAuditTime(sdf.parse(param.getString(WorkFlowParam.AUDIT_DATE)));
+            }
+            catch (ParseException e) {
+                taskInfo.setAuditTime((Date) param.get(WorkFlowParam.AUDIT_DATE));
+            }
+            // 设置审批意见
+            taskInfo.setAuditMsg(param.getString(WorkFlowParam.AUDIT_TEXT));
+            // 设置审批结果
+            taskInfo.setAuditResult(param.getString(WorkFlowParam.AUDIT_RESULT));
+            String auditUser = param.getString(WorkFlowParam.AUDIT_USER);
+            if (StringUtils.isEmpty(auditUser) && Utils.getCurrentUser() != null) {
+                auditUser = Utils.getCurrentUser().getId().toString();
+            }
+            // 设置审批结果
+            taskInfo.setAuditUser(auditUser);
+            if (StringUtils.hasLength(auditUser)) {
+                UserModel user = userService.findById(auditUser);
+                taskInfo.setAuditUsername(user.getRealName());
+            }
+        }
+        else {
+            // 非审核时当前提交时间做为任务执行时间
+            String auditUser = param.getString(WorkFlowParam.AUDIT_USER);
+            if (StringUtils.isEmpty(auditUser) && Utils.getCurrentUser() != null) {
+                auditUser = Utils.getCurrentUser().getId().toString();
+            }
+            // 设置审批结果
+            taskInfo.setAuditUser(auditUser);
+            if (StringUtils.hasLength(auditUser)) {
+                UserModel user = userService.findById(auditUser);
+                taskInfo.setAuditUsername(user.getRealName());
+            }
+            taskInfo.setAuditTime(new Date());
+        }
+        taskModelService.update(taskInfo);
+        return taskInfo;
+    }
+
+    /**
+     * 获取任务的下一步步骤数
+     * 
+     * @param taskId
+     * @return
+     */
+    private int getNextStep(String taskId) {
+        int currBz = 1;
+        Object obj = taskService.getVariable(taskId, KEY_TASK_STEP);
+        if (null != obj) {
+            if (obj instanceof Integer) {
+                currBz = (Integer) obj;
+                currBz++;
+            }
+        }
+        taskService.setVariable(taskId, KEY_TASK_STEP, currBz);
+        return currBz;
+    }
+
+    @Override
+    public Task getTaskByTaskId(String taskId) {
+        return taskService.createTaskQuery().taskId(taskId).singleResult();
+    }
+
+    /**
+     * 根据用户及业务key查询当前任务
+     * 
+     * @param user
+     * @param businessKey
+     * @param processDefinitionKey
+     * @return
+     */
+    public Task getTaskByUserAndBusKey(String user, String businessKey, String processDefinitionKey) {
+        Task task = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).taskAssignee(user).active()
+                .orderByTaskPriority().processInstanceBusinessKey(processDefinitionKey + BUSKEYSEP + businessKey).desc()
+                .orderByTaskCreateTime().desc().singleResult();
+        return task;
+    }
+
+    /**
+     * 根据用户及业务key查询当前候选任务
+     * 
+     * @param user
+     * @param businessKey
+     * @param processDefinitionKey
+     * @return
+     */
+    public Task getCandidateTaskByUserAndBusKey(String user, String businessKey, String processDefinitionKey) {
+        Task task = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).taskCandidateUser(user)
+                .active().orderByTaskPriority()
+                .processInstanceBusinessKey(processDefinitionKey + BUSKEYSEP + businessKey).desc()
+                .orderByTaskCreateTime().desc().singleResult();
+        return task;
+    }
+
+    /**
+     * 签收处理<br>
+     * {@inheritDoc}
+     */
+    @Override
+    public void claim(String taskId, String userId) {
+        if (!StringUtils.hasLength(userId)) { throw new ActivitiException("user.is.null"); }
+        Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
+        if (StringUtils.hasLength(task.getAssignee())) { throw new ActivitiException("task.already.claimed"); }
+        Date jssj = new Date();
+        taskService.setVariableLocal(taskId, TaskVarListener.KEY_CLAIM_DATE, jssj);
+        taskService.claim(taskId, userId);
+        // 工作流记录设置
+        TaskModel taskInfo = taskModelService.findByTaskId(taskId);
+        if (null == taskInfo) return;
+        taskInfo.setRunner(userId);
+        taskInfo.setRunTime(jssj);
+        taskModelService.save(taskInfo);
+    }
+
+    public int todoListCount(String userid, String busKey, Date begin, Date end) {
+        // 时间格式化
+        StringBuilder sqlBuffer = new StringBuilder();
+        ManagementService ms = processEngine.getManagementService();
+        sqlBuffer.append(ms.getTableName(Task.class));
+        sqlBuffer.append(" T WHERE T .SUSPENSION_STATE_ = 1  ");
+        String workFlowCode = "";
+        if (!StringUtils.isEmpty(busKey)) {
+            if (!StringUtils.isEmpty(busKey)) {
+                if (StringUtils.isEmpty(workFlowCode) || workFlowCode.indexOf("'" + busKey + "'") >= 0)
+                    workFlowCode = "'" + busKey + "'";
+                else workFlowCode = "NULL";
+            }
+            sqlBuffer.append(" AND EXISTS(SELECT 1 FROM ");
+            sqlBuffer.append(ms.getTableName(ProcessDefinition.class));
+            sqlBuffer.append(" P WHERE P.ID_=T.PROC_DEF_ID_ AND P.KEY_ IN (");
+            sqlBuffer.append(workFlowCode);
+            sqlBuffer.append(")) ");
+        }
+        if (begin != null) sqlBuffer.append(" AND T.CREATE_TIME_ >= #{begin} ");
+        if (end != null) sqlBuffer.append(" AND T.CREATE_TIME_ < #{end} ");
+        sqlBuffer.append(" AND (T.ASSIGNEE_ = #{userId} ");
+        sqlBuffer.append("OR (T.ASSIGNEE_ IS NULL AND EXISTS (SELECT 1 FROM ACT_RU_IDENTITYLINK ");
+        sqlBuffer.append(" I WHERE I.TYPE_ = 'candidate' AND I.TASK_ID_ = T .ID_ ");
+        sqlBuffer.append("AND (I.USER_ID_ = #{userId} OR I.GROUP_ID_ IN ");
+        sqlBuffer.append("(SELECT r.ROLE_TYPE FROM T_YJPT_ROLE_USER ru,T_YJPT_ROLE r ");
+        sqlBuffer.append("WHERE r.ID=ru.ROLEID AND ru.USERID =#{userId} ))");
+        sqlBuffer.append(
+                " AND (NOT EXISTS (SELECT 1 FROM ACT_RU_VARIABLE V WHERE V.PROC_INST_ID_=T.PROC_INST_ID_ AND NAME_=#{var} ) ");
+        sqlBuffer.append(
+                " OR EXISTS (SELECT 1 FROM ACT_RU_VARIABLE V WHERE V.PROC_INST_ID_=T.PROC_INST_ID_ AND NAME_=#{var} )) ");
+        sqlBuffer.append(")))");
+        TaskService taskService = processEngine.getTaskService();
+        NativeTaskQuery query = taskService.createNativeTaskQuery()
+                .sql("SELECT COUNT(DISTINCT T.id_) FROM " + sqlBuffer.toString() + "ORDER BY T .CREATE_TIME_ DESC")
+                .parameter("userId", Utils.getCurrentUser().getId()).parameter("var", KEY_SZD_ID);
+        if (begin != null) query.parameter("begin", Utils.getDateFirstTime(begin));
+        if (end != null) query.parameter("end", Utils.getDateLastTime(end));
+        long count = query.count();
+        return (int) count;
+    }
+
+    /**
+     * 待办任务一览查询 {@inheritDoc}
+     */
+    // @Override
+    public JsonResult todoList(SinglePageRequest pageRequest, String userid, String busKey, Date begin, Date end) {
+        // 结果集
+        List<WorkItem> result = new ArrayList<WorkItem>();
+        // 时间格式化
+        SimpleDateFormat sdf = new SimpleDateFormat(DATA_TIME_FMART);
+        StringBuilder sqlBuffer = new StringBuilder();
+        ManagementService ms = processEngine.getManagementService();
+        sqlBuffer.append(ms.getTableName(Task.class));
+        sqlBuffer.append(" T WHERE T .SUSPENSION_STATE_ = 1  ");
+        String workFlowCode = "";
+        if (!StringUtils.isEmpty(busKey)) {
+            if (!StringUtils.isEmpty(busKey)) {
+                if (StringUtils.isEmpty(workFlowCode) || workFlowCode.indexOf("'" + busKey + "'") >= 0)
+                    workFlowCode = "'" + busKey + "'";
+                else workFlowCode = "NULL";
+            }
+            sqlBuffer.append(" AND EXISTS(SELECT 1 FROM ");
+            sqlBuffer.append(ms.getTableName(ProcessDefinition.class));
+            sqlBuffer.append(" P WHERE P.ID_=T.PROC_DEF_ID_ AND P.KEY_ IN (");
+            sqlBuffer.append(workFlowCode);
+            sqlBuffer.append(")) ");
+        }
+        if (begin != null) sqlBuffer.append(" AND T.CREATE_TIME_ >= #{begin} ");
+        if (end != null) sqlBuffer.append(" AND T.CREATE_TIME_ <= #{end} ");
+        sqlBuffer.append(" AND (T.ASSIGNEE_ = #{userId} ");
+        sqlBuffer.append("OR (T.ASSIGNEE_ IS NULL AND EXISTS (SELECT 1 FROM ACT_RU_IDENTITYLINK ");
+        sqlBuffer.append(" I WHERE I.TYPE_ = 'candidate' AND I.TASK_ID_ = T .ID_ ");
+        sqlBuffer.append("AND (I.USER_ID_ = #{userId} OR I.GROUP_ID_ IN ");
+        sqlBuffer.append("(SELECT r.ROLE_TYPE FROM T_YJPT_ROLE_USER ru,T_YJPT_ROLE r ");
+        sqlBuffer.append("WHERE r.ID=ru.ROLEID AND ru.USERID =#{userId} ))");
+        sqlBuffer.append(
+                " AND (NOT EXISTS (SELECT 1 FROM ACT_RU_VARIABLE V WHERE V.PROC_INST_ID_=T.PROC_INST_ID_ AND NAME_=#{var} ) ");
+        sqlBuffer.append(
+                " OR EXISTS (SELECT 1 FROM ACT_RU_VARIABLE V WHERE V.PROC_INST_ID_=T.PROC_INST_ID_ AND NAME_=#{var} )) ");
+        sqlBuffer.append(")))");
+        TaskService taskService = processEngine.getTaskService();
+        int start = pageRequest.getPage() * pageRequest.getSize();
+        NativeTaskQuery query = taskService.createNativeTaskQuery()
+                .sql("SELECT DISTINCT T.* FROM " + sqlBuffer.toString() + "ORDER BY T .CREATE_TIME_ DESC")
+                .parameter("userId", Utils.getCurrentUser().getId()).parameter("var", KEY_SZD_ID);
+        if (begin != null) query.parameter("begin", Utils.getDateFirstTime(begin));
+        if (end != null) query.parameter("end", Utils.getDateLastTime(end));
+        List<Task> todoList = query.listPage(start, pageRequest.getSize());
+        query = taskService.createNativeTaskQuery().sql("SELECT count(DISTINCT T.id_) FROM " + sqlBuffer.toString())
+                .parameter("userId", Utils.getCurrentUser().getId()).parameter("var", KEY_SZD_ID);
+        if (begin != null) query.parameter("begin", Utils.getDateFirstTime(begin));
+        if (end != null) query.parameter("end", Utils.getDateLastTime(end));
+        long count = query.count();
+        for (Task task : todoList) {
+            String processDefinitionId = task.getProcessDefinitionId();
+            ProcessDefinition processDefinition = getProcessDefinition(processDefinitionId);
+            ProcessInstance processInstance = runtimeService.createProcessInstanceQuery()
+                    .processInstanceId(task.getProcessInstanceId()).active().singleResult();
+            WorkItem singleTask = packageTaskInfo(sdf, task, processDefinition, processInstance);
+            singleTask.setStatus(STATUS_TODO);
+            result.add(singleTask);
+        }
+        JsonResult bc = new JsonResult();
+        bc.setAttr("todo", result);
+        bc.setAttr("totalCount", count);
+        return bc;
+    }
+
+    /**
+     * 待办中显示数据处理
+     * 
+     * @param sdf
+     *            SimpleDateFormat
+     * @param task
+     *            Task
+     * @param processDefinition
+     *            ProcessDefinition
+     * @return TaskForm
+     */
+    private WorkItem packageTaskInfo(SimpleDateFormat sdf, Task task, ProcessDefinition processDefinition,
+            ProcessInstance processInstance) {
+        WorkItem form = new WorkItem();
+        // 任务ID
+        form.setId(task.getId());
+        // 任务编码
+        form.setDefinitionKey(task.getTaskDefinitionKey());
+        form.setDefinitionName(task.getName());
+        // 任务创建时间
+        form.setCreateTime(sdf.format(task.getCreateTime()));
+        // 流程定义名称
+        form.setProcessKey(processDefinition.getKey());
+        form.setProcessName(processDefinition.getName());
+        form.setPid(task.getProcessInstanceId());
+        form.setBusinessKey(getRealBusinessKey(processInstance));
+        // 接收时间
+        Date jssj = (Date) taskService.getVariableLocal(task.getId(), TaskVarListener.KEY_CLAIM_DATE);
+        if (null != jssj) form.setJssj(sdf.format(jssj));
+        // 设置任务描述
+        form.setDescription(task.getDescription());
+        String applyUserId = String.valueOf(taskService.getVariable(task.getId(), "applyUserId"));
+        form.setApplyUserName(applyUserId);
+        String senderID = taskService.getVariable(task.getId(), KEY_SENDER_ID) != null
+                ? String.valueOf(taskService.getVariable(task.getId(), KEY_SENDER_ID)) : "";
+        String senderName = taskService.getVariable(task.getId(), KEY_SENDER_NAME) != null
+                ? String.valueOf(taskService.getVariable(task.getId(), KEY_SENDER_NAME)) : "";
+        String sendDept = taskService.getVariable(task.getId(), KEY_SEND_DEPT) != null
+                ? String.valueOf(taskService.getVariable(task.getId(), KEY_SEND_DEPT)) : "";
+        form.setSenderID(senderID);
+        form.setSenderName(senderName);
+        form.setSendDept(sendDept);
+        return form;
+    }
+
+    /**
+     * 已办中显示数据处理
+     * 
+     * @param sdf
+     *            SimpleDateFormat
+     * @param task
+     *            Task
+     * @param processDefinition
+     *            ProcessDefinition
+     * @return TaskForm
+     */
+    private WorkItem packageTaskInfo(SimpleDateFormat sdf, HistoricTaskInstance task,
+            ProcessDefinition processDefinition, HistoricProcessInstance processInstance, TaskModel taskinfo) {
+        WorkItem form = new WorkItem();
+        // 任务ID
+        form.setId(task.getId());
+        // 任务编码
+        form.setDefinitionKey(task.getTaskDefinitionKey());
+        form.setDefinitionName(task.getName());
+        // 任务创建时间
+        form.setCreateTime(sdf.format(task.getStartTime()));
+        // 流程定义名称
+        form.setProcessKey(processDefinition.getKey());
+        form.setProcessName(processDefinition.getName());
+        form.setPid(task.getProcessInstanceId());
+        form.setBusinessKey(getRealBusinessKey(processInstance));
+        // 接收时间
+        Date jssj = task.getClaimTime();
+        if (null != jssj) form.setJssj(sdf.format(jssj));
+        // 设置任务描述
+        form.setDescription(task.getDescription());
+        String applyUserId = taskinfo.getStartUser();
+        form.setApplyUserName(applyUserId);
+        UserModel senderUser = userService.findById(taskinfo.getStartUser());
+        String senderID = senderUser.getId().toString();
+        String senderName = senderUser.getRealName();
+        String sendDept = "";
+        form.setSenderID(senderID == null ? "" : senderID);
+        form.setSenderName(senderName == null ? "" : senderName);
+        form.setSendDept(sendDept == null ? "" : sendDept);
+        return form;
+    }
+
+    /**
+     * 根据流程定义KEY查询流程定义
+     * 
+     * @param processDefinitionId
+     *            流程定义KEY
+     * @return ProcessDefinition
+     */
+    private ProcessDefinition getProcessDefinition(String processDefinitionId) {
+        ProcessDefinition processDefinition = PROCESS_DEFINITION_CACHE.get(processDefinitionId);
+        if (processDefinition == null) {
+            // 缓存中不存在时执行查询
+            processDefinition = repositoryService.createProcessDefinitionQuery()
+                    .processDefinitionId(processDefinitionId).singleResult();
+            PROCESS_DEFINITION_CACHE.put(processDefinitionId, processDefinition);
+        }
+        return processDefinition;
+    }
+
+    @Override
+    public JsonResult todoList(com.xt.js.gkaq.frame.wf.SinglePageRequest pageRequest, String userid, String busKey,
+            Date begin, Date end) {
+        throw new IllegalArgumentException("method not supported!");
+    }
+
+    @Override
+    public List<TaskModel> doneList(String busKey, Long userid) {
+        throw new IllegalArgumentException("method not supported!");
+    }
+
+    @Override
+    public List<TaskModel> doneList(Long runnerId) {
+        throw new IllegalArgumentException("method not supported!");
+    }
+}