package com.ruoyi.system.service.impl;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult;
import com.github.binarywang.wxpay.bean.order.WxPayMpOrderResult;
import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
import com.github.binarywang.wxpay.exception.WxPayException;
import com.github.binarywang.wxpay.service.WxPayService;
import com.ruoyi.common.utils.AliSmsUtil;
import com.ruoyi.common.utils.OrderUtil;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.VoiceNotifyMain;
import com.ruoyi.system.dto.AddBuyerCompanyInfoDto;
import com.ruoyi.system.mapper.TbOrderMapper;
import com.ruoyi.system.model.*;
import com.ruoyi.system.query.MyOrderListQuery;
import com.ruoyi.system.service.*;
import com.ruoyi.system.utils.wx.WxProperties;
import com.ruoyi.system.vo.MyPushCompanyListVo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.net.InetAddress;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
/**
*
* 订单表 服务实现类
*
*
* @author administrator
* @since 2025-05-27
*/
@Slf4j
@Service
public class TbOrderServiceImpl extends ServiceImpl implements TbOrderService {
@Resource
private WxProperties wxProperties;
@Resource
private WxPayService wxPayService;
@Autowired
private TbSystemConfigService configService;
@Autowired
private TbUserService userService;
@Autowired
private TbCompanyService companyService;
@Autowired
private TbMessageService messageService;
@Autowired
private TbShareholderService shareholderService;
@Autowired
private TbAccountDetailService accountDetailService;
// 自定义线程池
private static final ThreadPoolExecutor executor = new ThreadPoolExecutor(2, 5, 1000, TimeUnit.MILLISECONDS,new LinkedBlockingQueue());
@Override
public Page getMyOrderList(MyOrderListQuery query, Long userId) {
Page page = new Page<>(query.getPageNum(), query.getPageSize());
return this.baseMapper.getMyOrderList(page,query,userId);
}
@Override
public HashMap getMyOrderListNum(Long userId, HashMap map) {
List list = this.baseMapper.getMyOrderListNum(userId);
map.put("toBeConfirmed", list.stream().filter(e -> e.getStatus() == 2).count());
map.put("pendingPayment", list.stream().filter(e -> e.getStatus() == 3).count());
map.put("processing", list.stream().filter(e -> e.getStatus() == 4).count()+list.stream().filter(e -> e.getStatus() == 5).count());
map.put("completed", list.stream().filter(e -> e.getStatus() == 6).count());
return map;
}
@Override
public WxPayMpOrderResult payOrder(TbOrder tbOrder, Long userId) {
TbUser user = userService.getById(userId);
WxPayMpOrderResult result = this.createWxOrderToWxService(user.getOpenId(),tbOrder.getOrderNo(),tbOrder.getPrice(),"购买商品", "");
return result;
}
@Override
public String placeOrder(String companyId, TbCompany company,Long userId) {
// 创建订单
TbOrder tbOrder = new TbOrder();
tbOrder.setCompanyId(companyId);
tbOrder.setUserId(userId.toString());
tbOrder.setOrderNo( OrderUtil.getOrderNoForPrefix("ZSX"));
tbOrder.setStatus(2);
tbOrder.setPrice(company.getSaleMoney());
tbOrder.insert();
company.setStatus(4);
company.updateById();
return tbOrder.getId();
}
@Override
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
public String weAppletChatNotice(String xmlData) throws WxPayException {
final WxPayOrderNotifyResult notifyResult = this.wxPayService.parseOrderNotifyResult(
xmlData);
// 更新用户订单状态
String outTradeNo = notifyResult.getOutTradeNo();
TbOrder order = this.getOne(new LambdaQueryWrapper().eq(TbOrder::getOrderNo, outTradeNo).eq(TbOrder::getStatus, 3));
if (order!=null) {
order.setStatus(4);
order.setPayTime(new Date());
order.setOutTradeNo(notifyResult.getOutTradeNo());
order.setTransactionId(notifyResult.getTransactionId());
TbCompany company = companyService.getById(order.getCompanyId());
// 购买人 生成记录 看是否分佣 金额 发布人 如A用户售卖100元公司 C用户购买这个公司 B是C的上级 抽10% 平台抽成20% 那么A应得80 B得2 平台得18
TbUser user = userService.getById(order.getUserId());
TbSystemConfig config = configService.getOne(new LambdaQueryWrapper().eq(TbSystemConfig::getType, 3));
if(config!=null){
JSONObject jsonObject = JSONObject.parseObject(config.getContent());
BigDecimal platformCommission = new BigDecimal(jsonObject.get("platform").toString());
BigDecimal userCommission = new BigDecimal(jsonObject.get("user").toString());
BigDecimal price = order.getPrice();
BigDecimal divide = platformCommission.divide(new BigDecimal("100"));
// 平台抽佣
BigDecimal platformCommissionMoney = divide.multiply(price).setScale(2, RoundingMode.HALF_UP);
// 购买人是否绑定了用户 且次数足够
if(StringUtils.isNotEmpty(user.getInviteId()) && user.getInviteNum()>0){
BigDecimal divide1 = userCommission.divide(new BigDecimal("100"));
BigDecimal userCommissionMoney = divide1.multiply(platformCommissionMoney).setScale(2, RoundingMode.HALF_UP);
order.setCommissionPrice(userCommissionMoney);
platformCommissionMoney = platformCommissionMoney.subtract(userCommissionMoney);
if(userCommissionMoney.doubleValue()>0){
TbUser shareUser = userService.getById(user.getInviteId());
if(shareUser!=null){
BigDecimal add = shareUser.getBalance().add(order.getCommissionPrice());
shareUser.setBalance(add);
shareUser.updateById();
}
TbAccountDetail accountDetail = new TbAccountDetail();
accountDetail.setUserId(user.getInviteId());
accountDetail.setType(1);
accountDetail.setCategory(4);
accountDetail.setStatus(2);
accountDetail.setMoney(order.getCommissionPrice());
accountDetail.setOrderPrice(order.getPrice());
accountDetail.setSourceId(order.getUserId());
accountDetail.insert();
user.setInviteNum(user.getInviteNum()-1);
user.updateById();
}
}
order.setShareUserId(user.getInviteId());
order.setCommissionPlatform(platformCommissionMoney);
}
boolean b = order.updateById();
if(b) {
// 生成记录
TbAccountDetail tbAccountDetail = new TbAccountDetail();
tbAccountDetail.setUserId(company.getUserId());
tbAccountDetail.setType(1);
tbAccountDetail.setCategory(2);
tbAccountDetail.setStatus(1);
BigDecimal subtract = order.getPrice().subtract(order.getCommissionPrice()).subtract(order.getCommissionPlatform());
tbAccountDetail.setMoney(subtract);
tbAccountDetail.setOrderId(order.getId());
tbAccountDetail.insert();
// 生成记录
TbAccountDetail tbAccountDetail1 = new TbAccountDetail();
tbAccountDetail1.setUserId(order.getUserId());
tbAccountDetail1.setType(2);
tbAccountDetail1.setCategory(5);
tbAccountDetail1.setStatus(2);
tbAccountDetail1.setMoney(order.getPrice());
tbAccountDetail1.setOrderId(order.getId());
tbAccountDetail1.insert();
messageService.addMessage("下单成功,请及时发送快递", order.getUserId(), order.getId(), 2);
messageService.addMessage("您发布的订单买家已支付,请尽快处理!", company.getUserId(), order.getId(), 1);
// 生成办理进度
TbSchedule tbSchedule = new TbSchedule();
tbSchedule.setOrderId(order.getId());
tbSchedule.setText("请及时快递发送所需资料");
tbSchedule.setCreateTime(new Date());
tbSchedule.setUserId(company.getUserId());
tbSchedule.insert();
TbUser user1 = userService.getById(company.getUserId());
AliSmsUtil.sendPaySuccessMessageSeller(user1.getPhone());
try {
VoiceNotifyMain.call2(user1.getPhone());
}catch (Exception e){
e.printStackTrace();
}
return " ";
}
}
return null;
}
@Override
public void commission(TbOrder order,String userId) {
BigDecimal decimal = order.getPrice().subtract(order.getCommissionPrice()).subtract(order.getCommissionPlatform());
TbUser user = userService.getById(userId);
BigDecimal add = user.getBalance().add(decimal);
user.setBalance(add);
user.updateById();
}
@Override
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
public void lastPayOrderData(TbOrder tbOrder, AddBuyerCompanyInfoDto dto, Long userId,TbCompany company, TbBuyerCompanyInfo one) {
TbBuyerCompanyInfo tbBuyerCompanyInfo = new TbBuyerCompanyInfo();
BeanUtils.copyProperties(dto,tbBuyerCompanyInfo);
if(one!=null){
tbBuyerCompanyInfo.setId(one.getId());
}
tbBuyerCompanyInfo.setOrderId(tbOrder.getId());
List shareholders = dto.getShareholders();
BigDecimal addMoney=BigDecimal.ZERO;
int addDay=0;
// 判断是否需要支付改名费 迁区费
if(dto.getNeedRename()==1){
if(company.getRenameMoney()!=null){
addMoney = company.getRenameMoney();
}
addDay=company.getRenameDay();
}
if(dto.getNewDistrict()==1){
if(company.getRelocationAreaMoney()!=null){
addMoney = addMoney.add(company.getRelocationAreaMoney());
}
addDay = addDay+company.getRelocationAreaDay();
}
// 更新订单金额
BigDecimal add = company.getSaleMoney().add(addMoney);
tbOrder.setPrice(add);
tbOrder.setOrderNo(OrderUtil.getOrderNoForPrefix("ZSX"));
tbOrder.updateById();
if(addDay>0){
tbBuyerCompanyInfo.setAddDay(addDay);
}
tbBuyerCompanyInfo.insertOrUpdate();
shareholderService.remove(new LambdaQueryWrapper().eq(TbShareholder::getOrderId, tbOrder.getId()));
for (TbShareholder shareholder : shareholders) {
shareholder.setOrderId(tbOrder.getId());
shareholder.insert();
}
}
/**
* @param openId 微信用户openId
* @param outTradeNo 我们的系统订单编号
* @param amountPrice 付款金额
* @param description 商品描述
* @param type 付款类型 详见PayTypeEnumConst
* @Description: 向微信服务器发起预付款订单
* @Return: java.util.Map
*/
public WxPayMpOrderResult createWxOrderToWxService(String openId, String outTradeNo,
BigDecimal amountPrice, String description, String type){
double amount = amountPrice.doubleValue(); // 将字符串"0.01"转换为浮点数0.01
int amountInFen = (int) (amount * 100);
try {
WxPayUnifiedOrderRequest wxPayUnifiedOrderRequest = new WxPayUnifiedOrderRequest();
wxPayUnifiedOrderRequest.setBody("购买商品");
wxPayUnifiedOrderRequest.setOutTradeNo(outTradeNo);
wxPayUnifiedOrderRequest.setTotalFee(amountInFen);// 元转成分
wxPayUnifiedOrderRequest.setOpenid(openId);
wxPayUnifiedOrderRequest.setSpbillCreateIp(
InetAddress.getLoopbackAddress().getHostAddress());
wxPayUnifiedOrderRequest.setTradeType("JSAPI");
wxPayUnifiedOrderRequest.setNotifyUrl(
wxProperties.getNotifyUrl());
WxPayMpOrderResult result = wxPayService.createOrder(wxPayUnifiedOrderRequest);
return result;
} catch (WxPayException e) {
log.error("微信支付失败!订单号:{},原因:{}", outTradeNo, e.getMessage());
e.printStackTrace();
throw new RuntimeException(e);
}
}
}