From a1a6e227628810259fcba0fff146792e97a80b8a Mon Sep 17 00:00:00 2001
From: rk <94314517@qq.com>
Date: 星期一, 15 十二月 2025 08:56:09 +0800
Subject: [PATCH] 订单业务开发
---
server/dmmall_service/src/main/java/com/doumee/dao/web/response/goods/GoodsInfoResponse.java | 8
server/dmmall_service/src/main/java/com/doumee/service/business/MemberCouponService.java | 9
server/dmmall_service/src/main/java/com/doumee/service/business/ShopcartService.java | 6
server/dmmall_web/src/main/java/com/doumee/api/web/mall/ShopCartApi.java | 11
server/dmmall_service/src/main/java/com/doumee/dao/web/response/goods/OrderPayConfirmResponse.java | 51 ++
server/dmmall_web/src/main/java/com/doumee/api/web/ApiController.java | 6
server/dmmall_service/src/main/java/com/doumee/dao/business/model/GoodsorderDetail.java | 16
server/dmmall_service/src/main/resources/application-dev.yml | 2
server/dmmall_service/src/main/java/com/doumee/service/business/impl/GoodsServiceImpl.java | 78 ++-
server/dmmall_service/src/main/java/com/doumee/core/utils/ListUtil.java | 39 +
server/dmmall_service/src/main/java/com/doumee/service/business/impl/ShopcartServiceImpl.java | 13
server/dmmall_service/src/main/java/com/doumee/dao/business/model/Goods.java | 8
server/dmmall_service/src/main/java/com/doumee/core/utils/Constants.java | 72 +++
server/dmmall_service/src/main/java/com/doumee/dao/business/model/MemberCoupon.java | 16
server/dmmall_service/src/main/java/com/doumee/dao/web/request/goods/GoodsRequest.java | 13
server/dmmall_service/src/main/java/com/doumee/dao/business/GoodsMapper.java | 10
server/dmmall_service/src/main/java/com/doumee/dao/business/model/Goodsorder.java | 19
server/dmmall_service/src/main/java/com/doumee/dao/business/model/Shop.java | 4
server/dmmall_service/src/main/java/com/doumee/service/business/GoodsorderService.java | 6
server/dmmall_service/src/main/java/com/doumee/dao/business/model/Integral.java | 16
server/dmmall_service/src/main/java/com/doumee/dao/web/request/ShopOrderPayRequest.java | 43 ++
server/dmmall_service/src/main/java/com/doumee/dao/web/response/goods/OrderGoodsCalculateResponse.java | 90 ++++
server/dmmall_service/src/main/java/com/doumee/service/business/impl/GoodsorderServiceImpl.java | 367 +++++++++++++++++
server/dmmall_service/src/main/java/com/doumee/service/business/impl/MemberCouponServiceImpl.java | 175 ++++++++
server/dmmall_service/src/main/java/com/doumee/dao/business/model/Member.java | 3
server/dmmall_service/src/main/java/com/doumee/dao/web/request/OrderPayRequest.java | 1
server/dmmall_service/src/main/java/com/doumee/dao/web/response/PayDetailResponse.java | 37 +
server/dmmall_service/src/main/java/com/doumee/core/utils/DateUtil.java | 2
server/dmmall_service/src/main/java/com/doumee/dao/web/request/PayDetailRequest.java | 2
server/dmmall_web/src/main/java/com/doumee/api/web/mall/OrderApi.java | 38 +
30 files changed, 1,097 insertions(+), 64 deletions(-)
diff --git a/server/dmmall_service/src/main/java/com/doumee/core/utils/Constants.java b/server/dmmall_service/src/main/java/com/doumee/core/utils/Constants.java
index a82cd73..dc88877 100644
--- a/server/dmmall_service/src/main/java/com/doumee/core/utils/Constants.java
+++ b/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"; //绉垎-鐜伴噾鍏戞崲姣斾緥锛圶XX绉垎鎶垫墸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;
+ }
+ }
+
+
+
}
diff --git a/server/dmmall_service/src/main/java/com/doumee/core/utils/DateUtil.java b/server/dmmall_service/src/main/java/com/doumee/core/utils/DateUtil.java
index fba742f..b1520c5 100644
--- a/server/dmmall_service/src/main/java/com/doumee/core/utils/DateUtil.java
+++ b/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);
}
diff --git a/server/dmmall_service/src/main/java/com/doumee/core/utils/ListUtil.java b/server/dmmall_service/src/main/java/com/doumee/core/utils/ListUtil.java
new file mode 100644
index 0000000..877cc22
--- /dev/null
+++ b/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());
+ }
+
+}
diff --git a/server/dmmall_service/src/main/java/com/doumee/dao/business/GoodsMapper.java b/server/dmmall_service/src/main/java/com/doumee/dao/business/GoodsMapper.java
index 88a240d..2a54f92 100644
--- a/server/dmmall_service/src/main/java/com/doumee/dao/business/GoodsMapper.java
+++ b/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);
diff --git a/server/dmmall_service/src/main/java/com/doumee/dao/business/model/Goods.java b/server/dmmall_service/src/main/java/com/doumee/dao/business/model/Goods.java
index a8e80dc..a77be1d 100644
--- a/server/dmmall_service/src/main/java/com/doumee/dao/business/model/Goods.java
+++ b/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;
diff --git a/server/dmmall_service/src/main/java/com/doumee/dao/business/model/Goodsorder.java b/server/dmmall_service/src/main/java/com/doumee/dao/business/model/Goodsorder.java
index 0695672..d7f80f7 100644
--- a/server/dmmall_service/src/main/java/com/doumee/dao/business/model/Goodsorder.java
+++ b/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锛歩d", example = "1")
+ private Integer pickUpShopId;
+
+ @ApiModelProperty(value = "鍒嗛攢鍟嗛摵涓婚敭 shop锛歩d", example = "1")
+ private Integer distributionShopId;
@ApiModelProperty(value = "鏂囦欢鍦板潃")
diff --git a/server/dmmall_service/src/main/java/com/doumee/dao/business/model/GoodsorderDetail.java b/server/dmmall_service/src/main/java/com/doumee/dao/business/model/GoodsorderDetail.java
index 172f0a2..3e449da 100644
--- a/server/dmmall_service/src/main/java/com/doumee/dao/business/model/GoodsorderDetail.java
+++ b/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 = "浼樻儬鍒告姷鎵i噾棰�", example = "1")
+ private BigDecimal couponDeduct;
+
+ @ApiModelProperty(value = "绉垎鎶垫墸閲戦", example = "1")
+ private BigDecimal integralDeduct;
+
+
+
+
+
@ApiModelProperty(value = "鍟嗗搧鏍囩鍚嶇О")
@TableField(exist = false)
private String lablesName;
diff --git a/server/dmmall_service/src/main/java/com/doumee/dao/business/model/Integral.java b/server/dmmall_service/src/main/java/com/doumee/dao/business/model/Integral.java
index 5a03b7f..6044b72 100644
--- a/server/dmmall_service/src/main/java/com/doumee/dao/business/model/Integral.java
+++ b/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;
+ }
+
}
diff --git a/server/dmmall_service/src/main/java/com/doumee/dao/business/model/Member.java b/server/dmmall_service/src/main/java/com/doumee/dao/business/model/Member.java
index da7431a..a9e72fa 100644
--- a/server/dmmall_service/src/main/java/com/doumee/dao/business/model/Member.java
+++ b/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;
diff --git a/server/dmmall_service/src/main/java/com/doumee/dao/business/model/MemberCoupon.java b/server/dmmall_service/src/main/java/com/doumee/dao/business/model/MemberCoupon.java
index 2e15dea..6727cf6 100644
--- a/server/dmmall_service/src/main/java/com/doumee/dao/business/model/MemberCoupon.java
+++ b/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琛╥d")
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;
}
diff --git a/server/dmmall_service/src/main/java/com/doumee/dao/business/model/Shop.java b/server/dmmall_service/src/main/java/com/doumee/dao/business/model/Shop.java
index 805e067..46168a1 100644
--- a/server/dmmall_service/src/main/java/com/doumee/dao/business/model/Shop.java
+++ b/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)
diff --git a/server/dmmall_service/src/main/java/com/doumee/dao/web/request/OrderPayRequest.java b/server/dmmall_service/src/main/java/com/doumee/dao/web/request/OrderPayRequest.java
index 0a5528c..e066817 100644
--- a/server/dmmall_service/src/main/java/com/doumee/dao/web/request/OrderPayRequest.java
+++ b/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 ;
}
diff --git a/server/dmmall_service/src/main/java/com/doumee/dao/web/request/PayDetailRequest.java b/server/dmmall_service/src/main/java/com/doumee/dao/web/request/PayDetailRequest.java
index 7e3f337..7cb3ab2 100644
--- a/server/dmmall_service/src/main/java/com/doumee/dao/web/request/PayDetailRequest.java
+++ b/server/dmmall_service/src/main/java/com/doumee/dao/web/request/PayDetailRequest.java
@@ -27,5 +27,7 @@
@ApiModelProperty(value = "璐墿杞﹀晢鍝佷富閿�")
private Integer shopCartId;
+ @ApiModelProperty(value = "浼樻儬鍒告姷鎵i噾棰�",hidden = true)
+ private BigDecimal deductAmount;
}
diff --git a/server/dmmall_service/src/main/java/com/doumee/dao/web/request/ShopOrderPayRequest.java b/server/dmmall_service/src/main/java/com/doumee/dao/web/request/ShopOrderPayRequest.java
new file mode 100644
index 0000000..532318d
--- /dev/null
+++ b/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 ;
+
+}
diff --git a/server/dmmall_service/src/main/java/com/doumee/dao/web/request/goods/GoodsRequest.java b/server/dmmall_service/src/main/java/com/doumee/dao/web/request/goods/GoodsRequest.java
index 2a84e2c..f37ed01 100644
--- a/server/dmmall_service/src/main/java/com/doumee/dao/web/request/goods/GoodsRequest.java
+++ b/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;
diff --git a/server/dmmall_service/src/main/java/com/doumee/dao/web/response/PayDetailResponse.java b/server/dmmall_service/src/main/java/com/doumee/dao/web/response/PayDetailResponse.java
new file mode 100644
index 0000000..706864e
--- /dev/null
+++ b/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缁勫悎缂栫爜锛堝叧鑱攇oods_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 = "浼樻儬鍒告姷鎵i噾棰�",hidden = true)
+ private BigDecimal deductAmount;
+
+}
diff --git a/server/dmmall_service/src/main/java/com/doumee/dao/web/response/goods/GoodsInfoResponse.java b/server/dmmall_service/src/main/java/com/doumee/dao/web/response/goods/GoodsInfoResponse.java
index b5eeefd..2d6e375 100644
--- a/server/dmmall_service/src/main/java/com/doumee/dao/web/response/goods/GoodsInfoResponse.java
+++ b/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;
diff --git a/server/dmmall_service/src/main/java/com/doumee/dao/web/response/goods/OrderGoodsCalculateResponse.java b/server/dmmall_service/src/main/java/com/doumee/dao/web/response/goods/OrderGoodsCalculateResponse.java
new file mode 100644
index 0000000..af5acfe
--- /dev/null
+++ b/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 = "鍒嗙被缂栫爜锛堝叧鑱攍abels琛級", example = "1")
+ private Integer categoryId;
+
+ @ApiModelProperty(value = "鍝佺墝缂栫爜锛堝叧鑱攍abels琛級", 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 = "浼樻儬鍒告姷鎵i噾棰�", 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;
+
+
+
+}
diff --git a/server/dmmall_service/src/main/java/com/doumee/dao/web/response/goods/OrderPayConfirmResponse.java b/server/dmmall_service/src/main/java/com/doumee/dao/web/response/goods/OrderPayConfirmResponse.java
new file mode 100644
index 0000000..0cd963c
--- /dev/null
+++ b/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 = "浼樻儬鍒告姷鎵i噾棰�", 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;
+
+
+
+
+}
diff --git a/server/dmmall_service/src/main/java/com/doumee/service/business/GoodsorderService.java b/server/dmmall_service/src/main/java/com/doumee/service/business/GoodsorderService.java
index 767a985..aafeadc 100644
--- a/server/dmmall_service/src/main/java/com/doumee/service/business/GoodsorderService.java
+++ b/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);
+
/**
* 璁㈠崟鑷姩纭
*/
diff --git a/server/dmmall_service/src/main/java/com/doumee/service/business/MemberCouponService.java b/server/dmmall_service/src/main/java/com/doumee/service/business/MemberCouponService.java
index a9c90a0..80e3418 100644
--- a/server/dmmall_service/src/main/java/com/doumee/service/business/MemberCouponService.java
+++ b/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);
+
}
diff --git a/server/dmmall_service/src/main/java/com/doumee/service/business/ShopcartService.java b/server/dmmall_service/src/main/java/com/doumee/service/business/ShopcartService.java
index 5776862..6a4785f 100644
--- a/server/dmmall_service/src/main/java/com/doumee/service/business/ShopcartService.java
+++ b/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);
/**
* 鏇存柊璐墿杞︽暟閲忎俊鎭�
diff --git a/server/dmmall_service/src/main/java/com/doumee/service/business/impl/GoodsServiceImpl.java b/server/dmmall_service/src/main/java/com/doumee/service/business/impl/GoodsServiceImpl.java
index 3559a14..5cf1b0e 100644
--- a/server/dmmall_service/src/main/java/com/doumee/service/business/impl/GoodsServiceImpl.java
+++ b/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())){
- wrapper.orderByAsc("realSaleNum");
- }
+ }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;
}
diff --git a/server/dmmall_service/src/main/java/com/doumee/service/business/impl/GoodsorderServiceImpl.java b/server/dmmall_service/src/main/java/com/doumee/service/business/impl/GoodsorderServiceImpl.java
index ea26131..46ce98d 100644
--- a/server/dmmall_service/src/main/java/com/doumee/service/business/impl/GoodsorderServiceImpl.java
+++ b/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;
/**
* 鍟嗗搧璁㈠崟淇℃伅琛⊿ervice瀹炵幇
@@ -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
@@ -614,7 +643,7 @@
goodsorderMapper.insert(goodsorder);
//鏁版嵁瀛樺偍
BigDecimal total = Constants.formatBigdecimal(goodsorder.getPrice()).add(Constants.formatBigdecimal(goodsorder.getIntegral())).add(Constants.formatBigdecimal(goodsorder.getCouponPrice()));
- BigDecimal rate =Constants.formatBigdecimal(goodsorder.getCouponPrice()) .divide(total,4,BigDecimal.ROUND_HALF_UP);
+ BigDecimal rate =Constants.formatBigdecimal(goodsorder.getCouponPrice()).divide(total,4,BigDecimal.ROUND_HALF_UP);
BigDecimal totalWxMoney = new BigDecimal(0);
BigDecimal totalIntegral = new BigDecimal(0);
for (int i =0;i< goodsOrderDetailList.size();i++) {
@@ -630,7 +659,7 @@
//褰撳墠鏄庣粏瀹為檯浠锋牸
BigDecimal detialTotal = Constants.formatBigdecimal(goodsOrderDetail.getPrice()).multiply(new BigDecimal(Constants.formatIntegerNum(goodsOrderDetail.getGoodsNum())));
//鎶樼畻浼樻儬鍒稿悗鏀粯浠锋牸锛堝寘鍚幇閲戝拰浣欓閮ㄥ垎锛�
- BigDecimal actDetialTotal = detialTotal .subtract(detialTotal.multiply(rate));
+ BigDecimal actDetialTotal = detialTotal.subtract(detialTotal.multiply(rate));
//鎸夌幇閲戝拰绉垎鏀粯姣斾緥锛屾姌绠楁瘡涓槑缁嗙幇閲戝拰绉垎鏀粯鐨勬暟閲�
BigDecimal rate1 = detialTotal .divide(total,4,BigDecimal.ROUND_HALF_UP);
//鍙��鐜伴噾閲戦
@@ -676,6 +705,147 @@
if(goodsorder.getPrice().compareTo(orderPayRequest.getTitlePrice())!=Constants.ZERO){
throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鍟嗗搧浠锋牸鍙戠敓鍙樺寲锛岃鍒锋柊鍚庨噸鏂版敮浠橈紒");
}
+ return this.wxPay(goodsorder,member);
+ }
+
+
+
+ @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(),"璇烽�夋嫨姝g‘鐨勮嚜鎻愰棬搴楋紒");
+ }
+ Shop shop = shopMapper.selectById(orderPayRequest.getShopId());
+ if(Objects.isNull(shop)){
+ throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"璇烽�夋嫨姝g‘鐨勮嚜鎻愰棬搴楋紒");
+ }
+ 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(),"瀛樺湪鍟嗗搧搴撳瓨涓嶈冻锛屾棤娉曚笅鍗曪紒");
+ }
+ //鍟嗗搧搴撳瓨鎵i櫎
+ 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);
}
@@ -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;
+ //浼樻儬鍒告姷鎵i噾棰�
+ 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){
+ //褰撳墠閫夋嫨鍟嗗搧鏈�澶у彲鐢ㄧН鍒嗘姷鎵g殑閲戦
+ 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);
+ }
+ //鑾峰彇鎬荤殑鎶垫墸閲戦 涓� 姣忎釜鍟嗗搧鍙姷鎵i噾棰�
+ //宸茬敤鍗犳瘮姣斾緥鍊�
+ 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 @@
}
+
}
diff --git a/server/dmmall_service/src/main/java/com/doumee/service/business/impl/MemberCouponServiceImpl.java b/server/dmmall_service/src/main/java/com/doumee/service/business/impl/MemberCouponServiceImpl.java
index b5af21e..7b10f17 100644
--- a/server/dmmall_service/src/main/java/com/doumee/service/business/impl/MemberCouponServiceImpl.java
+++ b/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<>();
+// }
+
+
+
+
+
+
}
diff --git a/server/dmmall_service/src/main/java/com/doumee/service/business/impl/ShopcartServiceImpl.java b/server/dmmall_service/src/main/java/com/doumee/service/business/impl/ShopcartServiceImpl.java
index 8f7a8ee..2d2e893 100644
--- a/server/dmmall_service/src/main/java/com/doumee/service/business/impl/ShopcartServiceImpl.java
+++ b/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();
+ }
+
/**
* 鏇存柊璐墿杞︽暟閲�
diff --git a/server/dmmall_service/src/main/resources/application-dev.yml b/server/dmmall_service/src/main/resources/application-dev.yml
index 8520b10..56b6c1b 100644
--- a/server/dmmall_service/src/main/resources/application-dev.yml
+++ b/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
diff --git a/server/dmmall_web/src/main/java/com/doumee/api/web/ApiController.java b/server/dmmall_web/src/main/java/com/doumee/api/web/ApiController.java
index e79f0b0..55b9b10 100644
--- a/server/dmmall_web/src/main/java/com/doumee/api/web/ApiController.java
+++ b/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;
diff --git a/server/dmmall_web/src/main/java/com/doumee/api/web/mall/OrderApi.java b/server/dmmall_web/src/main/java/com/doumee/api/web/mall/OrderApi.java
index 2d43191..a3d0d8e 100644
--- a/server/dmmall_web/src/main/java/com/doumee/api/web/mall/OrderApi.java
+++ b/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("璁㈠崟鏀粯")
diff --git a/server/dmmall_web/src/main/java/com/doumee/api/web/mall/ShopCartApi.java b/server/dmmall_web/src/main/java/com/doumee/api/web/mall/ShopCartApi.java
index d726d7a..77427bd 100644
--- a/server/dmmall_web/src/main/java/com/doumee/api/web/mall/ShopCartApi.java
+++ b/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({
--
Gitblit v1.9.3