refactor: 使用mybatis-plus重构基础分类

This commit is contained in:
2024-10-15 10:48:50 +08:00
parent bd64696c00
commit 60422a9884
18 changed files with 758 additions and 79 deletions

View File

@@ -0,0 +1,36 @@
//package org.nl.config.language;
//
//import org.apache.commons.lang3.StringUtils;
//import org.nl.config.MapOf;
//import org.springframework.web.servlet.LocaleResolver;
//
//import javax.servlet.http.HttpServletRequest;
//import javax.servlet.http.HttpServletResponse;
//import java.util.Locale;
//import java.util.Map;
//
///**
// * s
// * @author ZZQ
// * @Date 2023/11/13 09:36
// */
//public class InitLocaleResolver implements LocaleResolver {
// public static Map<String,String> Language_Country = MapOf.of("in","in-ID","en","en-US","zh","zh-CN");
// @Override
// public Locale resolveLocale(HttpServletRequest request) {
// String header = request.getHeader("Accept-Language");
// if (StringUtils.isNotEmpty(header)){
// String lang = Language_Country.get(header);
// if (StringUtils.isNotEmpty(lang)){
// String[] l = lang.split("-");
// //印尼的ISO标准国家代码为id-ID
// return new Locale(l[0], l[1]);
// }
// }
// return Locale.getDefault();
// }
//
// @Override
// public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) {
// }
//}

View File

@@ -0,0 +1,23 @@
package org.nl.config.language;
import org.apache.commons.lang3.StringUtils;
import org.nl.modules.wql.util.SpringContextHolder;
import org.springframework.context.MessageSource;
import org.springframework.context.i18n.LocaleContextHolder;
/**
* s
* @author ZZQ
* @Date 2023/11/13 09:45
*/
public class LangProcess {
public static String msg(String code,String...args){
MessageSource bean = SpringContextHolder.getBean(MessageSource.class);
if (StringUtils.isEmpty(code)){
return "配置信息不存在";
}
String message = bean.getMessage(code, args, LocaleContextHolder.getLocale());
return message;
}
}

View File

