|
|
@@ -5,38 +5,33 @@ import io.seata.common.util.CollectionUtils;
|
|
|
import lombok.RequiredArgsConstructor;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.apache.dubbo.config.annotation.DubboReference;
|
|
|
-import org.dromara.backstage.api.RemotePtXfTermService;
|
|
|
-import org.dromara.backstage.api.domain.vo.RemoteXfTermVo;
|
|
|
-import org.dromara.common.core.exception.ServiceException;
|
|
|
+import org.dromara.common.core.domain.R;
|
|
|
+import org.dromara.common.core.domain.model.ErrorInfo;
|
|
|
+import org.dromara.common.core.enums.CreditTypeEnum;
|
|
|
import org.dromara.common.core.utils.DateUtils;
|
|
|
+import org.dromara.common.core.utils.StringUtils;
|
|
|
import org.dromara.common.core.utils.file.FileUtils;
|
|
|
import org.dromara.consume.api.RemoteConsumeService;
|
|
|
-import org.dromara.server.hik.domain.dto.DeviceDto;
|
|
|
-import org.dromara.server.hik.domain.vo.XfConsumeDetailOriginalVo;
|
|
|
+import org.dromara.consume.api.domain.bo.RemoteConsumeBo;
|
|
|
+import org.dromara.consume.api.domain.bo.RemoteResultDto;
|
|
|
+import org.dromara.server.hik.domain.bo.XfFailedRecordBo;
|
|
|
import org.dromara.server.hik.domain.vo.XfConsumeDetailVo;
|
|
|
import org.dromara.server.hik.domain.vo.XfTermVo;
|
|
|
-import org.dromara.server.hik.enums.ContentTypeEnum;
|
|
|
import org.dromara.server.hik.enums.ModeTypeEnum;
|
|
|
import org.dromara.server.hik.event.HikEventHandler;
|
|
|
import org.dromara.server.hik.event.domain.FileContent;
|
|
|
import org.dromara.server.hik.event.domain.TransactionRecordEventConfirmBo;
|
|
|
import org.dromara.server.hik.event.domain.TransactionRecordEventDetail;
|
|
|
import org.dromara.server.hik.event.domain.TransactionRecordEventReceive;
|
|
|
-import org.dromara.server.hik.service.IConsumeDetailOriginalService;
|
|
|
-import org.dromara.server.hik.service.ISendDeviceService;
|
|
|
-import org.dromara.server.hik.service.IXfConsumeDetailService;
|
|
|
-import org.dromara.server.hik.service.IXfTermService;
|
|
|
-import org.dromara.server.hik.service.impl.SendDeviceServiceImpl;
|
|
|
-import org.dromara.server.hik.utils.DigestHttpUtil;
|
|
|
+import org.dromara.server.hik.service.*;
|
|
|
import org.springframework.beans.factory.annotation.Value;
|
|
|
import org.springframework.stereotype.Component;
|
|
|
|
|
|
import java.io.File;
|
|
|
import java.math.BigDecimal;
|
|
|
+import java.math.RoundingMode;
|
|
|
import java.util.*;
|
|
|
|
|
|
-import static org.dromara.server.hik.constant.HikApiConstants.TRANSACTION_RECORD_Event_confirm;
|
|
|
-
|
|
|
@Slf4j
|
|
|
@Component
|
|
|
@RequiredArgsConstructor
|
|
|
@@ -48,6 +43,8 @@ public class TransactionRecordEventHandler implements HikEventHandler {
|
|
|
|
|
|
private final IConsumeDetailOriginalService consumeDetailOriginalService;
|
|
|
|
|
|
+ private final IXfFailedRecordService failedRecordService;
|
|
|
+
|
|
|
@Value("${upload.upload-path}/")
|
|
|
private String uploadPath;
|
|
|
|
|
|
@@ -63,9 +60,10 @@ public class TransactionRecordEventHandler implements HikEventHandler {
|
|
|
|
|
|
//设备信息
|
|
|
XfTermVo termVo = termService.queryByMac(transactionRecordEventReceive.getMacAddress());
|
|
|
+ Long termNo = termVo.getTermNo();
|
|
|
// 消费抓拍图片保存
|
|
|
if (fileContent != null) {
|
|
|
- String fileName = termVo.getTermNo()+"_"+transactionRecordEvent.getSerialNo()+ "_" + DateUtils.dateTimeNow() + fileContent.getSuffix();
|
|
|
+ String fileName = termNo +"_"+transactionRecordEvent.getSerialNo()+ "_" + DateUtils.dateTimeNow() + fileContent.getSuffix();
|
|
|
byte[] content = fileContent.getContent();
|
|
|
String image_dir_path = uploadPath + "snapshot-pic/";
|
|
|
File image_dir = new File(image_dir_path);
|
|
|
@@ -79,20 +77,31 @@ public class TransactionRecordEventHandler implements HikEventHandler {
|
|
|
// 这里只能应答成功,如果是业务异常(余额不足、脏数据等)失败,要存入表中,使用定时任务处理失败,所以即使失败的 也要回复成功
|
|
|
// 如果是在线交易的,平台根据流水号判断当前交易记录事件是否为未处理事件,若为未处理事件,则平台进行处理并进行扣费;
|
|
|
// 如果是离线交易记录事件,则平台进行处理并进行扣费;
|
|
|
+ RemoteConsumeBo remoteBo = getRemoteBo(transactionRecordEventReceive);
|
|
|
+ R<ErrorInfo> errorInfo = R.fail("处理失败");
|
|
|
try {
|
|
|
if (ModeTypeEnum.offLine.getCode().equals(modeType)) {
|
|
|
- // todo 离线交易,调用原始消费记录请求+消费记录入库的接口
|
|
|
- // 如果失败要记录入库
|
|
|
-
|
|
|
+ // 离线交易,调用原始消费记录请求+消费记录入库的接口,如果失败要记录入库
|
|
|
+ RemoteResultDto remoteResultDto = remoteConsumeService.dealHikUploadOffLineRecord(remoteBo);
|
|
|
+ errorInfo = remoteResultDto.getErrorInfo();
|
|
|
+ RemoteConsumeBo updatedRemoteBo = remoteResultDto.getUpdatedRemoteBo();
|
|
|
+ if(updatedRemoteBo !=null) {
|
|
|
+ balance = updatedRemoteBo.getBalance();
|
|
|
+ }
|
|
|
}else{
|
|
|
// 在线交易,调用消费记录入库的接口
|
|
|
// 根据机号和交易记录流水号查询消费记录
|
|
|
- List<XfConsumeDetailVo> vos = consumeDetailService.queryByTermNoAndRecordId(termVo.getTermNo(), transactionRecordEvent.getSerialNo().longValue());
|
|
|
+ // 睡眠一秒,等待消费记录入库成功
|
|
|
+ Thread.sleep(1000);
|
|
|
+ List<XfConsumeDetailVo> vos = consumeDetailService.queryByTermNoAndRecordId(termNo, transactionRecordEvent.getSerialNo().longValue());
|
|
|
if (CollectionUtils.isEmpty(vos)){
|
|
|
- // 调用消费记录入库的接口
|
|
|
- // todo 组装参数,调用消费记录入库的接口
|
|
|
- // 如果失败要记录入库
|
|
|
-
|
|
|
+ // 组装参数,调用消费记录入库的接口 // 如果失败要记录入库
|
|
|
+ RemoteResultDto remoteResultDto = remoteConsumeService.dealHikUploadRecord(remoteBo);
|
|
|
+ errorInfo = remoteResultDto.getErrorInfo();
|
|
|
+ RemoteConsumeBo updatedRemoteBo = remoteResultDto.getUpdatedRemoteBo();
|
|
|
+ if(updatedRemoteBo !=null) {
|
|
|
+ balance = updatedRemoteBo.getBalance();
|
|
|
+ }
|
|
|
}else{
|
|
|
XfConsumeDetailVo consumeDetailVo = vos.get(0);
|
|
|
balance = consumeDetailVo.getCardValue();
|
|
|
@@ -101,8 +110,10 @@ public class TransactionRecordEventHandler implements HikEventHandler {
|
|
|
} catch (Exception e) {
|
|
|
log.error("消费机交易记录事件处理异常:{}", e.getMessage());
|
|
|
// 失败,记录入库
|
|
|
+ errorInfo = R.fail(e.getMessage());
|
|
|
}
|
|
|
|
|
|
+ insertFailedRecordBo(transactionRecordEventReceive, termNo, errorInfo, modeType);
|
|
|
//应答
|
|
|
return answerEvent(transactionRecordEventReceive,balance);
|
|
|
}
|
|
|
@@ -128,4 +139,71 @@ public class TransactionRecordEventHandler implements HikEventHandler {
|
|
|
map.put("TransactionRecordEventConfirm", confirmBo);
|
|
|
return map;
|
|
|
}
|
|
|
+
|
|
|
+
|
|
|
+ private RemoteConsumeBo getRemoteBo(TransactionRecordEventReceive info){
|
|
|
+ RemoteConsumeBo remoteBo = new RemoteConsumeBo();
|
|
|
+ remoteBo.setStatusFlag(4);
|
|
|
+ remoteBo.setCardNo(0L);
|
|
|
+ remoteBo.setCreditType(CreditTypeEnum.TERM_CONSUME.code());
|
|
|
+ remoteBo.setRecordStatus(364L);
|
|
|
+ remoteBo.setRecordId(0L);
|
|
|
+
|
|
|
+ TransactionRecordEventDetail recordEvent = info.getTransactionRecordEvent();
|
|
|
+ setCommonFields(remoteBo, recordEvent.getEmployeeNoString(), recordEvent.getCardNo(), info.getDateTime(),
|
|
|
+ recordEvent.getSerialNo(), recordEvent.getTotalPayment(), info.getMacAddress());
|
|
|
+
|
|
|
+ return remoteBo;
|
|
|
+ }
|
|
|
+
|
|
|
+ static void setCommonFields(RemoteConsumeBo remoteBo, String employeeNoString, String cardNo2, Date dateTime2, Integer serialNo,
|
|
|
+ String totalPayment, String macAddress) {
|
|
|
+ remoteBo.setUserNo(Long.valueOf(employeeNoString));
|
|
|
+ if(StringUtils.isNotBlank(cardNo2)){
|
|
|
+ remoteBo.setFactoryId(Long.valueOf(cardNo2));
|
|
|
+ } else {
|
|
|
+ remoteBo.setFactoryId(0L);
|
|
|
+ }
|
|
|
+ remoteBo.setConsumeDate(dateTime2);
|
|
|
+ remoteBo.setTermRecordId(Long.valueOf(serialNo));
|
|
|
+ if(StringUtils.isNotBlank(totalPayment)){
|
|
|
+ BigDecimal money = new BigDecimal(totalPayment).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP);
|
|
|
+ remoteBo.setConsumeMoney(money);
|
|
|
+ }else{
|
|
|
+ remoteBo.setConsumeMoney(BigDecimal.ZERO);
|
|
|
+ }
|
|
|
+ remoteBo.setTermMac(macAddress);
|
|
|
+ }
|
|
|
+
|
|
|
+ private void insertFailedRecordBo(TransactionRecordEventReceive info, Long termNo, R<ErrorInfo> errorInfo, String modeType){
|
|
|
+ Boolean error = R.isError(errorInfo);
|
|
|
+ if (!error) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ XfFailedRecordBo bo = new XfFailedRecordBo();
|
|
|
+ TransactionRecordEventDetail recordEvent = info.getTransactionRecordEvent();
|
|
|
+ bo.setUserNo(recordEvent.getEmployeeNoString());
|
|
|
+ bo.setConsumeDate(info.getDateTime());
|
|
|
+ bo.setTermRecordId(recordEvent.getSerialNo().toString());
|
|
|
+ bo.setConsumeMoney(recordEvent.getTotalPayment());
|
|
|
+ bo.setTermMac(info.getMacAddress());
|
|
|
+ if(termNo != null){
|
|
|
+ bo.setTermNo(termNo.toString());
|
|
|
+ }
|
|
|
+ bo.setStatus("f");
|
|
|
+ bo.setFactoryId(recordEvent.getCardNo());
|
|
|
+ String msg = errorInfo.getMsg();
|
|
|
+ ErrorInfo data = errorInfo.getData();
|
|
|
+ if(data != null){
|
|
|
+ msg = data.getMessage();
|
|
|
+ }
|
|
|
+ if(StringUtils.isNotBlank(msg) && msg.length() >= 2000){
|
|
|
+ msg = msg.substring(0, 2000);
|
|
|
+ }
|
|
|
+ bo.setFailMsg(msg);
|
|
|
+ bo.setConsumeType(modeType);
|
|
|
+
|
|
|
+ failedRecordService.insertByBo(bo);
|
|
|
+ }
|
|
|
+
|
|
|
}
|