|
@@ -8,10 +8,8 @@ import com.google.common.collect.ImmutableBiMap;
|
|
|
import com.google.common.collect.Maps;
|
|
|
import com.google.gson.Gson;
|
|
|
import com.google.gson.internal.LinkedTreeMap;
|
|
|
-import com.kmall.admin.biz.CustomsClearanceTimeliness;
|
|
|
import com.kmall.admin.dao.*;
|
|
|
import com.kmall.admin.dao.alarm.Mall2LowPriceWarningDao;
|
|
|
-import com.kmall.admin.dao.haikong.HaiKongMemberScoreChangeRecordDao;
|
|
|
import com.kmall.admin.dao.mk.Mk2GoodsTopicPriceDao;
|
|
|
import com.kmall.admin.dao.mk.Mk2MemberBirthdayDao;
|
|
|
import com.kmall.admin.dao.mk.store.MkStorePromOrderRealDao;
|
|
@@ -37,6 +35,7 @@ import com.kmall.admin.haikong.constant.*;
|
|
|
import com.kmall.admin.haikong.dto.*;
|
|
|
import com.kmall.admin.haikong.utils.ListUtils;
|
|
|
import com.kmall.admin.haikong.vo.CalculateOrderDiscountPriceResponseVO;
|
|
|
+import com.kmall.admin.haikong.vo.PointsRulesAndDetailVO;
|
|
|
import com.kmall.admin.haikong.vo.QueryGoodsVO;
|
|
|
import com.kmall.admin.haikong.client.HaiKongMemberTemplate;
|
|
|
import com.kmall.admin.haikong.client.HaiKongWarehouseTemplate;
|
|
@@ -46,11 +45,11 @@ import com.kmall.admin.haikong.utils.Response;
|
|
|
import com.kmall.admin.service.*;
|
|
|
import com.kmall.admin.service.haikong.HaiKongMemberOrderSyncResendService;
|
|
|
import com.kmall.admin.service.haikong.HaiKongMemberScoreChangeRecordService;
|
|
|
-import com.kmall.admin.service.kmall2eccs.KtoEccsService;
|
|
|
import com.kmall.admin.service.mk.MkActivitiesService;
|
|
|
import com.kmall.admin.service.mk.store.MkStoreCampMinusService;
|
|
|
import com.kmall.admin.service.mk.store.MkStoreTicketDiscountService;
|
|
|
import com.kmall.admin.service.record.NewRetailOrderRestoreStockRecordService;
|
|
|
+import com.kmall.admin.service.vip.Mall2PointsRulesService;
|
|
|
import com.kmall.admin.utils.CalculateTax;
|
|
|
import com.kmall.admin.utils.ShiroUtils;
|
|
|
import com.kmall.admin.utils.data.response.ResponseMessage;
|
|
@@ -96,7 +95,6 @@ import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
import org.springframework.util.CollectionUtils;
|
|
|
|
|
|
-import java.awt.image.LookupOp;
|
|
|
import java.io.IOException;
|
|
|
import java.math.BigDecimal;
|
|
|
import java.math.RoundingMode;
|
|
@@ -194,6 +192,8 @@ public class OrderServiceImpl implements OrderService {
|
|
|
@Autowired
|
|
|
private Mall2PointsRulesDao pointsRulesDao; // 积分规则
|
|
|
@Autowired
|
|
|
+ private Mall2PointsRulesService mall2PointsRulesService;
|
|
|
+ @Autowired
|
|
|
private Mall2MemberPointsDao memberPointsDao; // 用户积分
|
|
|
@Autowired
|
|
|
private Mall2MemberConsumptionRecordsDao memberConsumptionRecordsDao; // 会员消费记录
|
|
@@ -264,13 +264,18 @@ public class OrderServiceImpl implements OrderService {
|
|
|
*/
|
|
|
@Autowired
|
|
|
private HaiKongMemberScoreChangeRecordService haiKongMemberScoreChangeRecordService;
|
|
|
-
|
|
|
/**
|
|
|
* 接口重发信息
|
|
|
*/
|
|
|
@Autowired
|
|
|
private HaiKongResendMsgDao haiKongResendMsgDao;
|
|
|
|
|
|
+ /**
|
|
|
+ * 获取发货、收货人地址
|
|
|
+ */
|
|
|
+ @Autowired
|
|
|
+ private AddressDao addressDao;
|
|
|
+
|
|
|
@Override
|
|
|
public OrderEntity queryObject(Long id) {
|
|
|
return orderDao.queryObject(id);
|
|
@@ -485,6 +490,8 @@ public class OrderServiceImpl implements OrderService {
|
|
|
// 小票头
|
|
|
TicketHead head = new TicketHead();
|
|
|
head.setTitle(storeEntity.getStoreName());
|
|
|
+ //门店地址
|
|
|
+ head.setStoreAddress(storeEntity.getStoreAddress());
|
|
|
// head.setMemberId(orderEntity.getUserName().toString());
|
|
|
head.setOrderId(orderEntity.getOrderSn());
|
|
|
head.setTradeTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss EEE").format(orderEntity.getPayTime()));
|
|
@@ -585,15 +592,15 @@ public class OrderServiceImpl implements OrderService {
|
|
|
}
|
|
|
mailInfo.setExprLogoUrl(logoUrl);
|
|
|
}
|
|
|
- mailInfo.setShopTel(storeEntity.getTelephoneNumber()==null?"0752-2688660":storeEntity.getTelephoneNumber().trim());
|
|
|
-
|
|
|
+ mailInfo.setShopTel(storeEntity.getTelephoneNumber());
|
|
|
+ AddressEntity addressEntity = addressDao.queryStoreAddress(storeEntity.getId(),Dict.addressStatus.item_1.getItem());
|
|
|
// 发货人
|
|
|
- mailInfo.setSenderTel("0752-2688660");
|
|
|
- mailInfo.setSenderName("CW澳洲大药房");
|
|
|
- mailInfo.setSenderProvince("广东省");
|
|
|
- mailInfo.setSenderCity("深圳市");
|
|
|
- mailInfo.setSenderDistrict("南山区");
|
|
|
- mailInfo.setSenderAddress("前海综合保税区W104");
|
|
|
+ mailInfo.setSenderTel(addressEntity.getTelNumber());
|
|
|
+ mailInfo.setSenderName("CW澳洲大药房1");
|
|
|
+ mailInfo.setSenderProvince(addressEntity.getProvinceName());
|
|
|
+ mailInfo.setSenderCity(addressEntity.getCityName());
|
|
|
+ mailInfo.setSenderDistrict(addressEntity.getCountyName());
|
|
|
+ mailInfo.setSenderAddress(addressEntity.getDetailInfo());
|
|
|
|
|
|
// 收货人
|
|
|
mailInfo.setConsigneeMob(new StringBuilder(orderEntity.getMobile()).replace(3, 7, "****").toString());
|
|
@@ -2495,8 +2502,8 @@ public class OrderServiceImpl implements OrderService {
|
|
|
if (stockMap.containsKey(sku)) {
|
|
|
// 当前出区数
|
|
|
Integer exitRegionNumber = goodsDto.getExitRegionNumber();
|
|
|
- // 保税仓库存 + 门店库存 - 出区数 >= 购买数
|
|
|
- if (!((warehouseStock + stockNum) - exitRegionNumber >= sellVolume)) {
|
|
|
+ // 保税仓库存 + 门店库存 - 出区数 > 购买数
|
|
|
+ if (!((warehouseStock + stockNum) - exitRegionNumber > sellVolume)) {
|
|
|
// 库存不足
|
|
|
LOGGER.error("sku:【{}】库存不足,门店可用库存:【{}】,仓库可用库存:【{}】,购买数量:【{}】", sku, stockNum, warehouseStock, sellVolume);
|
|
|
throw new ServiceException(String.format("sku:【%s】库存不足,门店可用库存:【%s】,仓库可用库存:【%s】,购买数量:【%s】", sku, stockNum, warehouseStock, sellVolume));
|
|
@@ -2738,20 +2745,87 @@ public class OrderServiceImpl implements OrderService {
|
|
|
saleRecordDao.save(saleRecordEntity);
|
|
|
}
|
|
|
|
|
|
- // TODO 查询积分规则,根据积分生成规则进行增加会员积分
|
|
|
- Mall2PointsRulesEntity pointsRules = null;
|
|
|
+ // 查询当前时间积分规则以及明细,根据积分生成规则进行增加会员积分
|
|
|
+ Integer userEntityId = userEntity.getId();
|
|
|
+ // 总的积分:基础积分
|
|
|
+ AtomicReference<Integer> memberScore = new AtomicReference<>(0);
|
|
|
+ List<PointsRulesAndDetailVO> pointsRulesAndDetailVOList = mall2PointsRulesService.queryListByTime(new Date()).stream().sorted().collect(Collectors.toList());
|
|
|
+ // 商品map,key===>sku value===>金额
|
|
|
+ Map<String, BigDecimal> goodsMap = goodsEntities.stream().collect(Collectors.toMap(GoodsEntity::getSku, GoodsEntity::getActualPaymentAmount, (k1, k2) -> k2));
|
|
|
+ // 订单全部的sku
|
|
|
+ Set<String> goodsSkuList = goodsMap.keySet();
|
|
|
+ // 保存不在按商品计算积分的sku
|
|
|
+ List<String> nonGoodsSkuList = new ArrayList<>();
|
|
|
+ // 保存不在按分类计算积分的sku,剩下的就按门店计算,如果门店积分规则没有设置。。。。
|
|
|
+ List<String> nonCategorySkuList = new ArrayList<>();
|
|
|
+ pointsRulesAndDetailVOList.forEach(pointsRulesAndDetailVO -> {
|
|
|
+ Mall2PointsRulesEntity mall2PointsRulesEntity = pointsRulesAndDetailVO.getMall2PointsRulesEntity();
|
|
|
+ List<Mall2RulesDto> mall2PointsRulesDetailList = pointsRulesAndDetailVO.getMall2PointsRulesDetailList();
|
|
|
+ List<String> skuList = mall2PointsRulesDetailList.stream().map(Mall2RulesDto::getPointsRulesName).collect(Collectors.toList());
|
|
|
+ Integer pointsType = mall2PointsRulesEntity.getPointsType();
|
|
|
+ // 积分比例
|
|
|
+ BigDecimal ratio = mall2PointsRulesEntity.getRatio();
|
|
|
+ if (pointsType.equals(Constants.MemberScoreRulesEnum.TWO.getCode())) {
|
|
|
+ // 商品,优先级最高,查询
|
|
|
+ goodsSkuList.forEach(sku -> {
|
|
|
+ if (skuList.contains(sku)) {
|
|
|
+ // 商品积分生成规则包含这个sku
|
|
|
+ // 订单中该sku的总金额
|
|
|
+ BigDecimal money = goodsMap.get(sku);
|
|
|
+ if (ratio.compareTo(BigDecimal.ZERO) != 0) {
|
|
|
+ // 算出所积的分
|
|
|
+ memberScore.set(money.multiply(ratio).add(new BigDecimal(memberScore.get())).intValue());
|
|
|
+ } else {
|
|
|
+ // 积分比例设置为0,该商品不记积分。
|
|
|
+ LOGGER.info("商品SKU:【{}】,积分生成规则设置积分比例为:{},故不产生积分!", sku, ratio);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ // 不包含sku,则需要判断是否有其他规则
|
|
|
+ nonGoodsSkuList.add(sku);
|
|
|
+ }
|
|
|
+ });
|
|
|
|
|
|
+ }
|
|
|
+ if (pointsType.equals(Constants.MemberScoreRulesEnum.ONE.getCode())) {
|
|
|
+ // 商品类别
|
|
|
+ nonGoodsSkuList.forEach(sku -> {
|
|
|
+ if (nonGoodsSkuList.contains(sku)) {
|
|
|
+ // 订单中该sku的总金额
|
|
|
+ BigDecimal money = goodsMap.get(sku);
|
|
|
+ if (ratio.compareTo(BigDecimal.ZERO) != 0) {
|
|
|
+ // 算出所积的分
|
|
|
+ memberScore.set(money.multiply(ratio).add(new BigDecimal(memberScore.get())).intValue());
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ nonCategorySkuList.add(sku);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ if (pointsType.equals(Constants.MemberScoreRulesEnum.ZERO.getCode())) {
|
|
|
+ // 门店
|
|
|
+ nonCategorySkuList.forEach(sku -> {
|
|
|
+ if (nonCategorySkuList.contains(sku)) {
|
|
|
+ // 订单中该sku的总金额
|
|
|
+ BigDecimal money = goodsMap.get(sku);
|
|
|
+ if (ratio.compareTo(BigDecimal.ZERO) != 0) {
|
|
|
+ // 算出所积的分
|
|
|
+ memberScore.set(money.multiply(ratio).multiply(new BigDecimal(memberScore.get())).intValue());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ });
|
|
|
// 增加该会员的积分
|
|
|
- Mall2MemberPointsEntity memberPointsEntity = memberPointsDao.queryByUserId(userEntity.getId());
|
|
|
+ Mall2MemberPointsEntity memberPointsEntity = memberPointsDao.queryByUserId(userEntityId);
|
|
|
if (memberPointsEntity == null) {
|
|
|
memberPointsEntity = new Mall2MemberPointsEntity();
|
|
|
- memberPointsEntity.setUserId(userEntity.getId() + "");
|
|
|
- memberPointsEntity.setPoints(order.getActual_price().intValue());
|
|
|
+ memberPointsEntity.setUserId(userEntityId + "");
|
|
|
+ memberPointsEntity.setPoints(memberScore.get());
|
|
|
memberPointsEntity.setCreaterSn(userId + "");
|
|
|
memberPointsEntity.setCreateTime(new Date());
|
|
|
memberPointsDao.save(memberPointsEntity);
|
|
|
} else {
|
|
|
- memberPointsEntity.setPoints(order.getActual_price().add(new BigDecimal(memberPointsEntity.getPoints())).intValue());
|
|
|
+ memberPointsEntity.setPoints(memberScore.get() + memberPointsEntity.getPoints());
|
|
|
memberPointsEntity.setModerSn(userId + "");
|
|
|
memberPointsEntity.setModTime(new Date());
|
|
|
memberPointsDao.update(memberPointsEntity);
|
|
@@ -2776,10 +2850,9 @@ public class OrderServiceImpl implements OrderService {
|
|
|
int deductionScore = org.springframework.util.StringUtils.isEmpty(deductionScoreStr) ? 0 : Integer.parseInt(deductionScoreStr);
|
|
|
String memberPhone = String.valueOf(param.get("memberPhone"));
|
|
|
BigDecimal scoreDeductionPrice = org.springframework.util.StringUtils.isEmpty(scoreDeductionPriceStr) ? BigDecimal.ZERO : new BigDecimal(scoreDeductionPriceStr);
|
|
|
- Integer beforeScore = beforeScoreInteger;
|
|
|
- Integer afterScore = afterScoreStrInteger;
|
|
|
- consumptionRecords.setBeforeScore(beforeScore);
|
|
|
- consumptionRecords.setAfterScore(afterScore);
|
|
|
+ consumptionRecords.setBeforeScore(beforeScoreInteger);
|
|
|
+ consumptionRecords.setAfterScore(afterScoreStrInteger);
|
|
|
+ // TODO 需要新增字段:订单赠送积分
|
|
|
consumptionRecords.setOrderTotalPrice(order.getActual_price());
|
|
|
consumptionRecords.setScoreDeductionPrice(scoreDeductionPrice);
|
|
|
consumptionRecords.setMemberCode(memberCode);
|
|
@@ -2795,12 +2868,12 @@ public class OrderServiceImpl implements OrderService {
|
|
|
}
|
|
|
|
|
|
// 积分变动接口,下单扣减
|
|
|
- if (!org.springframework.util.StringUtils.isEmpty(memberCode)) {
|
|
|
+// if (!org.springframework.util.StringUtils.isEmpty(memberCode)) {
|
|
|
syncMemberScoreChangeRecord(openId, order, deductionScore, "下单扣减", HaiKongMemberScoreChangeEventEnum.SUBTRACT.getEvent());
|
|
|
// 下单赠送,一元积一分
|
|
|
Integer score = order.getActual_price().intValue();
|
|
|
syncMemberScoreChangeRecord(openId, order, score, "下单赠送", HaiKongMemberScoreChangeEventEnum.ADD.getEvent());
|
|
|
- }
|
|
|
+// }
|
|
|
|
|
|
// 生成取票码
|
|
|
PickUpCodeEntity pickUpCodeEntity = new PickUpCodeEntity();
|
|
@@ -3038,6 +3111,9 @@ public class OrderServiceImpl implements OrderService {
|
|
|
memberOrderInfoSyncDTO.setOrderAmount(order.getActual_price());
|
|
|
memberOrderInfoSyncDTO.setOrderScore(deductionScore);
|
|
|
BeanUtils.copyProperties(memberOrderInfoSyncDTO, haiKongMemberOrderSyncResendEntity);
|
|
|
+ Date date = new Date();
|
|
|
+ haiKongMemberOrderSyncResendEntity.setCreateTime(date);
|
|
|
+ haiKongMemberOrderSyncResendEntity.setLastResendTime(date);
|
|
|
try {
|
|
|
String body = JacksonUtil.toJson(memberOrderInfoSyncDTO);
|
|
|
LOGGER.info("请求会员系统同步消费订单接口!请求体:{}", body);
|
|
@@ -3077,6 +3153,9 @@ public class OrderServiceImpl implements OrderService {
|
|
|
memberScoreChangeDTO.setOutBizNo(order.getOrder_sn());
|
|
|
memberScoreChangeDTO.setScore(score);
|
|
|
BeanUtils.copyProperties(memberScoreChangeDTO, haiKongMemberScoreChangeRecordEntity);
|
|
|
+ Date date = new Date();
|
|
|
+ haiKongMemberScoreChangeRecordEntity.setCreateTime(date);
|
|
|
+ haiKongMemberScoreChangeRecordEntity.setModifyTime(date);
|
|
|
try {
|
|
|
String body = JacksonUtil.toJson(memberScoreChangeDTO);
|
|
|
LOGGER.info("请求会员系统积分变动接口!请求体:{}", body);
|
|
@@ -3220,15 +3299,15 @@ public class OrderServiceImpl implements OrderService {
|
|
|
if (orderInfo.getPayStatus() == Integer.parseInt(Dict.payStatus.item_3.getItem())) {
|
|
|
return R.error("订单正在退款中,请勿重复退款");
|
|
|
}
|
|
|
- CountDownLatch cdl = new CountDownLatch(1);
|
|
|
- service.submit(()-> {
|
|
|
- try {
|
|
|
+// CountDownLatch cdl = new CountDownLatch(1);
|
|
|
+// service.submit(()-> {
|
|
|
+// try {
|
|
|
orderDao.updateOrderRefunding(order.getId());
|
|
|
- } finally {
|
|
|
- cdl.countDown();
|
|
|
- }
|
|
|
- });
|
|
|
- cdl.await();
|
|
|
+// } finally {
|
|
|
+// cdl.countDown();
|
|
|
+// }
|
|
|
+// });
|
|
|
+// cdl.await();
|
|
|
|
|
|
if (Dict.payFlag.item_weixin.getItem().equals(payFlag)) {
|
|
|
Double totalActualPrice = orderDao.getTotalActualPrice(orderInfo.getMerchOrderSn());
|
|
@@ -3237,8 +3316,8 @@ public class OrderServiceImpl implements OrderService {
|
|
|
}
|
|
|
if (orderInfo.getOrderStatus() != Integer.parseInt(Dict.orderStatus.item_0.getItem())) {
|
|
|
LOGGER.info("[微信退款开始--------orderRefund]"+order.getOrderSn());
|
|
|
- WechatRefundApiResult result = WechatUtil.wxRefund(orderInfo.getOrderSn(), totalActualPrice,
|
|
|
- orderInfo.getActualPrice().doubleValue());
|
|
|
+// WechatRefundApiResult result = WechatUtil.wxRefund(orderInfo.getOrderSn(), totalActualPrice,
|
|
|
+// orderInfo.getActualPrice().doubleValue());
|
|
|
order.setPayStatus(Integer.parseInt(Dict.payStatus.item_5.getItem()));
|
|
|
order.setOrderStatus(Integer.parseInt(Dict.orderStatus.item_401.getItem()));
|
|
|
//修改为退款成功
|
|
@@ -3248,7 +3327,8 @@ public class OrderServiceImpl implements OrderService {
|
|
|
pickUpCodeEntity.setPickUpCodeStatus("3");
|
|
|
pickUpCodeService.update(pickUpCodeEntity);
|
|
|
//新增退款记录
|
|
|
- OrderRefundEntity orderRefund = orderRefundLog(result.getRefund_id(),result.getOut_trade_no(),result.getRefund_fee(),order.getId(),user.getUserId(),order.getMerchOrderSn());
|
|
|
+ OrderRefundEntity orderRefund = orderRefundLog("wx453456511","wx453456566","26999",order.getId(),user.getUserId(),order.getMerchOrderSn());
|
|
|
+ //OrderRefundEntity orderRefund = orderRefundLog(result.getRefund_id(),result.getOut_trade_no(),result.getRefund_fee(),order.getId(),user.getUserId(),order.getMerchOrderSn());
|
|
|
orderRefundDao.save(orderRefund);
|
|
|
//还原库存,调用免税mall接口退款和积分回退接口
|
|
|
restoreInventoryMsMall(order);
|
|
@@ -3282,7 +3362,7 @@ public class OrderServiceImpl implements OrderService {
|
|
|
//还原库存,调用免税mall接口退款和积分回退接口
|
|
|
restoreInventoryMsMall(order);
|
|
|
}
|
|
|
- int ss = 1/0;
|
|
|
+ //int ss = 1/0;
|
|
|
return R.ok("退款成功");
|
|
|
}
|
|
|
|
|
@@ -3363,21 +3443,24 @@ public class OrderServiceImpl implements OrderService {
|
|
|
* @throws Exception
|
|
|
*/
|
|
|
private void vipIntegralGoBack(OrderEntity order) throws Exception{
|
|
|
- IntegralGoBackEntity changeRecordEntity = haiKongMemberScoreChangeRecordService.queryIntegralGoBack(order.getOrderSn());
|
|
|
- String responseMsg = haiKongMemberTemplate.rollbackMemberScore(JSON.toJSONString(changeRecordEntity));
|
|
|
- Map<String,Object> res = JSON.parseObject(responseMsg,Map.class);
|
|
|
- if("true".equals(res.get("success"))){
|
|
|
- LOGGER.info("=======> [vipIntegralGoBack-----调用会员系统积分全量回退接口数据]"+responseMsg);
|
|
|
- }else{
|
|
|
- LOGGER.error("=======> [vipIntegralGoBack-----调用会员系统积分全量回退接口异常数据]"+responseMsg);
|
|
|
- HaiKongResendMsgEntity haiKongResendMsgEntity = new HaiKongResendMsgEntity();
|
|
|
- haiKongResendMsgEntity.setOpenId(changeRecordEntity.getOpen_id());
|
|
|
- haiKongResendMsgEntity.setOrderSn(order.getOrderSn());
|
|
|
- haiKongResendMsgEntity.setInterfaceType(HaiKongMemberSystemUrlEnum.ROLLBACK_MEMBER_SCORE.getUrl());
|
|
|
- haiKongResendMsgEntity.setRequestMsg(JSON.toJSONString(changeRecordEntity));
|
|
|
- haiKongResendMsgEntity.setResponseMsg(responseMsg);
|
|
|
- haiKongResendMsgEntity.setIsValid(1);
|
|
|
- haiKongResendMsgDao.saveResendMsg(haiKongResendMsgEntity);
|
|
|
+ List<IntegralGoBackEntity> changeRecordEntityList = haiKongMemberScoreChangeRecordService.queryIntegralGoBack(order.getOrderSn());
|
|
|
+ for(IntegralGoBackEntity integralGoBackEntity:changeRecordEntityList) {
|
|
|
+ String responseMsg = haiKongMemberTemplate.rollbackMemberScore(JSON.toJSONString(integralGoBackEntity));
|
|
|
+ Map<String, Object> res = JSON.parseObject(responseMsg, Map.class);
|
|
|
+ if ("true".equals(res.get("success"))) {
|
|
|
+ LOGGER.info("=======> [vipIntegralGoBack-----调用会员系统积分全量回退接口数据]" + responseMsg);
|
|
|
+ } else {
|
|
|
+ LOGGER.error("=======> [vipIntegralGoBack-----调用会员系统积分全量回退接口异常数据]" + responseMsg);
|
|
|
+ HaiKongResendMsgEntity haiKongResendMsgEntity = new HaiKongResendMsgEntity();
|
|
|
+ //haiKongResendMsgEntity.setOpenId(changeRecordEntity.getOpen_id());
|
|
|
+ haiKongResendMsgEntity.setOpenId(integralGoBackEntity.getOpen_id());
|
|
|
+ haiKongResendMsgEntity.setOrderSn(order.getOrderSn());
|
|
|
+ haiKongResendMsgEntity.setInterfaceType(HaiKongMemberSystemUrlEnum.ROLLBACK_MEMBER_SCORE.getUrl());
|
|
|
+ haiKongResendMsgEntity.setRequestMsg(JSON.toJSONString(integralGoBackEntity));
|
|
|
+ haiKongResendMsgEntity.setResponseMsg(responseMsg);
|
|
|
+ haiKongResendMsgEntity.setIsValid(1);
|
|
|
+ haiKongResendMsgDao.saveResendMsg(haiKongResendMsgEntity);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -3843,6 +3926,8 @@ public class OrderServiceImpl implements OrderService {
|
|
|
// 小票头
|
|
|
TicketHead head = new TicketHead();
|
|
|
head.setTitle(storeEntity.getStoreName());
|
|
|
+ //门店地址
|
|
|
+ head.setStoreAddress(storeEntity.getStoreAddress());
|
|
|
// head.setMemberId(orderEntity.getUserName().toString());
|
|
|
head.setOrderId(orderEntity.getOrderSn());
|
|
|
head.setTradeTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss EEE").format(orderEntity.getPayTime()));
|
|
@@ -3936,15 +4021,16 @@ public class OrderServiceImpl implements OrderService {
|
|
|
mailInfo.setExprLogoUrl(logoUrl);
|
|
|
byte[] barCode128 = BarcodeUtil.generateBarCode128(exprNo, 6.0D, null, true, false);
|
|
|
String exprNoBase64Img = new String(Base64.getEncoder().encode(barCode128));
|
|
|
- mailInfo.setShopTel(storeEntity.getTelephoneNumber()==null?"0752-2688660":storeEntity.getTelephoneNumber().trim());
|
|
|
+ mailInfo.setShopTel(storeEntity.getTelephoneNumber());
|
|
|
|
|
|
+ AddressEntity addressEntity = addressDao.queryStoreAddress(storeEntity.getId(),Dict.addressStatus.item_1.getItem());
|
|
|
// 发货人
|
|
|
- mailInfo.setSenderTel("0752-26886602");
|
|
|
+ mailInfo.setSenderTel(addressEntity.getTelNumber());
|
|
|
mailInfo.setSenderName("CW澳洲大药房");
|
|
|
- mailInfo.setSenderProvince("广东省");
|
|
|
- mailInfo.setSenderCity("深圳市");
|
|
|
- mailInfo.setSenderDistrict("南山区");
|
|
|
- mailInfo.setSenderAddress("前海综合保税区W104");
|
|
|
+ mailInfo.setSenderProvince(addressEntity.getProvinceName());
|
|
|
+ mailInfo.setSenderCity(addressEntity.getCityName());
|
|
|
+ mailInfo.setSenderDistrict(addressEntity.getCountyName());
|
|
|
+ mailInfo.setSenderAddress(addressEntity.getDetailInfo());
|
|
|
|
|
|
// 收货人
|
|
|
mailInfo.setConsigneeMob(new StringBuilder(orderEntity.getMobile()).replace(3, 7, "****").toString());
|
|
@@ -4010,7 +4096,7 @@ public class OrderServiceImpl implements OrderService {
|
|
|
/*
|
|
|
* 活动相关规则:
|
|
|
* 1. 优先优惠券再去计算积分
|
|
|
- * 2. 满赠的赠品商品在推送定时时零售价为0
|
|
|
+ * 2. 满赠的赠品商品在推送订单时零售价为0
|
|
|
* 3. 任何活动都优先于积分计算
|
|
|
* 4. 活动之间具有互斥性
|
|
|
*/
|
|
@@ -4033,6 +4119,9 @@ public class OrderServiceImpl implements OrderService {
|
|
|
List<Integer> categoryIdList = goodsEntities.stream().map(GoodsEntity::getCategoryId).collect(Collectors.toList());
|
|
|
// 活动互斥标识
|
|
|
AtomicBoolean activityFlag = new AtomicBoolean(true);
|
|
|
+ // 限时特价活动标识
|
|
|
+ AtomicBoolean promotionActivityFlag = new AtomicBoolean(false);
|
|
|
+ List<String> promotionSkuList = new ArrayList<>();
|
|
|
// 判断活动类型并排序,再确定购物栏中商品是否满足活动条件
|
|
|
mkActivitiesEntityList.stream().sorted().forEach(mkActivitiesEntity -> {
|
|
|
String mkaStoreId = mkActivitiesEntity.getMkaStoreId();
|
|
@@ -4056,6 +4145,11 @@ public class OrderServiceImpl implements OrderService {
|
|
|
String entityGoodsSn = mkActivitiesPromotionEntity.getSku();
|
|
|
BigDecimal activityPrice = mkActivitiesPromotionEntity.getActivityPrice();
|
|
|
String shopSn = mkActivitiesPromotionEntity.getShopSn();
|
|
|
+ String rejectScore = mkActivitiesPromotionEntity.getRejectScore();
|
|
|
+ // 如果与积分抵扣互斥的,记录sku
|
|
|
+ if (!org.springframework.util.StringUtils.isEmpty(rejectScore) && Constants.PromotionActivityRejectEnum.REJECT.getCode().equals(rejectScore)) {
|
|
|
+ promotionSkuList.add(entityGoodsSn);
|
|
|
+ }
|
|
|
goodsEntities.forEach(goodsEntity -> {
|
|
|
String sku = goodsEntity.getSku();
|
|
|
String prodBarcode = goodsEntity.getProdBarcode();
|
|
@@ -4071,6 +4165,7 @@ public class OrderServiceImpl implements OrderService {
|
|
|
goodsDetailsDto.setDiscountedPrice(retailPrice.subtract(activityPrice));
|
|
|
goodsDetailsDtos.add(goodsDetailsDto);
|
|
|
activityFlag.set(false);
|
|
|
+ promotionActivityFlag.set(true);
|
|
|
}
|
|
|
});
|
|
|
});
|
|
@@ -4301,7 +4396,7 @@ public class OrderServiceImpl implements OrderService {
|
|
|
Integer score = memberInfoDTO.getScore();
|
|
|
if (Objects.nonNull(score) && score > 0) {
|
|
|
// 有积分
|
|
|
- afterDiscountPrice = calculatePreferentialPrice(orderTotalPrice, score, storeId, memberCode, calculateOrderDiscountPriceResponseVO);
|
|
|
+ afterDiscountPrice = calculatePreferentialPrice(orderTotalPrice, score, storeId, memberCode, calculateOrderDiscountPriceResponseVO, goodsDetailsDtos, promotionActivityFlag, promotionSkuList);
|
|
|
LOGGER.info("会员【{}】,当前积分:{},积分抵扣后的订单金额:{},积分抵扣前的订单金额:{}", memberCode, score, afterDiscountPrice, orderTotalPrice);
|
|
|
calculateOrderDiscountPriceResponseVO.setOrderTotalPrice(afterDiscountPrice);
|
|
|
calculateOrderDiscountPriceResponseVO.setGoodsDetailsDtos(goodsDetailsDtos);
|
|
@@ -4330,13 +4425,17 @@ public class OrderServiceImpl implements OrderService {
|
|
|
|
|
|
/**
|
|
|
* 计算积分抵扣后的订单总金额
|
|
|
- * @param orderTotalPrice 订单商品详情
|
|
|
+ * @param orderTotalPrice 订单商品总价
|
|
|
* @param score 积分
|
|
|
* @param storeId 门店id
|
|
|
* @param memberCode 会员码
|
|
|
+ * @param goodsDetailsDtos 订单商品详情
|
|
|
+ * @param calculateOrderDiscountPriceResponseVO 响应数据
|
|
|
+ * @param promotionActivityFlag 是否参与了积分抵扣活动
|
|
|
+ * @param promotionSkuList 参与了积分抵扣活动的sku集合
|
|
|
* @return 积分抵扣后的订单总金额
|
|
|
*/
|
|
|
- private BigDecimal calculatePreferentialPrice(BigDecimal orderTotalPrice, Integer score, String storeId, String memberCode, CalculateOrderDiscountPriceResponseVO calculateOrderDiscountPriceResponseVO) {
|
|
|
+ private BigDecimal calculatePreferentialPrice(BigDecimal orderTotalPrice, Integer score, String storeId, String memberCode, CalculateOrderDiscountPriceResponseVO calculateOrderDiscountPriceResponseVO, List<GoodsDetailsDto> goodsDetailsDtos, AtomicBoolean promotionActivityFlag, List<String> promotionSkuList) {
|
|
|
// 1. 判断是否有积分,是否需要计算积分抵扣后的价格
|
|
|
AtomicBoolean isCalculateScorePrice = new AtomicBoolean(false);
|
|
|
if (Objects.nonNull(score) && score > 0) {
|
|
@@ -4351,6 +4450,10 @@ public class OrderServiceImpl implements OrderService {
|
|
|
LOGGER.warn("用户【{}】的积分数量为:{},最低需要30积分才能抵扣!", memberCode, score);
|
|
|
return orderTotalPrice;
|
|
|
} else {
|
|
|
+ // 积分取整
|
|
|
+ int scoreInteger = score % scoreLimit == 0 ? score : score - (score % scoreLimit);
|
|
|
+ // 积分的50%
|
|
|
+ int scoreIntegerHalf = scoreInteger * scoreLimit / 100;
|
|
|
// 3-2. 计算出积分能抵扣的价格
|
|
|
int scoreMayDeductionPrice = (int) (score / scoreLimit);
|
|
|
BigDecimal scoreMayDeductionPriceDecimal = new BigDecimal(scoreMayDeductionPrice);
|
|
@@ -4359,17 +4462,48 @@ public class OrderServiceImpl implements OrderService {
|
|
|
// 积分能抵扣的金额大于订单总额的50%,按50%抵扣
|
|
|
scoreMayDeductionPriceDecimal = halfPrice;
|
|
|
}
|
|
|
+ // 参与了积分抵扣活动,不互斥的情况下
|
|
|
+ if (promotionActivityFlag.get() && !CollectionUtils.isEmpty(promotionSkuList)) {
|
|
|
+ BigDecimal shareScore = BigDecimal.ZERO;
|
|
|
+ BigDecimal scoreIntegerDecimal = BigDecimal.valueOf(scoreInteger);
|
|
|
+ BigDecimal scoreLimitDecimal = BigDecimal.valueOf(scoreLimit);
|
|
|
+ BigDecimal goodsDetailScoreDeductionPrice = BigDecimal.ZERO;
|
|
|
+ for (int i = 0; i < goodsDetailsDtos.size(); i++) {
|
|
|
+ GoodsDetailsDto goodsDetailsDto = goodsDetailsDtos.get(i);
|
|
|
+ // 抵扣积分分摊
|
|
|
+ int index = goodsDetailsDtos.size() - 1;
|
|
|
+ if (promotionSkuList.contains(goodsDetailsDto.getSku()) && i < index) {
|
|
|
+ // 计算抵扣
|
|
|
+ // 商品总价
|
|
|
+ BigDecimal actualPaymentAmount = goodsDetailsDto.getActualPaymentAmount();
|
|
|
+ BigDecimal scoreIntegerHalfDecimal = BigDecimal.valueOf(scoreIntegerHalf);
|
|
|
+ // 分摊积分
|
|
|
+ shareScore = shareScore.add(actualPaymentAmount.divide(scoreIntegerDecimal.multiply(scoreIntegerHalfDecimal), 2, BigDecimal.ROUND_HALF_UP));
|
|
|
+ // 保留两位小数,四舍五入
|
|
|
+ BigDecimal discountedPrice = shareScore.divide(scoreLimitDecimal, 2, BigDecimal.ROUND_HALF_UP);
|
|
|
+ goodsDetailScoreDeductionPrice = goodsDetailScoreDeductionPrice.add(discountedPrice);
|
|
|
+ goodsDetailsDto.setDiscountedPrice(discountedPrice);
|
|
|
+ }
|
|
|
+ if (i == index) {
|
|
|
+ BigDecimal discountedPrice = scoreIntegerDecimal.subtract(shareScore).divide(scoreLimitDecimal, 2, BigDecimal.ROUND_HALF_UP);
|
|
|
+ goodsDetailScoreDeductionPrice = goodsDetailScoreDeductionPrice.add(discountedPrice);
|
|
|
+ goodsDetailsDto.setDiscountedPrice(discountedPrice);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ scoreMayDeductionPriceDecimal = goodsDetailScoreDeductionPrice;
|
|
|
+ }
|
|
|
+
|
|
|
orderTotalPrice = orderTotalPrice.subtract(scoreMayDeductionPriceDecimal);
|
|
|
- int afterScore = score - scoreMayDeductionPriceDecimal.multiply(new BigDecimal(scoreLimit)).intValue();
|
|
|
+ int afterScore = score - scoreIntegerHalf;
|
|
|
calculateOrderDiscountPriceResponseVO.setAfterScore(afterScore);
|
|
|
calculateOrderDiscountPriceResponseVO.setScoreLimit(scoreLimit);
|
|
|
- calculateOrderDiscountPriceResponseVO.setDeductionScore(score - afterScore);
|
|
|
+ calculateOrderDiscountPriceResponseVO.setDeductionScore(scoreIntegerHalf);
|
|
|
calculateOrderDiscountPriceResponseVO.setOrderTotalPrice(orderTotalPrice);
|
|
|
calculateOrderDiscountPriceResponseVO.setScoreDeductionPrice(scoreMayDeductionPriceDecimal);
|
|
|
LOGGER.info("会员【{}】,当前积分:{},抵扣订单金额后剩余积分:{}", memberCode, score, afterScore);
|
|
|
}
|
|
|
} else {
|
|
|
- LOGGER.info("会员【{}】的积分为0,不参加积分抵扣!", memberCode);
|
|
|
+ LOGGER.info("会员【{}】的积分小于积分抵扣最低值,不参加积分抵扣!", memberCode);
|
|
|
}
|
|
|
return orderTotalPrice;
|
|
|
}
|
|
@@ -4555,7 +4689,13 @@ public class OrderServiceImpl implements OrderService {
|
|
|
orderInfo.setUser_id(loginUser.getId().longValue());
|
|
|
actualPrice = actualPrice.subtract(couponPrice);
|
|
|
|
|
|
- StoreEntity storeEntity = storeDao.queryObject(storeId);
|
|
|
+ //StoreEntity storeEntity = storeDao.queryObject(storeId);
|
|
|
+ //获取收货人地址
|
|
|
+ AddressEntity addressEntity = addressDao.queryStoreAddress(storeId,Dict.addressStatus.item_2.getItem());
|
|
|
+ if(null==addressEntity){
|
|
|
+ LOGGER.error("setOrderVo---门店未配置收货人地址:"+storeId);
|
|
|
+ throw new RRException("门店未配置收货人地址");
|
|
|
+ }
|
|
|
//收货地址和运费
|
|
|
orderInfo.setConsignee(loginUser.getUsername());
|
|
|
orderInfo.setMobile(loginUser.getMobile());
|
|
@@ -4563,22 +4703,26 @@ public class OrderServiceImpl implements OrderService {
|
|
|
//根据 前端的选择方式 1 是柜取 0 是 邮寄
|
|
|
if (status == 0) {
|
|
|
//省
|
|
|
- String cmbProvince = (String) mapAddr.get("cmbProvince");
|
|
|
- //市
|
|
|
- String cmbCity = (String) mapAddr.get("cmbCity");
|
|
|
- //区
|
|
|
- String cmbArea = (String) mapAddr.get("cmbArea");
|
|
|
- //详细地址
|
|
|
- String addrUser = (String) mapAddr.get("addrUser");
|
|
|
- orderInfo.setProvince(cmbProvince);
|
|
|
- orderInfo.setCity(cmbCity);
|
|
|
- orderInfo.setDistrict(cmbArea);
|
|
|
- orderInfo.setAddress(addrUser);
|
|
|
+// String cmbProvince = (String) mapAddr.get("cmbProvince");
|
|
|
+// //市
|
|
|
+// String cmbCity = (String) mapAddr.get("cmbCity");
|
|
|
+// //区
|
|
|
+// String cmbArea = (String) mapAddr.get("cmbArea");
|
|
|
+// //详细地址
|
|
|
+// String addrUser = (String) mapAddr.get("addrUser");
|
|
|
+// orderInfo.setProvince(cmbProvince);
|
|
|
+// orderInfo.setCity(cmbCity);
|
|
|
+// orderInfo.setDistrict(cmbArea);
|
|
|
+// orderInfo.setAddress(addrUser);
|
|
|
+ orderInfo.setProvince(addressEntity.getProvinceName());
|
|
|
+ orderInfo.setCity(addressEntity.getCityName());
|
|
|
+ orderInfo.setDistrict(addressEntity.getCountyName());
|
|
|
+ orderInfo.setAddress(addressEntity.getDetailInfo());
|
|
|
} else {
|
|
|
- orderInfo.setProvince(storeEntity.getProvinceName());
|
|
|
- orderInfo.setCity(storeEntity.getCityName());
|
|
|
- orderInfo.setDistrict(storeEntity.getCountyName());
|
|
|
- orderInfo.setAddress(storeEntity.getStoreAddress());
|
|
|
+ orderInfo.setProvince(addressEntity.getProvinceName());
|
|
|
+ orderInfo.setCity(addressEntity.getCityName());
|
|
|
+ orderInfo.setDistrict(addressEntity.getCountyName());
|
|
|
+ orderInfo.setAddress(addressEntity.getDetailInfo());
|
|
|
}
|
|
|
orderInfo.setAddress_id(1L);
|
|
|
orderInfo.setDelivery_date(new Date());
|