rk
昨天 7869fa712c19c351a48bfb0af11b0fe87b17c184
小程序 用户端接口开发
已添加1个文件
已修改17个文件
653 ■■■■ 文件已修改
server/dmmall_service/src/main/java/com/doumee/core/utils/Constants.java 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/dao/business/ShopMapper.java 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/dao/business/model/Goods.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/dao/business/model/GoodsSku.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/dao/business/model/Goodsorder.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/dao/business/model/Shop.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/dao/system/dto/PlatformConfigDTO.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/dao/web/request/PayDetailRequest.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/dao/web/request/ShopOrderPayRequest.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/dao/web/request/goods/OrderPayConfirmRequest.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/dao/web/response/goods/OrderGoodsCalculateResponse.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/dao/web/response/goods/OrderPayConfirmResponse.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/dao/web/response/goods/PayResponse.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/service/business/GoodsorderService.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/service/business/IntegralService.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/service/business/impl/GoodsorderServiceImpl.java 408 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/service/business/impl/IntegralServiceImpl.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/service/business/impl/MemberCouponServiceImpl.java 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/core/utils/Constants.java
@@ -65,6 +65,8 @@
    public static final String CASH_EXCHANGE_INTEGRAL_RATA = "CASH_EXCHANGE_INTEGRAL_RATA";//现金-积分兑换比例(1元可得到XXX积分)
    public static final String INITIAL_ROLE = "INITIAL_ROLE";
    public static final String PLAT_ADDR="PLAT_ADDR";
@@ -847,15 +849,20 @@
        SHARE_INFO(6,"分享资讯","分享资讯",0),
        POST_COMMENTS(7,"发布评论","发布评论",0),
        COFFEE_MAP_CONSUME(8,"咖啡地图消费","咖啡地图消费",0),
        SHOP_ORDER(9,"余额抵扣商品","余额抵扣商品",1),
        SHOP_ORDER(9,"积分抵扣商品","积分抵扣商品",1),
        AFTERSALE_BACK(10,"售后退款","售后退款",1),
        EXCHANGE_CARD(11,"卡充值","卡充值",0),
        SYSTEM_RECHARGE(12,"平台充值","平台充值",0),
        SYSTEM_DEDUCT(13,"平台扣款","平台扣款",0),
        SHOP_ORDER_CANCEL(14,"余额抵扣商品退还","余额抵扣商品退还",0),
        SHOP_ORDER_SETTLEMENT(15,"下单结算金额","下单结算金额",0), //经销商下单结算金额
        SHOP_ORDER_CANCEL_SETTLEMENT(16,"取消订单结算金额返还","取消订单结算金额返还",0), //取消订单结算金额返还
        SHOP_YEAR_SETTLEMENT(17,"年度结算","年度结算",0) //年度结算
        SHOP_ORDER_CANCEL(14,"积分抵扣商品退还","积分抵扣商品退还",0),
        ORDER_DONATE(15,"订单赠送积分","订单赠送积分",0),
        ORDER_DONE_AMOUNT(16,"订单结算金额","订单结算金额",0),
        SHOP_ORDER_SETTLEMENT(16,"下单结算金额","下单结算金额",0), //经销商下单结算金额
        SHOP_ORDER_CANCEL_SETTLEMENT(17,"取消订单结算金额返还","取消订单结算金额返还",0), //取消订单结算金额返还
        SHOP_YEAR_SETTLEMENT(18,"年度结算","年度结算",0) //年度结算
        ;
        // æˆå‘˜å˜é‡
        private String name;
server/dmmall_service/src/main/java/com/doumee/dao/business/ShopMapper.java
@@ -16,7 +16,7 @@
    /**
     * æ·»åŠ ç§¯åˆ†
     * @param memberId
     * @param shopId
     * @param integral
     */
    @Select(" update shop set INTEGRAL = ifNull( INTEGRAL,0) + #{integral} , TOTAL_INTEGRAL = ifNull(TOTAL_INTEGRAL,0) +  #{titleIntegral}   , EDIT_DATE = now()  where id = #{shopId}  ")
@@ -24,12 +24,27 @@
    /**
     * å‡å°‘积分
     * @param memberId
     * @param shopId
     * @param integral
     */
    @Select(" update shop set INTEGRAL = ifNull( INTEGRAL,0) - #{integral} , EDIT_DATE = now()   where id = #{shopId}  ")
    void subtractIntegral(@Param("shopId") Integer shopId , @Param("integral")BigDecimal integral);
    /**
     * æ·»åŠ ä½™é¢
     * @param shopId
     * @param amount
     */
    @Select(" update shop set AMOUNT = ifNull(AMOUNT,0) + #{amount} , TOTAL_AMOUNT = ifNull(TOTAL_AMOUNT,0) + #{titleAmount}   , EDIT_DATE = now()  where id = #{shopId}  ")
    void addAmount(@Param("shopId") Integer shopId , @Param("amount") BigDecimal amount , @Param("titleAmount")BigDecimal titleAmount);
    /**
     * å‡å°‘余额
     * @param shopId
     * @param amount
     */
    @Select(" update shop set AMOUNT = ifNull( AMOUNT,0) - #{amount} , EDIT_DATE = now()   where id = #{shopId}  ")
    void subtractAmount(@Param("shopId") Integer shopId , @Param("amount")BigDecimal amount);
}
server/dmmall_service/src/main/java/com/doumee/dao/business/model/Goods.java
@@ -127,7 +127,6 @@
    private String parentCategoryId;
    @ApiModelProperty(value = "抵扣比例(0.1%~100%)", example = "1", hidden = true)
    @TableField(exist = false)
    private BigDecimal deductRata;
server/dmmall_service/src/main/java/com/doumee/dao/business/model/GoodsSku.java
@@ -72,6 +72,7 @@
    @ApiModelProperty(value = "单位")
    @ExcelColumn(name="单位")
    private String unitName;
    @ApiModelProperty(value = "积分最多抵扣比例")
    @ExcelColumn(name="积分最多抵扣比例")
    private BigDecimal integralRate;
server/dmmall_service/src/main/java/com/doumee/dao/business/model/Goodsorder.java
@@ -67,6 +67,10 @@
    @ExcelColumn(name="订单实付价格",index =9,width = 10)
    private BigDecimal price;
    @ApiModelProperty(value = "邮费金额", example = "1")
    private BigDecimal mailPrice;
    @ApiModelProperty(value = "订单状态")
    @ExcelColumn(name="订单状态",index =10,width = 10)
    @TableField(exist = false)
@@ -127,7 +131,7 @@
    @ApiModelProperty(value = "支付单号")
    private String payOrderId;
    @ApiModelProperty(value = "支付方式 0微信支付 1线下支付", example = "1")
    @ApiModelProperty(value = "支付方式 0现金支付 1积分支付", example = "1")
    private Integer payMethod;
    @ApiModelProperty(value = "快递单号")
@@ -138,7 +142,6 @@
    @ApiModelProperty(value = "快递编码(关联labels表)", example = "1")
    private Integer kdId;
    @ApiModelProperty(value = "取消时间")
