余额变动,临时提交

This commit is contained in:
墨大叔 2024-07-22 11:53:44 +08:00
parent 8d753fbdbb
commit eaa86d0ec3
23 changed files with 707 additions and 103 deletions

View File

@ -207,4 +207,17 @@ public class Constants
* accessSecret
*/
public static final String HEADER_ACCESS_SECRET = "accessSecret";
/**
* 设备不存在
*/
public static final int DEVICE_NOT_FOUND = 0;
/**
* 设备未绑定
*/
public static final int DEVICE_NOT_BIND = 1;
/**
* 设备已绑定
*/
public static final int DEVICE_BINDED = 2;
}

View File

@ -131,4 +131,7 @@ public class SmUser extends BaseEntity
@ApiModelProperty("是否设备管理员")
private Boolean deviceAdmin;
@ApiModelProperty("服务费收取方式")
private String serviceType;
}

View File

@ -17,6 +17,8 @@ import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.enums.BusinessType;
import ${packageName}.domain.${ClassName};
import ${packageName}.domain.${ClassName}VO;
import ${packageName}.domain.${ClassName}Query;
import ${packageName}.service.I${ClassName}Service;
import com.ruoyi.common.utils.poi.ExcelUtil;
#if($table.crud || $table.sub)
@ -26,7 +28,7 @@ import com.ruoyi.common.core.page.TableDataInfo;
/**
* ${functionName}Controller
*
*
* @author ${author}
* @date ${datetime}
*/
@ -43,10 +45,11 @@ public class ${ClassName}Controller extends BaseController
@PreAuthorize("@ss.hasPermi('${permissionPrefix}:list')")
@GetMapping("/list")
#if($table.crud || $table.sub)
public TableDataInfo list(${ClassName} ${className})
public TableDataInfo list(${ClassName}Query query)
{
startPage();
List<${ClassName}> list = ${className}Service.select${ClassName}List(${className});
startOrderBy();
List<${ClassName}VO> list = ${className}Service.select${ClassName}List(query);
return getDataTable(list);
}
#elseif($table.tree)
@ -63,10 +66,10 @@ public class ${ClassName}Controller extends BaseController
@PreAuthorize("@ss.hasPermi('${permissionPrefix}:export')")
@Log(title = "${functionName}", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(HttpServletResponse response, ${ClassName} ${className})
public void export(HttpServletResponse response, ${ClassName}Query query)
{
List<${ClassName}> list = ${className}Service.select${ClassName}List(${className});
ExcelUtil<${ClassName}> util = new ExcelUtil<${ClassName}>(${ClassName}.class);
List<${ClassName}VO> list = ${className}Service.select${ClassName}List(query);
ExcelUtil<${ClassName}VO> util = new ExcelUtil<${ClassName}VO>(${ClassName}VO.class);
util.exportExcel(response, list, "${functionName}数据");
}

View File

@ -2,37 +2,40 @@ package ${packageName}.mapper;
import java.util.List;
import ${packageName}.domain.${ClassName};
import ${packageName}.domain.${ClassName}VO;
import ${packageName}.domain.${ClassName}Query;
import org.apache.ibatis.annotations.Param;
#if($table.sub)
import ${packageName}.domain.${subClassName};
#end
/**
* ${functionName}Mapper接口
*
*
* @author ${author}
* @date ${datetime}
*/
public interface ${ClassName}Mapper
public interface ${ClassName}Mapper
{
/**
* 查询${functionName}
*
*
* @param ${pkColumn.javaField} ${functionName}主键
* @return ${functionName}
*/
public ${ClassName} select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField});
public ${ClassName}VO select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField});
/**
* 查询${functionName}列表
*
*
* @param ${className} ${functionName}
* @return ${functionName}集合
*/
public List<${ClassName}> select${ClassName}List(${ClassName} ${className});
public List<${ClassName}VO> select${ClassName}List(@Param("query")${ClassName}Query ${className});
/**
* 新增${functionName}
*
*
* @param ${className} ${functionName}
* @return 结果
*/
@ -40,15 +43,15 @@ public interface ${ClassName}Mapper
/**
* 修改${functionName}
*
*
* @param ${className} ${functionName}
* @return 结果
*/
public int update${ClassName}(${ClassName} ${className});
public int update${ClassName}(@Param("data") ${ClassName} ${className});
/**
* 删除${functionName}
*
*
* @param ${pkColumn.javaField} ${functionName}主键
* @return 结果
*/
@ -56,7 +59,7 @@ public interface ${ClassName}Mapper
/**
* 批量删除${functionName}
*
*
* @param ${pkColumn.javaField}s 需要删除的数据主键集合
* @return 结果
*/
@ -65,24 +68,24 @@ public interface ${ClassName}Mapper
/**
* 批量删除${subTable.functionName}
*
*
* @param ${pkColumn.javaField}s 需要删除的数据主键集合
* @return 结果
*/
public int delete${subClassName}By${subTableFkClassName}s(${pkColumn.javaType}[] ${pkColumn.javaField}s);
/**
* 批量新增${subTable.functionName}
*
*
* @param ${subclassName}List ${subTable.functionName}列表
* @return 结果
*/
public int batch${subClassName}(List<${subClassName}> ${subclassName}List);
/**
* 通过${functionName}主键删除${subTable.functionName}信息
*
*
* @param ${pkColumn.javaField} ${functionName}ID
* @return 结果
*/

