class ProductAlarmTarget extends AbstractAlarmTarget {

    @Override
    public String getType() {
        return "product";
    }

    @Override
    public String getName() {
        return "产品";
    }

    @Override
    public Flux<AlarmTargetInfo> doConvert(AlarmData data) {<FILL_FUNCTION_BODY>}


}

        Map<String, Object> output = data.getOutput();
        String productId = AbstractAlarmTarget.getFromOutput("productId", output).map(String::valueOf).orElse(null);
        String productName = AbstractAlarmTarget.getFromOutput("productName", output).map(String::valueOf).orElse(productId);

        return Flux.just(AlarmTargetInfo.of(productId, productName, getType()));
    
<methods>public non-sealed void <init>() ,public final Flux<org.jetlinks.community.rule.engine.alarm.AlarmTargetInfo> convert(org.jetlinks.community.rule.engine.alarm.AlarmData) <variables>