This commit is contained in:
jsowell
2026-05-14 17:12:04 +08:00
parent 61603f56d4
commit fa641a8563
12 changed files with 129 additions and 70 deletions

View File

@@ -70,6 +70,10 @@ import java.util.stream.Collectors;
@Service @Service
public class MemberService { public class MemberService {
private static final int MAX_MEMBER_ID_GENERATE_RETRY_TIMES = 20;
private static final int MAX_MEMBER_REGISTER_RETRY_TIMES = 5;
private final Logger log = LoggerFactory.getLogger(this.getClass()); private final Logger log = LoggerFactory.getLogger(this.getClass());
@Autowired @Autowired
@@ -413,15 +417,22 @@ public class MemberService {
* @return 注册完成后的会员信息 * @return 注册完成后的会员信息
*/ */
private MemberBasicInfo registerMemberForRegisterAndLoginV2(MemberRegisterAndLoginDTO dto) { private MemberBasicInfo registerMemberForRegisterAndLoginV2(MemberRegisterAndLoginDTO dto) {
for (int attempt = 1; attempt <= MAX_MEMBER_REGISTER_RETRY_TIMES; attempt++) {
MemberBasicInfo memberBasicInfo = buildNewMemberForRegisterAndLoginV2(dto); MemberBasicInfo memberBasicInfo = buildNewMemberForRegisterAndLoginV2(dto);
MemberTransactionDTO memberTransactionDTO = buildMemberTransactionForRegisterAndLoginV2(memberBasicInfo, dto.getFirstLevelMerchantId()); MemberTransactionDTO memberTransactionDTO = buildMemberTransactionForRegisterAndLoginV2(memberBasicInfo, dto.getFirstLevelMerchantId());
try { try {
transactionService.createMember(memberTransactionDTO); transactionService.createMember(memberTransactionDTO);
return memberBasicInfo; return memberBasicInfo;
} catch (DuplicateKeyException e) { } catch (DuplicateKeyException e) {
return reloadMemberAfterDuplicateKeyForRegisterAndLoginV2(dto); MemberBasicInfo existedMember = reloadMemberAfterDuplicateKeyForRegisterAndLoginV2(dto, memberBasicInfo.getMemberId(), attempt);
if (existedMember != null) {
return existedMember;
} }
} }
}
log.error("会员注册重试多次后仍失败, phoneNumber:{}, merchantId:{}", dto.getMobileNumber(), dto.getFirstLevelMerchantId());
throw new BusinessException(ReturnCodeEnum.CODE_MEMBER_REGISTER_AND_LOGIN_ERROR);
}
/** /**
* 构造一个新的会员基础信息对象。 * 构造一个新的会员基础信息对象。
@@ -468,12 +479,14 @@ public class MemberService {
* @param dto 登录/注册入参 * @param dto 登录/注册入参
* @return 已存在的会员信息 * @return 已存在的会员信息
*/ */
private MemberBasicInfo reloadMemberAfterDuplicateKeyForRegisterAndLoginV2(MemberRegisterAndLoginDTO dto) { private MemberBasicInfo reloadMemberAfterDuplicateKeyForRegisterAndLoginV2(MemberRegisterAndLoginDTO dto, String memberId, int attempt) {
log.warn("会员注册时检测到唯一索引冲突,重新查询已存在的会员, phoneNumber:{}, merchantId:{}", dto.getMobileNumber(), dto.getFirstLevelMerchantId()); log.warn("会员注册时检测到唯一索引冲突,重新查询已存在的会员, phoneNumber:{}, merchantId:{}, candidateMemberId:{}, attempt:{}",
dto.getMobileNumber(), dto.getFirstLevelMerchantId(), memberId, attempt);
MemberBasicInfo memberBasicInfo = memberBasicInfoService.selectInfoByMobileNumber(dto.getMobileNumber(), dto.getFirstLevelMerchantId()); MemberBasicInfo memberBasicInfo = memberBasicInfoService.selectInfoByMobileNumber(dto.getMobileNumber(), dto.getFirstLevelMerchantId());
if (memberBasicInfo == null) { if (memberBasicInfo == null) {
log.error("唯一索引冲突后重新查询会员信息为空, phoneNumber:{}, merchantId:{}", dto.getMobileNumber(), dto.getFirstLevelMerchantId()); log.warn("唯一索引冲突后未查询到手机号对应会员准备重新生成memberId重试, phoneNumber:{}, merchantId:{}, candidateMemberId:{}, attempt:{}",
throw new BusinessException(ReturnCodeEnum.CODE_MEMBER_REGISTER_AND_LOGIN_ERROR); dto.getMobileNumber(), dto.getFirstLevelMerchantId(), memberId, attempt);
return null;
} }
return memberBasicInfo; return memberBasicInfo;
} }
@@ -535,14 +548,14 @@ public class MemberService {
} }
private String generateNewMemberId() { private String generateNewMemberId() {
while (true) { for (int attempt = 1; attempt <= MAX_MEMBER_ID_GENERATE_RETRY_TIMES; attempt++) {
String memberId = IdUtils.getMemberId(); String memberId = IdUtils.getMemberId();
// 通过memberId查询是否已经存在 if (!memberBasicInfoService.existsByMemberId(memberId)) {
MemberVO memberVO = memberBasicInfoService.queryMemberInfoByMemberId(memberId);
if (memberVO == null) {
return memberId; return memberId;
} }
log.warn("生成memberId命中已存在记录准备重试, memberId:{}, attempt:{}", memberId, attempt);
} }
throw new BusinessException(ReturnCodeEnum.CODE_MEMBER_REGISTER_AND_LOGIN_ERROR);
} }
/** /**

View File

@@ -1594,7 +1594,8 @@ public class TempService {
return ImportMemberBalanceItemResultDTO.success(phone); return ImportMemberBalanceItemResultDTO.success(phone);
} catch (Exception e) { } catch (Exception e) {
logger.error("导入会员余额失败, phone:{}, param:{}", phone, JSON.toJSONString(memberBalanceDTO), e); logger.error("导入会员余额失败, phone:{}, param:{}", phone, JSON.toJSONString(memberBalanceDTO), e);
return ImportMemberBalanceItemResultDTO.fail(phone, e.getMessage()); String errorMessage = e.getClass().getSimpleName() + ": " + e.getMessage();
return ImportMemberBalanceItemResultDTO.fail(phone, errorMessage);
} }
} }
@@ -1613,6 +1614,8 @@ public class TempService {
// 1. 根据手机号查询万车充会员信息;不存在则静默注册一个属于万车充体系的会员。 // 1. 根据手机号查询万车充会员信息;不存在则静默注册一个属于万车充体系的会员。
MemberBasicInfo memberBasicInfo = findOrCreateJsowellMember(phone); MemberBasicInfo memberBasicInfo = findOrCreateJsowellMember(phone);
logger.info("导入会员余额-会员准备完成, phone:{}, memberId:{}, memberMerchantId:{}, balance:{}",
phone, memberBasicInfo.getMemberId(), memberBasicInfo.getMerchantId(), balance);
// 2. 给“南通晨鸣中锦置业有限责任公司”运营商钱包增加本金余额。 // 2. 给“南通晨鸣中锦置业有限责任公司”运营商钱包增加本金余额。
increaseMemberWalletBalance(memberBasicInfo.getMemberId(), balance); increaseMemberWalletBalance(memberBasicInfo.getMemberId(), balance);
@@ -1653,6 +1656,8 @@ public class TempService {
* <p>如果该运营商钱包不存在,现有余额逻辑会自动创建钱包并记录流水。</p> * <p>如果该运营商钱包不存在,现有余额逻辑会自动创建钱包并记录流水。</p>
*/ */
private void increaseMemberWalletBalance(String memberId, BigDecimal balance) { private void increaseMemberWalletBalance(String memberId, BigDecimal balance) {
logger.info("导入会员余额-开始增加钱包余额, memberId:{}, targetMerchantId:{}, balance:{}",
memberId, NANTONG_CHENMING_WALLET_MERCHANT_ID, balance);
UpdateMemberBalanceDTO updateMemberBalanceDTO = UpdateMemberBalanceDTO.builder() UpdateMemberBalanceDTO updateMemberBalanceDTO = UpdateMemberBalanceDTO.builder()
.memberId(memberId) .memberId(memberId)
.type(MemberWalletEnum.TYPE_IN.getValue()) .type(MemberWalletEnum.TYPE_IN.getValue())
@@ -1661,6 +1666,8 @@ public class TempService {
.targetMerchantId(NANTONG_CHENMING_WALLET_MERCHANT_ID) .targetMerchantId(NANTONG_CHENMING_WALLET_MERCHANT_ID)
.build(); .build();
memberBasicInfoService.updateMemberBalance(updateMemberBalanceDTO); memberBasicInfoService.updateMemberBalance(updateMemberBalanceDTO);
logger.info("导入会员余额-钱包余额增加完成, memberId:{}, targetMerchantId:{}, balance:{}",
memberId, NANTONG_CHENMING_WALLET_MERCHANT_ID, balance);
} }
} }

