Merge pull request #82

pg
This commit is contained in:
misworga831 2023-03-30 16:06:22 +08:00 committed by GitHub
commit 799aa8f90c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
18 changed files with 290 additions and 80 deletions

View File

@ -24,13 +24,13 @@ spring:
boot: boot:
admin: admin:
client: client:
url: http://192.168.0.108:8000 url: http://127.0.0.1:8000
cache: cache:
type: redis type: redis
# Redis # Redis
redis: redis:
host: 192.168.0.108 host: 127.0.0.1
port: 30379 port: 6379
password: lilishop password: lilishop
lettuce: lettuce:
pool: pool:
@ -60,7 +60,7 @@ spring:
default-datasource: default-datasource:
type: com.alibaba.druid.pool.DruidDataSource type: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.cj.jdbc.Driver driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.0.108:30306/kuaidi100?useUnicode=true&characterEncoding=utf-8&useSSL=false&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai url: jdbc:mysql://127.0.0.1:3306/lilishop?useUnicode=true&characterEncoding=utf-8&useSSL=false&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
username: root username: root
password: lilishop password: lilishop
maxActive: 50 maxActive: 50
@ -241,16 +241,16 @@ lili:
sk: zhNKVrJK6UPOhqIjn8AQvG37b9sz6 sk: zhNKVrJK6UPOhqIjn8AQvG37b9sz6
#域名 #域名
domain: domain:
pc: http://192.168.0.108:8888 pc: http://127.0.0.1:8888
wap: http://192.168.0.108:8888 wap: http://127.0.0.1:8888
seller: http://192.168.0.108:8888 seller: http://127.0.0.1:8888
admin: http://192.168.0.108:8888 admin: http://127.0.0.1:8888
#api地址 #api地址
api: api:
buyer: https://z171l91606.51mypc.cn buyer: https://z171l91606.51mypc.cn
base: http://192.168.0.108:8888 base: http://127.0.0.1:8888
manager: http://192.168.0.108:8888 manager: http://127.0.0.1:8888
seller: http://192.168.0.108:8888 seller: http://127.0.0.1:8888
# jwt 细节设定 # jwt 细节设定
jwt-setting: jwt-setting:
@ -269,7 +269,7 @@ lili:
data: data:
elasticsearch: elasticsearch:
cluster-name: elasticsearch cluster-name: elasticsearch
cluster-nodes: 192.168.0.108:30920 cluster-nodes: 127.0.0.1:9200
index: index:
number-of-replicas: 0 number-of-replicas: 0
number-of-shards: 3 number-of-shards: 3
@ -301,7 +301,7 @@ lili:
after-sale-topic: lili_after_sale_topic after-sale-topic: lili_after_sale_topic
after-sale-group: lili_after_sale_group after-sale-group: lili_after_sale_group
rocketmq: rocketmq:
name-server: 192.168.0.108:30876 name-server: 127.0.0.1:9876
isVIPChannel: false isVIPChannel: false
producer: producer:
group: lili_group group: lili_group
@ -310,7 +310,7 @@ rocketmq:
xxl: xxl:
job: job:
admin: admin:
addresses: http://192.168.0.108:9001/xxl-job-admin addresses: http://127.0.0.1:9001/xxl-job-admin
executor: executor:
appname: xxl-job-executor-lilishop appname: xxl-job-executor-lilishop
address: address:

View File

