fix:1、新增故障设备统计功能;2、浅货位增加具体位置提示;3、B1分配冷却区点位增加并发锁

This commit is contained in:
zhouz
2025-11-21 15:12:53 +08:00
parent 735fdba6e0
commit 185cad8bf5
33 changed files with 497 additions and 190 deletions

View File

@@ -1,9 +1,25 @@
package org.nl.b_lms.pdm.error.service;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import org.nl.b_lms.bst.ivt.shafttubeivt.service.dao.BstIvtShafttubeivt;
import org.nl.b_lms.pdm.error.model.DeviceFault;
import org.nl.common.domain.query.PageQuery;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Map;
@Service
public interface DeviceFaultService extends IService<DeviceFault> {
IPage<DeviceFault> queryAll(Map whereJson, PageQuery pageable);
void download(Map map, HttpServletResponse response) throws IOException;
}

View File

@@ -1,11 +1,57 @@
package org.nl.b_lms.pdm.error.service.impl;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSONObject;
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.pdm.error.model.DeviceFault;
import org.nl.b_lms.pdm.error.model.mapper.DeviceFaultMapper;
import org.nl.b_lms.pdm.error.service.DeviceFaultService;
import org.nl.common.domain.query.PageQuery;
import org.nl.modules.common.utils.FileUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
@Service
public class DeviceFaultServiceImpl extends ServiceImpl<DeviceFaultMapper, DeviceFault> implements DeviceFaultService {
@Autowired
private DeviceFaultMapper deviceFaultMapper;
@Override
public IPage<DeviceFault> queryAll(Map whereJson, PageQuery page) {
LambdaQueryWrapper<DeviceFault> lam = new LambdaQueryWrapper<>();
lam.eq(ObjectUtil.isNotEmpty(whereJson.get("device_code")), DeviceFault::getDeviceCode, whereJson.get("device_code"));
IPage<DeviceFault> pages = new Page<>(page.getPage() + 1, page.getSize());
deviceFaultMapper.selectPage(pages, lam);
return pages;
}
@Override
public void download(Map whereJson, HttpServletResponse response) throws IOException {
LambdaQueryWrapper<DeviceFault> lam = new LambdaQueryWrapper<>();
lam.eq(ObjectUtil.isNotEmpty(whereJson.get("device_code")), DeviceFault::getDeviceCode, whereJson.get("device_code"));
List<DeviceFault> deviceFaults = deviceFaultMapper.selectList(lam);
List<Map<String, Object>> list = new ArrayList<>();
deviceFaults.forEach(deviceFault -> {
Map<String, Object> map = new LinkedHashMap<>();
map.put("设备编码", deviceFault.getDeviceCode());
map.put("设备名称", deviceFault.getDeviceName());
map.put("故障编码", deviceFault.getErrorCode());
map.put("故障描述", deviceFault.getErrorMessage());
map.put("开始时间", deviceFault.getStartTime());
map.put("持续时长S", deviceFault.getDuration());
list.add(map);
});
FileUtil.downloadExcel(list, response);
}
}

View File