server/dmmall_service/src/main/java/com/doumee/dao/business/model/Shop.java
@@ -122,6 +122,15 @@
    @ApiModelProperty(value = "积分累计")
    @ExcelColumn(name="积分累计")
    private BigDecimal totalIntegral;
    @ApiModelProperty(value = "可提成金额")
    @ExcelColumn(name="可提成金额")
    private BigDecimal amount;
    @ApiModelProperty(value = "累计可提成金额")
    @ExcelColumn(name="累计可提成金额")
    private BigDecimal totalAmount;
    @ApiModelProperty(value = "状态0正常 1禁用", example = "1")
    @ExcelColumn(name="状态0正常 1禁用")
    private Integer status;
server/dmmall_service/src/main/java/com/doumee/dao/system/dto/PlatformConfigDTO.java
@@ -41,6 +41,7 @@
    private Integer returnMemberIntegralStatus;
    @ApiModelProperty(value = "消费返积分-返经销商积分状态 0开启 1关闭")
    private Integer returnShopIntegralStatus;
    @ApiModelProperty(value = "消费返积分-返用户积分数量")
    private BigDecimal returnMemberIntegral;
    @ApiModelProperty(value = "消费返积分-返经销商积分数量")
server/dmmall_service/src/main/java/com/doumee/dao/web/request/PayDetailRequest.java
@@ -17,7 +17,6 @@
@ApiModel("商品下单明细请求类")
public class PayDetailRequest {
    @ApiModelProperty(value = "sku组合编码(关联goods_sku表)")
    private Integer goodsSkuId;
server/dmmall_service/src/main/java/com/doumee/dao/web/request/ShopOrderPayRequest.java
@@ -31,12 +31,18 @@
    @ApiModelProperty(value = "自提商户主键")
    private Integer shopId;
    @ApiModelProperty(value = "是否使用积分(默认不使用):0=不使用;1=使用")
    private Integer useIntegral;
    @ApiModelProperty(value = "支付商品详细")
    List<PayDetailRequest> payDetailRequestList;
    @ApiModelProperty(value = "订单备注")
    private String remark;
    @ApiModelProperty(value = "优惠券主键")
    private Integer couponId;
    @ApiModelProperty(hidden = true)
    private Integer memberId ;
server/dmmall_service/src/main/java/com/doumee/dao/web/request/goods/OrderPayConfirmRequest.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,41 @@
package com.doumee.dao.web.request.goods;
import com.doumee.dao.web.request.PayDetailRequest;
import com.doumee.service.business.impl.MemberCouponServiceImpl;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.List;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2023/3/23 9:50
 */
@Data
@ApiModel("订单支付确认页面请求类")
public class OrderPayConfirmRequest{
    @ApiModelProperty(value = "0=快递配送 1=自提", example = "1")
    private Integer receiveType;
    @ApiModelProperty(value = "商品下单明细列表", example = "1")
    private List<PayDetailRequest> payDetailRequestList;
    @ApiModelProperty(value = "收货地址主键(快递配送使用)", example = "1")
    private Integer addressId;
    @ApiModelProperty(value = "优惠券主键", example = "1")
    private Integer couponId;
    @ApiModelProperty(value = "是否使用积分", example = "1")
    private Integer useIntegral;
    @ApiModelProperty(value = "用户主键" ,hidden = true)
    private Integer memberId;
}
server/dmmall_service/src/main/java/com/doumee/dao/web/response/goods/OrderGoodsCalculateResponse.java
@@ -49,11 +49,14 @@
    @ApiModelProperty(value = "单个商品重量(kg)", example = "1")
    private BigDecimal weight;
    @ApiModelProperty(value = "sku金额")
    @ApiModelProperty(value = "sku单价")
    private BigDecimal skuPrice;
    @ApiModelProperty(value = "sku总金额")
    private BigDecimal skuAmount;
    @ApiModelProperty(value = "sku实付总金额")
    private BigDecimal skuPayAmount;
    @ApiModelProperty(value = "skuId")
    private Integer skuId;
@@ -67,18 +70,24 @@
    @ApiModelProperty(value = "是否可以使用优惠券", hidden = true)
    private Boolean useCoupon;
    @ApiModelProperty(value = "积分最大可抵扣金额", hidden = true)
    private BigDecimal integralMaxDeductCash;
    @ApiModelProperty(value = "积分实际抵扣金额", hidden = true)
    private BigDecimal integralDeductCash;
    @ApiModelProperty(value = "实际使用积分", hidden = true)
    private BigDecimal integralDeduct;
    @ApiModelProperty(value = "订单中积分金额实际占比", hidden = true)
    private BigDecimal orderIntegralRata;
    @ApiModelProperty(value = "库存量")
    private BigDecimal stockNum;
server/dmmall_service/src/main/java/com/doumee/dao/web/response/goods/OrderPayConfirmResponse.java
@@ -24,11 +24,22 @@
    @ApiModelProperty(value = "优惠券抵扣金额", example = "1")
    private BigDecimal couponAmount;
    @ApiModelProperty(value = "积分使用状态:0=可用;1=不可用", example = "1")
    private Integer integralStatus;
    @ApiModelProperty(value = "积分抵扣金额", example = "1")
    private BigDecimal integralAmount;
    @ApiModelProperty(value = "抵扣积分值", example = "1")
    private BigDecimal deductIntegral;
    @ApiModelProperty(value = "剩余积分值", example = "1")
    private BigDecimal surplusIntegral;
    @ApiModelProperty(value = "邮费金额", example = "1")
    private BigDecimal mailAmount;
@@ -39,12 +50,14 @@
    @ApiModelProperty(value = "下单返积分", example = "1")
    private BigDecimal integralBack;
    @ApiModelProperty(value = "优惠券信息", example = "1")
    @ApiModelProperty(value = "已选中优惠券信息", example = "1")
    private MemberCoupon memberCoupon;
    @ApiModelProperty(value = "商品信息", example = "1")
    private List<OrderGoodsCalculateResponse> goodsCalculateList;
    @ApiModelProperty(value = "可用优惠券列表", example = "1")
    private List<MemberCoupon> memberCouponList;
server/dmmall_service/src/main/java/com/doumee/dao/web/response/goods/PayResponse.java
@@ -19,6 +19,9 @@
    @ApiModelProperty(value = "支付订单主键")
    private Integer orderId;
    @ApiModelProperty(value = "支付类型:0=现金支付;1=纯积分支付")
    private Integer payType;
    @ApiModelProperty(value = "微信调起业务")
    private Object response;
server/dmmall_service/src/main/java/com/doumee/service/business/GoodsorderService.java
@@ -12,9 +12,11 @@
import com.doumee.dao.web.request.goods.DealOrderRequest;
import com.doumee.dao.web.request.goods.MemberOrderRequest;
import com.doumee.dao.web.request.goods.OrderCommentRequest;
import com.doumee.dao.web.request.goods.OrderPayConfirmRequest;
import com.doumee.dao.web.response.HomeInfoResponse;
import com.doumee.dao.web.response.MyPageResponse;
import com.doumee.dao.web.response.goods.MemberOrderResponse;
import com.doumee.dao.web.response.goods.OrderPayConfirmResponse;
import com.doumee.dao.web.response.goods.PayResponse;
import com.doumee.service.business.impl.MemberCouponServiceImpl;
@@ -223,4 +225,7 @@
    void refreshOrderCodes();
    HomeInfoResponse getHomeInfo(int memberId);
    OrderPayConfirmResponse orderPayConfirm(OrderPayConfirmRequest request,
                                            MemberCouponServiceImpl memberCouponService);
}
server/dmmall_service/src/main/java/com/doumee/service/business/IntegralService.java
@@ -122,10 +122,16 @@
    Integer dealIntegral(DealIntegralRequest dealIntegralRequest);
    /**
     * æ›´æ–°ç»é”€å•†ä½™é¢
     * æ›´æ–°ç»é”€å•†ç§¯åˆ†
     * @param dealIntegralRequest
     * @return
     */
    Integer dealShopIntegral(DealIntegralRequest dealIntegralRequest);
    /**
     * æ›´æ–°ç»é”€å•†é‡‘额
     * @param dealIntegralRequest
     * @return
     */
    Integer dealShopAmount(DealIntegralRequest dealIntegralRequest);
}
server/dmmall_service/src/main/java/com/doumee/service/business/impl/GoodsorderServiceImpl.java
@@ -19,12 +19,10 @@
import com.doumee.dao.business.join.GoodsorderJoinMapper;
import com.doumee.dao.business.join.PlanorderDetailJoinMapper;
import com.doumee.dao.business.model.*;
import com.doumee.dao.system.dto.PlatformConfigDTO;
import com.doumee.dao.web.dto.CouponDTO;
import com.doumee.dao.web.request.*;
import com.doumee.dao.web.request.goods.MemberOrderRequest;
import com.doumee.dao.web.request.goods.DealOrderRequest;
import com.doumee.dao.web.request.goods.OrderCommentRequest;
import com.doumee.dao.web.request.goods.OrderGoodsCommentRequest;
import com.doumee.dao.web.request.goods.*;
import com.doumee.dao.web.response.HomeInfoResponse;
import com.doumee.dao.web.response.MyPageResponse;
import com.doumee.dao.web.response.goods.*;
@@ -35,6 +33,7 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.doumee.service.business.IntegralService;
import com.doumee.service.system.SystemDictDataService;
import com.github.binarywang.wxpay.bean.request.BaseWxPayRequest;
import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
import com.github.binarywang.wxpay.bean.result.WxPayRefundResult;
@@ -54,6 +53,7 @@
import javax.servlet.http.HttpServletRequest;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.*;
@@ -125,6 +125,9 @@
    @Autowired
    private SystemDictDataBiz systemDictDataBiz;
    @Autowired
    private SystemDictDataService systemDictDataService;
    @Autowired
    private PlanorderDetailJoinMapper planorderDetailJoinMapper;
