Merge remote-tracking branch 'origin/dev_2307' into dev_2307

dev^2
chengyufei 1 year ago
commit 1943f257a6
  1. 17
      ant-design-vue-jeecg/src/views/modulex/ModulexList.vue
  2. 5
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/demo/functionx/entity/FunctionxTest.java
  3. 192
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/demo/functionx/service/impl/FunctionXTestServiceImpl.java
  4. 345
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/demo/rulex/controller/RulexController.java
  5. 15
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/demo/rulex/entity/RuleVo.java
  6. 2
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/demo/rulex/entity/Rulex.java

@ -602,22 +602,25 @@ export default {
}, },
ruleData: function () { ruleData: function () {
return { return {
note: ['对应模块(必填):填写正确的模块名称', note: [
'对应项目(必填):填写正确的项目名称',
'上级模块(非必填):填写正确的上级模块名称',
'对应模块(必填):填写正确的模块名称',
'对应功能(必填):填写正确的功能名称', '对应功能(必填):填写正确的功能名称',
'对应实体(必填):填写正确的实体名称', '对应实体(非必填):填写正确的实体名称',
'顺序号(必填):同功能下不重复', '对应字段(非必填):填写正确的字段名称',
'顺序号(必填):同功能下不重复,为正整数且与规则编码顺序号相等',
'规则编码(必填):功能编码+顺序号(格式001)', '规则编码(必填):功能编码+顺序号(格式001)',
'规则描述(非必填)', '规则描述(非必填)',
'分析图(非必填)', '责任人(非必填):如果有多个值请使用逗号分割',
'责任人(非必填):如果有多个值请使用,分割',
'任务等级(必填):值:1、2、3、4、5个等级', '任务等级(必填):值:1、2、3、4、5个等级',
'任务状态(必填):值:未发布、已发布、开发中、已完成、已撤回、已取消', '任务状态(必填):值:未发布、已发布、开发中、已完成、已撤回、已取消',
'版本状态(必填): 可填入值为[当前、历史]', '版本状态(必填): 可填入值为[当前、历史]',
'规则状态(必填): 值:正常、停用、废弃', '规则状态(必填): 值:正常、停用、废弃',
'开始时间(非必填):时间格式2023-04-11 14:21:22', '开始时间(非必填):时间格式2023-04-11 14:21:22',
'任务时长(非必填)', '任务时长(非必填):正整数',
'提交时间(非必填):时间格式2023-04-11 14:21:22', '提交时间(非必填):时间格式2023-04-11 14:21:22',
'实际时长(非必填)', '实际时长(非必填):正整数',
'规则状态(必填):值:正常、停用、废弃', '规则状态(必填):值:正常、停用、废弃',
'版本号(必填):请填写小于五位数的正整数' '版本号(必填):请填写小于五位数的正整数'
], ],

@ -24,8 +24,7 @@ public class FunctionxTest implements Serializable {
/** /**
* 对应上级模块 * 对应上级模块
*/ */
@TableField("p_module_name") private String project;
private String pModuleName;
/** /**
* 对应模块 * 对应模块
@ -45,7 +44,7 @@ public class FunctionxTest implements Serializable {
/** /**
* 功能编码 * 功能编码
*/ */
private String functionCode; // private String functionCode;
/** /**
* 功能类型 * 功能类型

@ -23,13 +23,14 @@ import org.jeecg.modules.modulex.entity.Modulex;
import org.jeecg.modules.modulex.service.IModulexService; import org.jeecg.modules.modulex.service.IModulexService;
import org.jeecg.modules.projectUserRole.entity.ProjectUserRole; import org.jeecg.modules.projectUserRole.entity.ProjectUserRole;
import org.jeecg.modules.projectUserRole.service.IProjectUserRoleService; import org.jeecg.modules.projectUserRole.service.IProjectUserRoleService;
import org.jeecg.modules.projectx.entity.Projectx;
import org.jeecg.modules.projectx.service.IProjectxService;
import org.jeecg.modules.system.entity.SysUser; import org.jeecg.modules.system.entity.SysUser;
import org.jeecg.modules.system.service.ISysUserService; import org.jeecg.modules.system.service.ISysUserService;
import org.jeecg.modules.tablex.vo.TablexVo;
import org.jeecg.modules.tablex.ws.WebSocketUtils; import org.jeecg.modules.tablex.ws.WebSocketUtils;
import org.jeecgframework.poi.excel.entity.ImportParams;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import java.io.IOException; import java.io.IOException;
@ -49,8 +50,11 @@ public class FunctionXTestServiceImpl extends ServiceImpl<FunctionxTestMapper, F
private ISysUserService sysUserService; private ISysUserService sysUserService;
@Autowired @Autowired
private WebSocketUtils webSocketUtils; private WebSocketUtils webSocketUtils;
@Autowired
private IProjectxService projectxService;
@Override @Override
@Transactional
public Result<?> importExcel(MultipartFile file) { public Result<?> importExcel(MultipartFile file) {
// 获取当前操作用户 // 获取当前操作用户
@ -137,46 +141,51 @@ public class FunctionXTestServiceImpl extends ServiceImpl<FunctionxTestMapper, F
} }
//------------接收------------- //------------接收-------------
FunctionxTest fun = new FunctionxTest(); FunctionxTest fun = new FunctionxTest();
fun.setPModuleName(list.get(0)); fun.setProject(list.get(0)); // 对应项目
fun.setModuleName(list.get(1)); // 对应模块 fun.setModuleName(list.get(1)); // 对应模块
fun.setFunctionName(list.get(2)); // 中文名称 fun.setFunctionName(list.get(2)); // 中文名称
fun.setFunctionEnName(list.get(3)); // 英文名称 fun.setFunctionEnName(list.get(3)); // 英文名称
fun.setFunctionCode(list.get(4)); // 功能编码 // fun.setFunctionCode(list.get(4)); // 功能编码
fun.setFunctionType(list.get(5)); // 功能类型 fun.setFunctionType(list.get(4)); // 功能类型
fun.setPmDescribe(list.get(6)); // 功能描述 fun.setPmDescribe(list.get(5)); // 功能描述
fun.setUserRole(list.get(7)); // 用户角色 fun.setUserRole(list.get(6)); // 用户角色
fun.setManagerUsers(list.get(8)); // 责任人 fun.setManagerUsers(list.get(7)); // 责任人
fun.setWorkLevel(list.get(9)); // 任务等级 fun.setWorkLevel(list.get(8)); // 任务等级
fun.setWorkStatus(list.get(10)); // 任务状态 fun.setWorkStatus(list.get(9)); // 任务状态
fun.setPublishTime(list.get(11)); // 发布时间 fun.setPublishTime(list.get(10)); // 发布时间
fun.setStartTime(list.get(12)); // 开始时间 fun.setStartTime(list.get(11)); // 开始时间
fun.setDuration(list.get(13)); // 任务时长 fun.setDuration(list.get(12)); // 任务时长
fun.setSubmitTime(list.get(14)); // 提交时间 fun.setSubmitTime(list.get(13)); // 提交时间
fun.setRealDuration(list.get(15)); // 实际时长 fun.setRealDuration(list.get(14)); // 实际时长
fun.setStatus(list.get(16)); // 功能状态 fun.setStatus(list.get(15)); // 功能状态
fun.setVerisonStatus(list.get(17)); // 版本状态 fun.setVerisonStatus(list.get(16)); // 版本状态
fun.setVerison(list.get(18)); // 版本号 fun.setVerison(list.get(17)); // 版本号
fun.setCreatName(username); fun.setCreatName(username);
listVo.add(fun); listVo.add(fun);
} }
} }
boolean isSuccessSave = this.saveBatch(listVo);
if (!isSuccessSave) { LambdaQueryWrapper<FunctionxTest> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(username != null, FunctionxTest::getCreatName, username);
List<FunctionxTest> list = this.list(queryWrapper);
int isSaveTestSuccess = saveTest(listVo);
if (isSaveTestSuccess != -1){
this.remove(queryWrapper);
message.put("isError", "true"); message.put("isError", "true");
message.put("status", "文件读入失败"); message.put("status", "第" + (isSaveTestSuccess+1) + "行中文名或英文名有重复");
message.put("closeable", "true"); message.put("closeable", "true");
webSocketUtils.sendMessage(loginUser.getId(), message); webSocketUtils.sendMessage(loginUser.getId(), message);
return Result.error("文件读入失败"); return Result.error("中文名或英文名有重复");
} }
message.put("status", "数据校验"); message.put("status", "数据校验");
webSocketUtils.sendMessage(loginUser.getId(), message); webSocketUtils.sendMessage(loginUser.getId(), message);
//************************具体字段校验****************************** //************************具体字段校验******************************
LambdaQueryWrapper<FunctionxTest> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(username != null, FunctionxTest::getCreatName, username);
List<FunctionxTest> list = this.list(queryWrapper);
boolean remove = this.remove(queryWrapper); boolean remove = this.remove(queryWrapper);
if (!remove) { if (!remove) {
@ -193,11 +202,11 @@ public class FunctionXTestServiceImpl extends ServiceImpl<FunctionxTestMapper, F
for (int i = 0; i < list.size(); i++) { for (int i = 0; i < list.size(); i++) {
FunctionxTest function = list.get(i); FunctionxTest function = list.get(i);
Functionx functionx = new Functionx(); Functionx functionx = new Functionx();
String pModuleId = function.getPModuleName(); String project = function.getProject();
String moduleId = function.getModuleName(); String moduleId = function.getModuleName();
String functionName = function.getFunctionName(); String functionName = function.getFunctionName();
String functionEnName = function.getFunctionEnName(); String functionEnName = function.getFunctionEnName();
String functionCode = function.getFunctionCode(); // String functionCode = function.getFunctionCode();
String functionType = function.getFunctionType(); String functionType = function.getFunctionType();
String pmDescribe = function.getPmDescribe(); String pmDescribe = function.getPmDescribe();
String userRole = function.getUserRole(); String userRole = function.getUserRole();
@ -214,8 +223,30 @@ public class FunctionXTestServiceImpl extends ServiceImpl<FunctionxTestMapper, F
String verison = function.getVerison(); String verison = function.getVerison();
String moduleName = ""; // 模块编码 String moduleName = ""; // 模块编码
String moduleCode= ""; // 模块编码
functionx.setCreateBy(username); // 创建人 functionx.setCreateBy(username); // 创建人
functionx.setCreateTime(new Date()); //创建日期 functionx.setCreateTime(new Date()); //创建日期
if (StringUtils.isBlank(project)) {
message.put("isError", "true");
message.put("status", "第" + (i+1) + "行数据项目名称不能为空");
message.put("closeable", "true");
webSocketUtils.sendMessage(loginUser.getId(), message);
return Result.error("项目名称不能为空");
} else {
LambdaQueryWrapper<Projectx> projectxQueryWrapper =new LambdaQueryWrapper<>();
projectxQueryWrapper.eq(Projectx::getProjectName,project);
List<Projectx> list1 = projectxService.list(projectxQueryWrapper);
if (list1.size()==0){
message.put("isError", "true");
message.put("status", "第" + i + "行数据项目名称错误");
message.put("closeable", "true");
webSocketUtils.sendMessage(loginUser.getId(), message);
return Result.error("项目名称错误");
}
project = list1.get(0).getId(); // 此时project为项目id
}
if (StringUtils.isBlank(moduleId)) { if (StringUtils.isBlank(moduleId)) {
message.put("isError", "true"); message.put("isError", "true");
message.put("status", "第" + i + "行数据对应模块不能为空"); message.put("status", "第" + i + "行数据对应模块不能为空");
@ -223,30 +254,13 @@ public class FunctionXTestServiceImpl extends ServiceImpl<FunctionxTestMapper, F
webSocketUtils.sendMessage(loginUser.getId(), message); webSocketUtils.sendMessage(loginUser.getId(), message);
return Result.error("对应模块不能为空"); return Result.error("对应模块不能为空");
} else { } else {
if (pModuleId != null && pModuleId.length()>0) { for (Modulex modulex : modulexList) {
String pid = ""; if (modulex.getModuleName().equals(moduleId) && modulex.getProjectId().equals(project)) {
for (Modulex modulex : modulexList) { functionx.setModuleId(modulex.getId());
if (modulex.getModuleName().equals(pModuleId)) { moduleId = modulex.getId();
pid = modulex.getId(); moduleName = modulex.getModuleName();
break; moduleCode = modulex.getModuleCode();
} break;
}
for (Modulex modulex : modulexList) {
if (modulex.getModuleName().equals(moduleId) && modulex.getPid().equals(pid)) {
functionx.setModuleId(modulex.getId());
moduleId = modulex.getId();
moduleName = modulex.getModuleName();
break;
}
}
} else {
for (Modulex modulex : modulexList) {
if (modulex.getModuleName().equals(moduleId) && modulex.getPid() == null) {
functionx.setModuleId(modulex.getId());
moduleId = modulex.getId();
moduleName = modulex.getModuleName();
break;
}
} }
} }
if (functionx.getModuleId() == null) { if (functionx.getModuleId() == null) {
@ -342,30 +356,32 @@ public class FunctionXTestServiceImpl extends ServiceImpl<FunctionxTestMapper, F
} }
functionx.setFunctionType(type); functionx.setFunctionType(type);
} }
// 模块编码+功能缩写;自动填充+手动修改 // 模块编码+功能缩写;自动填充+手动修改 // 改为自动生成
if (StringUtils.isBlank(functionCode)) { String firstChar = toFirstChar(functionName);
message.put("isError", "true"); String functionCode = moduleCode + firstChar;
message.put("status", "第" + (i+1) + "行数据数据功能编码不能为空"); functionx.setFunctionCode(functionCode);
message.put("closeable", "true"); // if (StringUtils.isBlank(functionCode)) {
webSocketUtils.sendMessage(loginUser.getId(), message); // message.put("isError", "true");
return Result.error("功能编码不能为空"); // message.put("status", "第" + (i+1) + "行数据数据功能编码不能为空");
} else { // message.put("closeable", "true");
LambdaQueryWrapper<Modulex> queryWrapperModulex = new LambdaQueryWrapper<>(); // webSocketUtils.sendMessage(loginUser.getId(), message);
queryWrapperModulex.eq(Modulex::getModuleName, moduleName); // return Result.error("功能编码不能为空");
Modulex modulex = modulexService.getOne(queryWrapperModulex); // } else {
String moduleCode = modulex.getModuleCode(); // LambdaQueryWrapper<Modulex> queryWrapperModulex = new LambdaQueryWrapper<>();
String firstChar = toFirstChar(functionType); // queryWrapperModulex.eq(Modulex::getModuleName, moduleName);
String str = moduleCode + firstChar; // Modulex modulex = modulexService.getOne(queryWrapperModulex);
if (!str.equals(functionCode)) { // String moduleCode = modulex.getModuleCode();
message.put("isError", "true"); // String firstChar = toFirstChar(functionName);
message.put("status", "第" + (i+1) + "行数据数据功能编码错误"); // String str = moduleCode + firstChar;
message.put("closeable", "true"); // if (!str.equals(functionCode)) {
webSocketUtils.sendMessage(loginUser.getId(), message); // message.put("isError", "true");
return Result.error("功能编码错误"); // message.put("status", "第" + (i+1) + "行数据数据功能编码错误");
} // message.put("closeable", "true");
// webSocketUtils.sendMessage(loginUser.getId(), message);
functionx.setFunctionCode(functionCode); // return Result.error("功能编码错误");
} // }
// functionx.setFunctionCode(functionCode);
// }
if (StringUtils.isNotBlank(pmDescribe)) { // 功能描述 if (StringUtils.isNotBlank(pmDescribe)) { // 功能描述
functionx.setPmDescribe(pmDescribe); functionx.setPmDescribe(pmDescribe);
@ -514,6 +530,13 @@ public class FunctionXTestServiceImpl extends ServiceImpl<FunctionxTestMapper, F
if (StringUtils.isNotBlank(duration)) { if (StringUtils.isNotBlank(duration)) {
Double aDouble = Double.valueOf(duration); Double aDouble = Double.valueOf(duration);
if (aDouble <= 0){
message.put("isError", "true");
message.put("status", "第" + (i+1) + "行数据任务时长错误");
message.put("closeable", "true");
webSocketUtils.sendMessage(loginUser.getId(), message);
return Result.error("任务时长错误");
}
functionx.setDuration(aDouble); functionx.setDuration(aDouble);
} }
@ -609,6 +632,13 @@ public class FunctionXTestServiceImpl extends ServiceImpl<FunctionxTestMapper, F
return Result.error("版本号不能为空"); return Result.error("版本号不能为空");
} else { } else {
Integer integer = Integer.valueOf(verison); Integer integer = Integer.valueOf(verison);
if (integer<1){
message.put("isError", "true");
message.put("status", "第" + (i+1) + "行数据数据版本号不能小于1");
message.put("closeable", "true");
webSocketUtils.sendMessage(loginUser.getId(), message);
return Result.error("版本号不能小于1");
}
functionx.setStatus(integer); functionx.setStatus(integer);
} }
@ -639,6 +669,18 @@ public class FunctionXTestServiceImpl extends ServiceImpl<FunctionxTestMapper, F
return Result.OK("导入成功"); return Result.OK("导入成功");
} }
@Transactional
int saveTest(List<FunctionxTest> listVo) {
for (int i = 0; i < listVo.size(); i++) {
try {
this.save(listVo.get(i));
} catch (Exception e) {
return i;
}
}
return -1;
}
private boolean funCheck(List<String> list) { private boolean funCheck(List<String> list) {
for (int i=0;i<list.size();i++){ for (int i=0;i<list.size();i++){
if(list.get(i)!=null && list.get(i).length()>0){ if(list.get(i)!=null && list.get(i).length()>0){

@ -29,6 +29,8 @@ import org.jeecg.modules.fieldx.entity.Fieldx;
import org.jeecg.modules.fieldx.service.IFieldxService; import org.jeecg.modules.fieldx.service.IFieldxService;
import org.jeecg.modules.modulex.entity.Modulex; import org.jeecg.modules.modulex.entity.Modulex;
import org.jeecg.modules.modulex.service.IModulexService; import org.jeecg.modules.modulex.service.IModulexService;
import org.jeecg.modules.projectx.entity.Projectx;
import org.jeecg.modules.projectx.service.impl.ProjectxServiceImpl;
import org.jeecg.modules.system.entity.SysDictItem; import org.jeecg.modules.system.entity.SysDictItem;
import org.jeecg.modules.system.entity.SysUser; import org.jeecg.modules.system.entity.SysUser;
import org.jeecg.modules.system.mapper.SysDictItemMapper; import org.jeecg.modules.system.mapper.SysDictItemMapper;
@ -96,6 +98,9 @@ public class RulexController extends JeecgController<Rulex, IRulexService> {
@Autowired @Autowired
private WebSocketUtils webSocketUtils; private WebSocketUtils webSocketUtils;
@Autowired
private ProjectxServiceImpl projectxService;
@Value("${jeecg.wordPath}") @Value("${jeecg.wordPath}")
private String wordPath; private String wordPath;
@ -258,13 +263,13 @@ public class RulexController extends JeecgController<Rulex, IRulexService> {
message.put("uploaded", "0"); message.put("uploaded", "0");
message.put("status", "判断文件结构"); message.put("status", "判断文件结构");
message.put("isError", "false"); message.put("isError", "false");
message.put("closeable","false"); message.put("closeable", "false");
webSocketUtils.sendMessage(loginUser.getId(), message); webSocketUtils.sendMessage(loginUser.getId(), message);
//判断文件是否为空 //判断文件是否为空
if (file == null) { if (file == null) {
message.put("isError", "true"); message.put("isError", "true");
message.put("closeable","true"); message.put("closeable", "true");
message.put("status","文件上传失败,请重新上传"); message.put("status", "文件上传失败,请重新上传");
webSocketUtils.sendMessage(loginUser.getId(), message); webSocketUtils.sendMessage(loginUser.getId(), message);
return Result.error("文件上传失败,请重新上传"); return Result.error("文件上传失败,请重新上传");
} }
@ -274,8 +279,8 @@ public class RulexController extends JeecgController<Rulex, IRulexService> {
(!originalFilename.endsWith("xls") && (!originalFilename.endsWith("xls") &&
!originalFilename.endsWith("xlsx"))) { !originalFilename.endsWith("xlsx"))) {
message.put("isError", "true"); message.put("isError", "true");
message.put("closeable","true"); message.put("closeable", "true");
message.put("status","文件格式不正确"); message.put("status", "文件格式不正确");
webSocketUtils.sendMessage(loginUser.getId(), message); webSocketUtils.sendMessage(loginUser.getId(), message);
return Result.error("文件格式不正确"); return Result.error("文件格式不正确");
} }
@ -285,8 +290,8 @@ public class RulexController extends JeecgController<Rulex, IRulexService> {
params.setHeadRows(1);//表头行数,默认1 params.setHeadRows(1);//表头行数,默认1
params.setNeedSave(true);//是否需要保存上传的Excel,默认为false params.setNeedSave(true);//是否需要保存上传的Excel,默认为false
message.put("status", "数据预读入"); message.put("status", "数据预读入");
webSocketUtils.sendMessage(loginUser.getId(), message); webSocketUtils.sendMessage(loginUser.getId(), message);
List<RuleVo> list = null; List<RuleVo> list = null;
try { try {
list = ExcelImportUtil.importExcel(file.getInputStream(), RuleVo.class, params); list = ExcelImportUtil.importExcel(file.getInputStream(), RuleVo.class, params);
@ -294,44 +299,45 @@ public class RulexController extends JeecgController<Rulex, IRulexService> {
e.printStackTrace(); e.printStackTrace();
} }
if (list == null || list.size() <= 0) { if (list == null || list.size() <= 0) {
message.put("isError", "true"); message.put("isError", "true");
message.put("closeable","true"); message.put("closeable", "true");
message.put("status","文件导入失败:模板中暂无数据"); message.put("status", "文件导入失败:模板中暂无数据");
webSocketUtils.sendMessage(loginUser.getId(), message); webSocketUtils.sendMessage(loginUser.getId(), message);
return Result.error("文件导入失败:模板中暂无数据"); return Result.error("文件导入失败:模板中暂无数据");
} }
//必要字段判断空值 //必要字段判断空值
for (int i = 0; i < list.size(); i++) { for (int i = 0; i < list.size(); i++) {
if ( if (
StringUtils.isBlank(list.get(i).getRuleNo()) || StringUtils.isBlank(list.get(i).getRuleNo()) ||
StringUtils.isBlank(list.get(i).getRuleCode()) || StringUtils.isBlank(list.get(i).getProjectId()) ||
StringUtils.isBlank(list.get(i).getRuleCode()) ||
// StringUtils.isBlank() list.get(i).getPmDescribe() == null && // StringUtils.isBlank() list.get(i).getPmDescribe() == null &&
StringUtils.isBlank(list.get(i).getModuleId() ) || StringUtils.isBlank(list.get(i).getModuleId()) ||
StringUtils.isBlank(list.get(i).getFunctionId()) || StringUtils.isBlank(list.get(i).getFunctionId()) ||
// StringUtils.isBlank() list.get(i).getDiagrams() == null && // StringUtils.isBlank() list.get(i).getDiagrams() == null &&
StringUtils.isBlank( list.get(i).getTableId() ) || // StringUtils.isBlank(list.get(i).getTableId()) ||
// StringUtils.isBlank() list.get(i).getFieldId() == null || // StringUtils.isBlank() list.get(i).getFieldId() == null ||
StringUtils.isBlank( list.get(i).getManagerUsers())|| StringUtils.isBlank(list.get(i).getManagerUsers()) ||
StringUtils.isBlank(list.get(i).getWorkLevel()) || StringUtils.isBlank(list.get(i).getWorkLevel()) ||
StringUtils.isBlank(list.get(i).getWorkStatus()) || StringUtils.isBlank(list.get(i).getWorkStatus()) ||
// StringUtils.isBlank() list.get(i).getStartTime() == null && // StringUtils.isBlank() list.get(i).getStartTime() == null &&
// StringUtils.isBlank() list.get(i).getManagerUsers() == null && // StringUtils.isBlank() list.get(i).getManagerUsers() == null &&
// StringUtils.isBlank() list.get(i).getDuration() == null && // StringUtils.isBlank() list.get(i).getDuration() == null &&
// StringUtils.isBlank() list.get(i).getSubmitTime() == null && // StringUtils.isBlank() list.get(i).getSubmitTime() == null &&
StringUtils.isBlank(list.get(i).getRealDuration()) && // StringUtils.isBlank(list.get(i).getRealDuration()) &&
StringUtils.isBlank(list.get(i).getStatus() ) || StringUtils.isBlank(list.get(i).getStatus()) ||
StringUtils.isBlank( list.get(i).getVerisonStatus()) || StringUtils.isBlank(list.get(i).getVerisonStatus()) ||
StringUtils.isBlank(list.get(i).getVerison()) ) { StringUtils.isBlank(list.get(i).getVerison())) {
message.put("isError", "true"); message.put("isError", "true");
message.put("closeable","true"); message.put("closeable", "true");
message.put("status","文件导入失败:"+"第"+(i + 1) + "条存在必填数据为空,请核对"); message.put("status", "文件导入失败:" + "第" + (i + 1) + "条存在必填数据为空,请核对");
webSocketUtils.sendMessage(loginUser.getId(), message); webSocketUtils.sendMessage(loginUser.getId(), message);
return Result.error("文件导入失败:"+"第"+(i + 1) + "条不能为空,请核对"); return Result.error("文件导入失败:" + "第" + (i + 1) + "条不能为空,请核对");
}
//存入预存表
iRuleVoService.save(list.get(i));
} }
//存入预存表
iRuleVoService.save(list.get(i));
}
List<Rulex> rulexList; List<Rulex> rulexList;
try { try {
//取出预存表校验字段 //取出预存表校验字段
@ -339,8 +345,8 @@ public class RulexController extends JeecgController<Rulex, IRulexService> {
if (ruleVoList.size() <= 0 || ruleVoList == null) { if (ruleVoList.size() <= 0 || ruleVoList == null) {
message.put("isError", "true"); message.put("isError", "true");
message.put("closeable","true"); message.put("closeable", "true");
message.put("status","文件导入失败,模板不匹配有空值"); message.put("status", "文件导入失败,模板不匹配有空值");
webSocketUtils.sendMessage(loginUser.getId(), message); webSocketUtils.sendMessage(loginUser.getId(), message);
return Result.error("文件导入失败,模板不匹配有空值"); return Result.error("文件导入失败,模板不匹配有空值");
} }
@ -355,13 +361,24 @@ public class RulexController extends JeecgController<Rulex, IRulexService> {
for (int i = 0; i < ruleVoList.size(); i++) { for (int i = 0; i < ruleVoList.size(); i++) {
Rulex rulex = new Rulex(); Rulex rulex = new Rulex();
RuleVo ruleVo = ruleVoList.get(i); RuleVo ruleVo = ruleVoList.get(i);
String projectId = ruleVo.getProjectId();
String pModuleId = ruleVo.getModulePid(); String pModuleId = ruleVo.getModulePid();
String moduleId = ruleVo.getModuleId(); String moduleId = ruleVo.getModuleId();
//对应模块 //对应模块
LambdaQueryWrapper<Projectx> projectxLambdaQueryWrapper =new LambdaQueryWrapper<>();
projectxLambdaQueryWrapper.eq(Projectx::getProjectName,projectId);
Projectx projectx = projectxService.getOne(projectxLambdaQueryWrapper);
if (projectx==null){
message.put("isError", "true");
message.put("closeable", "true");
message.put("status", "第" + (i + 1) + "条数据,项目输入错误,请核对");
webSocketUtils.sendMessage(loginUser.getId(), message);
return Result.error("第" + (i + 1) + "条数据,项目输入错误,请核对");
}
//判断上级模块是否存在 //判断上级模块是否存在
int n = 0; int n = 0;
if (!StringUtils.isBlank(pModuleId) ) { if (!StringUtils.isBlank(pModuleId)) {
//存在 //存在
String pid = ""; String pid = "";
for (Modulex modulex : modulexList) { for (Modulex modulex : modulexList) {
@ -380,10 +397,20 @@ public class RulexController extends JeecgController<Rulex, IRulexService> {
return Result.error("第" + (i + 1) + "条数据,上级模块输入错误,请核对"); return Result.error("第" + (i + 1) + "条数据,上级模块输入错误,请核对");
} }
} }
//判断上级模块+模块是否存在 //判断上级模块+模块是否存在且是否属于当前项目下
for (Modulex modulex : modulexList) { for (Modulex modulex : modulexList) {
if (modulex.getModuleName().equals(moduleId) && modulex.getPid().equals(pid)) { if (modulex.getModuleName().equals(moduleId) && modulex.getPid().equals(pid)) {
if (!modulex.getProjectId().equals(projectx.getId()))
{
message.put("isError", "true");
message.put("closeable", "true");
message.put("status", "第" + (i + 1) + "条数据,该模块与项目不对应输入错误,请核对");
webSocketUtils.sendMessage(loginUser.getId(), message);
return Result.error("第" + (i + 1) + "条数据,该模块与项目不对应输入错误,请核对");
}
rulex.setModuleId(modulex.getId()); rulex.setModuleId(modulex.getId());
break; break;
} }
n++; n++;
@ -397,9 +424,17 @@ public class RulexController extends JeecgController<Rulex, IRulexService> {
} }
} else { } else {
n = 0; n = 0;
//判断模块是否存在 //判断模块是否存在且是否属于当前项目下
for (Modulex modulex : modulexList) { for (Modulex modulex : modulexList) {
if (modulex.getModuleName().equals(moduleId) && modulex.getPid() == null) { if (modulex.getModuleName().equals(moduleId) && modulex.getPid() == null) {
if (!modulex.getProjectId().equals(projectx.getId()))
{
message.put("isError", "true");
message.put("closeable", "true");
message.put("status", "第" + (i + 1) + "条数据,该模块与项目不对应输入错误,请核对");
webSocketUtils.sendMessage(loginUser.getId(), message);
return Result.error("第" + (i + 1) + "条数据,该模块与项目不对应输入错误,请核对");
}
rulex.setModuleId(modulex.getId()); rulex.setModuleId(modulex.getId());
break; break;
} }
@ -430,25 +465,28 @@ public class RulexController extends JeecgController<Rulex, IRulexService> {
rulex.setFunctionId(functionx.getId()); rulex.setFunctionId(functionx.getId());
// //
//对应实体 //对应实体
String tableId = ruleVo.getTableId(); String tableId = ruleVo.getTableId();
LambdaQueryWrapper<Tablex> tableLambdaQueryWrapper = new LambdaQueryWrapper<>(); if (!StringUtils.isBlank(tableId)) {
tableLambdaQueryWrapper.eq(Tablex::getTableName, tableId).eq(Tablex::getModuleId, rulex.getModuleId()); LambdaQueryWrapper<Tablex> tableLambdaQueryWrapper = new LambdaQueryWrapper<>();
Tablex tablex = iTablexService.getOne(tableLambdaQueryWrapper); tableLambdaQueryWrapper.eq(Tablex::getTableName, tableId).eq(Tablex::getModuleId, rulex.getModuleId());
if (tablex == null) { Tablex tablex = iTablexService.getOne(tableLambdaQueryWrapper);
if (tablex == null) {
iRuleVoService.remove(null); iRuleVoService.remove(null);
message.put("isError", "true"); message.put("isError", "true");
message.put("closeable", "true"); message.put("closeable", "true");
message.put("status", "第" + (i + 1) + "条数据,对应实体输入错误,请核对"); message.put("status", "第" + (i + 1) + "条数据,对应实体输入错误,请核对");
webSocketUtils.sendMessage(loginUser.getId(), message); webSocketUtils.sendMessage(loginUser.getId(), message);
return Result.error("第" + (i + 1) + "条数据,对应实体输入错误,请核对"); return Result.error("第" + (i + 1) + "条数据,对应实体输入错误,请核对");
}
rulex.setTableId(tablex.getId());
} }
rulex.setTableId(tablex.getId());
//对应字段 //对应字段
String fieldId = ruleVo.getFieldId(); String fieldId = ruleVo.getFieldId();
String tableId1 = rulex.getTableId(); String tableId1 = rulex.getTableId();
if (!StringUtils.isBlank(fieldId) ) { if (!StringUtils.isBlank(fieldId)) {
LambdaQueryWrapper<Fieldx> rulexLambdaQueryWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<Fieldx> rulexLambdaQueryWrapper = new LambdaQueryWrapper<>();
rulexLambdaQueryWrapper.eq(Fieldx::getFieldName, fieldId).eq(Fieldx::getTableId, tableId1); rulexLambdaQueryWrapper.eq(Fieldx::getFieldName, fieldId).eq(Fieldx::getTableId, tableId1);
Fieldx fieldx = iFieldxService.getOne(rulexLambdaQueryWrapper); Fieldx fieldx = iFieldxService.getOne(rulexLambdaQueryWrapper);
@ -462,11 +500,17 @@ public class RulexController extends JeecgController<Rulex, IRulexService> {
} }
rulex.setFieldId(fieldx.getId()); rulex.setFieldId(fieldx.getId());
} }
Double aDouble = null; Double duration = null;
try { try {
if (aDouble != null) if (duration < 0){
aDouble = Double.valueOf(ruleVo.getDuration()); message.put("isError", "true");
rulex.setDuration(aDouble); message.put("closeable", "true");
message.put("status", "第" + (i + 1) + "条数据,任务时长输入错误,请核对");
webSocketUtils.sendMessage(loginUser.getId(), message);
return Result.error("第" + (i + 1) + "条数据,任务时长输入错误,请核对");
}
duration = Double.valueOf(ruleVo.getDuration());
rulex.setDuration(duration);
} catch (Exception e) { } catch (Exception e) {
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); //手动回滚,这样上层就无需去处理异常了 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); //手动回滚,这样上层就无需去处理异常了
message.put("isError", "true"); message.put("isError", "true");
@ -477,29 +521,37 @@ public class RulexController extends JeecgController<Rulex, IRulexService> {
} }
Double d; Double d;
try { String realDuration = ruleVo.getRealDuration();
d = Double.valueOf(ruleVo.getRealDuration()); if (!StringUtils.isBlank(realDuration)) {
} catch (Exception e) { try {
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); //手动回滚,这样上层就无需去处理异常了 d = Double.valueOf(realDuration);
message.put("isError", "true"); if (d < 0) {
message.put("closeable", "true"); message.put("isError", "true");
message.put("status", "第" + (i + 1) + "条数据,实际时长输入错误,请核对"); message.put("closeable", "true");
webSocketUtils.sendMessage(loginUser.getId(), message); message.put("status", "第" + (i + 1) + "条数据,实际时长输入错误,请核对");
return Result.error("第" + (i + 1) + "条数据,实际时长输入错误,请核对"); webSocketUtils.sendMessage(loginUser.getId(), message);
return Result.error("第" + (i + 1) + "条数据,实际时长输入错误,请核对");
}
} catch (Exception e) {
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); //手动回滚,这样上层就无需去处理异常了
message.put("isError", "true");
message.put("closeable", "true");
message.put("status", "第" + (i + 1) + "条数据,实际时长输入错误,请核对");
webSocketUtils.sendMessage(loginUser.getId(), message);
return Result.error("第" + (i + 1) + "条数据,实际时长输入错误,请核对");
}
rulex.setRealDuration(d);
} }
rulex.setRealDuration(d);
Integer integer; String workLevel = ruleVo.getWorkLevel();
try { if (!workLevel.matches("^[1-5]$")){
integer = Integer.valueOf(ruleVo.getWorkLevel());
} catch (Exception e) {
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); //手动回滚,这样上层就无需去处理异常了
message.put("isError", "true"); message.put("isError", "true");
message.put("closeable", "true"); message.put("closeable", "true");
message.put("status", "第" + (i + 1) + "条数据,任务等级输入错误,请核对"); message.put("status", "第" + (i + 1) + "条数据,任务等级输入错误,请核对");
webSocketUtils.sendMessage(loginUser.getId(), message); webSocketUtils.sendMessage(loginUser.getId(), message);
return Result.error("第" + (i + 1) + "条数据,任务等级输入错误,请核对"); return Result.error("第" + (i + 1) + "条数据,任务等级输入错误,请核对");
} }
rulex.setWorkLevel(integer); rulex.setWorkLevel(Integer.valueOf(workLevel));
String workStatus = ruleVo.getWorkStatus(); String workStatus = ruleVo.getWorkStatus();
// LambdaQueryWrapper<SysDictItem> sysDictItemLambdaQueryWrapper = new LambdaQueryWrapper<>(); // LambdaQueryWrapper<SysDictItem> sysDictItemLambdaQueryWrapper = new LambdaQueryWrapper<>();
// sysDictItemLambdaQueryWrapper.eq(SysDictItem::getItemText, workStatus).eq(SysDictItem::getDictId, "1645268542514421762"); // sysDictItemLambdaQueryWrapper.eq(SysDictItem::getItemText, workStatus).eq(SysDictItem::getDictId, "1645268542514421762");
@ -576,7 +628,7 @@ public class RulexController extends JeecgController<Rulex, IRulexService> {
} }
} }
String submitTime = ruleVo.getSubmitTime(); String submitTime = ruleVo.getSubmitTime();
if (!StringUtils.isBlank(submitTime)){ if (!StringUtils.isBlank(submitTime)) {
String submitTimeT = getTime(submitTime); String submitTimeT = getTime(submitTime);
try { try {
date = simpleDateFormat.parse(submitTimeT); date = simpleDateFormat.parse(submitTimeT);
@ -591,9 +643,7 @@ public class RulexController extends JeecgController<Rulex, IRulexService> {
} }
} }
//规则序号
String ruleNo = ruleVo.getRuleNo();
rulex.setRuleNo(ruleNo);
//规则编码 //规则编码
String ruleCode = ruleVo.getRuleCode(); String ruleCode = ruleVo.getRuleCode();
String functionCode1 = functionx.getFunctionCode(); String functionCode1 = functionx.getFunctionCode();
@ -632,96 +682,109 @@ public class RulexController extends JeecgController<Rulex, IRulexService> {
return Result.error("第" + (i + 1) + "条数据,规则编码错误,请核对"); return Result.error("第" + (i + 1) + "条数据,规则编码错误,请核对");
} }
rulex.setRuleCode(ruleCode); rulex.setRuleCode(ruleCode);
//规则描述 //规则序号
String pmDescribe = ruleVo.getPmDescribe(); String ruleNo = ruleVo.getRuleNo();
if (pmDescribe != null) String c = ruleCode.substring(ruleCode.length() - ruleNo.length());
rulex.setPmDescribe(pmDescribe); //三位数整数且与编码后三位相同
//分析图 if (!(c.equals(ruleNo) && ruleNo.matches("^[0-9]*[1-9][0-9]*$") && (Integer.valueOf(ruleNo) < 1000))) {
String diagrams = ruleVo.getDiagrams();
if (diagrams != null)
rulex.setDiagrams(diagrams);
//版本号
String verison = ruleVo.getVerison();
if (ruleVo.getVerison() == null || verison.length() >= 5) {
message.put("isError", "true"); message.put("isError", "true");
message.put("closeable", "true"); message.put("closeable", "true");
message.put("status", "第" + (i + 1) + "条数据,版本号错误,请核对"); message.put("status", "第" + (i + 1) + "条数据,规则序号错误,请核对");
webSocketUtils.sendMessage(loginUser.getId(), message); webSocketUtils.sendMessage(loginUser.getId(), message);
return Result.error("第" + (i + 1) + "条数据,版本号错误,请核对"); return Result.error("第" + (i + 1) + "条数据,规则序号错误,请核对");
} }
try { rulex.setRuleNo(ruleNo);
Integer integer2 = Integer.valueOf(verison); {
if (integer2 > 0)
rulex.setVerison(String.valueOf(integer2)); //规则描述
else { String pmDescribe = ruleVo.getPmDescribe();
if (pmDescribe != null)
rulex.setPmDescribe(pmDescribe);
//版本号
String verison = ruleVo.getVerison();
if (ruleVo.getVerison() == null || verison.length() >= 5) {
message.put("isError", "true"); message.put("isError", "true");
message.put("closeable", "true"); message.put("closeable", "true");
message.put("status", "第" + (i + 1) + "条数据,版本号输入错误,请核对"); message.put("status", "第" + (i + 1) + "条数据,版本号错误,请核对");
webSocketUtils.sendMessage(loginUser.getId(), message); webSocketUtils.sendMessage(loginUser.getId(), message);
return Result.error("第" + (i + 1) + "条数据,版本号输入错误,请核对"); return Result.error("第" + (i + 1) + "条数据,版本号错误,请核对");
} }
} catch (NumberFormatException e) { try {
message.put("isError", "true"); Integer integer2 = Integer.valueOf(verison);
message.put("closeable", "true"); if (integer2 > 0)
message.put("status", "第" + (i + 1) + "条数据,版本号输入错误,请核对"); rulex.setVerison(String.valueOf(integer2));
webSocketUtils.sendMessage(loginUser.getId(), message); else {
return Result.error("第" + (i + 1) + "条数据,版本号输入错误,请核对"); message.put("isError", "true");
} message.put("closeable", "true");
message.put("status", "第" + (i + 1) + "条数据,版本号输入错误,请核对");
webSocketUtils.sendMessage(loginUser.getId(), message);
//责任人 return Result.error("第" + (i + 1) + "条数据,版本号输入错误,请核对");
String managerUsers = ruleVo.getManagerUsers(); }
if (managerUsers != null) { } catch (NumberFormatException e) {
LambdaQueryWrapper<SysUser> sysUserLambdaQueryWrapper = new LambdaQueryWrapper<>();
String[] split = managerUsers.split(",");
sysUserLambdaQueryWrapper.in(SysUser::getUsername, split);
List<SysUser> iSysUserServiceOne = iSysUserService.list(sysUserLambdaQueryWrapper);
if (iSysUserServiceOne == null) {
message.put("isError", "true"); message.put("isError", "true");
message.put("status", "导入失败,责任人信息查询不到");
message.put("closeable", "true"); message.put("closeable", "true");
message.put("status", "第" + (i + 1) + "条数据,版本号输入错误,请核对");
webSocketUtils.sendMessage(loginUser.getId(), message); webSocketUtils.sendMessage(loginUser.getId(), message);
return Result.error("导入失败,责任人信息查询不到"); return Result.error("第" + (i + 1) + "条数据,版本号输入错误,请核对");
} }
if (iSysUserServiceOne.size() > 1) {
List<String> list3 = iSysUserServiceOne.stream().map(SysUser::getId).collect(Collectors.toList());
if (list3 == null) { //责任人
String managerUsers = ruleVo.getManagerUsers();
if (!StringUtils.isBlank(managerUsers)) {
LambdaQueryWrapper<SysUser> sysUserLambdaQueryWrapper = new LambdaQueryWrapper<>();
String[] split = managerUsers.split(",");
sysUserLambdaQueryWrapper.in(SysUser::getUsername, split);
List<SysUser> iSysUserServiceOne = iSysUserService.list(sysUserLambdaQueryWrapper);
if (iSysUserServiceOne == null) {
message.put("isError", "true"); message.put("isError", "true");
message.put("status", "导入失败,责任人信息查询不到"); message.put("status", "导入失败,责任人信息查询不到");
message.put("closeable", "true"); message.put("closeable", "true");
webSocketUtils.sendMessage(loginUser.getId(), message); webSocketUtils.sendMessage(loginUser.getId(), message);
return Result.error("导入失败,责任人信息查询不到"); return Result.error("导入失败,责任人信息查询不到");
} }
rulex.setManagerUsers(Joiner.on(",").join(list3)); if (iSysUserServiceOne.size() > 1) {
} else if (iSysUserServiceOne.size() == 1) { List<String> list3 = iSysUserServiceOne.stream().map(SysUser::getId).collect(Collectors.toList());
String id = iSysUserServiceOne.get(0).getId(); if (list3 == null) {
rulex.setManagerUsers(id); message.put("isError", "true");
message.put("status", "导入失败,责任人信息查询不到");
message.put("closeable", "true");
webSocketUtils.sendMessage(loginUser.getId(), message);
return Result.error("导入失败,责任人信息查询不到");
}
rulex.setManagerUsers(Joiner.on(",").join(list3));
} else if (iSysUserServiceOne.size() == 1) {
String id = iSysUserServiceOne.get(0).getId();
rulex.setManagerUsers(id);
}
} }
message.put("status", "正在读取数据");
webSocketUtils.sendMessage(loginUser.getId(), message);
//存入集合待存真实表
rulexList.add(rulex);
} }
}
} finally{
//清理预存表
iRuleVoService.remove(null);
}
//存入真实表
Boolean aBoolean = rulexService.saveRule(rulexList, loginUser, message);
message.put("status", "正在读取数据"); if (aBoolean) {
message.put("status", "导入成功");
message.put("closeable", "true");
webSocketUtils.sendMessage(loginUser.getId(), message); webSocketUtils.sendMessage(loginUser.getId(), message);
//存入集合待存真实表 return Result.ok("文件导入成功!");
rulexList.add(rulex); } else {
return Result.error("文件导入失败!");
} }
} finally {
//清理预存表
iRuleVoService.remove(null);
}
//存入真实表
Boolean aBoolean = rulexService.saveRule(rulexList, loginUser, message);
if (aBoolean) {
message.put("status", "导入成功");
message.put("closeable", "true");
webSocketUtils.sendMessage(loginUser.getId(), message);
return Result.ok("文件导入成功!");
}else {
return Result.error("文件导入失败!");
}
} }
@GetMapping(value = "/sort") @GetMapping(value = "/sort")
public Result<?> sort(@RequestParam(name = "id", required = true) String id) { public Result<?> sort(@RequestParam(name = "id", required = true) String id) {
return rulexService.sort(id); return rulexService.sort(id);

@ -63,12 +63,14 @@ public class RuleVo implements Serializable {
@ApiModelProperty(value = "更新日期") @ApiModelProperty(value = "更新日期")
private String updateTime; private String updateTime;
@Excel(name = "对应项目", width = 15)
@ApiModelProperty(value = "对应项目")
private java.lang.String projectId;
/** /**
* 对应模块父id * 对应模块父id
*/ */
@TableField(exist = false) @Excel(name = "上级模块", width = 15)
@Excel(name = "对应模块父模块", width = 15) @ApiModelProperty(value = "上级模块")
@ApiModelProperty(value = "对应模块")
private java.lang.String modulePid; private java.lang.String modulePid;
/** /**
* 对应模块id * 对应模块id
@ -77,6 +79,7 @@ public class RuleVo implements Serializable {
@ApiModelProperty(value = "对应模块") @ApiModelProperty(value = "对应模块")
@Dict(dictTable = "modulex", dicCode = "id", dicText = "module_name") @Dict(dictTable = "modulex", dicCode = "id", dicText = "module_name")
private java.lang.String moduleId; private java.lang.String moduleId;
/** /**
* 对应功能id * 对应功能id
*/ */
@ -102,12 +105,6 @@ public class RuleVo implements Serializable {
@Excel(name = "规则描述", width = 15) @Excel(name = "规则描述", width = 15)
@ApiModelProperty(value = "规则描述") @ApiModelProperty(value = "规则描述")
private java.lang.String pmDescribe; private java.lang.String pmDescribe;
/**
* 分析图
*/
@Excel(name = "分析图", width = 15)
@ApiModelProperty(value = "分析图")
private java.lang.String diagrams;
/** /**
* 对应实体id * 对应实体id
*/ */

@ -6,6 +6,7 @@ import java.util.Date;
import java.math.BigDecimal; import java.math.BigDecimal;
import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data; import lombok.Data;
@ -99,6 +100,7 @@ public class Rulex implements Serializable {
*/ */
@Excel(name = "分析图", width = 15) @Excel(name = "分析图", width = 15)
@ApiModelProperty(value = "分析图") @ApiModelProperty(value = "分析图")
@TableField(exist = false)
private java.lang.String diagrams; private java.lang.String diagrams;
/** /**
* 对应实体id * 对应实体id

Loading…
Cancel
Save