Files
yunxinwei-java/src/main/java/com/gxwebsoft/apps/task/OrderTask.java
2023-08-11 14:30:45 +08:00

284 lines
12 KiB
Java

package com.gxwebsoft.apps.task;
import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.NumberUtil;
import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
import com.baomidou.mybatisplus.annotation.SqlParser;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.gxwebsoft.apps.entity.Equipment;
import com.gxwebsoft.apps.entity.EquipmentOrderGoods;
import com.gxwebsoft.apps.service.EquipmentGoodsService;
import com.gxwebsoft.apps.service.EquipmentOrderGoodsService;
import com.gxwebsoft.apps.service.EquipmentService;
import com.gxwebsoft.common.core.config.MybatisPlusConfig;
import com.gxwebsoft.common.system.entity.User;
import com.gxwebsoft.common.system.service.UserService;
import com.gxwebsoft.love.entity.UserPlanLog;
import com.gxwebsoft.love.param.UserPlanLogParam;
import com.gxwebsoft.shop.entity.Manager;
import com.gxwebsoft.shop.entity.Merchant;
import com.gxwebsoft.shop.entity.Order;
import com.gxwebsoft.shop.entity.ProfitLog;
import com.gxwebsoft.shop.param.OrderParam;
import com.gxwebsoft.shop.service.ManagerService;
import com.gxwebsoft.shop.service.MerchantService;
import com.gxwebsoft.shop.service.OrderService;
import com.gxwebsoft.shop.service.ProfitLogService;
import io.swagger.models.auth.In;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.NumberUtils;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;
import static com.gxwebsoft.common.core.constants.OrderConstants.*;
/**
* 定时任务:订单处理
*/
@Component
@Slf4j
public class OrderTask {
@Resource
private OrderService orderService;
@Resource
private EquipmentService equipmentService;
@Resource
private EquipmentGoodsService equipmentGoodsService;
@Resource
private EquipmentOrderGoodsService orderGoodsService;
@Resource
private UserService userService;
@Resource
private MerchantService merchantService;
@Resource
private ProfitLogService profitLogService;
@Resource
private ManagerService managerService;
/**
* 删除30分钟未下单的订单
*/
// @Scheduled(cron="0 0/30 * * * ? ")
public void removeTimeoutOrder() {
Date newDate = DateUtil.offset(DateUtil.date(), DateField.MINUTE, -30);
LambdaQueryWrapper<Order> wrapper = Wrappers.lambdaQuery(Order.class)
.eq(Order::getPayStatus, PAY_STATUS_NO_PAY)
.lt(Order::getCreateTime, newDate);
boolean remove = orderService.remove(wrapper);
}
/**
* 计算分润
*/
@Scheduled(cron="0 0/1 * * * ? ")
@Transactional
public void CalcProfit() {
log.info("开始计算分润");
// 查询所有未结算订单
LambdaQueryWrapper<Order> wrapper = Wrappers.lambdaQuery(Order.class)
.eq(Order::getIsSettled, ORDER_SETTLED_NO)
.eq(Order::getPayStatus, PAY_STATUS_SUCCESS)
.eq(Order::getOrderStatus, ORDER_STATUS_COMPLETED);
List<Order> orderList = orderService.list(wrapper);
if(CollectionUtils.isEmpty(orderList)){
return;
}
Set<Integer> equipmentIds = new HashSet<>();
Set<Integer> orderIds = new HashSet<>();
Set<String> tuijianUserPhones = new HashSet<>();
Set<String> mendianCodes = new HashSet<>();
for (Order order : orderList) {
equipmentIds.add(order.getEquipmentId());
mendianCodes.add(order.getMerchantCode());
orderIds.add(order.getOrderId());
if (order.getDealerPhone() != null) {
tuijianUserPhones.add(order.getDealerPhone());
}
}
// 查询所有订单商品
List<EquipmentOrderGoods> orderGoodsList = orderGoodsService.list(Wrappers.lambdaQuery(EquipmentOrderGoods.class).in(EquipmentOrderGoods::getOrderId, orderIds));
Map<Integer, List<EquipmentOrderGoods>> orderGoodsMap = orderGoodsList.stream().collect(Collectors.groupingBy(EquipmentOrderGoods::getOrderId));
// 查询所有关联的设备
List<Equipment> equipmentList = equipmentService.list(Wrappers.lambdaQuery(Equipment.class).in(Equipment::getEquipmentId, equipmentIds));
Map<Integer, Equipment> equipmentMap = new HashMap<>();
Set<Integer> touziUserIds = new HashSet<>();
for (Equipment equipment : equipmentList) {
equipmentMap.put(equipment.getEquipmentId(), equipment);
if (equipment.getTouziUserId() != null) {
touziUserIds.add(equipment.getTouziUserId());
}
}
// 查询所有投资人
Map<Integer, User> touziUserMap = new HashMap<>();
if (CollectionUtils.isNotEmpty(touziUserIds)) {
List<User> list = userService.list(Wrappers.lambdaQuery(User.class).in(User::getUserId, touziUserIds));
for (User user : list) {
touziUserMap.put(user.getUserId(), user);
}
}
// 查询所有推荐人
Map<String, User> tuijianUserMap = new HashMap<>();
if (CollectionUtils.isNotEmpty(tuijianUserPhones)) {
List<User> tuijianUserList = userService.list(Wrappers.lambdaQuery(User.class).in(User::getPhone, tuijianUserPhones));
for (User user : tuijianUserList) {
tuijianUserMap.put(user.getPhone(), user);
}
}
// 查询所有门店
Map<String, Merchant> mendianMap = new HashMap<>();
if (CollectionUtils.isNotEmpty(mendianCodes)) {
List<Merchant> merchantList = merchantService.list(Wrappers.lambdaQuery(Merchant.class).in(Merchant::getMerchantCode, mendianCodes));
for (Merchant merchant : merchantList) {
mendianMap.put(merchant.getMerchantCode(), merchant);
}
}
// 查询所有区域经理
// Wrappers.lambdaQuery(Manager.class)
List<Manager> jingliList = managerService.list();
// 开始结算
for (Order order : orderList) {
// 计算投资人收益
List<EquipmentOrderGoods> equipmentOrderGoods = orderGoodsMap.get(order.getOrderId());
if (CollectionUtils.isNotEmpty(equipmentOrderGoods)) {
EquipmentOrderGoods orderGoods = equipmentOrderGoods.get(0);
BigDecimal touziProfit;
BigDecimal tuijianProfit;
BigDecimal mendianProfit;
BigDecimal jingliProfit;
Merchant merchant = mendianMap.get(order.getMerchantCode());
// 是否分期首期
if ("20".equals(orderGoods.getEquipmentCategory()) && order.getIsRenew() == 0) {
touziProfit = orderGoods.getTouziFirstProfit();
tuijianProfit = orderGoods.getTuijianFirstProfit();
mendianProfit = orderGoods.getMendianFirstProfit();
jingliProfit = orderGoods.getJingliFirstProfit();
} else {
touziProfit = orderGoods.getTouziProfit();
tuijianProfit = orderGoods.getTuijianProfit();
mendianProfit = orderGoods.getMendianProfit();
jingliProfit = orderGoods.getJingliProfit();
}
// 投资人收益
if (touziProfit.compareTo(BigDecimal.ZERO) > 0) {
Equipment equipment = equipmentMap.get(order.getEquipmentId());
User touziUser = touziUserMap.get(equipment.getTouziUserId());
if (touziUser != null) {
userService.updateBalanceByUserId(touziUser.getUserId(), touziProfit);
ProfitLog profitLog = new ProfitLog();
profitLog.setUserId(touziUser.getUserId());
profitLog.setMoney(touziProfit);
profitLog.setScene(1);
profitLog.setMerchantCode(merchant.getMerchantCode());
profitLog.setOrderId(order.getOrderId());
profitLog.setOrderNo(order.getOrderNo());
profitLog.setComments("投资设备:" + equipment.getEquipmentCode());
profitLogService.save(profitLog);
}
}
//推荐人收益
if (tuijianProfit.compareTo(BigDecimal.ZERO) > 0) {
User tuijianUser = tuijianUserMap.get(order.getDealerPhone());
if (tuijianUser != null) {
userService.updateBalanceByUserId(tuijianUser.getUserId(), tuijianProfit);
ProfitLog profitLog = new ProfitLog();
profitLog.setUserId(tuijianUser.getUserId());
profitLog.setMoney(tuijianProfit);
profitLog.setScene(3);
profitLog.setMerchantCode(merchant.getMerchantCode());
profitLog.setOrderId(order.getOrderId());
profitLog.setOrderNo(order.getOrderNo());
profitLog.setComments("推广收益:" + order.getUserId());
profitLogService.save(profitLog);
}
}
// 计算门店收益
if (mendianProfit.compareTo(BigDecimal.ZERO) > 0) {
Integer mendianUserId = merchant.getMerchantOwner();
if (mendianUserId != null) {
userService.updateBalanceByUserId(mendianUserId, mendianProfit);
ProfitLog profitLog = new ProfitLog();
profitLog.setUserId(mendianUserId);
profitLog.setMoney(mendianProfit);
profitLog.setScene(4);
profitLog.setMerchantCode(merchant.getMerchantCode());
profitLog.setOrderId(order.getOrderId());
profitLog.setOrderNo(order.getOrderNo());
profitLog.setComments("门店收益:" + order.getMerchantCode());
profitLogService.save(profitLog);
}
}
// 计算区域经理收益
if (jingliProfit.compareTo(BigDecimal.ZERO) > 0) {
Manager manager = null;
if (merchant.getManagerId() != null) {
manager = jingliList.stream().filter(d -> {
return d.getUserId().equals(merchant.getManagerId());
}).findFirst().orElse(null);
} else {
manager = jingliList.stream().filter(d -> {
return d.getProvince().equals(merchant.getProvince()) && d.getCity().equals(merchant.getCity()) && d.getArea().equals(merchant.getRegion());
}).findFirst().orElse(null);
}
if (manager != null) {
userService.updateBalanceByUserId(manager.getUserId(), jingliProfit);
ProfitLog profitLog = new ProfitLog();
profitLog.setUserId(manager.getUserId());
profitLog.setMoney(jingliProfit);
profitLog.setMerchantCode(merchant.getMerchantCode());
profitLog.setScene(5);
profitLog.setOrderId(order.getOrderId());
profitLog.setOrderNo(order.getOrderNo());
profitLog.setComments("门店业绩:" + order.getMerchantCode());
profitLogService.save(profitLog);
}
}
}
}
LambdaUpdateWrapper<Order> updateWrapper = Wrappers.lambdaUpdate(Order.class).in(Order::getOrderId, orderIds).set(Order::getIsSettled, 1);
orderService.update(updateWrapper);
}
}