View File

@ -2,34 +2,36 @@ package ${packageName}.service;
import java.util.List;
import ${packageName}.domain.${ClassName};
import ${packageName}.domain.${ClassName}VO;
import ${packageName}.domain.${ClassName}Query;
/**
* ${functionName}Service接口
*
*
* @author ${author}
* @date ${datetime}
*/
public interface I${ClassName}Service
public interface I${ClassName}Service
{
/**
* 查询${functionName}
*
*
* @param ${pkColumn.javaField} ${functionName}主键
* @return ${functionName}
*/
public ${ClassName} select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField});
public ${ClassName}VO select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField});
/**
* 查询${functionName}列表
*
*
* @param ${className} ${functionName}
* @return ${functionName}集合
*/
public List<${ClassName}> select${ClassName}List(${ClassName} ${className});
public List<${ClassName}VO> select${ClassName}List(${ClassName}Query ${className});
/**
* 新增${functionName}
*
*
* @param ${className} ${functionName}
* @return 结果
*/
@ -37,7 +39,7 @@ public interface I${ClassName}Service
/**
* 修改${functionName}
*
*
* @param ${className} ${functionName}
* @return 结果
*/
@ -45,7 +47,7 @@ public interface I${ClassName}Service
/**
* 批量删除${functionName}
*
*
* @param ${pkColumn.javaField}s 需要删除的${functionName}主键集合
* @return 结果
*/
@ -53,7 +55,7 @@ public interface I${ClassName}Service
/**
* 删除${functionName}信息
*
*
* @param ${pkColumn.javaField} ${functionName}主键
* @return 结果
*/

View File

@ -17,47 +17,49 @@ import ${packageName}.domain.${subClassName};
#end
import ${packageName}.mapper.${ClassName}Mapper;
import ${packageName}.domain.${ClassName};
import ${packageName}.domain.${ClassName}VO;
import ${packageName}.domain.${ClassName}Query;
import ${packageName}.service.I${ClassName}Service;
/**
* ${functionName}Service业务层处理
*
*
* @author ${author}
* @date ${datetime}
*/
@Service
public class ${ClassName}ServiceImpl implements I${ClassName}Service
public class ${ClassName}ServiceImpl implements I${ClassName}Service
{
@Autowired
private ${ClassName}Mapper ${className}Mapper;
/**
* 查询${functionName}
*
*
* @param ${pkColumn.javaField} ${functionName}主键
* @return ${functionName}
*/
@Override
public ${ClassName} select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField})
public ${ClassName}VO select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField})
{
return ${className}Mapper.select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaField});
}
/**
* 查询${functionName}列表
*
*
* @param ${className} ${functionName}
* @return ${functionName}
*/
@Override
public List<${ClassName}> select${ClassName}List(${ClassName} ${className})
public List<${ClassName}VO> select${ClassName}List(${ClassName}Query ${className})
{
return ${className}Mapper.select${ClassName}List(${className});
}
/**
* 新增${functionName}
*
*
* @param ${className} ${functionName}
* @return 结果
*/
@ -83,7 +85,7 @@ public class ${ClassName}ServiceImpl implements I${ClassName}Service
/**
* 修改${functionName}
*
*
* @param ${className} ${functionName}
* @return 结果
*/
@ -107,7 +109,7 @@ public class ${ClassName}ServiceImpl implements I${ClassName}Service
/**
* 批量删除${functionName}
*
*
* @param ${pkColumn.javaField}s 需要删除的${functionName}主键
* @return 结果
*/
@ -125,7 +127,7 @@ public class ${ClassName}ServiceImpl implements I${ClassName}Service
/**
* 删除${functionName}信息
*
*
* @param ${pkColumn.javaField} ${functionName}主键
* @return 结果
*/
@ -144,7 +146,7 @@ public class ${ClassName}ServiceImpl implements I${ClassName}Service
/**
* 新增${subTable.functionName}信息
*
*
* @param ${className} ${functionName}对象
*/
public void insert${subClassName}(${ClassName} ${className})

View File

