This commit is contained in:
zhengxuming
2025-08-04 09:26:11 +08:00
47 changed files with 1286 additions and 362 deletions

View File

@@ -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>

View File

@@ -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";
}

View File

@@ -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();
}
}

View File

@@ -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表示andMUST_NOT表示notSHOULD表示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);
}
}

View File

@@ -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()
);
}

View File

@@ -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;
/**

View File

@@ -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());

View File

@@ -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("生成");
}

View File

@@ -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;
}
}

View File

@@ -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);
}
}

View File

@@ -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;
}

View File

@@ -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);
}

View File

@@ -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库点

View File

@@ -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);
}

View File

@@ -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>

View File

@@ -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();

View File

@@ -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);
}
}

View File

@@ -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);
}

View File

@@ -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;
}

View File

@@ -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> {
}

View File

@@ -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>

View File

@@ -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;
}

View File

@@ -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> {
}

View File

@@ -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);
}
}

View File

@@ -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;
}

View File

@@ -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);
}
}

View File

@@ -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

View File

@@ -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;
}

View File

@@ -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();
}

View File

@@ -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表示andMUST_NOT表示notSHOULD表示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());
}
}

View File

@@ -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);

View File

@@ -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) {

View File

@@ -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");

View File

@@ -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);
}

View File

@@ -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

View File

@@ -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">-->
<!-- &lt;!&ndash;日志文件输出的文件名&ndash;&gt;-->
<!-- <FileNamePattern>${LOG_HOME}/ErpLog/%d{yyyy-MM-dd}.%i.log</FileNamePattern>-->
<!-- &lt;!&ndash;日志文件保留天数&ndash;&gt;-->
<!-- <maxHistory>7</maxHistory>-->
<!-- &lt;!&ndash;单个日志最大容量 至少10MB才能看得出来&ndash;&gt;-->
<!-- <maxFileSize>100MB</maxFileSize>-->
<!-- &lt;!&ndash;所有日志最多占多大容量&ndash;&gt;-->
<!-- <totalSizeCap>20GB</totalSizeCap>-->
<!-- </rollingPolicy>-->
<!-- <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">-->
<!-- &lt;!&ndash;格式化输出:%d表示日期%thread表示线程名%-5level级别从左显示5个字符宽度%msg日志消息%n是换行符&ndash;&gt;-->
<!-- <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>

View File

@@ -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() {

View File

@@ -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'
}
}

View File

@@ -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'
}
}

View File

@@ -44,6 +44,7 @@ export default {
},
'msg': {
'delete_msg': '确定删除吗,如果存在下级节点则一并删除,此操作不能撤销!'
}
},
'SystemParam': '系统参数'
}
}

View File

@@ -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

View File

@@ -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'
},

View File

@@ -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'
},

View File

@@ -2,7 +2,10 @@ export default {
'SysParam': {
'table': {
'code': '编码',
'name': '名称',
'name': '默认名称',
'zh_name': '中文名称',
'en_name': '英文名称',
'in_name': '印尼名称',
'values': '值',
'description': '备注'
},

View File

@@ -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,'组盘时间')" />

View 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>

View 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 }