Commit ba555eef by ping.wu

支付查询mq迁移,去掉分发器sdk

parent 53cea7d7
...@@ -23,17 +23,17 @@ ...@@ -23,17 +23,17 @@
<artifactId>xxl-job-core</artifactId> <artifactId>xxl-job-core</artifactId>
<version>2.0.1</version> <version>2.0.1</version>
</dependency> </dependency>
<dependency> <!-- <dependency>-->
<groupId>com.freemud.sdk.api.assortment</groupId> <!-- <groupId>com.freemud.sdk.api.assortment</groupId>-->
<artifactId>assortment-orderdistributor-sdk</artifactId> <!-- <artifactId>assortment-orderdistributor-sdk</artifactId>-->
<version>3.5.6.RELEASE</version> <!-- <version>3.5.6.RELEASE</version>-->
<exclusions> <!-- <exclusions>-->
<exclusion> <!-- <exclusion>-->
<groupId>cn.freemud</groupId> <!-- <groupId>cn.freemud</groupId>-->
<artifactId>ordercenter-sdk</artifactId> <!-- <artifactId>ordercenter-sdk</artifactId>-->
</exclusion> <!-- </exclusion>-->
</exclusions> <!-- </exclusions>-->
</dependency> <!-- </dependency>-->
<dependency> <dependency>
<groupId>com.freemud.application.service.sdk</groupId> <groupId>com.freemud.application.service.sdk</groupId>
......
package cn.freemud.amp.config;
import com.freemud.application.sdk.api.config.TopicExchangeConfig;
import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;
@Component
public class DlPaymentMqConfig {
public static final String OPEN_STORE_PAYMENT_QUERY_DL_QUEUE = "open_store_payment_query_dl_queue";
public static final String OPEN_STORE_PAYMENT_QUERY_DL_KEY = "open_store_payment_query_dl_key";
public static final String OPEN_STORE_PAYMENT_QUERY_QUEUE = "open_store_payment_query_queue";
public static final String OPEN_STORE_PAYMENT_QUERY_KEY = "open_store_payment_query_key";
/**
* 写入RabbitMQ使用的默认队列
*
* @return
*/
@Bean("paymentQueueName")
public Queue paymentChangeQueue() {
return QueueBuilder.durable(OPEN_STORE_PAYMENT_QUERY_QUEUE).build();
}
/**
* 绑定消息队列
*
* @param queue 消息队列
* @param topicExchange RabbitMQ Fanout Exchange
* @return 消息队列绑定
*/
@Bean("bindingPaymentQueueChange")
Binding bindingPaymentChange(@Qualifier("paymentQueueName") Queue queue, @Qualifier("orderPushTopicExchange") Exchange topicExchange) {
return BindingBuilder.bind(queue).to(topicExchange).with(OPEN_STORE_PAYMENT_QUERY_KEY).noargs();
}
@Bean("paymentChangeDlQueue")
public Queue paymentChangeDlQueue() {
Map<String, Object> delayQueueParams = new HashMap<>(2);
// DLX,dead letter发送到的exchange
delayQueueParams.put("x-dead-letter-exchange", TopicExchangeConfig.EXCHANGE_NAME);
// dead letter携带的routing key
delayQueueParams.put("x-dead-letter-routing-key", OPEN_STORE_PAYMENT_QUERY_KEY);
//时间
//delayQueueParams.put("x-message-ttl", 20*1000);
return QueueBuilder.durable(OPEN_STORE_PAYMENT_QUERY_DL_QUEUE).withArguments(delayQueueParams).build();
}
@Bean("bindingPaymentDlChange")
Binding bindingPaymentDlChange(@Qualifier("paymentChangeDlQueue") Queue queue, @Qualifier("orderPushTopicExchange") Exchange topicExchange) {
Map<String, Object> args = new HashMap<>(2);
args.put("x-dead-letter-exchange", TopicExchangeConfig.EXCHANGE_NAME);
args.put("x-dead-letter-routing-key", OPEN_STORE_PAYMENT_QUERY_KEY);
return BindingBuilder.bind(queue).to(topicExchange).with(OPEN_STORE_PAYMENT_QUERY_DL_KEY).and(args);
}
}
package cn.freemud.entities.dto.pay;
import lombok.Data;
@Data
public class PaymentMqMessageDto {
/**
* ( 非码交易流水号 fmID)
*/
private String fmId;
/**
* 订单号
*/
private String orderId;
/**
* 商户号
*/
private String partnerId;
/**
* 门店号
*/
private String storeId;
private String trackingNo;
/**
* 支付渠道
*/
private Integer payChannelType;
}
package cn.freemud.service; //package cn.freemud.service;
//
//
import com.freemud.sdk.api.assortment.orderdistributor.request.DisRequest; //import com.freemud.sdk.api.assortment.orderdistributor.request.DisRequest;
//
/** ///**
* All rights Reserved, Designed By www.freemud.cn // * All rights Reserved, Designed By www.freemud.cn
* // *
* @version V1.0 // * @version V1.0
* @Title: ${FILE_NAME} // * @Title: ${FILE_NAME}
* @Package com.freemud.mail.core // * @Package com.freemud.mail.core
* @Description: $MQ分发器服务接口 // * @Description: $MQ分发器服务接口
* @author: aiqi.gong // * @author: aiqi.gong
* @date: 2019/3/21 18:37 // * @date: 2019/3/21 18:37
* @Copyright: 2018 www.freemud.cn Inc. All rights reserved. // * @Copyright: 2018 www.freemud.cn Inc. All rights reserved.
* 注意:本内容仅限于上海非码科技内部传阅,禁止外泄以及用于其他的商业目 // * 注意:本内容仅限于上海非码科技内部传阅,禁止外泄以及用于其他的商业目
*/ // */
public interface OrderDistributeMQService { //public interface OrderDistributeMQService {
//
/** // /**
* 消息分发 // * 消息分发
* @param disRequest 消息体 // * @param disRequest 消息体
*/ // */
void messageDistribute(DisRequest disRequest); // void messageDistribute(DisRequest disRequest);
//
} //}
...@@ -30,6 +30,7 @@ import cn.freemud.entities.dto.QueryOrdersResponseDto.DataBean.OrderBean; ...@@ -30,6 +30,7 @@ import cn.freemud.entities.dto.QueryOrdersResponseDto.DataBean.OrderBean;
import cn.freemud.entities.dto.delivery.*; import cn.freemud.entities.dto.delivery.*;
import cn.freemud.entities.dto.order.CreateOrderOperateDto; import cn.freemud.entities.dto.order.CreateOrderOperateDto;
import cn.freemud.entities.dto.order.CreatePrepayRequestDto; import cn.freemud.entities.dto.order.CreatePrepayRequestDto;
import cn.freemud.entities.dto.pay.PaymentMqMessageDto;
import cn.freemud.entities.dto.product.AttributeValue; import cn.freemud.entities.dto.product.AttributeValue;
import cn.freemud.entities.dto.product.GroupDetail; import cn.freemud.entities.dto.product.GroupDetail;
import cn.freemud.entities.dto.product.ProductAttributeGroup; import cn.freemud.entities.dto.product.ProductAttributeGroup;
...@@ -104,8 +105,6 @@ import cn.freemud.service.mccafe.CouponClientService; ...@@ -104,8 +105,6 @@ import cn.freemud.service.mccafe.CouponClientService;
import cn.freemud.service.mccafe.MCCafeOrderCenterSdkService; import cn.freemud.service.mccafe.MCCafeOrderCenterSdkService;
import com.freemud.sdk.api.assortment.order.service.OrderCenterSdkService; import com.freemud.sdk.api.assortment.order.service.OrderCenterSdkService;
import com.freemud.sdk.api.assortment.order.vo.ProductGroupVo; import com.freemud.sdk.api.assortment.order.vo.ProductGroupVo;
import com.freemud.sdk.api.assortment.orderdistributor.entity.dto.PaymentMqMessageDto;
import com.freemud.sdk.api.assortment.orderdistributor.service.PaymentQueueService;
import com.freemud.sdk.api.assortment.payment.request.UnifiedOrderRequest; import com.freemud.sdk.api.assortment.payment.request.UnifiedOrderRequest;
import com.freemud.sdk.api.assortment.payment.response.OrderRefundResponse; import com.freemud.sdk.api.assortment.payment.response.OrderRefundResponse;
import com.freemud.sdk.api.assortment.payment.response.UnifiedOrderResponse; import com.freemud.sdk.api.assortment.payment.response.UnifiedOrderResponse;
......
...@@ -16,6 +16,7 @@ import cn.freemud.entities.dto.*; ...@@ -16,6 +16,7 @@ import cn.freemud.entities.dto.*;
import cn.freemud.entities.dto.PayAccessResponse; import cn.freemud.entities.dto.PayAccessResponse;
import cn.freemud.entities.dto.ecology.VirtualBindStoreResponse; import cn.freemud.entities.dto.ecology.VirtualBindStoreResponse;
import cn.freemud.entities.dto.ecology.VirtualStoreRequest; import cn.freemud.entities.dto.ecology.VirtualStoreRequest;
import cn.freemud.entities.dto.pay.PaymentMqMessageDto;
import cn.freemud.entities.dto.product.AttributeValue; import cn.freemud.entities.dto.product.AttributeValue;
import cn.freemud.entities.dto.product.GroupDetail; import cn.freemud.entities.dto.product.GroupDetail;
import cn.freemud.entities.dto.product.ProductAttributeGroup; import cn.freemud.entities.dto.product.ProductAttributeGroup;
...@@ -72,8 +73,6 @@ import com.freemud.sdk.api.assortment.order.response.order.*; ...@@ -72,8 +73,6 @@ import com.freemud.sdk.api.assortment.order.response.order.*;
import com.freemud.sdk.api.assortment.order.response.payment.OrderPayResponse; import com.freemud.sdk.api.assortment.order.response.payment.OrderPayResponse;
import com.freemud.sdk.api.assortment.order.service.OrderCenterSdkService; import com.freemud.sdk.api.assortment.order.service.OrderCenterSdkService;
import com.freemud.sdk.api.assortment.order.vo.ProductGroupVo; import com.freemud.sdk.api.assortment.order.vo.ProductGroupVo;
import com.freemud.sdk.api.assortment.orderdistributor.entity.dto.PaymentMqMessageDto;
import com.freemud.sdk.api.assortment.orderdistributor.service.PaymentQueueService;
import com.freemud.sdk.api.assortment.payment.request.UnifiedOrderRequest; import com.freemud.sdk.api.assortment.payment.request.UnifiedOrderRequest;
import com.freemud.sdk.api.assortment.payment.response.OrderRefundResponse; import com.freemud.sdk.api.assortment.payment.response.OrderRefundResponse;
import com.freemud.sdk.api.assortment.payment.response.UnifiedOrderResponse; import com.freemud.sdk.api.assortment.payment.response.UnifiedOrderResponse;
......
...@@ -31,35 +31,21 @@ import cn.freemud.entities.dto.activity.PayGiftCheckAndJoinResponseObj; ...@@ -31,35 +31,21 @@ import cn.freemud.entities.dto.activity.PayGiftCheckAndJoinResponseObj;
import cn.freemud.entities.dto.activity.PayGitCheckAndJoinRequestDto; import cn.freemud.entities.dto.activity.PayGitCheckAndJoinRequestDto;
import cn.freemud.entities.dto.delivery.*; import cn.freemud.entities.dto.delivery.*;
import cn.freemud.entities.dto.ecology.SendMessageRequest; import cn.freemud.entities.dto.ecology.SendMessageRequest;
import cn.freemud.entities.dto.ecology.SendMessageResponse;
import cn.freemud.entities.dto.ecology.SubscribeMessageRequest;
import cn.freemud.entities.dto.ecology.SendMessageRequest;
import cn.freemud.entities.dto.order.CreateOrderOperateDto; import cn.freemud.entities.dto.order.CreateOrderOperateDto;
import cn.freemud.entities.dto.order.CreatePrepayRequestDto; import cn.freemud.entities.dto.order.CreatePrepayRequestDto;
import cn.freemud.entities.dto.order.FacePayRequestDto; import cn.freemud.entities.dto.order.FacePayRequestDto;
import cn.freemud.entities.dto.order.FacePayResponseDto; import cn.freemud.entities.dto.order.FacePayResponseDto;
import cn.freemud.entities.dto.pay.CombPayResponse; import cn.freemud.entities.dto.pay.*;
import cn.freemud.entities.dto.pay.MultiPaymentRespDto;
import cn.freemud.entities.dto.pay.MultiQueryRequest;
import cn.freemud.entities.dto.pay.MultiQueryRespDto;
import cn.freemud.entities.dto.promotion.*;
import cn.freemud.entities.dto.product.AttributeValue; import cn.freemud.entities.dto.product.AttributeValue;
import cn.freemud.entities.dto.product.GroupDetail; import cn.freemud.entities.dto.product.GroupDetail;
import cn.freemud.entities.dto.product.ProductAttributeGroup; import cn.freemud.entities.dto.product.ProductAttributeGroup;
import cn.freemud.entities.dto.product.ProductGroup; import cn.freemud.entities.dto.product.ProductGroup;
import cn.freemud.entities.dto.promotion.QueryHistoryGroupVO;
import cn.freemud.entities.dto.shoppingCart.CollageOrderDto; import cn.freemud.entities.dto.shoppingCart.CollageOrderDto;
import cn.freemud.entities.dto.shoppingCart.NewShoppingCartClearDto; import cn.freemud.entities.dto.shoppingCart.NewShoppingCartClearDto;
import cn.freemud.entities.dto.shoppingCart.ShoppingCartGoodsDto; import cn.freemud.entities.dto.shoppingCart.ShoppingCartGoodsDto;
import cn.freemud.entities.vo.*; import cn.freemud.entities.vo.*;
import cn.freemud.enums.*; import cn.freemud.enums.*;
import cn.freemud.enums.AfterSalesOrderCreateEventEnum;
import cn.freemud.enums.OrderChannelType;
import cn.freemud.enums.PayRefundStatus;
import cn.freemud.enums.PayStatus;
import cn.freemud.enums.QueryOrderStatus;
import cn.freemud.enums.RefundStatus;
import cn.freemud.enums.ResponseResult;
import cn.freemud.enums.OrderType;
import cn.freemud.interceptor.ServiceException; import cn.freemud.interceptor.ServiceException;
import cn.freemud.management.entities.dto.request.BatchOrderRefundV2Request; import cn.freemud.management.entities.dto.request.BatchOrderRefundV2Request;
import cn.freemud.management.entities.dto.response.activity.GroupWorkRefundResponse; import cn.freemud.management.entities.dto.response.activity.GroupWorkRefundResponse;
...@@ -92,10 +78,6 @@ import com.freemud.api.assortment.datamanager.meal.MealCacheManager; ...@@ -92,10 +78,6 @@ import com.freemud.api.assortment.datamanager.meal.MealCacheManager;
import com.freemud.application.sdk.api.constant.ResponseConstant; import com.freemud.application.sdk.api.constant.ResponseConstant;
import com.freemud.application.sdk.api.constant.ResponseResultEnum; import com.freemud.application.sdk.api.constant.ResponseResultEnum;
import com.freemud.application.sdk.api.couponcenter.offline.service.OfflineCouponSdkService; import com.freemud.application.sdk.api.couponcenter.offline.service.OfflineCouponSdkService;
//import com.freemud.application.sdk.api.deliverycenter.service.DeliveryService;
//import com.freemud.application.sdk.api.deliverycenter.response.DeliveryInfoDto;
//import com.freemud.application.sdk.api.deliverycenter.response.DeliveryResponseDto;
//import com.freemud.application.sdk.api.deliverycenter.service.DeliveryService;
import com.freemud.application.sdk.api.log.ApiLog; import com.freemud.application.sdk.api.log.ApiLog;
import com.freemud.application.sdk.api.log.ErrorLog; import com.freemud.application.sdk.api.log.ErrorLog;
import com.freemud.application.sdk.api.log.LogThreadLocal; import com.freemud.application.sdk.api.log.LogThreadLocal;
...@@ -103,11 +85,7 @@ import com.freemud.application.sdk.api.ordercenter.entities.PayItem; ...@@ -103,11 +85,7 @@ import com.freemud.application.sdk.api.ordercenter.entities.PayItem;
import com.freemud.application.sdk.api.ordercenter.enums.AfterSalesType; import com.freemud.application.sdk.api.ordercenter.enums.AfterSalesType;
import com.freemud.application.sdk.api.ordercenter.enums.OrderClientType; import com.freemud.application.sdk.api.ordercenter.enums.OrderClientType;
import com.freemud.application.sdk.api.ordercenter.enums.PayChannelType; import com.freemud.application.sdk.api.ordercenter.enums.PayChannelType;
import com.freemud.application.sdk.api.ordercenter.enums.*; import com.freemud.application.sdk.api.ordercenter.enums.RefundModeEnum;
import com.freemud.application.sdk.api.ordercenter.request.OrderConditionsReq;
import com.freemud.application.sdk.api.ordercenter.request.OrderExtInfoDto;
import com.freemud.application.sdk.api.ordercenter.request.OrderExtendedReq;
import com.freemud.application.sdk.api.ordercenter.request.SdkUpdateAbnormalState;
import com.freemud.application.sdk.api.ordercenter.request.*; import com.freemud.application.sdk.api.ordercenter.request.*;
import com.freemud.application.sdk.api.ordercenter.request.carpark.ParkingOrderCreateReq; import com.freemud.application.sdk.api.ordercenter.request.carpark.ParkingOrderCreateReq;
import com.freemud.application.sdk.api.ordercenter.response.BaseDownLoadResponse; import com.freemud.application.sdk.api.ordercenter.response.BaseDownLoadResponse;
...@@ -149,8 +127,6 @@ import com.freemud.sdk.api.assortment.order.response.order.*; ...@@ -149,8 +127,6 @@ import com.freemud.sdk.api.assortment.order.response.order.*;
import com.freemud.sdk.api.assortment.order.response.payment.OrderPayResponse; import com.freemud.sdk.api.assortment.order.response.payment.OrderPayResponse;
import com.freemud.sdk.api.assortment.order.service.OrderCenterSdkService; import com.freemud.sdk.api.assortment.order.service.OrderCenterSdkService;
import com.freemud.sdk.api.assortment.order.vo.ProductGroupVo; import com.freemud.sdk.api.assortment.order.vo.ProductGroupVo;
import com.freemud.sdk.api.assortment.orderdistributor.entity.dto.PaymentMqMessageDto;
import com.freemud.sdk.api.assortment.orderdistributor.service.PaymentQueueService;
import com.freemud.sdk.api.assortment.payment.request.UnifiedOrderRequest; import com.freemud.sdk.api.assortment.payment.request.UnifiedOrderRequest;
import com.freemud.sdk.api.assortment.payment.response.OrderRefundResponse; import com.freemud.sdk.api.assortment.payment.response.OrderRefundResponse;
import com.freemud.sdk.api.assortment.payment.response.UnifiedOrderResponse; import com.freemud.sdk.api.assortment.payment.response.UnifiedOrderResponse;
...@@ -181,6 +157,7 @@ import java.util.function.Function; ...@@ -181,6 +157,7 @@ import java.util.function.Function;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import static cn.freemud.constant.OrderRefundConstant.ALLOW_REFUND; import static cn.freemud.constant.OrderRefundConstant.ALLOW_REFUND;
@Slf4j @Slf4j
@Service @Service
public class OrderServiceImpl implements Orderservice { public class OrderServiceImpl implements Orderservice {
......
package cn.freemud.service.impl;
import cn.freemud.amp.config.DlPaymentMqConfig;
import cn.freemud.amqp.Header;
import cn.freemud.amqp.MQMessage;
import cn.freemud.entities.dto.pay.PaymentMqMessageDto;
import com.alibaba.fastjson.JSON;
import com.freemud.application.sdk.api.config.TopicExchangeConfig;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageProperties;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class PaymentQueueService {
@Autowired
private RabbitTemplate restTemplate;
public void paymentCallback(PaymentMqMessageDto dto){
MQMessage<PaymentMqMessageDto> mqMessage = new MQMessage<PaymentMqMessageDto>();
mqMessage.setBody(dto);
Integer ttl = 20 * 1000;
Header header=new Header();
header.setKey("1");
mqMessage.setHeader(header);
byte[] notifyMsgBytes = JSON.toJSONString(mqMessage).getBytes();
MessageProperties messageProperties = new MessageProperties();
messageProperties.setExpiration(ttl.toString());
messageProperties.setContentType(MessageProperties.CONTENT_TYPE_JSON);
Message delmessage = new Message(notifyMsgBytes, messageProperties);
// logger.info("restTemplate.convertAndSend:"+dto);
restTemplate.convertAndSend(TopicExchangeConfig.EXCHANGE_NAME, DlPaymentMqConfig.OPEN_STORE_PAYMENT_QUERY_DL_KEY, delmessage);
}
}
...@@ -15,6 +15,7 @@ import cn.freemud.entities.dto.SvcComPayResponseDto; ...@@ -15,6 +15,7 @@ import cn.freemud.entities.dto.SvcComPayResponseDto;
import cn.freemud.entities.dto.order.CreateOrderOperateDto; import cn.freemud.entities.dto.order.CreateOrderOperateDto;
import cn.freemud.entities.dto.order.CreatePrepayRequestDto; import cn.freemud.entities.dto.order.CreatePrepayRequestDto;
import cn.freemud.entities.dto.pay.CombPayResponse; import cn.freemud.entities.dto.pay.CombPayResponse;
import cn.freemud.entities.dto.pay.PaymentMqMessageDto;
import cn.freemud.entities.dto.shoppingCart.ActivityDiscountsDto; import cn.freemud.entities.dto.shoppingCart.ActivityDiscountsDto;
import cn.freemud.entities.dto.shoppingCart.ShoppingCartGoodsDto; import cn.freemud.entities.dto.shoppingCart.ShoppingCartGoodsDto;
import cn.freemud.entities.vo.*; import cn.freemud.entities.vo.*;
...@@ -23,6 +24,7 @@ import cn.freemud.interceptor.ServiceException; ...@@ -23,6 +24,7 @@ import cn.freemud.interceptor.ServiceException;
import cn.freemud.redis.RedisCache; import cn.freemud.redis.RedisCache;
import cn.freemud.service.CheckOrderUniversal; import cn.freemud.service.CheckOrderUniversal;
import cn.freemud.service.OrderAdapterService; import cn.freemud.service.OrderAdapterService;
import cn.freemud.service.impl.PaymentQueueService;
import cn.freemud.service.thirdparty.ComPayClient; import cn.freemud.service.thirdparty.ComPayClient;
import cn.freemud.service.thirdparty.SvcComPayClient; import cn.freemud.service.thirdparty.SvcComPayClient;
import cn.freemud.service.universal.factory.CreateOrderServiceFactory; import cn.freemud.service.universal.factory.CreateOrderServiceFactory;
...@@ -83,8 +85,6 @@ import com.freemud.sdk.api.assortment.order.response.order.CreateOrderResponse; ...@@ -83,8 +85,6 @@ import com.freemud.sdk.api.assortment.order.response.order.CreateOrderResponse;
import com.freemud.sdk.api.assortment.order.response.order.QueryOrdersResponse; import com.freemud.sdk.api.assortment.order.response.order.QueryOrdersResponse;
import com.freemud.sdk.api.assortment.order.response.payment.OrderPayResponse; import com.freemud.sdk.api.assortment.order.response.payment.OrderPayResponse;
import com.freemud.sdk.api.assortment.order.service.OrderCenterSdkService; import com.freemud.sdk.api.assortment.order.service.OrderCenterSdkService;
import com.freemud.sdk.api.assortment.orderdistributor.entity.dto.PaymentMqMessageDto;
import com.freemud.sdk.api.assortment.orderdistributor.service.PaymentQueueService;
import com.freemud.sdk.api.assortment.payment.request.UnifiedOrderRequest; import com.freemud.sdk.api.assortment.payment.request.UnifiedOrderRequest;
import com.freemud.sdk.api.assortment.payment.response.UnifiedOrderResponse; import com.freemud.sdk.api.assortment.payment.response.UnifiedOrderResponse;
import com.freemud.sdk.api.assortment.payment.service.StandardPaymentService; import com.freemud.sdk.api.assortment.payment.service.StandardPaymentService;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment