chaoo 3 år sedan
förälder
incheckning
dc61ffa735

+ 11 - 5
src/main/java/com/caimei365/manager/controller/caimei/finance/FinanceApi.java

@@ -2,12 +2,8 @@ package com.caimei365.manager.controller.caimei.finance;
 
 import com.caimei365.manager.entity.PaginationVo;
 import com.caimei365.manager.entity.ResponseJson;
-import com.caimei365.manager.entity.caimei.ReceiptDetail;
-import com.caimei365.manager.entity.caimei.ReceiptList;
-import com.caimei365.manager.entity.caimei.ReceiptParam;
-import com.caimei365.manager.entity.caimei.ReceiptType;
+import com.caimei365.manager.entity.caimei.*;
 import com.caimei365.manager.service.caimei.FinanceService;
-import org.springframework.http.HttpHeaders;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
@@ -55,4 +51,14 @@ public class FinanceApi {
         return financeService.getReceiptDetail(id);
     }
 
+    /**
+     * 撤销收款
+     */
+    @PostMapping("/receipt/cancel")
+    public ResponseJson<Void> cancelReceipt(ReceiptCancelParam receiptCancelParam) {
+        if (null == receiptCancelParam.getId() || receiptCancelParam.getId() <= 0) {
+            return ResponseJson.error("收款Id不能为空!", null);
+        }
+        return financeService.cancelReceipt(receiptCancelParam);
+    }
 }

+ 72 - 0
src/main/java/com/caimei365/manager/dao/FinanceDao.java

@@ -110,4 +110,76 @@ public interface FinanceDao {
      * 关联优惠券购买记录
      */
     ReceiptCouponInfo getReceiptCouponInfo(Integer receiptId);
+    /**
+     * 收款关联的订单Id
+     */
+    List<Integer> getOrderIdsByReceiptId(Integer receiptId);
+    /**
+     * 收款关联的子订单Id
+     */
+    List<Integer> getShopOrderIdsByReceiptId(Integer id);
+    /**
+     * 统计订单款项的收款记录
+     * @param orderId 订单Id
+     * @param receiptId 收款Id
+     */
+    int getOrderReceiptCount(Integer orderId, Integer receiptId);
+    /**
+     * 统计子订单款项的收款记录
+     * @param shopOrderId 子订单Id
+     * @param receiptId 收款Id
+     */
+    int getShopOrderReceiptCount(Integer shopOrderId, Integer receiptId);
+    /**
+     * 根据订单Id获取订单
+     * @param orderId 订单Id
+     */
+    CmOrder getOrderByOrderId(Integer orderId);
+    /**
+     * 更新订单状态
+     */
+    void updateOrderStatus(CmOrder order);
+    /**
+     * 判断是否是充值定金商品
+     */
+    int countDepositOrderProduct(Integer orderId);
+    /**
+     * 更新用户余额
+     */
+    void updateReduceUserMoney(Double money, Integer userId);
+    /**
+     * 保存 余额收支记录
+     */
+    void insertBalanceRecord(BalanceRecord balanceRecord);
+    void updateBalanceRecord(BalanceRecord balanceRecord);
+    /**
+     * 根据子订单Id获取子订单
+     * @param shopOrderId 订单Id
+     */
+    CmShopOrder getShopOrderById(Integer shopOrderId);
+    /**
+     * 子更新订单状态
+     */
+    void updateShopOrderStatus(CmShopOrder cmShopOrder);
+    /**
+     * 返佣欠款记录
+     */
+    RebateRecord getRebateRecordByReceiptId(Integer receiptId);
+    /**
+     * 获取供应商
+     */
+    CmShop getShopByShopId(String shopId);
+    /**
+     * 更新供应商可用余额
+     */
+    void updateShopAbleRebateAmount(CmShop shop);
+    /**
+     * 删除返佣欠款记录
+     */
+    void deleteRebateRecord(Integer receiptId);
+    /**
+     * 撤销收款
+     */
+    void cancelReceipt(ReceiptDetail receipt);
+
 }

+ 57 - 0
src/main/java/com/caimei365/manager/entity/caimei/BalanceRecord.java

@@ -0,0 +1,57 @@
+package com.caimei365.manager.entity.caimei;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 余额收支记录
+ *
+ * @author : Charles
+ * @date : 2021/7/14
+ */
+@Data
+public class BalanceRecord implements Serializable {
+    private static final long serialVersionUID = 1L;
+    /**
+     * 余额收支记录ID
+     */
+    private Integer id;
+    /**
+     * 用户ID
+     */
+    private Integer userId;
+    /**
+     * 收支类型:1收入,2支出
+     */
+    private Integer type;
+    /**
+     * 余额类型:1线下余额抵扣,2多收退款到余额,3申请退款,4余额充值,5余额提现,6订金订单充值,7余额订单充值,8订金订单退款,9余额订单退款,10线上余额抵扣,16线上订金订单充值,17线上余额订单充值
+     */
+    private Integer balanceType;
+    /**
+     * 添加时间
+     */
+    private Date addDate;
+    /**
+     * 金额
+     */
+    private Double amount;
+    /**
+     * 主订单ID(适用余额类型1,3[类型为3多次退款存在相同记录ID则需通过退款ID唯一区分])
+     */
+    private Integer orderId;
+    /**
+     * 收款ID(适用余额类型2)
+     */
+    private Integer receiptId;
+    /**
+     * 备注
+     */
+    private String remark;
+    /**
+     * 删除标记 0 否,其余是
+     */
+    private Integer delFlag;
+}

