rk
2025-12-15 a1a6e227628810259fcba0fff146792e97a80b8a
订单业务开发
已添加5个文件
已修改25个文件
1155 ■■■■■ 文件已修改
server/dmmall_service/src/main/java/com/doumee/core/utils/Constants.java 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/core/utils/DateUtil.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/core/utils/ListUtil.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/dao/business/GoodsMapper.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/dao/business/model/Goods.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/dao/business/model/Goodsorder.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/dao/business/model/GoodsorderDetail.java 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/dao/business/model/Integral.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/dao/business/model/Member.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/dao/business/model/MemberCoupon.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/dao/business/model/Shop.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/dao/web/request/OrderPayRequest.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/dao/web/request/PayDetailRequest.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/dao/web/request/ShopOrderPayRequest.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/dao/web/request/goods/GoodsRequest.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/dao/web/response/PayDetailResponse.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/dao/web/response/goods/GoodsInfoResponse.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/dao/web/response/goods/OrderGoodsCalculateResponse.java 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/dao/web/response/goods/OrderPayConfirmResponse.java 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/service/business/GoodsorderService.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/service/business/MemberCouponService.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/service/business/ShopcartService.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/service/business/impl/GoodsServiceImpl.java 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/service/business/impl/GoodsorderServiceImpl.java 363 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/service/business/impl/MemberCouponServiceImpl.java 175 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/service/business/impl/ShopcartServiceImpl.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/resources/application-dev.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_web/src/main/java/com/doumee/api/web/ApiController.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_web/src/main/java/com/doumee/api/web/mall/OrderApi.java 38 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_web/src/main/java/com/doumee/api/web/mall/ShopCartApi.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/core/utils/Constants.java
@@ -43,6 +43,14 @@
    public static final String INITIAL_PASSWORD = "INITIAL_PASSWORD";
    public static final String ACCESS_TOKEN = "ACCESS_TOKEN";
    public static final String MINIMUM_AVAILABLE_INTEGRAL = "MINIMUM_AVAILABLE_INTEGRAL";//最低可用积分配置
    public static final String SHOP_CONFIG = "SHOP_CONFIG";
    public static final String INTEGRAL_EXCHANGE_CASH_RATA = "INTEGRAL_EXCHANGE_CASH_RATA"; //积分-现金兑换比例(XXX积分抵扣1元)
    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";
@@ -1042,4 +1050,68 @@
        }
    }
    public static String getRandomNumber(){
        Random random = new Random();
        long randomNumber = (long)(random.nextDouble() * 90000000000L) + 100000000000L;
        return randomNumber +"";
    }
    public  enum INTEGRAL_TYPE{
        ORDER_PAY(0, "订单消耗", -1),
        ORDER_CANCEL(1, "订单取消返还", 1),
        ;
        // æˆå‘˜å˜é‡
        private String name;
        private int key;
        private int type;// æè¿°
        // æž„造方法
        INTEGRAL_TYPE(int key, String name, int type) {
            this.name = name;
            this.key = key;
            this.type = type;
        }
        // æ™®é€šæ–¹æ³•
        public static String getName(int index) {
            for (INTEGRAL_TYPE c : INTEGRAL_TYPE.values()) {
                if (c.getKey() == index) {
                    return c.name;
                }
            }
            return null;
        }
        // get set æ–¹æ³•
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public int getKey() {
            return key;
        }
        public void setKey(int key) {
            this.key = key;
        }
        public int getType() {
            return type;
        }
        public void setType(int type) {
            this.type = type;
        }
    }
}
server/dmmall_service/src/main/java/com/doumee/core/utils/DateUtil.java
@@ -1907,7 +1907,7 @@
     */
    public static String getCurrDateTime() {
        Timestamp date = new Timestamp(System.currentTimeMillis());
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return formatter.format(date);
    }
server/dmmall_service/src/main/java/com/doumee/core/utils/ListUtil.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,39 @@
package com.doumee.core.utils;
import org.springframework.beans.BeanUtils;
import java.util.List;
import java.util.function.Supplier;
import java.util.stream.Collectors;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2025/12/12 9:31
 */