@@ -728,7 +731,7 @@
        goodsorder.setMemberId(member.getId());
        goodsorder.setType(Constants.ZERO);
        goodsorder.setStatus(Constants.ZERO);
        Shop shop = null;
        if(Constants.equalsInteger(orderPayRequest.getReceiveType(),Constants.ZERO)){
            //查询收货地址
            Addr addr = addrMapper.selectById(orderPayRequest.getAddressId());
@@ -739,23 +742,22 @@
            if(Objects.isNull(area)){
                throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"收货地址区划信息发生变化,请更新后下单!");
            }
            goodsorder.setAddrId(addr.getId());
            goodsorder.setLinkaddr(area.getProvinceName()+area.getCityName() + area.getName() + addr.getAddr());
            goodsorder.setLinkphone(addr.getPhone());
            goodsorder.setLinkname(addr.getName());
            if(Objects.nonNull(member.getBindShopId())){
                goodsorder.setDistributionShopId(member.getBindShopId());
                shop = shopMapper.selectById(member.getBindShopId());
            }
        }else{
            if(Objects.isNull(orderPayRequest.getShopId())){
                throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"请选择正确的自提门店!");
            }
            Shop shop = shopMapper.selectById(orderPayRequest.getShopId());
            shop = shopMapper.selectById(orderPayRequest.getShopId());
            if(Objects.isNull(shop)){
                throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"请选择正确的自提门店!");
            }
            //根据选择商户进行会员与商户信息绑定
            if(Objects.isNull(member.getBindShopId())){
@@ -770,13 +772,21 @@
                member.setBindShopId(shop.getId());
            }
        }
        //单据编号 è‡ªå¢ž
        goodsorder.setCode(getNextInCode());
        //计算订单总金额
        BigDecimal sumPrice = BigDecimal.ZERO;
        //存储记录明细
        OrderPayConfirmResponse orderPayConfirmResponse = this.orderPayConfirm(orderPayRequest.getReceiveType(),orderPayRequest.getPayDetailRequestList(),orderPayRequest.getAddressId(),memberCouponService,member.getId());
        OrderPayConfirmRequest payConfirmRequest = new OrderPayConfirmRequest();
        payConfirmRequest.setReceiveType(orderPayRequest.getReceiveType());
        payConfirmRequest.setPayDetailRequestList(orderPayRequest.getPayDetailRequestList());
        payConfirmRequest.setAddressId(orderPayRequest.getAddressId());
        payConfirmRequest.setMemberId(member.getId());
        payConfirmRequest.setCouponId(orderPayRequest.getCouponId());
        //通过支付确认接口获取生成支付信息
        OrderPayConfirmResponse orderPayConfirmResponse = this.orderPayConfirm(payConfirmRequest,memberCouponService);
        if(Objects.isNull(orderPayConfirmResponse)){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"系统支付错误,请联系管理员");
        }
