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({