Commit 5c68bd21 by yuwei

项目初始化

parent 2cd112c5
...@@ -12,7 +12,7 @@ public abstract class DataFlowBaseEntity extends DataScopeBaseEntity { ...@@ -12,7 +12,7 @@ public abstract class DataFlowBaseEntity extends DataScopeBaseEntity {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
/** /**
* 工作流状态 * 工作流状态(1待提交,2已退回,3审核中,4通过,5不通过,6已撤销)
*/ */
@TableField(value = "flow_status", fill = FieldFill.INSERT) @TableField(value = "flow_status", fill = FieldFill.INSERT)
private String flowStatus; private String flowStatus;
...@@ -20,5 +20,6 @@ public abstract class DataFlowBaseEntity extends DataScopeBaseEntity { ...@@ -20,5 +20,6 @@ public abstract class DataFlowBaseEntity extends DataScopeBaseEntity {
/** /**
* 流程实例ID * 流程实例ID
*/ */
@TableField(value = "process_instance_id")
private String processInstanceId; private String processInstanceId;
} }
...@@ -19,4 +19,6 @@ public interface RedisConstant { ...@@ -19,4 +19,6 @@ public interface RedisConstant {
String VISUAL_SET_KEY = "data:visual:sets"; String VISUAL_SET_KEY = "data:visual:sets";
String STANDARD_DICT_KEY = "data:standard:dicts"; String STANDARD_DICT_KEY = "data:standard:dicts";
String WORKFLOW_BUSINESS_KEY = "data:workflow:business";
} }
package cn.datax.common.utils;
import cn.hutool.core.util.StrUtil;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 消息模板格式化
*/
public class MsgFormatUtil {
private static String REGEX = "(\\{([a-zA-Z]+)\\})";
public static String TEMPALTE_NICKNAME = "nickname";
public static String TEMPALTE_DATETIME = "datetime";
public static String TEMPALTE_BUSINESS_NAME = "businessName";
public static String TEMPALTE_BUSINESS_KEY = "businessKey";
/**
* 根据模板及参数获得内容
* @param tempalte
* @param parameters
* @return
*/
public static String getContent(String tempalte, Map<String, String> parameters) {
if (StrUtil.isBlank(tempalte)) {
tempalte = "业务名称:{businessName},发起人:{nickname},业务编号:{businessKey}";
}
Pattern p = Pattern.compile(REGEX);
Matcher m = p.matcher(tempalte);
StringBuffer stringBuffer = new StringBuffer();
while (m.find()){
String key = m.group(2);
String value = null;
if (parameters.containsKey(key)){
value = parameters.get(key);
}
value = (value == null) ? "" : value;
m.appendReplacement(stringBuffer, value);
}
m.appendTail(stringBuffer);
return stringBuffer.toString();
}
public static void main(String[] args) {
String tempalte = "{name}你好,今年{age}岁";
Map<String,String> parameters = new HashMap<>();
parameters.put("name", "chris");
parameters.put("age", "22");
System.out.println(getContent(tempalte, parameters));
}
}
...@@ -67,6 +67,19 @@ public class SecurityUtil { ...@@ -67,6 +67,19 @@ public class SecurityUtil {
} }
/** /**
* 获取用户昵称
*
* @return nickname
*/
public static String getNickname() {
DataUser user = getDataUser();
if (user != null){
return user.getNickname();
}
return "";
}
/**
* 获取用户角色 * 获取用户角色
* *
* @return username * @return username
...@@ -79,4 +92,17 @@ public class SecurityUtil { ...@@ -79,4 +92,17 @@ public class SecurityUtil {
} }
return null; return null;
} }
/**
* 获取用户
*
* @return user
*/
public static boolean isAdmin() {
DataUser user = getDataUser();
if (user != null){
return user.isAdmin();
}
return false;
}
} }
package cn.datax.service.data.masterdata.api.entity; package cn.datax.service.data.masterdata.api.entity;
import cn.datax.common.base.DataFlowBaseEntity;
import cn.datax.common.base.DataScopeBaseEntity; import cn.datax.common.base.DataScopeBaseEntity;
import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
...@@ -21,7 +22,7 @@ import java.util.List; ...@@ -21,7 +22,7 @@ import java.util.List;
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
@Accessors(chain = true) @Accessors(chain = true)
@TableName(value = "masterdata_model", resultMap = "BaseResultMap") @TableName(value = "masterdata_model", resultMap = "BaseResultMap")
public class ModelEntity extends DataScopeBaseEntity { public class ModelEntity extends DataFlowBaseEntity {
private static final long serialVersionUID=1L; private static final long serialVersionUID=1L;
......
...@@ -28,5 +28,7 @@ public class ModelVo implements Serializable { ...@@ -28,5 +28,7 @@ public class ModelVo implements Serializable {
private String modelLogicTable; private String modelLogicTable;
private String modelPhysicalTable; private String modelPhysicalTable;
private String isSync; private String isSync;
private String flowStatus;
private String processInstanceId;
private List<ModelColumnVo> modelColumns; private List<ModelColumnVo> modelColumns;
} }
...@@ -74,6 +74,11 @@ ...@@ -74,6 +74,11 @@
<artifactId>data-standard-service-api</artifactId> <artifactId>data-standard-service-api</artifactId>
<version>2.0.0</version> <version>2.0.0</version>
</dependency> </dependency>
<dependency>
<groupId>cn.datax</groupId>
<artifactId>workflow-service-api</artifactId>
<version>2.0.0</version>
</dependency>
</dependencies> </dependencies>
<build> <build>
......
...@@ -4,7 +4,7 @@ import org.springframework.boot.SpringApplication; ...@@ -4,7 +4,7 @@ import org.springframework.boot.SpringApplication;
import org.springframework.cloud.client.SpringCloudApplication; import org.springframework.cloud.client.SpringCloudApplication;
import org.springframework.cloud.openfeign.EnableFeignClients; import org.springframework.cloud.openfeign.EnableFeignClients;
@EnableFeignClients(basePackages = {"cn.datax.service.system.api.feign"}) @EnableFeignClients(basePackages = {"cn.datax.service.system.api.feign", "cn.datax.service.workflow.api.feign"})
@SpringCloudApplication @SpringCloudApplication
public class DataxMasterdataApplication { public class DataxMasterdataApplication {
......
...@@ -147,6 +147,17 @@ public class ModelController extends BaseController { ...@@ -147,6 +147,17 @@ public class ModelController extends BaseController {
return R.ok(); return R.ok();
} }
/**
* 工作流提交
* @param id
* @return
*/
@PostMapping("/submit/{id}")
public R submitModelById(@PathVariable String id) {
modelService.submitModelById(id);
return R.ok();
}
@PostMapping("/table/create/{id}") @PostMapping("/table/create/{id}")
public R createTable(@PathVariable String id) { public R createTable(@PathVariable String id) {
modelService.createTable(id); modelService.createTable(id);
......
...@@ -34,4 +34,6 @@ public interface ModelService extends BaseService<ModelEntity> { ...@@ -34,4 +34,6 @@ public interface ModelService extends BaseService<ModelEntity> {
Map<String, Object> getTableParamById(String id); Map<String, Object> getTableParamById(String id);
Map<String, Object> getFormParamById(String id); Map<String, Object> getFormParamById(String id);
void submitModelById(String id);
} }
...@@ -4,6 +4,8 @@ import cn.datax.common.core.DataConstant; ...@@ -4,6 +4,8 @@ import cn.datax.common.core.DataConstant;
import cn.datax.common.core.RedisConstant; import cn.datax.common.core.RedisConstant;
import cn.datax.common.exception.DataException; import cn.datax.common.exception.DataException;
import cn.datax.common.redis.service.RedisService; import cn.datax.common.redis.service.RedisService;
import cn.datax.common.utils.MsgFormatUtil;
import cn.datax.common.utils.SecurityUtil;
import cn.datax.service.data.masterdata.api.entity.ModelColumnEntity; import cn.datax.service.data.masterdata.api.entity.ModelColumnEntity;
import cn.datax.service.data.masterdata.api.entity.ModelEntity; import cn.datax.service.data.masterdata.api.entity.ModelEntity;
import cn.datax.service.data.masterdata.api.dto.ModelDto; import cn.datax.service.data.masterdata.api.dto.ModelDto;
...@@ -14,6 +16,10 @@ import cn.datax.service.data.masterdata.service.ModelService; ...@@ -14,6 +16,10 @@ import cn.datax.service.data.masterdata.service.ModelService;
import cn.datax.service.data.masterdata.dao.ModelDao; import cn.datax.service.data.masterdata.dao.ModelDao;
import cn.datax.common.base.BaseServiceImpl; import cn.datax.common.base.BaseServiceImpl;
import cn.datax.service.data.standard.api.entity.DictEntity; import cn.datax.service.data.standard.api.entity.DictEntity;
import cn.datax.service.workflow.api.dto.ProcessInstanceCreateRequest;
import cn.datax.service.workflow.api.entity.BusinessEntity;
import cn.datax.service.workflow.api.feign.FlowInstanceServiceFeign;
import cn.datax.service.workflow.api.vo.FlowInstanceVo;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DatePattern; import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
...@@ -24,6 +30,7 @@ import org.springframework.stereotype.Service; ...@@ -24,6 +30,7 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDateTime;
import java.util.Date; import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
...@@ -57,9 +64,14 @@ public class ModelServiceImpl extends BaseServiceImpl<ModelDao, ModelEntity> imp ...@@ -57,9 +64,14 @@ public class ModelServiceImpl extends BaseServiceImpl<ModelDao, ModelEntity> imp
@Autowired @Autowired
private RedisService redisService; private RedisService redisService;
@Autowired
private FlowInstanceServiceFeign flowInstanceServiceFeign;
private static String BIND_GB_CODE = "gb_code"; private static String BIND_GB_CODE = "gb_code";
private static String BIND_GB_NAME = "gb_name"; private static String BIND_GB_NAME = "gb_name";
private static String DEFAULT_BUSINESS_CODE = "6011";
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public ModelEntity saveModel(ModelDto modelDto) { public ModelEntity saveModel(ModelDto modelDto) {
...@@ -222,4 +234,36 @@ public class ModelServiceImpl extends BaseServiceImpl<ModelDao, ModelEntity> imp ...@@ -222,4 +234,36 @@ public class ModelServiceImpl extends BaseServiceImpl<ModelDao, ModelEntity> imp
map.put("columnList", columnList); map.put("columnList", columnList);
return map; return map;
} }
@Override
public void submitModelById(String id) {
BusinessEntity businessEntity = (BusinessEntity) redisService.hget(RedisConstant.WORKFLOW_BUSINESS_KEY, DEFAULT_BUSINESS_CODE);
if (businessEntity != null) {
ProcessInstanceCreateRequest request = new ProcessInstanceCreateRequest();
request.setSubmitter(SecurityUtil.getUserId());
request.setBusinessKey(id);
request.setBusinessCode(DEFAULT_BUSINESS_CODE);
String processDefinitionId = businessEntity.getProcessDefinitionId();
request.setProcessDefinitionId(processDefinitionId);
// 流程实例标题(动态拼接)
String tempalte = businessEntity.getBusinessTempalte();
String businessName = businessEntity.getBusinessName();
Map<String, String> parameters = new HashMap<>();
parameters.put(MsgFormatUtil.TEMPALTE_NICKNAME, SecurityUtil.getNickname());
parameters.put(MsgFormatUtil.TEMPALTE_DATETIME, DateUtil.formatLocalDateTime(LocalDateTime.now()));
parameters.put(MsgFormatUtil.TEMPALTE_BUSINESS_NAME, businessName);
parameters.put(MsgFormatUtil.TEMPALTE_BUSINESS_KEY, id);
String content = MsgFormatUtil.getContent(tempalte, parameters);
request.setBusinessName(content);
FlowInstanceVo flowInstanceVo = flowInstanceServiceFeign.startById(request);
if (flowInstanceVo != null) {
ModelEntity modelEntity = new ModelEntity();
modelEntity.setId(id);
modelEntity.setProcessInstanceId(flowInstanceVo.getProcessInstanceId());
modelDao.updateById(modelEntity);
}
} else {
throw new DataException("业务流程未配置");
}
}
} }
...@@ -16,6 +16,8 @@ ...@@ -16,6 +16,8 @@
<result column="model_logic_table" property="modelLogicTable" /> <result column="model_logic_table" property="modelLogicTable" />
<result column="model_physical_table" property="modelPhysicalTable" /> <result column="model_physical_table" property="modelPhysicalTable" />
<result column="is_sync" property="isSync" /> <result column="is_sync" property="isSync" />
<result column="flow_status" property="flowStatus" />
<result column="process_instance_id" property="processInstanceId" />
</resultMap> </resultMap>
<resultMap id="ExtendResultMap" type="cn.datax.service.data.masterdata.api.entity.ModelEntity" extends="BaseResultMap"> <resultMap id="ExtendResultMap" type="cn.datax.service.data.masterdata.api.entity.ModelEntity" extends="BaseResultMap">
...@@ -32,7 +34,7 @@ ...@@ -32,7 +34,7 @@
update_by, update_by,
update_time, update_time,
remark, remark,
model_name, model_logic_table, model_physical_table, is_sync model_name, model_logic_table, model_physical_table, is_sync, flow_status, process_instance_id
</sql> </sql>
<select id="getModelColumnList" resultType="cn.datax.service.data.masterdata.api.entity.ModelColumnEntity"> <select id="getModelColumnList" resultType="cn.datax.service.data.masterdata.api.entity.ModelColumnEntity">
......
...@@ -16,5 +16,7 @@ public class MetadataTreeVo implements Serializable { ...@@ -16,5 +16,7 @@ public class MetadataTreeVo implements Serializable {
*/ */
private String type; private String type;
private String label; private String label;
private String name;
private String code;
private List<MetadataTreeVo> children; private List<MetadataTreeVo> children;
} }
...@@ -89,15 +89,16 @@ public class MetadataColumnServiceImpl extends BaseServiceImpl<MetadataColumnDao ...@@ -89,15 +89,16 @@ public class MetadataColumnServiceImpl extends BaseServiceImpl<MetadataColumnDao
stream = stream.filter(s -> metadataColumnQuery.getSourceId().equals(s.getId())); stream = stream.filter(s -> metadataColumnQuery.getSourceId().equals(s.getId()));
} }
List<MetadataTreeVo> list = stream.map(m -> { List<MetadataTreeVo> list = stream.map(m -> {
MetadataTreeVo tree = new MetadataTreeVo(); MetadataTreeVo tree = new MetadataTreeVo();
tree.setId(m.getId()); tree.setId(m.getId());
tree.setType(DataLevel.DATABASE.getKey()); tree.setType(DataLevel.DATABASE.getKey());
tree.setLabel(m.getSourceName()); tree.setLabel(m.getSourceName());
if (DataLevel.getLevel(level).getLevel() >= DataLevel.TABLE.getLevel()) { tree.setName(m.getSourceName());
tree.setChildren(getTableChildrens(m.getId(), level, metadataColumnQuery.getTableId())); if (DataLevel.getLevel(level).getLevel() >= DataLevel.TABLE.getLevel()) {
} tree.setChildren(getTableChildrens(m.getId(), level, metadataColumnQuery.getTableId()));
return tree; }
}).collect(Collectors.toList()); return tree;
}).collect(Collectors.toList());
return list; return list;
} }
...@@ -108,15 +109,17 @@ public class MetadataColumnServiceImpl extends BaseServiceImpl<MetadataColumnDao ...@@ -108,15 +109,17 @@ public class MetadataColumnServiceImpl extends BaseServiceImpl<MetadataColumnDao
stream = stream.filter(s -> tableId.equals(s.getId())); stream = stream.filter(s -> tableId.equals(s.getId()));
} }
List<MetadataTreeVo> children = stream.map(m -> { List<MetadataTreeVo> children = stream.map(m -> {
MetadataTreeVo tree = new MetadataTreeVo(); MetadataTreeVo tree = new MetadataTreeVo();
tree.setId(m.getId()); tree.setId(m.getId());
tree.setType(DataLevel.TABLE.getKey()); tree.setType(DataLevel.TABLE.getKey());
tree.setLabel(StrUtil.isBlank(m.getTableComment()) ? m.getTableName() : m.getTableComment()); tree.setName(m.getTableComment());
if (DataLevel.getLevel(level).getLevel() >= DataLevel.COLUMN.getLevel()) { tree.setCode(m.getTableName());
tree.setChildren(getColumnChildrens(m.getId())); tree.setLabel(StrUtil.isBlank(m.getTableComment()) ? m.getTableName() : m.getTableComment());
} if (DataLevel.getLevel(level).getLevel() >= DataLevel.COLUMN.getLevel()) {
return tree; tree.setChildren(getColumnChildrens(m.getId()));
}).collect(Collectors.toList()); }
return tree;
}).collect(Collectors.toList());
return children; return children;
} }
...@@ -127,6 +130,8 @@ public class MetadataColumnServiceImpl extends BaseServiceImpl<MetadataColumnDao ...@@ -127,6 +130,8 @@ public class MetadataColumnServiceImpl extends BaseServiceImpl<MetadataColumnDao
MetadataTreeVo tree = new MetadataTreeVo(); MetadataTreeVo tree = new MetadataTreeVo();
tree.setId(m.getId()); tree.setId(m.getId());
tree.setType(DataLevel.TABLE.getKey()); tree.setType(DataLevel.TABLE.getKey());
tree.setName(m.getColumnComment());
tree.setCode(m.getColumnName());
tree.setLabel(StrUtil.isBlank(m.getColumnComment()) ? m.getColumnName() : m.getColumnComment()); tree.setLabel(StrUtil.isBlank(m.getColumnComment()) ? m.getColumnName() : m.getColumnComment());
return tree; return tree;
}).collect(Collectors.toList()); }).collect(Collectors.toList());
......
package cn.datax.service.system.controller; package cn.datax.service.system.controller;
import cn.datax.common.core.DataConstant;
import cn.datax.common.core.R; import cn.datax.common.core.R;
import cn.datax.common.validate.ValidationGroups; import cn.datax.common.validate.ValidationGroups;
import cn.datax.service.system.api.dto.MenuDto; import cn.datax.service.system.api.dto.MenuDto;
import cn.datax.service.system.api.entity.MenuEntity; import cn.datax.service.system.api.entity.MenuEntity;
import cn.datax.service.system.api.entity.RoleEntity;
import cn.datax.service.system.api.vo.MenuVo; import cn.datax.service.system.api.vo.MenuVo;
import cn.datax.service.system.mapstruct.MenuMapper; import cn.datax.service.system.mapstruct.MenuMapper;
import cn.datax.service.system.service.MenuService; import cn.datax.service.system.service.MenuService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParam;
...@@ -82,5 +85,17 @@ public class MenuController extends BaseController { ...@@ -82,5 +85,17 @@ public class MenuController extends BaseController {
menuService.deleteMenuById(id); menuService.deleteMenuById(id);
return R.ok(); return R.ok();
} }
@ApiOperation(value = "获取工作流资源列表", notes = "")
@GetMapping("/list/flow")
public R getMenuListForFlow() {
QueryWrapper<MenuEntity> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("status", DataConstant.EnableState.ENABLE.getKey());
queryWrapper.eq("menu_type", DataConstant.MenuType.MENU.getKey());
queryWrapper.isNotNull("menu_code");
List<MenuEntity> list = menuService.list(queryWrapper);
List<MenuVo> collect = list.stream().map(menuMapper::toVO).collect(Collectors.toList());
return R.ok().setData(collect);
}
} }
package cn.datax.service.system.controller; package cn.datax.service.system.controller;
import cn.datax.common.core.DataConstant;
import cn.datax.common.core.JsonPage; import cn.datax.common.core.JsonPage;
import cn.datax.common.core.R; import cn.datax.common.core.R;
import cn.datax.common.validate.ValidationGroups; import cn.datax.common.validate.ValidationGroups;
...@@ -12,7 +13,6 @@ import cn.datax.service.system.service.PostService; ...@@ -12,7 +13,6 @@ import cn.datax.service.system.service.PostService;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParam;
...@@ -57,7 +57,9 @@ public class PostController extends BaseController { ...@@ -57,7 +57,9 @@ public class PostController extends BaseController {
@ApiOperation(value = "获取岗位列表", notes = "") @ApiOperation(value = "获取岗位列表", notes = "")
@GetMapping("/list") @GetMapping("/list")
public R getPostList() { public R getPostList() {
List<PostEntity> list = postService.list(Wrappers.emptyWrapper()); QueryWrapper<PostEntity> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("status", DataConstant.EnableState.ENABLE.getKey());
List<PostEntity> list = postService.list(queryWrapper);
List<PostVo> collect = list.stream().map(postMapper::toVO).collect(Collectors.toList()); List<PostVo> collect = list.stream().map(postMapper::toVO).collect(Collectors.toList());
return R.ok().setData(collect); return R.ok().setData(collect);
} }
......
package cn.datax.service.system.controller; package cn.datax.service.system.controller;
import cn.datax.common.core.DataConstant;
import cn.datax.common.core.JsonPage; import cn.datax.common.core.JsonPage;
import cn.datax.common.core.R; import cn.datax.common.core.R;
import cn.datax.common.validate.ValidationGroups; import cn.datax.common.validate.ValidationGroups;
...@@ -57,7 +58,9 @@ public class RoleController extends BaseController { ...@@ -57,7 +58,9 @@ public class RoleController extends BaseController {
@ApiOperation(value = "获取角色列表", notes = "") @ApiOperation(value = "获取角色列表", notes = "")
@GetMapping("/list") @GetMapping("/list")
public R getPostList() { public R getPostList() {
List<RoleEntity> list = roleService.list(Wrappers.emptyWrapper()); QueryWrapper<RoleEntity> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("status", DataConstant.EnableState.ENABLE.getKey());
List<RoleEntity> list = roleService.list(queryWrapper);
List<RoleVo> collect = list.stream().map(roleMapper::toVO).collect(Collectors.toList()); List<RoleVo> collect = list.stream().map(roleMapper::toVO).collect(Collectors.toList());
return R.ok().setData(collect); return R.ok().setData(collect);
} }
......
package cn.datax.service.workflow.api.dto;
import cn.datax.common.validate.ValidationGroups;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
/**
* <p>
* 业务流程配置表 实体DTO
* </p>
*
* @author yuwei
* @since 2020-09-22
*/
@ApiModel(value = "业务流程配置表Model")
@Data
public class BusinessDto implements Serializable {
private static final long serialVersionUID=1L;
@ApiModelProperty(value = "主键ID")
@NotBlank(message = "主键ID不能为空", groups = {ValidationGroups.Update.class})
private String id;
@ApiModelProperty(value = "业务编码")
@NotBlank(message = "业务编码不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private String businessCode;
@ApiModelProperty(value = "业务名称")
@NotBlank(message = "业务名称不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private String businessName;
@ApiModelProperty(value = "业务组件")
@NotBlank(message = "业务组件不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private String businessComponent;
@ApiModelProperty(value = "流程定义ID")
@NotBlank(message = "流程定义ID不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private String processDefinitionId;
@ApiModelProperty(value = "消息模板")
@NotBlank(message = "消息模板不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private String businessTempalte;
@ApiModelProperty(value = "状态")
@NotNull(message = "状态不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private String status;
@ApiModelProperty(value = "备注")
private String remark;
}
package cn.datax.service.workflow.api.entity;
import cn.datax.common.base.DataScopeBaseEntity;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
* <p>
* 业务流程配置表
* </p>
*
* @author yuwei
* @since 2020-09-22
*/
@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@TableName("flow_business")
public class BusinessEntity extends DataScopeBaseEntity {
private static final long serialVersionUID=1L;
/**
* 业务编码
*/
private String businessCode;
/**
* 业务名称
*/
private String businessName;
/**
* 业务组件
*/
private String businessComponent;
/**
* 流程定义ID
*/
private String processDefinitionId;
/**
* 消息模板
*/
private String businessTempalte;
}
package cn.datax.service.workflow.api.query;
import cn.datax.common.base.BaseQueryParams;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* <p>
* 业务流程配置表 查询实体
* </p>
*
* @author yuwei
* @since 2020-09-22
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class BusinessQuery extends BaseQueryParams {
private static final long serialVersionUID=1L;
private String businessCode;
private String businessName;
}
package cn.datax.service.workflow.api.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* <p>
* 业务流程配置表 实体VO
* </p>
*
* @author yuwei
* @since 2020-09-22
*/
@Data
public class BusinessVo implements Serializable {
private static final long serialVersionUID=1L;
private String id;
private String status;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private LocalDateTime createTime;
private String businessCode;
private String businessName;
private String businessComponent;
private String processDefinitionId;
private String businessTempalte;
}
package cn.datax.service.workflow.config; package cn.datax.service.workflow.config;
import cn.datax.common.core.DataConstant;
import cn.datax.common.core.RedisConstant;
import cn.datax.common.redis.service.RedisService;
import cn.datax.service.workflow.api.entity.BusinessEntity;
import cn.datax.service.workflow.dao.BusinessDao;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner; import org.springframework.boot.ApplicationRunner;
import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.ConfigurableApplicationContext;
...@@ -9,6 +16,9 @@ import org.springframework.stereotype.Component; ...@@ -9,6 +16,9 @@ import org.springframework.stereotype.Component;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Component @Component
@RequiredArgsConstructor @RequiredArgsConstructor
...@@ -17,6 +27,12 @@ public class StartedUpRunner implements ApplicationRunner { ...@@ -17,6 +27,12 @@ public class StartedUpRunner implements ApplicationRunner {
private final ConfigurableApplicationContext context; private final ConfigurableApplicationContext context;
private final Environment environment; private final Environment environment;
@Autowired
private BusinessDao businessDao;
@Autowired
private RedisService redisService;
@Override @Override
public void run(ApplicationArguments args) { public void run(ApplicationArguments args) {
if (context.isActive()) { if (context.isActive()) {
...@@ -26,6 +42,16 @@ public class StartedUpRunner implements ApplicationRunner { ...@@ -26,6 +42,16 @@ public class StartedUpRunner implements ApplicationRunner {
"端口号:" + environment.getProperty("server.port") + "\n" + "端口号:" + environment.getProperty("server.port") + "\n" +
"-----------------------------------------"; "-----------------------------------------";
System.out.println(banner); System.out.println(banner);
// 项目启动时,初始化缓存
String businessKey = RedisConstant.WORKFLOW_BUSINESS_KEY;
Boolean hasBusinessKey = redisService.hasKey(businessKey);
if (!hasBusinessKey) {
List<BusinessEntity> businessEntityList = businessDao.selectList(Wrappers.<BusinessEntity>lambdaQuery()
.eq(BusinessEntity::getStatus, DataConstant.EnableState.ENABLE.getKey()));
Map<String, Object> map = businessEntityList.stream().collect(Collectors.toMap(BusinessEntity::getBusinessCode, v -> v, (v1, v2) -> v2));
redisService.hmset(businessKey, map);
}
} }
} }
} }
package cn.datax.service.workflow.controller;
import cn.datax.common.core.JsonPage;
import cn.datax.common.core.R;
import cn.datax.common.validate.ValidationGroups;
import cn.datax.service.workflow.api.dto.BusinessDto;
import cn.datax.service.workflow.api.entity.BusinessEntity;
import cn.datax.service.workflow.api.vo.BusinessVo;
import cn.datax.service.workflow.api.query.BusinessQuery;
import cn.datax.service.workflow.mapstruct.BusinessMapper;
import cn.datax.service.workflow.service.BusinessService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import cn.datax.common.base.BaseController;
import java.util.List;
import java.util.stream.Collectors;
/**
* <p>
* 业务流程配置表 前端控制器
* </p>
*
* @author yuwei
* @since 2020-09-22
*/
@Api(tags = {"业务流程配置表"})
@RestController
@RequestMapping("/business")
public class BusinessController extends BaseController {
@Autowired
private BusinessService businessService;
@Autowired
private BusinessMapper businessMapper;
/**
* 通过ID查询信息
*
* @param id
* @return
*/
@ApiOperation(value = "获取详细信息", notes = "根据url的id来获取详细信息")
@ApiImplicitParam(name = "id", value = "ID", required = true, dataType = "String", paramType = "path")
@GetMapping("/{id}")
public R getBusinessById(@PathVariable String id) {
BusinessEntity businessEntity = businessService.getBusinessById(id);
return R.ok().setData(businessMapper.toVO(businessEntity));
}
/**
* 分页查询信息
*
* @param businessQuery
* @return
*/
@ApiOperation(value = "分页查询", notes = "")
@ApiImplicitParams({
@ApiImplicitParam(name = "businessQuery", value = "查询实体businessQuery", required = true, dataTypeClass = BusinessQuery.class)
})
@GetMapping("/page")
public R getBusinessPage(BusinessQuery businessQuery) {
QueryWrapper<BusinessEntity> queryWrapper = new QueryWrapper<>();
IPage<BusinessEntity> page = businessService.page(new Page<>(businessQuery.getPageNum(), businessQuery.getPageSize()), queryWrapper);
List<BusinessVo> collect = page.getRecords().stream().map(businessMapper::toVO).collect(Collectors.toList());
JsonPage<BusinessVo> jsonPage = new JsonPage<>(page.getCurrent(), page.getSize(), page.getTotal(), collect);
return R.ok().setData(jsonPage);
}
/**
* 添加
* @param business
* @return
*/
@ApiOperation(value = "添加信息", notes = "根据business对象添加信息")
@ApiImplicitParam(name = "business", value = "详细实体business", required = true, dataType = "BusinessDto")
@PostMapping()
public R saveBusiness(@RequestBody @Validated({ValidationGroups.Insert.class}) BusinessDto business) {
BusinessEntity businessEntity = businessService.saveBusiness(business);
return R.ok().setData(businessMapper.toVO(businessEntity));
}
/**
* 修改
* @param business
* @return
*/
@ApiOperation(value = "修改信息", notes = "根据url的id来指定修改对象,并根据传过来的信息来修改详细信息")
@ApiImplicitParams({
@ApiImplicitParam(name = "id", value = "ID", required = true, dataType = "String", paramType = "path"),
@ApiImplicitParam(name = "business", value = "详细实体business", required = true, dataType = "BusinessDto")
})
@PutMapping("/{id}")
public R updateBusiness(@PathVariable String id, @RequestBody @Validated({ValidationGroups.Update.class}) BusinessDto business) {
BusinessEntity businessEntity = businessService.updateBusiness(business);
return R.ok().setData(businessMapper.toVO(businessEntity));
}
/**
* 删除
* @param id
* @return
*/
@ApiOperation(value = "删除", notes = "根据url的id来指定删除对象")
@ApiImplicitParam(name = "id", value = "ID", required = true, dataType = "String", paramType = "path")
@DeleteMapping("/{id}")
public R deleteBusinessById(@PathVariable String id) {
businessService.deleteBusinessById(id);
return R.ok();
}
/**
* 批量删除
* @param ids
* @return
*/
@ApiOperation(value = "批量删除角色", notes = "根据url的ids来批量删除对象")
@ApiImplicitParam(name = "ids", value = "ID集合", required = true, dataType = "List", paramType = "path")
@DeleteMapping("/batch/{ids}")
public R deleteBusinessBatch(@PathVariable List<String> ids) {
businessService.deleteBusinessBatch(ids);
return R.ok();
}
/**
* 刷新缓存
*
* @return
*/
@GetMapping("/refresh")
public R refreshBusiness() {
businessService.refreshBusiness();
return R.ok();
}
}
package cn.datax.service.workflow.dao;
import cn.datax.common.base.BaseDao;
import cn.datax.service.workflow.api.entity.BusinessEntity;
import org.apache.ibatis.annotations.Mapper;
/**
* <p>
* 业务流程配置表 Mapper 接口
* </p>
*
* @author yuwei
* @since 2020-09-22
*/
@Mapper
public interface BusinessDao extends BaseDao<BusinessEntity> {
}
...@@ -22,7 +22,6 @@ public class SubmitCompleteTaskListener implements TaskListener { ...@@ -22,7 +22,6 @@ public class SubmitCompleteTaskListener implements TaskListener {
// 发送消息队列 // 发送消息队列
String businessKey = (String) variables.get(VariablesEnum.businessKey.toString()); String businessKey = (String) variables.get(VariablesEnum.businessKey.toString());
String businessCode = (String) variables.get(VariablesEnum.businessCode.toString()); String businessCode = (String) variables.get(VariablesEnum.businessCode.toString());
// 删除审核参数
log.info("业务审核中:{},{}", businessKey, businessCode); log.info("业务审核中:{},{}", businessKey, businessCode);
log.info("业务审核中状态:{}", DataConstant.AuditState.AUDIT.getKey()); log.info("业务审核中状态:{}", DataConstant.AuditState.AUDIT.getKey());
log.info("退出提交节点用户任务完成监听器"); log.info("退出提交节点用户任务完成监听器");
......
package cn.datax.service.workflow.mapstruct;
import cn.datax.common.mapstruct.EntityMapper;
import cn.datax.service.workflow.api.dto.BusinessDto;
import cn.datax.service.workflow.api.entity.BusinessEntity;
import cn.datax.service.workflow.api.vo.BusinessVo;
import org.mapstruct.Mapper;
/**
* <p>
* 业务流程配置表 Mapper 实体映射
* </p>
*
* @author yuwei
* @since 2020-09-22
*/
@Mapper(componentModel = "spring")
public interface BusinessMapper extends EntityMapper<BusinessDto, BusinessEntity, BusinessVo> {
}
package cn.datax.service.workflow.service;
import cn.datax.service.workflow.api.entity.BusinessEntity;
import cn.datax.service.workflow.api.dto.BusinessDto;
import cn.datax.common.base.BaseService;
import java.util.List;
/**
* <p>
* 业务流程配置表 服务类
* </p>
*
* @author yuwei
* @since 2020-09-22
*/
public interface BusinessService extends BaseService<BusinessEntity> {
BusinessEntity saveBusiness(BusinessDto business);
BusinessEntity updateBusiness(BusinessDto business);
BusinessEntity getBusinessById(String id);
void deleteBusinessById(String id);
void deleteBusinessBatch(List<String> ids);
void refreshBusiness();
}
package cn.datax.service.workflow.service.impl;
import cn.datax.common.core.DataConstant;
import cn.datax.common.core.RedisConstant;
import cn.datax.common.exception.DataException;
import cn.datax.common.redis.service.RedisService;
import cn.datax.service.workflow.api.entity.BusinessEntity;
import cn.datax.service.workflow.api.dto.BusinessDto;
import cn.datax.service.workflow.service.BusinessService;
import cn.datax.service.workflow.mapstruct.BusinessMapper;
import cn.datax.service.workflow.dao.BusinessDao;
import cn.datax.common.base.BaseServiceImpl;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* <p>
* 业务流程配置表 服务实现类
* </p>
*
* @author yuwei
* @since 2020-09-22
*/
@Service
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
public class BusinessServiceImpl extends BaseServiceImpl<BusinessDao, BusinessEntity> implements BusinessService {
@Autowired
private BusinessDao businessDao;
@Autowired
private BusinessMapper businessMapper;
@Autowired
private RedisService redisService;
@Override
@Transactional(rollbackFor = Exception.class)
public BusinessEntity saveBusiness(BusinessDto businessDto) {
BusinessEntity business = businessMapper.toEntity(businessDto);
int n = businessDao.selectCount(Wrappers.<BusinessEntity>lambdaQuery().eq(BusinessEntity::getBusinessCode, business.getBusinessCode()));
if(n > 0){
throw new DataException("该业务编码已存在");
}
businessDao.insert(business);
return business;
}
@Override
@Transactional(rollbackFor = Exception.class)
public BusinessEntity updateBusiness(BusinessDto businessDto) {
BusinessEntity business = businessMapper.toEntity(businessDto);
businessDao.updateById(business);
return business;
}
@Override
public BusinessEntity getBusinessById(String id) {
BusinessEntity businessEntity = super.getById(id);
return businessEntity;
}
@Override
@Transactional(rollbackFor = Exception.class)
public void deleteBusinessById(String id) {
businessDao.deleteById(id);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void deleteBusinessBatch(List<String> ids) {
businessDao.deleteBatchIds(ids);
}
@Override
public void refreshBusiness() {
String key = RedisConstant.WORKFLOW_BUSINESS_KEY;
Boolean hasKey = redisService.hasKey(key);
if (hasKey) {
redisService.del(key);
}
List<BusinessEntity> businessEntityList = businessDao.selectList(Wrappers.<BusinessEntity>lambdaQuery()
.eq(BusinessEntity::getStatus, DataConstant.EnableState.ENABLE.getKey()));
// 第一个参数BusinessEntity::getBusinessCode 表示选择BusinessEntity的businessCode作为map的key值
// 第二个参数v -> v表示选择将原来的对象作为map的value值
// 第三个参数(v1, v2) -> v2中,如果v1与v2的key值相同,选择v2作为那个key所对应的value值
Map<String, Object> map = businessEntityList.stream().collect(Collectors.toMap(BusinessEntity::getBusinessCode, v -> v, (v1, v2) -> v2));
redisService.hmset(key, map);
}
}
...@@ -125,7 +125,6 @@ public class FlowInstanceServiceImpl implements FlowInstanceService { ...@@ -125,7 +125,6 @@ public class FlowInstanceServiceImpl implements FlowInstanceService {
if(StrUtil.isNotBlank(request.getBusinessKey())){ if(StrUtil.isNotBlank(request.getBusinessKey())){
processInstanceBuilder.businessKey(request.getBusinessKey()); processInstanceBuilder.businessKey(request.getBusinessKey());
} }
// 流程实例标题(动态拼接)
if(StrUtil.isNotBlank(request.getBusinessName())){ if(StrUtil.isNotBlank(request.getBusinessName())){
processInstanceBuilder.name(request.getBusinessName()); processInstanceBuilder.name(request.getBusinessName());
} }
......
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.datax.service.workflow.dao.BusinessDao">
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="cn.datax.service.workflow.api.entity.BusinessEntity">
<result column="id" property="id" />
<result column="status" property="status" />
<result column="create_by" property="createBy" />
<result column="create_time" property="createTime" />
<result column="create_dept" property="createDept" />
<result column="update_by" property="updateBy" />
<result column="update_time" property="updateTime" />
<result column="remark" property="remark" />
<result column="business_code" property="businessCode" />
<result column="business_name" property="businessName" />
<result column="business_component" property="businessComponent" />
<result column="process_definition_id" property="processDefinitionId" />
<result column="business_tempalte" property="businessTempalte" />
</resultMap>
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
id,
status,
create_by,
create_time,
create_dept,
update_by,
update_time,
remark, business_code, business_name, business_component, process_definition_id, business_tempalte
</sql>
</mapper>
...@@ -53,6 +53,13 @@ export function updateDataModel(data) { ...@@ -53,6 +53,13 @@ export function updateDataModel(data) {
}) })
} }
export function submitDataModel(id) {
return request({
url: '/data/masterdata/models/submit/' + id,
method: 'post'
})
}
export function createTable(id) { export function createTable(id) {
return request({ return request({
url: '/data/masterdata/models/table/create/' + id, url: '/data/masterdata/models/table/create/' + id,
......
import request from '@/utils/request' import request from '@/utils/request'
export function listDataColumn (data) { export function listDataColumn(data) {
return request({ return request({
url: '/data/metadata/columns/list', url: '/data/metadata/columns/list',
method: 'get', method: 'get',
...@@ -8,7 +8,7 @@ export function listDataColumn (data) { ...@@ -8,7 +8,7 @@ export function listDataColumn (data) {
}) })
} }
export function pageDataColumn (data) { export function pageDataColumn(data) {
return request({ return request({
url: '/data/metadata/columns/page', url: '/data/metadata/columns/page',
method: 'get', method: 'get',
...@@ -16,28 +16,28 @@ export function pageDataColumn (data) { ...@@ -16,28 +16,28 @@ export function pageDataColumn (data) {
}) })
} }
export function getDataColumn (id) { export function getDataColumn(id) {
return request({ return request({
url: '/data/metadata/columns/' + id, url: '/data/metadata/columns/' + id,
method: 'get' method: 'get'
}) })
} }
export function delDataColumn (id) { export function delDataColumn(id) {
return request({ return request({
url: '/data/metadata/columns/' + id, url: '/data/metadata/columns/' + id,
method: 'delete' method: 'delete'
}) })
} }
export function delDataColumns (ids) { export function delDataColumns(ids) {
return request({ return request({
url: '/data/metadata/columns/batch/' + ids, url: '/data/metadata/columns/batch/' + ids,
method: 'delete' method: 'delete'
}) })
} }
export function addDataColumn (data) { export function addDataColumn(data) {
return request({ return request({
url: '/data/metadata/columns', url: '/data/metadata/columns',
method: 'post', method: 'post',
...@@ -45,7 +45,7 @@ export function addDataColumn (data) { ...@@ -45,7 +45,7 @@ export function addDataColumn (data) {
}) })
} }
export function updateDataColumn (data) { export function updateDataColumn(data) {
return request({ return request({
url: '/data/metadata/columns/' + data.id, url: '/data/metadata/columns/' + data.id,
method: 'put', method: 'put',
...@@ -53,7 +53,7 @@ export function updateDataColumn (data) { ...@@ -53,7 +53,7 @@ export function updateDataColumn (data) {
}) })
} }
export function getDataMetadataTree (level, data) { export function getDataMetadataTree(level, data) {
return request({ return request({
url: '/data/metadata/columns/tree/' + level, url: '/data/metadata/columns/tree/' + level,
method: 'get', method: 'get',
......
...@@ -8,6 +8,14 @@ export function listMenu (data) { ...@@ -8,6 +8,14 @@ export function listMenu (data) {
}) })
} }
export function listMenuForFlow (data) {
return request({
url: '/system/menus/list/flow',
method: 'get',
params: data
})
}
export function getMenu (id) { export function getMenu (id) {
return request({ return request({
url: '/system/menus/' + id, url: '/system/menus/' + id,
......
import request from '@/utils/request'
export function refreshBusiness() {
return request({
url: '/workflow/business/refresh',
method: 'get'
})
}
export function pageBusiness(data) {
return request({
url: '/workflow/business/page',
method: 'get',
params: data
})
}
export function getBusiness(id) {
return request({
url: '/workflow/business/' + id,
method: 'get'
})
}
export function delBusiness(id) {
return request({
url: '/workflow/business/' + id,
method: 'delete'
})
}
export function addBusiness(data) {
return request({
url: '/workflow/business',
method: 'post',
data: data
})
}
export function updateBusiness(data) {
return request({
url: '/workflow/business/' + data.id,
method: 'put',
data: data
})
}
...@@ -167,24 +167,6 @@ export default { ...@@ -167,24 +167,6 @@ export default {
} }
}) })
}, },
// 所有菜单节点数据
getMenuAllCheckedKeys() {
// 目前被选中的菜单节点
const checkedKeys = this.$refs.menu.getHalfCheckedKeys()
// 半选中的菜单节点
const halfCheckedKeys = this.$refs.menu.getCheckedKeys()
checkedKeys.unshift.apply(checkedKeys, halfCheckedKeys)
return checkedKeys
},
// 所有部门节点数据
getDeptAllCheckedKeys() {
// 目前被选中的部门节点
const checkedKeys = this.$refs.dept.getHalfCheckedKeys()
// 半选中的部门节点
const halfCheckedKeys = this.$refs.dept.getCheckedKeys()
checkedKeys.unshift.apply(checkedKeys, halfCheckedKeys)
return checkedKeys
},
/** 获取详情 */ /** 获取详情 */
getRole: function(id) { getRole: function(id) {
getRole(id).then(response => { getRole(id).then(response => {
......
<template>
<el-row :gutter="20">
<el-col :span="6">
<el-card class="box-card tree-wrapper" shadow="always">
<el-tree
ref="tree"
:data="treeOptions"
node-key="id"
empty-text="加载中,请稍后"
:props="defaultProps"
default-expand-all
highlight-current
:expand-on-click-node="false"
@node-click="handleNodeClick"
>
<span class="custom-tree-node" slot-scope="{ node, data }">
<span><i v-if="node.level === 1" class="iconfont icon-zuzhi tree-folder" />{{ node.label }}</span>
</span>
</el-tree>
</el-card>
</el-col>
<el-col :span="18">
<el-card class="box-card tree-wrapper" shadow="always">
<el-row type="flex" justify="space-between">
<el-col :span="12">
<el-button-group>
<el-button
type="warning"
icon="el-icon-refresh"
size="mini"
@click="handleCacheRefresh"
>刷新缓存</el-button>
</el-button-group>
</el-col>
<el-col :span="12">
<el-button-group style="float: right;">
<template v-if="showBtns">
<el-button size="mini" round v-if="disabled" @click="disabled = false">修改</el-button>
<el-button size="mini" round v-else @click="handSubmit">保存</el-button>
</template>
</el-button-group>
</el-col>
</el-row>
<el-divider></el-divider>
<el-form ref="form" :model="form" :disabled="disabled">
<el-tree
ref="data"
:data="dataTreeOptions"
show-checkbox
node-key="id"
empty-text="加载中,请稍后"
:props="dataDefaultProps"
highlight-current
:expand-on-click-node="false"
:check-strictly="checkStrictly"
>
<span class="custom-tree-node" slot-scope="{ node, data }">
<span>
<i v-if="node.level === 1" class="iconfont icon-shujuku tree-folder" />
<i v-else-if="node.level === 2" class="iconfont icon-shujubiao tree-folder"/>
<i v-else-if="node.level === 3" class="iconfont icon-shujuziduan tree-folder"/>
{{ data.code ? (data.name ? data.code + '(' + data.name + ')' : data.code) : data.name }}
</span>
</span>
</el-tree>
</el-form>
</el-card>
</el-col>
</el-row>
</template>
<script>
import { listRole } from '@/api/system/role'
import { getDataMetadataTree, getGrantPermission, grantPermission } from '@/api/metadata/datacolumn'
export default {
name: 'DataPermissionList',
data() {
return {
tableHeight: document.body.offsetHeight - 310 + 'px',
// 展示切换
showOptions: {
data: {},
showList: true
},
// 左侧树
treeOptions: [],
defaultProps: {
children: 'children',
label: 'roleName'
},
// 右侧树
dataTreeOptions: [],
dataDefaultProps: {
children: 'children',
label: 'label'
},
checkStrictly: false,
form: {},
disabled: true,
showBtns: false,
btnSubmitEnable: false
}
},
created() {
this.getLeftTree()
this.getRightTree()
},
methods: {
getLeftTree() {
listRole().then(response => {
if (response.success) {
const { data } = response
const tree = {}
tree.roleName = '角色组'
tree.children = data
this.treeOptions = []
this.treeOptions.push(tree)
}
})
},
handleNodeClick(data) {
if (data.id) {
this.form.roleId = data.id
getGrantPermission(data.id).then(response => {
if (response.success) {
const { data } = response
const checkedKeys = data || []
if (checkedKeys && checkedKeys.length > 0) {
this.checkStrictly = true
this.$nextTick(() => {
this.$refs.data.setCheckedKeys(checkedKeys)
this.checkStrictly = false
})
}
this.showBtns = true
}
})
}
},
getRightTree() {
getDataMetadataTree('column').then(response => {
if (response.success) {
const { data } = response
this.dataTreeOptions = data
}
})
},
// 获取选中节点数据
getAllCheckedKeys() {
// 目前被选中的节点
const checkedKeys = this.$refs.data.getHalfCheckedKeys()
// 半选中的菜单节点
const halfCheckedKeys = this.$refs.data.getCheckedKeys()
checkedKeys.unshift.apply(checkedKeys, halfCheckedKeys)
return checkedKeys
},
handSubmit() {
this.form.ids = this.getAllCheckedKeys()
grantPermission(this.form).then(response => {
if (response.success) {
this.$message.success('保存成功')
this.disabled = true
}
})
},
handleCacheRefresh() {}
}
}
</script>
<style lang="scss" scoped>
.right-toolbar {
float: right;
}
.el-card ::v-deep .el-card__body {
height: calc(100vh - 170px);
}
.tree-wrapper {
overflow-y: auto;
::v-deep .custom-tree-node {
flex: 1;
display: flex;
align-items: center;
justify-content: space-between;
font-size: 14px;
.tree-folder {
margin-right: 5px;
color: #f6cf07;
}
}
}
</style>
<template>
<div class="app-container">
<transition name="el-zoom-in-center">
<data-permission-list v-if="options.showList" @showCard="showCard" />
</transition>
</div>
</template>
<script>
import DataPermissionList from './DataPermissionList'
export default {
name: 'DataPermission',
components: { DataPermissionList },
data() {
return {
options: {
data: {},
showList: true
}
}
},
methods: {
showCard(data) {
Object.assign(this.options, data)
}
}
}
</script>
<style lang="scss" scoped>
</style>
<template>
<el-card class="box-card" shadow="always">
<div slot="header" class="clearfix">
<span>{{ title }}</span>
<el-button-group style="float: right;">
<el-button size="mini" icon="el-icon-plus" round :loading="loadingOptions.loading" :disabled="loadingOptions.isDisabled" @click="submitForm">{{ loadingOptions.loadingText }}</el-button>
<el-button size="mini" icon="el-icon-back" round @click="showCard">返回</el-button>
</el-button-group>
</div>
<div class="body-wrapper">
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="业务编码" prop="businessCode">
<el-select v-model="form.businessCode" clearable filterable @change="changeValue($event)" placeholder="请输入业务编码">
<el-option
v-for="item in menuOptions"
:key="item.menuCode"
:label="item.menuName"
:value="item.menuCode">
<span style="float: left">{{ '业务名称:' + item.menuName + '-业务编码:' + item.menuCode }}</span>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="流程定义ID" prop="processDefinitionId">
<el-input v-model="form.processDefinitionId" placeholder="请输入流程定义ID" />
</el-form-item>
<el-form-item label="消息模板" prop="businessTempalte">
<el-input v-model="form.businessTempalte" type="textarea" placeholder="请输入消息模板,模板字段{nickname、datetime、businessName、businessKey}" />
</el-form-item>
<el-form-item label="状态" prop="status">
<el-radio-group v-model="form.status">
<el-radio
v-for="dict in statusOptions"
:key="dict.id"
:label="dict.itemText"
>{{ dict.itemValue }}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
</el-form-item>
</el-form>
</div>
</el-card>
</template>
<script>
import { addBusiness } from '@/api/workflow/business'
import { listMenuForFlow } from '@/api/system/menu'
export default {
name: 'BusinessAdd',
props: {
data: {
type: Object,
default: function() {
return {}
}
}
},
data() {
return {
title: '业务流程配置新增',
// 展示切换
showOptions: {
data: {},
showList: true,
showAdd: false,
showEdit: false,
showDetail: false
},
// 保存按钮
loadingOptions: {
loading: false,
loadingText: '保存',
isDisabled: false
},
// 表单参数
form: {
status: '1'
},
// 表单校验
rules: {
businessCode: [
{ required: true, message: '业务编码不能为空', trigger: 'blur' }
],
processDefinitionId: [
{ required: true, message: '流程定义ID不能为空', trigger: 'blur' }
]
},
// 状态数据字典
statusOptions: [],
menuOptions: []
}
},
created() {
this.getDicts('sys_common_status').then(response => {
if (response.success) {
this.statusOptions = response.data
}
})
this.getMenuOptions()
},
methods: {
showCard() {
this.$emit('showCard', this.showOptions)
},
getMenuOptions() {
listMenuForFlow().then(response => {
if (response.success) {
const { data } = response
this.menuOptions = data
}
})
},
changeValue(value) {
const obj = this.menuOptions.find(function(item) {
return item.menuCode === value
})
this.form.businessName = obj.menuName
this.form.businessComponent = obj.menuComponent
},
/** 提交按钮 */
submitForm: function() {
this.$refs['form'].validate(valid => {
if (valid) {
this.loadingOptions.loading = true
this.loadingOptions.loadingText = '保存中...'
this.loadingOptions.isDisabled = true
addBusiness(this.form).then(response => {
if (response.success) {
this.$message.success('保存成功')
setTimeout(() => {
// 2秒后跳转列表页
this.$emit('showCard', this.showOptions)
}, 2000)
} else {
this.$message.error('保存失败')
this.loadingOptions.loading = false
this.loadingOptions.loadingText = '保存'
this.loadingOptions.isDisabled = false
}
}).catch(() => {
this.loadingOptions.loading = false
this.loadingOptions.loadingText = '保存'
this.loadingOptions.isDisabled = false
})
}
})
}
}
}
</script>
<style lang="scss" scoped>
.el-card ::v-deep .el-card__body {
height: calc(100vh - 230px);
overflow-y: auto;
}
</style>
<template>
<el-card class="box-card" shadow="always">
<div slot="header" class="clearfix">
<span>{{ title }}</span>
<el-button-group style="float: right;">
<el-button size="mini" icon="el-icon-back" round @click="showCard">返回</el-button>
</el-button-group>
</div>
<div class="body-wrapper">
<el-form ref="form" :model="form" label-width="80px" disabled>
<el-form-item label="业务编码" prop="businessCode">
<el-select v-model="form.businessCode" placeholder="请输入业务编码">
<el-option
v-for="item in menuOptions"
:key="item.menuCode"
:label="item.menuName"
:value="item.menuCode">
<span style="float: left">{{ '业务名称:' + item.menuName + '-业务编码:' + item.menuCode }}</span>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="流程定义ID" prop="processDefinitionId">
<el-input v-model="form.processDefinitionId" placeholder="请输入流程定义ID" />
</el-form-item>
<el-form-item label="消息模板" prop="businessTempalte">
<el-input v-model="form.businessTempalte" type="textarea" placeholder="请输入消息模板" />
</el-form-item>
<el-form-item label="状态" prop="status">
<el-radio-group v-model="form.status">
<el-radio
v-for="dict in statusOptions"
:key="dict.id"
:label="dict.itemText"
>{{ dict.itemValue }}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
</el-form-item>
</el-form>
</div>
</el-card>
</template>
<script>
import { getBusiness } from '@/api/workflow/business'
import { listMenuForFlow } from '@/api/system/menu'
export default {
name: 'BusinessDetail',
props: {
data: {
type: Object,
default: function() {
return {}
}
}
},
data() {
return {
title: '业务流程配置详情',
// 展示切换
showOptions: {
data: {},
showList: true,
showAdd: false,
showEdit: false,
showDetail: false
},
// 表单参数
form: {},
// 状态数据字典
statusOptions: [],
menuOptions: []
}
},
created() {
console.log('id:' + this.data.id)
this.getDicts('sys_common_status').then(response => {
if (response.success) {
this.statusOptions = response.data
}
})
this.getMenuOptions()
},
mounted() {
this.getBusiness(this.data.id)
},
methods: {
showCard() {
this.$emit('showCard', this.showOptions)
},
/** 获取详情 */
getBusiness: function(id) {
getBusiness(id).then(response => {
if (response.success) {
this.form = response.data
}
})
},
getMenuOptions() {
listMenuForFlow().then(response => {
if (response.success) {
const { data } = response
this.menuOptions = data
}
})
},
}
}
</script>
<style lang="scss" scoped>
.el-card ::v-deep .el-card__body {
height: calc(100vh - 230px);
overflow-y: auto;
}
</style>
<template>
<el-card class="box-card" shadow="always">
<div slot="header" class="clearfix">
<span>{{ title }}</span>
<el-button-group style="float: right;">
<el-button size="mini" icon="el-icon-plus" round :loading="loadingOptions.loading" :disabled="loadingOptions.isDisabled" @click="submitForm">{{ loadingOptions.loadingText }}</el-button>
<el-button size="mini" icon="el-icon-back" round @click="showCard">返回</el-button>
</el-button-group>
</div>
<div class="body-wrapper">
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="业务编码" prop="businessCode">
<el-select v-model="form.businessCode" clearable filterable @change="changeValue($event)" placeholder="请输入业务编码">
<el-option
v-for="item in menuOptions"
:key="item.menuCode"
:label="item.menuName"
:value="item.menuCode">
<span style="float: left">{{ '业务名称:' + item.menuName + '-业务编码:' + item.menuCode }}</span>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="流程定义ID" prop="processDefinitionId">
<el-input v-model="form.processDefinitionId" placeholder="请输入流程定义ID" />
</el-form-item>
<el-form-item label="消息模板" prop="businessTempalte">
<el-input v-model="form.businessTempalte" type="textarea" placeholder="请输入消息模板,模板字段{nickname、datetime、businessName、businessKey}" />
</el-form-item>
<el-form-item label="状态" prop="status">
<el-radio-group v-model="form.status">
<el-radio
v-for="dict in statusOptions"
:key="dict.id"
:label="dict.itemText"
>{{ dict.itemValue }}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
</el-form-item>
</el-form>
</div>
</el-card>
</template>
<script>
import { getBusiness, updateBusiness } from '@/api/workflow/business'
import { listMenuForFlow } from '@/api/system/menu'
export default {
name: 'BusinessEdit',
props: {
data: {
type: Object,
default: function() {
return {}
}
}
},
data() {
return {
title: '业务流程配置编辑',
// 展示切换
showOptions: {
data: {},
showList: true,
showAdd: false,
showEdit: false,
showDetail: false
},
// 保存按钮
loadingOptions: {
loading: false,
loadingText: '保存',
isDisabled: false
},
// 表单参数
form: {},
// 表单校验
rules: {
businessCode: [
{ required: true, message: '业务编码不能为空', trigger: 'blur' }
],
processDefinitionId: [
{ required: true, message: '流程定义ID不能为空', trigger: 'blur' }
]
},
// 状态数据字典
statusOptions: [],
menuOptions: []
}
},
created() {
console.log('id:' + this.data.id)
this.getDicts('sys_common_status').then(response => {
if (response.success) {
this.statusOptions = response.data
}
})
this.getMenuOptions()
},
mounted() {
this.getBusiness(this.data.id)
},
methods: {
showCard() {
this.$emit('showCard', this.showOptions)
},
/** 获取详情 */
getBusiness: function(id) {
getBusiness(id).then(response => {
if (response.success) {
this.form = response.data
}
})
},
getMenuOptions() {
listMenuForFlow().then(response => {
if (response.success) {
const { data } = response
this.menuOptions = data
}
})
},
changeValue(value) {
const obj = this.menuOptions.find(function(item) {
return item.menuCode === value
})
this.form.businessName = obj.menuName
this.form.businessComponent = obj.menuComponent
},
/** 提交按钮 */
submitForm: function() {
this.$refs['form'].validate(valid => {
if (valid) {
this.loadingOptions.loading = true
this.loadingOptions.loadingText = '保存中...'
this.loadingOptions.isDisabled = true
updateBusiness(this.form).then(response => {
if (response.success) {
this.$message.success('保存成功')
setTimeout(() => {
// 2秒后跳转列表页
this.$emit('showCard', this.showOptions)
}, 2000)
} else {
this.$message.error('保存失败')
this.loadingOptions.loading = false
this.loadingOptions.loadingText = '保存'
this.loadingOptions.isDisabled = false
}
}).catch(() => {
this.loadingOptions.loading = false
this.loadingOptions.loadingText = '保存'
this.loadingOptions.isDisabled = false
})
}
})
}
}
}
</script>
<style lang="scss" scoped>
.el-card ::v-deep .el-card__body {
height: calc(100vh - 230px);
overflow-y: auto;
}
</style>
<template>
<div class="app-container">
<transition name="el-zoom-in-center">
<business-list v-if="options.showList" @showCard="showCard" />
</transition>
<transition name="el-zoom-in-top">
<business-add v-if="options.showAdd" :data="options.data" @showCard="showCard" />
</transition>
<transition name="el-zoom-in-top">
<business-edit v-if="options.showEdit" :data="options.data" @showCard="showCard" />
</transition>
<transition name="el-zoom-in-bottom">
<business-detail v-if="options.showDetail" :data="options.data" @showCard="showCard" />
</transition>
</div>
</template>
<script>
import BusinessList from './BusinessList'
import BusinessAdd from './BusinessAdd'
import BusinessEdit from './BusinessEdit'
import BusinessDetail from './BusinessDetail'
export default {
name: 'Business',
components: { BusinessList, BusinessAdd, BusinessEdit, BusinessDetail },
data() {
return {
options: {
data: {},
showList: true,
showAdd: false,
showEdit: false,
showDetail: false
}
}
},
methods: {
showCard(data) {
Object.assign(this.options, data)
}
}
}
</script>
<style lang="scss" scoped>
</style>
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