@ -1,6 +1,8 @@
package cn.lili.event.impl; package cn.lili.event.impl;
import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateTime;
import cn.hutool.json.JSONUtil;
import cn.lili.event.AfterSaleStatusChangeEvent; import cn.lili.event.AfterSaleStatusChangeEvent;
import cn.lili.event.OrderStatusChangeEvent; import cn.lili.event.OrderStatusChangeEvent;
import cn.lili.modules.distribution.entity.dos.DistributionOrder; import cn.lili.modules.distribution.entity.dos.DistributionOrder;
@ -10,6 +12,10 @@ import cn.lili.modules.distribution.service.DistributionOrderService;
import cn.lili.modules.order.aftersale.entity.dos.AfterSale; import cn.lili.modules.order.aftersale.entity.dos.AfterSale;
import cn.lili.modules.order.order.entity.dto.OrderMessage; import cn.lili.modules.order.order.entity.dto.OrderMessage;
import cn.lili.modules.order.trade.entity.enums.AfterSaleStatusEnum; import cn.lili.modules.order.trade.entity.enums.AfterSaleStatusEnum;
import cn.lili.modules.system.entity.dos.Setting;
import cn.lili.modules.system.entity.dto.DistributionSetting;
import cn.lili.modules.system.entity.enums.SettingEnum;
import cn.lili.modules.system.service.SettingService;
import cn.lili.timetask.handler.EveryDayExecute; import cn.lili.timetask.handler.EveryDayExecute;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -39,6 +45,9 @@ public class DistributionOrderExecute implements OrderStatusChangeEvent, EveryDa
@Resource @Resource
private DistributionOrderMapper distributionOrderMapper; private DistributionOrderMapper distributionOrderMapper;
@Autowired
private SettingService settingService;
@Override @Override
public void orderChange(OrderMessage orderMessage) { public void orderChange(OrderMessage orderMessage) {
@ -65,14 +74,16 @@ public class DistributionOrderExecute implements OrderStatusChangeEvent, EveryDa
@Override @Override
public void execute() { public void execute() {
//计算分销提佣 log.info("分销订单定时开始执行");
distributionOrderMapper.rebate(DistributionOrderStatusEnum.WAIT_BILL.name(), new DateTime()); //设置结算天数(解冻日期)
Setting setting = settingService.get(SettingEnum.DISTRIBUTION_SETTING.name());
//修改分销订单状态 DistributionSetting distributionSetting = JSONUtil.toBean(setting.getSettingValue(), DistributionSetting.class);
distributionOrderService.update(new LambdaUpdateWrapper<DistributionOrder>() //解冻时间
.eq(DistributionOrder::getDistributionOrderStatus, DistributionOrderStatusEnum.WAIT_BILL.name()) DateTime dateTime = new DateTime();
.le(DistributionOrder::getSettleCycle, new DateTime()) //当前时间-结算天数=最终结算时间
.set(DistributionOrder::getDistributionOrderStatus, DistributionOrderStatusEnum.WAIT_CASH.name())); dateTime = dateTime.offsetNew(DateField.DAY_OF_MONTH, -distributionSetting.getCashDay());
//分销人员订单结算
distributionOrderService.updateRebate(dateTime,DistributionOrderStatusEnum.WAIT_BILL.name());
} }

View File

@ -1,12 +1,21 @@
package cn.lili.event.impl; package cn.lili.event.impl;
import cn.lili.cache.Cache;
import cn.lili.cache.CachePrefix;
import cn.lili.event.GoodsCommentCompleteEvent; import cn.lili.event.GoodsCommentCompleteEvent;
import cn.lili.event.StoreSettingChangeEvent;
import cn.lili.modules.goods.entity.dos.GoodsSku;
import cn.lili.modules.goods.entity.dto.GoodsSearchParams;
import cn.lili.modules.goods.service.GoodsSkuService; import cn.lili.modules.goods.service.GoodsSkuService;
import cn.lili.modules.member.entity.dos.MemberEvaluation; import cn.lili.modules.member.entity.dos.MemberEvaluation;
import cn.lili.modules.store.entity.dos.Store;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
/** /**
* 商品SKU变化 * 商品SKU变化
* *
@ -14,7 +23,7 @@ import org.springframework.stereotype.Service;
* @since 2020-07-03 11:20 * @since 2020-07-03 11:20
*/ */
@Service @Service
public class GoodsSkuExecute implements GoodsCommentCompleteEvent { public class GoodsSkuExecute implements GoodsCommentCompleteEvent, StoreSettingChangeEvent {
/** /**
* 商品 * 商品
@ -22,9 +31,23 @@ public class GoodsSkuExecute implements GoodsCommentCompleteEvent {
@Autowired @Autowired
private GoodsSkuService goodsSkuService; private GoodsSkuService goodsSkuService;
@Autowired
private Cache cache;
@Override @Override
public void goodsComment(MemberEvaluation memberEvaluation) { public void goodsComment(MemberEvaluation memberEvaluation) {
goodsSkuService.updateGoodsSkuCommentNum(memberEvaluation.getSkuId()); goodsSkuService.updateGoodsSkuCommentNum(memberEvaluation.getSkuId());
} }
@Override
public void storeSettingChange(Store store) {
//修改数据后清除商品索引
GoodsSearchParams goodsSearchParams = new GoodsSearchParams();
goodsSearchParams.setStoreId(store.getId());
List<String> goodsSkuKeys = new ArrayList<>();
for (GoodsSku goodsSku : goodsSkuService.getGoodsSkuByList(goodsSearchParams)) {
goodsSkuKeys.add(CachePrefix.GOODS_SKU.getPrefix()+goodsSku.getId());
}
cache.multiDel(goodsSkuKeys);
}
} }

View File

@ -2,9 +2,12 @@ package cn.lili.timetask.handler.impl.order;
import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
import cn.lili.common.enums.ResultCode; import cn.lili.common.enums.ResultCode;
import cn.lili.common.exception.ServiceException; import cn.lili.common.exception.ServiceException;
import cn.lili.modules.distribution.service.DistributionOrderService;
import cn.lili.modules.member.entity.dto.MemberEvaluationDTO; import cn.lili.modules.member.entity.dto.MemberEvaluationDTO;
import cn.lili.modules.member.entity.enums.EvaluationGradeEnum; import cn.lili.modules.member.entity.enums.EvaluationGradeEnum;
import cn.lili.modules.member.service.MemberEvaluationService; import cn.lili.modules.member.service.MemberEvaluationService;
@ -69,6 +72,9 @@ public class OrderEveryDayTaskExecute implements EveryDayExecute {
@Autowired @Autowired
private AfterSaleService afterSaleService; private AfterSaleService afterSaleService;
@Autowired
private DistributionOrderService distributionOrderService;
/** /**
* 执行每日任务 * 执行每日任务
*/ */
@ -179,6 +185,15 @@ public class OrderEveryDayTaskExecute implements EveryDayExecute {
.set(OrderItem::getAfterSaleStatus, OrderItemAfterSaleStatusEnum.EXPIRED.name()) .set(OrderItem::getAfterSaleStatus, OrderItemAfterSaleStatusEnum.EXPIRED.name())
.in(OrderItem::getId, orderItemIdList); .in(OrderItem::getId, orderItemIdList);
orderItemService.update(lambdaUpdateWrapper); orderItemService.update(lambdaUpdateWrapper);
//修改订售后状态
List<OrderItem> orderItemsList = orderItems.stream()
.map((orderItem)->{
orderItem.setAfterSaleStatus(OrderItemAfterSaleStatusEnum.EXPIRED.name());
return orderItem;
})
.collect(Collectors.toList());
//修改对应分销订单状态
distributionOrderService.updateDistributionOrderStatus(orderItemsList);
} }
} }

View File

@ -202,8 +202,8 @@ public enum ResultCode {
ORDER_BATCH_DELIVER_ERROR(31013, "批量发货,文件读取失败"), ORDER_BATCH_DELIVER_ERROR(31013, "批量发货,文件读取失败"),
ORDER_ITEM_NOT_EXIST(31014, "当前订单项不存在!"), ORDER_ITEM_NOT_EXIST(31014, "当前订单项不存在!"),
POINT_NOT_ENOUGH(31015, "当前会员积分不足购买当前积分商品!"), POINT_NOT_ENOUGH(31015, "当前会员积分不足购买当前积分商品!"),
ORDER_LABEL_ORDER_ERROR(31016, "订单不能打印电子面单"), ORDER_LABEL_ORDER_ERROR(31016, "订单不能打印电子面单"),
ORDER_PRICE_ERROR(31017,"订单金额不能小于等于0"),
/** /**

View File

@ -81,7 +81,7 @@ public class DistributionOrder extends BaseIdEntity {
private Integer num; private Integer num;
public DistributionOrder(StoreFlow storeFlow) { public DistributionOrder(StoreFlow storeFlow) {
distributionOrderStatus = DistributionOrderStatusEnum.WAIT_BILL.name(); distributionOrderStatus = DistributionOrderStatusEnum.NO_COMPLETED.name();
memberId = storeFlow.getMemberId(); memberId = storeFlow.getMemberId();
memberName = storeFlow.getMemberName(); memberName = storeFlow.getMemberName();
rebate = storeFlow.getDistributionRebate(); rebate = storeFlow.getDistributionRebate();

View File

@ -6,6 +6,8 @@ package cn.lili.modules.distribution.entity.enums;
* @author pikachu * @author pikachu
*/ */
public enum DistributionOrderStatusEnum { public enum DistributionOrderStatusEnum {
//未完成
NO_COMPLETED("未完成"),
//待结算冻结 //待结算冻结
WAIT_BILL("待结算"), WAIT_BILL("待结算"),
//待提现 //待提现

View File

@ -1,10 +1,14 @@
package cn.lili.modules.distribution.service; package cn.lili.modules.distribution.service;
import cn.hutool.core.date.DateTime;
import cn.lili.modules.distribution.entity.dos.DistributionOrder; import cn.lili.modules.distribution.entity.dos.DistributionOrder;
import cn.lili.modules.distribution.entity.vos.DistributionOrderSearchParams; import cn.lili.modules.distribution.entity.vos.DistributionOrderSearchParams;
import cn.lili.modules.order.order.entity.dos.OrderItem;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/** /**
* 分销订单业务层 * 分销订单业务层
@ -45,4 +49,17 @@ public interface DistributionOrderService extends IService<DistributionOrder> {
*/ */
void refundOrder(String afterSaleSn); void refundOrder(String afterSaleSn);
/**
* 分销订单状态修改
*
* @param orderItems
*/
void updateDistributionOrderStatus(List<OrderItem> orderItems);
/**
* 分销订单结算
* @param dateTime
* @param distributionOrderStatus
*/
void updateRebate(DateTime dateTime, String distributionOrderStatus);
} }

View File

@ -1,19 +1,26 @@
package cn.lili.modules.distribution.serviceimpl; package cn.lili.modules.distribution.serviceimpl;
import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.date.DateField; import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateTime;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
import cn.lili.common.utils.CurrencyUtil; import cn.lili.common.utils.CurrencyUtil;
import cn.lili.common.utils.SpringContextUtil;
import cn.lili.modules.distribution.entity.dos.Distribution; import cn.lili.modules.distribution.entity.dos.Distribution;
import cn.lili.modules.distribution.entity.dos.DistributionOrder; import cn.lili.modules.distribution.entity.dos.DistributionOrder;
import cn.lili.modules.distribution.entity.enums.DistributionOrderStatusEnum; import cn.lili.modules.distribution.entity.enums.DistributionOrderStatusEnum;
import cn.lili.modules.distribution.entity.enums.DistributionStatusEnum;
import cn.lili.modules.distribution.entity.vos.DistributionOrderSearchParams; import cn.lili.modules.distribution.entity.vos.DistributionOrderSearchParams;
import cn.lili.modules.distribution.mapper.DistributionOrderMapper; import cn.lili.modules.distribution.mapper.DistributionOrderMapper;
import cn.lili.modules.distribution.service.DistributionOrderService; import cn.lili.modules.distribution.service.DistributionOrderService;
import cn.lili.modules.distribution.service.DistributionService; import cn.lili.modules.distribution.service.DistributionService;
import cn.lili.modules.order.order.entity.dos.Order; import cn.lili.modules.order.order.entity.dos.Order;
import cn.lili.modules.order.order.entity.dos.OrderItem;
import cn.lili.modules.order.order.entity.dos.StoreFlow; import cn.lili.modules.order.order.entity.dos.StoreFlow;
import cn.lili.modules.order.order.entity.dto.StoreFlowQueryDTO; import cn.lili.modules.order.order.entity.dto.StoreFlowQueryDTO;
import cn.lili.modules.order.order.entity.enums.OrderItemAfterSaleStatusEnum;
import cn.lili.modules.order.order.entity.enums.PayStatusEnum; import cn.lili.modules.order.order.entity.enums.PayStatusEnum;
import cn.lili.modules.order.order.service.OrderService; import cn.lili.modules.order.order.service.OrderService;
import cn.lili.modules.order.order.service.StoreFlowService; import cn.lili.modules.order.order.service.StoreFlowService;
@ -31,7 +38,11 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/** /**
@ -107,14 +118,7 @@ public class DistributionOrderServiceImpl extends ServiceImpl<DistributionOrderM
//设置结算天数(解冻日期) //设置结算天数(解冻日期)
Setting setting = settingService.get(SettingEnum.DISTRIBUTION_SETTING.name()); Setting setting = settingService.get(SettingEnum.DISTRIBUTION_SETTING.name());
DistributionSetting distributionSetting = JSONUtil.toBean(setting.getSettingValue(), DistributionSetting.class); DistributionSetting distributionSetting = JSONUtil.toBean(setting.getSettingValue(), DistributionSetting.class);
//默认解冻1天
if (distributionSetting.getCashDay().equals(0)) {
distributionOrder.setSettleCycle(new DateTime());
} else {
DateTime dateTime = new DateTime();
dateTime = dateTime.offsetNew(DateField.DAY_OF_MONTH, distributionSetting.getCashDay());
distributionOrder.setSettleCycle(dateTime);
}
//添加分销订单 //添加分销订单
this.save(distributionOrder); this.save(distributionOrder);
@ -126,15 +130,11 @@ public class DistributionOrderServiceImpl extends ServiceImpl<DistributionOrderM
//如果天数写0则立即进行结算 //如果天数写0则立即进行结算
if (distributionSetting.getCashDay().equals(0)) { if (distributionSetting.getCashDay().equals(0)) {
DateTime dateTime = new DateTime(); DateTime dateTime = new DateTime();
dateTime = dateTime.offsetNew(DateField.MINUTE, 5); dateTime = dateTime.offsetNew(DateField.DAY_OF_MONTH, -distributionSetting.getCashDay());
//计算分销提佣 //防止事务失效采用上下文获取bean
this.baseMapper.rebate(DistributionOrderStatusEnum.WAIT_BILL.name(), dateTime); DistributionOrderService bean = SpringContextUtil.getBean(DistributionOrderService.class);
//分销订单结算
//修改分销订单状态 bean.updateRebate(dateTime, DistributionOrderStatusEnum.WAIT_BILL.name());
this.update(new LambdaUpdateWrapper<DistributionOrder>()
.eq(DistributionOrder::getDistributionOrderStatus, DistributionOrderStatusEnum.WAIT_BILL.name())
.le(DistributionOrder::getSettleCycle, dateTime)
.set(DistributionOrder::getDistributionOrderStatus, DistributionOrderStatusEnum.WAIT_CASH.name()));
} }
} }
@ -214,4 +214,128 @@ public class DistributionOrderServiceImpl extends ServiceImpl<DistributionOrderM
} }
} }
@Override
public void updateDistributionOrderStatus(List<OrderItem> orderItems) {
if (orderItems.isEmpty()) {
return;
}
//获取未完成分销订单
List<DistributionOrder> distributionOrderList = this.list(new LambdaQueryWrapper<DistributionOrder>()
.eq(DistributionOrder::getDistributionOrderStatus, DistributionOrderStatusEnum.NO_COMPLETED.name()));
if (distributionOrderList.isEmpty()) {
return;
}
List<DistributionOrder> list = ListUtil.list(false);
orderItems.stream().forEach(orderItem -> {
//订单售后状态为已失效并且投诉状态为已失效
if (StrUtil.equals(OrderItemAfterSaleStatusEnum.EXPIRED.name(), orderItem.getAfterSaleStatus())) {
List<DistributionOrder> collect = distributionOrderList.stream()
.filter(distributionOrder -> StrUtil.equals(distributionOrder.getOrderItemSn(), orderItem.getSn()))
.map((distributionOrder) -> {
distributionOrder.setDistributionOrderStatus(DistributionOrderStatusEnum.WAIT_BILL.name());
distributionOrder.setSettleCycle(new Date());
return distributionOrder;
})
.collect(Collectors.toList());
list.addAll(collect);
}
});
if (!list.isEmpty()) {
//批量修改分销订单结算状态
this.updateBatchById(list);
}
}
@Override
public void updateRebate(DateTime dateTime, String distributionOrderStatus) {
//结算时间延后五分钟
dateTime = dateTime.offsetNew(DateField.MINUTE, 5);
//获取待结算订单
List<DistributionOrder> distributionOrderList = this.list(new LambdaQueryWrapper<DistributionOrder>()
.eq(DistributionOrder::getDistributionOrderStatus, distributionOrderStatus)
.isNotNull(DistributionOrder::getSettleCycle)
.le(DistributionOrder::getSettleCycle, dateTime));
//校验待结算订单
if (ObjectUtil.isNotNull(distributionOrderList) && distributionOrderList.size() > 0) {
//结算分销人员信息列表
List<Distribution> distributionUpdateList = new ArrayList<>();
//获取分销员信息
List<Distribution> distributionList = distributionService.list(new LambdaQueryWrapper<Distribution>()
.eq(Distribution::getDistributionStatus, DistributionStatusEnum.PASS.name()));
//根据销人员获取对应分销订单
Map<String, List<DistributionOrder>> distributionOrderList1 = distributionOrderList.stream()
.collect(Collectors.groupingBy(DistributionOrder::getDistributionId));
//校验分销订单不为空
if (ObjectUtil.isNotNull(distributionOrderList1) && distributionOrderList1.size() > 0) {
//遍历分销订单map
distributionOrderList1.forEach((key, value) -> {
//计算分销结算金额
distributionUpdateList.add(checkDistribution(key, value, distributionList));
});
}
//校验分销信息列表不为空
if (ObjectUtil.isNotNull(distributionUpdateList) && !distributionUpdateList.isEmpty()) {
//修改分销员收益
distributionService.updateBatchById(distributionUpdateList);
distributionOrderList.stream().forEach(distributionOrder -> {
//修改分销订单状态为待提现
distributionOrder.setDistributionOrderStatus(DistributionOrderStatusEnum.WAIT_CASH.name());
});
}
//修改分销订单状态
this.updateBatchById(distributionOrderList);
}
}
/**
* 计算分销结算金额
*
* @param distributionId 分销ID
* @param list 分销订单
* @param distributionList 分销列表
* @return
*/
public Distribution checkDistribution(String distributionId, List<DistributionOrder> list, List<Distribution> distributionList) {
//获取所有待结算订单分销人员信息
Distribution distribution = distributionList.parallelStream().filter(a -> StrUtil.equals(a.getId(), distributionId)).collect(Collectors.toList()).get(0);
//获取分销订单总金额
double rebate = list.stream().mapToDouble(DistributionOrder::getRebate).sum();
//检验单分销人员冻结金额为负数时.扣除负数冻结金额后再结算
if (distribution.getCommissionFrozen() < 0) {
rebate = CurrencyUtil.add(distribution.getCommissionFrozen() == null ? 0.0 : distribution.getCommissionFrozen(), rebate);
}
//结算订单总金额+分销可提现金额
Double canRebate = CurrencyUtil.add(rebate, distribution.getCanRebate() == null ? 0.0 : distribution.getCanRebate());
//结算金额小于0
if (canRebate < 0) {
//结算订单总金额+分销可提现金额
distribution.setCanRebate(0.0);
//冻结金额
distribution.setCommissionFrozen(canRebate);
} else {
//结算订单总金额+分销可提现金额
distribution.setCanRebate(canRebate);
//冻结金额
distribution.setCommissionFrozen(0.0);
}
return distribution;
}
} }

