|
@@ -1,5 +1,5 @@
|
|
|
package com.rongwei.zhsw.system.service.impl;
|
|
|
-
|
|
|
+
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
@@ -49,21 +49,37 @@ public class SwRefundRequestRecordServiceImpl extends ServiceImpl<SwRefundReques
|
|
|
|
|
|
@Override
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
- public R refundApplication(String id) {
|
|
|
+ public R refundApplication(String id) throws Exception {
|
|
|
|
|
|
//当前用户
|
|
|
SysUserVo currentUser = ZHSWCommonUtils.getCurrentUser();
|
|
|
|
|
|
- //1.获取退款记录
|
|
|
+ //获取退款记录
|
|
|
SwRefundRequestRecordDO refundRequestRecordDO = swRefundRequestRecordService.getById(id);
|
|
|
|
|
|
- // 缴费记录表更新:
|
|
|
+ //用户表获取
|
|
|
+ SwUserManagementDo user = swUserManagementService.getBaseMapper().
|
|
|
+ selectOne(new LambdaQueryWrapper<SwUserManagementDo>().eq(SwUserManagementDo::getUsernumber, refundRequestRecordDO.getUsernumber()));
|
|
|
+
|
|
|
+ //校验 退款金额
|
|
|
+ validateRefundAmount(refundRequestRecordDO,user);
|
|
|
+
|
|
|
+ // 1.缴费记录表更新:
|
|
|
updateBillRecord(refundRequestRecordDO,currentUser);
|
|
|
|
|
|
- BigDecimal balanceAdd =BigDecimal.ZERO;
|
|
|
+ //2. 更新退款记录
|
|
|
+ processRefund(refundRequestRecordDO, currentUser);
|
|
|
|
|
|
- //全额 退款
|
|
|
- if (refundRequestRecordDO.getRefundmethod().equals(REFUNDMETHODALL)){
|
|
|
+ // 已缴账单记录表更新
|
|
|
+ migratePaidBillsToUnpaid(refundRequestRecordDO);
|
|
|
+
|
|
|
+ // 更新用户余额
|
|
|
+ updateUserBalance(refundRequestRecordDO,user);
|
|
|
+
|
|
|
+ return R.ok();
|
|
|
+ }
|
|
|
+
|
|
|
+ private void processRefund(SwRefundRequestRecordDO refundRequestRecordDO, SysUserVo currentUser) {
|
|
|
// 退款记录表更新 实退金额 退款操作人,操作时间
|
|
|
swRefundRequestRecordService.update(new LambdaUpdateWrapper<SwRefundRequestRecordDO>()
|
|
|
.eq(SwRefundRequestRecordDO::getId, refundRequestRecordDO.getId())
|
|
@@ -73,58 +89,79 @@ public class SwRefundRequestRecordServiceImpl extends ServiceImpl<SwRefundReques
|
|
|
.set(SwRefundRequestRecordDO::getRefundoperatorname, currentUser.getName())
|
|
|
.set(SwRefundRequestRecordDO::getRefundtime,new Date())
|
|
|
);
|
|
|
+ }
|
|
|
|
|
|
- //预收账单记录表更新: 已缴账单记录表更新
|
|
|
- updateOrSaveBills(refundRequestRecordDO.getPaymentrecordid());
|
|
|
-
|
|
|
- //用户表更新:系统需要 将 对应用户信息中的【余额】进行更新,余额 = 当前用户余额 + 【余额抵扣 balancededuction
|
|
|
- balanceAdd = refundRequestRecordDO.getBalancededuction();
|
|
|
-
|
|
|
-
|
|
|
- } else if (refundRequestRecordDO.getRefundmethod().equals(REFUNDMETHODBALANCE)) {
|
|
|
- // 差额退款
|
|
|
+ /**
|
|
|
+ * 更新用户表月
|
|
|
+ * @param refundRequestRecordDO
|
|
|
+ * @param user
|
|
|
+ */
|
|
|
+ private void updateUserBalance(SwRefundRequestRecordDO refundRequestRecordDO, SwUserManagementDo user) {
|
|
|
+ BigDecimal balanceChange = calculateBalanceChange(refundRequestRecordDO);
|
|
|
+ swUserManagementService.balanceAdd(user.getId(), balanceChange);
|
|
|
+ }
|
|
|
|
|
|
- // 用户表更新:系统需要 将 对应用户信息中的【余额】进行更新,余额 = 当前用户余额 - 【退款金额】
|
|
|
- balanceAdd = BigDecimal.ZERO.subtract(refundRequestRecordDO.getRefundamount());
|
|
|
+ /**
|
|
|
+ * 全额 用户表更新:系统需要 将 对应用户信息中的【余额】进行更新,余额 = 当前用户余额 + 【余额抵扣 balancededuction
|
|
|
+ * 差额 系统需要 将 对应用户信息中的【余额】进行更新,余额 = 当前用户余额 - 【退款金额】
|
|
|
+ * negate 数值取反
|
|
|
+ * @param refundRequest
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private BigDecimal calculateBalanceChange(SwRefundRequestRecordDO refundRequest) {
|
|
|
+ if (REFUNDMETHODALL.equals(refundRequest.getRefundmethod())) {
|
|
|
+ return refundRequest.getBalancededuction();
|
|
|
}
|
|
|
+ return refundRequest.getRefundamount().negate();
|
|
|
+ }
|
|
|
|
|
|
- //用户表更新
|
|
|
- SwUserManagementDo swUserManagement = swUserManagementService.getBaseMapper().
|
|
|
- selectOne(new LambdaQueryWrapper<SwUserManagementDo>().eq(SwUserManagementDo::getUsernumber, refundRequestRecordDO.getUsernumber()));
|
|
|
- swUserManagementService.balanceAdd(swUserManagement.getId(), balanceAdd);
|
|
|
-
|
|
|
-
|
|
|
- return R.ok();
|
|
|
+ /**
|
|
|
+ * 校验 退款金额 差额退款时候 退款金额不能大于用户余额
|
|
|
+ * @param refundRequestRecordDO
|
|
|
+ * @param user
|
|
|
+ */
|
|
|
+ private void validateRefundAmount(SwRefundRequestRecordDO refundRequestRecordDO, SwUserManagementDo user) {
|
|
|
+ if (REFUNDMETHODBALANCE.equals(refundRequestRecordDO.getRefundmethod())) {
|
|
|
+ if (refundRequestRecordDO.getRefundamount().compareTo(user.getAccountbalance()) > 0) {
|
|
|
+ throw new IllegalArgumentException("本次退款月不足,无法退款");
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 预收账单记录表更新:系统需要 将 对应的 缴费记录对应账单 信息 复制一份到 预收账单记录表中,并且 缴费状态标记状态为“待缴费”
|
|
|
* 已缴账单记录表更新:系统需要 将 对应的 缴费记录对应账单 标记为删除
|
|
|
- * @param paymentrecordid
|
|
|
+ * @param
|
|
|
*/
|
|
|
- private void updateOrSaveBills(String paymentrecordid) {
|
|
|
- List<SwBillManagementUnpaidDo> unpaidDoList =new ArrayList<>();
|
|
|
- List<String> paidIds =new ArrayList<>();
|
|
|
- List<SwBillManagementPaidDo> list = swBillManagementPaidService.list(new LambdaQueryWrapper<SwBillManagementPaidDo>()
|
|
|
- .eq(SwBillManagementPaidDo::getPaymentrecordid,paymentrecordid)
|
|
|
- .eq(SwBillManagementPaidDo::getDeleted,"0")
|
|
|
- );
|
|
|
- if (!list.isEmpty()){
|
|
|
- for (SwBillManagementPaidDo paidDo : list){
|
|
|
- // 已缴账单记录
|
|
|
- paidIds.add(paidDo.getId());
|
|
|
- //预收账单记录
|
|
|
- SwBillManagementUnpaidDo unpaidDo = new SwBillManagementUnpaidDo();
|
|
|
- BeanUtils.copyProperties(paidDo,unpaidDo);
|
|
|
- unpaidDo.setId(SecurityUtil.getUUID());
|
|
|
- unpaidDo.setStatus(PENDINGSTATUS);
|
|
|
- unpaidDoList.add(unpaidDo);
|
|
|
+ private void migratePaidBillsToUnpaid(SwRefundRequestRecordDO swRefundRequestRecordDO) {
|
|
|
+ if (swRefundRequestRecordDO.getRefundmethod().equals(REFUNDMETHODALL)){
|
|
|
+
|
|
|
+ List<SwBillManagementPaidDo> paidBills = swBillManagementPaidService.list(new LambdaQueryWrapper<SwBillManagementPaidDo>()
|
|
|
+ .eq(SwBillManagementPaidDo::getPaymentrecordid,swRefundRequestRecordDO.getPaymentrecordid())
|
|
|
+ .eq(SwBillManagementPaidDo::getDeleted,"0")
|
|
|
+ );
|
|
|
+ if (!paidBills.isEmpty()){
|
|
|
+ List<SwBillManagementUnpaidDo> unpaidDoList =new ArrayList<>();
|
|
|
+ List<String> paidIds =new ArrayList<>();
|
|
|
+ for (SwBillManagementPaidDo paidDo : paidBills){
|
|
|
+ // 已缴账单记录
|
|
|
+ paidIds.add(paidDo.getId());
|
|
|
+ //预收账单记录
|
|
|
+ SwBillManagementUnpaidDo unpaidBill = new SwBillManagementUnpaidDo();
|
|
|
+ BeanUtils.copyProperties(paidDo,unpaidBill);
|
|
|
+ unpaidBill.setId(SecurityUtil.getUUID());
|
|
|
+ unpaidBill.setStatus(PENDINGSTATUS);
|
|
|
+ unpaidDoList.add(unpaidBill);
|
|
|
+ }
|
|
|
+
|
|
|
+ swBillManagementUnpaidService.saveBatch(unpaidDoList,200);
|
|
|
+ swBillManagementPaidService.getBaseMapper().selectBatchIds(paidIds);
|
|
|
}
|
|
|
|
|
|
- swBillManagementUnpaidService.saveBatch(unpaidDoList,200);
|
|
|
- swBillManagementPaidService.getBaseMapper().selectBatchIds(paidIds);
|
|
|
+
|
|
|
}
|
|
|
|
|
|
+
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -134,7 +171,7 @@ public class SwRefundRequestRecordServiceImpl extends ServiceImpl<SwRefundReques
|
|
|
* @param currentUser
|
|
|
*/
|
|
|
private void updateBillRecord(SwRefundRequestRecordDO refundRequestRecordDO, SysUserVo currentUser) {
|
|
|
- // 将对应的 【退款金额】【退款人】【退款时间】记录到 缴费记录表中,
|
|
|
+ // 将对应的 【退款金额】【退款人】【退款时间】记录到 缴费记录表中, 当前用户
|
|
|
SwBillingRecordDo swBillingRecordUpdateDo = new SwBillingRecordDo();
|
|
|
swBillingRecordUpdateDo.setId(refundRequestRecordDO.getPaymentrecordid());
|
|
|
swBillingRecordUpdateDo.setRefundtime(new Date());
|