public class ListUtil {
    public static <S, T> List<T> copyProperties(List<S> sources, Supplier<T> target) {
        return sources.stream().map(source -> {
            T t = target.get();
            BeanUtils.copyProperties(source, t);
            return t;
        }).collect(Collectors.toList());
    }
    public static <S, T> List<T> copyListProperties(List<S> sources, Class<T> target) {
        return sources.stream().map(source -> {
            T t;
            try {
                t = target.newInstance();
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
            BeanUtils.copyProperties(source, t);
            return t;
        }).collect(Collectors.toList());
    }
}
server/dmmall_service/src/main/java/com/doumee/dao/business/GoodsMapper.java
@@ -7,6 +7,7 @@
import com.doumee.dao.business.model.Goods;
import com.doumee.dao.web.request.goods.GoodsRequest;
import com.doumee.dao.web.response.goods.GoodsInfoResponse;
import com.github.yulichang.base.mapper.MPJJoinMapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
@@ -14,18 +15,21 @@
 * @author æ±Ÿè¹„蹄
 * @date 2023/03/21 15:48
 */
public interface GoodsMapper extends BaseMapper<Goods> {
public interface GoodsMapper extends MPJJoinMapper<Goods> {
    @Select(" select g.* , " +
            "(( select count(1) from goodsorder_detail gd inner join goods_sku gs on gd.GOODS_SKU_ID = gs.id where gs.GOODS_ID = g.`id`  )+ g.SALENUM) as realSaleNum   " +
            "(( select count(1) from goodsorder_detail gd inner join goods_sku gs on gd.GOODS_SKU_ID = gs.id where gs.GOODS_ID = g.`id`  )+ g.SALENUM) as realSaleNum ," +
            " ifnull(( select min(gs.PRICE) from goods_sku gs where gs.GOODS_ID = g.id ),0) as minPrice  " +
            " from goods g  " +
            " ${ew.customSqlSegment} ")
    IPage<GoodsInfoResponse> goodsPage(IPage<GoodsRequest> page, @Param(Constants.WRAPPER) Wrapper wrapper);
    @Select(" select g.* ,  ( select count(1) from goodsorder_detail gd inner join goods_sku gs on gd.GOODS_SKU_ID = gs.id where gs.GOODS_ID = g.id  ) as realSaleNum    " +
    @Select(" select g.* , " +
            "(( select count(1) from goodsorder_detail gd inner join goods_sku gs on gd.GOODS_SKU_ID = gs.id where gs.GOODS_ID = g.`id`  )+ g.SALENUM) as realSaleNum ," +
            " ifnull(( select min(gs.PRICE) from goods_sku gs where gs.GOODS_ID = g.id ),0) as minPrice  " +
            " from goods g  " +
            "  where g.ISDELETED = 0 and g.id = #{id} ")
    GoodsInfoResponse getGoodsInfo(@Param("id") Integer id);
server/dmmall_service/src/main/java/com/doumee/dao/business/model/Goods.java
@@ -126,13 +126,15 @@
    @ExcelColumn(name="一级分类")
    private String parentCategoryId;
    @ApiModelProperty(value = "抵扣比例(0.1%~100%)", example = "1")
    @ApiModelProperty(value = "抵扣比例(0.1%~100%)", example = "1", hidden = true)
    @TableField(exist = false)
    private BigDecimal deductRata;
    @ApiModelProperty(value = "sku重量", hidden = true)
    @TableField(exist = false)
    private BigDecimal weight;
    @ApiModelProperty(value = "sku金额", hidden = true)
    @TableField(exist = false)
    private BigDecimal skuPrice;
@@ -145,6 +147,10 @@
    @TableField(exist = false)
    private Integer skuId;
    @ApiModelProperty(value = "sku图片", hidden = true)
    @TableField(exist = false)
    private String skuImg;
    @ApiModelProperty(value = "商品轮播图", example = "1")
    @TableField(exist = false)
    private List<Multifile> fileList;
server/dmmall_service/src/main/java/com/doumee/dao/business/model/Goodsorder.java
@@ -59,6 +59,9 @@
    @ExcelColumn(name="联系人地址" ,index =8 ,width = 10)
    private String linkaddr;
    @ApiModelProperty(value = "订单总价格", example = "1")
    private BigDecimal totalPrice;
    @ApiModelProperty(value = "订单实付价格(元/咖豆)", example = "1")
    @ExcelColumn(name="订单实付价格",index =9,width = 10)
    private BigDecimal price;
@@ -173,9 +176,25 @@
    @ApiModelProperty(value = "优惠券编码(关联MEMBER_COUPON表)", example = "1")
    private Integer couponId;
    @ApiModelProperty(value = "积分抵扣金额", example = "1")
    private BigDecimal integralPrice;
    @ApiModelProperty(value = "消耗积分值", example = "1")
    private BigDecimal useIntegral;
    @ApiModelProperty(value = "咖啡计划订单形式 0新增 1延长", example = "1")
    private Integer planOrderType;
    @ApiModelProperty(value = "收货类型:0=快递配送;1=门店自提;", example = "1")
    private Integer receiveType;
    @ApiModelProperty(value = "提货商铺主键 shop:id", example = "1")
    private Integer pickUpShopId;
    @ApiModelProperty(value = "分销商铺主键 shop:id", example = "1")
    private Integer distributionShopId;
    @ApiModelProperty(value = "文件地址")
server/dmmall_service/src/main/java/com/doumee/dao/business/model/GoodsorderDetail.java
@@ -84,12 +84,24 @@
    @ApiModelProperty(value = "商品数量", example = "1")
    @ExcelColumn(name="商品数量")
    private Integer goodsNum;
    @ApiModelProperty(value = "商品重量", example = "1")
    @ExcelColumn(name="商品重量")
    private BigDecimal goodsWeight;
    @ApiModelProperty(value = "优惠券抵扣金额", example = "1")
    private BigDecimal couponDeduct;
    @ApiModelProperty(value = "积分抵扣金额", example = "1")
    private BigDecimal integralDeduct;
    @ApiModelProperty(value = "商品标签名称")
    @TableField(exist = false)
    private String lablesName;
server/dmmall_service/src/main/java/com/doumee/dao/business/model/Integral.java
@@ -2,6 +2,7 @@
import com.baomidou.mybatisplus.annotation.TableField;
import com.doumee.core.annotation.excel.ExcelColumn;
import com.doumee.core.utils.Constants;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import com.baomidou.mybatisplus.annotation.IdType;
@@ -109,4 +110,19 @@
    private String strObjType;
    public static  Integral createIntegral(Integer memberId, Constants.INTEGRAL_TYPE integralType,Integer objId){
        Integral integral = new Integral();
        integral.setCreator(memberId);
        integral.setCreateDate(new Date());
        integral.setIsdeleted(Constants.ZERO);
        integral.setMemberId(memberId);
        integral.setTitle(integralType.getName());
        integral.setObjId(objId);
        integral.setObjType(integralType.getKey());
        integral.setType(integralType.getType());
        return integral;
    }
}
server/dmmall_service/src/main/java/com/doumee/dao/business/model/Member.java
@@ -149,6 +149,9 @@
    @ExcelColumn(name="sharingCode")
    private String sharingCode;
    @ApiModelProperty(value = "绑定商铺主键 shop:id åˆ†é”€äºº")
    private Integer bindShopId;
    @ApiModelProperty(value = "文件地址全路径")
    @TableField(exist = false)
    private String imgFullUrl;
server/dmmall_service/src/main/java/com/doumee/dao/business/model/MemberCoupon.java
@@ -101,7 +101,6 @@
    @ApiModelProperty(value = "使用时间")
    @ExcelColumn(name="使用时间")
    private Date useDate;
    @ApiModelProperty(value = "使用积分奖励数量", example = "1")
@@ -116,9 +115,24 @@
    @ExcelColumn(name="coupon表id")
    private Integer couponId;
    @ApiModelProperty(value = "优惠券类型:0=满减券;1=折扣券;")
    private Integer couponType;
    @ApiModelProperty(value = "适用类型:0=全场;1=品类;2=指定商品")
    private Integer applyType;
    @ApiModelProperty(value = "适用关联对象信息主键")
    private String applyIds;
    @ApiModelProperty(value = "折扣卷满减上限金额")
    private BigDecimal maxPrice;
    @ApiModelProperty(value = "昵称")
    @TableField(exist = false)
    private String nikeName;
    @ApiModelProperty(value = "实际适用时金额")
    @TableField(exist = false)
    private BigDecimal validAmount;
}
server/dmmall_service/src/main/java/com/doumee/dao/business/model/Shop.java
@@ -206,6 +206,10 @@
    @TableField(exist = false)
    private BigDecimal score;
    @ApiModelProperty(value = "距离")
    @TableField(exist = false)
    private BigDecimal distance;
    @ApiModelProperty(value = "店铺访问数据:主页总访问量")
    @TableField(exist = false)
server/dmmall_service/src/main/java/com/doumee/dao/web/request/OrderPayRequest.java
@@ -51,6 +51,7 @@
    private BigDecimal deductionBalance;
    @ApiModelProperty(hidden = true)
    private Integer memberId ;
}
server/dmmall_service/src/main/java/com/doumee/dao/web/request/PayDetailRequest.java
@@ -27,5 +27,7 @@
    @ApiModelProperty(value = "购物车商品主键")
    private Integer shopCartId;
    @ApiModelProperty(value = "优惠券抵扣金额",hidden = true)
    private BigDecimal deductAmount;
}
server/dmmall_service/src/main/java/com/doumee/dao/web/request/ShopOrderPayRequest.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,43 @@
package com.doumee.dao.web.request;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.util.List;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2023/3/24 15:32
 */
@Data
@ApiModel("商品下单请求类")
public class ShopOrderPayRequest {
    @ApiModelProperty(value = "收货地址主键")
    private Integer addressId;
    @NotNull(message = "订单总金额 ä¸èƒ½ä¸ºç©º")
    @ApiModelProperty(value = "订单总金额")
    private BigDecimal titlePrice;
    @ApiModelProperty(value = "收货类型:0=快递配送;1=门店自提;")
    private Integer receiveType;
    @ApiModelProperty(value = "自提商户主键")
    private Integer shopId;
    @ApiModelProperty(value = "支付商品详细")
    List<PayDetailRequest> payDetailRequestList;
    @ApiModelProperty(value = "订单备注")
    private String remark;
    @ApiModelProperty(hidden = true)
    private Integer memberId ;
}
server/dmmall_service/src/main/java/com/doumee/dao/web/request/goods/GoodsRequest.java
@@ -28,6 +28,19 @@
    @ApiModelProperty(value = "商品名称")
    private String goodsName;
    @ApiModelProperty(value = "适用品牌 lables 14")
    private Integer applicableBrandId;
    @ApiModelProperty(value = "适用系列 lables 15")
    private Integer seriesBrandId;
    @ApiModelProperty(value = "品质专区主键")
    private Integer qualityId;
    @ApiModelProperty(value = "排序方式:0=综合排序;1=销量由低到高 ï¼›2=价格由低到高;3=销量由高到低;4=价格由高到低")
    private Integer sortInfo;
    @ApiModelProperty(value = "一级分类编码")
    private Integer parentCategoryId;
