|
@@ -7,18 +7,33 @@ import lombok.RequiredArgsConstructor;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.apache.dubbo.config.annotation.DubboReference;
|
|
import org.apache.dubbo.config.annotation.DubboReference;
|
|
|
import org.dromara.backstage.api.RemoteCardService;
|
|
import org.dromara.backstage.api.RemoteCardService;
|
|
|
|
|
+import org.dromara.backstage.api.RemoteMealTypeService;
|
|
|
|
|
+import org.dromara.backstage.api.RemoteOperatorService;
|
|
|
import org.dromara.backstage.api.RemoteUserAccountService;
|
|
import org.dromara.backstage.api.RemoteUserAccountService;
|
|
|
import org.dromara.backstage.api.domain.vo.RemoteCardVo;
|
|
import org.dromara.backstage.api.domain.vo.RemoteCardVo;
|
|
|
|
|
+import org.dromara.backstage.api.domain.vo.RemoteMealTypeVo;
|
|
|
|
|
+import org.dromara.backstage.api.domain.vo.RemoteOperatorVo;
|
|
|
import org.dromara.backstage.api.domain.vo.RemoteUserAccountVo;
|
|
import org.dromara.backstage.api.domain.vo.RemoteUserAccountVo;
|
|
|
|
|
+import org.dromara.common.core.constant.ApiErrorTypeConstants;
|
|
|
import org.dromara.common.core.domain.R;
|
|
import org.dromara.common.core.domain.R;
|
|
|
import org.dromara.common.core.domain.model.ErrorInfo;
|
|
import org.dromara.common.core.domain.model.ErrorInfo;
|
|
|
|
|
+import org.dromara.common.core.utils.RecordIdUtils;
|
|
|
import org.dromara.server.common.domain.consume.bo.ConsumptionBo;
|
|
import org.dromara.server.common.domain.consume.bo.ConsumptionBo;
|
|
|
|
|
+import org.dromara.server.consume.domain.vo.PtBagVo;
|
|
|
|
|
+import org.dromara.server.consume.domain.vo.XfConsumeDetailOriginalVo;
|
|
|
|
|
+import org.dromara.server.consume.domain.vo.XfConsumeDetailVo;
|
|
|
import org.dromara.server.consume.domain.vo.XfTermVo;
|
|
import org.dromara.server.consume.domain.vo.XfTermVo;
|
|
|
|
|
+import org.dromara.server.consume.service.IPtBagService;
|
|
|
|
|
+import org.dromara.server.consume.service.IXfConsumeDetailOriginalService;
|
|
|
|
|
+import org.dromara.server.consume.service.IXfConsumeDetailService;
|
|
|
import org.dromara.server.consume.service.IXfTermService;
|
|
import org.dromara.server.consume.service.IXfTermService;
|
|
|
import org.jetbrains.annotations.NotNull;
|
|
import org.jetbrains.annotations.NotNull;
|
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
|
|
|
|
+import java.math.BigDecimal;
|
|
|
import java.text.MessageFormat;
|
|
import java.text.MessageFormat;
|
|
|
|
|
+import java.util.ArrayList;
|
|
|
|
|
+import java.util.List;
|
|
|
import java.util.Objects;
|
|
import java.util.Objects;
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -39,8 +54,15 @@ public class CheckBusiness {
|
|
|
private final RemoteCardService remoteCardService;
|
|
private final RemoteCardService remoteCardService;
|
|
|
@DubboReference
|
|
@DubboReference
|
|
|
private final RemoteUserAccountService remoteUserAccountService;
|
|
private final RemoteUserAccountService remoteUserAccountService;
|
|
|
|
|
+ @DubboReference
|
|
|
|
|
+ private final RemoteMealTypeService remoteMealTypeService;
|
|
|
|
|
+ @DubboReference
|
|
|
|
|
+ private final RemoteOperatorService remoteOperatorService;
|
|
|
|
|
|
|
|
private final IXfTermService termService;
|
|
private final IXfTermService termService;
|
|
|
|
|
+ private final IXfConsumeDetailOriginalService consumeDetailOriginalService;
|
|
|
|
|
+ private final IXfConsumeDetailService consumeDetailService;
|
|
|
|
|
+ private final IPtBagService bagService;
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
* 消费记录参数检检查
|
|
* 消费记录参数检检查
|
|
@@ -52,14 +74,15 @@ public class CheckBusiness {
|
|
|
*/
|
|
*/
|
|
|
public R<ErrorInfo> checkParam(ConsumptionBo bo) {
|
|
public R<ErrorInfo> checkParam(ConsumptionBo bo) {
|
|
|
ErrorInfo errorInfo;
|
|
ErrorInfo errorInfo;
|
|
|
- //检查设备机号
|
|
|
|
|
|
|
+ // 检查设备机号
|
|
|
if (ObjectUtil.isEmpty(bo.getTermNo()) || bo.getTermNo() == 0) {
|
|
if (ObjectUtil.isEmpty(bo.getTermNo()) || bo.getTermNo() == 0) {
|
|
|
errorInfo = new ErrorInfo(1, "", "设备机号不正确", "设备机号必须大于零!");
|
|
errorInfo = new ErrorInfo(1, "", "设备机号不正确", "设备机号必须大于零!");
|
|
|
return R.fail(errorInfo);
|
|
return R.fail(errorInfo);
|
|
|
}
|
|
}
|
|
|
- //检查交易人员标识
|
|
|
|
|
|
|
+ // 检查交易人员标识
|
|
|
if (bo.getCardNo() <= 0 && bo.getFactoryId() == 0 && bo.getUserNo() <= 0 && StrUtil.isEmpty(bo.getUserNumb())) {
|
|
if (bo.getCardNo() <= 0 && bo.getFactoryId() == 0 && bo.getUserNo() <= 0 && StrUtil.isEmpty(bo.getUserNumb())) {
|
|
|
- errorInfo = new ErrorInfo(1, "", "交易人员标识不满足", "必须提供 [CardNo | FactoryId | userNo | userNumb] 中至少1项来标识交易用户");
|
|
|
|
|
|
|
+ errorInfo = new ErrorInfo(1, "", "交易人员标识不满足",
|
|
|
|
|
+ "必须提供 [CardNo | FactoryId | userNo | userNumb] 中至少1项来标识交易用户");
|
|
|
return R.fail(errorInfo);
|
|
return R.fail(errorInfo);
|
|
|
}
|
|
}
|
|
|
return R.ok();
|
|
return R.ok();
|
|
@@ -70,51 +93,73 @@ public class CheckBusiness {
|
|
|
*
|
|
*
|
|
|
* @param bo 消费记录
|
|
* @param bo 消费记录
|
|
|
* @param userAccountVo 消费账户
|
|
* @param userAccountVo 消费账户
|
|
|
- * @param userCardVo 消费卡片
|
|
|
|
|
- * @param useTermVo 消费设备
|
|
|
|
|
|
|
+ * @param userCardVo 消费卡片
|
|
|
|
|
+ * @param useTermVo 消费设备
|
|
|
* @return 验证结果
|
|
* @return 验证结果
|
|
|
*/
|
|
*/
|
|
|
- public R<ErrorInfo> checkUser(ConsumptionBo bo, RemoteUserAccountVo userAccountVo, RemoteCardVo userCardVo, XfTermVo useTermVo) {
|
|
|
|
|
- long termNo = ObjectUtil.isEmpty(bo.getTermNo())? 0 : bo.getTermNo();
|
|
|
|
|
|
|
+ public R<ErrorInfo> checkUser(ConsumptionBo bo, RemoteUserAccountVo userAccountVo, RemoteCardVo userCardVo,
|
|
|
|
|
+ XfTermVo useTermVo) {
|
|
|
|
|
+ long termNo = ObjectUtil.isEmpty(bo.getTermNo()) ? 0 : bo.getTermNo();
|
|
|
long cardNo = ObjectUtil.isEmpty(bo.getCardNo()) ? 0 : bo.getCardNo();
|
|
long cardNo = ObjectUtil.isEmpty(bo.getCardNo()) ? 0 : bo.getCardNo();
|
|
|
long factoryId = ObjectUtil.isEmpty(bo.getFactoryId()) ? 0 : bo.getFactoryId();
|
|
long factoryId = ObjectUtil.isEmpty(bo.getFactoryId()) ? 0 : bo.getFactoryId();
|
|
|
long userNo = ObjectUtil.isEmpty(bo.getUserNo()) ? 0 : bo.getUserNo();
|
|
long userNo = ObjectUtil.isEmpty(bo.getUserNo()) ? 0 : bo.getUserNo();
|
|
|
String userNumb = bo.getUserNumb() == null ? null : bo.getUserNumb();
|
|
String userNumb = bo.getUserNumb() == null ? null : bo.getUserNumb();
|
|
|
- XfTermVo termVo = termService.queryVoOneByNo(termNo);
|
|
|
|
|
- if(ObjectUtil.isEmpty(termVo)){
|
|
|
|
|
- ErrorInfo errorInfo = new ErrorInfo(400, "", "设备不存在", MessageFormat.format("设备机号为[{0}]的设备不存在,不允许交易", termNo));
|
|
|
|
|
-
|
|
|
|
|
- return R.fail(errorInfo);
|
|
|
|
|
|
|
+ if (termNo > 0) {
|
|
|
|
|
+ R<ErrorInfo> result = checkTerm(bo, useTermVo);
|
|
|
|
|
+ if (R.isError(result)) {
|
|
|
|
|
+ return result;
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
- BeanUtil.copyProperties(termVo,useTermVo);
|
|
|
|
|
- //卡流水号检查
|
|
|
|
|
|
|
+ // 卡流水号检查
|
|
|
if (cardNo > 0) {
|
|
if (cardNo > 0) {
|
|
|
- return checkCardNo(bo,userAccountVo ,userCardVo );
|
|
|
|
|
|
|
+ return checkCardNo(bo, userAccountVo, userCardVo);
|
|
|
}
|
|
}
|
|
|
- //物理卡号检查
|
|
|
|
|
|
|
+ // 物理卡号检查
|
|
|
if (factoryId > 0) {
|
|
if (factoryId > 0) {
|
|
|
- return checkFactoryId(bo,userAccountVo ,userCardVo);
|
|
|
|
|
|
|
+ return checkFactoryId(bo, userAccountVo, userCardVo);
|
|
|
}
|
|
}
|
|
|
- //用户流水号检查
|
|
|
|
|
|
|
+ // 用户流水号检查
|
|
|
if (userNo > 0) {
|
|
if (userNo > 0) {
|
|
|
- return checkUserNo(bo,userAccountVo ,userCardVo);
|
|
|
|
|
|
|
+ return checkUserNo(bo, userAccountVo, userCardVo);
|
|
|
}
|
|
}
|
|
|
- //人员编号检查
|
|
|
|
|
|
|
+ // 人员编号检查
|
|
|
if (StrUtil.isNotEmpty(userNumb)) {
|
|
if (StrUtil.isNotEmpty(userNumb)) {
|
|
|
- return checkUserNumb(bo,userAccountVo ,userCardVo);
|
|
|
|
|
|
|
+ return checkUserNumb(bo, userAccountVo, userCardVo);
|
|
|
}
|
|
}
|
|
|
return R.ok();
|
|
return R.ok();
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 消费设备检查
|
|
|
|
|
+ *
|
|
|
|
|
+ * @param bo 消费记录
|
|
|
|
|
+ * @param useTermVo 消费设备
|
|
|
|
|
+ * @return 检查结果
|
|
|
|
|
+ */
|
|
|
|
|
+ public R<ErrorInfo> checkTerm(ConsumptionBo bo, XfTermVo useTermVo) {
|
|
|
|
|
+ long termNo = bo.getTermNo();
|
|
|
|
|
+ XfTermVo termVo = termService.queryVoOneByNo(termNo);
|
|
|
|
|
+ if (ObjectUtil.isEmpty(termVo)) {
|
|
|
|
|
+ ErrorInfo errorInfo = new ErrorInfo(400, "", "设备不存在",
|
|
|
|
|
+ MessageFormat.format("机号为[{0}]的设备不存在,不允许交易", termNo));
|
|
|
|
|
+
|
|
|
|
|
+ return R.fail(errorInfo);
|
|
|
|
|
+ }
|
|
|
|
|
+ BeanUtil.copyProperties(termVo, useTermVo);
|
|
|
|
|
+ return R.ok();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
/**
|
|
/**
|
|
|
* 消费逻辑检查,检查是否能消费
|
|
* 消费逻辑检查,检查是否能消费
|
|
|
- * @param bo 消费记录
|
|
|
|
|
|
|
+ *
|
|
|
|
|
+ * @param bo 消费记录
|
|
|
* @param userAccountVo 消费账户
|
|
* @param userAccountVo 消费账户
|
|
|
- * @param userCardVo 消费卡片
|
|
|
|
|
- * @param useTermVo 消费设备
|
|
|
|
|
|
|
+ * @param userCardVo 消费卡片
|
|
|
|
|
+ * @param useTermVo 消费设备
|
|
|
* @return 验证结果
|
|
* @return 验证结果
|
|
|
*/
|
|
*/
|
|
|
- public R<ErrorInfo> checkConsume(ConsumptionBo bo, RemoteUserAccountVo userAccountVo, RemoteCardVo userCardVo, XfTermVo useTermVo){
|
|
|
|
|
|
|
+ public R<ErrorInfo> checkConsume(ConsumptionBo bo, RemoteUserAccountVo userAccountVo, RemoteCardVo userCardVo,
|
|
|
|
|
+ XfTermVo useTermVo) {
|
|
|
// TODO 2024-11-03 14:36:42 luoyibo 1.获取传入的参数
|
|
// TODO 2024-11-03 14:36:42 luoyibo 1.获取传入的参数
|
|
|
// TODO 2024-11-03 14:36:42 luoyibo 2.卡有效性验证
|
|
// TODO 2024-11-03 14:36:42 luoyibo 2.卡有效性验证
|
|
|
// TODO 2024-11-03 14:39:21 luoyibo 3.消费账户状态验证
|
|
// TODO 2024-11-03 14:39:21 luoyibo 3.消费账户状态验证
|
|
@@ -123,11 +168,38 @@ public class CheckBusiness {
|
|
|
// TODO 2024-11-03 14:45:18 luoyibo 6.根据消费机的消费模式验证余额
|
|
// TODO 2024-11-03 14:45:18 luoyibo 6.根据消费机的消费模式验证余额
|
|
|
return R.ok();
|
|
return R.ok();
|
|
|
}
|
|
}
|
|
|
- /**
|
|
|
|
|
- * 验证后设置人员信息
|
|
|
|
|
- * @param bo 消费记录
|
|
|
|
|
- * @param accountVo 人员账户信息
|
|
|
|
|
- */
|
|
|
|
|
|
|
+
|
|
|
|
|
+ public R<ErrorInfo> checkBill(ConsumptionBo bo, RemoteUserAccountVo userAccountVo, RemoteCardVo userCardVo,
|
|
|
|
|
+ XfTermVo useTermVo, List<PtBagVo> bagVoList, RemoteMealTypeVo mealTypeVo,
|
|
|
|
|
+ RemoteOperatorVo operatorVo) {
|
|
|
|
|
+ R<ErrorInfo> result = checkCardNo(bo, userAccountVo, userCardVo);
|
|
|
|
|
+ if (R.isError(result)) {
|
|
|
|
|
+ return result;
|
|
|
|
|
+ }
|
|
|
|
|
+ result = checkOriginalRecord(bo);
|
|
|
|
|
+ if (R.isError(result)) {
|
|
|
|
|
+ return result;
|
|
|
|
|
+ }
|
|
|
|
|
+ // 获取餐类信息
|
|
|
|
|
+ RemoteMealTypeVo mealType = remoteMealTypeService.queryMealTypeVoByTime(bo.getConsumeDate());
|
|
|
|
|
+ if (ObjectUtil.isEmpty(mealType)) {
|
|
|
|
|
+ mealType.setTypeId("0");
|
|
|
|
|
+ mealType.setMealName("未知");
|
|
|
|
|
+ }
|
|
|
|
|
+ BeanUtil.copyProperties(mealType, mealTypeVo);
|
|
|
|
|
+ // 获取扣费钱包
|
|
|
|
|
+ List<PtBagVo> bagVos = new ArrayList<>();
|
|
|
|
|
+ result = checkDeductionBag(bo, userAccountVo, useTermVo, bagVos);
|
|
|
|
|
+ if (R.isError(result)) {
|
|
|
|
|
+ return result;
|
|
|
|
|
+ }
|
|
|
|
|
+ bagVoList.addAll(bagVos);
|
|
|
|
|
+ // 获取营业员信息
|
|
|
|
|
+ BeanUtil.copyProperties(getOperatorVo(bo), operatorVo);
|
|
|
|
|
+
|
|
|
|
|
+ return R.ok();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
private void setUserInfo(ConsumptionBo bo, RemoteUserAccountVo accountVo) {
|
|
private void setUserInfo(ConsumptionBo bo, RemoteUserAccountVo accountVo) {
|
|
|
bo.setRealName(StrUtil.isEmpty(accountVo.getRealName()) ? "----" : accountVo.getRealName());
|
|
bo.setRealName(StrUtil.isEmpty(accountVo.getRealName()) ? "----" : accountVo.getRealName());
|
|
|
bo.setUserNo(accountVo.getUserNo());
|
|
bo.setUserNo(accountVo.getUserNo());
|
|
@@ -140,25 +212,28 @@ public class CheckBusiness {
|
|
|
ErrorInfo errorInfo;
|
|
ErrorInfo errorInfo;
|
|
|
RemoteCardVo cardVo = remoteCardService.queryCardByCardNo(cardNo);
|
|
RemoteCardVo cardVo = remoteCardService.queryCardByCardNo(cardNo);
|
|
|
if (ObjectUtil.isEmpty(cardVo)) {
|
|
if (ObjectUtil.isEmpty(cardVo)) {
|
|
|
- errorInfo = new ErrorInfo(400, "", "卡片不存在", MessageFormat.format("流水号为[{0}]的卡片不存在,不允许交易", cardNo));
|
|
|
|
|
|
|
+ errorInfo = new ErrorInfo(400, ApiErrorTypeConstants.PARAM_ERROR, "卡片不存在",
|
|
|
|
|
+ MessageFormat.format("流水号为[{0}]的卡片不存在,不允许交易", cardNo));
|
|
|
|
|
|
|
|
return R.fail(errorInfo);
|
|
return R.fail(errorInfo);
|
|
|
}
|
|
}
|
|
|
if (!"1".equals(cardVo.getStatus())) {
|
|
if (!"1".equals(cardVo.getStatus())) {
|
|
|
- errorInfo = new ErrorInfo(400, "", "卡片状态不正确", MessageFormat.format("流水号为[{0}]的卡片状态不正确,不允许交易", cardNo));
|
|
|
|
|
|
|
+ errorInfo = new ErrorInfo(400, ApiErrorTypeConstants.PARAM_ERROR, "卡片状态不正确",
|
|
|
|
|
+ MessageFormat.format("流水号为[{0}]的卡片状态不正确,不允许交易", cardNo));
|
|
|
|
|
|
|
|
return R.fail(errorInfo);
|
|
return R.fail(errorInfo);
|
|
|
}
|
|
}
|
|
|
if (!Objects.equals(cardVo.getFactoryId(), bo.getFactoryId())) {
|
|
if (!Objects.equals(cardVo.getFactoryId(), bo.getFactoryId())) {
|
|
|
- errorInfo = new ErrorInfo(400, "", "卡片不正确", "物理卡不一致,不允许交易");
|
|
|
|
|
|
|
+ errorInfo = new ErrorInfo(400, ApiErrorTypeConstants.PARAM_ERROR, "卡片不正确",
|
|
|
|
|
+ "物理卡号不一致,不允许交易");
|
|
|
|
|
|
|
|
return R.fail(errorInfo);
|
|
return R.fail(errorInfo);
|
|
|
}
|
|
}
|
|
|
RemoteUserAccountVo accountVo = remoteUserAccountService.getUserAccountVoById(cardVo.getUserId());
|
|
RemoteUserAccountVo accountVo = remoteUserAccountService.getUserAccountVoById(cardVo.getUserId());
|
|
|
setUserInfo(bo, accountVo);
|
|
setUserInfo(bo, accountVo);
|
|
|
bo.setFactoryId(cardVo.getFactoryId());
|
|
bo.setFactoryId(cardVo.getFactoryId());
|
|
|
- BeanUtil.copyProperties(accountVo,userAccountVo);
|
|
|
|
|
- BeanUtil.copyProperties(cardVo,userCardVo);
|
|
|
|
|
|
|
+ BeanUtil.copyProperties(accountVo, userAccountVo);
|
|
|
|
|
+ BeanUtil.copyProperties(cardVo, userCardVo);
|
|
|
return R.ok();
|
|
return R.ok();
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -168,20 +243,23 @@ public class CheckBusiness {
|
|
|
Long factoryId = bo.getFactoryId();
|
|
Long factoryId = bo.getFactoryId();
|
|
|
RemoteCardVo cardVo = remoteCardService.queryCardByFactoryId(factoryId);
|
|
RemoteCardVo cardVo = remoteCardService.queryCardByFactoryId(factoryId);
|
|
|
if (ObjectUtil.isEmpty(cardVo)) {
|
|
if (ObjectUtil.isEmpty(cardVo)) {
|
|
|
- errorInfo = new ErrorInfo(400, "", "卡片不存在", MessageFormat.format("物理卡号为[{0}]的卡片不存在,不允许交易", factoryId));
|
|
|
|
|
|
|
+ errorInfo = new ErrorInfo(400, ApiErrorTypeConstants.PARAM_ERROR, "卡片不存在",
|
|
|
|
|
+ MessageFormat.format("物理卡号为[{0}]的卡片不存在,不允许交易", factoryId));
|
|
|
|
|
|
|
|
return R.fail(errorInfo);
|
|
return R.fail(errorInfo);
|
|
|
}
|
|
}
|
|
|
if (!"1".equals(cardVo.getStatus())) {
|
|
if (!"1".equals(cardVo.getStatus())) {
|
|
|
- errorInfo = new ErrorInfo(400, "", "卡片状态不正确", MessageFormat.format("物理卡号为[{0}]的卡片卡片状态不正确,不允许交易", factoryId));
|
|
|
|
|
|
|
+ errorInfo = new ErrorInfo(400, ApiErrorTypeConstants.PARAM_ERROR, "卡片状态不正确",
|
|
|
|
|
+ MessageFormat.format("物理卡号为[{0}]的卡片卡片状态不正确,不允许交易",
|
|
|
|
|
+ factoryId));
|
|
|
|
|
|
|
|
return R.fail(errorInfo);
|
|
return R.fail(errorInfo);
|
|
|
}
|
|
}
|
|
|
RemoteUserAccountVo accountVo = remoteUserAccountService.getUserAccountVoById(cardVo.getUserId());
|
|
RemoteUserAccountVo accountVo = remoteUserAccountService.getUserAccountVoById(cardVo.getUserId());
|
|
|
setUserInfo(bo, accountVo);
|
|
setUserInfo(bo, accountVo);
|
|
|
bo.setCardNo(cardVo.getCardNo());
|
|
bo.setCardNo(cardVo.getCardNo());
|
|
|
- BeanUtil.copyProperties(accountVo,userAccountVo);
|
|
|
|
|
- BeanUtil.copyProperties(cardVo,userCardVo);
|
|
|
|
|
|
|
+ BeanUtil.copyProperties(accountVo, userAccountVo);
|
|
|
|
|
+ BeanUtil.copyProperties(cardVo, userCardVo);
|
|
|
return R.ok();
|
|
return R.ok();
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -191,26 +269,29 @@ public class CheckBusiness {
|
|
|
Long userNo = bo.getUserNo();
|
|
Long userNo = bo.getUserNo();
|
|
|
RemoteUserAccountVo accountVo = remoteUserAccountService.getUserAccountVoByUserNo(userNo);
|
|
RemoteUserAccountVo accountVo = remoteUserAccountService.getUserAccountVoByUserNo(userNo);
|
|
|
if (ObjectUtil.isEmpty(accountVo)) {
|
|
if (ObjectUtil.isEmpty(accountVo)) {
|
|
|
- errorInfo = new ErrorInfo(400, "", "人员不存在", MessageFormat.format("流水号为[{0}]的人员不存在,不允许交易", userNo));
|
|
|
|
|
|
|
+ errorInfo = new ErrorInfo(400, ApiErrorTypeConstants.PARAM_ERROR, "人员不存在",
|
|
|
|
|
+ MessageFormat.format("流水号为[{0}]的人员不存在,不允许交易", userNo));
|
|
|
|
|
|
|
|
return R.fail(errorInfo);
|
|
return R.fail(errorInfo);
|
|
|
}
|
|
}
|
|
|
RemoteCardVo cardVo = remoteCardService.queryMainCardByUserId(accountVo.getUserId());
|
|
RemoteCardVo cardVo = remoteCardService.queryMainCardByUserId(accountVo.getUserId());
|
|
|
if (ObjectUtil.isEmpty(cardVo)) {
|
|
if (ObjectUtil.isEmpty(cardVo)) {
|
|
|
- errorInfo = new ErrorInfo(400, "", "卡片不存在", MessageFormat.format("流水号为[{0}]的人员卡片不存在,不允许交易", userNo));
|
|
|
|
|
|
|
+ errorInfo = new ErrorInfo(400, ApiErrorTypeConstants.PARAM_ERROR, "卡片不存在",
|
|
|
|
|
+ MessageFormat.format("流水号为[{0}]的人员卡片不存在,不允许交易", userNo));
|
|
|
|
|
|
|
|
return R.fail(errorInfo);
|
|
return R.fail(errorInfo);
|
|
|
}
|
|
}
|
|
|
if (!"1".equals(cardVo.getStatus())) {
|
|
if (!"1".equals(cardVo.getStatus())) {
|
|
|
- errorInfo = new ErrorInfo(400, "", "卡片状态不正确", MessageFormat.format("流水号为[{0}]的人员卡片状态不正确,不允许交易", userNo));
|
|
|
|
|
|
|
+ errorInfo = new ErrorInfo(400, ApiErrorTypeConstants.PARAM_ERROR, "卡片状态不正确",
|
|
|
|
|
+ MessageFormat.format("流水号为[{0}]的人员卡片状态不正确,不允许交易", userNo));
|
|
|
|
|
|
|
|
return R.fail(errorInfo);
|
|
return R.fail(errorInfo);
|
|
|
}
|
|
}
|
|
|
setUserInfo(bo, accountVo);
|
|
setUserInfo(bo, accountVo);
|
|
|
bo.setCardNo(cardVo.getCardNo());
|
|
bo.setCardNo(cardVo.getCardNo());
|
|
|
bo.setFactoryId(cardVo.getFactoryId());
|
|
bo.setFactoryId(cardVo.getFactoryId());
|
|
|
- BeanUtil.copyProperties(accountVo,userAccountVo);
|
|
|
|
|
- BeanUtil.copyProperties(cardVo,userCardVo);
|
|
|
|
|
|
|
+ BeanUtil.copyProperties(accountVo, userAccountVo);
|
|
|
|
|
+ BeanUtil.copyProperties(cardVo, userCardVo);
|
|
|
return R.ok();
|
|
return R.ok();
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -221,18 +302,21 @@ public class CheckBusiness {
|
|
|
RemoteUserAccountVo accountVo = remoteUserAccountService.getUserAccountVoByUserNumb(userNumb);
|
|
RemoteUserAccountVo accountVo = remoteUserAccountService.getUserAccountVoByUserNumb(userNumb);
|
|
|
|
|
|
|
|
if (ObjectUtil.isEmpty(accountVo)) {
|
|
if (ObjectUtil.isEmpty(accountVo)) {
|
|
|
- errorInfo = new ErrorInfo(400, "", "人员不存在", MessageFormat.format("编号为[{0}]的人员不存在,不允许交易", userNumb));
|
|
|
|
|
|
|
+ errorInfo = new ErrorInfo(400, ApiErrorTypeConstants.PARAM_ERROR, "人员不存在",
|
|
|
|
|
+ MessageFormat.format("编号为[{0}]的人员不存在,不允许交易", userNumb));
|
|
|
|
|
|
|
|
return R.fail(errorInfo);
|
|
return R.fail(errorInfo);
|
|
|
}
|
|
}
|
|
|
RemoteCardVo cardVo = remoteCardService.queryMainCardByUserId(accountVo.getUserId());
|
|
RemoteCardVo cardVo = remoteCardService.queryMainCardByUserId(accountVo.getUserId());
|
|
|
if (ObjectUtil.isEmpty(cardVo)) {
|
|
if (ObjectUtil.isEmpty(cardVo)) {
|
|
|
- errorInfo = new ErrorInfo(400, "", "卡片不存在", MessageFormat.format("编号为[{0}]的人员卡片不存在,不允许交易", userNumb));
|
|
|
|
|
|
|
+ errorInfo = new ErrorInfo(400, ApiErrorTypeConstants.PARAM_ERROR, "卡片不存在",
|
|
|
|
|
+ MessageFormat.format("编号为[{0}]的人员卡片不存在,不允许交易", userNumb));
|
|
|
|
|
|
|
|
return R.fail(errorInfo);
|
|
return R.fail(errorInfo);
|
|
|
}
|
|
}
|
|
|
if (!"1".equals(cardVo.getStatus())) {
|
|
if (!"1".equals(cardVo.getStatus())) {
|
|
|
- errorInfo = new ErrorInfo(400, "", "卡片状态不正确", MessageFormat.format("编号为[{0}]的人员卡片状态不正确,不允许交易", userNumb));
|
|
|
|
|
|
|
+ errorInfo = new ErrorInfo(400, ApiErrorTypeConstants.PARAM_ERROR, "卡片状态不正确",
|
|
|
|
|
+ MessageFormat.format("编号为[{0}]的人员卡片状态不正确,不允许交易", userNumb));
|
|
|
|
|
|
|
|
return R.fail(errorInfo);
|
|
return R.fail(errorInfo);
|
|
|
}
|
|
}
|
|
@@ -240,9 +324,88 @@ public class CheckBusiness {
|
|
|
setUserInfo(bo, accountVo);
|
|
setUserInfo(bo, accountVo);
|
|
|
bo.setCardNo(cardVo.getCardNo());
|
|
bo.setCardNo(cardVo.getCardNo());
|
|
|
bo.setFactoryId(cardVo.getFactoryId());
|
|
bo.setFactoryId(cardVo.getFactoryId());
|
|
|
- BeanUtil.copyProperties(accountVo,userAccountVo);
|
|
|
|
|
- BeanUtil.copyProperties(cardVo,userCardVo);
|
|
|
|
|
|
|
+ BeanUtil.copyProperties(accountVo, userAccountVo);
|
|
|
|
|
+ BeanUtil.copyProperties(cardVo, userCardVo);
|
|
|
|
|
+
|
|
|
|
|
+ return R.ok();
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
|
|
+ private R<ErrorInfo> checkOriginalRecord(ConsumptionBo bo) {
|
|
|
|
|
+ String originalId = RecordIdUtils.getRecordId(bo.getConsumeDate(), bo.getTermNo().shortValue(),
|
|
|
|
|
+ bo.getTermRecordId().shortValue(), bo.getUserNo().intValue(), 0);
|
|
|
|
|
+ XfConsumeDetailOriginalVo consumeDetailOriginalVo = consumeDetailOriginalService.queryById(originalId);
|
|
|
|
|
+ if (ObjectUtil.isEmpty(consumeDetailOriginalVo)) {
|
|
|
|
|
+ // TODO 正常应该是进行记录类型和脱机消费的检查,此处先按错误处理
|
|
|
|
|
+ return R.fail(new ErrorInfo(400, ApiErrorTypeConstants.NOT_FOUND, "原始消费记录不存在",
|
|
|
|
|
+ MessageFormat.format("标识为[{0}]的原始消费记录不存在", bo.getRecordId())));
|
|
|
|
|
+ }
|
|
|
|
|
+ XfConsumeDetailVo consumeDetailVo = consumeDetailService.queryVoByOriginalId(originalId);
|
|
|
|
|
+ if (ObjectUtil.isNotEmpty(consumeDetailVo)) {
|
|
|
|
|
+ // 认为是重复上传,不再入账
|
|
|
|
|
+ return R.fail(new ErrorInfo(400, ApiErrorTypeConstants.RECORD_IS_EXISTS, "原始消费记录已处理",
|
|
|
|
|
+ MessageFormat.format("标识为[{0}]的原始消费记录已处理", bo.getRecordId())));
|
|
|
|
|
+ }
|
|
|
|
|
+ bo.setOriginalId(originalId);
|
|
|
return R.ok();
|
|
return R.ok();
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ public R<ErrorInfo> checkDeductionBag(ConsumptionBo bo, RemoteUserAccountVo userAccountVo, XfTermVo termVo,
|
|
|
|
|
+ List<PtBagVo> bagVos) {
|
|
|
|
|
+ // 设备的扣费钱包串
|
|
|
|
|
+ String consumeType = termVo.getConsumeType();
|
|
|
|
|
+ // 分解扣费钱包
|
|
|
|
|
+ List<String> bagCodes = StrUtil.split(consumeType, ",");
|
|
|
|
|
+ Long userId = userAccountVo.getUserId();
|
|
|
|
|
+ // 可能会在处理过程中更改实际的消费金额,因此先取出来
|
|
|
|
|
+ BigDecimal consumeMoney = bo.getConsumeMoney();
|
|
|
|
|
+ BigDecimal doMoney = bo.getConsumeMoney();
|
|
|
|
|
+ // 计算后实际需要扣费的钱包,会小于或等于指定的扣费钱包数
|
|
|
|
|
+ List<PtBagVo> doBagVos = new ArrayList<>();
|
|
|
|
|
+ BigDecimal totalBalance = BigDecimal.ZERO;
|
|
|
|
|
+ for (String bagCode : bagCodes) {
|
|
|
|
|
+ // 1.查询对应的钱包
|
|
|
|
|
+ PtBagVo bagVo = bagService.queryByUserBagCode(userId, bagCode);
|
|
|
|
|
+ if (ObjectUtil.isEmpty(bagVo)) {
|
|
|
|
|
+ log.warn("人员Id:[{}]没有代码:[{}]的钱包,无法从此钱包扣费", userId, bagCode);
|
|
|
|
|
+ continue;
|
|
|
|
|
+ }
|
|
|
|
|
+ // 2.比较扣费金额
|
|
|
|
|
+ BigDecimal balance = bagVo.getBalance();
|
|
|
|
|
+ if (balance.compareTo(BigDecimal.ZERO) > 0) {
|
|
|
|
|
+ totalBalance = totalBalance.add(balance);
|
|
|
|
|
+ if (balance.compareTo(doMoney) >= 0) {
|
|
|
|
|
+ // 如果钱包金额>扣费金额,设置扣费结果并中断循环
|
|
|
|
|
+ bagVo.setReceiptMoney(doMoney);
|
|
|
|
|
+ bagVo.setBalance(balance.subtract(doMoney));
|
|
|
|
|
+ doMoney = BigDecimal.ZERO;
|
|
|
|
|
+ doBagVos.add(bagVo);
|
|
|
|
|
+ break;
|
|
|
|
|
+ } else {
|
|
|
|
|
+ // 将钱包扣费为0,剩余待扣金额=消费金额-原钱包余额
|
|
|
|
|
+ bagVo.setReceiptMoney(balance);
|
|
|
|
|
+ bagVo.setBalance(BigDecimal.ZERO);
|
|
|
|
|
+ doMoney = doMoney.subtract(balance);
|
|
|
|
|
+ doBagVos.add(bagVo);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ if (doMoney.compareTo(BigDecimal.ZERO) > 0) {
|
|
|
|
|
+ // 循环扣费后,如果还有未扣的金额,表示钱包余额不足,不允许交易
|
|
|
|
|
+ return R.fail(new ErrorInfo(400, ApiErrorTypeConstants.CONSUME_CHECK_FAIL, "钱包余额不足",
|
|
|
|
|
+ MessageFormat.format("余额不足,余额[{0}],消费金额[{1}]", totalBalance,
|
|
|
|
|
+ consumeMoney)));
|
|
|
|
|
+ }
|
|
|
|
|
+ bagVos.addAll(doBagVos);
|
|
|
|
|
+ return R.ok();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private RemoteOperatorVo getOperatorVo(ConsumptionBo bo) {
|
|
|
|
|
+ RemoteOperatorVo operatorVo = remoteOperatorService.getVoById(bo.getOperatorId());
|
|
|
|
|
+ if (ObjectUtil.isEmpty(operatorVo)) {
|
|
|
|
|
+ operatorVo = new RemoteOperatorVo();
|
|
|
|
|
+ operatorVo.setOperatorId(bo.getOperatorId());
|
|
|
|
|
+ operatorVo.setOperatorName(bo.getOperatorName());
|
|
|
|
|
+ }
|
|
|
|
|
+ return operatorVo;
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|