@@ -785,26 +795,18 @@
        goodsorder.setUseIntegral(orderPayConfirmResponse.getDeductIntegral());
        goodsorder.setIntegral(goodsorder.getUseIntegral());
        goodsorder.setIntegralPrice(orderPayConfirmResponse.getIntegralAmount());
        goodsorder.setMailPrice(orderPayConfirmResponse.getMailAmount());
        goodsorder.setPayMethod(goodsorder.getPrice().compareTo(BigDecimal.ZERO)>Constants.ZERO?Constants.ZERO:Constants.ONE);
        if(Objects.nonNull(orderPayConfirmResponse.getMemberCoupon())){
            MemberCoupon memberCoupon = memberCouponMapper.selectById(orderPayConfirmResponse.getMemberCoupon().getId());
            if(Objects.isNull(memberCoupon)){
                throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未查询到优惠券信息!");
            }
            if(memberCoupon.getStatus().equals(Constants.ONE)){
                throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"优惠券已使用!");
            }
            sumPrice = sumPrice.subtract(memberCoupon.getPrice());
            goodsorder.setCouponId(memberCoupon.getId());
            sumPrice = sumPrice.subtract(orderPayConfirmResponse.getMemberCoupon().getPrice());
            goodsorder.setCouponId(orderPayConfirmResponse.getMemberCoupon().getId());
            goodsorder.setCouponPrice(orderPayConfirmResponse.getMemberCoupon().getValidAmount());
            memberCouponMapper.update(null,new UpdateWrapper<MemberCoupon>().lambda()
                    .set(MemberCoupon::getStatus,Constants.ONE)
                    .set(MemberCoupon::getUseDate,DateUtil.getCurrDateTime())
                    .eq(MemberCoupon::getId,memberCoupon.getId())
                    .eq(MemberCoupon::getId,orderPayConfirmResponse.getMemberCoupon().getId())
            );
        }
        goodsorderMapper.insert(goodsorder);
        List<OrderGoodsCalculateResponse> goodsCalculateList  = orderPayConfirmResponse.getGoodsCalculateList();
        if(CollectionUtils.isEmpty(goodsCalculateList)){
@@ -854,9 +856,27 @@
                        .last(" limit 1 ")
                );
                if(Objects.isNull(shopGoodsRelation)){
                    throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"对不起,关联经销商未绑定["+goods.getName()+"]商品,请联系管理员!");
                    throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"对不起,经销商未绑定["+goods.getName()+"]商品,请联系管理员!");
                }
                goodsOrderDetail.setShopSettlement(shopGoodsRelation.getPrice());
                PlatformConfigDTO platformConfigDTO = systemDictDataService.getPlatformConfigDTO();
                //经销商优惠承担占比
                BigDecimal shopRate = new BigDecimal("100").subtract(platformConfigDTO.getTotalRate());
                //计算经销商优惠承担金额  ï¼ˆä¼˜æƒ åˆ¸æŠµæ‰£é‡‘额 + ç§¯åˆ†æŠµæ‰£é‡‘额) * å æ¯”比例
                BigDecimal shopDeductAmount = payDetailRequest.getCouponDeductCash().add(payDetailRequest.getIntegralDeductCash())
                        .multiply(shopRate).divide(new BigDecimal("100"),2, RoundingMode.HALF_UP);
                //根据经销商销售模式 è®¡ç®—应结算金额
                if(shop.getSaleType().equals(Constants.ONE)){
                    goodsOrderDetail.setShopSettlement(goodsOrderDetail.getPrice().subtract(shopDeductAmount));
                }else {
                    goodsOrderDetail.setShopSettlement(
                            shopGoodsRelation.getPrice().subtract(shopGoodsRelation.getPrice()).subtract(shopDeductAmount));
                }
                if(goodsOrderDetail.getShopSettlement().compareTo(BigDecimal.ZERO)<Constants.ZERO){
                    goodsOrderDetail.setShopSettlement(BigDecimal.ZERO);
                }
            }else{
                goodsOrderDetail.setShopSettlement(BigDecimal.ZERO);
            }
            goodsOrderDetailList.add(goodsOrderDetail);
            //删除购物车商品
@@ -881,10 +901,55 @@
        if(goodsorder.getPrice().compareTo(orderPayRequest.getTitlePrice())!=Constants.ZERO){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"商品价格发生变化,请刷新后重新支付!");
        }
        return this.wxPay(goodsorder,member);
        //存在现金支付
        if(Constants.equalsInteger(goodsorder.getPayMethod(),Constants.ZERO)){
            return this.wxPay(goodsorder,member);
        }
        //无现金支付
        goodsorderMapper.update(null,new UpdateWrapper<Goodsorder>().lambda()
                .set(Goodsorder::getStatus,Constants.ONE)
                .set(Goodsorder::getPayStatus,Constants.OrderStatus.PAY_DONE.getKey())
                .set(Goodsorder::getPayDate,DateUtil.getCurrDateTime())
                .set(Goodsorder::getId,goodsorder.getId())
        );
        PayResponse payResponse = new PayResponse();
        payResponse.setOrderId(goodsorder.getId());
        payResponse.setPayType(Constants.ONE);
        return payResponse;
    }
    public void shopBalance(GoodsorderDetail detail,Shop shop){
        if(Objects.isNull(shop)){
            detail.setShopSettlement(BigDecimal.ZERO);
            return;
        }
        PlatformConfigDTO platformConfigDTO = systemDictDataService.getPlatformConfigDTO();
        //经销商优惠承担占比
        BigDecimal shopRate = new BigDecimal("100").subtract(platformConfigDTO.getTotalRate());
        ShopGoodsRelation shopGoodsRelation = shopGoodsRelationMapper.selectOne(new QueryWrapper<ShopGoodsRelation>().lambda()
                .eq(ShopGoodsRelation::getIsdeleted,Constants.ZERO)
                .eq(ShopGoodsRelation::getStatus,Constants.ZERO)
                .eq(ShopGoodsRelation::getShopId,shop.getId())
                .eq(ShopGoodsRelation::getGoodsSkuId,detail.getGoodsSkuId())
                .last(" limit 1 ")
        );
        if(Objects.isNull(shopGoodsRelation)){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"对不起,关联经销商未绑定["+detail.getName()+"]商品,请联系管理员!");
        }
    }
    /**
     * é‡æ–°æ”¯ä»˜
@@ -933,6 +998,7 @@
            PayResponse payResponse = new PayResponse();
            payResponse.setResponse(response);
            payResponse.setOrderId(goodsorder.getId());
            payResponse.setPayType(Constants.ZERO);
            return payResponse;
        } catch (WxPayException e) {
            e.printStackTrace();
@@ -1227,14 +1293,12 @@
    /**
     * è®¢å•确认接口
     * @param receiveType 0=快递配送 1=自提
     * @param requestList
     * @param addressId
     * @param memberCouponService
     * @param memberId
     * @param request
     */
    public OrderPayConfirmResponse orderPayConfirm(Integer receiveType,List<PayDetailRequest> requestList,Integer addressId,
                                MemberCouponServiceImpl memberCouponService,Integer memberId){
    @Override
    public OrderPayConfirmResponse orderPayConfirm(OrderPayConfirmRequest request,
                                                   MemberCouponServiceImpl memberCouponService){
        OrderPayConfirmResponse orderPayConfirmResponse = new OrderPayConfirmResponse();
        List<Goods> goodsList = goodsMapper.selectJoinList(Goods.class,
                new MPJLambdaWrapper<Goods>()
@@ -1244,11 +1308,10 @@
                        .selectAs(GoodsSku::getWeight,Goods::getWeight)
                        .selectAs(GoodsSku::getImgurl,Goods::getSkuImg)
                        .leftJoin(GoodsSku.class,GoodsSku::getGoodsId,Goods::getId)
                        .in(GoodsSku::getId,requestList.stream().map(i->i.getGoodsSkuId()).collect(Collectors.toList())));
                        .in(GoodsSku::getId,request.getPayDetailRequestList().stream().map(i->i.getGoodsSkuId()).collect(Collectors.toList())));
        if(CollectionUtils.isEmpty(goodsList)){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"未匹配到商品信息");
        }
        List<OrderGoodsCalculateResponse> goodsCalculateList = ListUtil.copyProperties(goodsList,OrderGoodsCalculateResponse::new);
        //订单总金额
