fix: 日志、定时任务

This commit is contained in:
2025-07-31 16:03:02 +08:00
parent 9adfce31ea
commit 689237654c
14 changed files with 119 additions and 99 deletions

View File

@@ -42,6 +42,10 @@ public class LogMessageConstant {
* tlogTraceId
*/
public final static String FIELD_TRACEID = "tlogTraceId";
/**
* api地址
*/
public final static String API = "requestMethod";
// 定义颜色值
/**
* 文本颜色:黑色

View File

@@ -11,7 +11,6 @@ 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;
@@ -38,7 +37,6 @@ public class LuceneAppender extends AppenderBase<ILoggingEvent> {
public static IndexWriter indexWriter;
@Override
public void start() {
super.start();
@@ -48,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();
@@ -81,11 +79,22 @@ public class LuceneAppender extends AppenderBase<ILoggingEvent> {
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) && ObjectUtil.isNotEmpty(mdcPropertyMap.get(LogMessageConstant.FIELD_TRACEID))) {
if (ObjectUtil.isNotEmpty(mdcPropertyMap)) {
String traceId = mdcPropertyMap.get(LogMessageConstant.FIELD_TRACEID);
doc.add(new StringField(LogMessageConstant.FIELD_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));
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, message, Field.Store.YES));
try {

View File

@@ -109,6 +109,8 @@ public class Searcher {
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) +

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

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

@@ -43,7 +43,8 @@ public class BigScreenController {
@Log("大屏数据")
@SaIgnore
public ResponseEntity<Object> getData(@RequestBody JSONObject stors) {
String storStr = stors.getString("stors");
// String storStr = stors.getString("stors");
String storStr = "LT,YL";
List<JSONObject> data = new ArrayList<>();
if (!StringUtils.isEmpty(storStr)){
data = bigScreenService.getData(Arrays.asList(storStr.split(",")));

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

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

@@ -11,10 +11,15 @@ import lombok.Getter;
@Getter
@AllArgsConstructor
public enum TagNameEnum {
/**
* 请勿作为mdc的value只能作为key
*/
TAG_NAME("tag_name"),
/**
* LMS系统
*/
LMS("LMS系统"),
AUTO_TASK_SEND("自动下发任务到ACS"),
/**
* 标记符号
*/

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

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

@@ -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,17 +34,33 @@
<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" >
<!-- Filter for INFO level -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
@@ -87,17 +88,14 @@
</appender>
<!--开发环境:打印控制台-->
<springProfile name="prod">
<springProfile name="dev">
<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>
@@ -121,7 +119,7 @@
</logger>
</springProfile>
<!--测试环境:打印控制台-->
<springProfile name="dev">
<springProfile name="prod">
<root level="INFO">
<appender-ref ref="asyncLuceneAppender"/>
<appender-ref ref="CONSOLE"/>