+ 217 - 0
src/main/java/com/caimei365/manager/entity/caimei/CmOrder.java

@@ -0,0 +1,217 @@
+package com.caimei365.manager.entity.caimei;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2021/7/7
+ */
+@Data
+public class CmOrder implements Serializable {
+    private static final long serialVersionUID = 1L;
+    /**
+     * orderSeen:订单对机构可见度,1可见,2不可见
+     */
+    private Integer orderSeen;
+    /**
+     * 订单号
+     */
+    private Integer orderId;
+    /**
+     * 订单来源:1WWW、2CRM、4客服[适用后台下单]、5外单[适用后台下单]、6小程序[采美,星范]、7呵呵商城小程序、8维沙小程序
+     */
+    private Integer orderSource;
+    /**
+     * 订单编号
+     */
+    private String orderNo;
+    /**
+     * 用户Id
+     */
+    private Integer userId;
+    /**
+     * 机构Id
+     */
+    private Integer clubId;
+    /**
+     * 下单人Id(协销Id,或运营人Id,或用户Id)
+     */
+    private Integer buyUserId;
+    /**
+     * 协销Id
+     */
+    private Integer spId;
+    /**
+     * 订单提交时间
+     */
+    private String orderTime;
+    /**
+     * 更新时间
+     */
+    private String updateDate;
+    /**
+     * 订单状态 0 有效  其它无效
+     */
+    private Integer delFlag;
+    /**
+     * 采美豆抵扣运费的抵扣数量
+     */
+    private Integer userBeans;
+    /**
+     * 订单类型 协销订单 0, 普通订单 1
+     */
+    private Integer orderType;
+    /**
+     * 订单提交类型 0:个人自己下单 1:企业自己下单 2:员工帮会所下单 3:协销帮会所下单  4:后台下单 5:采美豆订单
+     */
+    private Integer orderSubmitType;
+    /**
+     * 订单确认标志,0否,1后台确认,2买家确认(适用协销订单并且1或2都算已确认订单,主动订单默认1为确认)
+     */
+    private Integer confirmFlag;
+    /**
+     * 是否能走线上支付 0可以 1不可以 只能线下
+     */
+    private Integer onlinePayFlag;
+    /**
+     * 订单是否可拆分   1可拆分 0不可拆分
+     */
+    private Integer splitFlag;
+    /**
+     * 是否已支付 未支付0 已支付1
+     */
+    private Integer payFlag;
+    /**
+     * (向买家)收款状态:1待收款、2部分收款、3已收款
+     */
+    private Integer receiptStatus;
+    /**
+     * (向供应商)付款状态:1待付款、2部分付款、3已付款
+     */
+    private Integer payStatus;
+    /**
+     * 订单0成本标识:0订单有成本,1订单无成本(订单中所有商品成本为0)
+     */
+    private Integer zeroCostFlag;
+    /**
+     * 发货状态:1待发货、2部分发货、3已发货
+     */
+    private Integer sendOutStatus;
+    /**
+     * 退货退款类型:0未发生退款、1部分退、2全部退
+     */
+    private Integer refundType;
+    /**
+     * 确认付款供应商标识 0未确认,1已确认
+     */
+    private Integer affirmPaymentFlag;
+    /**
+     * 购买总数
+     */
+    private Integer productCount;
+
+    /**
+     * 赠送总数  不计算价格
+     */
+    private Integer presentCount;
+    /**
+     * 促销赠品总数
+     */
+    private Integer promotionalGiftsCount;
+    /**
+     * 是否包含活动商品(受订单未支付自动关闭时间影响)  0 否 1 是
+     */
+    private Integer hasActProduct;
+    /**
+     * 促销满减优惠
+     */
+    private Double promotionFullReduction;
+    /**
+     * 超级会员优惠
+     */
+    private Double svipFullReduction;
+    /**
+     * 二手商品订单标识  0非二手商品订单、 1二手商品订单
+     */
+    private Integer secondHandOrderFlag;
+    /**
+     * 是否开发票 没开发票 0 开个人发票 1 开企业发票2
+     */
+    private Integer invoiceFlag;
+    /**
+     * 免邮标志  运费:-1到付,0包邮,1需要运费,-2仪器到付其它包邮
+     */
+    private Integer postageFlag;
+    /**
+     * -1到付,0包邮,大于0具体金额,-2仪器到付其它包邮(且运费已使用商品形式存储)
+     */
+    private Double postage;
+    /**
+     * 商品总金额 (商品单价乘以数量,再加上税费)
+     */
+    private Double productTotalFee;
+    /**
+     * 小计金额 (商品折后单价乘以数量,再加上税费)
+     */
+    private Double orderTotalFee;
+    /**
+     * 订单总额(小计金额减去经理折扣后,再加上运费)
+     */
+    private Double payTotalFee;
+    /**
+     * 真实支付金额(订单总额减去抵扣的账户余额)
+     */
+    private Double payableAmount;
+    /**
+     * 余额支付金额
+     */
+    private Double balancePayFee;
+    /**
+     * 0待确认,11待收待发,12待收部发,13待收全发,21部收待发,22部收部发,23部收全发,31已收待发,32已收部发,33已收全发,4交易完成,5订单完成,6已关闭,7交易全退
+     */
+    private Integer status;
+    /**
+     * 订单确认时间
+     */
+    private String confirmTime;
+    /**
+     * 订单支付时间
+     */
+    private String payTime;
+    /**
+     * 返佣订单标识 0非返佣订单,1返佣订单
+     */
+    private Integer rebateFlag;
+    /**
+     * 条款ID
+     */
+    private Integer clauseId;
+    /**
+     * 条款名称
+     */
+    private String clauseName;
+    /**
+     * 子订单ID
+     */
+    private String shopOrderIds;
+    /**
+     * 订单取消原因
+     */
+    private String closeReason;
+    /**
+     * 订单取消时间
+     */
+    private String closeTime;
+    /**
+     * 订单备注
+     */
+    private String note;
+    /**
+     * 优惠券金额(面值)
+     */
+    private Double couponAmount;
+}

