Compare commits

...

10 Commits

Author SHA1 Message Date
Allenxy
4524e9ef86 feat():电文信号模拟测试 2025-11-01 18:32:20 +08:00
Allenxy
c2e9e15c36 fix():redis刷新数据库 2025-11-01 16:28:28 +08:00
Penknife
1b96f2127b Merge remote-tracking branch 'origin/master'
# Conflicts:
#	.gitignore
2025-10-31 08:50:01 +08:00
Penknife
9f2bcb6b97 fix:gitignore更新 2025-10-31 08:48:51 +08:00
Penknife
f466fbece6 fix:opc通讯字段更新 2025-10-30 18:04:17 +08:00
bea8987ed5 feat(config): 合并 2025-10-30 11:28:36 +08:00
Penknife
79889a017d feat():补充opc通讯开关配置 2025-10-29 15:50:00 +08:00
e6886f78bf feat(security): 添加对业务接口的匿名访问支持
- 在安全配置中新增 /business/** 路径的匿名访问权限- 扩展了默认允许匿名访问的URL列表
- 确保业务相关接口可以无需认证直接访问
2025-10-10 14:09:25 +08:00
909125c1b0 feat(security): 添加对 /track/** 路径的匿名访问权限
- 在 SecurityConfig 中为 /track/** 路径配置 permitAll 权限
- 允许匿名用户访问跟踪相关接口
- 统一了匿名访问路径的配置方式
2025-10-09 10:38:31 +08:00
2099b83c3f feat(business): 新增炉火段工艺参数管理功能
- 添加 SetupFurTemp 实体类及对应数据库映射文件
- 实现炉火段工艺参数的增删改查接口
- 提供 RESTful 控制器支持前后端交互
- 支持导出工艺参数数据为 Excel 文件
- 增加权限校验确保操作安全性
2025-09-29 14:45:10 +08:00
31 changed files with 783 additions and 134 deletions

76
.gitignore vendored
View File

@@ -1,49 +1,47 @@
# Compiled class file ######################################################################
*.class # Build Tools
# Log file .gradle
*.log /build/
!gradle/wrapper/gradle-wrapper.jar
# BlueJ files
*.ctxt
# Mobile Tools for Java (J2ME)
.mtj.tmp/
# Package Files #
*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*
# 编译生成的文件
target/ target/
*.class !.mvn/wrapper/maven-wrapper.jar
*.jar
*.war
*.ear
# IDE 相关文件 ######################################################################
.idea/ # IDE
### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
### IntelliJ IDEA ###
.idea
*.iws
*.iml *.iml
*.ipr *.ipr
*.iws
# 构建工具相关 ### JRebel ###
rebel.xml
### NetBeans ###
nbproject/private/
build/*
nbbuild/
dist/
nbdist/
.nb-gradle/
######################################################################
# Others
*.log *.log
*.tmp *.xml.versionsBackup
*.bak
*.swp *.swp
# 具体的 target/classes 下的文件 !*/build/*.java
ruoyi-admin/target/classes/ !*/build/*.html
ruoyi-generator/target/classes/ !*/build/*.xml
business/target/classes/
# Velocity 模板文件
*.vm

View File

@@ -10,7 +10,9 @@ import com.kangaroohy.milo.service.MiloService;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.beanutils.BeanUtils; import org.apache.commons.beanutils.BeanUtils;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.scheduling.annotation.Scheduled; import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import javax.annotation.Resource; import javax.annotation.Resource;
@@ -22,8 +24,9 @@ import java.util.Map;
import static com.fizz.business.service.manager.OpcMessageIdsManager.*; import static com.fizz.business.service.manager.OpcMessageIdsManager.*;
@Slf4j @Slf4j
//@Component @Component
@AllArgsConstructor @AllArgsConstructor
@ConditionalOnProperty(prefix = "kangaroohy.milo", name = "enabled", havingValue = "true")
public class MessageReceiveSchedule extends BaseSchedule { public class MessageReceiveSchedule extends BaseSchedule {
@Resource @Resource
@@ -31,7 +34,7 @@ public class MessageReceiveSchedule extends BaseSchedule {
@Resource @Resource
private OpcReceiverHandler opcReceiverHandler; private OpcReceiverHandler opcReceiverHandler;
// @Scheduled(fixedDelay = 1000) @Scheduled(fixedDelay = 1000)
public void L1L2LineMeasure() { public void L1L2LineMeasure() {
try { try {
@@ -45,7 +48,7 @@ public class MessageReceiveSchedule extends BaseSchedule {
writeMessage(fur,furLineMeasureIds); writeMessage(fur,furLineMeasureIds);
AppMeasureExitMessage exit = new AppMeasureExitMessage(); AppMeasureExitMessage exit = new AppMeasureExitMessage();
writeMessage(exit,exitMeasureIds); writeMessage(exit,exitLineMeasureIds);
AppMeasureMessage msg = new AppMeasureMessage(); AppMeasureMessage msg = new AppMeasureMessage();
msg.setAppMeasureEntryMessage(entry); msg.setAppMeasureEntryMessage(entry);

View File

@@ -1,6 +1,5 @@
package com.fizz.business.comm.OPC; package com.fizz.business.comm.OPC;
import com.fizz.business.anno.MyLog;
import com.fizz.business.constants.enums.ExitCutTypeEnum; import com.fizz.business.constants.enums.ExitCutTypeEnum;
import com.fizz.business.constants.enums.OpcMessageType; import com.fizz.business.constants.enums.OpcMessageType;
import com.fizz.business.domain.msg.*; import com.fizz.business.domain.msg.*;
@@ -10,9 +9,9 @@ import com.kangaroohy.milo.model.ReadWriteEntity;
import com.kangaroohy.milo.service.MiloService; import com.kangaroohy.milo.service.MiloService;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.beanutils.BeanUtils; import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.compress.utils.Lists;
import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner; import org.springframework.boot.ApplicationRunner;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import javax.annotation.Resource; import javax.annotation.Resource;
@@ -26,8 +25,9 @@ import java.util.concurrent.atomic.AtomicBoolean;
import static com.fizz.business.service.manager.OpcMessageIdsManager.*; import static com.fizz.business.service.manager.OpcMessageIdsManager.*;
//@Component @Component
@Slf4j @Slf4j
@ConditionalOnProperty(prefix = "kangaroohy.milo", name = "enabled", havingValue = "true")
public class MessageSubscriptionRunner implements ApplicationRunner { public class MessageSubscriptionRunner implements ApplicationRunner {
@Resource @Resource
@@ -87,7 +87,7 @@ public class MessageSubscriptionRunner implements ApplicationRunner {
writeMessage( msg,entryMoveIds); writeMessage( msg,entryMoveIds);
log.info("接收入口移动信号:从 {} 移动到 {} ", msg.getMaterialPlaceSource(), msg.getMaterialPlaceDestination()); log.info("接收入口移动信号:从 {} 移动到 {} ", msg.getMaterialPlaceSource(), msg.getMaterialPlaceDestination());
logDataService.logInfo("TRACK","接收入口移动信号:从 {} 移动到 {} ", msg.getMaterialPlaceSource(), msg.getMaterialPlaceDestination()); logDataService.logInfo("TRACK","接收入口移动信号:从 {} 移动到 {} ", msg.getMaterialPlaceSource(), msg.getMaterialPlaceDestination());
//opcReceiverHandler.onMessageReceived(OpcMessageType.ENTRY_MOVEMENT,msg); opcReceiverHandler.onMessageReceived(OpcMessageType.ENTRY_MOVEMENT,msg);
} catch (Exception e) { } catch (Exception e) {
} }
} }
@@ -99,7 +99,7 @@ public class MessageSubscriptionRunner implements ApplicationRunner {
writeMessage( msg,exitCutIds); writeMessage( msg,exitCutIds);
log.info("接收到出口剪切信号:剪切类型 {},剪切长度{} ", msg.getCutType().toString(), msg.getCutLength()); log.info("接收到出口剪切信号:剪切类型 {},剪切长度{} ", msg.getCutType().toString(), msg.getCutLength());
logDataService.logInfo("TRACK","接收到出口剪切信号:剪切类型 {},剪切长度{} ", msg.getCutType().toString(), msg.getCutLength()); logDataService.logInfo("TRACK","接收到出口剪切信号:剪切类型 {},剪切长度{} ", msg.getCutType().toString(), msg.getCutLength());
// opcReceiverHandler.onMessageReceived(OpcMessageType.EXIT_CUT,msg); opcReceiverHandler.onMessageReceived(OpcMessageType.EXIT_CUT,msg);
} catch (Exception e) { } catch (Exception e) {
} }
} }
@@ -111,7 +111,7 @@ public class MessageSubscriptionRunner implements ApplicationRunner {
writeMessage( msg,exitMoveIds); writeMessage( msg,exitMoveIds);
log.info("接收出口移动信号:从 {} 移动到 {} ", msg.getExSrc(), msg.getExDesc()); log.info("接收出口移动信号:从 {} 移动到 {} ", msg.getExSrc(), msg.getExDesc());
logDataService.logInfo("TRACK","接收出口移动信号:从 {} 移动到 {} ", msg.getExSrc(), msg.getExDesc()); logDataService.logInfo("TRACK","接收出口移动信号:从 {} 移动到 {} ", msg.getExSrc(), msg.getExDesc());
// opcReceiverHandler.onMessageReceived(OpcMessageType.EXIT_MOVEMENT,msg); opcReceiverHandler.onMessageReceived(OpcMessageType.EXIT_MOVEMENT,msg);
} catch (Exception e) { } catch (Exception e) {
} }
} }
@@ -120,10 +120,10 @@ public class MessageSubscriptionRunner implements ApplicationRunner {
{ {
try { try {
ExitMeasureMessage msg = new ExitMeasureMessage(); ExitMeasureMessage msg = new ExitMeasureMessage();
writeMessage(msg,exitMoveIds); writeMessage(msg,exitMeasureIds);
log.info("接收出口称重信号:重量 {} ", msg.getWeight()); log.info("接收出口称重信号:重量 {} ", msg.getWeight());
logDataService.logInfo("TRACK","接收出口称重信号:重量 {} ", msg.getWeight()); logDataService.logInfo("TRACK","接收出口称重信号:重量 {} ", msg.getWeight());
// opcReceiverHandler.onMessageReceived(OpcMessageType.EXIT_MEASURE,msg); opcReceiverHandler.onMessageReceived(OpcMessageType.EXIT_MEASURE,msg);
} catch (Exception e) { } catch (Exception e) {
} }
} }

View File

@@ -8,6 +8,7 @@ import com.kangaroohy.milo.service.MiloService;
import lombok.extern.log4j.Log4j2; import lombok.extern.log4j.Log4j2;
import org.apache.commons.beanutils.BeanUtils; import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.compress.utils.Lists; import org.apache.commons.compress.utils.Lists;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.annotation.Resource; import javax.annotation.Resource;
@@ -18,8 +19,9 @@ import java.util.Map;
import static com.fizz.business.service.manager.OpcMessageIdsManager.pdiSetupIds; import static com.fizz.business.service.manager.OpcMessageIdsManager.pdiSetupIds;
//@Service @Service
@Log4j2 @Log4j2
@ConditionalOnProperty(prefix = "kangaroohy.milo", name = "enabled", havingValue = "true")
public class OpcMessageSend { public class OpcMessageSend {
@Resource @Resource

View File

@@ -12,7 +12,6 @@ import com.fizz.business.service.impl.BeanFactory;
import com.fizz.business.utils.MatmapUtil; import com.fizz.business.utils.MatmapUtil;
import com.fizz.business.utils.WebSocketUtil; import com.fizz.business.utils.WebSocketUtil;
import com.fizz.business.vo.CrmPdiPlanVO; import com.fizz.business.vo.CrmPdiPlanVO;
import com.fizz.business.vo.PdiPlanVO;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Getter; import lombok.Getter;
@@ -33,7 +32,7 @@ public enum L1OperateMatEnum implements IEnum<String>, IOperateMat<L1OperateMatF
ONLINE("上线") { ONLINE("上线") {
@Override @Override
public void operate(L1OperateMatForm form) { public void operate(L1OperateMatForm form) {
ONLINE.syncPlanStatus(form.getPlanId()); ONLINE.syncPlanStatus(form.getPlanId(),form.getEntryMatId());
MatmapUtil.setMatmap(form.getPorIdx(), form.getEntryMatId(), form.getPlanId(), form.getPlanNo()); MatmapUtil.setMatmap(form.getPorIdx(), form.getEntryMatId(), form.getPlanId(), form.getPlanNo());
// 钢卷上线时, 缓存工艺规程 // 钢卷上线时, 缓存工艺规程
// BeanFactory.getBean(RedisCacheManager.class).setCoilSetup(form.getPlanId()); // BeanFactory.getBean(RedisCacheManager.class).setCoilSetup(form.getPlanId());
@@ -56,7 +55,7 @@ public enum L1OperateMatEnum implements IEnum<String>, IOperateMat<L1OperateMatF
PRODUCING("生产中") { PRODUCING("生产中") {
@Override @Override
public void operate(L1OperateMatForm form) { public void operate(L1OperateMatForm form) {
PRODUCING.syncPlanStatus(form.getPlanId()); PRODUCING.syncPlanStatus(form.getPlanId(),form.getEntryMatId());
WebSocketUtil.sendSignalMsg(form); WebSocketUtil.sendSignalMsg(form);
} }
@@ -64,7 +63,7 @@ public enum L1OperateMatEnum implements IEnum<String>, IOperateMat<L1OperateMatF
PRODUCT("生产完成") { PRODUCT("生产完成") {
@Override @Override
public void operate(L1OperateMatForm form) { public void operate(L1OperateMatForm form) {
PRODUCT.syncPlanStatus(form.getPlanId()); PRODUCT.syncPlanStatus(form.getPlanId(),form.getEntryMatId());
WebSocketUtil.sendSignalMsg(form); WebSocketUtil.sendSignalMsg(form);
} }
}, },
@@ -110,12 +109,13 @@ public enum L1OperateMatEnum implements IEnum<String>, IOperateMat<L1OperateMatF
* *
* @param planId 计划id * @param planId 计划id
*/ */
private void syncPlanStatus(String planId) { private void syncPlanStatus(String planId, String matId) {
CrmPdiPlanService planClient = BeanFactory.getBean(CrmPdiPlanService.class); CrmPdiPlanService planClient = BeanFactory.getBean(CrmPdiPlanService.class);
planClient.changeStatus(ChangePlanStatusForm.builder() planClient.changeStatus(ChangePlanStatusForm.builder()
.operation(this.name()) .operation(this.name())
.id(planId) .id(planId)
.matId(matId)
.build()); .build());
} }
} }

