add 积分系统功能

This commit is contained in:
Guoqs
2025-12-24 15:41:11 +08:00
parent c2a1ae1966
commit e135db56b0
11 changed files with 917 additions and 0 deletions

View File

@@ -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<MemberPointsRecord> 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("初始化积分账户失败");
}
}
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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);
}

View File

@@ -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<MemberPointsRecord> selectByMemberId(@Param("memberId") String memberId);
/**
* 根据会员ID分页查询积分流水列表
*/
List<MemberPointsRecord> selectByMemberIdWithPage(@Param("memberId") String memberId);
/**
* 根据订单号查询积分流水
*/
List<MemberPointsRecord> 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);
}

View File

@@ -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<MemberPointsRecord> getPointsRecordList(String memberId);
/**
* 初始化会员积分账户
*
* @param memberId 会员ID
* @return 操作结果
*/
int initMemberPoints(String memberId);
}

View File

@@ -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<MemberPointsRecord> selectByMemberId(String memberId);
/**
* 根据订单号查询积分流水
*
* @param orderCode 订单号
* @return 积分流水列表
*/
List<MemberPointsRecord> selectByOrderCode(String orderCode);
/**
* 插入积分流水记录
*
* @param record 积分流水记录
* @return 操作结果
*/
int insert(MemberPointsRecord record);
}

View File

@@ -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<MemberPointsRecord> 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);
}
}

View File

@@ -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<MemberPointsRecord> selectByMemberId(String memberId) {
return memberPointsRecordMapper.selectByMemberId(memberId);
}
@Override
public List<MemberPointsRecord> selectByOrderCode(String orderCode) {
return memberPointsRecordMapper.selectByOrderCode(orderCode);
}
@Override
public int insert(MemberPointsRecord record) {
return memberPointsRecordMapper.insert(record);
}
}

View File

@@ -0,0 +1,108 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.jsowell.pile.mapper.MemberPointsInfoMapper">
<resultMap id="BaseResultMap" type="com.jsowell.pile.domain.MemberPointsInfo">
<id column="id" jdbcType="BIGINT" property="id"/>
<result column="member_id" jdbcType="VARCHAR" property="memberId"/>
<result column="total_points" jdbcType="DECIMAL" property="totalPoints"/>
<result column="update_time" jdbcType="TIMESTAMP" property="updateTime"/>
</resultMap>
<sql id="Base_Column_List">
id, member_id, total_points, update_time
</sql>
<select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap">
select
<include refid="Base_Column_List"/>
from member_points_info
where id = #{id,jdbcType=BIGINT}
</select>
<select id="selectByMemberId" parameterType="java.lang.String" resultMap="BaseResultMap">
select
<include refid="Base_Column_List"/>
from member_points_info
where member_id = #{memberId,jdbcType=VARCHAR}
</select>
<insert id="insert" keyColumn="id" keyProperty="id" parameterType="com.jsowell.pile.domain.MemberPointsInfo"
useGeneratedKeys="true">
insert into member_points_info (member_id, total_points, update_time)
values (#{memberId,jdbcType=VARCHAR}, #{totalPoints,jdbcType=DECIMAL}, #{updateTime,jdbcType=TIMESTAMP})
</insert>
<insert id="insertSelective" keyColumn="id" keyProperty="id"
parameterType="com.jsowell.pile.domain.MemberPointsInfo" useGeneratedKeys="true">
insert into member_points_info
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="memberId != null">
member_id,
</if>
<if test="totalPoints != null">
total_points,
</if>
<if test="updateTime != null">
update_time,
</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="memberId != null">
#{memberId,jdbcType=VARCHAR},
</if>
<if test="totalPoints != null">
#{totalPoints,jdbcType=DECIMAL},
</if>
<if test="updateTime != null">
#{updateTime,jdbcType=TIMESTAMP},
</if>
</trim>
</insert>
<update id="updateByPrimaryKey" parameterType="com.jsowell.pile.domain.MemberPointsInfo">
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>
<update id="updateByPrimaryKeySelective" parameterType="com.jsowell.pile.domain.MemberPointsInfo">
update member_points_info
<set>
<if test="memberId != null">
member_id = #{memberId,jdbcType=VARCHAR},
</if>
<if test="totalPoints != null">
total_points = #{totalPoints,jdbcType=DECIMAL},
</if>
<if test="updateTime != null">
update_time = #{updateTime,jdbcType=TIMESTAMP},
</if>
</set>
where id = #{id,jdbcType=BIGINT}
</update>
<!-- 原子性增加积分 -->
<update id="addPoints">
update member_points_info
set total_points = total_points + #{points,jdbcType=DECIMAL},
update_time = NOW()
where member_id = #{memberId,jdbcType=VARCHAR}
</update>
<!-- 原子性扣减积分(确保积分不会变为负数) -->
<update id="deductPoints">
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}
</update>
<delete id="deleteByPrimaryKey" parameterType="java.lang.Long">
delete
from member_points_info
where id = #{id,jdbcType=BIGINT}
</delete>
</mapper>