+ 124 - 0
src/main/java/com/caimei365/manager/entity/caimei/CmShop.java

@@ -0,0 +1,124 @@
+package com.caimei365.manager.entity.caimei;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * Description
+ *
+ * @author : Aslee
+ * @date : 2021/3/9
+ */
+/*@EqualsAndHashCode(callSuper = true)*/
+@Data
+public class CmShop implements Serializable {
+    /**
+     * 用户ID
+     */
+    private Integer userId;
+    /**
+     * 供应商ID
+     */
+    private Integer shopId;
+    /**
+     * 供应商公司名称
+     */
+    private String name;
+    /**
+     * 供应商公司简称
+     */
+    private String shortName;
+    /**
+     * 联系人
+     */
+    private String linkMan;
+    /**
+     * 手机号
+     */
+    private String contractMobile;
+    /**
+     * 联系人邮箱
+     */
+    private String contractEmail;
+    /**
+     * 可用余额
+     */
+    private Double ableRebateAmount;
+    /**
+     * 供应商欠款金额
+     */
+    private Double rebateAmount;
+    /**
+     * 省
+     */
+    private Integer provinceId;
+    /**
+     * 市
+     */
+    private Integer cityId;
+    /**
+     * 所在县区Id
+     */
+    private Integer townId;
+    /**
+     * 地址
+     */
+    private String address;
+    /**
+     * 统一社会信用代码
+     */
+    private String socialCreditCode;
+    /**
+     * 营业执照(businessLicenseImage)
+     */
+    private String businessLicense;
+    /**
+     * 医疗=1和非医疗=2
+     */
+    private Integer firstShopType;
+    /**
+     * 医疗的二级分类 一类器械=1、二类器械 =2、三类器械=3、其他=4 /// 1和非医疗没有二级分类
+     */
+    private Integer secondShopType;
+    /**
+     * 主打项目(mainpro)
+     */
+    private String mainProduct;
+    /**
+     * 主打系列商品说明
+     */
+    private String mainProductDesc;
+    /**
+     * 公司介绍
+     */
+    private String shopDesc;
+    /**
+     * 官网地址
+     */
+    private String website;
+    /**
+     * 微信公众号
+     */
+    private String wxOfficialAccount;
+    /**
+     * 微信小程序
+     */
+    private String wxApplets;
+    /**
+     * 添加时间
+     */
+    private String addTime;
+    /**
+     * 供应商状态: 90:已上线,91:已下线,92:审核不通过,3:待审核
+     */
+    private Integer status;
+    /**
+     * 是否可用,1可用
+     */
+    private String validFlag;
+    /**
+     * 如选择为医疗>>三类器械  则必须要上传资质
+     */
+    private String medicalPracticeLicenseImg1;
+}

+ 132 - 0
src/main/java/com/caimei365/manager/entity/caimei/CmShopOrder.java