@@ -2,6 +2,7 @@ package org.nl.b_lms.pdm.screen.contorller;
import cn.dev33.satoken.annotation.SaIgnore;
import com.alibaba.fastjson.JSONArray;
import org.nl.b_lms.pdm.error.model.DeviceFault;
import org.nl.b_lms.pdm.screen.store.InMemoryStore;
import org.nl.b_lms.sch.task.dao.SchBaseTask;
import org.springframework.http.MediaType;
@@ -23,7 +24,7 @@ public class FaultController {
@GetMapping
@SaIgnore
public JSONArray getFaults(@RequestParam(required = false) Integer limit) {
public List<DeviceFault> getFaults(@RequestParam(required = false) Integer limit) throws InterruptedException {
return store.findFaults();
}
}

View File

@@ -1,35 +0,0 @@
package org.nl.b_lms.pdm.screen.model;
public class Fault {
private Long id;
private String deviceId;
private String deviceType;
private String faultContent;
private Long occurTs;
private String severity; // info/warn/error
public Fault() {}
public Fault(Long id, String deviceId, String deviceType, String faultContent, Long occurTs, String severity) {
this.id = id; this.deviceId = deviceId; this.deviceType = deviceType; this.faultContent = faultContent;
this.occurTs = occurTs; this.severity = severity;
}
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
public String getDeviceId() { return deviceId; }
public void setDeviceId(String deviceId) { this.deviceId = deviceId; }
public String getDeviceType() { return deviceType; }
public void setDeviceType(String deviceType) { this.deviceType = deviceType; }
public String getFaultContent() { return faultContent; }
public void setFaultContent(String faultContent) { this.faultContent = faultContent; }
public Long getOccurTs() { return occurTs; }
public void setOccurTs(Long occurTs) { this.occurTs = occurTs; }
public String getSeverity() { return severity; }
public void setSeverity(String severity) { this.severity = severity; }
}

View File

@@ -1,53 +0,0 @@
package org.nl.b_lms.pdm.screen.model;
public class ScreenTask {
private Long id;
private String name;
private String type; // AGV搬运/堆垛机操作
private String status; // pending, running, completed, failed, paused
private String priority; // high/medium/low
private Integer progress; // 0-100
private String startLocation;
private String endLocation;
private String creator;
private Long createTs; // epoch millis
private String description;
public ScreenTask() {}
public ScreenTask(Long id, String name, String type, String status, String priority, Integer progress,
String startLocation, String endLocation, String creator, Long createTs, String description) {
this.id = id; this.name = name; this.type = type; this.status = status; this.priority = priority;
this.progress = progress; this.startLocation = startLocation; this.endLocation = endLocation;
this.creator = creator; this.createTs = createTs; this.description = description;
}
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public String getType() { return type; }
public void setType(String type) { this.type = type; }
public String getStatus() { return status; }
public void setStatus(String status) { this.status = status; }
public String getPriority() { return priority; }
public void setPriority(String priority) { this.priority = priority; }
public Integer getProgress() { return progress; }
public void setProgress(Integer progress) { this.progress = progress; }
public String getStartLocation() { return startLocation; }
public void setStartLocation(String startLocation) { this.startLocation = startLocation; }
public String getEndLocation() { return endLocation; }
public void setEndLocation(String endLocation) { this.endLocation = endLocation; }
public String getCreator() { return creator; }
public void setCreator(String creator) { this.creator = creator; }
public Long getCreateTs() { return createTs; }
public void setCreateTs(Long createTs) { this.createTs = createTs; }
public String getDescription() { return description; }
public void setDescription(String description) { this.description = description; }
}

View File

@@ -1,6 +1,7 @@
package org.nl.b_lms.pdm.screen.see;
import com.alibaba.fastjson.JSONArray;
import org.nl.b_lms.pdm.error.model.DeviceFault;
import org.nl.b_lms.pdm.screen.store.InMemoryStore;
import org.nl.b_lms.sch.task.dao.SchBaseTask;
import org.springframework.stereotype.Component;
@@ -42,7 +43,7 @@ public class SseBroadcaster {
}
public void pushFaultsSnapshot() {
JSONArray snapshot = store.findFaults();
List<DeviceFault> snapshot = store.findFaults();
pushFaults(snapshot);
}
@@ -57,7 +58,7 @@ public class SseBroadcaster {
}
}
public void pushFaults(JSONArray faults) {
public void pushFaults(List<DeviceFault> faults) {
if (faultEmitters.isEmpty()) return;
for (SseEmitter emitter : faultEmitters) {
try {

View File

@@ -5,10 +5,14 @@ import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.nl.b_lms.pdm.screen.see.SseBroadcaster;
import org.nl.config.thread.AsyncTaskExecutePool;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
import org.springframework.transaction.support.TransactionSynchronization;
import org.springframework.transaction.support.TransactionSynchronizationManager;
import java.util.concurrent.Executor;
import java.util.concurrent.locks.ReentrantLock;
/**
@@ -22,6 +26,10 @@ import java.util.concurrent.locks.ReentrantLock;
public class TaskUpdateBroadcastAspect {
private final SseBroadcaster broadcaster;
@Autowired
@Qualifier("pushExecutor")
private Executor pushExecutor;
// 非阻塞并发保护:同一时刻仅允许一次推送执行,其他并发调用直接跳过
private final ReentrantLock pushLock = new ReentrantLock();
@@ -71,10 +79,10 @@ public class TaskUpdateBroadcastAspect {
if (TransactionSynchronizationManager.isSynchronizationActive()) {
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
@Override
public void afterCommit() { doPushGuarded.run(); }
public void afterCommit() { pushExecutor.execute(doPushGuarded); }
});
} else {
doPushGuarded.run();
pushExecutor.execute(doPushGuarded);
}
}
}

View File

@@ -5,10 +5,12 @@ import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.extern.slf4j.Slf4j;
import org.nl.b_lms.pdm.error.model.DeviceFault;
import org.nl.b_lms.sch.task.dao.SchBaseTask;
import org.nl.b_lms.sch.task.service.IschBaseTaskService;
import org.nl.modules.wql.core.bean.WQLObject;
import org.nl.modules.wql.util.SpringContextHolder;
import org.nl.wms.basedata.master.service.FaultDeviceService;
import org.nl.wms.ext.acs.service.impl.WmsToAcsServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@@ -24,6 +26,9 @@ public class InMemoryStore {
@Autowired
private IschBaseTaskService ischBaseTaskService;
@Autowired
private FaultDeviceService faultDeviceService;
public List<SchBaseTask> findTasks() {
List<String> targetType = Arrays.asList(
"010702", "010703", "010704", "010706", "010710", "010712", "010714", "010715",
@@ -48,25 +53,10 @@ public class InMemoryStore {
}
public JSONArray findFaults() {
public List<DeviceFault> findFaults() {
JSONArray blk_rows = WQLObject.getWQLObject("em_bi_monitordevice").query("product_area = 'BLK' AND is_crux = '1' AND region_code IN ('RK','NBJ','DDJ')").getResultJSONArray(0);
List<String> blkList = new ArrayList<>();
for (int i = 0; i < blk_rows.size(); i++) {
JSONObject row = blk_rows.getJSONObject(i);
blkList.add(row.getString("device_code"));
}
WmsToAcsServiceImpl bean = SpringContextHolder.getBean(WmsToAcsServiceImpl.class);
JSONObject result2;
try {
result2 = bean.getDeviceErrorInfo(blkList, "BLK");
} catch (Exception e) {
result2 = new JSONObject();
log.info(e.getMessage());
}
// 调用acs接口获取设备
JSONArray blk_data = result2.getJSONArray("data");
return ObjectUtil.isNotEmpty(blk_data) ? blk_data : new JSONArray();
List<DeviceFault> faults = faultDeviceService.filterErrorDevice(blk_rows);
return ObjectUtil.isNotEmpty(faults) ? faults : new ArrayList<>();
}
}

View File

@@ -460,9 +460,9 @@ public class PdmBiSubpackagerelationServiceImpl extends ServiceImpl<PdmBiSubpack
.eq("point_code1", 浅Attr.getString("struct_code"))
.lt("task_status", TaskStatusEnum.FINISHED.getCode()));
if (!CollectionUtils.isEmpty(list)) {
throw new BadRequestException("当前木箱所在货位" + boxAttr.getString("struct_code") + "对应浅货位存在任务" + 浅Attr.getString("task_code"));
throw new BadRequestException("当前木箱所在货位" + boxAttr.getString("struct_code") + "对应浅货位" + 浅Attr.getString("struct_code") + "存在任务" + 浅Attr.getString("task_code"));
}
throw new BadRequestException("当前木箱所在货位" + boxAttr.getString("struct_code") + "对应浅货位被锁定" + 浅Attr.getString("task_code"));
throw new BadRequestException("当前木箱所在货位" + boxAttr.getString("struct_code") + "对应浅货位" + 浅Attr.getString("struct_code") + "被锁定" + 浅Attr.getString("task_code"));
}
}
}

View File

@@ -16,9 +16,12 @@ import org.nl.modules.common.exception.BadRequestException;
import org.nl.modules.wql.WQL;
import org.nl.modules.wql.core.bean.WQLObject;
import org.nl.modules.wql.util.SpringContextHolder;
import org.nl.wms.basedata.st.service.StructattrService;
import org.nl.wms.basedata.st.service.dto.StructattrDto;
import org.nl.wms.sch.AcsTaskDto;
import org.nl.wms.sch.manage.AbstractAcsTask;
import org.nl.wms.sch.manage.TaskStatusEnum;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -35,6 +38,9 @@ import static org.nl.wms.util.TaskUtil.getRoutePlanCode;
public class TwoOutTask extends AbstractAcsTask {
private final String THIS_CLASS = TwoOutTask.class.getName();
@Autowired
private StructattrService structattrService;
@Override
public List<AcsTaskDto> addTask() {
/*
@@ -141,9 +147,19 @@ public class TwoOutTask extends AbstractAcsTask {
JSONObject jsonObject = WQL.getWO("OUT_TASK01").addParamMap(json)
.process().uniqueResult(0);
json.put("flag", "3");
JSONObject strJson = WQL.getWO("OUT_TASK01").addParamMap(json)
.process().uniqueResult(0);
if (ObjectUtil.isNotEmpty(jsonObject)) {
result.add(jsonObject);
} else {
if (strJson.getString("lock_type").equals(IOSEnum.LOCK_TYPE.code("出库锁"))){
JSONObject update_jo = new JSONObject();
update_jo.put("remark","下发深货位任务时,浅货位存在出库锁却不存在任务,暂时不下发!");
WQLObject.getWQLObject("SCH_BASE_Task").update(update_jo,"task_id = '" + json.getString("task_id") + "'");
continue;
}
json.put("zdepth",IOSEnum.IS_NOTANDYES.code(""));
}
}

View File

@@ -47,7 +47,7 @@ import java.util.stream.Collectors;
@Service()
@RequiredArgsConstructor
@Slf4j
@PushSseSnapshot(faults = false)
@PushSseSnapshot
public class DjqTask extends AbstractAcsTask {
@Resource
private IschBaseTaskService taskService;

View File

@@ -45,7 +45,7 @@ import java.util.stream.Collectors;
@Service()
@RequiredArgsConstructor
@Slf4j
@PushSseSnapshot(faults = false)
@PushSseSnapshot
public class DjqToKzjhcwTask extends AbstractAcsTask {

View File

@@ -41,7 +41,7 @@ import java.util.List;
@Service()
@RequiredArgsConstructor
@Slf4j
@PushSseSnapshot(faults = false)
@PushSseSnapshot
public class GzqTask extends AbstractAcsTask {

View File

@@ -41,7 +41,7 @@ import java.util.List;
@Service()
@RequiredArgsConstructor
@Slf4j
@PushSseSnapshot(faults = false)
@PushSseSnapshot
public class GzqToKzjhcwTask extends AbstractAcsTask {

View File

@@ -51,7 +51,7 @@ import java.util.stream.Stream;
@Service()
@RequiredArgsConstructor
@Slf4j
@PushSseSnapshot(faults = false)
@PushSseSnapshot
public class MzhcwTask extends AbstractAcsTask {
private final String THIS_CLASS = MzhcwTask.class.getName();

View File

@@ -41,7 +41,7 @@ import java.util.List;
@Service()
@RequiredArgsConstructor
@Slf4j
@PushSseSnapshot(faults = false)
@PushSseSnapshot
public class SendDjqKzjTask extends AbstractAcsTask {
@Resource
private IschBaseTaskService taskService;

View File

@@ -40,7 +40,7 @@ import java.util.List;
@Service()
@RequiredArgsConstructor
@Slf4j
@PushSseSnapshot(faults = false)
@PushSseSnapshot
public class SendGzqKzjTask extends AbstractAcsTask {
@Resource
private IschBaseTaskService taskService;

View File

@@ -40,7 +40,7 @@ import java.util.List;
@Service()
@RequiredArgsConstructor
@Slf4j
@PushSseSnapshot(faults = false)
@PushSseSnapshot
public class ShiftingTask extends AbstractAcsTask {
private final String THIS_CLASS = ShiftingTask.class.getName();

View File

@@ -41,7 +41,7 @@ import java.util.List;
@Service()
@RequiredArgsConstructor
@Slf4j
@PushSseSnapshot(faults = false)
@PushSseSnapshot
public class SsxDjwTask extends AbstractAcsTask {
private final String THIS_CLASS = SsxDjwTask.class.getName();

View File

@@ -52,7 +52,7 @@ import java.util.concurrent.TimeUnit;
*/
@Service()
@Slf4j
@PushSseSnapshot(faults = false)
@PushSseSnapshot
public class ZxDjwTask extends AbstractAcsTask {

View File

@@ -50,7 +50,7 @@ import java.util.List;
@Service()
@RequiredArgsConstructor
@Slf4j
@PushSseSnapshot(faults = false)
@PushSseSnapshot
public class ZxqTask extends AbstractAcsTask {
@Resource

View File

@@ -102,3 +102,35 @@
ENDSELECT
ENDQUERY
ENDIF
IF 输入.flag = "3"
QUERY
SELECT
attr.lock_type,
attr.struct_code
FROM
st_ivt_structattr
WHERE
and attr.sect_code = 'BZC01'
and attr.zdepth = '1'
OPTION 输入.row_num <> ""
attr.row_num = 输入.row_num
ENDOPTION
OPTION 输入.col_num <> ""
attr.col_num = 输入.col_num
ENDOPTION
OPTION 输入.layer_num <> ""
attr.layer_num = 输入.layer_num
ENDOPTION
OPTION 输入.block_num <> ""
attr.block_num = 输入.block_num
ENDOPTION
ENDSELECT
ENDQUERY
ENDIF

View File

@@ -18,6 +18,7 @@ import org.nl.b_lms.sch.point.dao.SchBasePoint;
import org.nl.b_lms.sch.point.service.IschBasePointService;
import org.nl.b_lms.sch.task.dao.SchBaseTask;
import org.nl.b_lms.sch.task.service.IschBaseTaskService;
import org.nl.b_lms.sch.tasks.TwoExceptionInTask;
import org.nl.b_lms.sch.tasks.TwoInBoxTask;
import org.nl.b_lms.sch.tasks.TwoInBoxTrussTask;
import org.nl.b_lms.storage_manage.database.service.IBstIvtBoxinfoService;
@@ -145,7 +146,30 @@ public class InBoxManageServiceImpl implements InBoxManageService {
}
String pcsn = vehicle_ext.getString("pcsn");
if (ObjectUtil.isNotEmpty(pcsn)){
throw new BadRequestException("托盘【"+whereJson.getString("vehicle_code")+"】已经绑定了木箱【"+pcsn+"】,请进行核实!");
//更新子卷入库备注信息
JSONObject jsonTaskParam = new JSONObject();
//创建异常任务去异常入库口
//入库口
jsonTaskParam.put("point_code1", whereJson.getString("device_code"));
//异常位
jsonTaskParam.put("point_code2", "RK1003");
jsonTaskParam.put("vehicle_code", boxNo);
jsonTaskParam.put("vehicle_code2", whereJson.getString("vehicle_code"));
JSONObject request_param = new JSONObject();
if (whereJson.getString("vehicle_code").startsWith("A")) {
request_param.put("containerType", "2");
} else if (whereJson.getString("vehicle_code").startsWith("B")) {
request_param.put("containerType", "1");
} else {
throw new BadRequestException("托盘号有误,无法找到对应的托盘类型!");
}
jsonTaskParam.put("request_param", request_param);
TwoExceptionInTask bean = SpringContextHolder.getBean(TwoExceptionInTask.class);
bean.createTask(jsonTaskParam);
bean.immediateNotifyAcs(null);
return;
//throw new BadRequestException("托盘【"+whereJson.getString("vehicle_code")+"】已经绑定了木箱【"+pcsn+"】,请进行核实!");
}
}

View File

@@ -45,6 +45,7 @@ public class AsyncTaskExecutePool implements AsyncConfigurer {
}
@Override
@Bean("pushExecutor")
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
//核心线程池大小

View File

@@ -76,10 +76,15 @@ public class FaultDeviceController {
@GetMapping("/getAllerrorDevice")
@Log("查询所有设备故障")
public ResponseEntity<Object> getAllerrorDevice(@RequestParam Map whereJson, Pageable page) {
return new ResponseEntity<>(faultDeviceService.getAllerrorDevice(whereJson, page), HttpStatus.OK);
}
@GetMapping("/getErrorDeviceInfo")
@Log("查询所有设备故障")
public ResponseEntity<Object> getErrorDeviceInfo(@RequestBody JSONObject jsonObject) {
return new ResponseEntity<>(faultDeviceService.getErrorDeviceInfo(jsonObject), HttpStatus.OK);
}
}

View File

@@ -1,6 +1,8 @@
package org.nl.wms.basedata.master.service;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.nl.b_lms.pdm.error.model.DeviceFault;
import org.nl.wms.basedata.master.service.dto.CustomerbaseDto;
import org.springframework.data.domain.Pageable;
@@ -91,4 +93,8 @@ public interface FaultDeviceService {
* @return Map<String, Object>
*/
Map<String, Object> getAllerrorDevice(Map whereJson, Pageable page);
List<DeviceFault> getErrorDeviceInfo(JSONObject whereJson);
List<DeviceFault> filterErrorDevice(JSONArray rows);
}

View File

@@ -3,6 +3,8 @@ package org.nl.wms.basedata.master.service.impl;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.map.MapUtil;
import org.nl.b_lms.pdm.error.model.DeviceFault;
import org.nl.b_lms.pdm.error.service.FaultManager;
import org.nl.common.utils.IdUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
@@ -24,14 +26,14 @@ import org.nl.wms.basedata.master.service.FaultDeviceService;
import org.nl.wms.basedata.master.service.dto.CustomerbaseDto;
import org.nl.wms.basedata.st.service.UserDeviceService;
import org.nl.wms.ext.acs.service.impl.WmsToAcsServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.swing.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
/**
* @author liuxy
@@ -43,6 +45,9 @@ import java.util.Map;
@Slf4j
public class FaultDeviceServiceImpl implements FaultDeviceService {
@Autowired
private FaultManager faultManager;
@Override
public Map<String, Object> queryAll(Map whereJson, Pageable page) {
String fault_code = MapUtil.getStr(whereJson, "fault_code");
@@ -348,7 +353,7 @@ public class FaultDeviceServiceImpl implements FaultDeviceService {
b1List.add(row.getString("device_code"));
}
JSONObject result = bean.getDeviceErrorInfo(b1List,"B1");
JSONObject result = bean.getDeviceErrorInfo(b1List, "B1");
// 调用acs接口获取设备
JSONArray b1_data = result.getJSONArray("data");
@@ -359,7 +364,7 @@ public class FaultDeviceServiceImpl implements FaultDeviceService {
blkList.add(row.getString("device_code"));
}
JSONObject result2 = bean.getDeviceErrorInfo(blkList,"BLK");
JSONObject result2 = bean.getDeviceErrorInfo(blkList, "BLK");
// 调用acs接口获取设备
JSONArray blk_data = result2.getJSONArray("data");
@@ -389,7 +394,7 @@ public class FaultDeviceServiceImpl implements FaultDeviceService {
}
}
//查询内包间套轴对接位的异常
if (inArea.contains("CBJ") && (StrUtil.isEmpty(region_code) || region_code.equals("CBJ")) ) {
if (inArea.contains("CBJ") && (StrUtil.isEmpty(region_code) || region_code.equals("CBJ"))) {
IBstIvtCutpointivtService bean2 = SpringContextHolder.getBean(IBstIvtCutpointivtService.class);
List<BstIvtCutpointivt> list = bean2.list(new LambdaQueryWrapper<BstIvtCutpointivt>()
.eq(BstIvtCutpointivt::getPoint_type, "1")
@@ -411,4 +416,67 @@ public class FaultDeviceServiceImpl implements FaultDeviceService {
json.put("content", data);
return json;
}
@Override
public List<DeviceFault> getErrorDeviceInfo(JSONObject whereJson) {
WmsToAcsServiceImpl bean = SpringContextHolder.getBean(WmsToAcsServiceImpl.class);
//查询当前人员对应的设备是多少
JSONArray b1_rows = WQLObject.getWQLObject("em_bi_monitordevice").query("product_area = 'B1' AND is_crux = '1'").getResultJSONArray(0);
List<String> b1List = new ArrayList<>();
for (int i = 0; i < b1_rows.size(); i++) {
JSONObject row = b1_rows.getJSONObject(i);
b1List.add(row.getString("device_code"));
}
JSONObject result = bean.getDeviceErrorInfo(b1List, "B1");
// 调用acs接口获取设备
JSONArray b1_data = result.getJSONArray("data");
JSONArray blk_rows = WQLObject.getWQLObject("em_bi_monitordevice").query("product_area = 'BLK' AND is_crux = '1'").getResultJSONArray(0);
List<String> blkList = new ArrayList<>();
for (int i = 0; i < blk_rows.size(); i++) {
JSONObject row = blk_rows.getJSONObject(i);
blkList.add(row.getString("device_code"));
}
JSONObject result2 = bean.getDeviceErrorInfo(blkList, "BLK");
// 调用acs接口获取设备
JSONArray blk_data = result2.getJSONArray("data");
b1_data.addAll(blk_data);
List<DeviceFault> deviceFaultList = new ArrayList<>();
for (int i = 0; i < b1_data.size(); i++) {
JSONObject row = b1_data.getJSONObject(i);
DeviceFault deviceFault = new DeviceFault();
deviceFault.setDeviceCode(row.getString("device_code"));
deviceFault.setDeviceName(row.getString("device_name"));
deviceFault.setErrorCode(row.getString("error_code"));
deviceFault.setErrorMessage(row.getString("error_message"));
deviceFaultList.add(deviceFault);
}
for (int i = 0; i < blk_data.size(); i++) {
JSONObject row = blk_data.getJSONObject(i);
DeviceFault deviceFault = new DeviceFault();
deviceFault.setDeviceCode(row.getString("device_code"));
deviceFault.setDeviceName(row.getString("device_name"));
deviceFault.setErrorCode(row.getString("error_code"));
deviceFault.setErrorMessage(row.getString("error_message"));
deviceFaultList.add(deviceFault);
}
return deviceFaultList;
}
public List<DeviceFault> filterErrorDevice(JSONArray rows) {
ConcurrentHashMap<String, DeviceFault> memory = faultManager.memory;
List<DeviceFault> list = new ArrayList<>();
Set<String> memKeys = new HashSet<>(memory.keySet());
for (int i = 0; i < rows.size(); i++) {
JSONObject jsonObject = rows.getJSONObject(i);
if (memKeys.contains(jsonObject.getString("device_code"))) {
list.add(memory.get(jsonObject.getString("device_code")));
}
}
return list;
}
}

View File

@@ -3,6 +3,7 @@ package org.nl.wms.pda.mps.rest;
import cn.dev33.satoken.annotation.SaIgnore;
import com.alibaba.fastjson.JSONObject;
import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.nl.modules.logging.annotation.Log;
import org.nl.wms.pda.mps.service.BakingService;
@@ -26,7 +27,8 @@ public class BakingController {
@PostMapping("/ovenInAndOut")
@Log("烘箱出入")
@SaIgnore
@SaIgnore
@SneakyThrows
public ResponseEntity<Object> queryRawFoil(@RequestBody JSONObject whereJson) {
return new ResponseEntity<>(bakingService.ovenInAndOut(whereJson), HttpStatus.OK);
}

View File

@@ -10,7 +10,7 @@ public interface BakingService {
* @param whereJson /
* @return JSONObject
*/
JSONObject ovenInAndOut(JSONObject whereJson);
JSONObject ovenInAndOut(JSONObject whereJson) throws InterruptedException;
/**
* 入冷却

View File

@@ -27,10 +27,14 @@ import org.nl.wms.sch.tasks.CutConveyorTask;
import org.nl.wms.sch.tasks.InCoolIvtTask;
import org.nl.wms.sch.tasks.InHotTask;
import org.nl.wms.sch.tasks.OutHotTask;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.concurrent.TimeUnit;
@Service
@RequiredArgsConstructor
@Slf4j
@@ -39,6 +43,9 @@ public class BakingServiceImpl implements BakingService {
@Autowired
private RedisUtils redisUtils;
@Autowired
private RedissonClient redissonClient;
/*
* 业务流程:
* 入烤箱:
@@ -56,7 +63,7 @@ public class BakingServiceImpl implements BakingService {
*/
@Override
@Transactional(rollbackFor = Exception.class)
public JSONObject ovenInAndOut(JSONObject whereJson) {
public JSONObject ovenInAndOut(JSONObject whereJson) throws InterruptedException {
String option = whereJson.getString("option"); // 1-入箱 2-出箱
@@ -413,62 +420,74 @@ public class BakingServiceImpl implements BakingService {
//判断区域是否属于B1B1的出烘箱流程出到对应的半成品区
if ("B1".equals(product_area)) {
JSONObject jsonRaw = rawTab.query("container_name = '" + jsonHotIvt.getString("container_name") + "' and is_delete = '0'").uniqueResult(0);
if (ObjectUtil.isEmpty(jsonRaw)) {
throw new BadRequestException("未查询到母卷号:" + jsonHotIvt.getString("container_name") + "对应的生箔工单!");
}
JSONObject jsonMater = materTab.query("material_code = '" + jsonRaw.getString("product_name") + "'").uniqueResult(0);
if (ObjectUtil.isEmpty(jsonMater)) {
throw new BadRequestException("物料基础信息中无此物料");
}
RLock lock = redissonClient.getLock("AutoIntoHotCacheTask");
boolean tryLock = lock.tryLock(0, TimeUnit.SECONDS);
try {
if (tryLock) {
JSONObject jsonRaw = rawTab.query("container_name = '" + jsonHotIvt.getString("container_name") + "' and is_delete = '0'").uniqueResult(0);
if (ObjectUtil.isEmpty(jsonRaw)) {
throw new BadRequestException("未查询到母卷号:" + jsonHotIvt.getString("container_name") + "对应的生箔工单");
}
JSONObject jsonMater = materTab.query("material_code = '" + jsonRaw.getString("product_name") + "'").uniqueResult(0);
if (ObjectUtil.isEmpty(jsonMater)) {
throw new BadRequestException("物料基础信息中无此物料!");
}
//查询当前点位为空且没有任务的桁架内缓存点
JSONObject cache_param = new JSONObject();
cache_param.put("flag", "4");
cache_param.put("point_location", jsonHotIvt.getString("point_location"));
cache_param.put("product_area", jsonHotIvt.getString("product_area"));
JSONObject cache_jo = WQL.getWO("PDA_COOLIN").addParamMap(cache_param).process().uniqueResult(0);
if (ObjectUtil.isEmpty(cache_jo)) {
throw new BadRequestException("桁架范围内没有可用的空点位,请检查库存!");
//查询当前点位为空且没有任务的桁架内缓存点
JSONObject cache_param = new JSONObject();
cache_param.put("flag", "4");
cache_param.put("point_location", jsonHotIvt.getString("point_location"));
cache_param.put("product_area", jsonHotIvt.getString("product_area"));
JSONObject cache_jo = WQL.getWO("PDA_COOLIN").addParamMap(cache_param).process().uniqueResult(0);
if (ObjectUtil.isEmpty(cache_jo)) {
throw new BadRequestException("桁架范围内没有可用的空点位,请检查库存!");
}
// 3.创建任务
JSONObject param = new JSONObject();
param.put("point_code1", point_code1);
param.put("point_code2", cache_jo.getString("point_code"));
param.put("material_code", jsonHotIvt.getString("container_name"));
param.put("product_area", jsonHotIvt.getString("product_area"));
OutHotTask outHotTask = new OutHotTask();
String task_id = outHotTask.createTask(param);
//查询该母卷对应最近的一条入烘箱记录
JSONObject last_hot_mst = WQLObject.getWQLObject("ST_IVT_HotRegionIOMst").query("container_name = '" + jsonHotIvt.getString("container_name") + "' AND io_type = '0' order by confirm_time desc").uniqueResult(0);
JSONObject hotParam = new JSONObject();
hotParam.put("container_name", jsonRaw.getString("container_name"));
hotParam.put("workorder_id", jsonRaw.getString("workorder_id"));
hotParam.put("material_id", jsonMater.getString("material_id"));
hotParam.put("qty", jsonRaw.get("qty"));
hotParam.put("io_type", "1");
hotParam.put("qty_unit_id", jsonMater.getString("base_unit_id"));
hotParam.put("task_id", task_id);
hotParam.put("start_point_code", point_code1);
hotParam.put("end_point_code", cache_jo.getString("point_code"));
boolean exists = redisUtils.hHasKey(point_code1, "temperature");
String point_temperature = "";
if (exists) {
point_temperature = (String) redisUtils.hget(point_code1, "temperature");
} else {
throw new BadRequestException("当前操作点位设备:" + point_code1 + ",无法获取温度,请稍后再试!");
}
hotParam.put("temperature", point_temperature);
if (ObjectUtil.isEmpty(last_hot_mst)) {
hotParam.put("oven_time", "480");
} else {
hotParam.put("oven_time", last_hot_mst.getString("oven_time"));
}
this.createHotIoMst(hotParam);
} else {
throw new BadRequestException("当前其他任务正在分配冷却站点,为避免重复分配请稍后再试!");
}
} finally {
if (lock.isLocked() && lock.isHeldByCurrentThread()) {
lock.unlock();
}
}
// 3.创建任务
JSONObject param = new JSONObject();
param.put("point_code1", point_code1);
param.put("point_code2", cache_jo.getString("point_code"));
param.put("material_code", jsonHotIvt.getString("container_name"));
param.put("product_area", jsonHotIvt.getString("product_area"));
OutHotTask outHotTask = new OutHotTask();
String task_id = outHotTask.createTask(param);
//查询该母卷对应最近的一条入烘箱记录
JSONObject last_hot_mst = WQLObject.getWQLObject("ST_IVT_HotRegionIOMst").query("container_name = '" + jsonHotIvt.getString("container_name") + "' AND io_type = '0' order by confirm_time desc").uniqueResult(0);
JSONObject hotParam = new JSONObject();
hotParam.put("container_name", jsonRaw.getString("container_name"));
hotParam.put("workorder_id", jsonRaw.getString("workorder_id"));
hotParam.put("material_id", jsonMater.getString("material_id"));
hotParam.put("qty", jsonRaw.get("qty"));
hotParam.put("io_type", "1");
hotParam.put("qty_unit_id", jsonMater.getString("base_unit_id"));
hotParam.put("task_id", task_id);
hotParam.put("start_point_code", point_code1);
hotParam.put("end_point_code", cache_jo.getString("point_code"));
boolean exists = redisUtils.hHasKey(point_code1, "temperature");
String point_temperature = "";
if (exists) {
point_temperature = (String) redisUtils.hget(point_code1, "temperature");
} else {
throw new BadRequestException("当前操作点位设备:" + point_code1 + ",无法获取温度,请稍后再试!");
}
hotParam.put("temperature", point_temperature);
if (ObjectUtil.isEmpty(last_hot_mst)) {
hotParam.put("oven_time", "480");
} else {
hotParam.put("oven_time", last_hot_mst.getString("oven_time"));
}
this.createHotIoMst(hotParam);
} else {
// 出烘箱,创建桁架任务到对接位
if (!in_area_id.contains(product_area)) {

View File

@@ -39,7 +39,7 @@ public class AutoIntoHotCacheTask {
@SneakyThrows
public void run() {
log.info("定时对B1入暂存....");
RLock lock = redissonClient.getLock(THIS_CLASS);
RLock lock = redissonClient.getLock("AutoIntoHotCacheTask");
boolean tryLock = lock.tryLock(0, TimeUnit.SECONDS);
try {
if (tryLock) {

View File

@@ -0,0 +1,35 @@
import request from '@/utils/request'
export function add(data) {
return request({
url: 'api/bstIvtShafttubeivt',
method: 'post',
data
})
}
export function del(ids) {
return request({
url: 'api/bstIvtShafttubeivt/',
method: 'delete',
data: ids
})
}
export function edit(data) {
return request({
url: 'api/bstIvtShafttubeivt',
method: 'put',
data
})
}
export function setHaveShaft(data) {
return request({
url: 'api/bstIvtShafttubeivt/setHaveShaft',
method: 'post',
data
})
}
export default { add, edit, del, setHaveShaft }

View File

@@ -0,0 +1,125 @@
<template>
<div class="app-container">
<!--工具栏-->
<div class="head-container">
<div v-if="crud.props.searchToggle">
<el-form
:inline="true"
class="demo-form-inline"
label-position="right"
label-width="90px"
label-suffix=":"
>
<el-form-item label="设备编码">
<el-input
v-model="query.device_code"
clearable
placeholder="输入设备编码"
class="filter-item"
@keyup.enter.native="crud.toQuery"
/>
</el-form-item>
<rrOperation />
</el-form>
</div>
<!--如果想在工具栏加入更多按钮可以使用插槽方式 slot = 'left' or 'right'-->
<crudOperation :permission="permission">
<el-button
slot="right"
class="filter-item"
type="success"
icon="el-icon-check"
size="mini"
:loading="showDtlLoading"
@click="downdtl"
>
导出Excel
</el-button>
</crudOperation>
<!--表单组件-->
<!--表格渲染-->
<el-table ref="table" v-loading="crud.loading" :data="crud.data" size="mini" style="width: 100%;" @selection-change="crud.selectionChangeHandler">
<el-table-column type="selection" width="55" />
<el-table-column prop="deviceCode" label="设备编码" :min-width="flexWidth('deviceCode',crud.data,'设备编码')" />
<el-table-column prop="deviceName" label="设备名称" :min-width="flexWidth('deviceName',crud.data,'设备名称')" />
<el-table-column prop="errorCode" label="故障编码" :min-width="flexWidth('errorCode',crud.data,'故障编码')" />
<el-table-column prop="errorMessage" label="故障描述" :min-width="flexWidth('errorMessage',crud.data,'故障描述')" />
<el-table-column prop="startTime" label="开始时间" :min-width="flexWidth('startTime',crud.data,'开始时间')" />
<el-table-column prop="duration" label="持续时长S" :min-width="flexWidth('duration',crud.data,'持续时长S')" />
</el-table>
<!--分页组件-->
<pagination />
</div>
</div>
</template>
<script>
import crudBstIvtShafttubeivt from './bstIvtShafttubeivt'
import CRUD, { crud, form, header, presenter } from '@crud/crud'
import rrOperation from '@crud/RR.operation.vue'
import crudOperation from '@crud/CRUD.operation.vue'
import udOperation from '@crud/UD.operation.vue'
import pagination from '@crud/Pagination.vue'
import { download } from '@/api/data'
import { downloadFile } from '@/utils'
const defaultForm = {
device_code: null,
device_name: null,
error_code: null,
error_message: null,
start_time: null,
duration: null
}
export default {
name: 'DeviceFault',
components: { pagination, crudOperation, rrOperation, udOperation },
mixins: [presenter(), header(), form(defaultForm), crud()],
showDtlLoading: false,
cruds() {
return CRUD({
title: '穿拔轴区点位库存管理',
url: '/api/deviceFault',
idField: 'id',
sort: 'id,desc',
crudMethod: { ...crudBstIvtShafttubeivt },
optShow: {
add: false,
edit: false,
del: false,
download: false,
reset: true
}
})
},
data() {
return {
permission: {},
rules: {}
}
},
methods: {
// 钩子在获取表格数据之前执行false 则代表不获取数据
[CRUD.HOOK.beforeRefresh]() {
return true
},
hand(value) {
this.crud.toQuery()
},
downdtl() {
this.showDtlLoading = true
download('/api/deviceFault/download', this.crud.query).then(result => {
debugger
downloadFile(result, '设备故障统计', 'xlsx')
this.showDtlLoading = false
}).catch(() => {
this.showDtlLoading = false
})
}
}
}
</script>
<style scoped>
</style>