فهرست منبع

保存收款记录

chao 3 سال پیش
والد
کامیت
975d716085

+ 9 - 3
src/main/java/com/caimei365/order/controller/ReceiptApi.java

@@ -3,7 +3,7 @@ package com.caimei365.order.controller;
 import com.caimei365.order.model.ResponseJson;
 import com.caimei365.order.model.dto.ReceiptAuthDto;
 import com.caimei365.order.model.dto.ReceiptDto;
-import com.caimei365.order.model.vo.DiscernReceiptVo;
+import com.caimei365.order.model.vo.ReceiptVo;
 import com.caimei365.order.model.vo.ReceiptUserVo;
 import com.caimei365.order.service.ReceiptService;
 import io.swagger.annotations.Api;
@@ -70,8 +70,8 @@ public class ReceiptApi {
 
     @ApiOperation("识别收款短信")
     @PostMapping("/read/sms")
-    public ResponseJson<DiscernReceiptVo> readSmsMessage(ReceiptDto receiptDto) {
-        String message = receiptDto.getMessage();
+    public ResponseJson<ReceiptVo> readSmsMessage(ReceiptDto receiptDto) {
+        String message = receiptDto.getSmsContent();
         if (StringUtils.hasLength(message)) {
             return receiptService.readSmsMessage(message, receiptDto.getOpenid());
         } else {
@@ -79,5 +79,11 @@ public class ReceiptApi {
         }
     }
 
+    @ApiOperation("保存收款信息")
+    @PostMapping("/save")
+    public ResponseJson<ReceiptVo> saveReceipt(ReceiptDto receiptDto) {
+        return receiptService.saveReceipt(receiptDto);
+    }
+
 }
 

+ 32 - 3
src/main/java/com/caimei365/order/mapper/ReceiptMapper.java

@@ -1,8 +1,8 @@
 package com.caimei365.order.mapper;
 
-import com.caimei365.order.model.enums.ReceivablesType;
-import com.caimei365.order.model.vo.DiscernReceiptVo;
+import com.caimei365.order.model.po.ReceiptPo;
 import com.caimei365.order.model.vo.ReceiptUserVo;
+import com.caimei365.order.model.vo.ReceiptVo;
 import org.apache.ibatis.annotations.Mapper;
 
 import java.util.List;
@@ -15,6 +15,14 @@ import java.util.List;
  */
 @Mapper
 public interface ReceiptMapper {
+    /**
+     * 保存收款记录
+     */
+    void insertReceipt(ReceiptPo receiptPo);
+    /**
+     * 更新收款记录
+     */
+    void updateReceipt(ReceiptPo receiptPo);
     /**
      * 根据openid获取收款用户
      */
@@ -34,9 +42,30 @@ public interface ReceiptMapper {
     /**
      * 短信内容Md5加密串 获取收款记录
      */
-    List<DiscernReceiptVo> getReceiptBySmsMd5Code(String smsMd5Code);
+    List<ReceiptVo> getReceiptBySmsMd5Code(String smsMd5Code);
     /**
      * 获取收款类型
      */
     Integer getReceivablesTypeId(String type);
+    /**
+     * 获取订单已支付金额(待审核状态的收款也算)
+     */
+    Double getPaidAmountByOrderId(Integer orderId);
+    /**
+     * 获取订单待审核金额
+     */
+    Double getUncheckAmount(Integer orderId);
+    /**
+     * 获取订单已退金额
+     */
+    Double getReturnedAmount(Integer orderId);
+    /**
+     * 获取主订单下面的所有的确认收货商品数量
+     */
+    Integer getReceiptNumByOrderId(Integer orderId);
+    /**
+     * 获取该主订单下面所有已完成状态退货退款商品数量
+     */
+    Integer getReturnAndCancelNum(Integer orderId);
+
 }

+ 57 - 3
src/main/java/com/caimei365/order/model/dto/ReceiptDto.java

@@ -4,7 +4,6 @@ import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
-import javax.validation.constraints.NotNull;
 import java.io.Serializable;
 
 /**
@@ -17,15 +16,70 @@ import java.io.Serializable;
 @Data
 public class ReceiptDto implements Serializable {
     private static final long serialVersionUID = 1L;
+    /**
+     * 收款Id
+     */
+    @ApiModelProperty("收款Id")
+    private Integer id;
     /**
      * 微信openid
      */
     @ApiModelProperty("微信openid")
     private String openid;
+    /**
+     * 作废标记
+     */
+    @ApiModelProperty("作废标记: 0否,其余是")
+    private String delFlag;
     /**
      * 收款短信
      */
-    @NotNull
     @ApiModelProperty("收款短信")
-    private String message;
+    private String smsContent;
+    /**
+     * 短信内容Md5加密串(适用于二次短信匹配查询)
+     */
+    @ApiModelProperty("短信内容Md5加密串")
+    private String smsMd5Code;
+    /**
+     * 用户付款方式:1线上,2线下,3余额抵扣
+     */
+    @ApiModelProperty("付款方式")
+    private String payWay;
+    /**
+     * 付款类型: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网银
+     */
+    @ApiModelProperty("付款类型")
+    private String payType;
+    /**
+     * 收款款项类型
+     */
+    @ApiModelProperty("收款款项类型:1订单款,2非订单款,3返佣款 4订单款或者非订单款(因财务阶段无法区分订单非订单), 5供应商退款")
+    private String receiptType;
+    /**
+     * 收款状态
+     */
+    @ApiModelProperty("收款状态:1待确认、2已确认(待审核)、3审核通过、4审核未通过、5收款撤销【线上支付成功为审核通过】")
+    private String receiptStatus;
+    /**
+     * 收款时间
+     */
+    @ApiModelProperty("收款时间")
+    private String receiptDate;
+    /**
+     * 收款金额(线上一次性付款和支付金额一致)
+     */
+    @ApiModelProperty("收款金额")
+    private Double receiptAmount;
+    /**
+     * 手续费
+     */
+    @ApiModelProperty("手续费")
+    private Double handlingFee;
+    /**
+     * 订单标识
+     */
+    @ApiModelProperty("订单标识")
+    private String orderFlag;
+
 }

+ 4 - 0
src/main/java/com/caimei365/order/model/po/BalanceRecordPo.java

@@ -42,6 +42,10 @@ public class BalanceRecordPo implements Serializable {
      * 主订单ID(适用余额类型1,3[类型为3多次退款存在相同记录ID则需通过退款ID唯一区分])
      */
     private Integer orderId;
+    /**
+     * 收款ID(适用余额类型2)
+     */
+    private Integer receiptId;
     /**
      * 备注
      */

+ 4 - 0
src/main/java/com/caimei365/order/model/po/OrderReceiptRelationPo.java

@@ -29,6 +29,10 @@ public class OrderReceiptRelationPo implements Serializable {
      * 关联金额:1普通收款(线下):收款具体对该应母订单的收金额、2线上支付:付款金额就等于该金额、3返佣收款:默认为0
      */
     private Double associateAmount;
+    /**
+     * 关联方式: 1手动 2自动
+     */
+    private Integer associationType;
     /**
      * 订单Id(relationType值为1是为子订单ID,为2时为主订单ID)
      */

+ 104 - 0
src/main/java/com/caimei365/order/model/po/ReceiptPo.java

@@ -0,0 +1,104 @@
+package com.caimei365.order.model.po;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2022/2/15
+ */
+@Data
+public class ReceiptPo implements Serializable {
+    private static final long serialVersionUID = 1L;
+    /**
+     * 收款Id
+     */
+    private Integer id;
+    /**
+     * 收款短信
+     */
+    private String smsContent;
+    /**
+     * 短信内容Md5加密串(适用于二次短信匹配查询)
+     */
+    private String smsMd5Code;
+    /**
+     * 用户付款方式:1线上,2线下,3余额抵扣
+     */
+    private String payWay;
+    /**
+     * 付款类型: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网银
+     */
+    private String payType;
+    /**
+     * 收款款项类型:1订单款,2非订单款,3返佣款 4订单款或者非订单款(因财务阶段无法区分订单非订单), 5供应商退款
+     */
+    private String receiptType;
+    /**
+     * 收款状态:1待确认、2已确认(待审核)、3审核通过、4审核未通过、5收款撤销【线上支付成功为审核通过】
+     */
+    private String receiptStatus;
+    /**
+     * 收款时间
+     */
+    private String receiptDate;
+    /**
+     * 收款金额(线上一次性付款和支付金额一致)
+     */
+    private Double receiptAmount;
+    /**
+     * 手续费
+     */
+    private Double handlingFee;
+    /**
+     * 订单标识
+     */
+    private String orderFlag;
+    /**
+     * 作废标记
+     */
+    private String delFlag;
+    /**
+     * 确认订单类型:1小额抹平确认,2大额抹平确认,3大额退款余额,4确认关联
+     */
+    private String confirmType;
+    /**
+     * 确认时间
+     */
+    private String confirmDate;
+    /**
+     * 确认人权限ID(对应cm_receipt_user表)
+     */
+    private Integer confirmUserPermissionId;
+    /**
+     * 收款人权限ID(对应cm_receipt_user表)
+     */
+    private Integer receiptUserPermissionId;
+    /**
+     * 审核人权限ID(对应cm_receipt_user表)
+     */
+    private Integer reviewUserPermissionId;
+    /**
+     * 撤销人权限ID(对应cm_receipt_user表)
+     */
+    private String cancelUserPermissionId;
+    /**
+     * 审核时间
+     */
+    private String reviewDate;
+    /**
+     * 撤销时间
+     */
+    private String cancelDate;
+    /**
+     * 撤销原因
+     */
+    private String cancelReason;
+    /**
+     * 更新操作时间
+     */
+    private String updateDate;
+}

+ 0 - 20
src/main/java/com/caimei365/order/model/vo/DiscernReceiptVo.java

@@ -73,24 +73,4 @@ public class DiscernReceiptVo implements Serializable {
      * 米花科技平台唯一流水号
      */
     private String mbOrderId;
-    /**
-     * 短信内容
-     */
-    private String smsContent;
-    /**
-     * 短信内容Md5加密串(适用于二次短信匹配查询)
-     */
-    private String smsMd5Code;
-    /**
-     * 【扩展属性】是否存在手续费
-     */
-    private Boolean tipFeeFlag;
-    /**
-     * 【扩展属性】手续费
-     */
-    private Double tipFee;
-    /**
-     * 【扩展属性】订单标识
-     */
-    private String orderFlag;
 }

+ 5 - 0
src/main/java/com/caimei365/order/model/vo/ReceiptUserVo.java

@@ -44,5 +44,10 @@ public class ReceiptUserVo implements Serializable {
      */
     @ApiModelProperty("密码")
     private String password;
+    /**
+     * 用户类型:1协销人员,2客服,3财务,4超级管理员
+     */
+    @ApiModelProperty("用户权限: 1录入收款权限,2收款确认权限,3收款审核权限 4返佣管理权限 5供应商退款管理权限")
+    private Integer permission;
 
 }

+ 77 - 0
src/main/java/com/caimei365/order/model/vo/ReceiptVo.java

@@ -0,0 +1,77 @@
+package com.caimei365.order.model.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2022/2/15
+ */
+@Data
+public class ReceiptVo implements Serializable {
+    private static final long serialVersionUID = 1L;
+    /**
+     * 款项识别表id
+     */
+    private Integer id;
+    /**
+     * 用户付款方式:1线上,2线下,3余额抵扣
+     */
+    private Integer payWay;
+    /**
+     * 付款类型: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网银
+     */
+    private Integer payType;
+    /**
+     * 收款款项类型:1订单款,2非订单款,3返佣款
+     */
+    private Integer receiptType;
+    /**
+     * 收款状态:1待确认、2已确认(待审核)、3审核通过、4审核未通过、5收款撤销【订单款项状态:12345】【非订单款项状态:125】【返佣款状态:125】【线上支付成功为审核通过】
+     */
+    private Integer receiptStatus;
+    /**
+     * 收款金额(线上一次性付款和支付金额一致)
+     */
+    private Double receiptAmount;
+    /**
+     * 收款时间
+     */
+    private String receiptDate;
+    /**
+     * 单次收款金额
+     */
+    private Double associateAmount;
+    /**
+     * 短信内容
+     */
+    private String smsContent;
+    /**
+     * 短信内容Md5加密串(适用于二次短信匹配查询)
+     */
+    private String smsMd5Code;
+    /**
+     * 是否存在手续费
+     */
+    private Boolean haveFee;
+    /**
+     * 手续费
+     */
+    private Double handlingFee;
+    /**
+     * 订单标识
+     */
+    private String orderFlag;
+    /**
+     * 当前识别短信是否已经识别存在系统。0新短信可以识别,1已经存在识别短信。
+     */
+    private String smsContentPresenceFlag;
+    /**
+     * 自动审核收款标记(0手动分享去确认审核,1收款直接确认并审核[适用星范带有正确订单标识的收款])
+     */
+    private String autoAuditFlag;
+
+}

+ 7 - 4
src/main/java/com/caimei365/order/service/ReceiptService.java

@@ -1,7 +1,8 @@
 package com.caimei365.order.service;
 
 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.vo.ReceiptVo;
 import com.caimei365.order.model.vo.ReceiptUserVo;
 import org.springframework.http.HttpHeaders;
 
@@ -30,7 +31,9 @@ public interface ReceiptService {
      * 识别收款短信
      * @param message 收款短信
      */
-    ResponseJson<DiscernReceiptVo> readSmsMessage(String message, String openid);
-
-
+    ResponseJson<ReceiptVo> readSmsMessage(String message, String openid);
+    /**
+     * 保存收款信息
+     */
+    ResponseJson<ReceiptVo> saveReceipt(ReceiptDto receiptDto);
 }

+ 417 - 37
src/main/java/com/caimei365/order/service/impl/ReceiptServiceImpl.java

@@ -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;
+    }
 
 }

+ 7 - 7
src/main/resources/mapper/BaseMapper.xml

@@ -179,17 +179,17 @@
         LIMIT 1
     </select>
     <select id="getUserMoney" resultType="java.lang.Double">
-        SELECT userMoney
+        SELECT IFNULL(userMoney, 0)
         FROM user
         WHERE userID = #{userId}
     </select>
     <select id="getAbleUserMoney" resultType="java.lang.Double">
-        SELECT ableUserMoney
+        SELECT IFNULL(ableUserMoney, 0)
         FROM user
         WHERE userID = #{userId}
     </select>
     <select id="getUserBeans" resultType="java.lang.Integer">
-        SELECT userBeans
+        SELECT IFNULL(userBeans, 0)
         FROM user
         WHERE userID = #{userId}
     </select>
@@ -264,9 +264,9 @@
     </insert>
     <insert id="insertOrderReceiptRelation" keyColumn="id" keyProperty="id"
             parameterType="com.caimei365.order.model.po.OrderReceiptRelationPo" useGeneratedKeys="true">
-        INSERT INTO cm_receipt_order_relation (relationType, receiptId, associateAmount, orderId, vipRecordId, delFlag,
+        INSERT INTO cm_receipt_order_relation (relationType, receiptId, associationType, associateAmount, orderId, vipRecordId, delFlag,
                                                mbOrderId, orderRequestNo, splitStatus, productId)
-        VALUES (#{relationType}, #{receiptId}, #{associateAmount}, #{orderId}, #{vipRecordId}, #{delFlag}, #{mbOrderId},
+        VALUES (#{relationType}, #{receiptId}, #{associationType}, #{associateAmount}, #{orderId}, #{vipRecordId}, #{delFlag}, #{mbOrderId},
                 #{orderRequestNo}, #{splitStatus}, #{productId})
     </insert>
     <insert id="insertBeansHistory" parameterType="com.caimei365.order.model.po.UserBeansHistoryPo">
@@ -289,8 +289,8 @@
         WHERE userID = #{userId}
     </update>
     <insert id="insertBalanceRecord" parameterType="com.caimei365.order.model.po.BalanceRecordPo">
-        INSERT INTO cm_user_balance_record (userId, type, balanceType, addDate, amount, orderId, remark, delFlag)
-        VALUES (#{userId}, #{type}, #{balanceType}, #{addDate}, #{amount}, #{orderId}, #{remark}, #{delFlag})
+        INSERT INTO cm_user_balance_record (userId, type, balanceType, addDate, amount, orderId, receiptId, remark, delFlag)
+        VALUES (#{userId}, #{type}, #{balanceType}, #{addDate}, #{amount}, #{orderId}, #{receiptId}, #{remark}, #{delFlag})
     </insert>
     <select id="getSvipUserIdByUserId" resultType="java.lang.Integer">
         select userId

+ 1 - 1
src/main/resources/mapper/PayOrderMapper.xml

@@ -242,4 +242,4 @@
         FROM cm_svip_user
         WHERE userId = #{#userId} and endTime > now()
     </select>
-</mapper>
+</mapper>

+ 232 - 11
src/main/resources/mapper/ReceiptMapper.xml

@@ -1,8 +1,179 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.caimei365.order.mapper.ReceiptMapper">
+    <insert id="insertReceipt" keyColumn="id" keyProperty="id"  parameterType="com.caimei365.order.model.po.ReceiptPo" useGeneratedKeys="true">
+        INSERT INTO cm_discern_receipt(
+            payWay,
+            payType,
+            receiptType,
+            receiptStatus,
+            smsContent,
+            smsMd5Code,
+            receiptAmount,
+            handlingFee,
+            confirmType,
+            receiptUserPermissionID,
+            confirmUserPermissionID,
+            reviewUserPermissionID,
+            cancelUserPermissionID,
+            transactionNum,
+            bankID,
+            bankCode,
+            kuaiQianPayTypeID,
+            kuaiQianPayerID,
+            rePayFlag,
+            actualAmount,
+            formData,
+            problem,
+            noOrderReason,
+            reviewReason,
+            rebateRemarks,
+            cancelReason,
+            receiptDate,
+            confirmDate,
+            reviewDate,
+            cancelDate,
+            updateDate,
+            delFlag
+        ) VALUES (
+             #{payWay},
+             #{payType},
+             #{receiptType},
+             #{receiptStatus},
+             #{smsContent},
+             #{smsMd5Code},
+             #{receiptAmount},
+             #{handlingFee},
+             #{confirmType},
+             #{receiptUserPermissionId},
+             #{confirmUserPermissionId},
+             #{reviewUserPermissionId},
+             #{cancelUserPermissionId},
+             #{transactionNum},
+             #{bankId},
+             #{bankCode},
+             #{kuaiQianPayTypeId},
+             #{kuaiQianPayerId},
+             #{rePayFlag},
+             #{actualAmount},
+             #{formData},
+             #{problem},
+             #{noOrderReason},
+             #{reviewReason},
+             #{rebateRemarks},
+             #{cancelReason},
+             #{receiptDate},
+             #{confirmDate},
+             #{reviewDate},
+             #{cancelDate},
+             #{updateDate},
+             #{delFlag}
+         )
+    </insert>
+    <update id="updateReceipt" parameterType="com.caimei365.order.model.po.ReceiptPo">
+        update cm_discern_receipt
+        <set >
+            <if test="payWay != null" >
+                payWay = #{payWay},
+            </if>
+            <if test="payType != null" >
+                payType = #{payType},
+            </if>
+            <if test="receiptType != null" >
+                receiptType = #{receiptType},
+            </if>
+            <if test="receiptStatus != null" >
+                receiptStatus = #{receiptStatus},
+            </if>
+            <if test="smsContent != null" >
+                smsContent = #{smsContent},
+            </if>
+            <if test="smsMd5Code != null" >
+                smsMd5Code = #{smsMd5Code},
+            </if>
+            <if test="orderFlag != null" >
+                orderFlag = #{orderFlag},
+            </if>
+            <if test="receiptAmount != null" >
+                receiptAmount = #{receiptAmount},
+            </if>
+            <if test="handlingFee != null" >
+                handlingFee = #{handlingFee},
+            </if>
+            <if test="confirmType != null" >
+                confirmType = #{confirmType},
+            </if>
+            <if test="confirmUserPermissionId != null" >
+                confirmUserPermissionID = #{confirmUserPermissionId},
+            </if>
+            <if test="reviewUserPermissionId != null" >
+                reviewUserPermissionID = #{reviewUserPermissionId},
+            </if>
+            <if test="cancelUserPermissionId != null" >
+                cancelUserPermissionID = #{cancelUserPermissionId},
+            </if>
+            <if test="transactionNum != null" >
+                transactionNum = #{transactionNum},
+            </if>
+            <if test="bankId != null" >
+                bankID = #{bankId},
+            </if>
+            <if test="bankCode != null" >
+                bankCode = #{bankCode},
+            </if>
+            <if test="kuaiQianPayTypeId != null" >
+                kuaiQianPayTypeID = #{kuaiQianPayTypeId},
+            </if>
+            <if test="kuaiQianPayerId != null" >
+                kuaiQianPayerID = #{kuaiQianPayerId},
+            </if>
+            <if test="rePayFlag != null" >
+                rePayFlag = #{rePayFlag},
+            </if>
+            <if test="actualAmount != null" >
+                actualAmount = #{actualAmount},
+            </if>
+            <if test="noOrderReason != null" >
+                noOrderReason = #{noOrderReason},
+            </if>
+            <if test="reviewReason != null" >
+                reviewReason = #{reviewReason},
+            </if>
+            <if test="cancelReason != null" >
+                cancelReason = #{cancelReason},
+            </if>
+            <if test="receiptDate != null" >
+                receiptDate = #{receiptDate},
+            </if>
+            <if test="confirmDate != null" >
+                confirmDate = #{confirmDate},
+            </if>
+            <if test="reviewDate != null" >
+                reviewDate = #{reviewDate},
+            </if>
+            <if test="cancelDate != null" >
+                cancelDate = #{cancelDate},
+            </if>
+            <if test="updateDate != null" >
+                updateDate = #{updateDate},
+            </if>
+            <if test="delFlag != null" >
+                delFlag = #{delFlag},
+            </if>
+            <if test="formData != null" >
+                formData = #{formData},
+            </if>
+            <if test="problem != null" >
+                problem = #{problem},
+            </if>
+            <if test="rebateRemarks != null" >
+                rebateRemarks = #{rebateRemarks},
+            </if>
+        </set>
+        where id = #{id}
+    </update>
     <update id="updateOpenidByMobile">
-        UPDATE cm_receipt_user set openid=#{openid} WHERE mobile = #{mobile}
+        UPDATE cm_receipt_user SET openid=#{openid} WHERE mobile = #{mobile}
     </update>
     <select id="getReceiptUserByOpenid" resultType="com.caimei365.order.model.vo.ReceiptUserVo">
         SELECT DISTINCT id, user_type AS userType, name, mobile, openid, password
@@ -17,7 +188,7 @@
     <select id="getPermissionsByUserId" resultType="java.lang.Integer">
         SELECT permission FROM cm_receipt_user_permission WHERE user_id = #{userId}
     </select>
-    <select id="getReceiptBySmsMd5Code" resultType="com.caimei365.order.model.vo.DiscernReceiptVo">
+    <select id="getReceiptBySmsMd5Code" resultType="com.caimei365.order.model.vo.ReceiptVo">
         SELECT DISTINCT
             cdr.id,
             cdr.payWay,
@@ -25,18 +196,68 @@
             cdr.receiptType,
             cdr.receiptStatus,
             cdr.receiptAmount,
-            cdr.confirmType,
+            cdr.smsMd5Code,
             cdr.receiptDate,
-            cdr.confirmDate,
-            cdr.reviewDate,
-            cdr.updateDate,
-            cdr.delFlag,
-            cror.mbOrderId,
-            cror.associateAmount
-        FROM cm_receipt_order_relation cror LEFT JOIN cm_discern_receipt cdr ON cror.receiptID = cdr.id
-        WHERE cdr.smsMd5Code = #{smsMd5Code} AND cror.delFlag = '0' AND cdr.delFlag = '0'
+            cdr.handlingFee,
+            cdr.orderFlag,
+            IFNULL(SUM(cror.associateAmount), 0) AS associateAmount
+        FROM cm_receipt_order_relation cror
+        LEFT JOIN cm_discern_receipt cdr ON cror.receiptID = cdr.id
+        WHERE cdr.smsMd5Code = #{smsMd5Code} AND cdr.delFlag = '0' AND cror.delFlag = '0'
     </select>
     <select id="getReceivablesTypeId" resultType="java.lang.Integer">
         SELECT DISTINCT IFNULL(id, 0) FROM cm_receipt_type WHERE type=#{type}
     </select>
+    <select id="getPaidAmountByOrderId" resultType="java.lang.Double">
+        SELECT IFNULL(SUM(cror.associateAmount), 0)
+        FROM cm_receipt_order_relation cror
+        LEFT JOIN cm_discern_receipt cdr ON cror.receiptID = cdr.id
+        <where>
+            <if test="orderId != null and orderId != ''">
+                AND cror.orderID = #{orderId} AND cror.relationType = 2
+            </if>
+            AND cdr.receiptStatus in(2,3)
+            AND cdr.payWay != '3'
+            AND cdr.delFlag = '0'
+            AND cror.delFlag = '0'
+        </where>
+    </select>
+    <select id="getUncheckAmount" resultType="java.lang.Double">
+        SELECT IFNULL(SUM(cror.associateAmount), 0)
+        FROM cm_receipt_order_relation cror
+        LEFT JOIN cm_discern_receipt cdr ON cror.receiptID = cdr.id
+        <where>
+            <if test="orderId != null and orderId != ''">
+                AND cror.orderID = #{orderId} AND cror.relationType = 2
+            </if>
+            AND cdr.receiptStatus = '2'
+            AND cdr.delFlag = '0'
+            AND cror.delFlag = '0'
+        </where>
+    </select>
+    <select id="getReturnedAmount" resultType="java.lang.Double">
+        SELECT IFNULL(SUM(returnedPurchaseFee), 0) FROM cm_returned_purchase
+        <where>
+            <if test="orderId != null and orderId != ''">
+                AND orderID = #{orderId}
+            </if>
+            AND status = '2'
+        </where>
+    </select>
+    <select id="getReceiptNumByOrderId" resultType="java.lang.Integer">
+        SELECT IFNULL(SUM(a.num),0) FROM cm_logistics_record a
+            LEFT JOIN cm_logistics_batch b ON a.logisticsBatchID = b.id
+        WHERE b.orderID = #{orderId} AND b.status = '1'
+    </select>
+    <select id="getReturnAndCancelNum" resultType="java.lang.Integer">
+        SELECT IFNULL(SUM(a.actualReturnedNum + a.actualCancelNum),0)
+        FROM cm_returned_purchase_product a
+            LEFT JOIN cm_returned_purchase b ON a.returnedID = b.id
+        WHERE b.orderID = #{orderId} AND b.status = '2' AND b.delFlag = '0'
+    </select>
+
+
+
+
+
 </mapper>