package com.laoxie.auto.framework.rocketmq;

import com.alibaba.fastjson.JSON;
import com.zhuchi.zcii.framework.mq.rocketmq.RocketMsg;
import com.zhuchi.zcii.module.bpm.api.task.dto.BpmProcessInstanceNotifyReqDTO;
import com.laoxie.auto.enums.flow.FlowEnum;
import com.laoxie.auto.service.demo.DemoService;
import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

/**
 * @description: TODO
 * @author: bony
 * @create: 2024/4/10 11:59
 * @Version 1.0
 **/
@Slf4j
@Component
public class ConsumerService {
    @Resource
    private DemoService demoService;

    /*@Service
    @RocketMQMessageListener(topic = "${rocketmq.topic}", consumerGroup = "${rocketmq.consumer.group}")
    public class ConsumerSend implements RocketMQListener<RocketMsg> {
        // 监听到消息就会执行此方法
        @Override
        public void onMessage(RocketMsg msg) {
            log.info("监听到消息：msg={}", JSON.toJSONString(msg));
        }
    }*/

    // 注意：这个ConsumerSend2和上面ConsumerSend在没有添加tag做区分时，不能共存，
    // 不然生产者发送一条消息，这两个都会去消费，如果类型不同会有一个报错，所以实际运用中最好加上tag，写这只是让你看知道就行
    @Service
    @RocketMQMessageListener(topic = "${rocketmq.topic}",selectorExpression = "${spring.application.name}", consumerGroup = "${rocketmq.consumer.group}")
    public class ConsumerSend2 implements RocketMQListener<RocketMsg> {
        @Override
        public void onMessage(RocketMsg msg) {
            log.info("监听到消息：msg={}", JSON.toJSONString(msg));
            switch(msg.getType()){
                case "oa":
                    BpmProcessInstanceNotifyReqDTO reqDTO=JSON.parseObject(msg.getMsg(),BpmProcessInstanceNotifyReqDTO.class);
                    switch(FlowEnum.byType(reqDTO.getProcessDefinitionKey())){
                        case DEMO://合同
                            demoService.updateAuditStatus(Long.parseLong(reqDTO.getId()),reqDTO.getStatus());
                            break;
                        default:
                            break;
                    }
                    break;
                default:
                    break;
            }
        }
    }

    // MessageExt：是一个消息接收通配符，不管发送的是String还是对象，都可接收，当然也可以像上面明确指定类型（我建议还是指定类型较方便）
    /*@Service
    @RocketMQMessageListener(topic = "RLT_TEST_TOPIC", selectorExpression = "tag2", consumerGroup = "Con_Group_Three")
    public class Consumer implements RocketMQListener<MessageExt> {
        @Override
        public void onMessage(MessageExt messageExt) {
            byte[] body = messageExt.getBody();
            String msg = new String(body);
            log.info("监听到消息：msg={}", msg);
        }
    }*/
}
