|
|
@@ -0,0 +1,247 @@
|
|
|
+package org.dromara.backstage.business.consume;
|
|
|
+
|
|
|
+import cn.hutool.core.bean.BeanUtil;
|
|
|
+import cn.hutool.core.date.DateUtil;
|
|
|
+import lombok.RequiredArgsConstructor;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+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.bo.*;
|
|
|
+import org.dromara.backstage.consumption.domain.vo.*;
|
|
|
+import org.dromara.backstage.consumption.service.*;
|
|
|
+import org.dromara.backstage.payment.domain.bo.PtBagBo;
|
|
|
+import org.dromara.backstage.payment.domain.bo.PtUserAccountBo;
|
|
|
+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.enums.SystemUseTypeEnum;
|
|
|
+import org.dromara.common.core.utils.RecordIdUtils;
|
|
|
+import org.jetbrains.annotations.NotNull;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+
|
|
|
+import java.math.BigDecimal;
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.Date;
|
|
|
+import java.util.List;
|
|
|
+
|
|
|
+/**
|
|
|
+ * name: ConsumeBusiness
|
|
|
+ * package: org.dromara.backstage.business.consume
|
|
|
+ * description: 消费业务处理逻辑
|
|
|
+ * date: 2024-10-14 10:30:27 10:30
|
|
|
+ *
|
|
|
+ * @author luoyibo
|
|
|
+ * @version 0.1
|
|
|
+ * @since JDK 1.8
|
|
|
+ */
|
|
|
+@RequiredArgsConstructor
|
|
|
+@Service
|
|
|
+@Slf4j
|
|
|
+public class ConsumeBusiness {
|
|
|
+
|
|
|
+ private final IXfConsumeDetailOriginalService consumeDetailOriginalService;
|
|
|
+ private final IXfConsumeDetailService consumeDetailService;
|
|
|
+ private final IPtUserAccountService userAccountService;
|
|
|
+ private final IPtCardService cardService;
|
|
|
+ private final IXfTermService termService;
|
|
|
+ private final IPtMealtypeService mealTypeService;
|
|
|
+ private final IPtBagService bagService;
|
|
|
+ private final IXfUserTotalService userTotalService;
|
|
|
+ private final IXfTermTotalService termTotalService;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 将消费机上传的消费数据转换成系统的消费业务对象
|
|
|
+ *
|
|
|
+ * @param recordBo 消费记录数据
|
|
|
+ * @return 消费业务对象
|
|
|
+ */
|
|
|
+ public ConsumptionBo recordToBusiness(ConsumeRecordBo recordBo) {
|
|
|
+ ConsumptionBo consumptionBo = new ConsumptionBo();
|
|
|
+
|
|
|
+ consumptionBo.setConsumeMoney(recordBo.getConsumeValue());
|
|
|
+ consumptionBo.setConsumeDate(recordBo.getConsumeDate());
|
|
|
+ consumptionBo.setTermRecordId(recordBo.getTermRecordID());
|
|
|
+ if (recordBo.getOriRecordID() != 0) {
|
|
|
+ consumptionBo.setRecordId(recordBo.getOriRecordID());
|
|
|
+ }
|
|
|
+ consumptionBo.setCardNo(recordBo.getCardID());
|
|
|
+ consumptionBo.setFactoryId(recordBo.getFactoryFixID());
|
|
|
+ consumptionBo.setUserId(recordBo.getEmployeeID());
|
|
|
+ consumptionBo.setUserNumb(recordBo.getEmployeeStrID());
|
|
|
+ consumptionBo.setRealName(recordBo.getEmployeeName());
|
|
|
+ consumptionBo.setRecordStatus(recordBo.getPosRecordState().longValue());
|
|
|
+ Long termNo = recordBo.getTermID() == null ? recordBo.getMathineTermID() : recordBo.getTermID();
|
|
|
+ consumptionBo.setTermNo(termNo);
|
|
|
+ consumptionBo.setCreditType(recordBo.getCreditType());
|
|
|
+ return consumptionBo;
|
|
|
+ }
|
|
|
+
|
|
|
+ public XfConsumeDetailOriginalVo createConsumeOriginalRecord(ConsumptionBo consumeBo, PtUserAccountVo accountVo) {
|
|
|
+ String originalId = getRecordKeyId(consumeBo.getTermNo().intValue(), consumeBo.getTermRecordId(), accountVo.getUserNo(), 0);
|
|
|
+
|
|
|
+ XfConsumeDetailOriginalBo originalBo = new XfConsumeDetailOriginalBo();
|
|
|
+ BeanUtil.copyProperties(consumeBo, originalBo);
|
|
|
+ originalBo.setOriginalId(originalId);
|
|
|
+ originalBo.setDataFlag(0L);
|
|
|
+ originalBo.setAnalysisFlag(0L);
|
|
|
+ //这项实际要根据消费的扣款模式来赋值
|
|
|
+ BigDecimal cardValue = this.getAccountBalance(consumeBo, accountVo);
|
|
|
+ originalBo.setCardValue(cardValue);
|
|
|
+ originalBo.setConsumeBalance(cardValue);
|
|
|
+ originalBo.setDigitalSign("补助消费");
|
|
|
+ originalBo.setUserId(accountVo.getUserId());
|
|
|
+
|
|
|
+ consumeDetailOriginalService.insertByBo(originalBo);
|
|
|
+
|
|
|
+ return consumeDetailOriginalService.queryById(originalBo.getOriginalId());
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 生成消费明细表的32位主键Id
|
|
|
+ *
|
|
|
+ * @param termNo 设备编号
|
|
|
+ * @param termRecordId 设备流水号
|
|
|
+ * @param userNo 人员流水号
|
|
|
+ * @return 生成的记录Id
|
|
|
+ */
|
|
|
+ @NotNull
|
|
|
+ private String getRecordKeyId(Integer termNo, Long termRecordId, Long userNo, Integer bagCode) {
|
|
|
+ return RecordIdUtils.getRecordId(new Date(), termNo.shortValue(), termRecordId.shortValue(), userNo.intValue(), bagCode);
|
|
|
+ }
|
|
|
+
|
|
|
+ public PtUserAccountVo getPtUserAccountVo(ConsumptionBo recordBo) {
|
|
|
+ return userAccountService.queryByNameAndNumb(recordBo.getRealName(),recordBo.getUserNumb());
|
|
|
+ }
|
|
|
+
|
|
|
+ public PtCardVo getPtCardVo(ConsumptionBo recordBo) {
|
|
|
+ PtCardVo ptCardVo;
|
|
|
+ if (recordBo.getCardNo() != null && recordBo.getCardNo() > 0) {
|
|
|
+ //如果传入了cardNo,根据cardNo查询卡片信息
|
|
|
+ ptCardVo = cardService.queryCardByCardNo(recordBo.getCardNo());
|
|
|
+ } else {
|
|
|
+ //查询当前人的正常主卡
|
|
|
+ ptCardVo = cardService.queryMainCardByUserId(recordBo.getUserId());
|
|
|
+ }
|
|
|
+ return ptCardVo;
|
|
|
+ }
|
|
|
+
|
|
|
+ public XfTermVo getXfTermVo(ConsumptionBo recordBo) {
|
|
|
+ return termService.queryByNo(recordBo.getTermNo());
|
|
|
+ }
|
|
|
+
|
|
|
+ public PtMealTypeVo getMealTypeVo(ConsumptionBo recordBo) {
|
|
|
+ PtMealTypeVo vo = mealTypeService.queryVoByTime(DateUtil.format(recordBo.getConsumeDate(), "HH:mm:ss"));
|
|
|
+ if (vo == null) {
|
|
|
+ vo = new PtMealTypeVo();
|
|
|
+ vo.setTypeId("0");
|
|
|
+ vo.setMealName("未知");
|
|
|
+ }
|
|
|
+ return vo;
|
|
|
+ }
|
|
|
+
|
|
|
+ public List<PtBagVo> getBagVo(PtUserAccountVo userAccountVo, XfTermVo xfTermVo) {
|
|
|
+ // TODO 2024-10-14 15:18:58 luoyibo 这里实际需要根据消费机的扣费类型来获取消费钱包,暂时写死为补助钱包
|
|
|
+ PtBagVo vo = bagService.queryByUserBagCode(userAccountVo.getUserId(), "3");
|
|
|
+ List<PtBagVo> list = new ArrayList<>();
|
|
|
+ list.add(vo);
|
|
|
+ return list;
|
|
|
+ }
|
|
|
+
|
|
|
+ public BigDecimal getAccountBalance(ConsumptionBo recordBo,PtUserAccountVo userAccountVo) {
|
|
|
+ BigDecimal beforeValue = new BigDecimal(bagService.selectAccountBalanceByIds(userAccountVo.getUserId().toString()));
|
|
|
+ return beforeValue.subtract(recordBo.getConsumeMoney());
|
|
|
+ }
|
|
|
+
|
|
|
+ public XfConsumeDetailVo createConsumeRecord(ConsumptionBo bo, PtUserAccountVo userAccountVo, PtCardVo cardVo, PtBagVo bagVo, XfTermVo termVo, PtMealTypeVo mealTypeVo, String remark) {
|
|
|
+ String recordId = getRecordKeyId(termVo.getTermNo().intValue(), bo.getTermNo(), userAccountVo.getUserNo(), Integer.valueOf(bagVo.getBagCode()));
|
|
|
+ XfConsumeDetailBo consumeDetailBo = new XfConsumeDetailBo();
|
|
|
+ BeanUtil.copyProperties(bo, consumeDetailBo);
|
|
|
+ consumeDetailBo.setConsumeId(recordId);
|
|
|
+ //设置消费账户信息
|
|
|
+ BeanUtil.copyProperties(userAccountVo, consumeDetailBo);
|
|
|
+ //设置消费信息
|
|
|
+ consumeDetailBo.setConsumeDate(bo.getConsumeDate());
|
|
|
+ //设置卡片信息
|
|
|
+ consumeDetailBo.setCardNo(cardVo.getCardNo());
|
|
|
+ consumeDetailBo.setFactoryId(cardVo.getFactoryId());
|
|
|
+ BigDecimal cardValue = this.getAccountBalance(bo, userAccountVo);
|
|
|
+ consumeDetailBo.setCardValue(cardValue);
|
|
|
+ consumeDetailBo.setConsumeBalance(cardValue);
|
|
|
+ //设置设备信息
|
|
|
+ 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());
|
|
|
+ //错扣补款设置statusFlag为0
|
|
|
+ consumeDetailBo.setRecordId(bo.getRecordId());
|
|
|
+ consumeDetailBo.setRemark(remark);
|
|
|
+
|
|
|
+ return consumeDetailService.createConsumeDetailRecord(consumeDetailBo);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 创建或更新人员日统计表
|
|
|
+ *
|
|
|
+ * @param bo 消费业务对象
|
|
|
+ * @param accountVo 人员账户视图
|
|
|
+ * @param cardVo 账户卡片视图
|
|
|
+ * @return 更新后的人员日统计表
|
|
|
+ */
|
|
|
+ public XfUserTotalVo createOrUpdateUserTotal(ConsumptionBo bo, PtUserAccountVo accountVo, PtCardVo cardVo) {
|
|
|
+ XfUserTotalBo xfUserTotalBo = new XfUserTotalBo();
|
|
|
+ BeanUtil.copyProperties(accountVo, xfUserTotalBo);
|
|
|
+ xfUserTotalBo.setDeptName(accountVo.getDeptName());
|
|
|
+ xfUserTotalBo.setCardNo(cardVo.getCardNo());
|
|
|
+ xfUserTotalBo.setDateDay(DateUtil.format(new Date(), "yyyy-MM-dd"));
|
|
|
+ xfUserTotalBo.setUseType(SystemUseTypeEnum.CONSUME.code());
|
|
|
+ xfUserTotalBo.setConsumeMoney(bo.getConsumeMoney());
|
|
|
+
|
|
|
+ return userTotalService.createOrUpdateUserTotal(xfUserTotalBo);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 创建或更新设备日统计
|
|
|
+ *
|
|
|
+ * @param bo 消费业务对象
|
|
|
+ * @param termVo 设备视图
|
|
|
+ * @param mealTypeVo 餐类视图
|
|
|
+ * @return 日统计视图
|
|
|
+ */
|
|
|
+ public XfTermTotalVo createOrUpdateTermTotal(ConsumptionBo bo, XfTermVo termVo, PtMealTypeVo mealTypeVo) {
|
|
|
+ XfTermTotalBo termTotalBo = new XfTermTotalBo();
|
|
|
+ BeanUtil.copyProperties(termVo, termTotalBo);
|
|
|
+ termTotalBo.setDateDay(DateUtil.format(new Date(), "yyyy-MM-dd"));
|
|
|
+ termTotalBo.setMealType(Long.valueOf(mealTypeVo.getTypeId()));
|
|
|
+ termTotalBo.setMealCount(1L);
|
|
|
+ termTotalBo.setMealAmount(bo.getConsumeMoney());
|
|
|
+ termTotalBo.setUseType(SystemUseTypeEnum.CONSUME.code());
|
|
|
+
|
|
|
+ return termTotalService.createOrUpdateTermTotal(termTotalBo);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 更新账户钱包余额
|
|
|
+ *
|
|
|
+ * @param bo 消费业务对象
|
|
|
+ * @param bagVo 账户钱包视图
|
|
|
+ * @return 更新后的账户钱包
|
|
|
+ */
|
|
|
+ public PtBagVo updateBalance(ConsumptionBo bo, PtBagVo bagVo) {
|
|
|
+ PtBagBo bagBo = new PtBagBo();
|
|
|
+ bagBo.setUserId(bagVo.getUserId());
|
|
|
+ bagBo.setBagId(bagVo.getBagId());
|
|
|
+ bagBo.setBagCode(bagVo.getBagCode());
|
|
|
+ bagBo.setReceiptMoney(bo.getConsumeMoney());
|
|
|
+ bagBo.setOperationMode(BalanceUpdateEnum.CONSUME);
|
|
|
+ return bagService.updateBalanceByBo(bagBo);
|
|
|
+ }
|
|
|
+}
|