|
|
@@ -4,6 +4,7 @@ import cn.hutool.core.bean.BeanUtil;
|
|
|
import cn.hutool.core.date.DateUtil;
|
|
|
import cn.hutool.core.util.ObjUtil;
|
|
|
import cn.hutool.core.util.ObjectUtil;
|
|
|
+import cn.hutool.json.JSONUtil;
|
|
|
import lombok.RequiredArgsConstructor;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.apache.dubbo.config.annotation.DubboReference;
|
|
|
@@ -37,6 +38,7 @@ import org.springframework.scheduling.annotation.Async;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
+import java.math.BigDecimal;
|
|
|
import java.util.ArrayList;
|
|
|
import java.util.Date;
|
|
|
import java.util.List;
|
|
|
@@ -138,7 +140,7 @@ public class BaseBusiness {
|
|
|
List<XfConsumeDetailVo> detailVos = new ArrayList<>();
|
|
|
|
|
|
for (PtBagVo bagVo : bagVos) {
|
|
|
- log.info("钱包代码:{},钱包余额:{},消费金额:{}", bagVo.getBagCode(), bagVo.getBalance(), bo.getConsumeMoney());
|
|
|
+ log.info("扣费钱包代码:{},钱包余额:{},消费金额:{}", bagVo.getBagCode(), bagVo.getBalance(), bo.getConsumeMoney());
|
|
|
XfConsumeDetailVo vo = createConsumeRecord(bo, userAccountVo, cardVo, bagVo, termVo, mealTypeVo, remark);
|
|
|
// 多钱包扣费时,只要有一个钱包入消费明细表失败,则都失败
|
|
|
if (ObjUtil.isEmpty(vo)) {
|
|
|
@@ -153,21 +155,24 @@ public class BaseBusiness {
|
|
|
return R.fail(errorInfo);
|
|
|
}
|
|
|
// 2.更新人员日统计表
|
|
|
+ log.info("[上传交易]-[更新人员日统计表]-[{}]", JSONUtil.toJsonStr(bo));
|
|
|
if (!createOrUpdateUserTotal(bo, userAccountVo, cardVo)) {
|
|
|
return R.fail(new ErrorInfo(400, ApiErrorTypeConstants.EXCEPTION, "更新个人日统计表失败", ""));
|
|
|
}
|
|
|
// 3.更新设备日统计表
|
|
|
+ log.info("[上传交易]-[更新设备日统计表]-[{}]", JSONUtil.toJsonStr(bo));
|
|
|
if (!createOrUpdateTermTotal(bo, termVo, mealTypeVo)) {
|
|
|
return R.fail(new ErrorInfo(400, ApiErrorTypeConstants.EXCEPTION, "更新设备日统计表失败", ""));
|
|
|
}
|
|
|
// 4.更新钱包余额
|
|
|
+ log.info("[上传交易]-[更新钱包余额]-[{}]", JSONUtil.toJsonStr(bo));
|
|
|
if (!updateBagBalance(bagVos)) {
|
|
|
return R.fail(new ErrorInfo(400, ApiErrorTypeConstants.EXCEPTION, "更新钱包余额表失败", ""));
|
|
|
}
|
|
|
|
|
|
// 5.发送一条消费记录到kafka(教务就餐打卡)
|
|
|
if (ObjectUtil.equals(defaultConfig.getLocationFlag(), DefaultConstants.LOCAL_FLAG)) {
|
|
|
- this.sendConsumeToKafka(detailVos,userAccountVo);
|
|
|
+ this.sendConsumeToKafka(detailVos, userAccountVo);
|
|
|
}
|
|
|
return R.ok();
|
|
|
}
|
|
|
@@ -212,7 +217,7 @@ public class BaseBusiness {
|
|
|
CreditTypeEnum creditType = CreditTypeEnum.fromCode(bo.getCreditType());
|
|
|
if (creditType != null) {
|
|
|
switch (creditType) {
|
|
|
- case TERM_CONSUME,HAND_CONSUME:
|
|
|
+ case TERM_CONSUME, HAND_CONSUME:
|
|
|
termTotalBo.setMealCount(1L);
|
|
|
termTotalBo.setMealAmount(bo.getConsumeMoney());
|
|
|
break;
|
|
|
@@ -235,30 +240,36 @@ public class BaseBusiness {
|
|
|
public boolean updateBagBalance(List<PtBagVo> bagVos) {
|
|
|
AtomicReference<Boolean> result = new AtomicReference<>();
|
|
|
bagVos.parallelStream().forEach(bagVo -> {
|
|
|
- PtBagBo bagBo = new PtBagBo();
|
|
|
- bagBo.setUserId(bagVo.getUserId());
|
|
|
- bagBo.setBagId(bagVo.getBagId());
|
|
|
- bagBo.setBagCode(bagVo.getBagCode());
|
|
|
- bagBo.setReceiptMoney(bagVo.getReceiptMoney());
|
|
|
- bagBo.setOperationMode(BalanceUpdateEnum.CONSUME);
|
|
|
- PtBagVo vo = bagService.updateBalanceByBo(bagBo);
|
|
|
- // 多钱包更新余额时,只要有一个钱包更新余额失败,则都失败
|
|
|
- if (ObjUtil.isEmpty(vo)) {
|
|
|
- result.set(false);
|
|
|
+ if (bagVo.getReceiptMoney().compareTo(BigDecimal.ZERO) == 0) {
|
|
|
+ // 如果操作金额为0,不操作钱包余额
|
|
|
+ result.set(true);
|
|
|
+ } else {
|
|
|
+ PtBagBo bagBo = new PtBagBo();
|
|
|
+ bagBo.setUserId(bagVo.getUserId());
|
|
|
+ bagBo.setBagId(bagVo.getBagId());
|
|
|
+ bagBo.setBagCode(bagVo.getBagCode());
|
|
|
+ bagBo.setReceiptMoney(bagVo.getReceiptMoney());
|
|
|
+ bagBo.setOperationMode(BalanceUpdateEnum.CONSUME);
|
|
|
+ PtBagVo vo = bagService.updateBalanceByBo(bagBo);
|
|
|
+ // 多钱包更新余额时,只要有一个钱包更新余额失败,则都失败
|
|
|
+ if (ObjUtil.isEmpty(vo)) {
|
|
|
+ result.set(false);
|
|
|
+ }
|
|
|
+ result.set(true);
|
|
|
}
|
|
|
- result.set(true);
|
|
|
});
|
|
|
return result.get();
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 请求云端消费业务的kafka消息推送
|
|
|
+ *
|
|
|
* @param bo 请求消费数据
|
|
|
*/
|
|
|
@Async
|
|
|
- public void sendCloudConsume(ConsumptionBo bo){
|
|
|
+ public void sendCloudConsume(ConsumptionBo bo) {
|
|
|
kafkaNormalProducer.sendKafkaMessage(KafkaTopicConstants.TO_CLOUD_TOPIC, EventTypeConstants.CONSUME, EventSenderEnum.CONSUME.code(), bo);
|
|
|
- //kafkaNormalProducer.sendKafkaMessage("test", EventTypeConstants.CONSUME, EventSenderEnum.CONSUME.code(), bo);
|
|
|
+ // kafkaNormalProducer.sendKafkaMessage("test", EventTypeConstants.CONSUME, EventSenderEnum.CONSUME.code(), bo);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -290,7 +301,7 @@ public class BaseBusiness {
|
|
|
consumeDetailBo.setConsumeDate(bo.getConsumeDate());
|
|
|
consumeDetailBo.setConsumeMoney(bo.getConsumeMoney());
|
|
|
consumeDetailBo.setConsumeBalance(bo.getBalance());
|
|
|
- //consumeDetailBo.setCardValue(bagVo.getBalance());
|
|
|
+ // consumeDetailBo.setCardValue(bagVo.getBalance());
|
|
|
// 设置卡片信息
|
|
|
consumeDetailBo.setCardNo(cardVo.getCardNo());
|
|
|
consumeDetailBo.setFactoryId(cardVo.getFactoryId());
|
|
|
@@ -317,51 +328,56 @@ public class BaseBusiness {
|
|
|
consumeDetailBo.setTenantId(bo.getTenantId());
|
|
|
|
|
|
return consumeDetailService.createConsumeDetailRecord(consumeDetailBo);
|
|
|
- } catch (Exception ex){
|
|
|
- log.error("消费明细入库错误",ex);
|
|
|
+ } catch (Exception ex) {
|
|
|
+ log.error("消费明细入库错误", ex);
|
|
|
return null;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 查询指定日期的消费对账记录
|
|
|
+ *
|
|
|
* @param consumeDate 消费日期
|
|
|
* @return 消费记录
|
|
|
*/
|
|
|
- public List<ConsumptionBo> selectOriginalReconciliation(Date consumeDate){
|
|
|
+ public List<ConsumptionBo> selectOriginalReconciliation(Date consumeDate) {
|
|
|
return TenantHelper.ignore(() -> originalService.selectReconciliationData(consumeDate));
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 查询注册信息,用来检查客户的公钥和么钥
|
|
|
*/
|
|
|
- public void getRegisterInfo(){
|
|
|
- if (ObjectUtil.isEmpty(RedisUtils.getCacheObject(CacheNames.CUSTOM_PUB_KEY)) || ObjectUtil.isEmpty(RedisUtils.getCacheObject(CacheNames.CUSTOM_PRI_KEY))) {
|
|
|
+ public void getRegisterInfo() {
|
|
|
+ if (ObjectUtil.isEmpty(RedisUtils.getCacheObject(CacheNames.CUSTOM_PUB_KEY)) || ObjectUtil.isEmpty(
|
|
|
+ RedisUtils.getCacheObject(CacheNames.CUSTOM_PRI_KEY))) {
|
|
|
remoteRegisterInfoService.queryRegisterInfo();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 根据消费记录的状态标志获取
|
|
|
+ *
|
|
|
* @param statusFlag 状态标志
|
|
|
- * 1,4--消费机消费=25000
|
|
|
- * 3-消费补扣=25020
|
|
|
- * 0-错扣补款=25010
|
|
|
+ * 1,4--消费机消费=25000
|
|
|
+ * 3-消费补扣=25020
|
|
|
+ * 0-错扣补款=25010
|
|
|
* @return 根据状态转换的消费类型
|
|
|
*/
|
|
|
- public Integer getCreditType(Integer statusFlag){
|
|
|
+ public Integer getCreditType(Integer statusFlag) {
|
|
|
return switch (statusFlag) {
|
|
|
case 0 -> CreditTypeEnum.ERROR_FILL.code();
|
|
|
case 3 -> CreditTypeEnum.HAND_CONSUME.code();
|
|
|
default -> CreditTypeEnum.TERM_CONSUME.code();
|
|
|
};
|
|
|
}
|
|
|
+
|
|
|
/**
|
|
|
* 将消费信息发送到kafka,教务消费此消息实现就餐打卡
|
|
|
+ *
|
|
|
* @param consumeList 消费记录列表
|
|
|
- * @param accountVo 消费人员信息
|
|
|
+ * @param accountVo 消费人员信息
|
|
|
*/
|
|
|
- private void sendConsumeToKafka(List<XfConsumeDetailVo> consumeList,RemoteUserAccountVo accountVo){
|
|
|
+ private void sendConsumeToKafka(List<XfConsumeDetailVo> consumeList, RemoteUserAccountVo accountVo) {
|
|
|
for (XfConsumeDetailVo vo : consumeList) {
|
|
|
YcPushConsumeInfoVo ycSendConsumeInfo = new YcPushConsumeInfoVo();
|
|
|
ycSendConsumeInfo.setRecordId(vo.getRecordId().toString());
|
|
|
@@ -387,7 +403,8 @@ public class BaseBusiness {
|
|
|
ycSendConsumeInfo.setTermRecordID(vo.getTermRecordId());
|
|
|
ycSendConsumeInfo.setPosRecordState(vo.getRecordStatus().intValue());
|
|
|
|
|
|
- kafkaNormalProducer.sendKafkaMessage(KafkaTopicConstants.OLD_SYNC_TOPIC, EventTypeConstants.CONSUME_RECORD, EventSenderEnum.OLD.code(), ycSendConsumeInfo);
|
|
|
+ kafkaNormalProducer.sendKafkaMessage(KafkaTopicConstants.OLD_SYNC_TOPIC, EventTypeConstants.CONSUME_RECORD, EventSenderEnum.OLD.code(),
|
|
|
+ ycSendConsumeInfo);
|
|
|
}
|
|
|
}
|
|
|
}
|