|
@@ -1,27 +1,24 @@
|
|
|
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;
|
|
|
-import com.rongwe.zhsw.system.domain.SwBillingRecordDo;
|
|
|
-import com.rongwe.zhsw.system.domain.SwRefundRequestRecordDO;
|
|
|
-import com.rongwe.zhsw.system.domain.SwUserManagementDo;
|
|
|
-import com.rongwe.zhsw.system.dto.RefundApplicationDTO;
|
|
|
-import com.rongwei.rwadmincommon.system.vo.SysUserVo;
|
|
|
+import com.rongwe.zhsw.system.domain.*;
|
|
|
import com.rongwei.rwcommon.base.R;
|
|
|
import com.rongwei.rwcommon.utils.SecurityUtil;
|
|
|
import com.rongwei.zhsw.system.dao.SwRefundRequestRecordDao;
|
|
|
-import com.rongwei.zhsw.system.service.SwBillingRecordService;
|
|
|
-import com.rongwei.zhsw.system.service.SwRefundRequestRecordService;
|
|
|
-import com.rongwei.zhsw.system.service.SwUserManagementService;
|
|
|
-import com.rongwei.zhsw.system.utils.ZhswCommonUtils;
|
|
|
+import com.rongwei.zhsw.system.service.*;
|
|
|
+import org.springframework.beans.BeanUtils;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
-
|
|
|
import java.math.BigDecimal;
|
|
|
-import java.util.Date;
|
|
|
-
|
|
|
-import static com.rongwei.zhsw.system.utils.SaveConstans.refundApply.FULLREFUND;
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.List;
|
|
|
+import static com.rongwei.zhsw.system.utils.SaveConstans.billInfo.PENDINGSTATUS;
|
|
|
+import static com.rongwei.zhsw.system.utils.SaveConstans.billReccord.FULLREFUNDSTATUS;
|
|
|
+import static com.rongwei.zhsw.system.utils.SaveConstans.billReccord.PARTIALREFUNDSTATUS;
|
|
|
+import static com.rongwei.zhsw.system.utils.SaveConstans.refundApply.*;
|
|
|
|
|
|
/**
|
|
|
* 退款申请记录(SwRefundRequestRecord)表服务实现类
|
|
@@ -38,119 +35,112 @@ public class SwRefundRequestRecordServiceImpl extends ServiceImpl<SwRefundReques
|
|
|
@Autowired
|
|
|
private SwBillingRecordService swBillingRecordService;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private SwRefundRequestRecordService swRefundRequestRecordService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private SwBillManagementPaidService swBillManagementPaidService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private SwBillManagementUnpaidService swBillManagementUnpaidService;
|
|
|
+
|
|
|
@Override
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
- public R refundApplication(RefundApplicationDTO refundApplicationDTO) {
|
|
|
+ public R refundApplication(String id) {
|
|
|
|
|
|
- //1.新生成申请退款记录
|
|
|
- SwRefundRequestRecordDO recordDO = new SwRefundRequestRecordDO();
|
|
|
- recordDO.setId(SecurityUtil.getUUID())
|
|
|
- .setRefundmethod(refundApplicationDTO.getRefundMethod())
|
|
|
- .setRefundamount(refundApplicationDTO.getRefundAmount());
|
|
|
+ //1.获取退款记录
|
|
|
+ SwRefundRequestRecordDO refundRequestRecordDO = swRefundRequestRecordService.getById(id);
|
|
|
|
|
|
+ // 缴费记录表更新:
|
|
|
+ updateBillRecord(refundRequestRecordDO);
|
|
|
|
|
|
- //当前用户
|
|
|
- SysUserVo currentUser = ZhswCommonUtils.getCurrentUser();
|
|
|
- recordDO.setCreateuserid(currentUser.getId())
|
|
|
- .setCreateusername(currentUser.getName())
|
|
|
- .setCreatedate(new Date())
|
|
|
- .setModifydate(new Date())
|
|
|
- .setModifyuserid(currentUser.getId())
|
|
|
- .setModifyusername(currentUser.getName())
|
|
|
- .setRefundtime(new Date())
|
|
|
- .setRefundoperatorid(currentUser.getId())
|
|
|
- .setRefundoperatorname(currentUser.getName());
|
|
|
+ BigDecimal balanceAdd =BigDecimal.ZERO;
|
|
|
|
|
|
+ //全额 退款
|
|
|
+ if (refundRequestRecordDO.getRefundmethod().equals(REFUNDMETHODALL)){
|
|
|
+ // 退款记录表更新 实退金额
|
|
|
+ swRefundRequestRecordService.update(new LambdaUpdateWrapper<SwRefundRequestRecordDO>()
|
|
|
+ .eq(SwRefundRequestRecordDO::getId, refundRequestRecordDO.getId())
|
|
|
+ .set(SwRefundRequestRecordDO::getActualretirement, refundRequestRecordDO.getRefundamount()));
|
|
|
|
|
|
- //根据户号获取 用户记录
|
|
|
- SwUserManagementDo swUserManagement = swUserManagementService.getBaseMapper().
|
|
|
- selectOne(new LambdaQueryWrapper<SwUserManagementDo>().eq(SwUserManagementDo::getUsernumber, refundApplicationDTO.getUserNumber()));
|
|
|
- recordDO.setUsername(swUserManagement.getUsername())
|
|
|
- .setUsernumber(swUserManagement.getUsernumber())
|
|
|
- .setAccountbalance(swUserManagement.getAccountbalance());
|
|
|
+ //预收账单记录表更新: 已缴账单记录表更新
|
|
|
+ updateOrSaveBills(refundRequestRecordDO.getPaymentrecordid());
|
|
|
|
|
|
+ //用户表更新:系统需要 将 对应用户信息中的【余额】进行更新,余额 = 当前用户余额 + 【余额抵扣 balancededuction
|
|
|
+ balanceAdd = refundRequestRecordDO.getBalancededuction();
|
|
|
|
|
|
- //根据缴费id 获取缴费记录
|
|
|
- SwBillingRecordDo swBillingRecordDo = swBillingRecordService.getById(refundApplicationDTO.getPaymentRecordId());
|
|
|
- recordDO.setActualdue(swBillingRecordDo.getActualdue())
|
|
|
- .setPaidin(swBillingRecordDo.getPaidin())
|
|
|
- .setThenafterpaymentbalance(swBillingRecordDo.getAfterpaymentbalance())
|
|
|
- .setPaymentrecordid(swBillingRecordDo.getId());
|
|
|
|
|
|
+ } else if (refundRequestRecordDO.getRefundmethod().equals(REFUNDMETHODBALANCE)) {
|
|
|
+ // 差额退款
|
|
|
|
|
|
- // 根据退款方式计算 可退款金额 , 缴费记录,用户表等数据更新
|
|
|
- updateByRefundmethod(recordDO,swBillingRecordDo,currentUser);
|
|
|
+ // 用户表更新:系统需要 将 对应用户信息中的【余额】进行更新,余额 = 当前用户余额 - 【退款金额】
|
|
|
+ balanceAdd = BigDecimal.ZERO.subtract(refundRequestRecordDO.getRefundamount());
|
|
|
+ }
|
|
|
|
|
|
- this.baseMapper.insert(recordDO);
|
|
|
+ //用户表更新
|
|
|
+ SwUserManagementDo swUserManagement = swUserManagementService.getBaseMapper().
|
|
|
+ selectOne(new LambdaQueryWrapper<SwUserManagementDo>().eq(SwUserManagementDo::getUsernumber, refundRequestRecordDO.getUsernumber()));
|
|
|
+ swUserManagementService.balanceAdd(swUserManagement.getId(), balanceAdd);
|
|
|
|
|
|
|
|
|
return R.ok();
|
|
|
}
|
|
|
|
|
|
- // 根据退款方式计算 可退款金额 , 缴费记录,用户表等数据更新
|
|
|
- private void updateByRefundmethod(SwRefundRequestRecordDO recordDO, SwBillingRecordDo swBillingRecordDo, SysUserVo currentUser) {
|
|
|
- // 缴费记录 数据更新
|
|
|
- swBillingRecordDo.setRefundtime(recordDO.getRefundtime())
|
|
|
- .setRefundoperatorid(recordDO.getRefundoperatorid())
|
|
|
- .setRefundoperatorname(recordDO.getRefundoperatorname())
|
|
|
- .setModifydate(new Date())
|
|
|
- .setModifyuserid(currentUser.getId())
|
|
|
- .setModifyusername(currentUser.getName());
|
|
|
-
|
|
|
- //当退款方式选择 ”全部退款-按缴费记录退款并退账单 “ 时,
|
|
|
- if (recordDO.getRefundmethod() .equals(FULLREFUND)) {
|
|
|
- //【可退款金额】默认= 【实缴金额】
|
|
|
- recordDO.setRefundableamount(recordDO.getActualdue());
|
|
|
- // 更新缴费记录
|
|
|
- updateSwBillingRecordDo(swBillingRecordDo,null,BigDecimal.ZERO);
|
|
|
- }else {
|
|
|
- // 当退款方式选择 “差额退款-不退账单但调整账单 “ 时,
|
|
|
- if (recordDO.getThenafterpaymentbalance().compareTo(recordDO.getAccountbalance() ) >=0){
|
|
|
- //【当时缴费后余额】 >=【账户余额】时,【可退款金额】默认=【账户余额】
|
|
|
- recordDO.setRefundableamount(recordDO.getAccountbalance());
|
|
|
- }else {
|
|
|
- //【当时缴费后余额】 <【账户余额】时,【可退款金额】默认= 【当时缴费后余额】
|
|
|
- recordDO.setRefundableamount(recordDO.getThenafterpaymentbalance());
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
/**
|
|
|
- * 更新缴费记录
|
|
|
- * 全部退款-按收款记录退款并退账单
|
|
|
- * 系统需要 将对应的 【退款金额】【退款人】【退款时间】记录到 缴费记录表中,同时缴费记录的缴费 状态 更新为 “全部退款” 状态,【缴费金额-整数】更新为 0,
|
|
|
+ * 预收账单记录表更新:系统需要 将 对应的 缴费记录对应账单 信息 复制一份到 预收账单记录表中,并且 缴费状态标记状态为“待缴费”
|
|
|
+ * 已缴账单记录表更新:系统需要 将 对应的 缴费记录对应账单 标记为删除
|
|
|
+ * @param paymentrecordid
|
|
|
*/
|
|
|
- public void updateSwBillingRecordDo(SwBillingRecordDo swBillingRecordDo,String payfeesstatus,BigDecimal paidin){
|
|
|
-
|
|
|
- swBillingRecordDo.setPayfeesstatus(payfeesstatus)
|
|
|
- .setPaidin(paidin);
|
|
|
+ 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);
|
|
|
+ }
|
|
|
|
|
|
+ swBillManagementUnpaidService.saveBatch(unpaidDoList,200);
|
|
|
+ swBillManagementPaidService.getBaseMapper().selectBatchIds(paidIds);
|
|
|
+ }
|
|
|
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 1、
|
|
|
- *
|
|
|
- *
|
|
|
- * 若
|
|
|
- * @param recordDO
|
|
|
- * @return
|
|
|
+ * 更新缴费记录
|
|
|
+ * @param refundRequestRecordDO
|
|
|
*/
|
|
|
- public void setRefundableamountData(SwRefundRequestRecordDO recordDO) {
|
|
|
- BigDecimal refundableamount = BigDecimal.ZERO;
|
|
|
-
|
|
|
- if (recordDO.getRefundmethod() .equals(FULLREFUND)) {
|
|
|
- refundableamount =recordDO.getActualdue();
|
|
|
-
|
|
|
- }else {
|
|
|
- if (recordDO.getThenafterpaymentbalance().compareTo(recordDO.getAccountbalance() ) >=0){
|
|
|
- refundableamount =recordDO.getAccountbalance();
|
|
|
- }else {
|
|
|
- refundableamount =recordDO.getThenafterpaymentbalance();
|
|
|
- }
|
|
|
+ private void updateBillRecord(SwRefundRequestRecordDO refundRequestRecordDO) {
|
|
|
+ // 将对应的 【退款金额】【退款人】【退款时间】记录到 缴费记录表中,
|
|
|
+ SwBillingRecordDo swBillingRecordUpdateDo = new SwBillingRecordDo();
|
|
|
+ swBillingRecordUpdateDo.setId(refundRequestRecordDO.getPaymentrecordid());
|
|
|
+ swBillingRecordUpdateDo.setRefundtime(refundRequestRecordDO.getRefundtime());
|
|
|
+ swBillingRecordUpdateDo.setRefundoperatorid(refundRequestRecordDO.getRefundoperatorid());
|
|
|
+ swBillingRecordUpdateDo.setRefundoperatorname(refundRequestRecordDO.getRefundoperatorname());
|
|
|
+ swBillingRecordUpdateDo.setRefundamount(refundRequestRecordDO.getRefundamount());
|
|
|
+ //全额退款 系统需要同时缴费记录的缴费 状态 更新为 “全部退款” 状态,【本次实缴-整数】更新为 0,【缴费后余额】更新为 0
|
|
|
+ if (refundRequestRecordDO.getRefundmethod().equals(REFUNDMETHODALL)){
|
|
|
+ swBillingRecordUpdateDo.setPayfeesstatus(FULLREFUNDSTATUS);
|
|
|
+ swBillingRecordUpdateDo.setPaidin(BigDecimal.ZERO);
|
|
|
+ swBillingRecordUpdateDo.setAfterpaymentbalance(BigDecimal.ZERO);
|
|
|
+ } else if (refundRequestRecordDO.getRefundmethod().equals(REFUNDMETHODBALANCE)) {
|
|
|
+ //差额退款 ,同时缴费记录的缴费 状态 更新为 “部分退款” 状态,【缴费金额-整数】更新为【原缴费金额-整数】-【退款金额】【缴费后余额】更新为【原实缴后余额】-【退款金额】 ,
|
|
|
+ swBillingRecordUpdateDo.setPayfeesstatus(PARTIALREFUNDSTATUS);
|
|
|
+ SwBillingRecordDo recordDO = swBillingRecordService.getById(refundRequestRecordDO.getPaymentrecordid());
|
|
|
+ swBillingRecordUpdateDo.setPaidin(recordDO.getPaidin().subtract(refundRequestRecordDO.getRefundableamount()));
|
|
|
+ swBillingRecordUpdateDo.setAfterpaymentbalance(recordDO.getAfterpaymentbalance().subtract(refundRequestRecordDO.getRefundableamount()));
|
|
|
}
|
|
|
- recordDO.setRefundableamount(refundableamount);
|
|
|
-
|
|
|
+ swBillingRecordService.updateById(swBillingRecordUpdateDo);
|
|
|
}
|
|
|
+
|
|
|
}
|