server/dmmall_service/src/main/java/com/doumee/dao/web/response/PayDetailResponse.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,37 @@
package com.doumee.dao.web.response;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2023/3/24 15:32
 */
@Data
@ApiModel("订单确认返回类")
public class PayDetailResponse {
    @ApiModelProperty(value = "sku组合编码(关联goods_sku表)")
    private Integer goodsSkuId;
    @ApiModelProperty(value = "商品数量")
    private Integer goodsNum;
    @ApiModelProperty(value = "商品数量")
    private String skuImg;
    @ApiModelProperty(value = "商品名称")
    private String goodsName;
    @ApiModelProperty(value = "购物车商品主键")
    private Integer shopCartId;
    @ApiModelProperty(value = "优惠券抵扣金额",hidden = true)
    private BigDecimal deductAmount;
}
server/dmmall_service/src/main/java/com/doumee/dao/web/response/goods/GoodsInfoResponse.java
@@ -49,8 +49,11 @@
    @ApiModelProperty(value = "品牌")
    private Labels brandLabels;
    @ApiModelProperty(value = "展示价格")
    @ApiModelProperty(value = "展示价格(划线价)")
    private BigDecimal price;
    @ApiModelProperty(value = "最低价")
    private BigDecimal minPrice;
    @ApiModelProperty(value = "商品详情")
    private String content;
@@ -76,6 +79,9 @@
    @ApiModelProperty(value = "排序码")
    private Integer sortnum;
    @ApiModelProperty(value = "真实库存")
    private Integer stock;
//    @ApiModelProperty(value = "商品标签")
//    private List<Labels> labelsList;
server/dmmall_service/src/main/java/com/doumee/dao/web/response/goods/OrderGoodsCalculateResponse.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,90 @@
package com.doumee.dao.web.response.goods;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.doumee.core.annotation.excel.ExcelColumn;
import com.doumee.dao.business.model.GoodsSku;
import com.doumee.dao.business.model.Multifile;
import com.doumee.dao.business.model.Sku;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.apache.xpath.operations.Bool;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
/**
 * å•†å“ä¿¡æ¯è¡¨
 * @author æ±Ÿè¹„蹄
 * @date 2023/03/21 15:48
 */
@Data
public class OrderGoodsCalculateResponse {
    @ApiModelProperty(value = "主键", example = "1")
    private Integer id;
    @ApiModelProperty(value = "是否删除0否 1是", example = "1")
    private Integer isdeleted;
    @ApiModelProperty(value = "名称")
    private String name;
    @ApiModelProperty(value = "分类编码(关联labels表)", example = "1")
    private Integer categoryId;
    @ApiModelProperty(value = "品牌编码(关联labels表)", example = "1")
    private Integer brandId;
    @ApiModelProperty(value = "抵扣比例(0.1%~100%)", example = "1")
    private BigDecimal deductRata;
    @ApiModelProperty(value = "商品数量")
    private Integer goodsNum;
    @ApiModelProperty(value = "单个商品重量(kg)", example = "1")
    private BigDecimal weight;
    @ApiModelProperty(value = "sku金额")
    private BigDecimal skuPrice;
    @ApiModelProperty(value = "sku总金额")
    private BigDecimal skuAmount;
    @ApiModelProperty(value = "skuId")
    private Integer skuId;
    @ApiModelProperty(value = "订单中优惠券金额占比", hidden = true)
    private BigDecimal orderCouponRata;
    @ApiModelProperty(value = "优惠券抵扣金额", hidden = true)
    private BigDecimal couponDeductCash;
    @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;
    @ApiModelProperty(value = "实际销量")
    private BigDecimal  salesVolume;
}
server/dmmall_service/src/main/java/com/doumee/dao/web/response/goods/OrderPayConfirmResponse.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,51 @@
package com.doumee.dao.web.response.goods;
import com.doumee.dao.business.model.MemberCoupon;
import com.doumee.dao.web.request.PayDetailRequest;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
/**
 * å•†å“SKU规格组信息表
 * @author æ±Ÿè¹„蹄
 * @date 2023/03/21 15:48
 */
@Data
@ApiModel("商品确认页信息响应类")
public class OrderPayConfirmResponse {
    @ApiModelProperty(value = "订单总金额", example = "1")
    private BigDecimal amount;
    @ApiModelProperty(value = "优惠券抵扣金额", example = "1")
    private BigDecimal couponAmount;
    @ApiModelProperty(value = "积分抵扣金额", example = "1")
    private BigDecimal integralAmount;
    @ApiModelProperty(value = "抵扣积分值", example = "1")
    private BigDecimal deductIntegral;
    @ApiModelProperty(value = "邮费金额", example = "1")
    private BigDecimal mailAmount;
    @ApiModelProperty(value = "支付金额", example = "1")
    private BigDecimal payAmount;
    @ApiModelProperty(value = "下单返积分", example = "1")
    private BigDecimal integralBack;
    @ApiModelProperty(value = "优惠券信息", example = "1")
    private MemberCoupon memberCoupon;
    @ApiModelProperty(value = "商品信息", example = "1")
    private List<OrderGoodsCalculateResponse> goodsCalculateList;
}
server/dmmall_service/src/main/java/com/doumee/service/business/GoodsorderService.java
@@ -4,7 +4,9 @@
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.dao.business.model.Goodsorder;
import com.doumee.dao.business.model.Shop;
import com.doumee.dao.web.request.OrderPayRequest;
import com.doumee.dao.web.request.PayDetailRequest;
import com.doumee.dao.web.request.goods.DealOrderRequest;
import com.doumee.dao.web.request.goods.MemberOrderRequest;
import com.doumee.dao.web.request.goods.OrderCommentRequest;
@@ -12,6 +14,7 @@
import com.doumee.dao.web.response.goods.MemberOrderResponse;
import com.doumee.dao.web.response.goods.PayResponse;
import java.math.BigDecimal;
import java.util.List;
/**
@@ -60,7 +63,7 @@
    void orderSendOutGoods(Goodsorder goodsorder);
    void orderRemark(Goodsorder goodsorder);
    IPage<Shop> getShopPage(PageWrap<Shop> pageWrap);
    void coffeePlanCancelOrder(Goodsorder goodsorder);
    void orderPlanCancelOrder(Goodsorder goodsorder);
@@ -190,6 +193,7 @@
    MyPageResponse ordersStatistics(Integer memberId);
    /**
     * è®¢å•自动确认
     */
