1.消费流水明细/充值流水优化

2.消费流水导出没有数据 bug
3.异常扣费数据保存, 页面回显
4.扣费闸机在线扣费异常信息返回调整
5.二次扣费,自定义扣费 不去校验用户本餐是否就餐
This commit is contained in:
hejiayang
2025-12-06 15:08:30 +08:00
parent 832bae83d1
commit a7d9efebbf
11 changed files with 267 additions and 108 deletions
@@ -49,8 +49,11 @@ public class StConsumptionExceptionRecord implements Serializable {
private Integer secondChargeFlag; private Integer secondChargeFlag;
@Schema(title ="自定义扣费标记 1 是 ; 0 否") @Schema(title ="自定义扣费标记 1 是 ; 0 否")
private Integer isCustom; private Integer isCustom;
@Schema(title ="恢复标记 1 是; 0 否") @Schema(title ="恢复标记 1 是; 0 否; 3 不展示恢复标记")
private Integer isRestore; private Integer isRestore;
@Schema(title ="异常提示")
private String errorMsg;
/**创建日期*/ /**创建日期*/
@@ -48,4 +48,6 @@ public class StExceptionRecordVo {
@Schema(title ="部门名称") @Schema(title ="部门名称")
private String deptName; private String deptName;
private String errorMsg;
} }
@@ -55,4 +55,6 @@ public class StRfidVo {
* 恢复标记 1 是; 0 否 * 恢复标记 1 是; 0 否
*/ */
private Integer isRestore; private Integer isRestore;
private String errorMsg;
} }
@@ -306,8 +306,8 @@ public class StBbzxOrderInfoController {
} else { } else {
return Result.OK(); return Result.OK();
} }
query.setStatus(3);//(充值=102 query.setStatus(102);//(充值=102
return Result.OK(iStClientMemberTransactionRecordService.pageQuery(query)); return Result.OK(iStClientMemberTransactionRecordService.pageQueryNew(query));
} }
/** /**
@@ -37,7 +37,6 @@ import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
@@ -115,16 +114,11 @@ public class StClientMemberBalanceController {
clientMemberWrapper.eq(StClientMemberBalance::getMemberId, userId); clientMemberWrapper.eq(StClientMemberBalance::getMemberId, userId);
StClientMemberBalance balance = iStClientMemberBalanceService.getOne(clientMemberWrapper); StClientMemberBalance balance = iStClientMemberBalanceService.getOne(clientMemberWrapper);
// Map<String, Object> map = iStClientMemberLevelDemotionTimeService.topUpAwardService(null, value.floatValue(),canteenId);
BigDecimal rewardBalance = new BigDecimal(0); BigDecimal rewardBalance = new BigDecimal(0);
int integralBalance = 0; int integralBalance = 0;
StClientMemberTopUpDTO query = new StClientMemberTopUpDTO(); StClientMemberTopUpDTO query = new StClientMemberTopUpDTO();
query.setId(balance.getId()); query.setId(balance.getId());
query.setCanteenId(canteenId); query.setCanteenId(canteenId);
// if(null != map){
// rewardBalance = BigDecimal.valueOf(Float.parseFloat(map.get("amount").toString()));
// integralBalance = Integer.parseInt(map.get("integral").toString());
// }
query.setTopUpBalance(value); query.setTopUpBalance(value);
query.setRewardBalance(rewardBalance); query.setRewardBalance(rewardBalance);
query.setIntegralBalance(integralBalance); query.setIntegralBalance(integralBalance);
@@ -408,26 +402,8 @@ public class StClientMemberBalanceController {
if(null == transactionRecord || StringUtils.isBlank(transactionRecord.getId())){ if(null == transactionRecord || StringUtils.isBlank(transactionRecord.getId())){
return Result.error("订单未找到"); return Result.error("订单未找到");
} }
// List<Integer> onLine = Arrays.asList(MemberEnum.PAYMENT_METHOD_BY_ALI.getCode(),
// MemberEnum.PAYMENT_METHOD_BY_WX.getCode());
// if(!onLine.contains(transactionRecord.getPaymentMethod()) && onLine.contains(query.getPaymentMethod())){
// //原充值方式不是线上,但是撤销充值时是线上提示,不支持线上退款请选择其他退回
// return Result.error("原订单非线上充值,不支持原路退回,请选择其他方式");
// }
// if(onLine.contains(transactionRecord.getPaymentMethod())){//线上退款
// RefundDTO refundDTO = new RefundDTO();
// refundDTO.setPayOrderNo(query.getPayOrderNo());
// refundDTO.setTotalFee(query.getTotalFee());
// refundDTO.setPaymentMethod(query.getPaymentMethod());
// refundDTO.setRemark(query.getRemark());
// if(StringUtils.isBlank(query.getPayOrderNo())){
// return Result.error("商户订单号不能为空");
// }
// return stBbzxOrderInfoService.returnPayInfoTopUpOnline(refundDTO);
// } else {
//线下退款 //线下退款
return iStClientMemberBalanceService.backOutTopUpOffLine(query); return iStClientMemberBalanceService.backOutTopUpOffLine(query);
// }
} }
@@ -461,8 +437,9 @@ public class StClientMemberBalanceController {
LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
String canteenId = sysUser.getCanteenId(); String canteenId = sysUser.getCanteenId();
query.setCanteenId(canteenId); query.setCanteenId(canteenId);
query.setStatus(1);//消费=101 //消费=101
return Result.OK(iStClientMemberTransactionRecordService.pageQuery(query)); query.setStatus(101);
return Result.OK(iStClientMemberTransactionRecordService.pageQueryNew(query));
} }
/** /**
@@ -516,7 +493,7 @@ public class StClientMemberBalanceController {
query.setStartTime(query.getStartDate()); query.setStartTime(query.getStartDate());
} }
if(StringUtils.isNotBlank(query.getEndDate())){ if(StringUtils.isNotBlank(query.getEndDate())){
query.setStartTime(query.getEndDate()); query.setEndTime(query.getEndDate());
} }
LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
//餐品总库只查询内置食堂 //餐品总库只查询内置食堂
@@ -581,70 +558,6 @@ public class StClientMemberBalanceController {
} }
// /**
// * 企业付款到个人微信余额退款后台审核接口
// * @param orderNo
// * @return
// */
// @GetMapping("/btoc/refund/check")
// @Operation(summary= "用户退费-企业付款到个人微信余额退款后台审核接口")
// @SendNotification()
// public Result<?> btocRefund(@RequestParam String orderNo) {
// String auditorId = JwtUtil.getUserId();
// LambdaQueryWrapper<StClientMemberTransactionRecord> queryWrapper = new LambdaQueryWrapper<>();
// queryWrapper.eq(StClientMemberTransactionRecord::getOrderNo, orderNo);
// StClientMemberTransactionRecord one = iStClientMemberTransactionRecordService.getOne(queryWrapper);
// if(null == one){
// return Result.error("申请订单不存在");
// }
// if(one.getStatus().equals(MemberTransactionTypeEnum.B_TO_C_REFUND_301.getCode())){
// return Result.error("订单已经退款成功!");
// }
// TransfersDto transfersDto = new TransfersDto();
// transfersDto.setAmount(one.getTransactionAmount().multiply(BigDecimal.valueOf(100)).intValue());
// SysUser sysUser = feignSystemService.getById(one.getMemberId());
// if(null == sysUser){
// return Result.error("用户不存在");
// }
// if(StringUtils.isBlank(sysUser.getThirdId())){
// return Result.error("用户微信标识为空,请先绑定微信后再试");
// }
// transfersDto.setOpenid(sysUser.getThirdId());
// transfersDto.setCheck_name("FORCE_CHECK");
// transfersDto.setRe_user_name(sysUser.getRealname());
// transfersDto.setDesc("企业付款到个人微信余额退款");
// transfersDto.setPartner_trade_no(StMemberUtil.getOrderNoTransfer(orderNo));
// Result<Boolean> result = iPayInfo.btocRefund(transfersDto);
// one.setCreateBy(auditorId);//审核人ID
// one.setPayTime(new Date());//审核人时间
// one.setIsSync(0);
// iStClientMemberTransactionRecordService.updateById(one);
// if(null != result && result.getCode() == HttpServletResponse.SC_OK && result.getResult()){
// LambdaQueryWrapper<StClientMemberBalance> wrapper = new LambdaQueryWrapper<>();
// wrapper.eq(StClientMemberBalance::getMemberId, one.getMemberId());
// StClientMemberBalance swClientMemberBalance = iStClientMemberBalanceService.getBaseMapper().selectOne(wrapper);
// if (swClientMemberBalance != null) {
// swClientMemberBalance.setTopUpBalance(new BigDecimal(0));
// swClientMemberBalance.setRewardBalance(new BigDecimal(0));
// swClientMemberBalance.setIntegralBalance(0);
// swClientMemberBalance.setUpdateTime(new Date());
// swClientMemberBalance.setCreateBy(one.getCreateBy());
// swClientMemberBalance.setUpdateBy(one.getUpdateBy());
// swClientMemberBalance.setCanteenId(one.getCanteenId());
// swClientMemberBalance.setIsSync(0);
// boolean flag = iStClientMemberBalanceService.saveOrUpdate(swClientMemberBalance);
// if(flag){
// one.setStatus(MemberTransactionTypeEnum.B_TO_C_REFUND_301.getCode());
// one.setIsSync(0);
// iStClientMemberTransactionRecordService.updateById(one);
// }
// }
// return Result.OK("退款成功");
// } else {
// return Result.error("退款失败");
// }
//
// }
//===================================================================================== //=====================================================================================
@@ -679,12 +592,6 @@ public class StClientMemberBalanceController {
} }
// @PostMapping("/updateFeign")
// @Operation(summary = "会员余额更新feign")
// public void memberBalanceUpdateFeign(@RequestBody StClientMemberSpendDTO balance) throws Exception {
// balance.setInvoice(false);
//// iStClientMemberBalanceService.memberSpend(balance); 迁移至client服务更新余额
// }
@PostMapping("/returnSpendFeign") @PostMapping("/returnSpendFeign")
@Operation(summary="会员余额退款") @Operation(summary="会员余额退款")
@@ -1,6 +1,7 @@
package org.jeecg.payment.mapper; package org.jeecg.payment.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
import org.jeecg.payment.dto.StClientMemberTransactionRecordDTO; import org.jeecg.payment.dto.StClientMemberTransactionRecordDTO;
@@ -22,6 +23,9 @@ public interface StClientMemberTransactionRecordMapper extends BaseMapper<StClie
*/ */
List<StClientMemberTransactionRecordVO> pageList(Page<StClientMemberTransactionRecordVO> page, @Param("vo") StClientMemberTransactionRecordDTO query); List<StClientMemberTransactionRecordVO> pageList(Page<StClientMemberTransactionRecordVO> page, @Param("vo") StClientMemberTransactionRecordDTO query);
long pageListCount(@Param("vo") StClientMemberTransactionRecordDTO query);
IPage<StClientMemberTransactionRecordVO> pageList2(Page<StClientMemberTransactionRecordVO> page, @Param("vo") StClientMemberTransactionRecordDTO query);
/** /**
* 列表查询 * 列表查询
* @return * @return
@@ -132,6 +132,129 @@
order by a.create_time desc order by a.create_time desc
</select> </select>
<select id="pageListCount" resultType="java.lang.Long">
SELECT
count(a.id)
FROM
st_client_member_transaction_record as a
<if test="vo.dinnerType != null and vo.dinnerType != ''">
LEFT JOIN st_bbzx_order_info sboi ON a.order_no = sboi.order_no
</if>
LEFT JOIN sys_user_sub AS c ON a.member_id = c.id
WHERE a.is_del = 0
<if test="vo.startTime != null and vo.endTime !=''">
<choose>
<when test="vo.payTimeStatus == 1">
and DATE_FORMAT(a.pay_time,'%Y-%m-%d') &gt;= DATE_FORMAT(#{vo.startTime},'%Y-%m-%d')
and DATE_FORMAT(a.pay_time,'%Y-%m-%d') &lt;= DATE_FORMAT(#{vo.endTime},'%Y-%m-%d')
</when>
<when test="vo.payTimeStatus == 2">
and DATE_FORMAT(a.create_time,'%Y-%m-%d') &gt;= DATE_FORMAT(#{vo.startTime},'%Y-%m-%d')
and DATE_FORMAT(a.create_time,'%Y-%m-%d') &lt;= DATE_FORMAT(#{vo.endTime},'%Y-%m-%d')
</when>
</choose>
</if>
<if test="vo.status != null ">
and a.STATUS = #{vo.status}
</if>
<if test="vo.list != null">
and c.depart_ids in
<foreach item="departId" collection="vo.list" open="(" separator="," close=")">
#{departId}
</foreach>
</if>
<if test="vo.phone != null and vo.phone != ''">
and c.phone like CONCAT('%',#{vo.phone,jdbcType=VARCHAR},'%')
</if>
<if test="vo.paymentMethod != null and vo.paymentMethod != ''">
and a.payment_method = #{vo.paymentMethod}
</if>
<if test="vo.workNo != null and vo.workNo != ''">
and c.work_no like CONCAT('%',#{vo.workNo,jdbcType=VARCHAR},'%')
</if>
<if test="vo.userName != null and vo.userName != ''">
and c.realname like CONCAT('%',#{vo.userName,jdbcType=VARCHAR},'%')
</if>
<if test="vo.canteenId != null and vo.canteenId != ''">
and a.canteen_id = #{vo.canteenId}
</if>
<if test="vo.dinnerType != null and vo.dinnerType != ''">
and sboi.dinner_type = #{vo.dinnerType}
</if>
</select>
<select id="pageList2" resultType="org.jeecg.payment.vo.StClientMemberTransactionRecordVO">
SELECT
a.id,
a.serial_no as serialNo,
a.order_no as orderNo,
c.realname as userName,
c.phone,
c.work_no as workNo,
a.status,
a.transaction_amount as transactionAmount,
a.payment_method as paymentMethod,
a.available_balance as availableBalance,
a.reward_balance as rewardBalance,
a.stored_balance as storedBalance,
a.integral_balance as integralBalance,
a.create_time as createTime,
a.pay_time as payTime,
a.update_status as updateStatus
FROM
st_client_member_transaction_record as a
<if test="vo.dinnerType != null and vo.dinnerType != ''">
LEFT JOIN st_bbzx_order_info sboi ON a.order_no = sboi.order_no
</if>
LEFT JOIN sys_user_sub AS c ON a.member_id = c.id
WHERE a.is_del = 0
<if test="vo.startTime != null and vo.endTime !=''">
<choose>
<when test="vo.payTimeStatus == 1">
and a.pay_time between #{vo.startTime} and #{vo.endTime}
</when>
<when test="vo.payTimeStatus == 2">
and a.create_time between #{vo.startTime} and #{vo.endTime}
</when>
</choose>
</if>
<if test="vo.status != null ">
and a.STATUS = #{vo.status}
</if>
<if test="vo.list != null">
and c.depart_ids in
<foreach item="departId" collection="vo.list" open="(" separator="," close=")">
#{departId}
</foreach>
</if>
<if test="vo.phone != null and vo.phone != ''">
and c.phone like CONCAT('%',#{vo.phone,jdbcType=VARCHAR},'%')
</if>
<if test="vo.paymentMethod != null and vo.paymentMethod != ''">
and a.payment_method = #{vo.paymentMethod}
</if>
<if test="vo.workNo != null and vo.workNo != ''">
and c.work_no like CONCAT('%',#{vo.workNo,jdbcType=VARCHAR},'%')
</if>
<if test="vo.userName != null and vo.userName != ''">
and c.realname like CONCAT('%',#{vo.userName,jdbcType=VARCHAR},'%')
</if>
<if test="vo.canteenId != null and vo.canteenId != ''">
and a.canteen_id = #{vo.canteenId}
</if>
<if test="vo.dinnerType != null and vo.dinnerType != ''">
and sboi.dinner_type = #{vo.dinnerType}
</if>
order by a.create_time desc
</select>
<select id="pageBalanceRefundList" resultType="org.jeecg.payment.vo.StClientMemberTransactionRecordVO"> <select id="pageBalanceRefundList" resultType="org.jeecg.payment.vo.StClientMemberTransactionRecordVO">
SELECT SELECT
a.id, a.id,
@@ -164,12 +287,10 @@
<if test="vo.startTime != null and vo.endTime !=''"> <if test="vo.startTime != null and vo.endTime !=''">
<choose> <choose>
<when test="vo.payTimeStatus == 1"> <when test="vo.payTimeStatus == 1">
and DATE_FORMAT(a.pay_time,'%Y-%m-%d') &gt;= DATE_FORMAT(#{vo.startTime},'%Y-%m-%d') and a.pay_time between #{vo.startTime} and #{vo.endTime}
and DATE_FORMAT(a.pay_time,'%Y-%m-%d') &lt;= DATE_FORMAT(#{vo.endTime},'%Y-%m-%d')
</when> </when>
<when test="vo.payTimeStatus == 2"> <when test="vo.payTimeStatus == 2">
and DATE_FORMAT(a.create_time,'%Y-%m-%d') &gt;= DATE_FORMAT(#{vo.startTime},'%Y-%m-%d') and a.create_time between #{vo.startTime} and #{vo.endTime}
and DATE_FORMAT(a.create_time,'%Y-%m-%d') &lt;= DATE_FORMAT(#{vo.endTime},'%Y-%m-%d')
</when> </when>
</choose> </choose>
</if> </if>
@@ -13,6 +13,7 @@
a.create_time, a.create_time,
a.update_time, a.update_time,
a.pay_time, a.pay_time,
a.error_msg,
u.realname as userName, u.realname as userName,
CONCAT( CONCAT(
IFNULL(parent_depart.depart_name, ''), IFNULL(parent_depart.depart_name, ''),
@@ -24,6 +24,8 @@ public interface IStClientMemberTransactionRecordService extends JeecgService<St
*/ */
IPage<StClientMemberTransactionRecordVO> pageQuery(StClientMemberTransactionRecordDTO query); IPage<StClientMemberTransactionRecordVO> pageQuery(StClientMemberTransactionRecordDTO query);
IPage<StClientMemberTransactionRecordVO> pageQueryNew(StClientMemberTransactionRecordDTO query);
/** /**
* 列表查询导出 * 列表查询导出
* *
@@ -359,6 +359,12 @@ public class StClientMemberLevelDeductRuleServiceImpl extends JeecgServiceImpl<S
List<StConsumptionExceptionRecord> unselectedEntities = unselectedData.stream() List<StConsumptionExceptionRecord> unselectedEntities = unselectedData.stream()
.map(vo -> { .map(vo -> {
StConsumptionExceptionRecord entity = new StConsumptionExceptionRecord(); StConsumptionExceptionRecord entity = new StConsumptionExceptionRecord();
if(vo.getIsRestore()!= null){
entity.setIsRestore(vo.getIsRestore());
}
if(StringUtils.isNotBlank(vo.getErrorMsg())){
entity.setErrorMsg(vo.getErrorMsg());
}
entity.setUserId(vo.getUserId()); entity.setUserId(vo.getUserId());
entity.setDeviceCode(vo.getDeviceCode()); entity.setDeviceCode(vo.getDeviceCode());
entity.setCanteenId(vo.getRestId()); entity.setCanteenId(vo.getRestId());
@@ -482,7 +488,8 @@ public class StClientMemberLevelDeductRuleServiceImpl extends JeecgServiceImpl<S
StMiniMineBalanceVo stMiniMineBalanceVoOnline = new StMiniMineBalanceVo(); StMiniMineBalanceVo stMiniMineBalanceVoOnline = new StMiniMineBalanceVo();
List<StRfidVo> unselectedData = new ArrayList<>(); List<StRfidVo> unselectedData = new ArrayList<>();
List<StRfidVo> unselectedDataException = new ArrayList<>();
StRfidVo err = new StRfidVo();
for (Map.Entry<String, List<StRfidVo>> entry : stringListMap.entrySet()) { for (Map.Entry<String, List<StRfidVo>> entry : stringListMap.entrySet()) {
List<StRfidVo> voList = entry.getValue(); List<StRfidVo> voList = entry.getValue();
//数据排序: 防止 离线数据 一次正常扣费, 多次二次扣费, 导致数据添加有问题 //数据排序: 防止 离线数据 一次正常扣费, 多次二次扣费, 导致数据添加有问题
@@ -494,8 +501,9 @@ public class StClientMemberLevelDeductRuleServiceImpl extends JeecgServiceImpl<S
); );
for (StRfidVo stRfidVo : voList) { // 改用普通for循环,方便控制流程 for (StRfidVo stRfidVo : voList) { // 改用普通for循环,方便控制流程
//判断用户本餐是否已经有数据 //判断用户本餐是否已经有数据
//二次扣费,自定义扣费, 不去判断用户是否有数据
System.out.println("二次扣费标记" + stRfidVo.getSecondChargeFlag()); System.out.println("二次扣费标记" + stRfidVo.getSecondChargeFlag());
if(stRfidVo.getSecondChargeFlag() == null || stRfidVo.getSecondChargeFlag() == 0){ if((stRfidVo.getSecondChargeFlag() == null || stRfidVo.getSecondChargeFlag() == 0) && (stRfidVo.getIsCustom() == null || stRfidVo.getIsCustom() == 0)){
long count = iStBbzxOrderInfoService.count(new LambdaQueryWrapper<StBbzxOrderInfo>() long count = iStBbzxOrderInfoService.count(new LambdaQueryWrapper<StBbzxOrderInfo>()
.eq(StBbzxOrderInfo::getMemberId, stRfidVo.getUserId()) .eq(StBbzxOrderInfo::getMemberId, stRfidVo.getUserId())
.eq(StBbzxOrderInfo::getDinnerType, entry.getKey()) .eq(StBbzxOrderInfo::getDinnerType, entry.getKey())
@@ -506,7 +514,7 @@ public class StClientMemberLevelDeductRuleServiceImpl extends JeecgServiceImpl<S
if(count > 0){ if(count > 0){
if(stRfidVo.getIsRestore() == null){ if(stRfidVo.getIsRestore() == null){
unselectedData.add(stRfidVo); unselectedData.add(stRfidVo);
errorMessages = "用户本餐已扣费"; errorMessages = "本餐已扣费";
System.out.println("用户本餐已扣费"); System.out.println("用户本餐已扣费");
continue; continue;
} }
@@ -531,6 +539,9 @@ public class StClientMemberLevelDeductRuleServiceImpl extends JeecgServiceImpl<S
", 已存在的订单编号=" + stBbzxOrderInfo.getOrderNo(); ", 已存在的订单编号=" + stBbzxOrderInfo.getOrderNo();
log.error(errorMsg); log.error(errorMsg);
errorMessages = "重复支付"; // 添加错误信息 errorMessages = "重复支付"; // 添加错误信息
stRfidVo.setIsRestore(3);
stRfidVo.setErrorMsg(errorMessages);
unselectedDataException.add(stRfidVo);
continue; // 跳过当前循环,处理下一个 continue; // 跳过当前循环,处理下一个
} }
} }
@@ -562,6 +573,9 @@ public class StClientMemberLevelDeductRuleServiceImpl extends JeecgServiceImpl<S
stRfidVo.getUserId(), null, null, 1, levelDeductRuleVo, stRfidVo.getUserId(), null, null, 1, levelDeductRuleVo,
errorMsg, stRfidVo)); errorMsg, stRfidVo));
} }
stRfidVo.setIsRestore(3);
stRfidVo.setErrorMsg(errorMessages);
unselectedDataException.add(stRfidVo);
continue; continue;
} }
@@ -575,6 +589,9 @@ public class StClientMemberLevelDeductRuleServiceImpl extends JeecgServiceImpl<S
String errorMsg = "计算预算扣费金额失败, userId=" + stRfidVo.getUserId() + ", 餐次=" + timesName; String errorMsg = "计算预算扣费金额失败, userId=" + stRfidVo.getUserId() + ", 餐次=" + timesName;
log.error(errorMsg, e); log.error(errorMsg, e);
errorMessages = "计算预算扣费金额失败"; errorMessages = "计算预算扣费金额失败";
stRfidVo.setIsRestore(3);
stRfidVo.setErrorMsg(errorMessages);
unselectedDataException.add(stRfidVo);
continue; continue;
} }
} }
@@ -596,6 +613,9 @@ public class StClientMemberLevelDeductRuleServiceImpl extends JeecgServiceImpl<S
stRfidVo.getUserId(), null, null, deductionType, stRfidVo.getUserId(), null, null, deductionType,
levelDeductRuleVo, errorMsg, stRfidVo)); levelDeductRuleVo, errorMsg, stRfidVo));
} }
stRfidVo.setIsRestore(3);
stRfidVo.setErrorMsg(errorMessages);
unselectedDataException.add(stRfidVo);
continue; continue;
} }
stMiniMineBalanceVo = userBalanceResult.getResult(); stMiniMineBalanceVo = userBalanceResult.getResult();
@@ -611,6 +631,9 @@ public class StClientMemberLevelDeductRuleServiceImpl extends JeecgServiceImpl<S
stRfidVo.getUserId(), null, null, deductionType, stRfidVo.getUserId(), null, null, deductionType,
levelDeductRuleVo, errorMsg, stRfidVo)); levelDeductRuleVo, errorMsg, stRfidVo));
} }
stRfidVo.setIsRestore(3);
stRfidVo.setErrorMsg(errorMessages);
unselectedDataException.add(stRfidVo);
continue; continue;
} }
@@ -626,6 +649,9 @@ public class StClientMemberLevelDeductRuleServiceImpl extends JeecgServiceImpl<S
stRfidVo.getUserId(), null, null, deductionType, levelDeductRuleVo, stRfidVo.getUserId(), null, null, deductionType, levelDeductRuleVo,
errorMsg, stRfidVo)); errorMsg, stRfidVo));
} }
stRfidVo.setIsRestore(3);
stRfidVo.setErrorMsg(errorMessages);
unselectedDataException.add(stRfidVo);
continue; continue;
} }
@@ -638,6 +664,9 @@ public class StClientMemberLevelDeductRuleServiceImpl extends JeecgServiceImpl<S
stRfidVo.getUserId(), null, null, deductionType, levelDeductRuleVo, stRfidVo.getUserId(), null, null, deductionType, levelDeductRuleVo,
finalErrorMessages +",卡号:"+ finalStMiniMineBalanceVo.getCardCode(), stRfidVo)); finalErrorMessages +",卡号:"+ finalStMiniMineBalanceVo.getCardCode(), stRfidVo));
} }
stRfidVo.setIsRestore(3);
stRfidVo.setErrorMsg(errorMessages);
unselectedDataException.add(stRfidVo);
continue; continue;
} }
@@ -650,10 +679,16 @@ public class StClientMemberLevelDeductRuleServiceImpl extends JeecgServiceImpl<S
if(online){ if(online){
if(stMiniMineBalanceVo.getUserStatus() != 1){ if(stMiniMineBalanceVo.getUserStatus() != 1){
errorMessages = "主用户已停用"; errorMessages = "主用户已停用";
stRfidVo.setIsRestore(3);
stRfidVo.setErrorMsg(errorMessages);
unselectedDataException.add(stRfidVo);
continue; continue;
} }
if(stMiniMineBalanceVo.getStatus()!= 1){ if(stMiniMineBalanceVo.getStatus()!= 1){
errorMessages = "当前用户已停用"; errorMessages = "当前用户已停用";
stRfidVo.setIsRestore(3);
stRfidVo.setErrorMsg(errorMessages);
unselectedDataException.add(stRfidVo);
continue; continue;
} }
} }
@@ -676,6 +711,9 @@ public class StClientMemberLevelDeductRuleServiceImpl extends JeecgServiceImpl<S
String errorMsg = "自定义金额扣费操作失败, userId=" + userId + ", 错误信息: " + data; String errorMsg = "自定义金额扣费操作失败, userId=" + userId + ", 错误信息: " + data;
log.error(errorMsg); log.error(errorMsg);
errorMessages = "自定义金额扣费操作失败: " + data; errorMessages = "自定义金额扣费操作失败: " + data;
stRfidVo.setIsRestore(3);
stRfidVo.setErrorMsg(errorMessages);
unselectedDataException.add(stRfidVo);
continue; continue;
} }
} else { } else {
@@ -692,6 +730,9 @@ public class StClientMemberLevelDeductRuleServiceImpl extends JeecgServiceImpl<S
String errorMsg = "规则模式扣费操作失败, userId=" + userId + ", 错误信息: " + data; String errorMsg = "规则模式扣费操作失败, userId=" + userId + ", 错误信息: " + data;
log.error(errorMsg); log.error(errorMsg);
errorMessages = "规则模式扣费操作失败:" + data; errorMessages = "规则模式扣费操作失败:" + data;
stRfidVo.setIsRestore(3);
stRfidVo.setErrorMsg(errorMessages);
unselectedDataException.add(stRfidVo);
continue; continue;
} }
} }
@@ -699,6 +740,9 @@ public class StClientMemberLevelDeductRuleServiceImpl extends JeecgServiceImpl<S
String errorMsg = "扣费处理过程中发生异常, userId=" + userId + ", 异常信息: " + e.getMessage(); String errorMsg = "扣费处理过程中发生异常, userId=" + userId + ", 异常信息: " + e.getMessage();
log.error(errorMsg, e); log.error(errorMsg, e);
errorMessages = "扣费处理过程中发生异常: " + e.getMessage(); errorMessages = "扣费处理过程中发生异常: " + e.getMessage();
stRfidVo.setIsRestore(3);
stRfidVo.setErrorMsg(errorMessages);
unselectedDataException.add(stRfidVo);
continue; continue;
} }
@@ -711,10 +755,15 @@ public class StClientMemberLevelDeductRuleServiceImpl extends JeecgServiceImpl<S
} }
} }
} }
//保存异常消费数据 //保存异常消费数据
if(CollectionUtils.isNotEmpty(unselectedData)){ if(CollectionUtils.isNotEmpty(unselectedData)){
saveExceptionRecord(unselectedData); saveExceptionRecord(unselectedData);
} }
//余: 出异常的数据都存在 异常消费表中, 给特殊标记 不让恢复,展示异常原因
if(CollectionUtils.isNotEmpty(unselectedDataException)){
saveExceptionRecord(unselectedDataException);
}
if(online){//在线 if(online){//在线
// 根据错误信息返回不同结果 // 根据错误信息返回不同结果
@@ -732,7 +781,11 @@ public class StClientMemberLevelDeductRuleServiceImpl extends JeecgServiceImpl<S
return Result.OK("扣费成功",stClientMemberSpendVO); return Result.OK("扣费成功",stClientMemberSpendVO);
} else { } else {
log.info("在线扣费耗时,error{}",System.currentTimeMillis() - start); log.info("在线扣费耗时,error{}",System.currentTimeMillis() - start);
return Result.error(errorMessages); if("本餐已扣费".equals(errorMessages)){
return Result.error(errorMessages);
}else {
return Result.error("扣费异常,请联系管理员");
}
} }
} }
return Result.OK("扣费成功"); return Result.OK("扣费成功");
@@ -1,15 +1,20 @@
package org.jeecg.payment.service.impl; package org.jeecg.payment.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.jeecg.common.system.base.service.impl.JeecgServiceImpl; import org.jeecg.common.system.base.service.impl.JeecgServiceImpl;
import org.jeecg.payment.dto.StClientMemberTransactionRecordDTO; import org.jeecg.payment.dto.StClientMemberTransactionRecordDTO;
import org.jeecg.payment.entity.StBbzxOrderInfo;
import org.jeecg.payment.entity.StClientMemberBalance;
import org.jeecg.payment.entity.StClientMemberTransactionRecord; import org.jeecg.payment.entity.StClientMemberTransactionRecord;
import org.jeecg.payment.enums.MemberEnum; import org.jeecg.payment.enums.MemberEnum;
import org.jeecg.payment.enums.MemberTransactionTypeEnum; import org.jeecg.payment.enums.MemberTransactionTypeEnum;
import org.jeecg.payment.mapper.StClientMemberTransactionRecordMapper; import org.jeecg.payment.mapper.StClientMemberTransactionRecordMapper;
import org.jeecg.payment.service.IStBbzxOrderInfoService;
import org.jeecg.payment.service.IStClientMemberBalanceService;
import org.jeecg.payment.service.IStClientMemberTransactionRecordService; import org.jeecg.payment.service.IStClientMemberTransactionRecordService;
import org.jeecg.payment.vo.InOutRecordInfoVo; import org.jeecg.payment.vo.InOutRecordInfoVo;
import org.jeecg.payment.vo.StClientMemberTransactionRecordVO; import org.jeecg.payment.vo.StClientMemberTransactionRecordVO;
@@ -17,7 +22,13 @@ import org.jeecg.system.service.ISysPayDepartService;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors;
/** /**
* 交易记录 * 交易记录
@@ -28,6 +39,10 @@ public class StClientMemberTransactionRecordServiceImpl extends JeecgServiceImpl
@Resource @Resource
private ISysPayDepartService iSysPayDepartService; private ISysPayDepartService iSysPayDepartService;
@Resource
private IStClientMemberBalanceService iStClientMemberBalanceService;
@Resource
private IStBbzxOrderInfoService iStBbzxOrderInfoService;
@Override @Override
public IPage<StClientMemberTransactionRecordVO> pageQuery(StClientMemberTransactionRecordDTO query) { public IPage<StClientMemberTransactionRecordVO> pageQuery(StClientMemberTransactionRecordDTO query) {
@@ -55,6 +70,55 @@ public class StClientMemberTransactionRecordServiceImpl extends JeecgServiceImpl
return page.setRecords(pageList); return page.setRecords(pageList);
} }
@Override
public IPage<StClientMemberTransactionRecordVO> pageQueryNew(StClientMemberTransactionRecordDTO query) {
Page<StClientMemberTransactionRecordVO> page = new Page<>(query.getPageNo(), query.getPageSize());
page.setSearchCount(false);
//计算总数
long l = baseMapper.pageListCount(query);
page.setTotal(l);
page.setRecords(new ArrayList<>());
if(l > 0){
IPage<StClientMemberTransactionRecordVO> pageList = baseMapper.pageList2(page, query);
if(CollectionUtils.isNotEmpty(pageList.getRecords())){
Set<String> orderNoSet = pageList.getRecords().stream().map(StClientMemberTransactionRecordVO::getOrderNo).collect(Collectors.toSet());
Set<String> memberIdSet = pageList.getRecords().stream().map(StClientMemberTransactionRecordVO::getId).collect(Collectors.toSet());
Map<String, StBbzxOrderInfo> orderInfoMap = iStBbzxOrderInfoService.list(new LambdaQueryWrapper<StBbzxOrderInfo>().eq(StBbzxOrderInfo::getIsDel, 0).in(StBbzxOrderInfo::getOrderNo, orderNoSet))
.stream().collect(Collectors.toMap(StBbzxOrderInfo::getOrderNo,
Function.identity(),
(existing, replacement) -> existing));
Map<String, BigDecimal> balanceMap = iStClientMemberBalanceService.list(new LambdaQueryWrapper<StClientMemberBalance>().eq(StClientMemberBalance::getIsDel, 0).in(StClientMemberBalance::getMemberId, memberIdSet))
.stream().collect(Collectors.toMap(StClientMemberBalance::getMemberId,
StClientMemberBalance::getConsumptionTotal,
(existing, replacement) -> existing));
for (StClientMemberTransactionRecordVO record : pageList.getRecords()) {
StBbzxOrderInfo stBbzxOrderInfo = orderInfoMap.get(record.getOrderNo());
if(stBbzxOrderInfo != null){
record.setCardCode(stBbzxOrderInfo.getSerialNo());
record.setBusinessModel(stBbzxOrderInfo.getBusinessModel());
record.setDinnerType(stBbzxOrderInfo.getDinnerType());
record.setMonetary(balanceMap.get(record.getId()));
}
record.setStatusName(MemberTransactionTypeEnum.getName(record.getStatus()));
record.setPaymentMethodName(MemberEnum.getXcxName(record.getPaymentMethod()));
record.setUpdateStatusName(null != record.getUpdateStatus() && 1 == record.getUpdateStatus() ? "前端":"后台");
if(null != record.getBusinessModel()&& 1 == record.getBusinessModel() ){
record.setBusinessModelName("定值模式");//扣费类型(1:固定扣费,2:固定+补贴扣费,3:按量扣费,4:自定义金额)
}
if(null != record.getBusinessModel()&& 4 == record.getBusinessModel() ){
record.setBusinessModelName("金额模式");//扣费类型(1:固定扣费,2:固定+补贴扣费,3:按量扣费,4:自定义金额)
}
}
}
return pageList;
}
return page;
}
@Override @Override
public List<StClientMemberTransactionRecordVO> queryList(StClientMemberTransactionRecordDTO query) { public List<StClientMemberTransactionRecordVO> queryList(StClientMemberTransactionRecordDTO query) {
List<StClientMemberTransactionRecordVO> pageList = baseMapper.pageList(query); List<StClientMemberTransactionRecordVO> pageList = baseMapper.pageList(query);