package com.dy.pipIrrApp.workOrder; import com.alibaba.fastjson2.JSON; 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.DtoDeleteProResult; import com.dy.pipIrrApp.workOrder.dto.DtoDeleteWorkOrder; import com.dy.pipIrrApp.workOrder.qo.QoWorkOrder; import com.dy.pipIrrGlobal.pojoOp.OpeApproveResult; import com.dy.pipIrrGlobal.pojoOp.OpeProcessingResult; import com.dy.pipIrrGlobal.pojoOp.OpeWorkOrder; import com.dy.pipIrrGlobal.voOp.VoProcessingResult; 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.getWorkOrderId(), deleteWorkOrder.getDispatcherId()); 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") @SsoAop() 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()); } } /** * 上报工单处理结果 * 1.未上报的,直接上报 * 2. 已上报的的,提示用户不能重复上报 * 3. 已通过的,提示用户处理结果处理结果已通过 * 4. 驳回的,逻辑删除原处理结果,上报新的处理结果 * @param po * @param bindingResult * @return */ @PostMapping(path = "addProcessingResult") @Transactional(rollbackFor = Exception.class) @SsoAop() public BaseResponse addProcessingResult(@RequestBody @Valid OpeProcessingResult po, BindingResult bindingResult) { if(bindingResult != null && bindingResult.hasErrors()){ return BaseResponseUtils.buildFail(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage()); } String result = workOrderSv.addProcessingResult(po); if(!result.equals("success")) { return BaseResponseUtils.buildErrorMsg(result); } return BaseResponseUtils.buildSuccess(true) ; } /** * 逻辑删除一个处理结果 * @param deleteProResult * @param bindingResult * @return */ @PostMapping(path = "deleteProResult") @SsoAop() public BaseResponse deleteProResult(@RequestBody @Valid DtoDeleteProResult deleteProResult, BindingResult bindingResult) { if(bindingResult != null && bindingResult.hasErrors()){ return BaseResponseUtils.buildErrorMsg(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage()); } OpeProcessingResult proResult = workOrderSv.getProResult(deleteProResult.getProResultId(), deleteProResult.getInspectorId()); if(proResult == null) { return BaseResponseUtils.buildErrorMsg("您要删除的处理结果不存在"); } if(workOrderSv.deleteProResult(deleteProResult.getProResultId()) == 0) { return BaseResponseUtils.buildErrorMsg("处理结果删除失败"); } return BaseResponseUtils.buildSuccess(); } /** * 获取处理结果详情 * @param proResultId * @return */ @GetMapping(path = "/getProResult") @SsoAop() public BaseResponse getProResult(@RequestParam("proResultId") Long proResultId) { try { String aa = JSON.toJSONString(workOrderSv.getProResultById(proResultId)); System.out.println(aa); return BaseResponseUtils.buildSuccess(workOrderSv.getProResultById(proResultId)); } catch (Exception e) { log.error("获取处理结果详情异常", e); return BaseResponseUtils.buildException(e.getMessage()); } } /** * 审核处理结果 * @param po * @param bindingResult * @return */ @PostMapping(path = "approveProResult") @Transactional(rollbackFor = Exception.class) @SsoAop() public BaseResponse approveProResult(@RequestBody @Valid OpeApproveResult po, BindingResult bindingResult) { if(bindingResult != null && bindingResult.hasErrors()){ return BaseResponseUtils.buildFail(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage()); } String result = workOrderSv.approveProResult(po); if(!result.equals("success")) { return BaseResponseUtils.buildErrorMsg(result); } return BaseResponseUtils.buildSuccess(true) ; } }