@@ -0,0 +1,132 @@
+package com.caimei365.manager.entity.caimei;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2021/7/12
+ */
+@Data
+public class CmShopOrder implements Serializable {
+    private static final long serialVersionUID = 1L;
+    /**
+     * 子订单ID
+     */
+    private Integer shopOrderId;
+    /**
+     * 子订单编号
+     */
+    private String shopOrderNo;
+    /**
+     * 订单号
+     */
+    private Integer orderId;
+    /**
+     * 订单编号
+     */
+    private String orderNo;
+    /**
+     * 供应商Id
+     */
+    private Integer shopId;
+    /**
+     * 供应商名称
+     */
+    private String shopName;
+    /**
+     * 子订单备注信息
+     */
+    private String note;
+    /**
+     * 用户ID
+     */
+    private Integer userId;
+    /**
+     * 购买机构Id
+     */
+    private Integer clubId;
+    /**
+     * 协销Id
+     */
+    private Integer spId;
+    /**
+     * 订单类型 协销订单 0, 普通订单 1
+     */
+    private Integer orderType;
+    /**
+     * 订单促销id(店铺促销)
+     */
+    private Integer orderPromotionsId;
+    /**
+     * 促销满减优惠(店铺促销)
+     */
+    private Double promotionFullReduction;
+    /**
+     * 超级会员优惠
+     */
+    private Double svipShopReduction;
+    /**
+     * 佣金 =  应付采美
+     */
+    private Double brokerage;
+    /**
+     * 可退款金额 = 余额抵扣金额
+     */
+    private Double canRefundAmount;
+    /**
+     * 购买数量
+     */
+    private Integer itemCount;
+    /**
+     * 总价 = totalFee
+     */
+    private Double totalAmount;
+    /**
+     * 总金额 = 订单商品totalAmount
+     */
+    private Double productAmount;
+    /**
+     * 需要支付金额 shouldPayFee +运费
+     */
+    private Double needPayAmount;
+    /**
+     * 付供应商 商品费=成本价*(购买数量  + 赠品数量)
+     */
+    private Double shopProductAmount;
+    /**
+     * 付供应商 运费
+     */
+    private Double shopPostFee;
+    /**
+     * 付供应商税费
+     */
+    private Double shopTaxFee;
+    /**
+     * 付供应商 = 商品费 + 运费 + 税费
+     */
+    private Double shouldPayShopAmount;
+    /**
+     * 订单提交时间
+     */
+    private String orderTime;
+    /**
+     * 0:个人自己下单 1:企业自己下单 2:员工帮会所下单 3:协销帮会所下单  4:后台下单 5:采美豆订单
+     */
+    private Integer orderSubmitType;
+    /**
+     * 订单能否拆分 1 为可拆分, 0为不可拆分
+     */
+    private Integer splitFlag;
+    /**
+     * (付款供应商)付款状态:1待付款、2部分付款、3已付款
+     */
+    private Integer payStatus;
+    /**
+     * 已付款金额
+     */
+    private Double payedShopAmount;
+}

+ 37 - 0
src/main/java/com/caimei365/manager/entity/caimei/RebateRecord.java

@@ -0,0 +1,37 @@
+package com.caimei365.manager.entity.caimei;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2022/3/18
+ */
+
+@Data
+public class RebateRecord implements Serializable {
+    private static final long serialVersionUID = 1L;
+    /**
+     * 收款Id
+     */
+    private Integer id;
+    /**
+     * 供应商ID
+     */
+    private String shopId;
+    /**
+     * 识别款项Id(对应cm_discern_receipt表)
+     */
+    private String receiptId;
+    /**
+     * 子订单ID(多个子订单使用,分隔)
+     */
+    private String shopOrderId;
+    /**
+     * 金额(可能是欠款录入的口头返佣,可能是付款抵扣金额,具体看type值)
+     */
+    private Double rebateAmount;
+}

+ 26 - 0
src/main/java/com/caimei365/manager/entity/caimei/ReceiptCancelParam.java

@@ -0,0 +1,26 @@
+package com.caimei365.manager.entity.caimei;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class ReceiptCancelParam implements Serializable {
+    private static final long serialVersionUID = 1L;
+    /**
+     * 收款Id
+     */
+    private Integer id;
+    /**
+     * 订单ID
+     */
+    private Integer orderId;
+    /**
+     * 撤销备注
+     */
+    private String remark;
+    /**
+     * 当前登录用户userId
+     */
+    private Integer sysUserId;
+}

+ 5 - 0
src/main/java/com/caimei365/manager/entity/caimei/ReceiptDetail.java

@@ -159,4 +159,9 @@ public class ReceiptDetail implements Serializable {
      * 判断订单中抹平的订单是否是和多个订单一起支付的
      */
     private boolean receiptOrderFlag;
+
+    /**
+     * 删除标记 0 否,其余是
+     */
+    private Integer delFlag;
 }

+ 6 - 4
src/main/java/com/caimei365/manager/service/caimei/FinanceService.java

@@ -2,10 +2,7 @@ package com.caimei365.manager.service.caimei;
 
 import com.caimei365.manager.entity.PaginationVo;
 import com.caimei365.manager.entity.ResponseJson;
-import com.caimei365.manager.entity.caimei.ReceiptDetail;
-import com.caimei365.manager.entity.caimei.ReceiptList;
-import com.caimei365.manager.entity.caimei.ReceiptParam;
-import com.caimei365.manager.entity.caimei.ReceiptType;
+import com.caimei365.manager.entity.caimei.*;
 
 import java.util.List;
 
