opt: lucene,链路追踪,MDC
This commit is contained in:
@@ -355,7 +355,12 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.alicp.jetcache</groupId>
|
<groupId>com.alicp.jetcache</groupId>
|
||||||
<artifactId>jetcache-starter-redis</artifactId>
|
<artifactId>jetcache-starter-redis</artifactId>
|
||||||
<version>2.5.14</version>
|
<version>2.7.3</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>redis.clients</groupId>
|
||||||
|
<artifactId>jedis</artifactId>
|
||||||
|
<version>4.3.1</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -3,15 +3,16 @@ package org.nl;
|
|||||||
import cn.dev33.satoken.annotation.SaIgnore;
|
import cn.dev33.satoken.annotation.SaIgnore;
|
||||||
import com.alicp.jetcache.anno.config.EnableCreateCacheAnnotation;
|
import com.alicp.jetcache.anno.config.EnableCreateCacheAnnotation;
|
||||||
import com.alicp.jetcache.anno.config.EnableMethodCache;
|
import com.alicp.jetcache.anno.config.EnableMethodCache;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.dromara.dynamictp.core.spring.EnableDynamicTp;
|
import org.dromara.dynamictp.core.spring.EnableDynamicTp;
|
||||||
import org.mybatis.spring.annotation.MapperScan;
|
import org.mybatis.spring.annotation.MapperScan;
|
||||||
import org.nl.common.annotation.Limit;
|
import org.nl.common.annotation.Limit;
|
||||||
import org.nl.config.SpringContextHolder;
|
import org.nl.config.SpringContextHolder;
|
||||||
|
import org.slf4j.MDC;
|
||||||
import org.springframework.boot.SpringApplication;
|
import org.springframework.boot.SpringApplication;
|
||||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||||
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
|
import org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration;
|
||||||
import org.springframework.boot.web.servlet.ServletComponentScan;
|
import org.springframework.boot.web.servlet.ServletComponentScan;
|
||||||
import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
|
|
||||||
import org.springframework.context.annotation.Bean;
|
import org.springframework.context.annotation.Bean;
|
||||||
import org.springframework.scheduling.annotation.EnableAsync;
|
import org.springframework.scheduling.annotation.EnableAsync;
|
||||||
import org.springframework.transaction.annotation.EnableTransactionManagement;
|
import org.springframework.transaction.annotation.EnableTransactionManagement;
|
||||||
@@ -26,10 +27,12 @@ import org.springframework.web.bind.annotation.RestController;
|
|||||||
* @author ldjun
|
* @author ldjun
|
||||||
* @date 2021/2/22 9:20:19
|
* @date 2021/2/22 9:20:19
|
||||||
*/
|
*/
|
||||||
|
@Slf4j
|
||||||
@EnableAsync
|
@EnableAsync
|
||||||
@RestController
|
@RestController
|
||||||
@EnableDynamicTp
|
@EnableDynamicTp
|
||||||
@SpringBootApplication(exclude = {
|
@SpringBootApplication(exclude = {
|
||||||
|
QuartzAutoConfiguration.class,
|
||||||
org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class
|
org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class
|
||||||
})
|
})
|
||||||
@ServletComponentScan
|
@ServletComponentScan
|
||||||
@@ -48,7 +51,6 @@ public class AppRun {
|
|||||||
return new SpringContextHolder();
|
return new SpringContextHolder();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 访问首页提示
|
* 访问首页提示
|
||||||
@@ -59,6 +61,8 @@ public class AppRun {
|
|||||||
@Limit(period = 2, count = 1)
|
@Limit(period = 2, count = 1)
|
||||||
@SaIgnore
|
@SaIgnore
|
||||||
public String index() {
|
public String index() {
|
||||||
|
MDC.put("system", "SSS");
|
||||||
|
log.info("sssss");
|
||||||
return "Backend service started successfully";
|
return "Backend service started successfully";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,9 +7,17 @@ package org.nl.config.lucene;
|
|||||||
*/
|
*/
|
||||||
public class LogMessageConstant {
|
public class LogMessageConstant {
|
||||||
/**
|
/**
|
||||||
*
|
* 标签
|
||||||
|
*/
|
||||||
|
public final static String LABEL = "label";
|
||||||
|
/**
|
||||||
|
* 时间
|
||||||
*/
|
*/
|
||||||
public final static String SORT_NAME = "time";
|
public final static String SORT_NAME = "time";
|
||||||
|
/**
|
||||||
|
* IP
|
||||||
|
*/
|
||||||
|
public final static String IP = "ip";
|
||||||
/**
|
/**
|
||||||
* 级别
|
* 级别
|
||||||
*/
|
*/
|
||||||
@@ -30,6 +38,9 @@ public class LogMessageConstant {
|
|||||||
* 日志内容
|
* 日志内容
|
||||||
*/
|
*/
|
||||||
public final static String FIELD_MESSAGE = "message";
|
public final static String FIELD_MESSAGE = "message";
|
||||||
|
/**
|
||||||
|
* tlogTraceId
|
||||||
|
*/
|
||||||
public final static String FIELD_TRACEID = "tlogTraceId";
|
public final static String FIELD_TRACEID = "tlogTraceId";
|
||||||
// 定义颜色值
|
// 定义颜色值
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -20,9 +20,13 @@ import org.nl.common.utils.YmlConfigFileUtil;
|
|||||||
import org.wltea.analyzer.lucene.IKAnalyzer;
|
import org.wltea.analyzer.lucene.IKAnalyzer;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.net.InetAddress;
|
||||||
|
import java.net.UnknownHostException;
|
||||||
import java.nio.file.Paths;
|
import java.nio.file.Paths;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
|
import java.util.regex.Matcher;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
public class LuceneAppender extends AppenderBase<ILoggingEvent> {
|
public class LuceneAppender extends AppenderBase<ILoggingEvent> {
|
||||||
|
|
||||||
@@ -61,18 +65,43 @@ public class LuceneAppender extends AppenderBase<ILoggingEvent> {
|
|||||||
Map<String, String> mdcPropertyMap = event.getMDCPropertyMap();
|
Map<String, String> mdcPropertyMap = event.getMDCPropertyMap();
|
||||||
Document doc = new Document();
|
Document doc = new Document();
|
||||||
long timeStamp = event.getTimeStamp();
|
long timeStamp = event.getTimeStamp();
|
||||||
|
// 获取本机的IP地址
|
||||||
|
String ipAddress = "-";
|
||||||
|
try {
|
||||||
|
ipAddress = InetAddress.getLocalHost().getHostAddress();
|
||||||
|
} catch (UnknownHostException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
String formattedDateTime = DateUtil.format(new java.util.Date(timeStamp), "yyyy-MM-dd HH:mm:ss.SSS");
|
String formattedDateTime = DateUtil.format(new java.util.Date(timeStamp), "yyyy-MM-dd HH:mm:ss.SSS");
|
||||||
doc.add(new LongPoint(LogMessageConstant.SORT_NAME, timeStamp));
|
doc.add(new LongPoint(LogMessageConstant.SORT_NAME, timeStamp));
|
||||||
doc.add(new NumericDocValuesField(LogMessageConstant.SORT_NAME, timeStamp));
|
doc.add(new NumericDocValuesField(LogMessageConstant.SORT_NAME, timeStamp));
|
||||||
doc.add(new StringField(LogMessageConstant.FIELD_LEVEL, event.getLevel().toString(), Field.Store.YES));
|
doc.add(new StringField(LogMessageConstant.FIELD_LEVEL, event.getLevel().toString(), Field.Store.YES));
|
||||||
doc.add(new StringField(LogMessageConstant.FIELD_TIMESTAMP, formattedDateTime, Field.Store.YES));
|
doc.add(new StringField(LogMessageConstant.FIELD_TIMESTAMP, formattedDateTime, Field.Store.YES));
|
||||||
doc.add(new StoredField(LogMessageConstant.FIELD_CLASS_NAME, event.getLoggerName()));
|
doc.add(new StoredField(LogMessageConstant.FIELD_CLASS_NAME, event.getLoggerName()));
|
||||||
|
doc.add(new StoredField(LogMessageConstant.IP, ipAddress));
|
||||||
doc.add(new StoredField(LogMessageConstant.FIELD_THREAD, event.getThreadName()));
|
doc.add(new StoredField(LogMessageConstant.FIELD_THREAD, event.getThreadName()));
|
||||||
if (ObjectUtil.isNotEmpty(mdcPropertyMap) && ObjectUtil.isNotEmpty(mdcPropertyMap.get(LogMessageConstant.FIELD_TRACEID))) {
|
if (ObjectUtil.isNotEmpty(mdcPropertyMap) && ObjectUtil.isNotEmpty(mdcPropertyMap.get(LogMessageConstant.FIELD_TRACEID))) {
|
||||||
String traceId = mdcPropertyMap.get(LogMessageConstant.FIELD_TRACEID);
|
String traceId = mdcPropertyMap.get(LogMessageConstant.FIELD_TRACEID);
|
||||||
doc.add(new StringField(LogMessageConstant.FIELD_TRACEID, traceId, Field.Store.YES));
|
doc.add(new StringField(LogMessageConstant.FIELD_TRACEID, traceId, Field.Store.YES));
|
||||||
|
doc.add(new StringField(LogMessageConstant.LABEL, ObjectUtil.isNotEmpty(mdcPropertyMap.get("tag_name"))
|
||||||
|
? mdcPropertyMap.get("tag_name") : "-", Field.Store.YES));
|
||||||
} else {
|
} else {
|
||||||
doc.add(new StringField(LogMessageConstant.FIELD_TRACEID, "无生成链路ID", Field.Store.YES));
|
// 定义正则表达式,匹配17位数字
|
||||||
|
String regex = "\\d{17}";
|
||||||
|
// 创建 Pattern 对象
|
||||||
|
Pattern pattern = Pattern.compile(regex);
|
||||||
|
// 创建 Matcher 对象
|
||||||
|
Matcher matcher = pattern.matcher(message);
|
||||||
|
String matchedNumber = null;
|
||||||
|
// 查找匹配的数字
|
||||||
|
while (matcher.find()) {
|
||||||
|
matchedNumber = matcher.group();
|
||||||
|
}
|
||||||
|
if (ObjectUtil.isNotEmpty(matchedNumber)) {
|
||||||
|
doc.add(new StringField(LogMessageConstant.FIELD_TRACEID, matchedNumber, Field.Store.YES));
|
||||||
|
} else {
|
||||||
|
doc.add(new StringField(LogMessageConstant.FIELD_TRACEID, "无生成链路ID", Field.Store.YES));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
doc.add(new TextField(LogMessageConstant.FIELD_MESSAGE, message, Field.Store.YES));
|
doc.add(new TextField(LogMessageConstant.FIELD_MESSAGE, message, Field.Store.YES));
|
||||||
try {
|
try {
|
||||||
|
|||||||
@@ -92,17 +92,20 @@ public class Searcher {
|
|||||||
whereJson.get(LogMessageConstant.FIELD_LEVEL).toString()));
|
whereJson.get(LogMessageConstant.FIELD_LEVEL).toString()));
|
||||||
booleanQueryBuilder.add(termQuery, BooleanClause.Occur.MUST);
|
booleanQueryBuilder.add(termQuery, BooleanClause.Occur.MUST);
|
||||||
}
|
}
|
||||||
docs = searcher.search(booleanQueryBuilder.build(), end, sort);
|
|
||||||
List<String> list = new ArrayList<>();
|
List<String> list = new ArrayList<>();
|
||||||
|
TopFieldCollector collector = TopFieldCollector.create(sort, 20000, 0);
|
||||||
|
searcher.search(booleanQueryBuilder.build(), collector);
|
||||||
|
docs = collector.topDocs(pageNum*pageSize, pageSize);
|
||||||
ScoreDoc[] scoreDocs = docs.scoreDocs;
|
ScoreDoc[] scoreDocs = docs.scoreDocs;
|
||||||
if (end > docs.totalHits.value) {
|
int totalSize = collector.getTotalHits();
|
||||||
end = (int) docs.totalHits.value;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = start; i < end; i++) {
|
for (ScoreDoc scoreDoc : scoreDocs) {
|
||||||
ScoreDoc scoreDoc = scoreDocs[i];
|
|
||||||
Document doc = reader.document(scoreDoc.doc);
|
Document doc = reader.document(scoreDoc.doc);
|
||||||
String logInfo = LogMessageConstant.COLOR_YELLOW + doc.get(LogMessageConstant.FIELD_TRACEID) +
|
String logInfo = LogMessageConstant.COLOR_CYAN + doc.get(LogMessageConstant.LABEL) +
|
||||||
|
LogMessageConstant.COLOR_RESET + " - " +
|
||||||
|
LogMessageConstant.COLOR_BLUE + doc.get(LogMessageConstant.IP) +
|
||||||
|
LogMessageConstant.COLOR_RESET + " - " +
|
||||||
|
LogMessageConstant.COLOR_YELLOW + doc.get(LogMessageConstant.FIELD_TRACEID) +
|
||||||
LogMessageConstant.COLOR_RESET + " - " +
|
LogMessageConstant.COLOR_RESET + " - " +
|
||||||
LogMessageConstant.COLOR_RED + doc.get(LogMessageConstant.FIELD_TIMESTAMP) +
|
LogMessageConstant.COLOR_RED + doc.get(LogMessageConstant.FIELD_TIMESTAMP) +
|
||||||
LogMessageConstant.COLOR_RESET + " - " +
|
LogMessageConstant.COLOR_RESET + " - " +
|
||||||
@@ -118,7 +121,7 @@ public class Searcher {
|
|||||||
reader.close();
|
reader.close();
|
||||||
JSONObject jo = new JSONObject();
|
JSONObject jo = new JSONObject();
|
||||||
jo.put("content", list);
|
jo.put("content", list);
|
||||||
jo.put("totalElements", docs.totalHits.value);
|
jo.put("totalElements", totalSize);
|
||||||
return jo;
|
return jo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -11,9 +11,7 @@ import org.dromara.dynamictp.core.monitor.collector.AbstractCollector;
|
|||||||
public class TestCollector extends AbstractCollector {
|
public class TestCollector extends AbstractCollector {
|
||||||
@Override
|
@Override
|
||||||
public void collect(ThreadPoolStats threadPoolStats) {
|
public void collect(ThreadPoolStats threadPoolStats) {
|
||||||
if (threadPoolStats.getPoolName().equals("el-thread")) {
|
// System.out.println("ssssssssssssssss:" + threadPoolStats);
|
||||||
System.out.println("ssssssssssssssss:" + threadPoolStats);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -36,7 +36,6 @@ class SysParamController {
|
|||||||
|
|
||||||
@GetMapping
|
@GetMapping
|
||||||
@Log("查询系统参数")
|
@Log("查询系统参数")
|
||||||
|
|
||||||
//@SaCheckPermission("param:list")
|
//@SaCheckPermission("param:list")
|
||||||
public ResponseEntity<Object> query(@RequestParam Map whereJson, PageQuery page) {
|
public ResponseEntity<Object> query(@RequestParam Map whereJson, PageQuery page) {
|
||||||
return new ResponseEntity<>(TableDataInfo.build(paramService.queryPage(whereJson, page)), HttpStatus.OK);
|
return new ResponseEntity<>(TableDataInfo.build(paramService.queryPage(whereJson, page)), HttpStatus.OK);
|
||||||
@@ -44,7 +43,6 @@ class SysParamController {
|
|||||||
|
|
||||||
@PostMapping
|
@PostMapping
|
||||||
@Log("新增系统参数")
|
@Log("新增系统参数")
|
||||||
|
|
||||||
//@SaCheckPermission("param:add")
|
//@SaCheckPermission("param:add")
|
||||||
public ResponseEntity<Object> create(@Validated @RequestBody Param param) {
|
public ResponseEntity<Object> create(@Validated @RequestBody Param param) {
|
||||||
paramService.create(param);
|
paramService.create(param);
|
||||||
@@ -53,7 +51,6 @@ class SysParamController {
|
|||||||
|
|
||||||
@PutMapping
|
@PutMapping
|
||||||
@Log("修改系统参数")
|
@Log("修改系统参数")
|
||||||
|
|
||||||
//@SaCheckPermission("param:edit")
|
//@SaCheckPermission("param:edit")
|
||||||
public ResponseEntity<Object> update(@Validated @RequestBody Param param) {
|
public ResponseEntity<Object> update(@Validated @RequestBody Param param) {
|
||||||
paramService.update(param);
|
paramService.update(param);
|
||||||
@@ -61,7 +58,6 @@ class SysParamController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Log("删除系统参数")
|
@Log("删除系统参数")
|
||||||
|
|
||||||
//@SaCheckPermission("param:del")
|
//@SaCheckPermission("param:del")
|
||||||
@DeleteMapping
|
@DeleteMapping
|
||||||
public ResponseEntity<Object> delete(@RequestBody String[] ids) {
|
public ResponseEntity<Object> delete(@RequestBody String[] ids) {
|
||||||
@@ -72,7 +68,6 @@ class SysParamController {
|
|||||||
|
|
||||||
@PostMapping("/getValueByCode/{code}")
|
@PostMapping("/getValueByCode/{code}")
|
||||||
@Log("根据编码获取值")
|
@Log("根据编码获取值")
|
||||||
|
|
||||||
@SaIgnore
|
@SaIgnore
|
||||||
public ResponseEntity<Object> getValueByCode(@PathVariable String code) {
|
public ResponseEntity<Object> getValueByCode(@PathVariable String code) {
|
||||||
return new ResponseEntity<>(paramService.findByCode(code), HttpStatus.CREATED);
|
return new ResponseEntity<>(paramService.findByCode(code), HttpStatus.CREATED);
|
||||||
|
|||||||
@@ -17,10 +17,11 @@ import java.util.Map;
|
|||||||
@Slf4j
|
@Slf4j
|
||||||
public class LuceneServiceImpl implements LuceneService {
|
public class LuceneServiceImpl implements LuceneService {
|
||||||
|
|
||||||
//日志索引目录
|
/**
|
||||||
|
* 日志索引目录
|
||||||
|
*/
|
||||||
@Value("${lucene.index.path}")
|
@Value("${lucene.index.path}")
|
||||||
private String luceneUrl;
|
private String luceneUrl;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Map<String, Object> getAll(JSONObject whereJson) {
|
public Map<String, Object> getAll(JSONObject whereJson) {
|
||||||
JSONObject jo = new JSONObject();
|
JSONObject jo = new JSONObject();
|
||||||
|
|||||||
@@ -3,6 +3,10 @@ package org.nl.system.service.param.impl;
|
|||||||
import cn.hutool.core.date.DateUtil;
|
import cn.hutool.core.date.DateUtil;
|
||||||
import cn.hutool.core.util.IdUtil;
|
import cn.hutool.core.util.IdUtil;
|
||||||
import cn.hutool.core.util.ObjectUtil;
|
import cn.hutool.core.util.ObjectUtil;
|
||||||
|
import com.alicp.jetcache.anno.CachePenetrationProtect;
|
||||||
|
import com.alicp.jetcache.anno.CacheType;
|
||||||
|
import com.alicp.jetcache.anno.CacheUpdate;
|
||||||
|
import com.alicp.jetcache.anno.Cached;
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
@@ -66,6 +70,7 @@ public class SysParamServiceImpl extends ServiceImpl<SysParamMapper, Param> impl
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@CacheUpdate(name="paramCache-", key="#param.code", value="#param")
|
||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public void update(Param param) {
|
public void update(Param param) {
|
||||||
Param paramObj = paramMapper.selectById(param.getId());
|
Param paramObj = paramMapper.selectById(param.getId());
|
||||||
@@ -90,6 +95,8 @@ public class SysParamServiceImpl extends ServiceImpl<SysParamMapper, Param> impl
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@CachePenetrationProtect
|
||||||
|
@Cached(name="paramCache-",key = "#code", expire = 3600, cacheType = CacheType.REMOTE)
|
||||||
public Param findByCode(String code) {
|
public Param findByCode(String code) {
|
||||||
QueryWrapper<Param> queryWrapper = new QueryWrapper<>();
|
QueryWrapper<Param> queryWrapper = new QueryWrapper<>();
|
||||||
queryWrapper.eq("code", code);
|
queryWrapper.eq("code", code);
|
||||||
|
|||||||
@@ -9,9 +9,10 @@ import org.springframework.scheduling.quartz.AdaptableJobFactory;
|
|||||||
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
|
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import java.util.Properties;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 定时任务配置
|
* 定时任务配置
|
||||||
*
|
|
||||||
* @author /
|
* @author /
|
||||||
* @date 2019-01-07
|
* @date 2019-01-07
|
||||||
*/
|
*/
|
||||||
@@ -42,17 +43,24 @@ public class QuartzConfig {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 注入scheduler到spring
|
* 注入scheduler到spring
|
||||||
*
|
|
||||||
* @param quartzJobFactory /
|
* @param quartzJobFactory /
|
||||||
* @return Scheduler
|
* @return Scheduler
|
||||||
* @throws Exception /
|
* @throws Exception /
|
||||||
*/
|
*/
|
||||||
@Bean(name = "scheduler")
|
@Bean(name = "scheduler")
|
||||||
public Scheduler scheduler(QuartzJobFactory quartzJobFactory) throws Exception {
|
public Scheduler scheduler(QuartzJobFactory quartzJobFactory) throws Exception {
|
||||||
SchedulerFactoryBean factoryBean = new SchedulerFactoryBean();
|
SchedulerFactoryBean factoryBean=new SchedulerFactoryBean();
|
||||||
|
|
||||||
|
//https://blog.csdn.net/YuChenIT/article/details/133344898
|
||||||
|
Properties prop = new Properties();
|
||||||
|
prop.put("org.quartz.threadPool.threadCount", "9");
|
||||||
|
factoryBean.setWaitForJobsToCompleteOnShutdown(true);
|
||||||
|
|
||||||
|
factoryBean.setQuartzProperties(prop);
|
||||||
|
|
||||||
factoryBean.setJobFactory(quartzJobFactory);
|
factoryBean.setJobFactory(quartzJobFactory);
|
||||||
factoryBean.afterPropertiesSet();
|
factoryBean.afterPropertiesSet();
|
||||||
Scheduler scheduler = factoryBean.getScheduler();
|
Scheduler scheduler=factoryBean.getScheduler();
|
||||||
scheduler.start();
|
scheduler.start();
|
||||||
return scheduler;
|
return scheduler;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package org.nl.system.service.quartz.utils;
|
|||||||
|
|
||||||
import cn.hutool.core.util.IdUtil;
|
import cn.hutool.core.util.IdUtil;
|
||||||
import cn.hutool.core.util.StrUtil;
|
import cn.hutool.core.util.StrUtil;
|
||||||
|
import com.yomahub.tlog.task.quartz.TLogQuartzJobBean;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.nl.common.utils.RedisUtils;
|
import org.nl.common.utils.RedisUtils;
|
||||||
import org.nl.common.utils.ThrowableUtil;
|
import org.nl.common.utils.ThrowableUtil;
|
||||||
@@ -32,7 +33,7 @@ import java.util.concurrent.ThreadPoolExecutor;
|
|||||||
@SuppressWarnings({"unchecked", "all"})
|
@SuppressWarnings({"unchecked", "all"})
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@DisallowConcurrentExecution
|
@DisallowConcurrentExecution
|
||||||
public class ExecutionJob extends QuartzJobBean {
|
public class ExecutionJob extends TLogQuartzJobBean {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 该处仅供参考
|
* 该处仅供参考
|
||||||
@@ -41,8 +42,9 @@ public class ExecutionJob extends QuartzJobBean {
|
|||||||
@Qualifier("threadPoolExecutor")
|
@Qualifier("threadPoolExecutor")
|
||||||
private ThreadPoolExecutor EXECUTOR;
|
private ThreadPoolExecutor EXECUTOR;
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
|
public void executeTask(JobExecutionContext context) throws JobExecutionException {
|
||||||
SysQuartzJob quartzJob = (SysQuartzJob) context.getMergedJobDataMap().get(SysQuartzJob.JOB_KEY);
|
SysQuartzJob quartzJob = (SysQuartzJob) context.getMergedJobDataMap().get(SysQuartzJob.JOB_KEY);
|
||||||
// 获取spring bean
|
// 获取spring bean
|
||||||
ISysQuartzJobService quartzJobService = SpringContextHolder.getBean(SysQuartzJobServiceImpl.class);
|
ISysQuartzJobService quartzJobService = SpringContextHolder.getBean(SysQuartzJobServiceImpl.class);
|
||||||
|
|||||||
@@ -43,7 +43,6 @@ public class MdBaseMaterialController {
|
|||||||
|
|
||||||
@PostMapping
|
@PostMapping
|
||||||
@Log("新增物料基础信息")
|
@Log("新增物料基础信息")
|
||||||
|
|
||||||
//@SaCheckPermission("@el.check('mdBaseMaterial:add')")
|
//@SaCheckPermission("@el.check('mdBaseMaterial:add')")
|
||||||
public ResponseEntity<Object> create(@Validated @RequestBody MdBaseMaterial entity) {
|
public ResponseEntity<Object> create(@Validated @RequestBody MdBaseMaterial entity) {
|
||||||
mdBaseMaterialService.create(entity);
|
mdBaseMaterialService.create(entity);
|
||||||
@@ -52,7 +51,6 @@ public class MdBaseMaterialController {
|
|||||||
|
|
||||||
@PutMapping
|
@PutMapping
|
||||||
@Log("修改物料基础信息")
|
@Log("修改物料基础信息")
|
||||||
|
|
||||||
//@SaCheckPermission("@el.check('mdBaseMaterial:edit')")
|
//@SaCheckPermission("@el.check('mdBaseMaterial:edit')")
|
||||||
public ResponseEntity<Object> update(@Validated @RequestBody MdBaseMaterial entity) {
|
public ResponseEntity<Object> update(@Validated @RequestBody MdBaseMaterial entity) {
|
||||||
mdBaseMaterialService.update(entity);
|
mdBaseMaterialService.update(entity);
|
||||||
@@ -60,7 +58,6 @@ public class MdBaseMaterialController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Log("删除物料基础信息")
|
@Log("删除物料基础信息")
|
||||||
|
|
||||||
//@SaCheckPermission("@el.check('mdBaseMaterial:del')")
|
//@SaCheckPermission("@el.check('mdBaseMaterial:del')")
|
||||||
@DeleteMapping
|
@DeleteMapping
|
||||||
public ResponseEntity<Object> delete(@RequestBody Set<String> ids) {
|
public ResponseEntity<Object> delete(@RequestBody Set<String> ids) {
|
||||||
@@ -70,7 +67,6 @@ public class MdBaseMaterialController {
|
|||||||
|
|
||||||
@PostMapping("/synchronize")
|
@PostMapping("/synchronize")
|
||||||
@Log("物料同步")
|
@Log("物料同步")
|
||||||
|
|
||||||
@Limit(period = 1, count = 1)
|
@Limit(period = 1, count = 1)
|
||||||
//@SaCheckPermission("materialtype:list")
|
//@SaCheckPermission("materialtype:list")
|
||||||
public ResponseEntity<Object> synchronize(@RequestBody Map whereJson) {
|
public ResponseEntity<Object> synchronize(@RequestBody Map whereJson) {
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ import org.nl.wms.sch.task_manage.GeneralDefinition;
|
|||||||
import org.nl.wms.sch.task_manage.enums.GroupBindMaterialStatusEnum;
|
import org.nl.wms.sch.task_manage.enums.GroupBindMaterialStatusEnum;
|
||||||
import org.nl.wms.sch.task_manage.enums.NoticeTypeEnum;
|
import org.nl.wms.sch.task_manage.enums.NoticeTypeEnum;
|
||||||
import org.nl.wms.sch.task_manage.enums.WorkOrderStatusEnum;
|
import org.nl.wms.sch.task_manage.enums.WorkOrderStatusEnum;
|
||||||
|
import org.slf4j.MDC;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.scheduling.annotation.Async;
|
import org.springframework.scheduling.annotation.Async;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
@@ -73,6 +74,7 @@ public class WmsToMesServiceImpl implements WmsToMesService {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void synchronizeMaterialInfo() {
|
public void synchronizeMaterialInfo() {
|
||||||
|
MDC.put("system", "log");
|
||||||
log.info("同步物料开始");
|
log.info("同步物料开始");
|
||||||
// 获取lms数据库中的最后获取时间
|
// 获取lms数据库中的最后获取时间
|
||||||
// LambdaQueryWrapper<MdBaseMaterial> lmsMaterialTabQuery = new QueryWrapper<MdBaseMaterial>().lambda();
|
// LambdaQueryWrapper<MdBaseMaterial> lmsMaterialTabQuery = new QueryWrapper<MdBaseMaterial>().lambda();
|
||||||
|
|||||||
@@ -62,7 +62,6 @@ public class PdmBdWorkorderController {
|
|||||||
|
|
||||||
@GetMapping("/materials")
|
@GetMapping("/materials")
|
||||||
@Log("查询物料基础信息")
|
@Log("查询物料基础信息")
|
||||||
|
|
||||||
//@SaCheckPermission("@el.check('mdBaseMaterial:list')")
|
//@SaCheckPermission("@el.check('mdBaseMaterial:list')")
|
||||||
public ResponseEntity<Object> queryMaterials(MdBaseMaterialQuery whereJson, PageQuery page) {
|
public ResponseEntity<Object> queryMaterials(MdBaseMaterialQuery whereJson, PageQuery page) {
|
||||||
return new ResponseEntity<>(TableDataInfo.build(mdBaseMaterialService.queryByInventory(whereJson, page)), HttpStatus.OK);
|
return new ResponseEntity<>(TableDataInfo.build(mdBaseMaterialService.queryByInventory(whereJson, page)), HttpStatus.OK);
|
||||||
|
|||||||
@@ -138,6 +138,7 @@ public class PdmBdWorkorder implements Serializable {
|
|||||||
private Integer qualified_qty;
|
private Integer qualified_qty;
|
||||||
|
|
||||||
private Integer unqualified_qty;
|
private Integer unqualified_qty;
|
||||||
|
private Integer priority;
|
||||||
|
|
||||||
@TableField(exist = false)
|
@TableField(exist = false)
|
||||||
private String material_name;
|
private String material_name;
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package org.nl.wms.sch.group.service.impl;
|
|||||||
|
|
||||||
import cn.hutool.core.date.DateUtil;
|
import cn.hutool.core.date.DateUtil;
|
||||||
import cn.hutool.core.util.IdUtil;
|
import cn.hutool.core.util.IdUtil;
|
||||||
|
import cn.hutool.core.util.ObjectUtil;
|
||||||
import com.alibaba.fastjson.JSONObject;
|
import com.alibaba.fastjson.JSONObject;
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
@@ -65,6 +66,9 @@ public class SchBaseVehiclematerialgroupServiceImpl extends ServiceImpl<SchBaseV
|
|||||||
entity.setUpdate_id(currentUserId);
|
entity.setUpdate_id(currentUserId);
|
||||||
entity.setUpdate_name(nickName);
|
entity.setUpdate_name(nickName);
|
||||||
entity.setUpdate_time(now);
|
entity.setUpdate_time(now);
|
||||||
|
if (ObjectUtil.isNotEmpty(entity.getOut_kiln_time())) {
|
||||||
|
entity.setIs_firing(true);
|
||||||
|
}
|
||||||
vehiclematerialgroupMapper.insert(entity);
|
vehiclematerialgroupMapper.insert(entity);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -13,7 +13,6 @@
|
|||||||
WHERE (p.ing_task_code = '' OR p.ing_task_code IS NULL)
|
WHERE (p.ing_task_code = '' OR p.ing_task_code IS NULL)
|
||||||
AND p.is_used = 1
|
AND p.is_used = 1
|
||||||
AND p.point_status = '3'
|
AND p.point_status = '3'
|
||||||
AND vg.is_firing = true
|
|
||||||
AND vg.material_id = #{materialId}
|
AND vg.material_id = #{materialId}
|
||||||
AND TIMESTAMPDIFF(HOUR, vg.instorage_time, NOW()) >= ma.cooling_time
|
AND TIMESTAMPDIFF(HOUR, vg.instorage_time, NOW()) >= ma.cooling_time
|
||||||
AND p.region_code IN
|
AND p.region_code IN
|
||||||
|
|||||||
@@ -1,25 +1,15 @@
|
|||||||
|
server:
|
||||||
|
tomcat:
|
||||||
|
relaxed-query-chars: [ '|','{','}','[',']' ] #字符问题:https://blog.csdn.net/CanYue_Yi/article/details/109182577
|
||||||
|
relaxed-path-chars: [ '|','{','}','[',']' ] #字符问题: https://blog.csdn.net/weixin_41996632/article/details/90715118
|
||||||
spring:
|
spring:
|
||||||
dynamic:
|
|
||||||
tp:
|
|
||||||
enabled: true # 是否启用 dynamictp,默认true
|
|
||||||
enabledCollect: true # 是否开启监控指标采集,默认true
|
|
||||||
collectorTypes: logging,test_collect # 监控数据采集器类型(logging | micrometer | internal_logging),默认micrometer
|
|
||||||
logPath: C:\log\lms # 监控日志数据路径,默认 ${user.home}/logs,采集类型非logging不用配置
|
|
||||||
monitorInterval: 8
|
|
||||||
tomcatTp: # tomcat webserver 线程池配置
|
|
||||||
threadPoolAliasName: tomcat 线程池 # 线程池别名,可选
|
|
||||||
corePoolSize: 100
|
|
||||||
maximumPoolSize: 200
|
|
||||||
keepAliveTime: 60
|
|
||||||
runTimeout: 200
|
|
||||||
queueTimeout: 100
|
|
||||||
datasource:
|
datasource:
|
||||||
druid:
|
druid:
|
||||||
initial-size: 5 #初始化时建立物理连接的个数
|
initial-size: 5 #初始化时建立物理连接的个数
|
||||||
min-idle: 15 #最小连接池数量
|
min-idle: 15 #最小连接池数量
|
||||||
maxActive: 30 #最大连接池数量
|
maxActive: 30 #最大连接池数量
|
||||||
maxWait: 3000 #获取连接时最大等待时间,单位毫秒
|
maxWait: 3000 #获取连接时最大等待时间,单位毫秒
|
||||||
#申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。
|
# 申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。
|
||||||
test-while-idle: true
|
test-while-idle: true
|
||||||
time-between-eviction-runs-millis: 300000 #既作为检测的间隔时间又作为test-while-idle执行的依据
|
time-between-eviction-runs-millis: 300000 #既作为检测的间隔时间又作为test-while-idle执行的依据
|
||||||
min-evictable-idle-time-millis: 900000 #销毁线程时检测当前连接的最后活动时间和当前时间差大于该值时,关闭当前连接
|
min-evictable-idle-time-millis: 900000 #销毁线程时检测当前连接的最后活动时间和当前时间差大于该值时,关闭当前连接
|
||||||
@@ -63,16 +53,45 @@ spring:
|
|||||||
redis:
|
redis:
|
||||||
repositories:
|
repositories:
|
||||||
enabled: false
|
enabled: false
|
||||||
#
|
dynamic:
|
||||||
# #配置 Jpa
|
tp:
|
||||||
# jpa:
|
enabled: true # 是否启用 dynamictp,默认true
|
||||||
# hibernate:
|
enabledCollect: true # 是否开启监控指标采集,默认true
|
||||||
# ddl-auto: none
|
enabled-banner: false
|
||||||
# open-in-view: true
|
collectorTypes: logging,test_collect # 监控数据采集器类型(logging | micrometer | internal_logging),默认micrometer
|
||||||
# properties:
|
logPath: C:\log\lms # 监控日志数据路径,默认 ${user.home}/logs,采集类型非logging不用配置
|
||||||
# hibernate:
|
monitorInterval: 8
|
||||||
# dialect: org.hibernate.dialect.MySQL5InnoDBDialect
|
tomcatTp: # tomcat webserver 线程池配置
|
||||||
# enable_lazy_load_no_trans: true
|
threadPoolAliasName: tomcat 线程池 # 线程池别名,可选
|
||||||
|
corePoolSize: 100
|
||||||
|
maximumPoolSize: 200
|
||||||
|
keepAliveTime: 60
|
||||||
|
runTimeout: 200
|
||||||
|
queueTimeout: 100
|
||||||
|
notifyItems: # 报警项,不配置自动会按默认值配置(变更通知、容量报警、活性报警、拒绝报警、任务超时报警)
|
||||||
|
- type: change
|
||||||
|
enabled: true
|
||||||
|
|
||||||
|
- type: capacity # 队列容量使用率,报警项类型,查看源码 NotifyTypeEnum枚举类
|
||||||
|
enabled: true
|
||||||
|
threshold: 80 # 报警阈值,默认70,意思是队列使用率达到70%告警
|
||||||
|
interval: 120 # 报警间隔(单位:s),默认120
|
||||||
|
|
||||||
|
- type: liveness # 线程池活性
|
||||||
|
enabled: true
|
||||||
|
threshold: 80 # 报警阈值,默认 70,意思是活性达到70%告警
|
||||||
|
|
||||||
|
- type: reject # 触发任务拒绝告警
|
||||||
|
enabled: true
|
||||||
|
threshold: 100 # 默认阈值10
|
||||||
|
|
||||||
|
- type: run_timeout # 任务执行超时告警
|
||||||
|
enabled: true
|
||||||
|
threshold: 100 # 默认阈值10
|
||||||
|
|
||||||
|
- type: queue_timeout # 任务排队超时告警
|
||||||
|
enabled: true
|
||||||
|
threshold: 100 # 默认阈值10
|
||||||
task:
|
task:
|
||||||
pool:
|
pool:
|
||||||
# 核心线程池大小
|
# 核心线程池大小
|
||||||
@@ -147,3 +166,24 @@ mybatis-plus:
|
|||||||
lucene:
|
lucene:
|
||||||
index:
|
index:
|
||||||
path: D:\lucene\index
|
path: D:\lucene\index
|
||||||
|
|
||||||
|
jetcache:
|
||||||
|
statIntervalMinutes: 15
|
||||||
|
areaInCacheName: false
|
||||||
|
local:
|
||||||
|
default:
|
||||||
|
type: linkedhashmap
|
||||||
|
keyConvertor: fastjson
|
||||||
|
remote:
|
||||||
|
default:
|
||||||
|
type: redis
|
||||||
|
keyConvertor: fastjson2
|
||||||
|
broadcastChannel: projectA
|
||||||
|
valueEncoder: java
|
||||||
|
valueDecoder: java
|
||||||
|
poolConfig:
|
||||||
|
minIdle: 5 # 连接池中的最小空闲连接数
|
||||||
|
maxIdle: 20 # 连接池中的最大空闲连接数
|
||||||
|
maxTotal: 50 # 连接池中的最大连接数
|
||||||
|
host: 127.0.0.1
|
||||||
|
port: 6379
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ https://juejin.cn/post/6844903775631572999
|
|||||||
</appender>
|
</appender>
|
||||||
<appender name="luceneAppender" class="org.nl.config.lucene.LuceneAppender" >
|
<appender name="luceneAppender" class="org.nl.config.lucene.LuceneAppender" >
|
||||||
<filter class="ch.qos.logback.classic.filter.LevelFilter">
|
<filter class="ch.qos.logback.classic.filter.LevelFilter">
|
||||||
<level>INFO</level>
|
<level>DEBUG</level>
|
||||||
<onMatch>ACCEPT</onMatch>
|
<onMatch>ACCEPT</onMatch>
|
||||||
<onMismatch>DENY</onMismatch>
|
<onMismatch>DENY</onMismatch>
|
||||||
</filter>
|
</filter>
|
||||||
@@ -75,6 +75,26 @@ https://juejin.cn/post/6844903775631572999
|
|||||||
<appender-ref ref="asyncFileAppender"/>
|
<appender-ref ref="asyncFileAppender"/>
|
||||||
<appender-ref ref="asyncLuceneAppender"/>
|
<appender-ref ref="asyncLuceneAppender"/>
|
||||||
</root>
|
</root>
|
||||||
|
<logger name="com.baomidou.mybatisplus.core.MybatisConfiguration" level="ERROR" additivity="false">
|
||||||
|
<appender-ref ref="asyncLuceneAppender"/>
|
||||||
|
<appender-ref ref="asyncFileAppender"/>
|
||||||
|
</logger>
|
||||||
|
<logger name="org.redisson.command.RedisExecutor" level="ERROR" additivity="false">
|
||||||
|
<appender-ref ref="asyncLuceneAppender"/>
|
||||||
|
<appender-ref ref="asyncFileAppender"/>
|
||||||
|
</logger>
|
||||||
|
<logger name="org.reflections.Reflections" level="ERROR" additivity="false">
|
||||||
|
<appender-ref ref="asyncLuceneAppender"/>
|
||||||
|
<appender-ref ref="asyncFileAppender"/>
|
||||||
|
</logger>
|
||||||
|
<logger name="org.redisson.connection.ClientConnectionsEntry" level="ERROR" additivity="false">
|
||||||
|
<appender-ref ref="asyncLuceneAppender"/>
|
||||||
|
<appender-ref ref="asyncFileAppender"/>
|
||||||
|
</logger>
|
||||||
|
<logger name="org.mybatis.spring.mapper.ClassPathMapperScanner" level="ERROR" additivity="false">
|
||||||
|
<appender-ref ref="asyncLuceneAppender"/>
|
||||||
|
<appender-ref ref="asyncFileAppender"/>
|
||||||
|
</logger>
|
||||||
<logger name="org.springframework" level="ERROR" additivity="true">
|
<logger name="org.springframework" level="ERROR" additivity="true">
|
||||||
<appender-ref ref="CONSOLE"/>
|
<appender-ref ref="CONSOLE"/>
|
||||||
</logger>
|
</logger>
|
||||||
|
|||||||
@@ -289,6 +289,14 @@
|
|||||||
<el-radio :label="false">否</el-radio>
|
<el-radio :label="false">否</el-radio>
|
||||||
</el-radio-group>
|
</el-radio-group>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
<el-form-item v-if="form.region_code === 'YZ'" label="优先级">
|
||||||
|
<el-input-number
|
||||||
|
v-model.number="form.priority"
|
||||||
|
:min="0"
|
||||||
|
:max="99"
|
||||||
|
style="width: 240px;"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
<el-form-item label="是否加急" prop="is_needmove">
|
<el-form-item label="是否加急" prop="is_needmove">
|
||||||
<el-radio-group v-model="form.is_urgent" style="width: 240px">
|
<el-radio-group v-model="form.is_urgent" style="width: 240px">
|
||||||
<el-radio :label="true">是</el-radio>
|
<el-radio :label="true">是</el-radio>
|
||||||
@@ -498,6 +506,7 @@ const defaultForm = {
|
|||||||
order_subnum: 0,
|
order_subnum: 0,
|
||||||
guadansum: 0,
|
guadansum: 0,
|
||||||
ext_data: 0,
|
ext_data: 0,
|
||||||
|
priority: 1,
|
||||||
show: false
|
show: false
|
||||||
}
|
}
|
||||||
export default {
|
export default {
|
||||||
|
|||||||
@@ -209,6 +209,24 @@
|
|||||||
/>
|
/>
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
<el-form-item label="入窑时间">
|
||||||
|
<el-date-picker
|
||||||
|
v-model="form.into_kiln_time"
|
||||||
|
type="datetime"
|
||||||
|
value-format="yyyy-MM-dd HH:mm:ss"
|
||||||
|
style="width: 240px;"
|
||||||
|
placeholder="选择日期时间">
|
||||||
|
</el-date-picker>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="出窑时间">
|
||||||
|
<el-date-picker
|
||||||
|
v-model="form.out_kiln_time"
|
||||||
|
type="datetime"
|
||||||
|
value-format="yyyy-MM-dd HH:mm:ss"
|
||||||
|
style="width: 240px;"
|
||||||
|
placeholder="选择日期时间">
|
||||||
|
</el-date-picker>
|
||||||
|
</el-form-item>
|
||||||
<!--<el-form-item label="是否首个流程任务">
|
<!--<el-form-item label="是否首个流程任务">
|
||||||
<el-input v-model="form.is_first_flow_task" style="width: 240px;" />
|
<el-input v-model="form.is_first_flow_task" style="width: 240px;" />
|
||||||
</el-form-item>-->
|
</el-form-item>-->
|
||||||
|
|||||||
Reference in New Issue
Block a user