diff --git a/jsowell-admin/src/main/java/com/jsowell/web/controller/pile/MemberPointsInfoController.java b/jsowell-admin/src/main/java/com/jsowell/web/controller/pile/MemberPointsInfoController.java new file mode 100644 index 000000000..1d0fc31b1 --- /dev/null +++ b/jsowell-admin/src/main/java/com/jsowell/web/controller/pile/MemberPointsInfoController.java @@ -0,0 +1,141 @@ +package com.jsowell.web.controller.pile; + +import com.github.pagehelper.PageHelper; +import com.jsowell.common.core.controller.BaseController; +import com.jsowell.common.core.domain.AjaxResult; +import com.jsowell.common.core.page.TableDataInfo; +import com.jsowell.pile.domain.MemberPointsInfo; +import com.jsowell.pile.domain.MemberPointsRecord; +import com.jsowell.pile.service.MemberPointsInfoService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import java.math.BigDecimal; +import java.util.List; + +/** + * 会员积分Controller + * + * @author jsowell + */ +@Api(tags = "会员积分管理") +@RestController +@RequestMapping("/points") +public class MemberPointsInfoController extends BaseController { + + @Autowired + private MemberPointsInfoService memberPointsInfoService; + + /** + * 查询个人积分余额 + */ + @ApiOperation("查询个人积分余额") + @PreAuthorize("@ss.hasPermi('member:points:query')") + @GetMapping("/balance") + public AjaxResult getBalance(@ApiParam(value = "会员ID", required = true) @RequestParam String memberId) { + try { + MemberPointsInfo pointsInfo = memberPointsInfoService.selectByMemberId(memberId); + if (pointsInfo == null) { + pointsInfo = MemberPointsInfo.builder() + .memberId(memberId) + .totalPoints(BigDecimal.ZERO) + .build(); + } + return AjaxResult.success(pointsInfo); + } catch (Exception e) { + logger.error("查询积分余额失败,memberId: {}", memberId, e); + return AjaxResult.error("查询积分余额失败"); + } + } + + /** + * 查询积分明细列表 + */ + @ApiOperation("查询积分明细列表") + @PreAuthorize("@ss.hasPermi('member:points:list')") + @GetMapping("/list") + public TableDataInfo list( + @ApiParam(value = "会员ID", required = true) @RequestParam String memberId, + @ApiParam(value = "页码") @RequestParam(defaultValue = "1") Integer pageNum, + @ApiParam(value = "每页数量") @RequestParam(defaultValue = "10") Integer pageSize) { + PageHelper.startPage(pageNum, pageSize); + List list = memberPointsInfoService.getPointsRecordList(memberId); + return getDataTable(list); + } + + /** + * 增加积分(充电奖励) + */ + @ApiOperation("增加积分(充电奖励)") + @PreAuthorize("@ss.hasPermi('member:points:add')") + @PostMapping("/add") + public AjaxResult addPoints( + @ApiParam(value = "会员ID", required = true) @RequestParam String memberId, + @ApiParam(value = "积分数量", required = true) @RequestParam BigDecimal points, + @ApiParam(value = "关联订单号") @RequestParam(required = false) String orderCode) { + try { + boolean result = memberPointsInfoService.addPoints(memberId, points, orderCode); + if (result) { + return AjaxResult.success("积分增加成功"); + } else { + return AjaxResult.error("积分增加失败"); + } + } catch (Exception e) { + logger.error("增加积分失败,memberId: {}, points: {}", memberId, points, e); + return AjaxResult.error(e.getMessage()); + } + } + + /** + * 扣减积分(消费抵扣) + */ + @ApiOperation("扣减积分(消费抵扣)") + @PreAuthorize("@ss.hasPermi('member:points:deduct')") + @PostMapping("/deduct") + public AjaxResult deductPoints( + @ApiParam(value = "会员ID", required = true) @RequestParam String memberId, + @ApiParam(value = "积分数量", required = true) @RequestParam BigDecimal points, + @ApiParam(value = "关联订单号") @RequestParam(required = false) String orderCode) { + try { + boolean result = memberPointsInfoService.deductPoints(memberId, points, orderCode); + if (result) { + return AjaxResult.success("积分扣减成功"); + } else { + return AjaxResult.error("积分扣减失败"); + } + } catch (Exception e) { + logger.error("扣减积分失败,memberId: {}, points: {}", memberId, points, e); + return AjaxResult.error(e.getMessage()); + } + } + + /** + * 初始化会员积分账户 + */ + @ApiOperation("初始化会员积分账户") + @PreAuthorize("@ss.hasPermi('member:points:init')") + @PostMapping("/init") + public AjaxResult initMemberPoints( + @ApiParam(value = "会员ID", required = true) @RequestParam String memberId) { + try { + // 检查是否已存在 + MemberPointsInfo existInfo = memberPointsInfoService.selectByMemberId(memberId); + if (existInfo != null) { + return AjaxResult.error("该会员积分账户已存在"); + } + int result = memberPointsInfoService.initMemberPoints(memberId); + if (result > 0) { + return AjaxResult.success("积分账户初始化成功"); + } else { + return AjaxResult.error("积分账户初始化失败"); + } + } catch (Exception e) { + logger.error("初始化积分账户失败,memberId: {}", memberId, e); + return AjaxResult.error("初始化积分账户失败"); + } + } +} diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/domain/MemberPointsInfo.java b/jsowell-pile/src/main/java/com/jsowell/pile/domain/MemberPointsInfo.java new file mode 100644 index 000000000..46cbd4650 --- /dev/null +++ b/jsowell-pile/src/main/java/com/jsowell/pile/domain/MemberPointsInfo.java @@ -0,0 +1,39 @@ +package com.jsowell.pile.domain; + +import java.math.BigDecimal; +import java.util.Date; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +/** + * 用户积分表 + */ +@Data +@Accessors(chain = true) +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class MemberPointsInfo { + /** + * 主键 + */ + private Long id; + + /** + * 用户ID + */ + private String memberId; + + /** + * 当前可用积分 + */ + private BigDecimal totalPoints; + + /** + * 更新时间 + */ + private Date updateTime; +} diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/domain/MemberPointsRecord.java b/jsowell-pile/src/main/java/com/jsowell/pile/domain/MemberPointsRecord.java new file mode 100644 index 000000000..1622ab44a --- /dev/null +++ b/jsowell-pile/src/main/java/com/jsowell/pile/domain/MemberPointsRecord.java @@ -0,0 +1,59 @@ +package com.jsowell.pile.domain; + +import java.math.BigDecimal; +import java.util.Date; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +/** + * 积分流水表 + */ +@Data +@Accessors(chain = true) +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class MemberPointsRecord { + /** + * 主键 + */ + private Long id; + + /** + * 用户ID + */ + private String memberId; + + /** + * 变动分值 + */ + private BigDecimal points; + + /** + * 类型(1-充电奖励, 2-消费抵扣) + */ + private Integer type; + + /** + * 关联订单号 + */ + private String orderCode; + + /** + * 变动前积分 + */ + private BigDecimal beforePoints; + + /** + * 变动后积分 + */ + private BigDecimal afterPoints; + + /** + * 创建时间 + */ + private Date createTime; +} diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/mapper/MemberPointsInfoMapper.java b/jsowell-pile/src/main/java/com/jsowell/pile/mapper/MemberPointsInfoMapper.java new file mode 100644 index 000000000..071a6099b --- /dev/null +++ b/jsowell-pile/src/main/java/com/jsowell/pile/mapper/MemberPointsInfoMapper.java @@ -0,0 +1,57 @@ +package com.jsowell.pile.mapper; + +import com.jsowell.pile.domain.MemberPointsInfo; +import org.apache.ibatis.annotations.Param; + +import java.math.BigDecimal; + +/** + * 用户积分Mapper接口 + */ +public interface MemberPointsInfoMapper { + + /** + * 根据主键查询 + */ + MemberPointsInfo selectByPrimaryKey(Long id); + + /** + * 根据会员ID查询积分信息 + */ + MemberPointsInfo selectByMemberId(@Param("memberId") String memberId); + + /** + * 插入积分记录 + */ + int insert(MemberPointsInfo record); + + /** + * 选择性插入积分记录 + */ + int insertSelective(MemberPointsInfo record); + + /** + * 根据主键更新 + */ + int updateByPrimaryKey(MemberPointsInfo record); + + /** + * 根据主键选择性更新 + */ + int updateByPrimaryKeySelective(MemberPointsInfo record); + + /** + * 原子性增加积分 + */ + int addPoints(@Param("memberId") String memberId, @Param("points") BigDecimal points); + + /** + * 原子性扣减积分 + */ + int deductPoints(@Param("memberId") String memberId, @Param("points") BigDecimal points); + + /** + * 根据主键删除 + */ + int deleteByPrimaryKey(Long id); +} diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/mapper/MemberPointsRecordMapper.java b/jsowell-pile/src/main/java/com/jsowell/pile/mapper/MemberPointsRecordMapper.java new file mode 100644 index 000000000..3c9032817 --- /dev/null +++ b/jsowell-pile/src/main/java/com/jsowell/pile/mapper/MemberPointsRecordMapper.java @@ -0,0 +1,57 @@ +package com.jsowell.pile.mapper; + +import com.jsowell.pile.domain.MemberPointsRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 积分流水Mapper接口 + */ +public interface MemberPointsRecordMapper { + + /** + * 根据主键查询 + */ + MemberPointsRecord selectByPrimaryKey(Long id); + + /** + * 根据会员ID查询积分流水列表 + */ + List selectByMemberId(@Param("memberId") String memberId); + + /** + * 根据会员ID分页查询积分流水列表 + */ + List selectByMemberIdWithPage(@Param("memberId") String memberId); + + /** + * 根据订单号查询积分流水 + */ + List selectByOrderCode(@Param("orderCode") String orderCode); + + /** + * 插入积分流水记录 + */ + int insert(MemberPointsRecord record); + + /** + * 选择性插入积分流水记录 + */ + int insertSelective(MemberPointsRecord record); + + /** + * 根据主键更新 + */ + int updateByPrimaryKey(MemberPointsRecord record); + + /** + * 根据主键选择性更新 + */ + int updateByPrimaryKeySelective(MemberPointsRecord record); + + /** + * 根据主键删除 + */ + int deleteByPrimaryKey(Long id); +} diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/MemberPointsInfoService.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/MemberPointsInfoService.java new file mode 100644 index 000000000..da78f9396 --- /dev/null +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/MemberPointsInfoService.java @@ -0,0 +1,65 @@ +package com.jsowell.pile.service; + +import com.jsowell.pile.domain.MemberPointsInfo; +import com.jsowell.pile.domain.MemberPointsRecord; + +import java.math.BigDecimal; +import java.util.List; + +/** + * 用户积分Service接口 + */ +public interface MemberPointsInfoService { + + /** + * 根据会员ID查询积分信息 + * + * @param memberId 会员ID + * @return 积分信息 + */ + MemberPointsInfo selectByMemberId(String memberId); + + /** + * 获取会员积分余额 + * + * @param memberId 会员ID + * @return 积分余额 + */ + BigDecimal getPointsBalance(String memberId); + + /** + * 增加积分(充电奖励) + * + * @param memberId 会员ID + * @param points 积分数量 + * @param orderCode 关联订单号 + * @return 操作结果 + */ + boolean addPoints(String memberId, BigDecimal points, String orderCode); + + /** + * 扣减积分(消费抵扣) + * + * @param memberId 会员ID + * @param points 积分数量 + * @param orderCode 关联订单号 + * @return 操作结果 + */ + boolean deductPoints(String memberId, BigDecimal points, String orderCode); + + /** + * 查询会员积分流水列表 + * + * @param memberId 会员ID + * @return 积分流水列表 + */ + List getPointsRecordList(String memberId); + + /** + * 初始化会员积分账户 + * + * @param memberId 会员ID + * @return 操作结果 + */ + int initMemberPoints(String memberId); +} diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/MemberPointsRecordService.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/MemberPointsRecordService.java new file mode 100644 index 000000000..3efa7004b --- /dev/null +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/MemberPointsRecordService.java @@ -0,0 +1,43 @@ +package com.jsowell.pile.service; + +import com.jsowell.pile.domain.MemberPointsRecord; + +import java.util.List; + +/** + * 积分流水Service接口 + */ +public interface MemberPointsRecordService { + + /** + * 根据主键查询 + * + * @param id 主键 + * @return 积分流水记录 + */ + MemberPointsRecord selectByPrimaryKey(Long id); + + /** + * 根据会员ID查询积分流水列表 + * + * @param memberId 会员ID + * @return 积分流水列表 + */ + List selectByMemberId(String memberId); + + /** + * 根据订单号查询积分流水 + * + * @param orderCode 订单号 + * @return 积分流水列表 + */ + List selectByOrderCode(String orderCode); + + /** + * 插入积分流水记录 + * + * @param record 积分流水记录 + * @return 操作结果 + */ + int insert(MemberPointsRecord record); +} diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/MemberPointsInfoServiceImpl.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/MemberPointsInfoServiceImpl.java new file mode 100644 index 000000000..99e68c696 --- /dev/null +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/MemberPointsInfoServiceImpl.java @@ -0,0 +1,156 @@ +package com.jsowell.pile.service.impl; + +import com.jsowell.common.exception.BusinessException; +import com.jsowell.common.util.StringUtils; +import com.jsowell.pile.domain.MemberPointsInfo; +import com.jsowell.pile.domain.MemberPointsRecord; +import com.jsowell.pile.mapper.MemberPointsInfoMapper; +import com.jsowell.pile.mapper.MemberPointsRecordMapper; +import com.jsowell.pile.service.MemberPointsInfoService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 用户积分Service实现类 + */ +@Service +public class MemberPointsInfoServiceImpl implements MemberPointsInfoService { + + private static final Logger logger = LoggerFactory.getLogger(MemberPointsInfoServiceImpl.class); + + /** + * 积分类型:充电奖励 + */ + private static final int POINTS_TYPE_CHARGE_REWARD = 1; + + /** + * 积分类型:消费抵扣 + */ + private static final int POINTS_TYPE_CONSUME_DEDUCT = 2; + + @Resource + private MemberPointsInfoMapper memberPointsInfoMapper; + + @Resource + private MemberPointsRecordMapper memberPointsRecordMapper; + + @Override + public MemberPointsInfo selectByMemberId(String memberId) { + return memberPointsInfoMapper.selectByMemberId(memberId); + } + + @Override + public BigDecimal getPointsBalance(String memberId) { + MemberPointsInfo pointsInfo = memberPointsInfoMapper.selectByMemberId(memberId); + if (pointsInfo == null) { + return BigDecimal.ZERO; + } + return pointsInfo.getTotalPoints() == null ? BigDecimal.ZERO : pointsInfo.getTotalPoints(); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean addPoints(String memberId, BigDecimal points, String orderCode) { + if (StringUtils.isBlank(memberId) || points == null || points.compareTo(BigDecimal.ZERO) <= 0) { + throw new BusinessException("参数错误"); + } + + // 检查积分账户是否存在,不存在则初始化 + MemberPointsInfo pointsInfo = memberPointsInfoMapper.selectByMemberId(memberId); + if (pointsInfo == null) { + initMemberPoints(memberId); + pointsInfo = memberPointsInfoMapper.selectByMemberId(memberId); + } + + // 记录变动前积分 + BigDecimal beforePoints = pointsInfo.getTotalPoints() == null ? BigDecimal.ZERO : pointsInfo.getTotalPoints(); + + // 原子性增加积分 + int updateResult = memberPointsInfoMapper.addPoints(memberId, points); + if (updateResult <= 0) { + logger.error("增加积分失败,memberId: {}, points: {}", memberId, points); + throw new BusinessException("增加积分失败"); + } + + // 计算变动后积分 + BigDecimal afterPoints = beforePoints.add(points); + + // 插入积分流水记录 + MemberPointsRecord record = MemberPointsRecord.builder() + .memberId(memberId) + .points(points) + .type(POINTS_TYPE_CHARGE_REWARD) + .orderCode(orderCode) + .beforePoints(beforePoints) + .afterPoints(afterPoints) + .createTime(new Date()) + .build(); + memberPointsRecordMapper.insert(record); + + logger.info("增加积分成功,memberId: {}, points: {}, beforePoints: {}, afterPoints: {}, orderCode: {}", + memberId, points, beforePoints, afterPoints, orderCode); + return true; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean deductPoints(String memberId, BigDecimal points, String orderCode) { + if (StringUtils.isBlank(memberId) || points == null || points.compareTo(BigDecimal.ZERO) <= 0) { + throw new BusinessException("参数错误"); + } + + // 检查积分余额是否充足 + BigDecimal beforePoints = getPointsBalance(memberId); + if (beforePoints.compareTo(points) < 0) { + throw new BusinessException("积分余额不足"); + } + + // 原子性扣减积分 + int updateResult = memberPointsInfoMapper.deductPoints(memberId, points); + if (updateResult <= 0) { + logger.error("扣减积分失败,memberId: {}, points: {}", memberId, points); + throw new BusinessException("扣减积分失败"); + } + + // 计算变动后积分 + BigDecimal afterPoints = beforePoints.subtract(points); + + // 插入积分流水记录(扣减积分记录为负数) + MemberPointsRecord record = MemberPointsRecord.builder() + .memberId(memberId) + .points(points.negate()) + .type(POINTS_TYPE_CONSUME_DEDUCT) + .orderCode(orderCode) + .beforePoints(beforePoints) + .afterPoints(afterPoints) + .createTime(new Date()) + .build(); + memberPointsRecordMapper.insert(record); + + logger.info("扣减积分成功,memberId: {}, points: {}, beforePoints: {}, afterPoints: {}, orderCode: {}", + memberId, points, beforePoints, afterPoints, orderCode); + return true; + } + + @Override + public List getPointsRecordList(String memberId) { + return memberPointsRecordMapper.selectByMemberIdWithPage(memberId); + } + + @Override + public int initMemberPoints(String memberId) { + MemberPointsInfo pointsInfo = MemberPointsInfo.builder() + .memberId(memberId) + .totalPoints(BigDecimal.ZERO) + .updateTime(new Date()) + .build(); + return memberPointsInfoMapper.insert(pointsInfo); + } +} diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/MemberPointsRecordServiceImpl.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/MemberPointsRecordServiceImpl.java new file mode 100644 index 000000000..45f0ed68d --- /dev/null +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/MemberPointsRecordServiceImpl.java @@ -0,0 +1,39 @@ +package com.jsowell.pile.service.impl; + +import com.jsowell.pile.domain.MemberPointsRecord; +import com.jsowell.pile.mapper.MemberPointsRecordMapper; +import com.jsowell.pile.service.MemberPointsRecordService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 积分流水Service实现类 + */ +@Service +public class MemberPointsRecordServiceImpl implements MemberPointsRecordService { + + @Resource + private MemberPointsRecordMapper memberPointsRecordMapper; + + @Override + public MemberPointsRecord selectByPrimaryKey(Long id) { + return memberPointsRecordMapper.selectByPrimaryKey(id); + } + + @Override + public List selectByMemberId(String memberId) { + return memberPointsRecordMapper.selectByMemberId(memberId); + } + + @Override + public List selectByOrderCode(String orderCode) { + return memberPointsRecordMapper.selectByOrderCode(orderCode); + } + + @Override + public int insert(MemberPointsRecord record) { + return memberPointsRecordMapper.insert(record); + } +} diff --git a/jsowell-pile/src/main/resources/mapper/pile/MemberPointsInfoMapper.xml b/jsowell-pile/src/main/resources/mapper/pile/MemberPointsInfoMapper.xml new file mode 100644 index 000000000..1cfe36972 --- /dev/null +++ b/jsowell-pile/src/main/resources/mapper/pile/MemberPointsInfoMapper.xml @@ -0,0 +1,108 @@ + + + + + + + + + + + + id, member_id, total_points, update_time + + + + + + + + insert into member_points_info (member_id, total_points, update_time) + values (#{memberId,jdbcType=VARCHAR}, #{totalPoints,jdbcType=DECIMAL}, #{updateTime,jdbcType=TIMESTAMP}) + + + + insert into member_points_info + + + member_id, + + + total_points, + + + update_time, + + + + + #{memberId,jdbcType=VARCHAR}, + + + #{totalPoints,jdbcType=DECIMAL}, + + + #{updateTime,jdbcType=TIMESTAMP}, + + + + + + update member_points_info + set member_id = #{memberId,jdbcType=VARCHAR}, + total_points = #{totalPoints,jdbcType=DECIMAL}, + update_time = #{updateTime,jdbcType=TIMESTAMP} + where id = #{id,jdbcType=BIGINT} + + + + update member_points_info + + + member_id = #{memberId,jdbcType=VARCHAR}, + + + total_points = #{totalPoints,jdbcType=DECIMAL}, + + + update_time = #{updateTime,jdbcType=TIMESTAMP}, + + + where id = #{id,jdbcType=BIGINT} + + + + + update member_points_info + set total_points = total_points + #{points,jdbcType=DECIMAL}, + update_time = NOW() + where member_id = #{memberId,jdbcType=VARCHAR} + + + + + update member_points_info + set total_points = total_points - #{points,jdbcType=DECIMAL}, + update_time = NOW() + where member_id = #{memberId,jdbcType=VARCHAR} + and total_points >= #{points,jdbcType=DECIMAL} + + + + delete + from member_points_info + where id = #{id,jdbcType=BIGINT} + + diff --git a/jsowell-pile/src/main/resources/mapper/pile/MemberPointsRecordMapper.xml b/jsowell-pile/src/main/resources/mapper/pile/MemberPointsRecordMapper.xml new file mode 100644 index 000000000..d35f7d19c --- /dev/null +++ b/jsowell-pile/src/main/resources/mapper/pile/MemberPointsRecordMapper.xml @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + id, member_id, points, type, order_code, before_points, after_points, create_time + + + + + + + + + + + + insert into member_points_record (member_id, points, type, order_code, before_points, after_points, create_time) + values (#{memberId,jdbcType=VARCHAR}, #{points,jdbcType=DECIMAL}, #{type,jdbcType=TINYINT}, + #{orderCode,jdbcType=VARCHAR}, #{beforePoints,jdbcType=DECIMAL}, #{afterPoints,jdbcType=DECIMAL}, + #{createTime,jdbcType=TIMESTAMP}) + + + + insert into member_points_record + + + member_id, + + + points, + + + type, + + + order_code, + + + before_points, + + + after_points, + + + create_time, + + + + + #{memberId,jdbcType=VARCHAR}, + + + #{points,jdbcType=DECIMAL}, + + + #{type,jdbcType=TINYINT}, + + + #{orderCode,jdbcType=VARCHAR}, + + + #{beforePoints,jdbcType=DECIMAL}, + + + #{afterPoints,jdbcType=DECIMAL}, + + + #{createTime,jdbcType=TIMESTAMP}, + + + + + + update member_points_record + set member_id = #{memberId,jdbcType=VARCHAR}, + points = #{points,jdbcType=DECIMAL}, + type = #{type,jdbcType=TINYINT}, + order_code = #{orderCode,jdbcType=VARCHAR}, + before_points = #{beforePoints,jdbcType=DECIMAL}, + after_points = #{afterPoints,jdbcType=DECIMAL}, + create_time = #{createTime,jdbcType=TIMESTAMP} + where id = #{id,jdbcType=BIGINT} + + + + update member_points_record + + + member_id = #{memberId,jdbcType=VARCHAR}, + + + points = #{points,jdbcType=DECIMAL}, + + + type = #{type,jdbcType=TINYINT}, + + + order_code = #{orderCode,jdbcType=VARCHAR}, + + + before_points = #{beforePoints,jdbcType=DECIMAL}, + + + after_points = #{afterPoints,jdbcType=DECIMAL}, + + + create_time = #{createTime,jdbcType=TIMESTAMP}, + + + where id = #{id,jdbcType=BIGINT} + + + + delete + from member_points_record + where id = #{id,jdbcType=BIGINT} + +