server/dmmall_service/src/main/java/com/doumee/service/business/MemberCouponService.java
@@ -6,6 +6,7 @@
import com.doumee.dao.business.model.MemberCoupon;
import com.doumee.dao.web.dto.CouponDTO;
import com.doumee.dao.web.dto.MemberCouponDTO;
import com.doumee.dao.web.request.PayDetailRequest;
import java.math.BigDecimal;
import java.util.List;
@@ -130,4 +131,12 @@
     */
    PageData<MemberCouponDTO> findMemberCouponDTO(PageWrap<MemberCouponDTO> pageWrap);
    /**
     * æ ¹æ®å•†å“é€‰æ‹©ä¿¡æ¯ æŸ¥è¯¢å¯¹åº”可使用的优惠券
     * @param requestList
     * @param memberId
     * @return
     */
    List<MemberCoupon> getApplyCoupon(List<PayDetailRequest> requestList, Integer memberId);
}
server/dmmall_service/src/main/java/com/doumee/service/business/ShopcartService.java
@@ -111,6 +111,12 @@
     */
    IPage<CartGoodsResponse> cartGoodsPage(PageWrap pageWrap, Integer memberId);
    /**
     * è´­ç‰©è½¦å•†å“æ•°é‡
     * @param memberId
     * @return
     */
    Integer cartGoodsTypeNum(Integer memberId);
    /**
     * æ›´æ–°è´­ç‰©è½¦æ•°é‡ä¿¡æ¯
server/dmmall_service/src/main/java/com/doumee/service/business/impl/GoodsServiceImpl.java
@@ -811,45 +811,66 @@
     */
    @Override
    public IPage<GoodsInfoResponse> getGoodsPage(PageWrap<GoodsRequest> pageWrap) {
       GoodsRequest model = pageWrap.getModel();
       QueryWrapper<GoodsRequest> wrapper = new QueryWrapper<GoodsRequest>()
                .eq("g.ISDELETED",Constants.ZERO)
                .eq("g.PARENT_CATEGORY_ID",pageWrap.getModel().getParentCategoryId())
                .eq(!Objects.isNull(pageWrap.getModel()) && Objects.nonNull(pageWrap.getModel().getCategoryId()),
                        "g.CATEGORY_ID", pageWrap.getModel().getCategoryId())
                .eq(!Objects.isNull(model) && Objects.nonNull(model.getCategoryId()),
                        "g.CATEGORY_ID", model.getCategoryId())
               //TODO é€‚用品牌  é€‚用系列
//               .eq(!Objects.isNull(model) && Objects.nonNull(model.getApplicableBrandId()),
//                       "","")
//               .eq(!Objects.isNull(model) && Objects.nonNull(model.getSeriesBrandId()),
//                       "","")
                .eq("g.STATUS", Constants.ZERO)
                .like(StringUtils.isNotBlank(pageWrap.getModel().getGoodsName()),"g.NAME",pageWrap.getModel().getGoodsName());
//                .eq(!Objects.isNull(pageWrap.getModel()) && !Objects.isNull(pageWrap.getModel().getType()), "g.TYPE", pageWrap.getModel().getType());
                .like(StringUtils.isNotBlank(model.getGoodsName()),"g.NAME",model.getGoodsName());
                for(PageWrap.SortData sortData:pageWrap.getSorts1()){
                    if ("CREATE_DATE".equalsIgnoreCase(sortData.getProperty())){
                        if (PageWrap.ASC.equalsIgnoreCase(sortData.getDirection())){
                            wrapper.orderByAsc("g.CREATE_DATE");
                        }
                if(Objects.nonNull(model.getSortInfo())){
                    //排序方式:0=综合排序;1=销量由低到高 ï¼›2=价格由低到高;3=销量由高到低;4=价格由高到低
                    if(Constants.equalsInteger(model.getSortInfo(),Constants.ZERO)){
                        wrapper.orderByDesc("g.CREATE_DATE");
                    }
                    if ("realSaleNum".equalsIgnoreCase(sortData.getProperty())){
                        if (PageWrap.ASC.equalsIgnoreCase(sortData.getDirection())){
                    }else if(Constants.equalsInteger(model.getSortInfo(),Constants.ONE)){
                            wrapper.orderByAsc("realSaleNum");
                        }
                    }else if(Constants.equalsInteger(model.getSortInfo(),Constants.TWO)){
                        wrapper.orderByAsc("g.price");
                    }else if(Constants.equalsInteger(model.getSortInfo(),Constants.THREE)){
                        wrapper.orderByDesc("realSaleNum");
                    }else if(Constants.equalsInteger(model.getSortInfo(),Constants.FOUR)){
                        wrapper.orderByDesc("g.price");
                    }
                    if ("PRICE".equalsIgnoreCase(sortData.getProperty())){
                        if (PageWrap.ASC.equalsIgnoreCase(sortData.getDirection())){
                            wrapper.orderByAsc("g.PRICE");
                        }
                        wrapper.orderByDesc("g.PRICE");
                    }
                }
//                for(PageWrap.SortData sortData:pageWrap.getSorts1()){
//                    if ("CREATE_DATE".equalsIgnoreCase(sortData.getProperty())){
//                        if (PageWrap.ASC.equalsIgnoreCase(sortData.getDirection())){
//                            wrapper.orderByAsc("g.CREATE_DATE");
//                        }
//                        wrapper.orderByDesc("g.CREATE_DATE");
//
//                    }
//                    if ("realSaleNum".equalsIgnoreCase(sortData.getProperty())){
//
//                        if (PageWrap.ASC.equalsIgnoreCase(sortData.getDirection())){
//                            wrapper.orderByAsc("realSaleNum");
//                        }
//                        wrapper.orderByDesc("realSaleNum");
//                    }
//                    if ("PRICE".equalsIgnoreCase(sortData.getProperty())){
//                        if (PageWrap.ASC.equalsIgnoreCase(sortData.getDirection())){
//                            wrapper.orderByAsc("g.PRICE");
//                        }
//                        wrapper.orderByDesc("g.PRICE");
//                    }
//
//                }
        IPage<GoodsInfoResponse> page = goodsMapper.goodsPage(pageWrap.toPage(),wrapper);
        if (!CollectionUtils.isEmpty(page.getRecords())){
            String preFixPath = systemDictDataBiz.getPreFixPath(Constants.RESOURCE_PATH, Constants.GOODS_FILE);
            page.getRecords().forEach(s->s.setImgurl(preFixPath+s.getImgurl()));
        }
@@ -888,6 +909,7 @@
        String fullUrl = systemDictDataBiz.queryByCode(Constants.OSS,Constants.RESOURCE_PATH).getCode()+
                systemDictDataBiz.queryByCode(Constants.OSS,Constants.GOODS_FILE).getCode();
        Integer sumStock = Constants.ZERO;
        for (GoodsSkuResponse goodsSkuResponse:goodsSkuResponseList) {
            if(StringUtils.isBlank(goodsSkuResponse.getImgurl())){
                goodsSkuResponse.setImgurl(fullUrl + goodsSkuResponse.getGoodsImgUrl());
@@ -920,8 +942,11 @@
                indexData.append("," + ( skuAttr.getSortnum()-1));
            }
            goodsSkuResponse.setIndexData(indexData.toString().substring(1));
            sumStock = sumStock + goodsSkuResponse.getStock();
        }
        //真实销量 = realSaleNum  - saleNum;
        //真实库存= sumStock - (realSaleNum  - saleNum)
        goodsResponse.setStock(sumStock - goodsResponse.getRealSaleNum() + goodsResponse.getSaleNum());
        goodsResponse.setGoodsSkuResponseList(goodsSkuResponseList);
        //Sku基础信息
        List<SkuResponse> skuResponseList = skuMapper.getSkuResponseList(goodsResponse.getId());
@@ -943,7 +968,7 @@
                systemDictDataBiz.queryByCode(Constants.OSS,Constants.GOODS_FILE).getCode();
        GoodsInfoResponse goodsResponse = goodsMapper.getGoodsInfo(goodsId);
        if(Objects.isNull(goodsResponse)){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"当前专区关联商品已删除");
            throw new BusinessException(ResponseStatus.DATA_EMPTY);
        }
        goodsResponse.setImgurl(fullUrl + goodsResponse.getImgurl());
        //查询商品的分类
@@ -960,6 +985,7 @@
                                                                                            Constants.GOODS_FILE);
        List<MultiFileDTO> multiFileDTOS = objAllFileUrl.get(Constants.MultiFile.PLATFORM_GOOD_ROTATION.getKey());
        goodsResponse.setGoodBannerMultiFiles(multiFileDTOS);
        return goodsResponse;
    }