@@ -31,4 +28,9 @@ public interface FinanceService {
      * 收款详情
      */
     ResponseJson<ReceiptDetail> getReceiptDetail(Integer id);
+
+    /**
+     * 撤销收款
+     */
+    ResponseJson<Void> cancelReceipt(ReceiptCancelParam receiptCancelParam);
 }

+ 157 - 0
src/main/java/com/caimei365/manager/service/caimei/impl/FinanceServiceImpl.java

@@ -8,11 +8,14 @@ import com.caimei365.manager.service.caimei.FinanceService;
 import com.github.pagehelper.PageHelper;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 import org.springframework.util.StringUtils;
 
 import javax.annotation.Resource;
+import java.text.SimpleDateFormat;
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -134,4 +137,158 @@ public class FinanceServiceImpl implements FinanceService {
 
         return ResponseJson.success(receipt);
     }
+
+    /**
+     * 撤销收款
+     */
+    @Transactional(rollbackFor=Exception.class)
+    @Override
+    public ResponseJson<Void> cancelReceipt(ReceiptCancelParam receiptCancelParam) {
+        Integer paramId = receiptCancelParam.getId();
+        Integer paramOrderId = receiptCancelParam.getOrderId();
+        String paramRemark = receiptCancelParam.getRemark();
+        Integer sysUserId = receiptCancelParam.getSysUserId();
+        ReceiptDetail receipt = financeDao.getReceiptDetail(paramId);
+        //receiptType 收款款项类型:1订单款,2非订单款,3返佣款
+        //1订单款
+        //撤销前  如果收款记录已经审核 那么要去还原这条收款记录  如果收款记录没有通过审核 那么直接修改收款记录的状态就可以
+        if (1 == receipt.getReceiptType()) {
+            // 先撤销一下收款记录就好了
+            if (3 == receipt.getReceiptStatus()) {  //  还原订单收款状态
+                // 找到这个记录关联了那些订单  看看订单除了这一次收款还有没有其他的收款记录  如果有 那么订单会被还原成部分收款
+                // 如果没有 那么订单就是待收款  注意这里的订单都是主订单
+                List<Integer> orderIds = financeDao.getOrderIdsByReceiptId(receipt.getId());
+                for (Integer orderId : orderIds) {
+                    CmOrder order = financeDao.getOrderByOrderId(orderId);
+                    // 统计订单款项的收款记录
+                    int recordCount = financeDao.getOrderReceiptCount(orderId, receipt.getId());
+                    if (recordCount == 0 && order.getBalancePayFee() <= 0d) {
+                        //说明除了现在正在撤销的这一条收款记录  这个订单没有其他的收款记录  就是说 撤销以后这个订单是代付款状态
+                        order.setReceiptStatus(1);
+                        if (order.getStatus().toString().length() == 2) {
+                            String status = "1" + order.getStatus().toString().charAt(1);
+                            order.setStatus(Integer.valueOf(status));
+                        }
+                        if (4 == order.getStatus() || 5 == order.getStatus()) {
+                            order.setStatus(13);
+                        }
+                    } else {
+                        //反之这个订单就是部分付款状态
+                        order.setReceiptStatus(2);
+                        if (order.getStatus().toString().length() == 2) {
+                            String status = "2" + order.getStatus().toString().charAt(1);
+                            order.setStatus(Integer.valueOf(status));
+                        }
+                        if (4 == order.getStatus() || 5 == order.getStatus()) {
+                            order.setStatus(23);
+                        }
+                    }
+                    financeDao.updateOrderStatus(order);
+                    // 判断是否是充值定金商品
+                    int depositProduct = financeDao.countDepositOrderProduct(order.getOrderId());
+                    if (depositProduct > 0) {
+                        //保存余额到余额收支记录
+                        BalanceRecord balanceRecord = new BalanceRecord();
+                        balanceRecord.setType(2);
+                        balanceRecord.setBalanceType(8);
+                        balanceRecord.setAddDate(new Date());
+                        balanceRecord.setAmount(order.getPayTotalFee());
+                        balanceRecord.setOrderId(order.getOrderId());
+                        balanceRecord.setUserId(order.getUserId());
+                        balanceRecord.setReceiptId(receipt.getId());
+                        balanceRecord.setRemark("定金商品撤销收款");
+                        balanceRecord.setDelFlag(0);
+                        // 保存 余额收支记录
+                        financeDao.insertBalanceRecord(balanceRecord);
+                        financeDao.updateReduceUserMoney(order.getPayTotalFee(), order.getUserId());
+                    }
+                }
+            }
+        }
+        //3返佣款
+        if (3 == receipt.getReceiptType()) {
+            // 如果返佣收款记录还在审核中 那么直接修改一下订单状态就好了
+            if (2 == receipt.getReceiptStatus()) {
+                // 如果返佣收款记录还在已经确认了 那么就去看看这笔返佣收款记录关联了那些子订单  然后撤销它们的主订单的收款状态以及付款状态
+                List<Integer> shopOrderIds = financeDao.getShopOrderIdsByReceiptId(receipt.getId());
+                for (Integer shopOrderId : shopOrderIds) {
+                    //records  查询的是 shopOrderID  这个子订单它的兄弟子订单 就是他的主订单下面除了他这个子订单 其他的子订单的返佣收款记录
+                    // 统计子订单款项的收款记录
+                    int recordCount = financeDao.getShopOrderReceiptCount(shopOrderId, receipt.getId());
+                    CmShopOrder cmShopOrder = financeDao.getShopOrderById(shopOrderId);
+                    CmOrder order = financeDao.getOrderByOrderId(cmShopOrder.getOrderId());
+                    if (recordCount > 0 && order.getBalancePayFee() <= 0d) {
+                        //说明除了现在正在撤销的这一条收款记录  这个订单没有其他的收款记录  就是说 撤销以后这个订单是代付款状态
+                        order.setReceiptStatus(1);
+                        order.setPayStatus(1);
+                        cmShopOrder.setPayStatus(1);
+                        if (order.getStatus().toString().length() == 2) {
+                            String status = "1" + order.getStatus().toString().charAt(1);
+                            order.setStatus(Integer.valueOf(status));
+                        }
+                        if (4 == order.getStatus() || 5 == order.getStatus()) {
+                            order.setStatus(13);
+                        }
+
+                    } else {
+                        //反之这个订单就是部分付款状态
+                        order.setReceiptStatus(2);
+                        order.setPayStatus(2);
+                        cmShopOrder.setPayStatus(2);
+                        if (order.getStatus().toString().length() == 2) {
+                            String status = "2" + order.getStatus().toString().charAt(1);
+                            order.setStatus(Integer.valueOf(status));
+                        }
+                        if (4 == order.getStatus() || 5 == order.getStatus()) {
+                            order.setStatus(23);
+                        }
+                    }
+                    financeDao.updateOrderStatus(order);
+                    financeDao.updateShopOrderStatus(cmShopOrder);
+                }
+                if (10 == receipt.getPayType()) {
+                    //是口头返佣  需要扣除供应商返佣的余额  删除返佣欠款记录
+                    RebateRecord rebateRecord = financeDao.getRebateRecordByReceiptId(receipt.getId());
+                    CmShop shop = financeDao.getShopByShopId(rebateRecord.getShopId());
+                    shop.setAbleRebateAmount(shop.getAbleRebateAmount() - rebateRecord.getRebateAmount());
+                    shop.setRebateAmount(shop.getRebateAmount() - rebateRecord.getRebateAmount());
+                    financeDao.updateShopAbleRebateAmount(shop);
+                    financeDao.deleteRebateRecord(receipt.getId());
+                    receipt.setDelFlag(1);
+                }
+            }
+        }
+        String format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
+        receipt.setReceiptStatus(5);
+        receipt.setCancelReason(paramRemark);
+        receipt.setCancelDate(format);
+        receipt.setCancelUserPermissionId(sysUserId);
+        financeDao.cancelReceipt(receipt);
+        //撤销收款后如果存在多收款退款余额,则此处需要重新减少用户余额,以及撤销余额收支记录
+        CmOrder order = financeDao.getOrderByOrderId(paramOrderId);
+        if (null != receipt.getConfirmType() && 3 == receipt.getConfirmType()) {
+            //撤销余额收支记录
+            BalanceRecord balanceRecord = new BalanceRecord();
+            balanceRecord.setOrderId(order.getOrderId());
+            balanceRecord.setReceiptId(receipt.getId());
+            balanceRecord.setUserId(order.getUserId());
+            balanceRecord.setRemark("撤销收款,余额记录无效-后台");
+            balanceRecord.setDelFlag(1);
+            // 保存 余额收支记录
+            financeDao.updateBalanceRecord(balanceRecord);
+            // 收款金额
+            Double receiptAmount = receipt.getReceiptAmount();
+            // 订单真实需支付金额
+            Double payableAmount = order.getPayableAmount();
+            //多收退款余额金额
+            Double balanceAmount = 0d;
+            if (receiptAmount > payableAmount) {
+                balanceAmount = receiptAmount - payableAmount;
+            }
+            //回收用户退款余额
+            financeDao.updateReduceUserMoney(balanceAmount, order.getUserId());
+        }
+
+        return ResponseJson.success();
+    }
 }