View File

@@ -147,15 +147,12 @@ public class IdUtils {
* 生成八位会员id * 生成八位会员id
*/ */
public static String getMemberId() { public static String getMemberId() {
long id = Long.parseLong(SnowflakeIdWorker.getSnowflakeId()); long snowflakeId = Long.parseLong(SnowflakeIdWorker.getSnowflakeId());
StringBuilder sb = new StringBuilder(id + "");
StringBuilder reverse = sb.reverse();// 将id翻转我们发现id很长且高位很长部分是一样的数 // 对雪花 ID 做轻量混洗,再压缩到 8 位数字区间,分布比原来的“反转后截断”更均匀。
id = new Long(reverse.toString()) / 1000;// 切去部分长度 long mixed = snowflakeId ^ (snowflakeId >>> 33) ^ (snowflakeId >>> 17);
while (id > 100000000) { long memberId = Math.floorMod(mixed, 90000000L) + 10000000L;
id /= 10; return String.valueOf(memberId);
}
Integer num = Integer.parseInt(id + "");
return String.valueOf(num);
} }
/** /**

View File

@@ -22,7 +22,7 @@ public class MemberWalletInfo {
/** /**
* 主键 * 主键
*/ */
private Integer id; private Long id;
/** /**
* 会员id * 会员id

View File

@@ -93,6 +93,14 @@ public interface MemberBasicInfoMapper {
*/ */
MemberBasicInfo selectInfoByMemberId(String memberId); MemberBasicInfo selectInfoByMemberId(String memberId);
/**
* 判断会员id是否已存在。
*
* @param memberId 会员id
* @return 1-存在null-不存在
*/
Integer existsByMemberId(@Param("memberId") String memberId);
/** /**
* 更新会员余额 * 更新会员余额
* @param memberId 会员id * @param memberId 会员id

View File

@@ -7,7 +7,7 @@ import org.apache.ibatis.annotations.Param;
import java.util.List; import java.util.List;
public interface MemberWalletInfoMapper { public interface MemberWalletInfoMapper {
int deleteByPrimaryKey(Integer id); int deleteByPrimaryKey(Long id);
int insert(MemberWalletInfo record); int insert(MemberWalletInfo record);
@@ -17,7 +17,7 @@ public interface MemberWalletInfoMapper {
int insertSelective(MemberWalletInfo record); int insertSelective(MemberWalletInfo record);
MemberWalletInfo selectByPrimaryKey(Integer id); MemberWalletInfo selectByPrimaryKey(Long id);
int updateByPrimaryKeySelective(MemberWalletInfo record); int updateByPrimaryKeySelective(MemberWalletInfo record);

View File

@@ -91,6 +91,14 @@ public interface MemberBasicInfoService {
*/ */
MemberBasicInfo selectInfoByMemberId(String memberId); MemberBasicInfo selectInfoByMemberId(String memberId);
/**
* 判断指定会员id是否已经存在。
*
* @param memberId 会员id
* @return true-已存在false-不存在
*/
boolean existsByMemberId(String memberId);
String generateWalletCode(); String generateWalletCode();
/** /**

View File

@@ -6,13 +6,13 @@ import com.jsowell.pile.vo.base.MemberWalletVO;
import java.util.List; import java.util.List;
public interface MemberWalletInfoService { public interface MemberWalletInfoService {
int deleteByPrimaryKey(Integer id); int deleteByPrimaryKey(Long id);
int insert(MemberWalletInfo record); int insert(MemberWalletInfo record);
int insertSelective(MemberWalletInfo record); int insertSelective(MemberWalletInfo record);
MemberWalletInfo selectByPrimaryKey(Integer id); MemberWalletInfo selectByPrimaryKey(Long id);
MemberWalletInfo selectByMemberId(String memberId, String merchantId); MemberWalletInfo selectByMemberId(String memberId, String merchantId);

View File

@@ -180,6 +180,11 @@ public class MemberBasicInfoServiceImpl implements MemberBasicInfoService {
return memberBasicInfoMapper.selectInfoByMemberId(memberId); return memberBasicInfoMapper.selectInfoByMemberId(memberId);
} }
@Override
public boolean existsByMemberId(String memberId) {
return memberBasicInfoMapper.existsByMemberId(memberId) != null;
}
/** /**
* 生成钱包卡号WalletCode * 生成钱包卡号WalletCode
* @return * @return
@@ -267,8 +272,16 @@ public class MemberBasicInfoServiceImpl implements MemberBasicInfoService {
createBy = SecurityUtils.getLoginUser().getUserId() + ""; createBy = SecurityUtils.getLoginUser().getUserId() + "";
} }
// 查询用户余额 log.info("修改用户余额-开始查询钱包, memberId:{}, targetMerchantId:{}, type:{}, subType:{}, updatePrincipalBalance:{}, updateGiftBalance:{}",
MemberWalletInfo walletInfo = memberWalletInfoService.selectByMemberId(memberId, targetMerchantId); memberId, targetMerchantId, type, dto.getSubType(), updatePrincipalBalance, updateGiftBalance);
MemberWalletInfo walletInfo;
try {
walletInfo = memberWalletInfoService.selectByMemberId(memberId, targetMerchantId);
} catch (Exception e) {
log.error("修改用户余额-查询钱包异常, memberId:{}, targetMerchantId:{}, memberIdLength:{}, exceptionType:{}",
memberId, targetMerchantId, memberId == null ? null : memberId.length(), e.getClass().getName(), e);
throw e;
}
log.info("修改用户余额-根据会员id:{}, 目标运营商id:{}, 查询结果:{}", memberId, targetMerchantId, JSON.toJSONString(walletInfo)); log.info("修改用户余额-根据会员id:{}, 目标运营商id:{}, 查询结果:{}", memberId, targetMerchantId, JSON.toJSONString(walletInfo));
if (walletInfo == null) { if (walletInfo == null) {
log.info("修改用户余额-根据会员id:{}, 目标运营商id:{}, 查询会员信息为空, 新建会员钱包", memberId, targetMerchantId); log.info("修改用户余额-根据会员id:{}, 目标运营商id:{}, 查询会员信息为空, 新建会员钱包", memberId, targetMerchantId);
@@ -282,6 +295,11 @@ public class MemberBasicInfoServiceImpl implements MemberBasicInfoService {
.version(0) .version(0)
.build(); .build();
memberWalletInfoService.insertSelective(walletInfo); memberWalletInfoService.insertSelective(walletInfo);
log.info("修改用户余额-会员钱包创建完成, memberId:{}, targetMerchantId:{}, walletId:{}, walletCode:{}",
memberId, targetMerchantId, walletInfo.getId(), walletInfo.getWalletCode());
} else {
log.info("修改用户余额-命中会员钱包, memberId:{}, targetMerchantId:{}, walletId:{}, walletCode:{}, version:{}",
memberId, targetMerchantId, walletInfo.getId(), walletInfo.getWalletCode(), walletInfo.getVersion());
} }
// 钱包编号 // 钱包编号

View File

@@ -25,7 +25,7 @@ public class MemberWalletInfoServiceImpl implements MemberWalletInfoService {
private PileMerchantInfoService pileMerchantInfoService; private PileMerchantInfoService pileMerchantInfoService;
@Override @Override
public int deleteByPrimaryKey(Integer id) { public int deleteByPrimaryKey(Long id) {
return memberWalletInfoMapper.deleteByPrimaryKey(id); return memberWalletInfoMapper.deleteByPrimaryKey(id);
} }
@@ -40,7 +40,7 @@ public class MemberWalletInfoServiceImpl implements MemberWalletInfoService {
} }
@Override @Override
public MemberWalletInfo selectByPrimaryKey(Integer id) { public MemberWalletInfo selectByPrimaryKey(Long id) {
return memberWalletInfoMapper.selectByPrimaryKey(id); return memberWalletInfoMapper.selectByPrimaryKey(id);
} }

View File

@@ -173,6 +173,14 @@
and member_id = #{memberId,jdbcType=VARCHAR} and member_id = #{memberId,jdbcType=VARCHAR}
</select> </select>
<select id="existsByMemberId" resultType="java.lang.Integer">
select 1
from member_basic_info
where del_flag = '0'
and member_id = #{memberId,jdbcType=VARCHAR}
limit 1
</select>
<update id="updateMemberBalance"> <update id="updateMemberBalance">
update member_wallet_info update member_wallet_info
<trim prefix="SET" suffixOverrides=","> <trim prefix="SET" suffixOverrides=",">

View File

@@ -4,7 +4,7 @@
<resultMap id="BaseResultMap" type="com.jsowell.pile.domain.MemberWalletInfo"> <resultMap id="BaseResultMap" type="com.jsowell.pile.domain.MemberWalletInfo">
<!--@mbg.generated--> <!--@mbg.generated-->
<!--@Table member_wallet_info--> <!--@Table member_wallet_info-->
<id column="id" jdbcType="INTEGER" property="id" /> <id column="id" jdbcType="BIGINT" property="id" />
<result column="member_id" jdbcType="VARCHAR" property="memberId" /> <result column="member_id" jdbcType="VARCHAR" property="memberId" />
<result column="merchant_id" jdbcType="VARCHAR" property="merchantId" /> <result column="merchant_id" jdbcType="VARCHAR" property="merchantId" />
<result column="wallet_code" jdbcType="VARCHAR" property="walletCode" /> <result column="wallet_code" jdbcType="VARCHAR" property="walletCode" />
@@ -22,17 +22,17 @@
id, member_id, merchant_id, wallet_code, principal_balance, gift_balance, version, id, member_id, merchant_id, wallet_code, principal_balance, gift_balance, version,
create_by, create_time, update_by, update_time, del_flag create_by, create_time, update_by, update_time, del_flag
</sql> </sql>
<select id="selectByPrimaryKey" parameterType="java.lang.Integer" resultMap="BaseResultMap"> <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap">
<!--@mbg.generated--> <!--@mbg.generated-->
select select
<include refid="Base_Column_List" /> <include refid="Base_Column_List" />
from member_wallet_info from member_wallet_info
where id = #{id,jdbcType=INTEGER} where id = #{id,jdbcType=BIGINT}
</select> </select>
<delete id="deleteByPrimaryKey" parameterType="java.lang.Integer"> <delete id="deleteByPrimaryKey" parameterType="java.lang.Long">
<!--@mbg.generated--> <!--@mbg.generated-->
delete from member_wallet_info delete from member_wallet_info
where id = #{id,jdbcType=INTEGER} where id = #{id,jdbcType=BIGINT}
</delete> </delete>
<insert id="insert" keyColumn="id" keyProperty="id" parameterType="com.jsowell.pile.domain.MemberWalletInfo" useGeneratedKeys="true"> <insert id="insert" keyColumn="id" keyProperty="id" parameterType="com.jsowell.pile.domain.MemberWalletInfo" useGeneratedKeys="true">
<!--@mbg.generated--> <!--@mbg.generated-->
@@ -157,7 +157,7 @@
del_flag = #{delFlag,jdbcType=CHAR}, del_flag = #{delFlag,jdbcType=CHAR},
</if> </if>
</set> </set>
where id = #{id,jdbcType=INTEGER} where id = #{id,jdbcType=BIGINT}
</update> </update>
<update id="updateByPrimaryKey" parameterType="com.jsowell.pile.domain.MemberWalletInfo"> <update id="updateByPrimaryKey" parameterType="com.jsowell.pile.domain.MemberWalletInfo">
<!--@mbg.generated--> <!--@mbg.generated-->
@@ -173,7 +173,7 @@
update_by = #{updateBy,jdbcType=VARCHAR}, update_by = #{updateBy,jdbcType=VARCHAR},
update_time = #{updateTime,jdbcType=TIMESTAMP}, update_time = #{updateTime,jdbcType=TIMESTAMP},
del_flag = #{delFlag,jdbcType=CHAR} del_flag = #{delFlag,jdbcType=CHAR}
where id = #{id,jdbcType=INTEGER} where id = #{id,jdbcType=BIGINT}
</update> </update>
<update id="updateBatch" parameterType="java.util.List"> <update id="updateBatch" parameterType="java.util.List">
<!--@mbg.generated--> <!--@mbg.generated-->
@@ -181,63 +181,63 @@
<trim prefix="set" suffixOverrides=","> <trim prefix="set" suffixOverrides=",">
<trim prefix="member_id = case" suffix="end,"> <trim prefix="member_id = case" suffix="end,">
<foreach collection="list" index="index" item="item"> <foreach collection="list" index="index" item="item">
when id = #{item.id,jdbcType=INTEGER} then #{item.memberId,jdbcType=VARCHAR} when id = #{item.id,jdbcType=BIGINT} then #{item.memberId,jdbcType=VARCHAR}
</foreach> </foreach>
</trim> </trim>
<trim prefix="merchant_id = case" suffix="end,"> <trim prefix="merchant_id = case" suffix="end,">
<foreach collection="list" index="index" item="item"> <foreach collection="list" index="index" item="item">
when id = #{item.id,jdbcType=INTEGER} then #{item.merchantId,jdbcType=VARCHAR} when id = #{item.id,jdbcType=BIGINT} then #{item.merchantId,jdbcType=VARCHAR}
</foreach> </foreach>
</trim> </trim>
<trim prefix="wallet_code = case" suffix="end,"> <trim prefix="wallet_code = case" suffix="end,">
<foreach collection="list" index="index" item="item"> <foreach collection="list" index="index" item="item">
when id = #{item.id,jdbcType=INTEGER} then #{item.walletCode,jdbcType=VARCHAR} when id = #{item.id,jdbcType=BIGINT} then #{item.walletCode,jdbcType=VARCHAR}
</foreach> </foreach>
</trim> </trim>
<trim prefix="principal_balance = case" suffix="end,"> <trim prefix="principal_balance = case" suffix="end,">
<foreach collection="list" index="index" item="item"> <foreach collection="list" index="index" item="item">
when id = #{item.id,jdbcType=INTEGER} then #{item.principalBalance,jdbcType=DECIMAL} when id = #{item.id,jdbcType=BIGINT} then #{item.principalBalance,jdbcType=DECIMAL}
</foreach> </foreach>
</trim> </trim>
<trim prefix="gift_balance = case" suffix="end,"> <trim prefix="gift_balance = case" suffix="end,">
<foreach collection="list" index="index" item="item"> <foreach collection="list" index="index" item="item">
when id = #{item.id,jdbcType=INTEGER} then #{item.giftBalance,jdbcType=DECIMAL} when id = #{item.id,jdbcType=BIGINT} then #{item.giftBalance,jdbcType=DECIMAL}
</foreach> </foreach>
</trim> </trim>
<trim prefix="version = case" suffix="end,"> <trim prefix="version = case" suffix="end,">
<foreach collection="list" index="index" item="item"> <foreach collection="list" index="index" item="item">
when id = #{item.id,jdbcType=INTEGER} then #{item.version,jdbcType=INTEGER} when id = #{item.id,jdbcType=BIGINT} then #{item.version,jdbcType=INTEGER}
</foreach> </foreach>
</trim> </trim>
<trim prefix="create_by = case" suffix="end,"> <trim prefix="create_by = case" suffix="end,">
<foreach collection="list" index="index" item="item"> <foreach collection="list" index="index" item="item">
when id = #{item.id,jdbcType=INTEGER} then #{item.createBy,jdbcType=VARCHAR} when id = #{item.id,jdbcType=BIGINT} then #{item.createBy,jdbcType=VARCHAR}
</foreach> </foreach>
</trim> </trim>
<trim prefix="create_time = case" suffix="end,"> <trim prefix="create_time = case" suffix="end,">
<foreach collection="list" index="index" item="item"> <foreach collection="list" index="index" item="item">
when id = #{item.id,jdbcType=INTEGER} then #{item.createTime,jdbcType=TIMESTAMP} when id = #{item.id,jdbcType=BIGINT} then #{item.createTime,jdbcType=TIMESTAMP}
</foreach> </foreach>
</trim> </trim>
<trim prefix="update_by = case" suffix="end,"> <trim prefix="update_by = case" suffix="end,">
<foreach collection="list" index="index" item="item"> <foreach collection="list" index="index" item="item">
when id = #{item.id,jdbcType=INTEGER} then #{item.updateBy,jdbcType=VARCHAR} when id = #{item.id,jdbcType=BIGINT} then #{item.updateBy,jdbcType=VARCHAR}
</foreach> </foreach>
</trim> </trim>
<trim prefix="update_time = case" suffix="end,"> <trim prefix="update_time = case" suffix="end,">
<foreach collection="list" index="index" item="item"> <foreach collection="list" index="index" item="item">
when id = #{item.id,jdbcType=INTEGER} then #{item.updateTime,jdbcType=TIMESTAMP} when id = #{item.id,jdbcType=BIGINT} then #{item.updateTime,jdbcType=TIMESTAMP}
</foreach> </foreach>
</trim> </trim>
<trim prefix="del_flag = case" suffix="end,"> <trim prefix="del_flag = case" suffix="end,">
<foreach collection="list" index="index" item="item"> <foreach collection="list" index="index" item="item">
when id = #{item.id,jdbcType=INTEGER} then #{item.delFlag,jdbcType=CHAR} when id = #{item.id,jdbcType=BIGINT} then #{item.delFlag,jdbcType=CHAR}
</foreach> </foreach>
</trim> </trim>
</trim> </trim>
where id in where id in
<foreach close=")" collection="list" item="item" open="(" separator=", "> <foreach close=")" collection="list" item="item" open="(" separator=", ">
#{item.id,jdbcType=INTEGER} #{item.id,jdbcType=BIGINT}
</foreach> </foreach>
</update> </update>
<update id="updateBatchSelective" parameterType="java.util.List"> <update id="updateBatchSelective" parameterType="java.util.List">
@@ -247,84 +247,84 @@
<trim prefix="member_id = case" suffix="end,"> <trim prefix="member_id = case" suffix="end,">
<foreach collection="list" index="index" item="item"> <foreach collection="list" index="index" item="item">
<if test="item.memberId != null"> <if test="item.memberId != null">
when id = #{item.id,jdbcType=INTEGER} then #{item.memberId,jdbcType=VARCHAR} when id = #{item.id,jdbcType=BIGINT} then #{item.memberId,jdbcType=VARCHAR}
</if> </if>
</foreach> </foreach>
</trim> </trim>
<trim prefix="merchant_id = case" suffix="end,"> <trim prefix="merchant_id = case" suffix="end,">
<foreach collection="list" index="index" item="item"> <foreach collection="list" index="index" item="item">
<if test="item.merchantId != null"> <if test="item.merchantId != null">
when id = #{item.id,jdbcType=INTEGER} then #{item.merchantId,jdbcType=VARCHAR} when id = #{item.id,jdbcType=BIGINT} then #{item.merchantId,jdbcType=VARCHAR}
</if> </if>
</foreach> </foreach>
</trim> </trim>
<trim prefix="wallet_code = case" suffix="end,"> <trim prefix="wallet_code = case" suffix="end,">
<foreach collection="list" index="index" item="item"> <foreach collection="list" index="index" item="item">
<if test="item.walletCode != null"> <if test="item.walletCode != null">
when id = #{item.id,jdbcType=INTEGER} then #{item.walletCode,jdbcType=VARCHAR} when id = #{item.id,jdbcType=BIGINT} then #{item.walletCode,jdbcType=VARCHAR}
</if> </if>
</foreach> </foreach>
</trim> </trim>
<trim prefix="principal_balance = case" suffix="end,"> <trim prefix="principal_balance = case" suffix="end,">
<foreach collection="list" index="index" item="item"> <foreach collection="list" index="index" item="item">
<if test="item.principalBalance != null"> <if test="item.principalBalance != null">
when id = #{item.id,jdbcType=INTEGER} then #{item.principalBalance,jdbcType=DECIMAL} when id = #{item.id,jdbcType=BIGINT} then #{item.principalBalance,jdbcType=DECIMAL}
</if> </if>
</foreach> </foreach>
</trim> </trim>
<trim prefix="gift_balance = case" suffix="end,"> <trim prefix="gift_balance = case" suffix="end,">
<foreach collection="list" index="index" item="item"> <foreach collection="list" index="index" item="item">
<if test="item.giftBalance != null"> <if test="item.giftBalance != null">
when id = #{item.id,jdbcType=INTEGER} then #{item.giftBalance,jdbcType=DECIMAL} when id = #{item.id,jdbcType=BIGINT} then #{item.giftBalance,jdbcType=DECIMAL}
</if> </if>
</foreach> </foreach>
</trim> </trim>
<trim prefix="version = case" suffix="end,"> <trim prefix="version = case" suffix="end,">
<foreach collection="list" index="index" item="item"> <foreach collection="list" index="index" item="item">
<if test="item.version != null"> <if test="item.version != null">
when id = #{item.id,jdbcType=INTEGER} then #{item.version,jdbcType=INTEGER} when id = #{item.id,jdbcType=BIGINT} then #{item.version,jdbcType=INTEGER}
</if> </if>
</foreach> </foreach>
</trim> </trim>
<trim prefix="create_by = case" suffix="end,"> <trim prefix="create_by = case" suffix="end,">
<foreach collection="list" index="index" item="item"> <foreach collection="list" index="index" item="item">
<if test="item.createBy != null"> <if test="item.createBy != null">
when id = #{item.id,jdbcType=INTEGER} then #{item.createBy,jdbcType=VARCHAR} when id = #{item.id,jdbcType=BIGINT} then #{item.createBy,jdbcType=VARCHAR}
</if> </if>
</foreach> </foreach>
</trim> </trim>
<trim prefix="create_time = case" suffix="end,"> <trim prefix="create_time = case" suffix="end,">
<foreach collection="list" index="index" item="item"> <foreach collection="list" index="index" item="item">
<if test="item.createTime != null"> <if test="item.createTime != null">
when id = #{item.id,jdbcType=INTEGER} then #{item.createTime,jdbcType=TIMESTAMP} when id = #{item.id,jdbcType=BIGINT} then #{item.createTime,jdbcType=TIMESTAMP}
</if> </if>
</foreach> </foreach>
</trim> </trim>
<trim prefix="update_by = case" suffix="end,"> <trim prefix="update_by = case" suffix="end,">
<foreach collection="list" index="index" item="item"> <foreach collection="list" index="index" item="item">
<if test="item.updateBy != null"> <if test="item.updateBy != null">
when id = #{item.id,jdbcType=INTEGER} then #{item.updateBy,jdbcType=VARCHAR} when id = #{item.id,jdbcType=BIGINT} then #{item.updateBy,jdbcType=VARCHAR}
</if> </if>
</foreach> </foreach>
</trim> </trim>
<trim prefix="update_time = case" suffix="end,"> <trim prefix="update_time = case" suffix="end,">
<foreach collection="list" index="index" item="item"> <foreach collection="list" index="index" item="item">
<if test="item.updateTime != null"> <if test="item.updateTime != null">
when id = #{item.id,jdbcType=INTEGER} then #{item.updateTime,jdbcType=TIMESTAMP} when id = #{item.id,jdbcType=BIGINT} then #{item.updateTime,jdbcType=TIMESTAMP}
</if> </if>
</foreach> </foreach>
</trim> </trim>
<trim prefix="del_flag = case" suffix="end,"> <trim prefix="del_flag = case" suffix="end,">
<foreach collection="list" index="index" item="item"> <foreach collection="list" index="index" item="item">
<if test="item.delFlag != null"> <if test="item.delFlag != null">
when id = #{item.id,jdbcType=INTEGER} then #{item.delFlag,jdbcType=CHAR} when id = #{item.id,jdbcType=BIGINT} then #{item.delFlag,jdbcType=CHAR}
</if> </if>
</foreach> </foreach>
</trim> </trim>
</trim> </trim>
where id in where id in
<foreach close=")" collection="list" item="item" open="(" separator=", "> <foreach close=")" collection="list" item="item" open="(" separator=", ">
#{item.id,jdbcType=INTEGER} #{item.id,jdbcType=BIGINT}
</foreach> </foreach>
</update> </update>
<insert id="batchInsert" keyColumn="id" keyProperty="id" parameterType="map" useGeneratedKeys="true"> <insert id="batchInsert" keyColumn="id" keyProperty="id" parameterType="map" useGeneratedKeys="true">
@@ -363,7 +363,7 @@
values values
<trim prefix="(" suffix=")" suffixOverrides=","> <trim prefix="(" suffix=")" suffixOverrides=",">
<if test="id != null"> <if test="id != null">
#{id,jdbcType=INTEGER}, #{id,jdbcType=BIGINT},
</if> </if>
#{memberId,jdbcType=VARCHAR}, #{memberId,jdbcType=VARCHAR},
#{merchantId,jdbcType=VARCHAR}, #{merchantId,jdbcType=VARCHAR},
@@ -380,7 +380,7 @@
on duplicate key update on duplicate key update
<trim suffixOverrides=","> <trim suffixOverrides=",">
<if test="id != null"> <if test="id != null">
id = #{id,jdbcType=INTEGER}, id = #{id,jdbcType=BIGINT},
</if> </if>
member_id = #{memberId,jdbcType=VARCHAR}, member_id = #{memberId,jdbcType=VARCHAR},
merchant_id = #{merchantId,jdbcType=VARCHAR}, merchant_id = #{merchantId,jdbcType=VARCHAR},
@@ -439,7 +439,7 @@
values values
<trim prefix="(" suffix=")" suffixOverrides=","> <trim prefix="(" suffix=")" suffixOverrides=",">
<if test="id != null"> <if test="id != null">
#{id,jdbcType=INTEGER}, #{id,jdbcType=BIGINT},
</if> </if>
<if test="memberId != null"> <if test="memberId != null">
#{memberId,jdbcType=VARCHAR}, #{memberId,jdbcType=VARCHAR},
@@ -478,7 +478,7 @@
on duplicate key update on duplicate key update
<trim suffixOverrides=","> <trim suffixOverrides=",">
<if test="id != null"> <if test="id != null">
id = #{id,jdbcType=INTEGER}, id = #{id,jdbcType=BIGINT},
</if> </if>
<if test="memberId != null"> <if test="memberId != null">
member_id = #{memberId,jdbcType=VARCHAR}, member_id = #{memberId,jdbcType=VARCHAR},