Merge branch 'master' of http://121.40.234.130:7788/lyd/zhuzhouzhongwu
This commit is contained in:
@@ -291,9 +291,10 @@
|
||||
<groupId>org.quartz-scheduler</groupId>
|
||||
<artifactId>quartz</artifactId>
|
||||
</dependency>
|
||||
<!-- 日志链路追踪 https://tlog.yomahub.com/pages/f62a84/#%E5%90%8C%E6%AD%A5%E6%97%A5%E5%BF%97-->
|
||||
<dependency>
|
||||
<groupId>com.yomahub</groupId>
|
||||
<artifactId>tlog-core</artifactId>
|
||||
<artifactId>tlog-all-spring-boot-starter</artifactId>
|
||||
<version>1.5.0</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
@@ -6,41 +6,90 @@ package org.nl.config.lucene;
|
||||
* @Date: 2023/8/25
|
||||
*/
|
||||
public class LogMessageConstant {
|
||||
/** */
|
||||
public final static String SORT_NAME = "time";
|
||||
/** 级别 */
|
||||
/**
|
||||
* 标签
|
||||
*/
|
||||
public final static String FIELD_LABEL = "label";
|
||||
/**
|
||||
* 时间
|
||||
*/
|
||||
public final static String FIELD_SORT_NAME = "time";
|
||||
/**
|
||||
* IP
|
||||
*/
|
||||
public final static String FIELD_IP = "ip";
|
||||
/**
|
||||
* 级别
|
||||
*/
|
||||
public final static String FIELD_LEVEL = "level";
|
||||
/** 时间 */
|
||||
/**
|
||||
* 时间
|
||||
*/
|
||||
public final static String FIELD_TIMESTAMP = "timestamp";
|
||||
/** 类的限定名 */
|
||||
/**
|
||||
* 类的限定名
|
||||
*/
|
||||
public final static String FIELD_CLASS_NAME = "logger";
|
||||
/** 线程名 */
|
||||
/**
|
||||
* 线程名
|
||||
*/
|
||||
public final static String FIELD_THREAD = "thread";
|
||||
/** 日志内容 */
|
||||
/**
|
||||
* 日志内容
|
||||
*/
|
||||
public final static String FIELD_MESSAGE = "message";
|
||||
/**
|
||||
* tlogTraceId
|
||||
*/
|
||||
public final static String FIELD_TRACEID = "tlogTraceId";
|
||||
/**
|
||||
* api地址
|
||||
*/
|
||||
public final static String API = "requestMethod";
|
||||
// 定义颜色值
|
||||
/** 文本颜色:黑色 */
|
||||
/**
|
||||
* 文本颜色:黑色
|
||||
*/
|
||||
public final static String COLOR_BLACK = "\u001B[30m";
|
||||
/** 文本颜色:红色 */
|
||||
/**
|
||||
* 文本颜色:红色
|
||||
*/
|
||||
public final static String COLOR_RED = "\u001B[31m";
|
||||
/** 文本颜色:绿色 */
|
||||
/**
|
||||
* 文本颜色:绿色
|
||||
*/
|
||||
public final static String COLOR_GREEN = "\u001B[32m";
|
||||
/** 文本颜色:黄色 */
|
||||
/**
|
||||
* 文本颜色:黄色
|
||||
*/
|
||||
public final static String COLOR_YELLOW = "\u001B[33m";
|
||||
/** 文本颜色:蓝色 */
|
||||
/**
|
||||
* 文本颜色:蓝色
|
||||
*/
|
||||
public final static String COLOR_BLUE = "\u001B[34m";
|
||||
/** 文本颜色:品红色 */
|
||||
/**
|
||||
* 文本颜色:品红色
|
||||
*/
|
||||
public final static String COLOR_MAGENTA = "\u001B[35m";
|
||||
/** 文本颜色:青色 */
|
||||
/**
|
||||
* 文本颜色:青色
|
||||
*/
|
||||
public final static String COLOR_CYAN = "\u001B[36m";
|
||||
/** 文本颜色:白色 */
|
||||
/**
|
||||
* 文本颜色:白色
|
||||
*/
|
||||
public final static String COLOR_WHITE = "\u001B[37m";
|
||||
/** 文本颜色重置 */
|
||||
/**
|
||||
* 文本颜色重置
|
||||
*/
|
||||
public final static String COLOR_RESET = "\u001B[0m";
|
||||
/** 背景颜色:黄色 */
|
||||
/**
|
||||
* 背景颜色:黄色
|
||||
*/
|
||||
public final static String BACKGROUND_YELLOW = "\u001B[43m";
|
||||
/** 索引路径 */
|
||||
public final static String INDEX_DIR = "E:\\lucene\\index";
|
||||
/**
|
||||
* 索引路径
|
||||
*/
|
||||
public final static String INDEX_DIR = "D:\\software\\lucene\\index";
|
||||
|
||||
}
|
||||
|
||||
@@ -8,8 +8,9 @@ package org.nl.config.lucene;
|
||||
|
||||
import ch.qos.logback.classic.spi.ILoggingEvent;
|
||||
import ch.qos.logback.core.AppenderBase;
|
||||
import cn.hutool.core.date.DateUtil;
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import com.alibaba.ttl.TransmittableThreadLocal;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.apache.lucene.analysis.Analyzer;
|
||||
import org.apache.lucene.document.*;
|
||||
import org.apache.lucene.index.IndexWriter;
|
||||
@@ -20,6 +21,8 @@ import org.nl.common.utils.YmlConfigFileUtil;
|
||||
import org.wltea.analyzer.lucene.IKAnalyzer;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.InetAddress;
|
||||
import java.net.UnknownHostException;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
@@ -34,7 +37,6 @@ public class LuceneAppender extends AppenderBase<ILoggingEvent> {
|
||||
public static IndexWriter indexWriter;
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public void start() {
|
||||
super.start();
|
||||
@@ -44,7 +46,7 @@ public class LuceneAppender extends AppenderBase<ILoggingEvent> {
|
||||
|
||||
// 获取配置值
|
||||
String luceneDir = properties.getProperty("lucene.index.path");
|
||||
System.out.println("---index地址----"+luceneDir);
|
||||
System.out.println("---index地址----" + luceneDir);
|
||||
index = FSDirectory.open(Paths.get(luceneDir));
|
||||
// 初始化 Lucene 索引
|
||||
Analyzer analyzer = new IKAnalyzer();
|
||||
@@ -58,26 +60,47 @@ public class LuceneAppender extends AppenderBase<ILoggingEvent> {
|
||||
|
||||
@Override
|
||||
protected void append(ILoggingEvent event) {
|
||||
String message = event.getFormattedMessage();
|
||||
Map<String, String> mdcPropertyMap = event.getMDCPropertyMap();
|
||||
Document doc = new Document();
|
||||
for (Property property : this.properties.getProperties()) {
|
||||
LucenePropertyAndEncoder encoder = new LucenePropertyAndEncoder(property, this.context);
|
||||
String encode = encoder.encode(event);
|
||||
doc.add(new StringField(property.getName(), encode, Field.Store.YES));
|
||||
long timeStamp = event.getTimeStamp();
|
||||
// 获取本机的IP地址
|
||||
String ipAddress = "-";
|
||||
try {
|
||||
ipAddress = InetAddress.getLocalHost().getHostAddress();
|
||||
} catch (UnknownHostException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
Map<String, String> map = event.getMDCPropertyMap();
|
||||
if (!map.isEmpty() && StringUtils.isNotEmpty(map.get("traceId"))){
|
||||
doc.add(new StringField("traceId",map.get("traceId"), Field.Store.YES));
|
||||
}else {
|
||||
doc.add(new StringField("traceId"," ", Field.Store.YES));
|
||||
String formattedDateTime = DateUtil.format(new java.util.Date(timeStamp), "yyyy-MM-dd HH:mm:ss.SSS");
|
||||
doc.add(new LongPoint(LogMessageConstant.FIELD_SORT_NAME, timeStamp));
|
||||
doc.add(new NumericDocValuesField(LogMessageConstant.FIELD_SORT_NAME, timeStamp));
|
||||
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 StoredField(LogMessageConstant.FIELD_CLASS_NAME, event.getLoggerName()));
|
||||
doc.add(new StoredField(LogMessageConstant.FIELD_IP, ipAddress));
|
||||
doc.add(new StoredField(LogMessageConstant.FIELD_THREAD, event.getThreadName()));
|
||||
if (ObjectUtil.isNotEmpty(mdcPropertyMap)) {
|
||||
String traceId = mdcPropertyMap.get(LogMessageConstant.FIELD_TRACEID);
|
||||
String api = mdcPropertyMap.get(LogMessageConstant.API);
|
||||
doc.add(new StringField(LogMessageConstant.FIELD_TRACEID,
|
||||
ObjectUtil.isNotEmpty(traceId)
|
||||
? traceId
|
||||
: "-"
|
||||
, Field.Store.YES)
|
||||
);
|
||||
doc.add(new StringField(LogMessageConstant.FIELD_LABEL,
|
||||
ObjectUtil.isNotEmpty(mdcPropertyMap.get("tag_name"))
|
||||
? mdcPropertyMap.get("tag_name")
|
||||
: "-"
|
||||
, Field.Store.YES)
|
||||
);
|
||||
doc.add(new StringField(LogMessageConstant.API, ObjectUtil.isNotEmpty(api) ? api : "-", Field.Store.YES));
|
||||
}
|
||||
|
||||
doc.add(new TextField(LogMessageConstant.FIELD_MESSAGE, event.getFormattedMessage(), Field.Store.YES));
|
||||
doc.add(new StringField(LogMessageConstant.FIELD_TIMESTAMP, String.valueOf(event.getTimeStamp()),Field.Store.YES));
|
||||
doc.add(new NumericDocValuesField(LogMessageConstant.SORT_NAME, event.getTimeStamp()));
|
||||
doc.add(new TextField(LogMessageConstant.FIELD_MESSAGE, message, Field.Store.YES));
|
||||
try {
|
||||
indexWriter.addDocument(doc);
|
||||
indexWriter.commit();
|
||||
} catch (Exception e) {
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,166 @@
|
||||
package org.nl.config.lucene;
|
||||
|
||||
import cn.hutool.core.date.DateTime;
|
||||
import cn.hutool.core.date.DateUtil;
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import com.alibaba.fastjson.JSONArray;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.lucene.analysis.Analyzer;
|
||||
import org.apache.lucene.document.Document;
|
||||
import org.apache.lucene.index.DirectoryReader;
|
||||
import org.apache.lucene.index.IndexReader;
|
||||
import org.apache.lucene.index.Term;
|
||||
import org.apache.lucene.queryparser.classic.QueryParser;
|
||||
import org.apache.lucene.search.*;
|
||||
import org.apache.lucene.store.Directory;
|
||||
import org.apache.lucene.store.FSDirectory;
|
||||
import org.apache.lucene.util.BytesRef;
|
||||
import org.wltea.analyzer.lucene.IKAnalyzer;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Paths;
|
||||
import java.text.ParseException;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.ZoneId;
|
||||
import java.time.temporal.ChronoUnit;
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* lucene查询器
|
||||
*/
|
||||
@Slf4j
|
||||
public class Searcher {
|
||||
|
||||
public static Map<String, Object> search(String indexDir, JSONObject whereJson) throws Exception {
|
||||
//获取要查询的路径,也就是索引所在的位置
|
||||
Directory dir = FSDirectory.open(Paths.get(indexDir));
|
||||
IndexReader reader = DirectoryReader.open(dir);
|
||||
//构建IndexSearcher
|
||||
IndexSearcher searcher = new IndexSearcher(reader);
|
||||
//标准分词器,会自动去掉空格啊,is a the等单词
|
||||
Analyzer analyzer = new IKAnalyzer(true);
|
||||
|
||||
// 实际上Lucene本身不支持分页。因此我们需要自己进行逻辑分页。我们要准备分页参数:
|
||||
// 每页条数
|
||||
int pageSize = Integer.parseInt(whereJson.get("size").toString());
|
||||
// 当前页码
|
||||
int pageNum = Integer.parseInt(whereJson.get("page").toString()) - 1;
|
||||
// 当前页的起始条数
|
||||
int start = pageNum * pageSize;
|
||||
// 当前页的结束条数(不能包含)
|
||||
int end = start + pageSize;
|
||||
// 创建排序对象,需要排序字段SortField,参数:字段的名称、字段的类型、是否反转如果是false,升序。true降序
|
||||
Sort sort = new Sort(new SortField(LogMessageConstant.FIELD_SORT_NAME, SortField.Type.LONG, true));
|
||||
|
||||
TopDocs docs = null;
|
||||
BooleanQuery.Builder booleanQueryBuilder = new BooleanQuery.Builder();
|
||||
Calendar calendar = Calendar.getInstance();
|
||||
calendar.set(1970, 0, 1);
|
||||
//时间范围查询
|
||||
JSONArray createTime = whereJson.getJSONArray("createTime");
|
||||
String startDate = DateUtil.format(calendar.getTime(), "yyyy-MM-dd HH:mm:ss.SSS");
|
||||
String endDate = DateUtil.format(new DateTime(), "yyyy-MM-dd HH:mm:ss.SSS");
|
||||
|
||||
if (createTime != null) {
|
||||
startDate = createTime.getString(0);
|
||||
endDate = createTime.getString(1);
|
||||
}
|
||||
// 字段之间的与或非关系,MUST表示and,MUST_NOT表示not,SHOULD表示or,有几个fields就必须有几个clauses
|
||||
TermRangeQuery termRangeQuery = new TermRangeQuery("timestamp", new BytesRef(startDate),
|
||||
new BytesRef(endDate), true, true);
|
||||
booleanQueryBuilder.add(termRangeQuery, BooleanClause.Occur.MUST);
|
||||
if (ObjectUtil.isNotEmpty(whereJson.get(LogMessageConstant.FIELD_MESSAGE))) {
|
||||
//查询解析器
|
||||
QueryParser queryParser = new QueryParser("message", analyzer);
|
||||
Query query = queryParser.parse("message:" + whereJson.getString("message") + "~");
|
||||
booleanQueryBuilder.add(query, BooleanClause.Occur.MUST);
|
||||
}
|
||||
if (ObjectUtil.isNotEmpty(whereJson.get(LogMessageConstant.FIELD_TRACEID))) {
|
||||
//查询解析器
|
||||
TermQuery termQuery = new TermQuery(new Term(LogMessageConstant.FIELD_TRACEID,
|
||||
whereJson.getString(LogMessageConstant.FIELD_TRACEID).trim()));
|
||||
booleanQueryBuilder.add(termQuery, BooleanClause.Occur.MUST);
|
||||
}
|
||||
if (ObjectUtil.isNotEmpty(whereJson.get(LogMessageConstant.FIELD_LABEL))) {
|
||||
//查询解析器
|
||||
TermQuery termQuery = new TermQuery(new Term(LogMessageConstant.FIELD_LABEL,
|
||||
whereJson.getString(LogMessageConstant.FIELD_LABEL).trim()));
|
||||
booleanQueryBuilder.add(termQuery, BooleanClause.Occur.MUST);
|
||||
}
|
||||
if (ObjectUtil.isNotEmpty(whereJson.get(LogMessageConstant.FIELD_LEVEL))) {
|
||||
//查询解析器
|
||||
TermQuery termQuery = new TermQuery(new Term(LogMessageConstant.FIELD_LEVEL,
|
||||
whereJson.get(LogMessageConstant.FIELD_LEVEL).toString()));
|
||||
booleanQueryBuilder.add(termQuery, BooleanClause.Occur.MUST);
|
||||
}
|
||||
// 使用实体接收
|
||||
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;
|
||||
int totalSize = collector.getTotalHits();
|
||||
|
||||
for (ScoreDoc scoreDoc : scoreDocs) {
|
||||
Document doc = reader.document(scoreDoc.doc);
|
||||
String logInfo = LogMessageConstant.COLOR_RED + doc.get(LogMessageConstant.FIELD_TIMESTAMP) +
|
||||
LogMessageConstant.COLOR_RESET + " - " +
|
||||
LogMessageConstant.COLOR_BLUE + doc.get(LogMessageConstant.FIELD_IP) +
|
||||
LogMessageConstant.COLOR_RESET + " - " +
|
||||
LogMessageConstant.COLOR_CYAN + doc.get(LogMessageConstant.API) +
|
||||
LogMessageConstant.COLOR_RESET + " - " +
|
||||
LogMessageConstant.COLOR_GREEN + "[" + doc.get(LogMessageConstant.FIELD_THREAD) + "]" +
|
||||
LogMessageConstant.COLOR_RESET + " - " +
|
||||
LogMessageConstant.COLOR_BLACK + doc.get(LogMessageConstant.FIELD_LEVEL) +
|
||||
LogMessageConstant.COLOR_RESET + " - " +
|
||||
LogMessageConstant.COLOR_MAGENTA + doc.get(LogMessageConstant.FIELD_CLASS_NAME) +
|
||||
LogMessageConstant.COLOR_RESET + " - " +
|
||||
LogMessageConstant.COLOR_GREEN + "<" + doc.get(LogMessageConstant.FIELD_TRACEID) + ">" +
|
||||
LogMessageConstant.COLOR_RESET + " - " +
|
||||
LogMessageConstant.COLOR_BLACK + highlightKeyword(doc.get(LogMessageConstant.FIELD_MESSAGE), whereJson.getString("message"));
|
||||
list.add(logInfo);
|
||||
}
|
||||
reader.close();
|
||||
JSONObject jo = new JSONObject();
|
||||
jo.put("content", list);
|
||||
jo.put("totalElements", totalSize);
|
||||
return jo;
|
||||
}
|
||||
|
||||
public static String highlightKeyword(String text, String keyword) {
|
||||
if (ObjectUtil.isEmpty(keyword)) {
|
||||
return text;
|
||||
}
|
||||
|
||||
int startIndex = text.indexOf(keyword);
|
||||
if (startIndex != -1) {
|
||||
int endIndex = startIndex + keyword.length();
|
||||
String beforeKeyword = text.substring(0, startIndex);
|
||||
String afterKeyword = text.substring(endIndex);
|
||||
String highlightedKeyword = LogMessageConstant.BACKGROUND_YELLOW + keyword + LogMessageConstant.COLOR_RESET
|
||||
+ LogMessageConstant.COLOR_BLACK;
|
||||
return beforeKeyword + highlightedKeyword + afterKeyword;
|
||||
} else {
|
||||
return text;
|
||||
}
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws IOException, ParseException {
|
||||
// 获取当前时间
|
||||
LocalDateTime now = LocalDateTime.now();
|
||||
// 减去七天
|
||||
LocalDateTime sevenDaysAgo = now.minus(7, ChronoUnit.DAYS);
|
||||
// 转换为 Date 类型
|
||||
Date sevenDaysAgoDate = Date.from(sevenDaysAgo.atZone(ZoneId.systemDefault()).toInstant());
|
||||
// 获取时间戳
|
||||
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");
|
||||
Date date = dateFormat.parse(String.valueOf(sevenDaysAgo));
|
||||
long timestamp = date.getTime();
|
||||
System.out.println(now);
|
||||
System.out.println(sevenDaysAgo);
|
||||
System.out.println(sevenDaysAgoDate);
|
||||
System.out.println(timestamp);
|
||||
}
|
||||
}
|
||||
@@ -17,6 +17,10 @@ package org.nl.config.thread;
|
||||
|
||||
|
||||
import org.nl.config.SpringContextHolder;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.context.annotation.Primary;
|
||||
|
||||
import java.util.concurrent.ArrayBlockingQueue;
|
||||
import java.util.concurrent.ThreadPoolExecutor;
|
||||
@@ -27,16 +31,21 @@ import java.util.concurrent.TimeUnit;
|
||||
* @author Zheng Jie
|
||||
* @date 2019年10月31日18:16:47
|
||||
*/
|
||||
@Configuration
|
||||
public class ThreadPoolExecutorUtil {
|
||||
|
||||
public static ThreadPoolExecutor getPoll(){
|
||||
AsyncTaskProperties properties = SpringContextHolder.getBean(AsyncTaskProperties.class);
|
||||
@Autowired
|
||||
private AsyncTaskProperties asyncTaskProperties;
|
||||
|
||||
@Bean
|
||||
@Primary
|
||||
public ThreadPoolExecutor threadPoolExecutor() {
|
||||
return new ThreadPoolExecutor(
|
||||
properties.getCorePoolSize(),
|
||||
properties.getMaxPoolSize(),
|
||||
properties.getKeepAliveSeconds(),
|
||||
asyncTaskProperties.getCorePoolSize(),
|
||||
asyncTaskProperties.getMaxPoolSize(),
|
||||
asyncTaskProperties.getKeepAliveSeconds(),
|
||||
TimeUnit.SECONDS,
|
||||
new ArrayBlockingQueue<>(properties.getQueueCapacity()),
|
||||
new ArrayBlockingQueue<>(asyncTaskProperties.getQueueCapacity()),
|
||||
new TheadFactoryName()
|
||||
);
|
||||
}
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
package org.nl.wms.basedata_manage.service.dao;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.FieldStrategy;
|
||||
import com.baomidou.mybatisplus.annotation.TableField;
|
||||
import com.baomidou.mybatisplus.annotation.TableId;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import lombok.Data;
|
||||
@@ -183,11 +185,13 @@ public class Structattr implements Serializable {
|
||||
/**
|
||||
* 存储载具号
|
||||
*/
|
||||
@TableField(updateStrategy = FieldStrategy.IGNORED)
|
||||
private String storagevehicle_code;
|
||||
|
||||
/**
|
||||
* 存储载具类型
|
||||
*/
|
||||
@TableField(updateStrategy = FieldStrategy.IGNORED)
|
||||
private String storagevehicle_type;
|
||||
|
||||
/**
|
||||
|
||||
@@ -420,13 +420,12 @@ public class StructattrServiceImpl extends ServiceImpl<StructattrMapper, Structa
|
||||
Structattr structattr = this.getByCode(changeDto.getStructCode());
|
||||
for (GroupPlate vehicleMater : groupPlates) {
|
||||
String vehicleCode = vehicleMater.getStoragevehicle_code();
|
||||
BigDecimal subtract = vehicleMater.getQty().add(vehicleMater.getFrozen_qty());
|
||||
BigDecimal subtract = vehicleMater.getFrozen_qty();
|
||||
//100-出50 = 50
|
||||
//如果出库是手持库出确认则不在这边变动组盘信息
|
||||
if (!changeDto.getInBound()) {
|
||||
UpdateWrapper<GroupPlate> update = new UpdateWrapper<GroupPlate>()
|
||||
.set("frozen_qty", 0)
|
||||
.set("qty", subtract)
|
||||
.set("update_time", now)
|
||||
.set("status", GROUP_PLATE_STATUS.code("出库"))
|
||||
.eq("group_id", vehicleMater.getGroup_id());
|
||||
|
||||
@@ -7,7 +7,6 @@ import cn.hutool.core.util.NumberUtil;
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
|
||||
import org.nl.wms.basedata_manage.service.IStructattrService;
|
||||
import org.nl.wms.basedata_manage.service.dao.Structattr;
|
||||
import org.nl.wms.basedata_manage.service.dao.mapper.BsrealStorattrMapper;
|
||||
@@ -61,39 +60,41 @@ public class BigScreenServiceImpl implements BigScreenService {
|
||||
public List<JSONObject> getData(List<String> stors) {
|
||||
// String storCode = "GW";
|
||||
List result = new ArrayList<>();
|
||||
if (CollectionUtils.isEmpty(stors)){
|
||||
if (CollectionUtils.isEmpty(stors)) {
|
||||
return result;
|
||||
}
|
||||
for (String storCode : stors) {
|
||||
JSONObject item = new JSONObject();
|
||||
//1.【货位使用】数据
|
||||
item.put("title",storCode+"仓库");
|
||||
item.put("title", storCode + "仓库");
|
||||
item.put("pointUse", pointUse(storCode));
|
||||
// //2.【实时库存分析】数据
|
||||
item.put("ivtAnalyse", ivtAnalyse(storCode));
|
||||
//3.【出入库趋势】数据
|
||||
//3.【出入库趋势】数据
|
||||
item.put("inAndOutTrend", inAndOutTrend(storCode));
|
||||
// //4.【今日出入库】数据
|
||||
item.put("toDayInAndOut", toDayInAndOut(storCode));
|
||||
// //5.【今日出入库】数据
|
||||
item.put("realTask", realTask(storCode));
|
||||
//6.【未完成单据】数据
|
||||
//6.【未完成单据】数据
|
||||
item.put("unIos", unIos(storCode));
|
||||
result.add(item);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
//
|
||||
// * 货位使用
|
||||
// *
|
||||
// * @return JSONObject {
|
||||
// * total_qty: 总货位数
|
||||
// * use_qty: 已用货位
|
||||
// * emp_qty: 空余货位
|
||||
// * use_percentage: 百分比(使用货位百分比)
|
||||
// * }
|
||||
// */
|
||||
* //
|
||||
* // * 货位使用
|
||||
* // *
|
||||
* // * @return JSONObject {
|
||||
* // * total_qty: 总货位数
|
||||
* // * use_qty: 已用货位
|
||||
* // * emp_qty: 空余货位
|
||||
* // * use_percentage: 百分比(使用货位百分比)
|
||||
* // * }
|
||||
* //
|
||||
*/
|
||||
private JSONObject pointUse(String storCode) {
|
||||
// 返回数据
|
||||
JSONObject result = new JSONObject();
|
||||
@@ -120,7 +121,7 @@ public class BigScreenServiceImpl implements BigScreenService {
|
||||
result.put("emp_qty", emp_qty);
|
||||
// 使用货位百分比
|
||||
double use_percentage = 0;
|
||||
if (total_qty != 0){
|
||||
if (total_qty != 0) {
|
||||
use_percentage = NumberUtil.mul(NumberUtil.div(use_qty, total_qty), 100);
|
||||
}
|
||||
result.put("use_percentage", NumberUtil.round(use_percentage, 2));
|
||||
@@ -148,21 +149,23 @@ public class BigScreenServiceImpl implements BigScreenService {
|
||||
int i = 0;
|
||||
int top5 = 0;
|
||||
for (IvtAnalyse json : list) {
|
||||
if (i==5){break;}
|
||||
if (i == 5) {
|
||||
break;
|
||||
}
|
||||
JSONObject item = new JSONObject();
|
||||
item.put("ivt_qty", json.getSum_qty());
|
||||
item.put("material_name", json.getMaterial_name());
|
||||
double percentage = NumberUtil.mul(json.getSum_qty()/sum, 100);
|
||||
double percentage = NumberUtil.mul(sum == 0 ? 0 : json.getSum_qty() / sum, 100);
|
||||
item.put("percentage", NumberUtil.round(percentage, 2));
|
||||
topFiveList.add(item);
|
||||
i++;
|
||||
top5 = top5+json.getSum_qty();
|
||||
top5 = top5 + json.getSum_qty();
|
||||
}
|
||||
if (sum>top5){
|
||||
if (sum > top5) {
|
||||
JSONObject other = new JSONObject();
|
||||
other.put("ivt_qty", sum-top5);
|
||||
other.put("ivt_qty", sum - top5);
|
||||
other.put("material_name", "其他物料");
|
||||
other.put("percentage", NumberUtil.round(1-top5/sum, 2));
|
||||
other.put("percentage", NumberUtil.round(sum == 0 ? 0 : 1 - top5 / sum, 2));
|
||||
topFiveList.add(other);
|
||||
}
|
||||
result.put("data", topFiveList);
|
||||
@@ -318,7 +321,7 @@ public class BigScreenServiceImpl implements BigScreenService {
|
||||
new QueryWrapper<SchBaseTask>().lambda()
|
||||
.le(SchBaseTask::getTask_status, TaskStatus.FINISHED.getCode())
|
||||
.eq(SchBaseTask::getIs_delete, IOSConstant.IS_DELETE_NO)
|
||||
.ge(SchBaseTask::getCreate_time,DateUtil.today())
|
||||
.ge(SchBaseTask::getCreate_time, DateUtil.today())
|
||||
);
|
||||
list.stream().forEach(item -> {
|
||||
item.setTask_status(TaskStatus.convertName(item.getTask_status()));
|
||||
@@ -342,7 +345,7 @@ public class BigScreenServiceImpl implements BigScreenService {
|
||||
.ne(IOStorInv::getBill_status, IOSEnum.BILL_STATUS.code("完成"))
|
||||
);
|
||||
list.stream().forEach(item -> {
|
||||
item.setIo_type(item.getIo_type().equals(IOSEnum.IO_TYPE.code("入库"))?"入库":"出库");
|
||||
item.setIo_type(item.getIo_type().equals(IOSEnum.IO_TYPE.code("入库")) ? "入库" : "出库");
|
||||
if (item.getBill_status().equals(IOSEnum.BILL_STATUS.code("生成"))) {
|
||||
item.setBill_status("生成");
|
||||
}
|
||||
|
||||
@@ -0,0 +1,65 @@
|
||||
package org.nl.wms.ext_manage.util;
|
||||
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import cn.hutool.http.HttpRequest;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.nl.config.SpringContextHolder;
|
||||
import org.nl.wms.ext_manage.service.util.AcsResponse;
|
||||
import org.nl.wms.system_manage.enums.SysParamConstant;
|
||||
import org.nl.wms.system_manage.service.param.dao.Param;
|
||||
import org.nl.wms.system_manage.service.param.impl.SysParamServiceImpl;
|
||||
import org.nl.wms.warehouse_manage.enums.IOSConstant;
|
||||
|
||||
/**
|
||||
* @Author: lyd
|
||||
* @Date: 2025/7/30
|
||||
*/
|
||||
@Slf4j
|
||||
public class MesUtil {
|
||||
/**
|
||||
* 下发任务
|
||||
* @param api mes地址
|
||||
* @param param 下发参数
|
||||
* @return AcsResponse
|
||||
*/
|
||||
public static <T> AcsResponse notifyMes(String api, T param) {
|
||||
log.info("下发MES的参数为:-------------------" + param.toString());
|
||||
// 返回参数
|
||||
AcsResponse resultAcs;
|
||||
// 系统参数类
|
||||
SysParamServiceImpl sysParamService = SpringContextHolder.getBean(SysParamServiceImpl.class);
|
||||
//判断是否连接MES系统
|
||||
Param isConnectMes = sysParamService.findByCode(SysParamConstant.IS_CONNECT_MES);
|
||||
if (ObjectUtil.isEmpty(isConnectMes)) {
|
||||
return AcsResponse.requestError("系统参数表中:" + SysParamConstant.IS_CONNECT_MES + "不存在");
|
||||
}
|
||||
if (isConnectMes.getValue().equals(IOSConstant.IS_DELETE_NO)) {
|
||||
return AcsResponse.requestOkMessage("下发成功,未连接MES系统!");
|
||||
}
|
||||
|
||||
//MES地址
|
||||
Param acsUrlParam = sysParamService.findByCode(SysParamConstant.MES_URL);
|
||||
if (ObjectUtil.isEmpty(acsUrlParam)) {
|
||||
return AcsResponse.requestError("系统参数表中:" + SysParamConstant.MES_URL + "不存在");
|
||||
}
|
||||
|
||||
String url = acsUrlParam.getValue() + api;
|
||||
try {
|
||||
String resultMsg = HttpRequest.post(url)
|
||||
.body(String.valueOf(param))
|
||||
.execute().body();
|
||||
// 格式转换
|
||||
JSONObject result = JSONObject.parseObject(resultMsg);
|
||||
resultAcs = JSONObject.toJavaObject(result, AcsResponse.class);
|
||||
|
||||
log.info("下发MES任务的输出参数为:-------------------" + resultMsg);
|
||||
} catch (Exception e) {
|
||||
//网络不通
|
||||
String msg = e.getMessage();
|
||||
log.error("连接失败:{}", msg);
|
||||
return AcsResponse.requestError("网络不通,操作失败!");
|
||||
}
|
||||
return resultAcs;
|
||||
}
|
||||
}
|
||||
@@ -68,4 +68,40 @@ public class PdaJBController {
|
||||
public ResponseEntity<Object> jbReturnMaterial(@RequestBody JSONObject whereJson) {
|
||||
return new ResponseEntity<>(pdaJBService.jbReturnMaterial(whereJson), HttpStatus.OK);
|
||||
}
|
||||
@PostMapping("/jbGetVehicleCode")
|
||||
@Log("获取解包点位的托盘编码")
|
||||
@SaIgnore
|
||||
public ResponseEntity<Object> jbGetVehicleCode(@RequestBody JSONObject whereJson) {
|
||||
return new ResponseEntity<>(pdaJBService.jbGetVehicleCode(whereJson), HttpStatus.OK);
|
||||
}
|
||||
@PostMapping("/jbGetLtInfo")
|
||||
@Log("获取料桶组盘信息")
|
||||
@SaIgnore
|
||||
public ResponseEntity<Object> jbGetLtInfo(@RequestBody JSONObject whereJson) {
|
||||
return new ResponseEntity<>(pdaJBService.jbGetLtInfo(whereJson), HttpStatus.OK);
|
||||
}
|
||||
@PostMapping("/jbEmptyTakeOut")
|
||||
@Log("空桶取出")
|
||||
@SaIgnore
|
||||
public ResponseEntity<Object> jbEmptyTakeOut(@RequestBody JSONObject whereJson) {
|
||||
return new ResponseEntity<>(pdaJBService.jbEmptyTakeOut(whereJson), HttpStatus.OK);
|
||||
}
|
||||
@PostMapping("/getAllIntoRegionMembers")
|
||||
@Log("获取所有区域成员")
|
||||
@SaIgnore
|
||||
public ResponseEntity<Object> getAllIntoRegionMembers(@RequestBody JSONObject whereJson) {
|
||||
return new ResponseEntity<>(pdaJBService.getAllIntoRegionMembers(whereJson), HttpStatus.OK);
|
||||
}
|
||||
@PostMapping("/intoRegion")
|
||||
@Log("进入区域")
|
||||
@SaIgnore
|
||||
public ResponseEntity<Object> intoRegion(@RequestBody JSONObject whereJson) {
|
||||
return new ResponseEntity<>(pdaJBService.intoRegion(whereJson), HttpStatus.OK);
|
||||
}
|
||||
@PostMapping("/outRegion")
|
||||
@Log("出去区域")
|
||||
@SaIgnore
|
||||
public ResponseEntity<Object> outRegion(@RequestBody JSONObject whereJson) {
|
||||
return new ResponseEntity<>(pdaJBService.outRegion(whereJson), HttpStatus.OK);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
package org.nl.wms.pda_manage.sch_manage.service;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.math.BigDecimal;
|
||||
|
||||
/**
|
||||
* @Author: lyd
|
||||
* @Date: 2025/8/1
|
||||
*/
|
||||
@Data
|
||||
public class GroupInfoPdaVo implements Serializable {
|
||||
private String storagevehicle_code;
|
||||
private String pcsn;
|
||||
private BigDecimal qty;
|
||||
private String qty_unit_name;
|
||||
private String supp_name;
|
||||
private String material_code;
|
||||
private String material_name;
|
||||
private String material_spec;
|
||||
private String material_model;
|
||||
}
|
||||
@@ -36,4 +36,26 @@ public interface PdaJBService {
|
||||
* @return
|
||||
*/
|
||||
PdaResponse jbReturnMaterial(JSONObject param);
|
||||
|
||||
PdaResponse jbGetVehicleCode(JSONObject param);
|
||||
|
||||
PdaResponse jbGetLtInfo(JSONObject param);
|
||||
|
||||
PdaResponse jbEmptyTakeOut(JSONObject param);
|
||||
|
||||
/**
|
||||
*
|
||||
* @param whereJson
|
||||
* @return
|
||||
*/
|
||||
PdaResponse getAllIntoRegionMembers(JSONObject whereJson);
|
||||
|
||||
/**
|
||||
* 进入区域
|
||||
* @param param
|
||||
* @return
|
||||
*/
|
||||
PdaResponse intoRegion(JSONObject param);
|
||||
|
||||
PdaResponse outRegion(JSONObject param);
|
||||
}
|
||||
|
||||
@@ -21,16 +21,21 @@ import org.nl.wms.basedata_manage.service.dao.MdMeMaterialbase;
|
||||
import org.nl.wms.basedata_manage.service.dao.MdPbStoragevehicleinfo;
|
||||
import org.nl.wms.basedata_manage.service.dao.Sectattr;
|
||||
import org.nl.wms.basedata_manage.service.dao.Structattr;
|
||||
import org.nl.wms.pda_manage.sch_manage.service.GroupInfoPdaVo;
|
||||
import org.nl.wms.pda_manage.sch_manage.service.PdaJBService;
|
||||
import org.nl.wms.pda_manage.sch_manage.service.mapper.PdaJBMapper;
|
||||
import org.nl.wms.pda_manage.util.PdaResponse;
|
||||
import org.nl.wms.pm_manage.service.IPdmBdWorkorderService;
|
||||
import org.nl.wms.pm_manage.service.dao.PdmBdWorkorder;
|
||||
import org.nl.wms.record_manage.service.IMdPbRegionMemberService;
|
||||
import org.nl.wms.record_manage.service.dao.MdPbRegionMember;
|
||||
import org.nl.wms.sch_manage.service.ISchBasePointService;
|
||||
import org.nl.wms.sch_manage.service.dao.SchBasePoint;
|
||||
import org.nl.wms.sch_manage.service.util.tasks.jb.JbUpAgvTask;
|
||||
import org.nl.wms.system_manage.service.dict.ISysDictService;
|
||||
import org.nl.wms.system_manage.service.dict.dao.Dict;
|
||||
import org.nl.wms.system_manage.service.param.ISysParamService;
|
||||
import org.nl.wms.system_manage.service.param.dao.Param;
|
||||
import org.nl.wms.warehouse_manage.enums.IOSEnum;
|
||||
import org.nl.wms.warehouse_manage.inAndOut.service.IInBillService;
|
||||
import org.nl.wms.warehouse_manage.inAndOut.service.IOutBillService;
|
||||
@@ -57,6 +62,8 @@ import java.util.*;
|
||||
@Service
|
||||
@Slf4j
|
||||
public class PdaJBServiceImpl implements PdaJBService {
|
||||
/** 解包重量误差范围值 */
|
||||
public static final String JB_STANDARD_ERROR = "JB_STANDARD_ERROR";
|
||||
@Autowired
|
||||
private PdaJBMapper pdaJBMapper;
|
||||
@Autowired
|
||||
@@ -89,6 +96,10 @@ public class PdaJBServiceImpl implements PdaJBService {
|
||||
private IInBillService inBillService;
|
||||
@Resource
|
||||
private IMdPbStoragevehicleinfoService storagevehicleinfoService;
|
||||
@Resource
|
||||
private ISysParamService sysParamService;
|
||||
@Resource
|
||||
private IMdPbRegionMemberService regionMemberService;
|
||||
@Override
|
||||
public PdaResponse getOrderList(JSONObject whereJson) {
|
||||
String flag = whereJson.getString("flag");
|
||||
@@ -209,10 +220,25 @@ public class PdaJBServiceImpl implements PdaJBService {
|
||||
@Override
|
||||
public PdaResponse getWeight(JSONObject whereJson) {
|
||||
// todo: 调用acs获取
|
||||
String currentUserId = SecurityUtils.getCurrentUserId();
|
||||
String pointCode = whereJson.getString("point_code");
|
||||
String workorder_id = whereJson.getString("workorder_id");
|
||||
Param param = sysParamService.findByCode(JB_STANDARD_ERROR);
|
||||
if (ObjectUtil.isEmpty(param)) {
|
||||
throw new BadRequestException("请先定义 " + JB_STANDARD_ERROR + " 系统参数!");
|
||||
}
|
||||
JSONObject res = new JSONObject();
|
||||
res.put("weight", "999.99");
|
||||
res.put("flag", "2");
|
||||
res.put("message", "重量误差过大,请注意!");
|
||||
res.put("flag", "1");
|
||||
res.put("message", "重量误差范围正常!");
|
||||
PdmBdWorkorder workorder = workorderService.getById(workorder_id);
|
||||
res.put("org_weight", workorder.getPlan_weight());
|
||||
res.put("stand_error", param.getValue());
|
||||
if (workorder.getPlan_weight().subtract(BigDecimal.valueOf(999.99))
|
||||
.abs().compareTo(new BigDecimal(param.getValue().trim())) > 0) {
|
||||
res.put("flag", "2");
|
||||
res.put("message", "重量误差过大,请注意!");
|
||||
}
|
||||
return PdaResponse.requestParamOk(res);
|
||||
}
|
||||
|
||||
@@ -404,6 +430,9 @@ public class PdaJBServiceImpl implements PdaJBService {
|
||||
structattr.setStoragevehicle_code(groupPlate.getStoragevehicle_code());
|
||||
structattr.setStoragevehicle_type(vehicleInfo.getStoragevehicle_type());
|
||||
structattr.setOccupancy_state(3);
|
||||
structattr.setUpdate_id(currentUserId);
|
||||
structattr.setUpdate_name(nickName);
|
||||
structattr.setUpdate_time(now);
|
||||
structattrService.updateById(structattr);
|
||||
|
||||
// 1.4 组盘设置入库
|
||||
@@ -507,6 +536,117 @@ public class PdaJBServiceImpl implements PdaJBService {
|
||||
return PdaResponse.requestOk();
|
||||
}
|
||||
|
||||
@Override
|
||||
public PdaResponse jbGetVehicleCode(JSONObject param) {
|
||||
String pointCode = param.getString("point_code");
|
||||
SchBasePoint device = pointService.getById(pointCode);
|
||||
// 获取对应区域的点位
|
||||
SchBasePoint tPPoint = pointService.getOne(new LambdaQueryWrapper<SchBasePoint>()
|
||||
.eq(SchBasePoint::getRegion_code, device.getRegion_code())
|
||||
.eq(SchBasePoint::getParent_point_code, device.getPoint_code())
|
||||
.eq(SchBasePoint::getPoint_type, "3"));
|
||||
SchBasePoint ltPoint = pointService.getOne(new LambdaQueryWrapper<SchBasePoint>()
|
||||
.eq(SchBasePoint::getRegion_code, device.getRegion_code())
|
||||
.eq(SchBasePoint::getParent_point_code, device.getPoint_code())
|
||||
.eq(SchBasePoint::getPoint_type, "2"));
|
||||
JSONObject res = new JSONObject();
|
||||
res.put("tp_code", tPPoint.getVehicle_code());
|
||||
res.put("lt_code", ltPoint.getVehicle_code());
|
||||
return PdaResponse.requestParamOk(res);
|
||||
}
|
||||
|
||||
@Override
|
||||
public PdaResponse jbGetLtInfo(JSONObject param) {
|
||||
String vehicleCode = param.getString("vehicle_code");
|
||||
List<GroupInfoPdaVo> groups = pdaJBMapper.getGroupInfoByVehicle(vehicleCode, "01");
|
||||
if (groups.size() > 1) {
|
||||
throw new BadRequestException("组盘信息错误!");
|
||||
}
|
||||
return PdaResponse.requestParamOk(groups.size() > 0 ? groups.get(0) : null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public PdaResponse jbEmptyTakeOut(JSONObject param) {
|
||||
String pointCode = param.getString("point_code");
|
||||
String currentUserId = SecurityUtils.getCurrentUserId();
|
||||
String nickName = SecurityUtils.getCurrentNickName();
|
||||
String now = DateUtil.now();
|
||||
JSONObject res = doCheckStruct(pointCode);
|
||||
if ("2".equals(res.getString("flag"))) {
|
||||
throw new BadRequestException(res.getString("message"));
|
||||
}
|
||||
Structattr structattr = structattrService.getByCode(pointCode);
|
||||
if (ObjectUtil.isEmpty(structattr)) {
|
||||
throw new BadRequestException("仓位:" + pointCode + " 不存在!");
|
||||
}
|
||||
// 1.3 仓位赋值
|
||||
structattr.setStoragevehicle_code(null);
|
||||
structattr.setStoragevehicle_type(null);
|
||||
structattr.setOccupancy_state(1);
|
||||
structattr.setUpdate_id(currentUserId);
|
||||
structattr.setUpdate_name(nickName);
|
||||
structattr.setUpdate_time(now);
|
||||
structattrService.updateById(structattr);
|
||||
return PdaResponse.requestOk();
|
||||
}
|
||||
|
||||
@Override
|
||||
public PdaResponse getAllIntoRegionMembers(JSONObject whereJson) {
|
||||
String regionCode = whereJson.getString("region_code");
|
||||
List<MdPbRegionMember> list = regionMemberService.list(new LambdaQueryWrapper<MdPbRegionMember>()
|
||||
.eq(MdPbRegionMember::getRecord_status, "1")
|
||||
.eq(MdPbRegionMember::getRegion_code, regionCode));
|
||||
return PdaResponse.requestParamOk(list);
|
||||
}
|
||||
|
||||
@Override
|
||||
public PdaResponse intoRegion(JSONObject param) {
|
||||
String regionCode = param.getString("region_code");
|
||||
String nickname = param.getString("nickname");
|
||||
MdPbRegionMember pbRegionMember = regionMemberService.getOne(new LambdaQueryWrapper<MdPbRegionMember>()
|
||||
.eq(MdPbRegionMember::getRegion_code, regionCode)
|
||||
.eq(MdPbRegionMember::getInto_member, nickname)
|
||||
.eq(MdPbRegionMember::getRecord_status, "1"), false);
|
||||
if (ObjectUtil.isNotEmpty(pbRegionMember)) {
|
||||
throw new BadRequestException("您已经记录进入该区域,请勿多次进入!");
|
||||
}
|
||||
MdPbRegionMember regionMember = new MdPbRegionMember();
|
||||
regionMember.setRecord_id(IdUtil.getStringId());
|
||||
regionMember.setInto_member(nickname);
|
||||
regionMember.setIn_time(DateUtil.now());
|
||||
regionMember.setRecord_status("1");
|
||||
regionMember.setRegion_code(regionCode);
|
||||
regionMemberService.save(regionMember);
|
||||
return PdaResponse.requestOk();
|
||||
}
|
||||
|
||||
@Override
|
||||
public PdaResponse outRegion(JSONObject param) {
|
||||
// region_code、nickname、rows
|
||||
String regionCode = param.getString("region_code");
|
||||
String nickname = param.getString("nickname");
|
||||
JSONArray rows = param.getJSONArray("rows");
|
||||
List<MdPbRegionMember> memberRecords;
|
||||
if (rows.size() > 0) {
|
||||
memberRecords = rows.toJavaList(MdPbRegionMember.class);
|
||||
} else {
|
||||
// 更新自身
|
||||
memberRecords = regionMemberService.list(new LambdaQueryWrapper<MdPbRegionMember>()
|
||||
.eq(MdPbRegionMember::getRecord_status, "1")
|
||||
.eq(MdPbRegionMember::getInto_member, nickname)
|
||||
.eq(MdPbRegionMember::getRegion_code, regionCode));
|
||||
}
|
||||
memberRecords.forEach(m -> {
|
||||
m.setOut_time(DateUtil.now());
|
||||
m.setOperate_name(nickname);
|
||||
m.setRecord_status("2");
|
||||
});
|
||||
if (memberRecords.size() > 0) {
|
||||
regionMemberService.updateBatchById(memberRecords);
|
||||
}
|
||||
return PdaResponse.requestOk();
|
||||
}
|
||||
|
||||
private Map<String, Object> buildTaskData(String pointCode, String workorderId, String invId) {
|
||||
Map<String, Object> jsonMst = new HashMap<>();
|
||||
// ru库点
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package org.nl.wms.pda_manage.sch_manage.service.mapper;
|
||||
|
||||
import org.nl.wms.basedata_manage.service.dao.Structattr;
|
||||
import org.nl.wms.pda_manage.sch_manage.service.GroupInfoPdaVo;
|
||||
import org.nl.wms.pm_manage.service.dao.PdmBdWorkorder;
|
||||
import org.nl.wms.sch_manage.service.dao.SchBasePoint;
|
||||
|
||||
@@ -28,4 +29,12 @@ public interface PdaJBMapper {
|
||||
* @return
|
||||
*/
|
||||
List<SchBasePoint> getCanUseCFGJ(PdmBdWorkorder workorder, String pointStatus);
|
||||
|
||||
/**
|
||||
* 获取组盘信息
|
||||
* @param vehicleCode 托盘
|
||||
* @param groupStatus 状态
|
||||
* @return
|
||||
*/
|
||||
List<GroupInfoPdaVo> getGroupInfoByVehicle(String vehicleCode, String groupStatus);
|
||||
}
|
||||
|
||||
@@ -37,4 +37,21 @@
|
||||
OR t.point_code4 = p.point_code
|
||||
))
|
||||
</select>
|
||||
<select id="getGroupInfoByVehicle" resultType="org.nl.wms.pda_manage.sch_manage.service.GroupInfoPdaVo">
|
||||
SELECT
|
||||
mg.storagevehicle_code,
|
||||
mg.pcsn,
|
||||
mg.qty,
|
||||
mg.qty_unit_name,
|
||||
mg.supp_name,
|
||||
mm.material_code,
|
||||
mm.material_name,
|
||||
mm.material_spec,
|
||||
mm.material_model
|
||||
FROM
|
||||
`md_pb_groupplate` mg
|
||||
LEFT JOIN md_me_materialbase mm ON mm.material_id = mg.material_id
|
||||
WHERE mg.storagevehicle_code = #{vehicleCode}
|
||||
AND mg.`status` = #{groupStatus}
|
||||
</select>
|
||||
</mapper>
|
||||
|
||||
@@ -17,6 +17,7 @@ import org.nl.common.base.TableDataInfo;
|
||||
@Data
|
||||
@Builder
|
||||
public class PdaResponse<T> {
|
||||
private String code;
|
||||
|
||||
/**
|
||||
* 信息
|
||||
@@ -34,6 +35,7 @@ public class PdaResponse<T> {
|
||||
*/
|
||||
public static PdaResponse requestOk() {
|
||||
return PdaResponse.builder()
|
||||
.code("200")
|
||||
.message("操作成功!")
|
||||
.build();
|
||||
}
|
||||
@@ -44,6 +46,7 @@ public class PdaResponse<T> {
|
||||
*/
|
||||
public static <T> PdaResponse requestParamOk(T data) {
|
||||
return PdaResponse.builder()
|
||||
.code("200")
|
||||
.message("操作成功!")
|
||||
.data(data)
|
||||
.build();
|
||||
|
||||
@@ -0,0 +1,59 @@
|
||||
package org.nl.wms.record_manage.controller;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.nl.common.base.TableDataInfo;
|
||||
import org.nl.common.domain.query.PageQuery;
|
||||
import org.nl.common.logging.annotation.Log;
|
||||
import org.nl.wms.record_manage.service.IMdPbRegionMemberService;
|
||||
import org.nl.wms.record_manage.service.dao.MdPbRegionMember;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
/**
|
||||
* @author liyd
|
||||
* @date 2025-08-01
|
||||
**/
|
||||
@Slf4j
|
||||
@RestController
|
||||
@RequestMapping("/api/mdPbRegionMember")
|
||||
public class MdPbRegionMemberController {
|
||||
|
||||
@Autowired
|
||||
private IMdPbRegionMemberService mdPbRegionMemberService;
|
||||
|
||||
@GetMapping
|
||||
@Log("查询管控区域记录")
|
||||
//@SaCheckPermission("mdPbRegionMember:list")
|
||||
public ResponseEntity<Object> query(@RequestParam Map whereJson, PageQuery page){
|
||||
return new ResponseEntity<>(TableDataInfo.build(mdPbRegionMemberService.queryAll(whereJson,page)),HttpStatus.OK);
|
||||
}
|
||||
|
||||
@PostMapping
|
||||
@Log("新增管控区域记录")
|
||||
//@SaCheckPermission("mdPbRegionMember:add")
|
||||
public ResponseEntity<Object> create(@Validated @RequestBody MdPbRegionMember entity){
|
||||
mdPbRegionMemberService.create(entity);
|
||||
return new ResponseEntity<>(HttpStatus.CREATED);
|
||||
}
|
||||
|
||||
@PutMapping
|
||||
@Log("修改管控区域记录")
|
||||
//@SaCheckPermission("mdPbRegionMember:edit")
|
||||
public ResponseEntity<Object> update(@Validated @RequestBody MdPbRegionMember entity){
|
||||
mdPbRegionMemberService.update(entity);
|
||||
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
|
||||
}
|
||||
|
||||
@Log("删除管控区域记录")
|
||||
//@SaCheckPermission("mdPbRegionMember:del")
|
||||
@DeleteMapping
|
||||
public ResponseEntity<Object> delete(@RequestBody Set<String> ids) {
|
||||
mdPbRegionMemberService.deleteAll(ids);
|
||||
return new ResponseEntity<>(HttpStatus.OK);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
package org.nl.wms.record_manage.service;
|
||||
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import org.nl.common.domain.query.PageQuery;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
import org.nl.wms.record_manage.service.dao.MdPbRegionMember;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* @description 服务接口
|
||||
* @author liyd
|
||||
* @date 2025-08-01
|
||||
**/
|
||||
public interface IMdPbRegionMemberService extends IService<MdPbRegionMember> {
|
||||
|
||||
/**
|
||||
* 查询数据分页
|
||||
* @param whereJson 条件
|
||||
* @param pageable 分页参数
|
||||
* @return IPage<MdPbRegionMember>
|
||||
*/
|
||||
IPage<MdPbRegionMember> queryAll(Map whereJson, PageQuery pageable);
|
||||
|
||||
/**
|
||||
* 创建
|
||||
* @param entity /
|
||||
*/
|
||||
void create(MdPbRegionMember entity);
|
||||
|
||||
/**
|
||||
* 编辑
|
||||
* @param entity /
|
||||
*/
|
||||
void update(MdPbRegionMember entity);
|
||||
|
||||
/**
|
||||
* 多选删除
|
||||
* @param ids /
|
||||
*/
|
||||
void deleteAll(Set<String> ids);
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
package org.nl.wms.record_manage.service.dao;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.IdType;
|
||||
import com.baomidou.mybatisplus.annotation.TableId;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* @description /
|
||||
* @author liyd
|
||||
* @date 2025-08-01
|
||||
**/
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = false)
|
||||
@TableName("md_pb_region_member")
|
||||
public class MdPbRegionMember implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@TableId(value = "record_id", type = IdType.NONE)
|
||||
/** 记录id */
|
||||
private String record_id;
|
||||
|
||||
/** 进入成员 */
|
||||
private String into_member;
|
||||
|
||||
/** 进入时间 */
|
||||
private String in_time;
|
||||
|
||||
/** 状态:1进去,2出去 */
|
||||
private String record_status;
|
||||
|
||||
/** 出去时间 */
|
||||
private String out_time;
|
||||
|
||||
/** 管控区域 */
|
||||
private String region_code;
|
||||
|
||||
/** 操作人员 */
|
||||
private String operate_name;
|
||||
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
package org.nl.wms.record_manage.service.dao.mapper;
|
||||
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import org.nl.wms.record_manage.service.dao.MdPbRegionMember;
|
||||
|
||||
/**
|
||||
* @author liyd
|
||||
* @date 2025-08-01
|
||||
**/
|
||||
public interface MdPbRegionMemberMapper extends BaseMapper<MdPbRegionMember> {
|
||||
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
<?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="org.nl.wms.record_manage.service.dao.mapper.MdPbRegionMemberMapper">
|
||||
|
||||
</mapper>
|
||||
@@ -0,0 +1,36 @@
|
||||
package org.nl.wms.record_manage.service.dto;
|
||||
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
|
||||
import lombok.Data;
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* @description /
|
||||
* @author liyd
|
||||
* @date 2025-08-01
|
||||
**/
|
||||
@Data
|
||||
public class MdPbRegionMemberDto implements Serializable {
|
||||
|
||||
/** 记录id */
|
||||
private String record_id;
|
||||
|
||||
/** 进入成员 */
|
||||
private String member;
|
||||
|
||||
/** 进入时间 */
|
||||
private String in_time;
|
||||
|
||||
/** 状态:1进去,2出去 */
|
||||
private String record_status;
|
||||
|
||||
/** 出去时间 */
|
||||
private String out_time;
|
||||
|
||||
/** 管控区域 */
|
||||
private String region_code;
|
||||
|
||||
/** 操作人员 */
|
||||
private String operate_name;
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
package org.nl.wms.record_manage.service.dto;
|
||||
|
||||
import org.nl.common.domain.query.BaseQuery;
|
||||
import org.nl.wms.record_manage.service.dao.MdPbRegionMember;
|
||||
|
||||
/**
|
||||
* @author liyd
|
||||
* @date 2025-08-01
|
||||
**/
|
||||
public class MdPbRegionMemberQuery extends BaseQuery<MdPbRegionMember> {
|
||||
|
||||
}
|
||||
@@ -0,0 +1,63 @@
|
||||
package org.nl.wms.record_manage.service.impl;
|
||||
|
||||
import cn.hutool.core.date.DateUtil;
|
||||
import cn.hutool.core.util.IdUtil;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.nl.config.language.LangProcess;
|
||||
import org.nl.common.domain.query.PageQuery;
|
||||
import org.nl.common.exception.BadRequestException;
|
||||
import org.nl.common.utils.SecurityUtils;
|
||||
import org.nl.wms.record_manage.service.IMdPbRegionMemberService;
|
||||
import org.nl.wms.record_manage.service.dao.mapper.MdPbRegionMemberMapper;
|
||||
import org.nl.wms.record_manage.service.dao.MdPbRegionMember;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* @description 服务实现
|
||||
* @author liyd
|
||||
* @date 2025-08-01
|
||||
**/
|
||||
@Slf4j
|
||||
@Service
|
||||
public class MdPbRegionMemberServiceImpl extends ServiceImpl<MdPbRegionMemberMapper, MdPbRegionMember> implements IMdPbRegionMemberService {
|
||||
|
||||
@Autowired
|
||||
private MdPbRegionMemberMapper mdPbRegionMemberMapper;
|
||||
|
||||
@Override
|
||||
public IPage<MdPbRegionMember> queryAll(Map whereJson, PageQuery page){
|
||||
LambdaQueryWrapper<MdPbRegionMember> lam = new LambdaQueryWrapper<>();
|
||||
IPage<MdPbRegionMember> pages = new Page<>(page.getPage() + 1, page.getSize());
|
||||
mdPbRegionMemberMapper.selectPage(pages, lam);
|
||||
return pages;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void create(MdPbRegionMember entity) {
|
||||
entity.setRecord_id(IdUtil.getSnowflake(1, 1).nextIdStr());
|
||||
mdPbRegionMemberMapper.insert(entity);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void update(MdPbRegionMember entity) {
|
||||
MdPbRegionMember dto = mdPbRegionMemberMapper.selectById(entity.getRecord_id());
|
||||
if (dto == null) throw new BadRequestException(LangProcess.msg("error_SystemAuthError"));
|
||||
mdPbRegionMemberMapper.updateById(entity);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void deleteAll(Set<String> ids) {
|
||||
// 真删除
|
||||
mdPbRegionMemberMapper.deleteBatchIds(ids);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -3,24 +3,21 @@ package org.nl.wms.sch_manage.service.util;
|
||||
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.SneakyThrows;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.nl.wms.sch_manage.enums.TaskStatus;
|
||||
import org.nl.wms.sch_manage.service.ISchBaseTaskService;
|
||||
import org.nl.wms.sch_manage.service.dao.SchBaseTask;
|
||||
import org.nl.wms.system_manage.enums.TagNameEnum;
|
||||
import org.nl.wms.warehouse_manage.enums.IOSConstant;
|
||||
import org.redisson.api.RLock;
|
||||
import org.redisson.api.RedissonClient;
|
||||
import org.slf4j.MDC;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
@Slf4j
|
||||
@Component
|
||||
@RequiredArgsConstructor
|
||||
public class AutoTask {
|
||||
|
||||
/**
|
||||
@@ -35,21 +32,12 @@ public class AutoTask {
|
||||
@Autowired
|
||||
private TaskFactory taskFactory;
|
||||
|
||||
private final RedissonClient redissonClient;
|
||||
//定时任务
|
||||
@SneakyThrows
|
||||
public void run() {
|
||||
RLock lock = redissonClient.getLock(this.getClass().getName());
|
||||
boolean tryLock = lock.tryLock(0, TimeUnit.SECONDS);
|
||||
try {
|
||||
if (tryLock) {
|
||||
sendTask();
|
||||
}
|
||||
} catch (Exception e) {
|
||||
if (tryLock) {
|
||||
lock.unlock();
|
||||
}
|
||||
}
|
||||
MDC.put(TagNameEnum.TAG_NAME.getTag(), TagNameEnum.AUTO_TASK_SEND.getTag());
|
||||
log.info("定时器正在执行下发任务调度...");
|
||||
sendTask();
|
||||
log.info("定时器执行下发任务调度结束...");
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -58,7 +46,8 @@ public class AutoTask {
|
||||
private void sendTask() {
|
||||
List<SchBaseTask> taskList = taskService.list(new LambdaQueryWrapper<SchBaseTask>()
|
||||
.eq(SchBaseTask::getIs_delete, IOSConstant.IS_DELETE_NO)
|
||||
.eq(SchBaseTask::getTask_status, TaskStatus.CREATE.getCode()));
|
||||
.eq(SchBaseTask::getTask_status, TaskStatus.CREATE.getCode())
|
||||
.orderByAsc(SchBaseTask::getTask_group_seq));
|
||||
if (ObjectUtil.isEmpty(taskList)) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
package org.nl.wms.system_manage.controller.lucence;
|
||||
|
||||
import cn.dev33.satoken.annotation.SaIgnore;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.nl.common.logging.annotation.Log;
|
||||
import org.nl.wms.system_manage.service.logserver.LogQuery;
|
||||
@@ -16,9 +18,9 @@ import org.springframework.web.bind.annotation.*;
|
||||
* @date 2023年01月29日 18:55
|
||||
* @desc desc
|
||||
*/
|
||||
|
||||
@RestController
|
||||
@RequestMapping("/api/esLog")
|
||||
@RequiredArgsConstructor
|
||||
@RequestMapping("/api/lucene")
|
||||
@Slf4j
|
||||
public class LuceneLogController {
|
||||
|
||||
@@ -26,44 +28,13 @@ public class LuceneLogController {
|
||||
private LuceneLogService luceneLogService;
|
||||
|
||||
|
||||
@GetMapping("/labels/{type}")
|
||||
//("获取标签")
|
||||
public ResponseEntity<Object> labelsValues(@PathVariable String type) {
|
||||
return new ResponseEntity<>(luceneLogService.getLabelsValues(type), HttpStatus.OK);
|
||||
@PostMapping("/getAll")
|
||||
public ResponseEntity<Object> get(@RequestBody JSONObject whereJson) {
|
||||
return new ResponseEntity<>(luceneLogService.getAll(whereJson), HttpStatus.OK);
|
||||
}
|
||||
|
||||
@PostMapping("/query")
|
||||
//("日志查询")
|
||||
public ResponseEntity<Object> queryAll(@RequestBody LogQuery query) {
|
||||
return new ResponseEntity<>(luceneLogService.query(query), HttpStatus.OK);
|
||||
@PostMapping("/getTagName")
|
||||
public ResponseEntity<Object> getTagName() {
|
||||
return new ResponseEntity<>(luceneLogService.getTagName(), HttpStatus.OK);
|
||||
}
|
||||
@DeleteMapping("/clearLogs")
|
||||
//("清空日志")
|
||||
public ResponseEntity<Object> clearLogs(@RequestBody LogQuery query) {
|
||||
luceneLogService.clearLogs(query);
|
||||
return new ResponseEntity<>(HttpStatus.OK);
|
||||
}
|
||||
|
||||
@GetMapping("/thread")
|
||||
@SaIgnore
|
||||
@Log("线程追踪测试")
|
||||
//("清空日志")
|
||||
public ResponseEntity<Object> thread(@RequestBody LogQuery query) {
|
||||
log.info("线程链路测试"+Thread.currentThread().getName());
|
||||
log.error("线程链路测试"+Thread.currentThread().getName());
|
||||
luceneLogService.syncdemo();
|
||||
Thread thread = new Thread(()->{
|
||||
try {
|
||||
Thread.sleep(5000);
|
||||
log.info("线程链路测试"+Thread.currentThread().getName());
|
||||
log.error("线程链路测试"+Thread.currentThread().getName());
|
||||
log.info("线程链路测试"+Thread.currentThread().getName());
|
||||
}catch (Exception ex){
|
||||
ex.printStackTrace();
|
||||
}
|
||||
});
|
||||
thread.start();
|
||||
return new ResponseEntity<>(HttpStatus.OK);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -12,10 +12,16 @@ public class SysParamConstant {
|
||||
*/
|
||||
public final static String IS_CONNECT_ACS = "is_connect_acs";
|
||||
|
||||
/**
|
||||
* 是否连接MES
|
||||
*/
|
||||
public final static String IS_CONNECT_MES = "is_connect_mes";
|
||||
|
||||
/**
|
||||
* ACS系统IP
|
||||
*/
|
||||
public final static String ACS_URL = "acs_url";
|
||||
public final static String MES_URL = "mes_url";
|
||||
|
||||
/**
|
||||
* ERP系统IP
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
package org.nl.wms.system_manage.enums;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
/**
|
||||
* @Author: lyd
|
||||
* @Description: 日志标签枚举
|
||||
* @Date: 2023/12/28
|
||||
*/
|
||||
@Getter
|
||||
@AllArgsConstructor
|
||||
public enum TagNameEnum {
|
||||
/**
|
||||
* 请勿作为mdc的value,只能作为key
|
||||
*/
|
||||
TAG_NAME("tag_name"),
|
||||
/**
|
||||
* LMS系统
|
||||
*/
|
||||
LMS("LMS系统"),
|
||||
AUTO_TASK_SEND("自动下发任务到ACS"),
|
||||
/**
|
||||
* 标记符号
|
||||
*/
|
||||
MARK_SYMBOL("-");
|
||||
private final String tag;
|
||||
}
|
||||
@@ -3,6 +3,9 @@ package org.nl.wms.system_manage.service.logserver;
|
||||
import com.alibaba.fastjson.JSONArray;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* @author ldjun
|
||||
* @version 1.0
|
||||
@@ -12,21 +15,16 @@ import com.alibaba.fastjson.JSONObject;
|
||||
public interface LuceneLogService {
|
||||
|
||||
/**
|
||||
* 清空日志
|
||||
* 获取数据分页
|
||||
*
|
||||
* @param whereJson 条件
|
||||
* @return Map<String, Object>
|
||||
*/
|
||||
void clearLogs(LogQuery query);
|
||||
/**
|
||||
* 获取labels和values树
|
||||
* @return
|
||||
*/
|
||||
JSONArray getLabelsValues(String type);
|
||||
Map<String, Object> getAll(JSONObject whereJson);
|
||||
|
||||
/**
|
||||
* 日志查询
|
||||
* @param logQuery
|
||||
* 获取枚举的标签名称
|
||||
* @return
|
||||
*/
|
||||
JSONObject query(LogQuery logQuery);
|
||||
|
||||
void syncdemo();
|
||||
List<String> getTagName();
|
||||
}
|
||||
|
||||
@@ -17,156 +17,47 @@ import org.apache.lucene.search.*;
|
||||
import org.apache.lucene.store.FSDirectory;
|
||||
import org.apache.lucene.util.BytesRef;
|
||||
import org.nl.common.exception.BadRequestException;
|
||||
import org.nl.config.language.LangProcess;
|
||||
import org.nl.config.lucene.LuceneAppender;
|
||||
import org.nl.config.lucene.Searcher;
|
||||
import org.nl.wms.system_manage.enums.TagNameEnum;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.scheduling.annotation.Async;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.wltea.analyzer.lucene.IKAnalyzer;
|
||||
|
||||
import java.nio.file.Paths;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Calendar;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@Service
|
||||
@Slf4j
|
||||
public class LuceneLogServiceImpl implements LuceneLogService {
|
||||
|
||||
static String[] INFO_LEVEL = new String[]{"DEBUG","INFO","WARN","ERROR"};
|
||||
|
||||
/**
|
||||
* 日志索引目录
|
||||
*/
|
||||
@Value("${lucene.index.path}")
|
||||
private String indexUrl;
|
||||
private String luceneUrl;
|
||||
|
||||
@Override
|
||||
public void clearLogs(LogQuery query) {
|
||||
public Map<String, Object> getAll(JSONObject whereJson) {
|
||||
JSONObject jo = new JSONObject();
|
||||
try {
|
||||
IndexWriter indexWriter = LuceneAppender.indexWriter;
|
||||
if (indexWriter != null){
|
||||
BooleanQuery.Builder booleanQueryBuilder = new BooleanQuery.Builder();
|
||||
DateTime offset = DateUtil.offset(new Date(), DateField.HOUR_OF_DAY, -10);
|
||||
TermRangeQuery termRangeQuery = new TermRangeQuery(
|
||||
"requestTime",null,
|
||||
new BytesRef(DateUtil.format(offset, "yyyy-MM-dd HH:mm:ss.SSS")), true, true);
|
||||
booleanQueryBuilder.add(termRangeQuery,BooleanClause.Occur.MUST);
|
||||
indexWriter.deleteDocuments(termRangeQuery);
|
||||
indexWriter.commit();
|
||||
}
|
||||
}catch (Exception ex){
|
||||
throw new BadRequestException("删除失败:"+ex.getMessage());
|
||||
JSONObject jsonObject = (JSONObject) Searcher.search(luceneUrl, whereJson);
|
||||
JSONArray array = jsonObject.getJSONArray("content");
|
||||
int totalElements = Integer.parseInt(jsonObject.get("totalElements").toString());
|
||||
jo.put("content", array);
|
||||
jo.put("totalElements", totalElements);
|
||||
} catch (Exception e) {
|
||||
log.error("索引查询为空", e);
|
||||
throw new NullPointerException(LangProcess.msg("error_NullPoint"));
|
||||
}
|
||||
|
||||
return jo;
|
||||
}
|
||||
|
||||
@Override
|
||||
public JSONArray getLabelsValues(String type) {
|
||||
JSONArray result = new JSONArray();
|
||||
for (String v : INFO_LEVEL) {
|
||||
JSONObject item = new JSONObject();
|
||||
item.put("label", v);
|
||||
item.put("value", v);
|
||||
result.add(item);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public JSONObject query(LogQuery logQuery) {
|
||||
JSONObject res = new JSONObject();
|
||||
PageResult page = new PageResult();
|
||||
page.setPage(logQuery.getPage());
|
||||
page.setPageSize(logQuery.getSize());
|
||||
try {
|
||||
FSDirectory directory = FSDirectory.open(Paths.get(indexUrl));
|
||||
DirectoryReader open = DirectoryReader.open(directory);
|
||||
IndexSearcher searcher = new IndexSearcher(open);
|
||||
// 创建排序对象,需要排序字段SortField,参数:字段的名称、字段的类型、是否反转如果是false,升序。true降序
|
||||
BooleanQuery.Builder booleanQueryBuilder = new BooleanQuery.Builder();
|
||||
//时间范围查询
|
||||
Date startDate = logQuery.getStartTime();
|
||||
Date endDate = logQuery.getEndTime();
|
||||
|
||||
if (startDate == null){
|
||||
Calendar calendar=Calendar.getInstance();
|
||||
calendar.set(1970, 0, 1);
|
||||
startDate = calendar.getTime(); }
|
||||
if (endDate == null){ endDate = new DateTime(); }
|
||||
TermRangeQuery termRangeQuery = new TermRangeQuery(
|
||||
"requestTime",
|
||||
new BytesRef(DateUtil.format(startDate, "yyyy-MM-dd HH:mm:ss.SSS")),
|
||||
new BytesRef(DateUtil.format(endDate, "yyyy-MM-dd HH:mm:ss.SSS")), true, true);
|
||||
booleanQueryBuilder.add(termRangeQuery,BooleanClause.Occur.MUST);
|
||||
|
||||
// 字段之间的与或非关系,MUST表示and,MUST_NOT表示not,SHOULD表示or,有几个fields就必须有几个clauses
|
||||
if (ObjectUtil.isNotEmpty(logQuery.getTraceId())){
|
||||
TermQuery termQuery = new TermQuery(new Term("traceId", logQuery.getTraceId()));
|
||||
booleanQueryBuilder.add(termQuery, BooleanClause.Occur.MUST);
|
||||
}
|
||||
if (ObjectUtil.isNotEmpty(logQuery.getLogLevel())){
|
||||
TermQuery termQuery = new TermQuery(new Term("logLevel", logQuery.getLogLevel()));
|
||||
booleanQueryBuilder.add(termQuery, BooleanClause.Occur.MUST);
|
||||
}
|
||||
if (ObjectUtil.isNotEmpty(logQuery.getSystem())) {
|
||||
TermQuery termQuery = new TermQuery(new Term("system", logQuery.getSystem()));
|
||||
booleanQueryBuilder.add(termQuery, BooleanClause.Occur.MUST);
|
||||
}
|
||||
if (ObjectUtil.isNotEmpty(logQuery.getRequestMethod())) {
|
||||
TermQuery termQuery = new TermQuery(new Term("requestMethod", logQuery.getRequestMethod()));
|
||||
booleanQueryBuilder.add(termQuery, BooleanClause.Occur.MUST);
|
||||
}
|
||||
if (Boolean.TRUE.equals(logQuery.getIsRequest())) {
|
||||
Term traceid = new Term("traceId");
|
||||
TermQuery termQuery = new TermQuery(traceid);
|
||||
booleanQueryBuilder.add(termQuery, BooleanClause.Occur.MUST_NOT);
|
||||
}
|
||||
if (ObjectUtil.isNotEmpty(logQuery.getMessage())){
|
||||
//查询解析器
|
||||
QueryParser queryParser = new QueryParser("message", new IKAnalyzer(true));
|
||||
Query query = queryParser.parse(logQuery.getMessage());
|
||||
booleanQueryBuilder.add(query, BooleanClause.Occur.MUST);
|
||||
}
|
||||
|
||||
TopFieldCollector collector = TopFieldCollector.create(new Sort(new SortField("time", SortField.Type.LONG,true)), 20000, 0);
|
||||
searcher.search(booleanQueryBuilder.build(), collector);
|
||||
TopDocs topDocs = collector.topDocs((logQuery.getPage()-1)*logQuery.getSize(), logQuery.getSize());
|
||||
int totalSize = collector.getTotalHits();
|
||||
ScoreDoc[] scoreDocs = topDocs.scoreDocs;
|
||||
|
||||
List<LogRepositoryDTO> list = new ArrayList<>();
|
||||
for (ScoreDoc scoreDoc : scoreDocs) {
|
||||
Document doc = open.document(scoreDoc.doc);
|
||||
LogRepositoryDTO dto = new LogRepositoryDTO();
|
||||
dto.setSystem(doc.get("system"));
|
||||
dto.setTraceId(doc.get("traceId"));
|
||||
dto.setLogger(doc.get("logger"));
|
||||
dto.setLogLevel(doc.get("logLevel"));
|
||||
dto.setMessage(doc.get("message"));
|
||||
dto.setRequestIp(doc.get("requestIp"));
|
||||
dto.setRequestMethod(doc.get("requestMethod"));
|
||||
dto.setRequestTime(doc.get("requestTime"));
|
||||
dto.setThread(doc.get("thread"));
|
||||
list.add(dto);
|
||||
}
|
||||
open.close();
|
||||
directory.close();
|
||||
page.addAll(list);
|
||||
page.setTotal(scoreDocs.length);
|
||||
res.put("total", totalSize);
|
||||
}catch (Exception ex){
|
||||
ex.printStackTrace();
|
||||
}
|
||||
res.put("page",page);
|
||||
return res;
|
||||
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
@Async
|
||||
public void syncdemo() {
|
||||
log.info("Async线程链路测试"+Thread.currentThread().getName());
|
||||
log.error("Async线程链路测试"+Thread.currentThread().getName());
|
||||
log.info("Async线程链路测试"+Thread.currentThread().getName());
|
||||
log.info("线程链路测试"+Thread.currentThread().getName());
|
||||
public List<String> getTagName() {
|
||||
return Arrays.stream(TagNameEnum.values()).map(TagNameEnum::getTag).collect(Collectors.toList());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package org.nl.wms.system_manage.service.quartz.utils;
|
||||
import cn.hutool.core.util.IdUtil;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import com.yomahub.tlog.task.quartz.TLogQuartzJobBean;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
import org.nl.common.utils.RedisUtils;
|
||||
@@ -30,17 +31,17 @@ import java.util.concurrent.ThreadPoolExecutor;
|
||||
@SuppressWarnings({"unchecked", "all"})
|
||||
@Slf4j
|
||||
@DisallowConcurrentExecution
|
||||
public class ExecutionJob extends QuartzJobBean {
|
||||
public class ExecutionJob extends TLogQuartzJobBean {
|
||||
|
||||
/**
|
||||
* 该处仅供参考
|
||||
*/
|
||||
@Resource
|
||||
@Qualifier("meshandlerPool")
|
||||
@Qualifier("threadPoolExecutor")
|
||||
private ThreadPoolExecutor EXECUTOR;
|
||||
|
||||
@Override
|
||||
protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
|
||||
public void executeTask(JobExecutionContext context) throws JobExecutionException {
|
||||
SysQuartzJob quartzJob = (SysQuartzJob) context.getMergedJobDataMap().get(SysQuartzJob.JOB_KEY);
|
||||
// 获取spring bean
|
||||
ISysQuartzJobService quartzJobService = SpringContextHolder.getBean(SysQuartzJobServiceImpl.class);
|
||||
|
||||
@@ -23,7 +23,7 @@ import static org.quartz.TriggerBuilder.newTrigger;
|
||||
public class QuartzManage {
|
||||
private static final String JOB_NAME = "TASK_";
|
||||
|
||||
@Resource(name = "quartzScheduler")
|
||||
@Resource(name = "scheduler")
|
||||
private Scheduler scheduler;
|
||||
|
||||
public void addJob(SysQuartzJob quartzJob) {
|
||||
|
||||
@@ -676,6 +676,7 @@ public class InBillServiceImpl extends ServiceImpl<IOStorInvMapper, IOStorInv> i
|
||||
SchBasePoint parentPoint = pointService.getById(rkPoint.getParent_point_code());
|
||||
// 2、创建任务(4条任务、优先级需要获取所有的任务中的最小值并且-1,默认8)
|
||||
// 获取工单对应的区域的出入点
|
||||
// todo: 不对
|
||||
SchBasePoint intoPoint = pointService.getNotTaskByRegionAndType(parentPoint.getRegion_code(), "2");
|
||||
SchBasePoint emptyPoint = pointService.getNotTaskByRegionAndType(parentPoint.getRegion_code(), "5");
|
||||
SchBasePoint fullPoint = pointService.getNotTaskByRegionAndType(parentPoint.getRegion_code(), "6");
|
||||
|
||||
@@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.nl.common.domain.query.PageQuery;
|
||||
import org.nl.wms.warehouse_manage.service.IMdPbGroupplateService;
|
||||
import org.nl.wms.warehouse_manage.service.dao.GroupPlate;
|
||||
@@ -25,6 +26,7 @@ import java.util.Set;
|
||||
* @author Liuxy
|
||||
* @since 2025-05-23
|
||||
*/
|
||||
@Slf4j
|
||||
@Service
|
||||
public class MdPbGroupplateServiceImpl extends ServiceImpl<MdPbGroupplateMapper, GroupPlate> implements IMdPbGroupplateService {
|
||||
/**
|
||||
@@ -35,6 +37,7 @@ public class MdPbGroupplateServiceImpl extends ServiceImpl<MdPbGroupplateMapper,
|
||||
|
||||
@Override
|
||||
public IPage<JSONObject> queryAll(Map whereJson, PageQuery page) {
|
||||
log.info("查询------");
|
||||
return this.baseMapper.queryAllByPage(new Page<>(page.getPage() + 1, page.getSize()),
|
||||
whereJson);
|
||||
}
|
||||
|
||||
@@ -9,10 +9,11 @@ spring:
|
||||
druid:
|
||||
db-type: com.alibaba.druid.pool.DruidDataSource
|
||||
driverClassName: com.mysql.cj.jdbc.Driver
|
||||
url: jdbc:mysql://${DB_HOST:192.168.81.251}:${DB_PORT:3306}/${DB_NAME:wms_standardv1}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true&allowPublicKeyRetrieval=true&useSSL=false
|
||||
# url: jdbc:mysql://${DB_HOST:localhost}:${DB_PORT:3306}/${DB_NAME:wms_oulun}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true&allowPublicKeyRetrieval=true&useSSL=false
|
||||
url: jdbc:mysql://${DB_HOST:192.168.81.251}:${DB_PORT:3306}/${DB_NAME:zzzw_lms}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true&allowPublicKeyRetrieval=true&useSSL=false
|
||||
# url: jdbc:mysql://${DB_HOST:127.0.0.1}:${DB_PORT:3306}/${DB_NAME:zzzw_lms}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true&allowPublicKeyRetrieval=true&useSSL=false
|
||||
username: ${DB_USER:root}
|
||||
password: ${DB_PWD:123456}
|
||||
password: ${DB_PWD:P@ssw0rd.}
|
||||
# password: ${DB_PWD:12356}
|
||||
# 初始连接数
|
||||
initial-size: 15
|
||||
# 最小连接数
|
||||
@@ -134,6 +135,3 @@ sa-token:
|
||||
token-prefix:
|
||||
is-read-cookie: false
|
||||
is-print: false
|
||||
lucene:
|
||||
index:
|
||||
path: D:\lms\lucene\index
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<configuration scan="true" scanPeriod="30 seconds" debug="false">
|
||||
<springProperty scope="context" name="logPath" source="logging.file.path" defaultValue="logs"/>
|
||||
<contextName>nlAdmin</contextName>
|
||||
<property name="log.charset" value="utf-8"/>
|
||||
<property name="log.pattern"
|
||||
@@ -22,25 +23,9 @@
|
||||
<!--日志文件输出的文件名-->
|
||||
<FileNamePattern>${LOG_HOME}/%d{yyyy-MM-dd}.%i.log</FileNamePattern>
|
||||
<!--日志文件保留天数-->
|
||||
<maxHistory>10</maxHistory>
|
||||
<maxHistory>30</maxHistory>
|
||||
<!--单个日志最大容量 至少10MB才能看得出来-->
|
||||
<maxFileSize>100MB</maxFileSize>
|
||||
<!--所有日志最多占多大容量-->
|
||||
<totalSizeCap>20GB</totalSizeCap>
|
||||
</rollingPolicy>
|
||||
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
|
||||
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
|
||||
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
|
||||
</encoder>
|
||||
</appender>
|
||||
<appender name="ErpLogFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
|
||||
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
|
||||
<!--日志文件输出的文件名-->
|
||||
<FileNamePattern>${LOG_HOME}/ErpLog/%d{yyyy-MM-dd}.%i.log</FileNamePattern>
|
||||
<!--日志文件保留天数-->
|
||||
<maxHistory>7</maxHistory>
|
||||
<!--单个日志最大容量 至少10MB才能看得出来-->
|
||||
<maxFileSize>100MB</maxFileSize>
|
||||
<maxFileSize>200MB</maxFileSize>
|
||||
<!--所有日志最多占多大容量-->
|
||||
<totalSizeCap>20GB</totalSizeCap>
|
||||
</rollingPolicy>
|
||||
@@ -49,72 +34,69 @@
|
||||
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
|
||||
</encoder>
|
||||
</appender>
|
||||
<!-- <appender name="ErpLogFile" class="ch.qos.logback.core.rolling.RollingFileAppender">-->
|
||||
<!-- <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">-->
|
||||
<!-- <!–日志文件输出的文件名–>-->
|
||||
<!-- <FileNamePattern>${LOG_HOME}/ErpLog/%d{yyyy-MM-dd}.%i.log</FileNamePattern>-->
|
||||
<!-- <!–日志文件保留天数–>-->
|
||||
<!-- <maxHistory>7</maxHistory>-->
|
||||
<!-- <!–单个日志最大容量 至少10MB才能看得出来–>-->
|
||||
<!-- <maxFileSize>100MB</maxFileSize>-->
|
||||
<!-- <!–所有日志最多占多大容量–>-->
|
||||
<!-- <totalSizeCap>20GB</totalSizeCap>-->
|
||||
<!-- </rollingPolicy>-->
|
||||
<!-- <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">-->
|
||||
<!-- <!–格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符–>-->
|
||||
<!-- <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>-->
|
||||
<!-- </encoder>-->
|
||||
<!-- </appender>-->
|
||||
<!--异步到文件-->
|
||||
<appender name="asyncFileAppender" class="com.yomahub.tlog.core.enhance.logback.async.AspectLogbackAsyncAppender">
|
||||
<discardingThreshold>2</discardingThreshold>
|
||||
<queueSize>500</queueSize>
|
||||
<appender-ref ref="FILE"/>
|
||||
</appender>
|
||||
<appender name="asyncERPFileAppender" class="ch.qos.logback.classic.AsyncAppender">
|
||||
<discardingThreshold>2</discardingThreshold>
|
||||
<queueSize>500</queueSize>
|
||||
<appender-ref ref="ErpLogFile"/>
|
||||
</appender>
|
||||
<!-- <appender name="asyncERPFileAppender" class="ch.qos.logback.classic.AsyncAppender">-->
|
||||
<!-- <discardingThreshold>2</discardingThreshold>-->
|
||||
<!-- <queueSize>500</queueSize>-->
|
||||
<!-- <appender-ref ref="ErpLogFile"/>-->
|
||||
<!-- </appender>-->
|
||||
<appender name="luceneAppender" class="org.nl.config.lucene.LuceneAppender" >
|
||||
<properties>
|
||||
<property>
|
||||
<name>system</name>
|
||||
<value>lms</value>
|
||||
</property>
|
||||
<property>
|
||||
<name>logLevel</name>
|
||||
<value>%level</value>
|
||||
</property>
|
||||
<property>
|
||||
<name>requestMethod</name>
|
||||
<value>%X{requestMethod}</value>
|
||||
</property>
|
||||
<property>
|
||||
<name>requestTime</name>
|
||||
<value>%d{yyyy-MM-dd HH:mm:ss.SSS}</value>
|
||||
</property>
|
||||
<property>
|
||||
<name>requestIp</name>
|
||||
<value>%X{requestIp}</value>
|
||||
</property>
|
||||
<property>
|
||||
<name>thread</name>
|
||||
<value>%thread</value>
|
||||
</property>
|
||||
<property>
|
||||
<name>logger</name>
|
||||
<value>%logger</value>
|
||||
</property>
|
||||
</properties>
|
||||
<!-- Filter for INFO level -->
|
||||
<filter class="ch.qos.logback.classic.filter.LevelFilter">
|
||||
<level>INFO</level>
|
||||
<onMatch>ACCEPT</onMatch>
|
||||
<onMismatch>NEXT</onMismatch>
|
||||
</filter>
|
||||
<!-- Filter for WARN level -->
|
||||
<filter class="ch.qos.logback.classic.filter.LevelFilter">
|
||||
<level>WARN</level>
|
||||
<onMatch>ACCEPT</onMatch>
|
||||
<onMismatch>NEXT</onMismatch>
|
||||
</filter>
|
||||
<!-- Filter for ERROR level -->
|
||||
<filter class="ch.qos.logback.classic.filter.LevelFilter">
|
||||
<level>ERROR</level>
|
||||
<onMatch>ACCEPT</onMatch>
|
||||
<onMismatch>DENY</onMismatch>
|
||||
</filter>
|
||||
</appender>
|
||||
<appender name="asyncLuceneAppender" class="org.nl.config.lucene.AsyncLuceneAppender">
|
||||
<appender name="asyncLuceneAppender" class="ch.qos.logback.classic.AsyncAppender">
|
||||
<appender-ref ref="luceneAppender" />
|
||||
<!-- 设置队列大小 -->
|
||||
<queueSize>512</queueSize>
|
||||
</appender>
|
||||
|
||||
<!--开发环境:打印控制台-->
|
||||
<springProfile name="dev">
|
||||
<root level="info">
|
||||
<appender-ref ref="asyncLuceneAppender"/>
|
||||
<appender-ref ref="CONSOLE"/>
|
||||
</root>
|
||||
</springProfile>s
|
||||
<springProfile name="prod">
|
||||
<root level="info">
|
||||
<appender-ref ref="asyncFileAppender"/>
|
||||
<appender-ref ref="asyncLuceneAppender"/>
|
||||
<appender-ref ref="CONSOLE"/>
|
||||
</root>
|
||||
<logger name="jdbc" level="ERROR" additivity="true">
|
||||
<appender-ref ref="asyncFileAppender"/>
|
||||
</logger>
|
||||
<logger name="org.nl.wms.system_manage.service.quartz.task" level="ERROR" additivity="true">
|
||||
<appender-ref ref="asyncERPFileAppender"/>
|
||||
</logger>
|
||||
<logger name="org.springframework" level="ERROR" additivity="true">
|
||||
<appender-ref ref="asyncFileAppender"/>
|
||||
</logger>
|
||||
@@ -138,7 +120,48 @@
|
||||
</logger>
|
||||
</springProfile>
|
||||
<!--测试环境:打印控制台-->
|
||||
|
||||
<springProfile name="prod">
|
||||
<root level="INFO">
|
||||
<appender-ref ref="asyncLuceneAppender"/>
|
||||
<appender-ref ref="CONSOLE"/>
|
||||
</root>
|
||||
<logger name="org.springframework" level="ERROR" additivity="false">
|
||||
<appender-ref ref="asyncFileAppender"/>
|
||||
</logger>
|
||||
<logger name="org.apache" level="ERROR" additivity="false">
|
||||
<appender-ref ref="asyncFileAppender"/>
|
||||
</logger>
|
||||
<logger name="org.hibernate" level="ERROR" additivity="false">
|
||||
<appender-ref ref="asyncFileAppender"/>
|
||||
</logger>
|
||||
<logger name="io.netty" level="ERROR" additivity="false">
|
||||
<appender-ref ref="asyncFileAppender"/>
|
||||
</logger>
|
||||
<logger name="jdbc" level="ERROR" additivity="false">
|
||||
<appender-ref ref="asyncFileAppender"/>
|
||||
</logger>
|
||||
<logger name="io.lettuce" level="ERROR" additivity="false">
|
||||
<appender-ref ref="asyncFileAppender"/>
|
||||
</logger>
|
||||
<logger name="com.fasterxml" level="ERROR" additivity="false">
|
||||
<appender-ref ref="asyncFileAppender"/>
|
||||
</logger>
|
||||
<logger name="org.quartz" level="ERROR" additivity="false">
|
||||
<appender-ref ref="asyncFileAppender"/>
|
||||
</logger>
|
||||
<logger name="com.google" level="ERROR" additivity="false">
|
||||
<appender-ref ref="asyncFileAppender"/>
|
||||
</logger>
|
||||
<logger name="springfox" level="ERROR" additivity="false">
|
||||
<appender-ref ref="asyncFileAppender"/>
|
||||
</logger>
|
||||
<logger name="log4jdbc" level="ERROR" additivity="false">
|
||||
<appender-ref ref="asyncFileAppender"/>
|
||||
</logger>
|
||||
<logger name="nl.basjes" level="ERROR" additivity="false">
|
||||
<appender-ref ref="asyncFileAppender"/>
|
||||
</logger>
|
||||
</springProfile>
|
||||
<!--生产环境:打印控制台和输出到文件-->
|
||||
|
||||
</configuration>
|
||||
|
||||
@@ -62,6 +62,15 @@
|
||||
:end-placeholder="$t('Log.end_time')"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="压缩查看" prop="isRequest">
|
||||
<el-switch
|
||||
v-model="compressedView"
|
||||
active-color="#409EFF"
|
||||
inactive-color="#F56C6C"
|
||||
:active-value="true"
|
||||
:inactive-valu="false"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" size="mini" @click="queryData">
|
||||
{{ $t('common.Query') }}
|
||||
@@ -73,7 +82,8 @@
|
||||
<el-card shadow="hover" style="width: 100%" class="log-warpper">
|
||||
<div style="width: 100%">
|
||||
<div v-for="(log, index) in logs" :key="index">
|
||||
<div style="margin-bottom: 5px; font-size: 14px;" v-html="log" />
|
||||
<div v-if="compressedView === false" style="margin: 5px;font-size: 16px; word-break: break-all; white-space: pre-wrap;" v-html="log" />
|
||||
<div v-else style="margin-bottom: 5px; font-size: 16px;" v-html="log" />
|
||||
</div>
|
||||
</div>
|
||||
</el-card>
|
||||
@@ -126,7 +136,8 @@ export default {
|
||||
size: 100,
|
||||
total: 0,
|
||||
createTime: ''
|
||||
}
|
||||
},
|
||||
compressedView: true
|
||||
}
|
||||
},
|
||||
created() {
|
||||
|
||||
@@ -44,6 +44,7 @@ export default {
|
||||
},
|
||||
'msg': {
|
||||
'delete_msg': 'Are you sure to delete it? If there are subordinate nodes, they will be deleted together. This operation cannot be undone!'
|
||||
}
|
||||
},
|
||||
'SystemParam': 'sys parameter'
|
||||
}
|
||||
}
|
||||
|
||||
@@ -44,6 +44,7 @@ export default {
|
||||
},
|
||||
'msg': {
|
||||
'delete_msg': 'Apakah Anda yakin untuk menghapusnya? Jika ada nod subordinat, mereka akan dihapus bersama. Operasi ini tidak dapat dibatalkan!'
|
||||
}
|
||||
},
|
||||
'SystemParam': 'parameter sistem'
|
||||
}
|
||||
}
|
||||
|
||||
@@ -44,6 +44,7 @@ export default {
|
||||
},
|
||||
'msg': {
|
||||
'delete_msg': '确定删除吗,如果存在下级节点则一并删除,此操作不能撤销!'
|
||||
}
|
||||
},
|
||||
'SystemParam': '系统参数'
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19,6 +19,15 @@
|
||||
<el-form-item :label="$t('SysParam.table.name')" prop="name">
|
||||
<el-input v-model="form.name" style="width: 370px;" />
|
||||
</el-form-item>
|
||||
<el-form-item :label="$t('SysParam.table.zh_name')" prop="name">
|
||||
<el-input v-model="form.zh_name" style="width: 370px;" />
|
||||
</el-form-item>
|
||||
<el-form-item :label="$t('SysParam.table.en_name')" prop="name">
|
||||
<el-input v-model="form.en_name" style="width: 370px;" />
|
||||
</el-form-item>
|
||||
<el-form-item :label="$t('SysParam.table.in_name')" prop="name">
|
||||
<el-input v-model="form.in_name" style="width: 370px;" />
|
||||
</el-form-item>
|
||||
<el-form-item :label="$t('SysParam.table.values')" prop="value">
|
||||
<el-input v-model="form.value" style="width: 370px;" />
|
||||
</el-form-item>
|
||||
@@ -73,6 +82,9 @@ const defaultForm = {
|
||||
id: null,
|
||||
code: null,
|
||||
name: null,
|
||||
zh_name: null,
|
||||
en_name: null,
|
||||
in_name: null,
|
||||
value: null,
|
||||
remark: null,
|
||||
is_active: true
|
||||
|
||||
@@ -2,7 +2,10 @@ export default {
|
||||
'SysParam': {
|
||||
'table': {
|
||||
'code': 'code',
|
||||
'name': 'name',
|
||||
'name': 'default name',
|
||||
'zh_name': 'chinese name',
|
||||
'en_name': 'english name',
|
||||
'in_name': 'indonesian name',
|
||||
'values': 'value',
|
||||
'description': 'remark'
|
||||
},
|
||||
|
||||
@@ -2,7 +2,10 @@ export default {
|
||||
'SysParam': {
|
||||
'table': {
|
||||
'code': 'kode',
|
||||
'name': 'nama',
|
||||
'name': 'nama bawaan',
|
||||
'zh_name': 'nama cina',
|
||||
'en_name': 'nama Inggris',
|
||||
'in_name': 'nama indonesia',
|
||||
'values': 'nilai',
|
||||
'description': 'Catatan'
|
||||
},
|
||||
|
||||
@@ -2,7 +2,10 @@ export default {
|
||||
'SysParam': {
|
||||
'table': {
|
||||
'code': '编码',
|
||||
'name': '名称',
|
||||
'name': '默认名称',
|
||||
'zh_name': '中文名称',
|
||||
'en_name': '英文名称',
|
||||
'in_name': '印尼名称',
|
||||
'values': '值',
|
||||
'description': '备注'
|
||||
},
|
||||
|
||||
@@ -140,12 +140,14 @@
|
||||
<el-select
|
||||
v-model="form.supp_code"
|
||||
placeholder="请选择"
|
||||
style="width: 200px;">
|
||||
style="width: 200px;"
|
||||
>
|
||||
<el-option
|
||||
v-for="item in supplist"
|
||||
:key="item.supp_code"
|
||||
:label="item.supp_name"
|
||||
:value="item.supp_code">
|
||||
:value="item.supp_code"
|
||||
>
|
||||
<span style="float: left">{{ item.supp_name }}</span>
|
||||
<span style="float: right; color: #8492a6; font-size: 13px">{{ item.supp_code }}</span>
|
||||
</el-option>
|
||||
@@ -175,11 +177,6 @@
|
||||
<el-table-column prop="status" label="状态" :formatter="formattStatus" :min-width="flexWidth('status',crud.data,'状态')" />
|
||||
<el-table-column prop="qty" label="可用数" :formatter="crud.formatNum3" :min-width="100" />
|
||||
<el-table-column prop="frozen_qty" label="冻结数" :formatter="crud.formatNum3" :min-width="100" />
|
||||
<el-table-column label="总数" :formatter="crud.formatNum3" :min-width="100">
|
||||
<template slot-scope="scope">
|
||||
{{ parseFloat(scope.row.qty + scope.row.frozen_qty).toFixed(3) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="remark" label="备注" :min-width="flexWidth('remark',crud.data,'备注')" />
|
||||
<el-table-column prop="create_name" label="组盘人" :min-width="flexWidth('create_name',crud.data,'组盘人')" />
|
||||
<el-table-column prop="create_time" label="组盘时间" :min-width="flexWidth('create_time',crud.data,'组盘时间')" />
|
||||
|
||||
111
lms/nladmin-ui/src/views/wms/record/index.vue
Normal file
111
lms/nladmin-ui/src/views/wms/record/index.vue
Normal file
@@ -0,0 +1,111 @@
|
||||
<template>
|
||||
<div class="app-container">
|
||||
<!--工具栏-->
|
||||
<div class="head-container">
|
||||
<!--如果想在工具栏加入更多按钮,可以使用插槽方式, slot = 'left' or 'right'-->
|
||||
<crudOperation :permission="permission" />
|
||||
<!--表单组件-->
|
||||
<el-dialog :close-on-click-modal="false" :before-close="crud.cancelCU" :visible.sync="crud.status.cu > 0" :title="crud.status.title" width="500px">
|
||||
<el-form ref="form" :model="form" :rules="rules" size="mini" label-width="80px">
|
||||
<el-form-item label="进入成员">
|
||||
<el-input v-model="form.into_member" style="width: 370px;" />
|
||||
</el-form-item>
|
||||
<el-form-item label="进入时间">
|
||||
<el-input v-model="form.in_time" style="width: 370px;" />
|
||||
</el-form-item>
|
||||
<el-form-item label="状态">
|
||||
<el-input v-model="form.record_status" style="width: 370px;" />
|
||||
</el-form-item>
|
||||
<el-form-item label="出去时间">
|
||||
<el-input v-model="form.out_time" style="width: 370px;" />
|
||||
</el-form-item>
|
||||
<el-form-item label="管控区域">
|
||||
<el-input v-model="form.region_code" style="width: 370px;" />
|
||||
</el-form-item>
|
||||
<el-form-item label="操作人员">
|
||||
<el-input v-model="form.operate_name" style="width: 370px;" />
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<div slot="footer" class="dialog-footer">
|
||||
<el-button type="text" @click="crud.cancelCU">取消</el-button>
|
||||
<el-button :loading="crud.cu === 2" type="primary" @click="crud.submitCU">确认</el-button>
|
||||
</div>
|
||||
</el-dialog>
|
||||
<!--表格渲染-->
|
||||
<el-table ref="table" v-loading="crud.loading" :data="crud.data" size="mini" style="width: 100%;" @selection-change="crud.selectionChangeHandler">
|
||||
<el-table-column type="selection" width="55" />
|
||||
<el-table-column prop="into_member" label="进入成员" :min-width="flexWidth('into_member',crud.data,'进入成员')" />
|
||||
<el-table-column prop="in_time" label="进入时间" :min-width="flexWidth('in_time',crud.data,'进入时间')" />
|
||||
<el-table-column prop="record_status" label="状态" :min-width="flexWidth('record_status',crud.data,'状态:1进去,2出去')">
|
||||
<template slot-scope="scope">
|
||||
{{ dict.label.REGION_RECORD_STATUS[scope.row.record_status] }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="out_time" label="出去时间" :min-width="flexWidth('out_time',crud.data,'出去时间')" />
|
||||
<el-table-column prop="region_code" label="管控区域" :min-width="flexWidth('region_code',crud.data,'管控区域')" />
|
||||
<el-table-column prop="operate_name" label="操作人员" :min-width="flexWidth('operate_name',crud.data,'操作人员')" />
|
||||
<el-table-column v-permission="[]" label="操作" width="120px" align="center" fixed="right">
|
||||
<template slot-scope="scope">
|
||||
<udOperation
|
||||
:data="scope.row"
|
||||
:permission="permission"
|
||||
/>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<!--分页组件-->
|
||||
<pagination />
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import crudMdPbRegionMember from './mdPbRegionMember'
|
||||
import CRUD, { crud, form, header, presenter } from '@crud/crud'
|
||||
import rrOperation from '@crud/RR.operation'
|
||||
import crudOperation from '@crud/CRUD.operation'
|
||||
import udOperation from '@crud/UD.operation'
|
||||
import pagination from '@crud/Pagination'
|
||||
|
||||
const defaultForm = {
|
||||
record_id: null,
|
||||
into_member: null,
|
||||
in_time: null,
|
||||
record_status: null,
|
||||
out_time: null,
|
||||
region_code: null,
|
||||
operate_name: null
|
||||
}
|
||||
export default {
|
||||
name: 'MdPbRegionMember',
|
||||
components: { pagination, crudOperation, rrOperation, udOperation },
|
||||
mixins: [presenter(), header(), form(defaultForm), crud()],
|
||||
dicts: ['REGION_RECORD_STATUS'],
|
||||
cruds() {
|
||||
return CRUD({
|
||||
title: '管控区域记录',
|
||||
url: 'api/mdPbRegionMember',
|
||||
idField: 'record_id',
|
||||
sort: 'record_id,desc',
|
||||
crudMethod: { ...crudMdPbRegionMember }
|
||||
})
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
permission: {
|
||||
},
|
||||
rules: {
|
||||
}}
|
||||
},
|
||||
methods: {
|
||||
// 钩子:在获取表格数据之前执行,false 则代表不获取数据
|
||||
[CRUD.HOOK.beforeRefresh]() {
|
||||
return true
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
|
||||
</style>
|
||||
27
lms/nladmin-ui/src/views/wms/record/mdPbRegionMember.js
Normal file
27
lms/nladmin-ui/src/views/wms/record/mdPbRegionMember.js
Normal file
@@ -0,0 +1,27 @@
|
||||
import request from '@/utils/request'
|
||||
|
||||
export function add(data) {
|
||||
return request({
|
||||
url: 'api/mdPbRegionMember',
|
||||
method: 'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
export function del(ids) {
|
||||
return request({
|
||||
url: 'api/mdPbRegionMember/',
|
||||
method: 'delete',
|
||||
data: ids
|
||||
})
|
||||
}
|
||||
|
||||
export function edit(data) {
|
||||
return request({
|
||||
url: 'api/mdPbRegionMember',
|
||||
method: 'put',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
export default { add, edit, del }
|
||||
Reference in New Issue
Block a user