+ 10 - 4
src/main/resources/config/dev/application-dev.yml

@@ -2,9 +2,12 @@ spring:
   #数据源连接--start
   datasource:
     #本地连接数据库
-    url: jdbc:mysql://192.168.2.100:3306/caimei?characterEncoding=UTF8&serverTimezone=Asia/Shanghai
+#    url: jdbc:mysql://192.168.2.100:3306/caimei?characterEncoding=UTF8&serverTimezone=Asia/Shanghai
+#    username: developer
+#    password: 05bZ/OxTB:X+yd%1
+    url: jdbc:mysql://120.79.25.27:3306/caimei?characterEncoding=UTF8&serverTimezone=Asia/Shanghai
     username: developer
-    password: 05bZ/OxTB:X+yd%1
+    password: J5p3tgOVazNl4ydf
     type: com.zaxxer.hikari.HikariDataSource
     hikari:
       minimum-idle: 5
@@ -17,9 +20,12 @@ spring:
       connection-test-query: SELECT 1
   #数据源连接--end
   redis:
-    host: 192.168.2.100
+#    host: 192.168.2.100
+#    port: 6379
+#    #password: 123456
+    host: 47.119.112.46
     port: 6379
-    #password: 123456
+    password: 6#xsI%b4o@5c3RoE
     #Redis数据库索引(默认为0)
     database: 0
     jedis:

