diff --git a/mallinkCApi/src/main/java/com/iformall/controller/WxOrderController.java b/mallinkCApi/src/main/java/com/iformall/controller/WxOrderController.java index d67f71295..2cefb3c01 100644 --- a/mallinkCApi/src/main/java/com/iformall/controller/WxOrderController.java +++ b/mallinkCApi/src/main/java/com/iformall/controller/WxOrderController.java @@ -13,10 +13,7 @@ import com.iformall.domain.vo.WxOrderCouponPressVo; import com.iformall.domain.vo.WxOrderCouponVo; import com.iformall.enums.*; import com.iformall.exception.MallinkException; -import com.iformall.service.WxCUserBasicInfoService; -import com.iformall.service.WxCouponChannelService; -import com.iformall.service.WxCouponService; -import com.iformall.service.WxOrderService; +import com.iformall.service.*; import com.iformall.utils.Constant; import com.iformall.utils.RedisLock; @@ -55,6 +52,9 @@ public class WxOrderController extends BaseController { @Autowired private WxCUserBasicInfoService wxCUserBasicInfoService; + @Autowired + private OrderSnapshotService orderSnapshotService; + @Autowired @Qualifier("couponDetailRedisTemplate") RedisTemplate cdRedisTemplate; @@ -333,6 +333,24 @@ public class WxOrderController extends BaseController { return new ResultData(wxBatchOrder); } + @ApiOperation("订单详情接口") + @GetMapping("getSnapshot") + @ApiImplicitParams({ + @ApiImplicitParam(name = "orderId", value = "订单composeOrderId", dataType = "String", paramType = "query", required = true) + }) + public ResultData getSnapshot(Long orderId,Long composeOrderId) { + if(orderId == null && composeOrderId == null){ + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL); + } + if(orderId != null){ + return new ResultData(orderSnapshotService.getOrderSnapshotByOrderId(getTenantInfo(),orderId)); + }else if(composeOrderId != null){ + return new ResultData(orderSnapshotService.getOrderSnapshotByComposeOrderId(getTenantInfo(),composeOrderId)); + }else{ + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL); + } + } + // @ApiOperation(value = "根据orderId查询接口", notes = "{\"orderId\":\"string\"}") // @GetMapping("/findById") // @ApiImplicitParams({ diff --git a/mallinkService/src/main/java/com/iformall/domain/po/OrderSnapshot.java b/mallinkService/src/main/java/com/iformall/domain/po/OrderSnapshot.java new file mode 100644 index 000000000..a02672747 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/domain/po/OrderSnapshot.java @@ -0,0 +1,340 @@ +package com.iformall.domain.po; + +import cn.afterturn.easypoi.excel.annotation.Excel; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.iformall.common.SortColumn; +import com.iformall.domain.po.base.TenantEntity; +import com.iformall.domain.vo.WxCouponStatisVo; +import com.iformall.enums.EnumCouponType; +import com.iformall.enums.EnumValidStatus; +import com.iformall.utils.Constant; +import com.iformall.utils.DateUtils; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@TableName(value = "order_snapshot") +@Data +@ToString(callSuper = true) +@EqualsAndHashCode(callSuper = true) +public class OrderSnapshot extends TenantEntity { + + protected Long id; + + @io.swagger.annotations.ApiModelProperty(value="orderId",name="orderId") + private Long orderId; + + @io.swagger.annotations.ApiModelProperty(value="orderId",name="composeOrderId") + private Long composeOrderId; + + @io.swagger.annotations.ApiModelProperty(value="EnumCouponType 券类型(1.满减券,2.代金券,3.团购券,4.礼品券,5.停车券,6.多商户券,8.砍价券,9.团购券,10.预购商品,11.可配送商品,12.券礼包,50.积分券,51.积分停车券,100.消费卡)",name="type") + private Integer type; + @io.swagger.annotations.ApiModelProperty(value="封面图",name="coverImg") + private String coverImg; + @io.swagger.annotations.ApiModelProperty(value="多封面图",name="coverPicture") + private String coverPicture; + @io.swagger.annotations.ApiModelProperty(value="详情多图",name="detailPicture") + private String detailPicture; + @io.swagger.annotations.ApiModelProperty(value="券名称",name="title") + private String title; + @io.swagger.annotations.ApiModelProperty(value="副标题",name="subTitle") + private String subTitle; + + @io.swagger.annotations.ApiModelProperty(value="卷包含内容",name="itemGroup") + private String itemGroup; + + @io.swagger.annotations.ApiModelProperty(value="售价(适用于类型2,3,4,5, 6, 8, 9, 100)",name="salePrice") + private Integer salePrice; + @io.swagger.annotations.ApiModelProperty(value="使用条件金额(适用于类型1,2,3,4)",name="usePrice") + private Integer usePrice; + @io.swagger.annotations.ApiModelProperty(value="运费",name="freightPrice") + private Integer freightPrice; + + @io.swagger.annotations.ApiModelProperty(value="限领规则",name="useLimitRule") + private Integer useLimitRule; + @io.swagger.annotations.ApiModelProperty(value="限领张数",name="useLimitQuantity") + private Integer useLimitQuantity; + @io.swagger.annotations.ApiModelProperty(value="1.主动领取2.定向投放",name="sendType") + private Integer sendType; + @io.swagger.annotations.ApiModelProperty(value="EnumCouponValidType 有效时间类型1.时间范围(valid_start_date,valid_end_date). 2领取后几日有效(valid_days)",name="validType") + private Integer validType; + @io.swagger.annotations.ApiModelProperty(value="卷有效日期-开始",name="validStartDate") + private Date validStartDate; + @io.swagger.annotations.ApiModelProperty(value="卷有效日期-结束",name="validEndDate") + private Date validEndDate; + @io.swagger.annotations.ApiModelProperty(value="自领取之日几日有效,(停车券当天有效)",name="validDays") + private Integer validDays; + + @io.swagger.annotations.ApiModelProperty(value="提货有效日期-开始",name="pickStartDate") + private Date pickStartDate; + @io.swagger.annotations.ApiModelProperty(value="提货有效日期-结束",name="pickEndDate") + private Date pickEndDate; + + @io.swagger.annotations.ApiModelProperty(value="须知",name="detail") + private String detail; + @io.swagger.annotations.ApiModelProperty(value="面额",name="price") + @Excel(name="面额(分)",width = 20,orderNum = "2") + private Integer price; + + @io.swagger.annotations.ApiModelProperty(value="尾款(适用于类型10)",name="tailPrice") + private Integer tailPrice; + @io.swagger.annotations.ApiModelProperty(value="原价(适用于类型10)",name="origPrice") + private Integer origPrice; + + + @io.swagger.annotations.ApiModelProperty(value="单位(0:rmb分 1:小时*100)",name="unit") + private Integer unit; + + @io.swagger.annotations.ApiModelProperty(value="购买须知",name="remark") + private String remark; + @io.swagger.annotations.ApiModelProperty(value="EnumCouponStatus 状态(-1:全部,0:草稿/待生效,1:已生效,2:已失效,3:已作废)",name="status") + private Integer status; + @io.swagger.annotations.ApiModelProperty(value="创建时间",name="createDate") + private Date createDate; + @io.swagger.annotations.ApiModelProperty(value="更新时间",name="updateDate") + private Date updateDate; + @io.swagger.annotations.ApiModelProperty(value="业态",name="business") + private Integer business; + @io.swagger.annotations.ApiModelProperty(value="子业态",name="subBusiness") + private Integer subBusiness; + @io.swagger.annotations.ApiModelProperty(value="是否支持转送(0:不支持,1支持)",name="supportTransfer") + private Integer supportTransfer; + + @io.swagger.annotations.ApiModelProperty(value="过期退款(0:正常,1不退)",name="autoRefund") + private Integer autoRefund; + + @io.swagger.annotations.ApiModelProperty(value="补贴类型(0:不支持, 1:微信支付立减与折扣, 2:线下结算, 3:微信付款到银行卡)",name="subsidyType") + private Integer subsidyType; + @io.swagger.annotations.ApiModelProperty(value="补贴额",name="subsidyNum") + private Integer subsidyNum; + + @io.swagger.annotations.ApiModelProperty(value="砍价/团购限制人数",name="pressLimitNum") + private Integer pressLimitNum; + + @io.swagger.annotations.ApiModelProperty(value="砍价限制时间",name="pressLimitHours") + private Integer pressLimitHours; + + @io.swagger.annotations.ApiModelProperty(value="积分售价(适用于类型10,11)",name="creditPrice") + private Integer creditPrice; + + @io.swagger.annotations.ApiModelProperty(value="过期退积分(0:正常,1不退)",name="autoRefund") + private Integer creditRefund; + + @io.swagger.annotations.ApiModelProperty(value="领取条件",name="condition") + private String conditions; + + @io.swagger.annotations.ApiModelProperty(value="卡密是否支持(0:不支持,1支持)",name="passwordSupport") + private Integer passwordSupport; + + @io.swagger.annotations.ApiModelProperty(value="1:A端发卷,2:B端发卷",name="sourceType") + private Integer sourceType; + + + + @io.swagger.annotations.ApiModelProperty(value="EnumCouponContentType 内容类型(0:小程序页面类型,1:富文本类型)",name="contentType") + private Integer contentType; + @io.swagger.annotations.ApiModelProperty(value="富文本内容",name="html") + private String html; + + @io.swagger.annotations.ApiModelProperty(value="卷包内容",name="giftList") + private String giftList; + + @io.swagger.annotations.ApiModelProperty(value="卷包内容",name="giftList") + private String merchasntList; + + + @TableField(exist = false) + private String salePriceStr; + + @TableField(exist = false) + private String usePriceStr; + + @TableField(exist = false) + private String freightPriceStr; + + @TableField(exist = false) + private String priceStr; + + @TableField(exist = false) + private String tailPriceStr; + + @TableField(exist = false) + private String origPriceStr; + + @TableField(exist = false) + private String subsidyNumStr; + + public String getSalePriceStr() { + if(salePrice!=null) { + salePriceStr = new BigDecimal(salePrice).divide(new BigDecimal(100)).toString(); + } + return salePriceStr; + } + + public String getUsePriceStr() { + if(usePrice!=null) { + usePriceStr = new BigDecimal(usePrice).divide(new BigDecimal(100)).toString(); + } + return usePriceStr; + } + + public String getFreightPriceStr() { + if(freightPrice!=null) { + freightPriceStr = new BigDecimal(freightPrice).divide(new BigDecimal(100)).toString(); + } + return freightPriceStr; + } + + public String getPriceStr() { + if(price!=null) { + priceStr = new BigDecimal(price).divide(new BigDecimal(100)).toString(); + } + return priceStr; + } + + public String getTailPriceStr() { + if(tailPrice!=null) { + tailPriceStr = new BigDecimal(tailPrice).divide(new BigDecimal(100)).toString(); + } + return tailPriceStr; + } + + public String getOrigPriceStr() { + if(origPrice!=null) { + origPriceStr = new BigDecimal(origPrice).divide(new BigDecimal(100)).toString(); + } + return origPriceStr; + } + + public String getSubsidyNumStr() { + if(subsidyNum!=null) { + subsidyNumStr = new BigDecimal(subsidyNum).divide(new BigDecimal(100)).toString(); + } + return subsidyNumStr; + } + + public boolean checkIsCreditCoupon() { + if(type == null) { + return false; + } + + if(type == EnumCouponType.COUPON_CREDIT.getCode() || + type == EnumCouponType.COUPON_CREDIT_PARK.getCode()) { + return true; + } + return false; + } + + public boolean checkIsCard() { + if(type == null) { + return false; + } + + if(type == EnumCouponType.CARD_MULTIMCH.getCode()) { + return true; + } + return false; + } + + public boolean checkIsFree() { + if(salePrice!= null) { + if (salePrice.equals(0)) { + return true; + } else { + return false; + } + } + return false; + } + + public boolean validDate(boolean isShare,boolean hasShareAmount,Date curr) { + Map retMap = calcuteValidDate(isShare, hasShareAmount, curr); + int success = (int) retMap.get("success"); + if (success > 0) { + return true; + }else { + return false; + } + } + + public Date getRealValidDate(boolean isShare,boolean hasShareAmount,Date curr) { + Map retMap = calcuteValidDate(isShare,hasShareAmount,curr); + return (Date) retMap.get("realDate"); + } + + private Map calcuteValidDate(boolean isShare,boolean hasShareAmount,Date curr) { + int limit_days = Constant.WX_LIMIT_DAYS; + int success = 1; + Date valid_date = null; + if (this.getValidType().equals(EnumValidStatus.VALID_RANGE.getCode()) || + this.getType().equals(EnumCouponType.COUPON_TINGCHE.getCode())) { + + if( this.getType().equals(EnumCouponType.COUPON_PREORDER.getCode())){ + valid_date = this.getPickEndDate(); + }else{ + valid_date = this.getValidEndDate(); + } + if (this.getSalePrice() > 0 && !this.checkIsCard()) { + if (hasShareAmount) { + if (isShare) { + // 分账有价券核销有效期不能大于分账过期时间 + Date limit_date = DateUtils.getTimeAfterDays(limit_days, curr); + if (valid_date.after(limit_date)) { + valid_date = limit_date; + success = 0; + } + } + } + } + } else { + if (this.getSalePrice() > 0 && !this.checkIsCard()) { + if (hasShareAmount) { + // 分账有价券核销有效期不能大于分账过期时间 + if (isShare) { + if (this.getValidDays() < Constant.WX_LIMIT_DAYS) { + limit_days = this.getValidDays(); + }else { + success = 0; + } + }else { + limit_days = this.getValidDays(); + } + }else{ + limit_days = this.getValidDays(); + } + } else { + limit_days = this.getValidDays(); + } + valid_date = DateUtils.getTimeAfterDays(limit_days, curr); + } + Map retMap = new HashMap(); + retMap.put("success", success); + retMap.put("realDate", valid_date); + return retMap; + } + + + public Date getOuterRealValidDate(Date curr) { + int limit_days = Constant.WX_LIMIT_DAYS; + Date valid_date = null; + if (this.getValidType().equals(EnumValidStatus.VALID_RANGE.getCode())) { + if( this.getType().equals(EnumCouponType.COUPON_PREORDER.getCode())){ + valid_date = this.getPickEndDate(); + }else{ + valid_date = this.getValidEndDate(); + } + } else { + limit_days = this.getValidDays(); + valid_date = DateUtils.getTimeAfterDays(limit_days, curr); + } + return valid_date; + } + +} diff --git a/mallinkService/src/main/java/com/iformall/domain/vo/WxOrderCouponVo.java b/mallinkService/src/main/java/com/iformall/domain/vo/WxOrderCouponVo.java index 6088c78fb..d6bd96c74 100644 --- a/mallinkService/src/main/java/com/iformall/domain/vo/WxOrderCouponVo.java +++ b/mallinkService/src/main/java/com/iformall/domain/vo/WxOrderCouponVo.java @@ -79,6 +79,9 @@ public class WxOrderCouponVo extends TenantEntity { private String title; @io.swagger.annotations.ApiModelProperty(value="副标题",name="subTitle") private String subTitle; + + @io.swagger.annotations.ApiModelProperty(value="卷包含内容",name="itemGroup") + private String itemGroup; @io.swagger.annotations.ApiModelProperty(value="售价(适用于类型2,3,4,5)",name="salePrice") private Integer salePrice; @io.swagger.annotations.ApiModelProperty(value="使用条件金额(适用于类型1,2,3,4)",name="usePrice") @@ -190,6 +193,7 @@ public class WxOrderCouponVo extends TenantEntity { this.setCoverImg(c.getCoverImg()); this.setTitle(c.getTitle()); this.setSubTitle(c.getSubTitle()); + this.setItemGroup(c.getItemGroup()); this.setSalePrice(c.getSalePrice()); this.setUsePrice(c.getUsePrice()); this.setPrice(c.getPrice()); diff --git a/mallinkService/src/main/java/com/iformall/mapper/OrderSnapshotMapper.java b/mallinkService/src/main/java/com/iformall/mapper/OrderSnapshotMapper.java new file mode 100644 index 000000000..25fe5d2ca --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/mapper/OrderSnapshotMapper.java @@ -0,0 +1,12 @@ +package com.iformall.mapper; + +import com.iformall.common.CommonMapper; +import com.iformall.domain.po.OrderSnapshot; + +import java.util.List; + +public interface OrderSnapshotMapper extends CommonMapper { + + List findList(OrderSnapshot os); + +} diff --git a/mallinkService/src/main/java/com/iformall/service/OrderSnapshotService.java b/mallinkService/src/main/java/com/iformall/service/OrderSnapshotService.java new file mode 100644 index 000000000..ced9f4586 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/service/OrderSnapshotService.java @@ -0,0 +1,16 @@ +package com.iformall.service; + +import com.iformall.common.ResultData; +import com.iformall.domain.po.WxOrder; +import com.iformall.domain.po.base.TenantEntity; + + +public interface OrderSnapshotService { + + ResultData getOrderSnapshotByOrderId(TenantEntity tenantEntity,Long orderId); + + ResultData getOrderSnapshotByComposeOrderId(TenantEntity tenantEntity,Long composeOrderId); + + int saveOrderSnapshot(WxOrder order); + +} diff --git a/mallinkService/src/main/java/com/iformall/service/impl/OrderSnapshotServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/OrderSnapshotServiceImpl.java new file mode 100644 index 000000000..e20c61892 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/service/impl/OrderSnapshotServiceImpl.java @@ -0,0 +1,61 @@ +package com.iformall.service.impl; + +import com.iformall.common.ErrorCode; +import com.iformall.common.ResultData; +import com.iformall.domain.po.*; +import com.iformall.domain.po.base.TenantEntity; +import com.iformall.mapper.OrderSnapshotMapper; +import com.iformall.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; + +import java.util.List; + + +@Service +public class OrderSnapshotServiceImpl implements OrderSnapshotService { + + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Autowired + OrderSnapshotMapper orderSnapshotMapper; + + @Override + public ResultData getOrderSnapshotByOrderId(TenantEntity tenantEntity, Long orderId) { + OrderSnapshot os = new OrderSnapshot(); + os.updateTenantInfo(tenantEntity); + os.setOrderId(orderId); + List list = orderSnapshotMapper.findList(os); + if(list != null && !list.isEmpty()){ + return new ResultData(list.get(0)); + } + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),"未找到订单数据"); + } + + @Override + public ResultData getOrderSnapshotByComposeOrderId(TenantEntity tenantEntity, Long composeOrderId) { + OrderSnapshot os = new OrderSnapshot(); + os.updateTenantInfo(tenantEntity); + os.setComposeOrderId(composeOrderId); + List list = orderSnapshotMapper.findList(os); + if(list != null && !list.isEmpty()){ + return new ResultData(list.get(0)); + } + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),"未找到订单数据"); + } + + @Async + @Override + public int saveOrderSnapshot(WxOrder order) { + try{ + + + }catch(Exception e){ + logger.error("同步订单快照异常"+e.getMessage()); + } + return 0; + } +} diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxMerchantServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxMerchantServiceImpl.java index dfbd77dba..9576c7413 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxMerchantServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxMerchantServiceImpl.java @@ -1604,6 +1604,21 @@ public class WxMerchantServiceImpl implements WxMerchantService { Map merchantMap = new HashMap(); Map> merchantShopVoMap = null; if (null != merchantIds && merchantIds.size() > 0 ) { + + TtMerchantPoi poiQ = new TtMerchantPoi(); + poiQ.updateTenantInfo(tenantEntity); + poiQ.setIds(merchantIds); + List poiList = ttMerchantPoiMapper.findList(poiQ); + Map poiMap = new HashMap(); + if(null != poiList){ + for (int i = 0 ; i < poiList.size() ; i++) { + TtMerchantPoi p = poiList.get(i); + if (null != p) { + poiMap.put(p.getId(), p); + } + } + } + WxMerchant merchantQ = new WxMerchant(); merchantQ.updateTenantInfo(tenantEntity); merchantQ.setIds(merchantIds); @@ -1612,6 +1627,12 @@ public class WxMerchantServiceImpl implements WxMerchantService { for (int i = 0 ; i < merchantList.size(); i++) { WxMerchant m = merchantList.get(i); if (null != m) { + TtMerchantPoi poi = poiMap.get(m.getId()); + if(null != poi){ + m.setAddr(poi.getAddress()); + m.setLongitude(poi.getLongitude()); + m.setLatitude(poi.getLatitude()); + } merchantMap.put(m.getId(), m); } } @@ -1632,6 +1653,9 @@ public class WxMerchantServiceImpl implements WxMerchantService { vo.setParameter(cm.getParameter()); vo.setId(m.getId()); + vo.setAddr(m.getAddr()); + vo.setLongitude(m.getLongitude()); + vo.setLatitude(m.getLatitude()); vo.setMerchantImgUrl(m.getImgUrl()); vo.setMerchantName(m.getName()); vo.setMerchantLinkPhone(m.getLinkPhone()); diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java index d9ae790cd..463252397 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java @@ -112,6 +112,9 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { @Autowired WxBatchOrderMapper wxBatchOrderMapper; + + @Autowired + OrderSnapshotService orderSnapshotService; @Autowired OrderFactory orderFactory; @@ -931,6 +934,10 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { throw new MallinkException(ErrorCode.MSG_INSIDE_ERROR); } } + + //订单快照 + orderSnapshotService.saveOrderSnapshot(order); + } } diff --git a/mallinkService/src/main/resources/mapper/OrderSnapshot.xml b/mallinkService/src/main/resources/mapper/OrderSnapshot.xml new file mode 100644 index 000000000..1fe1e4a80 --- /dev/null +++ b/mallinkService/src/main/resources/mapper/OrderSnapshot.xml @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + `id`,`tenant_id`,`parent_tenant_id`,`order_id`,`compose_order_id`,`type`,`cover_img`,`cover_picture`,`detail_picture`, + `title`,`sub_title`,`item_group`,`sale_price`,`freight_price`,`use_price`,`use_limit_rule`,`use_limit_quantity`,`send_type`, + `valid_type`,`valid_start_date`,`valid_end_date`,pick_start_date,pick_end_date,`valid_days`,`detail`,`price`,tail_price,orig_price,`unit`, + `remark`,`status`,`create_date`,`update_date`,`business`,`sub_business`,`support_transfer`,`subsidy_num`,`subsidy_type`, + `press_limit_num`, `press_limit_hours`, `auto_refund`,`credit_price`,`credit_refund`, + `conditions`,content_type,source_type,password_support,gift_list,merchant_list + + + + where 1 = 1 + + + and `id` = #{id} + + + + and `tenant_id` = #{tenantId} + + + and `parent_tenant_id` = #{parentTenantId} + + + + and `order_id` = #{orderId} + + + + and `compose_order_id` = #{composeOrderId} + + + + and id in + + #{idItem} + + + + order by ${sortColumns} + + + + + + +