View File

@@ -49,7 +49,7 @@ public enum WebOperateMatEnum implements IEnum<String>, IOperateMat<WebOperateMa
MatmapDTO porCoil = MatmapUtil.getMatmap(form.getPorIdx()); MatmapDTO porCoil = MatmapUtil.getMatmap(form.getPorIdx());
if (MatmapUtil.already(porCoil)) { if (MatmapUtil.already(porCoil)) {
ONLINE.syncPlanStatus(form.getPlanId()); ONLINE.syncPlanStatus(form.getPlanId(), form.getEntryMatId());
WebSocketUtil.sendSignalMsg(form, true); WebSocketUtil.sendSignalMsg(form, true);
// 如果开卷机和焊机的钢卷相同,则将计划状态变更为生产中 // 如果开卷机和焊机的钢卷相同,则将计划状态变更为生产中
MatmapDTO welderCoil = MatmapUtil.getMatmap(DeviceEnum.WELDER.getIdx()); MatmapDTO welderCoil = MatmapUtil.getMatmap(DeviceEnum.WELDER.getIdx());
@@ -58,7 +58,8 @@ public enum WebOperateMatEnum implements IEnum<String>, IOperateMat<WebOperateMa
BeanFactory.getBean(TrackService.class).webOperateMat(form); BeanFactory.getBean(TrackService.class).webOperateMat(form);
} }
} else { } else {
ONLINE.syncPlanStatus(form.getPlanId()); ONLINE.syncPlanStatus(form.getPlanId(), form.getEntryMatId());
;
MatmapUtil.setMatmap(form.getPorIdx(), form.getEntryMatId(), form.getPlanId(), form.getPlanNo()); MatmapUtil.setMatmap(form.getPorIdx(), form.getEntryMatId(), form.getPlanId(), form.getPlanNo());
WebSocketUtil.sendSignalMsg(form); WebSocketUtil.sendSignalMsg(form);
} }
@@ -72,7 +73,8 @@ public enum WebOperateMatEnum implements IEnum<String>, IOperateMat<WebOperateMa
public void operate(WebOperateMatForm form) { public void operate(WebOperateMatForm form) {
// 开卷机卸卷,变更计划状态为READY,清除matmap // 开卷机卸卷,变更计划状态为READY,清除matmap
if (Objects.nonNull(form.getPorIdx())) { if (Objects.nonNull(form.getPorIdx())) {
UNLOAD.syncPlanStatus(form.getPlanId()); UNLOAD.syncPlanStatus(form.getPlanId(), form.getEntryMatId());
;
MatmapUtil.clearMatmap(form.getPorIdx()); MatmapUtil.clearMatmap(form.getPorIdx());
// 删除工艺规程 // 删除工艺规程
BeanFactory.getBean(RedisCacheManager.class).delCoilSetup(form.getEntryMatId()); BeanFactory.getBean(RedisCacheManager.class).delCoilSetup(form.getEntryMatId());
@@ -107,14 +109,16 @@ public enum WebOperateMatEnum implements IEnum<String>, IOperateMat<WebOperateMa
PRODUCING("生产中") { PRODUCING("生产中") {
@Override @Override
public void operate(WebOperateMatForm form) { public void operate(WebOperateMatForm form) {
PRODUCING.syncPlanStatus(form.getPlanId()); PRODUCING.syncPlanStatus(form.getPlanId(), form.getEntryMatId());
;
WebSocketUtil.sendSignalMsg(form); WebSocketUtil.sendSignalMsg(form);
} }
}, },
PRODUCT("生产完成") { PRODUCT("生产完成") {
@Override @Override
public void operate(WebOperateMatForm form) { public void operate(WebOperateMatForm form) {
PRODUCT.syncPlanStatus(form.getPlanId()); PRODUCT.syncPlanStatus(form.getPlanId(), form.getEntryMatId());
;
if (Objects.isNull(form.getCoilLength()) || form.getCoilLength() <= 0) { if (Objects.isNull(form.getCoilLength()) || form.getCoilLength() <= 0) {
form.setCoilLength(9999d); form.setCoilLength(9999d);
} }
@@ -135,7 +139,8 @@ public enum WebOperateMatEnum implements IEnum<String>, IOperateMat<WebOperateMa
BLOCK("卸卷并封闭") { BLOCK("卸卷并封闭") {
@Override @Override
public void operate(WebOperateMatForm form) { public void operate(WebOperateMatForm form) {
BLOCK.syncPlanStatus(form.getPlanId()); BLOCK.syncPlanStatus(form.getPlanId(), form.getEntryMatId());
;
MatmapUtil.clearMatmap(form.getPorIdx()); MatmapUtil.clearMatmap(form.getPorIdx());
// 删除工艺规程 // 删除工艺规程
BeanFactory.getBean(RedisCacheManager.class).delCoilSetup(form.getEntryMatId()); BeanFactory.getBean(RedisCacheManager.class).delCoilSetup(form.getEntryMatId());
@@ -149,7 +154,7 @@ public enum WebOperateMatEnum implements IEnum<String>, IOperateMat<WebOperateMa
ArrayList<String> status = Lists.newArrayList(PlanStatusEnum.ONLINE.name()); ArrayList<String> status = Lists.newArrayList(PlanStatusEnum.ONLINE.name());
CrmPdiPlanService planClient = BeanFactory.getBean(CrmPdiPlanService.class); CrmPdiPlanService planClient = BeanFactory.getBean(CrmPdiPlanService.class);
CrmPdiPlanVO plan = planClient.getByCoilIdAndOperId(form.getEntryMatId()); CrmPdiPlanVO plan = planClient.getByCoilIdAndOperId(form.getEntryMatId());
if (Objects.nonNull(plan) ) { if (Objects.nonNull(plan)) {
Assert.isTrue(!status.contains(plan.getStatus()), "当前状态[{}]不支持甩尾", plan.getStatus()); Assert.isTrue(!status.contains(plan.getStatus()), "当前状态[{}]不支持甩尾", plan.getStatus());
} }
MatmapUtil.clearMatmap(form.getPorIdx()); MatmapUtil.clearMatmap(form.getPorIdx());
@@ -185,12 +190,13 @@ public enum WebOperateMatEnum implements IEnum<String>, IOperateMat<WebOperateMa
* *
* @param planId 计划id * @param planId 计划id
*/ */
private void syncPlanStatus(String planId) { private void syncPlanStatus(String planId, String matId) {
CrmPdiPlanService planClient = BeanFactory.getBean(CrmPdiPlanService.class); CrmPdiPlanService planClient = BeanFactory.getBean(CrmPdiPlanService.class);
planClient.changeStatus(ChangePlanStatusForm.builder() planClient.changeStatus(ChangePlanStatusForm.builder()
.operation(this.name()) .operation(this.name())
.id(planId) .id(planId)
.matId(matId)
.build()); .build());
} }
@@ -231,7 +237,7 @@ public enum WebOperateMatEnum implements IEnum<String>, IOperateMat<WebOperateMa
returnMapper.insert(tailCoil); returnMapper.insert(tailCoil);
} else { } else {
// 整卷回退删除已有产出 // 整卷回退删除已有产出
BeanFactory.getBean(PdoExCoilService.class).deleteExistPdo(form.getEntryMatId(),form.getPlanId()); BeanFactory.getBean(PdoExCoilService.class).deleteExistPdo(form.getEntryMatId(), form.getPlanId());
} }
planClient.changeStatus(ChangePlanStatusForm.builder() planClient.changeStatus(ChangePlanStatusForm.builder()

View File

@@ -0,0 +1,104 @@
package com.fizz.business.controller;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.enums.BusinessType;
import com.fizz.business.domain.SetupFurTemp;
import com.fizz.business.service.ISetupFurTempService;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.common.core.page.TableDataInfo;
/**
* 炉火段工艺参数Controller
*
* @author ruoyi
* @date 2025-09-29
*/
@RestController
@RequestMapping("/business/fur")
public class SetupFurTempController extends BaseController
{
@Autowired
private ISetupFurTempService setupFurTempService;
/**
* 查询炉火段工艺参数列表
*/
@PreAuthorize("@ss.hasPermi('business:fur:list')")
@GetMapping("/list")
public TableDataInfo list(SetupFurTemp setupFurTemp)
{
startPage();
List<SetupFurTemp> list = setupFurTempService.selectSetupFurTempList(setupFurTemp);
return getDataTable(list);
}
/**
* 导出炉火段工艺参数列表
*/
@PreAuthorize("@ss.hasPermi('business:fur:export')")
@Log(title = "炉火段工艺参数", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(HttpServletResponse response, SetupFurTemp setupFurTemp)
{
List<SetupFurTemp> list = setupFurTempService.selectSetupFurTempList(setupFurTemp);
ExcelUtil<SetupFurTemp> util = new ExcelUtil<SetupFurTemp>(SetupFurTemp.class);
util.exportExcel(response, list, "炉火段工艺参数数据");
}
/**
* 获取炉火段工艺参数详细信息
*/
@PreAuthorize("@ss.hasPermi('business:fur:query')")
@GetMapping(value = "/{steelGrade}")
public AjaxResult getInfo(@PathVariable("steelGrade") String steelGrade)
{
return success(setupFurTempService.selectSetupFurTempBySteelGrade(steelGrade));
}
/**
* 新增炉火段工艺参数
*/
@PreAuthorize("@ss.hasPermi('business:fur:add')")
@Log(title = "炉火段工艺参数", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@RequestBody SetupFurTemp setupFurTemp)
{
return toAjax(setupFurTempService.insertSetupFurTemp(setupFurTemp));
}
/**
* 修改炉火段工艺参数
*/
@PreAuthorize("@ss.hasPermi('business:fur:edit')")
@Log(title = "炉火段工艺参数", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@RequestBody SetupFurTemp setupFurTemp)
{
return toAjax(setupFurTempService.updateSetupFurTemp(setupFurTemp));
}
/**
* 删除炉火段工艺参数
*/
@PreAuthorize("@ss.hasPermi('business:fur:remove')")
@Log(title = "炉火段工艺参数", businessType = BusinessType.DELETE)
@DeleteMapping("/{steelGrades}")
public AjaxResult remove(@PathVariable String[] steelGrades)
{
return toAjax(setupFurTempService.deleteSetupFurTempBySteelGrades(steelGrades));
}
}

View File

@@ -148,4 +148,19 @@ public class PdiSetups implements Serializable
@TableField("TYPE") @TableField("TYPE")
private Long type; private Long type;
/** 预热段出口板温 */
@Excel(name = "预热段出口板温")
@TableField("PREHEATING_SECTION")
private Float preheatingSection;
/** 加热段出口板温 */
@Excel(name = "加热段出口板温")
@TableField("HEATING_SECTION")
private Float heatingSection;
/** 冷却段出口板温 */
@Excel(name = "冷却段出口板温")
@TableField("COOLING_SECTION")
private Float coolingSection;
} }

View File

@@ -2,7 +2,6 @@ package com.fizz.business.domain;
import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableId;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
@@ -27,7 +26,7 @@ public class ProMatmap implements Serializable {
private String positionNameCn; private String positionNameCn;
@Schema(description = "计划id") @Schema(description = "计划id")
private Long planId; private String planId;
@Schema(description = "计划号") @Schema(description = "计划号")
private String planNo; private String planNo;

View File

@@ -0,0 +1,172 @@
package com.fizz.business.domain;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.core.domain.BaseEntity;
/**
* 炉火段工艺参数对象 setup_fur_temp
*
* @author ruoyi
* @date 2025-09-29
*/
public class SetupFurTemp extends BaseEntity
{
private static final long serialVersionUID = 1L;
/** $column.columnComment */
private String steelGrade;
/** 预热段出口板温 */
@Excel(name = "预热段出口板温")
private Long value1;
/** 加热段出口板温 */
@Excel(name = "加热段出口板温")
private Long value2;
/** 冷却段出口板温 */
@Excel(name = "冷却段出口板温")
private Long value3;
/** $column.columnComment */
private Long value4;
/** $column.columnComment */
private Long value5;
/** $column.columnComment */
private Long value6;
/** $column.columnComment */
private Long value7;
/** $column.columnComment */
private Long value8;
/** $column.columnComment */
private Long value9;
/** $column.columnComment */
private Long value10;
public void setSteelGrade(String steelGrade)
{
this.steelGrade = steelGrade;
}
public String getSteelGrade()
{
return steelGrade;
}
public void setValue1(Long value1)
{
this.value1 = value1;
}
public Long getValue1()
{
return value1;
}
public void setValue2(Long value2)
{
this.value2 = value2;
}
public Long getValue2()
{
return value2;
}
public void setValue3(Long value3)
{
this.value3 = value3;
}
public Long getValue3()
{
return value3;
}
public void setValue4(Long value4)
{
this.value4 = value4;
}
public Long getValue4()
{
return value4;
}
public void setValue5(Long value5)
{
this.value5 = value5;
}
public Long getValue5()
{
return value5;
}
public void setValue6(Long value6)
{
this.value6 = value6;
}
public Long getValue6()
{
return value6;
}
public void setValue7(Long value7)
{
this.value7 = value7;
}
public Long getValue7()
{
return value7;
}
public void setValue8(Long value8)
{
this.value8 = value8;
}
public Long getValue8()
{
return value8;
}
public void setValue9(Long value9)
{
this.value9 = value9;
}
public Long getValue9()
{
return value9;
}
public void setValue10(Long value10)
{
this.value10 = value10;
}
public Long getValue10()
{
return value10;
}
@Override
public String toString() {
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
.append("steelGrade", getSteelGrade())
.append("value1", getValue1())
.append("value2", getValue2())
.append("value3", getValue3())
.append("value4", getValue4())
.append("value5", getValue5())
.append("value6", getValue6())
.append("value7", getValue7())
.append("value8", getValue8())
.append("value9", getValue9())
.append("value10", getValue10())
.append("updateTime", getUpdateTime())
.append("createTime", getCreateTime())
.toString();
}
}

View File

@@ -26,6 +26,9 @@ public class ChangePlanStatusForm implements Serializable {
@NotNull(message = "计划id不能为空") @NotNull(message = "计划id不能为空")
@Schema(description = "计划id集合") @Schema(description = "计划id集合")
private String id; private String id;
@Schema(description = "计划id集合")
private String matId;
@Schema(description = "半卷回退新卷号") @Schema(description = "半卷回退新卷号")
private String returnMatId; private String returnMatId;
@Schema(description = "回退重量") @Schema(description = "回退重量")

View File

@@ -0,0 +1,61 @@
package com.fizz.business.mapper;
import java.util.List;
import com.fizz.business.domain.SetupFurTemp;
/**
* 炉火段工艺参数Mapper接口
*
* @author ruoyi
* @date 2025-09-29
*/
public interface SetupFurTempMapper
{
/**
* 查询炉火段工艺参数
*
* @param steelGrade 炉火段工艺参数主键
* @return 炉火段工艺参数
*/
public SetupFurTemp selectSetupFurTempBySteelGrade(String steelGrade);
/**
* 查询炉火段工艺参数列表
*
* @param setupFurTemp 炉火段工艺参数
* @return 炉火段工艺参数集合
*/
public List<SetupFurTemp> selectSetupFurTempList(SetupFurTemp setupFurTemp);
/**
* 新增炉火段工艺参数
*
* @param setupFurTemp 炉火段工艺参数
* @return 结果
*/
public int insertSetupFurTemp(SetupFurTemp setupFurTemp);
/**
* 修改炉火段工艺参数
*
* @param setupFurTemp 炉火段工艺参数
* @return 结果
*/
public int updateSetupFurTemp(SetupFurTemp setupFurTemp);
/**
* 删除炉火段工艺参数
*
* @param steelGrade 炉火段工艺参数主键
* @return 结果
*/
public int deleteSetupFurTempBySteelGrade(String steelGrade);
/**
* 批量删除炉火段工艺参数
*
* @param steelGrades 需要删除的数据主键集合
* @return 结果
*/
public int deleteSetupFurTempBySteelGrades(String[] steelGrades);
}

View File

@@ -0,0 +1,61 @@
package com.fizz.business.service;
import java.util.List;
import com.fizz.business.domain.SetupFurTemp;
/**
* 炉火段工艺参数Service接口
*
* @author ruoyi
* @date 2025-09-29
*/
public interface ISetupFurTempService
{
/**
* 查询炉火段工艺参数
*
* @param steelGrade 炉火段工艺参数主键
* @return 炉火段工艺参数
*/
public SetupFurTemp selectSetupFurTempBySteelGrade(String steelGrade);
/**
* 查询炉火段工艺参数列表
*
* @param setupFurTemp 炉火段工艺参数
* @return 炉火段工艺参数集合
*/
public List<SetupFurTemp> selectSetupFurTempList(SetupFurTemp setupFurTemp);
/**
* 新增炉火段工艺参数
*
* @param setupFurTemp 炉火段工艺参数
* @return 结果
*/
public int insertSetupFurTemp(SetupFurTemp setupFurTemp);
/**
* 修改炉火段工艺参数
*
* @param setupFurTemp 炉火段工艺参数
* @return 结果
*/
public int updateSetupFurTemp(SetupFurTemp setupFurTemp);
/**
* 批量删除炉火段工艺参数
*
* @param steelGrades 需要删除的炉火段工艺参数主键集合
* @return 结果
*/
public int deleteSetupFurTempBySteelGrades(String[] steelGrades);
/**
* 删除炉火段工艺参数信息
*
* @param steelGrade 炉火段工艺参数主键
* @return 结果
*/
public int deleteSetupFurTempBySteelGrade(String steelGrade);
}

View File

@@ -1,5 +1,6 @@
package com.fizz.business.service.hanle; package com.fizz.business.service.hanle;
import cn.hutool.json.JSONUtil;
import com.fizz.business.anno.OpcMessageHandlerType; import com.fizz.business.anno.OpcMessageHandlerType;
import com.fizz.business.constants.enums.L1OperateMatEnum; import com.fizz.business.constants.enums.L1OperateMatEnum;
import com.fizz.business.constants.enums.OpcMessageType; import com.fizz.business.constants.enums.OpcMessageType;
@@ -33,10 +34,11 @@ public class ExitCutHandler implements OpcMessageHandler<ExitCutMessage> {
MatmapDTO trMatmap = MatmapUtil.getMatmap(TR.getIdx()); MatmapDTO trMatmap = MatmapUtil.getMatmap(TR.getIdx());
if (trMatmap == null) { if (trMatmap == null) {
log.error("卷取机s."); log.error("卷取机不存在");
return; return;
} }
log.info("接受到出口剪切信号:{}", JSONUtil.toJsonStr(message));
// 2. 根据剪切类型,生成产出卷信息 // 2. 根据剪切类型,生成产出卷信息
ExitCoilInfoDTO exitCoilInfo = pdoExCoilService.genExitCoilInfo(trMatmap, message.getCutType()); ExitCoilInfoDTO exitCoilInfo = pdoExCoilService.genExitCoilInfo(trMatmap, message.getCutType());

View File

@@ -7,26 +7,28 @@ import com.fizz.business.service.CrmPdoExcoilService;
import com.fizz.business.service.OpcMessageHandler; import com.fizz.business.service.OpcMessageHandler;
import com.fizz.business.utils.MatmapUtil; import com.fizz.business.utils.MatmapUtil;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import static com.fizz.business.constants.enums.DeviceEnum.TR; import static com.fizz.business.constants.enums.DeviceEnum.WEIGHT;
@Component @Component
@OpcMessageHandlerType(OpcMessageType.EXIT_MEASURE) @OpcMessageHandlerType(OpcMessageType.EXIT_MEASURE)
@RequiredArgsConstructor @RequiredArgsConstructor
@Slf4j
public class ExitMeasureHandler implements OpcMessageHandler<ExitMeasureMessage> { public class ExitMeasureHandler implements OpcMessageHandler<ExitMeasureMessage> {
private final CrmPdoExcoilService crmPdoExcoilService; private final CrmPdoExcoilService crmPdoExcoilService;
@Override @Override
public void handle(ExitMeasureMessage message) { public void handle(ExitMeasureMessage message) {
System.out.println("处理 EXIT_MEASURE 消息: " + message);
// 1. 获取卷取机 (TR) 上的成品卷号 // 1. 获取卷取机 (TR) 上的成品卷号
String exitMatId = MatmapUtil.getMatId(TR.getIdx()); log.info("获取到钢卷称重信息:{}.",message);
String exitMatId = MatmapUtil.getMatId(WEIGHT.getIdx());
if (exitMatId == null) { if (exitMatId == null) {
System.err.println("TR device has no coil. Cannot process ExitMeasureMessage."); log.error("TR device has no coil. Cannot process ExitMeasureMessage.");
return; return;
} }

View File

@@ -6,23 +6,28 @@ import com.fizz.business.constants.enums.OpcMessageType;
import com.fizz.business.domain.msg.ExitMovementMessage; import com.fizz.business.domain.msg.ExitMovementMessage;
import com.fizz.business.dto.MatmapDTO; import com.fizz.business.dto.MatmapDTO;
import com.fizz.business.service.OpcMessageHandler; import com.fizz.business.service.OpcMessageHandler;
import com.fizz.business.service.ProMatmapService;
import com.fizz.business.utils.MatmapUtil; import com.fizz.business.utils.MatmapUtil;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import javax.annotation.Resource;
@Component @Component
@Slf4j @Slf4j
@OpcMessageHandlerType(OpcMessageType.EXIT_MOVEMENT) @OpcMessageHandlerType(OpcMessageType.EXIT_MOVEMENT)
@RequiredArgsConstructor @RequiredArgsConstructor
public class ExitMovementHandler implements OpcMessageHandler<ExitMovementMessage> { public class ExitMovementHandler implements OpcMessageHandler<ExitMovementMessage> {
@Resource
ProMatmapService proMatmapService;
@Override @Override
public void handle(ExitMovementMessage message) { public void handle(ExitMovementMessage message) {
System.out.printf("处理 EXIT_MOVEMENT 消息: %d -> %d%n", message.getExSrc(), message.getExDesc());
// 1. 获取源位置的物料信息 // 1. 获取源位置的物料信息
int srcIndex = message.getExSrc() -1 ; int srcIndex = message.getExSrc() ;
MatmapDTO srcMatmap = MatmapUtil.getMatmap(srcIndex); MatmapDTO srcMatmap = MatmapUtil.getMatmap(srcIndex);
if (ObjectUtil.isNull(srcMatmap) || ObjectUtil.isNull(srcMatmap.getMatId())) { if (ObjectUtil.isNull(srcMatmap) || ObjectUtil.isNull(srcMatmap.getMatId())) {
@@ -36,9 +41,11 @@ public class ExitMovementHandler implements OpcMessageHandler<ExitMovementMessag
log.info("成功清空源位置 {} 的物料信息。{}", srcIndex,srcMatmap.getMatId()); log.info("成功清空源位置 {} 的物料信息。{}", srcIndex,srcMatmap.getMatId());
// 3. 将物料信息设置到目标位置 // 3. 将物料信息设置到目标位置
int destIndex = message.getExDesc() - 1; int destIndex = message.getExDesc();
MatmapUtil.setMatmap(destIndex, srcMatmap.getMatId(), srcMatmap.getPlanId(), srcMatmap.getPlanNo()); MatmapUtil.setMatmap(destIndex, srcMatmap.getMatId(), srcMatmap.getPlanId(), srcMatmap.getPlanNo());
log.info("成功设置目标位置 {} 的物料信息为钢卷 {}", destIndex, srcMatmap.getMatId()); log.info("成功设置目标位置 {} 的物料信息为钢卷 {}", destIndex, srcMatmap.getMatId());
proMatmapService.flushMatmap();
} }

View File

@@ -6,23 +6,14 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fizz.business.domain.CrmPdiPlan; import com.fizz.business.domain.CrmPdiPlan;
import com.fizz.business.domain.ModCoilMap; import com.fizz.business.form.ChangePlanStatusForm;
import com.fizz.business.domain.ProMatmap; import com.fizz.business.form.PlanQueryForm;
import com.fizz.business.form.*;
import com.fizz.business.mapper.CrmPdiPlanMapper; import com.fizz.business.mapper.CrmPdiPlanMapper;
import com.fizz.business.service.CrmPdiPlanService; import com.fizz.business.service.CrmPdiPlanService;
import com.fizz.business.service.ModCoilMapService;
import com.fizz.business.service.ModSetupResultService;
import com.fizz.business.service.ProMatmapService;
import com.fizz.business.vo.CrmPdiPlanVO; import com.fizz.business.vo.CrmPdiPlanVO;
import com.fizz.business.vo.ModSetupResultVO;
import com.fizz.business.vo.PdiPlanSetupInfoVO;
import com.ruoyi.common.utils.StringUtils;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.List; import java.util.List;
@@ -143,7 +134,7 @@ public class CrmPdiPlanServiceImpl extends ServiceImpl<CrmPdiPlanMapper, CrmPdiP
@Override @Override
public CrmPdiPlan getFirstUnProducedCoil() { public CrmPdiPlan getFirstUnProducedCoil() {
return this.lambdaQuery() return this.lambdaQuery()
.eq(CrmPdiPlan::getStatus, 0) // 0 表示未生产 .in(CrmPdiPlan::getStatus, "NEW","READY") // 0 表示未生产
.orderByAsc(CrmPdiPlan::getSeqid) // 按顺序号排序,取第一个 .orderByAsc(CrmPdiPlan::getSeqid) // 按顺序号排序,取第一个
.last("limit 1") .last("limit 1")
.one(); .one();
@@ -152,7 +143,11 @@ public class CrmPdiPlanServiceImpl extends ServiceImpl<CrmPdiPlanMapper, CrmPdiP
@Override @Override
public void changeStatus(ChangePlanStatusForm build) { public void changeStatus(ChangePlanStatusForm build) {
CrmPdiPlan pdiPlan = baseMapper.selectById(build.getId()); QueryWrapper<CrmPdiPlan> wrapper = new QueryWrapper<>();
wrapper.eq("coilid", build.getMatId());
wrapper.eq("planid", build.getId());
CrmPdiPlan pdiPlan = baseMapper.selectOne(wrapper);
if (pdiPlan == null) { if (pdiPlan == null) {
log.error("未找到ID为{}的计划记录", build.getId()); log.error("未找到ID为{}的计划记录", build.getId());
@@ -161,6 +156,7 @@ public class CrmPdiPlanServiceImpl extends ServiceImpl<CrmPdiPlanMapper, CrmPdiP
pdiPlan.setStatus(build.getOperation()); pdiPlan.setStatus(build.getOperation());
baseMapper.updateById(pdiPlan);
log.info("计划状态更新成功ID: {}, 新状态: {}", build.getId(), build.getOperation()); log.info("计划状态更新成功ID: {}, 新状态: {}", build.getId(), build.getOperation());
} }

View File

@@ -4,7 +4,6 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fizz.business.domain.CrmPdoExcoil; import com.fizz.business.domain.CrmPdoExcoil;
import com.fizz.business.domain.PdoExcoil;
import com.fizz.business.form.CrmPdoExcoilForm; import com.fizz.business.form.CrmPdoExcoilForm;
import com.fizz.business.mapper.CrmPdoExcoilMapper; import com.fizz.business.mapper.CrmPdoExcoilMapper;
import com.fizz.business.service.CrmPdoExcoilService; import com.fizz.business.service.CrmPdoExcoilService;
@@ -32,7 +31,7 @@ public class CrmPdoExcoilServiceImpl extends ServiceImpl<CrmPdoExcoilMapper, Crm
*/ */
public CrmPdoExcoil getByExcoilId(String excoilid) { public CrmPdoExcoil getByExcoilId(String excoilid) {
QueryWrapper<CrmPdoExcoil> queryWrapper = new QueryWrapper<>(); QueryWrapper<CrmPdoExcoil> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("exit_coilid", excoilid); queryWrapper.eq("exit_mat_id", excoilid);
return this.getOne(queryWrapper); return this.getOne(queryWrapper);
} }

View File

@@ -2,9 +2,7 @@ package com.fizz.business.service.impl;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.fizz.business.constants.enums.ExitCutTypeEnum; import com.fizz.business.constants.enums.ExitCutTypeEnum;
import com.fizz.business.domain.PdoExcoil;
import com.fizz.business.dto.ExitCoilInfoDTO; import com.fizz.business.dto.ExitCoilInfoDTO;
import com.fizz.business.dto.MatmapDTO; import com.fizz.business.dto.MatmapDTO;
import com.fizz.business.dto.PdoExCoilDTO; import com.fizz.business.dto.PdoExCoilDTO;
@@ -89,8 +87,8 @@ public class PdoExCoilServiceImpl implements PdoExCoilService {
pdoExCoilDTO.setEndTime(now); pdoExCoilDTO.setEndTime(now);
// 获取班组信息 // 获取班组信息
pdoExCoilDTO.setGroupNo("1"); pdoExCoilDTO.setGroupNo("1");
pdoExCoilDTO.setShiftNo("A"); pdoExCoilDTO.setShiftNo("A");
pdoExCoilDTO.setStatus("UNWEIGHT"); pdoExCoilDTO.setStatus("UNWEIGHT");
log.info("save pdo exit coil:{}", JSONUtil.toJsonStr(pdoExCoilDTO)); log.info("save pdo exit coil:{}", JSONUtil.toJsonStr(pdoExCoilDTO));
@@ -104,23 +102,25 @@ public class PdoExCoilServiceImpl implements PdoExCoilService {
/** /**
* 通过计划的halfReturnType字段判断当前卷是回退的头部卷还是尾部卷 * 通过计划的halfReturnType字段判断当前卷是回退的头部卷还是尾部卷
* 1. 头部卷: entryMatId=A01 * 1. 头部卷: entryMatId=A01
* 2. 尾部卷: entryMatId=A01-2, returnMatId=A01。由于计划号+钢卷号唯一所以回退的尾部卷生成新计划时将entryMatId设置为A01-2真实的原料卷号保存在returnMatId中 * 2. 尾部卷: entryMatId=A01-2, returnMatId=A01。由于计划号+钢卷号唯一所以回退的尾部卷生成新计划时将entryMatId设置为A01-2真实的原料卷号保存在returnMatId中
* 半卷回退上报产出 * 半卷回退上报产出
* 1. 头部卷产出时原料卷号A01, 产出卷号: A01-1, 分卷标识: true, 尾卷标识: false * 1. 头部卷产出时原料卷号A01, 产出卷号: A01-1, 分卷标识: true, 尾卷标识: false
* 2. 尾部卷产出时原料卷号A01产出卷号: A01-2 * 2. 尾部卷产出时原料卷号A01产出卷号: A01-2
*
* @param trMatmap * @param trMatmap
* @param cutType * @param cutType
* @return ExitCoilInfoDTO * @return ExitCoilInfoDTO
*/ */
@Override @Override
public ExitCoilInfoDTO genExitCoilInfo(MatmapDTO trMatmap, ExitCutTypeEnum cutType) { public ExitCoilInfoDTO genExitCoilInfo(MatmapDTO trMatmap, ExitCutTypeEnum cutType) {
log.info("触发出口分卷信号:{},剪切类型为:{}",trMatmap,cutType);
String trCoilId = trMatmap.getMatId(); String trCoilId = trMatmap.getMatId();
//准备的成品子卷号 //准备的成品子卷号
//考虑依据数据库记录分卷,避免因为平台重启导致分卷丢失或错误 //考虑依据数据库记录分卷,避免因为平台重启导致分卷丢失或错误
Long subNum = crmPdoExcoilService.getNumber(trCoilId Long subNum = crmPdoExcoilService.getNumber(trCoilId
, trMatmap.getPlanNo(), , trMatmap.getPlanNo(),
0); 0);
CrmPdiPlanVO plan = crmPdiPlanService.getByCoilIdAndOperId(trMatmap.getMatId()); CrmPdiPlanVO plan = crmPdiPlanService.getByCoilIdAndOperId(trMatmap.getMatId());
@@ -149,6 +149,6 @@ public class PdoExCoilServiceImpl implements PdoExCoilService {
@Override @Override
public void deleteExistPdo(String coilId, String planId) { public void deleteExistPdo(String coilId, String planId) {
crmPdoExcoilService.deleteCrmPdoExcoil(coilId,planId); crmPdoExcoilService.deleteCrmPdoExcoil(coilId, planId);
} }
} }

View File

@@ -25,7 +25,7 @@ public class ProStoppageServiceImpl extends ServiceImpl<ProStoppageMapper, ProSt
queryWrapper.ge("end_date", form.getStartDate() + " 00:00:00") queryWrapper.ge("end_date", form.getStartDate() + " 00:00:00")
.le("end_date", form.getEndDate() + " 23:59:59") .le("end_date", form.getEndDate() + " 23:59:59")
// .ge("duration", 300) .ge("duration", 300)
.orderByDesc("end_date"); .orderByDesc("end_date");
List<ProStoppage> list = baseMapper.selectList(queryWrapper); List<ProStoppage> list = baseMapper.selectList(queryWrapper);

View File

@@ -0,0 +1,96 @@
package com.fizz.business.service.impl;
import java.util.List;
import com.ruoyi.common.utils.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.fizz.business.mapper.SetupFurTempMapper;
import com.fizz.business.domain.SetupFurTemp;
import com.fizz.business.service.ISetupFurTempService;
/**
* 炉火段工艺参数Service业务层处理
*
* @author ruoyi
* @date 2025-09-29
*/
@Service
public class SetupFurTempServiceImpl implements ISetupFurTempService
{
@Autowired
private SetupFurTempMapper setupFurTempMapper;
/**
* 查询炉火段工艺参数
*
* @param steelGrade 炉火段工艺参数主键
* @return 炉火段工艺参数
*/
@Override
public SetupFurTemp selectSetupFurTempBySteelGrade(String steelGrade)
{
return setupFurTempMapper.selectSetupFurTempBySteelGrade(steelGrade);
}
/**
* 查询炉火段工艺参数列表
*
* @param setupFurTemp 炉火段工艺参数
* @return 炉火段工艺参数
*/
@Override
public List<SetupFurTemp> selectSetupFurTempList(SetupFurTemp setupFurTemp)
{
return setupFurTempMapper.selectSetupFurTempList(setupFurTemp);
}
/**
* 新增炉火段工艺参数
*
* @param setupFurTemp 炉火段工艺参数
* @return 结果
*/
@Override
public int insertSetupFurTemp(SetupFurTemp setupFurTemp)
{
setupFurTemp.setCreateTime(DateUtils.getNowDate());
return setupFurTempMapper.insertSetupFurTemp(setupFurTemp);
}
/**
* 修改炉火段工艺参数
*
* @param setupFurTemp 炉火段工艺参数
* @return 结果
*/
@Override
public int updateSetupFurTemp(SetupFurTemp setupFurTemp)
{
setupFurTemp.setUpdateTime(DateUtils.getNowDate());
return setupFurTempMapper.updateSetupFurTemp(setupFurTemp);
}
/**
* 批量删除炉火段工艺参数
*
* @param steelGrades 需要删除的炉火段工艺参数主键
* @return 结果
*/
@Override
public int deleteSetupFurTempBySteelGrades(String[] steelGrades)
{
return setupFurTempMapper.deleteSetupFurTempBySteelGrades(steelGrades);
}
/**
* 删除炉火段工艺参数信息
*
* @param steelGrade 炉火段工艺参数主键
* @return 结果
*/
@Override
public int deleteSetupFurTempBySteelGrade(String steelGrade)
{
return setupFurTempMapper.deleteSetupFurTempBySteelGrade(steelGrade);
}
}

View File

@@ -13,6 +13,7 @@ import com.fizz.business.form.AdjustPosForm;
import com.fizz.business.form.L1OperateMatForm; import com.fizz.business.form.L1OperateMatForm;
import com.fizz.business.form.WebOperateMatForm; import com.fizz.business.form.WebOperateMatForm;
import com.fizz.business.service.CrmPdiPlanService; import com.fizz.business.service.CrmPdiPlanService;
import com.fizz.business.service.ProMatmapService;
import com.fizz.business.service.TrackService; import com.fizz.business.service.TrackService;
import com.fizz.business.service.client.RedisCacheManager; import com.fizz.business.service.client.RedisCacheManager;
import com.fizz.business.utils.CalcUtil; import com.fizz.business.utils.CalcUtil;
@@ -45,6 +46,9 @@ public class TrackServiceImpl implements TrackService {
@Autowired @Autowired
RedisCacheManager redisCacheManager; RedisCacheManager redisCacheManager;
@Autowired
ProMatmapService proMatmapService;
@Autowired @Autowired
CrmPdiPlanService crmPdiPlanService; CrmPdiPlanService crmPdiPlanService;
@@ -53,6 +57,7 @@ public class TrackServiceImpl implements TrackService {
log.info("web operate mat: {}", JSON.toJSONString(form)); log.info("web operate mat: {}", JSON.toJSONString(form));
form.getOperation().operate(form); form.getOperation().operate(form);
proMatmapService.flushMatmap();
} }
@Override @Override
@@ -60,6 +65,7 @@ public class TrackServiceImpl implements TrackService {
log.info("l1 operate mat: {}", JSON.toJSONString(form)); log.info("l1 operate mat: {}", JSON.toJSONString(form));
form.getOperation().operate(form); form.getOperation().operate(form);
proMatmapService.flushMatmap();
} }
@Override @Override

View File

@@ -144,12 +144,12 @@ public class OpcMessageIdsManager {
} }
public static void loadFurLineMeasureIds() { public static void loadFurLineMeasureIds() {
furLineMeasureIds.put("ns=2;s=通道 1.PLCLine.FurLineMeasure.entryCoilId", "entryCoilId"); furLineMeasureIds.put("ns=2;s=通道 1.PLCFur.FurLineMeasure.entryCoilId", "entryCoilId");
furLineMeasureIds.put("ns=2;s=通道 1.PLCLine.FurLineMeasure.stripLocation", "stripLocation"); // furLineMeasureIds.put("ns=2;s=通道 1.PLCFur.FurLineMeasure.stripLocation", "stripLocation");
furLineMeasureIds.put("ns=2;s=通道 1.PLCLine.FurLineMeasure.phFurnaceTemperatureActual", "phFurnaceTemperatureActual"); furLineMeasureIds.put("ns=2;s=通道 1.PLCFur.FurLineMeasure.phFurnaceTemperatureActual", "phFurnaceTemperatureActual");
furLineMeasureIds.put("ns=2;s=通道 1.PLCLine.FurLineMeasure.nof1FurnaceTemperatureActual", "nof1FurnaceTemperatureActual"); furLineMeasureIds.put("ns=2;s=通道 1.PLCFur.FurLineMeasure.nof1FurnaceTemperatureActual", "nof1FurnaceTemperatureActual");
furLineMeasureIds.put("ns=2;s=通道 1.PLCLine.FurLineMeasure.nof1FurnaceTemperatureSet", "nof1FurnaceTemperatureSet"); furLineMeasureIds.put("ns=2;s=通道 1.PLCFur.FurLineMeasure.nof1FurnaceTemperatureSet", "nof1FurnaceTemperatureSet");
furLineMeasureIds.put("ns=2;s=通道 1.PLCLine.FurLineMeasure.nof1FurnaceTemperatureControlOutput", "nof1FurnaceTemperatureControlOutput"); furLineMeasureIds.put("ns=2;s=通道 1.PLCFur.FurLineMeasure.nof1FurnaceTemperatureControlOutput", "nof1FurnaceTemperatureControlOutput");
// furLineMeasureIds.put("ns=2;s=通道 1.PLCLine.FurLineMeasure.nof1GasFlowActual", "nof1GasFlowActual"); // furLineMeasureIds.put("ns=2;s=通道 1.PLCLine.FurLineMeasure.nof1GasFlowActual", "nof1GasFlowActual");
// furLineMeasureIds.put("ns=2;s=通道 1.PLCLine.FurLineMeasure.nof1GasFlowSet", "nof1GasFlowSet"); // furLineMeasureIds.put("ns=2;s=通道 1.PLCLine.FurLineMeasure.nof1GasFlowSet", "nof1GasFlowSet");
// furLineMeasureIds.put("ns=2;s=通道 1.PLCLine.FurLineMeasure.nof1GasFlowControlOutput", "nof1GasFlowControlOutput"); // furLineMeasureIds.put("ns=2;s=通道 1.PLCLine.FurLineMeasure.nof1GasFlowControlOutput", "nof1GasFlowControlOutput");
@@ -322,8 +322,8 @@ public class OpcMessageIdsManager {
exitLineMeasureIds.put("ns=2;s=通道 1.PLCLine.ExitLineMeasure.stripLocation", "stripLocation"); exitLineMeasureIds.put("ns=2;s=通道 1.PLCLine.ExitLineMeasure.stripLocation", "stripLocation");
exitLineMeasureIds.put("ns=2;s=通道 1.PLCLine.ExitLineMeasure.tensionBr8Br9", "tensionBr8Br9"); exitLineMeasureIds.put("ns=2;s=通道 1.PLCLine.ExitLineMeasure.tensionBr8Br9", "tensionBr8Br9");
exitLineMeasureIds.put("ns=2;s=通道 1.PLCLine.ExitLineMeasure.cxlLength", "cxlLength"); exitLineMeasureIds.put("ns=2;s=通道 1.PLCLine.ExitLineMeasure.cxlLength", "cxlLength");
exitLineMeasureIds.put("ns=2;s=通道 1.PLCLine.ExitLineMeasure.cxlCapacity", "cxlCapacity"); exitLineMeasureIds.put("ns=2;s=通道 1.PLCLine.ExitLineMeasure.cxlPercent", "cxlCapacity");
exitLineMeasureIds.put("ns=2;s=通道 1.PLCLine.ExitLineMeasure.tensionCxl", "tensionCxl"); // exitLineMeasureIds.put("ns=2;s=通道 1.PLCLine.ExitLineMeasure.tensionCxl", "tensionCxl");
exitLineMeasureIds.put("ns=2;s=通道 1.PLCLine.ExitLineMeasure.oilingFlag", "oilingFlag"); exitLineMeasureIds.put("ns=2;s=通道 1.PLCLine.ExitLineMeasure.oilingFlag", "oilingFlag");
exitLineMeasureIds.put("ns=2;s=通道 1.PLCLine.ExitLineMeasure.oilingAmountTop", "oilingAmountTop"); exitLineMeasureIds.put("ns=2;s=通道 1.PLCLine.ExitLineMeasure.oilingAmountTop", "oilingAmountTop");
exitLineMeasureIds.put("ns=2;s=通道 1.PLCLine.ExitLineMeasure.oilingAmountBottom", "oilingAmountBottom"); exitLineMeasureIds.put("ns=2;s=通道 1.PLCLine.ExitLineMeasure.oilingAmountBottom", "oilingAmountBottom");

View File

@@ -59,7 +59,7 @@ public class MatmapUtil {
} }
public static boolean already(MatmapDTO matmap) { public static boolean already(MatmapDTO matmap) {
return Objects.nonNull(matmap) && StrUtil.isNotBlank(matmap.getMatId()); return Objects.nonNull(matmap) && Objects.nonNull(matmap.getMatId());
} }
public static void setMatId(int index, String matId) { public static void setMatId(int index, String matId) {

View File

@@ -5,8 +5,8 @@
<mapper namespace="com.fizz.business.mapper.ProMatmapMapper"> <mapper namespace="com.fizz.business.mapper.ProMatmapMapper">
<update id="flushMatmap"> <insert id="flushMatmap">
insert into track_ca1_romtb_matmap ( insert into pro_matmap (
pos_idx, mat_id, plan_no, plan_id pos_idx, mat_id, plan_no, plan_id
) )
values values
@@ -14,7 +14,9 @@
(#{item.posIdx}, #{item.matId}, #{item.planNo}, #{item.planId}) (#{item.posIdx}, #{item.matId}, #{item.planNo}, #{item.planId})
</foreach> </foreach>
on duplicate key update on duplicate key update
mat_id = VALUES(mat_id),plan_no = VALUES(plan_no),plan_id = VALUES(plan_id) mat_id = VALUES(mat_id),
</update> plan_no = VALUES(plan_no),
plan_id = VALUES(plan_id)
</insert>
</mapper> </mapper>

View File

@@ -0,0 +1,104 @@
<?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="com.fizz.business.mapper.SetupFurTempMapper">
<resultMap type="SetupFurTemp" id="SetupFurTempResult">
<result property="steelGrade" column="steel_grade" />
<result property="value1" column="value1" />
<result property="value2" column="value2" />
<result property="value3" column="value3" />
<result property="value4" column="value4" />
<result property="value5" column="value5" />
<result property="value6" column="value6" />
<result property="value7" column="value7" />
<result property="value8" column="value8" />
<result property="value9" column="value9" />
<result property="value10" column="value10" />
<result property="updateTime" column="update_time" />
<result property="createTime" column="create_time" />
</resultMap>
<sql id="selectSetupFurTempVo">
select steel_grade, value1, value2, value3, value4, value5, value6, value7, value8, value9, value10, update_time, create_time from setup_fur_temp
</sql>
<select id="selectSetupFurTempList" parameterType="SetupFurTemp" resultMap="SetupFurTempResult">
<include refid="selectSetupFurTempVo"/>
<where>
<if test="value1 != null "> and value1 = #{value1}</if>
<if test="value2 != null "> and value2 = #{value2}</if>
<if test="value3 != null "> and value3 = #{value3}</if>
</where>
</select>
<select id="selectSetupFurTempBySteelGrade" parameterType="String" resultMap="SetupFurTempResult">
<include refid="selectSetupFurTempVo"/>
where steel_grade = #{steelGrade}
</select>
<insert id="insertSetupFurTemp" parameterType="SetupFurTemp">
insert into setup_fur_temp
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="steelGrade != null">steel_grade,</if>
<if test="value1 != null">value1,</if>
<if test="value2 != null">value2,</if>
<if test="value3 != null">value3,</if>
<if test="value4 != null">value4,</if>
<if test="value5 != null">value5,</if>
<if test="value6 != null">value6,</if>
<if test="value7 != null">value7,</if>
<if test="value8 != null">value8,</if>
<if test="value9 != null">value9,</if>
<if test="value10 != null">value10,</if>
<if test="updateTime != null">update_time,</if>
<if test="createTime != null">create_time,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="steelGrade != null">#{steelGrade},</if>
<if test="value1 != null">#{value1},</if>
<if test="value2 != null">#{value2},</if>
<if test="value3 != null">#{value3},</if>
<if test="value4 != null">#{value4},</if>
<if test="value5 != null">#{value5},</if>
<if test="value6 != null">#{value6},</if>
<if test="value7 != null">#{value7},</if>
<if test="value8 != null">#{value8},</if>
<if test="value9 != null">#{value9},</if>
<if test="value10 != null">#{value10},</if>
<if test="updateTime != null">#{updateTime},</if>
<if test="createTime != null">#{createTime},</if>
</trim>
</insert>
<update id="updateSetupFurTemp" parameterType="SetupFurTemp">
update setup_fur_temp
<trim prefix="SET" suffixOverrides=",">
<if test="value1 != null">value1 = #{value1},</if>
<if test="value2 != null">value2 = #{value2},</if>
<if test="value3 != null">value3 = #{value3},</if>
<if test="value4 != null">value4 = #{value4},</if>
<if test="value5 != null">value5 = #{value5},</if>
<if test="value6 != null">value6 = #{value6},</if>
<if test="value7 != null">value7 = #{value7},</if>
<if test="value8 != null">value8 = #{value8},</if>
<if test="value9 != null">value9 = #{value9},</if>
<if test="value10 != null">value10 = #{value10},</if>
<if test="updateTime != null">update_time = #{updateTime},</if>
<if test="createTime != null">create_time = #{createTime},</if>
</trim>
where steel_grade = #{steelGrade}
</update>
<delete id="deleteSetupFurTempBySteelGrade" parameterType="String">
delete from setup_fur_temp where steel_grade = #{steelGrade}
</delete>
<delete id="deleteSetupFurTempBySteelGrades" parameterType="String">
delete from setup_fur_temp where steel_grade in
<foreach item="steelGrade" collection="array" open="(" separator="," close=")">
#{steelGrade}
</foreach>
</delete>
</mapper>

View File

@@ -5,8 +5,8 @@
<mapper namespace="com.fizz.business.mapper.ProMatmapMapper"> <mapper namespace="com.fizz.business.mapper.ProMatmapMapper">
<update id="flushMatmap"> <insert id="flushMatmap">
insert into track_ca1_romtb_matmap ( insert into pro_matmap (
pos_idx, mat_id, plan_no, plan_id pos_idx, mat_id, plan_no, plan_id
) )
values values
@@ -14,7 +14,9 @@
(#{item.posIdx}, #{item.matId}, #{item.planNo}, #{item.planId}) (#{item.posIdx}, #{item.matId}, #{item.planNo}, #{item.planId})
</foreach> </foreach>
on duplicate key update on duplicate key update
mat_id = VALUES(mat_id),plan_no = VALUES(plan_no),plan_id = VALUES(plan_id) mat_id = VALUES(mat_id),
</update> plan_no = VALUES(plan_no),
plan_id = VALUES(plan_id)
</insert>
</mapper> </mapper>

View File

@@ -61,4 +61,13 @@
<select id="getLatestRecord" resultType="com.fizz.business.domain.Segment"> <select id="getLatestRecord" resultType="com.fizz.business.domain.Segment">
SELECT * FROM cpg_segment where id=(SELECT max(id) FROM cpg_segment) SELECT * FROM cpg_segment where id=(SELECT max(id) FROM cpg_segment)
</select> </select>
<select id="queryParamByEnCoilId" resultType="com.fizz.business.vo.SegmentParamVO">
SELECT seg_no AS segNo,
JSON_UNQUOTE(JSON_EXTRACT(total_values_json, CONCAT('$.', #{paramField}, '_avg'))) AS value
FROM cpl_segment_total
WHERE en_coil_id = #{enCoilID}
ORDER BY seg_no
</select>
</mapper> </mapper>

View File

@@ -74,19 +74,19 @@ spring:
port: 6379 port: 6379
# 数据库索引 # 数据库索引
database: 0 database: 0
# 密码 abcd1234 fe2b3cef78b74d3692909bdcbdf46331 KeLunPu123! # 密码 abcd1234 fe2b3cef78b74d3692909bdcbdf46331 KeLunPu123!
# password: KeLunPu123!
password: password:
#password:
# 连接超时时间 # 连接超时时间
timeout: 20s timeout: 10s
lettuce: lettuce:
pool: pool:
# 连接池中的最小空闲连接 # 连接池中的最小空闲连接
min-idle: 2 min-idle: 0
# 连接池中的最大空闲连接 # 连接池中的最大空闲连接
max-idle: 10 max-idle: 8
# 连接池的最大数据库连接数 # 连接池的最大数据库连接数
max-active: 20 max-active: 8
# #连接池最大阻塞等待时间(使用负值表示没有限制) # #连接池最大阻塞等待时间(使用负值表示没有限制)
max-wait: -1ms max-wait: -1ms
@@ -140,10 +140,10 @@ xss:
# 匹配链接 # 匹配链接
urlPatterns: /system/*,/monitor/*,/tool/* urlPatterns: /system/*,/monitor/*,/tool/*
#rocketmq: #rocketmq:
#name-server: 127.0.0.1:9876 #name-server: 127.0.0.1:9876
#producer: #producer:
#group: test #group: test
springdoc: springdoc:
api-docs: api-docs:
@@ -173,7 +173,7 @@ kangaroohy:
primary: default primary: default
config: config:
default: default:
endpoint: opc.tcp://127.0.0.1:49320 endpoint: opc.tcp://192.168.0.196:49320
security-policy: none security-policy: none
pool: pool:
max-idle: 5 max-idle: 5

View File

@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<configuration> <configuration>
<!-- 日志存放路径 --> <!-- 日志存放路径 -->
<property name="log.path" value="/usr/bin/l2dev/logs" /> <property name="log.path" value="/home/userroot/Application/dev/logs" />
<!-- 日志输出格式 --> <!-- 日志输出格式 -->
<property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" /> <property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />
@@ -20,7 +20,7 @@
<!-- 日志文件名格式 --> <!-- 日志文件名格式 -->
<fileNamePattern>${log.path}/sys-info.%d{yyyy-MM-dd}.log</fileNamePattern> <fileNamePattern>${log.path}/sys-info.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的历史 60天 --> <!-- 日志最大的历史 60天 -->
<maxHistory>7</maxHistory> <maxHistory>3</maxHistory>
</rollingPolicy> </rollingPolicy>
<encoder> <encoder>
<pattern>${log.pattern}</pattern> <pattern>${log.pattern}</pattern>

View File

@@ -111,7 +111,7 @@ public class SecurityConfig
.authorizeHttpRequests((requests) -> { .authorizeHttpRequests((requests) -> {
permitAllUrl.getUrls().forEach(url -> requests.antMatchers(url).permitAll()); permitAllUrl.getUrls().forEach(url -> requests.antMatchers(url).permitAll());
// 对于登录login 注册register 验证码captchaImage 允许匿名访问 // 对于登录login 注册register 验证码captchaImage 允许匿名访问
requests.antMatchers("/login", "/register", "/captchaImage", "/roller/**","/pdi/**","/pdo/**").permitAll() requests.antMatchers("/login", "/register", "/captchaImage", "/roller/**","/pdi/**","/pdo/**","/track/**","/business/**").permitAll()
// 静态资源,可匿名访问 // 静态资源,可匿名访问
.antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll() .antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll()
.antMatchers("/doc.html","/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/v3/api-docs/**", "/druid/**").permitAll() .antMatchers("/doc.html","/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/v3/api-docs/**", "/druid/**").permitAll()