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); } } }