|
@@ -0,0 +1,2132 @@
|
|
|
+package com.caimei365.order.service.impl;
|
|
|
+
|
|
|
+import com.alibaba.fastjson.JSONObject;
|
|
|
+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.bo.ReceiptParamsBo;
|
|
|
+import com.caimei365.order.model.dto.ReceiptDto;
|
|
|
+import com.caimei365.order.model.dto.ReceiptOperateDto;
|
|
|
+import com.caimei365.order.model.enums.OrderStatus;
|
|
|
+import com.caimei365.order.model.enums.ReceiptStatus;
|
|
|
+import com.caimei365.order.model.enums.ReceiptType;
|
|
|
+import com.caimei365.order.model.po.*;
|
|
|
+import com.caimei365.order.model.vo.*;
|
|
|
+import com.caimei365.order.service.ReceiptService;
|
|
|
+import com.caimei365.order.utils.DateUtils;
|
|
|
+import com.caimei365.order.utils.ImageUtil;
|
|
|
+import com.caimei365.order.utils.MathUtil;
|
|
|
+import com.caimei365.order.utils.Md5Util;
|
|
|
+import com.github.pagehelper.PageHelper;
|
|
|
+import com.github.pagehelper.PageInfo;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.apache.commons.lang3.ArrayUtils;
|
|
|
+import org.apache.commons.lang3.StringUtils;
|
|
|
+import org.springframework.beans.BeanUtils;
|
|
|
+import org.springframework.beans.factory.annotation.Value;
|
|
|
+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.math.BigDecimal;
|
|
|
+import java.util.*;
|
|
|
+import java.util.regex.Matcher;
|
|
|
+import java.util.regex.Pattern;
|
|
|
+
|
|
|
+/**
|
|
|
+ * Description
|
|
|
+ *
|
|
|
+ * @author : Charles
|
|
|
+ * @date : 2022/2/11
|
|
|
+ */
|
|
|
+@Slf4j
|
|
|
+@Service
|
|
|
+public class ReceiptServiceImpl implements ReceiptService {
|
|
|
+ @Value("${caimei.wwwDomain}")
|
|
|
+ private String domain;
|
|
|
+ @Resource
|
|
|
+ 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> TIP_FEE_TYPE = Arrays.asList(4, 5, 6, 11);
|
|
|
+ private static final Pattern PATTERN_NUMBER = Pattern.compile("[\\*0-9\\.:]+");
|
|
|
+ private static final Pattern PATTERN_ORDER = Pattern.compile("#(.*?)#");
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 线下收款用户微信授权
|
|
|
+ *
|
|
|
+ * @param code 微信授权code
|
|
|
+ * @param encryptedData 微信加密数据
|
|
|
+ * @param iv 加密算法的初始向量
|
|
|
+ * @return receiptUser
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public ResponseJson<ReceiptUserVo> receiptAuthorization(String code, String encryptedData, String iv, HttpHeaders headers) {
|
|
|
+ // 小程序微信授权获取登录信息
|
|
|
+ ResponseJson<Map<String, Object>> appletsInfo = weChatService.getInfoMapByApplets(code, headers, 2);
|
|
|
+ if (appletsInfo.getCode() == -1) {
|
|
|
+ return ResponseJson.error(appletsInfo.getMsg(), null);
|
|
|
+ }
|
|
|
+ Map<String, Object> infoData = appletsInfo.getData();
|
|
|
+ String openid = (String) infoData.get(WeChatService.Keys.OPEN_ID);
|
|
|
+ if (StringUtils.isNotBlank(openid)) {
|
|
|
+ // 收款用户
|
|
|
+ ReceiptUserVo receiptUser = receiptMapper.getReceiptUserByOpenid(openid);
|
|
|
+ if (null != receiptUser) {
|
|
|
+ // 用户权限: 1收款列表访问,2收款详情访问,3收款录入,4收款关联订单,5收款关联返佣,6收款关联供应商退款,7收款审核
|
|
|
+ List<Integer> permissions = receiptMapper.getPermissionsByUserId(receiptUser.getId());
|
|
|
+ receiptUser.setPermissions(permissions);
|
|
|
+ return ResponseJson.success(receiptUser);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return ResponseJson.error("微信授权失败,请尝试账号密码登录!", null);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 线下收款用户密码登录
|
|
|
+ *
|
|
|
+ * @param mobile 手机号
|
|
|
+ * @param password 密码
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public ResponseJson<ReceiptUserVo> passwordAuthorization(String mobile, String password, String code, String encryptedData, String iv, HttpHeaders headers) {
|
|
|
+ // 收款用户
|
|
|
+ ReceiptUserVo receiptUser = receiptMapper.getReceiptUserByMobile(mobile);
|
|
|
+ if (null != receiptUser) {
|
|
|
+ // 比对密码
|
|
|
+ String md5Password = Md5Util.md5(password);
|
|
|
+ String dbPassword = receiptUser.getPassword();
|
|
|
+ if (md5Password.equals(dbPassword)) {
|
|
|
+ // 小程序微信授权获取登录信息
|
|
|
+ ResponseJson<Map<String, Object>> appletsInfo = weChatService.getInfoMapByApplets(code, headers, 2);
|
|
|
+ if (appletsInfo.getCode() != -1) {
|
|
|
+ Map<String, Object> infoData = appletsInfo.getData();
|
|
|
+ String openid = (String) infoData.get(WeChatService.Keys.OPEN_ID);
|
|
|
+ String unionId = (String) infoData.get(WeChatService.Keys.UNION_ID);
|
|
|
+ if (StringUtils.isBlank(unionId)) {
|
|
|
+ try {
|
|
|
+ String sessionKey = (String) infoData.get(WeChatService.Keys.SESSION_KEY);
|
|
|
+ String result = WeChatService.decrypt(encryptedData, sessionKey, iv, "UTF-8");
|
|
|
+ log.info("解密数据>>>>>>" + result);
|
|
|
+ Map parseMap = JSONObject.parseObject(result, Map.class);
|
|
|
+ assert parseMap != null;
|
|
|
+ unionId = parseMap.get(WeChatService.Keys.UNION_ID).toString();
|
|
|
+ infoData.put(WeChatService.Keys.UNION_ID, unionId);
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("微信解密unionId失败:", e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ receiptUser.setOpenid(openid);
|
|
|
+ receiptUser.setUnionId(unionId);
|
|
|
+ receiptMapper.updateOpenidByMobile(openid, unionId, mobile);
|
|
|
+ } else {
|
|
|
+ return ResponseJson.error(appletsInfo.getMsg(), null);
|
|
|
+ }
|
|
|
+ // 用户权限: 1收款列表访问,2收款详情访问,3收款录入,4收款关联订单,5收款关联返佣,6收款关联供应商退款,7收款审核
|
|
|
+ List<Integer> permissions = receiptMapper.getPermissionsByUserId(receiptUser.getId());
|
|
|
+ receiptUser.setPermissions(permissions);
|
|
|
+ return ResponseJson.success(receiptUser);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return ResponseJson.error("登录失败!", null);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取收款类型
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public ResponseJson<List<ReceiptTypeVo>> getReceiptType() {
|
|
|
+ List<ReceiptTypeVo> list = receiptMapper.getReceiptType();
|
|
|
+ return ResponseJson.success(list);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 识别收款短信
|
|
|
+ *
|
|
|
+ * @param smsContent 收款短信
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public ResponseJson<ReceiptVo> readSmsMessage(String smsContent, HttpHeaders headers) {
|
|
|
+ // 检查收款用户权限
|
|
|
+ ReceiptUserVo receiptUser = checkPermissions(3, headers);
|
|
|
+ if (null == receiptUser) {
|
|
|
+ return ResponseJson.error("无权限操作!", null);
|
|
|
+ }
|
|
|
+ String md5Msg = Md5Util.md5(smsContent);
|
|
|
+ ReceiptVo receiptVo = getReceiptByMd5Msg(md5Msg);
|
|
|
+ if (receiptVo != null) {
|
|
|
+ // 短信已存在不需要识别
|
|
|
+ return ResponseJson.error("短信已存在不需要重复识别", null);
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ // 识别短信内容
|
|
|
+ ResponseJson<ReceiptVo> receipt = identifyMessage(smsContent);
|
|
|
+ if (receipt != null) {
|
|
|
+ return receipt;
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("短信识别错误!", e);
|
|
|
+ }
|
|
|
+ return ResponseJson.error("短信识别错误!", null);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 保存收款信息
|
|
|
+ */
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ @Override
|
|
|
+ public ResponseJson<ReceiptPo> saveReceipt(ReceiptDto receiptDto, HttpHeaders headers) {
|
|
|
+ // 检查收款用户权限
|
|
|
+ ReceiptUserVo receiptUser = checkPermissions(3, headers);
|
|
|
+ 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);
|
|
|
+ // 默认不自动确认审核
|
|
|
+ receiptPo.setAutoAuditFlag(0);
|
|
|
+ if (StringUtils.isNotBlank(receiptDto.getSmsContent())) {
|
|
|
+ receiptPo.setSmsMd5Code(Md5Util.md5(receiptDto.getSmsContent()));
|
|
|
+ }
|
|
|
+ if (null != receiptDto.getId()) {
|
|
|
+ return ResponseJson.error("接口调用错误,该接口用作保存收款信息", null);
|
|
|
+ } else {
|
|
|
+ // 如果是添加收款则判断是否存在重复添加
|
|
|
+ if (StringUtils.isNotBlank(receiptDto.getSmsContent()) && null != receiptDto.getPayWay()) {
|
|
|
+ // 无短信备注内容短信无需判断(payWay传值的话是短信识别来的)
|
|
|
+ String md5Msg = Md5Util.md5(receiptDto.getSmsContent());
|
|
|
+ ReceiptVo receiptVo = getReceiptByMd5Msg(md5Msg);
|
|
|
+ if (receiptVo != null) {
|
|
|
+ // 短信已存在不需要识别
|
|
|
+ receiptPo.setSmsContentPresenceFlag(1);
|
|
|
+ return ResponseJson.success(receiptPo);
|
|
|
+ } else {
|
|
|
+ receiptPo.setSmsContentPresenceFlag(0);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (StringUtils.isNotBlank(receiptDto.getSmsContent())) {
|
|
|
+ String message = receiptDto.getSmsContent().trim();
|
|
|
+ // 隐藏余额
|
|
|
+ message = hiddenBalance(message);
|
|
|
+ receiptPo.setSmsContent(message);
|
|
|
+ }
|
|
|
+ // 收款款项类型receiptType:2非订单款
|
|
|
+ if (null != receiptDto.getReceiptType() && 2 == 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直接通过订单标识审核收款 */
|
|
|
+ Integer orderFlag = receiptDto.getOrderFlag();
|
|
|
+ // 参数订单标识
|
|
|
+ log.info("收款订单标识>>>>>>" + orderFlag);
|
|
|
+ // 订单款时才走自动关联
|
|
|
+ if (null != receiptDto.getOrderFlag() && null != receiptDto.getReceiptType() && 1 == receiptDto.getReceiptType()) {
|
|
|
+ if (null != orderFlag && orderFlag > 0) {
|
|
|
+ // 订单信息
|
|
|
+ OrderVo order = orderCommonMapper.getOrderByOrderId(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 + ")已全部收款,无需再收款!", receiptPo);
|
|
|
+ }
|
|
|
+ // 收款项和订单关系表
|
|
|
+ OrderReceiptRelationPo relation = new OrderReceiptRelationPo();
|
|
|
+ relation.setDelFlag(0);
|
|
|
+ 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) {
|
|
|
+ // 防止使用短信操作已支付或者为确认的订单。
|
|
|
+ receiptPo.setAutoAuditFlag(0);
|
|
|
+ return ResponseJson.success(receiptPo);
|
|
|
+ }
|
|
|
+ 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 (null != receiptPo.getConfirmType() && 3 == 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.updateUserMoney(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);
|
|
|
+
|
|
|
+ /* 保存订单关系之后自动审核*/
|
|
|
+ receiptPo.setAutoAuditFlag(1);
|
|
|
+
|
|
|
+ } else {//针对订单号异常或订单不存在的则继续分享人工确认
|
|
|
+ receiptPo.setAutoAuditFlag(0);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ // 针对没有订单号的也是走老流程
|
|
|
+ receiptPo.setAutoAuditFlag(0);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return ResponseJson.success(receiptPo);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 操作收款信息(作废,设为返佣/普通/供应商退款/)
|
|
|
+ *
|
|
|
+ * @param receiptOperateDto {
|
|
|
+ * id:收款Id
|
|
|
+ * receiptType: 1订单款,2非订单款,3返佣款 4订单款或者非订单款(因财务阶段无法区分订单非订单), 5供应商退款
|
|
|
+ * noOrderReason: 非订单款说明
|
|
|
+ * delFlag: 作废标记: 0否,其余是
|
|
|
+ * }
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public ResponseJson<ReceiptPo> operateReceipt(ReceiptOperateDto receiptOperateDto, HttpHeaders headers) {
|
|
|
+ // 检查收款用户权限
|
|
|
+ ReceiptUserVo receiptUser = checkPermissions(3, headers);
|
|
|
+ if (null == receiptUser) {
|
|
|
+ return ResponseJson.error("无权限操作!", null);
|
|
|
+ }
|
|
|
+ ReceiptVo receipt = receiptMapper.getReceiptDetail(receiptOperateDto.getId());
|
|
|
+ if (null == receipt) {
|
|
|
+ return ResponseJson.error("收款数据异常!", null);
|
|
|
+ }
|
|
|
+ String time = DateUtils.getDateTime();
|
|
|
+ ReceiptPo receiptPo = new ReceiptPo();
|
|
|
+ receiptPo.setId(receiptOperateDto.getId());
|
|
|
+ receiptPo.setUpdateDate(time);
|
|
|
+ // 收款作废
|
|
|
+ if (null != receiptOperateDto.getDelFlag() && receiptOperateDto.getDelFlag() > 0) {
|
|
|
+ // 收款状态receiptStatus:2已确认(待审核)、3审核通过
|
|
|
+ if (null != receipt.getReceiptStatus() && (2 == receipt.getReceiptStatus() || 3 == receipt.getReceiptStatus())) {
|
|
|
+ // 收款款项类型receiptType:1订单款
|
|
|
+ if (null != receipt.getReceiptType() && 1 == receipt.getReceiptType()) {
|
|
|
+ return ResponseJson.error(-2, "该收款已关联了订单,不能作废!请刷新页面查看最新数据", null);
|
|
|
+ }
|
|
|
+ // 收款款项类型receiptType:3返佣款
|
|
|
+ else if (null != receipt.getReceiptType() && 3 == receipt.getReceiptType()) {
|
|
|
+ return ResponseJson.error(-2, "该收款已关联了返佣订单,不能作废!请刷新页面查看最新数据", null);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ receiptPo.setDelFlag(receiptOperateDto.getDelFlag());
|
|
|
+ }
|
|
|
+ receiptPo.setReceiptType(receiptOperateDto.getReceiptType());
|
|
|
+ // 收款款项类型receiptType:2非订单款
|
|
|
+ if (null != receiptOperateDto.getReceiptType() && 2 == receiptOperateDto.getReceiptType()) {
|
|
|
+ receiptPo.setNoOrderReason(receiptOperateDto.getNoOrderReason());
|
|
|
+ receiptPo.setReceiptStatus(2);
|
|
|
+ receiptPo.setConfirmUserPermissionId(receiptUser.getId());
|
|
|
+ receiptPo.setConfirmDate(time);
|
|
|
+ }
|
|
|
+ // 更新收款记录
|
|
|
+ receiptMapper.updateReceipt(receiptPo);
|
|
|
+ return ResponseJson.success(receiptPo);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取收款列表
|
|
|
+ *
|
|
|
+ * @param receiptType 收款款项类型:1订单款,2非订单款,3返佣款 4订单款或者非订单款(因财务阶段无法区分订单非订单) 5供应商退款
|
|
|
+ * @param receiptStatus 收款状态:1待确认、2已确认(待审核)、3审核通过、4审核未通过、5收款撤销【线上支付成功为审核通过】
|
|
|
+ * @param smsContent 收款短信
|
|
|
+ * @param startDate 筛选开始时间
|
|
|
+ * @param endDate 筛选结束时间
|
|
|
+ * @param pageNum 页码
|
|
|
+ * @param pageSize 每页数量
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public ResponseJson<PageInfo<ReceiptVo>> getReceiptList(Integer receiptType, Integer receiptStatus, String smsContent, String startDate, String endDate, int pageNum, int pageSize, HttpHeaders headers) {
|
|
|
+ // 检查收款用户权限
|
|
|
+ ReceiptUserVo receiptUser = checkPermissions(1, headers);
|
|
|
+ if (null == receiptUser) {
|
|
|
+ return ResponseJson.error("无权限操作!", null);
|
|
|
+ }
|
|
|
+ ReceiptParamsBo paramsBo = new ReceiptParamsBo();
|
|
|
+ if (StringUtils.isNotBlank(smsContent)) {
|
|
|
+ // 短信内容隐藏余额
|
|
|
+ String message = hiddenBalance(smsContent);
|
|
|
+ paramsBo.setSmsMd5Code(Md5Util.md5(message));
|
|
|
+ }
|
|
|
+ if (null != receiptStatus && receiptStatus > 0) {
|
|
|
+ String[] receiptStatusArr;
|
|
|
+ if (1 == receiptStatus) {
|
|
|
+ receiptStatusArr = "1,4,5".split(",");
|
|
|
+ } else {
|
|
|
+ receiptStatusArr = receiptStatus.toString().split(",");
|
|
|
+ }
|
|
|
+ paramsBo.setReceiptStatusArr(receiptStatusArr);
|
|
|
+ }
|
|
|
+ // 用户openid
|
|
|
+ String openid = headers.getFirst("x-openid");
|
|
|
+ // 获取该收款用户下的机构userIds
|
|
|
+ List<Integer> clubUserIds = getReceiptClubUserIds(openid, receiptStatus);
|
|
|
+ paramsBo.setUserIds(clubUserIds);
|
|
|
+ paramsBo.setReceiptType(receiptType);
|
|
|
+ paramsBo.setStartDate(startDate);
|
|
|
+ paramsBo.setEndDate(endDate);
|
|
|
+ // 分页请求数据
|
|
|
+ PageHelper.startPage(pageNum, pageSize);
|
|
|
+ List<ReceiptVo> list = receiptMapper.getReceiptList(paramsBo);
|
|
|
+ for (ReceiptVo receipt : list) {
|
|
|
+ if (null != receipt) {
|
|
|
+ setReceiptDetail(receipt);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ PageInfo<ReceiptVo> pageInfo = new PageInfo(list);
|
|
|
+ return ResponseJson.success(pageInfo);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 收款详情(订单/非订单)
|
|
|
+ *
|
|
|
+ * @param id 款项Id
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public ResponseJson<ReceiptVo> getReceiptDetail(Integer id, HttpHeaders headers) {
|
|
|
+ // 检查收款用户权限
|
|
|
+ ReceiptUserVo receiptUser = checkPermissions(2, headers);
|
|
|
+ if (null == receiptUser) {
|
|
|
+ return ResponseJson.error("无权限操作!", null);
|
|
|
+ }
|
|
|
+ ReceiptVo receipt = receiptMapper.getReceiptDetail(id);
|
|
|
+ if (null != receipt) {
|
|
|
+ setReceiptDetail(receipt);
|
|
|
+ List<OrderVo> orderList = new ArrayList<>();
|
|
|
+ if (null != receipt.getReceiptStatus() && 1 == receipt.getReceiptStatus()) {
|
|
|
+ // 待确认
|
|
|
+ if (StringUtils.isNotBlank(receipt.getOrderFlag())) {
|
|
|
+ // 订单信息
|
|
|
+ OrderVo order = orderCommonMapper.getOrderByOrderId(Integer.parseInt(receipt.getOrderFlag()));
|
|
|
+ if (null != order) {
|
|
|
+ orderList.add(order);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ log.info("--------待确认--------");
|
|
|
+ } else {
|
|
|
+ // 已确认
|
|
|
+ orderList = receiptMapper.getReceiptOrders(receipt.getId());
|
|
|
+ log.info("--------已确认--------");
|
|
|
+ }
|
|
|
+ if (!CollectionUtils.isEmpty(orderList)) {
|
|
|
+ // 用户openid
|
|
|
+ String openid = headers.getFirst("x-openid");
|
|
|
+ // 获取该收款用户下的机构userIds
|
|
|
+ List<Integer> clubUserIds = getReceiptClubUserIds(openid, receipt.getReceiptStatus());
|
|
|
+ for (OrderVo order : orderList) {
|
|
|
+ if (4 == receiptUser.getUserType() || clubUserIds.contains(order.getUserId())) {
|
|
|
+ // 收款详情是否可以查看
|
|
|
+ order.setAuthority(true);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ receipt.setOrderList(orderList);
|
|
|
+ }
|
|
|
+ return ResponseJson.success(receipt);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 收款详情的款项类型
|
|
|
+ *
|
|
|
+ * @param id 款项Id
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public ResponseJson<Map<String, Integer>> getReceiptDetailType(Integer id, HttpHeaders headers) {
|
|
|
+ // 检查收款用户权限: 1收款列表访问,2收款详情访问,3收款录入,4收款关联订单,5收款关联返佣,6收款关联供应商退款,7收款审核
|
|
|
+ ReceiptUserVo receiptUser = checkPermissions(0, headers);
|
|
|
+ if (null == receiptUser) {
|
|
|
+ return ResponseJson.error("无权限操作!", null);
|
|
|
+ }
|
|
|
+ ReceiptVo receipt = receiptMapper.getReceiptDetail(id);
|
|
|
+ Map<String, Integer> map = new HashMap<>();
|
|
|
+ map.put("id", id);
|
|
|
+ if (null != receipt) {
|
|
|
+ map.put("receiptType", receipt.getReceiptType());
|
|
|
+ map.put("receiptStatus", receipt.getReceiptStatus());
|
|
|
+ }
|
|
|
+ return ResponseJson.success(map);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 收款详情(供应商退款)
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public ResponseJson<ReceiptVo> getReceiptRefundDetail(Integer id, HttpHeaders headers) {
|
|
|
+ // 检查收款用户权限: 1收款列表访问,2收款详情访问,3收款录入,4收款关联订单,5收款关联返佣,6收款关联供应商退款,7收款审核
|
|
|
+ ReceiptUserVo receiptUser = checkPermissions(6, headers);
|
|
|
+ if (null == receiptUser) {
|
|
|
+ return ResponseJson.error("无权限操作!", null);
|
|
|
+ }
|
|
|
+ ReceiptVo receipt = receiptMapper.getReceiptDetail(id);
|
|
|
+ if (null != receipt) {
|
|
|
+ setReceiptDetail(receipt);
|
|
|
+ }
|
|
|
+ return ResponseJson.success(receipt);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 收款详情(返佣款)
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public ResponseJson<ReceiptVo> getReceiptRebateDetail(Integer id, HttpHeaders headers) {
|
|
|
+ // 检查收款用户权限: 1收款列表访问,2收款详情访问,3收款录入,4收款关联订单,5收款关联返佣,6收款关联供应商退款,7收款审核
|
|
|
+ ReceiptUserVo receiptUser = checkPermissions(5, headers);
|
|
|
+ if (null == receiptUser) {
|
|
|
+ return ResponseJson.error("无权限操作!", null);
|
|
|
+ }
|
|
|
+ ReceiptVo receipt = receiptMapper.getReceiptDetail(id);
|
|
|
+ if (null != receipt) {
|
|
|
+ setReceiptDetail(receipt);
|
|
|
+ }
|
|
|
+ return ResponseJson.success(receipt);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 收款详情-订单列表
|
|
|
+ *
|
|
|
+ * @param id 收款ID
|
|
|
+ * @param organizeId 组织ID
|
|
|
+ * @param orderReceiptStatus 订单收款状态:1待收款,2部分收款,3已收款
|
|
|
+ * @param keyword 搜索关键词(客户名称/订单号)
|
|
|
+ * @param pageNum 页码
|
|
|
+ * @param pageSize 每页数量
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public ResponseJson<PageInfo<OrderVo>> getReceiptOrderList(Integer id, Integer type, Integer organizeId, String orderReceiptStatus, String keyword, int pageNum, int pageSize, HttpHeaders headers) {
|
|
|
+ // 检查收款用户权限
|
|
|
+ ReceiptUserVo receiptUser = checkPermissions(2, headers);
|
|
|
+ if (null == receiptUser) {
|
|
|
+ return ResponseJson.error("无权限操作!", null);
|
|
|
+ }
|
|
|
+ if (StringUtils.isBlank(orderReceiptStatus)) {
|
|
|
+ orderReceiptStatus = "1,2";
|
|
|
+ }
|
|
|
+ ReceiptVo receipt = receiptMapper.getReceiptDetail(id);
|
|
|
+ if (null == receipt) {
|
|
|
+ return ResponseJson.error("收款数据异常!", null);
|
|
|
+ }
|
|
|
+ Integer excludeOrderId = null;
|
|
|
+ try {
|
|
|
+ excludeOrderId = Integer.parseInt(receipt.getOrderFlag());
|
|
|
+ } catch (NumberFormatException e) {
|
|
|
+ log.info("---------此收款无订单标注------");
|
|
|
+ }
|
|
|
+ String[] receiptStatusArr = orderReceiptStatus.split(",");
|
|
|
+ List<Integer> orderStatus;
|
|
|
+ boolean receiptFlag = false;
|
|
|
+ if (ArrayUtils.contains(receiptStatusArr, "3")) {
|
|
|
+ orderStatus = Arrays.asList(4, 5, 31, 32, 33);
|
|
|
+ receiptFlag = true;
|
|
|
+ } else {
|
|
|
+ orderStatus = Arrays.asList(11, 12, 13, 21, 22, 23);
|
|
|
+ }
|
|
|
+ if (null == type || 0 == type) {
|
|
|
+ type = 0;
|
|
|
+ }
|
|
|
+ // 用户openid
|
|
|
+ String openid = headers.getFirst("x-openid");
|
|
|
+ // 获取该收款用户下的机构userIds
|
|
|
+ List<Integer> userIds = getReceiptClubUserIds(openid, receipt.getReceiptStatus());
|
|
|
+ String userName;
|
|
|
+ Integer orderId = null;
|
|
|
+ try {
|
|
|
+ orderId = Integer.parseInt(keyword);
|
|
|
+ } catch (NumberFormatException ignored) {
|
|
|
+ }
|
|
|
+ if (null != orderId && orderId.toString().length() == keyword.length()) {
|
|
|
+ userName = "";
|
|
|
+ } else {
|
|
|
+ userName = keyword;
|
|
|
+ }
|
|
|
+ ReceiptParamsBo params = new ReceiptParamsBo();
|
|
|
+ params.setUserIds(userIds);
|
|
|
+ params.setOrderId(orderId);
|
|
|
+ params.setExcludeOrderId(excludeOrderId);
|
|
|
+ params.setReceiptStatusArr(receiptStatusArr);
|
|
|
+ params.setOrderStatusList(orderStatus);
|
|
|
+ params.setUserName(userName);
|
|
|
+ params.setOrganizeId(organizeId);
|
|
|
+ params.setOrderType(type);
|
|
|
+ // 分页请求数据
|
|
|
+ PageHelper.startPage(pageNum, pageSize);
|
|
|
+ // 将有订单标识的订单放到列表的首位显示
|
|
|
+ List<OrderVo> orderList = receiptMapper.getOrderListByParams(params);
|
|
|
+ Iterator<OrderVo> iterator = orderList.iterator();
|
|
|
+ while (iterator.hasNext()) {
|
|
|
+ OrderVo order = iterator.next();
|
|
|
+ Integer receiptOnlineId = receiptMapper.getOnlineReceiptId(order.getOrderId());
|
|
|
+ if (null != receiptOnlineId && receiptOnlineId > 0) {
|
|
|
+ // 排除线上支付订单
|
|
|
+ iterator.remove();
|
|
|
+ } else {
|
|
|
+ // 存在退款中的记录 (0:否,1:是)
|
|
|
+ Integer haveReturning = receiptMapper.countHaveReturning(order.getOrderId());
|
|
|
+ if (null != haveReturning && haveReturning > 0) {
|
|
|
+ haveReturning = 1;
|
|
|
+ } else {
|
|
|
+ haveReturning = 0;
|
|
|
+ }
|
|
|
+ order.setHaveReturning(haveReturning.toString());
|
|
|
+ // 存在收款中的记录 (0:否,1:是)
|
|
|
+ Integer haveReceipting = receiptMapper.countHaveReceipting(order.getOrderId());
|
|
|
+ if (null != haveReceipting && haveReceipting > 0) {
|
|
|
+ haveReceipting = 1;
|
|
|
+ } else {
|
|
|
+ haveReceipting = 0;
|
|
|
+ }
|
|
|
+ order.setHaveReceipting(haveReceipting.toString());
|
|
|
+ if (receiptFlag) {
|
|
|
+ order.setSurplusAmount(0d);
|
|
|
+ }
|
|
|
+ // 设置订单的款项信息
|
|
|
+ setOrderAmountInfo(order);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ PageInfo<OrderVo> pageInfo = new PageInfo(orderList);
|
|
|
+ return ResponseJson.success(pageInfo);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 收款详情-订单详情
|
|
|
+ *
|
|
|
+ * @param orderId 订单Id
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public ResponseJson<OrderVo> getReceiptOrderInfo(Integer orderId, HttpHeaders headers) {
|
|
|
+ // 检查收款用户权限
|
|
|
+ ReceiptUserVo receiptUser = checkPermissions(2, headers);
|
|
|
+ if (null == receiptUser) {
|
|
|
+ return ResponseJson.error("无权限操作!", null);
|
|
|
+ }
|
|
|
+ // 订单信息
|
|
|
+ OrderVo order = orderCommonMapper.getOrderByOrderId(orderId);
|
|
|
+ // 设置订单的款项信息
|
|
|
+ setOrderAmountInfo(order);
|
|
|
+ // 子订单信息
|
|
|
+ List<ShopOrderVo> shopOrderList = orderCommonMapper.getShopOrderListByOrderId(order.getOrderId());
|
|
|
+ shopOrderList.removeIf(s -> s.getShopId() == 998);
|
|
|
+ // 订单商品信息
|
|
|
+ double totalAddedValueTax = 0d;
|
|
|
+ for (ShopOrderVo shopOrder : shopOrderList) {
|
|
|
+ // 供应商名称
|
|
|
+ String shopName = baseMapper.getShopNameById(shopOrder.getShopId());
|
|
|
+ shopOrder.setShopName(shopName);
|
|
|
+ List<OrderProductVo> orderProductList = orderCommonMapper.getShopOrderProduct(shopOrder.getShopOrderId());
|
|
|
+ for (OrderProductVo orderProduct : orderProductList) {
|
|
|
+ if (null != orderProduct.getTotalAddedValueTax()) {
|
|
|
+ totalAddedValueTax = MathUtil.add(totalAddedValueTax, orderProduct.getTotalAddedValueTax()).doubleValue();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ shopOrder.setOrderProductList(orderProductList);
|
|
|
+ }
|
|
|
+ order.setTotalAddedValueTax(totalAddedValueTax);
|
|
|
+ order.setShopOrderList(shopOrderList);
|
|
|
+ return ResponseJson.success(order);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 供应商退款-子订单列表
|
|
|
+ *
|
|
|
+ * @param id 收款ID
|
|
|
+ * @param confirmedType 0待确认,2已确认子订单
|
|
|
+ * @param shopName 供应商名称
|
|
|
+ * @param keyword 搜索关键词(客户名称/订单号)
|
|
|
+ * @param pageNum 页码
|
|
|
+ * @param pageSize 每页数量
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public ResponseJson<PageInfo<ShopOrderVo>> getRefundShopOrderList(Integer id, Integer confirmedType, String shopName, String keyword, int pageNum, int pageSize, HttpHeaders headers) {
|
|
|
+ // 检查收款用户权限
|
|
|
+ ReceiptUserVo receiptUser = checkPermissions(2, headers);
|
|
|
+ if (null == receiptUser) {
|
|
|
+ return ResponseJson.error("无权限操作!", null);
|
|
|
+ }
|
|
|
+ List<ShopOrderVo> shopOrderList;
|
|
|
+ PageHelper.startPage(pageNum, pageSize);
|
|
|
+ if (id != null && id > 0) {
|
|
|
+ // 已关联子订单,展示关联信息
|
|
|
+ shopOrderList = receiptMapper.getShopOrderListByReceiptId(id);
|
|
|
+ for (ShopOrderVo shopOrder : shopOrderList) {
|
|
|
+ setReceiptedAmount(shopOrder);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ String userName = keyword;
|
|
|
+ Integer orderId = null;
|
|
|
+ try {
|
|
|
+ orderId = Integer.parseInt(keyword);
|
|
|
+ } catch (NumberFormatException ignored) {
|
|
|
+ }
|
|
|
+ if (null != orderId && orderId.toString().length() == keyword.length()) {
|
|
|
+ userName = "";
|
|
|
+ }
|
|
|
+ //没有关联子订单,根据shopName搜索子订单进行关联
|
|
|
+ //这里的子订单 必须满足 它的主订单只进行过返佣收款或者主订单根本没有收过款
|
|
|
+ shopOrderList = receiptMapper.getRefundShopOrders(confirmedType, shopName, userName, orderId);
|
|
|
+ for (ShopOrderVo shopOrder : shopOrderList) {
|
|
|
+ setReceiptedAmount(shopOrder);
|
|
|
+ if (confirmedType != null && confirmedType == 2) {
|
|
|
+ shopOrder.setHaveReturning("1");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ PageInfo<ShopOrderVo> pageInfo = new PageInfo(shopOrderList);
|
|
|
+ return ResponseJson.success(pageInfo);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 供应商退款-订单详情
|
|
|
+ *
|
|
|
+ * @param orderId 订单Id
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public ResponseJson<OrderVo> getRefundShopOrderInfo(Integer orderId, HttpHeaders headers) {
|
|
|
+ // 检查收款用户权限
|
|
|
+ ReceiptUserVo receiptUser = checkPermissions(2, headers);
|
|
|
+ if (null == receiptUser) {
|
|
|
+ return ResponseJson.error("无权限操作!", null);
|
|
|
+ }
|
|
|
+ // 订单信息
|
|
|
+ OrderVo order = orderCommonMapper.getOrderByOrderId(orderId);
|
|
|
+ // 设置订单的款项信息
|
|
|
+ setOrderAmountInfo(order);
|
|
|
+ // 子订单信息
|
|
|
+ List<ShopOrderVo> shopOrderList = orderCommonMapper.getShopOrderListByOrderId(order.getOrderId());
|
|
|
+ // 订单商品信息
|
|
|
+ double needPayAmount = 0d;
|
|
|
+ for (ShopOrderVo shopOrder : shopOrderList) {
|
|
|
+ // 供应商名称
|
|
|
+ String shopName = baseMapper.getShopNameById(shopOrder.getShopId());
|
|
|
+ shopOrder.setShopName(shopName);
|
|
|
+ needPayAmount += (shopOrder.getNeedPayAmount() == null ? 0d : shopOrder.getNeedPayAmount());
|
|
|
+ List<OrderProductVo> orderProductList = orderCommonMapper.getShopOrderProduct(shopOrder.getShopOrderId());
|
|
|
+ for (OrderProductVo orderProduct : orderProductList) {
|
|
|
+ orderProduct.setImage(ImageUtil.getImageUrl("product", orderProduct.getImage(), domain));
|
|
|
+ }
|
|
|
+ shopOrder.setOrderProductList(orderProductList);
|
|
|
+ List<Integer> rebatePayType = receiptMapper.getRebatePayTypeList(shopOrder.getShopOrderId());
|
|
|
+ if (CollectionUtils.isEmpty(rebatePayType)) {
|
|
|
+ // 没返佣
|
|
|
+ shopOrder.setReceiptedFlag(0);
|
|
|
+ } else if (10 == rebatePayType.get(0)) {
|
|
|
+ // 口头返佣
|
|
|
+ shopOrder.setReceiptedType(10);
|
|
|
+ shopOrder.setReceiptedFlag(1);
|
|
|
+ } else {
|
|
|
+ shopOrder.setReceiptedType(1);
|
|
|
+ shopOrder.setReceiptedFlag(1);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ order.setShopOrderList(shopOrderList);
|
|
|
+ //收款金额
|
|
|
+ if (null != order.getRebateFlag() && 1 == order.getRebateFlag()) {
|
|
|
+ order.setReceiptAmount(needPayAmount);
|
|
|
+ double surplusAmount = MathUtil.sub(order.getPayTotalFee(), needPayAmount).doubleValue();
|
|
|
+ order.setSurplusAmount(surplusAmount);
|
|
|
+ } else {
|
|
|
+ // 获取订单已支付金额
|
|
|
+ Double paidAmount = receiptMapper.getPaidAmountByOrderId(order.getOrderId());
|
|
|
+ order.setReceiptAmount(paidAmount);
|
|
|
+ double surplusAmount = MathUtil.sub(order.getPayTotalFee(), paidAmount).doubleValue();
|
|
|
+ order.setSurplusAmount(surplusAmount);
|
|
|
+ }
|
|
|
+ return ResponseJson.success(order);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 返佣款-子订单列表
|
|
|
+ *
|
|
|
+ * @param id 返佣收款ID
|
|
|
+ * @param shopName 供应商名称
|
|
|
+ * @param pageNum 页码
|
|
|
+ * @param pageSize 每页数量
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public ResponseJson<PageInfo<ShopOrderVo>> getRebateShopOrderList(Integer id, String shopName, int pageNum, int pageSize, HttpHeaders headers) {
|
|
|
+ // 检查收款用户权限
|
|
|
+ ReceiptUserVo receiptUser = checkPermissions(2, headers);
|
|
|
+ if (null == receiptUser) {
|
|
|
+ return ResponseJson.error("无权限操作!", null);
|
|
|
+ }
|
|
|
+ List<ShopOrderVo> shopOrderList;
|
|
|
+ PageHelper.startPage(pageNum, pageSize);
|
|
|
+ if (id != null && id > 0) {
|
|
|
+ // 已关联子订单,展示关联信息
|
|
|
+ shopOrderList = receiptMapper.getShopOrderListByReceiptId(id);
|
|
|
+ for (ShopOrderVo shopOrder : shopOrderList) {
|
|
|
+ setReceiptedAmount(shopOrder);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ //没有关联子订单,根据shopName搜索子订单进行关联
|
|
|
+ //这里的子订单 必须满足 它的主订单只进行过返佣收款或者主订单根本没有收过款
|
|
|
+ shopOrderList = receiptMapper.getRebateShopOrders(shopName);
|
|
|
+ for (ShopOrderVo shopOrder : shopOrderList) {
|
|
|
+ setReceiptedAmount(shopOrder);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ PageInfo<ShopOrderVo> pageInfo = new PageInfo(shopOrderList);
|
|
|
+ return ResponseJson.success(pageInfo);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 关联收款信息
|
|
|
+ *
|
|
|
+ * @param receiptOperateDto {
|
|
|
+ * id: 收款Id
|
|
|
+ * orderIds: 关联订单IDS
|
|
|
+ * confirmType: 确认订单类型:1小额抹平确认,2大额抹平确认,3大额退款余额,4确认关联
|
|
|
+ * noOrderReason: 非订单款说明
|
|
|
+ * }
|
|
|
+ */
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ @Override
|
|
|
+ public ResponseJson<Void> receiptAssociate(ReceiptOperateDto receiptOperateDto, HttpHeaders headers) {
|
|
|
+ // 检查收款用户权限: 4收款关联订单
|
|
|
+ ReceiptUserVo receiptUser = checkPermissions(4, headers);
|
|
|
+ if (null == receiptUser) {
|
|
|
+ return ResponseJson.error("无权限操作!", null);
|
|
|
+ }
|
|
|
+ ReceiptVo receipt = receiptMapper.getReceiptDetail(receiptOperateDto.getId());
|
|
|
+ if (null == receipt) {
|
|
|
+ return ResponseJson.error("收款数据异常!", null);
|
|
|
+ }
|
|
|
+ // 删除之前与这个收款所有的关系
|
|
|
+ receiptMapper.deleteReceiptRelation(receipt.getId());
|
|
|
+ // ReceiptVo -- copy to --> ReceiptPo
|
|
|
+ String time = DateUtils.getDateTime();
|
|
|
+ ReceiptPo receiptPo = new ReceiptPo();
|
|
|
+ BeanUtils.copyProperties(receipt, receiptPo);
|
|
|
+ receiptPo.setUpdateDate(time);
|
|
|
+ receiptPo.setReceiptStatus(2);
|
|
|
+ receiptPo.setConfirmType(receiptOperateDto.getConfirmType());
|
|
|
+ // 非订单款项确认
|
|
|
+ if (2 == receipt.getReceiptType()) {
|
|
|
+ if (StringUtils.isNotBlank(receiptOperateDto.getNoOrderReason())) {
|
|
|
+ receiptPo.setNoOrderReason(receiptOperateDto.getNoOrderReason());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 订单款项
|
|
|
+ if (1 == receipt.getReceiptType()) {
|
|
|
+ if (StringUtils.isNotBlank(receiptOperateDto.getOrderIds())) {
|
|
|
+ String[] orderIDS = receiptOperateDto.getOrderIds().split(",");
|
|
|
+ // 关联一个订单
|
|
|
+ if (orderIDS.length == 1) {
|
|
|
+ // 收款项和订单关系表
|
|
|
+ OrderReceiptRelationPo relation = new OrderReceiptRelationPo();
|
|
|
+ relation.setDelFlag(0);
|
|
|
+ relation.setRelationType(2);
|
|
|
+ relation.setAssociationType(1);
|
|
|
+ // 订单信息
|
|
|
+ OrderVo order = orderCommonMapper.getOrderByOrderId(Integer.parseInt(orderIDS[0]));
|
|
|
+ //设置订单未付金额(此处payableAmount用作实际应收)
|
|
|
+ order.setPayableAmount(getUnPayMoney(order, true));
|
|
|
+ // 收款金额 = 订单应付金额
|
|
|
+ if (0 == MathUtil.compare(receiptPo.getReceiptAmount(), order.getPayableAmount())) {
|
|
|
+ //确认关联
|
|
|
+ receiptPo.setConfirmType(4);
|
|
|
+ relation.setReceiptId(receiptPo.getId());
|
|
|
+ relation.setOrderId(order.getOrderId());
|
|
|
+ relation.setAssociateAmount(receiptPo.getReceiptAmount());
|
|
|
+ }
|
|
|
+ // 收款金额 < 订单应付金额
|
|
|
+ else if (-1 == MathUtil.compare(receiptPo.getReceiptAmount(), order.getPayableAmount())) {
|
|
|
+ // 小额抹平确认
|
|
|
+ if (null != receiptPo.getConfirmType() && 1 == receiptPo.getConfirmType()) {
|
|
|
+ relation.setReceiptId(receiptPo.getId());
|
|
|
+ relation.setOrderId(order.getOrderId());
|
|
|
+ relation.setAssociateAmount(receiptPo.getReceiptAmount());
|
|
|
+ }
|
|
|
+ // 部分收款确认
|
|
|
+ if (null != receiptPo.getConfirmType() && 4 == receiptPo.getConfirmType()) {
|
|
|
+ relation.setReceiptId(receiptPo.getId());
|
|
|
+ relation.setOrderId(order.getOrderId());
|
|
|
+ relation.setAssociateAmount(receiptPo.getReceiptAmount());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 收款金额 > 订单应付金额
|
|
|
+ else if (1 == MathUtil.compare(receiptPo.getReceiptAmount(), order.getPayableAmount())) {
|
|
|
+ // 大额抹平确认
|
|
|
+ if (null != receiptPo.getConfirmType() && 2 ==receiptPo.getConfirmType()) {
|
|
|
+ relation.setReceiptId(receiptPo.getId());
|
|
|
+ relation.setOrderId(order.getOrderId());
|
|
|
+ relation.setAssociateAmount(order.getPayableAmount());
|
|
|
+ }
|
|
|
+ // 大额退款余额
|
|
|
+ if (null != receiptPo.getConfirmType() && 3 == receiptPo.getConfirmType()) {
|
|
|
+ relation.setReceiptId(receiptPo.getId());
|
|
|
+ relation.setOrderId(order.getOrderId());
|
|
|
+ relation.setAssociateAmount(order.getPayableAmount());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 保存 收款项和订单关系
|
|
|
+ baseMapper.insertOrderReceiptRelation(relation);
|
|
|
+ }
|
|
|
+ // 关联多个订单
|
|
|
+ else if (orderIDS.length > 1) {
|
|
|
+ // 先满足金额小的订单,如果金额相等就先满足ID较小的订单
|
|
|
+ List<OrderVo> list = receiptMapper.getOrderListByOrderIds(orderIDS);
|
|
|
+ for (OrderVo item : list) {
|
|
|
+ item.setPayableAmount(getUnPayMoney(item, true));
|
|
|
+ }
|
|
|
+ // 余下的收款金额
|
|
|
+ Double amount = receiptPo.getReceiptAmount();
|
|
|
+ if (null != receiptPo.getConfirmType() && 4 == receiptPo.getConfirmType()) {
|
|
|
+ // 确认关联
|
|
|
+ for (OrderVo order : list) {
|
|
|
+ if (amount > 0) {
|
|
|
+ OrderReceiptRelationPo relation = new OrderReceiptRelationPo();
|
|
|
+ relation.setDelFlag(0);
|
|
|
+ relation.setRelationType(2);
|
|
|
+ if (amount >= order.getPayableAmount()) {
|
|
|
+ relation.setReceiptId(receiptPo.getId());
|
|
|
+ relation.setOrderId(order.getOrderId());
|
|
|
+ relation.setAssociateAmount(order.getPayableAmount());
|
|
|
+ } else if (amount < order.getPayableAmount()) {
|
|
|
+ relation.setReceiptId(receiptPo.getId());
|
|
|
+ relation.setOrderId(order.getOrderId());
|
|
|
+ relation.setAssociateAmount(amount);
|
|
|
+ }
|
|
|
+ // 保存 收款项和订单关系
|
|
|
+ baseMapper.insertOrderReceiptRelation(relation);
|
|
|
+ amount -= order.getPayableAmount();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else if (null != receiptPo.getConfirmType() && 1 == receiptPo.getConfirmType()) {
|
|
|
+ //小额抹平确认
|
|
|
+ for (OrderVo order : list) {
|
|
|
+ OrderReceiptRelationPo relation = new OrderReceiptRelationPo();
|
|
|
+ relation.setDelFlag(0);
|
|
|
+ relation.setRelationType(2);
|
|
|
+ if (amount >= order.getPayableAmount()) {
|
|
|
+ relation.setReceiptId(receiptPo.getId());
|
|
|
+ relation.setOrderId(order.getOrderId());
|
|
|
+ relation.setAssociateAmount(order.getPayableAmount());
|
|
|
+ } else if (amount < order.getPayableAmount()) {
|
|
|
+ relation.setReceiptId(receiptPo.getId());
|
|
|
+ relation.setOrderId(order.getOrderId());
|
|
|
+ relation.setAssociateAmount(amount < 0d ? 0d : amount);
|
|
|
+ }
|
|
|
+ // 保存 收款项和订单关系
|
|
|
+ baseMapper.insertOrderReceiptRelation(relation);
|
|
|
+ amount -= order.getPayableAmount();
|
|
|
+ }
|
|
|
+ } else if (null != receiptPo.getConfirmType() && 2 ==receiptPo.getConfirmType()) {
|
|
|
+ //大额抹平确认
|
|
|
+ for (OrderVo order : list) {
|
|
|
+ OrderReceiptRelationPo relation = new OrderReceiptRelationPo();
|
|
|
+ relation.setDelFlag(0);
|
|
|
+ relation.setRelationType(2);
|
|
|
+ if (amount >= order.getPayableAmount()) {
|
|
|
+ relation.setReceiptId(receiptPo.getId());
|
|
|
+ relation.setOrderId(order.getOrderId());
|
|
|
+ relation.setAssociateAmount(order.getPayableAmount());
|
|
|
+ // 保存 收款项和订单关系
|
|
|
+ baseMapper.insertOrderReceiptRelation(relation);
|
|
|
+ amount -= order.getPayableAmount();
|
|
|
+ } else {
|
|
|
+ // 设置手动回滚事务
|
|
|
+ TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
|
|
|
+ log.info("订单(Id:" + order.getOrderId() + ")大额抹平确认--金额不正确!");
|
|
|
+ return ResponseJson.error("订单(Id:" + order.getOrderId() + ")大额抹平确认--金额不正确!", null);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else if (null != receiptPo.getConfirmType() && 3 == receiptPo.getConfirmType()) {
|
|
|
+ //大额退款余额
|
|
|
+ for (OrderVo order : list) {
|
|
|
+ OrderReceiptRelationPo relation = new OrderReceiptRelationPo();
|
|
|
+ relation.setDelFlag(0);
|
|
|
+ relation.setRelationType(2);
|
|
|
+ if (amount >= order.getPayableAmount()) {
|
|
|
+ relation.setReceiptId(receiptPo.getId());
|
|
|
+ relation.setOrderId(order.getOrderId());
|
|
|
+ relation.setAssociateAmount(order.getPayableAmount());
|
|
|
+ // 保存 收款项和订单关系
|
|
|
+ baseMapper.insertOrderReceiptRelation(relation);
|
|
|
+ amount -= order.getPayableAmount();
|
|
|
+ } else {
|
|
|
+ // 设置手动回滚事务
|
|
|
+ TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
|
|
|
+ log.info("订单(Id:" + order.getOrderId() + ")大额退款余额--金额不正确!");
|
|
|
+ return ResponseJson.error("订单(Id:" + order.getOrderId() + ")大额退款余额--金额不正确!", null);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ // 设置手动回滚事务
|
|
|
+ TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
|
|
|
+ log.info("关联订单为空!");
|
|
|
+ return ResponseJson.error("关联订单为空!", null);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ receiptPo.setPayWay(2);
|
|
|
+ receiptPo.setConfirmUserPermissionId(receiptUser.getId());
|
|
|
+ receiptPo.setConfirmDate(time);
|
|
|
+ receiptMapper.updateReceipt(receiptPo);
|
|
|
+
|
|
|
+ // 关联成功推送模板消息给指定人员(用户权限: 1收款列表访问,2收款详情访问,3收款录入,4收款关联订单,5收款关联返佣,6收款关联供应商退款,7收款审核)
|
|
|
+ List<String> openidList = receiptMapper.getOpenidListByPermission(Collections.singletonList(7));
|
|
|
+ openidList.removeIf(Objects::isNull);
|
|
|
+ double associateAmount = receiptMapper.countAssociateAmountById(receipt.getId());
|
|
|
+ String associateTitle = "收款和订单已确认关联,请及时审核!";
|
|
|
+ String associateDate = receipt.getReceiptDate();
|
|
|
+ String associateType = receiptMapper.getReceiptTypeStrById(receipt.getPayType());
|
|
|
+ String remarkText = "收款类型:" + associateType + ",确认时间:"+receipt.getConfirmDate();
|
|
|
+ // 跳转到【普通款项待审核】页面
|
|
|
+ String pagePath = "/pages/relation/ordinary/examine-detail?id="+receipt.getId();
|
|
|
+ for (String openid : openidList) {
|
|
|
+ // sendTemplateMsg(openid, 标题, 金额, 收款日期, 备注, 跳转链接)
|
|
|
+ weChatService.sendTemplateMsg(openid, associateTitle, associateAmount, associateDate, remarkText, pagePath);
|
|
|
+ }
|
|
|
+ return ResponseJson.success("关联收款信息成功!", null);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 确认收款-关联供应商退款
|
|
|
+ *
|
|
|
+ * @param receiptOperateDto {
|
|
|
+ * id: 收款Id
|
|
|
+ * shopOrderId: 关联供应商退款子订单ID
|
|
|
+ * }
|
|
|
+ */
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ @Override
|
|
|
+ public ResponseJson<Void> receiptAssociateRefund(ReceiptOperateDto receiptOperateDto, HttpHeaders headers) {
|
|
|
+ // 检查收款用户权限: 6收款关联供应商退款
|
|
|
+ ReceiptUserVo receiptUser = checkPermissions(6, headers);
|
|
|
+ if (null == receiptUser) {
|
|
|
+ return ResponseJson.error("无权限操作!", null);
|
|
|
+ }
|
|
|
+ ReceiptVo receipt = receiptMapper.getReceiptDetail(receiptOperateDto.getId());
|
|
|
+ if (null == receipt) {
|
|
|
+ return ResponseJson.error("收款数据异常!", null);
|
|
|
+ }
|
|
|
+ // 只有在待确认 和撤销的状态下才能关联 子订单 不然就是状态出错了
|
|
|
+ if (5 != receipt.getReceiptStatus() && 1 != receipt.getReceiptStatus()) {
|
|
|
+ return ResponseJson.error("收款记录状态异常!", null);
|
|
|
+ }
|
|
|
+ ShopOrderVo shopOrder = receiptMapper.getShopOrderById(receiptOperateDto.getShopOrderId());
|
|
|
+ // 总退款金额
|
|
|
+ Double refundAmount = receiptMapper.getRefundShopAmount(receiptOperateDto.getShopOrderId());
|
|
|
+ // 确认本次收款金额大于已付金额与已退金额的差值,不能关联
|
|
|
+ if (MathUtil.compare(shopOrder.getPayedShopAmount(), MathUtil.add(refundAmount, receipt.getReceiptAmount())) < 0) {
|
|
|
+ return ResponseJson.error("本次确认收款金额大于已付金额与已退金额的差值,不能关联!", null);
|
|
|
+ }
|
|
|
+ //删除之前与这个收款的关联
|
|
|
+ receiptMapper.deleteReceiptRelation(receipt.getId());
|
|
|
+ // ReceiptVo -- copy to --> ReceiptPo
|
|
|
+ String time = DateUtils.getDateTime();
|
|
|
+ ReceiptPo receiptPo = new ReceiptPo();
|
|
|
+ BeanUtils.copyProperties(receipt, receiptPo);
|
|
|
+ receiptPo.setUpdateDate(time);
|
|
|
+ receiptPo.setReceiptType(5);
|
|
|
+ receiptPo.setReceiptStatus(2);
|
|
|
+ receiptPo.setConfirmDate(time);
|
|
|
+ receiptPo.setConfirmUserPermissionId(receiptUser.getId());
|
|
|
+ receiptMapper.updateReceipt(receiptPo);
|
|
|
+ // 保存 收款项和订单关系
|
|
|
+ OrderReceiptRelationPo relation = new OrderReceiptRelationPo();
|
|
|
+ relation.setDelFlag(0);
|
|
|
+ relation.setOrderId(receiptOperateDto.getShopOrderId());
|
|
|
+ relation.setReceiptId(receipt.getId());
|
|
|
+ relation.setRelationType(1);
|
|
|
+ relation.setAssociateAmount(receipt.getReceiptAmount());
|
|
|
+ baseMapper.insertOrderReceiptRelation(relation);
|
|
|
+ /*
|
|
|
+ * 保存供应商退款
|
|
|
+ */
|
|
|
+ RefundShopPo refundShop = new RefundShopPo();
|
|
|
+ refundShop.setOperator(receiptUser.getId());
|
|
|
+ refundShop.setOperateTime(receipt.getConfirmDate());
|
|
|
+ refundShop.setRefundWay(4);
|
|
|
+ refundShop.setShopId(shopOrder.getShopId());
|
|
|
+ refundShop.setRefundAmount(receipt.getReceiptAmount());
|
|
|
+ refundShop.setRefundBalanceAmount(0d);
|
|
|
+ refundShop.setRemark(receipt.getSmsContent());
|
|
|
+ /*
|
|
|
+ 退款:1建设银行7297, 2中信银行0897, 3中信银行7172, 4广发银行0115, 5广发银行5461, 6虚拟银行0000
|
|
|
+ 付款:1建设银行7297、2广发银行0115、3中信银行7172、4中信银行0897、5中信银行0897-财付通、6中信银行0897-支付宝、7线上-支付宝、8线上-微信支付、9线上-快钱支付、10口头返佣、11广发银行5461、12PC-B2B网银、13PC-微信支付、14PC-支付宝、15小程序-微信支付、16余额抵扣、17PC-B2C网银
|
|
|
+ */
|
|
|
+ if (1 == receipt.getPayType()) {
|
|
|
+ refundShop.setRefundType(1);
|
|
|
+ } else if (4 == receipt.getPayType() || 5 == receipt.getPayType() || 6 == receipt.getPayType()) {
|
|
|
+ refundShop.setRefundType(2);
|
|
|
+ } else if (3 == receipt.getPayType()) {
|
|
|
+ refundShop.setRefundType(3);
|
|
|
+ } else if (2 == receipt.getPayType()) {
|
|
|
+ refundShop.setRefundType(4);
|
|
|
+ } else if (11 == receipt.getPayType()) {
|
|
|
+ refundShop.setRefundType(5);
|
|
|
+ } else {
|
|
|
+ refundShop.setRefundType(6);
|
|
|
+ }
|
|
|
+ receiptMapper.insertRefundShop(refundShop);
|
|
|
+ //保存供应商退款记录
|
|
|
+ RefundShopRecordPo refundShopRecord = new RefundShopRecordPo();
|
|
|
+ refundShopRecord.setRefundShopId(refundShop.getId());
|
|
|
+ refundShopRecord.setShopId(refundShop.getShopId());
|
|
|
+ refundShopRecord.setShopOrderId(shopOrder.getShopOrderId());
|
|
|
+ refundShopRecord.setShopOrderNo(shopOrder.getShopOrderNo());
|
|
|
+ refundShopRecord.setRefundAmount(receipt.getReceiptAmount());
|
|
|
+ refundShopRecord.setRefundTime(receipt.getConfirmDate());
|
|
|
+ receiptMapper.insertRefundShopRecord(refundShopRecord);
|
|
|
+ return ResponseJson.success("关联供应商退款成功!", null);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 确认收款-关联返佣款
|
|
|
+ *
|
|
|
+ * @param receiptOperateDto {
|
|
|
+ * id: 收款Id
|
|
|
+ * shopOrderIds: 关联返佣子订单IDs
|
|
|
+ * rebateRemarks:关联返佣备注
|
|
|
+ * }
|
|
|
+ */
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ @Override
|
|
|
+ public ResponseJson<Void> receiptAssociateRebate(ReceiptOperateDto receiptOperateDto, HttpHeaders headers) {
|
|
|
+ // 检查收款用户权限: 5收款关联返佣
|
|
|
+ ReceiptUserVo receiptUser = checkPermissions(5, headers);
|
|
|
+ if (null == receiptUser) {
|
|
|
+ return ResponseJson.error("无权限操作!", null);
|
|
|
+ }
|
|
|
+ String[] shopOrderIdArr = receiptOperateDto.getShopOrderIds().split(",");
|
|
|
+ List<Integer> shopIdList = receiptMapper.getShopIdList(shopOrderIdArr);
|
|
|
+ if (shopIdList.size() > 1) {
|
|
|
+ return ResponseJson.error("子订单不属于相同的供应商!", null);
|
|
|
+ }
|
|
|
+ ReceiptVo receipt = receiptMapper.getReceiptDetail(receiptOperateDto.getId());
|
|
|
+ if (null == receipt) {
|
|
|
+ return ResponseJson.error("收款数据异常!", null);
|
|
|
+ }
|
|
|
+ // 只有在待确认 和撤销的状态下才能关联 子订单 不然就是状态出错了
|
|
|
+ if (5 != receipt.getReceiptStatus() && 1 != receipt.getReceiptStatus()) {
|
|
|
+ return ResponseJson.error("收款记录状态异常!", null);
|
|
|
+ }
|
|
|
+ //删除之前与这个收款的关联
|
|
|
+ receiptMapper.deleteReceiptRelation(receipt.getId());
|
|
|
+ // ReceiptVo -- copy to --> ReceiptPo
|
|
|
+ String time = DateUtils.getDateTime();
|
|
|
+ ReceiptPo receiptPo = new ReceiptPo();
|
|
|
+ BeanUtils.copyProperties(receipt, receiptPo);
|
|
|
+ receiptPo.setUpdateDate(time);
|
|
|
+ receiptPo.setReceiptType(3);
|
|
|
+ receiptPo.setReceiptStatus(2);
|
|
|
+ receiptPo.setConfirmDate(time);
|
|
|
+ receiptPo.setConfirmUserPermissionId(receiptUser.getId());
|
|
|
+ if (StringUtils.isNotBlank(receiptOperateDto.getRebateRemarks())) {
|
|
|
+ receiptPo.setRebateRemarks(receiptOperateDto.getRebateRemarks());
|
|
|
+ }
|
|
|
+ receiptMapper.updateReceipt(receiptPo);
|
|
|
+ // 保存返佣收款关系和修改订单状态
|
|
|
+ saveRelationAndUpdateOrderStatus(shopOrderIdArr, receipt.getId());
|
|
|
+ return ResponseJson.success("关联返佣款成功!", null);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 确认收款-关联口头佣金
|
|
|
+ * crm:/api/user/rebate/verballyReceipt
|
|
|
+ *
|
|
|
+ * @param receiptOperateDto {
|
|
|
+ * verbalAmount: 口头返佣佣金
|
|
|
+ * shopOrderId: 关联返佣子订单ID
|
|
|
+ * rebateRemarks:关联返佣备注
|
|
|
+ * }
|
|
|
+ */
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ @Override
|
|
|
+ public ResponseJson<Integer> associateVerbalRebate(ReceiptOperateDto receiptOperateDto, HttpHeaders headers) {
|
|
|
+ // 检查收款用户权限: 5收款关联返佣
|
|
|
+ ReceiptUserVo receiptUser = checkPermissions(5, headers);
|
|
|
+ if (null == receiptUser) {
|
|
|
+ return ResponseJson.error("无权限操作!", null);
|
|
|
+ }
|
|
|
+ String[] shopOrderIdArr = receiptOperateDto.getShopOrderId().toString().split(",");
|
|
|
+ List<Integer> shopIdList = receiptMapper.getShopIdList(shopOrderIdArr);
|
|
|
+ String date = DateUtils.getDate("yyyy-MM-dd HH:mm:ss");
|
|
|
+ ReceiptPo receiptPo = new ReceiptPo();
|
|
|
+ receiptPo.setPayWay(2);
|
|
|
+ receiptPo.setDelFlag(0);
|
|
|
+ receiptPo.setPayType(10);
|
|
|
+ receiptPo.setReceiptType(3);
|
|
|
+ receiptPo.setReceiptStatus(2);
|
|
|
+ receiptPo.setReceiptAmount(receiptOperateDto.getVerbalAmount());
|
|
|
+ receiptPo.setConfirmUserPermissionId(receiptUser.getId());
|
|
|
+ receiptPo.setReceiptDate(date);
|
|
|
+ receiptPo.setConfirmDate(date);
|
|
|
+ receiptPo.setRebateRemarks(receiptOperateDto.getRebateRemarks());
|
|
|
+ // 保存收款记录
|
|
|
+ receiptMapper.insertReceipt(receiptPo);
|
|
|
+ // 保存返佣收款关系和修改订单状态
|
|
|
+ saveRelationAndUpdateOrderStatus(shopOrderIdArr, receiptPo.getId());
|
|
|
+ // 添加 返佣欠款记录
|
|
|
+ RebateRecordPo crr = new RebateRecordPo();
|
|
|
+ crr.setType(1);
|
|
|
+ crr.setShopId(shopIdList.get(0));
|
|
|
+ crr.setReceiptId(receiptPo.getId());
|
|
|
+ crr.setRebateAmount(receiptOperateDto.getVerbalAmount());
|
|
|
+ crr.setShopOrderId(receiptOperateDto.getShopOrderIds());
|
|
|
+ crr.setOperateTime(date);
|
|
|
+ receiptMapper.insertRebateRecord(crr);
|
|
|
+ // 更新供应商欠款金额
|
|
|
+ receiptMapper.updateShopRebateAmount(shopIdList.get(0),receiptOperateDto.getVerbalAmount());
|
|
|
+ //返回 款项Id
|
|
|
+ return ResponseJson.success("关联口头返佣款成功!", receiptPo.getId());
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 保存返佣收款关系和修改订单状态
|
|
|
+ * @param shopOrderIdArr 子订单Ids
|
|
|
+ * @param receiptId 款项Id
|
|
|
+ */
|
|
|
+ private void saveRelationAndUpdateOrderStatus(String[] shopOrderIdArr, Integer receiptId) {
|
|
|
+ for (String shopOrderId : shopOrderIdArr) {
|
|
|
+ // 保存 收款项和订单关系
|
|
|
+ OrderReceiptRelationPo relation = new OrderReceiptRelationPo();
|
|
|
+ relation.setDelFlag(0);
|
|
|
+ relation.setOrderId(Integer.valueOf(shopOrderId));
|
|
|
+ relation.setReceiptId(receiptId);
|
|
|
+ relation.setRelationType(1);
|
|
|
+ relation.setAssociateAmount(0d);
|
|
|
+ baseMapper.insertOrderReceiptRelation(relation);
|
|
|
+ //查询这个子订单的主订单下面的所有子订单ID 结果里面包含了 shopOrderId自己的 也就是这个这订单的兄弟子订单
|
|
|
+ List<Integer> shopOrderIdList = receiptMapper.getSubShopOrderList(shopOrderId);
|
|
|
+ //因为最起码已经有一个子订单进行了返佣操作 所以主订单最起码是部分收款付款
|
|
|
+ //如果子订单全部进行了 返佣操作 那么就是全部收付款了
|
|
|
+ boolean flag = true;
|
|
|
+ // 查询已经返佣了的子订单
|
|
|
+ List<Integer> shopOrderIdRebate = receiptMapper.getSubShopOrderRebate(shopOrderIdList);
|
|
|
+ for (Integer soId : shopOrderIdList) {
|
|
|
+ if (!shopOrderIdRebate.contains(soId)) {
|
|
|
+ //只要有一个子订单没有进行过返佣
|
|
|
+ //那么这个主订单就是部分的收付款
|
|
|
+ flag = false;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ receiptMapper.updateShopOrderPayStatus(shopOrderId, 3);
|
|
|
+ // 订单信息
|
|
|
+ OrderVo order = orderCommonMapper.getOrderByShopOrderId(Integer.parseInt(shopOrderId));
|
|
|
+ if (flag) {
|
|
|
+ //子订单全部收到款了
|
|
|
+ order.setReceiptStatus(3);
|
|
|
+ order.setPayStatus(3);
|
|
|
+ if (order.getStatus().toString().length() == 2) {
|
|
|
+ order.setStatus(Integer.valueOf("3" + order.getStatus().toString().charAt(1)));
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ //子订单的款还没有收全
|
|
|
+ order.setReceiptStatus(2);
|
|
|
+ order.setPayStatus(2);
|
|
|
+ if (order.getStatus().toString().length() == 2) {
|
|
|
+ order.setStatus(Integer.valueOf("2" + order.getStatus().toString().charAt(1)));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ order.setUpdateDate(DateUtils.getDateTime());
|
|
|
+ // 更新订单收款状态
|
|
|
+ payOrderMapper.updateOrderStatus(order);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 审核收款信息
|
|
|
+ *
|
|
|
+ * @param id 收款Id
|
|
|
+ * @param receiptStatus 收款状态
|
|
|
+ * @param reviewReason 审核不通过原因
|
|
|
+ */
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ @Override
|
|
|
+ public ResponseJson<Void> receiptAudit(Integer id, Integer receiptStatus, String reviewReason, HttpHeaders headers) {
|
|
|
+ // 检查收款用户权限: 7收款审核
|
|
|
+ ReceiptUserVo receiptUser = checkPermissions(7, headers);
|
|
|
+ if (null == receiptUser) {
|
|
|
+ return ResponseJson.error("无权限操作!", null);
|
|
|
+ }
|
|
|
+ ReceiptVo receipt = receiptMapper.getReceiptDetail(id);
|
|
|
+ if (null == receipt) {
|
|
|
+ return ResponseJson.error("收款数据异常!", null);
|
|
|
+ }
|
|
|
+ // ReceiptVo -- copy to --> ReceiptPo
|
|
|
+ String time = DateUtils.getDateTime();
|
|
|
+ ReceiptPo receiptPo = new ReceiptPo();
|
|
|
+ BeanUtils.copyProperties(receipt, receiptPo);
|
|
|
+ receiptPo.setUpdateDate(time);
|
|
|
+ // 收款项和订单关系
|
|
|
+ List<OrderReceiptRelationPo> listRelation = new ArrayList<>();
|
|
|
+ // 订单款项
|
|
|
+ if (null != receipt.getReceiptType() && 1 == receipt.getReceiptType()){
|
|
|
+ // 只要当收款状态为已确认状态时候才能做审核操作
|
|
|
+ if (3 == receiptStatus && 2 == receipt.getReceiptStatus()) {
|
|
|
+ // 收款项和订单关系
|
|
|
+ listRelation = receiptMapper.getOrderReceiptRelationList(receipt.getId());
|
|
|
+ String statusFlag = "";
|
|
|
+ Integer orderReceiptStatus = null;
|
|
|
+ Double totalAssociateAmount = 0d;
|
|
|
+ for (OrderReceiptRelationPo relationItem : listRelation) {
|
|
|
+ // 订单信息
|
|
|
+ OrderVo order = orderCommonMapper.getOrderByOrderId(relationItem.getOrderId());
|
|
|
+ Double payAbleAmount = order.getPayableAmount();
|
|
|
+ Double unPayMoney = getUnPayMoney(order, false);
|
|
|
+ log.info("-----------------UnPayMoney:" + unPayMoney + ", payAbleAmount:" + payAbleAmount);
|
|
|
+ if (unPayMoney.equals(relationItem.getAssociateAmount())) {
|
|
|
+ //确认关联(收款金额=订单应付金额)
|
|
|
+ statusFlag = "3";
|
|
|
+ orderReceiptStatus = 3;
|
|
|
+ } else if (relationItem.getAssociateAmount() < unPayMoney) {
|
|
|
+ /*(收款金额<订单应付金额)*/
|
|
|
+ statusFlag = "2";
|
|
|
+ orderReceiptStatus = 2;
|
|
|
+ } else if (relationItem.getAssociateAmount() > unPayMoney) {
|
|
|
+ /*(收款金额>订单应付金额)*/
|
|
|
+ statusFlag = "3";
|
|
|
+ orderReceiptStatus = 3;
|
|
|
+ }
|
|
|
+ //大额退款余额-大额抹平确认-小额抹平确认
|
|
|
+ if (null != receipt.getConfirmType() && (3 == receipt.getConfirmType() || 2 == receipt.getConfirmType() || 1 == receipt.getConfirmType())) {
|
|
|
+ // 查询待审核数量
|
|
|
+ int pendingCount = receiptMapper.getPendingAuditCount(order.getOrderId());
|
|
|
+ if (pendingCount > 1) {
|
|
|
+ int i = pendingCount - 1;
|
|
|
+ String operating;
|
|
|
+ if (3 == receipt.getConfirmType()) {
|
|
|
+ operating = "多收退余额";
|
|
|
+ } else if (2 == receipt.getConfirmType()) {
|
|
|
+ operating = "多收抹平";
|
|
|
+ } else {
|
|
|
+ operating = "少收抹平";
|
|
|
+ }
|
|
|
+ // 设置手动回滚事务
|
|
|
+ TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
|
|
|
+ log.info("本条收款进行了" + operating + "操作需要最后审核,请先审核该订单的其他" + i + "条收款");
|
|
|
+ return ResponseJson.error("本条收款进行了" + operating + "操作需要最后审核,请先审核该订单的其他" + i + "条收款", null);
|
|
|
+ }
|
|
|
+ statusFlag = "3";
|
|
|
+ orderReceiptStatus = 3;
|
|
|
+ totalAssociateAmount += relationItem.getAssociateAmount();
|
|
|
+ }
|
|
|
+ statusFlag = statusFlag + order.getStatus().toString().charAt(1);
|
|
|
+ order.setStatus(Integer.parseInt(statusFlag));
|
|
|
+ order.setReceiptStatus(orderReceiptStatus);
|
|
|
+ //设置订单状态
|
|
|
+ //获取主订单下面的所有的确认收货商品数量
|
|
|
+ Integer receiptNum = receiptMapper.getReceiptNumByOrderId(order.getOrderId());
|
|
|
+ Integer returnAndCancelNum = 0;
|
|
|
+ //获取该主订单下面所有已完成状态退货退款商品数量
|
|
|
+ if (null != order.getRefundType() && (1 == order.getRefundType() || 2 == order.getRefundType())) {
|
|
|
+ returnAndCancelNum = receiptMapper.getReturnAndCancelNum(order.getOrderId());
|
|
|
+ }
|
|
|
+ //确认收货商品数量+已完成状态退货退款商品数量 = 订单商品总数
|
|
|
+ if (order.getProductCount().equals(returnAndCancelNum + receiptNum)) {
|
|
|
+ //已收款--->交易完成
|
|
|
+ //已收款+已付款--->订单完成
|
|
|
+ if (3 == order.getReceiptStatus()) {
|
|
|
+ order.setStatus(OrderStatus.TRANSACTION_COMPLETED.getCode());
|
|
|
+ }
|
|
|
+ if (3 == order.getReceiptStatus() && 3 == order.getPayStatus()) {
|
|
|
+ order.setStatus(OrderStatus.ORDER_COMPLETED.getCode());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 更新订单收款状态
|
|
|
+ payOrderMapper.updateOrderStatus(order);
|
|
|
+ log.info("-------------审核通过订单状态改变---orderId:" + order.getOrderId() + "--status:" + order.getStatus());
|
|
|
+ //判断是否有充值商品,充值到余额
|
|
|
+ Integer rechargeGoods = null;
|
|
|
+ //缴纳订金订单
|
|
|
+ int[] productId1 = {6060, 6061, 6062, 6063, 6064};
|
|
|
+ //充值余额订单
|
|
|
+ int[] productId2 = {6065, 6066, 6067, 6068, 6069};
|
|
|
+ List<OrderProductVo> orderProductList = orderCommonMapper.getOrderProductByOrderId(order.getOrderId());
|
|
|
+ for (OrderProductVo orderProduct : orderProductList) {
|
|
|
+ if (ArrayUtils.contains(productId1, orderProduct.getProductId())) {
|
|
|
+ rechargeGoods = 1;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ if (ArrayUtils.contains(productId2, orderProduct.getProductId())) {
|
|
|
+ rechargeGoods = 2;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 充值与订金订单
|
|
|
+ if (rechargeGoods != null) {
|
|
|
+ Double userMoney = baseMapper.getUserMoney(order.getUserId());
|
|
|
+ Double ableUserMoney = baseMapper.getAbleUserMoney(order.getUserId());
|
|
|
+ userMoney = MathUtil.add(userMoney, relationItem.getAssociateAmount()).doubleValue();
|
|
|
+ ableUserMoney = MathUtil.add(ableUserMoney, relationItem.getAssociateAmount()).doubleValue();
|
|
|
+ //保存余额到余额收支记录
|
|
|
+ BalanceRecordPo balanceRecord = new BalanceRecordPo();
|
|
|
+ balanceRecord.setUserId(order.getUserId());
|
|
|
+ balanceRecord.setType(1);
|
|
|
+ if (rechargeGoods == 1) {
|
|
|
+ balanceRecord.setBalanceType(6);
|
|
|
+ } else {
|
|
|
+ balanceRecord.setBalanceType(7);
|
|
|
+ }
|
|
|
+ balanceRecord.setAddDate(new Date());
|
|
|
+ balanceRecord.setAmount(relationItem.getAssociateAmount());
|
|
|
+ balanceRecord.setOrderId(order.getOrderId());
|
|
|
+ balanceRecord.setReceiptId(receipt.getId());
|
|
|
+ balanceRecord.setRemark("订单商品充值余额");
|
|
|
+ balanceRecord.setDelFlag(0);
|
|
|
+ // 保存 余额收支记录
|
|
|
+ baseMapper.insertBalanceRecord(balanceRecord);
|
|
|
+ baseMapper.updateUserMoney(userMoney, ableUserMoney, order.getUserId());
|
|
|
+ log.info("订单商品充值余额>>>>>>>>>>>>>" + relationItem.getAssociateAmount());
|
|
|
+ }
|
|
|
+ if (null != orderReceiptStatus && 3 == orderReceiptStatus) {
|
|
|
+ // 已收款赠送采美豆自主下单赠送采美豆
|
|
|
+ if (1 == order.getOrderType()) {
|
|
|
+ UserBeansHistoryPo beansHistory = new UserBeansHistoryPo();
|
|
|
+ beansHistory.setUserId(order.getUserId());
|
|
|
+ beansHistory.setOrderId(order.getOrderId());
|
|
|
+ beansHistory.setBeansType(5);
|
|
|
+ beansHistory.setType(1);
|
|
|
+ beansHistory.setPushStatus(0);
|
|
|
+ beansHistory.setAddTime(new Date());
|
|
|
+ beansHistory.setDelFlag(0);
|
|
|
+ int num;
|
|
|
+ if (MathUtil.compare(1000, order.getPayTotalFee()) > -1) {
|
|
|
+ num = 0;
|
|
|
+ } else if (MathUtil.compare(5000, order.getPayTotalFee()) > -1) {
|
|
|
+ num = 1000;
|
|
|
+ } else if (MathUtil.compare(10000, order.getPayTotalFee()) > -1) {
|
|
|
+ num = 2500;
|
|
|
+ } else if (MathUtil.compare(25000, order.getPayTotalFee()) > -1) {
|
|
|
+ num = 5000;
|
|
|
+ } else if (MathUtil.compare(100000, order.getPayTotalFee()) > -1) {
|
|
|
+ num = 7500;
|
|
|
+ } else if (MathUtil.compare(250000, order.getPayTotalFee()) > -1) {
|
|
|
+ num = 10000;
|
|
|
+ } else if (MathUtil.compare(500000, order.getPayTotalFee()) > -1) {
|
|
|
+ num = 12500;
|
|
|
+ } else {
|
|
|
+ num = 20000;
|
|
|
+ }
|
|
|
+ if (num > 0) {
|
|
|
+ beansHistory.setNum(num);
|
|
|
+ // 保存 采美豆使用记录
|
|
|
+ baseMapper.insertBeansHistory(beansHistory);
|
|
|
+ Integer userBeans = baseMapper.getUserBeans(order.getUserId());
|
|
|
+ userBeans += num;
|
|
|
+ baseMapper.updateUserBeans(order.getUserId(), userBeans);
|
|
|
+ log.info("【线下收款】>>>>>更新用户采美豆(update[user(userBeans:" + userBeans + ")]),userId:" + beansHistory.getUserId());
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (null != receipt.getConfirmType() && 3 == receipt.getConfirmType()) {
|
|
|
+ Double money = receipt.getReceiptAmount() - totalAssociateAmount;
|
|
|
+ // 订单信息
|
|
|
+ OrderVo order = orderCommonMapper.getOrderByOrderId(listRelation.get(0).getOrderId());
|
|
|
+ Double userMoney = baseMapper.getUserMoney(order.getUserId());
|
|
|
+ Double ableUserMoney = baseMapper.getAbleUserMoney(order.getUserId());
|
|
|
+ log.info("----------------------->原余额:" + userMoney + "==原可用余额:" + ableUserMoney);
|
|
|
+ // 减操作不更新可用余额
|
|
|
+ if (money < 0d) {
|
|
|
+ if (0 != order.getStatus()) {
|
|
|
+ userMoney = MathUtil.add(userMoney, money).doubleValue();
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ // 待确认状态不需要修改余额,因为本身存在冻结余额不需要重复退回
|
|
|
+ if (0 != order.getStatus()) {
|
|
|
+ userMoney = MathUtil.add(ableUserMoney, money).doubleValue();
|
|
|
+ }
|
|
|
+ ableUserMoney = MathUtil.add(ableUserMoney, money).doubleValue();
|
|
|
+ }
|
|
|
+ log.info("大额抹平金额退回账户:" + order.getUserId() + ",------->大额抹平金额:" + 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(receipt.getId());
|
|
|
+ balanceRecord.setRemark("订单商品充值余额");
|
|
|
+ balanceRecord.setDelFlag(0);
|
|
|
+ // 保存 余额收支记录
|
|
|
+ baseMapper.insertBalanceRecord(balanceRecord);
|
|
|
+ baseMapper.updateUserMoney(userMoney, ableUserMoney, order.getUserId());
|
|
|
+ log.info("大额抹平金额退回账户>>>>>>>>>>>>>" + money);
|
|
|
+ }
|
|
|
+ } else if (4 == receiptStatus && 2 == receipt.getReceiptStatus()) {
|
|
|
+ //审核不通过
|
|
|
+ receiptPo.setReviewReason(reviewReason);
|
|
|
+ } else {
|
|
|
+ // 设置手动回滚事务
|
|
|
+ TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
|
|
|
+ log.info("订单不是已确认状态 或者 审核结果不正确");
|
|
|
+ return ResponseJson.error("审核信息有误!", null);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ receiptPo.setReviewUserPermissionId(receiptUser.getId());
|
|
|
+ receiptPo.setReceiptStatus(receiptStatus);
|
|
|
+ receiptPo.setReviewDate(time);
|
|
|
+ receiptMapper.updateReceipt(receiptPo);
|
|
|
+
|
|
|
+ // 审核未通过 推送模板消息给指定人员
|
|
|
+ if (4 == receiptStatus) {
|
|
|
+ // 审核未通过
|
|
|
+ String title = "订单审核未通过,请重新确认审核!";
|
|
|
+ String date = receipt.getReceiptDate();
|
|
|
+ String receiptTypeStr = receiptMapper.getReceiptTypeStrById(receipt.getPayType());
|
|
|
+ String remarkText = "收款类型:"+ receiptTypeStr +";"+"审核时间:"+receiptPo.getReviewDate();
|
|
|
+ double associateAmount = receiptMapper.countAssociateAmountById(receipt.getId());
|
|
|
+ // (用户权限: 1收款列表访问,2收款详情访问,3收款录入,4收款关联订单,5收款关联返佣,6收款关联供应商退款,7收款审核)
|
|
|
+ List<String> openidList = receiptMapper.getOpenidListByPermission(Collections.singletonList(4));
|
|
|
+ openidList.removeIf(Objects::isNull);
|
|
|
+ // 跳转到【普通款项待审核】页面
|
|
|
+ String pagePath = "/pages/relation/ordinary/examine-detail?id="+receipt.getId();
|
|
|
+ for (String openid : openidList) {
|
|
|
+ // sendTemplateMsg(openid, 标题, 金额, 收款日期, 备注, 跳转链接)
|
|
|
+ weChatService.sendTemplateMsg(openid, title, associateAmount, date, remarkText, pagePath);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return ResponseJson.success("审核收款信息成功!", null);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 微信收款信息推送(待确认超时)
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public void sendWechatMsgConfirmTimeout() {
|
|
|
+ //待确认超时
|
|
|
+ ReceiptParamsBo paramsBo = new ReceiptParamsBo();
|
|
|
+ String[] receiptStatusArr = "1".split(",");
|
|
|
+ paramsBo.setReceiptStatusArr(receiptStatusArr);
|
|
|
+ paramsBo.setStartDate("2022-01-01 00:00:00");
|
|
|
+ List<ReceiptVo> list = receiptMapper.getReceiptList(paramsBo);
|
|
|
+ list.removeIf(Objects::isNull);
|
|
|
+ // (用户权限: 1收款列表访问,2收款详情访问,3收款录入,4收款关联订单,5收款关联返佣,6收款关联供应商退款,7收款审核)
|
|
|
+ List<String> openidList = receiptMapper.getOpenidListByPermission(Arrays.asList(4,5,6));
|
|
|
+ openidList.removeIf(Objects::isNull);
|
|
|
+ String title = "超时未确认,请及时查看详情并确认关联!";
|
|
|
+ String pagePath = "";
|
|
|
+ for (ReceiptVo receipt : list) {
|
|
|
+ // 收款款项类型:1订单款,2非订单款,3返佣款,5供应商退款
|
|
|
+ Integer receiptType = receipt.getReceiptType();
|
|
|
+ if (null != receiptType && 1 == receiptType) {
|
|
|
+ // 未关联普通款项
|
|
|
+ pagePath = "/pages/relation/ordinary/index?id="+receipt.getId();
|
|
|
+ }
|
|
|
+ if (null != receiptType && 3 == receiptType) {
|
|
|
+ // 未关联返佣款项
|
|
|
+ pagePath = "/pages/relation/return/index?id="+receipt.getId();
|
|
|
+ }
|
|
|
+ if (null != receiptType && 5 == receiptType) {
|
|
|
+ // 未关联供应商退款
|
|
|
+ pagePath = "/pages/relation/refund/index?id="+receipt.getId();
|
|
|
+ }
|
|
|
+ double amount = receipt.getReceiptAmount();
|
|
|
+ String date = receipt.getReceiptDate();
|
|
|
+ String receiptTypeStr = receiptMapper.getReceiptTypeStrById(receipt.getPayType());
|
|
|
+ String remarkText = "收款类型:" + receiptTypeStr;
|
|
|
+ for (String openid : openidList) {
|
|
|
+ // sendTemplateMsg(openid, 标题, 金额, 收款日期, 备注, 跳转链接)
|
|
|
+ weChatService.sendTemplateMsg(openid, title, amount, date, remarkText, pagePath);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 微信收款信息推送(待审核超时)
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public void sendWechatMsgAuditTimeout() {
|
|
|
+ //待审核超时
|
|
|
+ ReceiptParamsBo paramsBo = new ReceiptParamsBo();
|
|
|
+ String[] receiptStatusArr = "2".split(",");
|
|
|
+ paramsBo.setReceiptStatusArr(receiptStatusArr);
|
|
|
+ paramsBo.setStartDate("2022-01-01 00:00:00");
|
|
|
+ List<ReceiptVo> list = receiptMapper.getReceiptList(paramsBo);
|
|
|
+ list.removeIf(Objects::isNull);
|
|
|
+ // (用户权限: 1收款列表访问,2收款详情访问,3收款录入,4收款关联订单,5收款关联返佣,6收款关联供应商退款,7收款审核)
|
|
|
+ List<String> openidList = receiptMapper.getOpenidListByPermission(Collections.singletonList(7));
|
|
|
+ openidList.removeIf(Objects::isNull);
|
|
|
+ String title = "超时未审核,请及时查看详情并审核!";
|
|
|
+ for (ReceiptVo receipt : list) {
|
|
|
+ double amount = receiptMapper.countAssociateAmountById(receipt.getId());
|
|
|
+ String date = receipt.getConfirmDate();
|
|
|
+ String receiptTypeStr = receiptMapper.getReceiptTypeStrById(receipt.getPayType());
|
|
|
+ String remarkText = "收款类型:" + receiptTypeStr + ",确认时间:"+receipt.getConfirmDate();
|
|
|
+ // 跳转到【普通款项待审核】页面
|
|
|
+ String pagePath = "/pages/relation/ordinary/examine-detail?id="+receipt.getId();
|
|
|
+ for (String openid : openidList) {
|
|
|
+ // sendTemplateMsg(openid, 标题, 金额, 收款日期, 备注, 跳转链接)
|
|
|
+ weChatService.sendTemplateMsg(openid, title, amount, date, remarkText, pagePath);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 设置订单的款项信息
|
|
|
+ */
|
|
|
+ private void setOrderAmountInfo(OrderVo order) {
|
|
|
+ String userName = baseMapper.getUserNameByUserId(order.getUserId());
|
|
|
+ order.setClubName(userName);
|
|
|
+ order.setPaidAmount(getReceivedAmount(order, true));
|
|
|
+ order.setStatusName(OrderStatus.getOrderStatusText(order.getStatus()));
|
|
|
+ order.setUnCheckAmount(receiptMapper.getUncheckAmount(order.getOrderId()));
|
|
|
+ //获取退款价值
|
|
|
+ order.setReturnValue(getReturnValue(order));
|
|
|
+ //退款(退货)总金额
|
|
|
+ Double returnedPurchaseFee = 0d;
|
|
|
+ //退款总额(给买家)
|
|
|
+ Double refundFee = 0d;
|
|
|
+ //获取已退款金额
|
|
|
+ List<ReturnedPurchaseVo> returnedList = receiptMapper.getRefundFeeByOrderId(order.getOrderId());
|
|
|
+ if (null != returnedList && returnedList.size() > 0) {
|
|
|
+ for (ReturnedPurchaseVo returned : returnedList) {
|
|
|
+ returnedPurchaseFee += returned.getReturnedPurchaseFee();
|
|
|
+ refundFee += returned.getRefundFee();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ order.setReturnedPurchaseFee(returnedPurchaseFee);
|
|
|
+ order.setRefundFee(refundFee);
|
|
|
+ //获取剩余应收
|
|
|
+ order.setSurplusAmount(getUnPayMoney(order, true));
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 设置收款金额
|
|
|
+ */
|
|
|
+ public void setReceiptedAmount(ShopOrderVo shopOrder) {
|
|
|
+ OrderVo order = orderCommonMapper.getOrderByOrderId(shopOrder.getOrderId());
|
|
|
+ if (null != order.getRebateFlag() && 1 == order.getRebateFlag()) {
|
|
|
+ // 返佣订单
|
|
|
+ double needPayAmount = receiptMapper.countNeedPayAmount(order.getOrderId());
|
|
|
+ order.setReceiptAmount(needPayAmount);
|
|
|
+ // 佣金计算
|
|
|
+ BigDecimal brokerage = BigDecimal.ZERO;
|
|
|
+ List<OrderProductVo> orderProductList = orderCommonMapper.getShopOrderProduct(shopOrder.getShopOrderId());
|
|
|
+ orderProductList.removeIf(Objects::isNull);
|
|
|
+ for (OrderProductVo orderProduct : orderProductList) {
|
|
|
+ // 已退货数量
|
|
|
+ Integer returnedNum = orderCommonMapper.countReturnedNum(orderProduct.getShopOrderId(), orderProduct.getProductId());
|
|
|
+ returnedNum = null != returnedNum ? returnedNum : 0;
|
|
|
+ // 赠品数量
|
|
|
+ int presentNum = orderProduct.getPresentNum() == null ? 0 : orderProduct.getPresentNum();
|
|
|
+ // 折后单价
|
|
|
+ double discountPrice = orderProduct.getDiscountPrice() == null ? 0d : orderProduct.getDiscountPrice();
|
|
|
+ // 单个税费
|
|
|
+ double tax = orderProduct.getAddedValueTax() == null ? 0d : orderProduct.getAddedValueTax();
|
|
|
+ // 成本
|
|
|
+ double costPrice = orderProduct.getCostPrice() == null ? 0d : orderProduct.getCostPrice();
|
|
|
+ // 单个付供应商税费
|
|
|
+ double costTax = orderProduct.getSingleShouldPayTotalTax() == null ? 0d : orderProduct.getSingleShouldPayTotalTax();
|
|
|
+ // (num + presentNum - returnedNum) * ((discountPrice + tax) - (costPrice + costTax));
|
|
|
+ int num = orderProduct.getNum() + presentNum - returnedNum;
|
|
|
+ BigDecimal price = MathUtil.sub(MathUtil.add(discountPrice, tax), MathUtil.add(costPrice, costTax));
|
|
|
+ brokerage = MathUtil.add(brokerage, MathUtil.mul(price, num));
|
|
|
+ }
|
|
|
+ BigDecimal otherFee = MathUtil.add(order.getDiscountFee(), MathUtil.add(shopOrder.getShopOtherFee(), shopOrder.getShopPostFee()));
|
|
|
+ brokerage = MathUtil.sub(brokerage, otherFee);
|
|
|
+ shopOrder.setBrokerage(brokerage.doubleValue());
|
|
|
+ } else {
|
|
|
+ double associateAmount = receiptMapper.countAllPayAssociateAmount(order.getOrderId());
|
|
|
+ order.setReceiptAmount(associateAmount);
|
|
|
+ }
|
|
|
+ shopOrder.setMainOrder(order);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 设置收款详情信息
|
|
|
+ */
|
|
|
+ private void setReceiptDetail(ReceiptVo receipt) {
|
|
|
+ if (1 == receipt.getReceiptStatus()) {
|
|
|
+ String time = receipt.getReceiptDate();
|
|
|
+ long diff = DateUtils.pastHour(DateUtils.parseDate(time));
|
|
|
+ if (diff > 12) {
|
|
|
+ receipt.setTipMsg("无人确认");
|
|
|
+ }
|
|
|
+ } else if (2 == receipt.getReceiptStatus()) {
|
|
|
+ String time = receipt.getConfirmDate();
|
|
|
+ long diff = DateUtils.pastHour(DateUtils.parseDate(time));
|
|
|
+ if (diff > 12) {
|
|
|
+ receipt.setTipMsg("无人审核");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (2 == receipt.getReceiptStatus() && 1 == receipt.getReceiptType()) {
|
|
|
+ String userName = baseMapper.getUserNameByUserId(receipt.getUserId());
|
|
|
+ receipt.setUserName(userName);
|
|
|
+ }
|
|
|
+ if (null != receipt.getReceiptUserPermissionId()) {
|
|
|
+ String receiptUserName = receiptMapper.getReceiptUserNameById(receipt.getReceiptUserPermissionId());
|
|
|
+ receipt.setReceiptUserName(receiptUserName);
|
|
|
+ }
|
|
|
+ if (null != receipt.getConfirmUserPermissionId()) {
|
|
|
+ String confirmUserName = receiptMapper.getReceiptUserNameById(receipt.getConfirmUserPermissionId());
|
|
|
+ receipt.setConfirmUserName(confirmUserName);
|
|
|
+ }
|
|
|
+ if (null != receipt.getReviewUserPermissionId()) {
|
|
|
+ String reviewUserName = receiptMapper.getReceiptUserNameById(receipt.getReviewUserPermissionId());
|
|
|
+ receipt.setReviewUserName(reviewUserName);
|
|
|
+ }
|
|
|
+ ReceiptTypeVo type = receiptMapper.getReceiptTypeById(receipt.getPayType());
|
|
|
+ receipt.setPayTypeText(type.getType());
|
|
|
+ receipt.setReceiptTypeText(ReceiptType.getTypeDesc(receipt.getReceiptType()));
|
|
|
+ receipt.setReceiptStatusText(ReceiptStatus.getTypeDesc(receipt.getReceiptStatus(), receipt.getReceiptType()));
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取该收款用户下的机构userIds
|
|
|
+ *
|
|
|
+ * @param openid 微信openid
|
|
|
+ * @param receiptStatus 收款状态:1待确认、2已确认(待审核)、3审核通过、4审核未通过、5收款撤销【线上支付成功为审核通过】
|
|
|
+ */
|
|
|
+ private List<Integer> getReceiptClubUserIds(String openid, Integer receiptStatus) {
|
|
|
+ // 收款用户
|
|
|
+ ReceiptUserVo receiptUser = receiptMapper.getReceiptUserByOpenid(openid);
|
|
|
+ List<Integer> userIds = null;
|
|
|
+ Integer userType = null;
|
|
|
+ String logTxt = "";
|
|
|
+ if (null != receiptUser) {
|
|
|
+ //用户类型:1协销人员,2客服,3财务,4超级管理员
|
|
|
+ userType = receiptUser.getUserType();
|
|
|
+ if (1 == userType) {
|
|
|
+ // 协销人员
|
|
|
+ Integer spId = receiptMapper.getServiceProviderId(receiptUser.getUnionId());
|
|
|
+ userIds = receiptMapper.getClubUserIdBySpId(spId);
|
|
|
+ logTxt = "协销";
|
|
|
+ } else if (2 == userType) {
|
|
|
+ // 客服,默认协销id:1342
|
|
|
+ userIds = receiptMapper.getClubUserIdBySpId(1342);
|
|
|
+ Integer spId = receiptMapper.getServiceProviderId(receiptUser.getUnionId());
|
|
|
+ if (null != spId && spId > 0) {
|
|
|
+ userIds.addAll(receiptMapper.getClubUserIdBySpId(1342));
|
|
|
+ }
|
|
|
+ logTxt = "客服";
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (null == userIds && null != userType && 4 != userType) {
|
|
|
+ userIds = new ArrayList<>();
|
|
|
+ userIds.add(0);
|
|
|
+ }
|
|
|
+ if (null != userType && 2 == userType && null != receiptStatus && 2 == receiptStatus) {
|
|
|
+ // 客服可以查看所有待审核收款
|
|
|
+ userIds = null;
|
|
|
+ }
|
|
|
+ log.info("用户身份:" + logTxt + ">>>用户类型:" + userType + ">>>userIds:" + userIds);
|
|
|
+ return userIds;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 检查收款权限
|
|
|
+ * 1收款列表访问,2收款详情访问,3收款录入,4收款关联订单,5收款关联返佣,6收款关联供应商退款,7收款审核
|
|
|
+ *
|
|
|
+ * @param permission 0:登录用户不需要权限,其他具体权限
|
|
|
+ * @param headers HttpHeaders
|
|
|
+ * @return null:无权限/权限用户ReceiptUserVo
|
|
|
+ */
|
|
|
+ private ReceiptUserVo checkPermissions(Integer permission, HttpHeaders headers) {
|
|
|
+ // 用户openid
|
|
|
+ String openid = headers.getFirst("x-openid");
|
|
|
+ if (StringUtils.isNotBlank(openid)) {
|
|
|
+ // 收款用户
|
|
|
+ ReceiptUserVo receiptUser = receiptMapper.getReceiptUserByOpenid(openid);
|
|
|
+ if (null != receiptUser) {
|
|
|
+ // 获取用户权限: 1收款列表访问,2收款详情访问,3收款录入,4收款关联订单,5收款关联返佣,6收款关联供应商退款,7收款审核
|
|
|
+ List<Integer> permissions = receiptMapper.getPermissionsByUserId(receiptUser.getId());
|
|
|
+ if (0 == permission || permissions.contains(permission)) {
|
|
|
+ receiptUser.setPermissions(permissions);
|
|
|
+ return receiptUser;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 识别收款短信
|
|
|
+ * 以下方法按照短信采样结果实现(新增短信不兼容)
|
|
|
+ *
|
|
|
+ * @param message 收款短信
|
|
|
+ * 贵公司尾号7297的账户5月23日15时30分往来款收入人民币1800.00元,余额7055.50元。对方户名:哈尔滨爱丽达医疗美容管理有限公司爱建医疗美容诊所。[建设银行]
|
|
|
+ * 【广发银行】尊敬的客户,贵司账号后四位0115 的账户于08日13:55 收入一笔方芳尾数为8067的账户转账1850.00元,手续费0.00元。账户余额:1000000.00元。
|
|
|
+ * 【广发银行】您末四位为0115的企业账户于12日16:09收入人民币5000.00元(深圳同城)。账户余额:8907.21元。
|
|
|
+ * 【中信银行】贵公司尾号7172的中信账号于03月15日17:25,二代支付存入人民币3132.30元,当前余额为人民币4373.07元。
|
|
|
+ * 【中信银行】您尾号0897的中信卡于03月06日11:44,存入人民币2358.00元,当前余额为人民币1000000.00元。
|
|
|
+ * 【中信银行】您尾号0897的中信卡于03月19日13:37,财付通快捷支付存入人民币11348.45元,当前余额为人民币1000000.00元。
|
|
|
+ * 【中信银行】您尾号0897的中信卡于03月14日16:01,支付宝存入人民币5994.06元,当前余额为人民币1000000.00元。
|
|
|
+ * 【中信银行】您尾号0897的中信卡于05月29日14:42,二代支付存入人民币10000.00元,当前余额为人民币13871.67元。
|
|
|
+ */
|
|
|
+ private ResponseJson<ReceiptVo> identifyMessage(String message) throws Exception {
|
|
|
+ if (message.contains("银行")) {
|
|
|
+ // 隐藏余额后去数据库进行全匹配
|
|
|
+ message = hiddenBalance(message);
|
|
|
+ int index;
|
|
|
+ // 查询数据库,是否存在短信记录,存在就直接读取数据并返回
|
|
|
+ String md5Msg = Md5Util.md5(message);
|
|
|
+ ReceiptVo receiptVo = getReceiptByMd5Msg(md5Msg);
|
|
|
+ if (receiptVo != null) {
|
|
|
+ return ResponseJson.success(receiptVo);
|
|
|
+ }
|
|
|
+ // 数据库不存在短信记录,执行下面的操作
|
|
|
+ /*识别收款类别*/
|
|
|
+ index = message.indexOf("银行");
|
|
|
+ String receivableDesc = message.substring(index - 2, index + 2);
|
|
|
+ if (receivableDesc.contains("中信银行")) {
|
|
|
+ index = message.indexOf("尾号");
|
|
|
+ String account = message.substring(index + 2, index + 2 + 4);
|
|
|
+ receivableDesc = receivableDesc + "-" + account;
|
|
|
+ if (message.contains("财付通")) {
|
|
|
+ receivableDesc += "-财付通";
|
|
|
+ }
|
|
|
+ if (message.contains("支付宝")) {
|
|
|
+ receivableDesc += "-支付宝";
|
|
|
+ }
|
|
|
+ } else if (receivableDesc.contains("广发银行") || receivableDesc.contains("建设银行")) {
|
|
|
+ // 匹配的第一组数字为银行卡尾号
|
|
|
+ Matcher matcherBank = PATTERN_NUMBER.matcher(message);
|
|
|
+ if (matcherBank.find()) {
|
|
|
+ receivableDesc = receivableDesc + "-" + matcherBank.group();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ Integer typeId = receiptMapper.getReceivablesTypeId(receivableDesc);
|
|
|
+
|
|
|
+ /*识别收款时间*/
|
|
|
+ String time;
|
|
|
+ String year = DateUtils.getYear();
|
|
|
+ String month = DateUtils.getMonth();
|
|
|
+ List<String> contentTime = new ArrayList();
|
|
|
+ Matcher matcher = PATTERN_NUMBER.matcher(message);
|
|
|
+ while (matcher.find()) {
|
|
|
+ String group = matcher.group();
|
|
|
+ contentTime.add(group);
|
|
|
+ }
|
|
|
+ // 建设银行
|
|
|
+ if (Arrays.asList(1, 18, 19).contains(typeId)) {
|
|
|
+ time = year + "-" + contentTime.get(1) + "-" + contentTime.get(2) + " " + contentTime.get(3) + ":" + contentTime.get(4) + ":" + "00";
|
|
|
+ int difference = DateUtils.differentDays(time);
|
|
|
+ if (difference < 0) {
|
|
|
+ time = Integer.parseInt(year) - 1 + "-" + contentTime.get(1) + "-" + contentTime.get(2) + " " + contentTime.get(3) + ":" + contentTime.get(4) + ":" + "00";
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 广发银行
|
|
|
+ else if (Arrays.asList(2, 11).contains(typeId)) {
|
|
|
+ time = year + "-" + month + "-" + contentTime.get(1) + " " + contentTime.get(2) + ":" + "00";
|
|
|
+ int difference = DateUtils.differentDays(time);
|
|
|
+ /* 差距大于30天 减一年, 小于30天 减一个月 */
|
|
|
+ if (difference < -30) {
|
|
|
+ time = Integer.parseInt(year) - 1 + "-" + month + "-" + contentTime.get(1) + " " + contentTime.get(2) + ":" + contentTime.get(3) + ":" + "00";
|
|
|
+ } else if (difference < 0) {
|
|
|
+ time = DateUtils.format(DateUtils.addMonth(DateUtils.parseDate(time), -1), "yyyy-MM-dd HH:mm:ss");
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ time = year + "-" + contentTime.get(1) + "-" + contentTime.get(2) + " " + contentTime.get(3) + ":" + "00";
|
|
|
+ int difference = DateUtils.differentDays(time);
|
|
|
+ if (difference < 0) {
|
|
|
+ time = Integer.parseInt(year) - 1 + "-" + contentTime.get(1) + "-" + contentTime.get(2) + " " + contentTime.get(3) + ":" + "00";
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /*识别收款金额*/
|
|
|
+ double money = 0d;
|
|
|
+ if (typeId == 2) {
|
|
|
+ // 广发银行
|
|
|
+ if (message.contains("入人民币")) {
|
|
|
+ index = message.indexOf("入人民币");
|
|
|
+ int index2 = message.indexOf("元", index);
|
|
|
+ money = Double.parseDouble(message.substring(index + 4, index2));
|
|
|
+ } else if (message.contains("账户转账")) {
|
|
|
+ index = message.indexOf("账户转账");
|
|
|
+ int index2 = message.indexOf("元", index);
|
|
|
+ money = Double.parseDouble(message.substring(index + 4, index2));
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ if (message.contains("入人民币")) {
|
|
|
+ index = message.indexOf("入人民币");
|
|
|
+ int index2 = message.indexOf("元", index);
|
|
|
+ money = Double.parseDouble(message.substring(index + 4, index2));
|
|
|
+ } else {
|
|
|
+ throw new Exception("短信识别错误!");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /*识别手续费*/
|
|
|
+ boolean tipFeeFlag = false;
|
|
|
+ double tipFee = 0d;
|
|
|
+ if (TIP_FEE_TYPE.contains(typeId)) {
|
|
|
+ tipFeeFlag = true;
|
|
|
+ tipFee = MathUtil.mul(money, MathUtil.div(1, 1000), 2).doubleValue();
|
|
|
+ // 收款金额 = 短信收款金额+手续费
|
|
|
+ money = MathUtil.add(money, tipFee).doubleValue();
|
|
|
+ }
|
|
|
+
|
|
|
+ /*识别订单标识*/
|
|
|
+ String orderFlag = "";
|
|
|
+ Matcher matcherOrder = PATTERN_ORDER.matcher(message);
|
|
|
+ if (matcherOrder.find()) {
|
|
|
+ orderFlag = matcherOrder.group(1);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 线下收款
|
|
|
+ ReceiptVo receipt = new ReceiptVo();
|
|
|
+ receipt.setPayWay(2);
|
|
|
+ receipt.setPayType(typeId);
|
|
|
+ receipt.setReceiptDate(time);
|
|
|
+ receipt.setReceiptAmount(money);
|
|
|
+ receipt.setHaveFee(tipFeeFlag);
|
|
|
+ receipt.setHandlingFee(tipFee);
|
|
|
+ receipt.setOrderFlag(orderFlag);
|
|
|
+ receipt.setSmsMd5Code(md5Msg);
|
|
|
+ receipt.setSmsContent(message);
|
|
|
+
|
|
|
+ return ResponseJson.success(receipt);
|
|
|
+ }
|
|
|
+ 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(TIP_FEE_TYPE.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 = null != order.getDiscountFee() ? order.getDiscountFee() : 0d ;
|
|
|
+ // 如果经理折扣大于退款(退货)总金额之和 那么先抵扣经理折扣 退款价值为0
|
|
|
+ if (discountFee >= returnedAmount) {
|
|
|
+ returnedAmount = 0d;
|
|
|
+ } else {
|
|
|
+ // 抵用完经理折扣后才是真实价值
|
|
|
+ returnedAmount = returnedAmount - discountFee;
|
|
|
+ }
|
|
|
+ return returnedAmount;
|
|
|
+ }
|
|
|
+
|
|
|
+}
|