View File

@ -1,5 +1,6 @@
package cn.lili.modules.order.cart.entity.vo; package cn.lili.modules.order.cart.entity.vo;
import cn.lili.common.utils.CurrencyUtil;
import cn.lili.modules.distribution.entity.dos.DistributionGoods; import cn.lili.modules.distribution.entity.dos.DistributionGoods;
import cn.lili.modules.goods.entity.dos.GoodsSku; import cn.lili.modules.goods.entity.dos.GoodsSku;
import cn.lili.modules.order.cart.entity.enums.CartTypeEnum; import cn.lili.modules.order.cart.entity.enums.CartTypeEnum;
@ -123,6 +124,18 @@ public class CartSkuVO extends CartBase implements Serializable {
} }
} }
public void rebuildBySku(GoodsSku goodsSku) {
this.goodsSku = goodsSku;
this.purchasePrice = goodsSku.getPromotionFlag() != null && goodsSku.getPromotionFlag() ? goodsSku.getPromotionPrice() : goodsSku.getPrice();
this.utilPrice = goodsSku.getPromotionFlag() != null && goodsSku.getPromotionFlag() ? goodsSku.getPromotionPrice() : goodsSku.getPrice();
//计算购物车小计
this.subTotal = CurrencyUtil.mul(this.getPurchasePrice(), this.getNum());
this.setStoreId(goodsSku.getStoreId());
this.setStoreName(goodsSku.getStoreName());
}
public Map<String, Object> getPromotionMap() { public Map<String, Object> getPromotionMap() {
return PromotionTools.filterInvalidPromotionsMap(this.promotionMap); return PromotionTools.filterInvalidPromotionsMap(this.promotionMap);
} }

