|
@@ -1,25 +1,34 @@
|
|
|
package com.caimei365.order.service.impl;
|
|
|
|
|
|
import com.caimei365.order.components.WeChatService;
|
|
|
+import com.caimei365.order.mapper.BaseMapper;
|
|
|
+import com.caimei365.order.mapper.OrderCommonMapper;
|
|
|
+import com.caimei365.order.mapper.PayOrderMapper;
|
|
|
import com.caimei365.order.mapper.ReceiptMapper;
|
|
|
import com.caimei365.order.model.ResponseJson;
|
|
|
-import com.caimei365.order.model.vo.DiscernReceiptVo;
|
|
|
+import com.caimei365.order.model.dto.ReceiptDto;
|
|
|
+import com.caimei365.order.model.enums.OrderStatus;
|
|
|
+import com.caimei365.order.model.po.BalanceRecordPo;
|
|
|
+import com.caimei365.order.model.po.OrderReceiptRelationPo;
|
|
|
+import com.caimei365.order.model.po.ReceiptPo;
|
|
|
+import com.caimei365.order.model.vo.OrderVo;
|
|
|
import com.caimei365.order.model.vo.ReceiptUserVo;
|
|
|
+import com.caimei365.order.model.vo.ReceiptVo;
|
|
|
import com.caimei365.order.service.ReceiptService;
|
|
|
import com.caimei365.order.utils.DateUtils;
|
|
|
import com.caimei365.order.utils.MathUtil;
|
|
|
import com.caimei365.order.utils.Md5Util;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
|
+import org.springframework.beans.BeanUtils;
|
|
|
import org.springframework.http.HttpHeaders;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
+import org.springframework.transaction.interceptor.TransactionAspectSupport;
|
|
|
import org.springframework.util.CollectionUtils;
|
|
|
|
|
|
import javax.annotation.Resource;
|
|
|
-import java.util.ArrayList;
|
|
|
-import java.util.Arrays;
|
|
|
-import java.util.List;
|
|
|
-import java.util.Map;
|
|
|
+import java.util.*;
|
|
|
import java.util.regex.Matcher;
|
|
|
import java.util.regex.Pattern;
|
|
|
|
|
@@ -36,12 +45,20 @@ public class ReceiptServiceImpl implements ReceiptService {
|
|
|
private WeChatService weChatService;
|
|
|
@Resource
|
|
|
private ReceiptMapper receiptMapper;
|
|
|
+ @Resource
|
|
|
+ private OrderCommonMapper orderCommonMapper;
|
|
|
+ @Resource
|
|
|
+ private PayOrderMapper payOrderMapper;
|
|
|
+ @Resource
|
|
|
+ private BaseMapper baseMapper;
|
|
|
/**
|
|
|
* 只有当识别出来的收款类型是广发银行-5461 ,中信银行-0897,中信银行0897-财付通 和 中信银行0897-支付宝时,才会显示手续费,并且自动勾选上手续费,默认按收款金额的千分之一计算 (收款金额 - 手续费 = 短信中收到的金额)
|
|
|
*/
|
|
|
private static final List<Integer> tipFeeType = Arrays.asList(4, 5, 6, 11);
|
|
|
private static final Pattern PATTERN_NUMBER = Pattern.compile("[\\*0-9\\.:]+");
|
|
|
private static final Pattern PATTERN_ORDER = Pattern.compile("#(.*?)#");
|
|
|
+ private static final Pattern PATTERN_ORDER_ID = Pattern.compile("^[-\\+]?[\\d]*$");
|
|
|
+
|
|
|
|
|
|
/**
|
|
|
* 线下收款用户微信授权
|
|
@@ -106,26 +123,308 @@ public class ReceiptServiceImpl implements ReceiptService {
|
|
|
* @param message 收款短信
|
|
|
*/
|
|
|
@Override
|
|
|
- public ResponseJson<DiscernReceiptVo> readSmsMessage(String message, String openid) {
|
|
|
+ public ResponseJson<ReceiptVo> readSmsMessage(String message, String openid) {
|
|
|
+ // 收款用户
|
|
|
+ ReceiptUserVo receiptUser = checkPermissions(1, openid);
|
|
|
+ if (null == receiptUser) {
|
|
|
+ return ResponseJson.error("无权限操作!", null);
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ // 识别短信内容
|
|
|
+ ResponseJson<ReceiptVo> receipt = identifyMessage(message);
|
|
|
+ if (receipt != null) {
|
|
|
+ return receipt ;
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("短信识别错误!", e);
|
|
|
+ }
|
|
|
+ return ResponseJson.error("短信识别错误!", null);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 保存收款信息
|
|
|
+ */
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ @Override
|
|
|
+ public ResponseJson<ReceiptVo> saveReceipt(ReceiptDto receiptDto) {
|
|
|
+ // 收款用户
|
|
|
+ ReceiptUserVo receiptUser = checkPermissions(1, receiptDto.getOpenid());
|
|
|
+ if (null == receiptUser) {
|
|
|
+ return ResponseJson.error("无权限操作!", null);
|
|
|
+ }
|
|
|
+ String time = DateUtils.getDateTime();
|
|
|
+ // receiptDto -- copy to --> ReceiptPo
|
|
|
+ ReceiptPo receiptPo = new ReceiptPo();
|
|
|
+ BeanUtils.copyProperties(receiptDto, receiptPo);
|
|
|
+ receiptPo.setUpdateDate(time);
|
|
|
+ if (StringUtils.isNotBlank(receiptDto.getSmsContent())) {
|
|
|
+ receiptPo.setSmsMd5Code(Md5Util.md5(receiptDto.getSmsContent()));
|
|
|
+ }
|
|
|
+ ReceiptVo responseVo = new ReceiptVo();
|
|
|
+ // receiptPo -- copy to --> receiptVo
|
|
|
+ BeanUtils.copyProperties(receiptPo, responseVo);
|
|
|
+ // 默认不自动确认审核
|
|
|
+ responseVo.setAutoAuditFlag("0");
|
|
|
+ // 收款作废
|
|
|
+ if (null != receiptDto.getId() && StringUtils.isNotBlank(receiptDto.getDelFlag())){
|
|
|
+ // 收款状态receiptStatus:2已确认(待审核)、3审核通过
|
|
|
+ if ("2".equals(receiptDto.getReceiptStatus()) || "3".equals(receiptDto.getReceiptStatus())) {
|
|
|
+ // 收款款项类型receiptType:1订单款
|
|
|
+ if ("1".equals(receiptDto.getReceiptType())) {
|
|
|
+ return ResponseJson.error(-2, "该收款已关联了订单,不能作废!请刷新页面查看最新数据", null);
|
|
|
+ }
|
|
|
+ // 收款款项类型receiptType:3返佣款
|
|
|
+ else if ("3".equals(receiptDto.getReceiptType())) {
|
|
|
+ return ResponseJson.error(-2, "该收款已关联了返佣订单,不能作废!请刷新页面查看最新数据", null);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 收款款项类型receiptType:2非订单款
|
|
|
+ if ("2".equals(receiptDto.getReceiptType())) {
|
|
|
+ receiptPo.setReceiptStatus("2");
|
|
|
+ receiptPo.setConfirmUserPermissionId(receiptUser.getId());
|
|
|
+ receiptPo.setConfirmDate(time);
|
|
|
+ }
|
|
|
+ // 更新收款记录
|
|
|
+ receiptMapper.updateReceipt(receiptPo);
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ // 如果是添加收款则判断是否存在重复添加
|
|
|
+ if (StringUtils.isNotBlank(receiptDto.getSmsContent()) && StringUtils.isNotBlank(receiptDto.getPayWay())) {
|
|
|
+ // 无短信备注内容短信无需判断(payWay传值的话是短信识别来的)
|
|
|
+ String md5Msg = Md5Util.md5(receiptDto.getSmsContent());
|
|
|
+ ReceiptVo receiptVo = getReceiptByMd5Msg(md5Msg);
|
|
|
+ if (receiptVo != null) {
|
|
|
+ // 短信已存在不需要识别
|
|
|
+ responseVo.setSmsContentPresenceFlag("1");
|
|
|
+ return ResponseJson.success(responseVo);
|
|
|
+ } else {
|
|
|
+ responseVo.setSmsContentPresenceFlag("0");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (StringUtils.isNotBlank(receiptDto.getSmsContent())) {
|
|
|
+ String message = receiptDto.getSmsContent().trim();
|
|
|
+ // 隐藏余额
|
|
|
+ message = hiddenBalance(message);
|
|
|
+ receiptPo.setSmsContent(message);
|
|
|
+ responseVo.setSmsContent(message);
|
|
|
+ }
|
|
|
+ // 收款款项类型receiptType:2非订单款
|
|
|
+ if ("2".equals(receiptDto.getReceiptType())) {
|
|
|
+ receiptPo.setReceiptStatus("2");
|
|
|
+ } else {
|
|
|
+ receiptPo.setReceiptStatus("1");
|
|
|
+ }
|
|
|
+ receiptPo.setDelFlag("0");
|
|
|
+ receiptPo.setConfirmType("0");
|
|
|
+ receiptPo.setPayWay("2");
|
|
|
+ if (null == receiptDto.getHandlingFee()) {
|
|
|
+ receiptPo.setHandlingFee(0d);
|
|
|
+ }
|
|
|
+ receiptPo.setReceiptUserPermissionId(receiptUser.getId());
|
|
|
+ // 保存收款记录
|
|
|
+ receiptMapper.insertReceipt(receiptPo);
|
|
|
+
|
|
|
+ /* 如果订单是小程序组织订单来源则包含对应订单Id直接通过订单标识审核收款 */
|
|
|
+ String orderFlag = receiptDto.getOrderFlag();
|
|
|
+ // 参数订单标识
|
|
|
+ log.info("收款订单标识>>>>>>" + orderFlag);
|
|
|
+ // 订单款时才走自动关联
|
|
|
+ if (StringUtils.isNotEmpty(receiptDto.getOrderFlag()) && "1".equals(receiptDto.getReceiptType())) {
|
|
|
+ boolean matches = PATTERN_ORDER_ID.matcher(orderFlag).matches();
|
|
|
+ if (matches) {
|
|
|
+ // 订单信息
|
|
|
+ OrderVo order = orderCommonMapper.getOrderByOrderId(Integer.parseInt(orderFlag));
|
|
|
+ if (null != order && 0 != order.getStatus() && 1 != order.getRebateFlag()) {
|
|
|
+ if (3 == order.getReceiptStatus()) {
|
|
|
+ // 设置手动回滚事务
|
|
|
+ TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
|
|
|
+ log.info("订单(Id:" + orderFlag + ")已全部收款,无需再收款!");
|
|
|
+ return ResponseJson.error("订单(Id:" + orderFlag + ")已全部收款,无需再收款!", responseVo);
|
|
|
+ }
|
|
|
+ // 收款项和订单关系表
|
|
|
+ OrderReceiptRelationPo relation = new OrderReceiptRelationPo();
|
|
|
+ relation.setRelationType(2);
|
|
|
+ relation.setAssociationType(2);
|
|
|
+ // 记录原始应付金额
|
|
|
+ Double payAbleAmount = order.getPayableAmount();
|
|
|
+ // 设置订单未付金额(此处payableAmount用作实际应收)
|
|
|
+ order.setPayableAmount(getUnPayMoney(order, true));
|
|
|
+ if (order.getPayableAmount().equals(receiptPo.getReceiptAmount())) {
|
|
|
+ //确认关联(收款金额=订单应付金额)
|
|
|
+ log.info(">>>>>>>>>>>>>>>>>>1:" + order.getPayableAmount() + "====" + receiptPo.getReceiptAmount());
|
|
|
+ receiptPo.setConfirmType("4");
|
|
|
+ relation.setReceiptId(receiptPo.getId());
|
|
|
+ relation.setOrderId(order.getOrderId());
|
|
|
+ relation.setAssociateAmount(receiptPo.getReceiptAmount());
|
|
|
+ } else if (receiptPo.getReceiptAmount() < order.getPayableAmount()) {
|
|
|
+ /*(收款金额<订单应付金额)【默认部分收款确认,自动收款不存在抹平确认】*/
|
|
|
+ log.info(">>>>>>>>>>>>>>>>>>2:" + order.getPayableAmount() + "====" + receiptPo.getReceiptAmount());
|
|
|
+ receiptPo.setConfirmType("4");
|
|
|
+ relation.setReceiptId(receiptPo.getId());
|
|
|
+ relation.setOrderId(order.getOrderId());
|
|
|
+ relation.setAssociateAmount(receiptPo.getReceiptAmount());
|
|
|
+ } else if (receiptPo.getReceiptAmount() > order.getPayableAmount()) {
|
|
|
+ /*(收款金额>订单应付金额)【默认大额退款余额,自动不存在抹平】*/
|
|
|
+ log.info(">>>>>>>>>>>>>>>>>>3:" + order.getPayableAmount() + "====" + receiptPo.getReceiptAmount());
|
|
|
+ receiptPo.setConfirmType("3");
|
|
|
+ relation.setReceiptId(receiptPo.getId());
|
|
|
+ relation.setOrderId(order.getOrderId());
|
|
|
+ relation.setAssociateAmount(order.getPayableAmount());
|
|
|
+ }
|
|
|
+ // 保存 收款项和订单关系
|
|
|
+ baseMapper.insertOrderReceiptRelation(relation);
|
|
|
+ // 默认确认人就是当前短信识别人
|
|
|
+ receiptPo.setConfirmUserPermissionId(receiptUser.getId());
|
|
|
+ receiptPo.setUpdateDate(time);
|
|
|
+ receiptPo.setConfirmDate(time);
|
|
|
+ receiptPo.setReviewDate(receiptDto.getReceiptDate());
|
|
|
+ receiptPo.setPayWay("2");
|
|
|
+ // 更新收款记录
|
|
|
+ receiptMapper.updateReceipt(receiptPo);
|
|
|
+
|
|
|
+ /* 审核订单关系 */
|
|
|
+ String statusFlag = "";
|
|
|
+ String receiptStatus = "";
|
|
|
+ Double totalAssociateAmount = 0d;
|
|
|
+ // 重置应付金额已供重新计算
|
|
|
+ order.setPayableAmount(payAbleAmount);
|
|
|
+ log.info(">>>>>>>>>>>>>>>>>>setPayableAmount:" + payAbleAmount);
|
|
|
+ order.setPayableAmount(getUnPayMoney(order, false));
|
|
|
+ log.info("-----------------UnPayMoney:" + getUnPayMoney(order, false));
|
|
|
+ log.info("-----------------payAbleAmount:" + order.getPayableAmount());
|
|
|
+ if (order.getPayableAmount().equals(receiptPo.getReceiptAmount())) {
|
|
|
+ //确认关联(收款金额=订单应付金额)
|
|
|
+ log.info(">>>>>>>>>>>>>>>>>>11:" + order.getPayableAmount() + "====" + receiptPo.getReceiptAmount());
|
|
|
+ statusFlag = "3";
|
|
|
+ receiptStatus = "3";
|
|
|
+ } else if (receiptPo.getReceiptAmount() < order.getPayableAmount()) {
|
|
|
+ /*(收款金额<订单应付金额)*/
|
|
|
+ log.info(">>>>>>>>>>>>>>>>>>22:" + order.getPayableAmount() + "====" + receiptPo.getReceiptAmount());
|
|
|
+ statusFlag = "2";
|
|
|
+ receiptStatus = "2";
|
|
|
+ } else if (receiptPo.getReceiptAmount() > order.getPayableAmount()) {
|
|
|
+ /*(收款金额>订单应付金额)*/
|
|
|
+ log.info(">>>>>>>>>>>>>>>>>>33:" + order.getPayableAmount() + "====" + receiptPo.getReceiptAmount());
|
|
|
+ statusFlag = "3";
|
|
|
+ receiptStatus = "3";
|
|
|
+ totalAssociateAmount += relation.getAssociateAmount();
|
|
|
+ }
|
|
|
+ Integer status = order.getStatus();
|
|
|
+ log.info(">>>>>>status:" + status);
|
|
|
+ if (status == 0 || status == 4 || status == 5 || status == 6 || status == 7 || status == 33 || status == 32 || status == 31) {
|
|
|
+ // 防止使用短信操作已支付或者为确认的订单。
|
|
|
+ responseVo.setAutoAuditFlag("0");
|
|
|
+ return ResponseJson.success(responseVo);
|
|
|
+ }
|
|
|
+ statusFlag = statusFlag + status.toString().charAt(1);
|
|
|
+ order.setPayableAmount(payAbleAmount);
|
|
|
+ order.setStatus(Integer.parseInt(statusFlag));
|
|
|
+ order.setReceiptStatus(Integer.parseInt(receiptStatus));
|
|
|
+ /* 设置订单状态 */
|
|
|
+ // 获取主订单下面的所有的确认收货商品数量
|
|
|
+ Integer receiptNum = receiptMapper.getReceiptNumByOrderId(order.getOrderId());
|
|
|
+ Integer returnAndCancelNum = 0;
|
|
|
+ boolean returnFlag = null != order.getRefundType() && (1 == order.getRefundType() || 2 == order.getRefundType());
|
|
|
+ // 获取该主订单下面所有已完成状态退货退款商品数量
|
|
|
+ if (returnFlag) {
|
|
|
+ returnAndCancelNum = receiptMapper.getReturnAndCancelNum(order.getOrderId());
|
|
|
+ }
|
|
|
+ // 确认收货商品数量+已完成状态退货退款商品数量 = 订单商品总数
|
|
|
+ int compare = MathUtil.compare(order.getProductCount(), MathUtil.add(returnAndCancelNum, receiptNum));
|
|
|
+ if (compare == 0) {
|
|
|
+ //已收款--->交易完成
|
|
|
+ if (null != order.getReceiptStatus() && 3 == order.getReceiptStatus()) {
|
|
|
+ order.setStatus(OrderStatus.TRANSACTION_COMPLETED.getCode());
|
|
|
+ //已收款+已付款--->订单完成
|
|
|
+ if (null != order.getPayStatus() && 3 == order.getPayStatus()) {
|
|
|
+ order.setStatus(OrderStatus.ORDER_COMPLETED.getCode());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 更新订单收款状态
|
|
|
+ payOrderMapper.updateOrderStatus(order);
|
|
|
+ log.info("-------------审核通过订单状态改变---orderId:" + order.getOrderId() + "--status:" + order.getStatus() + "----------" + receiptPo.getConfirmType());
|
|
|
+
|
|
|
+ /* 审核订单关系 */
|
|
|
+ if ("3".equals(receiptPo.getConfirmType())) {
|
|
|
+ log.info(">>>>>>>>>>>>>>>>>>55:" + receiptPo.getReceiptAmount() + "====" + totalAssociateAmount);
|
|
|
+ // 本次收款减已经收款金额
|
|
|
+ Double money = receiptPo.getReceiptAmount() - totalAssociateAmount;
|
|
|
+ // 加入用户余额
|
|
|
+
|
|
|
+ // 修改账户余额
|
|
|
+ double userMoney = baseMapper.getUserMoney(order.getUserId());
|
|
|
+ // 可用余额
|
|
|
+ Double availableMoney = baseMapper.getAbleUserMoney(order.getUserId());
|
|
|
+ log.info("------->userId:" + order.getUserId() +",原余额:" + userMoney + "==原可用余额:" + availableMoney);
|
|
|
+ if (money < 0d) {
|
|
|
+ // 待确认状态不需要修改余额,因为本身存在冻结余额不需要重复退回
|
|
|
+ if (0 != order.getStatus()) {
|
|
|
+ userMoney = MathUtil.add(userMoney, money).doubleValue();
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ if (0 != order.getStatus()) {
|
|
|
+ userMoney = MathUtil.add(availableMoney, money).doubleValue();
|
|
|
+ }
|
|
|
+ availableMoney = MathUtil.add(availableMoney, money).doubleValue();
|
|
|
+ }
|
|
|
+
|
|
|
+ payOrderMapper.updateMoneyByUserId(userMoney, availableMoney, order.getUserId());
|
|
|
+ log.info("------->userId:" + order.getUserId() +",更新余额:" + userMoney + "==更新可用余额:" + availableMoney);
|
|
|
+ log.info("----------->大额抹平金额退回账户:" + order.getUserId());
|
|
|
+ log.info("----------->大额抹平金额:" + money);
|
|
|
+ //保存余额到余额收支记录
|
|
|
+ BalanceRecordPo balanceRecord = new BalanceRecordPo();
|
|
|
+ balanceRecord.setUserId(order.getUserId());
|
|
|
+ balanceRecord.setType(1);
|
|
|
+ balanceRecord.setBalanceType(2);
|
|
|
+ balanceRecord.setAddDate(new Date());
|
|
|
+ balanceRecord.setAmount(money);
|
|
|
+ balanceRecord.setOrderId(order.getOrderId());
|
|
|
+ balanceRecord.setReceiptId(receiptPo.getId());
|
|
|
+ balanceRecord.setRemark("大额抹平金额退回账户");
|
|
|
+ balanceRecord.setDelFlag(0);
|
|
|
+ // 保存 余额收支记录
|
|
|
+ baseMapper.insertBalanceRecord(balanceRecord);
|
|
|
+ }
|
|
|
+
|
|
|
+ receiptPo.setReceiptStatus("3");
|
|
|
+ receiptPo.setReviewUserPermissionId(receiptUser.getId());
|
|
|
+ receiptMapper.updateReceipt(receiptPo);
|
|
|
+
|
|
|
+ /* 保存订单关系之后自动审核*/
|
|
|
+ responseVo.setAutoAuditFlag("1");
|
|
|
+
|
|
|
+ } else {//针对订单号异常或订单不存在的则继续分享人工确认
|
|
|
+ responseVo.setAutoAuditFlag("0");
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ // 针对没有订单号的也是走老流程
|
|
|
+ responseVo.setAutoAuditFlag("0");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return ResponseJson.success(responseVo);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 检查收款权限
|
|
|
+ * @param permission
|
|
|
+ * @param openid
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private ReceiptUserVo checkPermissions(Integer permission, String openid) {
|
|
|
// 收款用户
|
|
|
ReceiptUserVo receiptUser = receiptMapper.getReceiptUserByOpenid(openid);
|
|
|
if (null != receiptUser) {
|
|
|
// 获取用户权限: 1录入收款权限,2收款确认权限,3收款审核权限 4返佣管理权限 5供应商退款管理权限
|
|
|
List<Integer> permissions = receiptMapper.getPermissionsByUserId(receiptUser.getId());
|
|
|
- if (permissions.contains(1)) {
|
|
|
- try {
|
|
|
- // 识别短信内容
|
|
|
- ResponseJson<DiscernReceiptVo> receipt = identifyMessage(message);
|
|
|
- if (receipt != null) {
|
|
|
- return receipt ;
|
|
|
- }
|
|
|
- } catch (Exception e) {
|
|
|
- log.error("短信识别错误!", e);
|
|
|
- return ResponseJson.error("短信识别错误!", null);
|
|
|
- }
|
|
|
+ if (permissions.contains(permission)) {
|
|
|
+ receiptUser.setPermission(permission);
|
|
|
+ return receiptUser;
|
|
|
}
|
|
|
}
|
|
|
- return ResponseJson.error("无权限操作!", null);
|
|
|
+ return null;
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -142,25 +441,17 @@ public class ReceiptServiceImpl implements ReceiptService {
|
|
|
* 【中信银行】您尾号0897的中信卡于03月14日16:01,支付宝存入人民币5994.06元,当前余额为人民币1000000.00元。
|
|
|
* 【中信银行】您尾号0897的中信卡于05月29日14:42,二代支付存入人民币10000.00元,当前余额为人民币13871.67元。
|
|
|
*/
|
|
|
- private ResponseJson<DiscernReceiptVo> identifyMessage(String message) throws Exception {
|
|
|
- message = message.replace(":", ":").trim();
|
|
|
+ private ResponseJson<ReceiptVo> identifyMessage(String message) throws Exception {
|
|
|
if (message.contains("银行")) {
|
|
|
- /*隐藏余额后去数据库进行全匹配*/
|
|
|
- int index = message.indexOf("余额");
|
|
|
- if (index != -1) {
|
|
|
- int index2 = message.indexOf("元", index);
|
|
|
- String text1 = message.substring(0, index + 2);
|
|
|
- String text2 = message.substring(index2);
|
|
|
- message = text1 + "***" + text2;
|
|
|
- }
|
|
|
+ // 隐藏余额后去数据库进行全匹配
|
|
|
+ message = hiddenBalance(message);
|
|
|
+ int index;
|
|
|
+ // 查询数据库,是否存在短信记录,存在就直接读取数据并返回
|
|
|
String md5Msg = Md5Util.md5(message);
|
|
|
- /*查询数据库,是否存在短信记录,存在就直接读取数据并返回*/
|
|
|
- List<DiscernReceiptVo> receiptList = receiptMapper.getReceiptBySmsMd5Code(md5Msg);
|
|
|
- if (!CollectionUtils.isEmpty(receiptList)){
|
|
|
- receiptList.get(0).setTipFeeFlag(tipFeeType.contains(receiptList.get(0).getPayType()));
|
|
|
- return ResponseJson.success(receiptList.get(0));
|
|
|
+ ReceiptVo receiptVo = getReceiptByMd5Msg(md5Msg);
|
|
|
+ if (receiptVo != null) {
|
|
|
+ return ResponseJson.success(receiptVo);
|
|
|
}
|
|
|
-
|
|
|
// 数据库不存在短信记录,执行下面的操作
|
|
|
/*识别收款类别*/
|
|
|
index = message.indexOf("银行");
|
|
@@ -261,13 +552,13 @@ public class ReceiptServiceImpl implements ReceiptService {
|
|
|
}
|
|
|
|
|
|
// 线下收款
|
|
|
- DiscernReceiptVo receipt = new DiscernReceiptVo();
|
|
|
+ ReceiptVo receipt = new ReceiptVo();
|
|
|
receipt.setPayWay(2);
|
|
|
receipt.setPayType(typeId);
|
|
|
receipt.setReceiptDate(time);
|
|
|
receipt.setReceiptAmount(money);
|
|
|
- receipt.setTipFeeFlag(tipFeeFlag);
|
|
|
- receipt.setTipFee(tipFee);
|
|
|
+ receipt.setHaveFee(tipFeeFlag);
|
|
|
+ receipt.setHandlingFee(tipFee);
|
|
|
receipt.setOrderFlag(orderFlag);
|
|
|
receipt.setSmsMd5Code(md5Msg);
|
|
|
receipt.setSmsContent(message);
|
|
@@ -277,5 +568,94 @@ public class ReceiptServiceImpl implements ReceiptService {
|
|
|
return ResponseJson.error("短信识别错误!", null);
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 隐藏短信余额
|
|
|
+ */
|
|
|
+ private String hiddenBalance(String message) {
|
|
|
+ message = message.replace(":", ":").trim();
|
|
|
+ int index = message.indexOf("余额");
|
|
|
+ if (index != -1) {
|
|
|
+ int index2 = message.indexOf("元", index);
|
|
|
+ String text1 = message.substring(0, index + 2);
|
|
|
+ String text2 = message.substring(index2);
|
|
|
+ message = text1 + "***" + text2;
|
|
|
+ }
|
|
|
+ return message;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 查询数据库,是否存在短信记录,存在就直接读取数据并返回
|
|
|
+ */
|
|
|
+ private ReceiptVo getReceiptByMd5Msg(String md5Msg) {
|
|
|
+ List<ReceiptVo> receiptList = receiptMapper.getReceiptBySmsMd5Code(md5Msg);
|
|
|
+ if (!CollectionUtils.isEmpty(receiptList)){
|
|
|
+ receiptList.get(0).setHaveFee(tipFeeType.contains(receiptList.get(0).getPayType()));
|
|
|
+ return receiptList.get(0);
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取未支付金额
|
|
|
+ * @param order 订单
|
|
|
+ * @param flag (true:计算未审核金额,false:不计算)
|
|
|
+ */
|
|
|
+ private Double getUnPayMoney(OrderVo order, Boolean flag) {
|
|
|
+ Double unPayMoney = order.getPayableAmount();
|
|
|
+ Double receivedAmount = getReceivedAmount(order, flag);
|
|
|
+ Double returnValue = getReturnValue(order);
|
|
|
+ unPayMoney = MathUtil.sub(unPayMoney, MathUtil.add(receivedAmount, returnValue)).doubleValue();
|
|
|
+ log.info("------------------剩余应收:" + (unPayMoney >= 0d ? unPayMoney : 0d));
|
|
|
+ return unPayMoney >= 0d ? unPayMoney : 0d;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 计算已收金额(审核通过金额+(待审核金额))//展示的时候需要加待审核金额 实际计算不需要计算
|
|
|
+ * @param order 订单
|
|
|
+ * @param isCountUncheckAmount 是否计算未审核金额
|
|
|
+ */
|
|
|
+ private Double getReceivedAmount(OrderVo order, Boolean isCountUncheckAmount) {
|
|
|
+ Double receivedAmount = 0d;
|
|
|
+
|
|
|
+ if (null != order) {
|
|
|
+ // 获取订单已支付金额(待审核状态的收款也算)
|
|
|
+ Double paidAmount = receiptMapper.getPaidAmountByOrderId(order.getOrderId());
|
|
|
+ receivedAmount += paidAmount;
|
|
|
+ if (!isCountUncheckAmount) {
|
|
|
+ // 获取订单待审核金额
|
|
|
+ Double unCheckAmount = receiptMapper.getUncheckAmount(order.getOrderId());
|
|
|
+ receivedAmount -= unCheckAmount;
|
|
|
+ }
|
|
|
+ if (!isCountUncheckAmount && 1 == order.getReceiptStatus()) {
|
|
|
+ receivedAmount = 0d;
|
|
|
+ }
|
|
|
+ if (receivedAmount < 0d) {
|
|
|
+ receivedAmount = 0d;
|
|
|
+ }
|
|
|
+ if (receivedAmount > order.getPayableAmount()) {
|
|
|
+ receivedAmount = order.getPayableAmount();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return receivedAmount;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取退货退款价值(需计算经理折扣存在的情况)(此金额不是指退给用户的金额)
|
|
|
+ * @param order 订单
|
|
|
+ */
|
|
|
+ private Double getReturnValue(OrderVo order) {
|
|
|
+ // 获取订单已退金额
|
|
|
+ Double returnedAmount = receiptMapper.getReturnedAmount(order.getOrderId());
|
|
|
+ // 经理折扣
|
|
|
+ Double discountFee = order.getDiscountFee();
|
|
|
+ // 如果经理折扣大于退款(退货)总金额之和 那么先抵扣经理折扣 退款价值为0
|
|
|
+ if (discountFee >= returnedAmount) {
|
|
|
+ returnedAmount = 0d;
|
|
|
+ } else {
|
|
|
+ // 抵用完经理折扣后才是真实价值
|
|
|
+ returnedAmount = returnedAmount - discountFee;
|
|
|
+ }
|
|
|
+ return returnedAmount;
|
|
|
+ }
|
|
|
|
|
|
}
|