|
|
@@ -0,0 +1,218 @@
|
|
|
+package org.dromara.backstage.business.errfill;
|
|
|
+
|
|
|
+import cn.hutool.core.bean.BeanUtil;
|
|
|
+import cn.hutool.json.JSONUtil;
|
|
|
+import lombok.RequiredArgsConstructor;
|
|
|
+import org.dromara.backstage.basics.domain.vo.PtMealTypeVo;
|
|
|
+import org.dromara.backstage.basics.service.IPtMealtypeService;
|
|
|
+import org.dromara.backstage.cardCenter.domain.vo.PtCardVo;
|
|
|
+import org.dromara.backstage.cardCenter.service.IPtCardService;
|
|
|
+import org.dromara.backstage.consumption.domain.XfConsumeDetail;
|
|
|
+import org.dromara.backstage.consumption.domain.bo.ConsumptionBo;
|
|
|
+import org.dromara.backstage.consumption.domain.bo.XfConsumeDetailBo;
|
|
|
+import org.dromara.backstage.consumption.domain.vo.XfConsumeDetailVo;
|
|
|
+import org.dromara.backstage.consumption.domain.vo.XfTermVo;
|
|
|
+import org.dromara.backstage.consumption.service.IXfConsumeDetailService;
|
|
|
+import org.dromara.backstage.consumption.service.IXfTermService;
|
|
|
+import org.dromara.backstage.payment.domain.bo.PtBagBo;
|
|
|
+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.BalanceUpdateEnum;
|
|
|
+import org.dromara.common.core.exception.consume.BagException;
|
|
|
+import org.dromara.common.core.exception.consume.ConsumeException;
|
|
|
+import org.dromara.common.core.utils.RecordIdUtils;
|
|
|
+import org.jetbrains.annotations.NotNull;
|
|
|
+import org.slf4j.Logger;
|
|
|
+import org.slf4j.LoggerFactory;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
+
|
|
|
+import java.math.BigDecimal;
|
|
|
+import java.text.MessageFormat;
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.Date;
|
|
|
+import java.util.List;
|
|
|
+
|
|
|
+/**
|
|
|
+ * name: ErrFill
|
|
|
+ * package: org.dromara.backstage.business.errfill
|
|
|
+ * description: 错扣补款业务处理逻辑
|
|
|
+ * date: 2024-09-04 08:44:46 08:44
|
|
|
+ *
|
|
|
+ * @author luoyibo
|
|
|
+ * @version 0.1
|
|
|
+ * @since JDK 1.8
|
|
|
+ */
|
|
|
+@RequiredArgsConstructor
|
|
|
+@Service
|
|
|
+public class ErrFillBusiness {
|
|
|
+ private static final Logger log = LoggerFactory.getLogger(ErrFillBusiness.class);
|
|
|
+ private final IPtUserAccountService userAccountService;
|
|
|
+ private final IXfTermService termService;
|
|
|
+ private final IPtCardService cardService;
|
|
|
+ private final IPtBagService bagService;
|
|
|
+ private final IPtMealtypeService mealTypeService;
|
|
|
+ private final IXfConsumeDetailService consumeDetailService;
|
|
|
+
|
|
|
+ public PtBagVo createErrFillRecord(ConsumptionBo bo) {
|
|
|
+ String message;
|
|
|
+ //1.处理入账需要的其它信息
|
|
|
+ log.info("[开始错扣补款前的验证]-[{}]", JSONUtil.toJsonStr(bo));
|
|
|
+ List<Object> list = getOtherInfo(bo);
|
|
|
+ PtUserAccountVo userAccountVo = list.get(0) == null ? new PtUserAccountVo() : (PtUserAccountVo) list.get(0);
|
|
|
+ PtCardVo cardVo = list.get(1) == null ? new PtCardVo() : (PtCardVo) list.get(1);
|
|
|
+ PtBagVo bagVo = list.get(2) == null ? new PtBagVo() : (PtBagVo) list.get(2);
|
|
|
+ XfTermVo termVo = list.get(3) == null ? new XfTermVo() : (XfTermVo) list.get(3);
|
|
|
+ PtMealTypeVo mealTypeVo = list.get(4) == null ? new PtMealTypeVo() : (PtMealTypeVo) list.get(4);
|
|
|
+
|
|
|
+ log.info("[验证通过,开始写入消费明细数据]-[{}]", JSONUtil.toJsonStr(bo));
|
|
|
+ XfConsumeDetailVo consumeDetailVo = createConsumeRecord(bo, userAccountVo, cardVo, bagVo, termVo, mealTypeVo);
|
|
|
+ if (consumeDetailVo == null) {
|
|
|
+ message = MessageFormat.format("[错扣补款写消费明细表失败]-[{0}]", JSONUtil.toJsonStr(bo));
|
|
|
+ log.error(message);
|
|
|
+ throw new ConsumeException("consumption.consumeDetail.failure", "错扣补款");
|
|
|
+ }
|
|
|
+ // TODO 2024-09-04 23:36:42 luoyibo 写个人日统计表
|
|
|
+ log.info("[消费明细处理完毕,开始更新人员日统计表]-[{}]", JSONUtil.toJsonStr(bo));
|
|
|
+
|
|
|
+ // TODO 2024-09-04 23:37:35 luoyibo 更新设备的按日统计
|
|
|
+ log.info("[人员日统计表更新完毕,开始更新设备日统计表]-[{}]", JSONUtil.toJsonStr(bo));
|
|
|
+
|
|
|
+ log.info("[设备日统计表更新完毕,开始更新钱包余额]-[{}]", JSONUtil.toJsonStr(bo));
|
|
|
+ PtBagVo resultVo = updateBalance(bo, bagVo);
|
|
|
+ if (resultVo == null) {
|
|
|
+ message = MessageFormat.format("[错扣补款]-[账户Id:{0},钱包类型:{1},操作金额:{2}]", bo.getUserId(), bo.getBagType(), bo.getOperatorMoney());
|
|
|
+ log.error(message);
|
|
|
+ throw new BagException("bag.balance.update", message);
|
|
|
+ }
|
|
|
+ //卡余更新成功,设置消费明细中的卡余为更新后的卡余
|
|
|
+ updateConsumeRecordBalance(consumeDetailVo.getConsumeId(), resultVo.getBalance());
|
|
|
+ return resultVo;
|
|
|
+ }
|
|
|
+
|
|
|
+ private XfConsumeDetailVo createConsumeRecord(ConsumptionBo bo, PtUserAccountVo userAccountVo, PtCardVo cardVo, PtBagVo bagVo, XfTermVo termVo, PtMealTypeVo mealTypeVo) {
|
|
|
+ String recordId = getRecordKeyId(bo, userAccountVo, bagVo);
|
|
|
+ XfConsumeDetailBo consumeDetailBo = new XfConsumeDetailBo();
|
|
|
+ BeanUtil.copyProperties(bo, consumeDetailBo);
|
|
|
+ consumeDetailBo.setConsumeId(recordId);
|
|
|
+ //设置消费账户信息
|
|
|
+ BeanUtil.copyProperties(userAccountVo, consumeDetailBo);
|
|
|
+ //设置消费信息
|
|
|
+ consumeDetailBo.setConsumeDate(bo.getFillDate());
|
|
|
+ // 补款记一笔负消费
|
|
|
+ consumeDetailBo.setConsumeMoney(bo.getOperatorMoney().negate());
|
|
|
+ //设置卡片信息
|
|
|
+ consumeDetailBo.setCardNo(cardVo.getCardNo());
|
|
|
+ consumeDetailBo.setFactoryId(cardVo.getFactoryId());
|
|
|
+ consumeDetailBo.setCardValue(bagVo.getBalance());
|
|
|
+ //设置设备信息
|
|
|
+ BeanUtil.copyProperties(termVo, consumeDetailBo);
|
|
|
+ //设置操作员信息
|
|
|
+ consumeDetailBo.setOperatorId(bo.getOperatorId());
|
|
|
+ consumeDetailBo.setOperatorName(bo.getOperatorName());
|
|
|
+ //设置餐类信息
|
|
|
+ consumeDetailBo.setMealType(Long.valueOf(mealTypeVo.getTypeId()));
|
|
|
+ consumeDetailBo.setMealName(mealTypeVo.getMealName());
|
|
|
+ //设置钱包信息
|
|
|
+ consumeDetailBo.setBagType(bagVo.getBagCode());
|
|
|
+
|
|
|
+ return consumeDetailService.createConsumeDetailRecord(consumeDetailBo);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 更新消费明细表的卡余信息
|
|
|
+ *
|
|
|
+ * @param consumeId 消费明细Id
|
|
|
+ * @param balance 卡余
|
|
|
+ * @return 更新结果
|
|
|
+ */
|
|
|
+ private boolean updateConsumeRecordBalance(String consumeId, BigDecimal balance){
|
|
|
+ XfConsumeDetailBo consumeDetailBo = new XfConsumeDetailBo();
|
|
|
+ consumeDetailBo.setConsumeId(consumeId);
|
|
|
+ consumeDetailBo.setCardValue(balance);
|
|
|
+
|
|
|
+ return consumeDetailService.updateByBoId(consumeDetailBo);
|
|
|
+ }
|
|
|
+ private PtBagVo updateBalance(ConsumptionBo bo, PtBagVo bagVo) {
|
|
|
+ PtBagBo bagBo = new PtBagBo();
|
|
|
+ bagBo.setUserId(bo.getUserId());
|
|
|
+ bagBo.setBagId(bagVo.getBagId());
|
|
|
+ bagBo.setBagCode(bo.getBagType());
|
|
|
+ bagBo.setReceiptMoney(bo.getOperatorMoney());
|
|
|
+ bagBo.setOperationMode(BalanceUpdateEnum.COMPENSATE);
|
|
|
+ return bagService.updateBalanceByBo(bagBo);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 消费记录处理时获取必要的辅助信息
|
|
|
+ *
|
|
|
+ * @param bo 资金收支信息
|
|
|
+ * @return 辅助信息列表
|
|
|
+ */
|
|
|
+ private List<Object> getOtherInfo(ConsumptionBo bo) {
|
|
|
+ List<Object> list = new ArrayList<>();
|
|
|
+ String message;
|
|
|
+ //1.人员辅助信息
|
|
|
+ PtUserAccountVo userAccountVo = userAccountService.queryById(bo.getUserId());
|
|
|
+ if (userAccountVo == null) {
|
|
|
+ message = MessageFormat.format("账户Id:[{0}],错扣补款失败!", bo.getUserId());
|
|
|
+ log.error(message);
|
|
|
+ throw new ConsumeException("consumption.userAccount.not.exists", message);
|
|
|
+ }
|
|
|
+ list.add(userAccountVo);
|
|
|
+ //2.卡片辅助信息
|
|
|
+ PtCardVo ptCardVo;
|
|
|
+ if (bo.getCardNo() != null && bo.getCardNo() > 0) {
|
|
|
+ //如果传入了cardNo,根据cardNo查询卡片信息
|
|
|
+ message = MessageFormat.format("卡流水号:[{0}]", bo.getCardNo());
|
|
|
+ ptCardVo = cardService.queryCardByCardNo(bo.getCardNo());
|
|
|
+ } else {
|
|
|
+ //查询当前人的正常主卡
|
|
|
+ message = MessageFormat.format("账户Id:{0}", bo.getUserId());
|
|
|
+ ptCardVo = cardService.queryMainCardByUserId(bo.getUserId());
|
|
|
+ }
|
|
|
+ if (ptCardVo == null) {
|
|
|
+ message = message + ",错扣补款失败!";
|
|
|
+ log.error(message);
|
|
|
+ throw new ConsumeException("consumption.userCard.not.exists", message);
|
|
|
+ }
|
|
|
+ list.add(ptCardVo);
|
|
|
+ //3.钱包辅助信息
|
|
|
+ PtBagVo ptBagVo = bagService.queryByUserBagCode(bo.getUserId(), bo.getBagType());
|
|
|
+ if (ptBagVo == null) {
|
|
|
+ message = MessageFormat.format("账户Id:[{0}],钱包类型:[{1}],错扣补款失败!", bo.getUserId(), bo.getBagType());
|
|
|
+ log.error(message);
|
|
|
+ throw new ConsumeException("consumption.userBag.not.exists", message);
|
|
|
+ }
|
|
|
+ list.add(ptBagVo);
|
|
|
+ //4.设备辅助信息
|
|
|
+ XfTermVo xfTermVo = termService.queryByNo(bo.getTermNo() == null ? 0 : bo.getTermNo());
|
|
|
+ if(xfTermVo == null) {
|
|
|
+ message = MessageFormat.format("不存编号为[{0}]的设备信息,错扣补款失败!", bo.getTermNo());
|
|
|
+ log.error(message);
|
|
|
+ throw new ConsumeException("consumption.xfTerm.not.exists",bo.getTermNo());
|
|
|
+ }
|
|
|
+ list.add(xfTermVo);
|
|
|
+
|
|
|
+ //5.餐类辅助信息
|
|
|
+ PtMealTypeVo mealTypeVo = mealTypeService.queryVoByTypeId(bo.getMealType().toString());
|
|
|
+ list.add(mealTypeVo);
|
|
|
+
|
|
|
+ return list;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 生成消费明细表的32位主键Id
|
|
|
+ *
|
|
|
+ * @param bo 资金收支信息
|
|
|
+ * @param accountVo 人员账户信息
|
|
|
+ * @param bagVo 账户钱包信息
|
|
|
+ * @return 生成的记录Id
|
|
|
+ */
|
|
|
+ @NotNull
|
|
|
+ private String getRecordKeyId(ConsumptionBo bo, PtUserAccountVo accountVo, PtBagVo bagVo) {
|
|
|
+ return RecordIdUtils.getRecordId(new Date(), Short.parseShort(bo.getTermNo().toString()), 0, accountVo.getUserNo().intValue(), Integer.parseInt(bagVo.getBagCode()));
|
|
|
+ }
|
|
|
+}
|