@@ -1262,105 +1325,152 @@
        //邮费金额
        BigDecimal mailAmount = BigDecimal.ZERO;
        for (OrderGoodsCalculateResponse response:goodsCalculateList) {
            List<PayDetailRequest> request = requestList.stream().filter(i->Constants.equalsInteger(i.getGoodsSkuId(), response.getSkuId())).collect(Collectors.toList());
            if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(request)){
                PayDetailRequest payDetailRequest = request.get(Constants.ZERO);
            List<PayDetailRequest> payDetailRequestList = request.getPayDetailRequestList().stream()
                    .filter(i->Constants.equalsInteger(i.getGoodsSkuId(), response.getSkuId())).collect(Collectors.toList());
            if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(payDetailRequestList)){
                PayDetailRequest payDetailRequest = payDetailRequestList.get(Constants.ZERO);
                response.setSkuAmount(response.getSkuPrice().multiply(new BigDecimal(payDetailRequest.getGoodsNum()+"")));
                response.setGoodsNum(payDetailRequest.getGoodsNum());
                amount = amount.add(response.getSkuAmount());
            }
        }
        //获取优惠券优惠金额
        List<MemberCoupon> memberCouponList = memberCouponService.getApplyCoupon(requestList,memberId);
        MemberCoupon memberCoupon = new MemberCoupon();
        orderPayConfirmResponse.setCouponAmount(couponAmount);
        //获取可以使用的优惠券
        List<MemberCoupon> memberCouponList = memberCouponService.getApplyCoupon(request.getPayDetailRequestList(),request.getMemberId());
        if(CollectionUtils.isNotEmpty(memberCouponList)){
            memberCoupon = memberCouponList.get(Constants.ZERO);
            couponAmount = memberCoupon.getValidAmount();
            memberCouponService.calculateCouponRata(memberCoupon,goodsCalculateList,amount);
            orderPayConfirmResponse.setMemberCoupon(memberCoupon);
        }
        //积分抵扣金额
        //查询用户总积分
        Member member = memberMapper.selectById(memberId);
        //积分大于0 ä¸”大于可用积分配置项 æ‰å¯ä»¥ä½¿ç”¨
        if(member.getIntegral().compareTo(BigDecimal.ZERO)>Constants.ZERO){
            //最低可用启用积分
            BigDecimal minimumIntegral = new BigDecimal(systemDictDataBiz.queryByCode(Constants.SHOP_CONFIG,Constants.MINIMUM_AVAILABLE_INTEGRAL).getCode());
            if(member.getIntegral().compareTo(minimumIntegral)>=Constants.ZERO){
                this.calculateIntegralRata(goodsCalculateList,member.getIntegral());
            orderPayConfirmResponse.setMemberCouponList(memberCouponList);
            //如果选择了优惠券,则判断选择的优惠券是否有效
            if(Objects.nonNull(request.getCouponId())){
                List<MemberCoupon>  memberCoupons = memberCouponList.stream().filter(i->Constants.equalsInteger(i.getId(),request.getCouponId())).collect(Collectors.toList());
                if(CollectionUtils.isEmpty(memberCoupons)){
                    throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"选择的优惠券无效,请刷新重试");
                }
                memberCoupon = memberCouponList.get(Constants.ZERO);
                couponAmount = memberCoupon.getValidAmount();
                memberCouponService.calculateCouponRata(memberCoupon,goodsCalculateList,amount);
                orderPayConfirmResponse.setMemberCoupon(memberCoupon);
            }
        }else {
            if(Objects.nonNull(request.getCouponId())){
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"无可用优惠券,请刷新查看");
            }
        }
        //邮费金额
        if(Constants.equalsInteger(receiveType,Constants.ZERO)){
            //TODO  æ ¹æ®æ”¶è´§åœ°å€ æŸ¥è¯¢è¿è´¹é…ç½®
            //计算商品信息总重量
            BigDecimal totalWeight = goodsCalculateList.stream().map(i->
                    i.getWeight().multiply(new BigDecimal(i.getGoodsNum().toString()))
                    ).reduce(BigDecimal.ZERO,BigDecimal::add);
        }
        orderPayConfirmResponse.setAmount(amount);
        orderPayConfirmResponse.setCouponAmount(couponAmount);
        orderPayConfirmResponse.setDeductIntegral(deductIntegral);
        orderPayConfirmResponse.setMailAmount(mailAmount);
        orderPayConfirmResponse.setIntegralAmount(integralAmount);
        orderPayConfirmResponse.setPayAmount(amount.subtract(couponAmount).subtract(mailAmount).subtract(integralAmount));
        orderPayConfirmResponse.setGoodsCalculateList(goodsCalculateList);
        BigDecimal cashToIntegralRata = new BigDecimal(systemDictDataBiz.queryByCode(Constants.SHOP_CONFIG,Constants.CASH_EXCHANGE_INTEGRAL_RATA).getCode());
        orderPayConfirmResponse.setIntegralBack(
                orderPayConfirmResponse.getPayAmount().multiply(cashToIntegralRata)
        //查询用户总积分
        Member member = memberMapper.selectById(request.getMemberId());
        //最低可用启用积分
        BigDecimal minimumIntegral = new BigDecimal(systemDictDataBiz.queryByCode(Constants.SHOP_CONFIG,Constants.MINIMUM_AVAILABLE_INTEGRAL).getCode());
        //积分可使用状态  å¤§äºŽ0 å¤§äºŽæœ€å°å¯ç”¨é…ç½®ç§¯åˆ†å€¼
        orderPayConfirmResponse.setIntegralStatus(
                (member.getIntegral().compareTo(BigDecimal.ZERO)<=Constants.ZERO||
                member.getIntegral().compareTo(minimumIntegral)<Constants.ZERO)?Constants.ONE:Constants.ZERO
        );
        orderPayConfirmResponse.setDeductIntegral(deductIntegral);
        orderPayConfirmResponse.setIntegralAmount(integralAmount);
        if(Constants.equalsInteger(orderPayConfirmResponse.getIntegralStatus(),Constants.ZERO)){
            integralAmount = this.calculateIntegralRata(orderPayConfirmResponse,goodsCalculateList,member.getIntegral());
        }
        //邮费金额
        if(Objects.nonNull(request.getReceiveType())){
            if(Constants.equalsInteger(request.getReceiveType(),Constants.ZERO)){
                //TODO  æ ¹æ®æ”¶è´§åœ°å€ æŸ¥è¯¢è¿è´¹é…ç½®
                //计算商品信息总重量
                BigDecimal totalWeight = goodsCalculateList.stream().map(i->
                        i.getWeight().multiply(new BigDecimal(i.getGoodsNum().toString()))
                ).reduce(BigDecimal.ZERO,BigDecimal::add);
                //TODO æš‚时无运费金额
                mailAmount = BigDecimal.ZERO;
                amount = amount.add(mailAmount);
            }
        }
        orderPayConfirmResponse.setAmount(amount);
        orderPayConfirmResponse.setMailAmount(mailAmount);
        //使用积分 å‡åŽ»ç§¯åˆ†æŠµæ‰£é‡‘é¢
        if(Constants.equalsInteger(request.getUseIntegral(), Constants.ONE)){
            orderPayConfirmResponse.setIntegralAmount(integralAmount);
        }
        //使用优惠券 å‡åŽ»ä¼˜æƒ åˆ¸æŠµæ‰£é‡‘é¢
        if(Objects.nonNull(request.getCouponId())){
            orderPayConfirmResponse.setCouponAmount(couponAmount);
        }
        //实际支付金额 å‡åŽ»ä¼˜æƒ åˆ¸ã€ç§¯åˆ†æŠµæ‰£é‡‘é¢
        orderPayConfirmResponse.setPayAmount(amount.subtract(couponAmount).subtract(orderPayConfirmResponse.getIntegralAmount()));
        orderPayConfirmResponse.setGoodsCalculateList(goodsCalculateList);
        orderPayConfirmResponse.setIntegralBack(getBackIntegral(orderPayConfirmResponse.getPayAmount(),Constants.ZERO));
        return orderPayConfirmResponse;
    }
    /**
     *
     * è®¡ç®—赠送积分数量
     * @param payAmount
     * @param type 0=消费者积分 1=经销商积分
     * @return
     */
    public BigDecimal getBackIntegral(BigDecimal payAmount,Integer type){
        BigDecimal integralBack = BigDecimal.ZERO;
        if(payAmount.compareTo(BigDecimal.ZERO)<=Constants.ZERO){
            return integralBack;
        }
        PlatformConfigDTO platformConfigDTO = systemDictDataService.getPlatformConfigDTO();
        if(Objects.isNull(platformConfigDTO)){
            return integralBack;
        }
        if(Constants.equalsInteger(type,Constants.ZERO)){
            if( Constants.equalsInteger(platformConfigDTO.getReturnMemberIntegralStatus(),Constants.ZERO)
                && Objects.nonNull(platformConfigDTO.getReturnMemberIntegral())){
                integralBack = payAmount.divide(platformConfigDTO.getReturnMemberIntegral(),0,BigDecimal.ROUND_DOWN);
            }
        }else{
            if( Constants.equalsInteger(platformConfigDTO.getReturnShopIntegralStatus(),Constants.ZERO)
                    && Objects.nonNull(platformConfigDTO.getReturnShopIntegral())){
                integralBack = payAmount.divide(platformConfigDTO.getReturnShopIntegral(),0,BigDecimal.ROUND_DOWN);
            }
        }
        return integralBack;
    }
    /**
     * è®¡ç®—积分抵扣信息
     * @param goodsCalculateList å•†å“é›†åˆ
     * @param totalIntegral ç”¨æˆ·æ€»ç§¯åˆ†
     */
    public void  calculateIntegralRata(List<OrderGoodsCalculateResponse> goodsCalculateList,BigDecimal totalIntegral){
    public BigDecimal  calculateIntegralRata(OrderPayConfirmResponse orderPayConfirmResponse,List<OrderGoodsCalculateResponse> goodsCalculateList,BigDecimal totalIntegral){
        //当前选择商品最大可用积分抵扣的金额
        BigDecimal maxDeductionCash =  goodsCalculateList.stream().map(i->i.getSkuAmount().subtract(i.getCouponDeductCash())
                .multiply(i.getDeductRata())).reduce(BigDecimal.ZERO,BigDecimal::add);
                .multiply(i.getDeductRata()).multiply(new BigDecimal("0.01"))).reduce(BigDecimal.ZERO,BigDecimal::add);
        //积分 - çް金 æ¯”例
        BigDecimal cashToIntegralRata = new BigDecimal(systemDictDataBiz.queryByCode(Constants.SHOP_CONFIG,Constants.INTEGRAL_EXCHANGE_CASH_RATA).getCode());
        //当前选择商品抵扣需要使用的积分
        BigDecimal maxDeductionIntegral =  maxDeductionCash.multiply(cashToIntegralRata).multiply(new BigDecimal("100"));
        BigDecimal deductionRata = BigDecimal.ONE;
        //获取当前需要支付的现金总额
        BigDecimal payCash =  goodsCalculateList.stream().map(i->i.getSkuAmount().subtract(i.getCouponDeductCash())).reduce(BigDecimal.ZERO,BigDecimal::add);
        //如果实际积分少于最大需要积分 éœ€è¦è®¡ç®—比例占比 åŽ»å¯¹åº”æ·»åŠ è‡³å¯¹åº”çš„å•†å“é‡Œ
        if(totalIntegral.compareTo(maxDeductionIntegral)<=Constants.ZERO) {
            deductionRata = totalIntegral.divide(maxDeductionIntegral, 2, BigDecimal.ROUND_HALF_UP);
        }
        //获取总的抵扣金额 ä¸Ž æ¯ä¸ªå•†å“å¯æŠµæ‰£é‡‘额
        //已用占比比例值
        BigDecimal rata = BigDecimal.ZERO;
        //剩余可分配金额
        BigDecimal surplusValidAmount = maxDeductionCash;
        //循环下单商品列表 è®¡ç®—应该使用的积分值
        BigDecimal realDeductionCash = BigDecimal.ZERO;
        for (int j = 0; j < goodsCalculateList.size(); j++) {
            if(Constants.equalsInteger(j+1,goodsCalculateList.size())){
                goodsCalculateList.get(j).setIntegralMaxDeductCash(surplusValidAmount);
                goodsCalculateList.get(j).setOrderIntegralRata(new BigDecimal("1").subtract(rata));
            }else{
                //积分最大可抵扣金额
                goodsCalculateList.get(j).setIntegralMaxDeductCash(
                        goodsCalculateList.get(j).getSkuAmount()
                                .subtract(goodsCalculateList.get(j).getCouponDeductCash())
                                .multiply(goodsCalculateList.get(j).getDeductRata()));
                //订单中积分金额实际占比
                goodsCalculateList.get(j).setOrderIntegralRata(
                                goodsCalculateList.get(j)
                                        .getIntegralMaxDeductCash().divide(maxDeductionCash,2,BigDecimal.ROUND_DOWN)
                        );
                rata = rata.add(goodsCalculateList.get(j).getOrderIntegralRata());
                surplusValidAmount = surplusValidAmount.subtract(goodsCalculateList.get(j).getIntegralMaxDeductCash());
            BigDecimal deductionCash = goodsCalculateList.get(j).getSkuAmount().subtract(goodsCalculateList.get(j).getCouponDeductCash());
            goodsCalculateList.get(j).setIntegralMaxDeductCash(deductionCash);
            //如果剩余积分大于可以使用积分 åˆ™ç›´æŽ¥æ»¡é¢è®¡ç®— åä¹‹ å‰©ä½™ç§¯åˆ†ä¸èƒ½æ»¡è¶³å…¨éƒ¨æŠµæ‰£ å•独计算每个商品占比
            if(totalIntegral.compareTo(maxDeductionIntegral)<Constants.ZERO){
                deductionCash  = deductionCash.divide(payCash).multiply(totalIntegral);
            }
            //如果用户积分大于本次需要使用的最大积分 åˆ™ç›´æŽ¥ä½¿ç”¨å¦åˆ™éœ€è¦é‡æ–°è®¡ç®—
            goodsCalculateList.get(j).setIntegralDeductCash(goodsCalculateList.get(j).getIntegralMaxDeductCash().multiply(deductionRata));
            goodsCalculateList.get(j).setIntegralDeduct(goodsCalculateList.get(j).getIntegralMaxDeductCash().multiply(cashToIntegralRata).multiply(deductionRata));
            goodsCalculateList.get(j).setIntegralDeductCash(deductionCash);
            realDeductionCash = realDeductionCash.add(deductionCash);
        }
        //剩余积分值
        orderPayConfirmResponse.setSurplusIntegral(totalIntegral);
        //实际抵扣使用积分
        orderPayConfirmResponse.setDeductIntegral(totalIntegral.compareTo(maxDeductionCash)<=Constants.ZERO?totalIntegral:maxDeductionIntegral);
        return realDeductionCash;
    }
@@ -1444,13 +1554,18 @@
        goodsorder.setStatus(Constants.OrderStatus.DONE.getKey());
        goodsorder.setDoneDate(new Date());
        goodsorderMapper.updateById(goodsorder);
        //经销商分销 æ·»åŠ åˆ†é”€é‡‘é¢è®°å½•
        this.addShopIntegral(goodsorder);
        //根据订单类型进行积分赠送
        //下单确认收货 ï¼Œèµ é€ç»é”€å•†ç§¯åˆ†
        this.orderAddShopIntegral(goodsorder);
        //消费者确认收货
        this.orderAddMemberIntegral(goodsorder);
        //经销商 ç»“算金额
        this.orderAddShopCash(goodsorder);
    }
    /**
     * è®¢å•核销
     * @param code
     * @param
     * @param memberId
     */
    @Override