server/dmmall_service/src/main/java/com/doumee/service/business/impl/GoodsorderServiceImpl.java
@@ -8,10 +8,7 @@
import com.doumee.core.model.LoginUserInfo;
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.core.utils.Constants;
import com.doumee.core.utils.DateUtil;
import com.doumee.core.utils.RedisUtil;
import com.doumee.core.utils.Utils;
import com.doumee.core.utils.*;
import com.doumee.core.utils.kuaidi100.DeliveryDTO;
import com.doumee.core.utils.kuaidi100.ExpressUtils;
import com.doumee.core.wx.SendWxMessage;
@@ -22,17 +19,17 @@
import com.doumee.dao.business.join.GoodsorderJoinMapper;
import com.doumee.dao.business.join.PlanorderDetailJoinMapper;
import com.doumee.dao.business.model.*;
import com.doumee.dao.web.dto.CouponDTO;
import com.doumee.dao.web.request.DealIntegralRequest;
import com.doumee.dao.web.request.OrderPayRequest;
import com.doumee.dao.web.request.PayDetailRequest;
import com.doumee.dao.web.request.ShopOrderPayRequest;
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.response.MyPageResponse;
import com.doumee.dao.web.response.goods.MemberOrderDetailResponse;
import com.doumee.dao.web.response.goods.MemberOrderResponse;
import com.doumee.dao.web.response.goods.PayResponse;
import com.doumee.dao.web.response.goods.*;
import com.doumee.service.business.AreasService;
import com.doumee.service.business.GoodsorderService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -44,15 +41,16 @@
import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
import com.github.binarywang.wxpay.bean.result.WxPayRefundResult;
import com.github.binarywang.wxpay.exception.WxPayException;
import com.github.xiaoymin.knife4j.core.util.CollectionUtils;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.SecurityUtils;
import org.checkerframework.checker.units.qual.C;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
@@ -61,6 +59,8 @@
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.*;
import java.util.Date;
import java.util.stream.Collectors;
/**
 * å•†å“è®¢å•信息表Service实现
@@ -93,6 +93,9 @@
    @Autowired
    private AddrMapper addrMapper;
    @Autowired
    private ShopMapper shopMapper;
    @Autowired
    private MemberCouponMapper memberCouponMapper;
@@ -129,6 +132,9 @@
    @Autowired
    private GoodsorderDetailJoinMapper goodsorderDetailJoinMapper;
    @Autowired
    private IntegralMapper integralMapper;
    @Override
    public Integer create(Goodsorder goodsorder) {
@@ -179,6 +185,29 @@
        goodsorder.setEditor(user.getId());
        goodsorderMapper.updateById(goodsorder);
    }
    @Override
    public IPage<Shop> getShopPage(PageWrap<Shop> pageWrap) {
        IPage<Shop> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
        Shop model = pageWrap.getModel();
        if(Objects.isNull(model.getLatitude())||Objects.isNull(model.getLongitude())){
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        return shopMapper.selectPage(page,new MPJLambdaWrapper<Shop>()
                        .selectAll(Shop.class)
                .select(" case when LONGITUDE IS NULL OR LATITUDE IS NULL THEN 0 " +
                        " when t.TYPE = 0 then CONVERT( ST_Distance_Sphere ( POINT ( LONGITUDE, LATITUDE ), POINT ( "+model.getLongitude()+", "+model.getLatitude()+" )) /1000,DECIMAL(15,2))  " +
                        " when t.TYPE = 1 then   CONVERT( ST_Distance_Sphere ( POINT ( LONGITUDE, LATITUDE ), POINT ( "+model.getLongitude()+", "+model.getLatitude()+" )) /1000,DECIMAL(15,2)) " +
                        " else  CONVERT( ST_Distance_Sphere ( POINT ( LONGITUDE, LATITUDE ), POINT ( "+model.getLongitude()+", "+model.getLatitude()+" )) /1000,DECIMAL(15,2)) end " , Shop::getDistance)
                        .eq(Shop::getIsdeleted,Constants.ZERO)
                        .eq(Shop::getStatus,Constants.ZERO)
                        .like(StringUtils.isNotBlank(model.getAddr()),Shop::getAddr,model.getAddr())
                        .like(StringUtils.isNotBlank(model.getName()),Shop::getName,model.getName())
                .orderByAsc(" distance ")
        );
    }
    /**
     * å’–豆 å•†åŸŽè®¢å•发货
     * @param goodsorder
@@ -680,6 +709,147 @@
    }
    @Transactional(rollbackFor = {Exception.class,BusinessException.class})
    public PayResponse orderPay(ShopOrderPayRequest orderPayRequest,MemberCouponServiceImpl memberCouponService){
        Member member = memberMapper.selectById(orderPayRequest.getMemberId());
        Goodsorder goodsorder = new Goodsorder();
        goodsorder.setCreator(orderPayRequest.getMemberId());
        goodsorder.setIntegral(BigDecimal.ZERO);
        goodsorder.setCreateDate(new Date());
        goodsorder.setIsdeleted(Constants.ZERO);
        goodsorder.setMemberInfo(orderPayRequest.getRemark());
        goodsorder.setMemberId(member.getId());
        goodsorder.setType(Constants.ZERO);
        goodsorder.setStatus(Constants.ZERO);
        if(Constants.equalsInteger(orderPayRequest.getReceiveType(),Constants.ZERO)){
            //查询收货地址
            Addr addr = addrMapper.selectById(orderPayRequest.getAddressId());
            if(Objects.isNull(addr)){
                throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未查询到收货地址信息!");
            }
            Areas area = areasService.findById(addr.getAreaId(), Constants.TWO);
            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());
            }
        }else{
            if(Objects.isNull(orderPayRequest.getShopId())){
                throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"请选择正确的自提门店!");
            }
            Shop shop = shopMapper.selectById(orderPayRequest.getShopId());
            if(Objects.isNull(shop)){
                throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"请选择正确的自提门店!");
            }
            goodsorder.setPickUpShopId(shop.getId());
            goodsorder.setDistributionShopId(shop.getId());
            if(Objects.isNull(member.getBindShopId())){
                member.setBindShopId(shop.getId());
            }
        }
        //单据编号 è‡ªå¢ž
        goodsorder.setCode(getNextInCode());
        //计算订单总金额
        BigDecimal sumPrice = BigDecimal.ZERO;
        //存储记录明细
        OrderPayConfirmResponse orderPayConfirmResponse = this.orderPayConfirm(orderPayRequest.getReceiveType(),orderPayRequest.getPayDetailRequestList(),orderPayRequest.getAddressId(),memberCouponService,member.getId());
        if(Objects.isNull(orderPayConfirmResponse)){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"系统支付错误,请联系管理员");
        }
        goodsorder.setPrice(orderPayConfirmResponse.getPayAmount());
        goodsorder.setTotalPrice(orderPayConfirmResponse.getAmount());
        goodsorder.setUseIntegral(orderPayConfirmResponse.getDeductIntegral());
        goodsorder.setIntegralPrice(orderPayConfirmResponse.getIntegralAmount());
        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());
            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())
            );
        }
        goodsorderMapper.insert(goodsorder);
        List<OrderGoodsCalculateResponse> goodsCalculateList  = orderPayConfirmResponse.getGoodsCalculateList();
        if(CollectionUtils.isEmpty(goodsCalculateList)){
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"无明细数据,请检查选择数据!");
        }
        List<GoodsorderDetail> goodsOrderDetailList = new ArrayList<>();
        for (OrderGoodsCalculateResponse payDetailRequest:goodsCalculateList) {
            //查询商品
            GoodsSku goodsSku = goodsSkuMapper.selectById(payDetailRequest.getSkuId());
            if(Objects.isNull(goodsSku)){
                throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未查询到商品SKU信息!");
            }
            Goods goods = goodsMapper.selectById(goodsSku.getGoodsId());
            if(Objects.isNull(goods)){
                throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未查询到商品信息!");
            }
            if(goods.getStatus().equals(Constants.ONE)){
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"存在商品已删除或已下架,无法下单");
            }
            if(goodsSku.getStock().compareTo(new BigDecimal(Constants.formatIntegerNum(payDetailRequest.getGoodsNum())))<Constants.ZERO){
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"存在商品库存不足,无法下单!");
            }
            //商品库存扣除
            goodsSku.setStock(goodsSku.getStock().subtract(new BigDecimal(Constants.formatIntegerNum(payDetailRequest.getGoodsNum()))));
            goodsSkuMapper.updateById(goodsSku);
            GoodsorderDetail goodsOrderDetail = new GoodsorderDetail();
            goodsOrderDetail.setCreator(member.getId());
            goodsOrderDetail.setCreateDate(new Date());
            goodsOrderDetail.setImgurl(StringUtils.isBlank(goodsSku.getImgurl())?goods.getImgurl():goodsSku.getImgurl());
            goodsOrderDetail.setName(goods.getName());
            goodsOrderDetail.setGoodsSkuId(goodsSku.getId().toString());
            goodsOrderDetail.setSkuName(goodsSku.getName());
            goodsOrderDetail.setPrice(goodsSku.getPrice());
            goodsOrderDetail.setGoodsNum(payDetailRequest.getGoodsNum());
            goodsOrderDetail.setGoodsWeight(payDetailRequest.getWeight());
            goodsOrderDetail.setCouponDeduct(payDetailRequest.getCouponDeductCash());
            goodsOrderDetail.setIntegralDeduct(payDetailRequest.getIntegralDeductCash());
            goodsOrderDetail.setOrderId(goodsorder.getId());
            goodsOrderDetailList.add(goodsOrderDetail);
            //删除购物车商品
            shopcartMapper.delete(new QueryWrapper<Shopcart>().lambda()
                    .eq(Shopcart::getMemberId,member.getId())
                    .eq(Shopcart::getGoodsSkuId,goodsOrderDetail.getGoodsSkuId())
            );
        }
        //积分变动记录
        Integral integral =Integral.createIntegral(member.getId(),Constants.INTEGRAL_TYPE.ORDER_PAY,goodsorder.getId());
        integral.setNum(goodsorder.getUseIntegral());
        integral.setTotalNum(member.getIntegral().subtract(goodsorder.getUseIntegral()));
        integralMapper.insert(integral);
        //更新用户积分
        memberMapper.subtractIntegral(member.getId(),goodsorder.getUseIntegral());
        if(goodsorder.getPrice().compareTo(orderPayRequest.getTitlePrice())!=Constants.ZERO){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"商品价格发生变化,请刷新后重新支付!");
        }
        return this.wxPay(goodsorder,member);
    }
    /**
     * é‡æ–°æ”¯ä»˜
     * @param orderId
@@ -898,6 +1068,182 @@
            }
        }
    }
    public BigDecimal getDeductAmount(List<PayDetailRequest> requestList){
        List<MemberCoupon> memberCouponList = new ArrayList<>();
        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(com.github.xiaoymin.knife4j.core.util.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)){
            return BigDecimal.ZERO;
        }
        //获取选择的商品总金额 ä¸Ž å•个商品金额
        BigDecimal deductAmount = BigDecimal.ZERO;
        for (Goods goods:goodsList) {
            List<PayDetailRequest> request = requestList.stream().filter(i->Constants.equalsInteger(i.getGoodsSkuId(), goods.getSkuId())).collect(Collectors.toList());
            if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(request)){
                goods.setSkuAmount(goods.getSkuPrice().multiply(new BigDecimal(request.get(Constants.ZERO).getGoodsNum()+"")));
                deductAmount = deductAmount.add(goods.getSkuAmount().multiply(goods.getDeductRata()));
            }
        }
        return deductAmount;
    }
    /**
     * è®¢å•确认接口
     * @param receiveType 0=快递配送 1=自提
     * @param requestList
     * @param addressId
     * @param memberCouponService
     * @param memberId
     */
    public OrderPayConfirmResponse orderPayConfirm(Integer receiveType,List<PayDetailRequest> requestList,Integer addressId,
                                MemberCouponServiceImpl memberCouponService,Integer memberId){
        OrderPayConfirmResponse orderPayConfirmResponse = new OrderPayConfirmResponse();
        List<Goods> goodsList = goodsMapper.selectJoinList(Goods.class,
                new MPJLambdaWrapper<Goods>()
                        .selectAs(GoodsSku::getPrice,Goods::getSkuPrice)
                        .selectAs(GoodsSku::getId,Goods::getSkuId)
                        .selectAs(GoodsSku::getIntegralRate,Goods::getDeductRata)
                        .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())));
        if(CollectionUtils.isEmpty(goodsList)){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"未匹配到商品信息");
        }
        List<OrderGoodsCalculateResponse> goodsCalculateList = ListUtil.copyProperties(goodsList,OrderGoodsCalculateResponse::new);
        //订单总金额
        BigDecimal amount = BigDecimal.ZERO;
        //优惠券抵扣金额
        BigDecimal couponAmount = BigDecimal.ZERO;
        //积分抵扣金额
        BigDecimal integralAmount = BigDecimal.ZERO;
        //抵扣积分值
        BigDecimal deductIntegral = BigDecimal.ZERO;
        //邮费金额
        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);
                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();
        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());
            }
        }
        //邮费金额
        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)
        );
        return orderPayConfirmResponse;
    }
    /**
     *
     * @param goodsCalculateList å•†å“é›†åˆ
     * @param totalIntegral ç”¨æˆ·æ€»ç§¯åˆ†
     */
    public void  calculateIntegralRata(List<OrderGoodsCalculateResponse> goodsCalculateList,BigDecimal totalIntegral){
        //当前选择商品最大可用积分抵扣的金额
        BigDecimal maxDeductionCash =  goodsCalculateList.stream().map(i->i.getSkuAmount().subtract(i.getCouponDeductCash())
                .multiply(i.getDeductRata())).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;
        //如果实际积分少于最大需要积分 éœ€è¦è®¡ç®—比例占比 åŽ»å¯¹åº”æ·»åŠ è‡³å¯¹åº”çš„å•†å“é‡Œ
        if(totalIntegral.compareTo(maxDeductionIntegral)<=Constants.ZERO) {
            deductionRata = totalIntegral.divide(maxDeductionIntegral, 2, BigDecimal.ROUND_HALF_UP);
        }
        //获取总的抵扣金额 ä¸Ž æ¯ä¸ªå•†å“å¯æŠµæ‰£é‡‘额
        //已用占比比例值
        BigDecimal rata = BigDecimal.ZERO;
        //剩余可分配金额
        BigDecimal surplusValidAmount = maxDeductionCash;
        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());
            }
            //如果用户积分大于本次需要使用的最大积分 åˆ™ç›´æŽ¥ä½¿ç”¨å¦åˆ™éœ€è¦é‡æ–°è®¡ç®—
            goodsCalculateList.get(j).setIntegralDeductCash(goodsCalculateList.get(j).getIntegralMaxDeductCash().multiply(deductionRata));
            goodsCalculateList.get(j).setIntegralDeduct(goodsCalculateList.get(j).getIntegralMaxDeductCash().multiply(cashToIntegralRata).multiply(deductionRata));
        }
    }
    /**
@@ -1175,4 +1521,5 @@
    }
}
server/dmmall_service/src/main/java/com/doumee/service/business/impl/MemberCouponServiceImpl.java
@@ -7,31 +7,31 @@
import com.doumee.core.model.PageWrap;
import com.doumee.core.utils.Constants;
import com.doumee.core.utils.DateUtil;
import com.doumee.core.utils.ListUtil;
import com.doumee.core.utils.Utils;
import com.doumee.dao.business.CouponMapper;
import com.doumee.dao.business.MemberCouponJoinMapper;
import com.doumee.dao.business.MemberCouponMapper;
import com.doumee.dao.business.MemberMapper;
import com.doumee.dao.business.*;
import com.doumee.dao.business.model.*;
import com.doumee.dao.web.dto.CouponDTO;
import com.doumee.dao.web.dto.MemberCouponDTO;
import com.doumee.dao.web.request.PayDetailRequest;
import com.doumee.dao.web.response.goods.OrderGoodsCalculateResponse;
import com.doumee.service.business.MemberCouponService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.xiaoymin.knife4j.core.util.CollectionUtils;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.SecurityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.*;
import java.util.stream.Collectors;
/**
 * ç”¨æˆ·ä¼˜æƒ åˆ¸å…³è”表Service实现
@@ -43,6 +43,12 @@
    @Autowired
    private MemberCouponMapper memberCouponMapper;
    @Autowired
    private GoodsMapper goodsMapper;
    @Autowired
    private GoodsSkuMapper goodsSkuMapper;
    @Autowired
    private MemberCouponJoinMapper memberCouponJoinMapper;
@@ -209,6 +215,10 @@
        return page;
    }
    /**
     * ä¼˜æƒ åˆ¸æ•°é‡
     * @param price
@@ -220,7 +230,6 @@
    public long memberCouponNum( BigDecimal price, Integer memberId,Integer couponType) {
        long count = memberCouponMapper.selectCount(new QueryWrapper<MemberCoupon>()
                .eq("MEMBER_ID",memberId)
                .eq("TYPE",Constants.ONE)
                .eq("STATUS",Constants.ZERO)
                .eq("TYPE",couponType)
                .apply("LIMIT_PRICE >= "+price+" ")
@@ -317,4 +326,152 @@
    }
    /**
     * æ ¹æ®å•†å“ä¿¡æ¯èŽ·å–é€‚ç”¨çš„ä¼˜æƒ åˆ¸
     */
    @Override
    public List<MemberCoupon> getApplyCoupon(List<PayDetailRequest> requestList,Integer memberId){
        List<MemberCoupon> memberCouponList = new ArrayList<>();
        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)){
            return memberCouponList;
        }
        //获取选择的商品总金额 ä¸Ž å•个商品金额
        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);
        //获取所有满足金额且可用的优惠券
        List<MemberCoupon> allCoupon =  memberCouponMapper.selectList(new QueryWrapper<MemberCoupon>().lambda()
                        .eq(MemberCoupon::getIsdeleted,Constants.ZERO)
                        .eq(MemberCoupon::getStatus,Constants.ZERO)
                        .apply("  LIMIT_PRICE <= " + totalAmount)
                        .apply("  now() between START_DATE and  END_DATE "));
        if(CollectionUtils.isNotEmpty(allCoupon)){
            for (MemberCoupon memberCoupon:allCoupon) {
                //适用类型: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);
                         memberCouponList.add(memberCoupon);
                     }
                 }
            }
        }
        // ä½¿ç”¨ Stream æŽ’序  reversed() è¡¨ç¤ºå€’序
        memberCouponList = memberCouponList.stream().sorted(Comparator.comparing(MemberCoupon::getValidAmount,Comparator.nullsFirst(BigDecimal::compareTo)).reversed())
                .collect(Collectors.toList());
        return memberCouponList;
    }
    /**
     * è®¡ç®—当前已选择优惠券每个商品占比金额
     * @param coupon ä¼˜æƒ åˆ¸ä¿¡æ¯
     * @param goodsCalculateList å•†å“é›†åˆ
     * @param totalAmount è®¢å•总金额
     */
    public void  calculateCouponRata(MemberCoupon coupon,List<OrderGoodsCalculateResponse> goodsCalculateList,BigDecimal totalAmount){
        //总余额
        BigDecimal validAmount = coupon.getValidAmount();
        //剩余可分配金额
        BigDecimal surplusValidAmount = validAmount;
        //已用占比比例值
        BigDecimal rata = BigDecimal.ZERO;
        //根据优惠券类型 è®¡ç®—可以使用优惠券的商品信息 é€‚用类型:0=全场;1=品类;2=指定商品
        if(!Constants.equalsInteger(coupon.getApplyType(),Constants.ZERO)){
            List<String> applyIdList = Arrays.asList(coupon.getApplyIds().split(","));
            isVaildUse(applyIdList,goodsCalculateList,
                    Constants.equalsInteger(coupon.getApplyType(),Constants.ONE)?Constants.ONE:Constants.ZERO);
        }
        //使用了优惠券的商品数量
        Integer countCouponNum = goodsCalculateList.stream().filter(i->i.getUseCoupon()).collect(Collectors.toList()).size();
        Integer useCouponNum = Constants.ZERO;
        for (int i = 0; i < goodsCalculateList.size(); i++) {
            if(!goodsCalculateList.get(i).getUseCoupon()){
                goodsCalculateList.get(i).setCouponDeductCash(BigDecimal.ZERO);
                continue;
            }
            if(Constants.equalsInteger(useCouponNum+1,countCouponNum)){
                goodsCalculateList.get(i).setOrderCouponRata(new BigDecimal("1").subtract(rata));
                goodsCalculateList.get(i).setCouponDeductCash(surplusValidAmount);
                break;
            }
            goodsCalculateList.get(i).setOrderCouponRata(goodsCalculateList.get(i).getSkuAmount().divide(totalAmount,2,BigDecimal.ROUND_DOWN));
            goodsCalculateList.get(i).setCouponDeductCash(validAmount.multiply(goodsCalculateList.get(i).getOrderCouponRata()));
            surplusValidAmount = surplusValidAmount.subtract(goodsCalculateList.get(i).getCouponDeductCash());
            rata = rata.add(goodsCalculateList.get(i).getOrderCouponRata());
            useCouponNum = useCouponNum + 1;
        }
    }
    /**
     * åˆ¤æ–­æ˜¯å¦å¯ä»¥æœ‰æ•ˆä½¿ç”¨
     * @param idList
     * @param goodsList
     * @param vaildType 0=商品;1=品类
     * @return
     */
    public void isVaildUse(List<String> idList,List<OrderGoodsCalculateResponse> goodsList,Integer vaildType){
        for (OrderGoodsCalculateResponse response:goodsList) {
            response.setUseCoupon(idList.contains(Constants.equalsInteger(vaildType,Constants.ZERO)?response.getId().toString():response.getCategoryId().toString())?true:false);
        }
    }
