package com.dy.pipIrrApp.workOrder; import com.dy.common.aop.SsoAop; import com.dy.common.webUtil.BaseResponse; import com.dy.common.webUtil.BaseResponseUtils; import com.dy.common.webUtil.QueryResultVo; import com.dy.pipIrrApp.workOrder.dto.DtoDeleteWorkOrder; import com.dy.pipIrrApp.workOrder.qo.QoWorkOrder; import com.dy.pipIrrGlobal.pojoOp.OpeProcessingResult; import com.dy.pipIrrGlobal.pojoOp.OpeWorkOrder; import com.dy.pipIrrGlobal.voOp.VoWorkOrder; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.rocketmq.client.exception.MQBrokerException; import org.apache.rocketmq.client.exception.MQClientException; import org.apache.rocketmq.client.producer.DefaultMQProducer; import org.apache.rocketmq.client.producer.SendResult; import org.apache.rocketmq.common.message.Message; import org.apache.rocketmq.remoting.exception.RemotingException; import org.apache.rocketmq.spring.core.RocketMQTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.MediaType; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.*; import java.nio.charset.StandardCharsets; import java.util.List; import java.util.Objects; /** * @author ZhuBaoMin * @date 2024-11-04 9:30 * @LastEditTime 2024-11-04 9:30 * @Description 工单控制类 */ @Slf4j @RestController @RequestMapping(path = "workOrder") @RequiredArgsConstructor public class WorkOrderCtrl { private final WorkOrderSv workOrderSv; @Autowired private RocketMQTemplate rocketMQTemplate; @Value("${rocketmq.name-server}") protected String nameServer; @Value("${rocketmq.producer.group}") protected String producerGroup; @Value("${rocketmq.topic}") protected String topic; /** * 创建工单 * @param po * @param bindingResult * @return */ @PostMapping(path = "addWorkOrder", consumes = MediaType.APPLICATION_JSON_VALUE) @Transactional(rollbackFor = Exception.class) @SsoAop() public BaseResponse addWorkOrder(@RequestBody @Valid OpeWorkOrder po, BindingResult bindingResult) throws MQBrokerException, RemotingException, InterruptedException, MQClientException { if(bindingResult != null && bindingResult.hasErrors()){ return BaseResponseUtils.buildErrorMsg(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage()); } if(po.getClientReportId() != null && po.getInspectorReportId() != null) { return BaseResponseUtils.buildErrorMsg("工单仅能关联一个问题上报"); } Long workOrderId = workOrderSv.insertWorkOrder(po); if(workOrderId == null || workOrderId == 0) { return BaseResponseUtils.buildErrorMsg("创建工单失败"); } VoWorkOrder voWorkOrder = workOrderSv.getWorkOrderById(workOrderId); if(voWorkOrder == null) { return BaseResponseUtils.buildErrorMsg("获取工单失败"); } if(!sendWorkOrder(voWorkOrder, workOrderId)) { return BaseResponseUtils.buildErrorMsg("工单推送失败"); } return BaseResponseUtils.buildSuccess(); } /** * 通过RocketMQ推送工单主键 * @param voWorkOrder 工单视图对象 * @param workOrderId 工单ID * @return * @throws MQClientException * @throws MQBrokerException * @throws RemotingException * @throws InterruptedException */ private Boolean sendWorkOrder(VoWorkOrder voWorkOrder, Long workOrderId) throws MQClientException, MQBrokerException, RemotingException, InterruptedException { String tag = voWorkOrder.getInspector(); String key = voWorkOrder.getInspectorId().toString(); //String message = JSON.toJSONString(voWorkOrder); String message = workOrderId.toString(); DefaultMQProducer producer = new DefaultMQProducer(producerGroup); producer.setNamesrvAddr(nameServer); producer.start(); Message msg = new Message(topic, tag, key, message.getBytes(StandardCharsets.UTF_8)); SendResult approveSendResult = producer.send(msg); if(!approveSendResult.getSendStatus().toString().equals("SEND_OK")) { return false; } return true; } /** * 逻辑删除指定派单人的指定未删除工单 * 先判断指定派单人、未删除的指定工单是否存在 * @param deleteWorkOrder 删除工单传输类 * @param bindingResult * @return */ @PostMapping(path = "deleteWorkOrder") @SsoAop() public BaseResponse deleteWorkOrder(@RequestBody @Valid DtoDeleteWorkOrder deleteWorkOrder, BindingResult bindingResult) { if(bindingResult != null && bindingResult.hasErrors()){ return BaseResponseUtils.buildErrorMsg(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage()); } OpeWorkOrder workOrder = workOrderSv.getWorkOrder(deleteWorkOrder.getDispatcherId(), deleteWorkOrder.getWorkOrderId()); if(workOrder == null) { return BaseResponseUtils.buildErrorMsg("您要删除的工单不存在"); } if(workOrderSv.deleteWorkOrder(deleteWorkOrder.getWorkOrderId()) == 0) { return BaseResponseUtils.buildErrorMsg("工单删除失败"); } return BaseResponseUtils.buildSuccess(); } /** * 根据指定条件获取未删除的工单列表 * @param qo * @return */ @GetMapping(path = "/getWorkOrders") @SsoAop() public BaseResponse>> getWorkOrders(QoWorkOrder qo){ try { return BaseResponseUtils.buildSuccess(workOrderSv.getWorkOrders(qo)); } catch (Exception e) { return BaseResponseUtils.buildException(e.getMessage()) ; } } /** * 获取工单详情 * @param workOrderId * @return */ @GetMapping(path = "/getOneWorkOrder") public BaseResponse getOneWorkOrder(@RequestParam("workOrderId") Long workOrderId) { try { return BaseResponseUtils.buildSuccess(workOrderSv.getWorkOrderById(workOrderId)); } catch (Exception e) { log.error("获取工单详情异常", e); return BaseResponseUtils.buildException(e.getMessage()); } } /** * 上报工单处理结果 * 判断该工单是否存在有效的处理结果,如果存在则提示用户该工单已存在处理结果 * 添加处理结果回复 * @param po * @param bindingResult * @return */ @PostMapping(path = "addProcessingResult") @Transactional(rollbackFor = Exception.class) public BaseResponse addProcessingResult(@RequestBody @Valid OpeProcessingResult po, BindingResult bindingResult) { if(bindingResult != null && bindingResult.hasErrors()){ return BaseResponseUtils.buildFail(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage()); } if(workOrderSv.hasValidProcessingResult(po.getWorkOrderId())) { return BaseResponseUtils.buildErrorMsg("该工单存在有效的处理结果"); } Long processingResultId = workOrderSv.insertProcessingResult(po); if(processingResultId == null) { return BaseResponseUtils.buildErrorMsg("上报工单处理结果失败"); } return BaseResponseUtils.buildSuccess(true) ; } }