@@ -25,7 +25,7 @@ import java.util.Map;
@RestController
@RequiredArgsConstructor
@RequestMapping("/api/Classstandard")
@RequestMapping("/api/Classstandard2")
@Slf4j
public class ClassstandardController {

View File

@@ -0,0 +1,86 @@
package org.nl.wms.basedata.master.standard.controller;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.nl.common.TableDataInfo;
import org.nl.common.domain.query.PageQuery;
import org.nl.modules.logging.annotation.Log;
import org.nl.wms.basedata.master.standard.service.IClassStandardService;
import org.nl.wms.basedata.master.standard.service.dao.ClassStandard;
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.ArrayList;
import java.util.List;
import java.util.Map;
/**
* 基础分类
* @Author: lyd
* @Date: 2024/10/15
*/
@RestController
@RequiredArgsConstructor
@RequestMapping("/api/Classstandard")
@Slf4j
public class ClassStandardController {
@Autowired
private IClassStandardService classStandardService;
@GetMapping
@Log("查询基础分类")
public ResponseEntity<Object> query(@RequestParam Map whereJson, PageQuery page){
return new ResponseEntity<>(TableDataInfo.build(classStandardService.queryAll(whereJson,page)),HttpStatus.OK);
}
@PostMapping
@Log("新增基础分类")
public ResponseEntity<Object> create(@Validated @RequestBody ClassStandard entity){
classStandardService.create(entity);
return new ResponseEntity<>(HttpStatus.CREATED);
}
@PutMapping
@Log("修改基础分类")
public ResponseEntity<Object> update(@Validated @RequestBody ClassStandard entity){
classStandardService.update(entity);
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
@Log("删除基础分类")
@DeleteMapping
public ResponseEntity<Object> delete(@RequestBody List<String> ids) {
classStandardService.deleteAll(ids);
return new ResponseEntity<>(HttpStatus.OK);
}
@GetMapping("/getClass")
@Log("获取Code获取树下拉框")
//@PreAuthorize("@el.check('materialtype:list')")
public ResponseEntity<Object> queryClassByCode(@RequestParam Map whereJson) {
return new ResponseEntity<>(classStandardService.queryClassByCode(whereJson), HttpStatus.OK);
}
@GetMapping("/getClassName")
@Log("获取分类名称下拉框")
public ResponseEntity<Object> getClassName() {
return new ResponseEntity<>(classStandardService.getClassName(), HttpStatus.OK);
}
@GetMapping("/loadClass")
@Log("查询基础类型")
public ResponseEntity<Object> query(@RequestParam Map whereJson) {
return new ResponseEntity<>(classStandardService.loadClass(whereJson), HttpStatus.OK);
}
@PostMapping("/superior")
public ResponseEntity<Object> getSuperior(@RequestBody String id) {
ClassStandard classstandard = classStandardService.getById(id);
ArrayList<ClassStandard> list = classStandardService.getSuperior(classstandard, new ArrayList<>());
return new ResponseEntity<>(classStandardService.buildTree(list), HttpStatus.OK);
}
}

View File

@@ -0,0 +1,4 @@
/**
* 基础分类相关
*/
package org.nl.wms.basedata.master.standard;

View File

@@ -0,0 +1,84 @@
package org.nl.wms.basedata.master.standard.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import org.nl.common.domain.query.PageQuery;
import org.nl.wms.basedata.master.standard.service.dao.ClassStandard;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* @Author: lyd
* @Date: 2024/10/15
*/
public interface IClassStandardService extends IService<ClassStandard> {
/**
* 查询数据分页
* @param whereJson 条件
* @param pageable 分页参数
* @return IPage<MdBaseClassstandard>
*/
IPage<ClassStandard> queryAll(Map whereJson, PageQuery pageable);
/**
* 创建
* @param entity /
*/
void create(ClassStandard entity);
/**
* 编辑
* @param entity /
*/
void update(ClassStandard entity);
/**
* 多选删除
* @param ids /
*/
void deleteAll(List<String> ids);
/**
* 获取下拉框
* @return
*/
List<ClassStandard> getClassName();
/**
* loadClass
* @param whereJson
* @return
*/
List<ClassStandard> loadClass(Map whereJson);
/**
* 获取父级树
* @param classstandard
* @param objects
* @return
*/
ArrayList<ClassStandard> getSuperior(ClassStandard classstandard, ArrayList<ClassStandard> objects);
/**
* 构建树形
* @param list
* @return
*/
List<ClassStandard> buildTree(ArrayList<ClassStandard> list);
/**
* 根据编码获取对应的父级数据
* @param whereJson
* @return
*/
List<ClassStandard> queryClassByCode(Map whereJson);
/**
* 获取所有的子节点id
* @param classId 父节点id
* @return 子节点id数组
*/
ArrayList<String> getAllChildrenIds(String classId);
}

View File

@@ -0,0 +1,73 @@
package org.nl.wms.basedata.master.standard.service.dao;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.math.BigDecimal;
/**
* @Author: lyd
* @Date: 2024/10/15
*/
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("md_pb_classstandard")
public class ClassStandard {
/**
* 防止精度丢失
*/
@TableId(value = "class_id", type = IdType.NONE)
private String class_id;
private String class_code;
private String long_class_code;
private String class_name;
private String class_desc;
private String parent_class_id;
private Boolean is_leaf;
private Integer sub_count;
private Boolean is_modify;
private Boolean is_delete;
private String class_level;
private String ext_id;
private String ext_parent_id;
private String create_id;
private String create_name;
private String create_time;
private String update_id;
private String update_name;
private String update_time;
@TableField(exist = false)
private Boolean hasChildren;
@TableField(exist = false)
private String id;
@TableField(exist = false)
private String label;
@TableField(exist = false)
private Boolean leaf;
}

View File

@@ -0,0 +1,14 @@
package org.nl.wms.basedata.master.standard.service.dao.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.nl.wms.basedata.master.standard.service.dao.ClassStandard;
import java.util.ArrayList;
/**
* @Author: lyd
* @Date: 2024/10/15
*/
public interface ClassStandardMapper extends BaseMapper<ClassStandard> {
ArrayList<String> getAllChildrenIds(String classId);
}

View File

@@ -0,0 +1,19 @@
<?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.basedata.master.standard.service.dao.mapper.ClassStandardMapper">
<select id="getAllChildrenIds" resultType="java.lang.String">
SELECT DISTINCT
class_id
FROM (
SELECT
t1.class_id,
IF(find_in_set(parent_class_id, @pids) > 0, @pids := concat(@pids, ',', class_id), 0) AS ischild
FROM (
SELECT class_id, parent_class_id FROM md_base_classstandard t WHERE t.is_delete = '0' ORDER BY class_code
) t1,
(SELECT @pids := #{classId}) t2
) t3
WHERE ischild != 0
</select>
</mapper>

View File

@@ -0,0 +1,73 @@
package org.nl.wms.basedata.master.standard.service.dto;
import lombok.Data;
import java.io.Serializable;
/**
* @description /
* @author lyd
* @date 2023-05-11
**/
@Data
public class ClassStandardDto implements Serializable {
/** 分类标识 */
private String class_id;
/** 分类编码 */
private String class_code;
/** 分类名称 */
private String class_name;
/** 分类简要描述 */
private String class_desc;
/** 上级分类标识 */
private String parent_class_id;
/** 子级数目 */
private String sub_count;
/** 是否叶子 */
private Boolean is_leaf;
/** 是否可修改 */
private Boolean is_modify;
/** 是否删除 */
private Boolean is_delete;
/** 级别 */
private String class_level;
/** 外部标识 */
private String ext_id;
/** 外部上级标识 */
private String ext_parent_id;
/** 车间编码 */
private String workshop_code;
/** 备注 */
private String remark;
/** 创建人 */
private String create_id;
/** 创建人 */
private String create_name;
/** 创建时间 */
private String create_time;
/** 修改人 */
private String update_id;
/** 修改人 */
private String update_name;
/** 修改时间 */
private String update_time;
}

View File

@@ -0,0 +1,12 @@
package org.nl.wms.basedata.master.standard.service.dto;
import org.nl.common.domain.query.BaseQuery;
import org.nl.wms.basedata.master.standard.service.dao.ClassStandard;
/**
* @author lyd
* @date 2023-05-11
**/
public class ClassStandardQuery extends BaseQuery<ClassStandard> {
}

View File

@@ -0,0 +1,26 @@
package org.nl.wms.basedata.master.standard.service.dto;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.nl.wms.basedata.master.standard.service.dao.ClassStandard;
import java.io.Serializable;
import java.util.List;
/**
* @Author: lyd
* @Description: vue-tree-select所需要的实体
* @Date: 2023/5/12
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class ClassStandardTrees extends ClassStandard implements Serializable {
@TableField(exist = false)
private List<ClassStandard> children;
}

View File

@@ -0,0 +1,274 @@
package org.nl.wms.basedata.master.standard.service.impl;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.ObjectUtil;
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 org.nl.b_lms.storage_manage.ios.enums.IOSEnum;
import org.nl.common.domain.query.PageQuery;
import org.nl.common.utils.SecurityUtils;
import org.nl.config.language.LangProcess;
import org.nl.modules.common.exception.BadRequestException;
import org.nl.wms.basedata.master.standard.service.IClassStandardService;
import org.nl.wms.basedata.master.standard.service.dao.ClassStandard;
import org.nl.wms.basedata.master.standard.service.dao.mapper.ClassStandardMapper;
import org.nl.wms.basedata.master.standard.service.dto.ClassStandardTrees;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @Author: lyd
* @Date: 2024/10/15
*/
@Service
public class ClassStandardServiceImpl extends ServiceImpl<ClassStandardMapper, ClassStandard> implements IClassStandardService {
@Autowired
private ClassStandardMapper classStandardMapper;
@Override
public IPage<ClassStandard> queryAll(Map whereJson, PageQuery page) {
String class_code = ObjectUtil.isNotEmpty(whereJson.get("class_code"))
? whereJson.get("class_code").toString()
: null;
LambdaQueryWrapper<ClassStandard> lam = new LambdaQueryWrapper<>();
lam.eq(ObjectUtil.isNotEmpty(class_code), ClassStandard::getClass_code, class_code)
.eq(ClassStandard::getIs_delete, false)
.eq(ClassStandard::getParent_class_id, "0")
.or(la -> la.isNull(ClassStandard::getParent_class_id));
IPage<ClassStandard> pages = new Page<>(page.getPage() + 1, page.getSize());
classStandardMapper.selectPage(pages, lam);
pages.getRecords().forEach(classstandard -> {
classstandard.setIs_leaf((classstandard.getSub_count() <= 0));
classstandard.setHasChildren(classstandard.getSub_count() > 0);
});
return pages;
}
@Override
@Transactional(rollbackFor = Exception.class)
public void create(ClassStandard entity) {
// 判断是否存在
ClassStandard classStandard = classStandardMapper
.selectOne(new LambdaQueryWrapper<ClassStandard>()
.eq(ClassStandard::getClass_code, entity.getClass_code())
.eq(ClassStandard::getIs_delete, false));
if (ObjectUtil.isNotEmpty(classStandard) && !classStandard.getClass_id().equals(entity.getClass_id())) {
throw new BadRequestException(LangProcess.msg("error_ParamExist", entity.getClass_id()));
}
String currentUserId = SecurityUtils.getCurrentUserId();
String nickName = SecurityUtils.getCurrentNickName();
String now = DateUtil.now();
entity.setClass_id(IdUtil.getSnowflake(1, 1).nextIdStr());
entity.setCreate_id(currentUserId);
entity.setCreate_name(nickName);
entity.setCreate_time(now);
entity.setUpdate_id(currentUserId);
entity.setUpdate_name(nickName);
entity.setUpdate_time(now);
entity.setIs_leaf(true);
entity.setClass_level(Math.ceil(entity.getClass_code().length() / 2.0) + "");
entity.setSub_count(0);
classStandardMapper.insert(entity);
// 更新节点
if (ObjectUtil.isNotEmpty(entity.getParent_class_id()) && !entity.getParent_class_id().equals(IOSEnum.IS_NOTANDYES.code(""))) {
updateSubCnt(entity.getParent_class_id());
}
}
private void updateSubCnt(String parentClassId) {
ClassStandard classObject = classStandardMapper.selectById(parentClassId);
if (ObjectUtil.isEmpty(classObject)) {
return;
}
List<ClassStandard> classList = classStandardMapper
.selectList(new LambdaQueryWrapper<ClassStandard>().eq(ClassStandard::getParent_class_id, parentClassId));
int size = classList.size();
classObject.setSub_count(size);
classObject.setIs_leaf(size > 0);
classStandardMapper.updateById(classObject);
}
@Override
public void update(ClassStandard entity) {
String errorSystemAuthError = "error_SystemAuthError";
ClassStandard dto = classStandardMapper.selectById(entity.getClass_id());
if (dto == null) {
throw new BadRequestException(LangProcess.msg(errorSystemAuthError));
}
// 判断是否存在
ClassStandard classStandard = classStandardMapper
.selectOne(new LambdaQueryWrapper<ClassStandard>()
.eq(ClassStandard::getClass_code, entity.getClass_code())
.eq(ClassStandard::getIs_delete, false));
if (ObjectUtil.isNotEmpty(classStandard) && !classStandard.getClass_id().equals(entity.getClass_id())) {
throw new BadRequestException(LangProcess.msg("error_ParamExist", entity.getClass_id()));
}
// 查询原来的父id
String oldPid = dto.getParent_class_id();
String newPid = entity.getParent_class_id();
if (entity.getParent_class_id() != null && entity.getClass_id().equals(entity.getParent_class_id())) {
throw new BadRequestException(LangProcess.msg("login_childError"));
}
String currentUserId = SecurityUtils.getCurrentUserId();
String nickName = SecurityUtils.getCurrentNickName();
String now = DateUtil.now();
entity.setUpdate_id(currentUserId);
entity.setUpdate_name(nickName);
entity.setUpdate_time(now);
// 更新
classStandardMapper.updateById(entity);
//更新父节点中子节点数目
updateSubCnt(oldPid);
updateSubCnt(newPid);
}
@Override
public void deleteAll(List<String> ids) {
// 递归删除子类
for (String id : ids) {
// 获取元素体
ClassStandard classstandard = classStandardMapper.selectById(id);
classStandardMapper.deleteById(classstandard.getClass_id());
// 找出所有当前节点的子节点
List<ClassStandard> baseClassstandardList = classStandardMapper.selectList(
new LambdaQueryWrapper<ClassStandard>()
.eq(ClassStandard::getParent_class_id, classstandard.getClass_id()));
if (baseClassstandardList.size() > 0) {
List<String> collect = baseClassstandardList.stream()
.map(md -> md.getClass_id())
.collect(Collectors.toList());
deleteAll(collect);
}
updateSubCnt(classstandard.getParent_class_id());
}
}
@Override
public List<ClassStandard> getClassName() {
return classStandardMapper.selectList(new LambdaQueryWrapper<ClassStandard>()
.isNull(ClassStandard::getParent_class_id)
.or()
.eq(ClassStandard::getParent_class_id, "0")
.eq(ClassStandard::getIs_delete, false));
}
@Override
public List<ClassStandard> loadClass(Map whereJson) {
String pid = ObjectUtil.isNotEmpty(whereJson.get("pid")) ? whereJson.get("pid").toString() : null;
LambdaQueryWrapper<ClassStandard> lam = new LambdaQueryWrapper<>();
lam.eq(ObjectUtil.isNotEmpty(pid), ClassStandard::getParent_class_id, pid)
.or(ObjectUtil.isEmpty(pid), la -> la.isNull(ClassStandard::getParent_class_id)
.or()
.eq(ClassStandard::getParent_class_id, "0"))
.eq(ClassStandard::getIs_delete, false);
List<ClassStandard> classstandardList = classStandardMapper.selectList(lam);
classstandardList.forEach(classstandard -> {
classstandard.setHasChildren(classstandard.getSub_count() > 0);
classstandard.setLeaf((classstandard.getSub_count() <= 0));
classstandard.setId(classstandard.getClass_id());
classstandard.setLabel(classstandard.getClass_name());
});
return classstandardList;
}
/**
* 递归获取树形数据,从子级到父级以及最高级
*
* @param classstandard
* @param res
* @return
*/
@Override
public ArrayList<ClassStandard> getSuperior(ClassStandard classstandard, ArrayList<ClassStandard> res) {
if (ObjectUtil.isEmpty(classstandard.getParent_class_id()) || classstandard.getParent_class_id().equals(IOSEnum.IS_NOTANDYES.code(""))) {
// 父类id为空或者是0就是顶级类别
List<ClassStandard> classstandardList = classStandardMapper
.selectList(new LambdaQueryWrapper<ClassStandard>()
.eq(ClassStandard::getIs_delete, false)
.eq(ClassStandard::getParent_class_id, "0")
.or(la -> la.isNull(ClassStandard::getParent_class_id)));
res.addAll(classstandardList);
return res;
}
// 递归寻找同级
List<ClassStandard> classStandards = classStandardMapper.selectList(
new LambdaQueryWrapper<ClassStandard>()
.eq(ClassStandard::getIs_delete, false)
.eq(ClassStandard::getParent_class_id, classstandard.getParent_class_id()));
res.addAll(classStandards);
return getSuperior(classStandardMapper.selectById(classstandard.getParent_class_id()), res);
}
@Override
public List<ClassStandard> buildTree(ArrayList<ClassStandard> list) {
// 初始化数据
list.forEach(classstandard -> {
classstandard.setId(classstandard.getClass_id());
classstandard.setLabel(classstandard.getClass_name());
classstandard.setLeaf((classstandard.getSub_count() <= 0));
classstandard.setHasChildren(classstandard.getSub_count() > 0);
});
// 创建树结构
return list.stream()
.filter(node -> "0".equals(node.getParent_class_id()) || ObjectUtil.isEmpty(node.getParent_class_id()))
.map(node -> createTree(node, list))
.collect(Collectors.toList());
}
private ClassStandard createTree(ClassStandard node, List<ClassStandard> list) {
List<ClassStandard> children = list.stream()
.filter(child -> node.getClass_id().equals(child.getParent_class_id()))
.map(child -> createTree(child, list))
.collect(Collectors.toList());
if (!children.isEmpty()) {
ClassStandardTrees tObj = new ClassStandardTrees();
// 赋值一份实体可以避免vue-tree拿到children属性显示展开图标
BeanUtils.copyProperties(node, tObj);
tObj.setChildren(children);
return tObj;
} else {
node.setLeaf(true);
}
return node;
}
@Override
public List<ClassStandard> queryClassByCode(Map whereJson) {
String parentClassCode = ObjectUtil.isNotEmpty(whereJson.get("parent_class_code"))
? (String) whereJson.get("parent_class_code") : null;
if (null == parentClassCode) {
throw new BadRequestException("父节点编号不能为空!");
}
List<ClassStandard> classstandards = classStandardMapper.selectList(
new LambdaQueryWrapper<ClassStandard>().eq(ClassStandard::getClass_code, parentClassCode));
if (classstandards.size() == 0) {
throw new BadRequestException("请输入正确的父节点编号!");
}
// 处理数据
classstandards.forEach(classstandard -> {
classstandard.setHasChildren(classstandard.getSub_count() > 0);
classstandard.setLeaf((classstandard.getSub_count() == 0));
classstandard.setId(classstandard.getClass_id());
classstandard.setLabel(classstandard.getClass_name());
});
return classstandards;
}
@Override
public ArrayList<String> getAllChildrenIds(String classId) {
return classStandardMapper.getAllChildrenIds(classId);
}
}

View File

@@ -35,11 +35,6 @@ public class AcsToWmsController {
return new ResponseEntity<>(acsToWmsService.receiveTaskStatusAcs(string), HttpStatus.OK);
}
@PostMapping("/orderFinish")
@Log(value = "ACS给WMS下发工单完成状态", isInterfaceLog = true, interfaceLogType = InterfaceLogType.ACS_TO_LMS)

View File

@@ -992,6 +992,7 @@ public class MesToLmsServiceImpl implements MesToLmsService {
} else if (container_name.startsWith("B")) {
//调用方法创建一个新的气胀轴编号,赋值
String resourceName = cut_jo.getString("ext_code");
// 二期的虚拟气胀轴编码需要唯一
String qzzNO = resourceName.substring(0, 2)
+ resourceName.substring(resourceName.length() - 2)
+ plan_jo.getString("split_group")

View File

@@ -12,7 +12,7 @@ https://juejin.cn/post/6844903775631572999
<contextName>nlAdmin</contextName>
<property name="log.charset" value="utf-8"/>
<property name="log.pattern"
value="%black(%contextName-) %X{traceId} %red(%d{yyyy-MM-dd HH:mm:ss.SSS}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger{36}) - %gray(%msg%n)"/>
value="%black(%contextName-) %X{traceId} %red(%d{yyyy-MM-dd HH:mm:ss.SSS}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger{36}) - %cyan(%msg%n)"/>
<springProperty scope="context" name="logPath" source="logging.file.path" defaultValue="logs"/>
<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
<property name="LOG_HOME" value="${logPath}"/>