//    public Set<Integer> isVaildUse(List<String> idList,List<OrderGoodsCalculateResponse> goodsList,Integer vaildType){
//        List<OrderGoodsCalculateResponse> resultList = new ArrayList<>();
//        for (String id:idList) {
//            if(Constants.equalsInteger(vaildType,Constants.ZERO)){
//                resultList.addAll(goodsList.stream().filter(i->i.getId().toString().equals(id)).collect(Collectors.toList()));
//            }else{
//                resultList.addAll(goodsList.stream().filter(i->i.getCategoryId().toString().equals(id)).collect(Collectors.toList()));
//            }
//        }
//        if(CollectionUtils.isNotEmpty(resultList)){
//            return new HashSet<>(resultList.stream().map(i->i.getId()).collect(Collectors.toList()));
//        }
//        return new HashSet<>();
//    }
}
server/dmmall_service/src/main/java/com/doumee/service/business/impl/ShopcartServiceImpl.java
@@ -181,6 +181,19 @@
        return page;
    }
    /**
     * è´­ç‰©è½¦å•†å“æ•°é‡
     * @param memberId
     * @return
     */
    @Override
    public Integer cartGoodsTypeNum(Integer memberId) {
        return shopcartMapper.selectList(new QueryWrapper<Shopcart>().lambda()
                .eq(Shopcart::getMemberId,memberId)
                .eq(Shopcart::getIsdeleted,Constants.ZERO)
        ).size();
    }
    /**
     * æ›´æ–°è´­ç‰©è½¦æ•°é‡
server/dmmall_service/src/main/resources/application-dev.yml
@@ -50,7 +50,7 @@
wx:
  pay:
    appId: wxcd2b89fd2ff065f8
    appSecret: 1ceb7c9dff3c4330d653adc3ca55ea24
    appSecret: 3462fa186da7cb06c544df8d8664b63a
    mchId: 1229817002
    mchKey: u4TSNtv0wFP7WRfnxBgijYOtRhS9FvlM
    notifyUrl: https://dmtest.ahapp.net/dmmall_interface/web/api/wxPayNotify
server/dmmall_web/src/main/java/com/doumee/api/web/ApiController.java
@@ -56,6 +56,10 @@
    public GoodsorderService goodsorderService;
    @Autowired
    public ShopService shopService;
    @Autowired
    public GoodsorderDetailService goodsorderDetailService;
    @Autowired
@@ -74,8 +78,6 @@
    @Autowired
    public ArticleService articleService;
    @Autowired
    public ShopService shopService;
    @Autowired
    public ShopNewsService shopNewsService;
server/dmmall_web/src/main/java/com/doumee/api/web/mall/OrderApi.java
@@ -11,9 +11,12 @@
import com.doumee.core.wx.SendWxMessage;
import com.doumee.dao.business.model.Goodsorder;
import com.doumee.dao.business.model.Member;
import com.doumee.dao.business.model.MemberCoupon;
import com.doumee.dao.business.model.Shop;
import com.doumee.dao.web.dto.CouponDTO;
import com.doumee.dao.web.request.OrderPayRequest;
import com.doumee.dao.web.request.PageRequest;
import com.doumee.dao.web.request.PayDetailRequest;
import com.doumee.dao.web.request.goods.DealOrderRequest;
import com.doumee.dao.web.request.goods.MemberOrderRequest;
import com.doumee.dao.web.request.goods.OrderCommentRequest;
@@ -32,6 +35,7 @@
import javax.validation.Valid;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
/**
 * Created by IntelliJ IDEA.
@@ -89,18 +93,40 @@
        return ApiResponse.success("查询成功",page);
    }
//    @LoginRequired
//    @ApiOperation("可用优惠券数量")
//    @GetMapping("/memberCouponNum")
//    @ApiImplicitParams({
//            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "用户token值", required = true),
//            @ApiImplicitParam(paramType = "query", dataType = "Integer", name = "couponType", value = "优惠券类别", required = true),
//            @ApiImplicitParam(paramType = "query", dataType = "Integer", name = "limitPrice", value = "满额", required = true)
//    })
//    public ApiResponse<Integer> memberCouponNum(Integer couponType, BigDecimal limitPrice) {
//        return ApiResponse.success("查询成功", memberCouponService.memberCouponNum(limitPrice,getMemberId(),couponType));
//    }
    @LoginRequired
    @ApiOperation("可用优惠券数量")
    @GetMapping("/memberCouponNum")
    @ApiOperation("可用优惠券信息")
    @PostMapping("/getApplyCoupon")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "用户token值", required = true),
            @ApiImplicitParam(paramType = "query", dataType = "Integer", name = "couponType", value = "优惠券类别", required = true),
            @ApiImplicitParam(paramType = "query", dataType = "Integer", name = "limitPrice", value = "满额", required = true)
    })
    public ApiResponse<Long> memberCouponNum(Integer couponType, BigDecimal limitPrice) {
        return ApiResponse.success("查询成功", memberCouponService.memberCouponNum(limitPrice,getMemberId(),couponType));
    public ApiResponse<List<MemberCoupon>> getApplyCoupon(@RequestBody List<PayDetailRequest> requestList) {
        return ApiResponse.success("查询成功", memberCouponService.getApplyCoupon(requestList,getMemberId()));
    }
    @LoginRequired
    @ApiOperation("经销商列表")
    @PostMapping("/shopPage")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "用户token值", required = true),
    })
    public ApiResponse<IPage<Shop>> shopPage(@RequestBody PageWrap<Shop> pageWrap) {
        IPage<Shop> page = goodsorderService.getShopPage(pageWrap);
        return ApiResponse.success("查询成功",page);
    }
    @LoginRequired
    @ApiOperation("订单支付")
server/dmmall_web/src/main/java/com/doumee/api/web/mall/ShopCartApi.java
@@ -48,6 +48,17 @@
    }
    @LoginRequired
    @ApiOperation("购物车列表")
    @GetMapping("/cartGoodsTypeNum")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "用户token值", required = true)
    })
    public ApiResponse<Integer> cartGoodsTypeNum() {
        return ApiResponse.success("查询成功",shopcartService.cartGoodsTypeNum(getMemberId()));
    }
    @LoginRequired
    @ApiOperation("批量删除")
    @GetMapping("/deleteBatch")
    @ApiImplicitParams({