@@ -1467,9 +1582,7 @@
        if(!goodsorder.getStatus().equals(Constants.OrderStatus.PAY_DONE.getKey())){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"操作失败:订单状态已流转,无法进行该操作!");
        }
        Shop shop = shopMapper.selectById(goodsorder.getPickUpShopId());/*selectOne(new QueryWrapper<Shop>().lambda().eq(Shop::getMemberId,memberId)
                .eq(Shop::getIsdeleted,Constants.ZERO).last("limit 1 ")
        );*/
        Shop shop = shopMapper.selectById(goodsorder.getPickUpShopId());
        if(Objects.isNull(shop)){
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未查询到订单关联经销商信息,请联系管理员");
        }
@@ -1479,35 +1592,84 @@
        goodsorder.setStatus(Constants.OrderStatus.DONE.getKey());
        goodsorder.setDoneDate(new Date());
        goodsorderMapper.updateById(goodsorder);
        //经销商分销 æ·»åŠ åˆ†é”€é‡‘é¢è®°å½•
        this.addShopIntegral(goodsorder);
        //存在现金支付 èµ é€ ç§¯åˆ†
        if(Constants.equalsInteger(goodsorder.getPayMethod(),Constants.ZERO)){
            //赠送消费者积分
            this.orderAddMemberIntegral(goodsorder);
            //经销商 æ·»åŠ èµ é€ç§¯åˆ†
            this.orderAddShopIntegral(goodsorder);
            //经销商 ç»“算金额
            this.orderAddShopCash(goodsorder);
        }
    }
    public void addShopIntegral(Goodsorder goodsorder){
        if(Objects.isNull(goodsorder.getDistributionShopId())){
    /**
     * èµ é€ç»é”€å•†ä¸‹å•积分
     * @param goodsorder
     */
    public void orderAddShopIntegral(Goodsorder goodsorder){
        if(Objects.isNull(goodsorder.getDistributionShopId()) || Constants.equalsInteger(goodsorder.getPayMethod(),Constants.ONE)){
            return;
        }
        List<GoodsorderDetail> detailList = goodsorderDetailMapper.selectList(new QueryWrapper<GoodsorderDetail>().lambda()
                .eq(GoodsorderDetail::getOrderId,goodsorder.getId())
                .isNotNull(GoodsorderDetail::getShopSettlement)
        );
        if(CollectionUtils.isNotEmpty(detailList)){
            BigDecimal settlement = detailList.stream().map(i->i.getShopSettlement()).reduce(BigDecimal.ZERO,BigDecimal::add);
        BigDecimal backIntegral = getBackIntegral(goodsorder.getPrice(),Constants.ONE);
        if (backIntegral.compareTo(BigDecimal.ZERO) >= 0) {
            //更新余额信息 æ·»åŠ ç§¯åˆ†å˜åŠ¨è®°å½•
            DealIntegralRequest dealIntegralRequest = new DealIntegralRequest();
            dealIntegralRequest.setIntegralNum(backIntegral);
            dealIntegralRequest.setDealType(Constants.ZERO);
            dealIntegralRequest.setMemberId(goodsorder.getDistributionShopId());
            dealIntegralRequest.setObjId(goodsorder.getId());
            dealIntegralRequest.setOrderCode(goodsorder.getCode().toString());
            dealIntegralRequest.setIntegralObjType(Constants.IntegralObjType.ORDER_DONATE);
            integralService.dealShopIntegral(dealIntegralRequest);
        }
    }
    public void orderAddShopCash(Goodsorder goodsorder){
        if(Objects.isNull(goodsorder.getDistributionShopId()) || Constants.equalsInteger(goodsorder.getPayMethod(),Constants.ONE)){
            return;
        }
        List<GoodsorderDetail> goodsorderDetails = goodsorderDetailMapper.selectList(new QueryWrapper<GoodsorderDetail>().lambda()
                .eq(GoodsorderDetail::getOrderId,goodsorder.getId())
        );
        BigDecimal settlement = goodsorderDetails.stream().map(i->i.getShopSettlement()).reduce(BigDecimal.ZERO,BigDecimal::add);
        if(settlement.compareTo(BigDecimal.ZERO)>Constants.ZERO ){
            DealIntegralRequest dealIntegralRequest = new DealIntegralRequest();
            dealIntegralRequest.setIntegralNum(settlement);
            dealIntegralRequest.setDealType(Constants.ZERO);
            dealIntegralRequest.setMemberId(goodsorder.getDistributionShopId());
            dealIntegralRequest.setObjId(goodsorder.getId());
            dealIntegralRequest.setOrderCode(goodsorder.getCode().toString());
            dealIntegralRequest.setIntegralObjType(Constants.IntegralObjType.SHOP_ORDER_SETTLEMENT);
            integralService.dealShopIntegral(dealIntegralRequest);
            dealIntegralRequest.setIntegralObjType(Constants.IntegralObjType.ORDER_DONE_AMOUNT);
            integralService.dealShopAmount(dealIntegralRequest);
        }
    }
    /**
     * èµ é€æ¶ˆè´¹è€…下单积分
     * @param goodsorder
     */
    public void orderAddMemberIntegral(Goodsorder goodsorder){
        if(Constants.equalsInteger(goodsorder.getPayMethod(),Constants.ONE)){
            return;
        }
        BigDecimal backIntegral = getBackIntegral(goodsorder.getPrice(),Constants.ZERO);
        if (backIntegral.compareTo(BigDecimal.ZERO) >= 0) {
            //更新余额信息 æ·»åŠ ç§¯åˆ†å˜åŠ¨è®°å½•
            DealIntegralRequest dealIntegralRequest = new DealIntegralRequest();
            dealIntegralRequest.setIntegralNum(backIntegral);
            dealIntegralRequest.setDealType(Constants.ZERO);
            dealIntegralRequest.setMemberId(goodsorder.getDistributionShopId());
            dealIntegralRequest.setObjId(goodsorder.getId());
            dealIntegralRequest.setOrderCode(goodsorder.getCode().toString());
            dealIntegralRequest.setIntegralObjType(Constants.IntegralObjType.ORDER_DONATE);
            integralService.dealIntegral(dealIntegralRequest);
        }
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
server/dmmall_service/src/main/java/com/doumee/service/business/impl/IntegralServiceImpl.java
@@ -198,6 +198,37 @@
    @Override
    @Transactional(rollbackFor = {Exception.class, BusinessException.class})
    public Integer dealShopAmount(DealIntegralRequest dealIntegralRequest) {
        Shop shop = shopMapper.selectById(dealIntegralRequest.getMemberId());
        if(Objects.isNull(shop)){
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未查询到商户信息");
        }
        Integral integral = new Integral();
        integral.setMemberId(shop.getId());
        integral.setCreateDate(new Date());
        integral.setIsdeleted(Constants.ZERO);
        integral.setTitle(dealIntegralRequest.getIntegralObjType().getName());
        integral.setContent(dealIntegralRequest.getIntegralObjType().getNoteinfo());
        integral.setObjId(dealIntegralRequest.getObjId());
        integral.setObjType(dealIntegralRequest.getIntegralObjType().getKey());
        integral.setType(dealIntegralRequest.getDealType());
        integral.setNum(dealIntegralRequest.getIntegralNum());
        integral.setTotalNum(dealIntegralRequest.getDealType().equals(Constants.ZERO)? shop.getAmount().add(integral.getNum()):shop.getAmount().subtract(integral.getNum()));
        integral.setOrderCode(dealIntegralRequest.getOrderCode());
        integral.setUserType(Constants.TWO);
        integralMapper.insert(integral);
        if(dealIntegralRequest.getDealType().equals(Constants.ZERO)){
            shopMapper.addAmount(shop.getId(),dealIntegralRequest.getIntegralNum(),
                    dealIntegralRequest.getIntegralObjType().getAddTitle()==Constants.ZERO?dealIntegralRequest.getIntegralNum():BigDecimal.ZERO);
        }else{
            shopMapper.subtractAmount(shop.getId(),dealIntegralRequest.getIntegralNum());
        }
        return integral.getId();
    }
    @Override
    public void deleteById(Integer id) {
        integralMapper.deleteById(id);
    }
server/dmmall_service/src/main/java/com/doumee/service/business/impl/MemberCouponServiceImpl.java
@@ -379,7 +379,6 @@
        if(CollectionUtils.isEmpty(goodsSkuList)||!Constants.equalsInteger(goodsSkuList.size(),requestList.size())){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"商品SKU信息错误,请刷新重试");
        }
        //查询商品列表
        List<Goods> goodsList = goodsMapper.selectJoinList(Goods.class,
                new MPJLambdaWrapper<Goods>()
@@ -391,7 +390,6 @@
        if(Objects.isNull(goodsList)){
            return memberCouponList;
        }
        //获取选择的商品总金额 ä¸Ž å•个商品金额
        BigDecimal totalAmount = BigDecimal.ZERO;
        for (Goods goods:goodsList) {
@@ -437,6 +435,73 @@
    }
    public void  couponIsValid(List<PayDetailRequest> requestList,MemberCoupon memberCoupon){
        if(Objects.isNull(memberCoupon)
            || Constants.equalsInteger(memberCoupon.getStatus(),Constants.ONE)
        ){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"优惠券信息无效或已被使用");
        }
        if(memberCoupon.getStartDate().getTime() > System.currentTimeMillis()){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"优惠券未生效");
        }
        if(memberCoupon.getEndDate().getTime() < System.currentTimeMillis()){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"优惠券已过期");
        }
        List<GoodsSku> goodsSkuList = goodsSkuMapper.selectList(new QueryWrapper<GoodsSku>()
                .lambda()
                .eq(GoodsSku::getIsdeleted,Constants.ZERO)
                .in(GoodsSku::getId,requestList.stream().map(i->i.getGoodsSkuId()).collect(Collectors.toList()))
        );
        if(CollectionUtils.isEmpty(goodsSkuList)||!Constants.equalsInteger(goodsSkuList.size(),requestList.size())){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"商品SKU信息错误,请刷新重试");
        }
        //查询商品列表
        List<Goods> goodsList = goodsMapper.selectJoinList(Goods.class,
                new MPJLambdaWrapper<Goods>()
                        .selectAs(GoodsSku::getPrice,Goods::getSkuPrice)
                        .selectAs(GoodsSku::getId,Goods::getSkuId)
                        .leftJoin(GoodsSku.class,GoodsSku::getGoodsId,Goods::getId)
                        .in(GoodsSku::getId,requestList.stream().map(i->i.getGoodsSkuId()).collect(Collectors.toList())));
        if(Objects.isNull(goodsList)){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"商品SKU商品信息错误,请刷新重试");
        }
        //获取选择的商品总金额 ä¸Ž å•个商品金额
        BigDecimal totalAmount = BigDecimal.ZERO;
        for (Goods goods:goodsList) {
            List<PayDetailRequest> request = requestList.stream().filter(i->Constants.equalsInteger(i.getGoodsSkuId(), goods.getSkuId())).collect(Collectors.toList());
            if(CollectionUtils.isNotEmpty(request)){
                goods.setSkuAmount(goods.getSkuPrice().multiply(new BigDecimal(request.get(Constants.ZERO).getGoodsNum()+"")));
                totalAmount = totalAmount.add(goods.getSkuAmount());
            }
        }
        List<OrderGoodsCalculateResponse> goodsCalculateList = ListUtil.copyProperties(goodsList,OrderGoodsCalculateResponse::new);
        if(totalAmount.compareTo(memberCoupon.getLimitPrice())<Constants.ZERO){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"当前商品金额未满足可使用门槛");
        }
        //适用类型:0=全场;1=品类;2=指定商品
        if(Constants.equalsInteger(memberCoupon.getApplyType(),Constants.ZERO)){
            memberCoupon.setValidAmount(memberCoupon.getPrice());
        }else{
            List<String> applyIdList = Arrays.asList(memberCoupon.getApplyIds().split(","));
            //获取有效可以使用优惠券的数据
            isVaildUse(applyIdList,goodsCalculateList,
                    Constants.equalsInteger(memberCoupon.getApplyType(),Constants.ONE)?Constants.ONE:Constants.ZERO);
            BigDecimal skuAmount = goodsCalculateList.stream().filter(i->i.getUseCoupon()).map(i->i.getSkuAmount()).reduce(BigDecimal.ZERO,BigDecimal::add);
            if(skuAmount.compareTo(memberCoupon.getLimitPrice())>=Constants.ZERO){
                //根据金额计算实际折扣金额
                BigDecimal couponPrice = skuAmount.multiply(memberCoupon.getPrice()).divide(new BigDecimal("100"),2, RoundingMode.HALF_UP);
                //折扣金额大于最大可折扣金额  åˆ™ä½¿ç”¨æœ€å¤§å¯æŠ˜æ‰£é‡‘额
                memberCoupon.setValidAmount(couponPrice.compareTo(memberCoupon.getMaxPrice())>Constants.ZERO?memberCoupon.getMaxPrice():couponPrice);
            }
        }
    }
    /**
     * è®¡ç®—当前已选择优惠券每个商品占比金额
     * @param coupon ä¼˜æƒ åˆ¸ä¿¡æ¯