From 11c248487966c1d206dce97e25b146386b7b2d00 Mon Sep 17 00:00:00 2001 From: zhengfangyuan Date: Thu, 17 Nov 2022 19:41:23 +0800 Subject: [PATCH 1/2] fix bug --- .../controller/market/WxCouponController.java | 15 +- .../java/com/iformall/domain/po/WxCoupon.java | 3 + .../com/iformall/service/WxCouponService.java | 2 + .../service/impl/WxCouponServiceImpl.java | 157 ++++++++++++++---- 4 files changed, 141 insertions(+), 36 deletions(-) diff --git a/mallinkAdmin/src/main/java/com/iformall/controller/market/WxCouponController.java b/mallinkAdmin/src/main/java/com/iformall/controller/market/WxCouponController.java index 68b52475e..0f523e8c2 100644 --- a/mallinkAdmin/src/main/java/com/iformall/controller/market/WxCouponController.java +++ b/mallinkAdmin/src/main/java/com/iformall/controller/market/WxCouponController.java @@ -571,7 +571,7 @@ public class WxCouponController extends BaseController { return new ResultData(wxCouponMallService.list(wxCouponMall)); } - @ApiOperation("商场查询:平台券列表") + @ApiOperation("商场查询:平台券商场列表") @GetMapping("/couponMalls") @ApiImplicitParams({ @ApiImplicitParam(name = "ids", value = "ids[]", dataType = "Long", paramType = "query", required = true)}) @@ -612,5 +612,18 @@ public class WxCouponController extends BaseController { } return new ResultData(); } + + @ApiOperation("券商户是否自动分账") + @PostMapping("/couponMerchantAutoShare") + public ResultData couponMerchantAutoShare(@RequestBody WxCoupon wxCoupon) { + wxCoupon.updateTenantInfo(getTenantInfo()); + try { + Map map = wxCouponService.couponMerchantAutoShare(wxCoupon); + return new ResultData(map); + } catch (Exception e) { + return new ResultData(Result.ERROR,e.getMessage()); + } + + } } diff --git a/mallinkService/src/main/java/com/iformall/domain/po/WxCoupon.java b/mallinkService/src/main/java/com/iformall/domain/po/WxCoupon.java index b9fcf2c8b..b39c51cdb 100644 --- a/mallinkService/src/main/java/com/iformall/domain/po/WxCoupon.java +++ b/mallinkService/src/main/java/com/iformall/domain/po/WxCoupon.java @@ -388,6 +388,9 @@ public class WxCoupon extends TenantEntity { @io.swagger.annotations.ApiModelProperty(value = "是否删除1是0否", name = "isDel") private Integer isDel; + + @TableField(exist = false) + private Long[] merchantIds; public String getSalePriceStr() { if(salePrice!=null) { diff --git a/mallinkService/src/main/java/com/iformall/service/WxCouponService.java b/mallinkService/src/main/java/com/iformall/service/WxCouponService.java index 266f2a9c4..21cb817a8 100644 --- a/mallinkService/src/main/java/com/iformall/service/WxCouponService.java +++ b/mallinkService/src/main/java/com/iformall/service/WxCouponService.java @@ -289,4 +289,6 @@ public interface WxCouponService { ResultData disable(TenantEntity tenantInfo, Long couponId); void setCouponMerchants(WxCoupon wxCoupon) throws Exception; + + Map couponMerchantAutoShare(WxCoupon wxCoupon) throws Exception; } diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxCouponServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxCouponServiceImpl.java index 8d8144637..97c14ab34 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxCouponServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxCouponServiceImpl.java @@ -706,46 +706,29 @@ public class WxCouponServiceImpl implements WxCouponService { if (receiver == null) { throw new MallinkException(ErrorCode.SYS_PARAMETER_ERROR.getCode(), "[\""+makeMerchant.getName()+"\"]未配置收款账户"); } + //如果是直连,抖音,多商户券必须只配置支付宝 if (EnumAppPlat.TOUTIAO.equals(plat)) { - if (!MerchantImportStatus.improt_success.getCode().equals(receiver.getWxImportStatus()) - && !MerchantImportStatus.improt_success.getCode().equals(receiver.getAlipayImportStatus()) - && !MerchantImportStatus.improt_success.getCode().equals(receiver.getHzImportStatus())) { - throw new MallinkException(ErrorCode.SYS_PARAMETER_ERROR.getCode(), "[\""+makeMerchant.getName()+"\"]未配置收款账户"); - } + if (merchantList.size() > 1 ) { + if (MerchantImportStatus.improt_success.getCode().equals(receiver.getAlipayImportStatus()) && + !MerchantImportStatus.improt_success.getCode().equals(receiver.getWxImportStatus()) ) { + }else { + throw new MallinkException(ErrorCode.SYS_PARAMETER_ERROR.getCode(), "[\""+makeMerchant.getName()+"\"]配置收款账户错误,多商户券主收款账户不能配置微信."); + } + }else { + if (!MerchantImportStatus.improt_success.getCode().equals(receiver.getWxImportStatus()) + && !MerchantImportStatus.improt_success.getCode().equals(receiver.getAlipayImportStatus()) + && !MerchantImportStatus.improt_success.getCode().equals(receiver.getHzImportStatus())) { + throw new MallinkException(ErrorCode.SYS_PARAMETER_ERROR.getCode(), "[\""+makeMerchant.getName()+"\"]未配置收款账户"); + } + } } } else if (EnumPayShare.YES.equals(isShare)) { List badNames = new ArrayList(); for (WxMerchant merchant:merchantList) { - WxProfitSharingReceiver receiver = payShareServie.getReceiver(payAccount, merchant.getId(), null, payMchType.getCode()); - - if (receiver == null) { - badNames.add(merchant.getName()); - continue; - } - if (EnumAppPlat.TOUTIAO.equals(plat)) { - QueryMerchantResult openPayResult = payAccount.getOpenPayResult(); - - if(!EnumYesOrNo.YES.getCode().equals(openPayResult.getAlipay()) - && !EnumYesOrNo.YES.getCode().equals(openPayResult.getWx()) - && !EnumYesOrNo.YES.getCode().equals(openPayResult.getHz())){ - throw new MallinkException(ErrorCode.SYS_PARAMETER_ERROR.getCode(), "分账模式未设置开通支付渠道"); - } - if(EnumYesOrNo.YES.getCode().equals(openPayResult.getAlipay()) - && !MerchantImportStatus.improt_success.getCode().equals(receiver.getAlipayImportStatus())){ - badNames.add(merchant.getName()); - continue; - } - if(EnumYesOrNo.YES.getCode().equals(openPayResult.getWx()) - && !MerchantImportStatus.improt_success.getCode().equals(receiver.getWxImportStatus())){ - badNames.add(merchant.getName()); - continue; - } - if(EnumYesOrNo.YES.getCode().equals(openPayResult.getHz()) - && !MerchantImportStatus.improt_success.getCode().equals(receiver.getHzImportStatus())){ - badNames.add(merchant.getName()); - continue; - } - } + boolean isBad = toTalPayMchTypeMerchantIsBad(payShareServie,payAccount,merchant.getName(),merchant.getId(),payMchType,plat); + if (isBad) { + badNames.add(merchant.getName()); + } } if(!badNames.isEmpty()){ throw new MallinkException(ErrorCode.SYS_PARAMETER_ERROR.getCode(), JSONArray.toJSONString(badNames)+"未配置分账账户"); @@ -754,6 +737,37 @@ public class WxCouponServiceImpl implements WxCouponService { } return merchantList; } + + //总分模式下不能分账的商户 + private boolean toTalPayMchTypeMerchantIsBad(PayShareAdapterService payShareServie,WxPayAccount payAccount, + String merchantName,Long merchantId,EnumPayMchType payMchType,EnumAppPlat plat) throws Exception { + WxProfitSharingReceiver receiver = payShareServie.getReceiver(payAccount, merchantId, null, payMchType.getCode()); + if (receiver == null) { + return true; + } + if (EnumAppPlat.TOUTIAO.equals(plat)) { + QueryMerchantResult openPayResult = payAccount.getOpenPayResult(); + + if(!EnumYesOrNo.YES.getCode().equals(openPayResult.getAlipay()) + && !EnumYesOrNo.YES.getCode().equals(openPayResult.getWx()) + && !EnumYesOrNo.YES.getCode().equals(openPayResult.getHz())){ + throw new MallinkException(ErrorCode.SYS_PARAMETER_ERROR.getCode(), "分账模式未设置开通支付渠道"); + } + if(EnumYesOrNo.YES.getCode().equals(openPayResult.getAlipay()) + && !MerchantImportStatus.improt_success.getCode().equals(receiver.getAlipayImportStatus())){ + return true; + } + if(EnumYesOrNo.YES.getCode().equals(openPayResult.getWx()) + && !MerchantImportStatus.improt_success.getCode().equals(receiver.getWxImportStatus())){ + return true; + } + if(EnumYesOrNo.YES.getCode().equals(openPayResult.getHz()) + && !MerchantImportStatus.improt_success.getCode().equals(receiver.getHzImportStatus())){ + return true; + } + } + return false; + } @Override public ResultData updateTtProduct(WxCoupon record) { @@ -1416,6 +1430,79 @@ public class WxCouponServiceImpl implements WxCouponService { throw e; } } + + private Map generateMerchantAutoShareAll(Long[] merchantIds,boolean auto) { + Map merchantAutoShareMap = new HashMap(); + for (Long mid:merchantIds) { + merchantAutoShareMap.put(mid, auto); + } + return merchantAutoShareMap; + } + @Override + public Map couponMerchantAutoShare(WxCoupon wxCoupon) throws Exception { + if (null == wxCoupon.getMerchantIds() || null == wxCoupon.getId() || null == wxCoupon.getType() || null == wxCoupon.getMerchantType()) { + throw new MallinkException(Result.ERROR,"缺少参数"); + } + EnumAppPlat plat = EnumCouponType.getAppPlat(wxCoupon.getType()); + EnumPayWay payWay = EnumAppPlat.getPayWay(plat); + WxAppinfo cAppInfo = wxAppinfoService.getCAppInfo(wxCoupon,plat); + if (cAppInfo == null) { + throw new MallinkException(ErrorCode.APP_ID_NOT_FOUND); + } + WxPayAccount payAccount = payAccountMapper.selectById(cAppInfo.getPayId()); + if (payAccount == null) { + throw new MallinkException(ErrorCode.APP_ID_NOT_FOUND); + } + EnumPayMchType payMchType = EnumPayMchType.getEnum(payAccount.getMchType()); + EnumPayShare isShare = EnumPayShare.getEnum(payAccount.getShare()); + PayShareAdapterService payShareServie = payServiceFactory.getPayShareAdapterService(payWay.getCode(),payAccount.getPayVersion()); + //直连模式,如果是单商户券,则都可以;如果是多商户券,抖音则只要开通了支付宝就可以,微信则不行。 + if (payMchType == EnumPayMchType.DIRECT) { + if (EnumCouponMerchantType.ONE_MERCHANT.getCode() == wxCoupon.getMerchantType()) { + return generateMerchantAutoShareAll(wxCoupon.getMerchantIds(),true); + }else { + if (plat == EnumAppPlat.TOUTIAO) { + Map merchantAutoShareMap = new HashMap(); + for (Long mid:wxCoupon.getMerchantIds()) { + //开通了支付宝就可以 + WxProfitSharingReceiver receiver = payShareServie.getReceiver(payAccount, mid, null, payMchType.getCode()); + if (MerchantImportStatus.improt_success.getCode().equals(receiver.getAlipayImportStatus())) { + merchantAutoShareMap.put(mid, true); + }else { + merchantAutoShareMap.put(mid, false); + } + } + return merchantAutoShareMap; + }else if (plat == EnumAppPlat.WX){ + return generateMerchantAutoShareAll(wxCoupon.getMerchantIds(),false); + }else { + return generateMerchantAutoShareAll(wxCoupon.getMerchantIds(),false); + } + } + }else { + //总分模式,分账开启,微信平台则认为是100%分账,抖音则只要开通了支付宝就可以。 + if (isShare == EnumPayShare.YES) { + if (plat == EnumAppPlat.WX) { + return generateMerchantAutoShareAll(wxCoupon.getMerchantIds(),true); + }else if (plat == EnumAppPlat.TOUTIAO) { + Map merchantAutoShareMap = new HashMap(); + for (Long mid:wxCoupon.getMerchantIds()) { + boolean isBad = toTalPayMchTypeMerchantIsBad(payShareServie,payAccount,String.valueOf(mid),mid,payMchType,plat); + if (isBad) { + merchantAutoShareMap.put(mid, false); + }else { + merchantAutoShareMap.put(mid, true); + } + } + return merchantAutoShareMap; + }else { + return generateMerchantAutoShareAll(wxCoupon.getMerchantIds(),true); + } + }else { + return generateMerchantAutoShareAll(wxCoupon.getMerchantIds(),false); + } + } + } } From 50589b32201e39e5cdf82ccce39eaff48acaa931 Mon Sep 17 00:00:00 2001 From: zhengfangyuan Date: Fri, 18 Nov 2022 16:17:32 +0800 Subject: [PATCH 2/2] fix bug --- .../controller/market/WxCouponController.java | 39 +++++++++++++++ .../domain/po/TtCouponChannelPoi.java | 2 +- .../iformall/enums/EnumCouponMallStatus.java | 36 ++++++++++++++ .../com/iformall/enums/EnumSpuSyncStatus.java | 11 +++++ .../iformall/mapper/WxCouponMallMapper.java | 5 +- .../iformall/service/WxCouponMallService.java | 3 ++ .../service/impl/WxCouponMallServiceImpl.java | 48 +++++++++++++++++++ .../resources/mapper/WxCouponMallMapper.xml | 12 ++--- 8 files changed, 146 insertions(+), 10 deletions(-) create mode 100644 mallinkService/src/main/java/com/iformall/enums/EnumCouponMallStatus.java diff --git a/mallinkAdmin/src/main/java/com/iformall/controller/market/WxCouponController.java b/mallinkAdmin/src/main/java/com/iformall/controller/market/WxCouponController.java index 0f523e8c2..eae80b8a8 100644 --- a/mallinkAdmin/src/main/java/com/iformall/controller/market/WxCouponController.java +++ b/mallinkAdmin/src/main/java/com/iformall/controller/market/WxCouponController.java @@ -625,5 +625,44 @@ public class WxCouponController extends BaseController { } } + + @ApiOperation("商场设置平台券已完成") + @PostMapping("/setPlatCouponFinished") + public ResultData setPlatCouponFinished(@RequestBody WxCoupon wxCoupon) { + try { + TenantEntity tenantEntity = getTenantInfo(); + String mallTenantId = tenantEntity.getTenantId(); + String tenantId = tenantEntity.getTenantId(); + if (null != tenantEntity.getParentTenantId()) { + tenantId = tenantEntity.getParentTenantId(); + } + wxCouponMallService.finised(tenantId, wxCoupon.getId(), mallTenantId); + return new ResultData(); + } catch (Exception e) { + return new ResultData(Result.ERROR,e.getMessage()); + } + + } + + @ApiOperation("商场设置平台券已完成") + @PostMapping("/setPlatCouponUnFinished") + public ResultData setPlatCouponUnFinished(@RequestBody WxCoupon wxCoupon) { + try { + if (null == wxCoupon.getType()) { + return new ResultData(Result.ERROR,"缺少参数"); + } + TenantEntity tenantEntity = getTenantInfo(); + String mallTenantId = tenantEntity.getTenantId(); + String tenantId = tenantEntity.getTenantId(); + if (null != tenantEntity.getParentTenantId()) { + tenantId = tenantEntity.getParentTenantId(); + } + wxCouponMallService.unfinised(tenantId, wxCoupon.getId(),wxCoupon.getType(), mallTenantId); + return new ResultData(); + } catch (Exception e) { + return new ResultData(Result.ERROR,e.getMessage()); + } + + } } diff --git a/mallinkService/src/main/java/com/iformall/domain/po/TtCouponChannelPoi.java b/mallinkService/src/main/java/com/iformall/domain/po/TtCouponChannelPoi.java index 03866d5ab..cfd78b340 100644 --- a/mallinkService/src/main/java/com/iformall/domain/po/TtCouponChannelPoi.java +++ b/mallinkService/src/main/java/com/iformall/domain/po/TtCouponChannelPoi.java @@ -32,7 +32,7 @@ public class TtCouponChannelPoi extends TenantEntity { @io.swagger.annotations.ApiModelProperty(value="描述",name="statusDesc") private String statusDesc; - @io.swagger.annotations.ApiModelProperty(value="状态:0-审核中,1-上架,2-下架,3-审核拒绝 4-审核通过",name="lastStatus") + @io.swagger.annotations.ApiModelProperty(value="EnumSpuSyncStatus状态:0-审核中,1-上架,2-下架,3-审核拒绝 4-审核通过",name="lastStatus") private Integer lastStatus; @io.swagger.annotations.ApiModelProperty(value="描述",name="lastStatusDesc") diff --git a/mallinkService/src/main/java/com/iformall/enums/EnumCouponMallStatus.java b/mallinkService/src/main/java/com/iformall/enums/EnumCouponMallStatus.java new file mode 100644 index 000000000..280a58b05 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/enums/EnumCouponMallStatus.java @@ -0,0 +1,36 @@ +package com.iformall.enums; + +/** + * Created by Stormeye on 2018/08/09. + */ +public enum EnumCouponMallStatus { + + UNFINISED(0, "未设置完成"), + FINISED(1, "已设置完成") + ; + + public static EnumCouponMallStatus getEnum(Integer code) { + for (EnumCouponMallStatus value : values()) { + if (value.getCode().equals(code)) { + return value; + } + } + return null; + } + + private Integer code; + private String message; + + EnumCouponMallStatus(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return code; + } + + public String getMessage() { + return message; + } +} diff --git a/mallinkService/src/main/java/com/iformall/enums/EnumSpuSyncStatus.java b/mallinkService/src/main/java/com/iformall/enums/EnumSpuSyncStatus.java index 43de3788a..231f0e696 100644 --- a/mallinkService/src/main/java/com/iformall/enums/EnumSpuSyncStatus.java +++ b/mallinkService/src/main/java/com/iformall/enums/EnumSpuSyncStatus.java @@ -38,4 +38,15 @@ public enum EnumSpuSyncStatus { public String getMessage() { return message; } + + public static boolean isValid(Integer code) { + if (code == sync_auditing.getCode()) { + return true; + }else if (code == sync_put_on.getCode()) { + return true; + }else if (code == sync_audit_pass.getCode()) { + return true; + } + return false; + } } diff --git a/mallinkService/src/main/java/com/iformall/mapper/WxCouponMallMapper.java b/mallinkService/src/main/java/com/iformall/mapper/WxCouponMallMapper.java index 8730942fd..c938f0593 100644 --- a/mallinkService/src/main/java/com/iformall/mapper/WxCouponMallMapper.java +++ b/mallinkService/src/main/java/com/iformall/mapper/WxCouponMallMapper.java @@ -3,6 +3,7 @@ package com.iformall.mapper; import com.iformall.common.CommonMapper; import com.iformall.domain.po.WxCouponMall; +import com.iformall.domain.po.base.TenantEntity; import java.util.List; import java.util.Map; @@ -11,6 +12,6 @@ import org.apache.ibatis.annotations.Param; public interface WxCouponMallMapper extends CommonMapper { - List findList(WxCouponMall wxCouponMerchant); - List findMerchantListByProduct(@Param("productId")Long productId,@Param("tenantId")String tenantId); + List findList(WxCouponMall wxCouponMall); + void updateStatus(WxCouponMall wxCouponMall); } diff --git a/mallinkService/src/main/java/com/iformall/service/WxCouponMallService.java b/mallinkService/src/main/java/com/iformall/service/WxCouponMallService.java index 97b23d0f0..1e8480755 100644 --- a/mallinkService/src/main/java/com/iformall/service/WxCouponMallService.java +++ b/mallinkService/src/main/java/com/iformall/service/WxCouponMallService.java @@ -24,4 +24,7 @@ public interface WxCouponMallService { List list(WxCouponMall wxCouponMall); + void finised(String tenantId,Long couponId,String mallTenantId); + void unfinised(String tenantId, Long couponId,Integer couponType, String mallTenantId) throws Exception; + } diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxCouponMallServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxCouponMallServiceImpl.java index 82cc1f89e..40d64553f 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxCouponMallServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxCouponMallServiceImpl.java @@ -2,7 +2,15 @@ package com.iformall.service.impl; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; +import com.iformall.common.ErrorCode; import com.iformall.domain.po.*; +import com.iformall.domain.po.base.TenantEntity; +import com.iformall.enums.EnumAppPlat; +import com.iformall.enums.EnumCouponChannelStatus; +import com.iformall.enums.EnumCouponMallStatus; +import com.iformall.enums.EnumCouponType; +import com.iformall.enums.EnumSpuSyncStatus; +import com.iformall.exception.MallinkException; import com.iformall.mapper.*; import com.iformall.service.*; import org.slf4j.Logger; @@ -17,6 +25,10 @@ public class WxCouponMallServiceImpl implements WxCouponMallService { @Autowired WxCouponMallMapper wxCouponMallMapper; + @Autowired + TtCouponChannelPoiMapper ttCouponChannelPoiMapper; + @Autowired + WxCouponChannelMapper wxCouponChannelMapper; @Override public List list(WxCouponMall wxCouponMall){ @@ -28,4 +40,40 @@ public class WxCouponMallServiceImpl implements WxCouponMallService { return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> wxCouponMallMapper.findList(record)); } + @Override + public void finised(String tenantId, Long couponId, String mallTenantId) { + WxCouponMall couponMall = new WxCouponMall(); + couponMall.setTenantId(tenantId); + couponMall.setMallTenantId(mallTenantId); + couponMall.setProductId(couponId); + couponMall.setStatus(EnumCouponMallStatus.FINISED.getCode()); + wxCouponMallMapper.updateStatus(couponMall); + } + + @Override + public void unfinised(String tenantId, Long couponId,Integer couponType, String mallTenantId) throws Exception{ + //抖音平台查询的是未提交抖音审核的,微信是未上架的 + EnumAppPlat plat = EnumCouponType.getAppPlat(couponType); + if (plat == EnumAppPlat.TOUTIAO) { + TtCouponChannelPoi poi = ttCouponChannelPoiMapper.selectById(tenantId, couponId); + if (null != poi &&( EnumSpuSyncStatus.isValid(poi.getLastStatus()))) { + throw new MallinkException(ErrorCode.SYS_SERVER_ERROR.getCode(),"券已在抖音审核流程中,无法修改。"); + } + }else if (plat == EnumAppPlat.WX) { + WxCouponChannel couponChannel = new WxCouponChannel(); + couponChannel.setTenantId(tenantId); + couponChannel.setStatus(EnumCouponChannelStatus.STATUS_THROW_IN.getCode()); + List clist = wxCouponChannelMapper.findList(couponChannel); + if (null != clist && clist.size() > 0 ) { + throw new MallinkException(ErrorCode.SYS_SERVER_ERROR.getCode(),"券已投放且上架,无法修改。"); + } + } + WxCouponMall couponMall = new WxCouponMall(); + couponMall.setTenantId(tenantId); + couponMall.setMallTenantId(mallTenantId); + couponMall.setProductId(couponId); + couponMall.setStatus(EnumCouponMallStatus.UNFINISED.getCode()); + wxCouponMallMapper.updateStatus(couponMall); + } + } diff --git a/mallinkService/src/main/resources/mapper/WxCouponMallMapper.xml b/mallinkService/src/main/resources/mapper/WxCouponMallMapper.xml index 7a5c012ce..8a5836da4 100644 --- a/mallinkService/src/main/resources/mapper/WxCouponMallMapper.xml +++ b/mallinkService/src/main/resources/mapper/WxCouponMallMapper.xml @@ -76,12 +76,10 @@ from wx_coupon_mall - - + + + update wx_coupon_mall set status = #{status} where `product_id` = #{productId} + and `tenant_id` = #{tenantId} and `mall_tenant_id` = #{mallTenantId} +