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.OrderUtil;
|
import com.ruoyi.common.utils.StringUtils;
|
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.checkerframework.checker.units.qual.A;
|
import org.springframework.beans.BeanUtils;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.core.annotation.OrderUtils;
|
import org.springframework.stereotype.Service;
|
import org.springframework.transaction.annotation.Propagation;
|
import org.springframework.transaction.annotation.Transactional;
|
|
import javax.annotation.Resource;
|
import java.io.UnsupportedEncodingException;
|
import java.math.BigDecimal;
|
import java.math.RoundingMode;
|
import java.net.InetAddress;
|
import java.net.MalformedURLException;
|
import java.util.Date;
|
import java.util.List;
|
import java.util.Objects;
|
import java.util.Optional;
|
|
/**
|
* <p>
|
* 订单表 服务实现类
|
* </p>
|
*
|
* @author administrator
|
* @since 2025-05-27
|
*/
|
@Slf4j
|
@Service
|
public class TbOrderServiceImpl extends ServiceImpl<TbOrderMapper, TbOrder> 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;
|
|
|
@Override
|
public Page<MyPushCompanyListVo> getMyOrderList(MyOrderListQuery query, Long userId) {
|
Page<MyPushCompanyListVo> page = new Page<>(query.getPageNum(), query.getPageSize());
|
return this.baseMapper.getMyOrderList(page,query,userId);
|
}
|
|
@Override
|
public WxPayMpOrderResult payOrder(TbOrder tbOrder, Long userId) {
|
WxPayMpOrderResult result = this.createWxOrderToWxService(tbOrder.getUserId(),tbOrder.getOrderNo(),tbOrder.getPrice(),"购买商品", "");
|
return result;
|
}
|
|
@Override
|
public void 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();
|
}
|
|
@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<TbOrder>().eq(TbOrder::getOrderNo, outTradeNo));
|
if (order!=null) {
|
order.setStatus(4);
|
order.setPayTime(new Date());
|
order.setOutTradeNo(notifyResult.getTransactionId());
|
TbCompany company = companyService.getById(order.getCompanyId());
|
// 生成记录 看是否分佣 金额
|
TbUser user = userService.getById(company.getUserId());
|
TbSystemConfig config = configService.getOne(new LambdaQueryWrapper<TbSystemConfig>().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(price).setScale(2, RoundingMode.HALF_UP);
|
order.setCommissionPrice(userCommissionMoney);
|
}
|
order.setShare_user_id(user.getInviteId());
|
order.setCommissionPlatform(platformCommissionMoney);
|
}
|
order.updateById();
|
|
// 生成记录
|
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());
|
messageService.addMessage("您发布的订单买家已支付,请尽快处理!", company.getUserId(),order.getId());
|
}
|
|
|
return "<xml> <return_code><![CDATA[SUCCESS]]></return_code> <return_msg><![CDATA[OK]]></return_msg> </xml>";
|
}
|
|
@Override
|
public void commission(TbOrder order,String userId) {
|
String shareUserId = order.getShare_user_id();
|
if(StringUtils.isNotEmpty(shareUserId)){
|
TbUser shareUser = userService.getById(shareUserId);
|
BigDecimal add = shareUser.getBalance().add(order.getCommissionPrice());
|
shareUser.setBalance(add);
|
shareUser.updateById();
|
|
TbAccountDetail accountDetail = new TbAccountDetail();
|
accountDetail.setUserId(shareUserId);
|
accountDetail.setType(1);
|
accountDetail.setCategory(4);
|
accountDetail.setStatus(2);
|
accountDetail.setMoney(order.getCommissionPrice());
|
accountDetail.setOrderPrice(order.getPrice());
|
accountDetail.setSourceId(order.getUserId());
|
accountDetail.insert();
|
|
|
}
|
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 tbBuyerCompanyInfo = new TbBuyerCompanyInfo();
|
BeanUtils.copyProperties(dto,tbBuyerCompanyInfo);
|
tbBuyerCompanyInfo.setOrderId(tbOrder.getId());
|
List<TbShareholder> shareholders = dto.getShareholders();
|
|
BigDecimal addMoney=BigDecimal.ZERO;
|
int addDay=0;
|
// 判断是否需要支付改名费 迁区费
|
if(dto.getNeedRename()==1){
|
addMoney = company.getRenameMoney();
|
addDay=company.getRenameDay();
|
}
|
if(dto.getNewDistrict()==1){
|
addMoney = addMoney.add(company.getRelocationAreaMoney());
|
addDay = addDay+company.getRelocationAreaDay();
|
}
|
// 更新订单金额
|
if(addMoney.compareTo(BigDecimal.ZERO)>0){
|
BigDecimal add = tbOrder.getPrice().add(addMoney);
|
tbOrder.setPrice(add);
|
tbOrder.updateById();
|
}
|
if(addDay>0){
|
tbBuyerCompanyInfo.setAddDay(addDay);
|
}
|
tbBuyerCompanyInfo.insert();
|
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<java.lang.String, java.lang.Object>
|
*/
|
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.setSpbillCreateIp(
|
InetAddress.getLoopbackAddress().getHostAddress());
|
wxPayUnifiedOrderRequest.setTradeType("JSAPI");
|
wxPayUnifiedOrderRequest.setNotifyUrl(
|
wxProperties.getNotifyUrl() +"mall-hotel-order/WX/callback");
|
WxPayMpOrderResult result = wxPayService.createOrder(wxPayUnifiedOrderRequest);
|
|
return result;
|
} catch (WxPayException e) {
|
log.error("微信支付失败!订单号:{},原因:{}", outTradeNo, e.getMessage());
|
e.printStackTrace();
|
throw new RuntimeException(e);
|
}
|
}
|
}
|