View File

@@ -0,0 +1,153 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.jsowell.pile.mapper.MemberPointsRecordMapper">
<resultMap id="BaseResultMap" type="com.jsowell.pile.domain.MemberPointsRecord">
<id column="id" jdbcType="BIGINT" property="id"/>
<result column="member_id" jdbcType="VARCHAR" property="memberId"/>
<result column="points" jdbcType="DECIMAL" property="points"/>
<result column="type" jdbcType="TINYINT" property="type"/>
<result column="order_code" jdbcType="VARCHAR" property="orderCode"/>
<result column="before_points" jdbcType="DECIMAL" property="beforePoints"/>
<result column="after_points" jdbcType="DECIMAL" property="afterPoints"/>
<result column="create_time" jdbcType="TIMESTAMP" property="createTime"/>
</resultMap>
<sql id="Base_Column_List">
id, member_id, points, type, order_code, before_points, after_points, create_time
</sql>
<select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap">
select
<include refid="Base_Column_List"/>
from member_points_record
where id = #{id,jdbcType=BIGINT}
</select>
<select id="selectByMemberId" parameterType="java.lang.String" resultMap="BaseResultMap">
select
<include refid="Base_Column_List"/>
from member_points_record
where member_id = #{memberId,jdbcType=VARCHAR}
order by create_time desc
</select>
<select id="selectByMemberIdWithPage" parameterType="java.lang.String" resultMap="BaseResultMap">
select
<include refid="Base_Column_List"/>
from member_points_record
where member_id = #{memberId,jdbcType=VARCHAR}
order by create_time desc
</select>
<select id="selectByOrderCode" parameterType="java.lang.String" resultMap="BaseResultMap">
select
<include refid="Base_Column_List"/>
from member_points_record
where order_code = #{orderCode,jdbcType=VARCHAR}
</select>
<insert id="insert" keyColumn="id" keyProperty="id" parameterType="com.jsowell.pile.domain.MemberPointsRecord"
useGeneratedKeys="true">
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>
<insert id="insertSelective" keyColumn="id" keyProperty="id"
parameterType="com.jsowell.pile.domain.MemberPointsRecord" useGeneratedKeys="true">
insert into member_points_record
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="memberId != null">
member_id,
</if>
<if test="points != null">
points,
</if>
<if test="type != null">
type,
</if>
<if test="orderCode != null">
order_code,
</if>
<if test="beforePoints != null">
before_points,
</if>
<if test="afterPoints != null">
after_points,
</if>
<if test="createTime != null">
create_time,
</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="memberId != null">
#{memberId,jdbcType=VARCHAR},
</if>
<if test="points != null">
#{points,jdbcType=DECIMAL},
</if>
<if test="type != null">
#{type,jdbcType=TINYINT},
</if>
<if test="orderCode != null">
#{orderCode,jdbcType=VARCHAR},
</if>
<if test="beforePoints != null">
#{beforePoints,jdbcType=DECIMAL},
</if>
<if test="afterPoints != null">
#{afterPoints,jdbcType=DECIMAL},
</if>
<if test="createTime != null">
#{createTime,jdbcType=TIMESTAMP},
</if>
</trim>
</insert>
<update id="updateByPrimaryKey" parameterType="com.jsowell.pile.domain.MemberPointsRecord">
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>
<update id="updateByPrimaryKeySelective" parameterType="com.jsowell.pile.domain.MemberPointsRecord">
update member_points_record
<set>
<if test="memberId != null">
member_id = #{memberId,jdbcType=VARCHAR},
</if>
<if test="points != null">
points = #{points,jdbcType=DECIMAL},
</if>
<if test="type != null">
type = #{type,jdbcType=TINYINT},
</if>
<if test="orderCode != null">
order_code = #{orderCode,jdbcType=VARCHAR},
</if>
<if test="beforePoints != null">
before_points = #{beforePoints,jdbcType=DECIMAL},
</if>
<if test="afterPoints != null">
after_points = #{afterPoints,jdbcType=DECIMAL},
</if>
<if test="createTime != null">
create_time = #{createTime,jdbcType=TIMESTAMP},
</if>
</set>
where id = #{id,jdbcType=BIGINT}
</update>
<delete id="deleteByPrimaryKey" parameterType="java.lang.Long">
delete
from member_points_record
where id = #{id,jdbcType=BIGINT}
</delete>
</mapper>