kkk-ops 2 months ago
commit 4248828933

@ -96,8 +96,8 @@ public class DeviceController {
@Operation(summary = "获得物联设备分页")
@PreAuthorize("@ss.hasPermission('iot:device:query')")
public CommonResult<PageResult<DeviceRespVO>> getDevicePage(@Valid DevicePageReqVO pageReqVO) {
PageResult<DeviceDO> pageResult = deviceService.getDevicePage(pageReqVO);
return success(BeanUtils.toBean(pageResult, DeviceRespVO.class));
PageResult<DeviceRespVO> pageResult = deviceService.getDevicePage(pageReqVO);
return success(pageResult);
}
@GetMapping("/export-excel")
@ -107,17 +107,16 @@ public class DeviceController {
public void exportDeviceExcel(@Valid DevicePageReqVO pageReqVO,
HttpServletResponse response) throws IOException {
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<DeviceDO> list = deviceService.getDevicePage(pageReqVO).getList();
List<DeviceRespVO> list = deviceService.getDevicePage(pageReqVO).getList();
// 导出 Excel
ExcelUtils.write(response, "物联设备.xls", "数据", DeviceRespVO.class,
BeanUtils.toBean(list, DeviceRespVO.class));
ExcelUtils.write(response, "物联设备.xls", "数据", DeviceRespVO.class,list);
}
@GetMapping("/deviceList")
@PreAuthorize("@ss.hasPermission('iot:device:query')")
public CommonResult<List<DeviceDO>> deviceList(@Valid DevicePageReqVO pageReqVO) {
public CommonResult<List<DeviceRespVO>> deviceList(@Valid DevicePageReqVO pageReqVO) {
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<DeviceDO> list = deviceService.getDevicePage(pageReqVO).getList();
return success(BeanUtils.toBean(list, DeviceDO.class));
List<DeviceRespVO> list = deviceService.getDevicePage(pageReqVO).getList();
return success(list);
}
@PostMapping("/connect")
@ -173,6 +172,16 @@ public class DeviceController {
}
@GetMapping("/getDeviceOperationalStatus")
@Operation(summary = "获取首页设备运行状态")
@PreAuthorize("@ss.hasPermission('iot:device:query')")
public CommonResult<DeviceOperationStatusRespVO> getDeviceOperationalStatus() throws JsonProcessingException {
DeviceOperationStatusRespVO deviceOperationalStatus=deviceService.getDeviceOperationalStatus();
return success(deviceOperationalStatus);
}
// ==================== 子表(设备属性) ====================
@GetMapping("/device-attribute/page")

@ -0,0 +1,78 @@
package cn.iocoder.yudao.module.iot.controller.admin.device.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
*
*/
@Getter
@AllArgsConstructor
public enum DeviceBasicStatusEnum {
/**
*
*/
RUNNING("1", "运行", "RUNNING"),
/**
*
*/
ALARM("2", "报警", "ALARM");
/**
*
*/
private final String code;
/**
*
*/
private final String name;
/**
*
*/
private final String description;
/**
*
*/
public static DeviceBasicStatusEnum getByCode(Integer code) {
if (code == null) {
return null;
}
for (DeviceBasicStatusEnum status : values()) {
if (status.getCode().equals(code)) {
return status;
}
}
return null;
}
/**
*
*/
public static DeviceBasicStatusEnum getByDescription(String description) {
if (description == null || description.trim().isEmpty()) {
return null;
}
for (DeviceBasicStatusEnum status : values()) {
if (status.getDescription().equalsIgnoreCase(description.trim())) {
return status;
}
}
return null;
}
/**
*
*/
public static boolean isValidCode(Integer code) {
return getByCode(code) != null;
}
@Override
public String toString() {
return this.name;
}
}

@ -0,0 +1,72 @@
package cn.iocoder.yudao.module.iot.controller.admin.device.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
*
*/
@Getter
@AllArgsConstructor
public enum DeviceStatusEnum {
/**
* 线
*/
OFFLINE("0", "离线", "设备离线"),
/**
*
*/
RUNNING("1", "运行", "设备正常运行"),
/**
*
*/
STANDBY("2", "待机中", "设备待机,无故障"),
/**
*
*/
FAULT_STANDBY("3", "故障中", "设备故障且处于待机状态"),
/**
*
*/
ALARM_RUNNING("4", "报警中", "设备故障但仍在运行");
/**
*
*/
private final String code;
/**
*
*/
private final String name;
/**
*
*/
private final String description;
/**
*
*/
public static DeviceStatusEnum getByCode(String code) {
if (code == null) {
return null;
}
for (DeviceStatusEnum status : values()) {
if (status.getCode().equals(code)) {
return status;
}
}
return null;
}
}

@ -2,16 +2,27 @@
package cn.iocoder.yudao.module.iot.controller.admin.device.scheduled.coretask;
import cn.iocoder.yudao.framework.common.util.opc.OpcUtils;
import cn.iocoder.yudao.module.iot.controller.admin.device.enums.DeviceBasicStatusEnum;
import cn.iocoder.yudao.module.iot.controller.admin.device.enums.DeviceStatusEnum;
import cn.iocoder.yudao.module.iot.controller.admin.device.enums.TaskTypeEnum;
import cn.iocoder.yudao.module.iot.controller.admin.device.scheduled.core.Task;
import cn.iocoder.yudao.module.iot.controller.admin.devicemodelrules.vo.PointRulesRespVO;
import cn.iocoder.yudao.module.iot.dal.dataobject.device.DeviceDO;
import cn.iocoder.yudao.module.iot.dal.dataobject.devicecontactmodel.DeviceContactModelDO;
import cn.iocoder.yudao.module.iot.dal.dataobject.deviceoperationrecord.DeviceOperationRecordDO;
import cn.iocoder.yudao.module.iot.dal.dataobject.devicepointrules.DevicePointRulesDO;
import cn.iocoder.yudao.module.iot.dal.mysql.device.DeviceMapper;
import cn.iocoder.yudao.module.iot.dal.mysql.devicecontactmodel.DeviceContactModelMapper;
import cn.iocoder.yudao.module.iot.dal.mysql.deviceoperationrecord.DeviceOperationRecordMapper;
import cn.iocoder.yudao.module.iot.dal.mysql.devicepointrules.DevicePointRulesMapper;
import cn.iocoder.yudao.module.iot.service.device.TDengineService;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.eclipse.milo.opcua.sdk.client.OpcUaClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
@ -21,6 +32,11 @@ import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
@Component
@Slf4j
@ -36,13 +52,51 @@ public class DeviceTask implements Task {
@Resource
private TDengineService tDengineService;
@Resource
private DevicePointRulesMapper devicePointRulesMapper;
@Resource
private DeviceOperationRecordMapper deviceOperationRecordMapper;
@Override
public String getTaskType() {
return TaskTypeEnum.DEVICE.getCode();
}
// static {
// // 定期清理过期连接
// ScheduledExecutorService cleanupExecutor = Executors.newSingleThreadScheduledExecutor();
// cleanupExecutor.scheduleAtFixedRate(DeviceTask::cleanupExpiredConnections,
// CLEANUP_INTERVAL, CLEANUP_INTERVAL, TimeUnit.MILLISECONDS);
// }
// // 会话信息
// private static class SessionInfo {
// long lastUsedTime;
// String deviceUrl;
// String username;
//
// SessionInfo(String deviceUrl, String username) {
// this.deviceUrl = deviceUrl;
// this.username = username;
// this.lastUsedTime = System.currentTimeMillis();
// }
//
// boolean isExpired() {
// return System.currentTimeMillis() - lastUsedTime > CONNECTION_TIMEOUT;
// }
//
// void updateLastUsed() {
// this.lastUsedTime = System.currentTimeMillis();
// }
// }
@Override
public void execute(Long taskId, String taskParam) {
Long deviceId = taskId - 1000000L;
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String currentTime = sdf.format(new Date());
@ -62,6 +116,9 @@ public class DeviceTask implements Task {
} catch (Exception e) {
logger.error("执行设备任务异常任务ID: {}", taskId, e);
} finally {
//确保出问题不会打满opcv服务器连接数
OpcUtils.disconnect();
}
}
@ -69,128 +126,560 @@ public class DeviceTask implements Task {
*
*/
private void executeDeviceLogic(Long sourceDeviceId, String param) {
logger.info("执行设备 {} 的具体逻辑,参数: {}", sourceDeviceId, param);
logger.info("执行设备逻辑源设备ID: {},参数: {}", sourceDeviceId, param);
// 1. 计算实际设备ID
Long deviceId = sourceDeviceId - 1000000L;
logger.info("处理后id{} ", deviceId );
logger.info("处理后设备ID: {}", deviceId);
// 1. 参数校验
if (deviceId == null){
logger.error("设备ID不能为空");
if (deviceId == null) {
throw new RuntimeException("设备ID不能为空");
}
// 2. 查询设备信息
DeviceDO deviceDO = deviceMapper.selectById(deviceId);
if (deviceDO == null) {
logger.error("设备不存在设备ID: {}", deviceId);
throw new RuntimeException("设备不存在设备ID: " + deviceId);
// 2. 获取设备信息
DeviceDO device = getDeviceInfo(deviceId);
// 3. 连接OPC服务器
connectOpcServer(device);
// 4. 处理数据读取和入库
processDeviceData(deviceId, device);
// 5. 断开连接
OpcUtils.disconnect();
}
/**
*
*/
// private void executeDeviceLogic(Long sourceDeviceId, String param) {
// logger.info("执行设备逻辑源设备ID: {},参数: {}", sourceDeviceId, param);
//
// // 1. 计算实际设备ID
// Long deviceId = sourceDeviceId - 1000000L;
// logger.info("处理后设备ID: {}", deviceId);
//
// if (deviceId == null) {
// throw new RuntimeException("设备ID不能为空");
// }
//
// // 2. 获取设备信息
// DeviceDO device = getDeviceInfo(deviceId);
//
// // 3. 连接OPC服务器
// connectOpcServer(device);
//
// // 4. 处理数据读取和入库
// processDeviceData(deviceId, device);
//
// // 5. 断开连接
// OpcUtils.disconnect();
// }
/**
*
*/
private DeviceDO getDeviceInfo(Long deviceId) {
DeviceDO device = deviceMapper.selectById(deviceId);
if (device == null) {
throw new RuntimeException("设备不存在ID: " + deviceId);
}
if (deviceDO.getUrl() == null || deviceDO.getUrl().trim().isEmpty()) {
logger.error("设备URL不能为空设备ID: {}", deviceId);
throw new RuntimeException("设备URL不能为空");
if (StringUtils.isBlank(device.getUrl())) {
throw new RuntimeException("设备URL不能为空ID: " + deviceId);
}
// 3. 连接OPC服务器
String username = deviceDO.getUsername() != null ? deviceDO.getUsername() : "";
String password = deviceDO.getPassword() != null ? deviceDO.getPassword() : "";
return device;
}
boolean connected = OpcUtils.connect(deviceDO.getUrl(), username, password, 10);
/**
* OPC
*/
private void connectOpcServer(DeviceDO device) {
String username = StringUtils.defaultString(device.getUsername());
String password = StringUtils.defaultString(device.getPassword());
boolean connected = OpcUtils.connect(device.getUrl(), username, password, 10);
if (!connected) {
logger.error("连接OPC服务器失败设备ID: {}URL: {}", deviceId, deviceDO.getUrl());
throw new RuntimeException("连接OPC服务器失败");
throw new RuntimeException("连接OPC服务器失败URL: " + device.getUrl());
}
}
// 4. 查询设备点位配置
LambdaQueryWrapper<DeviceContactModelDO> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(DeviceContactModelDO::getDeviceId, deviceId);
List<DeviceContactModelDO> deviceContactModelDOS = deviceContactModelMapper.selectList(queryWrapper);
// 5. 判断是否有点位数据
if (deviceContactModelDOS == null || deviceContactModelDOS.isEmpty()) {
logger.warn("设备 {} 没有配置数据点位,跳过数据读取", deviceId);
/**
*
*/
private void processDeviceData(Long deviceId, DeviceDO device) {
// 1. 查询点位配置
List<DeviceContactModelDO> points = getDevicePoints(deviceId);
if (CollectionUtils.isEmpty(points)) {
logger.warn("设备 {} 未配置点位", deviceId);
return;
}
logger.info("设备 {} 共有 {} 个点位需要读取", deviceId, deviceContactModelDOS.size());
logger.info("设备 {} 需要读取 {} 个点位", deviceId, points.size());
// 6. 读取OPC数据
// 2. 读取并处理数据
int successCount = 0;
List<DeviceContactModelDO> validDataList = new ArrayList<>();
for (DeviceContactModelDO deviceContactModelDO : deviceContactModelDOS) {
try {
// 判断点位地址是否有效
String address = deviceContactModelDO.getAddress();
if (address == null || address.trim().isEmpty()) {
logger.warn("点位ID {} 的地址为空,跳过", deviceContactModelDO.getId());
continue;
}
for (DeviceContactModelDO point : points) {
processSinglePoint(point, validDataList,device);
if (point.getAddressValue() != null) {
successCount++;
}
}
// 3. 入库处理
if (!validDataList.isEmpty()) {
saveToDatabase(deviceId, validDataList, successCount);
} else {
logger.warn("设备 {} 未读取到有效数据", deviceId);
}
}
/**
*
*/
private List<DeviceContactModelDO> getDevicePoints(Long deviceId) {
LambdaQueryWrapper<DeviceContactModelDO> query = new LambdaQueryWrapper<>();
query.eq(DeviceContactModelDO::getDeviceId, deviceId);
return deviceContactModelMapper.selectList(query);
}
/**
*
*/
private void processSinglePoint(DeviceContactModelDO point, List<DeviceContactModelDO> validDataList, DeviceDO device) {
try {
String address = StringUtils.trimToEmpty(point.getAddress());
if (address.isEmpty()) {
logger.warn("点位ID {} 地址为空", point.getId());
return;
}
Object value = OpcUtils.readValue(address);
// if (value == null) {
logger.warn("读取点位 {} ,地址: {}", point.getId(), address);
// } else {
String processedValue = processOpcValue(value);
//判断规则
judgmentRules(processedValue,point.getAttributeCode(),device,point.getId());
point.setAddressValue(processedValue.isEmpty() ? null : processedValue);
// }
validDataList.add(point);
} catch (Exception e) {
logger.error("处理点位 {} 异常,地址: {}",
point.getId(), point.getAddress(), e);
}
}
/**
* OPC
*/
private String processOpcValue(Object value) {
if (value == null) {
return "";
}
if (value instanceof String) {
return ((String) value).trim();
}
return value.toString();
}
// 读取OPC值
Object addressValue = OpcUtils.readValue(address);
if (addressValue == null) {
logger.warn("读取点位 {} 的值返回null地址: {}",
deviceContactModelDO.getId(), address);
} else {
// 值验证
if (addressValue instanceof String) {
String strValue = (String) addressValue;
if (strValue.trim().isEmpty()) {
logger.warn("读取点位 {} 的值为空字符串", deviceContactModelDO.getId());
deviceContactModelDO.setAddressValue("");
} else {
deviceContactModelDO.setAddressValue(addressValue);
successCount++;
}
/**
*
*/
private void saveToDatabase(Long deviceId, List<DeviceContactModelDO> dataList, int successCount) {
try {
String json = JSON.toJSONString(dataList);
boolean inserted = tDengineService.insertDeviceData(deviceId, json);
if (inserted) {
logger.info("设备 {} 数据入库成功,总数: {},有效: {}",
deviceId, dataList.size(), successCount);
} else {
logger.error("设备 {} 数据入库失败", deviceId);
}
} catch (Exception e) {
logger.error("设备 {} 数据入库异常", deviceId, e);
}
}
private void judgmentRules(String processedValue, String attributeCode, DeviceDO device,Long modelId) {
if (StringUtils.isBlank(processedValue)) {
logger.warn("待判断的值为空编码attributeCode: {}, deviceId: {}", attributeCode, device.getId());
// return;
}
// 1. 查询设备规则
List<DevicePointRulesDO> devicePointRulesDOList = devicePointRulesMapper.selectList(
Wrappers.<DevicePointRulesDO>lambdaQuery()
.eq(DevicePointRulesDO::getDeviceId, device.getId()));
if (CollectionUtils.isEmpty(devicePointRulesDOList)) {
logger.debug("设备 {} 未配置规则", device.getId());
return;
}
// 2. 遍历规则
for (DevicePointRulesDO devicePointRulesDO : devicePointRulesDOList) {
if (StringUtils.isBlank(devicePointRulesDO.getFieldRule())) {
continue;
}
// 3. 解析规则列表
List<PointRulesRespVO> pointRulesVOList = JSON.parseArray(
devicePointRulesDO.getFieldRule(), PointRulesRespVO.class);
if (CollectionUtils.isEmpty(pointRulesVOList)) {
continue;
}
// 4. 找到对应modelId的规则并进行判断
for (PointRulesRespVO pointRulesRespVO : pointRulesVOList) {
if (pointRulesRespVO.getCode() != null &&
pointRulesRespVO.getCode().equals(attributeCode)) {
boolean matched = matchRule(processedValue, pointRulesRespVO);
if (matched) {
logger.info("规则匹配成功: modelId={}, value={}, rule={}",
attributeCode, processedValue,
JSON.toJSONString(pointRulesRespVO));
// 执行匹配成功后的逻辑
handleMatchedSuccessRule(devicePointRulesDO,pointRulesRespVO, processedValue, device, attributeCode,modelId);
break;
} else {
deviceContactModelDO.setAddressValue(addressValue);
successCount++;
logger.debug("规则不匹配: modelId={}, value={}, rule={}",
attributeCode, processedValue,
JSON.toJSONString(pointRulesRespVO));
// 执行匹配失败后的逻辑
handleMatchedFailureRule(devicePointRulesDO,pointRulesRespVO, processedValue, device, attributeCode);
}
}
}
}
}
validDataList.add(deviceContactModelDO);
private void handleMatchedFailureRule(DevicePointRulesDO devicePointRulesDO,PointRulesRespVO pointRulesRespVO, String processedValue, DeviceDO device, String attributeCode) {
//TODO 离线待优化
// if (devicePointRulesDO.getIdentifier().equals(DeviceBasicStatusEnum.RUNNING.getCode())){
// DeviceOperationRecordDO record = new DeviceOperationRecordDO();
// record.setDeviceId(device.getId());
// record.setModelId(modelId);
// record.setRule(pointRulesRespVO.getRule());
// record.setAddressValue(processedValue);
// record.setRecordType(getRecordType(devicePointRulesDO));
// record.setRuleId(devicePointRulesDO.getId());
//
// }
} catch (Exception e) {
logger.error("读取点位 {} 异常,地址: {}",
deviceContactModelDO.getId(),
deviceContactModelDO.getAddress(), e);
}
}
}
private void handleMatchedSuccessRule(DevicePointRulesDO devicePointRulesDO,
PointRulesRespVO pointRulesRespVO,
String processedValue,
DeviceDO device,
String attributeCode,
Long modelId) {
DeviceOperationRecordDO record = new DeviceOperationRecordDO();
record.setDeviceId(device.getId());
record.setModelId(modelId);
record.setRule(pointRulesRespVO.getRule());
record.setAddressValue(processedValue);
record.setRecordType(getRecordType(devicePointRulesDO));
record.setRuleId(devicePointRulesDO.getId());
//TODO 创建人和更新人为内置默认管理员
record.setCreator("1");
record.setUpdater("1");
// 处理累计时间
calculateAndSetTotalTime(record, pointRulesRespVO.getRule(), device.getSampleCycle());
deviceOperationRecordMapper.insert(record);
}
// 7. 判断是否有有效数据
if (validDataList.isEmpty()) {
logger.warn("设备 {} 没有读取到任何有效数据,跳过入库", deviceId);
private void calculateAndSetTotalTime(DeviceOperationRecordDO record, String ruleCode, Double sampleCycle) {
if (!isTimeRelatedStatus(ruleCode)) {
return;
}
logger.info("设备 {} 成功读取 {} 个点位数据,总计 {} 个点位",
deviceId, successCount, validDataList.size());
// DeviceOperationRecordDO lastRecord = deviceOperationRecordMapper.selectOne(
// Wrappers.<DeviceOperationRecordDO>lambdaQuery()
// .eq(DeviceOperationRecordDO::getRule, ruleCode)
// .orderByDesc(DeviceOperationRecordDO::getCreateTime)
// .last("LIMIT 1")
// );
if (ruleCode.equals(DeviceStatusEnum.RUNNING.getCode())) {
// Double totalTime = (lastRecord != null && lastRecord.getTotalRunningTime() != null)
// ? lastRecord.getTotalRunningTime() + sampleCycle
// : sampleCycle;
record.setTotalRunningTime(sampleCycle);
} else if (ruleCode.equals(DeviceStatusEnum.STANDBY.getCode())) {
// Double totalTime = (lastRecord != null && lastRecord.getTotalStandbyTime() != null)
// ? lastRecord.getTotalStandbyTime() + sampleCycle
// : sampleCycle;
record.setTotalStandbyTime(sampleCycle);
} else if (ruleCode.equals(DeviceStatusEnum.FAULT_STANDBY.getCode())) {
// Double totalTime = (lastRecord != null && lastRecord.getTotalFaultTime() != null)
// ? lastRecord.getTotalFaultTime() + sampleCycle
// : sampleCycle;
record.setTotalFaultTime(sampleCycle);
} else if (ruleCode.equals(DeviceStatusEnum.ALARM_RUNNING.getCode())) {
// Double totalTime = (lastRecord != null && lastRecord.getTotalWarningTime() != null)
// ? lastRecord.getTotalWarningTime() + sampleCycle
// : sampleCycle;
record.setTotalWarningTime(sampleCycle);
}
}
private Integer getRecordType(DevicePointRulesDO devicePointRulesDO) {
return devicePointRulesDO.getIdentifier()
.equals(DeviceBasicStatusEnum.RUNNING.getDescription())
? Integer.parseInt(DeviceBasicStatusEnum.RUNNING.getCode())
: Integer.parseInt(DeviceBasicStatusEnum.ALARM.getCode());
}
private boolean isTimeRelatedStatus(String ruleCode) {
return ruleCode.equals(DeviceStatusEnum.RUNNING.getCode()) ||
ruleCode.equals(DeviceStatusEnum.STANDBY.getCode()) ||
ruleCode.equals(DeviceStatusEnum.FAULT_STANDBY.getCode()) ||
ruleCode.equals(DeviceStatusEnum.ALARM_RUNNING.getCode());
}
/**
*
* : EQ(), NE(), GT(), GE(),
* LT(), LE(), TRUE(), FALSE()
*/
private boolean matchRule(String value, PointRulesRespVO rule) {
if (StringUtils.isBlank(value) || rule == null ||
StringUtils.isBlank(rule.getOperator())) {
return false;
}
try {
// 8. 数据入库
String json = JSON.toJSONString(validDataList);
boolean insertSuccess = tDengineService.insertDeviceData(deviceId, json);
String operator = rule.getOperator().toUpperCase();
String inputValue = value.trim().toLowerCase();
String ruleValue = StringUtils.trimToEmpty(rule.getOperatorRule());
if (insertSuccess) {
logger.info("设备 {} 数据成功插入TDengine数据量: {}", deviceId, validDataList.size());
// 1. 处理布尔值判断
if ("TRUE".equals(operator) || "FALSE".equals(operator)) {
return matchBooleanRule(inputValue, operator);
}
} else {
logger.error("设备 {} 数据插入TDengine失败", deviceId);
// 2. 如果operatorRule为空且不是布尔操作符则返回false
if (StringUtils.isBlank(ruleValue)) {
logger.warn("规则比较值为空,但操作符不是布尔类型: operator={}", operator);
return false;
}
} catch (Exception e) {
logger.error("设备 {} 数据入库异常", deviceId, e);
} finally {
// 9. 确保断开连接
try {
OpcUtils.disconnect();
} catch (Exception e) {
logger.error("断开OPC连接异常设备ID: {}", deviceId, e);
ruleValue = ruleValue.trim();
// 3. 尝试数值比较
if (isNumeric(inputValue) && isNumeric(ruleValue)) {
Double num1 = Double.parseDouble(inputValue);
Double num2 = Double.parseDouble(ruleValue);
return compareNumbers(num1, num2, operator);
}
// 4. 字符串比较
else {
return compareStrings(inputValue, ruleValue, operator);
}
} catch (Exception e) {
logger.error("规则匹配异常: value={}, rule={}, error={}",
value, JSON.toJSONString(rule), e.getMessage());
return false;
}
}
/**
*
*/
private boolean matchBooleanRule(String value, String operator) {
// 常见布尔值表示
boolean booleanValue = parseBoolean(value);
if ("TRUE".equals(operator)) {
return booleanValue;
} else if ("FALSE".equals(operator)) {
return !booleanValue;
}
return false;
}
/**
*
* : true, false, 1, 0, yes, no, on, off
*/
private boolean parseBoolean(String value) {
if (StringUtils.isBlank(value)) {
return false;
}
String lowerValue = value.toLowerCase();
// 常见真值表示
if ("true".equals(lowerValue) ||
"1".equals(lowerValue) ||
"yes".equals(lowerValue) ||
"on".equals(lowerValue) ||
"是".equals(lowerValue) || // 中文支持
"成功".equals(lowerValue)) {
return true;
}
// 常见假值表示
if ("false".equals(lowerValue) ||
"0".equals(lowerValue) ||
"no".equals(lowerValue) ||
"off".equals(lowerValue) ||
"否".equals(lowerValue) || // 中文支持
"失败".equals(lowerValue)) {
return false;
}
// 尝试转换为布尔值
try {
return Boolean.parseBoolean(lowerValue);
} catch (Exception e) {
logger.warn("无法解析为布尔值: {}", value);
return false;
}
}
/**
*
*/
private boolean compareNumbers(Double value, Double ruleValue, String operator) {
switch (operator) {
case "EQ": return Math.abs(value - ruleValue) < 0.000001; // 处理浮点数精度
case "NE": return Math.abs(value - ruleValue) >= 0.000001;
case "GT": return value > ruleValue;
case "GE": return value >= ruleValue;
case "LT": return value < ruleValue;
case "LE": return value <= ruleValue;
default:
logger.warn("不支持的操作符: {}", operator);
return false;
}
}
/**
*
*/
private boolean compareStrings(String value, String ruleValue, String operator) {
switch (operator) {
case "EQ": return value.equals(ruleValue);
case "NE": return !value.equals(ruleValue);
case "GT": return value.compareTo(ruleValue) > 0;
case "GE": return value.compareTo(ruleValue) >= 0;
case "LT": return value.compareTo(ruleValue) < 0;
case "LE": return value.compareTo(ruleValue) <= 0;
default:
logger.warn("不支持的操作符: {}", operator);
return false;
}
}
/**
*
*/
private boolean isNumeric(String str) {
if (StringUtils.isBlank(str)) {
return false;
}
try {
Double.parseDouble(str);
return true;
} catch (NumberFormatException e) {
return false;
}
}
/**
* 使
*/
// private void executeWithConnectionPool(Long deviceId, DeviceDO device) {
// SessionInfo sessionInfo = connectionPool.get(deviceId);
//
// // 检查是否可复用现有连接
// if (sessionInfo != null && !sessionInfo.isExpired() && OpcUtils.isConnected()) {
// log.debug("复用现有连接设备ID: {}", deviceId);
// sessionInfo.updateLastUsed();
// } else {
// // 需要创建新连接
// if (sessionInfo != null) {
// // 清理过期连接
// connectionPool.remove(deviceId);
// OpcUtils.disconnect();
// }
//
// log.info("创建新OPC连接设备ID: {}", deviceId);
// if (!OpcUtils.connect(device.getUrl(), device.getUsername(), device.getPassword(), 10)) {
// throw new RuntimeException("OPC连接失败: " + device.getUrl());
// }
//
// // 记录新会话
// sessionInfo = new SessionInfo(device.getUrl(), device.getUsername());
// connectionPool.put(deviceId, sessionInfo);
// }
//
// try {
// // 执行数据采集
// processDeviceData(deviceId, device);
// } catch (Exception e) {
// // 发生异常时清理连接
// connectionPool.remove(deviceId);
// OpcUtils.disconnect();
// throw e;
// }
// }
//
// /**
// * 清理过期连接
// */
// private static void cleanupExpiredConnections() {
// int initialSize = connectionPool.size();
// if (initialSize == 0) return;
//
// connectionPool.entrySet().removeIf(entry -> {
// SessionInfo session = entry.getValue();
// if (session != null && session.isExpired()) {
// log.debug("清理过期连接设备ID: {}", entry.getKey());
// OpcUtils.disconnect();
// return true;
// }
// return false;
// });
//
// int finalSize = connectionPool.size();
// if (initialSize != finalSize) {
// log.info("连接池清理完成: {} -> {}", initialSize, finalSize);
// }
// }
}

@ -162,9 +162,7 @@ public class TaskSchedulerManager {
}
}
/**
*
*/
// TaskSchedulerManager.java
public boolean stopTask(Long taskId) {
try {
ScheduledFuture<?> future = runningTasks.get(taskId);

@ -0,0 +1,36 @@
package cn.iocoder.yudao.module.iot.controller.admin.device.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.ToString;
@Schema(description = "管理后台 - 设备运行状态 Resp VO")
@Data
@ToString(callSuper = true)
public class DeviceOperationStatusRespVO {
@Schema(description = "总设备数")
private int totalDevices;
@Schema(description = "运行")
private int runningCount;
@Schema(description = "待机中(不运行、没故障)")
private int standbyCount;
@Schema(description = "故障中(故障且待机)")
private int faultCount;
@Schema(description = "报警中(故障且运行)")
private int warningCount;
@Schema(description = "利用率")
private String utilizationRate;
@Schema(description = "故障率")
private String faultRate;
}

@ -3,6 +3,11 @@ package cn.iocoder.yudao.module.iot.controller.admin.device.vo;
import cn.iocoder.yudao.module.iot.controller.admin.devicemodelrules.vo.PointRulesRespVO;
import cn.iocoder.yudao.module.iot.dal.dataobject.devicepointrules.DevicePointRulesDO;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
@ -102,6 +107,16 @@ public class DeviceRespVO {
@ExcelProperty("密码")
private String password;
@Schema(description = "点位规则")
private List<DevicePointRulesDO> pointRulesVOList;
@Schema(description = "运行状态")
@ExcelProperty("运行状态")
private String operatingStatus;
@Schema(description = "采集时间")
@ExcelProperty("采集时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonSerialize(using = LocalDateTimeSerializer.class)
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
private LocalDateTime collectionTime;
}

@ -11,7 +11,7 @@ public class PointRulesRespVO {
private String rule;
@Schema(description = "点位ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "10916")
private Long id;
private String code;
@Schema(description = "符号")
private String operator;

@ -11,6 +11,9 @@ import io.swagger.v3.oas.annotations.Operation;
import javax.validation.constraints.*;
import javax.validation.*;
import javax.servlet.http.*;
import java.net.URLEncoder;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.io.IOException;
@ -92,4 +95,30 @@ public class DeviceOperationRecordController {
BeanUtils.toBean(list, DeviceOperationRecordRespVO.class));
}
@GetMapping("/deviceOperationPage")
@Operation(summary = "设备运行报表")
@PreAuthorize("@ss.hasPermission('mes:repair-tems:query')")
public CommonResult<PageResult<DeviceTotalTimeRecordRespVO>> deviceOperationPage(@Valid DeviceTotalTimeRecordReqVO pageReqVO) {
PageResult<DeviceTotalTimeRecordRespVO> pageResult = deviceOperationRecordService.deviceOperationPage(pageReqVO);
return success(pageResult);
}
@GetMapping("/export-device-operation-report")
@Operation(summary = "导出设备运行报表记录 Excel")
@PreAuthorize("@ss.hasPermission('iot:device-operation-record:export')")
@ApiAccessLog(operateType = EXPORT)
public void exportDeviceOperationReport(@Valid DeviceTotalTimeRecordReqVO pageReqVO,
HttpServletResponse response) throws IOException {
PageResult<DeviceTotalTimeRecordRespVO> pageResult = deviceOperationRecordService.deviceOperationPage(pageReqVO);
// 设置响应头
response.setContentType("application/vnd.ms-excel;charset=UTF-8");
response.setHeader("Content-Disposition",
"attachment;filename=" + URLEncoder.encode("设备运行报表记录.xls", "UTF-8"));
response.setHeader("Content-Encoding", "identity");
// 导出Excel
String fileName = String.format("设备运行报表记录_%s.xls", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")));
// 导出 Excel
ExcelUtils.write(response, fileName, "数据", DeviceTotalTimeRecordRespVO.class,pageResult.getList());
}
}

@ -0,0 +1,63 @@
package cn.iocoder.yudao.module.iot.controller.admin.deviceoperationrecord.utils;
import org.springframework.stereotype.Component;
@Component
public class TimeConverterUtil {
private static final int SECONDS_PER_HOUR = 3600;
/**
* 2
*/
public static double secondsToHours(double seconds) {
if (seconds <= 0) {
return 0.0;
}
double hours = seconds / SECONDS_PER_HOUR;
return formatDouble(hours, 2);
}
/**
*
*/
public static double secondsToHours(double seconds, int scale) {
if (seconds <= 0) {
return 0.0;
}
double hours = seconds / SECONDS_PER_HOUR;
return formatDouble(hours, scale);
}
/**
*
* = / ( + + + ) * 100%
*/
public static double calculateUtilizationRate(double runningTime, double standbyTime,
double faultTime, double warningTime) {
double totalTime = runningTime + standbyTime + faultTime + warningTime;
if (totalTime <= 0) {
return 0.0;
}
double rate = runningTime / totalTime * 100;
return formatDouble(rate, 2);
}
/**
*
*/
public static double formatDouble(double value, int scale) {
if (scale < 0) {
scale = 2;
}
double factor = Math.pow(10, scale);
return Math.round(value * factor) / factor;
}
/**
*
*/
public static String getPercentString(double value) {
return formatDouble(value, 2) + "%";
}
}

@ -0,0 +1,32 @@
package cn.iocoder.yudao.module.iot.controller.admin.deviceoperationrecord.vo;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import com.alibaba.excel.annotation.ExcelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
@Schema(description = "管理后台 - 运行记录分页 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class DeviceTotalTimeRecordReqVO extends PageParam{
@Schema(description = "设备编码")
private String deviceCode;
@Schema(description = "设备名称")
private String deviceName;
@Schema(description = "开始时间")
private String startTime;
@Schema(description = "结束时间")
private String endTime;
@Schema(description = "ids导出集合用")
private String ids;
}

@ -0,0 +1,54 @@
package cn.iocoder.yudao.module.iot.controller.admin.deviceoperationrecord.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Schema(description = "管理后台 - 运行设备报表时间记录 Request VO")
@Data
@ExcelIgnoreUnannotated
public class DeviceTotalTimeRecordRespVO {
// @Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "4283")
// private Long id;
@Schema(description = "设备编码")
@ExcelProperty("设备编码")
private String deviceCode;
@Schema(description = "设备名称")
@ExcelProperty("设备名称")
private String deviceName;
@Schema(description = "运行时间(小时)")
@ExcelProperty("运行时间(小时)")
private double totalRunningTime;
@Schema(description = "待机时间(小时)")
@ExcelProperty("待机时间(小时)")
private double totalStandbyTime;
@Schema(description = "故障时间(小时)")
@ExcelProperty("故障时间(小时)")
private double totalFaultTime;
@Schema(description = "警告时间(小时)")
@ExcelProperty("警告时间(小时)")
private double totalWarningTime;
@Schema(description = "稼动率")
@ExcelProperty("稼动率")
private String utilizationRate;
@Schema(description = "开始时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@ExcelProperty("开始时间")
private String startTime;
@Schema(description = "结束时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@ExcelProperty("结束时间")
private String endTime;
}

@ -48,4 +48,29 @@ public class DeviceOperationRecordDO extends BaseDO {
*/
private Integer recordType;
/**
* Id
*/
private Long ruleId;
/**
*
*/
private Double totalRunningTime;
/**
*
*/
private Double totalStandbyTime;
/**
*
*/
private Double totalFaultTime;
/**
*
*/
private Double totalWarningTime;
}

@ -4,6 +4,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.iot.controller.admin.device.vo.DeviceOperationStatusRespVO;
import cn.iocoder.yudao.module.iot.controller.admin.device.vo.DevicePageReqVO;
import cn.iocoder.yudao.module.iot.controller.admin.device.vo.LineDeviceRequestVO;
import cn.iocoder.yudao.module.iot.controller.admin.device.vo.LineDeviceRespVO;
@ -96,4 +97,5 @@ public interface DeviceMapper extends BaseMapperX<DeviceDO> {
IPage<LineDeviceRespVO> lineDevicePage(Page<LineDeviceRespVO> page, @Param("pageReqVO") LineDeviceRequestVO pageReqVO);
DeviceOperationStatusRespVO getDeviceOperationalStatus();
}

@ -6,8 +6,11 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.module.iot.dal.dataobject.deviceoperationrecord.DeviceOperationRecordDO;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Mapper;
import cn.iocoder.yudao.module.iot.controller.admin.deviceoperationrecord.vo.*;
import org.apache.ibatis.annotations.Param;
/**
* Mapper
@ -28,4 +31,6 @@ public interface DeviceOperationRecordMapper extends BaseMapperX<DeviceOperation
.orderByDesc(DeviceOperationRecordDO::getId));
}
IPage<DeviceTotalTimeRecordRespVO> deviceOperationPage(Page<DeviceTotalTimeRecordRespVO> page,@Param("pageReqVO") DeviceTotalTimeRecordReqVO pageReqVO);
}

@ -69,7 +69,7 @@ public interface DeviceService {
* @param pageReqVO
* @return
*/
PageResult<DeviceDO> getDevicePage(DevicePageReqVO pageReqVO);
PageResult<DeviceRespVO> getDevicePage(DevicePageReqVO pageReqVO);
List<DeviceDO> selectList(DevicePageReqVO reqVO);
// ==================== 子表(设备属性) ====================
@ -131,4 +131,5 @@ public interface DeviceService {
Boolean scheduledStop(Long id);
DeviceOperationStatusRespVO getDeviceOperationalStatus();
}

@ -6,6 +6,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.common.util.opc.OpcUtils;
import cn.iocoder.yudao.module.iot.controller.admin.device.enums.DeviceStatusEnum;
import cn.iocoder.yudao.module.iot.controller.admin.device.scheduled.utils.CronExpressionUtils;
import cn.iocoder.yudao.module.iot.controller.admin.device.scheduled.scheduler.TaskSchedulerManager;
import cn.iocoder.yudao.module.iot.controller.admin.device.vo.*;
@ -16,6 +17,7 @@ import cn.iocoder.yudao.module.iot.dal.dataobject.deviceattributetype.DeviceAttr
import cn.iocoder.yudao.module.iot.dal.dataobject.devicemodel.DeviceModelDO;
import cn.iocoder.yudao.module.iot.dal.dataobject.devicemodelattribute.DeviceModelAttributeDO;
import cn.iocoder.yudao.module.iot.dal.dataobject.devicemodelrules.DeviceModelRulesDO;
import cn.iocoder.yudao.module.iot.dal.dataobject.deviceoperationrecord.DeviceOperationRecordDO;
import cn.iocoder.yudao.module.iot.dal.dataobject.devicepointrules.DevicePointRulesDO;
import cn.iocoder.yudao.module.iot.dal.dataobject.mqttdatarecord.MqttDataRecordDO;
import cn.iocoder.yudao.module.iot.dal.dataobject.devicecontactmodel.DeviceContactModelDO;
@ -25,6 +27,7 @@ import cn.iocoder.yudao.module.iot.dal.mysql.devicecontactmodel.DeviceContactMod
import cn.iocoder.yudao.module.iot.dal.mysql.devicemodel.DeviceModelMapper;
import cn.iocoder.yudao.module.iot.dal.mysql.devicemodelattribute.DeviceModelAttributeMapper;
import cn.iocoder.yudao.module.iot.dal.mysql.devicemodelrules.DeviceModelRulesMapper;
import cn.iocoder.yudao.module.iot.dal.mysql.deviceoperationrecord.DeviceOperationRecordMapper;
import cn.iocoder.yudao.module.iot.dal.mysql.devicepointrules.DevicePointRulesMapper;
import cn.iocoder.yudao.module.iot.dal.mysql.mqttdatarecord.MqttDataRecordMapper;
import cn.iocoder.yudao.module.iot.dal.dataobject.device.DeviceAttributeDO;
@ -102,6 +105,9 @@ public class DeviceServiceImpl implements DeviceService {
@Resource
private DevicePointRulesMapper devicePointRulesMapper;
@Resource
private DeviceOperationRecordMapper deviceOperationRecordMapper;
@Override
@Transactional(rollbackFor = Exception.class)
@ -231,12 +237,12 @@ public class DeviceServiceImpl implements DeviceService {
DeviceRespVO deviceRespVO = BeanUtils.toBean(deviceDO, DeviceRespVO.class);
List<DevicePointRulesDO> devicePointRulesDOList = devicePointRulesMapper.selectList(Wrappers.<DevicePointRulesDO>lambdaQuery()
.eq(DevicePointRulesDO::getDeviceId, id));
//设置点位规则
if (!devicePointRulesDOList.isEmpty()){
deviceRespVO.setPointRulesVOList(devicePointRulesDOList);
}
//
// //设置点位规则
// if (!devicePointRulesDOList.isEmpty()){
//
// deviceRespVO.setPointRulesVOList(devicePointRulesDOList);
// }
return deviceRespVO;
@ -250,8 +256,31 @@ public class DeviceServiceImpl implements DeviceService {
return deviceMapper.selectByTopic(topic);
}
@Override
public PageResult<DeviceDO> getDevicePage(DevicePageReqVO pageReqVO) {
return deviceMapper.selectPage(pageReqVO);
public PageResult<DeviceRespVO> getDevicePage(DevicePageReqVO pageReqVO) {
PageResult<DeviceDO> deviceDOPageResult = deviceMapper.selectPage(pageReqVO);
PageResult<DeviceRespVO> deviceRespVOPageResult = BeanUtils.toBean(deviceDOPageResult, DeviceRespVO.class);
List<String> ruleCodes = Arrays.stream(DeviceStatusEnum.values())
.map(DeviceStatusEnum::getCode)
.collect(Collectors.toList());
for (DeviceRespVO deviceRespVO : deviceRespVOPageResult.getList()) {
DeviceOperationRecordDO deviceOperationRecordDO = deviceOperationRecordMapper.selectOne(Wrappers.<DeviceOperationRecordDO>lambdaQuery()
.eq(DeviceOperationRecordDO::getDeviceId, deviceRespVO.getId())
.in(DeviceOperationRecordDO::getRule, ruleCodes)
.orderByDesc(DeviceOperationRecordDO::getCreateTime)
.last("LIMIT 1"));
if(deviceOperationRecordDO !=null){
deviceRespVO.setOperatingStatus(DeviceStatusEnum.getByCode(deviceOperationRecordDO.getRule()).getName());
deviceRespVO.setCollectionTime(deviceOperationRecordDO.getCreateTime());
}
}
return deviceRespVOPageResult;
}
@Override
@ -759,4 +788,52 @@ public class DeviceServiceImpl implements DeviceService {
}
}
@Override
public DeviceOperationStatusRespVO getDeviceOperationalStatus() {
DeviceOperationStatusRespVO deviceOperationalStatus= deviceMapper.getDeviceOperationalStatus();
// 计算利用率
calculateUtilizationRate(deviceOperationalStatus);
// 计算故障率
calculateFaultRate(deviceOperationalStatus);
return deviceOperationalStatus;
}
/**
*
* = / * 100%
*/
private void calculateUtilizationRate(DeviceOperationStatusRespVO statusVO) {
int totalDevices = statusVO.getTotalDevices();
int runningCount = statusVO.getRunningCount();
double utilizationRate = 0.0;
if (totalDevices > 0) {
utilizationRate = (double) runningCount / totalDevices * 100;
}
// 格式化百分比保留2位小数
String formattedRate = String.format("%.2f%%", utilizationRate);
statusVO.setUtilizationRate(formattedRate);
}
/**
*
* = / * 100%
*/
private void calculateFaultRate(DeviceOperationStatusRespVO statusVO) {
int totalDevices = statusVO.getTotalDevices();
int faultCount = statusVO.getFaultCount();
double faultRate = 0.0;
if (totalDevices > 0) {
faultRate = (double) faultCount / totalDevices * 100;
}
// 格式化百分比保留2位小数
String formattedRate = String.format("%.2f%%", faultRate);
statusVO.setFaultRate(formattedRate);
}
}

@ -76,7 +76,8 @@ public class DeviceContactModelServiceImpl implements DeviceContactModelService
@Override
public List<DeviceContactModelDO> getDeviceContactModelList(Long id) {
return deviceContactModelMapper.selectList(Wrappers.<DeviceContactModelDO>lambdaQuery().eq(DeviceContactModelDO::getDeviceId,id));
return deviceContactModelMapper.selectList(Wrappers.<DeviceContactModelDO>lambdaQuery().eq(DeviceContactModelDO::getDeviceId,id)
.orderByDesc(DeviceContactModelDO::getCreateTime));
}
}

@ -9,6 +9,7 @@ import cn.iocoder.yudao.module.iot.dal.mysql.device.DeviceMapper;
import cn.iocoder.yudao.module.iot.dal.mysql.devicemodelattribute.DeviceModelAttributeMapper;
import cn.iocoder.yudao.module.iot.dal.mysql.devicemodelrules.DeviceModelRulesMapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import org.checkerframework.checker.units.qual.A;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@ -82,13 +83,13 @@ public class DeviceModelServiceImpl implements DeviceModelService {
deviceModelRulesDO.setDefaultValue("运行");
deviceModelRulesDO.setModelId(id);
deviceModelRulesDOList.add(deviceModelRulesDO);
DeviceModelRulesDO deviceModelRulesDO1 = new DeviceModelRulesDO();
deviceModelRulesDO1.setIdentifier("ALARM");
deviceModelRulesDO1.setFieldName("报警");
deviceModelRulesDO1.setDefaultValue("报警");
deviceModelRulesDO1.setModelId(id);
deviceModelRulesDOList.add(deviceModelRulesDO1);
//
// DeviceModelRulesDO deviceModelRulesDO1 = new DeviceModelRulesDO();
// deviceModelRulesDO1.setIdentifier("ALARM");
// deviceModelRulesDO1.setFieldName("报警");
// deviceModelRulesDO1.setDefaultValue("报警");
// deviceModelRulesDO1.setModelId(id);
// deviceModelRulesDOList.add(deviceModelRulesDO1);
deviceModelRulesMapper.insertBatch(deviceModelRulesDOList);
@ -151,7 +152,7 @@ public class DeviceModelServiceImpl implements DeviceModelService {
@Override
public List<DeviceModelDO> getDeviceModelList() {
return deviceModelMapper.selectList();
return deviceModelMapper.selectList(Wrappers.<DeviceModelDO>lambdaQuery().orderByDesc(DeviceModelDO::getCreateTime));
}
@Override

@ -52,4 +52,6 @@ public interface DeviceOperationRecordService {
*/
PageResult<DeviceOperationRecordDO> getDeviceOperationRecordPage(DeviceOperationRecordPageReqVO pageReqVO);
PageResult<DeviceTotalTimeRecordRespVO> deviceOperationPage(@Valid DeviceTotalTimeRecordReqVO pageReqVO);
}

@ -1,5 +1,10 @@
package cn.iocoder.yudao.module.iot.service.deviceoperationrecord;
import cn.iocoder.yudao.module.iot.controller.admin.deviceoperationrecord.utils.TimeConverterUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
@ -24,6 +29,7 @@ import static cn.iocoder.yudao.module.iot.enums.ErrorCodeConstants.*;
*/
@Service
@Validated
@Slf4j
public class DeviceOperationRecordServiceImpl implements DeviceOperationRecordService {
@Resource
@ -71,4 +77,70 @@ public class DeviceOperationRecordServiceImpl implements DeviceOperationRecordSe
return deviceOperationRecordMapper.selectPage(pageReqVO);
}
@Override
public PageResult<DeviceTotalTimeRecordRespVO> deviceOperationPage(DeviceTotalTimeRecordReqVO pageReqVO) {
Page<DeviceTotalTimeRecordRespVO> page = new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize());
IPage<DeviceTotalTimeRecordRespVO> deviceOperationRecordRespVOIPage = deviceOperationRecordMapper.deviceOperationPage(page,pageReqVO);
// 计算和转换
if (deviceOperationRecordRespVOIPage != null && !deviceOperationRecordRespVOIPage.getRecords().isEmpty()) {
calculateAndSetConvertedValues(deviceOperationRecordRespVOIPage.getRecords(),pageReqVO);
}
return new PageResult<>(deviceOperationRecordRespVOIPage.getRecords(), deviceOperationRecordRespVOIPage.getTotal());
}
private void calculateAndSetConvertedValues(List<DeviceTotalTimeRecordRespVO> records,DeviceTotalTimeRecordReqVO deviceTotalTimeRecordReqVO) {
for (DeviceTotalTimeRecordRespVO record : records) {
try {
//添加时间字段
if (StringUtils.isNotBlank(deviceTotalTimeRecordReqVO.getStartTime())){
record.setStartTime(deviceTotalTimeRecordReqVO.getStartTime());
}
if (StringUtils.isNotBlank(deviceTotalTimeRecordReqVO.getEndTime())){
record.setEndTime(deviceTotalTimeRecordReqVO.getEndTime());
}
// 获取原始秒数
double runningTimeSec = record.getTotalRunningTime();
double standbyTimeSec = record.getTotalStandbyTime();
double faultTimeSec = record.getTotalFaultTime();
double warningTimeSec = record.getTotalWarningTime();
// 1. 转换为小时
double runningHours = TimeConverterUtil.secondsToHours(runningTimeSec, 2);
double standbyHours = TimeConverterUtil.secondsToHours(standbyTimeSec, 2);
double faultHours = TimeConverterUtil.secondsToHours(faultTimeSec, 2);
double warningHours = TimeConverterUtil.secondsToHours(warningTimeSec, 2);
// 2. 计算稼动率
double utilizationRate = TimeConverterUtil.calculateUtilizationRate(
runningTimeSec, standbyTimeSec, faultTimeSec, warningTimeSec
);
// 3. 设置转换后的值(将原来的秒数值覆盖为小时值)
record.setTotalRunningTime(runningHours);
record.setTotalStandbyTime(standbyHours);
record.setTotalFaultTime(faultHours);
record.setTotalWarningTime(warningHours);
record.setUtilizationRate(TimeConverterUtil.getPercentString(utilizationRate));
} catch (Exception e) {
log.error("计算设备{}时间转换时出错: {}", record.getDeviceCode(), e.getMessage());
// 设置默认值
setDefaultValues(record);
}
}
}
private void setDefaultValues(DeviceTotalTimeRecordRespVO record) {
record.setTotalRunningTime(0.0);
record.setTotalStandbyTime(0.0);
record.setTotalFaultTime(0.0);
record.setTotalWarningTime(0.0);
record.setUtilizationRate("0%");
}
}

@ -45,4 +45,31 @@
order by mo.create_time desc
</select>
<select id="getDeviceOperationalStatus"
resultType="cn.iocoder.yudao.module.iot.controller.admin.device.vo.DeviceOperationStatusRespVO">
SELECT
-- 设备总数
COUNT(DISTINCT ide.id) AS totalDevices,
-- 各状态设备数量
SUM(CASE WHEN latest_status.rule = '1' THEN 1 ELSE 0 END) AS runningCount,
SUM(CASE WHEN latest_status.rule = '2' THEN 1 ELSE 0 END) AS standbyCount,
SUM(CASE WHEN latest_status.rule = '3' THEN 1 ELSE 0 END) AS faultCount,
SUM(CASE WHEN latest_status.rule = '4' THEN 1 ELSE 0 END) AS warningCount
FROM besure.iot_device ide
LEFT JOIN (
-- 获取每个设备的最新状态
SELECT
device_id,
rule,
ROW_NUMBER() OVER (PARTITION BY device_id ORDER BY create_time DESC) AS rn
FROM besure.iot_device_operation_record
WHERE rule IN ('1', '2', '3', '4')
AND deleted = 0
) latest_status ON ide.id = latest_status.device_id AND latest_status.rn = 1
WHERE ide.deleted = 0
</select>
</mapper>

@ -9,4 +9,35 @@
文档可见https://www.iocoder.cn/MyBatis/x-plugins/
-->
<select id="deviceOperationPage"
resultType="cn.iocoder.yudao.module.iot.controller.admin.deviceoperationrecord.vo.DeviceTotalTimeRecordRespVO">
SELECT
ide.device_code as deviceCode,
ide.device_name as deviceName,
SUM(CASE WHEN idor.rule = '1' THEN idor.total_running_time ELSE 0 END) AS totalRunningTime,
SUM(CASE WHEN idor.rule = '2' THEN idor.total_standby_time ELSE 0 END) AS totalStandbyTime,
SUM(CASE WHEN idor.rule = '3' THEN idor.total_fault_time ELSE 0 END) AS totalFaultTime,
SUM(CASE WHEN idor.rule = '4' THEN idor.total_warning_time ELSE 0 END) AS totalWarningTime
FROM besure.iot_device_operation_record idor
LEFT JOIN besure.iot_device ide ON idor.device_id = ide.id
WHERE idor.rule IN ('1', '2', '3', '4')
AND idor.deleted = 0
<!-- 时间筛选条件 -->
<if test="pageReqVO.startTime != null">
AND idor.create_time &gt;= #{pageReqVO.startTime}
</if>
<if test="pageReqVO.endTime != null">
AND idor.create_time &lt;= #{pageReqVO.endTime}
</if>
<!-- 设备编码筛选条件 -->
<if test="pageReqVO.deviceCode != null and pageReqVO.deviceCode != ''">
AND ide.device_code LIKE CONCAT('%', #{pageReqVO.deviceCode}, '%')
</if>
<!-- 设备名称筛选条件 -->
<if test="pageReqVO.deviceName != null and pageReqVO.deviceName != ''">
AND ide.device_name LIKE CONCAT('%', #{pageReqVO.deviceName}, '%')
</if>
GROUP BY ide.id, ide.device_code, ide.device_name
ORDER BY ide.device_code
</select>
</mapper>

@ -95,6 +95,11 @@ public interface ErrorCodeConstants {
ErrorCode MOLD_RETURN_NOT_EXISTS = new ErrorCode(5_0087, "模具入库不存在");
ErrorCode MOLD_OPERATE_NOT_EXISTS = new ErrorCode(5_0087, "模具上下模不存在");
ErrorCode MOLD_REPAIR_NOT_EXISTS = new ErrorCode(5_0087, "模具维修记录不存在");
ErrorCode MOLD_REPAIR_CODE_EXISTS = new ErrorCode(5_0087, "模具维修记录编码已存在");
ErrorCode MOLD_REPAIR_LINE_NOT_EXISTS = new ErrorCode(5_0088, "模具维修子表记录不存在");
ErrorCode MOLD_REPAIR_LINE_ID_NOT_EXISTS = new ErrorCode(5_0088, "模具维修子表记录Id为空");
ErrorCode DV_CHECK_NOT_EXISTS = new ErrorCode(5_0087, "维保计划不存在");
@ -107,7 +112,7 @@ public interface ErrorCodeConstants {
ErrorCode DV_REPAIR_LINE_ID_NOT_EXISTS = new ErrorCode(5_0088, "设备维修子表记录Id为空");
ErrorCode ZJ_TYPE_NOT_EXISTS = new ErrorCode(5_009, "检验类型不存在");
ErrorCode ZJ_TYPE_NOT_EXISTS = new ErrorCode(5_0090, "检验类型不存在");
ErrorCode ZJ_ITEM_NOT_EXISTS = new ErrorCode(5_0091, "检验项目不存在");
ErrorCode ZJ_SCHEMA_NOT_EXISTS = new ErrorCode(5_0092, "检验方案不存在");
ErrorCode ZJ_PRODUCT_NOT_EXISTS = new ErrorCode(5_0093, "检验参数不存在");
@ -115,6 +120,8 @@ public interface ErrorCodeConstants {
ErrorCode ZJ_TASK_NOT_EXISTS = new ErrorCode(5_0094, "检验任务不存在");
ErrorCode ZJ_TASK_RESULTS_NOT_EXISTS = new ErrorCode(5_0095, "检验任务-检验结果不存在");
ErrorCode GOVIEW_NOT_EXISTS = new ErrorCode(5_0100, "可视化大屏不存在");
//======================================设备管理相关 1002000000=================================================

@ -5,7 +5,7 @@ import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.criticalcomponent.CriticalComponentDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.dvrepair.DvRepairLineDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.ticketresults.TicketResultsDO;
import cn.iocoder.yudao.module.erp.dal.dataobject.mold.MoldDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.mold.MesMoldDO;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.baomidou.mybatisplus.annotation.TableField;
import io.swagger.v3.oas.annotations.media.Schema;
@ -127,7 +127,7 @@ public class DeviceLedgerRespVO extends BaseDO {
private List<ErpProductDO> beijianList;
@Schema(description = "模具列表")
private List<MoldDO> moldList;
private List<MesMoldDO> moldList;
@Schema(description = "附件地址")
@ExcelProperty("附件地址")

@ -0,0 +1,95 @@
package cn.iocoder.yudao.module.mes.controller.admin.goview;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.security.access.prepost.PreAuthorize;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Operation;
import javax.validation.constraints.*;
import javax.validation.*;
import javax.servlet.http.*;
import java.util.*;
import java.io.IOException;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*;
import cn.iocoder.yudao.module.mes.controller.admin.goview.vo.*;
import cn.iocoder.yudao.module.mes.dal.dataobject.goview.GoviewDO;
import cn.iocoder.yudao.module.mes.service.goview.GoviewService;
@Tag(name = "管理后台 - 可视化大屏")
@RestController
@RequestMapping("/mes/goview")
@Validated
public class GoviewController {
@Resource
private GoviewService goviewService;
@PostMapping("/create")
@Operation(summary = "创建可视化大屏")
@PreAuthorize("@ss.hasPermission('mes:goview:create')")
public CommonResult<Long> createGoview(@Valid @RequestBody GoviewSaveReqVO createReqVO) {
return success(goviewService.createGoview(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "更新可视化大屏")
@PreAuthorize("@ss.hasPermission('mes:goview:update')")
public CommonResult<Boolean> updateGoview(@Valid @RequestBody GoviewSaveReqVO updateReqVO) {
goviewService.updateGoview(updateReqVO);
return success(true);
}
@DeleteMapping("/delete")
@Operation(summary = "删除可视化大屏")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('mes:goview:delete')")
public CommonResult<Boolean> deleteGoview(@RequestParam("id") Long id) {
goviewService.deleteGoview(id);
return success(true);
}
@GetMapping("/get")
@Operation(summary = "获得可视化大屏")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('mes:goview:query')")
public CommonResult<GoviewRespVO> getGoview(@RequestParam("id") Long id) {
GoviewDO goview = goviewService.getGoview(id);
return success(BeanUtils.toBean(goview, GoviewRespVO.class));
}
@GetMapping("/page")
@Operation(summary = "获得可视化大屏分页")
@PreAuthorize("@ss.hasPermission('mes:goview:query')")
public CommonResult<PageResult<GoviewRespVO>> getGoviewPage(@Valid GoviewPageReqVO pageReqVO) {
PageResult<GoviewDO> pageResult = goviewService.getGoviewPage(pageReqVO);
return success(BeanUtils.toBean(pageResult, GoviewRespVO.class));
}
@GetMapping("/export-excel")
@Operation(summary = "导出可视化大屏 Excel")
@PreAuthorize("@ss.hasPermission('mes:goview:export')")
@ApiAccessLog(operateType = EXPORT)
public void exportGoviewExcel(@Valid GoviewPageReqVO pageReqVO,
HttpServletResponse response) throws IOException {
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<GoviewDO> list = goviewService.getGoviewPage(pageReqVO).getList();
// 导出 Excel
ExcelUtils.write(response, "可视化大屏.xls", "数据", GoviewRespVO.class,
BeanUtils.toBean(list, GoviewRespVO.class));
}
}

@ -0,0 +1,40 @@
package cn.iocoder.yudao.module.mes.controller.admin.goview.vo;
import lombok.*;
import java.util.*;
import io.swagger.v3.oas.annotations.media.Schema;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "管理后台 - 可视化大屏分页 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class GoviewPageReqVO extends PageParam {
@Schema(description = "名称", example = "赵六")
private String name;
@Schema(description = "备注", example = "你猜")
private String remark;
@Schema(description = "启用状态")
private Long state;
@Schema(description = "图片路径")
private String indexImage;
@Schema(description = "路由路径")
private String route;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
@Schema(description = "内容")
private String content;
}

@ -0,0 +1,47 @@
package cn.iocoder.yudao.module.mes.controller.admin.goview.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import com.alibaba.excel.annotation.*;
@Schema(description = "管理后台 - 可视化大屏 Response VO")
@Data
@ExcelIgnoreUnannotated
public class GoviewRespVO {
@Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "11354")
@ExcelProperty("ID")
private Long id;
@Schema(description = "名称", example = "赵六")
@ExcelProperty("名称")
private String name;
@Schema(description = "备注", example = "你猜")
@ExcelProperty("备注")
private String remark;
@Schema(description = "启用状态")
@ExcelProperty("启用状态")
private Long state;
@Schema(description = "图片路径")
@ExcelProperty("图片路径")
private String indexImage;
@Schema(description = "路由路径")
@ExcelProperty("路由路径")
private String route;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("创建时间")
private LocalDateTime createTime;
@Schema(description = "内容")
@ExcelProperty("内容")
private String content;
}

@ -0,0 +1,33 @@
package cn.iocoder.yudao.module.mes.controller.admin.goview.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import javax.validation.constraints.*;
@Schema(description = "管理后台 - 可视化大屏新增/修改 Request VO")
@Data
public class GoviewSaveReqVO {
@Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "11354")
private Long id;
@Schema(description = "名称", example = "赵六")
private String name;
@Schema(description = "备注", example = "你猜")
private String remark;
@Schema(description = "启用状态")
private Long state;
@Schema(description = "图片路径")
private String indexImage;
@Schema(description = "路由路径")
private String route;
@Schema(description = "内容")
private String content;
}

@ -0,0 +1,206 @@
package cn.iocoder.yudao.module.mes.controller.admin.mold;
import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.module.mes.dal.dataobject.mold.MesMoldBrandDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.mold.MesMoldBrandProductDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.mold.MesMoldDO;
import cn.iocoder.yudao.module.mes.service.mold.MoldBrandService;
import cn.iocoder.yudao.module.mes.controller.admin.mold.vo.*;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.io.IOException;
import java.util.List;
import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@Tag(name = "管理后台 - 模具型号")
@RestController("mesMoldBrandController")
@RequestMapping("/mes/mold-brand")
@Validated
public class MoldBrandController {
@Resource
private MoldBrandService moldBrandService;
@PostMapping("/create")
@Operation(summary = "创建模具型号")
@PreAuthorize("@ss.hasPermission('erp:mold-brand:create')")
public CommonResult<Long> createMoldBrand(@Valid @RequestBody MoldBrandSaveReqVO createReqVO) {
return success(moldBrandService.createMoldBrand(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "更新模具型号")
@PreAuthorize("@ss.hasPermission('erp:mold-brand:update')")
public CommonResult<Boolean> updateMoldBrand(@Valid @RequestBody MoldBrandSaveReqVO updateReqVO) {
moldBrandService.updateMoldBrand(updateReqVO);
return success(true);
}
@DeleteMapping("/delete")
@Operation(summary = "删除模具型号")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('erp:mold-brand:delete')")
public CommonResult<Boolean> deleteMoldBrand(@RequestParam("id") Long id) {
moldBrandService.deleteMoldBrand(id);
return success(true);
}
@GetMapping("/get")
@Operation(summary = "获得模具型号")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('erp:mold-brand:query')")
public CommonResult<MoldBrandRespVO> getMoldBrand(@RequestParam("id") Long id) {
MesMoldBrandDO moldBrand = moldBrandService.getMoldBrand(id);
return success(BeanUtils.toBean(moldBrand, MoldBrandRespVO.class));
}
@GetMapping("/getBrandList")
@Operation(summary = "获得模具型号列表")
public CommonResult<List<MesMoldBrandDO>> getBrandList(MoldBrandPageReqVO pageReqVO) {
List<MesMoldBrandDO> brandDOList = moldBrandService.selectBy(pageReqVO);
return success(brandDOList);
}
@GetMapping("/page")
@Operation(summary = "获得模具型号分页")
@PreAuthorize("@ss.hasPermission('erp:mold-brand:query')")
public CommonResult<PageResult<MoldBrandRespVO>> getMoldBrandPage(@Valid MoldBrandPageReqVO pageReqVO) {
PageResult<MoldBrandRespVO> pageResult = moldBrandService.getMoldBrandPage(pageReqVO);
return success(pageResult);
}
@GetMapping("/export-excel")
@Operation(summary = "导出模具型号 Excel")
@PreAuthorize("@ss.hasPermission('erp:mold-brand:export')")
@ApiAccessLog(operateType = EXPORT)
public void exportMoldBrandExcel(@Valid MoldBrandPageReqVO pageReqVO,
HttpServletResponse response) throws IOException {
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<MoldBrandRespVO> list = moldBrandService.getMoldBrandPage(pageReqVO).getList();
List<MoldBrandRespVO> moldBrandRespVOS = BeanUtils.toBean(list, MoldBrandRespVO.class);
// 导出 Excel
ExcelUtils.write(response, "模具型号.xls", "数据", MoldBrandRespVO.class, moldBrandRespVOS);
}
// ==================== 子表(模具) ====================
@GetMapping("/getMoldList")
@Operation(summary = "获得模具型号")
public CommonResult<List<MesMoldDO>> getMoldList(MesMoldDO moldDO) {
List<MesMoldDO> doList = moldBrandService.selectBy(moldDO);
return success(doList);
}
@GetMapping("/getMoldAllList")
@Operation(summary = "获得模具型号")
public CommonResult<List<MesMoldDO>> getMoldAllList() {
List<MesMoldDO> doList = moldBrandService.getAllList();
return success(doList);
}
@GetMapping("/mold/page")
@Operation(summary = "获得模具分页")
@Parameter(name = "brandId", description = "型号id")
@PreAuthorize("@ss.hasPermission('erp:mold-brand:query')")
public CommonResult<PageResult<MoldRespVO>> getMoldPage(PageParam pageReqVO, @RequestParam(value = "brandId", required = false) Long brandId) {
return success(moldBrandService.getMoldPage(pageReqVO, brandId));
}
@GetMapping("/mold/list")
@Operation(summary = "获得模具列表")
@PreAuthorize("@ss.hasPermission('erp:mold-brand:query')")
public CommonResult<List<MesMoldDO>> getMoldList() {
List<MesMoldDO> moldDOList = moldBrandService.getMoldList();
return success(moldDOList);
}
@PostMapping("/mold/create")
@Operation(summary = "创建模具")
@PreAuthorize("@ss.hasPermission('erp:mold-brand:create')")
public CommonResult<Long> createMold(@Valid @RequestBody MesMoldDO mold) {
return success(moldBrandService.createMold(mold));
}
@PutMapping("/mold/update")
@Operation(summary = "更新模具")
@PreAuthorize("@ss.hasPermission('erp:mold-brand:update')")
public CommonResult<Boolean> updateMold(@Valid @RequestBody MesMoldDO mold) {
moldBrandService.updateMold(mold);
return success(true);
}
@DeleteMapping("/mold/delete")
@Parameter(name = "id", description = "编号", required = true)
@Operation(summary = "删除模具")
@PreAuthorize("@ss.hasPermission('erp:mold-brand:delete')")
public CommonResult<Boolean> deleteMold(@RequestParam("id") Long id) {
moldBrandService.deleteMold(id);
return success(true);
}
@GetMapping("/mold/get")
@Operation(summary = "获得模具")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('erp:mold-brand:query')")
public CommonResult<MesMoldDO> getMold(@RequestParam("id") Long id) {
return success(moldBrandService.getMold(id));
}
// ==================== 子表(模具产品) ====================
@GetMapping("/mold-brand-product/page")
@Operation(summary = "获得模具产品分页")
@Parameter(name = "brandId", description = "型号ID")
@PreAuthorize("@ss.hasPermission('erp:mold-brand:query')")
public CommonResult<PageResult<MoldProductRespVO>> getMoldBrandProductPage(PageParam pageReqVO,
@RequestParam("brandId") Long brandId) {
PageResult<MesMoldBrandProductDO> pageResult = moldBrandService.getMoldBrandProductPage(pageReqVO, brandId);
PageResult<MoldProductRespVO> result = new PageResult<>(moldBrandService.buildProduct(pageResult.getList()),pageResult.getTotal());
return success(result);
}
@PostMapping("/mold-brand-product/create")
@Operation(summary = "创建模具产品")
@PreAuthorize("@ss.hasPermission('erp:mold-brand:create')")
public CommonResult<Long> createMoldBrandProduct(@Valid @RequestBody MesMoldBrandProductDO moldBrandProduct) {
return success(moldBrandService.createMoldBrandProduct(moldBrandProduct));
}
@PutMapping("/mold-brand-product/update")
@Operation(summary = "更新模具产品")
@PreAuthorize("@ss.hasPermission('erp:mold-brand:update')")
public CommonResult<Boolean> updateMoldBrandProduct(@Valid @RequestBody MesMoldBrandProductDO moldBrandProduct) {
moldBrandService.updateMoldBrandProduct(moldBrandProduct);
return success(true);
}
@DeleteMapping("/mold-brand-product/delete")
@Parameter(name = "id", description = "编号", required = true)
@Operation(summary = "删除模具产品")
@PreAuthorize("@ss.hasPermission('erp:mold-brand:delete')")
public CommonResult<Boolean> deleteMoldBrandProduct(@RequestParam("id") Long id) {
moldBrandService.deleteMoldBrandProduct(id);
return success(true);
}
@GetMapping("/mold-brand-product/get")
@Operation(summary = "获得模具产品")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('erp:mold-brand:query')")
public CommonResult<MesMoldBrandProductDO> getMoldBrandProduct(@RequestParam("id") Long id) {
return success(moldBrandService.getMoldBrandProduct(id));
}
}

@ -0,0 +1,94 @@
package cn.iocoder.yudao.module.mes.controller.admin.mold;
import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.module.mes.dal.dataobject.mold.MesMoldDO;
import cn.iocoder.yudao.module.mes.service.mold.MoldService;
import cn.iocoder.yudao.module.mes.controller.admin.mold.vo.MoldPageReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.mold.vo.MoldRespVO;
import cn.iocoder.yudao.module.mes.controller.admin.mold.vo.MoldSaveReqVO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.io.IOException;
import java.util.List;
import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@Tag(name = "管理后台 - 模具")
@RestController("mesMoldController")
@RequestMapping("/mes/mold")
@Validated
public class MoldController {
@Resource
private MoldService moldService;
@PostMapping("/create")
@Operation(summary = "创建模具")
@PreAuthorize("@ss.hasPermission('erp:mold:create')")
public CommonResult<Long> createMold(@Valid @RequestBody MoldSaveReqVO createReqVO) {
return success(moldService.createMold(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "更新模具")
@PreAuthorize("@ss.hasPermission('erp:mold:update')")
public CommonResult<Boolean> updateMold(@Valid @RequestBody MoldSaveReqVO updateReqVO) {
moldService.updateMold(updateReqVO);
return success(true);
}
@DeleteMapping("/delete")
@Operation(summary = "删除模具")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('erp:mold:delete')")
public CommonResult<Boolean> deleteMold(@RequestParam("id") Long id) {
moldService.deleteMold(id);
return success(true);
}
@GetMapping("/get")
@Operation(summary = "获得模具")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('erp:mold:query')")
public CommonResult<MoldRespVO> getMold(@RequestParam("id") Long id) {
MesMoldDO mold = moldService.getMold(id);
return success(BeanUtils.toBean(mold, MoldRespVO.class));
}
@GetMapping("/page")
@Operation(summary = "获得模具分页")
@PreAuthorize("@ss.hasPermission('erp:mold:query')")
public CommonResult<PageResult<MoldRespVO>> getMoldPage(@Valid MoldPageReqVO pageReqVO) {
PageResult<MesMoldDO> pageResult = moldService.getMoldPage(pageReqVO);
return success(BeanUtils.toBean(pageResult, MoldRespVO.class));
}
@GetMapping("/export-excel")
@Operation(summary = "导出模具 Excel")
@PreAuthorize("@ss.hasPermission('erp:mold:export')")
@ApiAccessLog(operateType = EXPORT)
public void exportMoldExcel(@Valid MoldPageReqVO pageReqVO,
HttpServletResponse response) throws IOException {
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<MesMoldDO> list = moldService.getMoldPage(pageReqVO).getList();
// 导出 Excel
ExcelUtils.write(response, "模具.xls", "数据", MoldRespVO.class,
BeanUtils.toBean(list, MoldRespVO.class));
}
}

@ -0,0 +1,35 @@
package cn.iocoder.yudao.module.mes.controller.admin.mold.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
public enum OrgTypeStatusEnum {
zhijiang("zhijiang", "制浆"),
duidie("duidie", "堆叠"),
chengxing("chengxing", "成型"),
honggan("honggan", "烘干"),
zhuanyi("zhuanyi", "转移"),
jiashi("jiashi", "加湿"),
reya("reya", "热压"),
qiebian("qiebian", "切边"),
pinjian("pinjian", "品检"),
dabao("dabao", "打包"),
tiebiao("tiebiao", "贴标"),
sufeng("sufeng", "塑封"),
pinyin("pinyin", "品印");
private final String orgtype;
private final String description;
public static OrgTypeStatusEnum getByCode(String code) {
for (OrgTypeStatusEnum status : values()) {
if (status.getOrgtype().equals(code)) {
return status;
}
}
return null;
}
}

@ -0,0 +1,60 @@
package cn.iocoder.yudao.module.mes.controller.admin.mold.vo;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "管理后台 - 模具型号分页 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class MoldBrandPageReqVO extends PageParam {
@Schema(description = "型号编码")
private String code;
@Schema(description = "型号名称", example = "王五")
private String name;
@Schema(description = "规格", example = "2")
private String moldType;
@Schema(description = "产品ID", example = "2336")
private Long productId;
@Schema(description = "预期寿命(小时)")
private BigDecimal useTime;
@Schema(description = "维保模式", example = "2")
private Integer maintainType;
@Schema(description = "维保周期")
private BigDecimal maintainTime;
@Schema(description = "模具系数")
private Long moldSize;
@Schema(description = "备注", example = "你说的对")
private String remark;
@Schema(description = "是否启用")
private Boolean isEnable;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
@Schema(description = "工序", example = "你说的对")
private String orgType;
@Schema(description = "id集合导出用")
private String ids;
}

@ -0,0 +1,77 @@
package cn.iocoder.yudao.module.mes.controller.admin.mold.vo;
import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@Schema(description = "管理后台 - 模具型号 Response VO")
@Data
@ExcelIgnoreUnannotated
public class MoldBrandRespVO {
@Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "24140")
@ExcelProperty("ID")
private Long id;
@Schema(description = "型号编码", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("型号编码")
private String code;
@Schema(description = "型号名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "王五")
@ExcelProperty("型号名称")
private String name;
@Schema(description = "规格", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
@ExcelProperty("规格")
private String moldType;
@Schema(description = "产品ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "2336")
private Long productId;
@Schema(description = "产品", requiredMode = Schema.RequiredMode.REQUIRED, example = "2336")
// @ExcelProperty("产品")
private String productName;
@Schema(description = "预期寿命/次")
@ExcelProperty("预期寿命/次")
private BigDecimal useTime;
@Schema(description = "维保模式", example = "2")
// @ExcelProperty(value = "维保模式", converter = DictConvert.class)
@DictFormat("maintain_type") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中
private Integer maintainType;
@Schema(description = "维保周期")
// @ExcelProperty("维保周期")
private BigDecimal maintainTime;
@Schema(description = "模穴数", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("模穴数")
private Long moldSize;
@Schema(description = "备注", example = "你说的对")
@ExcelProperty("备注")
private String remark;
@Schema(description = "是否启用", requiredMode = Schema.RequiredMode.REQUIRED)
// @ExcelProperty("是否启用")
private Boolean isEnable;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("创建时间")
@ColumnWidth(20)
private LocalDateTime createTime;
@Schema(description = "工序", example = "reya")
@ExcelProperty(value = "工序", converter = DictConvert.class)
@DictFormat("mes_org_type")
private String orgType;
// , converter = OrgTypeConverter.class
}

@ -0,0 +1,55 @@
package cn.iocoder.yudao.module.mes.controller.admin.mold.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
@Schema(description = "管理后台 - 模具型号新增/修改 Request VO")
@Data
public class MoldBrandSaveReqVO {
@Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "24140")
private Long id;
@Schema(description = "型号编码", requiredMode = Schema.RequiredMode.REQUIRED)
@NotEmpty(message = "型号编码不能为空")
private String code;
@Schema(description = "型号名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "王五")
@NotEmpty(message = "型号名称不能为空")
private String name;
@Schema(description = "规格", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
@NotEmpty(message = "规格不能为空")
private String moldType;
@Schema(description = "产品ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "2336")
// @NotNull(message = "产品ID不能为空")
private Long productId;
@Schema(description = "预期寿命(小时)")
private BigDecimal useTime;
@Schema(description = "维保模式", example = "2")
private Integer maintainType;
@Schema(description = "维保周期")
private BigDecimal maintainTime;
@Schema(description = "模穴数", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "模穴数不能为空")
private Long moldSize;
@Schema(description = "备注", example = "你说的对")
private String remark;
@Schema(description = "是否启用", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "是否启用不能为空")
private Boolean isEnable;
@Schema(description = "工序", example = "你说的对")
private String orgType;
}

@ -0,0 +1,69 @@
package cn.iocoder.yudao.module.mes.controller.admin.mold.vo;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "管理后台 - 模具分页 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class MoldPageReqVO extends PageParam {
@Schema(description = "模具编码")
private String code;
@Schema(description = "模具名称", example = "芋艿")
private String name;
@Schema(description = "单位ID", example = "19527")
private Long unitId;
@Schema(description = "设备ID", example = "24428")
private Long machineId;
@Schema(description = "设备名称", example = "24428")
private String machineName;
@Schema(description = "使用次数/次")
private BigDecimal useTime;
@Schema(description = "入库时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] inTime;
@Schema(description = "状态", example = "1")
private Integer status;
@Schema(description = "模具图片")
private String images;
@Schema(description = "备注", example = "你猜")
private String remark;
@Schema(description = "是否启用")
private Boolean isEnable;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
@Schema(description = "型号id", example = "15258")
private Long brandId;
@Schema(description = "id集合导出用")
private String ids;
@Schema(description = "附件地址")
private String fileUrl;
}

@ -0,0 +1,37 @@
package cn.iocoder.yudao.module.mes.controller.admin.mold.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.LocalDateTime;
@Schema(description = "管理后台 - 模具 Response VO")
@Data
@ExcelIgnoreUnannotated
public class MoldProductRespVO {
@Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "32278")
@ExcelProperty("ID")
private Long id;
@Schema(description = "产品ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "2336")
private Long productId;
@Schema(description = "产品", requiredMode = Schema.RequiredMode.REQUIRED, example = "2336")
@ExcelProperty("产品")
private String productName;
@Schema(description = "备注", example = "你猜")
@ExcelProperty("备注")
private String remark;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("创建时间")
private LocalDateTime createTime;
@Schema(description = "型号id", requiredMode = Schema.RequiredMode.REQUIRED, example = "15258")
@ExcelProperty("型号id")
private Long brandId;
}

@ -0,0 +1,87 @@
package cn.iocoder.yudao.module.mes.controller.admin.mold.vo;
import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY;
@Schema(description = "管理后台 - 模具 Response VO")
@Data
@ExcelIgnoreUnannotated
public class MoldRespVO {
@Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "32278")
@ExcelProperty("ID")
private Long id;
@Schema(description = "模具编码", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("模具编码")
private String code;
@Schema(description = "模具名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿")
@ExcelProperty("模具名称")
private String name;
@Schema(description = "单位ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "19527")
private Long unitId;
@Schema(description = "单位", requiredMode = Schema.RequiredMode.REQUIRED, example = "个")
// @ExcelProperty("单位")
private String unitName;
@Schema(description = "设备ID", example = "24428")
private Long machineId;
@Schema(description = "设备名称", example = "24428")
@ExcelProperty("使用设备")
private String machineName;
@Schema(description = "使用次数/次")
@ExcelProperty("使用次数/次")
private BigDecimal useTime;
@Schema(description = "入库时间", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("入库时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY)
private LocalDateTime inTime;
@Schema(description = "状态", example = "1")
@ExcelProperty(value = "状态", converter = DictConvert.class)
@DictFormat("erp_mold_status") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中
private Integer status;
@Schema(description = "模具图片")
// @ExcelProperty("模具图片")
private String images;
@Schema(description = "备注", example = "你猜")
@ExcelProperty("备注")
private String remark;
@Schema(description = "是否启用", requiredMode = Schema.RequiredMode.REQUIRED)
// @ExcelProperty("是否启用")
private Boolean isEnable;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
// @ExcelProperty("创建时间")
private LocalDateTime createTime;
@Schema(description = "型号id", requiredMode = Schema.RequiredMode.REQUIRED, example = "15258")
private Long brandId;
@Schema(description = "型号", requiredMode = Schema.RequiredMode.REQUIRED, example = "15258")
@ExcelProperty("型号")
private String brandName;
@Schema(description = "附件地址")
@ExcelProperty("附件地址")
private String fileUrl;
}

@ -0,0 +1,60 @@
package cn.iocoder.yudao.module.mes.controller.admin.mold.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@Schema(description = "管理后台 - 模具新增/修改 Request VO")
@Data
public class MoldSaveReqVO {
@Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "32278")
private Long id;
@Schema(description = "模具编码", requiredMode = Schema.RequiredMode.REQUIRED)
@NotEmpty(message = "模具编码不能为空")
private String code;
@Schema(description = "模具名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿")
@NotEmpty(message = "模具名称不能为空")
private String name;
@Schema(description = "单位ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "19527")
// @NotNull(message = "单位ID不能为空")
private Long unitId;
@Schema(description = "机台ID", example = "24428")
private Long machineId;
@Schema(description = "使用次数/次")
private BigDecimal useTime;
@Schema(description = "入库时间", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "入库时间不能为空")
private LocalDateTime inTime;
@Schema(description = "状态", example = "1")
private Integer status;
@Schema(description = "模具图片")
private String images;
@Schema(description = "备注", example = "你猜")
private String remark;
@Schema(description = "是否启用", requiredMode = Schema.RequiredMode.REQUIRED)
// @NotNull(message = "是否启用不能为空")
private Boolean isEnable;
@Schema(description = "型号id", requiredMode = Schema.RequiredMode.REQUIRED, example = "15258")
// @NotNull(message = "型号id不能为空")
private Long brandId;
@Schema(description = "附件地址")
private String fileUrl;
}

@ -0,0 +1,86 @@
package cn.iocoder.yudao.module.mes.controller.admin.mold.vo;
import cn.iocoder.yudao.module.mes.controller.admin.mold.enums.OrgTypeStatusEnum;
import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.GlobalConfiguration;
import com.alibaba.excel.metadata.data.ReadCellData;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.metadata.property.ExcelContentProperty;
import org.springframework.stereotype.Component;
/**
*
*/
@Component("mesOrgTypeConverter")
public class OrgTypeConverter implements Converter<String> { // 泛型改为 String对应英文字符串
/**
* ExcelExcel/ Java
*/
@Override
public String convertToJavaData(ReadCellData<?> cellData, ExcelContentProperty contentProperty,
GlobalConfiguration globalConfiguration) {
String cellValue = cellData.getStringValue();
if (cellValue == null || cellValue.trim().isEmpty()) {
return null;
}
// 优先匹配中文 → 转换为对应的英文常量名
for (OrgTypeStatusEnum status : OrgTypeStatusEnum.values()) {
if (status.getDescription().equals(cellValue)) { // 注意枚举的描述方法是 getDesc
return status.name(); // 返回枚举的英文常量名(如 IN_USE
}
}
// 匹配英文 → 直接返回兼容Excel中填英文的场景
for (OrgTypeStatusEnum status : OrgTypeStatusEnum.values()) {
if (status.name().equals(cellValue)) {
return cellValue;
}
}
// 无匹配则抛出异常
throw new IllegalArgumentException("设备状态格式错误: " + cellValue + ",仅支持中文(在机/在库/维修中/保养中/报废或英文IN_USE/IN_STOCK/UNDER_REPAIR/UNDER_MAINTENANCE/SCRAPPED");
}
/**
* ExcelJava Excel
*/
@Override
public WriteCellData<?> convertToExcelData(String value, ExcelContentProperty contentProperty,
GlobalConfiguration globalConfiguration) {
if (value == null || value.trim().isEmpty()) {
return new WriteCellData<>("");
}
// 根据英文常量名匹配枚举,转换为中文
OrgTypeStatusEnum status = null;
try {
status = OrgTypeStatusEnum.valueOf(value); // 通过英文名称获取枚举
} catch (IllegalArgumentException e) {
// 若英文匹配失败,尝试兜底匹配中文(兼容异常场景)
for (OrgTypeStatusEnum s : OrgTypeStatusEnum.values()) {
if (s.getDescription().equals(value)) {
status = s;
break;
}
}
}
String text = status != null ? status.getDescription() : "未知";
return new WriteCellData<>(text);
}
// 必须实现的接口方法指定转换的Java类型
@Override
public Class<?> supportJavaTypeKey() {
return String.class;
}
// 必须实现的接口方法指定Excel单元格类型
@Override
public CellDataTypeEnum supportExcelTypeKey() {
return CellDataTypeEnum.STRING;
}
}

@ -1,11 +1,11 @@
package cn.iocoder.yudao.module.mes.controller.admin.moldoperate;
import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
import cn.iocoder.yudao.module.erp.controller.admin.mold.vo.MoldRespVO;
import cn.iocoder.yudao.module.erp.controller.admin.mold.vo.MoldSaveReqVO;
import cn.iocoder.yudao.module.erp.dal.dataobject.mold.MoldDO;
import cn.iocoder.yudao.module.mes.controller.admin.mold.vo.MoldRespVO;
import cn.iocoder.yudao.module.mes.controller.admin.mold.vo.MoldSaveReqVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.mold.MesMoldDO;
import cn.iocoder.yudao.module.erp.dal.dataobject.stock.ErpStockInItemDO;
import cn.iocoder.yudao.module.erp.service.mold.MoldService;
import cn.iocoder.yudao.module.mes.service.mold.MoldService;
import cn.iocoder.yudao.module.mes.controller.admin.deviceledger.vo.DeviceLedgerRespVO;
import cn.iocoder.yudao.module.mes.controller.admin.deviceledger.vo.DeviceLedgerSaveReqVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.deviceledger.DeviceLedgerDO;
@ -66,7 +66,7 @@ public class MoldOperateController {
public CommonResult<Long> createMoldOperate(@Valid @RequestBody MoldOperateSaveReqVO createReqVO) {
if (Objects.equals(createReqVO.getOperateType(), "1")) {
DeviceLedgerDO deviceLedger = deviceLedgerService.getDeviceLedger(createReqVO.getDeviceId());
MoldDO moldDO = moldService.getMold(createReqVO.getMoldId());
MesMoldDO moldDO = moldService.getMold(createReqVO.getMoldId());
moldDO.setMachineId(createReqVO.getDeviceId());
moldDO.setMachineName(deviceLedger.getDeviceName());
moldDO.setStatus(0); // 在机 0 在库 1
@ -76,7 +76,7 @@ public class MoldOperateController {
} else {
DeviceLedgerDO deviceLedger = deviceLedgerService.getDeviceLedger(createReqVO.getDeviceId());
createReqVO.setMoldId(Long.parseLong(deviceLedger.getMoldId()));
MoldDO moldDO = moldService.getMold(Long.parseLong(deviceLedger.getMoldId()));
MesMoldDO moldDO = moldService.getMold(Long.parseLong(deviceLedger.getMoldId()));
moldDO.setMachineId(0L);
moldDO.setMachineName("");
moldDO.setStatus(3); // 在机 0 在库 1

@ -6,9 +6,10 @@ import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.module.mes.controller.admin.moldrepair.vo.MoldRepairPageReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.moldrepair.vo.MoldRepairRespVO;
import cn.iocoder.yudao.module.mes.controller.admin.moldrepair.vo.MoldRepairSaveReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.moldrepair.vo.MoldRepairLineRespVO;
import cn.iocoder.yudao.module.mes.controller.admin.moldrepair.vo.MoldRepairLineSaveReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.moldrepair.vo.MoldRepairUpdateReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.moldrepair.vo.*;
import cn.iocoder.yudao.module.mes.dal.dataobject.moldrepair.MoldRepairDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.moldrepair.MoldRepairLineDO;
import cn.iocoder.yudao.module.mes.service.moldrepair.MoldRepairService;
@ -25,6 +26,9 @@ import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.io.IOException;
import java.net.URLEncoder;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
@ -32,7 +36,7 @@ import java.util.stream.Collectors;
import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@Tag(name = "管理后台 - 设备维修记录")
@Tag(name = "管理后台 - 模具维修记录")
@RestController
@RequestMapping("/mes/mold-repair")
@Validated
@ -45,14 +49,14 @@ public class MoldRepairController {
private AdminUserApi adminUserApi;
@PostMapping("/create")
@Operation(summary = "创建设备维修记录")
@Operation(summary = "创建模具维修记录")
@PreAuthorize("@ss.hasPermission('mes:mold-repair:create')")
public CommonResult<Long> createMoldRepair(@Valid @RequestBody MoldRepairSaveReqVO createReqVO) {
return success(moldRepairService.createMoldRepair(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "更新设备维修记录")
@Operation(summary = "更新模具维修记录")
@PreAuthorize("@ss.hasPermission('mes:mold-repair:update')")
public CommonResult<Boolean> updateMoldRepair(@Valid @RequestBody MoldRepairSaveReqVO updateReqVO) {
moldRepairService.updateMoldRepair(updateReqVO);
@ -60,7 +64,7 @@ public class MoldRepairController {
}
@DeleteMapping("/delete")
@Operation(summary = "删除设备维修记录")
@Operation(summary = "删除模具维修记录")
@Parameter(name = "ids", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('mes:mold-repair:delete')")
public CommonResult<Boolean> deleteMoldRepair(@RequestParam("ids") String ids) {
@ -75,7 +79,7 @@ public class MoldRepairController {
}
@GetMapping("/get")
@Operation(summary = "获得设备维修记录")
@Operation(summary = "获得模具维修记录")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('mes:mold-repair:query')")
public CommonResult<MoldRepairRespVO> getMoldRepair(@RequestParam("id") Long id) {
@ -84,7 +88,7 @@ public class MoldRepairController {
}
@GetMapping("/page")
@Operation(summary = "获得设备维修记录分页")
@Operation(summary = "获得模具维修记录分页")
@PreAuthorize("@ss.hasPermission('mes:mold-repair:query')")
public CommonResult<PageResult<MoldRepairRespVO>> getMoldRepairPage(@Valid MoldRepairPageReqVO pageReqVO) {
PageResult<MoldRepairDO> pageResult = moldRepairService.getMoldRepairPage(pageReqVO);
@ -93,7 +97,7 @@ public class MoldRepairController {
}
@GetMapping("/export-excel")
@Operation(summary = "导出设备维修记录 Excel")
@Operation(summary = "导出模具维修记录 Excel")
@PreAuthorize("@ss.hasPermission('mes:mold-repair:export')")
@ApiAccessLog(operateType = EXPORT)
public void exportMoldRepairExcel(@Valid MoldRepairPageReqVO pageReqVO,
@ -114,22 +118,89 @@ public class MoldRepairController {
moldSubjectRespVO.setStatusName(moldSubjectRespVO.getStatus() != null ?
(moldSubjectRespVO.getStatus() == 0 ? "待完成" : "已完成") : null);
}
if (moldSubjectRespVO.getRepairStatus() !=null) {
moldSubjectRespVO.setRepairStatusName(moldSubjectRespVO.getRepairStatus() != null ?
(moldSubjectRespVO.getRepairStatus() == 1 ? "通过" : "不通过") : null);
}
}
// 导出 Excel
ExcelUtils.write(response, "设备维修记录.xls", "数据", MoldRepairRespVO.class,moldRepairRespVOList);
ExcelUtils.write(response, "模具维修记录.xls", "数据", MoldRepairRespVO.class,moldRepairRespVOList);
}
// ==================== 子表(设备维修记录行) ====================
// ==================== 子表(模具维修记录行) ====================
@GetMapping("/mold-repair-line/list-by-repair-id")
@Operation(summary = "获得设备维修记录行列表")
@Operation(summary = "获得模具维修记录行列表")
@Parameter(name = "repairId", description = "维修单ID")
@PreAuthorize("@ss.hasPermission('mes:mold-repair:query')")
public CommonResult<List<MoldRepairLineDO>> getMoldRepairLineListByRepairId(@RequestParam("repairId") Long repairId) {
return success(moldRepairService.getMoldRepairLineListByRepairId(repairId));
}
@PostMapping("/updateRepairLine")
@Operation(summary = "更新模具维修子表")
@PreAuthorize("@ss.hasPermission('mes:mold-repair:update')")
public CommonResult<Boolean> updateRepairLine(@Valid @RequestBody MoldRepairLineSaveReqVO updateReqVO) {
moldRepairService.updateRepairLine(updateReqVO);
return success(true);
}
@PutMapping("/updateMoldRepairStatus")
@Operation(summary = "更新模具维修子记录状态")
@PreAuthorize("@ss.hasPermission('mes:mold-repair:update')")
public CommonResult<Boolean> updateMoldRepairStatus(@Valid @RequestBody MoldRepairUpdateReqVO updateReqVO) {
moldRepairService.updateMoldRepairStatus(updateReqVO);
return success(true);
}
@PutMapping("/batchUpdate")
@Operation(summary = "批量更新维修检验结果")
@PreAuthorize("@ss.hasPermission('mes:mold_ticket-results:update')")
public CommonResult<Boolean> batchUpdateTicketResults(
@Valid @RequestBody List<MoldRepairLineSaveReqVO> updateReqVOList) {
moldRepairService.batchUpdateTicketResults(updateReqVOList);
return success(true);
}
@GetMapping("/getRepairListByMoldId")
@Operation(summary = "根据模具Id获得维修历史记录")
@Parameter(name = "moldId", description = "模具Id", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('mes:mold_ticket-management:query')")
public CommonResult<List<MoldRepairLineRespVO>> getRepairListByMoldId(@RequestParam("moldId") Long moldId,
@RequestParam(name = "startTime",required = false) String startTime,
@RequestParam(name = "endTime",required = false) String endTime) {
List<MoldRepairLineRespVO> moldRepairDOList = moldRepairService.getRepairListByMoldId(moldId,startTime,endTime,null);
return success(moldRepairDOList);
}
@GetMapping("/export-repair-excel")
@Operation(summary = "导出维修历史记录 Excel")
@PreAuthorize("@ss.hasPermission('mes:mold_ticket-results:export')")
@ApiAccessLog(operateType = EXPORT)
public void exportRepairExcel(@RequestParam("moldId") Long moldId,
@RequestParam(name = "ids",required = false) String ids,
@RequestParam(name = "startTime",required = false) String startTime,
@RequestParam(name = "endTime",required = false) String endTime,
HttpServletResponse response) throws IOException {
// 查询数据
List<MoldRepairLineRespVO> moldRepairDOList = moldRepairService.getRepairListByMoldId(moldId,startTime,endTime,ids);
// 设置响应头
response.setContentType("application/vnd.ms-excel;charset=UTF-8");
response.setHeader("Content-Disposition",
"attachment;filename=" + URLEncoder.encode("维修记录.xls", "UTF-8"));
response.setHeader("Content-Encoding", "identity");
// 导出Excel
String fileName = String.format("维修记录_%s.xls", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")));
ExcelUtils.write(response, fileName, "维修记录", MoldRepairLineRespVO.class, moldRepairDOList);
}
private PageResult<MoldRepairRespVO> buildCreatorName(PageResult<MoldRepairRespVO> moldSubjectRespVOPageResult) {
for (MoldRepairRespVO moldSubjectRespVO : moldSubjectRespVOPageResult.getList()) {

@ -0,0 +1,38 @@
package cn.iocoder.yudao.module.mes.controller.admin.moldrepair.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
*
*/
@Getter
@AllArgsConstructor
public enum RepairResultEnum {
PENDING(0, "待维修"),
PASS(1, "OK"),
FAIL(2, "NG");
private final Integer code;
private final String desc;
public Integer getCode() {
return code;
}
public String getDesc() {
return desc;
}
public static String getDescByCode(Integer code) {
if (code == null) {
return "";
}
for (RepairResultEnum value : values()) {
if (value.code.equals(code)) {
return value.desc;
}
}
return "未知";
}
}

@ -0,0 +1,58 @@
package cn.iocoder.yudao.module.mes.controller.admin.moldrepair.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.LocalDateTime;
@Schema(description = "管理后台 - 模具维修记录 Resp VO")
@Data
@ExcelIgnoreUnannotated
public class MoldRepairLineRespVO {
@Schema(description = "项目行Id")
private Long id;
@Schema(description = "维修单编号")
@ExcelProperty("维修单编号")
private String repairCode;
@Schema(description = "维修单名称")
@ExcelProperty("维修单名称")
private String repairName;
@Schema(description = "维修完成日期")
@ExcelProperty("维修完成日期")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime finishDate;
@Schema(description = "项目编码")
@ExcelProperty("项目编码")
private String subjectCode;
@Schema(description = "项目名称")
@ExcelProperty("项目名称")
private String subjectName;
@Schema(description = "项目内容")
@ExcelProperty("项目内容")
private String subjectContent;
@Schema(description = "备注")
@ExcelProperty("备注")
private String remark;
@Schema(description = "维修结果 0-待维修 1-通过 2-不通过")
private Integer result;
@Schema(description = "维修结果")
@ExcelProperty("维修结果")
private String repairResult;
}

@ -0,0 +1,48 @@
package cn.iocoder.yudao.module.mes.controller.admin.moldrepair.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Schema(description = "管理后台 - 模具维修记录子表/修改 Request VO")
@Data
public class MoldRepairLineSaveReqVO {
@Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "27809")
private Long id;
@Schema(description = "维修单ID", requiredMode = Schema.RequiredMode.REQUIRED)
private Long repairId;
@Schema(description = "项目ID")
private Long subjectId;
@Schema(description = "项目编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "6979")
private String subjectCode;
@Schema(description = "项目名称", requiredMode = Schema.RequiredMode.REQUIRED)
private String subjectName;
@Schema(description = "项目类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "张三")
private String subjectType;
@Schema(description = "项目内容")
private String subjectContent;
@Schema(description = "标准")
private String subjectStandard;
@Schema(description = "故障描述", requiredMode = Schema.RequiredMode.REQUIRED, example = "1622")
private String malfunction;
@Schema(description = "故障描述资源")
private String malfunctionUrl;
@Schema(description = "维修情况")
private String repairDes;
@Schema(description = "备注")
private String remark;
@Schema(description = "维修结果 0-待维修 1-通过 2-不通过")
private Integer result;
}

@ -109,5 +109,12 @@ public class MoldRepairRespVO {
@Schema(description = "关键件Id", example = "你猜")
private Long componentId;
@Schema(description = "维修状态 0-待完成 1-通过 2-不通过")
private Integer repairStatus;
@Schema(description = "维修状态")
@ExcelProperty("维修状态")
private String repairStatusName;
}

@ -0,0 +1,44 @@
package cn.iocoder.yudao.module.mes.controller.admin.moldrepair.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.time.LocalDateTime;
import java.util.List;
@Schema(description = "管理后台 - 设备维修更新子记录 Req VO")
@Data
public class MoldRepairUpdateReqVO {
@Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "27809")
@NotNull
private Long id;
@Schema(description = "报修日期")
@NotNull(message = "报修日期不能为空")
private LocalDateTime requireDate;
@Schema(description = "完成日期")
@NotNull(message = "完成日期不能为空")
private LocalDateTime finishDate;
@Schema(description = "验收日期")
@NotNull(message = "验收日期不能为空")
private LocalDateTime confirmDate;
@Schema(description = "维修结果")
@NotBlank(message = "维修结果不能为空")
private String repairResult;
@Schema(description = "备注")
private String remark;
@Schema(description = "子列表")
@NotNull(message = "子列表不能为空")
private List<MoldRepairLineSaveReqVO> updateReqVOList;
}

@ -1,7 +1,7 @@
package cn.iocoder.yudao.module.mes.controller.admin.moldrepairtems;
import cn.iocoder.yudao.module.mes.dal.dataobject.criticalcomponent.CriticalComponentDO;
import cn.iocoder.yudao.module.erp.dal.dataobject.mold.MoldDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.mold.MesMoldDO;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;

@ -1,8 +1,16 @@
package cn.iocoder.yudao.module.mes.controller.admin.moldticketmanagement;
import cn.iocoder.yudao.module.erp.controller.admin.mold.vo.MoldRespVO;
import cn.iocoder.yudao.module.mes.controller.admin.mold.vo.MoldRespVO;
import cn.iocoder.yudao.module.mes.controller.admin.moldticketresults.vo.MoldTicketInspectionExportVO;
import cn.iocoder.yudao.module.mes.controller.admin.ticketmanagement.enums.InspectionResultEnum;
import cn.iocoder.yudao.module.mes.controller.admin.ticketresults.vo.TicketInspectionExportVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.moldticketresults.MoldTicketResultsDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.ticketresults.TicketResultsDO;
import cn.iocoder.yudao.module.system.api.dict.DictDataApi;
import cn.iocoder.yudao.module.system.api.dict.dto.DictDataRespDTO;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
import com.alibaba.excel.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
@ -14,8 +22,12 @@ import io.swagger.v3.oas.annotations.Operation;
import javax.validation.constraints.*;
import javax.validation.*;
import javax.servlet.http.*;
import java.net.URLEncoder;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.io.IOException;
import java.util.stream.Collectors;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
@ -44,6 +56,9 @@ public class MoldTicketManagementController {
@Resource
private AdminUserApi adminUserApi;
@Resource
private DictDataApi dictDataApi;
@PostMapping("/create")
@Operation(summary = "创建工单管理")
@PreAuthorize("@ss.hasPermission('mes:mold-ticket-management:create')")
@ -124,4 +139,144 @@ public class MoldTicketManagementController {
}
return moldticketManagementRespVOPageResult;
}
@GetMapping("/getInspectionByMoldId")
@Operation(summary = "根据模具Id获得点检历史记录")
@Parameter(name = "moldId", description = "模具Id", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('mes:mold-ticket-management:query')")
public CommonResult< List<MoldTicketResultsDO>> getInspectionByMoldId(@RequestParam("moldId") Long moldId,
@RequestParam(name = "startTime",required = false) String startTime,
@RequestParam(name = "endTime",required = false) String endTime) {
List<MoldTicketResultsDO> moldTicketResultsDOList = moldticketManagementService.getInspectionByMoldId(moldId,startTime,endTime,"");
return success(moldTicketResultsDOList);
}
@GetMapping("/export-excel-inspection")
@Operation(summary = "导出点检历史记录 Excel")
@PreAuthorize("@ss.hasPermission('mes:mold-ticket-results:export')")
@ApiAccessLog(operateType = EXPORT)
public void exportMoldTicketResultsExcel(@RequestParam("moldId") Long moldId,
@RequestParam(name = "ids",required = false) String ids,
@RequestParam(name = "startTime",required = false) String startTime,
@RequestParam(name = "endTime",required = false) String endTime,
HttpServletResponse response) throws IOException {
// 查询数据
List<MoldTicketResultsDO> results = moldticketManagementService.getInspectionByMoldId(moldId, startTime, endTime, ids);
// 转换为VO并处理数据
List<MoldTicketInspectionExportVO> exportVos = results.stream()
.map(this::convertToExportVO)
.collect(Collectors.toList());
// 设置响应头
response.setContentType("application/vnd.ms-excel;charset=UTF-8");
response.setHeader("Content-Disposition",
"attachment;filename=" + URLEncoder.encode("点检记录.xls", "UTF-8"));
response.setHeader("Content-Encoding", "identity");
// 导出Excel
String fileName = String.format("点检记录_%s.xls", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")));
ExcelUtils.write(response, fileName, "点检记录", MoldTicketInspectionExportVO.class, exportVos);
}
@GetMapping("/getMaintenanceByMoldId")
@Operation(summary = "根据模具Id获得保养历史记录")
@Parameter(name = "moldId", description = "模具Id", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('mes:mold_ticket-management:query')")
public CommonResult<List<MoldTicketResultsDO>> getMaintenanceByMoldId(@RequestParam("moldId") Long moldId,
@RequestParam(name = "startTime",required = false) String startTime,
@RequestParam(name = "endTime",required = false) String endTime) {
List<MoldTicketResultsDO> moldticketResultsDOList = moldticketManagementService.getMaintenanceByMoldId(moldId,startTime,endTime,"");
return success(moldticketResultsDOList);
}
@GetMapping("/export-excel-maintenance")
@Operation(summary = "导出保养历史记录 Excel")
@PreAuthorize("@ss.hasPermission('mes:mold_ticket-results:export')")
@ApiAccessLog(operateType = EXPORT)
public void exportExcelMaintenance(@RequestParam("moldId") Long moldId,
@RequestParam(name = "ids",required = false) String ids,
@RequestParam(name = "startTime",required = false) String startTime,
@RequestParam(name = "endTime",required = false) String endTime,
HttpServletResponse response) throws IOException {
// 查询数据
List<MoldTicketResultsDO> results = moldticketManagementService.getMaintenanceByMoldId(moldId, startTime, endTime, ids);
// 转换为VO并处理数据
List<MoldTicketInspectionExportVO> exportVos = results.stream()
.map(this::convertToExportVO)
.collect(Collectors.toList());
// 设置响应头
response.setContentType("application/vnd.ms-excel;charset=UTF-8");
response.setHeader("Content-Disposition",
"attachment;filename=" + URLEncoder.encode("保养记录.xls", "UTF-8"));
response.setHeader("Content-Encoding", "identity");
// 导出Excel
String fileName = String.format("保养记录_%s.xls", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")));
ExcelUtils.write(response, fileName, "保养记录", MoldTicketInspectionExportVO.class, exportVos);
}
/**
*
*/
private Map<String, Map<String, String>> getDictData() {
Map<String, Map<String, String>> dictData = new HashMap<>();
try {
// 获取检验方式字典
Map<String, String> inspectionMethodDict = new HashMap<>();
List<DictDataRespDTO> inspectionMethods = dictDataApi.getDictDataList("Inspection_method");
for (DictDataRespDTO dict : inspectionMethods) {
inspectionMethodDict.put(dict.getValue(), dict.getLabel());
}
dictData.put("Inspection_method", inspectionMethodDict);
} catch (Exception e) {
throw new RuntimeException("获取字典数据异常:" + e);
}
return dictData;
}
/**
*
*/
private MoldTicketInspectionExportVO convertToExportVO(MoldTicketResultsDO record) {
MoldTicketInspectionExportVO vo = BeanUtils.toBean(record, MoldTicketInspectionExportVO.class);
// 转换检验结果
if (record.getInspectionResult() != null) {
vo.setResult(record.getInspectionResult().equals(InspectionResultEnum.OK.getCode()) ? InspectionResultEnum.OK.getLabel() :
record.getInspectionResult().equals(InspectionResultEnum.NG.getCode()) ? InspectionResultEnum.NG.getLabel() : String.valueOf(record.getInspectionResult()));
}
// 处理操作人信息
if (StringUtils.isNotBlank(record.getOperator())) {
try {
AdminUserRespDTO user = adminUserApi.getUser(Long.valueOf(record.getOperator()));
if (user != null) {
vo.setOperator("(" + user.getUsername() + ")" + user.getNickname());
}
} catch (Exception e) {
// 转换失败保持原值
}
}
// 处理检验方式字典
if (StringUtils.isNotBlank(record.getInspectionMethod())) {
Map<String, Map<String, String>> dictData = getDictData();
String methodLabel = dictData.getOrDefault("Inspection_method", Collections.emptyMap())
.get(record.getInspectionMethod());
if (StringUtils.isNotBlank(methodLabel)) {
vo.setInspectionMethod(methodLabel);
}
}
return vo;
}
}

@ -53,14 +53,11 @@ public class MoldTicketManagementPageReqVO extends PageParam {
private String ids;
/**
*
*/
@Schema(description = "作业开始时间")
private String taskTime;
/**
*
*/
@Schema(description = "作业结束时间")
private String taskEndTime;
}

@ -0,0 +1,60 @@
package cn.iocoder.yudao.module.mes.controller.admin.moldticketresults.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import lombok.Data;
import java.time.LocalDateTime;
@Data
@ExcelIgnoreUnannotated
public class MoldTicketInspectionExportVO {
// @ExcelProperty("设备编号")
// private String deviceCode;
//
// @ExcelProperty("设备名称")
// private String deviceName;
@ExcelProperty("检验项名称")
private String inspectionItemName;
@ExcelProperty("检验方式")
private String inspectionMethod;
@ExcelProperty("判定基准")
private String judgmentCriteria;
@ExcelProperty("点检时间")
@ColumnWidth(20)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonSerialize(using = LocalDateTimeSerializer.class)
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
private LocalDateTime taskTime;
@ExcelProperty("作业结果")
private String result;
@ExcelProperty("备注")
private String remark;
private Integer inspectionResult;
@ExcelProperty("作业人")
private String operator;
@ExcelProperty("创建时间")
@ColumnWidth(20)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonSerialize(using = LocalDateTimeSerializer.class)
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
private LocalDateTime createTime;
}

@ -72,7 +72,7 @@ public class TicketManagementRespVO extends BaseDO {
/**
*
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd")
@JsonSerialize(using = LocalDateTimeSerializer.class)
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
private LocalDateTime taskEndTime;

@ -1,6 +1,6 @@
package cn.iocoder.yudao.module.mes.dal.dataobject.deviceledger;
import cn.iocoder.yudao.module.erp.dal.dataobject.mold.MoldDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.mold.MesMoldDO;
import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductCategoryDO;
import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.criticalcomponent.CriticalComponentDO;
@ -156,6 +156,6 @@ public class DeviceLedgerDO extends BaseDO {
*
*/
@TableField(exist = false)
private List<MoldDO> moldList;
private List<MesMoldDO> moldList;
}

@ -0,0 +1,55 @@
package cn.iocoder.yudao.module.mes.dal.dataobject.goview;
import lombok.*;
import java.util.*;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.*;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
/**
* DO
*
* @author
*/
@TableName("mes_goview")
@KeySequence("mes_goview_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class GoviewDO extends BaseDO {
/**
* ID
*/
@TableId
private Long id;
/**
*
*/
private String name;
/**
*
*/
private String remark;
/**
*
*/
private Long state;
/**
*
*/
private String indexImage;
/**
*
*/
private String route;
/**
*
*/
private String content;
}

@ -0,0 +1,76 @@
package cn.iocoder.yudao.module.mes.dal.dataobject.mold;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.*;
import java.math.BigDecimal;
/**
* DO
*
* @author
*/
@TableName("erp_mold_brand")
@KeySequence("erp_mold_brand_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class MesMoldBrandDO extends BaseDO {
/**
* ID
*/
@TableId
private Long id;
/**
*
*/
private String code;
/**
*
*/
private String name;
/**
*
*/
private String moldType;
/**
* ID
*/
private Long productId;
/**
* 寿()
*/
private BigDecimal useTime;
/**
*
*
* {@link TODO maintain_type }
*/
private Integer maintainType;
/**
*
*/
private BigDecimal maintainTime;
/**
*
*/
private Long moldSize;
/**
*
*/
private String remark;
/**
*
*/
private Boolean isEnable;
// @Schema(description = "工序", example = "你说的对")
private String orgType;
}

@ -0,0 +1,42 @@
package cn.iocoder.yudao.module.mes.dal.dataobject.mold;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.*;
/**
* DO
*
* @author
*/
@TableName("erp_mold_brand_product")
@KeySequence("erp_mold_brand_product_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class MesMoldBrandProductDO extends BaseDO {
/**
* ID
*/
@TableId
private Long id;
/**
* ID
*/
private Long brandId;
/**
* ID
*/
private Long productId;
/**
*
*/
private String remark;
}

@ -0,0 +1,118 @@
package cn.iocoder.yudao.module.mes.dal.dataobject.mold;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.moldrepair.MoldRepairLineDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.moldticketresults.MoldTicketResultsDO;
import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.*;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
/**
* DO
*
* @author
*/
@TableName("erp_mold")
@KeySequence("erp_mold_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class MesMoldDO extends BaseDO {
/**
* ID
*/
@TableId
private Long id;
/**
*
*/
private String code;
/**
*
*/
private String name;
/**
* ID
*/
private Long unitId;
/**
* ID
*/
private Long machineId;
/**
*
*/
private String machineName;
/**
* 使()
*/
private BigDecimal useTime;
/**
*
*/
private LocalDateTime inTime;
/**
*
*
* {@link TODO erp_mold_status }
*/
private Integer status;
/**
*
*/
private String images;
/**
*
*/
private String remark;
/**
*
*/
private Boolean isEnable;
/**
* id
*/
private Long brandId;
private String fileUrl;
/**
*
*/
@TableField(exist = false)
private List<MoldTicketResultsDO> inspectionList;
/**
*
*/
@TableField(exist = false)
private List<MoldTicketResultsDO> maintainList;
/**
*
*/
@TableField(exist = false)
private Map<String,List<MoldRepairLineDO>> repairList;
@TableField(exist = false)
private String orgType;
@TableField(exist = false)
private Long moldSize;
@TableField(exist = false)
private String brandName;
@TableField(exist = false)
private String moldType;
}

@ -114,4 +114,9 @@ public class MoldRepairDO extends BaseDO {
*/
private Long componentId;
/**
* 0- 1- 2-
*/
private Integer repairStatus;
}

@ -72,4 +72,9 @@ public class MoldRepairLineDO extends BaseDO {
*/
private String remark;
/**
* 0- 1- 2-
*/
private Integer result;
}

@ -3,8 +3,6 @@ package cn.iocoder.yudao.module.mes.dal.dataobject.moldticketresults;
import lombok.*;
import java.util.*;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.*;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
@ -65,4 +63,13 @@ public class MoldTicketResultsDO extends BaseDO {
*/
private Long moldId;
/**
*
*/
@TableField(exist = false)
private LocalDateTime taskTime;
@TableField(exist = false)
private String operator;
}

@ -0,0 +1,32 @@
package cn.iocoder.yudao.module.mes.dal.mysql.goview;
import java.util.*;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.module.mes.dal.dataobject.goview.GoviewDO;
import org.apache.ibatis.annotations.Mapper;
import cn.iocoder.yudao.module.mes.controller.admin.goview.vo.*;
/**
* Mapper
*
* @author
*/
@Mapper
public interface GoviewMapper extends BaseMapperX<GoviewDO> {
default PageResult<GoviewDO> selectPage(GoviewPageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<GoviewDO>()
.likeIfPresent(GoviewDO::getName, reqVO.getName())
.eqIfPresent(GoviewDO::getRemark, reqVO.getRemark())
.eqIfPresent(GoviewDO::getState, reqVO.getState())
.eqIfPresent(GoviewDO::getIndexImage, reqVO.getIndexImage())
.eqIfPresent(GoviewDO::getRoute, reqVO.getRoute())
.betweenIfPresent(GoviewDO::getCreateTime, reqVO.getCreateTime())
.eqIfPresent(GoviewDO::getContent, reqVO.getContent())
.orderByDesc(GoviewDO::getId));
}
}

@ -0,0 +1,72 @@
package cn.iocoder.yudao.module.mes.dal.mysql.mold;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.mes.controller.admin.mold.vo.MoldBrandPageReqVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.mold.MesMoldBrandDO;
import com.alibaba.excel.util.StringUtils;
import org.apache.ibatis.annotations.Mapper;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
/**
* Mapper
*
* @author
*/
@Mapper
public interface MesMoldBrandMapper extends BaseMapperX<MesMoldBrandDO> {
default PageResult<MesMoldBrandDO> selectPage(MoldBrandPageReqVO reqVO) {
LambdaQueryWrapperX<MesMoldBrandDO> moldBrandDOLambdaQueryWrapperX = new LambdaQueryWrapperX<>();
moldBrandDOLambdaQueryWrapperX
.eqIfPresent(MesMoldBrandDO::getCode, reqVO.getCode())
.likeIfPresent(MesMoldBrandDO::getName, reqVO.getName())
.eqIfPresent(MesMoldBrandDO::getMoldType, reqVO.getMoldType())
.eqIfPresent(MesMoldBrandDO::getProductId, reqVO.getProductId())
.eqIfPresent(MesMoldBrandDO::getUseTime, reqVO.getUseTime())
.eqIfPresent(MesMoldBrandDO::getMaintainType, reqVO.getMaintainType())
.eqIfPresent(MesMoldBrandDO::getMaintainTime, reqVO.getMaintainTime())
.eqIfPresent(MesMoldBrandDO::getMoldSize, reqVO.getMoldSize())
.eqIfPresent(MesMoldBrandDO::getRemark, reqVO.getRemark())
.eqIfPresent(MesMoldBrandDO::getIsEnable, reqVO.getIsEnable())
.eqIfPresent(MesMoldBrandDO::getOrgType, reqVO.getOrgType())
.betweenIfPresent(MesMoldBrandDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(MesMoldBrandDO::getId);
// 单独处理 ids 条件
if (StringUtils.isNotBlank(reqVO.getIds())) {
List<Long> idList = Arrays.stream(reqVO.getIds().split(","))
.map(String::trim)
.map(Long::valueOf)
.collect(Collectors.toList());
moldBrandDOLambdaQueryWrapperX.in(MesMoldBrandDO::getId, idList);
}
return selectPage(reqVO, moldBrandDOLambdaQueryWrapperX);
}
default List<MesMoldBrandDO> selectBy(MoldBrandPageReqVO reqVO) {
return selectList(new LambdaQueryWrapperX<MesMoldBrandDO>()
.eqIfPresent(MesMoldBrandDO::getCode, reqVO.getCode())
.likeIfPresent(MesMoldBrandDO::getName, reqVO.getName())
.eqIfPresent(MesMoldBrandDO::getMoldType, reqVO.getMoldType())
.eqIfPresent(MesMoldBrandDO::getProductId, reqVO.getProductId())
.eqIfPresent(MesMoldBrandDO::getUseTime, reqVO.getUseTime())
.eqIfPresent(MesMoldBrandDO::getMaintainType, reqVO.getMaintainType())
.eqIfPresent(MesMoldBrandDO::getMaintainTime, reqVO.getMaintainTime())
.eqIfPresent(MesMoldBrandDO::getMoldSize, reqVO.getMoldSize())
.eqIfPresent(MesMoldBrandDO::getRemark, reqVO.getRemark())
.eqIfPresent(MesMoldBrandDO::getIsEnable, reqVO.getIsEnable())
.eqIfPresent(MesMoldBrandDO::getOrgType, reqVO.getOrgType())
.betweenIfPresent(MesMoldBrandDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(MesMoldBrandDO::getId));
}
}

@ -0,0 +1,35 @@
package cn.iocoder.yudao.module.mes.dal.mysql.mold;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.mes.dal.dataobject.mold.MesMoldBrandProductDO;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
/**
* Mapper
*
* @author
*/
@Mapper
public interface MesMoldBrandProductMapper extends BaseMapperX<MesMoldBrandProductDO> {
default PageResult<MesMoldBrandProductDO> selectPage(PageParam reqVO, Long brandId) {
return selectPage(reqVO, new LambdaQueryWrapperX<MesMoldBrandProductDO>()
.eq(MesMoldBrandProductDO::getBrandId, brandId)
.orderByDesc(MesMoldBrandProductDO::getId));
}
default int deleteByBrandId(Long brandId) {
return delete(MesMoldBrandProductDO::getBrandId, brandId);
}
default List<MesMoldBrandProductDO> selectList(MesMoldBrandProductDO reqVO) {
return selectList(new LambdaQueryWrapperX<MesMoldBrandProductDO>()
.eqIfPresent(MesMoldBrandProductDO::getProductId, reqVO.getProductId())
.eqIfPresent(MesMoldBrandProductDO::getBrandId, reqVO.getBrandId())
.orderByDesc(MesMoldBrandProductDO::getId));
}
}

@ -0,0 +1,45 @@
package cn.iocoder.yudao.module.mes.dal.mysql.mold;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.mes.dal.dataobject.mold.MesMoldDO;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
/**
* Mapper
*
* @author
*/
@Mapper
public interface MesMoldMapper extends BaseMapperX<MesMoldDO> {
default PageResult<MesMoldDO> selectPage(PageParam reqVO, Long brandId) {
return selectPage(reqVO, new LambdaQueryWrapperX<MesMoldDO>()
.eqIfPresent(MesMoldDO::getBrandId, brandId)
.orderByDesc(MesMoldDO::getId));
}
default int deleteByBrandId(Long brandId) {
return delete(MesMoldDO::getBrandId, brandId);
}
default List<MesMoldDO> selectBy(MesMoldDO reqVO) {
return selectList(new LambdaQueryWrapperX<MesMoldDO>()
.eqIfPresent(MesMoldDO::getCode, reqVO.getCode())
.likeIfPresent(MesMoldDO::getName, reqVO.getName())
.eqIfPresent(MesMoldDO::getBrandId, reqVO.getBrandId())
.orderByDesc(MesMoldDO::getId));
}
default List<MesMoldDO> selectBy(Long brandId) {
return selectList(new LambdaQueryWrapperX<MesMoldDO>()
.eq(MesMoldDO::getBrandId, brandId)
.orderByDesc(MesMoldDO::getId));
}
}

@ -34,5 +34,7 @@ public interface MoldTicketResultsMapper extends BaseMapperX<MoldTicketResultsDO
.orderByDesc(MoldTicketResultsDO::getId));
}
List<MoldTicketResultsDO> findByDeviceIdAndPlanType(@Param("deviceId") Long deviceId,@Param("planType") Integer planType);
List<MoldTicketResultsDO> findByMoldIdAndPlanType(@Param("moldId") Long moldId, @Param("planType") Integer planType,
@Param("startTime") String startTime, @Param("endTime") String endTime,
@Param("ids") String ids);
}

@ -23,7 +23,7 @@ public class MesNoRedisDAO {
/**
* {@link cn.iocoder.yudao.module.erp.dal.dataobject.mold.MoldDO}
* {@link cn.iocoder.yudao.module.mes.dal.dataobject.mold.MesMoldDO}
*/
public static final String MOLD_NO_PREFIX = "MUJU-";
public static final String MOLD_RECORD_NO_PREFIX = "MR-";

@ -4,7 +4,7 @@ import java.util.*;
import javax.validation.*;
import cn.iocoder.yudao.module.erp.controller.admin.mold.vo.MoldRespVO;
import cn.iocoder.yudao.module.erp.dal.dataobject.mold.MoldDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.mold.MesMoldDO;
import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductDO;
import cn.iocoder.yudao.module.mes.controller.admin.deviceledger.vo.*;
import cn.iocoder.yudao.module.mes.dal.dataobject.deviceledger.DeviceLedgerDO;

@ -4,11 +4,11 @@ import cn.hutool.core.collection.CollUtil;
import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
import cn.iocoder.yudao.module.erp.controller.admin.mold.vo.MoldRespVO;
import cn.iocoder.yudao.module.erp.controller.admin.product.vo.product.ErpProductRespVO;
import cn.iocoder.yudao.module.erp.dal.dataobject.mold.MoldBrandDO;
import cn.iocoder.yudao.module.erp.dal.dataobject.mold.MoldDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.mold.MesMoldBrandDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.mold.MesMoldDO;
import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductDO;
import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductUnitDO;
import cn.iocoder.yudao.module.erp.dal.mysql.mold.MoldMapper;
import cn.iocoder.yudao.module.mes.dal.mysql.mold.MesMoldMapper;
import cn.iocoder.yudao.module.erp.dal.mysql.product.ErpProductMapper;
import cn.iocoder.yudao.module.erp.service.product.ErpProductUnitService;
import cn.iocoder.yudao.module.mes.controller.admin.ticketmanagement.enums.PlanTypeEnum;
@ -72,7 +72,7 @@ public class DeviceLedgerServiceImpl implements DeviceLedgerService {
private ErpProductMapper productMapper;
@Resource
private MoldMapper moldMapper;
private MesMoldMapper mesMoldMapper;
@Resource
private ErpProductUnitService productUnitService;
@ -145,35 +145,35 @@ public class DeviceLedgerServiceImpl implements DeviceLedgerService {
Map<String,List<DvRepairLineDO>> dvRepairDOMap=new HashMap<>();
//TODO 待修改迁移
//点检列表
List<TicketResultsDO> inspectionList = ticketResultsMapper.findByDeviceIdAndPlanType(id, PlanTypeEnum.INSPECTION.getCode(),null,null,null);
if(CollectionUtils.isNotEmpty(inspectionList)){
deviceLedgerDO.setInspectionList(inspectionList);
}
//保养列表
List<TicketResultsDO> maintainList = ticketResultsMapper.findByDeviceIdAndPlanType(id, PlanTypeEnum.MAINTENANCE.getCode(),null,null,null);
if(CollectionUtils.isNotEmpty(maintainList)){
deviceLedgerDO.setMaintainList(maintainList);
}
//维修列表
List<DvRepairDO> dvRepairDOS = dvRepairMapperRepair.selectList(
Wrappers.<DvRepairDO>lambdaQuery()
.eq(DvRepairDO::getDeviceId, id));
for (DvRepairDO dvRepairDO : dvRepairDOS) {
List<DvRepairLineDO> dvRepairLineDOS = dvRepairLineMapper.selectList(Wrappers.<DvRepairLineDO>lambdaQuery()
.eq(DvRepairLineDO::getRepairId, dvRepairDO.getId())
.orderByDesc(DvRepairLineDO::getCreateTime));
if (!dvRepairLineDOS.isEmpty()) {
dvRepairDOMap.put(dvRepairDO.getRepairName(), dvRepairLineDOS);
}
}
if(CollectionUtils.isNotEmpty(dvRepairDOMap)){
deviceLedgerDO.setRepairList(dvRepairDOMap);
}
// //点检列表
// List<TicketResultsDO> inspectionList = ticketResultsMapper.findByDeviceIdAndPlanType(id, PlanTypeEnum.INSPECTION.getCode(),null,null,null);
// if(CollectionUtils.isNotEmpty(inspectionList)){
// deviceLedgerDO.setInspectionList(inspectionList);
// }
// //保养列表
// List<TicketResultsDO> maintainList = ticketResultsMapper.findByDeviceIdAndPlanType(id, PlanTypeEnum.MAINTENANCE.getCode(),null,null,null);
// if(CollectionUtils.isNotEmpty(maintainList)){
// deviceLedgerDO.setMaintainList(maintainList);
// }
//
// //维修列表
// List<DvRepairDO> dvRepairDOS = dvRepairMapperRepair.selectList(
// Wrappers.<DvRepairDO>lambdaQuery()
// .eq(DvRepairDO::getDeviceId, id));
//
// for (DvRepairDO dvRepairDO : dvRepairDOS) {
// List<DvRepairLineDO> dvRepairLineDOS = dvRepairLineMapper.selectList(Wrappers.<DvRepairLineDO>lambdaQuery()
// .eq(DvRepairLineDO::getRepairId, dvRepairDO.getId())
// .orderByDesc(DvRepairLineDO::getCreateTime));
// if (!dvRepairLineDOS.isEmpty()) {
// dvRepairDOMap.put(dvRepairDO.getRepairName(), dvRepairLineDOS);
// }
// }
//
// if(CollectionUtils.isNotEmpty(dvRepairDOMap)){
// deviceLedgerDO.setRepairList(dvRepairDOMap);
// }
//关键件列表
@ -194,7 +194,7 @@ public class DeviceLedgerServiceImpl implements DeviceLedgerService {
}
//模具列表
List<MoldDO> moldList = new ArrayList<>();
List<MesMoldDO> moldList = new ArrayList<>();
if (StringUtils.isNotBlank(deviceLedgerDO.getMoldId())) {
// 将逗号分隔的字符串转换为Long类型的List
List<Long> idList = Arrays.stream(deviceLedgerDO.getMoldId().split(","))
@ -202,7 +202,7 @@ public class DeviceLedgerServiceImpl implements DeviceLedgerService {
.map(Long::valueOf)
.collect(Collectors.toList());
for (Long moldId : idList) {
MoldDO moldDO = moldMapper.selectById(moldId);
MesMoldDO moldDO = mesMoldMapper.selectById(moldId);
if(moldDO!=null){
moldList.add(moldDO);
}

@ -0,0 +1,55 @@
package cn.iocoder.yudao.module.mes.service.goview;
import java.util.*;
import javax.validation.*;
import cn.iocoder.yudao.module.mes.controller.admin.goview.vo.*;
import cn.iocoder.yudao.module.mes.dal.dataobject.goview.GoviewDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
/**
* Service
*
* @author
*/
public interface GoviewService {
/**
*
*
* @param createReqVO
* @return
*/
Long createGoview(@Valid GoviewSaveReqVO createReqVO);
/**
*
*
* @param updateReqVO
*/
void updateGoview(@Valid GoviewSaveReqVO updateReqVO);
/**
*
*
* @param id
*/
void deleteGoview(Long id);
/**
*
*
* @param id
* @return
*/
GoviewDO getGoview(Long id);
/**
*
*
* @param pageReqVO
* @return
*/
PageResult<GoviewDO> getGoviewPage(GoviewPageReqVO pageReqVO);
}

@ -0,0 +1,74 @@
package cn.iocoder.yudao.module.mes.service.goview;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
import cn.iocoder.yudao.module.mes.controller.admin.goview.vo.*;
import cn.iocoder.yudao.module.mes.dal.dataobject.goview.GoviewDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.mes.dal.mysql.goview.GoviewMapper;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*;
/**
* Service
*
* @author
*/
@Service
@Validated
public class GoviewServiceImpl implements GoviewService {
@Resource
private GoviewMapper goviewMapper;
@Override
public Long createGoview(GoviewSaveReqVO createReqVO) {
// 插入
GoviewDO goview = BeanUtils.toBean(createReqVO, GoviewDO.class);
goviewMapper.insert(goview);
// 返回
return goview.getId();
}
@Override
public void updateGoview(GoviewSaveReqVO updateReqVO) {
// 校验存在
validateGoviewExists(updateReqVO.getId());
// 更新
GoviewDO updateObj = BeanUtils.toBean(updateReqVO, GoviewDO.class);
goviewMapper.updateById(updateObj);
}
@Override
public void deleteGoview(Long id) {
// 校验存在
validateGoviewExists(id);
// 删除
goviewMapper.deleteById(id);
}
private void validateGoviewExists(Long id) {
if (goviewMapper.selectById(id) == null) {
throw exception(GOVIEW_NOT_EXISTS);
}
}
@Override
public GoviewDO getGoview(Long id) {
return goviewMapper.selectById(id);
}
@Override
public PageResult<GoviewDO> getGoviewPage(GoviewPageReqVO pageReqVO) {
return goviewMapper.selectPage(pageReqVO);
}
}

@ -0,0 +1,176 @@
package cn.iocoder.yudao.module.mes.service.mold;
import cn.hutool.core.collection.CollUtil;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
import cn.iocoder.yudao.module.mes.controller.admin.mold.vo.*;
import cn.iocoder.yudao.module.mes.dal.dataobject.mold.MesMoldBrandDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.mold.MesMoldBrandProductDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.mold.MesMoldDO;
import javax.validation.Valid;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
/**
* Service
*
* @author
*/
public interface MoldBrandService {
/**
*
*
* @param createReqVO
* @return
*/
Long createMoldBrand(@Valid MoldBrandSaveReqVO createReqVO);
/**
*
*
* @param updateReqVO
*/
void updateMoldBrand(@Valid MoldBrandSaveReqVO updateReqVO);
/**
*
*
* @param id
*/
void deleteMoldBrand(Long id);
/**
*
*
* @param id
* @return
*/
MesMoldBrandDO getMoldBrand(Long id);
List<MesMoldBrandDO> selectBy(MoldBrandPageReqVO reqVO);
/**
*
*
* @param pageReqVO
* @return
*/
PageResult<MoldBrandRespVO> getMoldBrandPage(MoldBrandPageReqVO pageReqVO);
default Map<Long, MesMoldBrandDO> getMap(Collection<Long> ids) {
if (CollUtil.isEmpty(ids)) {
return new HashMap<>();
}
return CollectionUtils.convertMap(getList(ids), MesMoldBrandDO::getId);
}
List<MesMoldBrandDO> getList(Collection<Long> ids);
// ==================== 子表(模具) ====================
/**
*
*
* @param pageReqVO
* @param brandId id
* @return
*/
PageResult<MoldRespVO> getMoldPage(PageParam pageReqVO, Long brandId);
List<MesMoldDO> getMoldList();
/**
*
*
* @param mold
* @return
*/
Long createMold(@Valid MesMoldDO mold);
/**
*
*
* @param mold
*/
void updateMold(@Valid MesMoldDO mold);
/**
*
*
* @param id
*/
void deleteMold(Long id);
/**
*
*
* @param id
* @return
*/
MesMoldDO getMold(Long id);
List<MesMoldDO> selectBy(MesMoldDO reqVO);
// ==================== 子表(模具产品) ====================
/**
*
*
* @param pageReqVO
* @param brandId ID
* @return
*/
PageResult<MesMoldBrandProductDO> getMoldBrandProductPage(PageParam pageReqVO, Long brandId);
List<MoldProductRespVO> buildProduct(List<MesMoldBrandProductDO> list);
/**
*
*
* @param moldBrandProduct
* @return
*/
Long createMoldBrandProduct(@Valid MesMoldBrandProductDO moldBrandProduct);
/**
*
*
* @param moldBrandProduct
*/
void updateMoldBrandProduct(@Valid MesMoldBrandProductDO moldBrandProduct);
/**
*
*
* @param id
*/
void deleteMoldBrandProduct(Long id);
/**
*
*
* @param id
* @return
*/
MesMoldBrandProductDO getMoldBrandProduct(Long id);
List<MesMoldDO> getAllList();
/**
*
*
* @param ids
* @return
*/
List<MesMoldBrandDO> getMoldBrandList(Collection<Long> ids);
/**
* Map
*
* @param ids
* @return Map
*/
default Map<Long, MesMoldBrandDO> getMoldBrandMap(Collection<Long> ids) {
if(ids.isEmpty())return new HashMap<>();
return convertMap(getMoldBrandList(ids), MesMoldBrandDO::getId);
}
}

@ -0,0 +1,312 @@
package cn.iocoder.yudao.module.mes.service.mold;
import cn.hutool.core.collection.CollUtil;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.mes.controller.admin.mold.vo.*;
import cn.iocoder.yudao.module.mes.controller.admin.moldticketmanagement.enums.MoldPlanTypeEnum;
import cn.iocoder.yudao.module.mes.dal.dataobject.mold.MesMoldBrandDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.mold.MesMoldBrandProductDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.mold.MesMoldDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.moldrepair.MoldRepairDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.moldrepair.MoldRepairLineDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.moldticketresults.MoldTicketResultsDO;
import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductDO;
import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductUnitDO;
import cn.iocoder.yudao.module.mes.dal.mysql.mold.MesMoldBrandMapper;
import cn.iocoder.yudao.module.mes.dal.mysql.mold.MesMoldBrandProductMapper;
import cn.iocoder.yudao.module.mes.dal.mysql.mold.MesMoldMapper;
import cn.iocoder.yudao.module.mes.dal.mysql.moldrepair.MoldRepairLineMapper;
import cn.iocoder.yudao.module.mes.dal.mysql.moldrepair.MoldRepairMapper;
import cn.iocoder.yudao.module.mes.dal.mysql.moldticketresults.MoldTicketResultsMapper;
import cn.iocoder.yudao.module.erp.service.product.ErpProductService;
import cn.iocoder.yudao.module.erp.service.product.ErpProductUnitService;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import java.util.*;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.*;
/**
* Service
*
* @author
*/
@Service("mesMoldBrandService")
@Validated
public class MoldBrandServiceImpl implements MoldBrandService {
@Resource
private MesMoldBrandMapper mesMoldBrandMapper;
@Resource
private MesMoldMapper mesMoldMapper;
@Resource
private MoldRepairMapper moldRepairMapperRepair;
@Resource
private MoldRepairLineMapper moldRepairLineMapper;
@Resource
private MoldTicketResultsMapper moldticketResultsMapper;
@Resource
private ErpProductUnitService productUnitService;
@Resource
private ErpProductService productService;
@Override
public Long createMoldBrand(MoldBrandSaveReqVO createReqVO) {
// 插入
MesMoldBrandDO moldBrand = BeanUtils.toBean(createReqVO, MesMoldBrandDO.class);
mesMoldBrandMapper.insert(moldBrand);
// 返回
return moldBrand.getId();
}
@Override
public void updateMoldBrand(MoldBrandSaveReqVO updateReqVO) {
// 校验存在
validateMoldBrandExists(updateReqVO.getId());
// 更新
MesMoldBrandDO updateObj = BeanUtils.toBean(updateReqVO, MesMoldBrandDO.class);
mesMoldBrandMapper.updateById(updateObj);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void deleteMoldBrand(Long id) {
// 校验存在
validateMoldBrandExists(id);
// 删除
mesMoldBrandMapper.deleteById(id);
// 删除子表
deleteMoldByBrandId(id);
}
private void validateMoldBrandExists(Long id) {
if (mesMoldBrandMapper.selectById(id) == null) {
throw exception(MOLD_BRAND_NOT_EXISTS);
}
}
@Override
public MesMoldBrandDO getMoldBrand(Long id) {
return mesMoldBrandMapper.selectById(id);
}
@Override
public List<MesMoldBrandDO> selectBy(MoldBrandPageReqVO reqVO){
return mesMoldBrandMapper.selectBy(reqVO);
}
@Override
public PageResult<MoldBrandRespVO> getMoldBrandPage(MoldBrandPageReqVO pageReqVO) {
PageResult<MesMoldBrandDO> pageResult = mesMoldBrandMapper.selectPage(pageReqVO);
return new PageResult<>(buildMoldBrandVOList(pageResult.getList()), pageResult.getTotal());
}
private List<MoldBrandRespVO> buildMoldBrandVOList(List<MesMoldBrandDO> list) {
if (CollUtil.isEmpty(list)) {
return Collections.emptyList();
}
Map<Long, ErpProductDO> map = productService.getProductMap(
convertSet(list, MesMoldBrandDO::getProductId));
return BeanUtils.toBean(list, MoldBrandRespVO.class, item -> {
MapUtils.findAndThen(map, item.getProductId(),
product -> item.setProductName(product.getName()));
});
}
@Override
public List<MesMoldBrandDO> getList(Collection<Long> ids) {
return mesMoldBrandMapper.selectBatchIds(ids);
}
// ==================== 子表(模具) ====================
@Override
public PageResult<MoldRespVO> getMoldPage(PageParam pageReqVO, Long brandId) {
PageResult<MesMoldDO> pageResult = mesMoldMapper.selectPage(pageReqVO, brandId);
return new PageResult<>(buildMoldVOList(pageResult.getList()), pageResult.getTotal());
}
@Override
public List<MesMoldDO> getMoldList() {
return mesMoldMapper.selectList();
}
private List<MoldRespVO> buildMoldVOList(List<MesMoldDO> list) {
if (CollUtil.isEmpty(list)) {
return Collections.emptyList();
}
Map<Long, ErpProductUnitDO> unitMap = productUnitService.getProductUnitMap(
convertSet(list, MesMoldDO::getUnitId));
return BeanUtils.toBean(list, MoldRespVO.class, product -> {
MapUtils.findAndThen(unitMap, product.getUnitId(),
unit -> product.setUnitName(unit.getName()));
});
}
@Override
public Long createMold(MesMoldDO mold) {
mesMoldMapper.insert(mold);
return mold.getId();
}
@Override
public void updateMold(MesMoldDO mold) {
// 校验存在
validateMoldExists(mold.getId());
// 更新
mesMoldMapper.updateById(mold);
}
@Override
public void deleteMold(Long id) {
// 校验存在
validateMoldExists(id);
// 删除
mesMoldMapper.deleteById(id);
}
@Override
public MesMoldDO getMold(Long id) {
MesMoldDO moldDO = mesMoldMapper.selectById(id);
Map<String,List<MoldRepairLineDO>> moldRepairDOMap=new HashMap<>();
// 关联查询品牌表并补充字段
if (moldDO != null && moldDO.getBrandId() != null) {
MesMoldBrandDO moldBrandDO = mesMoldBrandMapper.selectById(moldDO.getBrandId());
if (moldBrandDO != null) {
moldDO.setBrandName(moldBrandDO.getName()); // 品牌名称
moldDO.setMoldType(moldBrandDO.getMoldType()); // 模具类型
moldDO.setMoldSize(moldBrandDO.getMoldSize()); // 模具尺寸
moldDO.setOrgType(moldBrandDO.getOrgType()); // 组织类型
}
}
//点检列表
List<MoldTicketResultsDO> inspectionList = moldticketResultsMapper.findByMoldIdAndPlanType(id, MoldPlanTypeEnum.INSPECTION.getCode(),null,null,null);
if(CollectionUtils.isNotEmpty(inspectionList)){
moldDO.setInspectionList(inspectionList);
}
//保养列表
List<MoldTicketResultsDO> maintainList = moldticketResultsMapper.findByMoldIdAndPlanType(id, MoldPlanTypeEnum.MAINTENANCE.getCode(),null,null,null);
if(CollectionUtils.isNotEmpty(maintainList)){
moldDO.setMaintainList(maintainList);
}
//维修列表
List<MoldRepairDO> moldRepairDOS = moldRepairMapperRepair.selectList(
Wrappers.<MoldRepairDO>lambdaQuery()
.eq(MoldRepairDO::getMoldId, id));
for (MoldRepairDO moldRepairDO : moldRepairDOS) {
List<MoldRepairLineDO> moldRepairLineDOS = moldRepairLineMapper.selectList(Wrappers.<MoldRepairLineDO>lambdaQuery()
.eq(MoldRepairLineDO::getRepairId, moldRepairDO.getId())
.orderByDesc(MoldRepairLineDO::getCreateTime));
if (!moldRepairLineDOS.isEmpty()) {
// 修复JSON序列化null Key问题保持原有风格的极简处理
String repairName = moldRepairDO.getRepairName();
if (repairName == null || repairName.trim().isEmpty()) {
repairName = "维修单-" + moldRepairDO.getId();
}
moldRepairDOMap.put(repairName, moldRepairLineDOS);
}
}
if(CollectionUtils.isNotEmpty(moldRepairDOMap)){
moldDO.setRepairList(moldRepairDOMap);
}
return moldDO;
}
@Override
public List<MesMoldDO> selectBy(MesMoldDO reqVO){
return mesMoldMapper.selectBy(reqVO);
}
private void validateMoldExists(Long id) {
if (mesMoldMapper.selectById(id) == null) {
throw exception(MOLD_NOT_EXISTS);
}
}
private void deleteMoldByBrandId(Long brandId) {
mesMoldMapper.deleteByBrandId(brandId);
}
// ==================== 子表(模具产品) ====================
@Resource
private MesMoldBrandProductMapper mesMoldBrandProductMapper;
@Override
public PageResult<MesMoldBrandProductDO> getMoldBrandProductPage(PageParam pageReqVO, Long brandId) {
return mesMoldBrandProductMapper.selectPage(pageReqVO, brandId);
}
@Override
public List<MoldProductRespVO> buildProduct(List<MesMoldBrandProductDO> list) {
if (CollUtil.isEmpty(list)) {
return Collections.emptyList();
}
Map<Long, ErpProductDO> map = productService.getProductMap(
convertSet(list, MesMoldBrandProductDO::getProductId));
return BeanUtils.toBean(list, MoldProductRespVO.class, item -> {
MapUtils.findAndThen(map, item.getProductId(),
product -> item.setProductName(product.getName()));
});
}
@Override
public Long createMoldBrandProduct(MesMoldBrandProductDO moldBrandProduct) {
MesMoldBrandProductDO resVo = new MesMoldBrandProductDO().setBrandId(moldBrandProduct.getBrandId())
.setProductId(moldBrandProduct.getProductId());
List<MesMoldBrandProductDO> list = mesMoldBrandProductMapper.selectList(resVo);
if(list!=null && list.size()>0){
throw exception(MOLD_BRAND_PRODUCT_EXISTS);
}
mesMoldBrandProductMapper.insert(moldBrandProduct);
return moldBrandProduct.getId();
}
@Override
public void updateMoldBrandProduct(MesMoldBrandProductDO moldBrandProduct) {
// 校验存在
validateMoldBrandProductExists(moldBrandProduct.getId());
// 更新
mesMoldBrandProductMapper.updateById(moldBrandProduct);
}
@Override
public void deleteMoldBrandProduct(Long id) {
// 校验存在
validateMoldBrandProductExists(id);
// 删除
mesMoldBrandProductMapper.deleteById(id);
}
@Override
public MesMoldBrandProductDO getMoldBrandProduct(Long id) {
return mesMoldBrandProductMapper.selectById(id);
}
@Override
public List<MesMoldDO> getAllList() {
return mesMoldMapper.selectList();
}
@Override
public List<MesMoldBrandDO> getMoldBrandList(Collection<Long> ids) {
return mesMoldBrandMapper.selectBatchIds(ids);
}
private void validateMoldBrandProductExists(Long id) {
if (mesMoldBrandProductMapper.selectById(id) == null) {
throw exception(MOLD_BRAND_PRODUCT_NOT_EXISTS);
}
}
private void deleteMoldBrandProductByBrandId(Long brandId) {
mesMoldBrandProductMapper.deleteByBrandId(brandId);
}
}

@ -0,0 +1,99 @@
package cn.iocoder.yudao.module.mes.service.mold;
import cn.hutool.core.collection.CollUtil;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
import cn.iocoder.yudao.module.mes.controller.admin.mold.vo.MoldPageReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.mold.vo.MoldRespVO;
import cn.iocoder.yudao.module.mes.controller.admin.mold.vo.MoldSaveReqVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.mold.MesMoldDO;
import javax.validation.Valid;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
/**
* Service
*
* @author
*/
public interface MoldService {
/**
*
*
* @param createReqVO
* @return
*/
Long createMold(@Valid MoldSaveReqVO createReqVO);
/**
*
*
* @param updateReqVO
*/
void updateMold(@Valid MoldSaveReqVO updateReqVO);
/**
*
*
* @param id
*/
void deleteMold(Long id);
/**
*
*
* @param id
* @return
*/
MesMoldDO getMold(Long id);
/**
*
*
* @param pageReqVO
* @return
*/
PageResult<MesMoldDO> getMoldPage(MoldPageReqVO pageReqVO);
List<MesMoldDO> getList(Collection<Long> ids);
default Map<Long, MesMoldDO> getMap(Collection<Long> ids) {
if (CollUtil.isEmpty(ids)) {
return new HashMap<>();
}
return CollectionUtils.convertMap(getList(ids), MesMoldDO::getId);
}
/**
*
*
* @param ids
* @return
*/
List<MesMoldDO> validMoldList(Collection<Long> ids);
/**
* VO
*
* @param ids
* @return VO
*/
List<MoldRespVO> getMoldVOList(Collection<Long> ids);
/**
* VO Map
*
* @param ids
* @return VO Map
*/
default Map<Long, MoldRespVO> getMoldVOMap(Collection<Long> ids) {
if(ids.isEmpty())return new HashMap<>();
return convertMap(getMoldVOList(ids), MoldRespVO::getId);
}
List<MoldRespVO> buildMoldVOList(List<MesMoldDO> list);
}

@ -0,0 +1,104 @@
package cn.iocoder.yudao.module.mes.service.mold;
import cn.hutool.core.collection.CollUtil;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.mes.controller.admin.mold.vo.MoldPageReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.mold.vo.MoldRespVO;
import cn.iocoder.yudao.module.mes.controller.admin.mold.vo.MoldSaveReqVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.mold.MesMoldDO;
import cn.iocoder.yudao.module.mes.dal.mysql.mold.MesMoldMapper;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.MOLD_NOT_EXISTS;
/**
* Service
*
* @author
*/
@Service("mesMoldService")
@Validated
public class MoldServiceImpl implements MoldService {
@Resource
private MesMoldMapper mesMoldMapper;
@Override
public Long createMold(MoldSaveReqVO createReqVO) {
// 插入
MesMoldDO mold = BeanUtils.toBean(createReqVO, MesMoldDO.class);
mesMoldMapper.insert(mold);
// 返回
return mold.getId();
}
@Override
public void updateMold(MoldSaveReqVO updateReqVO) {
// 校验存在
validateMoldExists(updateReqVO.getId());
// 更新
MesMoldDO updateObj = BeanUtils.toBean(updateReqVO, MesMoldDO.class);
mesMoldMapper.updateById(updateObj);
}
@Override
public void deleteMold(Long id) {
// 校验存在
validateMoldExists(id);
// 删除
mesMoldMapper.deleteById(id);
}
private void validateMoldExists(Long id) {
if (mesMoldMapper.selectById(id) == null) {
throw exception(MOLD_NOT_EXISTS);
}
}
@Override
public MesMoldDO getMold(Long id) {
return mesMoldMapper.selectById(id);
}
@Override
public PageResult<MesMoldDO> getMoldPage(MoldPageReqVO pageReqVO) {
return mesMoldMapper.selectPage(pageReqVO, pageReqVO.getBrandId());
}
@Override
public List<MesMoldDO> getList(Collection<Long> ids) {
return mesMoldMapper.selectBatchIds(ids);
}
@Override
public List<MesMoldDO> validMoldList(Collection<Long> ids) {
if (CollUtil.isEmpty(ids)) {
return Collections.emptyList();
}
return mesMoldMapper.selectBatchIds(ids);
}
@Override
public List<MoldRespVO> getMoldVOList(Collection<Long> ids) {
if (CollUtil.isEmpty(ids)) {
return Collections.emptyList();
}
List<MesMoldDO> list = mesMoldMapper.selectBatchIds(ids);
return buildMoldVOList(list);
}
@Override
public List<MoldRespVO> buildMoldVOList(List<MesMoldDO> list) {
if (CollUtil.isEmpty(list)) {
return Collections.emptyList();
}
return BeanUtils.toBean(list, MoldRespVO.class);
}
}

@ -4,10 +4,10 @@ import cn.hutool.core.collection.CollUtil;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.erp.dal.dataobject.mold.MoldBrandDO;
import cn.iocoder.yudao.module.erp.dal.dataobject.mold.MoldDO;
import cn.iocoder.yudao.module.erp.service.mold.MoldBrandService;
import cn.iocoder.yudao.module.erp.service.mold.MoldService;
import cn.iocoder.yudao.module.mes.dal.dataobject.mold.MesMoldBrandDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.mold.MesMoldDO;
import cn.iocoder.yudao.module.mes.service.mold.MoldBrandService;
import cn.iocoder.yudao.module.mes.service.mold.MoldService;
import cn.iocoder.yudao.module.mes.controller.admin.moldrecord.vo.MoldRecordPageReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.moldrecord.vo.MoldRecordRespVO;
import cn.iocoder.yudao.module.mes.controller.admin.moldrecord.vo.MoldRecordSaveReqVO;
@ -129,9 +129,9 @@ public class MoldRecordServiceImpl implements MoldRecordService {
Map<Long, AdminUserDO> userMap = userService.getUserMap(
convertSet(list, MoldRecordDO::getUserId));
Map<Long, MoldBrandDO> brandMap = moldBrandService.getMap(
Map<Long, MesMoldBrandDO> brandMap = moldBrandService.getMap(
convertSet(list, MoldRecordDO::getBrandId));
Map<Long, MoldDO> moldMap = moldService.getMap(
Map<Long, MesMoldDO> moldMap = moldService.getMap(
convertSet(list, MoldRecordDO::getMoldId));
Map<Long, MachineComponentDO> machineMap = machineComponentService.getMap(

@ -1,8 +1,10 @@
package cn.iocoder.yudao.module.mes.service.moldrepair;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.mes.controller.admin.moldrepair.vo.MoldRepairPageReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.moldrepair.vo.MoldRepairSaveReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.moldrepair.vo.MoldRepairLineRespVO;
import cn.iocoder.yudao.module.mes.controller.admin.moldrepair.vo.MoldRepairLineSaveReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.moldrepair.vo.MoldRepairUpdateReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.moldrepair.vo.*;
import cn.iocoder.yudao.module.mes.dal.dataobject.moldrepair.MoldRepairDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.moldrepair.MoldRepairLineDO;
import cn.iocoder.yudao.module.mes.dal.mysql.moldrepair.MoldRepairLineMapper;
@ -11,14 +13,14 @@ import javax.validation.Valid;
import java.util.List;
/**
* Service
* Service
*
* @author
*/
public interface MoldRepairService {
/**
*
*
*
* @param createReqVO
* @return
@ -26,43 +28,51 @@ public interface MoldRepairService {
Long createMoldRepair(@Valid MoldRepairSaveReqVO createReqVO);
/**
*
*
*
* @param updateReqVO
*/
void updateMoldRepair(@Valid MoldRepairSaveReqVO updateReqVO);
/**
*
*
*
* @param id
*/
void deleteMoldRepair(List<Long> idList);
/**
*
*
*
* @param id
* @return
* @return
*/
MoldRepairDO getMoldRepair(Long id);
/**
*
*
*
* @param pageReqVO
* @return
* @return
*/
PageResult<MoldRepairDO> getMoldRepairPage(MoldRepairPageReqVO pageReqVO);
// ==================== 子表(设备维修记录行) ====================
// ==================== 子表(模具维修记录行) ====================
/**
*
*
*
* @param repairId ID
* @return
* @return
*/
List<MoldRepairLineDO> getMoldRepairLineListByRepairId(Long repairId);
}
void updateRepairLine(@Valid MoldRepairLineSaveReqVO updateReqVO);
void batchUpdateTicketResults(@Valid List<MoldRepairLineSaveReqVO> updateReqVOList);
void updateMoldRepairStatus(@Valid MoldRepairUpdateReqVO updateReqVO);
List<MoldRepairLineRespVO> getRepairListByMoldId(Long moldId, String startTime, String endTime, String ids);
}

@ -2,22 +2,34 @@ package cn.iocoder.yudao.module.mes.service.moldrepair;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.iot.dal.dataobject.devicemodel.DeviceModelDO;
import cn.iocoder.yudao.module.mes.controller.admin.moldrepair.enums.RepairResultEnum;
import cn.iocoder.yudao.module.mes.controller.admin.moldrepair.vo.MoldRepairLineRespVO;
import cn.iocoder.yudao.module.mes.controller.admin.moldrepair.vo.MoldRepairLineSaveReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.moldrepair.vo.MoldRepairUpdateReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.moldrepair.vo.MoldRepairPageReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.moldrepair.vo.MoldRepairSaveReqVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.devicetype.DeviceTypeDO;
import cn.iocoder.yudao.module.mes.controller.admin.ticketresults.enums.JobResultEnum;
import cn.iocoder.yudao.module.mes.dal.dataobject.moldrepair.MoldRepairDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.moldrepair.MoldRepairLineDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.moldrepair.MoldRepairDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.moldrepair.MoldRepairLineDO;
import cn.iocoder.yudao.module.mes.dal.mysql.moldrepair.MoldRepairLineMapper;
import cn.iocoder.yudao.module.mes.dal.mysql.moldrepair.MoldRepairMapper;
import cn.iocoder.yudao.module.mes.service.moldrepair.MoldRepairService;
import com.alibaba.excel.util.StringUtils;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import java.util.List;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.stream.Collectors;
import lombok.extern.slf4j.Slf4j;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
@ -29,7 +41,7 @@ import cn.iocoder.yudao.framework.common.exception.ServiceException;
/**
* Service
* Service
*
* @author
*/
@ -53,7 +65,7 @@ public class MoldRepairServiceImpl implements MoldRepairService {
);
if (count > 0) {
throw exception(DV_REPAIR_CODE_EXISTS);
throw exception(MOLD_REPAIR_CODE_EXISTS);
}
// 插入
MoldRepairDO moldRepair = BeanUtils.toBean(createReqVO, MoldRepairDO.class);
@ -79,7 +91,7 @@ public class MoldRepairServiceImpl implements MoldRepairService {
);
if (count > 0) {
throw exception(DV_REPAIR_CODE_EXISTS);
throw exception(MOLD_REPAIR_CODE_EXISTS);
}
// 更新
@ -106,7 +118,7 @@ public class MoldRepairServiceImpl implements MoldRepairService {
private void validateMoldRepairExists(Long id) {
if (moldRepairMapper.selectById(id) == null) {
throw exception(DV_REPAIR_NOT_EXISTS);
throw exception(MOLD_REPAIR_NOT_EXISTS);
}
}
@ -120,7 +132,7 @@ public class MoldRepairServiceImpl implements MoldRepairService {
return moldRepairMapper.selectPage(pageReqVO);
}
// ==================== 子表(设备维修记录行) ====================
// ==================== 子表(模具维修记录行) ====================
@Override
public List<MoldRepairLineDO> getMoldRepairLineListByRepairId(Long repairId) {
@ -174,4 +186,233 @@ public class MoldRepairServiceImpl implements MoldRepairService {
moldRepairLineMapper.deleteByRepairId(repairId);
}
@Override
public void updateRepairLine(MoldRepairLineSaveReqVO updateReqVO) {
// 校验存在
validateMoldRepairLineExists(updateReqVO.getId());
// 更新
MoldRepairLineDO updateObj = BeanUtils.toBean(updateReqVO, MoldRepairLineDO.class);
moldRepairLineMapper.updateById(updateObj);
}
@Override
public void batchUpdateTicketResults(List<MoldRepairLineSaveReqVO> updateReqVOList) {
if (com.baomidou.mybatisplus.core.toolkit.CollectionUtils.isEmpty(updateReqVOList)) {
return;
}
// 1. 数据验证
validateBatchUpdateData(updateReqVOList);
// 2. 批量更新
List<MoldRepairLineDO> updateList = new ArrayList<>();
LocalDateTime now = LocalDateTime.now();
for (MoldRepairLineSaveReqVO vo : updateReqVOList) {
// 转换为DO
MoldRepairLineDO updateDO = BeanUtils.toBean(vo, MoldRepairLineDO.class);
updateDO.setUpdateTime(now);
updateList.add(updateDO);
}
// 3. 执行批量更新
moldRepairLineMapper.updateBatch(updateList);
//4. 判断是否全部已检验
handleInspectionResult(updateReqVOList);
}
@Override
public void updateMoldRepairStatus(MoldRepairUpdateReqVO updateReqVO) {
MoldRepairDO moldRepairDO = moldRepairMapper.selectById(updateReqVO.getId());
if ( moldRepairDO == null) {
throw exception(MOLD_REPAIR_NOT_EXISTS);
}
moldRepairDO.setRequireDate(updateReqVO.getRequireDate());
moldRepairDO.setFinishDate(updateReqVO.getFinishDate());
moldRepairDO.setConfirmDate(updateReqVO.getConfirmDate());
moldRepairDO.setRepairResult(updateReqVO.getRepairResult());
moldRepairMapper.updateById(moldRepairDO);
batchUpdateTicketResults(updateReqVO.getUpdateReqVOList());
}
@Override
public List<MoldRepairLineRespVO> getRepairListByMoldId(Long moldId, String startTime, String endTime, String ids) {
List<MoldRepairLineRespVO> moldRepairLineRespVOS = new ArrayList<>();
LambdaQueryWrapper<MoldRepairDO> wrapper = Wrappers.<MoldRepairDO>lambdaQuery()
.eq(MoldRepairDO::getMoldId, moldId);
// 处理开始时间
if (StringUtils.isNotBlank(startTime)) {
try {
LocalDateTime parseToLocalDateTime = parseToLocalDateTime(startTime);
wrapper.ge(MoldRepairDO::getFinishDate, parseToLocalDateTime);
} catch (Exception e) {
log.error("开始时间格式错误: {}, 异常: {}", startTime, e.getMessage(), e);
}
}
// 处理结束时间
if (StringUtils.isNotBlank(endTime)) {
try {
LocalDateTime parseToLocalDateTime = parseToLocalDateTime(endTime);
wrapper.le(MoldRepairDO::getFinishDate, parseToLocalDateTime);
} catch (Exception e) {
log.error("结束时间格式错误: {}, 异常: {}", startTime, e.getMessage(), e);
}
}
List<MoldRepairDO> moldRepairDOS = moldRepairMapper.selectList(wrapper);
for (MoldRepairDO moldRepairDO : moldRepairDOS) {
LambdaQueryWrapper<MoldRepairLineDO> moldRepairLineDOLambdaQueryWrapper = Wrappers.<MoldRepairLineDO>lambdaQuery()
.eq(MoldRepairLineDO::getRepairId, moldRepairDO.getId())
.orderByDesc(MoldRepairLineDO::getCreateTime);
List<MoldRepairLineDO> moldRepairLineDOS = moldRepairLineMapper.selectList(moldRepairLineDOLambdaQueryWrapper);
if (!moldRepairLineDOS.isEmpty()) {
List<MoldRepairLineRespVO> moldRepairLineRespVOList = moldRepairLineDOS.stream()
.map(doItem -> {
MoldRepairLineRespVO vo = new MoldRepairLineRespVO();
BeanUtils.copyProperties(doItem, vo);
vo.setRepairCode(moldRepairDO.getRepairCode());
vo.setRepairName(moldRepairDO.getRepairName());
vo.setFinishDate(moldRepairDO.getFinishDate());
// 设置维修结果描述
vo.setRepairResult(RepairResultEnum.getDescByCode(doItem.getResult()));
return vo;
})
.collect(Collectors.toList());
moldRepairLineRespVOS.addAll(moldRepairLineRespVOList);
}
}
// 在最终结果上过滤ids
if (StringUtils.isNotBlank(ids)) {
List<Long> idList = Arrays.stream(ids.split(","))
.map(String::trim)
.filter(StringUtils::isNotBlank)
.map(Long::valueOf)
.collect(Collectors.toList());
if (!idList.isEmpty()) {
moldRepairLineRespVOS = moldRepairLineRespVOS.stream()
.filter(vo -> idList.contains(vo.getId())) // 假设vo有getId()方法
.collect(Collectors.toList());
}
}
return moldRepairLineRespVOS;
}
private LocalDateTime parseToLocalDateTime(String timeStr) {
if (StringUtils.isBlank(timeStr)) {
return null;
}
timeStr = timeStr.trim();
try {
// 尝试解析 yyyy-MM-dd HH:mm:ss
if (timeStr.length() == 19) {
return LocalDateTime.parse(timeStr,
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
}
// 尝试解析 yyyy-MM-dd
else if (timeStr.length() == 10) {
return LocalDate.parse(timeStr,
DateTimeFormatter.ofPattern("yyyy-MM-dd"))
.atStartOfDay();
}
// 尝试解析 yyyy/MM/dd HH:mm:ss
else if (timeStr.contains("/")) {
return LocalDateTime.parse(timeStr.replace("/", "-"),
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
}
// 尝试ISO格式
else {
return LocalDateTime.parse(timeStr,
DateTimeFormatter.ISO_LOCAL_DATE_TIME);
}
} catch (Exception e) {
throw new IllegalArgumentException("时间格式不支持: " + timeStr, e);
}
}
private void handleInspectionResult(List<MoldRepairLineSaveReqVO> updateReqVOList) {
if (com.baomidou.mybatisplus.core.toolkit.CollectionUtils.isEmpty(updateReqVOList)) {
return;
}
// 检查是否有未填写的
boolean hasPending = updateReqVOList.stream()
.anyMatch(vo -> vo.getResult() == null || vo.getResult().equals(JobResultEnum.PENDING.getCode()));
if (hasPending) {
return;
}
MoldRepairDO moldRepairDO = moldRepairMapper.selectById(updateReqVOList.get(0).getRepairId());
if (moldRepairDO == null ){
throw exception(MOLD_REPAIR_NOT_EXISTS);
}
//设置为已完成
moldRepairDO.setStatus(JobResultEnum.PASS.getCode());
// 检查是否有不通过的
boolean hasFail = updateReqVOList.stream()
.anyMatch(vo -> vo.getResult() != null && vo.getResult().equals(JobResultEnum.FAIL.getCode()));
if (hasFail) {
moldRepairDO.setRepairStatus(JobResultEnum.FAIL.getCode());
} else {
moldRepairDO.setRepairStatus(JobResultEnum.PASS.getCode());
}
moldRepairMapper.updateById(moldRepairDO);
}
private void validateBatchUpdateData(List<MoldRepairLineSaveReqVO> updateReqVOList) {
if (com.baomidou.mybatisplus.core.toolkit.CollectionUtils.isEmpty(updateReqVOList)) {
return;
}
Set<Long> idSet = new HashSet<>();
for (int i = 0; i < updateReqVOList.size(); i++) {
MoldRepairLineSaveReqVO vo = updateReqVOList.get(i);
// 验证ID不能为空
if (vo.getId() == null) {
throw exception(MOLD_REPAIR_LINE_ID_NOT_EXISTS);
}
idSet.add(vo.getId());
// 调用单个验证逻辑
validateMoldRepairLineExists(vo.getId());
}
}
private void validateMoldRepairLineExists(Long id) {
if (moldRepairLineMapper.selectById(id) == null) {
throw exception(MOLD_REPAIR_LINE_NOT_EXISTS);
}
}
}

@ -4,7 +4,7 @@ import java.util.*;
import javax.validation.*;
import cn.iocoder.yudao.module.mes.controller.admin.moldrepairtems.vo.*;
import cn.iocoder.yudao.module.mes.dal.dataobject.criticalcomponent.CriticalComponentDO;
import cn.iocoder.yudao.module.erp.dal.dataobject.mold.MoldDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.mold.MesMoldDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.moldrepairtems.MoldRepairTemsDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;

@ -3,10 +3,10 @@ package cn.iocoder.yudao.module.mes.service.moldrepairtems;
//import cn.iocoder.yudao.module.iot.controller.admin.mold.vo.LineMoldRespVO;
//import cn.iocoder.yudao.module.iot.dal.dataobject.moldmodel.MoldModelDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.criticalcomponent.CriticalComponentDO;
import cn.iocoder.yudao.module.erp.dal.dataobject.mold.MoldDO;
import cn.iocoder.yudao.module.erp.dal.dataobject.mold.MoldBrandDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.mold.MesMoldDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.mold.MesMoldBrandDO;
import cn.iocoder.yudao.module.mes.dal.mysql.criticalcomponent.CriticalComponentMapper;
import cn.iocoder.yudao.module.erp.dal.mysql.mold.MoldMapper;
import cn.iocoder.yudao.module.mes.dal.mysql.mold.MesMoldMapper;
import cn.iocoder.yudao.module.mes.service.moldrepairtems.MoldRepairTemsService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
@ -46,7 +46,7 @@ public class MoldRepairTemsServiceImpl implements MoldRepairTemsService {
@Resource
private MoldMapper moldMapper;
private MesMoldMapper mesMoldMapper;
@Resource
private CriticalComponentMapper criticalComponentMapper;
@ -132,7 +132,7 @@ public class MoldRepairTemsServiceImpl implements MoldRepairTemsService {
// @Override
// public List<CriticalComponentDO> getComponentList(Long moldId) {
//
// MoldDO moldDO = moldMapper.selectById(moldId);
// MesMoldDO moldDO = mesMoldMapper.selectById(moldId);
// if(moldDO == null ){
// throw exception(DEVICE_LEDGER_NOT_EXISTS);
// }

@ -1,12 +1,12 @@
package cn.iocoder.yudao.module.mes.service.moldtaskmanagement;
import cn.iocoder.yudao.module.erp.dal.dataobject.mold.MoldDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.mold.MesMoldDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.moldsubject.MoldSubjectDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.moldplanmaintenance.MoldPlanMaintenanceDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.subjectmoldplan.SubjectMoldPlanDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.moldticketmanagement.MoldTicketManagementDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.moldticketresults.MoldTicketResultsDO;
import cn.iocoder.yudao.module.erp.dal.mysql.mold.MoldMapper;
import cn.iocoder.yudao.module.mes.dal.mysql.mold.MesMoldMapper;
import cn.iocoder.yudao.module.mes.dal.mysql.moldsubject.MoldSubjectMapper;
import cn.iocoder.yudao.module.mes.dal.mysql.moldplanmaintenance.MoldPlanMaintenanceMapper;
import cn.iocoder.yudao.module.mes.dal.mysql.subjectmoldplan.SubjectMoldPlanMapper;
@ -56,7 +56,7 @@ public class MoldTaskManagementServiceImpl implements MoldTaskManagementService
private MoldTicketResultsMapper moldticketResultsMapper;
@Resource
private MoldMapper moldMapper;
private MesMoldMapper mesMoldMapper;
@Resource
private MoldPlanMaintenanceMapper moldplanMaintenanceMapper;
@ -178,7 +178,7 @@ public PageResult<MoldTaskManagementDO> getMoldTaskManagementPage(MoldTaskManage
for (Long moldId : idList) {
MoldTicketManagementDO moldticketManagementDO = new MoldTicketManagementDO();
MoldDO moldDO = moldMapper.selectById(moldId);
MesMoldDO moldDO = mesMoldMapper.selectById(moldId);
moldticketManagementDO.setTaskId(moldtaskManagementDO.getId());
moldticketManagementDO.setPlanNo(generatePrefixedOrderNo());
moldticketManagementDO.setPlanId(moldtaskManagementDO.getProjectForm());

@ -6,6 +6,8 @@ import cn.iocoder.yudao.module.mes.controller.admin.moldticketmanagement.vo.*;
import cn.iocoder.yudao.module.mes.dal.dataobject.moldticketmanagement.MoldTicketManagementDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.module.mes.dal.dataobject.moldticketresults.MoldTicketResultsDO;
/**
* Service
@ -53,4 +55,8 @@ public interface MoldTicketManagementService {
PageResult<MoldTicketManagementDO> getMoldTicketManagementPage(MoldTicketManagementPageReqVO pageReqVO);
void batchUpdateJobStatus(@Valid MoldTicketManagementBatchUpdateReqVO reqVO);
List<MoldTicketResultsDO> getInspectionByMoldId(Long id, String startTime, String endTime, String ids);
List<MoldTicketResultsDO> getMaintenanceByMoldId(Long id, String startTime, String endTime, String ids);
}

@ -1,7 +1,19 @@
package cn.iocoder.yudao.module.mes.service.moldticketmanagement;
import cn.iocoder.yudao.module.mes.controller.admin.ticketmanagement.enums.PlanTypeEnum;
import cn.iocoder.yudao.module.mes.dal.dataobject.mold.MesMoldDO;
import cn.iocoder.yudao.module.mes.dal.mysql.mold.MesMoldMapper;
import cn.iocoder.yudao.module.mes.controller.admin.moldticketmanagement.enums.MoldPlanTypeEnum;
import cn.iocoder.yudao.module.mes.dal.dataobject.deviceledger.DeviceLedgerDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.moldticketresults.MoldTicketResultsDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.ticketresults.TicketResultsDO;
import cn.iocoder.yudao.module.mes.dal.mysql.deviceledger.DeviceLedgerMapper;
import cn.iocoder.yudao.module.mes.dal.mysql.moldticketresults.MoldTicketResultsMapper;
import cn.iocoder.yudao.module.mes.dal.mysql.ticketresults.TicketResultsMapper;
import cn.iocoder.yudao.module.mes.service.moldticketmanagement.MoldTicketManagementService;
import com.alibaba.excel.util.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
@ -32,6 +44,12 @@ public class MoldTicketManagementServiceImpl implements MoldTicketManagementServ
@Resource
private MoldTicketManagementMapper moldticketManagementMapper;
@Resource
@Lazy
private MesMoldMapper mesMoldMapper;
@Resource
@Lazy
private MoldTicketResultsMapper moldTicketResultsMapper;
@Override
public Long createMoldTicketManagement(MoldTicketManagementSaveReqVO createReqVO) {
@ -88,6 +106,32 @@ public class MoldTicketManagementServiceImpl implements MoldTicketManagementServ
moldticketManagementMapper.batchUpdateJobStatus(idList, reqVO.getJobStatus());
}
@Override
public List<MoldTicketResultsDO> getInspectionByMoldId(Long id, String startTime, String endTime, String ids) {
MesMoldDO moldDO = mesMoldMapper.selectById(id);
//点检列表
List<MoldTicketResultsDO> inspectionList = moldTicketResultsMapper.findByMoldIdAndPlanType(id, MoldPlanTypeEnum.INSPECTION.getCode(),startTime,endTime,ids);
if(CollectionUtils.isNotEmpty(inspectionList)){
moldDO.setInspectionList(inspectionList);
}
return inspectionList;
}
@Override
public List<MoldTicketResultsDO> getMaintenanceByMoldId(Long id,String startTime,String endTime,String ids) {
MesMoldDO moldDO = mesMoldMapper.selectById(id);
//保养列表
List<MoldTicketResultsDO> inspectionList = moldTicketResultsMapper.findByMoldIdAndPlanType(id, MoldPlanTypeEnum.MAINTENANCE.getCode(),startTime,endTime,ids);
if(CollectionUtils.isNotEmpty(inspectionList)){
moldDO.setInspectionList(inspectionList);
}
return inspectionList;
}
/**
* ID
*/

@ -0,0 +1,12 @@
<?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="cn.iocoder.yudao.module.mes.dal.mysql.goview.GoviewMapper">
<!--
一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。
代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
文档可见https://www.iocoder.cn/MyBatis/x-plugins/
-->
</mapper>

@ -12,19 +12,33 @@
<select id="findByMoldIdAndPlanType"
resultType="cn.iocoder.yudao.module.mes.dal.dataobject.moldticketresults.MoldTicketResultsDO">
SELECT
mtr.*
mtr.*,
mtm.task_time,
CONCAT( '(', su.username, ')', su.nickname) as operator
from
besure.mes_mold_ticket_results mtr
left join besure.mes_mold_ticket_management mtm on mtm.id = mtr.management_id
left join besure.system_users su on mtm.operator = su.id
WHERE 1=1
<!-- 必填条件 -->
<!-- ID集合过滤 -->
<if test="ids != null and ids != ''">
and mtr.id in
<foreach item="id" collection="ids.split(',')" open="(" separator="," close=")">
#{id}
</foreach>
</if>
<if test="moldId != null and moldId != ''">
and mtr.mold_id = #{moldId}
</if>
<if test="planType != null and planType != ''">
and mtm.plan_type= #{planType}
</if>
order by mtr.create_time desc
<!-- 点检时间范围过滤 -->
<if test="startTime != null">
and mtm.task_time &gt;= #{startTime}
</if>
<if test="endTime != null">
and mtm.task_time &lt;= #{endTime}
</if>
</select>
</mapper>
</mapper>

Loading…
Cancel
Save