View File

@ -36,7 +36,10 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.*; import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
@ -74,13 +77,17 @@ public class CheckDataRender implements CartRenderStep {
@Override @Override
public void render(TradeDTO tradeDTO) { public void render(TradeDTO tradeDTO) {
//预校验
preCalibration(tradeDTO);
//校验商品有效性 //校验商品有效性
checkData(tradeDTO); checkData(tradeDTO);
//预校验
preCalibration(tradeDTO);
//批量销售预处理
preSaleModel(tradeDTO); preSaleModel(tradeDTO);
//店铺分组数据初始化 //店铺分组数据初始化
groupStore(tradeDTO); groupStore(tradeDTO);
@ -106,15 +113,12 @@ public class CheckDataRender implements CartRenderStep {
//缓存中的商品信息 //缓存中的商品信息
GoodsSku dataSku = goodsSkuService.getGoodsSkuByIdFromCache(cartSkuVO.getGoodsSku().getId()); GoodsSku dataSku = goodsSkuService.getGoodsSkuByIdFromCache(cartSkuVO.getGoodsSku().getId());
//商品上架状态判定 sku为空sku非上架状态sku审核不通过
//商品上架状态判定
boolean checkGoodsStatus = dataSku == null || !GoodsAuthEnum.PASS.name().equals(dataSku.getAuthFlag()) || !GoodsStatusEnum.UPPER.name().equals(dataSku.getMarketEnable()); boolean checkGoodsStatus = dataSku == null || !GoodsAuthEnum.PASS.name().equals(dataSku.getAuthFlag()) || !GoodsStatusEnum.UPPER.name().equals(dataSku.getMarketEnable());
//商品有效性判定 //商品有效性判定 sku不为空且sku的更新时间不为空且sku的更新时间在购物车sku的更新时间之后
boolean checkGoodsValid = dataSku != null && dataSku.getUpdateTime() != null && dataSku.getUpdateTime().after(cartSkuVO.getGoodsSku().getUpdateTime()); boolean checkGoodsValid = dataSku != null && dataSku.getUpdateTime() != null && dataSku.getUpdateTime().after(cartSkuVO.getGoodsSku().getUpdateTime());
Map<String, Object> promotionMap = dataSku != null ? promotionGoodsService.getCurrentGoodsPromotion(dataSku, tradeDTO.getCartTypeEnum().name()) : null;
log.info("dataSku: {}, goodsSku: {}", dataSku, cartSkuVO.getGoodsSku());
if (checkGoodsStatus || checkGoodsValid) { if (checkGoodsStatus || checkGoodsValid) {
if (checkGoodsStatus) { if (checkGoodsStatus) {
//设置购物车未选中 //设置购物车未选中
@ -125,14 +129,8 @@ public class CheckDataRender implements CartRenderStep {
cartSkuVO.setErrorMessage("商品已下架"); cartSkuVO.setErrorMessage("商品已下架");
} }
if (checkGoodsValid) { if (checkGoodsValid) {
CartSkuVO newCartSkuVO = new CartSkuVO(dataSku,promotionMap); cartSkuVO.rebuildBySku(dataSku);
newCartSkuVO.setCartType(tradeDTO.getCartTypeEnum());
newCartSkuVO.setNum(cartSkuVO.getNum());
newCartSkuVO.setSubTotal(CurrencyUtil.mul(newCartSkuVO.getPurchasePrice(), cartSkuVO.getNum()));
cartSkuVO = newCartSkuVO;
log.info("商品信息已更新,更新后的商品信息为:{}", cartSkuVO);
} }
continue;
} }
//商品库存判定 //商品库存判定

View File

@ -2,7 +2,6 @@ package cn.lili.modules.permission.entity.vo;
import cn.lili.common.utils.ObjectUtil; import cn.lili.common.utils.ObjectUtil;
import cn.lili.elasticsearch.EsSuffix; import cn.lili.elasticsearch.EsSuffix;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
@ -40,9 +39,8 @@ public class SystemLogVO implements Serializable {
@ApiModelProperty(value = "日志记录时间") @ApiModelProperty(value = "日志记录时间")
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") @Field(type = FieldType.Long)
@Field(type = FieldType.Date, fielddata = true) private Long createTime = new Date().getTime();
private Date createTime = new Date();
@ApiModelProperty(value = "请求用户") @ApiModelProperty(value = "请求用户")
@Field(type = FieldType.Text) @Field(type = FieldType.Text)

View File

@ -98,7 +98,7 @@ public class EsGoodsSearchServiceImpl implements EsGoodsSearchService {
@Override @Override
public EsGoodsRelatedInfo getSelector(EsGoodsSearchDTO goodsSearch, PageVO pageVo) { public EsGoodsRelatedInfo getSelector(EsGoodsSearchDTO goodsSearch, PageVO pageVo) {
NativeSearchQueryBuilder builder = createSearchQueryBuilder(goodsSearch, null); NativeSearchQueryBuilder builder = createSearchQueryBuilder(goodsSearch, pageVo);
//分类 //分类
AggregationBuilder categoryNameBuilder = AggregationBuilders.terms("categoryNameAgg").field("categoryNamePath.keyword"); AggregationBuilder categoryNameBuilder = AggregationBuilders.terms("categoryNameAgg").field("categoryNamePath.keyword");
builder.addAggregation(AggregationBuilders.terms("categoryAgg").field("categoryPath").subAggregation(categoryNameBuilder)); builder.addAggregation(AggregationBuilders.terms("categoryAgg").field("categoryPath").subAggregation(categoryNameBuilder));

View File

@ -82,7 +82,7 @@ public class Store extends BaseEntity {
@ApiModelProperty(value = "服务评分") @ApiModelProperty(value = "服务评分")
private Double serviceScore; private Double serviceScore;
@ApiModelProperty(value = "物流描述") @ApiModelProperty(value = "物流评分")
private Double deliveryScore; private Double deliveryScore;
@ApiModelProperty(value = "商品数量") @ApiModelProperty(value = "商品数量")

View File

@ -189,7 +189,7 @@ public class StoreServiceImpl extends ServiceImpl<StoreMapper, Store> implements
} }
/** /**
* 修改店铺详细细腻 * 修改店铺详细信息
* *
* @param storeEditDTO 修改店铺信息 * @param storeEditDTO 修改店铺信息
*/ */
@ -304,7 +304,7 @@ public class StoreServiceImpl extends ServiceImpl<StoreMapper, Store> implements
//获取当前操作的店铺 //获取当前操作的店铺
Store store = getStoreByMember(); Store store = getStoreByMember();
//校验迪纳普状态 //校验店铺状态
checkStoreStatus(store); checkStoreStatus(store);
StoreDetail storeDetail = storeDetailService.getStoreDetail(store.getId()); StoreDetail storeDetail = storeDetailService.getStoreDetail(store.getId());
//设置店铺的银行信息 //设置店铺的银行信息
@ -317,10 +317,9 @@ public class StoreServiceImpl extends ServiceImpl<StoreMapper, Store> implements
//获取当前操作的店铺 //获取当前操作的店铺
Store store = getStoreByMember(); Store store = getStoreByMember();
//校验迪纳普状态 //校验店铺状态
checkStoreStatus(store); checkStoreStatus(store);
BeanUtil.copyProperties(storeOtherInfoDTO, store); BeanUtil.copyProperties(storeOtherInfoDTO, store);
this.updateById(store);
StoreDetail storeDetail = storeDetailService.getStoreDetail(store.getId()); StoreDetail storeDetail = storeDetailService.getStoreDetail(store.getId());
//设置店铺的其他信息 //设置店铺的其他信息
@ -332,11 +331,7 @@ public class StoreServiceImpl extends ServiceImpl<StoreMapper, Store> implements
//修改店铺详细信息 //修改店铺详细信息
storeDetailService.updateById(storeDetail); storeDetailService.updateById(storeDetail);
//设置店铺名称,修改店铺信息 //设置店铺名称,修改店铺信息
store.setStoreName(storeOtherInfoDTO.getStoreName());
store.setStoreDisable(StoreStatusEnum.APPLYING.name()); store.setStoreDisable(StoreStatusEnum.APPLYING.name());
store.setStoreCenter(storeOtherInfoDTO.getStoreCenter());
store.setStoreDesc(storeOtherInfoDTO.getStoreDesc());
store.setStoreLogo(storeOtherInfoDTO.getStoreLogo());
return this.updateById(store); return this.updateById(store);
} }
@ -347,10 +342,11 @@ public class StoreServiceImpl extends ServiceImpl<StoreMapper, Store> implements
*/ */
private void checkStoreStatus(Store store) { private void checkStoreStatus(Store store) {
//如果店铺状态为申请中或者已申请则正常走流程否则抛出异常 //如果店铺状态为已开启已关闭申请中则抛出异常
if (store.getStoreDisable().equals(StoreStatusEnum.APPLY.name()) || store.getStoreDisable().equals(StoreStatusEnum.APPLYING.name())) { if (store.getStoreDisable().equals(StoreStatusEnum.OPEN.name())
return; || store.getStoreDisable().equals(StoreStatusEnum.CLOSED.name())
} else { || store.getStoreDisable().equals(StoreStatusEnum.APPLYING.name())
) {
throw new ServiceException(ResultCode.STORE_STATUS_ERROR); throw new ServiceException(ResultCode.STORE_STATUS_ERROR);
} }

View File

@ -1,6 +1,9 @@
package cn.lili.controller.order; package cn.lili.controller.order;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.NumberUtil;
import cn.lili.common.aop.annotation.PreventDuplicateSubmissions; import cn.lili.common.aop.annotation.PreventDuplicateSubmissions;
import cn.lili.common.enums.ResultCode;
import cn.lili.common.enums.ResultUtil; import cn.lili.common.enums.ResultUtil;
import cn.lili.common.vo.ResultMessage; import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.member.entity.dto.MemberAddressDTO; import cn.lili.modules.member.entity.dto.MemberAddressDTO;
@ -96,7 +99,11 @@ public class OrderManagerController {
@PutMapping(value = "/update/{orderSn}/price") @PutMapping(value = "/update/{orderSn}/price")
public ResultMessage<Order> updateOrderPrice(@PathVariable String orderSn, public ResultMessage<Order> updateOrderPrice(@PathVariable String orderSn,
@NotNull(message = "订单价格不能为空") @RequestParam Double price) { @NotNull(message = "订单价格不能为空") @RequestParam Double price) {
if (NumberUtil.isGreater(Convert.toBigDecimal(price), Convert.toBigDecimal(0))) {
return ResultUtil.data(orderPriceService.updatePrice(orderSn, price)); return ResultUtil.data(orderPriceService.updatePrice(orderSn, price));
} else {
return ResultUtil.error(ResultCode.ORDER_PRICE_ERROR);
}
} }

View File

@ -1,5 +1,7 @@
package cn.lili.controller.order; package cn.lili.controller.order;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.NumberUtil;
import cn.lili.common.aop.annotation.PreventDuplicateSubmissions; import cn.lili.common.aop.annotation.PreventDuplicateSubmissions;
import cn.lili.common.context.ThreadContextHolder; import cn.lili.common.context.ThreadContextHolder;
import cn.lili.common.enums.ResultCode; import cn.lili.common.enums.ResultCode;
@ -103,7 +105,11 @@ public class OrderStoreController {
@PutMapping(value = "/update/{orderSn}/price") @PutMapping(value = "/update/{orderSn}/price")
public ResultMessage<Object> updateOrderPrice(@PathVariable String orderSn, public ResultMessage<Object> updateOrderPrice(@PathVariable String orderSn,
@NotNull(message = "订单价格不能为空") @RequestParam Double orderPrice) { @NotNull(message = "订单价格不能为空") @RequestParam Double orderPrice) {
if (NumberUtil.isGreater(Convert.toBigDecimal(orderPrice), Convert.toBigDecimal(0))) {
return ResultUtil.data(orderPriceService.updatePrice(orderSn, orderPrice)); return ResultUtil.data(orderPriceService.updatePrice(orderSn, orderPrice));
} else {
return ResultUtil.error(ResultCode.ORDER_PRICE_ERROR);
}
} }
@PreventDuplicateSubmissions @PreventDuplicateSubmissions

View File

@ -82,7 +82,7 @@ public class LogisticsStoreController {
@DeleteMapping(value = "/{id}") @DeleteMapping(value = "/{id}")
public ResultMessage<Object> cancel(@PathVariable String id) { public ResultMessage<Object> cancel(@PathVariable String id) {
String storeId = Objects.requireNonNull(UserContext.getCurrentUser()).getStoreId(); String storeId = Objects.requireNonNull(UserContext.getCurrentUser()).getStoreId();
boolean remove = storeLogisticsService.remove(new LambdaQueryWrapper<StoreLogistics>().eq(StoreLogistics::getId, id).eq(StoreLogistics::getStoreId, storeId)); boolean remove = storeLogisticsService.remove(new LambdaQueryWrapper<StoreLogistics>().eq(StoreLogistics::getLogisticsId, id).eq(StoreLogistics::getStoreId, storeId));
return ResultUtil.data(remove); return ResultUtil.data(remove);
} }