+ 180 - 4
src/main/resources/mapper/FinanceDao.xml

@@ -150,7 +150,7 @@
                         cdr.payType,
                         cdr.receiptType,
                         cdr.receiptStatus,
-                        cdr.receiptAmount,
+                        IFNULL(cdr.receiptAmount,0) AS receiptAmount,
                         cdr.smsContent,
                         cdr.smsMd5Code,
                         cdr.receiptDate,
@@ -323,8 +323,7 @@
                  LEFT JOIN cm_receipt_order_relation cror ON svipr.id = cror.vipRecordId
                  LEFT JOIN club c ON svipr.userId = c.clubID
                  LEFT JOIN cm_svip_package svipp ON svipp.id = svipr.packageId
-        WHERE cror.receiptID = #{receiptId}
-        LIMIT 1
+        WHERE cror.receiptID = #{receiptId} LIMIT 1
     </select>
     <select id="getReceiptCouponInfo" resultType="com.caimei365.manager.entity.caimei.ReceiptCouponInfo">
         SELECT c.name AS clubName,
@@ -341,5 +340,182 @@
                  LEFT JOIN cm_coupon cc ON ccb.couponId = cc.id
         WHERE receiptID = #{receiptId}
     </select>
-
+    <select id="getOrderIdsByReceiptId" resultType="java.lang.Integer">
+        SELECT cror.orderID FROM cm_receipt_order_relation cror
+        WHERE cror.receiptID = #{receiptId} and  cror.delFlag = '0' and cror.relationType = '2'
+    </select>
+    <select id="getShopOrderIdsByReceiptId" resultType="java.lang.Integer">
+        SELECT cror.orderID FROM cm_receipt_order_relation cror
+        WHERE cror.receiptID = #{receiptId} and  cror.delFlag = '0' and cror.relationType = '1'
+    </select>
+    <select id="getOrderReceiptCount" resultType="java.lang.Integer">
+        SELECT IFNULL(COUNT(cror.receiptID), 0)
+        FROM  cm_receipt_order_relation cror
+                  JOIN  cm_discern_receipt cdr ON cror.receiptID = cdr.id
+        WHERE  cror.orderID = #{orderId} and  cror.receiptID != #{receiptId}
+          AND  cror.relationType = '2' AND  cror.delFlag = '0'
+          AND  cdr.receiptStatus = '3' AND  cdr.delFlag = '0'
+    </select>
+    <select id="getShopOrderReceiptCount" resultType="java.lang.Integer">
+        SELECT IFNULL(COUNT(cror.receiptID), 0)
+        FROM cm_receipt_order_relation cror
+                 JOIN cm_discern_receipt cdr ON cror.receiptID = cdr.id
+        WHERE  cror.orderID IN
+               (SELECT cso2.shopOrderID
+                FROM cm_shop_order cso1
+                         LEFT JOIN cm_shop_order cso2 ON cso2.orderID = cso1.orderID
+                WHERE cso1.shopOrderID = #{shopOrderId} and cso2.shopOrderID != #{shopOrderId})
+          AND cror.orderID != #{shopOrderId}
+          AND cdr.receiptStatus = '2' AND  cdr.delFlag = '0'
+          AND cror.relationType = '1' AND  cror.delFlag = '0'
+    </select>
+    <select id="getOrderByOrderId" resultType="com.caimei365.manager.entity.caimei.CmOrder">
+        SELECT
+            orderID AS orderId,
+            shopOrderIds,
+            orderSource,
+            orderNo,
+            organizeID AS organizeId,
+            userID AS userId,
+            clubID AS clubId,
+            buyUserID AS buyUserId,
+            orderTime AS orderTime,
+            updateDate AS updateDate,
+            delFlag,
+            userBeans,
+            orderType,
+            orderSubmitType,
+            confirmFlag,
+            onlinePayFlag,
+            splitFlag,
+            payFlag,
+            receiptStatus,
+            payStatus,
+            zeroCostFlag,
+            sendOutStatus,
+            refundType,
+            affirmPaymentFlag,
+            productCount,
+            presentCount,
+            promotionalGiftsCount,
+            hasActProduct,
+            promotionFullReduction,
+            secondHandOrderFlag,
+            invoiceFlag,
+            freePostFlag AS postageFlag,
+            freight AS postage,
+            productTotalFee,
+            orderTotalFee,
+            payTotalFee,
+            payableAmount,
+            IFNULL(balancePayFee, 0) AS balancePayFee,
+            discountFee,
+            status,
+            paySuccessCounter,
+            confirmTime,
+            payTime,
+            rebateFlag,
+            clauseID AS clauseId,
+            clauseName
+        FROM cm_order
+        WHERE orderID = #{orderId}
+    </select>
+    <select id="countDepositOrderProduct" resultType="java.lang.Integer">
+        SELECT IFNULL(COUNT(productID), 0) FROM cm_order_product WHERE orderID = #{orderId} AND productID = '6060'
+    </select>
+    <select id="getShopOrderById" resultType="com.caimei365.manager.entity.caimei.CmShopOrder">
+        SELECT
+            shopOrderID AS shopOrderId,
+            shopOrderNo,
+            orderID AS orderId,
+            orderNo,
+            shopID AS shopId,
+            note,
+            userID AS userId,
+            clubID AS clubId,
+            spID AS spId,
+            orderPromotionsId,
+            promotionFullReduction,
+            brokerage,
+            canRefundAmount,
+            itemCount,
+            totalAmount,
+            productAmount,
+            needPayAmount,
+            shopProductAmount,
+            shopPostFee,
+            shopTaxFee,
+            shouldPayShopAmount,
+            payedShopAmount,
+            outStoreNum,
+            IFNULL(presentNum,0) AS presentNum,
+            orderTime,
+            orderSubmitType,
+            payStatus,
+            sendOutStatus,
+            splitFlag
+        FROM cm_shop_order
+        WHERE shopOrderID = #{shopOrderId} AND delFlag = '0'
+    </select>
+    <update id="updateOrderStatus">
+        UPDATE cm_order SET
+        status = #{status}
+        <if test="receiptStatus != null and receiptStatus != ''">
+            ,receiptStatus = #{receiptStatus}
+        </if>
+        <if test="payStatus != null and payStatus != ''">
+            ,payStatus = #{payStatus}
+        </if>
+        ,updateDate = #{updateDate}
+        WHERE orderID = #{orderId}
+    </update>
+    <update id="updateReduceUserMoney">
+        UPDATE user SET userMoney=(userMoney-#{money}), ableUserMoney = (ableUserMoney-#{money})
+        WHERE userID = #{userId}
+    </update>
+    <update id="updateShopOrderStatus">
+        UPDATE cm_shop_order SET payStatus = #{payStatus}
+        WHERE shopOrderID = #{shopOrderId}
+    </update>
+    <insert id="insertBalanceRecord">
+        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>
+    <update id="updateBalanceRecord">
+        UPDATE cm_user_balance_record SET remark = #{remark}, delFlag = #{delFlag}
+        WHERE userId = #{userId} AND orderId = #{orderId} and receiptId = #{receiptId}
+    </update>
+    <select id="getRebateRecordByReceiptId" resultType="com.caimei365.manager.entity.caimei.RebateRecord">
+        SELECT a.id,
+               a.shopId,
+               a.receiptID AS receiptId,
+               a.shopOrderId,
+               a.rebateAmount
+        FROM cm_rebate_record a
+        WHERE a.receiptID = #{receiptId} and a.delFlag = '0'
+    </select>
+    <select id="getShopByShopId" resultType="com.caimei365.manager.entity.caimei.CmShop">
+        SELECT userID AS userId, shopID AS shopId, NAME, sname AS shortName, linkMan, contractMobile, ableRebateAmount, rebateAmount,
+               contractEmail, contractEmail AS email, provinceID AS proviceId, cityID AS cityId, townID AS townId,
+               address, socialCreditCode, businessLicenseImage AS businessLicense, firstShopType, secondShopType,
+               mainpro AS mainProduct, productDesc AS mainProductDesc,legalPerson,registeredCapital,fax AS faxNumber,
+               nature AS companyNature, turnover, medicalPracticeLicenseImg1 AS medicalPracticeLicense, info AS shopDesc,
+               businessScope, logo, ADDTIME, STATUS, contractPhone, validFlag, website, wxOfficialAccount, wxApplets
+        FROM shop WHERE shopID = #{shopId}
+    </select>
+    <update id="updateShopAbleRebateAmount">
+        UPDATE shop SET ableRebateAmount = #{ableRebateAmount}, rebateAmount = #{rebateAmount} WHERE shopID = #{shopId}
+    </update>
+    <update id="deleteRebateRecord">
+        UPDATE cm_rebate_record SET delFlag = '1'  WHERE receiptID = #{receiptId}
+    </update>
+    <update id="cancelReceipt">
+        UPDATE cm_discern_receipt SET
+               receiptStatus = #{receiptStatus},
+               cancelReason = #{cancelReason},
+               cancelDate = #{cancelDate},
+               cancelUserPermissionID = #{cancelUserPermissionId},
+               delFlag = #{delFlag}
+        WHERE id = #{id}
+    </update>
 </mapper>