package org.springblade.mdm.thirdpart.controller; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springblade.core.tool.api.R; import org.springblade.core.tool.utils.DateUtil; import org.springblade.mdm.basesetting.producedivision.entity.QinzheFgb; import org.springblade.mdm.basesetting.producedivision.service.QinzheFgbService; import org.springblade.mdm.flow.constants.FlowContants; import org.springblade.mdm.flow.entity.TaskDispatch; import org.springblade.mdm.flow.excution.StartDispatcher; import org.springblade.mdm.flow.service.TaskDispatchService; import org.springblade.mdm.flow.vo.FlowStartResult; import org.springblade.mdm.flow.vo.TaskAssignVO; import org.springblade.mdm.thirdpart.service.MesTaskService; import org.springblade.mdm.thirdpart.vo.MesTaskFinishVO; import org.springblade.mdm.thirdpart.vo.MesTaskVO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.util.ArrayList; import java.util.List; @Slf4j @RestController @RequestMapping("/thirdparty/") @Tag(name = "MES接口", description = "MES接口") public class MesController { @Autowired private MesTaskService mesTaskService; @Autowired private StartDispatcher dispatcher; @Autowired private TaskDispatchService taskDispatchService; @Autowired private QinzheFgbService qinzheFgbService; /** * 新增 */ @PostMapping("/mes-new-task") @Operation(summary = "接收MES任务", description = "接收MES任务") public R newTask(@RequestBody MesTaskVO mesTaskVO) { try { TaskAssignVO startVO = this.toTaskAssignVO(mesTaskVO); List errors = checkTaskData(startVO); if (!errors.isEmpty()) { String msg = formatError(errors); log.error("接收MES任务{},验证失败:{}",mesTaskVO,msg); return R.fail(msg); } TaskDispatch dispatch = mesTaskService.saveTask(startVO); log.info("MES任务保存成功"); if(!dispatch.isDuplicateTask()){ try { FlowStartResult result = dispatcher.start(startVO); dispatch.setStatus(TaskDispatch.STATUS_STARTED); dispatch.setProcessInstanceId(result.getProcessInstanceId()); dispatch.setProgramNo(result.getProgramNo()); taskDispatchService.updateById(dispatch); }catch (Exception e){ dispatch.setStatus(TaskDispatch.STATUS_EXCEPTION); dispatch.setErrMsg(e.getMessage()); taskDispatchService.updateById(dispatch); log.error("MES任务启动失败", e); } } return R.success(); }catch (Exception e) { log.error("接收mes任务失败", e); return R.fail(e.getMessage()); } } //private IResultCode formatError(List errors) { private String formatError(List errors) { return StringUtils.join(errors,","); } /** * 验证数据 * @param startVO * @return 粗呕信息列表 */ private List checkTaskData(TaskAssignVO startVO) { List errorList = new ArrayList<>(); if(StringUtils.isBlank(startVO.getDrawingNo())){ errorList.add("图号不能为空"); } if(StringUtils.isBlank(startVO.getProcessNo())){ errorList.add("工序号不能为空"); } if(StringUtils.isBlank(startVO.getProcessEdition())){ errorList.add("工序版次不能为空"); } if(StringUtils.isBlank(startVO.getMachineCode())){ errorList.add("设备编码不能为空"); } if(StringUtils.isBlank(startVO.getProcessName())){ errorList.add("工序名称不能为空"); } return errorList; } /** * 从mesvo转换为内部任务分派vo * @param mesTaskVO mes发送数据VO * @return mdm内部的派工VO */ TaskAssignVO toTaskAssignVO(MesTaskVO mesTaskVO) { TaskAssignVO taskAssignVO = new TaskAssignVO(); taskAssignVO.setOrderNumber(mesTaskVO.getOrderNumber()); taskAssignVO.setDrawingNo(mesTaskVO.getDrawingCode()); taskAssignVO.setDrawingNoEdition(mesTaskVO.getDrawingVersion()); taskAssignVO.setProcessNo(mesTaskVO.getOperationCode()); taskAssignVO.setProcessName(mesTaskVO.getOperationName()); taskAssignVO.setCraftEdition(mesTaskVO.getRoutingVersion()); taskAssignVO.setProcessEdition(mesTaskVO.getOperationVersion()); taskAssignVO.setOperationId(mesTaskVO.getOperationId()); taskAssignVO.setMachineCode(mesTaskVO.getEquipmentCode()); taskAssignVO.setMachineMode(mesTaskVO.getEquipmentModel()); taskAssignVO.setDispatchBy(mesTaskVO.getDspatchBy()); if (mesTaskVO.getProductModel() != null) { taskAssignVO.setProductModel(mesTaskVO.getProductModel()); }else{ taskAssignVO.setProductModel(this.queryProductModel(mesTaskVO.getDrawingCode())); } try { taskAssignVO.setPlanStartTime(DateUtil.fromDate(DateUtil.parse(mesTaskVO.getPlanStartTime(),"yyyy-MM-dd HH:mm:ss")).toLocalDate()); }catch(Exception e){ log.error("接收mes数据,计划开始时间转换错误"); } taskAssignVO.setTitle(taskAssignVO.getDrawingNo()+"-"+taskAssignVO.getProcessNo()+"-"+taskAssignVO.getProcessEdition()+"计划任务"); taskAssignVO.setIsTempFlow(FlowContants.N); return taskAssignVO; } /** * 查询产品型号 * @param drawingNo 图号 * @return 产品型号 */ String queryProductModel(String drawingNo){ QinzheFgb fgb = qinzheFgbService.getByLjh(drawingNo); if(fgb!= null){ return fgb.getCph(); }else{ return null; } } @PostMapping("/mes-finish-task") @Operation(summary = "MES任务完成推送", description = "MES任务完成推送") public R finishTask(@RequestBody MesTaskFinishVO finishTaskVO) { log.info("收到mes任务完成推送:{}",finishTaskVO); List errors = checkFinishTaskData(finishTaskVO); if (!errors.isEmpty()) { String msg = formatError(errors); log.error("接收MES完成推送{},验证失败:{}",finishTaskVO,msg); return R.fail(msg); } try { mesTaskService.finishTask(finishTaskVO); return R.success(); }catch(Exception e){ log.error("接收MES工序完成信息失败", e); return R.fail("内部错误"); } } /** * MES二次推送数据检查 * @param finishTaskVO 二次推送数据 * @return 错误信息列表 */ private List checkFinishTaskData(MesTaskFinishVO finishTaskVO) { List errorList = new ArrayList<>(); if(StringUtils.isBlank(finishTaskVO.getOperationId())){ errorList.add("工序唯一码不能为空"); } if(StringUtils.isBlank(finishTaskVO.getInspector())){ errorList.add("检验员不能为空"); } if(finishTaskVO.getAcruslEndEime() == null){ errorList.add("检验反馈时间不能为空"); } return errorList; } @GetMapping("/ping") @Operation(summary = "MES ping", description = "测试接口通畅") public R ping() { try { return R.data("pong"); }catch (Exception e) { return R.fail(e.getMessage()); } } }