|
|
@@ -0,0 +1,353 @@
|
|
|
+package org.dromara.backstage.business.payments;
|
|
|
+
|
|
|
+import cn.hutool.core.bean.BeanUtil;
|
|
|
+import cn.hutool.core.date.DateUtil;
|
|
|
+import cn.hutool.core.util.ObjUtil;
|
|
|
+import cn.hutool.core.util.StrUtil;
|
|
|
+import cn.hutool.json.JSONUtil;
|
|
|
+import lombok.RequiredArgsConstructor;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.dromara.backstage.basics.domain.vo.PtWorkstationVo;
|
|
|
+import org.dromara.backstage.basics.service.IPtWorkstationService;
|
|
|
+import org.dromara.backstage.cardCenter.domain.bo.PtSubsidyitemBo;
|
|
|
+import org.dromara.backstage.cardCenter.domain.vo.PtCardVo;
|
|
|
+import org.dromara.backstage.cardCenter.domain.vo.PtSubsidyitemVo;
|
|
|
+import org.dromara.backstage.cardCenter.service.IPtCardService;
|
|
|
+import org.dromara.backstage.cardCenter.service.IPtSubsidyitemService;
|
|
|
+import org.dromara.backstage.consumption.domain.bo.XfCreditAccountBackBo;
|
|
|
+import org.dromara.backstage.consumption.domain.bo.XfCreditAccountBo;
|
|
|
+import org.dromara.backstage.consumption.domain.bo.XfUserTotalBo;
|
|
|
+import org.dromara.backstage.consumption.domain.vo.XfCreditAccountBackVo;
|
|
|
+import org.dromara.backstage.consumption.domain.vo.XfCreditAccountVo;
|
|
|
+import org.dromara.backstage.consumption.domain.vo.XfTermVo;
|
|
|
+import org.dromara.backstage.consumption.domain.vo.XfUserTotalVo;
|
|
|
+import org.dromara.backstage.consumption.service.IXfCreditAccountBackService;
|
|
|
+import org.dromara.backstage.consumption.service.IXfCreditAccountService;
|
|
|
+import org.dromara.backstage.consumption.service.IXfTermService;
|
|
|
+import org.dromara.backstage.consumption.service.IXfUserTotalService;
|
|
|
+import org.dromara.backstage.payment.domain.bo.PtBagBo;
|
|
|
+import org.dromara.backstage.payment.domain.bo.PurseInOutBo;
|
|
|
+import org.dromara.backstage.payment.domain.vo.PtBagVo;
|
|
|
+import org.dromara.backstage.payment.domain.vo.PtUserAccountVo;
|
|
|
+import org.dromara.backstage.payment.service.IPtBagService;
|
|
|
+import org.dromara.backstage.payment.service.IPtUserAccountService;
|
|
|
+import org.dromara.common.core.enums.CreditStatusEnum;
|
|
|
+import org.dromara.common.core.enums.CreditTypeEnum;
|
|
|
+import org.dromara.common.core.exception.consume.ConsumeException;
|
|
|
+import org.dromara.common.core.exception.payments.PaymentsException;
|
|
|
+import org.dromara.common.core.utils.MessageUtils;
|
|
|
+import org.dromara.common.core.utils.RecordIdUtils;
|
|
|
+import org.jetbrains.annotations.NotNull;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+
|
|
|
+import java.math.BigDecimal;
|
|
|
+import java.text.MessageFormat;
|
|
|
+import java.util.Date;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Objects;
|
|
|
+
|
|
|
+/**
|
|
|
+ * name: PayBaseBusiness
|
|
|
+ * package: org.dromara.backstage.business.payments
|
|
|
+ * description: 资金收支业务基础逻辑处理
|
|
|
+ * date: 2024-10-30 07:42:46 07:42
|
|
|
+ *
|
|
|
+ * @author luoyibo
|
|
|
+ * @version 0.1
|
|
|
+ * @since JDK 1.8
|
|
|
+ */
|
|
|
+@RequiredArgsConstructor
|
|
|
+@Service
|
|
|
+@Slf4j
|
|
|
+public class PayBaseBusiness {
|
|
|
+ private final IPtWorkstationService workstationService;
|
|
|
+ private final IPtUserAccountService userAccountService;
|
|
|
+ private final IXfTermService termService;
|
|
|
+ private final IPtCardService cardService;
|
|
|
+ private final IPtBagService bagService;
|
|
|
+ private final IXfCreditAccountBackService creditAccountBackService;
|
|
|
+ private final IXfCreditAccountService creditAccountService;
|
|
|
+ private final IXfUserTotalService userTotalService;
|
|
|
+ private final IPtSubsidyitemService subsidyItemService;
|
|
|
+ /**
|
|
|
+ * 检查资金收支的账户信息,资金收支必须有对应的收支账户
|
|
|
+ * @param orderBo 资金收支业务对象
|
|
|
+ * @return 账户信息
|
|
|
+ */
|
|
|
+ public PtUserAccountVo checkUserAccount(PurseInOutBo orderBo){
|
|
|
+ PtUserAccountVo userAccountVo = userAccountService.queryById(orderBo.getUserId());
|
|
|
+ if(ObjUtil.isEmpty(userAccountVo)){
|
|
|
+ throw new PaymentsException(MessageFormat.format("无此账户信息,账户Id:{0}",orderBo.getUserId()));
|
|
|
+ }
|
|
|
+ return userAccountVo;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 检查资金收支对应的卡片信息,只要开通了一卡通账户就可以资金收支,因此卡片信息是可能为空的
|
|
|
+ * @param orderBo 资金收支业务对象
|
|
|
+ * @return 卡片信息
|
|
|
+ */
|
|
|
+ public PtCardVo checkUserCard(PurseInOutBo orderBo){
|
|
|
+ PtCardVo ptCardVo;
|
|
|
+ if (orderBo.getCardId() != null && orderBo.getCardId() > 0) {
|
|
|
+ //如果传入了cardId,根据cardId查询卡片信息
|
|
|
+ ptCardVo = cardService.queryById(orderBo.getCardId());
|
|
|
+ } else {
|
|
|
+ //查询当前人的正常主卡
|
|
|
+ ptCardVo = cardService.queryMainCardByUserId(orderBo.getUserId());
|
|
|
+ }
|
|
|
+ return ptCardVo;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 检查资金收支钱包信息,资金收支必须有对应的收支钱包
|
|
|
+ * @param orderBo 资金收支业务对象
|
|
|
+ * @return 钱包信息
|
|
|
+ */
|
|
|
+ public PtBagVo checkUserBag(PurseInOutBo orderBo){
|
|
|
+ PtBagVo ptBagVo = bagService.queryByUserBagCode(orderBo.getUserId(), orderBo.getBagCode());
|
|
|
+ if(ObjUtil.isEmpty(ptBagVo)){
|
|
|
+ throw new PaymentsException(MessageFormat.format("无此账户钱包信息,账户Id:{0},钱包代码:{1}",orderBo.getUserId(),orderBo.getBagCode()));
|
|
|
+ }
|
|
|
+ return ptBagVo;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 检查资金收支消费设备信息,有些收支操作是通过专用消费机操作的,设备信息有可能为空
|
|
|
+ * @param orderBo 资金收支业务对象
|
|
|
+ * @return 设备信息
|
|
|
+ */
|
|
|
+ public XfTermVo checkTerm(PurseInOutBo orderBo){
|
|
|
+ if(orderBo.getTermNo()==null || orderBo.getTermNo()==0L){
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ return termService.queryByNo(orderBo.getTermNo());
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 检查资金收支消费工作站信息,有些收支操作是通过工作站操作,工作站信息有可能为空
|
|
|
+ * @param orderBo 资金收支业务对象
|
|
|
+ * @return 工作站信息
|
|
|
+ */
|
|
|
+ public PtWorkstationVo checkWorkStation(PurseInOutBo orderBo){
|
|
|
+ if(orderBo.getStationId()==null || orderBo.getStationId()==0L){
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ //这里的工作站Id实际上对应的是工作站的编号
|
|
|
+ return workstationService.queryById(orderBo.getStationId());
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 计算收支操作后的钱包余额
|
|
|
+ * @param bagVo 钱包信息
|
|
|
+ * @param orderBo 收支订单业务对象
|
|
|
+ */
|
|
|
+ public void calculateBalance(PtBagVo bagVo,PurseInOutBo orderBo){
|
|
|
+ if (Objects.requireNonNull(orderBo.getCreditType()) == CreditTypeEnum.TERM_CONSUME) {
|
|
|
+ //管理费实际是不扣钱包余额的
|
|
|
+ orderBo.setBalance(bagVo.getBalance());
|
|
|
+ } else {
|
|
|
+ orderBo.setBalance(bagVo.getBalance().add(orderBo.getReceiptMoney()));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ /**
|
|
|
+ * 收支入账前校验收支原始记录
|
|
|
+ *
|
|
|
+ * @param originalId 原始记录Id
|
|
|
+ */
|
|
|
+ public void ValidOriginalRecord(String originalId) {
|
|
|
+ String message;
|
|
|
+ XfCreditAccountBackVo xfCreditaccountbackVo = creditAccountBackService.queryById(originalId);
|
|
|
+ if (ObjUtil.isEmpty(xfCreditaccountbackVo)) {
|
|
|
+ message = MessageUtils.message("payments.OriginalRecord.get", originalId);
|
|
|
+ throw new PaymentsException("[资金收支]-[原始记录]", message);
|
|
|
+ }
|
|
|
+ String accountId = xfCreditaccountbackVo.getCreditId();
|
|
|
+ if (StrUtil.isNotEmpty(accountId)) {
|
|
|
+ message = MessageUtils.message("payments.OriginalRecord.isPost", originalId, accountId);
|
|
|
+ throw new PaymentsException("[资金收支]-[原始记录]", message);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ /**
|
|
|
+ * 生成原始收支记录(收支流水备份表)
|
|
|
+ *
|
|
|
+ * @param bo 资金收支信息
|
|
|
+ * @param accountVo 资金收支账户信息
|
|
|
+ * @param cardVo 资金收支卡片信息
|
|
|
+ * @param termVo 资金收支消费设备信息
|
|
|
+ * @param workstationVo 资金收支工作站信息
|
|
|
+ * @return 原始收支记录
|
|
|
+ */
|
|
|
+ public XfCreditAccountBackVo createOriginalRecord(PurseInOutBo bo, PtUserAccountVo accountVo, PtCardVo cardVo, PtBagVo bagVo, XfTermVo termVo, PtWorkstationVo workstationVo) {
|
|
|
+ XfCreditAccountBackBo xfCreditaccountbackBo = new XfCreditAccountBackBo();
|
|
|
+ String backId = getRecordKeyId(bo, accountVo, bagVo);
|
|
|
+ xfCreditaccountbackBo.setBackId(backId);
|
|
|
+
|
|
|
+ //设置交易数据
|
|
|
+ xfCreditaccountbackBo.setCreditTime(new Date());
|
|
|
+ xfCreditaccountbackBo.setCreditType(bo.getCreditType().code().toString());
|
|
|
+ xfCreditaccountbackBo.setReceiptMoney(bo.getReceiptMoney());
|
|
|
+ xfCreditaccountbackBo.setPayStyle(bo.getPayStyle());
|
|
|
+ xfCreditaccountbackBo.setCreditStatus(CreditStatusEnum.CREATE.code());
|
|
|
+ xfCreditaccountbackBo.setUseType(bo.getUseType().code());
|
|
|
+ xfCreditaccountbackBo.setOperatorId(bo.getOperatorId());
|
|
|
+
|
|
|
+ //设置交易人数据
|
|
|
+ xfCreditaccountbackBo.setUserId(bo.getUserId());
|
|
|
+
|
|
|
+ //设置交易卡片数据mq
|
|
|
+ if (ObjUtil.isNotEmpty(cardVo)) {
|
|
|
+ xfCreditaccountbackBo.setCardNo(cardVo.getCardNo());
|
|
|
+ }
|
|
|
+ //设置账户钱包信息
|
|
|
+ xfCreditaccountbackBo.setBagType(bagVo.getBagCode());
|
|
|
+ xfCreditaccountbackBo.setCardValue(bo.getBalance());
|
|
|
+
|
|
|
+ //设置交易设备信息
|
|
|
+ if (ObjUtil.isNotEmpty(termVo)) {
|
|
|
+ xfCreditaccountbackBo.setTermNo(termVo.getTermNo());
|
|
|
+ xfCreditaccountbackBo.setTermRecordId(bo.getTermRecordId());
|
|
|
+ }
|
|
|
+
|
|
|
+ //设置交易工作站信息
|
|
|
+ if (ObjUtil.isNotEmpty(workstationVo)) {
|
|
|
+ xfCreditaccountbackBo.setStationId(workstationVo.getStationId());
|
|
|
+ }
|
|
|
+
|
|
|
+ XfCreditAccountBackVo creditAccountBackVo = creditAccountBackService.createOriginalRecord(xfCreditaccountbackBo);
|
|
|
+ if (ObjUtil.isEmpty(creditAccountBackVo)) {
|
|
|
+ String message = MessageUtils.message("payments.OriginalRecord.create", JSONUtil.parse(bo));
|
|
|
+ throw new PaymentsException("资金收支-原始记录", message);
|
|
|
+ }
|
|
|
+ return creditAccountBackVo;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 收支记账(收支流水表)
|
|
|
+ *
|
|
|
+ * @param bo 资金收支信息
|
|
|
+ * @param accountVo 资金收支账户信息
|
|
|
+ * @param cardVo 资金收支卡片信息
|
|
|
+ * @param termVo 资金收支消费设备信息
|
|
|
+ * @param workstationVo 资金收支工作站信息
|
|
|
+ * @param originalId 原始收支记录Id(收支备份表主键)
|
|
|
+ * @return 正式收支记录
|
|
|
+ */
|
|
|
+ public XfCreditAccountVo keepAccounts(PurseInOutBo bo, PtUserAccountVo accountVo, PtCardVo cardVo, PtBagVo bagVo, XfTermVo termVo, PtWorkstationVo workstationVo, String originalId) {
|
|
|
+ XfCreditAccountBo xfCreditaccountbo = new XfCreditAccountBo();
|
|
|
+ String accountId = getRecordKeyId(bo, accountVo, bagVo);
|
|
|
+ xfCreditaccountbo.setCreditId(accountId);
|
|
|
+
|
|
|
+ //设置交易数据
|
|
|
+ xfCreditaccountbo.setCreditTime(DateUtil.date());
|
|
|
+ xfCreditaccountbo.setCreditType(bo.getCreditType().code().toString());
|
|
|
+ xfCreditaccountbo.setReceiptMoney(bo.getReceiptMoney());
|
|
|
+ xfCreditaccountbo.setPayStyle(bo.getPayStyle());
|
|
|
+ xfCreditaccountbo.setUseType(bo.getUseType().code());
|
|
|
+
|
|
|
+ //设置交易账户信息
|
|
|
+ xfCreditaccountbo.setUserId(accountVo.getUserId());
|
|
|
+ xfCreditaccountbo.setUserNumb(accountVo.getUserNumb());
|
|
|
+ xfCreditaccountbo.setRealName(accountVo.getRealName());
|
|
|
+ xfCreditaccountbo.setDeptId(accountVo.getDeptId());
|
|
|
+ xfCreditaccountbo.setDeptName(accountVo.getDeptName());
|
|
|
+ //设置设备信息
|
|
|
+ if(ObjUtil.isNotEmpty(termVo)) {
|
|
|
+ xfCreditaccountbo.setTermNo(termVo.getTermNo());
|
|
|
+ xfCreditaccountbo.setTermName(termVo.getTermName());
|
|
|
+ xfCreditaccountbo.setTermRecordId(bo.getTermRecordId());
|
|
|
+ }
|
|
|
+ if(ObjUtil.isNotEmpty(workstationVo)) {
|
|
|
+ //设置工作站信息
|
|
|
+ xfCreditaccountbo.setStationNumb(workstationVo.getStationNumb());
|
|
|
+ xfCreditaccountbo.setStationName(workstationVo.getStationName());
|
|
|
+ }
|
|
|
+ //设置卡片信息
|
|
|
+ xfCreditaccountbo.setCardNo(cardVo.getCardNo());
|
|
|
+ xfCreditaccountbo.setCardValue(bo.getBalance());
|
|
|
+ xfCreditaccountbo.setCardType(cardVo.getCardType());
|
|
|
+ xfCreditaccountbo.setCardCount(bagVo.getRechargeCount() + 1);
|
|
|
+ xfCreditaccountbo.setCardTypeName(cardVo.getCardTypeName());
|
|
|
+ xfCreditaccountbo.setMainCard(cardVo.getMainCard());
|
|
|
+ //设置钱包信息
|
|
|
+ xfCreditaccountbo.setBagType(bagVo.getBagCode());
|
|
|
+ // 设置操作员信息
|
|
|
+ xfCreditaccountbo.setOperatorId(bo.getOperatorId());
|
|
|
+ xfCreditaccountbo.setOperatorName(bo.getOperatorName());
|
|
|
+
|
|
|
+ xfCreditaccountbo.setOriginalId(originalId);
|
|
|
+
|
|
|
+ XfCreditAccountVo creditAccountVo = creditAccountService.keepAccounts(xfCreditaccountbo);
|
|
|
+ if (ObjUtil.isEmpty(creditAccountVo)) {
|
|
|
+ String message = MessageUtils.message("payments.keepAccounts.create", originalId);
|
|
|
+ throw new PaymentsException("资金收支-收支入账", message);
|
|
|
+ }
|
|
|
+ return creditAccountVo;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 处理个人日统计表
|
|
|
+ * @param bo 收支信息
|
|
|
+ * @param accountVo 账户信息
|
|
|
+ * @param cardVo 账户卡片信息
|
|
|
+ */
|
|
|
+ public void createOrUpdateUserTotal(PurseInOutBo bo, PtUserAccountVo accountVo, PtCardVo cardVo) {
|
|
|
+ XfUserTotalBo xfUserTotalBo = new XfUserTotalBo();
|
|
|
+ xfUserTotalBo.setUserId(accountVo.getUserId());
|
|
|
+ xfUserTotalBo.setUserNumb(accountVo.getUserNumb());
|
|
|
+ xfUserTotalBo.setRealName(accountVo.getRealName());
|
|
|
+ xfUserTotalBo.setDeptName(accountVo.getDeptName());
|
|
|
+ xfUserTotalBo.setCardNo(cardVo.getCardNo());
|
|
|
+ xfUserTotalBo.setDateDay(DateUtil.format(new Date(), "yyyy-MM-dd"));
|
|
|
+ xfUserTotalBo.setUseType(bo.getUseType().code());
|
|
|
+ xfUserTotalBo.setCreditMoney(bo.getReceiptMoney());
|
|
|
+
|
|
|
+ userTotalService.createOrUpdateUserTotal(xfUserTotalBo);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 更新钱包余额
|
|
|
+ * @param bo 收支业务对象
|
|
|
+ * @return 更新后钱包余额
|
|
|
+ */
|
|
|
+ public PtBagVo updateBalance(PurseInOutBo bo) {
|
|
|
+ PtBagBo bagBo = BeanUtil.copyProperties(bo, PtBagBo.class);
|
|
|
+ return bagService.updateBalanceByBo(bagBo);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 更新原始订单的入账状态
|
|
|
+ * @param bo 收支信息
|
|
|
+ * @param status 入账状态
|
|
|
+ * @param cardValue 入账后账户余额
|
|
|
+ */
|
|
|
+ public void updateOriginalOrderStatus(PurseInOutBo bo, Integer status, BigDecimal cardValue) {
|
|
|
+ creditAccountBackService.updateStatusById(bo.getOriginalId(), status, bo.getCreditId(), cardValue);
|
|
|
+ }
|
|
|
+
|
|
|
+ public List<PtSubsidyitemVo> selectPostSubsidyItem(){
|
|
|
+ return subsidyItemService.selectPostSubsidyItem();
|
|
|
+ }
|
|
|
+ public boolean updatePostSubsidyItemStatus(PtSubsidyitemBo bo){
|
|
|
+ return subsidyItemService.updateByBo(bo);
|
|
|
+ }
|
|
|
+ /**
|
|
|
+ * 生成资金收支备份表和收支表的32位主键Id
|
|
|
+ *
|
|
|
+ * @param bo 资金收支信息
|
|
|
+ * @param accountVo 人员账户信息
|
|
|
+ * @param bagVo 账户钱包信息
|
|
|
+ * @return 生成的记录Id
|
|
|
+ */
|
|
|
+ @NotNull
|
|
|
+ private String getRecordKeyId(PurseInOutBo bo, PtUserAccountVo accountVo, PtBagVo bagVo) {
|
|
|
+ BigDecimal a = new BigDecimal(100);
|
|
|
+ int key3 = 0;
|
|
|
+ if (bo.getReceiptMoney().compareTo(BigDecimal.ZERO) > 0) {
|
|
|
+ key3 = bo.getReceiptMoney().multiply(a).intValue();
|
|
|
+ } else {
|
|
|
+ key3 = bo.getReceiptMoney().negate().multiply(a).intValue();
|
|
|
+ }
|
|
|
+ return RecordIdUtils.getRecordId(new Date(), Short.parseShort(bo.getCreditType().code().toString()), Integer.parseInt(accountVo.getUserNo().toString()), key3, Integer.parseInt(bagVo.getBagCode()));
|
|
|
+ }
|
|
|
+}
|