Commit ef3b44a9 by shiwenbo

更新inz.workflow工程

parent 022c6231
......@@ -14,8 +14,9 @@ dependencies {
compile lib.json
compile lib.bcp_type_support_json
compile lib.bcp_participant
compile lib.hibernate_common_annotations
compile "com.beecode:bap2.staff:${aminoVersion}"
compile "com.beecode:bap2.bill:${aminoVersion}"
compile "com.beecode:bap2.bill.workflow:${aminoVersion}"
compile "com.beecode:bap2.userprofile:${bap2Version}"
compile "com.beecode:bap2.workflow:${aminoVersion}"
compile "com.beecode:bap2.system:${aminoVersion}"
......
......@@ -16,11 +16,14 @@ import com.beecode.inz.workflow.internal.scene.ProcessedTask;
import com.beecode.inz.workflow.internal.scene.ToDoTask;
import com.beecode.inz.workflow.internal.scene.UnderwayProcess;
import com.beecode.inz.workflow.internal.scene.workflowdefinition.DiscardScene;
import com.beecode.inz.workflow.listener.CommonWorkflowBillProcessEventListener;
import com.beecode.inz.workflow.listener.TaskEventListenerImpl;
import com.beecode.inz.workflow.participant.CommomParticipantStrategy;
import com.beecode.inz.workflow.participant.DepartmentPicByLevelParticipantStrategy;
import com.beecode.inz.workflow.participant.FollowerMemberPicParticipantStrategy;
import com.beecode.inz.workflow.participant.SubmitDeptPathAppointRoleParticipantStrategy;
import com.beecode.inz.workflow.participant.SubmitOrgPathAppointRoleParticipantStrategy;
import com.beecode.inz.workflow.participant.SubmiterSubsidiaryRoleParticipantStrategy;
import com.beecode.inz.workflow.query.InzApprovalTaskQueryDataProcessor;
import com.beecode.inz.workflow.query.InzBizProcessQueryDataProcessor;
import com.beecode.inz.workflow.query.InzWorkflowDefinitionQueryDataProcessor;
......@@ -113,6 +116,14 @@ public class BeanConfiguration {
public SubmitDeptPathAppointRoleParticipantStrategy createSubmitDeptPathAppointRoleParticipantStrategy(){
return new SubmitDeptPathAppointRoleParticipantStrategy();
}
@Bean("com.beecode.inz.workflow.participant.SubmiterSubsidiaryRoleParticipantStrategy")
public SubmiterSubsidiaryRoleParticipantStrategy createSubmiterSubsidiaryRoleParticipantStrategy(){
return new SubmiterSubsidiaryRoleParticipantStrategy();
}
@Bean("com.beecode.inz.workflow.participant.SubmitOrgPathAppointRoleParticipantStrategy")
public SubmitOrgPathAppointRoleParticipantStrategy createSubmitOrgPathAppointRoleParticipantStrategy(){
return new SubmitOrgPathAppointRoleParticipantStrategy();
}
@Bean("com.beecode.inz.workflow.participant.FollowerMemberPicParticipantStrategy")
public FollowerMemberPicParticipantStrategy createFollowerMemberPic(){
......@@ -124,4 +135,9 @@ public class BeanConfiguration {
return new DiscardScene();
}
@Bean("com.beecode.inz.workflow.listener.CommonWorkflowBillProcessEventListener")
public CommonWorkflowBillProcessEventListener commonWorkflowBillProcessEventListener() {
return new CommonWorkflowBillProcessEventListener();
}
}
package com.beecode.inz.workflow.dao;
import java.util.UUID;
import com.beecode.inz.workflow.entity.ApprovalCopyEntity;
public interface ApprovalCopyDao {
void addApprovalCopy(ApprovalCopyEntity approvalCopyEntity);
ApprovalCopyEntity getApprovalCopyByprocessInstanceId(UUID processInstanceId);
}
package com.beecode.inz.workflow.dao;
import java.util.UUID;
import com.beecode.inz.workflow.entity.SubmitApprovalSuggestionEntity;
public interface SubmitApprovalSuggestionDao {
void addSubmitApprovalSuggestionEntity(SubmitApprovalSuggestionEntity submitApprovalSuggestionEntity);
SubmitApprovalSuggestionEntity getSubmitApprovalSuggestionByprocessInstanceId(UUID processInstanceId);
}
package com.beecode.inz.workflow.dao;
import java.util.List;
import java.util.UUID;
import com.beecode.inz.workflow.entity.TranspondApprovalStaffEntity;
public interface TranspondApprovalStaffDao {
void addTranspondApprovalStaffEntity(TranspondApprovalStaffEntity transpondApprovalStaffEntity);
List<TranspondApprovalStaffEntity> getTranspondApprovalStaffByprocessInstanceId(UUID processInstanceId);
}
package com.beecode.inz.workflow.dao;
import java.util.List;
import java.util.UUID;
import com.beecode.inz.workflow.entity.TranspondApprovalSuggestionEntity;
public interface TranspondApprovalSuggestionDao {
void addTranspondApprovalSuggestionEntity(TranspondApprovalSuggestionEntity transpondApprovalSuggestionEntity);
List<TranspondApprovalSuggestionEntity> getTranspondApprovalSuggestionByprocessInstanceId(UUID processInstanceId);
}
package com.beecode.inz.workflow.entity;
import java.util.UUID;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import org.hibernate.annotations.GenericGenerator;
@Entity
@Table(name = "kids_approval_copy")
public class ApprovalCopyEntity {
@Id
@GenericGenerator(name = "system-uuid", strategy = "uuid2")
@GeneratedValue(generator = "system-uuid")
@Column(name = "id", nullable = false,length = 16)
private UUID id;
@Column(name = "process_instance_id",nullable = false,length = 16)
private UUID processInstanceId;
@Column(name = "staff_json", nullable = false,length = 1024)
private String staffJson;
public UUID getId() {
return id;
}
public void setId(UUID id) {
this.id = id;
}
public UUID getProcessInstanceId() {
return processInstanceId;
}
public void setProcessInstanceId(UUID processInstanceId) {
this.processInstanceId = processInstanceId;
}
public String getStaffJson() {
return staffJson;
}
public void setStaffJson(String staffJson) {
this.staffJson = staffJson;
}
}
......@@ -11,6 +11,7 @@ public class ApprovedRecord extends ApprovalRecord{
private UserAssignment approvalUser;
private Date finishTime;
private String suggestions;
private String attribute1;
public String getApprovalAction() {
return approvalAction;
......@@ -36,7 +37,10 @@ public class ApprovedRecord extends ApprovalRecord{
public void setFinishTime(Date finishTime) {
this.finishTime = finishTime;
}
public String getAttribute1() {
return attribute1;
}
public void setAttribute1(String attribute1) {
this.attribute1 = attribute1;
}
}
......@@ -6,9 +6,12 @@ import com.beecode.bcp.type.KObject;
public class InzApprovalTask extends CommonTask {
public static final String ATTR_BIZOBJECTNAME = "bizObjectName";
public static final String ATTR_ATTRIBUTE1 = "attribute1";
private String bizObjectName;
private String attribute1;
private InzBizProcess bizProcess;
private boolean canApprove = false;
......@@ -28,6 +31,7 @@ public class InzApprovalTask extends CommonTask {
super(kObject);
this.bizProcess = new InzBizProcess(kObject.get(ATTR_BIZPROCESS));
this.bizObjectName = kObject.getString(ATTR_BIZOBJECTNAME);
this.attribute1 = kObject.getString(ATTR_ATTRIBUTE1);
if (null != kObject.get(PARENT) && !kObject.get(PARENT).isNull()) {
this.parent = new InzApprovalTask(kObject.get(PARENT));
}
......@@ -41,6 +45,10 @@ public class InzApprovalTask extends CommonTask {
return bizObjectName;
}
public String getAttribute1() {
return attribute1;
}
public InzBizProcess getBizProcess() {
return bizProcess;
}
......
......@@ -20,12 +20,15 @@ public class InzBizProcess extends BizProcess{
TriggerAction action = config.getTriggerCondition().findTriggerActionByName(kObject.getString(ATTR_TRIGGERACTION));
this.bizObjectName = this.toKObject().getString(ATTR_BIZOBJECTNAME);
this.bizAffiliationName = this.toKObject().getString(ATTR_BIZAFFILIATIONNAME);
this.triggerActionTitle = action.getTitle();
}
public static final String ATTR_BIZOBJECTNAME = "bizObjectName";
public static final String ATTR_BIZAFFILIATIONNAME = "bizAffiliationName";
public static final String ATTR_TRIGGERACTION = "triggerAction";
private String bizTypeTitle;
private String bizObjectName;
private String bizAffiliationName;
private String triggerActionTitle;
public void setKClass(KClass kClass){
......@@ -43,6 +46,8 @@ public class InzBizProcess extends BizProcess{
public String getTriggerActionTitle() {
return triggerActionTitle;
}
public String getBizAffiliationName() {
return bizAffiliationName;
}
}
package com.beecode.inz.workflow.entity;
import java.util.UUID;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import org.hibernate.annotations.GenericGenerator;
@Entity
@Table(name = "kids_submit_approval_suggestion")
public class SubmitApprovalSuggestionEntity {
@Id
@GenericGenerator(name = "system-uuid", strategy = "uuid2")
@GeneratedValue(generator = "system-uuid")
@Column(name = "id", nullable = false,length = 16)
private UUID id;
@Column(name = "process_instance_id",nullable = false,length = 16)
private UUID processInstanceId;
@Column(name = "suggestion", nullable = false,length = 500)
private String suggestion;
public UUID getId() {
return id;
}
public void setId(UUID id) {
this.id = id;
}
public UUID getProcessInstanceId() {
return processInstanceId;
}
public void setProcessInstanceId(UUID processInstanceId) {
this.processInstanceId = processInstanceId;
}
public String getSuggestion() {
return suggestion;
}
public void setSuggestion(String suggestion) {
this.suggestion = suggestion;
}
}
package com.beecode.inz.workflow.entity;
import java.util.Date;
import java.util.UUID;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import org.hibernate.annotations.GenericGenerator;
@Entity
@Table(name = "kids_transpond_approval_staff")
public class TranspondApprovalStaffEntity {
public enum operationType{
copy,transpond;
};
@Id
@GenericGenerator(name = "system-uuid", strategy = "uuid2")
@GeneratedValue(generator = "system-uuid")
@Column(name = "id", nullable = false,length = 16)
private UUID id;
@Column(name = "process_instance_id",nullable = false,length = 16)
private UUID processInstanceId;
@Column(name = "staff_json", nullable = false,length = 500)
private String staffJson;
@Column(name = "submit_id", nullable = false,length = 16)
private UUID submitId;
@Column(name = "finish_time", nullable = false)
private Date finishTime;
@Column(name = "operation", nullable = false,length = 20)
@Enumerated(EnumType.STRING)
private operationType operation;
@Column(name = "suggestion",length = 500)
private String suggestion;
public UUID getId() {
return id;
}
public void setId(UUID id) {
this.id = id;
}
public UUID getProcessInstanceId() {
return processInstanceId;
}
public void setProcessInstanceId(UUID processInstanceId) {
this.processInstanceId = processInstanceId;
}
public String getStaffJson() {
return staffJson;
}
public void setStaffJson(String staffJson) {
this.staffJson = staffJson;
}
public UUID getSubmitId() {
return submitId;
}
public void setSubmitId(UUID submitId) {
this.submitId = submitId;
}
public Date getFinishTime() {
return finishTime;
}
public void setFinishTime(Date finishTime) {
this.finishTime = finishTime;
}
public operationType getOperation() {
return operation;
}
public void setOperation(operationType operation) {
this.operation = operation;
}
public String getSuggestion() {
return suggestion;
}
public void setSuggestion(String suggestion) {
this.suggestion = suggestion;
}
}
package com.beecode.inz.workflow.entity;
import java.util.Date;
import java.util.UUID;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import org.hibernate.annotations.GenericGenerator;
@Entity
@Table(name = "kids_transpond_approval_suggestion")
public class TranspondApprovalSuggestionEntity {
public enum operationType{
copy,transpond,receive;
};
@Id
@GenericGenerator(name = "system-uuid", strategy = "uuid2")
@GeneratedValue(generator = "system-uuid")
@Column(name = "id", nullable = false,length = 16)
private UUID id;
@Column(name = "process_instance_id",nullable = false,length = 16)
private UUID processInstanceId;
@Column(name = "suggestion",length = 500)
private String suggestion;
@Column(name = "submit_id", nullable = false,length = 16)
private UUID submitId;
@Column(name = "finish_time", nullable = false)
private Date finishTime;
@Column(name = "operation", nullable = false,length = 20)
@Enumerated(EnumType.STRING)
private operationType operation;
public UUID getId() {
return id;
}
public void setId(UUID id) {
this.id = id;
}
public UUID getProcessInstanceId() {
return processInstanceId;
}
public void setProcessInstanceId(UUID processInstanceId) {
this.processInstanceId = processInstanceId;
}
public String getSuggestion() {
return suggestion;
}
public void setSuggestion(String suggestion) {
this.suggestion = suggestion;
}
public UUID getSubmitId() {
return submitId;
}
public void setSubmitId(UUID submitId) {
this.submitId = submitId;
}
public Date getFinishTime() {
return finishTime;
}
public void setFinishTime(Date finishTime) {
this.finishTime = finishTime;
}
public operationType getOperation() {
return operation;
}
public void setOperation(operationType operation) {
this.operation = operation;
}
}
package com.beecode.inz.workflow.internal.dao;
import java.util.List;
import java.util.UUID;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate5.HibernateOperations;
import org.springframework.stereotype.Repository;
import com.beecode.inz.workflow.dao.ApprovalCopyDao;
import com.beecode.inz.workflow.entity.ApprovalCopyEntity;
@Repository
public class ApprovalCopyDaoImpl implements ApprovalCopyDao{
@Autowired
private HibernateOperations template;
@Override
public void addApprovalCopy(ApprovalCopyEntity approvalCopyEntity) {
template.save(approvalCopyEntity);
}
@Override
public ApprovalCopyEntity getApprovalCopyByprocessInstanceId(UUID processInstanceId) {
return template.execute(session->{
String hql = " from ApprovalCopyEntity ac where ac.processInstanceId = :processInstanceId";
List<ApprovalCopyEntity> result = session.createQuery(hql,ApprovalCopyEntity.class)
.setParameter("processInstanceId", processInstanceId).getResultList();
if(null == result || result.size() == 0){
return null;
}
return result.get(0);
});
}
}
package com.beecode.inz.workflow.internal.dao;
import java.util.List;
import java.util.UUID;
import org.hibernate.HibernateException;
......@@ -32,8 +33,11 @@ public class CommonDaoImpl implements CommonDao{
public KObject doInHibernate(Session session) throws HibernateException {
Query<KObject> queyr = session.createQuery(" from " +kClass + " where id=:id",KObject.class);
queyr.setParameter("id", id);
KObject obj = queyr.getSingleResult();
return obj;
List<KObject> objs = queyr.getResultList();
if(objs.size()<=0){
return null;
}
return objs.get(0);
}
});
}
......
......@@ -162,6 +162,7 @@ public class InzApprovalTaskDaoImpl implements InzApprovalTaskDao{
}
@Override
public List<InzApprovalTask> getApprovalTasksByPend(UUID actorId) {
return template.execute(new HibernateCallback<List<InzApprovalTask>>() {
......
package com.beecode.inz.workflow.internal.dao;
import java.util.List;
import java.util.UUID;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate5.HibernateOperations;
import org.springframework.stereotype.Repository;
import com.beecode.inz.workflow.dao.SubmitApprovalSuggestionDao;
import com.beecode.inz.workflow.entity.SubmitApprovalSuggestionEntity;
@Repository
public class SubmitApprovalSuggestionDaoImpl implements SubmitApprovalSuggestionDao{
@Autowired
private HibernateOperations template;
@Override
public void addSubmitApprovalSuggestionEntity(SubmitApprovalSuggestionEntity submitApprovalSuggestionEntity) {
template.save(submitApprovalSuggestionEntity);
}
@Override
public SubmitApprovalSuggestionEntity getSubmitApprovalSuggestionByprocessInstanceId(UUID processInstanceId) {
return template.execute(session->{
String hql = " from SubmitApprovalSuggestionEntity ac where ac.processInstanceId = :processInstanceId";
List<SubmitApprovalSuggestionEntity> result = session.createQuery(hql,SubmitApprovalSuggestionEntity.class)
.setParameter("processInstanceId", processInstanceId).getResultList();
if(null == result || result.size() == 0){
return null;
}
return result.get(0);
});
}
}
package com.beecode.inz.workflow.internal.dao;
import java.util.List;
import java.util.UUID;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate5.HibernateOperations;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import com.beecode.inz.workflow.dao.TranspondApprovalStaffDao;
import com.beecode.inz.workflow.entity.TranspondApprovalStaffEntity;
@Repository
public class TranspondApprovalStaffDaoImpl implements TranspondApprovalStaffDao{
@Autowired
private HibernateOperations template;
@Override
@Transactional
public void addTranspondApprovalStaffEntity(TranspondApprovalStaffEntity transpondApprovalStaffEntity) {
template.save(transpondApprovalStaffEntity);
}
@Override
public List<TranspondApprovalStaffEntity> getTranspondApprovalStaffByprocessInstanceId(UUID processInstanceId) {
return template.execute(session->{
String hql = " from TranspondApprovalStaffEntity ac where ac.processInstanceId = :processInstanceId";
List<TranspondApprovalStaffEntity> result = session.createQuery(hql,TranspondApprovalStaffEntity.class)
.setParameter("processInstanceId", processInstanceId).getResultList();
return result;
});
}
}
package com.beecode.inz.workflow.internal.dao;
import java.util.List;
import java.util.UUID;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate5.HibernateOperations;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import com.beecode.inz.workflow.dao.TranspondApprovalSuggestionDao;
import com.beecode.inz.workflow.entity.TranspondApprovalSuggestionEntity;
@Repository
public class TranspondApprovalSuggestionDaoImpl implements TranspondApprovalSuggestionDao{
@Autowired
private HibernateOperations template;
@Override
@Transactional
public void addTranspondApprovalSuggestionEntity(
TranspondApprovalSuggestionEntity transpondApprovalSuggestionEntity) {
template.save(transpondApprovalSuggestionEntity);
}
@Override
public List<TranspondApprovalSuggestionEntity> getTranspondApprovalSuggestionByprocessInstanceId(
UUID processInstanceId) {
return template.execute(session->{
String hql = " from TranspondApprovalSuggestionEntity ac where ac.processInstanceId = :processInstanceId";
List<TranspondApprovalSuggestionEntity> result = session.createQuery(hql,TranspondApprovalSuggestionEntity.class)
.setParameter("processInstanceId", processInstanceId).getResultList();
return result;
});
}
}
package com.beecode.inz.workflow.internal.listener;
import java.time.Instant;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.Assert;
import com.beecode.amino.core.Amino;
import com.beecode.bap.bill.BillConstants.BillStates;
import com.beecode.bap.bill.BillConstants.MasterAttributes;
import com.beecode.bap.bill.WorkflowBillConstants.FlowAttributes;
import com.beecode.bap.workflow.core.BizProcessState;
import com.beecode.bap.workflow.listener.BizProcessEvent;
import com.beecode.bap.workflow.listener.BizProcessEventListener;
import com.beecode.bcp.type.KClass;
......@@ -52,10 +58,25 @@ public class BizProcessEventListenerImpl implements BizProcessEventListener{
String bizTypeName = process.getBizTypeName();
WorkflowConfigurationDefinition config = bizTypeWorkflowConfigurationService.getBizTypeWorkflowConfigurationByBizTypeName(bizTypeName);
Assert.notNull(config,"param 'config' must not be null");
process.setKClass(Amino.getApplicationMetadataContext().getBean(config.getBizTypeInfo().getkClassName(), KClass.class));
KClass clz = Amino.getApplicationMetadataContext().getBean(config.getBizTypeInfo().getkClassName(), KClass.class);
process.setKClass(clz);
KObject bizDataObj = commonDao.load(config.getBizTypeInfo().getkClassName(), process.getBizDataId());
if (clz.hasAttribute(InzWorkflowBiztrait.ATTR_APPROVESTATE)) {
bizDataObj.set(InzWorkflowBiztrait.ATTR_APPROVESTATE, process.getWorkflowState());
commonDao.update(bizDataObj);
}
if (clz.hasAttribute(FlowAttributes.ATTR_FLOW_STAE)) {
bizDataObj.set(FlowAttributes.ATTR_FLOW_STAE, process.getWorkflowState());
if (process.getWorkflowState() == BizProcessState.DONE_WITH_AGREE.getValue()) {
bizDataObj.set(MasterAttributes.ATTR_BILL_STATE, BillStates.SUCCESS);
} else if (process.getWorkflowState() == BizProcessState.DONE_WITH_REJECT.getValue()) {
bizDataObj.set(MasterAttributes.ATTR_BILL_STATE, BillStates.REJECTED);
}
commonDao.update(bizDataObj);
}
if (clz.hasAttribute(FlowAttributes.ATTR_FLOW_FINISH_TIME)) {
bizDataObj.set(FlowAttributes.ATTR_FLOW_FINISH_TIME, Instant.now());
}
process.setBizDataObject(bizDataObj);
if(null == config.getProcessConfiguration()){
return;
......
package com.beecode.inz.workflow.internal.scene;
import javax.persistence.criteria.CriteriaBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import com.beecode.bap.staff.BapContext;
import com.beecode.bap.workflow.core.BizProcessState;
import com.beecode.inz.query.scene.SceneExecuteContext;
import com.beecode.inz.query.scene.SceneExecutor;
......@@ -12,19 +7,19 @@ import com.beecode.inz.workflow.entity.InzBizProcess;
public class FinishedProcess implements SceneExecutor{
@Autowired
private BapContext bapContext;
// @Autowired
// private BapContext bapContext;
@Override
public void execute(SceneExecuteContext context) {
CriteriaBuilder builder = context.getCriteriaBuilder();
// 为查询添加新条件
try {
context.getCriteriaQuery().and(builder.equal(context.getRoot().get(InzBizProcess.ATTR_SUBMITTER).get("id"), bapContext.getCurrentStaff().getUuid("id")));
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
// CriteriaBuilder builder = context.getCriteriaBuilder();
// // 为查询添加新条件
// try {
// context.getCriteriaQuery().and(builder.equal(context.getRoot().get(InzBizProcess.ATTR_SUBMITTER).get("id"), bapContext.getCurrentStaff().getUuid("id")));
// } catch (Exception e) {
// e.printStackTrace();
// throw new RuntimeException(e);
// }
context.getCriteriaQuery().and(context.getRoot().get(InzBizProcess.ATTR_WORKFLOWSTATE).in(BizProcessState.DONE_WITH_AGREE.getValue(),BizProcessState.DONE_WITH_REJECT.getValue()));
}
......
......@@ -47,8 +47,10 @@ public class ToDoTask implements SceneExecutor{
Predicate p1 = context.getCriteriaBuilder().equal(context.getRoot().get("id"), subRoot.get("task").get("id"));
UUID staffId = null;
UUID userId = null;
try {
staffId = bapContext.getCurrentStaff().getUuid("id");
userId = bapContext.getCurrentUser().getId();
} catch (AttributeNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
......@@ -62,6 +64,9 @@ public class ToDoTask implements SceneExecutor{
if(null == staffId){
throw new RuntimeException("获取当前登录职员失败");
}
if(null == userId){
throw new RuntimeException("获取当前登录用户失败");
}
Predicate p2 = context.getCriteriaBuilder().equal(subRoot.get(User.ACTOR_ID), staffId);
subQuery.where(context.getCriteriaBuilder().and(p1,p2));
......
......@@ -2,9 +2,6 @@ package com.beecode.inz.workflow.internal.scene;
import javax.persistence.criteria.CriteriaBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import com.beecode.bap.staff.BapContext;
import com.beecode.bap.workflow.core.BizProcessState;
import com.beecode.inz.query.scene.SceneExecuteContext;
import com.beecode.inz.query.scene.SceneExecutor;
......@@ -12,19 +9,19 @@ import com.beecode.inz.workflow.entity.InzBizProcess;
public class UnderwayProcess implements SceneExecutor{
@Autowired
private BapContext bapContext;
// @Autowired
// private BapContext bapContext;
@Override
public void execute(SceneExecuteContext context) {
CriteriaBuilder builder = context.getCriteriaBuilder();
// 为查询添加新条件
try {
context.getCriteriaQuery().and(builder.equal(context.getRoot().get(InzBizProcess.ATTR_SUBMITTER).get("id"), bapContext.getCurrentStaff().getUuid("id")));
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
// // 为查询添加新条件
// try {
// context.getCriteriaQuery().and(builder.equal(context.getRoot().get(InzBizProcess.ATTR_SUBMITTER).get("id"), bapContext.getCurrentStaff().getUuid("id")));
// } catch (Exception e) {
// e.printStackTrace();
// throw new RuntimeException(e);
// }
context.getCriteriaQuery().and(builder.equal(context.getRoot().get(InzBizProcess.ATTR_WORKFLOWSTATE), BizProcessState.IN_PROCESS.getValue()));
}
......
package com.beecode.inz.workflow.internal.service;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.UUID;
import org.json.JSONArray;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.beecode.bap.staff.BapContext;
import com.beecode.bap.staff.service.StaffService;
import com.beecode.bcp.task.oa.dao.OaMessageDao;
import com.beecode.bcp.task.oa.entity.OaMessageEntity;
import com.beecode.bcp.type.KObject;
import com.beecode.inz.workflow.dao.ApprovalCopyDao;
import com.beecode.inz.workflow.dao.TranspondApprovalSuggestionDao;
import com.beecode.inz.workflow.entity.ApprovalCopyEntity;
import com.beecode.inz.workflow.entity.InzBizProcess;
import com.beecode.inz.workflow.entity.TranspondApprovalSuggestionEntity;
import com.beecode.inz.workflow.service.ApprovalCopyService;
import com.beecode.inz.workflow.service.InzBizProcessService;
@Service
public class ApprovalCopyServiceImpl implements ApprovalCopyService{
@Autowired
private StaffService staffService;
@Autowired
private OaMessageDao oaMessageDao;
@Autowired
private BapContext bapContext;
@Autowired
private InzBizProcessService inzBizProcessService;
@Autowired
private ApprovalCopyDao approvalCopyDao;
@Autowired
private TranspondApprovalSuggestionDao transpondApprovalSuggestionDao;
@Override
@Transactional
public void approvalCopy(UUID bizProcessId, String actors) {
InzBizProcess inzBizProcess = inzBizProcessService.getBizProcessById(bizProcessId);
ApprovalCopyEntity approvalCopyEntity = new ApprovalCopyEntity();
approvalCopyEntity.setProcessInstanceId(inzBizProcess.getProcessInstance().getId());
approvalCopyEntity.setStaffJson(actors);
approvalCopyDao.addApprovalCopy(approvalCopyEntity);
}
@Override
@Transactional
public void completedApprovalCopy(UUID processInstanceId,String suggestion) {
UUID actorId = null;
try {
actorId = bapContext.getCurrentStaff().getUuid("id");
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
TranspondApprovalSuggestionEntity transpondApprovalSuggestionEntity = new TranspondApprovalSuggestionEntity();
transpondApprovalSuggestionEntity.setFinishTime(new Date());
transpondApprovalSuggestionEntity.setOperation(TranspondApprovalSuggestionEntity.operationType.receive);
transpondApprovalSuggestionEntity.setSubmitId(actorId);
if(suggestion != null ){
transpondApprovalSuggestionEntity.setSuggestion(suggestion);
}
transpondApprovalSuggestionEntity.setProcessInstanceId(processInstanceId);
transpondApprovalSuggestionDao.addTranspondApprovalSuggestionEntity(transpondApprovalSuggestionEntity);
KObject staff = staffService.getById(actorId);
String flowId = processInstanceId.toString();
String userId = staff.get("user").getString("username");
OaMessageEntity oaMessageEntity = oaMessageDao.getOaMessageByFlowMessAndByFlowIdAndUserId(1, flowId, userId);
if(oaMessageEntity != null){
OaMessageEntity oaMessageEntity1 = new OaMessageEntity();
BeanUtils.copyProperties(oaMessageEntity, oaMessageEntity1);
oaMessageEntity1.setPtpUrl(oaMessageEntity.getPtpUrl()+"&show=false");
oaMessageEntity1.setMessageId(null);
oaMessageEntity1.setFlowMess(2);
oaMessageEntity1.setStatus(0);
oaMessageEntity1.setOperateTime(new Date());
// oaMessageEntity.setFlowMess(2);
// oaMessageEntity.setOperateTime(new Date());
// oaMessageDao.updateOaMessage(oaMessageEntity);
oaMessageDao.addOaMessage(oaMessageEntity1);
}
}
@Override
public ApprovalCopyEntity getApprovalCopyByprocessInstanceId(UUID processInstanceId) {
return approvalCopyDao.getApprovalCopyByprocessInstanceId(processInstanceId);
}
@Override
@Transactional
public void addApprovalCopy(ApprovalCopyEntity approvalCopyEntity) {
approvalCopyDao.addApprovalCopy(approvalCopyEntity);
}
@Override
public List<KObject> getApprovalCopyStaffByprocessInstanceId(UUID processInstanceId) {
List<KObject> kObjects = new ArrayList<>();
ApprovalCopyEntity approvalCopyEntity = approvalCopyDao.getApprovalCopyByprocessInstanceId(processInstanceId);
if(approvalCopyEntity != null ){
JSONArray jsonArray = new JSONArray(approvalCopyEntity.getStaffJson());
for(int i = 0; i<jsonArray.length();i++){
UUID actorId = UUID.fromString(jsonArray.getString(i));
KObject staff = staffService.getById(actorId);
kObjects.add(staff);
}
}
return kObjects;
}
}
package com.beecode.inz.workflow.internal.service;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import javax.script.Bindings;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import org.json.JSONArray;
import org.json.JSONObject;
import org.mvel2.MVEL;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;
import com.beecode.amino.common.Convert;
import com.beecode.amino.core.Amino;
import com.beecode.bap.bill.BillService;
import com.beecode.bap.bill.HandlerService;
import com.beecode.bap.bill.data.BillData;
import com.beecode.bap.bill.define.BillDefine;
import com.beecode.bap.bill.json.BillDataJsonSerializer;
import com.beecode.bap.staff.service.StaffService;
import com.beecode.bap.workflow.core.BizProcess;
import com.beecode.bap.workflow.core.BizProcessState;
import com.beecode.bap.workflow.service.BizProcessService;
import com.beecode.bcp.participant.core.Participant;
import com.beecode.bcp.participant.core.ParticipantStrategy;
import com.beecode.bcp.participant.core.ParticipantStrategyDefinition;
import com.beecode.bcp.task.assignment.Actor;
import com.beecode.bcp.task.core.Task;
import com.beecode.bcp.task.core.TaskState;
import com.beecode.bcp.type.KClass;
import com.beecode.bcp.type.KObject;
import com.beecode.bcp.type.json.JSONObjectUtils;
import com.beecode.bcp.workflow.core.ProcessInstance;
import com.beecode.bcp.workflow.define.Workflow;
import com.beecode.bcp.workflow.define.WorkflowConstants;
import com.beecode.bcp.workflow.define.bpmn.BPMNDefinition;
import com.beecode.bcp.workflow.define.bpmn.Node;
import com.beecode.bcp.workflow.define.bpmn.NodeType;
import com.beecode.bcp.workflow.define.bpmn.SequenceFlow;
import com.beecode.bcp.workflow.define.bpmn.TaskNode;
import com.beecode.bcp.workflow.define.bpmn.WorkflowProcess;
import com.beecode.bcp.workflow.define.bpmn.ext.Arguments;
import com.beecode.bcp.workflow.define.bpmn.ext.Participation;
import com.beecode.bcp.workflow.define.bpmn.ext.UserTaskNode;
import com.beecode.bcp.workflow.internal.define.jbmp.ScriptTaskNodeImpl;
import com.beecode.bcp.workflow.service.WorkflowStorageService;
import com.beecode.inz.workflow.config.TriggerAction;
import com.beecode.inz.workflow.config.WorkflowConfigurationDefinition;
import com.beecode.inz.workflow.core.InzWorkflowDefinitionStateEnum;
import com.beecode.inz.workflow.entity.InzApprovalTask;
import com.beecode.inz.workflow.entity.InzBizProcess;
import com.beecode.inz.workflow.entity.InzWorkflowDefinition;
import com.beecode.inz.workflow.entity.UserAssignment;
import com.beecode.inz.workflow.pojo.ApprovalNodesObj;
import com.beecode.inz.workflow.service.ApprovalNodeService;
import com.beecode.inz.workflow.service.BizTypeWorkflowConfigurationService;
import com.beecode.inz.workflow.service.InzApprovalTaskService;
import com.beecode.inz.workflow.service.InzWorkflowDefinitionService;
import com.fasterxml.jackson.databind.JsonNode;
@Service
public class ApprovalNodeServiceImpl implements ApprovalNodeService{
private static final Logger logger = LoggerFactory.getLogger(ApprovalNodeServiceImpl.class);
@Autowired
private InzApprovalTaskService inzApprovalTaskService;
@Autowired
private BizTypeWorkflowConfigurationService bizTypeWorkflowConfigurationService;
@Autowired
private StaffService staffService;
@Autowired
private InzWorkflowDefinitionService inzWorkflowDefinitionService;
@Autowired
private WorkflowStorageService workflowStorageService;
@Autowired
private BizProcessService bizProcessService;
@Autowired
private BillService billService;
@Autowired
private HandlerService handlerService;
private static String result_agree = "result==1";
private static String result_n_sign = "length==0";
private static String result_sign = "length>0";
private static String script_end = "_idx>=n_";
private static String n_equipCount = "equipCount==0";
private static String equipCount = "equipCount>0";
private static String equip = "equipCount";
@Autowired
@Qualifier("com.beecode.bcp.workflow.datamodel.ProcessInstance")
public KClass processInstanceClass;
private ApplicationContext getContext() {
return Amino.getApplicationMetadataContext();
}
@Override
public List<ApprovalNodesObj> listApprovalNodeByInzBizProcess(InzBizProcess inzBizProcess,String storeJson,Boolean isEquipment) {
UUID processInstanceId = inzBizProcess.getProcessInstance().getId();
List<ApprovalNodesObj> approvalNodesObjs = new ArrayList<>();
List<InzApprovalTask> allTask = new ArrayList<>();
allTask.addAll( inzApprovalTaskService.listApprovalTask(processInstanceId));
allTask = inzApprovalTaskService.generateParenChildRelation(allTask);
allTask.sort(new Comparator<Task>() {
@Override
public int compare(Task task1, Task task2) {
return task1.getStartTime().compareTo(task2.getStartTime());
}
});
WorkflowConfigurationDefinition config = bizTypeWorkflowConfigurationService.getBizTypeWorkflowConfigurationByBizTypeName(inzBizProcess.getBizTypeName());
Assert.notNull(config,"param 'config' must not be null");
approvalNodesObjs.add(generateStartApprovalRecord(config,inzBizProcess));
for(InzApprovalTask inzApprovalTask :allTask){
approvalNodesObjs.add(generateApprovalPendingRecord(inzApprovalTask));
}
if(inzBizProcess.getWorkflowState() != BizProcessState.DONE_WITH_AGREE.getValue() && inzBizProcess.getWorkflowState() != BizProcessState.DONE_WITH_REJECT.getValue()){
ProcessInstance processInstance = inzBizProcess.getProcessInstance();
WorkflowProcess workflowProcess = processInstance.getWorkflow().getBpmnDefinition().getWorkflowProcess();
pendAddSignInfo(approvalNodesObjs,workflowProcess,processInstance);
String parameters = processInstance.getParameters();
JSONObject parametersJson = new JSONObject(parameters);
parametersJson.put("result", 1);
getNodeInfo(workflowProcess,approvalNodesObjs,storeJson,processInstance,null,JSONObjectUtils.toMap(parametersJson.toString()));
// getNodeInfo(workflowProcess,approvalNodesObjs,storeJson);
}
return approvalNodesObjs;
}
private void getNodeInfo(WorkflowProcess workflowProcess,List<ApprovalNodesObj> approvalNodesObjs ,String storeJson,Boolean isEquipment){
String nodeId = approvalNodesObjs.get(approvalNodesObjs.size()-1).getId();
for(SequenceFlow e : workflowProcess.getSequenceFlows()){
if(e.getCondition() != null && nodeId.equals(e.getSourceRef()) && e.getCondition().contains(result_agree)
&& e.getCondition().contains(result_n_sign)){
if(!e.getTarget().getName().equals("End")&& getLoad(isEquipment, e)){
ApprovalNodesObj approvalNodesObj = new ApprovalNodesObj();
approvalNodesObj.setId(e.getTargetRef());
approvalNodesObj.setName(e.getTarget().getName());
approvalNodesObj.setApprovalResult(-1);
Node node = workflowProcess.findNode(e.getTargetRef());
if(NodeType.TASK == node.getType()){
TaskNode taskNode = (TaskNode)node;
UserTaskNode userTaskNode = (UserTaskNode)taskNode.getExtensionNode();
approvalNodesObj.setApprovalUsers(getParticipant(userTaskNode.getParticipations(),storeJson,null));
}
approvalNodesObj.setType(ApprovalNodesObj.NodeType.normal);
approvalNodesObjs.add(approvalNodesObj);
getNodeInfo(workflowProcess, approvalNodesObjs,storeJson,isEquipment);
break;
}
}else if(e.getCondition() != null && nodeId.equals(e.getSourceRef()) && e.getCondition().equals(result_agree)){
if(!e.getTarget().getName().equals("End")){
ApprovalNodesObj approvalNodesObj = new ApprovalNodesObj();
approvalNodesObj.setId(e.getTargetRef());
approvalNodesObj.setName(e.getTarget().getName());
approvalNodesObj.setApprovalResult(-1);
Node node = workflowProcess.findNode(e.getTargetRef());
if(NodeType.TASK == node.getType()){
TaskNode taskNode = (TaskNode)node;
UserTaskNode userTaskNode = (UserTaskNode)taskNode.getExtensionNode();
approvalNodesObj.setApprovalUsers(getParticipant(userTaskNode.getParticipations(),storeJson,null));
}
approvalNodesObj.setType(ApprovalNodesObj.NodeType.normal);
approvalNodesObjs.add(approvalNodesObj);
getNodeInfo(workflowProcess, approvalNodesObjs,storeJson,isEquipment);
break;
}
}
}
}
private void getNodeInfo(WorkflowProcess workflowProcess,List<ApprovalNodesObj> approvalNodesObjs ,String storeJson,ProcessInstance rejectProcessInstance,String nodeId,Map<String, Object> params){
if(nodeId == null ){
nodeId = approvalNodesObjs.get(approvalNodesObjs.size()-1).getId();
}
String nodeParam = null;
if(nodeId.contains("-")){
nodeParam = "n_"+String.valueOf(nodeId).replaceAll("-", "n")+"_staffs";
}else{
nodeParam = "n_"+nodeId+"_staffs";
}
Object nodeInfo_ = rejectProcessInstance.getParameterValue(nodeParam);
if(nodeInfo_ != null && nodeInfo_.toString().equals("")){
nodeInfo_ = null;
}
Object nodeInfo = nodeInfo_;
for(SequenceFlow e : workflowProcess.getSequenceFlows()){
if(nodeInfo != null && e.getCondition() != null && nodeId.equals(e.getSourceRef()) && e.getCondition().contains(result_agree)
&& e.getCondition().contains(result_sign) ){
if(!e.getTarget().getName().equals("End")){
JSONArray jsonArray = new JSONArray(nodeInfo.toString());
ApprovalNodesObj approvalNodesObj = new ApprovalNodesObj();
approvalNodesObj.setId(e.getTargetRef());
approvalNodesObj.setName(e.getTarget().getName());
approvalNodesObj.setApprovalResult(-1);
List<UserAssignment> userAssignments = new ArrayList<>();
boolean repeatedly = false;
for(int i= 0;i<jsonArray.length();i++){
Object actor = jsonArray.get(i);
if(actor instanceof JSONArray){
ApprovalNodesObj approvalNodesObj_ = new ApprovalNodesObj();
approvalNodesObj_.setId(e.getTargetRef());
approvalNodesObj_.setName(e.getTarget().getName());
approvalNodesObj_.setApprovalResult(-1);
List<UserAssignment> userAssignments_ = new ArrayList<>();
JSONArray jsonArray_ = (JSONArray) actor;
jsonArray_.forEach(actorId->{
UserAssignment userAssignment = new UserAssignment(staffService.getById(UUID.fromString(actorId.toString())));
userAssignments_.add(userAssignment);
});
approvalNodesObj_.setType(ApprovalNodesObj.NodeType.addSign);
approvalNodesObj_.setApprovalUsers(userAssignments_);
approvalNodesObjs.add(approvalNodesObj_);
repeatedly = true;
}else if(actor instanceof String){
UserAssignment userAssignment = new UserAssignment(staffService.getById(UUID.fromString(actor.toString())));
userAssignments.add(userAssignment);
}
}
if(!repeatedly){
approvalNodesObj.setType(ApprovalNodesObj.NodeType.addSign);
approvalNodesObj.setApprovalUsers(userAssignments);
approvalNodesObjs.add(approvalNodesObj);
}
getNodeInfo(workflowProcess, approvalNodesObjs,storeJson,rejectProcessInstance,null,params);
break;
}
}else if(nodeInfo == null && e.getCondition() != null && nodeId.equals(e.getSourceRef()) && e.getCondition().contains(result_agree)
&& e.getCondition().contains(result_n_sign)){
if(!e.getTarget().getName().equals("End")){
Node nodeSource = workflowProcess.findNode(e.getSourceRef());
if(NodeType.TASK == nodeSource.getType()){
TaskNode taskNodeSource = (TaskNode)nodeSource;
taskNodeSource.getDataOutputAssociations().forEach((dataOutputAssociation) -> {
params.put(dataOutputAssociation.getTarget().getId(),
getTaskParams(params, dataOutputAssociation.getTarget().getId()));
});
}
if(evalCondition(params, e.getCondition(),workflowProcess.getBpmnDefinition())){
ApprovalNodesObj approvalNodesObj = new ApprovalNodesObj();
approvalNodesObj.setId(e.getTargetRef());
approvalNodesObj.setName(e.getTarget().getName());
approvalNodesObj.setApprovalResult(-1);
Node node = workflowProcess.findNode(e.getTargetRef());
Object pNodeInfo = getPNodeInfo(e.getTargetRef(), rejectProcessInstance);
if(pNodeInfo != null ){
List<UserAssignment> userAssignments = new ArrayList<>();
JSONArray jsonArray = new JSONArray(pNodeInfo.toString());
jsonArray.forEach(actorId->{
UserAssignment userAssignment = new UserAssignment(staffService.getById(UUID.fromString(actorId.toString())));
userAssignments.add(userAssignment);
});
approvalNodesObj.setApprovalUsers(userAssignments);
approvalNodesObj.setType(ApprovalNodesObj.NodeType.changeStaff);
}else if(NodeType.TASK == node.getType()){
TaskNode taskNode = (TaskNode)node;
UserTaskNode userTaskNode = (UserTaskNode)taskNode.getExtensionNode();
approvalNodesObj.setApprovalUsers(getParticipant(userTaskNode.getParticipations(),storeJson,rejectProcessInstance));
approvalNodesObj.setType(ApprovalNodesObj.NodeType.normal);
}
approvalNodesObjs.add(approvalNodesObj);
getNodeInfo(workflowProcess, approvalNodesObjs,storeJson,rejectProcessInstance,null,params);
break;
}
continue;
}
}else if(nodeInfo == null && e.getCondition() != null && nodeId.equals(e.getSourceRef()) && e.getCondition().equals(result_agree)){
if (e.getTarget() instanceof ScriptTaskNodeImpl) {
getNodeInfo(workflowProcess, approvalNodesObjs,storeJson,rejectProcessInstance,e.getTargetRef(),params);
break;
}else if(!e.getTarget().getName().equals("End")){
ApprovalNodesObj approvalNodesObj = new ApprovalNodesObj();
approvalNodesObj.setId(e.getTargetRef());
approvalNodesObj.setName(e.getTarget().getName());
approvalNodesObj.setApprovalResult(-1);
Node node = workflowProcess.findNode(e.getTargetRef());
Object pNodeInfo = getPNodeInfo(e.getTargetRef(), rejectProcessInstance);
if(pNodeInfo != null ){
List<UserAssignment> userAssignments = new ArrayList<>();
JSONArray jsonArray = new JSONArray(pNodeInfo.toString());
jsonArray.forEach(actorId->{
UserAssignment userAssignment = new UserAssignment(staffService.getById(UUID.fromString(actorId.toString())));
userAssignments.add(userAssignment);
});
approvalNodesObj.setApprovalUsers(userAssignments);
approvalNodesObj.setType(ApprovalNodesObj.NodeType.changeStaff);
}else if(NodeType.TASK == node.getType()){
TaskNode taskNode = (TaskNode)node;
UserTaskNode userTaskNode = (UserTaskNode)taskNode.getExtensionNode();
approvalNodesObj.setApprovalUsers(getParticipant(userTaskNode.getParticipations(),storeJson,rejectProcessInstance));
approvalNodesObj.setType(ApprovalNodesObj.NodeType.normal);
}
approvalNodesObjs.add(approvalNodesObj);
getNodeInfo(workflowProcess, approvalNodesObjs,storeJson,rejectProcessInstance,null,params);
break;
}
}else if (nodeInfo == null && e.getCondition() != null && nodeId.equals(e.getSourceRef()) && e.getCondition().contains(script_end)) {
if(!e.getTarget().getName().equals("End")){
Node nodeSource = workflowProcess.findNode(e.getSourceRef());
if(NodeType.TASK == nodeSource.getType()){
TaskNode taskNodeSource = (TaskNode)nodeSource;
taskNodeSource.getDataOutputAssociations().forEach((dataOutputAssociation) -> {
params.put(dataOutputAssociation.getTarget().getId(),
getTaskParams(params, dataOutputAssociation.getTarget().getId()));
});
}
String expr = e.getCondition().replace("_idx>=n_", "_idx<n_");
if(evalCondition(params, expr,workflowProcess.getBpmnDefinition())){
ApprovalNodesObj approvalNodesObj = new ApprovalNodesObj();
approvalNodesObj.setId(e.getTargetRef());
approvalNodesObj.setName(e.getTarget().getName());
approvalNodesObj.setApprovalResult(-1);
Node node = workflowProcess.findNode(e.getTargetRef());
Object pNodeInfo = getPNodeInfo(e.getTargetRef(), rejectProcessInstance);
if(pNodeInfo != null ){
List<UserAssignment> userAssignments = new ArrayList<>();
JSONArray jsonArray = new JSONArray(pNodeInfo.toString());
jsonArray.forEach(actorId->{
UserAssignment userAssignment = new UserAssignment(staffService.getById(UUID.fromString(actorId.toString())));
userAssignments.add(userAssignment);
});
approvalNodesObj.setApprovalUsers(userAssignments);
approvalNodesObj.setType(ApprovalNodesObj.NodeType.changeStaff);
}else if(NodeType.TASK == node.getType()){
TaskNode taskNode = (TaskNode)node;
UserTaskNode userTaskNode = (UserTaskNode)taskNode.getExtensionNode();
approvalNodesObj.setApprovalUsers(getParticipant(userTaskNode.getParticipations(),storeJson,rejectProcessInstance));
approvalNodesObj.setType(ApprovalNodesObj.NodeType.normal);
}
approvalNodesObjs.add(approvalNodesObj);
getNodeInfo(workflowProcess, approvalNodesObjs,storeJson,rejectProcessInstance,null,params);
break;
}
continue;
}
}
}
}
/**
* 开始节点的审批记录
* @param config
* @param inzBizProcess
* @return
*/
private ApprovalNodesObj generateStartApprovalRecord(WorkflowConfigurationDefinition config,InzBizProcess inzBizProcess){
ApprovalNodesObj approvalNode = new ApprovalNodesObj();
TriggerAction triggerAction = config.getTriggerCondition().findTriggerActionByName(inzBizProcess.getTriggerAction());
if(null != triggerAction){
approvalNode.setName(triggerAction.getTitle());
}else{
approvalNode.setName(inzBizProcess.getTriggerAction());
}
List<UserAssignment> userAssignments = new ArrayList<>();
UserAssignment submitUser = new UserAssignment(inzBizProcess.getSubmitter());
submitUser.setActorId(inzBizProcess.getSubmitter().getUuid("id"));
userAssignments.add(submitUser);
WorkflowProcess workflowProcess = inzBizProcess.getProcessInstance().getWorkflow().getBpmnDefinition().getWorkflowProcess();
workflowProcess.getSequenceFlows().forEach(e ->{
if(e.getSource().getName().equals("Start")){
approvalNode.setId(e.getSourceRef());
}
});
approvalNode.setApprovalUsers(userAssignments);
approvalNode.setApprovalResult(1);
return approvalNode;
}
/**
* 待已审批的审批记录
* @param type
* @param name
* @param task
* @return
*/
private ApprovalNodesObj generateApprovalPendingRecord(InzApprovalTask task){
ApprovalNodesObj approvalNode = new ApprovalNodesObj();
approvalNode.setName(task.getWorkItem().getWorkItemName());
approvalNode.setId(task.getWorkItem().getNodeId());
List<UserAssignment> userAssignments = new ArrayList<>();
if(null != task.getPeopleAssignments() && !task.getPeopleAssignments().isEmpty()){
for(Actor actor : task.getPeopleAssignments()){
userAssignments.add((UserAssignment) actor);
}
}
approvalNode.setApprovalUsers(userAssignments);
if(task.getTaskState() == TaskState.COMPLETED){
approvalNode.setApprovalResult(1);
}
return approvalNode;
}
private List<UserAssignment> getParticipant(List<? extends Participation> participations,String storeJson,ProcessInstance processInstance){
List<UserAssignment> userAssignments = new ArrayList<>();
Map<UUID,Participant> userMap = new HashMap<UUID,Participant>();
for (Participation participation : participations) {
ParticipantStrategyDefinition definition = Amino.getApplicationMetadataContext()
.getBean(participation.getName(),ParticipantStrategyDefinition.class);
ParticipantStrategy participantStrategy = definition.getParticipantStrategy();
Map<String, Object> params = new HashMap<String, Object>();
if(processInstance == null ){
KObject kObject = JSONObjectUtils.toObject("{}", processInstanceClass);
kObject.set("parameters", "{\"currentStore\":\""+storeJson+"\"}");
processInstance = new ProcessInstance(kObject);
}
params.put("processinstance", processInstance);
Arguments arguments = participation.getArguments();
arguments.forEach((argument) -> params.put(argument.getName(), argument.getValue()));
List<Participant> participants = participantStrategy.getParticipant(params);
if(null != participants && !participants.isEmpty()){
for(Participant participant : participants){
if(participant instanceof com.beecode.bcp.participant.core.User){
if(userMap.get(participant.getId()) == null){
UserAssignment userAssignment = new UserAssignment(staffService.getById(participant.getId()));
userAssignments.add(userAssignment);
userMap.put(participant.getId(), participant);
}
}
}
}
}
return userAssignments;
}
@Override
public List<ApprovalNodesObj> listDefinitionApprovalNodeByBizTypeName(String bizTypeName,String storeJson,UUID bizDataId,String define,String disposeType,Boolean isEquipment) {
List<ApprovalNodesObj> approvalNodesObjs = new ArrayList<>();
List<InzWorkflowDefinition> defeinitions = inzWorkflowDefinitionService.listWorkflowDefinitionByBizTypeName(bizTypeName,true);
Assert.notEmpty(defeinitions,"param 'defeinitions' must not be null");
InzWorkflowDefinition definition = null;
for(InzWorkflowDefinition tempDefinition : defeinitions){
if(tempDefinition.getDefinitionState() == InzWorkflowDefinitionStateEnum.ENABLED){
if(disposeType != null){
JSONObject configJson = new JSONObject(tempDefinition.getWorkflowConfig());
String type = "";
if(disposeType.equals("scrap")){
type = "submitToScrap";
}else if(disposeType.equals("sell-off")){
type = "submitToSellOff";
}
if(configJson.getJSONObject("triggerCondition").get("action").toString().contains(type)){
definition = tempDefinition;
break;
}
}else{
definition = tempDefinition;
break;
}
}
}
Assert.notNull(definition,"param 'definition' must not be null");
Workflow workflow = workflowStorageService.getWorkflowOfMaxVersionByWorkflowDefinitionId(definition.getId());
WorkflowProcess workflowProcess = workflow.getBpmnDefinition().getWorkflowProcess();
approvalNodesObjs.add(generateStartApprovalNode(workflowProcess));
// if( bizDataId != null && define == null ){
// BizProcess bizProcess = bizProcessService.getBizProcesByBizTypeName(bizTypeName, bizDataId);
// if(bizProcess != null){
// ProcessInstance rejectProcessInstance = bizProcess.getProcessInstance();
// String nodeId = approvalNodesObjs.get(approvalNodesObjs.size()-1).getId();
// String nodeParam = null;
// if(nodeId.contains("-")){
// nodeParam = "n_"+String.valueOf(nodeId).replaceAll("-", "n")+"_staffs";
// }else{
// nodeParam = "n_"+nodeId+"_staffs";
// }
// String parameters = rejectProcessInstance.getParameters();
// JSONObject parametersJson = new JSONObject(parameters);
// parametersJson.put("result", 1);
// Map<String, Object> params = JSONObjectUtils.toMap(parametersJson.toString());
// Object nodeInfo = rejectProcessInstance.getParameterValue(nodeParam);
// String firstNodeId = getFirstNodeInfo_(workflowProcess,approvalNodesObjs);
// if(nodeInfo != null && !nodeInfo.toString().equals("") && !nodeInfo.toString().equals("\"start_no_add_sign\"")){
// getFirstNodeInfo(workflowProcess,approvalNodesObjs,firstNodeId,storeJson,nodeInfo);
// getNodeInfo(workflowProcess,approvalNodesObjs,storeJson,rejectProcessInstance,null,params);
// }else{
// getFirstNodeInfo(workflowProcess,approvalNodesObjs,firstNodeId,storeJson,rejectProcessInstance);
// getNodeInfo(workflowProcess,approvalNodesObjs,storeJson,rejectProcessInstance,null,params);
// }
// }
// return approvalNodesObjs;
// }else
if( bizDataId != null && define != null ){
BillDefine billDefine = getContext().getBean(define, BillDefine.class);
JsonNode json = handlerService.handleRO(s -> {
BillData billData = billService.getBillData(billDefine, bizDataId, null);
return new BillDataJsonSerializer(billData).withRenderSubs(false).serialize();
});
JsonNode flowData = json.get("flowData");
if(!flowData.isNull()){
JSONObject jsonObject = new JSONObject(flowData.asText());
KObject kObject = JSONObjectUtils.toObject("{}", processInstanceClass);
kObject.set("parameters", jsonObject.getJSONObject("param").toString());
ProcessInstance rejectProcessInstance = new ProcessInstance(kObject);
String nodeId = approvalNodesObjs.get(approvalNodesObjs.size()-1).getId();
String nodeParam = null;
if(nodeId.contains("-")){
nodeParam = "n_"+String.valueOf(nodeId).replaceAll("-", "n")+"_staffs";
}else{
nodeParam = "n_"+nodeId+"_staffs";
}
String parameters = rejectProcessInstance.getParameters();
JSONObject parametersJson = new JSONObject(parameters);
parametersJson.put("result", 1);
Map<String, Object> params = JSONObjectUtils.toMap(parametersJson.toString());
Object nodeInfo = rejectProcessInstance.getParameterValue(nodeParam);
String firstNodeId = getFirstNodeInfo_(workflowProcess,approvalNodesObjs);
if(nodeInfo != null && !nodeInfo.toString().equals("") && !nodeInfo.toString().equals("\"start_no_add_sign\"")){
getFirstNodeInfo(workflowProcess,approvalNodesObjs,firstNodeId,storeJson,nodeInfo);
getNodeInfo(workflowProcess,approvalNodesObjs,storeJson,rejectProcessInstance,null,params);
}else{
getFirstNodeInfo(workflowProcess,approvalNodesObjs,firstNodeId,storeJson,rejectProcessInstance);
getNodeInfo(workflowProcess,approvalNodesObjs,storeJson,rejectProcessInstance,null,params);
}
return approvalNodesObjs;
}
}
String nodeId = getFirstNodeInfo_(workflowProcess,approvalNodesObjs);
if(nodeId != null){
getFirstNodeInfo(workflowProcess,approvalNodesObjs,nodeId,storeJson);
getNodeInfo(workflowProcess,approvalNodesObjs,storeJson,isEquipment);
}
return approvalNodesObjs;
}
private ApprovalNodesObj generateStartApprovalNode(WorkflowProcess workflowProcess){
ApprovalNodesObj approvalNode = new ApprovalNodesObj();
workflowProcess.getSequenceFlows().forEach(e ->{
if(e.getSource().getName().equals("Start")){
approvalNode.setId(e.getSourceRef());
}
});
approvalNode.setName("提交");
return approvalNode;
}
private String getFirstNodeInfo_(WorkflowProcess workflowProcess,List<ApprovalNodesObj> approvalNodesObjs){
String nodeId = approvalNodesObjs.get(approvalNodesObjs.size()-1).getId();
String targetNodeId = null;
for(SequenceFlow e :workflowProcess.getSequenceFlows()){
if(nodeId.equals(e.getSourceRef())){
if(!e.getTarget().getName().equals("End")){
targetNodeId = e.getTargetRef();
break;
}
}
}
return targetNodeId;
}
private void getFirstNodeInfo(WorkflowProcess workflowProcess,List<ApprovalNodesObj> approvalNodesObjs,String nodeId,String storeJson){
// String nodeId = approvalNodesObjs.get(approvalNodesObjs.size()-1).getId();
for(SequenceFlow e : workflowProcess.getSequenceFlows()){
if(e.getCondition() != null && nodeId.equals(e.getSourceRef())
&& e.getCondition().contains(result_n_sign)){
if(!e.getTarget().getName().equals("End")){
ApprovalNodesObj approvalNodesObj = new ApprovalNodesObj();
approvalNodesObj.setId(e.getTargetRef());
approvalNodesObj.setName(e.getTarget().getName());
approvalNodesObj.setApprovalResult(-1);
Node node = workflowProcess.findNode(e.getTargetRef());
if(NodeType.TASK == node.getType()){
TaskNode taskNode = (TaskNode)node;
UserTaskNode userTaskNode = (UserTaskNode)taskNode.getExtensionNode();
approvalNodesObj.setApprovalUsers(getParticipant(userTaskNode.getParticipations(),storeJson,null));
}
approvalNodesObj.setType(ApprovalNodesObj.NodeType.normal);
approvalNodesObjs.add(approvalNodesObj);
break;
}
}
}
}
private void getFirstNodeInfo(WorkflowProcess workflowProcess,List<ApprovalNodesObj> approvalNodesObjs,String nodeId,String storeJson,ProcessInstance processInstance){
// String nodeId = approvalNodesObjs.get(approvalNodesObjs.size()-1).getId();
for(SequenceFlow e : workflowProcess.getSequenceFlows()){
if(e.getCondition() != null && nodeId.equals(e.getSourceRef())
&& e.getCondition().contains(result_n_sign)){
if(!e.getTarget().getName().equals("End")){
ApprovalNodesObj approvalNodesObj = new ApprovalNodesObj();
approvalNodesObj.setId(e.getTargetRef());
approvalNodesObj.setName(e.getTarget().getName());
approvalNodesObj.setApprovalResult(-1);
Node node = workflowProcess.findNode(e.getTargetRef());
Object pNodeInfo = getPNodeInfo(e.getTargetRef(), processInstance);
if(pNodeInfo != null ){
List<UserAssignment> userAssignments = new ArrayList<>();
JSONArray jsonArray = new JSONArray(pNodeInfo.toString());
jsonArray.forEach(actorId->{
UserAssignment userAssignment = new UserAssignment(staffService.getById(UUID.fromString(actorId.toString())));
userAssignments.add(userAssignment);
});
approvalNodesObj.setApprovalUsers(userAssignments);
approvalNodesObj.setType(ApprovalNodesObj.NodeType.changeStaff);
}else if(NodeType.TASK == node.getType()){
TaskNode taskNode = (TaskNode)node;
UserTaskNode userTaskNode = (UserTaskNode)taskNode.getExtensionNode();
approvalNodesObj.setApprovalUsers(getParticipant(userTaskNode.getParticipations(),storeJson,processInstance));
approvalNodesObj.setType(ApprovalNodesObj.NodeType.normal);
}
approvalNodesObjs.add(approvalNodesObj);
break;
}
}
}
}
private void getFirstNodeInfo(WorkflowProcess workflowProcess,List<ApprovalNodesObj> approvalNodesObjs,String nodeId,String storeJson,Object nodeInfo){
// String nodeId = approvalNodesObjs.get(approvalNodesObjs.size()-1).getId();
for(SequenceFlow e : workflowProcess.getSequenceFlows()){
if(e.getCondition() != null && nodeId.equals(e.getSourceRef())
&& e.getCondition().contains(result_sign)){
if(!e.getTarget().getName().equals("End")){
JSONArray jsonArray = new JSONArray(nodeInfo.toString());
ApprovalNodesObj approvalNodesObj = new ApprovalNodesObj();
approvalNodesObj.setId(e.getTargetRef());
approvalNodesObj.setName(e.getTarget().getName());
approvalNodesObj.setApprovalResult(-1);
List<UserAssignment> userAssignments = new ArrayList<>();
boolean repeatedly = false;
for(int i= 0;i<jsonArray.length();i++){
Object actor = jsonArray.get(i);
if(actor instanceof JSONArray){
ApprovalNodesObj approvalNodesObj_ = new ApprovalNodesObj();
approvalNodesObj_.setId(e.getTargetRef());
approvalNodesObj_.setName(e.getTarget().getName());
approvalNodesObj_.setApprovalResult(-1);
List<UserAssignment> userAssignments_ = new ArrayList<>();
JSONArray jsonArray_ = (JSONArray) actor;
jsonArray_.forEach(actorId->{
UserAssignment userAssignment = new UserAssignment(staffService.getById(UUID.fromString(actorId.toString())));
userAssignments_.add(userAssignment);
});
approvalNodesObj_.setType(ApprovalNodesObj.NodeType.addSign);
approvalNodesObj_.setApprovalUsers(userAssignments_);
approvalNodesObjs.add(approvalNodesObj_);
repeatedly = true;
}else if(actor instanceof String){
UserAssignment userAssignment = new UserAssignment(staffService.getById(UUID.fromString(actor.toString())));
userAssignments.add(userAssignment);
}
}
if(!repeatedly){
approvalNodesObj.setType(ApprovalNodesObj.NodeType.addSign);
approvalNodesObj.setApprovalUsers(userAssignments);
approvalNodesObjs.add(approvalNodesObj);
}
break;
}
}
}
}
private Object getPNodeInfo(String nodeId,ProcessInstance processInstance){
String nodeParam = null;
if(nodeId.contains("-")){
nodeParam = "p_"+String.valueOf(nodeId).replaceAll("-", "p")+"_staffs";
}else{
nodeParam = "p_"+nodeId+"_staffs";
}
Object nodeInfo_ = processInstance.getParameterValue(nodeParam);
if(nodeInfo_ != null && nodeInfo_.toString().equals("")){
nodeInfo_ = null;
}
return nodeInfo_;
}
private boolean getLoad(Boolean isEquipment,SequenceFlow e ){
boolean load = false;
if(isEquipment != null){
if(e.getCondition().contains(equip)){
if(isEquipment && e.getCondition().contains(equipCount)){
load = true;
}else if(!isEquipment && e.getCondition().contains(n_equipCount)){
load = true;
}
}else{
load = true;
}
}else{
load = true;
}
return load;
}
private void pendAddSignInfo(List<ApprovalNodesObj> approvalNodesObjs,WorkflowProcess workflowProcess,ProcessInstance processInstance){
String nodeId = approvalNodesObjs.get(approvalNodesObjs.size()-1).getId();
Node node = workflowProcess.findNode(nodeId);
boolean isAddSignNode = false;
for(SequenceFlow sequenceFlow :node.getOutFlows()){
if(sequenceFlow.getTarget() instanceof ScriptTaskNodeImpl){
isAddSignNode = true;
}
}
if(isAddSignNode){
String addSignNodeId = null;
int size = 0;
for(int i = approvalNodesObjs.size();i>0;i--){
ApprovalNodesObj approvalNodesObj = approvalNodesObjs.get(i-1);
if(!approvalNodesObj.getId().equals(nodeId)){
addSignNodeId = approvalNodesObj.getId();
break;
}else{
approvalNodesObj.setType(ApprovalNodesObj.NodeType.addSign);
size++;
}
}
String nodeParam = null;
if(nodeId.contains("-")){
nodeParam = "n_"+String.valueOf(addSignNodeId).replaceAll("-", "n")+"_staffs";
}else{
nodeParam = "n_"+addSignNodeId+"_staffs";
}
Object nodeInfo_ = processInstance.getParameterValue(nodeParam);
if(nodeInfo_ != null && nodeInfo_.toString().equals("")){
nodeInfo_ = null;
}
Object nodeInfo = nodeInfo_;
JSONArray jsonArray = new JSONArray(nodeInfo.toString());
for(int i = size ; i<jsonArray.length();i++){
if(jsonArray.get(i) instanceof JSONArray){
ApprovalNodesObj approvalNodesObj = new ApprovalNodesObj();
approvalNodesObj.setId(nodeId);
approvalNodesObj.setName(node.getName());
approvalNodesObj.setApprovalResult(-1);
JSONArray jsonArray_ = (JSONArray) jsonArray.get(i);
List<UserAssignment> userAssignments = new ArrayList<>();
jsonArray_.forEach(actorId->{
UserAssignment userAssignment = new UserAssignment(staffService.getById(UUID.fromString(actorId.toString())));
userAssignments.add(userAssignment);
});
approvalNodesObj.setType(ApprovalNodesObj.NodeType.addSign);
approvalNodesObj.setApprovalUsers(userAssignments);
approvalNodesObjs.add(approvalNodesObj);
}
}
}else {
approvalNodesObjs.get(approvalNodesObjs.size()-1).setType(ApprovalNodesObj.NodeType.normal);
}
}
private boolean evalCondition(Map<String, Object> params, String expr,BPMNDefinition bpmnDefinition){
String exprLang = bpmnDefinition.getExpressionLanguage();
if (exprLang == null) {
return false;
}
switch (exprLang) {
case WorkflowConstants.LANG_JAVASCRIPT:
return evalConditionJS(params, expr);
case WorkflowConstants.LANG_MVEL2:
return evalConditionMVEL(params, expr);
default:
return false;
}
}
private boolean evalConditionMVEL(Map<String, Object> params, String expr) {
try {
Object object = MVEL.eval(expr, params);
return Boolean.valueOf(object.toString());
} catch (Exception e) {
logger.error("Error occurs while evaluating mvel expression ",e);
}
return false;
}
private boolean evalConditionJS(Map<String, Object> params, String expr) {
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("javascript");
Bindings bindings = engine.createBindings();
bindings.putAll(params);
try {
Object result = engine.eval(expr, bindings);
return Convert.toBoolean(result);
} catch (Exception e) {
logger.error("Error occurs while evaluating JavaScript expression ",e);
}
return false;
}
private Object getTaskParams(Map<String, Object> params,String key){
Object object = null;
object = params.get(key);
if(object == null){
object = "";
}
return object;
}
}
......@@ -4,6 +4,7 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.UUID;
import org.json.JSONArray;
import org.json.JSONObject;
......@@ -12,20 +13,33 @@ import org.springframework.stereotype.Service;
import org.springframework.util.Assert;
import org.springframework.util.CollectionUtils;
import com.beecode.bap.staff.service.StaffService;
import com.beecode.bap.workflow.core.BizProcessState;
import com.beecode.bcp.task.assignment.Actor;
import com.beecode.bcp.task.core.Task;
import com.beecode.bcp.task.core.TaskState;
import com.beecode.bcp.workflow.core.StorageWorkflow;
import com.beecode.bcp.workflow.define.bpmn.ext.ExtensionNode;
import com.beecode.bcp.workflow.define.bpmn.ext.UserTaskNode;
import com.beecode.inz.workflow.config.TriggerAction;
import com.beecode.inz.workflow.config.WorkflowConfigurationDefinition;
import com.beecode.inz.workflow.dao.InzApprovalTaskDao;
import com.beecode.inz.workflow.dao.TranspondApprovalStaffDao;
import com.beecode.inz.workflow.dao.TranspondApprovalSuggestionDao;
import com.beecode.inz.workflow.entity.ApprovalPendingRecord;
import com.beecode.inz.workflow.entity.ApprovalRecord;
import com.beecode.inz.workflow.entity.ApprovedRecord;
import com.beecode.inz.workflow.entity.InzApprovalTask;
import com.beecode.inz.workflow.entity.InzBizProcess;
import com.beecode.inz.workflow.entity.SubmitApprovalSuggestionEntity;
import com.beecode.inz.workflow.entity.TranspondApprovalStaffEntity;
import com.beecode.inz.workflow.entity.TranspondApprovalSuggestionEntity;
import com.beecode.inz.workflow.entity.UserAssignment;
import com.beecode.inz.workflow.pojo.WorkflowRecordsObj;
import com.beecode.inz.workflow.service.ApprovalRecordService;
import com.beecode.inz.workflow.service.BizTypeWorkflowConfigurationService;
import com.beecode.inz.workflow.service.InzApprovalTaskService;
import com.beecode.inz.workflow.service.InzBizProcessService;
import com.beecode.inz.workflow.service.SubmitApprovalSuggestionService;
@Service
public class ApprovalRecordServiceImpl implements ApprovalRecordService{
......@@ -35,6 +49,23 @@ public class ApprovalRecordServiceImpl implements ApprovalRecordService{
@Autowired
private BizTypeWorkflowConfigurationService bizTypeWorkflowConfigurationService;
@Autowired
private SubmitApprovalSuggestionService submitApprovalSuggestionService;
@Autowired
private TranspondApprovalStaffDao transpondApprovalStaffDao;
@Autowired
private TranspondApprovalSuggestionDao transpondApprovalSuggestionDao;
@Autowired
private StaffService staffService;
@Autowired
private InzBizProcessService inzBizProcessService;
@Autowired
private InzApprovalTaskDao inzApprovalTaskDao;
/**
* 待审批的审批记录
......@@ -79,6 +110,7 @@ public class ApprovalRecordServiceImpl implements ApprovalRecordService{
approvalRecord.setSuggestions(task.getSuggestion());
approvalRecord.setStartTime(task.getFinishTime());
approvalRecord.setFinishTime(task.getFinishTime());
approvalRecord.setAttribute1(task.getAttribute1());
if(null != task.getActualActor()){
approvalRecord.setApprovalUser((UserAssignment)task.getActualActor());
}
......@@ -92,6 +124,19 @@ public class ApprovalRecordServiceImpl implements ApprovalRecordService{
}
return approvalRecord;
}
private WorkflowRecordsObj generateWorkflowRecord(String name, String type, InzApprovalTask task){
WorkflowRecordsObj record = new WorkflowRecordsObj();
record.setName(name);
record.setOperation(String.valueOf(task.getResult()));
record.setSuggestion(task.getSuggestion());
record.setFinishTime(task.getFinishTime());
if(null != task.getActualActor()){
record.setApprovalUser((UserAssignment)task.getActualActor());
}
return record;
}
/**
* 开始节点的审批记录
* @param config
......@@ -112,11 +157,48 @@ public class ApprovalRecordServiceImpl implements ApprovalRecordService{
UserAssignment submitUser = new UserAssignment(inzBizProcess.getSubmitter());
submitUser.setActorId(inzBizProcess.getSubmitter().getUuid("id"));
approvalRecord.setApprovalUser(submitUser);
return approvalRecord;
}
/**
* 开始节点的审批记录
* @param config
* @param inzBizProcess
* @return
*/
private WorkflowRecordsObj generateStartWorkflowRecord(WorkflowConfigurationDefinition config,InzBizProcess inzBizProcess,
List<InzApprovalTask> allTask,List<InzApprovalTask> toDoTask){
WorkflowRecordsObj record = new WorkflowRecordsObj();
TriggerAction triggerAction = config.getTriggerCondition().findTriggerActionByName(inzBizProcess.getTriggerAction());
if(null != triggerAction){
record.setName(triggerAction.getTitle());
}else{
record.setName(inzBizProcess.getTriggerAction());
}
record.setOperation("1");
record.setFinishTime(inzBizProcess.getSubmitTime());
UserAssignment submitUser = new UserAssignment(inzBizProcess.getSubmitter());
submitUser.setActorId(inzBizProcess.getSubmitter().getUuid("id"));
SubmitApprovalSuggestionEntity submitApprovalSuggestionEntity= submitApprovalSuggestionService.getSubmitApprovalSuggestionByprocessInstanceId(inzBizProcess.getProcessInstance().getId());
if( submitApprovalSuggestionEntity != null ){
record.setSuggestion(submitApprovalSuggestionEntity.getSuggestion());
}
record.setApprovalUser(submitUser);
List<UserAssignment> userAssignments = new ArrayList<>();
if(allTask.size()>0){
InzApprovalTask task = allTask.get(0);
addApprovalUserAssignment(task, userAssignments);
record.setReceiverUser(userAssignments);
}else if(toDoTask.size()>0){
InzApprovalTask task = toDoTask.get(0);
addToDoUserAssignment(task, userAssignments);
record.setReceiverUser(userAssignments);
}
return record;
}
/**
* 结束节点的审批记录
* @param inzBizProcess
* @return
......@@ -147,18 +229,16 @@ public class ApprovalRecordServiceImpl implements ApprovalRecordService{
records.add(generateStartApprovalRecord(config,inzBizProcess));
StorageWorkflow workflow = (StorageWorkflow)inzBizProcess.getProcessInstance().getWorkflow();
String origionDefinition = workflow.getOriginalDefinition();
JSONObject origionDefinitionJson = new JSONObject(origionDefinition);
JSONArray nodeArray = origionDefinitionJson.getJSONArray("tasks");
for(int i = 0 ; i < nodeArray.length() ; i++){
String nodeId = nodeArray.getJSONObject(i).getString("id");
String name = nodeArray.getJSONObject(i).getString("name");
String type = nodeArray.getJSONObject(i).getString("type");
for(InzApprovalTask task : allTask){
if(nodeId.equals(task.getWorkItem().getNodeId())){
for(int i = 0 , length = allTask.size() ; i < length ;i++) {
InzApprovalTask task = allTask.get(i);
String name = task.getWorkItem().getWorkItemName();
ExtensionNode extensionNode = task.getWorkItem().getTaskNode().getExtensionNode();
String type = "";
if(extensionNode instanceof UserTaskNode) {
type = ((UserTaskNode)extensionNode).getTaskType();
}
List<InzApprovalTask> tempTasks = new ArrayList<InzApprovalTask>();
tempTasks.add(allTask.get(i));
ApprovalRecord tempRecord = null;
if(task.getTaskState() == TaskState.COMPLETED){
tempRecord = generateApprovdRecord(name,type,task);
......@@ -185,14 +265,7 @@ public class ApprovalRecordServiceImpl implements ApprovalRecordService{
});
}
records.add(tempRecord);
break;
}
}
}
if(inzBizProcess.getWorkflowState() == BizProcessState.DONE_WITH_AGREE.getValue() || inzBizProcess.getWorkflowState() == BizProcessState.DONE_WITH_REJECT.getValue()){
......@@ -223,4 +296,168 @@ public class ApprovalRecordServiceImpl implements ApprovalRecordService{
return records;
}
@Override
public List<WorkflowRecordsObj> listWorkflowRecordByProcessInstance(InzBizProcess inzBizProcess) {
Assert.notNull(inzBizProcess,"param 'inzBizProcess' must not be null");
List<WorkflowRecordsObj> records = new ArrayList<>();
records.addAll(getWorkflowRecords(inzBizProcess));
List<InzBizProcess> inzBizProcesses = inzBizProcessService.listBizProcessByBizDataIdAndStateAndNoProcessInstanceId(inzBizProcess.getBizDataId(), BizProcessState.DONE_WITH_REJECT, inzBizProcess.getProcessInstance().getId());
for(InzBizProcess inzBizProcess_ : inzBizProcesses){
records.addAll(getWorkflowRecords(inzBizProcess_));
}
Collections.sort(records, new Comparator<WorkflowRecordsObj>(){
@Override
public int compare(WorkflowRecordsObj o1, WorkflowRecordsObj o2) {
return o1.getFinishTime().after(o2.getFinishTime()) ? -1:1;
}
});
return records;
}
private List<WorkflowRecordsObj> getWorkflowRecords(InzBizProcess inzBizProcess){
Assert.notNull(inzBizProcess,"param 'inzBizProcess' must not be null");
List<InzApprovalTask> allTask = new ArrayList<>();
allTask.addAll( inzApprovalTaskService.listApprovedTask(inzBizProcess.getProcessInstance().getId()));
List<InzApprovalTask> toDoTask = inzApprovalTaskDao.listToDoTask(inzBizProcess.getProcessInstance().getId());
allTask = inzApprovalTaskService.generateParenChildRelation(allTask);
toDoTask = inzApprovalTaskService.generateParenChildRelation(toDoTask);
List<WorkflowRecordsObj> records = new ArrayList<>();
WorkflowConfigurationDefinition config = bizTypeWorkflowConfigurationService.getBizTypeWorkflowConfigurationByBizTypeName(inzBizProcess.getBizTypeName());
Assert.notNull(config,"param 'config' must not be null");
records.add(generateStartWorkflowRecord(config,inzBizProcess,allTask,toDoTask));
for(int i = 0 , length = allTask.size() ; i < length ;i++) {
InzApprovalTask task = allTask.get(i);
JSONObject taskParams = new JSONObject(task.toKObject().getString(Task.PARAMETERS));
if(taskParams.has("autoComplete") && taskParams.getBoolean("autoComplete")){
continue;
}
if(null != task.getChildren() && !task.getChildren().isEmpty()){
for(Task child : task.getChildren()){
InzApprovalTask childTask = (InzApprovalTask)child;
JSONObject taskParams_ = new JSONObject(childTask.toKObject().getString(Task.PARAMETERS));
if(taskParams_.has("autoComplete") && taskParams_.getBoolean("autoComplete")){
continue;
}
getNodeRecord(childTask, allTask, toDoTask, length, inzBizProcess, records, i);
}
}else{
getNodeRecord(task, allTask, toDoTask, length, inzBizProcess, records, i);
}
}
List<WorkflowRecordsObj> records_ = new ArrayList<WorkflowRecordsObj>();
List<TranspondApprovalStaffEntity> transpondApprovalStaffEntities = transpondApprovalStaffDao.getTranspondApprovalStaffByprocessInstanceId(inzBizProcess.getProcessInstance().getId());
for(TranspondApprovalStaffEntity transpondApprovalStaffEntity : transpondApprovalStaffEntities){
WorkflowRecordsObj workflowRecordsObj = new WorkflowRecordsObj();
workflowRecordsObj.setFinishTime(transpondApprovalStaffEntity.getFinishTime());
if(transpondApprovalStaffEntity.getOperation().equals(TranspondApprovalStaffEntity.operationType.copy)){
workflowRecordsObj.setName("抄送");
}else{
workflowRecordsObj.setName("转发");
}
workflowRecordsObj.setSuggestion(transpondApprovalStaffEntity.getSuggestion());
workflowRecordsObj.setOperation(transpondApprovalStaffEntity.getOperation().toString());
workflowRecordsObj.setApprovalUser(new UserAssignment(staffService.getById(transpondApprovalStaffEntity.getSubmitId())));
JSONArray jsonArray = new JSONArray(transpondApprovalStaffEntity.getStaffJson());
List<UserAssignment> userAssignments = new ArrayList<>();
jsonArray.forEach(actorId->{
UserAssignment userAssignment = new UserAssignment(staffService.getById(UUID.fromString(actorId.toString())));
userAssignments.add(userAssignment);
});
workflowRecordsObj.setReceiverUser(userAssignments);
records_.add(workflowRecordsObj);
}
List<TranspondApprovalSuggestionEntity> transpondApprovalSuggestionEntities = transpondApprovalSuggestionDao.getTranspondApprovalSuggestionByprocessInstanceId(inzBizProcess.getProcessInstance().getId());
for(TranspondApprovalSuggestionEntity transpondApprovalSuggestionEntity :transpondApprovalSuggestionEntities){
WorkflowRecordsObj workflowRecordsObj = new WorkflowRecordsObj();
workflowRecordsObj.setFinishTime(transpondApprovalSuggestionEntity.getFinishTime());
if(transpondApprovalSuggestionEntity.getOperation().equals(TranspondApprovalSuggestionEntity.operationType.copy)){
workflowRecordsObj.setName("抄送");
}else{
workflowRecordsObj.setName("转发");
}
workflowRecordsObj.setOperation(transpondApprovalSuggestionEntity.getOperation().toString());
workflowRecordsObj.setApprovalUser(new UserAssignment(staffService.getById(transpondApprovalSuggestionEntity.getSubmitId())));
workflowRecordsObj.setSuggestion(transpondApprovalSuggestionEntity.getSuggestion());
records_.add(workflowRecordsObj);
}
records.addAll(records_);
return records;
}
private void getNodeRecord(InzApprovalTask task,List<InzApprovalTask> allTask,List<InzApprovalTask> toDoTask,
int length,InzBizProcess inzBizProcess,List<WorkflowRecordsObj> records,int i){
String name = task.getWorkItem().getWorkItemName();
ExtensionNode extensionNode = task.getWorkItem().getTaskNode().getExtensionNode();
String type = "";
if(extensionNode instanceof UserTaskNode) {
type = ((UserTaskNode)extensionNode).getTaskType();
}
List<InzApprovalTask> tempTasks = new ArrayList<InzApprovalTask>();
tempTasks.add(allTask.get(i));
WorkflowRecordsObj tempRecord = null;
if(task.getTaskState() == TaskState.COMPLETED){
tempRecord = generateWorkflowRecord(name,type,task);
List<UserAssignment> userAssignments = new ArrayList<>();
if(i == (length-1)){
if(toDoTask.size()>0){
InzApprovalTask task_ = toDoTask.get(0);
addToDoUserAssignment(task_,userAssignments);
tempRecord.setReceiverUser(userAssignments);
}else{
UserAssignment submitUser = new UserAssignment(inzBizProcess.getSubmitter());
submitUser.setActorId(inzBizProcess.getSubmitter().getUuid("id"));
userAssignments.add(submitUser);
tempRecord.setReceiverUser(userAssignments);
}
}else{
InzApprovalTask task_ = allTask.get(i+1);
addApprovalUserAssignment(task_,userAssignments);
tempRecord.setReceiverUser(userAssignments);
}
records.add(tempRecord);
}
}
private void addToDoUserAssignment(InzApprovalTask task_,List<UserAssignment> userAssignments){
if(null != task_.getChildren() && !task_.getChildren().isEmpty()){
task_.getChildren().forEach((child)->{
InzApprovalTask childTask = (InzApprovalTask)child;
if(null != childTask.getPeopleAssignments() && !childTask.getPeopleAssignments().isEmpty()){
for(Actor actor : childTask.getPeopleAssignments()){
userAssignments.add((UserAssignment) actor);
}
}
});
}else{
for(Actor actor : task_.getPeopleAssignments()){
userAssignments.add((UserAssignment) actor);
}
}
}
private void addApprovalUserAssignment(InzApprovalTask task_,List<UserAssignment> userAssignments){
if(null != task_.getChildren() && !task_.getChildren().isEmpty()){
task_.getChildren().forEach((child)->{
InzApprovalTask childTask = (InzApprovalTask)child;
UserAssignment userAssignment = (UserAssignment)childTask.getActualActor();
userAssignments.add(userAssignment);
});
}else{
UserAssignment userAssignment = (UserAssignment)task_.getActualActor();
userAssignments.add(userAssignment);
}
}
}
package com.beecode.inz.workflow.internal.service;
import java.util.Date;
import java.util.UUID;
import org.json.JSONArray;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.beecode.bap.staff.service.StaffService;
import com.beecode.bap.workflow.dao.CommonTaskDao;
import com.beecode.bcp.task.core.Task;
import com.beecode.bcp.task.define.TaskDefinition;
import com.beecode.bcp.task.oa.dao.OaMessageDao;
import com.beecode.bcp.task.oa.entity.OaMessageEntity;
import com.beecode.bcp.task.service.TaskDefinitionService;
import com.beecode.bcp.type.KClass;
import com.beecode.bcp.type.KObject;
import com.beecode.inz.workflow.dao.ApprovalCopyDao;
import com.beecode.inz.workflow.dao.TranspondApprovalStaffDao;
import com.beecode.inz.workflow.entity.ApprovalCopyEntity;
import com.beecode.inz.workflow.entity.TranspondApprovalStaffEntity;
import com.beecode.inz.workflow.service.ApprovalSendCopyService;
import com.beecode.inz.workflow.util.InzApprovalTaskConstants;
@Service
public class ApprovalSendCopyServiceImpl implements ApprovalSendCopyService{
@Autowired
private TaskDefinitionService taskDefinitionService;
@Autowired
private CommonTaskDao bizTaskDao;
@Autowired
private ApprovalCopyDao approvalCopyDao;
@Autowired
private StaffService staffService;
@Autowired
private OaMessageDao oaMessageDao;
@Autowired
private TranspondApprovalStaffDao transpondApprovalStaffDao;
@Override
@Transactional
public void sendApprovalCopy(UUID taskId,int result) {
TaskDefinition taskDefinition = taskDefinitionService.getByName(InzApprovalTaskConstants.TASK_DEFINITION_NAME);
KClass taskClass = taskDefinition.getKClass();
KObject taskObject = bizTaskDao.getTask(taskClass, taskId);
int processInstanceState = taskObject.get("processInstance").getInt("processState");
if(result == 1 && processInstanceState == 2){
ApprovalCopyEntity approvalCopyEntity = approvalCopyDao.getApprovalCopyByprocessInstanceId(taskObject.get("processInstance").getUuid("id"));
if( approvalCopyEntity != null ){
JSONArray jsonArray = new JSONArray(approvalCopyEntity.getStaffJson());
for(int i = 0; i<jsonArray.length();i++){
UUID actorId = UUID.fromString(jsonArray.getString(i));
KObject staff = staffService.getById(actorId);
String bizObjectName = taskObject.getString("bizObjectName");
String[] names = bizObjectName.split("-");
OaMessageEntity oaMessageEntity = new OaMessageEntity();
oaMessageEntity.setSender("宝贝王系统");
oaMessageEntity.setSenderTime(new Date());
if(names.length>0){
oaMessageEntity.setFlowType(names[0]);
}else{
oaMessageEntity.setFlowType(taskObject.getString(Task.BIZ_TYPE_NAME));
}
oaMessageEntity.setFlowId(taskObject.get("processInstance").getUuid("id").toString());
oaMessageEntity.setTitle(bizObjectName.replaceAll("-", " "));
oaMessageEntity.setNodeName(taskObject.get("workItem").getString("workItemName"));
String url = "/app/ApprovalCopy?bizTypeName="+taskObject.getString(Task.BIZ_TYPE_NAME)+"&bizDataId="+taskObject.getUuid("bizDataId").toString()+"&show=true&type=copy";
oaMessageEntity.setPtpUrl(url);
oaMessageEntity.setUserId(staff.get("user").getString("username"));
oaMessageEntity.setCreator(taskObject.get("bizProcess").get("submitter").get("user").getString("username"));
oaMessageEntity.setCreateTime(taskObject.get("processInstance").getDate("startTime"));
oaMessageEntity.setOperateTime(new Date());
oaMessageEntity.setFlowMess(1);
oaMessageEntity.setViewType(0);
oaMessageEntity.setStatus(0);
oaMessageEntity.setErrorCount(0);
oaMessageEntity.setMessageCreateTime(new Date());
oaMessageEntity.setAllowMobile(0);
oaMessageEntity.setSenderCode("fb77aaf5-ad40-4307-9ca6-2e1cbd29ffee");
oaMessageEntity.setTemp1(taskObject.get("processInstance").getUuid("id").toString());
oaMessageDao.addOaMessage(oaMessageEntity);
}
TranspondApprovalStaffEntity transpondApprovalStaffEntity = new TranspondApprovalStaffEntity();
transpondApprovalStaffEntity.setFinishTime(new Date());
transpondApprovalStaffEntity.setOperation(TranspondApprovalStaffEntity.operationType.copy);
transpondApprovalStaffEntity.setSubmitId(taskObject.get("bizProcess").get("submitter").getUuid("id"));
transpondApprovalStaffEntity.setProcessInstanceId(taskObject.get("processInstance").getUuid("id"));
transpondApprovalStaffEntity.setStaffJson(approvalCopyEntity.getStaffJson());
transpondApprovalStaffDao.addTranspondApprovalStaffEntity(transpondApprovalStaffEntity);
}
}
}
}
package com.beecode.inz.workflow.internal.service;
import java.util.Date;
import java.util.List;
import java.util.UUID;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.beecode.bap.staff.BapContext;
import com.beecode.bap.staff.service.StaffService;
import com.beecode.bcp.task.core.Task;
import com.beecode.bcp.task.oa.dao.OaMessageDao;
import com.beecode.bcp.task.oa.entity.OaMessageEntity;
import com.beecode.bcp.task.service.TaskService;
import com.beecode.bcp.type.KObject;
import com.beecode.inz.workflow.dao.TranspondApprovalStaffDao;
import com.beecode.inz.workflow.dao.TranspondApprovalSuggestionDao;
import com.beecode.inz.workflow.entity.InzBizProcess;
import com.beecode.inz.workflow.entity.TranspondApprovalStaffEntity;
import com.beecode.inz.workflow.entity.TranspondApprovalSuggestionEntity;
import com.beecode.inz.workflow.service.ApprovalTranspondService;
import com.beecode.inz.workflow.service.InzBizProcessService;
import com.beecode.inz.workflow.service.InzWorkflowService;
@Service
public class ApprovalTranspondServiceImpl implements ApprovalTranspondService{
@Autowired
private TaskService taskService;
@Autowired
private StaffService staffService;
@Autowired
private OaMessageDao oaMessageDao;
@Autowired
private BapContext bapContext;
@Autowired
private InzBizProcessService inzBizProcessService;
@Autowired
private InzWorkflowService inzWorkflowService;
@Autowired
private TranspondApprovalSuggestionDao transpondApprovalSuggestionDao;
@Autowired
private TranspondApprovalStaffDao transpondApprovalStaffDao;
@Override
@Transactional
public void approvalTranspond(UUID bizProcessId, List<UUID> actorIds,String type,String url_,String suggestion) {
UUID loginActorId = null;
try {
loginActorId = bapContext.getCurrentStaff().getUuid("id");
} catch (Exception e1) {
e1.printStackTrace();
}
InzBizProcess inzBizProcess = inzBizProcessService.getBizProcessById(bizProcessId);
if("transpondOneself".equals(type) || "transpondReject".equals(type)){
actorIds.add(inzBizProcess.getSubmitter().getUuid("id"));
}else{
TranspondApprovalStaffEntity transpondApprovalStaffEntity = new TranspondApprovalStaffEntity();
transpondApprovalStaffEntity.setFinishTime(new Date());
transpondApprovalStaffEntity.setOperation(TranspondApprovalStaffEntity.operationType.transpond);
transpondApprovalStaffEntity.setSubmitId(loginActorId);
transpondApprovalStaffEntity.setProcessInstanceId(inzBizProcess.getProcessInstance().getId());
transpondApprovalStaffEntity.setStaffJson(actorIds.toString());
transpondApprovalStaffEntity.setSuggestion(suggestion);
transpondApprovalStaffDao.addTranspondApprovalStaffEntity(transpondApprovalStaffEntity);
}
for(UUID actorId : actorIds){
List<KObject> tasks = taskService.listTaskByProcessInstanceId(inzBizProcess.getProcessInstance().getId());
if(tasks.size() > 0){
KObject taskObject = tasks.get(0);
String bizObjectName = taskObject.getString("bizObjectName");
String[] names = bizObjectName.split("-");
KObject staff = staffService.getById(actorId);
OaMessageEntity oaMessageEntity = new OaMessageEntity();
oaMessageEntity.setSender("宝贝王系统");
oaMessageEntity.setSenderTime(new Date());
if(names.length>0){
oaMessageEntity.setFlowType(names[0]);
}else{
oaMessageEntity.setFlowType(taskObject.getString(Task.BIZ_TYPE_NAME));
}
oaMessageEntity.setFlowId(taskObject.get("processInstance").getUuid("id").toString());
oaMessageEntity.setTitle(bizObjectName.replaceAll("-", " "));
oaMessageEntity.setNodeName(taskObject.get("workItem").getString("workItemName"));
String url = null;
if("transpondReject".equals(type)){
url = url_;
}else{
url = "/app/ApprovalCopy?bizTypeName="+taskObject.getString(Task.BIZ_TYPE_NAME)+"&bizDataId="+taskObject.getUuid("bizDataId").toString()+"&show=true&type=transpond";
}
oaMessageEntity.setPtpUrl(url);
oaMessageEntity.setUserId(staff.get("user").getString("username"));
oaMessageEntity.setCreator(taskObject.get("bizProcess").get("submitter").get("user").getString("username"));
oaMessageEntity.setCreateTime(taskObject.get("processInstance").getDate("startTime"));
oaMessageEntity.setOperateTime(new Date());
oaMessageEntity.setFlowMess(1);
oaMessageEntity.setViewType(0);
oaMessageEntity.setStatus(0);
oaMessageEntity.setErrorCount(0);
oaMessageEntity.setMessageCreateTime(new Date());
oaMessageEntity.setAllowMobile(0);
oaMessageEntity.setSenderCode("fb77aaf5-ad40-4307-9ca6-2e1cbd29ffee");
oaMessageEntity.setTemp1(taskObject.get("processInstance").getUuid("id").toString());
oaMessageDao.addOaMessage(oaMessageEntity);
}
}
}
@Override
@Transactional
public void completedApprovalTranspond(UUID processInstanceId,String suggestion) {
UUID actorId = null;
try {
actorId = bapContext.getCurrentStaff().getUuid("id");
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
TranspondApprovalSuggestionEntity transpondApprovalSuggestionEntity = new TranspondApprovalSuggestionEntity();
if(suggestion != null ){
transpondApprovalSuggestionEntity.setSuggestion(suggestion);
}
transpondApprovalSuggestionEntity.setFinishTime(new Date());
transpondApprovalSuggestionEntity.setOperation(TranspondApprovalSuggestionEntity.operationType.receive);
transpondApprovalSuggestionEntity.setSubmitId(actorId);
transpondApprovalSuggestionEntity.setProcessInstanceId(processInstanceId);
transpondApprovalSuggestionDao.addTranspondApprovalSuggestionEntity(transpondApprovalSuggestionEntity);
KObject staff = staffService.getById(actorId);
String flowId = processInstanceId.toString();
String userId = staff.get("user").getString("username");
OaMessageEntity oaMessageEntity = oaMessageDao.getOaMessageByFlowMessAndByFlowIdAndUserId(1, flowId, userId);
if(oaMessageEntity != null){
OaMessageEntity oaMessageEntity1 = new OaMessageEntity();
BeanUtils.copyProperties(oaMessageEntity, oaMessageEntity1);
oaMessageEntity1.setPtpUrl(oaMessageEntity.getPtpUrl()+"&show=false");
oaMessageEntity1.setMessageId(null);
oaMessageEntity1.setFlowMess(2);
oaMessageEntity1.setStatus(0);
oaMessageEntity1.setOperateTime(new Date());
// oaMessageEntity.setFlowMess(2);
// oaMessageEntity.setOperateTime(new Date());
// oaMessageDao.updateOaMessage(oaMessageEntity);
oaMessageDao.addOaMessage(oaMessageEntity1);
}
}
@Override
public void startAutoCompleteApproval(UUID bizProcessId) {
InzBizProcess inzBizProcess = inzBizProcessService.getBizProcessById(bizProcessId);
inzWorkflowService.startAutoCompleteWorkflow(inzBizProcess.getProcessInstance());
}
@Override
@Transactional
public void approvalTranspond(UUID bizProcessId,UUID loginActorId,List<UUID> actorIds, String suggestion) {
InzBizProcess inzBizProcess = inzBizProcessService.getBizProcessById(bizProcessId);
TranspondApprovalStaffEntity transpondApprovalStaffEntity = new TranspondApprovalStaffEntity();
transpondApprovalStaffEntity.setFinishTime(new Date());
transpondApprovalStaffEntity.setOperation(TranspondApprovalStaffEntity.operationType.transpond);
transpondApprovalStaffEntity.setSubmitId(loginActorId);
transpondApprovalStaffEntity.setProcessInstanceId(inzBizProcess.getProcessInstance().getId());
transpondApprovalStaffEntity.setStaffJson(actorIds.toString());
transpondApprovalStaffEntity.setSuggestion(suggestion);
transpondApprovalStaffDao.addTranspondApprovalStaffEntity(transpondApprovalStaffEntity);
for(UUID actorId : actorIds){
List<KObject> tasks = taskService.listTaskByProcessInstanceId(inzBizProcess.getProcessInstance().getId());
if(tasks.size() > 0){
KObject taskObject = tasks.get(0);
String bizObjectName = taskObject.getString("bizObjectName");
String[] names = bizObjectName.split("-");
KObject staff = staffService.getById(actorId);
OaMessageEntity oaMessageEntity = new OaMessageEntity();
oaMessageEntity.setSender("宝贝王系统");
oaMessageEntity.setSenderTime(new Date());
if(names.length>0){
oaMessageEntity.setFlowType(names[0]);
}else{
oaMessageEntity.setFlowType(taskObject.getString(Task.BIZ_TYPE_NAME));
}
oaMessageEntity.setFlowId(taskObject.get("processInstance").getUuid("id").toString());
oaMessageEntity.setTitle(bizObjectName.replaceAll("-", " "));
oaMessageEntity.setNodeName(taskObject.get("workItem").getString("workItemName"));
String url = null;
url = "/app/ApprovalCopy?bizTypeName="+taskObject.getString(Task.BIZ_TYPE_NAME)+"&bizDataId="+taskObject.getUuid("bizDataId").toString()+"&show=true&type=transpond";
oaMessageEntity.setPtpUrl(url);
oaMessageEntity.setUserId(staff.get("user").getString("username"));
oaMessageEntity.setCreator(taskObject.get("bizProcess").get("submitter").get("user").getString("username"));
oaMessageEntity.setCreateTime(taskObject.get("processInstance").getDate("startTime"));
oaMessageEntity.setOperateTime(new Date());
oaMessageEntity.setFlowMess(1);
oaMessageEntity.setViewType(0);
oaMessageEntity.setStatus(0);
oaMessageEntity.setErrorCount(0);
oaMessageEntity.setMessageCreateTime(new Date());
oaMessageEntity.setAllowMobile(0);
oaMessageEntity.setSenderCode("fb77aaf5-ad40-4307-9ca6-2e1cbd29ffee");
oaMessageEntity.setTemp1(taskObject.get("processInstance").getUuid("id").toString());
oaMessageDao.addOaMessage(oaMessageEntity);
}
}
}
}
......@@ -5,8 +5,6 @@ import java.util.Date;
import java.util.List;
import java.util.UUID;
import org.json.JSONArray;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;
......@@ -73,35 +71,23 @@ public class FlowChartInfoServiceImpl implements FlowChartInfoService{
submitActor.setActorId(inzBizProcess.getSubmitter().getUuid("id"));
nodes.add(generateStartNode(triggerAction, submitActor, startTime));
String origionDefinition = workflow.getOriginalDefinition();
JSONObject origionDefinitionJson = new JSONObject(origionDefinition);
JSONArray nodeArray = origionDefinitionJson.getJSONArray("tasks");
List<InzApprovalTask> allTask = new ArrayList<>();
allTask.addAll( inzApprovalTaskService.listApprovedTask(inzBizProcess.getProcessInstance().getId()));
allTask.addAll( inzApprovalTaskService.listToDoTask(inzBizProcess.getProcessInstance().getId()));
allTask = inzApprovalTaskService.generateParenChildRelation(allTask);
for(int i = 0 ; i < nodeArray.length() ; i++){
String nodeId = nodeArray.getJSONObject(i).getString("id");
String name = nodeArray.getJSONObject(i).getString("name");
String type = nodeArray.getJSONObject(i).getString("type");
List<InzApprovalTask> tempTasks = new ArrayList<>();
for(InzApprovalTask task : allTask){
if(nodeId.equals(task.getWorkItem().getNodeId())){
tempTasks.add(task);
}
}
if(tempTasks.size() == 0){
continue;
}
boolean last = false;
if(i == nodeArray.length() -1 ){
last = true;
}
nodes.add(generateNodeInfo(nodeId,name,type, last,tempTasks));
for(int i = 0 , length = allTask.size() ; i < length ;i++) {
String nodeId = allTask.get(i).getWorkItem().getNodeId();
String name = allTask.get(i).getWorkItem().getWorkItemName();
// ExtensionNode extensionNode = allTask.get(i).getWorkItem().getTaskNode().getExtensionNode();
String type = "userTask";
// if(extensionNode instanceof UserTaskNode) {
// type = ((UserTaskNode)extensionNode).getTaskType();
// }
List<InzApprovalTask> tempTasks = new ArrayList<InzApprovalTask>();
tempTasks.add(allTask.get(i));
nodes.add(generateNodeInfo(nodeId,name,type, false,tempTasks));
}
return chartInfo;
}
......
......@@ -7,24 +7,33 @@ import java.util.List;
import java.util.Map;
import java.util.UUID;
import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.beecode.bap.staff.BapContext;
import com.beecode.bap.workflow.dao.CommonTaskDao;
import com.beecode.bap.workflow.service.BizProcessService;
import com.beecode.bap.workflow.service.BizTaskService;
import com.beecode.bcp.task.assignment.Actor;
import com.beecode.bcp.task.core.Task;
import com.beecode.bcp.task.core.TaskState;
import com.beecode.bcp.task.define.TaskDefinition;
import com.beecode.bcp.task.service.TaskDefinitionService;
import com.beecode.bcp.type.KClass;
import com.beecode.bcp.type.KObject;
import com.beecode.bcp.workflow.core.ProcessInstance;
import com.beecode.bcp.workflow.core.WorkItem;
import com.beecode.bcp.workflow.exception.ParticipantNotFoundException;
import com.beecode.bcp.workflow.exception.WorkflowRuntimeException;
import com.beecode.bcp.workflow.task.core.WorkflowTask;
import com.beecode.inz.workflow.dao.CommonDao;
import com.beecode.inz.workflow.dao.InzApprovalTaskDao;
import com.beecode.inz.workflow.entity.InzApprovalTask;
import com.beecode.inz.workflow.exception.WorkflowExceptionCode;
import com.beecode.inz.workflow.service.ApprovalSendCopyService;
import com.beecode.inz.workflow.service.InzApprovalTaskService;
import com.beecode.inz.workflow.util.InzApprovalTaskConstants;
@Service
......@@ -42,11 +51,19 @@ public class InzApprovalTaskServiceImpl implements InzApprovalTaskService{
private InzApprovalTaskDao inzApprovalTaskDao;
@Autowired
private BizProcessService bizProcessService;
@Autowired
private CommonDao commonDao;
@Autowired
private TaskDefinitionService taskDefinitionService;
@Autowired
private ApprovalSendCopyService approvalSendCopyService;
@Autowired
private CommonTaskDao bizTaskDao;
public List<InzApprovalTask> generateParenChildRelation(List<InzApprovalTask> tasks){
Map<UUID,InzApprovalTask> parentMap = new HashMap<>();
......@@ -58,20 +75,18 @@ public class InzApprovalTaskServiceImpl implements InzApprovalTaskService{
if(null == parent){
parent = (InzApprovalTask) task.geParent();
parentMap.put(parent.getId(), parent);
List<Task> children = new ArrayList<Task>();
parent.setChildren(children);
}else if(null == parent.getChildren()){
List<Task> children = new ArrayList<Task>();
parent.setChildren(children);
}
parent.getChildren().add(task);
parent.addChildren(task);
}
};
List<InzApprovalTask> result = new ArrayList<>(parentMap.values());
List<InzApprovalTask> result = new ArrayList<InzApprovalTask>(parentMap.values());
result.sort(new Comparator<Task>() {
@Override
public int compare(Task task1, Task task2) {
return task1.getStartTime().compareTo(task2.getStartTime());
}
});
for(InzApprovalTask task : result){
if(null == task.getChildren() || task.getChildren().isEmpty()){
continue;
......@@ -100,6 +115,12 @@ public class InzApprovalTaskServiceImpl implements InzApprovalTaskService{
@Override
public void completeTask(UUID taskId, int result, String suggestions) {
completeTask(taskId, result, suggestions, null,null);
}
@Override
public void completeTask(UUID taskId, int result, String suggestions,Map<String,String> argus,String attribute1) {
// TaskDefinition taskDefinition = Amino.getApplicationMetadataContext().getBean(InzApprovalTaskConstants.TASK_DEFINITION_NAME, TaskDefinition.class);
TaskDefinition taskDefinition = taskDefinitionService.getByName(InzApprovalTaskConstants.TASK_DEFINITION_NAME);
UUID actorId = null;
try {
......@@ -109,7 +130,25 @@ public class InzApprovalTaskServiceImpl implements InzApprovalTaskService{
e1.printStackTrace();
}
try {
bizTaskService.completeTask(taskDefinition, taskId,actorId , result, suggestions);
KClass taskClass = taskDefinition.getKClass();
KObject object = bizTaskDao.getTask(taskClass, taskId);
ProcessInstance processInstance = new ProcessInstance(object.get(WorkflowTask.PROCESSINSTANCE));
String nodeId = object.get(WorkflowTask.WORKITEM).getString(WorkItem.ATTR_NODEID);
String nodeParam = null;
if(nodeId.contains("-")){
nodeParam = "n_"+String.valueOf(nodeId).replaceAll("-", "n")+"_staffs";
}else{
nodeParam = "n_"+nodeId+"_staffs";
}
Object nodeInfo = processInstance.getParameterValue(nodeParam);
if(nodeInfo != null && !nodeInfo.toString().equals("")){
argus.put(nodeParam, nodeInfo.toString());
}
if(null != attribute1){
argus.put("attribute1", attribute1);
}
bizTaskService.completeTask(taskDefinition, taskId,actorId , result, suggestions,argus);
approvalSendCopyService.sendApprovalCopy(taskId,result);
} catch (ParticipantNotFoundException e) {
logger.error("ParticipantNotFoundException", e);
throw new WorkflowRuntimeException(WorkflowExceptionCode.PARTICIPANT_NOTFOUND_EXCEPTION);
......@@ -131,12 +170,24 @@ public class InzApprovalTaskServiceImpl implements InzApprovalTaskService{
@Override
public List<InzApprovalTask> listToDoTask(UUID processInstanceId) {
try {
final UUID staffId = bapContext.getCurrentStaff().getUuid("id");
// final UUID staffId = bapContext.getCurrentStaff().getUuid("id");
KObject key = bapContext.getCurrentStaff();
UUID keyId = null;
if(null != key){
keyId = key.getUuid("id");
}else{
try{
keyId = bapContext.getCurrentUser().getId();
}catch(Exception e){
logger.info("获取待办任务列表时,没有当前登录用户,暂时给随机值");
keyId = UUID.randomUUID();
}
}
List<InzApprovalTask> tasks = inzApprovalTaskDao.listToDoTask(processInstanceId);
if(null == tasks || tasks.size() == 0){
return new ArrayList<>();
}
generateCanApprove(tasks, staffId);
generateCanApprove(tasks, keyId);
return tasks;
} catch (Exception e) {
e.printStackTrace();
......@@ -182,17 +233,28 @@ public class InzApprovalTaskServiceImpl implements InzApprovalTaskService{
}
@Override
public List<InzApprovalTask> getApprovalTasksByPend() {
UUID actorId = null;
try {
actorId = bapContext.getCurrentStaff().getUuid("id");
List<InzApprovalTask> tasks = inzApprovalTaskDao.getApprovalTasksByPend(actorId);
generateCanApprove(tasks, actorId);
return tasks;
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
public JSONObject getLastTaskByBizDataId(UUID bizDataId) {
List<KObject> kObjects = bizProcessService.listBizProcessKObject(bizDataId);
if(null == kObjects || kObjects.size() == 0){
return null;
}
kObjects.sort((a, b) -> b.getDate("submitTime").after(a.getDate("submitTime"))?1:-1);
KObject lastOne = kObjects.get(0);
KObject processInstance = lastOne.get("processInstance");
List<InzApprovalTask> tasks = listApprovedTask(processInstance.getUuid("id"));
InzApprovalTask key = tasks.size()>0?tasks.get(tasks.size()-1):null;
JSONObject result = new JSONObject();
int resultState = lastOne.getInt("workflowState");
result.put("workflowState", resultState);
if(key == null){
result.put("taskResult","1");
result.put("suggestion","同意");
}else{
result.put("taskResult",key.getResult());
result.put("suggestion",key.getSuggestion());
}
return result;
}
}
......@@ -9,6 +9,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.beecode.bap.workflow.core.BizProcess;
import com.beecode.bap.workflow.core.BizProcessState;
import com.beecode.bap.workflow.service.BizProcessService;
import com.beecode.bcp.type.KObject;
import com.beecode.inz.workflow.entity.InzBizProcess;
......@@ -46,5 +47,16 @@ public class InzBizProcessServiceImpl implements InzBizProcessService {
return kObjects.stream().map(InzBizProcess::new).collect(Collectors.toList());
}
@Override
public List<InzBizProcess> listBizProcessByBizDataIdAndStateAndNoProcessInstanceId(UUID bizDataId, BizProcessState bizProcessState,
UUID processInstanceId) {
List<KObject> kObjects = bizProcessService.listBizProcessByBizDataIdAndStateAndNoProcessInstanceId(bizDataId, bizProcessState, processInstanceId);
if(null == kObjects || kObjects.size() == 0){
return new ArrayList<>();
}
return kObjects.stream().map(InzBizProcess::new).collect(Collectors.toList());
}
}
......@@ -68,9 +68,9 @@ public class InzWorkflowDefinitionServiceImpl implements InzWorkflowDefinitionSe
String bizTypeName = definitionContent.getJSONObject(InzWorkflowDefinition.WORKFLOW_CONFIG).getJSONObject("triggerCondition").getString("bizTypeName");
kObject.set(InzWorkflowDefinition.ATTR_BIZTYPE_NAME, bizTypeName);
String workflowDefinitionName = (kObject.getString(InzWorkflowDefinition.ATTR_BIZTYPE_NAME) + "_workflow_definition"+"_"+UUID.randomUUID().toString()).toUpperCase();
JSONObject bpmnJson = WorkflowGenerator.getWorkflow(workflowDefinitionName, definitionContent.getJSONArray("tasks"));
//String workflowDefinitionName = (kObject.getString(InzWorkflowDefinition.ATTR_BIZTYPE_NAME) + "_workflow_definition"+"_"+UUID.randomUUID().toString()).toUpperCase();
//JSONObject bpmnJson = WorkflowGenerator.getWorkflow(workflowDefinitionName, definitionContent.getJSONArray("tasks"));
JSONObject bpmnJson = WorkflowGenerator.getWorkflow(kObject);
WorkflowObj workflowObj = null;
try {
workflowObj = objectMapper.readValue(bpmnJson.toString(), WorkflowObj.class);
......@@ -135,9 +135,10 @@ public class InzWorkflowDefinitionServiceImpl implements InzWorkflowDefinitionSe
KObject kObject = definition.toKObject();
kObject.set(InzWorkflowDefinition.ATTR_DEFINITION_STATE, InzWorkflowDefinitionStateEnum.ENABLED.getValue());
JSONObject definitionContent = new JSONObject(kObject.getString(InzWorkflowDefinition.ATTR_DEFINITION_CONTENT));
String workflowDefinitionName = kObject.getString(InzWorkflowDefinition.ATTR_NAME);
JSONObject bpmnJson = WorkflowGenerator.getWorkflow(workflowDefinitionName, definitionContent.getJSONArray("tasks"));
// JSONObject definitionContent = new JSONObject(kObject.getString(InzWorkflowDefinition.ATTR_DEFINITION_CONTENT));
//String workflowDefinitionName = kObject.getString(InzWorkflowDefinition.ATTR_NAME);
// JSONObject bpmnJson = WorkflowGenerator.getWorkflow(workflowDefinitionName, definitionContent.getJSONArray("tasks"));
JSONObject bpmnJson = WorkflowGenerator.getWorkflow(kObject);
WorkflowObj workflowObj = null;
try {
workflowObj = objectMapper.readValue(bpmnJson.toString(), WorkflowObj.class);
......@@ -151,12 +152,12 @@ public class InzWorkflowDefinitionServiceImpl implements InzWorkflowDefinitionSe
extendData.put("workflowDefinitionId", kObject.getUuid("id").toString());
workflowDefinitionService.updateWorkflowDefinition(workflowObj,kObject);
if(!deploymentService.isDeployed(definition)){//未发布,需要执行发布
//if(!deploymentService.isDeployed(definition)){//未发布,需要执行发布
Workflow workflow = deploymentService.deploy(definition);
if(null != workflow){
extendData.put("workflowId", workflow.getId());
}
}
//}
KObject log = logKClass.newInstance();
log.set("module",LOG_MODULE);
log.set("businessObjectId",kObject.getUuid("id").toString());
......
package com.beecode.inz.workflow.internal.service;
import java.time.Instant;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
......@@ -18,18 +19,27 @@ import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;
import com.beecode.amino.core.Amino;
import com.beecode.bap.bill.WorkflowBillConstants.FlowAttributes;
import com.beecode.bap.staff.BapContext;
import com.beecode.bap.staff.service.StaffService;
import com.beecode.bap.workflow.core.BizProcess;
import com.beecode.bap.workflow.core.BizProcessState;
import com.beecode.bap.workflow.service.BapWorkflowService;
import com.beecode.bap.workflow.service.BizProcessService;
import com.beecode.bcp.core.context.AminoContextHolder;
import com.beecode.bcp.task.core.Task;
import com.beecode.bcp.task.service.TaskService;
import com.beecode.bcp.type.KClass;
import com.beecode.bcp.type.KObject;
import com.beecode.bcp.workflow.core.ProcessInstance;
import com.beecode.bcp.workflow.core.WorkItem;
import com.beecode.bcp.workflow.entity.WorkflowRejectRecord;
import com.beecode.bcp.workflow.exception.ParticipantNotFoundException;
import com.beecode.bcp.workflow.exception.WorkflowRuntimeException;
import com.beecode.bcp.workflow.service.ProcessService;
import com.beecode.bcp.workflow.service.WorkflowRejectRecordService;
import com.beecode.bcp.workflow.task.core.WorkflowTask;
import com.beecode.bcp.workflow.task.service.WorkflowTaskService;
import com.beecode.inz.basis.condition.ConditionExecutor;
import com.beecode.inz.basis.condition.FieldValueRelation;
import com.beecode.inz.basis.condition.GroupCondition;
......@@ -38,17 +48,20 @@ import com.beecode.inz.basis.condition.SingleCondition;
import com.beecode.inz.workflow.config.WorkflowConfigurationDefinition;
import com.beecode.inz.workflow.core.InzWorkflowDefinitionStateEnum;
import com.beecode.inz.workflow.dao.CommonDao;
import com.beecode.inz.workflow.entity.ApprovalCopyEntity;
import com.beecode.inz.workflow.entity.InzApprovalTask;
import com.beecode.inz.workflow.entity.InzBizProcess;
import com.beecode.inz.workflow.entity.InzWorkflowBiztrait;
import com.beecode.inz.workflow.entity.InzWorkflowDefinition;
import com.beecode.inz.workflow.exception.StartWorkflowParticipantNotFoundException;
import com.beecode.inz.workflow.exception.WorkflowExceptionCode;
import com.beecode.inz.workflow.service.ApprovalCopyService;
import com.beecode.inz.workflow.service.BizTypeWorkflowConfigurationService;
import com.beecode.inz.workflow.service.InzApprovalTaskService;
import com.beecode.inz.workflow.service.InzWorkflowDefinitionService;
import com.beecode.inz.workflow.service.InzWorkflowService;
import com.beecode.inz.workflow.util.InzBizProcessConstants;
@Service
public class InzWorkflowServiceImpl implements InzWorkflowService{
......@@ -67,14 +80,33 @@ public class InzWorkflowServiceImpl implements InzWorkflowService{
private InzApprovalTaskService inzApprovalTaskService;
@Autowired
private BapContext bapContext;
private CommonDao commonDao;
@Autowired
private CommonDao commonDao;
private StaffService staffService;
@Autowired
private BapContext bapContext;
@Autowired
private BizTypeWorkflowConfigurationService bizTypeWorkflowConfigurationService;
@Autowired
private WorkflowRejectRecordService workflowRejectRecordService;
@Autowired
private TaskService taskService;
@Autowired
private ProcessService processService;
@Autowired
private WorkflowTaskService workflowTaskService;
@Autowired
private ApprovalCopyService approvalCopyService;
@Override
public boolean canStartWotkflow(String actionName, String bizTypeName,KObject bizData) {
WorkflowConfigurationDefinition config = bizTypeWorkflowConfigurationService.getBizTypeWorkflowConfigurationByBizTypeName(bizTypeName);
......@@ -129,17 +161,73 @@ public class InzWorkflowServiceImpl implements InzWorkflowService{
return true;
}
/**
* 根据指定modelname和id,找到对应的对象,检查无误开始一个工作流
* @param actionName
* @param bizTypeName
* @param bizObjectName
* @param modelName kclass name
* @param modelId kobject id
* @return 200:正常开始;
* 503:检查失败,无法开始工作流;
* @throws WorkflowRuntimeException
*/
@Transactional
@Override
public void startWorkflow(String actionName, String bizTypeName, String bizObjectName, KObject bizData) throws WorkflowRuntimeException {
this.startWorkflow(actionName, bizTypeName, bizObjectName, null, bizData);
public int startWorkflow(String actionName, String bizTypeName, String bizObjectName, String modelName, UUID modelId) throws WorkflowRuntimeException {
return startWorkflow(actionName,bizTypeName,bizObjectName,modelName,modelId,null);
}
@Transactional
@Override
public int startWorkflow(String actionName, String bizTypeName, String bizObjectName, String modelName, UUID modelId,String bizAffiliationName) throws WorkflowRuntimeException {
int resultValue = 200;
//1 找到对应的对象
KObject object = commonDao.load(modelName, modelId);
if(object != null) {
if(canStartWotkflow(actionName, bizTypeName, object)) {
this.startWorkflow(actionName, bizTypeName, bizObjectName, null, object, null,bizAffiliationName);
} else {
resultValue = -503;
}
} else {
// 找不到对象报错
throw new WorkflowRuntimeException("KObject is not found:" + modelName + "#" + modelId);
}
return resultValue;
}
@Transactional
@Override
public void startWorkflow(String actionName, String bizTypeName, String bizObjectName, KObject bizData)
throws WorkflowRuntimeException {
startWorkflow(actionName, bizTypeName, bizObjectName, null, bizData, null);
}
@Transactional
@Override
public void startWorkflow(String actionName, String bizTypeName, String bizObjectName, KObject bizData,
Map<String, Object> params) throws WorkflowRuntimeException {
startWorkflow(actionName, bizTypeName, bizObjectName, null, bizData, params);
}
@Transactional
@Override
public void startWorkflow(String actionName, String bizTypeName, String bizObjectName, String bizProcessName,
KObject bizData) throws WorkflowRuntimeException {
startWorkflow(actionName, bizTypeName, bizObjectName, bizProcessName, bizData, null);
}
@Transactional
@Override
public void startWorkflow(String actionName, String bizTypeName, String bizObjectName, String bizProcessName,
KObject bizData, Map<String, Object> params) throws WorkflowRuntimeException {
startWorkflow(actionName, bizTypeName, bizObjectName, bizProcessName, bizData, null,null);
}
@Transactional
@Override
public void startWorkflow(String actionName, String bizTypeName, String bizObjectName, String bizProcessName,
KObject bizData, Map<String, Object> params,String bizAffiliationName) throws WorkflowRuntimeException {
WorkflowConfigurationDefinition config = bizTypeWorkflowConfigurationService.getBizTypeWorkflowConfigurationByBizTypeName(bizTypeName);
Assert.notNull(config,"param 'config' must not be null");
List<InzWorkflowDefinition> defeinitions = inzWorkflowDefinitionService.listWorkflowDefinitionByBizTypeName(bizTypeName,true);
......@@ -166,6 +254,11 @@ public class InzWorkflowServiceImpl implements InzWorkflowService{
KObject currentLoginStaff = null;
try {
currentLoginStaff = bapContext.getCurrentStaff();
// List<KObject> staffs = staffService.getByUsername("c_user_default");
// if(null == staffs || staffs.size()<=0){
// throw new Exception();
// }
// currentLoginStaff = staffs.get(0);
} catch (Exception e) {
throw new WorkflowRuntimeException("获取当前登录用户失败!");
}
......@@ -174,13 +267,21 @@ public class InzWorkflowServiceImpl implements InzWorkflowService{
if(null == bizObjectName || bizObjectName.trim().length() == 0){
bizObjectName = config.getBizTypeInfo().getTitle()+"对象";
}
Map<String,Object> params = new HashedMap<>();
params.put("bizObjectName", bizObjectName);
params.put("bizTypeName", bizTypeName);
params.put("submitterId", currentLoginStaff.getUuid("id"));
Map<String,Object> paramsToUse = new HashedMap<>();
if (params != null) {
paramsToUse.putAll(params);
for(Map.Entry<String, Object> entry : paramsToUse.entrySet()){
if(entry.getValue().toString().equals("\"start_no_add_sign\"")){
paramsToUse.put(entry.getKey(), "");
}
}
}
paramsToUse.put("bizObjectName", bizObjectName);
paramsToUse.put("bizTypeName", bizTypeName);
paramsToUse.put("submitterId", currentLoginStaff.getUuid("id"));
ProcessInstance processInstance = null;
try {
processInstance = workflowService.startWorkflow(AminoContextHolder.getContext().getTenant(),definition, bizData,params);
processInstance = workflowService.startWorkflow(AminoContextHolder.getContext().getTenant(),definition, bizData,paramsToUse);
} catch (ParticipantNotFoundException e) {
logger.error("ParticipantNotFoundException", e);
throw new StartWorkflowParticipantNotFoundException();
......@@ -192,6 +293,7 @@ public class InzWorkflowServiceImpl implements InzWorkflowService{
KObject bizProcessKObject = Amino.getApplicationMetadataContext().getBean(InzBizProcessConstants.ENTITY_NAME, KClass.class).newInstance();
bizProcessKObject.set(InzBizProcess.ATTR_BIZOBJECTNAME, bizObjectName);
bizProcessKObject.set(InzBizProcess.ATTR_BIZAFFILIATIONNAME, bizAffiliationName);
bizProcessKObject.set(InzBizProcess.ATTR_BIZTYPENAME, bizTypeName);
bizProcessKObject.set(InzBizProcess.ATTR_TRIGGERACTION, actionName);
bizProcessKObject.set(InzBizProcess.ATTR_PROCESSINSTANCE, processInstance.toKobject());
......@@ -225,11 +327,66 @@ public class InzWorkflowServiceImpl implements InzWorkflowService{
commonDao.update(v);
});
KClass dataType = bizData.getType();
if (dataType.hasAttribute(InzWorkflowBiztrait.ATTR_APPROVESTATE)) {
bizData.set(InzWorkflowBiztrait.ATTR_APPROVESTATE, BizProcessState.IN_PROCESS.getValue());
} else if (dataType.hasAttribute(FlowAttributes.ATTR_FLOW_STAE)) {
bizData.set(FlowAttributes.ATTR_FLOW_STAE, BizProcessState.IN_PROCESS.getValue());
}
if (dataType.hasAttribute(InzWorkflowBiztrait.ATTR_BIZPROCESS)) {
bizData.set(InzWorkflowBiztrait.ATTR_BIZPROCESS, bizProcessKObject);
} else if (dataType.hasAttribute(FlowAttributes.ATTR_BIZ_PROCESS)) {
bizData.set(FlowAttributes.ATTR_BIZ_PROCESS, bizProcessKObject);
}
if (dataType.hasAttribute(FlowAttributes.ATTR_FLOW_SUBMIT_TIME)) {
bizData.set(FlowAttributes.ATTR_FLOW_SUBMIT_TIME, Instant.now());
}
if (dataType.hasAttribute(FlowAttributes.ATTR_FLOW_FINISH_TIME)) {
bizData.setNull(FlowAttributes.ATTR_FLOW_FINISH_TIME);
}
commonDao.update(bizData);
if(params != null && params.containsKey("autoComplete")){
if((boolean)params.get("autoComplete")){
BizProcess bizProcess = bizProcessService.getBizProcesByBizTypeNameAndSubmitUser(bizTypeName, bizData.getUuid("id"),currentLoginStaff.getUuid("id"));
if(bizProcess != null){
ProcessInstance rejectProcessInstance = bizProcess.getProcessInstance();
UUID rejectProcessInstanceId = rejectProcessInstance.getId();
if(rejectProcessInstance.getWorkflow().getId().equals(processInstance.getWorkflow().getId())){
ProcessInstance processInstance_ = processInstance;
WorkflowRejectRecord workflowRejetRecord= new WorkflowRejectRecord();
workflowRejetRecord.setProcessInstanceId(processInstance_.getId());
workflowRejetRecord.setRejectProcessInstanceId(rejectProcessInstanceId);
workflowRejetRecord.setState(WorkflowRejectRecordService.REJECT_STATE_START);
List<KObject> kObjects = taskService.listTaskByProcessInstanceId(rejectProcessInstanceId);
for(KObject object : kObjects){
if(99 == object.getInt(Task.RESULT)){
workflowRejetRecord.setRejectNodeId(object.get(WorkflowTask.WORKITEM).getString(WorkItem.ATTR_NODEID));
break;
}
}
if(workflowRejetRecord.getRejectNodeId() != null ){
ApprovalCopyEntity approvalCopyEntity=approvalCopyService.getApprovalCopyByprocessInstanceId(rejectProcessInstanceId);
if(approvalCopyEntity != null ){
ApprovalCopyEntity approvalCopyEntity_ = new ApprovalCopyEntity();
approvalCopyEntity_.setProcessInstanceId(processInstance_.getId());
approvalCopyEntity_.setStaffJson(approvalCopyEntity.getStaffJson());
approvalCopyService.addApprovalCopy(approvalCopyEntity_);
}
workflowRejectRecordService.addWorkflowRejectRecord(workflowRejetRecord);
processService.updateProcess(processInstance.toKobject());
}
}
}
}
}
}
@Override
public void startAutoCompleteWorkflow(ProcessInstance processInstance) {
workflowTaskService.startAutoCompleteTask(null, null, null,processInstance);
}
}
package com.beecode.inz.workflow.internal.service;
import java.util.UUID;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.beecode.inz.workflow.dao.SubmitApprovalSuggestionDao;
import com.beecode.inz.workflow.entity.InzBizProcess;
import com.beecode.inz.workflow.entity.SubmitApprovalSuggestionEntity;
import com.beecode.inz.workflow.service.InzBizProcessService;
import com.beecode.inz.workflow.service.SubmitApprovalSuggestionService;
@Service
public class SubmitApprovalSuggestionServiceImpl implements SubmitApprovalSuggestionService{
@Autowired
private SubmitApprovalSuggestionDao submitApprovalSuggestionDao;
@Autowired
private InzBizProcessService inzBizProcessService;
@Override
@Transactional
public void addSubmitApprovalSuggestion(UUID bizProcessId,String suggestion) {
InzBizProcess inzBizProcess = inzBizProcessService.getBizProcessById(bizProcessId);
SubmitApprovalSuggestionEntity submitApprovalSuggestionEntity = new SubmitApprovalSuggestionEntity();
submitApprovalSuggestionEntity.setSuggestion(suggestion);
submitApprovalSuggestionEntity.setProcessInstanceId(inzBizProcess.getProcessInstance().getId());
submitApprovalSuggestionDao.addSubmitApprovalSuggestionEntity(submitApprovalSuggestionEntity);
}
@Override
public SubmitApprovalSuggestionEntity getSubmitApprovalSuggestionByprocessInstanceId(UUID processInstanceId) {
return submitApprovalSuggestionDao.getSubmitApprovalSuggestionByprocessInstanceId(processInstanceId);
}
}
/**
*
*/
package com.beecode.inz.workflow.listener;
import org.springframework.beans.factory.annotation.Autowired;
import com.beecode.amino.core.Amino;
import com.beecode.bap.bill.Bill;
import com.beecode.bap.bill.BillService;
import com.beecode.bap.bill.WorkflowBillConstants;
import com.beecode.bap.bill.define.BillDefine;
import com.beecode.bcp.type.KObject;
import com.beecode.inz.workflow.service.WorkflowBillService;
/**
* @author huangkaibin
*
*/
public class CommonWorkflowBillProcessEventListener implements InzBizProcessEventListener {
@Autowired
private BillService billService;
@Override
public void afterProcessCompleted(InzBizProcessEvent event) {
String billDefineName = event.getInzBizProcess().getBizTypeName();
BillDefine billDefine = Amino.getApplicationMetadataContext().getBean(billDefineName, BillDefine.class);
if (event.isAgreed()) {
KObject billObj = event.getInzBizProcess().getBizDataObject();
Bill bill = billService.restoreBill(billDefine, billObj);
billService.executeAction(bill,
WorkflowBillConstants.BIZ_WORKFLOW + "." + WorkflowBillService.METHOD_APPROVE);
} else if (event.isRejected()) {
KObject billObj = event.getInzBizProcess().getBizDataObject();
Bill bill = billService.restoreBill(billDefine, billObj);
billService.executeAction(bill,
WorkflowBillConstants.BIZ_WORKFLOW + "." + WorkflowBillService.METHOD_REJECT);
}
}
public BillService getBillService() {
return billService;
}
public void setBillService(BillService billService) {
this.billService = billService;
}
}
package com.beecode.inz.workflow.listener;
import com.beecode.bap.workflow.core.BizProcessState;
import com.beecode.inz.workflow.entity.InzBizProcess;
public final class InzBizProcessEvent {
......@@ -10,4 +11,10 @@ public final class InzBizProcessEvent {
public InzBizProcess getInzBizProcess() {
return inzBizProcess;
}
public boolean isAgreed() {
return inzBizProcess.getWorkflowState() == BizProcessState.DONE_WITH_AGREE.getValue();
}
public boolean isRejected() {
return inzBizProcess.getWorkflowState() == BizProcessState.DONE_WITH_REJECT.getValue();
}
}
package com.beecode.inz.workflow.listener;
public interface InzBizProcessEventListener {
void beforeProcessStarted(InzBizProcessEvent event);
default void beforeProcessStarted(InzBizProcessEvent event) {
}
void afterProcessStarted(InzBizProcessEvent event);
default void afterProcessStarted(InzBizProcessEvent event) {
void beforeProcessCompleted(InzBizProcessEvent event);
}
void afterProcessCompleted(InzBizProcessEvent event);
default void beforeProcessCompleted(InzBizProcessEvent event) {
}
default void afterProcessCompleted(InzBizProcessEvent event) {
}
}
package com.beecode.inz.workflow.listener;
import org.springframework.context.ApplicationEvent;
public class RTWorkFlowEvent extends ApplicationEvent{
private String type;
/**
*
*/
private static final long serialVersionUID = 1L;
public RTWorkFlowEvent(Object source) {
super(source);
}
public RTWorkFlowEvent(Object source,String type) {
super(source);
this.type = type;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
}
......@@ -4,6 +4,7 @@ import java.util.UUID;
import org.springframework.beans.factory.annotation.Autowired;
import com.beecode.amino.core.Amino;
import com.beecode.bap.workflow.core.BizProcess;
import com.beecode.bap.workflow.core.CommonTask;
import com.beecode.bcp.task.event.TaskEvent;
......@@ -16,6 +17,7 @@ public class TaskEventListenerImpl implements TaskEventListener{
@Autowired
private InzBizProcessService inzBizProcessService;
@Override
public void beforeTaskStartedEvent(TaskEvent event) {
// TODO Auto-generated method stub
......@@ -58,8 +60,7 @@ public class TaskEventListenerImpl implements TaskEventListener{
@Override
public void afterTaskStartedEvent(TaskEvent event) {
// TODO Auto-generated method stub
Amino.getApplicationContext().publishEvent(new RTWorkFlowEvent(event,"after_started"));
}
@Override
......@@ -70,7 +71,7 @@ public class TaskEventListenerImpl implements TaskEventListener{
@Override
public void afterTaskCompletedEvent(TaskEvent event) {
Amino.getApplicationContext().publishEvent(new RTWorkFlowEvent(event,"after_completed"));
}
@Override
......
......@@ -16,6 +16,7 @@ import com.beecode.bcp.participant.core.ParticipantStrategy;
import com.beecode.bcp.participant.core.User;
import com.beecode.bcp.type.KObject;
import com.beecode.bcp.type.json.JSONObjectUtils;
import com.beecode.bcp.workflow.core.ProcessInstance;
import com.fasterxml.jackson.databind.JsonNode;
public class CommomParticipantStrategy implements ParticipantStrategy{
......@@ -35,6 +36,36 @@ public class CommomParticipantStrategy implements ParticipantStrategy{
final List<Participant> participants = new ArrayList<>();
KObject task = (KObject)params.get("task");
ProcessInstance processInstance = (ProcessInstance)params.get("processinstance");
if(task != null && processInstance != null){
String nodeId = task.get("workItem").getString("nodeId");
String nodeParam = null;
if(nodeId.contains("-")){
nodeParam = "p_"+String.valueOf(nodeId).replaceAll("-", "p")+"_staffs";
}else{
nodeParam = "p_"+nodeId+"_staffs";
}
String staffsContent = (String)processInstance.getParameterValue(nodeParam);
if(null != staffsContent && !"".equals(staffsContent)) {
JsonNode staffsJson = JSONObjectUtils.toJson(staffsContent);
staffsJson.forEach((staffJson)->{
KObject staff = staffService.getById(UUID.fromString(staffJson.asText()));
if(null == staff||staff.isNull()) {
return;
}
if(staff.get(Staff.USER).getBoolean(Staff.ENABLED)){
participants.add(new User(staff.getUuid("id")));
}
});
return participants;
}
}
if(null != params.get(PARAM_STAFFS)){
JsonNode staffsJson = JSONObjectUtils.toJson(params.get(PARAM_STAFFS).toString());
staffsJson.forEach((staffJson)->{
......
package com.beecode.inz.workflow.participant;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.stream.Collectors;
import org.springframework.beans.factory.annotation.Autowired;
import com.beecode.bap.org.service.BapOrgDetailService;
import com.beecode.bap.staff.Staff;
import com.beecode.bap.staff.service.StaffService;
import com.beecode.bcp.authz.service.RoleService;
import com.beecode.bcp.core.Department;
import com.beecode.bcp.participant.core.Participant;
import com.beecode.bcp.participant.core.ParticipantStrategy;
import com.beecode.bcp.participant.core.User;
import com.beecode.bcp.type.KObject;
import com.beecode.bcp.type.json.JSONObjectUtils;
import com.fasterxml.jackson.databind.JsonNode;
/**
* 提交人所在单位及其上级单位(按照路径匹配)中
* 符合指定角色的职员,即为该参与者策略的策略者。
* 解释:
* 和提交人有直接或者间接上下级(向上)关系的
* @author jiaokai
*/
public class SubmitOrgPathAppointRoleParticipantStrategy implements ParticipantStrategy {
private static String PARAM_ROLES = "roles";
private static final String SUBMITTER_ID = "submitterId";
@Autowired
private RoleService roleService;
@Autowired
private StaffService staffService;
@Autowired
private BapOrgDetailService orgService;
@Override
public List<Participant> getParticipant(Map<String, Object> params) {
final List<Participant> participants = new ArrayList<>();
List<KObject> staffsAll = new ArrayList<>();
if(null != params.get(PARAM_ROLES)){
JsonNode rolesJson = JSONObjectUtils.toJson(params.get(PARAM_ROLES));
rolesJson.forEach((role)->{
UUID roleId = UUID.fromString(role.asText());
staffsAll.addAll( this.findStaffByRoleId(roleId));
});
}
UUID submitterId = UUID.fromString(params.get(SUBMITTER_ID).toString());
KObject submitterKObj = staffService.getById(submitterId);
UUID submitOrgId = submitterKObj.get(Staff.DEPARTMENT).getUuid(Department.PROP_ORG_ID);
Map<String, KObject> submitOrgDetail = orgService.getByOrgId(submitOrgId);
String submitOrgParents = submitOrgDetail.get("parents").getString();
for(KObject staff : staffsAll){
UUID staffOrgId = staff.get(Staff.DEPARTMENT).getUuid(Department.PROP_ORG_ID);
String keyIdStr = staffOrgId.toString().replaceAll("-", "").toUpperCase();
if(submitOrgParents.indexOf(keyIdStr)>=0){
participants.add(new User(staff.getUuid("id")));
}
}
return participants;
}
public List<KObject> findStaffByRoleId(UUID id) {
List<KObject> staffs = new ArrayList<>();
List<com.beecode.bcp.User> users = roleService.getUsers(id);
if (users != null && users.size() > 0) {
staffs = users.stream().map(com.beecode.bcp.User::getId).map(staffService::getByUserId).collect(Collectors.toList());
}
return staffs;
}
}
package com.beecode.inz.workflow.participant;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.stream.Collectors;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import com.beecode.bap.core.dao.OrganizationDao;
import com.beecode.bap.staff.Staff;
import com.beecode.bap.staff.service.StaffService;
import com.beecode.bap.workflow.constants.BizProcessConstant;
import com.beecode.bcp.authz.service.RoleService;
import com.beecode.bcp.core.Organization;
import com.beecode.bcp.participant.core.Participant;
import com.beecode.bcp.participant.core.ParticipantStrategy;
import com.beecode.bcp.participant.core.User;
import com.beecode.bcp.type.KObject;
import com.beecode.bcp.type.json.JSONObjectUtils;
import com.beecode.bcp.workflow.core.ProcessInstance;
import com.beecode.inz.workflow.dao.CommonDao;
import com.fasterxml.jackson.databind.JsonNode;
/**
* 提交人所在子公司及总部
* 符合指定角色的职员,即为该参与者策略的策略者。
* 解释:
*
* @author jk
*/
public class SubmiterSubsidiaryRoleParticipantStrategy implements ParticipantStrategy {
private static String PARAM_ROLES = "roles";
@Autowired
private RoleService roleService;
@Autowired
private StaffService staffService;
@Autowired
private CommonDao commonDao;
@Autowired
private OrganizationDao orgDao;
@Override
public List<Participant> getParticipant(Map<String, Object> params) {
final List<Participant> participants = new ArrayList<>();
List<KObject> staffs = new ArrayList<>();
if(null != params.get(PARAM_ROLES)){
JsonNode rolesJson = JSONObjectUtils.toJson(params.get(PARAM_ROLES));
rolesJson.forEach((role)->{
UUID roleId = UUID.fromString(role.asText());
staffs.addAll( this.findStaffByRoleId(roleId));
});
}
ProcessInstance pi = (ProcessInstance) params.get("processinstance");
// if(null == pi){
// for(KObject staff : staffs){
// participants.add(new User(staff.getUuid("id")));
// }
// return participants;
// }
String bizParamsStr = pi.getParameters();
JSONObject bizParams = new JSONObject(bizParamsStr);
UUID dataId = UUID.fromString(bizParams.getString(BizProcessConstant.BIZ_DATA_ID));
KObject assetPackage = null;
String bizTypeName = bizParams.getString(BizProcessConstant.BIZ_TYPE_NAME);
if(bizTypeName.equals("Enroll")){
KObject enroll = commonDao.load("rongtong.zhaoshang.datamodel.Enroll", dataId);
assetPackage = enroll.get("assetPackage");
}else if(bizTypeName.equals("Deposit")){
KObject deposit = commonDao.load("rongtong.zhaoshang.datamodel.DepositRecord", dataId);
assetPackage = deposit.get("enroll").get("assetPackage");
}
KObject subsidiary = assetPackage.get("subsidiary");
Organization org = orgDao.getOrgByCode(subsidiary.getString("name"));
UUID orgId = org.getId();
for(KObject staff : staffs){
if(orgId.equals(staff.get(Staff.DEPARTMENT).getUuid("orgId"))){
participants.add(new User(staff.getUuid("id")));
}
}
return participants;
}
public List<KObject> findStaffByRoleId(UUID id) {
List<KObject> staffs = new ArrayList<>();
List<com.beecode.bcp.User> users = roleService.getUsers(id);
if (users != null && users.size() > 0) {
staffs = users.stream().map(com.beecode.bcp.User::getId).map(staffService::getByUserId).collect(Collectors.toList());
}
return staffs;
}
}
package com.beecode.inz.workflow.pojo;
import java.util.List;
public class ApprovalNodesObj {
public enum NodeType{
normal,addSign,changeStaff;
}
private int approvalResult;
private String id;
private String name;
private String currentStore;
private NodeType type;
private List<com.beecode.inz.workflow.entity.UserAssignment> approvalUsers;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<com.beecode.inz.workflow.entity.UserAssignment> getApprovalUsers() {
return approvalUsers;
}
public void setApprovalUsers(List<com.beecode.inz.workflow.entity.UserAssignment> approvalUsers) {
this.approvalUsers = approvalUsers;
}
public int getApprovalResult() {
return approvalResult;
}
public void setApprovalResult(int approvalResult) {
this.approvalResult = approvalResult;
}
public String getCurrentStore() {
return currentStore;
}
public void setCurrentStore(String currentStore) {
this.currentStore = currentStore;
}
public NodeType getType() {
return type;
}
public void setType(NodeType type) {
this.type = type;
}
}
......@@ -10,6 +10,7 @@ import com.beecode.inz.workflow.entity.InzApprovalTask;
import com.beecode.inz.workflow.entity.UserAssignment;
public class InzApprovalTaskObj {
private String name;
private UUID taskId;
private Date approvalTime;
private Date startTime;
......@@ -25,6 +26,7 @@ public class InzApprovalTaskObj {
private List<InzApprovalTaskObj> children;
public InzApprovalTaskObj(InzApprovalTask task){
this.name = task.getName();
this.taskId = task.getId();
this.approvalTime = task.getFinishTime();
this.taskState = task.getTaskState().getValue();
......@@ -43,6 +45,8 @@ public class InzApprovalTaskObj {
action = "已通过";
}else if(task.getResult() == 99){
action = "已驳回";
}else if(task.getResult() == 50){
action = "已退回";
}
this.taskState = task.getTaskState().getValue();
this.bizObjectName = task.getBizObjectName();
......@@ -62,6 +66,14 @@ public class InzApprovalTaskObj {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public boolean isCanApprove() {
return canApprove;
}
......
package com.beecode.inz.workflow.pojo;
import java.util.Date;
import java.util.List;
import com.beecode.inz.workflow.entity.UserAssignment;
public class WorkflowRecordsObj {
private String name;
private String operation;
private String suggestion;
private Date finishTime;
private UserAssignment approvalUser;
private List<UserAssignment> receiverUser;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getOperation() {
return operation;
}
public void setOperation(String operation) {
this.operation = operation;
}
public String getSuggestion() {
return suggestion;
}
public void setSuggestion(String suggestion) {
this.suggestion = suggestion;
}
public Date getFinishTime() {
return finishTime;
}
public void setFinishTime(Date finishTime) {
this.finishTime = finishTime;
}
public UserAssignment getApprovalUser() {
return approvalUser;
}
public void setApprovalUser(UserAssignment approvalUser) {
this.approvalUser = approvalUser;
}
public List<UserAssignment> getReceiverUser() {
return receiverUser;
}
public void setReceiverUser(List<UserAssignment> receiverUser) {
this.receiverUser = receiverUser;
}
}
package com.beecode.inz.workflow.query;
import java.util.List;
import java.util.UUID;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -8,7 +9,9 @@ import com.beecode.inz.query.entity.RowData;
import com.beecode.inz.query.processor.DataProcessor;
import com.beecode.inz.query.processor.DataProcessorContext;
import com.beecode.inz.workflow.config.WorkflowConfigurationDefinition;
import com.beecode.inz.workflow.entity.InzBizProcess;
import com.beecode.inz.workflow.service.BizTypeWorkflowConfigurationService;
import com.beecode.inz.workflow.service.InzBizProcessService;
public class InzApprovalTaskQueryDataProcessor implements DataProcessor{
......@@ -16,9 +19,13 @@ public class InzApprovalTaskQueryDataProcessor implements DataProcessor{
private BizTypeWorkflowConfigurationService bizTypeWorkflowConfigurationService;
private static final String BIZ_TYPE_NAME = "bizTypeName";
private static final String BIZ_PROCESS_ID = "bizProcess.id";
private static final String BIZT_YPETITLE_V = "bizTypeTitle_v";
private static final String ASSET_PACKAGE_TITLE = "assetPackageTitle";
@Autowired
private InzBizProcessService inzBizProcessService;
@Override
public void process(DataProcessorContext context) {
......@@ -34,6 +41,12 @@ public class InzApprovalTaskQueryDataProcessor implements DataProcessor{
}
String bizTypeTitle_v = config.getBizTypeInfo().getTitle();
row.put(BIZT_YPETITLE_V, bizTypeTitle_v);
if(null == row.get(BIZ_PROCESS_ID)){
continue;
}
UUID bizProcessId = UUID.fromString(row.get(BIZ_PROCESS_ID).toString());
InzBizProcess process = inzBizProcessService.getBizProcessById(bizProcessId);
row.put(ASSET_PACKAGE_TITLE, process.getBizAffiliationName());
}
}
......
......@@ -33,7 +33,14 @@ public class InzWorkflowDefinitionQueryDataProcessor implements DataProcessor{
return;
}
for(RowData row : rowDatas){
String bizTypeName = row.get(BIZ_TYPE_NAME).toString();
Object bizTypeNameObj = row.get(BIZ_TYPE_NAME);
String bizTypeName = "";
if(bizTypeNameObj == null){
bizTypeName = "未填写";
continue;
}else{
bizTypeName = bizTypeNameObj.toString();
}
WorkflowConfigurationDefinition config = bizTypeWorkflowConfigurationService.getBizTypeWorkflowConfigurationByBizTypeName(bizTypeName);
if(null == config){
continue;
......
package com.beecode.inz.workflow.service;
import java.util.List;
import java.util.UUID;
import com.beecode.bcp.type.KObject;
import com.beecode.inz.workflow.entity.ApprovalCopyEntity;
public interface ApprovalCopyService {
void approvalCopy(UUID bizProcessId,String actors);
void completedApprovalCopy(UUID processInstanceId,String suggestion);
void addApprovalCopy(ApprovalCopyEntity approvalCopyEntity);
ApprovalCopyEntity getApprovalCopyByprocessInstanceId(UUID processInstanceId);
List<KObject> getApprovalCopyStaffByprocessInstanceId(UUID processInstanceId);
}
package com.beecode.inz.workflow.service;
import java.util.List;
import java.util.UUID;
import com.beecode.inz.workflow.entity.InzBizProcess;
import com.beecode.inz.workflow.pojo.ApprovalNodesObj;
public interface ApprovalNodeService {
List<ApprovalNodesObj> listApprovalNodeByInzBizProcess(InzBizProcess inzBizProcess,String storeJson,Boolean isEquipment);
List<ApprovalNodesObj> listDefinitionApprovalNodeByBizTypeName(String bizTypeName,String storeJson,UUID bizDataId,String define,String disposeType,Boolean isEquipment);
}
......@@ -4,7 +4,9 @@ import java.util.List;
import com.beecode.inz.workflow.entity.ApprovalRecord;
import com.beecode.inz.workflow.entity.InzBizProcess;
import com.beecode.inz.workflow.pojo.WorkflowRecordsObj;
public interface ApprovalRecordService {
List<ApprovalRecord> listApprovalRecordByProcessInstance(InzBizProcess inzBizProcess);
List<WorkflowRecordsObj> listWorkflowRecordByProcessInstance(InzBizProcess inzBizProcess);
}
package com.beecode.inz.workflow.service;
import java.util.UUID;
public interface ApprovalSendCopyService {
void sendApprovalCopy(UUID taskId,int result);
}
package com.beecode.inz.workflow.service;
import java.util.List;
import java.util.UUID;
public interface ApprovalTranspondService {
void approvalTranspond(UUID bizProcessId,List<UUID> actorIds,String type,String url,String suggestion);
void approvalTranspond(UUID bizProcessId,UUID loginActorId,List<UUID> actorIds,String suggestion);
void startAutoCompleteApproval(UUID bizProcessId);
void completedApprovalTranspond(UUID processInstanceId,String suggestion);
}
package com.beecode.inz.workflow.service;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import org.json.JSONObject;
import com.beecode.bcp.workflow.exception.WorkflowRuntimeException;
import com.beecode.inz.workflow.entity.InzApprovalTask;
public interface InzApprovalTaskService {
void completeTask(UUID taskId,int result,String suggestions) throws WorkflowRuntimeException;
void completeTask(UUID taskId,int result,String suggestions,Map<String,String> argus,String attribute1) throws WorkflowRuntimeException;
/**
* 根据流程查询已审批的任务列表
* 按照审批完成时间升序
......@@ -29,8 +33,5 @@ public interface InzApprovalTaskService {
List<InzApprovalTask> generateParenChildRelation(List<InzApprovalTask> tasks);
/**
* 查询自己待审批的任务列表
*/
List<InzApprovalTask> getApprovalTasksByPend();
JSONObject getLastTaskByBizDataId(UUID bizDataId);
}
......@@ -3,10 +3,12 @@ package com.beecode.inz.workflow.service;
import java.util.List;
import java.util.UUID;
import com.beecode.bap.workflow.core.BizProcessState;
import com.beecode.inz.workflow.entity.InzBizProcess;
public interface InzBizProcessService {
InzBizProcess getBizProcessByWorkflowProcessInstanceId(UUID processInstanceId);
List<InzBizProcess> listBizProcessByBizDataId(UUID bizData);
List<InzBizProcess> listBizProcessByBizDataIdAndStateAndNoProcessInstanceId(UUID bizDataId,BizProcessState state,UUID processInstanceId);
InzBizProcess getBizProcessById(UUID id) ;
}
package com.beecode.inz.workflow.service;
import java.util.UUID;
import java.util.Map;
import com.beecode.bcp.type.KObject;
import com.beecode.bcp.workflow.core.ProcessInstance;
import com.beecode.bcp.workflow.exception.WorkflowRuntimeException;
public interface InzWorkflowService {
......@@ -19,6 +23,17 @@ public interface InzWorkflowService {
* @param actionName 动作标识
* @param bizTypeName 业务类型标识
* @param bizObjectName 对象名称
* @param bizData 业务数据
* @param params 启动参数
* @throws WorkflowRuntimeException 工作流异常
*/
void startWorkflow(String actionName,String bizTypeName,String bizObjectName,KObject bizData, Map<String,Object> params) throws WorkflowRuntimeException;
/**
*
* @param actionName 动作标识
* @param bizTypeName 业务类型标识
* @param bizObjectName 对象名称
* @param bizProcessName 业务流程实例名称,是一段描述性的文本,用来表示当前的审批业务场景
* @param bizData 业务数据
* @throws WorkflowRuntimeException
......@@ -28,8 +43,38 @@ public interface InzWorkflowService {
*
* @param actionName 动作标识
* @param bizTypeName 业务类型标识
* @param bizObjectName 对象名称
* @param bizProcessName 业务流程实例名称,是一段描述性的文本,用来表示当前的审批业务场景
* @param bizData 业务数据
* @param params 启动参数
* @throws WorkflowRuntimeException
*/
void startWorkflow(String actionName,String bizTypeName,String bizObjectName,String bizProcessName,KObject bizData, Map<String,Object> params) throws WorkflowRuntimeException;
void startWorkflow(String actionName,String bizTypeName,String bizObjectName,String bizProcessName,KObject bizData, Map<String,Object> params,String bizAffiliationName) throws WorkflowRuntimeException;
/**
*
* @param actionName 动作标识
* @param bizTypeName 业务类型标识
* @param bizData 业务数据
* @return
*/
boolean canStartWotkflow(String actionName,String bizTypeName,KObject bizData);
void startAutoCompleteWorkflow(ProcessInstance processInstance);
/**
* 根据指定modelname和id,找到对应的对象,检查无误开始一个工作流
* @param actionName
* @param bizTypeName
* @param bizObjectName
* @param modelName kclass name
* @param modelId kobject id
* @return 200:正常开始;
* 503:检查失败,无法开始工作流;
* @throws WorkflowRuntimeException
*/
int startWorkflow(String actionName, String bizTypeName, String bizObjectName, String modelName, UUID modelId)
throws WorkflowRuntimeException;
int startWorkflow(String actionName, String bizTypeName, String bizObjectName, String modelName, UUID modelId,String bizAffiliationName)
throws WorkflowRuntimeException;
}
package com.beecode.inz.workflow.service;
import java.util.UUID;
import com.beecode.inz.workflow.entity.SubmitApprovalSuggestionEntity;
public interface SubmitApprovalSuggestionService {
void addSubmitApprovalSuggestion(UUID bizProcessId,String suggestion);
SubmitApprovalSuggestionEntity getSubmitApprovalSuggestionByprocessInstanceId(UUID processInstanceId);
}
/**
*
*/
package com.beecode.inz.workflow.service;
import java.util.Map;
import org.springframework.lang.Nullable;
import com.beecode.bap.bill.Bill;
import com.beecode.bap.bill.WorkflowBillConstants;
import com.beecode.bap.bill.annotations.Autoparam;
import com.beecode.bcp.biz.BizServiceInterface;
import com.beecode.bcp.biz.Parameter;
/**
* @author huangkaibin
*
*/
@BizServiceInterface(WorkflowBillConstants.BIZ_WORKFLOW)
public interface WorkflowBillService {
String METHOD_SUBMIT = "submit";
String METHOD_APPROVE = "approve";
String METHOD_REJECT = "reject";
/**
* 提交单据到工作流
* @param bill 单据
* @param params 启动工作流的参数,可以传<code>null</code>
* @return 默认情况下提交给工作流后返回<code>null</code>,如果没有配置工作流,就调用{@link #approve(Bill)}方法并返回结果。o
*/
Object submit(@Autoparam Bill bill, @Nullable @Parameter(optional = true) Map<String, Object> params);
/**
* 工作流审批同意后执行的动作
* @param bill 单据
* @return 由业务决定具体返回内容
*/
Object approve(@Autoparam Bill bill);
/**
* 工作流审批拒绝后执行的动作
* @param bill 单据
* @return 由业务决定具体返回内容
*/
Object reject(@Autoparam Bill bill);
}
/**
*
*/
package com.beecode.inz.workflow.service.support;
import java.time.Instant;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import com.beecode.bap.bill.Bill;
import com.beecode.bap.bill.BillConstants.BillStates;
import com.beecode.bap.bill.BillConstants.MasterAttributes;
import com.beecode.bap.bill.WorkflowBillConstants;
import com.beecode.bap.bill.WorkflowBillConstants.FlowAttributes;
import com.beecode.bap.bill.WorkflowBillConstants.FlowStates;
import com.beecode.bap.bill.data.BillData;
import com.beecode.bap.bill.support.BillDataExt;
import com.beecode.bap.workflow.service.BizProcessService;
import com.beecode.bcp.biz.BizServiceImplement;
import com.beecode.bcp.type.KClass;
import com.beecode.bcp.type.KObject;
import com.beecode.inz.workflow.service.InzWorkflowService;
import com.beecode.inz.workflow.service.WorkflowBillService;
/**
* @author huangkaibin
*
*/
@BizServiceImplement(WorkflowBillConstants.WORKFLOW_BILL_MASTER_BASE)
public abstract class AbstractWorkflowBillService implements WorkflowBillService {
protected final Logger logger = LoggerFactory.getLogger(getClass());
@Autowired
protected InzWorkflowService workflowService;
@Autowired
protected BizProcessService bizProcessService;
@Transactional
@Override
public Object submit(Bill bill, Map<String, Object> params) {
return submitToWorkflow(bill, METHOD_SUBMIT, null, params);
}
protected Object submitToWorkflow(Bill bill, String action, String bizObjectName, Map<String, Object> params) {
String bizTypeName = bill.getDefine().getName();
bizObjectName = bizObjectName == null ? bill.getCode() : bizObjectName;
BillData billData = bill.getData();
billData.set(MasterAttributes.ATTR_BILL_STATE, BillStates.HANDLING);
KObject bizData = ((BillDataExt) billData).toKObject();
if (workflowService.canStartWotkflow(action, bizTypeName, bizData)) {
workflowService.startWorkflow(action, bizTypeName, bizObjectName, bizData, params);
return null;
} else {
KClass clz = bill.getDefine().getDataType();
if (clz.hasAttribute(FlowAttributes.ATTR_FLOW_STAE)) {
billData.set(FlowAttributes.ATTR_FLOW_STAE, FlowStates.APPROVED);
}
Instant time = Instant.now();
if (clz.hasAttribute(FlowAttributes.ATTR_FLOW_SUBMIT_TIME)) {
billData.set(FlowAttributes.ATTR_FLOW_SUBMIT_TIME, time);
}
if (clz.hasAttribute(FlowAttributes.ATTR_FLOW_FINISH_TIME)) {
billData.set(FlowAttributes.ATTR_FLOW_FINISH_TIME, time);
}
return approve(bill);
}
}
// @Transactional
@Override
public Object reject(Bill bill) {
// BillData billData = bill.getData();
// billData.set(MasterAttributes.ATTR_BILL_STATE, BillStates.SAVED);
// KClass clz = bill.getDefine().getDataType();
// if (clz.hasAttribute(FlowAttributes.ATTR_FLOW_STAE)) {
// billData.set(FlowAttributes.ATTR_FLOW_STAE, FlowStates.REJECTED);
// }
// Instant time = Instant.now();
// if (clz.hasAttribute(FlowAttributes.ATTR_FLOW_SUBMIT_TIME)) {
// billData.set(FlowAttributes.ATTR_FLOW_SUBMIT_TIME, time);
// }
// if (clz.hasAttribute(FlowAttributes.ATTR_FLOW_FINISH_TIME)) {
// billData.set(FlowAttributes.ATTR_FLOW_FINISH_TIME, time);
// }
return null;
}
public InzWorkflowService getWorkflowService() {
return workflowService;
}
public void setWorkflowService(InzWorkflowService workflowService) {
this.workflowService = workflowService;
}
}
package com.beecode.inz.workflow.util;
import java.util.UUID;
......@@ -5,7 +6,220 @@ import java.util.UUID;
import org.json.JSONArray;
import org.json.JSONObject;
import com.beecode.bcp.type.KObject;
import com.beecode.inz.workflow.entity.InzWorkflowDefinition;
public class WorkflowGenerator {
/**
* 按照GOJS编辑出来的json格式生成BPMN格式
* @param workflowDefinitionName
* @param workflowConent
* @return
*/
public static JSONObject getWorkflow(KObject workflowObject) {
JSONObject workflow = new JSONObject();
JSONObject definitionContentJSON = new JSONObject(new JSONObject(workflowObject.getObject("definitionContent").toString()).get("workflowConfig").toString());
String taskName = definitionContentJSON.optString("taskName").replaceAll(" ", "");
String name = workflowObject.getString("name");
if(null == name||name.equals(""))
name = (workflowObject.getString(InzWorkflowDefinition.ATTR_BIZTYPE_NAME) + "_workflow_definition"+"_"+UUID.randomUUID().toString()).toUpperCase();
String title = workflowObject.getString("title");
workflow.put("name", name);
workflow.put("title", title);
workflow.put("description", title);
workflow.put("mainProcess", name);
workflow.put("processes", new JSONArray());
JSONArray processesArray = workflow.getJSONArray("processes");
JSONObject process = new JSONObject();
processesArray.put(process);
process.put("id", name);
process.put("terminateEvents", new JSONArray());
process.put("serviceTasks", new JSONArray());
process.put("userTasks", new JSONArray());
process.put("countersignTasks", new JSONArray());
process.put("subProcesses", new JSONArray());
//process.put("parallelGateways", new JSONArray());
process.put("boundaryEvents", new JSONArray());
process.put("processParameters", new JSONArray());
JSONArray endEvents = new JSONArray();
JSONArray tasks = new JSONArray();
JSONArray countersignTasks = new JSONArray();
JSONArray parallelGateways = new JSONArray();//并行网关
JSONArray exclusiveGateways = new JSONArray();//排他网关
process.put("processParameters", generateProcessParameters());
JSONObject diagramObject = new JSONObject(workflowObject.getString("diagram"));
JSONArray nodes = diagramObject.getJSONArray("nodeDataArray");
for(int i = 0 , length = nodes.length() ; i < length ; i++) {
JSONObject node = nodes.getJSONObject(i);
String x = "0" , y = "0" ,width = "100" ,height = "20";
if(node.has("loc")) {
String loc = node.getString("loc");
String [] locs = loc.split(" ");
if(locs.length >= 2) {
x = locs[0];
y = locs[1];
}
}
if(node.has("size")) {
String size = node.getString("size");
String [] sizes = size.split(" ");
if(sizes.length >= 2) {
width = sizes[0] ;
height = sizes[1];
}
}
String category = node.getString("category");
switch(category) {
case "event":
int dimension = node.getInt("eventDimension");
if(dimension == 1 ) {
generateProcessParameters(process,node.getInt("key"));
JSONObject startObject = generateStartEvent(node);
startObject.put("x", x);
startObject.put("y", y);
startObject.put("width", width);
startObject.put("height", height);
//startObject.put("outputs", generateTaskOutputs(node.getInt("key")));
process.put("startEvent", startObject);
}else if(dimension == 8) {
JSONObject endObject = generateEndEvents(node);
endObject.put("x", x);
endObject.put("y", y);
endObject.put("width", width);
endObject.put("height", height);
endEvents.put(endObject);
}
break;
case "activity":
generateProcessParameters(process,node.getInt("key"));
String type = null;
if(node.has("type")){
type = node.getString("type");
}
int taskType = node.getInt("taskType");
String taskTaskName = node.getString("taskName");
Boolean allowAuto = null;
Boolean temporary = null;
if(node.has("allowAuto")){
allowAuto = node.getBoolean("allowAuto");
}
if(node.has("temporary")){
temporary = node.getBoolean("temporary");
}
if(taskType == 2) { // 人工任务
JSONObject task = new JSONObject();
task.put("id", String.valueOf(node.getInt("key")));
task.put("name", node.getString("text"));
// if(null != taskTaskName&&!"".equals(taskTaskName)) {
// taskName = taskTaskName;
// }
task.put("task", generateTaskDefinitionConfig((taskTaskName !=null && !"".equals(taskTaskName))?taskTaskName:taskName));
task.put("participationStrategies",
generateParticipationStrategies(node.getJSONArray("participationStrategies")));
task.put("outputs", generateTaskOutputs(node.getInt("key")));
task.put("x", x);
task.put("y", y);
task.put("width", width);
task.put("height", height);
task.put("allowAuto", allowAuto !=null ?allowAuto:false);
task.put("temporary", temporary !=null ?temporary:false);
if(type == null || "userTask".equals(type)){
tasks.put(task);
}else if("countersignTask".equals(type)){
countersignTasks.put(task);
}
}
break;
case "gateway":
//{"loc":"-160 -200","gatewayType":4,"text":"排他网关","category":"gateway","key":204}
int gatewayType = node.getInt("gatewayType");
if(gatewayType == 4){//排他网关
JSONObject gateway = new JSONObject();
generateProcessParameters(process,node.getInt("key"));
gateway.put("id", String.valueOf(node.getInt("key")));
gateway.put("name", node.getString("text"));
gateway.put("direction", "diverging");
gateway.put("x", x);
gateway.put("y", y);
gateway.put("width", width);
gateway.put("height", height);
gateway.put("outputs", generateTaskOutputs(node.getInt("key")));
exclusiveGateways.put(gateway);
}
default:
break;
}
}
JSONArray sequenceFlows = diagramObject.getJSONArray("linkDataArray");
JSONArray conditionFlows = generateConditionFlows(sequenceFlows);
process.put("sequenceFlows", generateSequenceFlows(sequenceFlows));
process.put("conditionFlows", conditionFlows);
process.put("userTasks",tasks);
process.put("countersignTasks",countersignTasks);
process.put("endEvents",endEvents);
process.put("exclusiveGateways", exclusiveGateways);
process.put("parallelGateways", parallelGateways);
return workflow;
}
private static JSONArray generateSequenceFlows(JSONArray flows) {
if(null == flows||flows.length() == 0)
return new JSONArray();
JSONArray result = new JSONArray();
for(int i = 0 , length = flows.length() ; i < length ; i++) {
JSONObject sequenceFlow = flows.getJSONObject(i);
JSONObject flow = new JSONObject();
flow.put("id", UUID.randomUUID());
String name = "SequenceFlow" + i;
if(sequenceFlow.has("item")) {
name = sequenceFlow.getString("item");
}
flow.put("name", name);
flow.put("sourceRef", String.valueOf(sequenceFlow.getInt("from")));
flow.put("targetRef", String.valueOf(sequenceFlow.getInt("to")));
flow.put("points", new JSONArray());
if(!sequenceFlow.has("expression") ) {
result.put(flow);
}
}
return result;
}
private static JSONArray generateConditionFlows(JSONArray flows) {
if(null == flows||flows.length() == 0)
return new JSONArray();
JSONArray result = new JSONArray();
for(int i = 0 , length = flows.length() ; i < length ; i++) {
JSONObject sequenceFlow = flows.getJSONObject(i);
JSONObject flow = new JSONObject();
flow.put("id", UUID.randomUUID());
String name = "ConditionFlow" + i;
if(sequenceFlow.has("item")) {
name = sequenceFlow.getString("item");
}
flow.put("name", name);
flow.put("sourceRef", String.valueOf(sequenceFlow.getInt("from")));
flow.put("targetRef", String.valueOf(sequenceFlow.getInt("to")));
flow.put("points", new JSONArray());
if(sequenceFlow.has("expression") ) {
flow.put("condition",sequenceFlow.getString("expression"));
result.put(flow);
}
}
return result;
}
public static JSONObject getWorkflow(String workflowDefinitionName, JSONArray tasks) {
JSONObject workflow = new JSONObject();
......@@ -77,6 +291,18 @@ public class WorkflowGenerator {
return startEvent;
}
private static final JSONObject generateStartEvent(JSONObject start) {
JSONObject startEvent = new JSONObject();
startEvent.put("id", String.valueOf(start.getInt("key")));
return startEvent;
}
private static final JSONObject generateEndEvents(JSONObject end) {
JSONObject endEvent = new JSONObject();
endEvent.put("id", String.valueOf(end.getInt("key")));
return endEvent;
}
private static final JSONArray generateEndEvents() {
JSONArray endEvents = new JSONArray();
......@@ -92,7 +318,7 @@ public class WorkflowGenerator {
JSONObject task = new JSONObject();
task.put("id", taskObj.getString("id"));
task.put("name", taskObj.getString("name"));
task.put("task", generateTaskDefinitionConfig());
task.put("task", generateTaskDefinitionConfig(null));
task.put("participationStrategies",
generateParticipationStrategies(taskObj.getJSONArray("participationStrategies")));
task.put("outputs", generateTaskOutputs());
......@@ -103,17 +329,21 @@ public class WorkflowGenerator {
JSONObject task = new JSONObject();
task.put("id", taskObj.getString("id"));
task.put("name", taskObj.getString("name"));
task.put("task", generateTaskDefinitionConfig());
task.put("task", generateTaskDefinitionConfig(null));
task.put("participationStrategies",
generateParticipationStrategies(taskObj.getJSONArray("participationStrategies")));
task.put("outputs", generateTaskOutputs());
return task;
}
private static final JSONObject generateTaskDefinitionConfig() {
private static final JSONObject generateTaskDefinitionConfig(String name) {
JSONObject config = new JSONObject();
config.put("arguments", generateTaskInputArguments());
if(null != name&&!name.equals("")) {
config.put("name", name);
}else {
config.put("name", "com.beecode.inz.workflow.task.ApprovalTaskDefinition");
}
return config;
}
......@@ -173,7 +403,65 @@ public class WorkflowGenerator {
result.put("name", "result");
result.put("type", "int");
JSONObject isSpecial = new JSONObject();
isSpecial.put("name", "isSpecial");
isSpecial.put("type", "boolean");
JSONObject isTemporary = new JSONObject();
isTemporary.put("name", "isTemporary");
isTemporary.put("type", "boolean");
JSONObject value = new JSONObject();
value.put("name", "value");
value.put("type", "double");
JSONObject totalValue = new JSONObject();
totalValue.put("name", "totalValue");
totalValue.put("type", "double");
JSONObject equipCount = new JSONObject();
equipCount.put("name", "equipCount");
equipCount.put("type", "int");
array.put(result);
array.put(isSpecial);
array.put(isTemporary);
array.put(value);
array.put(totalValue);
array.put(equipCount);
return array;
}
private static final JSONArray generateTaskOutputs(int nodeId) {
JSONArray array = new JSONArray();
JSONObject result = new JSONObject();
result.put("name", "result");
result.put("type", "int");
JSONObject isSpecial = new JSONObject();
isSpecial.put("name", "isSpecial");
isSpecial.put("type", "boolean");
JSONObject isTemporary = new JSONObject();
isTemporary.put("name", "isTemporary");
isTemporary.put("type", "boolean");
String nodeParam = null;
if(nodeId < 0){
nodeParam = "n_"+String.valueOf(nodeId).replaceAll("-", "n")+"_staffs";
}else{
nodeParam = "n_"+nodeId+"_staffs";
}
JSONObject node = new JSONObject();
node.put("name", nodeParam);
node.put("type", "string");
array.put(result);
array.put(isSpecial);
array.put(isTemporary);
array.put(node);
return array;
}
......@@ -205,6 +493,24 @@ public class WorkflowGenerator {
return json;
}
private static JSONArray generateProcessParameters(JSONObject process ,int nodeId){
JSONArray arg = process.getJSONArray("processParameters");
String nodeParam = null;
if(nodeId < 0){
nodeParam = "n_"+String.valueOf(nodeId).replaceAll("-", "n")+"_staffs";
}else{
nodeParam = "n_"+nodeId+"_staffs";
}
JSONObject arg1 = new JSONObject();
arg1.put("name", nodeParam);
arg1.put("key", nodeParam);
arg1.put("type", "string");
arg.put(arg1);
return arg;
}
private static JSONArray generateProcessParameters() {
JSONArray array = new JSONArray();
......@@ -233,13 +539,73 @@ public class WorkflowGenerator {
arg5.put("key", "submitterId");
arg5.put("type", "string");
JSONObject arg6 = new JSONObject();
arg6.put("name", "isSpecial");
arg6.put("key", "isSpecial");
arg6.put("type", "boolean");
JSONObject arg7 = new JSONObject();
arg7.put("name", "onSpecialJudge");
arg7.put("key", "onSpecialJudge");
arg7.put("type", "boolean");
JSONObject arg8 = new JSONObject();
arg8.put("name", "startLevel");
arg8.put("key", "startLevel");
arg8.put("type", "int");
JSONObject arg9 = new JSONObject();
arg9.put("name", "rebacking");
arg9.put("key", "rebacking");
arg9.put("type", "boolean");
JSONObject arg10 = new JSONObject();
arg10.put("name", "orgTitle");
arg10.put("key", "orgTitle");
arg10.put("type", "string");
JSONObject arg11 = new JSONObject();
arg11.put("name", "depTitle");
arg11.put("key", "depTitle");
arg11.put("type", "string");
JSONObject arg12 = new JSONObject();
arg12.put("name", "isTemporary");
arg12.put("key", "isTemporary");
arg12.put("type", "boolean");
JSONObject value = new JSONObject();
value.put("name", "value");
value.put("key", "value");
value.put("type", "double");
JSONObject totalValue = new JSONObject();
totalValue.put("name", "totalValue");
totalValue.put("key", "totalValue");
totalValue.put("type", "double");
JSONObject equipCount = new JSONObject();
equipCount.put("name", "equipCount");
equipCount.put("key", "equipCount");
equipCount.put("type", "int");
array.put(arg1);
array.put(arg2);
array.put(arg3);
array.put(arg4);
array.put(arg5);
array.put(arg6);
array.put(arg7);
array.put(arg8);
array.put(arg9);
array.put(arg10);
array.put(arg11);
array.put(arg12);
array.put(value);
array.put(totalValue);
array.put(equipCount);
return array;
}
}
\ No newline at end of file
package com.beecode.inz.workflow.web;
import java.util.Collections;
import java.util.List;
import java.util.UUID;
import org.json.JSONArray;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.beecode.bcp.type.KObject;
import com.beecode.bcp.type.json.JSONObjectUtils;
import com.beecode.bcp.workflow.exception.WorkflowRuntimeException;
import com.beecode.inz.workflow.service.ApprovalCopyService;
@RestController
public class ApprovalCopyController {
@Autowired
private ApprovalCopyService approvalCopyService;
@RequestMapping(value = "/workflow/approvalCopy", method = RequestMethod.POST)
public Object approvalCheck(@RequestBody String body) {
JSONObject returnObj = new JSONObject();
returnObj.put("status", 200);
JSONObject bodyJson = new JSONObject(body);
UUID bizProcessId = UUID.fromString(bodyJson.getString("bizProcessId"));
JSONArray actors = bodyJson.getJSONArray("actors");
try {
approvalCopyService.approvalCopy(bizProcessId, actors.toString());
}catch (WorkflowRuntimeException e) {
returnObj.put("status", 500);
returnObj.put("code", e.getMessage());
}
return JSONObjectUtils.toJson(returnObj.toString());
}
@RequestMapping(value = "/workflow/completedApprovalCopy", method = RequestMethod.POST)
public Object completedApprovalCheck(@RequestBody String body) {
JSONObject returnObj = new JSONObject();
returnObj.put("status", 200);
JSONObject bodyJson = new JSONObject(body);
UUID processInstanceId = UUID.fromString(bodyJson.getString("processInstanceId"));
String suggestion = null;
if(bodyJson.has("suggestion")){
if(!"".equals(bodyJson.getString("suggestion"))){
suggestion = bodyJson.getString("suggestion");
}
}
try {
approvalCopyService.completedApprovalCopy(processInstanceId,suggestion);
}catch (WorkflowRuntimeException e) {
returnObj.put("status", 500);
returnObj.put("code", e.getMessage());
}
return JSONObjectUtils.toJson(returnObj.toString());
}
@RequestMapping(value = "/workflow/approvalCopyStaff", method = RequestMethod.GET)
public List<KObject> getApprovalCopyStaff(@RequestParam(name="workflowProcessInstanceId",required=true ) UUID workflowProcessInstanceId) {
return approvalCopyService.getApprovalCopyStaffByprocessInstanceId(workflowProcessInstanceId);
}
}
package com.beecode.inz.workflow.web;
import java.util.List;
import java.util.UUID;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.beecode.inz.workflow.entity.InzBizProcess;
import com.beecode.inz.workflow.pojo.ApprovalNodesObj;
import com.beecode.inz.workflow.service.ApprovalNodeService;
import com.beecode.inz.workflow.service.InzBizProcessService;
@RestController
public class ApprovalNodeController {
@Autowired
private ApprovalNodeService approvalNodeService;
@Autowired
private InzBizProcessService inzBizProcessService;
@RequestMapping(value = "/workflow/approvalNodes", method = RequestMethod.GET)
public List<ApprovalNodesObj> getFlowNodeInfo(@RequestParam(name="workflowProcessInstanceId",required=true ) UUID workflowProcessInstanceId
,@RequestParam(name="storeJson",required=false ) String storeJson
,@RequestParam(name="isEquipment",required=false ) Boolean isEquipment) {
InzBizProcess inzBizProcess = inzBizProcessService.getBizProcessByWorkflowProcessInstanceId(workflowProcessInstanceId);
return approvalNodeService.listApprovalNodeByInzBizProcess(inzBizProcess,storeJson,isEquipment);
}
@RequestMapping(value = "/workflow/workflowDefinitionApprovalNodes", method = RequestMethod.GET)
public List<ApprovalNodesObj> getFlowDefinitionNodeInfo(@RequestParam(name="bizTypeName",required=true ) String bizTypeName
,@RequestParam(name="storeJson",required=false ) String storeJson
,@RequestParam(name="bizDataId",required=false ) UUID bizDataId
,@RequestParam(name="define",required=false ) String define
,@RequestParam(name="disposeType",required=false ) String disposeType
,@RequestParam(name="isEquipment",required=false ) Boolean isEquipment) {
return approvalNodeService.listDefinitionApprovalNodeByBizTypeName(bizTypeName,storeJson,bizDataId,define,disposeType,isEquipment);
}
}
package com.beecode.inz.workflow.web;
import java.util.List;
import java.util.UUID;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -10,6 +11,7 @@ import org.springframework.web.bind.annotation.RestController;
import com.beecode.inz.workflow.entity.InzBizProcess;
import com.beecode.inz.workflow.pojo.ApprovalRecordsObj;
import com.beecode.inz.workflow.pojo.WorkflowRecordsObj;
import com.beecode.inz.workflow.service.ApprovalRecordService;
import com.beecode.inz.workflow.service.InzBizProcessService;
......@@ -30,4 +32,10 @@ public class ApprovalRecordController {
obj.setApprovalRecords(approvalRecordService.listApprovalRecordByProcessInstance(inzBizProcess));
return obj;
}
@RequestMapping(value = "/workflow/records", method = RequestMethod.GET)
public List<WorkflowRecordsObj> getFlowRecords(@RequestParam(name="workflowProcessInstanceId",required=true ) String workflowProcessInstanceId) {
InzBizProcess inzBizProcess = inzBizProcessService.getBizProcessByWorkflowProcessInstanceId(UUID.fromString(workflowProcessInstanceId));
return approvalRecordService.listWorkflowRecordByProcessInstance(inzBizProcess);
}
}
package com.beecode.inz.workflow.web;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import org.json.JSONArray;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import com.beecode.bcp.type.json.JSONObjectUtils;
import com.beecode.bcp.workflow.exception.WorkflowRuntimeException;
import com.beecode.inz.workflow.service.ApprovalTranspondService;
import com.beecode.inz.workflow.service.SubmitApprovalSuggestionService;
@RestController
public class ApprovalTranspondController {
@Autowired
private ApprovalTranspondService approvalTranspondService;
@Autowired
private SubmitApprovalSuggestionService submitApprovalSuggestionService;
@RequestMapping(value = "/workflow/approvalTranspond", method = RequestMethod.POST)
public Object approvalTranspond(@RequestBody String body) {
JSONObject returnObj = new JSONObject();
returnObj.put("status", 200);
JSONObject bodyJson = new JSONObject(body);
/**
* 转发别人 transpondOther
* 给自己的 transpondOneself
* 驳回给自己的 transpondReject
*/
String type = bodyJson.getString("type");
String suggestion = null;
String url = null;
if(bodyJson.has("suggestion")){
suggestion = bodyJson.getString("suggestion");
}
if(bodyJson.has("url")){
url = bodyJson.getString("url");
}
UUID bizProcessId = UUID.fromString(bodyJson.getString("bizProcessId"));
List<UUID> actorIds = new ArrayList<>();
if(bodyJson.has("actors")){
JSONArray jsonArray = bodyJson.getJSONArray("actors");
for(int i =0; i<jsonArray.length();i++){
actorIds.add(UUID.fromString(jsonArray.getString(i)));
}
}
try {
approvalTranspondService.approvalTranspond(bizProcessId, actorIds,type,url,suggestion);
if(suggestion != null && !suggestion.equals("") && ("transpondOneself".equals(type) || "transpondReject".equals(type))){
submitApprovalSuggestionService.addSubmitApprovalSuggestion(bizProcessId, suggestion);
}
approvalTranspondService.startAutoCompleteApproval(bizProcessId);
}catch (WorkflowRuntimeException e) {
returnObj.put("status", 500);
returnObj.put("code", e.getMessage());
}
return JSONObjectUtils.toJson(returnObj.toString());
}
@RequestMapping(value = "/workflow/completedApprovalTranspond", method = RequestMethod.POST)
public Object completedApprovalTranspond(@RequestBody String body) {
JSONObject returnObj = new JSONObject();
returnObj.put("status", 200);
JSONObject bodyJson = new JSONObject(body);
UUID processInstanceId = UUID.fromString(bodyJson.getString("processInstanceId"));
String suggestion = null;
if(bodyJson.has("suggestion")){
if(!"".equals(bodyJson.getString("suggestion"))){
suggestion = bodyJson.getString("suggestion");
}
}
try {
approvalTranspondService.completedApprovalTranspond(processInstanceId,suggestion);
}catch (WorkflowRuntimeException e) {
returnObj.put("status", 500);
returnObj.put("code", e.getMessage());
}
return JSONObjectUtils.toJson(returnObj.toString());
}
}
package com.beecode.inz.workflow.web;
import java.util.ArrayList;
import java.util.List;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.UUID;
import org.json.JSONObject;
......@@ -14,7 +15,6 @@ import org.springframework.web.bind.annotation.RestController;
import com.beecode.bcp.type.json.JSONObjectUtils;
import com.beecode.bcp.workflow.exception.WorkflowRuntimeException;
import com.beecode.inz.workflow.entity.InzApprovalTask;
import com.beecode.inz.workflow.pojo.InzApprovalTaskObj;
import com.beecode.inz.workflow.service.InzApprovalTaskService;
......@@ -36,9 +36,21 @@ public class InzApprovalTaskController {
int result = bodyJson.getInt("approvalAction");
String suggestions = bodyJson.optString("suggestions");
String attribute1 = bodyJson.optString("attribute1");
JSONObject extendAttribute = bodyJson.optJSONObject("extendAttribute");
Map<String,String> argus = new HashMap<>();
if(extendAttribute!=null){
Iterator<?> it = extendAttribute.keys();
while(it.hasNext()){
String key = (String) it.next();
//得到value的值
String value = extendAttribute.optString(key);
//System.out.println(value);
argus.put(key, value);
}
}
try {
inzApprovalTaskService.completeTask(taskId, result, suggestions);
inzApprovalTaskService.completeTask(taskId, result, suggestions,argus,attribute1);
}catch (WorkflowRuntimeException e) {
returnObj.put("status", 500);
returnObj.put("code", e.getMessage());
......@@ -52,15 +64,16 @@ public class InzApprovalTaskController {
return new InzApprovalTaskObj(inzApprovalTaskService.getInzApprovalTaskById(taskId));
}
@RequestMapping(value = "/workflow/pendApprovalTasks", method = RequestMethod.GET)
public List<Object> getApprovalTasks() {
List<Object> objects = new ArrayList<>();
List<InzApprovalTask> inzApprovalTasks = inzApprovalTaskService.getApprovalTasksByPend();
for(InzApprovalTask inzApprovalTask : inzApprovalTasks){
if(inzApprovalTask.getBizProcess().getProcessInstance() != null ){
objects.add(new InzApprovalTaskObj(inzApprovalTask));
}
@RequestMapping(value = "/workflow/taks/bizid/{bizDataId}", method = RequestMethod.GET)
public Object getLastTaskByBizDataId(@PathVariable("bizDataId") UUID bizDataId) {
JSONObject result = inzApprovalTaskService.getLastTaskByBizDataId(bizDataId);
if(null == result){
result = new JSONObject();
result.put("code",500);
result.put("reason","找不到对应的工作流实例");
}else{
result.put("code",200);
}
return objects;
return result.toString();
}
}
package com.beecode.inz.workflow.web;
import java.util.Map;
import java.util.UUID;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.beecode.bcp.type.json.JSONObjectUtils;
import com.beecode.inz.basis.team.pojo.ResponseObj;
import com.beecode.inz.workflow.service.InzWorkflowService;
/**
* 远程调用启用一些工作流的逻辑,开放接口
*
* @author pengwufeng
*
*/
@RequestMapping(value = "/workflow/api")
@RestController
public class InzWorkflowController {
private static final Logger logger = LoggerFactory.getLogger(InzWorkflowController.class);
@Autowired
private InzWorkflowService inzWorkflowService;
/**
* 开始一个工作流
*
* @param body
* @return
*/
@PostMapping(value = "start")
public ResponseObj<?> startWorkflow(@RequestBody String body) {
String actionName = null;
String bizTypeName = null;
String bizObjectName = null;
String modelName = null;
String bizAffiliationName = null;
UUID modelId = null;
// 读取参数
try {
Map<String, Object> parms = JSONObjectUtils.toMap(body);
actionName = parms.get("actionName").toString();
bizTypeName = parms.get("bizTypeName").toString();
bizObjectName = parms.get("bizObjectName").toString();
modelName = parms.get("modelName").toString();
bizAffiliationName = parms.get("bizAffiliationName").toString();
modelId = UUID.fromString(parms.get("modelId").toString());
} catch (Exception e) {
logger.warn("", e);
return ResponseObj.error("Invalid required parms");
}
try {
int resultCode = inzWorkflowService.startWorkflow(actionName, bizTypeName, bizObjectName, modelName,
modelId, bizAffiliationName);
return ResponseObj.response(resultCode, "", null);
} catch (Exception e) {
logger.warn("", e);
return ResponseObj.error(e.getMessage());
}
}
}
package com.beecode.inz.workflow.web;
import java.util.UUID;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.beecode.bcp.type.json.JSONObjectUtils;
import com.beecode.bcp.workflow.exception.WorkflowRuntimeException;
import com.beecode.inz.workflow.service.SubmitApprovalSuggestionService;
@RestController
public class SubmitApprovalSuggestionController {
@Autowired
private SubmitApprovalSuggestionService submitApprovalSuggestionService;
@RequestMapping(value = "/workflow/submitApprovalSuggestion", method = RequestMethod.POST)
public Object approvalCheck(@RequestBody String body) {
JSONObject returnObj = new JSONObject();
returnObj.put("status", 200);
JSONObject bodyJson = new JSONObject(body);
UUID bizProcessId = UUID.fromString(bodyJson.getString("bizProcessId"));
String suggestion = bodyJson.getString("suggestion");
try {
submitApprovalSuggestionService.addSubmitApprovalSuggestion(bizProcessId, suggestion);
}catch (WorkflowRuntimeException e) {
returnObj.put("status", 500);
returnObj.put("code", e.getMessage());
}
return JSONObjectUtils.toJson(returnObj.toString());
}
@RequestMapping(value = "/workflow/submitApprovalSuggestion", method = RequestMethod.GET)
public Object completedApprovalCheck(@RequestParam(name="processInstanceId",required=true ) UUID processInstanceId) {
return submitApprovalSuggestionService.getSubmitApprovalSuggestionByprocessInstanceId(processInstanceId);
}
}
......@@ -16,6 +16,9 @@
<annotation id='4f3e9d09-9873-4d12-b78b-01d34040cb48' attributeId='1282df11-5502-4190-84ac-6f1f241d9e77' name='length' value='100'>
</annotation>
</attribute>
<attribute id='0f80efb9-f2cf-4d7d-a28b-41c27f75c17e' name='attribute1' columnName='attribute1' title='附加参数1' type='string' default='' precision='' isArray='false'>
<annotation id='9140425a-bd07-48e8-9824-6fa00f8a3e3d' attributeId='e9455f71-c3fc-4ce3-a9cd-15905b5a7983' name='length' value='500'></annotation>
</attribute>
<hibernate>/inz.workflow/src/main/resources/config/InzApprovalTask.hbm.xml</hibernate>
</dataModel>
</content>
......
......@@ -16,6 +16,10 @@
<annotation id='224222d9-9a70-4309-92e0-6105a4438483' attributeId='e211805a-b1d8-4866-859e-c8c9b9a6ffad' name='length' value='200'>
</annotation>
</attribute>
<attribute id='be60e8a1-93c4-4b9b-9299-37f58a4c55fc' name='bizAffiliationName' columnName='biz_affiliation_name' title='对象业务归属名称' type='string' default='' precision='' isArray='false'>
<annotation id='b6f67d50-2295-423b-94c8-8a2c5e03f5f0' attributeId='ed7cc63e-e770-4021-8bed-564c46986eed' name='length' value='200'>
</annotation>
</attribute>
<attribute id='b4cb7081-1c81-4944-ab8c-5a85db1d5539' name='triggerAction' columnName='trigger_action' title='触发动作' type='string' default='' precision='' isArray='false'>
<annotation id='e7df47eb-54a7-4b8b-b51e-b0dda7213977' attributeId='035d7759-12a1-424a-915b-9dfa86a6607b' name='length' value='200'>
</annotation>
......
......@@ -28,6 +28,10 @@
<annotation id='74c4afb5-b971-4d3d-a0e6-135bd6d5c77c' attributeId='74f7fc99-f01a-45fa-8b79-2287654d5ed6' name='length' value='100'>
</annotation>
</attribute>
<attribute id='3183fcf5-e975-4e88-a079-7d9a7bb6a990' name='diagram' columnName='diagram' title='画布' type='string' default='' precision='' isArray='false'>
<annotation id='74c4afb5-b971-4d3d-a0e6-135bd6d5c770' attributeId='74f7fc99-f01a-45fa-8b79-2287654d5ed0' name='length' value='20000'>
</annotation>
</attribute>
<attribute id='6ad04f35-321f-4a02-b7fe-6d9220bbc5ce' name='discard' title='是否废弃' type='boolean' default='false' precision='' isArray='false'>
<annotation id='08d17bd3-abe9-4652-b5be-bbbd5d09b73e' attributeId='00be979e-7d60-405c-9fd5-d03048609ea7' name='length' value='undefined'>
</annotation>
......
......@@ -28,6 +28,20 @@
<m:description></m:description>
<m:default></m:default>
</m:attribute>
<m:attribute>
<m:annotations>
<m:annotation>
<m:type>bcp.type.constraint.StringLength</m:type>
<m:value>500</m:value>
</m:annotation>
</m:annotations>
<m:id>0f80efb9-f2cf-4d7d-a28b-41c27f75c17e</m:id>
<m:name>attribute1</m:name>
<m:title>附加参数1</m:title>
<m:type>string</m:type>
<m:description></m:description>
<m:default></m:default>
</m:attribute>
</m:attributes>
</m:class>
</content>
......
......@@ -35,6 +35,20 @@
<m:value>200</m:value>
</m:annotation>
</m:annotations>
<m:id>be60e8a1-93c4-4b9b-9299-37f58a4c55fc</m:id>
<m:name>bizAffiliationName</m:name>
<m:title>对象业务归属名称</m:title>
<m:type>string</m:type>
<m:description></m:description>
<m:default></m:default>
</m:attribute>
<m:attribute>
<m:annotations>
<m:annotation>
<m:type>bcp.type.constraint.StringLength</m:type>
<m:value>200</m:value>
</m:annotation>
</m:annotations>
<m:id>b4cb7081-1c81-4944-ab8c-5a85db1d5539</m:id>
<m:name>triggerAction</m:name>
<m:title>触发动作</m:title>
......
......@@ -61,6 +61,20 @@
<m:default></m:default>
</m:attribute>
<m:attribute>
<m:annotations>
<m:annotation>
<m:type>bcp.type.constraint.StringLength</m:type>
<m:value>20000</m:value>
</m:annotation>
</m:annotations>
<m:id>3183fcf5-e975-4e88-a079-7d9a7bb6a990</m:id>
<m:name>diagram</m:name>
<m:title>画布</m:title>
<m:type>string</m:type>
<m:description></m:description>
<m:default></m:default>
</m:attribute>
<m:attribute>
<m:annotations/>
<m:id>6ad04f35-321f-4a02-b7fe-6d9220bbc5ce</m:id>
<m:name>discard</m:name>
......
<?xml version="1.0" encoding="UTF-8"?>
<metadata xmlns="http://www.beecode.cn/schema/amino-metadata" xmlns:m="http://www.beecode.cn/schema/bcp-participant">
<specification>1.0</specification>
<id>592a327c-fc41-44dd-a239-678b2d217982</id>
<name>com.beecode.inz.workflow.participant.SubmiterSubsidiaryRoleParticipant</name>
<title>提交对象共同子公司的角色</title>
<define>bcp.participant</define>
<define-version>1.0</define-version>
<content>
<m:participation-strategy>
<m:input>
<m:name>submitterId</m:name>
<m:title>提交人Id</m:title>
<m:description></m:description>
<m:type>string</m:type>
</m:input>
<m:input>
<m:name>roles</m:name>
<m:title>角色</m:title>
<m:description>json数组</m:description>
<m:type>string</m:type>
</m:input>
<m:implementation runtime="java">com.beecode.inz.workflow.participant.SubmiterSubsidiaryRoleParticipantStrategy</m:implementation>
</m:participation-strategy>
</content>
</metadata>
......@@ -8,5 +8,8 @@
<property name="bizObjectName" type="nstring" not-null="false">
<column name="bizObjectName" length="100"></column>
</property>
<property name="attribute1" type="nstring" not-null="false">
<column name="attribute1" length="500"></column>
</property>
</union-subclass>
</hibernate-mapping>
\ No newline at end of file
......@@ -8,6 +8,9 @@
<property name="bizObjectName" type="nstring" not-null="false">
<column name="bizObjectName" length="200"></column>
</property>
<property name="bizAffiliationName" type="nstring" not-null="false">
<column name="bizAffiliationName" length="200"></column>
</property>
<property name="triggerAction" type="nstring" not-null="false">
<column name="triggerAction" length="200"></column>
</property>
......
......@@ -20,5 +20,8 @@
<property name="description" type="nstring" not-null="false">
<column name="description" length="100"></column>
</property>
<property name="diagram" type="text" not-null="false">
<column name="diagram"></column>
</property>
</subclass>
</hibernate-mapping>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment