|
@@ -9,11 +9,17 @@ import com.kmall.admin.dto.OrderExpressDto;
|
|
|
import com.kmall.admin.dto.OrderRecognitionDto;
|
|
|
import com.kmall.admin.entity.*;
|
|
|
import com.kmall.admin.entity.OrderProcessRecordEntity;
|
|
|
+import com.kmall.admin.entity.mk.store.MkStoreCampMinusEntity;
|
|
|
+import com.kmall.admin.entity.mk.store.MkStoreCampMinusLevelEntity;
|
|
|
import com.kmall.admin.entity.mk.store.MkStorePromOrderRealEntity;
|
|
|
+import com.kmall.admin.entity.mk.store.MkStoreTicketDiscountEntity;
|
|
|
import com.kmall.admin.fromcomm.dao.SysConfigDao;
|
|
|
import com.kmall.admin.service.*;
|
|
|
+import com.kmall.admin.service.mk.store.MkStoreCampMinusService;
|
|
|
+import com.kmall.admin.service.mk.store.MkStoreTicketDiscountService;
|
|
|
import com.kmall.admin.websocket.WebSocketServer;
|
|
|
import com.kmall.api.entity.*;
|
|
|
+import com.kmall.api.entity.mk.MkStoreTicketDiscountVo;
|
|
|
import com.kmall.common.utils.ResponseData;
|
|
|
import com.kmall.common.utils.wechat.WechatMicropayApiResult;
|
|
|
import com.kmall.common.utils.wechat.WechatReverseApiResult;
|
|
@@ -46,6 +52,7 @@ import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
import java.io.IOException;
|
|
|
import java.math.BigDecimal;
|
|
|
+import java.math.RoundingMode;
|
|
|
import java.text.ParseException;
|
|
|
import java.text.SimpleDateFormat;
|
|
|
import java.util.*;
|
|
@@ -106,6 +113,11 @@ public class OrderServiceImpl implements OrderService {
|
|
|
private StoreService storeService;
|
|
|
@Autowired
|
|
|
private PickUpCodeService pickUpCodeService;
|
|
|
+ @Autowired
|
|
|
+ private MkStoreCampMinusService mkStoreCampMinusService;
|
|
|
+ @Autowired
|
|
|
+ private MkStoreTicketDiscountService mkStoreTicketDiscountService;
|
|
|
+
|
|
|
|
|
|
|
|
|
|
|
@@ -1666,11 +1678,87 @@ public class OrderServiceImpl implements OrderService {
|
|
|
userDao.save(userEntity);
|
|
|
}
|
|
|
|
|
|
+ // TODO 生成订单之前,先查询是否有优惠券或者满减
|
|
|
+ // TODO 20200610 要修改成全部商品
|
|
|
+ // 优惠券的集合
|
|
|
+ List<MkStoreTicketDiscountEntity> mkStoreTicketDiscountEntities = new ArrayList<>();
|
|
|
+ // 满减的集合
|
|
|
+ List<MkStoreCampMinusLevelEntity> mkStoreCampMinusEntities = new ArrayList<>();
|
|
|
+ // 存商品跟金额的关系
|
|
|
+ Map<Long,BigDecimal> moneyMap = new HashMap<>();
|
|
|
+ // 商品总价
|
|
|
+ BigDecimal totalPrice = new BigDecimal(0);
|
|
|
+
|
|
|
+ for(GoodsEntity goodsEntity : goodsEntities){
|
|
|
+ Long goodsId = goodsEntity.getId();
|
|
|
+ // 计算该商品的价格
|
|
|
+ BigDecimal goodsPrice = goodsEntity.getStoreRetailPrice().multiply(new BigDecimal(goodsEntity.getGoodsNumber())).setScale(2, RoundingMode.HALF_UP);
|
|
|
+ moneyMap.put(goodsId,goodsPrice);
|
|
|
+ totalPrice = totalPrice.add(goodsPrice);
|
|
|
+ // 查询该商品id是否有优惠券
|
|
|
+ List<MkStoreTicketDiscountEntity> mkStoreTicketDiscountEntity = mkStoreTicketDiscountService.queryByGoodsId(goodsId);
|
|
|
+ if(mkStoreTicketDiscountEntity != null) {
|
|
|
+ mkStoreTicketDiscountEntities.addAll(mkStoreTicketDiscountEntity);
|
|
|
+ }
|
|
|
+ // 查询该商品id是否有满减
|
|
|
+ List<MkStoreCampMinusLevelEntity> mkStoreCampMinusEntity = mkStoreCampMinusService.queryByGoodsId(goodsId);
|
|
|
+ if(mkStoreCampMinusEntity != null) {
|
|
|
+ mkStoreCampMinusEntities.addAll(mkStoreCampMinusEntity);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 满减优惠的金额
|
|
|
+ BigDecimal campDisCountAmount = new BigDecimal(0);
|
|
|
+ if(mkStoreCampMinusEntities.size() > 0){
|
|
|
+ // 上一次所需金额,用于取最大的优惠力度
|
|
|
+ BigDecimal lastAmount = new BigDecimal(0);
|
|
|
+ for (int i = 0 ; i < mkStoreCampMinusEntities.size() ; i++){
|
|
|
+ MkStoreCampMinusLevelEntity mkStoreCampMinusLevelEntity = mkStoreCampMinusEntities.get(i);
|
|
|
+ // TODO 20200610还有满多少件,跟满多少元打折的,逻辑复杂,下次开发
|
|
|
+ BigDecimal discCond = mkStoreCampMinusLevelEntity.getYuanMinusCond();
|
|
|
+ // 判断这次金额是否大于上次金额,如果不大于,直接continue
|
|
|
+ if(discCond.compareTo(lastAmount) > 0){
|
|
|
+ // 如果总金额大于所需金额,则可以使用该优惠券,记录该优惠券的角标,金额跟优惠的钱
|
|
|
+ if(totalPrice.compareTo(discCond) > 0){
|
|
|
+ // 记录上一次金额
|
|
|
+ lastAmount = discCond;
|
|
|
+ campDisCountAmount = mkStoreCampMinusLevelEntity.getYuanMinusPref();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 优惠券优惠的金额
|
|
|
+ BigDecimal ticketDisCountAmount = new BigDecimal(0);
|
|
|
+ if(mkStoreTicketDiscountEntities.size() > 0){
|
|
|
+ // 上一次所需金额,用于取最大的优惠力度
|
|
|
+ BigDecimal lastAmount = new BigDecimal(0);
|
|
|
+ for (int i = 0 ; i < mkStoreTicketDiscountEntities.size() ; i++){
|
|
|
+ MkStoreTicketDiscountEntity mkStoreTicketDiscountEntity = mkStoreTicketDiscountEntities.get(i);
|
|
|
+ // 代金券所需金额
|
|
|
+ // TODO 20200610还有折扣券的,逻辑较为复杂,下次在开发
|
|
|
+ BigDecimal discCond = mkStoreTicketDiscountEntity.getVoucherCond();
|
|
|
+
|
|
|
+ // 判断这次金额是否大于上次金额,如果不大于,直接continue
|
|
|
+ if(discCond.compareTo(lastAmount) > 0){
|
|
|
+ // 如果总金额大于所需金额,则可以使用该优惠券,记录该优惠券的角标,金额跟优惠的钱
|
|
|
+ if(totalPrice.compareTo(discCond) > 0){
|
|
|
+ // 记录上一次金额
|
|
|
+ lastAmount = discCond;
|
|
|
+ ticketDisCountAmount = mkStoreTicketDiscountEntity.getVoucherMoney();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 判断两个优惠金额
|
|
|
+ BigDecimal disCountAmount = ticketDisCountAmount.compareTo(campDisCountAmount) > 0 ? ticketDisCountAmount : campDisCountAmount;
|
|
|
+
|
|
|
|
|
|
|
|
|
// 生成订单
|
|
|
String merchOrderSn = "EMATO" + CommonUtil.generateOrderNumber();
|
|
|
- OrderVo order = setOrderVo(goodsList, userEntity,storeId.longValue(), user.getMerchSn());
|
|
|
+ OrderVo order = setOrderVo(goodsList, userEntity,storeId.longValue(), user.getMerchSn(),disCountAmount);
|
|
|
order.setStore_id(storeId.longValue());
|
|
|
order.setMerchOrderSn(merchOrderSn);
|
|
|
|
|
@@ -1981,7 +2069,7 @@ public class OrderServiceImpl implements OrderService {
|
|
|
* 设置订单数据
|
|
|
* @return
|
|
|
*/
|
|
|
- public OrderVo setOrderVo(List<LinkedHashMap> goodsList, UserEntity loginUser,Long storeId, String merchSn){
|
|
|
+ public OrderVo setOrderVo(List<LinkedHashMap> goodsList, UserEntity loginUser,Long storeId, String merchSn, BigDecimal disCountAmount){
|
|
|
OrderVo orderInfo = new OrderVo();
|
|
|
|
|
|
BigDecimal goodsTotalPrice = new BigDecimal(0.00);
|
|
@@ -1992,11 +2080,10 @@ public class OrderServiceImpl implements OrderService {
|
|
|
.add(new BigDecimal(goods.get("retailPrice").toString()).multiply(new BigDecimal(goods.get("sellVolume").toString())));
|
|
|
}
|
|
|
|
|
|
-
|
|
|
//订单价格计算:订单的总价+运费
|
|
|
BigDecimal orderTotalPrice = goodsTotalPrice.add(new BigDecimal(0));
|
|
|
BigDecimal fullCutCouponDec = Constant.ZERO;
|
|
|
- BigDecimal couponPrice = new BigDecimal(0.00);
|
|
|
+ BigDecimal couponPrice = disCountAmount;
|
|
|
BigDecimal actualPrice = orderTotalPrice.subtract(couponPrice);
|
|
|
|
|
|
String orderSn = "CW" + CommonUtil.generateOrderNumber();
|