@ -3,8 +3,8 @@
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="${packageName}.mapper.${ClassName}Mapper">
<resultMap type="${ClassName}" id="${ClassName}Result">
<resultMap type="${ClassName}VO" id="${ClassName}Result">
#foreach ($column in $columns)
<result property="${column.javaField}" column="${column.columnName}" />
#end
@ -23,41 +23,49 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
#end
<sql id="select${ClassName}Vo">
select#foreach($column in $columns) $column.columnName#if($foreach.count != $columns.size()),#end#end from ${tableName}
select
#foreach($column in $columns)
$column.columnName#if($foreach.count != $columns.size()),#end
#end
from ${tableName}
</sql>
<select id="select${ClassName}List" parameterType="${ClassName}" resultMap="${ClassName}Result">
<sql id="searchCondition">
#foreach($column in $columns)
#set($queryType=$column.queryType)
#set($javaField=$column.javaField)
#set($javaType=$column.javaType)
#set($columnName=$column.columnName)
#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
#if($column.query)
#if($column.queryType == "EQ")
<if test="query.$javaField != null #if($javaType == 'String' ) and query.$javaField.trim() != ''#end"> and $columnName = #{query.$javaField}</if>
#elseif($queryType == "NE")
<if test="query.$javaField != null #if($javaType == 'String' ) and query.$javaField.trim() != ''#end"> and $columnName != #{query.$javaField}</if>
#elseif($queryType == "GT")
<if test="query.$javaField != null #if($javaType == 'String' ) and query.$javaField.trim() != ''#end"> and $columnName &gt; #{query.$javaField}</if>
#elseif($queryType == "GTE")
<if test="query.$javaField != null #if($javaType == 'String' ) and query.$javaField.trim() != ''#end"> and $columnName &gt;= #{query.$javaField}</if>
#elseif($queryType == "LT")
<if test="query.$javaField != null #if($javaType == 'String' ) and query.$javaField.trim() != ''#end"> and $columnName &lt; #{query.$javaField}</if>
#elseif($queryType == "LTE")
<if test="query.$javaField != null #if($javaType == 'String' ) and query.$javaField.trim() != ''#end"> and $columnName &lt;= #{query.$javaField}</if>
#elseif($queryType == "LIKE")
<if test="query.$javaField != null #if($javaType == 'String' ) and query.$javaField.trim() != ''#end"> and $columnName like concat('%', #{query.$javaField}, '%')</if>
#elseif($queryType == "BETWEEN")
<if test="query.params.begin$AttrName != null and query.params.begin$AttrName != '' and query.params.end$AttrName != null and query.params.end$AttrName != ''"> and $columnName between #{query.params.begin$AttrName} and #{query.params.end$AttrName}</if>
#end
#end
#end
</sql>
<select id="select${ClassName}List" parameterType="${ClassName}Query" resultMap="${ClassName}Result">
<include refid="select${ClassName}Vo"/>
<where>
#foreach($column in $columns)
#set($queryType=$column.queryType)
#set($javaField=$column.javaField)
#set($javaType=$column.javaType)
#set($columnName=$column.columnName)
#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
#if($column.query)
#if($column.queryType == "EQ")
<if test="$javaField != null #if($javaType == 'String' ) and $javaField.trim() != ''#end"> and $columnName = #{$javaField}</if>
#elseif($queryType == "NE")
<if test="$javaField != null #if($javaType == 'String' ) and $javaField.trim() != ''#end"> and $columnName != #{$javaField}</if>
#elseif($queryType == "GT")
<if test="$javaField != null #if($javaType == 'String' ) and $javaField.trim() != ''#end"> and $columnName &gt; #{$javaField}</if>
#elseif($queryType == "GTE")
<if test="$javaField != null #if($javaType == 'String' ) and $javaField.trim() != ''#end"> and $columnName &gt;= #{$javaField}</if>
#elseif($queryType == "LT")
<if test="$javaField != null #if($javaType == 'String' ) and $javaField.trim() != ''#end"> and $columnName &lt; #{$javaField}</if>
#elseif($queryType == "LTE")
<if test="$javaField != null #if($javaType == 'String' ) and $javaField.trim() != ''#end"> and $columnName &lt;= #{$javaField}</if>
#elseif($queryType == "LIKE")
<if test="$javaField != null #if($javaType == 'String' ) and $javaField.trim() != ''#end"> and $columnName like concat('%', #{$javaField}, '%')</if>
#elseif($queryType == "BETWEEN")
<if test="params.begin$AttrName != null and params.begin$AttrName != '' and params.end$AttrName != null and params.end$AttrName != ''"> and $columnName between #{params.begin$AttrName} and #{params.end$AttrName}</if>
#end
#end
#end
<where>
<include refid="searchCondition"/>
</where>
</select>
<select id="select${ClassName}By${pkColumn.capJavaField}" parameterType="${pkColumn.javaType}" resultMap="#if($table.sub)${ClassName}${subClassName}Result#else${ClassName}Result#end">
#if($table.crud || $table.tree)
<include refid="select${ClassName}Vo"/>
@ -71,7 +79,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
where a.${pkColumn.columnName} = #{${pkColumn.javaField}}
#end
</select>
<insert id="insert${ClassName}" parameterType="${ClassName}"#if($pkColumn.increment) useGeneratedKeys="true" keyProperty="$pkColumn.javaField"#end>
insert into ${tableName}
<trim prefix="(" suffix=")" suffixOverrides=",">
@ -95,7 +103,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<trim prefix="SET" suffixOverrides=",">
#foreach($column in $columns)
#if($column.columnName != $pkColumn.columnName)
<if test="$column.javaField != null#if($column.javaType == 'String' && $column.required) and $column.javaField != ''#end">$column.columnName = #{$column.javaField},</if>
<if test="data.$column.javaField != null#if($column.javaType == 'String' && $column.required) and data.$column.javaField != ''#end">$column.columnName = #{data.$column.javaField},</if>
#end
#end
</trim>
@ -107,15 +115,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</delete>
<delete id="delete${ClassName}By${pkColumn.capJavaField}s" parameterType="String">
delete from ${tableName} where ${pkColumn.columnName} in
delete from ${tableName} where ${pkColumn.columnName} in
<foreach item="${pkColumn.javaField}" collection="array" open="(" separator="," close=")">
#{${pkColumn.javaField}}
</foreach>
</delete>
#if($table.sub)
<delete id="delete${subClassName}By${subTableFkClassName}s" parameterType="String">
delete from ${subTableName} where ${subTableFkName} in
delete from ${subTableName} where ${subTableFkName} in
<foreach item="${subTableFkclassName}" collection="array" open="(" separator="," close=")">
#{${subTableFkclassName}}
</foreach>
@ -132,4 +140,4 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</foreach>
</insert>
#end
</mapper>
</mapper>

View File

@ -143,10 +143,11 @@ public interface DeviceService
/**
* 设备是否已经被绑定
*
* @param mac
* @return
*/
boolean isBindByMac(String mac);
int bindCodeByMac(String mac);
/**
* ids查询列表
@ -188,10 +189,11 @@ public interface DeviceService
/**
* 根据SN码查询设备是否已经绑定
*
* @param deviceNo
* @return
*/
boolean isBindBySn(String deviceNo);
int bindCodeBySn(String deviceNo);
/**
* 更新设备服务费

View File

@ -1,5 +1,6 @@
package com.ruoyi.ss.device.service.impl;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.core.redis.RedisLock;
import com.ruoyi.common.core.redis.enums.RedisLockKey;
@ -669,12 +670,23 @@ public class DeviceServiceImpl implements DeviceService
* @return
*/
@Override
public boolean isBindByMac(String mac) {
public int bindCodeByMac(String mac) {
if (StringUtils.isBlank(mac)) {
return false;
return Constants.DEVICE_NOT_FOUND;
}
DeviceVO device = deviceMapper.selectSimpleSmDeviceByMac(mac);
return device != null && device.getUserId() != null;
return isBindCode(device);
}
private int isBindCode(DeviceVO device) {
if (device == null) {
return Constants.DEVICE_NOT_FOUND;
}
if (device.getUserId() == null) {
return Constants.DEVICE_NOT_BIND;
} else {
return Constants.DEVICE_BINDED;
}
}
/**
@ -684,12 +696,12 @@ public class DeviceServiceImpl implements DeviceService
* @return
*/
@Override
public boolean isBindBySn(String deviceNo) {
public int bindCodeBySn(String deviceNo) {
if (StringUtils.isBlank(deviceNo)) {
return false;
return Constants.DEVICE_NOT_FOUND;
}
DeviceVO device = deviceMapper.selectSimpleSmDeviceBySn(deviceNo);
return device != null && device.getUserId() != null;
return isBindCode(device);
}
/**

View File

@ -0,0 +1,44 @@
package com.ruoyi.ss.recordBalance.domain;
import java.math.BigDecimal;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.core.domain.BaseEntity;
/**
* 余额变动记录对象 ss_record_balance
*
* @author ruoyi
* @date 2024-07-22
*/
@Data
public class RecordBalance extends BaseEntity
{
private static final long serialVersionUID = 1L;
/** ID */
private Long id;
/** 用户ID */
@Excel(name = "用户ID")
private Long userId;
/** 变动前余额(元) */
@Excel(name = "变动前余额", readConverterExp = "元=")
private BigDecimal beforeBalance;
/** 变动后余额(元) */
@Excel(name = "变动后余额", readConverterExp = "元=")
private BigDecimal afterBalance;
/** 变动原因 */
@Excel(name = "变动原因")
private String reason;
@ApiModelProperty("变化金额")
private BigDecimal amount;
}

View File

@ -0,0 +1,11 @@
package com.ruoyi.ss.recordBalance.domain;
import lombok.Data;
/**
* @author wjh
* 2024/7/22
*/
@Data
public class RecordBalanceQuery extends RecordBalance{
}

View File

@ -0,0 +1,11 @@
package com.ruoyi.ss.recordBalance.domain;
import lombok.Data;
/**
* @author wjh
* 2024/7/22
*/
@Data
public class RecordBalanceVO extends RecordBalance{
}

View File

@ -0,0 +1,64 @@
package com.ruoyi.ss.recordBalance.mapper;
import java.util.List;
import com.ruoyi.ss.recordBalance.domain.RecordBalance;
import com.ruoyi.ss.recordBalance.domain.RecordBalanceVO;
import com.ruoyi.ss.recordBalance.domain.RecordBalanceQuery;
import org.apache.ibatis.annotations.Param;
/**
* 余额变动记录Mapper接口
*
* @author ruoyi
* @date 2024-07-22
*/
public interface RecordBalanceMapper
{
/**
* 查询余额变动记录
*
* @param id 余额变动记录主键
* @return 余额变动记录
*/
public RecordBalanceVO selectRecordBalanceById(Long id);
/**
* 查询余额变动记录列表
*
* @param recordBalance 余额变动记录
* @return 余额变动记录集合
*/
public List<RecordBalanceVO> selectRecordBalanceList(@Param("query")RecordBalanceQuery recordBalance);
/**
* 新增余额变动记录
*
* @param recordBalance 余额变动记录
* @return 结果
*/
public int insertRecordBalance(RecordBalance recordBalance);
/**
* 修改余额变动记录
*
* @param recordBalance 余额变动记录
* @return 结果
*/
public int updateRecordBalance(@Param("data") RecordBalance recordBalance);
/**
* 删除余额变动记录
*
* @param id 余额变动记录主键
* @return 结果
*/
public int deleteRecordBalanceById(Long id);
/**
* 批量删除余额变动记录
*
* @param ids 需要删除的数据主键集合
* @return 结果
*/
public int deleteRecordBalanceByIds(Long[] ids);
}

View File

@ -0,0 +1,82 @@
<?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.ruoyi.ss.recordBalance.mapper.RecordBalanceMapper">
<resultMap type="RecordBalanceVO" id="RecordBalanceResult" autoMapping="true"/>
<sql id="selectRecordBalanceVo">
select
srb.id,
srb.user_id,
srb.before_balance,
srb.after_balance,
srb.reason,
srb.create_time,
srb.amount
from ss_record_balance srb
</sql>
<sql id="searchCondition">
<if test="query.id != null "> and srb.id = #{query.id}</if>
<if test="query.userId != null "> and srb.user_id = #{query.userId}</if>
<if test="query.reason != null and query.reason != ''"> and srb.reason like concat('%', #{query.reason}, '%')</if>
</sql>
<select id="selectRecordBalanceList" parameterType="RecordBalanceQuery" resultMap="RecordBalanceResult">
<include refid="selectRecordBalanceVo"/>
<where>
<include refid="searchCondition"/>
</where>
</select>
<select id="selectRecordBalanceById" parameterType="Long" resultMap="RecordBalanceResult">
<include refid="selectRecordBalanceVo"/>
where srb.id = #{id}
</select>
<insert id="insertRecordBalance" parameterType="RecordBalance" useGeneratedKeys="true" keyProperty="id">
insert into ss_record_balance
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="userId != null">user_id,</if>
<if test="beforeBalance != null">before_balance,</if>
<if test="afterBalance != null">after_balance,</if>
<if test="reason != null and reason != ''">reason,</if>
<if test="createTime != null">create_time,</if>
<if test="amount != null">amount,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="userId != null">#{userId},</if>
<if test="beforeBalance != null">#{beforeBalance},</if>
<if test="afterBalance != null">#{afterBalance},</if>
<if test="reason != null and reason != ''">#{reason},</if>
<if test="createTime != null">#{createTime},</if>
<if test="amount != null">#{amount},</if>
</trim>
</insert>
<update id="updateRecordBalance" parameterType="RecordBalance">
update ss_record_balance
<trim prefix="SET" suffixOverrides=",">
<if test="data.userId != null">user_id = #{data.userId},</if>
<if test="data.beforeBalance != null">before_balance = #{data.beforeBalance},</if>
<if test="data.afterBalance != null">after_balance = #{data.afterBalance},</if>
<if test="data.reason != null and data.reason != ''">reason = #{data.reason},</if>
<if test="data.createTime != null">create_time = #{data.createTime},</if>
<if test="data.amount != null">amount = #{data.amount},</if>
</trim>
where id = #{id}
</update>
<delete id="deleteRecordBalanceById" parameterType="Long">
delete from ss_record_balance where id = #{id}
</delete>
<delete id="deleteRecordBalanceByIds" parameterType="String">
delete from ss_record_balance where id in
<foreach item="id" collection="array" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
</mapper>

View File

@ -0,0 +1,75 @@
package com.ruoyi.ss.recordBalance.service;
import java.math.BigDecimal;
import java.util.List;
import com.ruoyi.ss.recordBalance.domain.RecordBalance;
import com.ruoyi.ss.recordBalance.domain.RecordBalanceVO;
import com.ruoyi.ss.recordBalance.domain.RecordBalanceQuery;
/**
* 余额变动记录Service接口
*
* @author ruoyi
* @date 2024-07-22
*/
public interface RecordBalanceService
{
/**
* 查询余额变动记录
*
* @param id 余额变动记录主键
* @return 余额变动记录
*/
public RecordBalanceVO selectRecordBalanceById(Long id);
/**
* 查询余额变动记录列表
*
* @param recordBalance 余额变动记录
* @return 余额变动记录集合
*/
public List<RecordBalanceVO> selectRecordBalanceList(RecordBalanceQuery recordBalance);
/**
* 新增余额变动记录
*
* @param recordBalance 余额变动记录
* @return 结果
*/
public int insertRecordBalance(RecordBalance recordBalance);
/**
* 修改余额变动记录
*
* @param recordBalance 余额变动记录
* @return 结果
*/
public int updateRecordBalance(RecordBalance recordBalance);
/**
* 批量删除余额变动记录
*
* @param ids 需要删除的余额变动记录主键集合
* @return 结果
*/
public int deleteRecordBalanceByIds(Long[] ids);
/**
* 删除余额变动记录信息
*
* @param id 余额变动记录主键
* @return 结果
*/
public int deleteRecordBalanceById(Long id);
/**
* 添加余额变动记录
*
* @param userId 用户ID
* @param beforeBalance 变动前余额
* @param amount 变动的金额
* @param reason
*/
int record(Long userId, BigDecimal beforeBalance, BigDecimal amount, String reason);
}

View File

@ -0,0 +1,115 @@
package com.ruoyi.ss.recordBalance.service.impl;
import java.math.BigDecimal;
import java.util.List;
import com.ruoyi.common.utils.DateUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.ss.recordBalance.mapper.RecordBalanceMapper;
import com.ruoyi.ss.recordBalance.domain.RecordBalance;
import com.ruoyi.ss.recordBalance.domain.RecordBalanceVO;
import com.ruoyi.ss.recordBalance.domain.RecordBalanceQuery;
import com.ruoyi.ss.recordBalance.service.RecordBalanceService;
/**
* 余额变动记录Service业务层处理
*
* @author ruoyi
* @date 2024-07-22
*/
@Service
public class RecordBalanceServiceImpl implements RecordBalanceService
{
@Autowired
private RecordBalanceMapper recordBalanceMapper;
/**
* 查询余额变动记录
*
* @param id 余额变动记录主键
* @return 余额变动记录
*/
@Override
public RecordBalanceVO selectRecordBalanceById(Long id)
{
return recordBalanceMapper.selectRecordBalanceById(id);
}
/**
* 查询余额变动记录列表
*
* @param recordBalance 余额变动记录
* @return 余额变动记录
*/
@Override
public List<RecordBalanceVO> selectRecordBalanceList(RecordBalanceQuery recordBalance)
{
return recordBalanceMapper.selectRecordBalanceList(recordBalance);
}
/**
* 新增余额变动记录
*
* @param recordBalance 余额变动记录
* @return 结果
*/
@Override
public int insertRecordBalance(RecordBalance recordBalance)
{
recordBalance.setCreateTime(DateUtils.getNowDate());
return recordBalanceMapper.insertRecordBalance(recordBalance);
}
/**
* 修改余额变动记录
*
* @param recordBalance 余额变动记录
* @return 结果
*/
@Override
public int updateRecordBalance(RecordBalance recordBalance)
{
return recordBalanceMapper.updateRecordBalance(recordBalance);
}
/**
* 批量删除余额变动记录
*
* @param ids 需要删除的余额变动记录主键
* @return 结果
*/
@Override
public int deleteRecordBalanceByIds(Long[] ids)
{
return recordBalanceMapper.deleteRecordBalanceByIds(ids);
}
/**
* 删除余额变动记录信息
*
* @param id 余额变动记录主键
* @return 结果
*/
@Override
public int deleteRecordBalanceById(Long id)
{
return recordBalanceMapper.deleteRecordBalanceById(id);
}
@Override
public int record(Long userId, BigDecimal beforeBalance, BigDecimal amount, String reason) {
if (userId == null || beforeBalance == null || amount == null || StringUtils.isBlank(reason)) {
return 0;
}
RecordBalance record = new RecordBalance();
record.setUserId(userId);
record.setBeforeBalance(beforeBalance);
record.setAmount(amount);
record.setAfterBalance(beforeBalance.add(amount));
record.setReason(reason);
return this.insertRecordBalance(record);
}
}

View File

@ -352,7 +352,7 @@ public class TransactionBillServiceImpl implements TransactionBillService {
ServiceUtil.assertion(arrivalAmount.compareTo(data.getArrivalAmount()) != 0, "到账金额计算不一致,请重新申请");
// 减少余额并判断提现金额是否超额减少的是交易金额
userService.subtractBalance(userId, data.getMoney());
userService.subtractBalance(userId, data.getMoney(), "提现");
// 减少余额后的用户信息
SmUserVo afterUser = smUserMapper.selectSimpleById(userId);
@ -410,7 +410,7 @@ public class TransactionBillServiceImpl implements TransactionBillService {
// 返还客户余额
TransactionBill bill = transactionBillMapper.selectSmTransactionBillByBillId(billId);
ServiceUtil.assertion(bill == null || bill.getUserId() == null, "数据不存在");
userService.addBalance(bill.getUserId(), bill.getMoney());
userService.addBalance(bill.getUserId(), bill.getMoney(), "提现驳回");
return true;
} finally {
@ -649,7 +649,7 @@ public class TransactionBillServiceImpl implements TransactionBillService {
ServiceUtil.assertion(updateCount != 1, "修改订单状态失败,请刷新后重试");
// 商户余额增加
userService.addBalance(bill.getMchId(), bill.getArrivalAmount());
userService.addBalance(bill.getMchId(), bill.getArrivalAmount(), String.format("订单充值:%s", billNo));
// 记录下充值后的余额
SmUserVo user = userService.selectSmUserByUserId(bill.getMchId());
@ -912,7 +912,7 @@ public class TransactionBillServiceImpl implements TransactionBillService {
RefundVO refundVO = refundService.selectRefundByRefundNo(refund.getRefundNo());
// 商户余额按照比例扣减
userService.subtractBalance(bill.getMchId(), refund.getMchAmount());
userService.subtractBalance(bill.getMchId(), refund.getMchAmount(), "退款");
// 修改原订单的退款金额和退款手续费
int updateRefundAmount = this.addRefundAmount(bill.getBillId(), refund.getAmount(), refund.getMchAmount(), refund.getServiceAmount());

View File

@ -96,8 +96,9 @@ public interface SmUserMapper
* 扣减余额
* @param userId 用户id
* @param amount 金额
* @param check 校验余额是否充足
*/
int subtractBalance(@Param("userId") Long userId, @Param("amount") BigDecimal amount);
int subtractBalance(@Param("userId") Long userId, @Param("amount") BigDecimal amount, @Param("check") boolean check);
/**
* 更新用户服务费

View File

@ -38,6 +38,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
su.is_mch,
su.service_rate,
su.device_admin,
su.service_type,
(select sum(stb.money) from sm_transaction_bill stb where stb.user_id = su.user_id and stb.type = '1' and stb.status = '2') as recharge_amount,
(select sum(stb.arrival_amount) from sm_transaction_bill stb where stb.user_id = su.user_id and stb.type = '2' and stb.status = '14') as with_drawl_amount,
(select sum(stb.arrival_amount) from sm_transaction_bill stb where stb.mch_id = su.user_id and stb.type = '1' and stb.status = '2') as total_income
@ -142,6 +143,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="isMch != null">is_mch,</if>
<if test="serviceRate != null">service_rate,</if>
<if test="deviceAdmin != null">device_admin,</if>
<if test="serviceType != null">service_type,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="userName != null and userName != ''">#{userName},</if>
@ -168,6 +170,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="isMch != null">#{isMch},</if>
<if test="serviceRate != null">#{serviceRate},</if>
<if test="deviceAdmin != null">#{deviceAdmin},</if>
<if test="serviceType != null">#{serviceType},</if>
</trim>
</insert>
@ -204,6 +207,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="isMch != null">is_mch = #{isMch},</if>
<if test="serviceRate != null">service_rate = #{serviceRate},</if>
<if test="deviceAdmin != null">device_admin = #{deviceAdmin},</if>
<if test="serviceType != null">service_type = #{serviceType},</if>
</trim>
where user_id = #{userId}
</update>
@ -220,7 +224,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<update id="subtractBalance">
update sm_user
set balance = balance - #{amount}
where user_id = #{userId} and del_flag = '0' and balance >= #{amount}
<where>
user_id = #{userId} and del_flag = '0'
<if test="check">
and balance >= #{amount}
</if>
</where>
</update>
<update id="updateServiceRate">

View File

@ -2,7 +2,6 @@ package com.ruoyi.ss.user.service;
import com.ruoyi.common.core.domain.entity.SmUser;
import com.ruoyi.common.enums.UserType;
import com.ruoyi.ss.access.domain.AccessVO;
import com.ruoyi.ss.user.domain.SmUserQuery;
import com.ruoyi.ss.user.domain.SmUserVo;
import com.ruoyi.ss.user.domain.bo.UserUpdateServiceRateBO;
@ -102,17 +101,33 @@ public interface ISmUserService
/**
* 增加余额
*
* @param userId 用户id
* @param amount 金额
* @param reason
*/
void addBalance(Long userId, BigDecimal amount);
void addBalance(Long userId, BigDecimal amount, String reason);
/**
* 减少余额
*
* @param userId 用户id
* @param amount 金额
* @param reason
*/
void subtractBalance(Long userId, BigDecimal amount);
default void subtractBalance(Long userId, BigDecimal amount, String reason) {
subtractBalance(userId, amount, true, reason);
}
/**
* 减少余额
*
* @param userId 用户id
* @param amount 金额
* @param check 是否校验余额是否充足
* @param reason 原因
*/
void subtractBalance(Long userId, BigDecimal amount, boolean check, String reason);
/**
* 修改微信OpenId

View File

@ -9,6 +9,7 @@ import com.ruoyi.common.utils.collection.CollectionUtils;
import com.ruoyi.ss.device.domain.DeviceQuery;
import com.ruoyi.ss.device.domain.vo.DeviceVO;
import com.ruoyi.ss.device.service.DeviceService;
import com.ruoyi.ss.recordBalance.service.RecordBalanceService;
import com.ruoyi.ss.store.domain.StoreQuery;
import com.ruoyi.ss.store.domain.StoreVo;
import com.ruoyi.ss.store.service.IStoreService;
@ -50,6 +51,9 @@ public class SmUserServiceImpl implements ISmUserService
@Autowired
private IStoreService storeService;
@Autowired
private RecordBalanceService recordBalanceService;
/**
* 查询普通用户信息
*
@ -122,18 +126,36 @@ public class SmUserServiceImpl implements ISmUserService
@Override
@Transactional
public void addBalance(Long userId, BigDecimal amount) {
public void addBalance(Long userId, BigDecimal amount, String reason) {
ServiceUtil.assertion(BigDecimal.ZERO.compareTo(amount) > 0, "增加的金额需要大于0");
// 查询用户
SmUserVo user = selectSmUserByUserId(userId);
// 修改余额
int updateCount = smUserMapper.addBalance(userId, amount);
ServiceUtil.assertion(updateCount != 1, "增加用户余额失败");
// 余额变动记录
int record = recordBalanceService.record(userId, user.getBalance(), amount, reason);
ServiceUtil.assertion(record != 1, "用户余额变动记录失败");
}
@Override
@Transactional
public void subtractBalance(Long userId, BigDecimal amount) {
public void subtractBalance(Long userId, BigDecimal amount, boolean check, String reason) {
ServiceUtil.assertion(BigDecimal.ZERO.compareTo(amount) > 0, "减少的金额需要大于0");
int updateCount = smUserMapper.subtractBalance(userId, amount);
// 查询用户
SmUserVo user = selectSmUserByUserId(userId);
// 更新用户余额
int updateCount = smUserMapper.subtractBalance(userId, amount, check);
ServiceUtil.assertion(updateCount != 1, "减少用户余额失败:用户不存在或余额不足");
// 余额变动记录
int record = recordBalanceService.record(userId, user.getBalance(), amount, reason);
ServiceUtil.assertion(record != 1, "用户余额变动记录失败");
}

View File

@ -157,9 +157,9 @@ public class AppDeviceController extends BaseController {
public AjaxResult isBind(@RequestParam(required = false) @ApiParam("设备mac") String mac,
@RequestParam(required = false) @ApiParam("设备sn") String deviceNo) {
if (StringUtils.hasText(mac)) {
return success(smDeviceService.isBindByMac(mac));
return success(smDeviceService.bindCodeByMac(mac));
} else if (StringUtils.hasText(deviceNo)) {
return success(smDeviceService.isBindBySn(deviceNo));
return success(smDeviceService.bindCodeBySn(deviceNo));
} else {
return error("至少传入一个MAC号或SN码");
}

View File

@ -0,0 +1,107 @@
package com.ruoyi.web.controller.ss;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.ss.recordBalance.domain.RecordBalance;
import com.ruoyi.ss.recordBalance.domain.RecordBalanceVO;
import com.ruoyi.ss.recordBalance.domain.RecordBalanceQuery;
import com.ruoyi.ss.recordBalance.service.RecordBalanceService;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.common.core.page.TableDataInfo;
/**
* 余额变动记录Controller
*
* @author ruoyi
* @date 2024-07-22
*/
@RestController
@RequestMapping("/ss/recordBalance")
public class RecordBalanceController extends BaseController
{
@Autowired
private RecordBalanceService recordBalanceService;
/**
* 查询余额变动记录列表
*/
@PreAuthorize("@ss.hasPermi('ss:recordBalance:list')")
@GetMapping("/list")
public TableDataInfo list(RecordBalanceQuery query)
{
startPage();
startOrderBy();
List<RecordBalanceVO> list = recordBalanceService.selectRecordBalanceList(query);
return getDataTable(list);
}
/**
* 导出余额变动记录列表
*/
@PreAuthorize("@ss.hasPermi('ss:recordBalance:export')")
@Log(title = "余额变动记录", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(HttpServletResponse response, RecordBalanceQuery query)
{
List<RecordBalanceVO> list = recordBalanceService.selectRecordBalanceList(query);
ExcelUtil<RecordBalanceVO> util = new ExcelUtil<RecordBalanceVO>(RecordBalanceVO.class);
util.exportExcel(response, list, "余额变动记录数据");
}
/**
* 获取余额变动记录详细信息
*/
@PreAuthorize("@ss.hasPermi('ss:recordBalance:query')")
@GetMapping(value = "/{id}")
public AjaxResult getInfo(@PathVariable("id") Long id)
{
return success(recordBalanceService.selectRecordBalanceById(id));
}
/**
* 新增余额变动记录
*/
@PreAuthorize("@ss.hasPermi('ss:recordBalance:add')")
@Log(title = "余额变动记录", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@RequestBody RecordBalance recordBalance)
{
return toAjax(recordBalanceService.insertRecordBalance(recordBalance));
}
/**
* 修改余额变动记录
*/
@PreAuthorize("@ss.hasPermi('ss:recordBalance:edit')")
@Log(title = "余额变动记录", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@RequestBody RecordBalance recordBalance)
{
return toAjax(recordBalanceService.updateRecordBalance(recordBalance));
}
/**
* 删除余额变动记录
*/
@PreAuthorize("@ss.hasPermi('ss:recordBalance:remove')")
@Log(title = "余额变动记录", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public AjaxResult remove(@PathVariable Long[] ids)
{
return toAjax(recordBalanceService.deleteRecordBalanceByIds(ids));
}
}