package org.jeecg.modules.mdc.service.impl; import cn.hutool.core.date.DatePattern; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.StringPool; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.apache.commons.compress.utils.Lists; import org.apache.commons.lang3.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.apache.shiro.SecurityUtils; import org.jeecg.common.constant.WebsocketConst; import org.jeecg.common.exception.JeecgBootException; import org.jeecg.common.system.api.ISysBaseAPI; import org.jeecg.common.system.vo.LoginUser; import org.jeecg.modules.board.vo.EquAndon; import org.jeecg.modules.mdc.dto.MdcEquProDto; import org.jeecg.modules.mdc.entity.AndonOrder; import org.jeecg.modules.mdc.mapper.AndonOrderMapper; import org.jeecg.modules.mdc.service.IAndonOrderService; import org.jeecg.modules.mdc.service.IMdcEquipmentService; import org.jeecg.modules.mdc.util.DateUtils; import org.jeecg.modules.mdc.vo.AndonOrderWebSocketVo; import org.jeecg.modules.mdc.vo.MdcDeviceCalendarVo; import org.jeecg.modules.message.websocket.WebSocket; import org.jeecg.modules.system.service.ISysDictService; import org.jeecg.modules.system.service.ISysUserService; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import java.util.*; import java.util.stream.Collectors; /** * @Description: andon_order * @Author: jeecg-boot * @Date: 2025-06-11 * @Version: V1.0 */ @Service public class AndonOrderServiceImpl extends ServiceImpl implements IAndonOrderService { @Resource private IMdcEquipmentService mdcEquipmentService; @Resource private WebSocket webSocket; @Resource private ISysUserService userService; @Resource private ISysDictService sysDictService; @Resource private ISysBaseAPI sysBaseApi; @Override @Transactional public void procedureCall(AndonOrder andonOrder) { if (StringUtils.isBlank(andonOrder.getEquipmentId())) { throw new JeecgBootException("请选择设备!"); } LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal(); String userId = user.getId(); List equipmentIds = Arrays.asList(andonOrder.getEquipmentId().split(StringPool.COMMA)); List equipmentList = mdcEquipmentService.findEquProList(equipmentIds); Map equipmentIdToProductionIdMap = equipmentList.stream().collect(Collectors.toMap(MdcEquProDto::getEquipmentId, comRateDto -> comRateDto)); List list = Lists.newArrayList(); for (String equipmentId : equipmentIds) { AndonOrder andonOrderInfo = new AndonOrder(); andonOrderInfo.setEquipmentId(equipmentId); andonOrderInfo.setPlantName(equipmentIdToProductionIdMap != null && equipmentIdToProductionIdMap.containsKey(equipmentId) ? equipmentIdToProductionIdMap.get(equipmentId).getId() : null); andonOrderInfo.setAndonType(StringPool.ONE); andonOrderInfo.setOrderStatus(StringPool.ONE); andonOrderInfo.setOperator(userId); andonOrderInfo.setOperateTime(new Date()); andonOrderInfo.setResponder(andonOrder.getOperator()); andonOrderInfo.setCallReason(andonOrder.getCallReason()); list.add(andonOrderInfo); } if (this.saveBatch(list)) { List andonOrderWebSocketVoList = Lists.newArrayList(); //设置websocket请求消息数据 for (AndonOrder order : list) { AndonOrderWebSocketVo andonOrderWebSocketVo = new AndonOrderWebSocketVo(); andonOrderWebSocketVo.setEquipmentId(order.getEquipmentId()); andonOrderWebSocketVo.setCallPersonnel(userService.getById(order.getOperator()).getRealname()); andonOrderWebSocketVo.setCallTime(DateUtils.format(order.getOperateTime(), DatePattern.NORM_DATE_PATTERN)); andonOrderWebSocketVo.setCallReason(order.getCallReason()); andonOrderWebSocketVo.setAndonType("程序呼叫"); andonOrderWebSocketVo.setPersonResponsible(user.getRealname()); andonOrderWebSocketVo.setRepairTime(StringPool.EMPTY); andonOrderWebSocketVo.setFaultInfo(StringPool.EMPTY); andonOrderWebSocketVo.setType("open"); andonOrderWebSocketVo.setPlantName(equipmentIdToProductionIdMap != null && equipmentIdToProductionIdMap.containsKey(order.getEquipmentId()) ? equipmentIdToProductionIdMap.get(order.getEquipmentId()).getProductionName() : null); andonOrderWebSocketVoList.add(andonOrderWebSocketVo); } //发送websocket请求 JSONObject jsonObject = new JSONObject(); jsonObject.put(WebsocketConst.MSG_CMD, "andon"); jsonObject.put("data", andonOrderWebSocketVoList); webSocket.sendMessage(jsonObject.toJSONString()); } } /** * 安灯问题列表 */ @Override public List equAndonList(List equipmentIdList) { List result = new ArrayList<>(); List andonOrderList = this.baseMapper.equAndonList(equipmentIdList); if (andonOrderList != null && !andonOrderList.isEmpty()) { andonOrderList.forEach(andonOrder -> { EquAndon equAndon = new EquAndon(); equAndon.setEquipmentId(andonOrder.getEquipmentId()); StringBuilder infoBuilder = new StringBuilder(); infoBuilder.append("安灯类型: ").append(sysDictService.queryDictTextByKey("andon_type",andonOrder.getAndonType())).append("\n"); infoBuilder.append("安灯人: ").append(sysDictService.queryTableDictTextByKey("sys_user", "realname", "id", andonOrder.getOperator())).append("\n"); infoBuilder.append("安灯时间: ").append(DateUtils.format(andonOrder.getOperateTime(), DateUtils.STR_DATE_TIME_SMALL)).append("\n"); infoBuilder.append("安灯状态: ").append(sysDictService.queryDictTextByKey("order_status",andonOrder.getOrderStatus())).append("\n"); equAndon.setAndonInfo(infoBuilder.toString()); result.add(equAndon); }); } return result; } @Override public List untreatedAndonList() { List result = new ArrayList<>(); List andonOrderList = this.baseMapper.untreatedAndonList(); if (andonOrderList != null && !andonOrderList.isEmpty()) { List equipmentIds = andonOrderList.stream().map(AndonOrder::getEquipmentId).collect(Collectors.toList()); List equipmentList = mdcEquipmentService.findEquProList(equipmentIds); Map equipmentIdToProductionIdMap = CollectionUtils.isNotEmpty(equipmentList) ? equipmentList.stream().collect(Collectors.toMap(MdcEquProDto::getEquipmentId, comRateDto -> comRateDto)) : new HashMap<>(); andonOrderList.forEach(andonOrder -> { AndonOrderWebSocketVo andonOrderWebSocketVo = new AndonOrderWebSocketVo(); andonOrderWebSocketVo.setEquipmentId(andonOrder.getEquipmentId()); andonOrderWebSocketVo.setCallPersonnel(userService.getById(andonOrder.getOperator()).getRealname()); andonOrderWebSocketVo.setCallTime(DateUtils.format(andonOrder.getOperateTime(), DatePattern.NORM_DATE_PATTERN)); andonOrderWebSocketVo.setCallReason(andonOrder.getCallReason()); andonOrderWebSocketVo.setAndonType("程序呼叫"); andonOrderWebSocketVo.setPersonResponsible(userService.getById(andonOrder.getResponder()).getRealname()); andonOrderWebSocketVo.setRepairTime(StringPool.EMPTY); andonOrderWebSocketVo.setFaultInfo(StringPool.EMPTY); andonOrderWebSocketVo.setType("open"); andonOrderWebSocketVo.setPlantName(equipmentIdToProductionIdMap != null && equipmentIdToProductionIdMap.containsKey(andonOrder.getEquipmentId()) ? equipmentIdToProductionIdMap.get(andonOrder.getEquipmentId()).getProductionName() : null); result.add(andonOrderWebSocketVo); }); } return result; } @Override @Transactional public void responseData(List ids) { if (CollectionUtils.isEmpty(ids)) { throw new JeecgBootException("请选择要响应的数据"); } List andonOrderList = this.listByIds(ids); List existAlreadyResponsedList = andonOrderList.stream().filter(andonOrder -> !"1".equals(andonOrder.getOrderStatus())).collect(Collectors.toList()); if (CollectionUtils.isNotEmpty(existAlreadyResponsedList)) { throw new JeecgBootException("存在已响应的安灯信息,无需重复响应"); } for (AndonOrder andonOrder : andonOrderList) { andonOrder.setOrderStatus("2"); andonOrder.setResponseTime(new Date()); } //查询厂房信息 List equipmentIds = andonOrderList.stream().map(AndonOrder::getEquipmentId).collect(Collectors.toList()); List equipmentList = mdcEquipmentService.findEquProList(equipmentIds); Map equipmentIdToProductionIdMap = equipmentList.stream().collect(Collectors.toMap(MdcEquProDto::getEquipmentId, comRateDto -> comRateDto)); //保存成功后设备发送websocket消息 if (this.updateBatchById(andonOrderList)) { List andonOrderWebSocketVoList = Lists.newArrayList(); //设置websocket请求消息数据 for (AndonOrder order : andonOrderList) { AndonOrderWebSocketVo andonOrderWebSocketVo = new AndonOrderWebSocketVo(); andonOrderWebSocketVo.setEquipmentId(order.getEquipmentId()); andonOrderWebSocketVo.setCallPersonnel(userService.getById(order.getOperator()).getRealname()); andonOrderWebSocketVo.setCallTime(DateUtils.format(order.getOperateTime(), DatePattern.NORM_DATE_PATTERN)); andonOrderWebSocketVo.setCallReason(order.getCallReason()); andonOrderWebSocketVo.setAndonType("程序呼叫"); andonOrderWebSocketVo.setPersonResponsible(sysBaseApi.getUserById(order.getOperator()).getRealname()); andonOrderWebSocketVo.setRepairTime(StringPool.EMPTY); andonOrderWebSocketVo.setFaultInfo(StringPool.EMPTY); andonOrderWebSocketVo.setType("close"); andonOrderWebSocketVo.setPlantName(equipmentIdToProductionIdMap != null && equipmentIdToProductionIdMap.containsKey(order.getEquipmentId()) ? equipmentIdToProductionIdMap.get(order.getEquipmentId()).getProductionName() : null); andonOrderWebSocketVoList.add(andonOrderWebSocketVo); } //发送websocket请求 JSONObject jsonObject = new JSONObject(); jsonObject.put(WebsocketConst.MSG_CMD, "andon"); jsonObject.put("data", andonOrderWebSocketVoList); webSocket.sendMessage(jsonObject.toJSONString()); } } @Override @Transactional public void dealWith(AndonOrder andonOrder) { if (Objects.isNull(andonOrder)) { throw new JeecgBootException("请选择需要处理的安灯信息"); } if (StringUtils.isBlank(andonOrder.getResolutionDescreption())) { throw new JeecgBootException("处理结果描述不能为空"); } LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal(); andonOrder.setProcessor(user.getId()); andonOrder.setProcessTime(new Date()); andonOrder.setOrderStatus("3"); this.updateById(andonOrder); } @Override public IPage pageList(String userId, AndonOrder andonOrder, Integer pageNo, Integer pageSize, HttpServletRequest req) { IPage pageData = new Page<>(pageNo, pageSize); return this.baseMapper.pageList(pageData, andonOrder, userId); } }