package com.ruoyi.system.service.impl;
|
|
import com.alibaba.fastjson.JSONArray;
|
import com.alibaba.fastjson.JSONObject;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.ruoyi.common.utils.OrderNos;
|
import com.ruoyi.system.dto.CreateOrderDto;
|
import com.ruoyi.system.dto.CreateOrderRequest;
|
import com.ruoyi.system.dto.VisitPerson;
|
import com.ruoyi.system.model.TTicketOrder;
|
import com.ruoyi.system.mapper.TTicketOrderMapper;
|
import com.ruoyi.system.model.TTourist;
|
import com.ruoyi.system.query.AppletOrderListQuery;
|
import com.ruoyi.system.query.TTicketOrderQuery;
|
import com.ruoyi.system.service.TAppUserService;
|
import com.ruoyi.system.service.TTicketOrderService;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.ruoyi.system.service.TTouristService;
|
import com.ruoyi.system.utils.ticketUtil.TicketUtil;
|
import com.ruoyi.system.vo.CreateOrderVo;
|
import com.ruoyi.system.vo.TTicketOrderVo;
|
import org.springframework.stereotype.Service;
|
|
import java.math.BigDecimal;
|
import java.time.LocalDateTime;
|
import java.time.format.DateTimeFormatter;
|
import java.util.ArrayList;
|
import java.util.List;
|
import java.util.stream.Collectors;
|
|
/**
|
* <p>
|
* 服务实现类
|
* </p>
|
*
|
* @author L
|
* @since 2025-12-30
|
*/
|
@Service
|
public class TTicketOrderServiceImpl extends ServiceImpl<TTicketOrderMapper, TTicketOrder> implements TTicketOrderService {
|
|
|
private final TicketUtil ticketUtil;
|
private final TTouristService tTouristService;
|
|
|
|
|
public TTicketOrderServiceImpl(TicketUtil ticketUtil, TTouristService tTouristService) {
|
this.ticketUtil = ticketUtil;
|
this.tTouristService = tTouristService;
|
}
|
|
|
@Override
|
public Page<TTicketOrderVo> pageList(Page<TTicketOrderVo> page, TTicketOrderQuery query) {
|
List<TTicketOrderVo> list = this.baseMapper.pageList(page,query);
|
page.setRecords( list);
|
return page;
|
}
|
|
@Override
|
public Page<TTicketOrderVo> getOrderList(AppletOrderListQuery query, Integer userId) {
|
Page<TTicketOrderVo> page = new Page<>(query.getPageNum(), query.getPageSize());
|
List<TTicketOrderVo> list = this.baseMapper.getOrderList(page,query,userId);
|
page.setRecords(list);
|
return page;
|
}
|
|
@Override
|
public Page<TTicketOrderVo> refundPageList(Page<TTicketOrderVo> page, TTicketOrderQuery query) {
|
List<TTicketOrderVo> list = this.baseMapper.refundPageList(page,query);
|
page.setRecords( list);
|
return page;
|
}
|
|
@Override
|
public boolean addOrder(CreateOrderDto dto, Integer userId) throws Exception {
|
|
CreateOrderRequest request = new CreateOrderRequest();
|
String did = OrderNos.getDid();
|
request.setOrderId(did);
|
request.setTravelDate(dto.getTravelDate());
|
request.setQuantity(dto.getQuantity());
|
request.setProductId(dto.getProductId());
|
|
if (dto.getQuantity()!=dto.getVisitPersons().size()) {
|
throw new RuntimeException("人数不匹配");
|
}
|
|
List<TTourist> tTourists = tTouristService.listByIds(dto.getVisitPersons());
|
ArrayList<VisitPerson> visitPeople = new ArrayList<>();
|
for (TTourist tTourist : tTourists) {
|
VisitPerson visitPerson = new VisitPerson();
|
visitPerson.setName(tTourist.getName());
|
visitPerson.setMobile(tTourist.getPhone());
|
visitPerson.setIdCard(tTourist.getIdCard());
|
visitPeople.add(visitPerson);
|
}
|
request.setVisitPersons(visitPeople);
|
CreateOrderVo createOrderVo = ticketUtil.saveOrder(request);
|
|
TTicketOrder order = new TTicketOrder();
|
order.setAppUserId(userId);
|
order.setOrderNo(did);
|
order.setPartnerOrderId(createOrderVo.getPartnerOrderId());
|
order.setOrderPrice(new BigDecimal(createOrderVo.getOrderAmount()).setScale(2, BigDecimal.ROUND_HALF_UP));
|
|
// 获取票价
|
BigDecimal ticketPrice = order.getOrderPrice().divide(new BigDecimal(dto.getQuantity()), 2, BigDecimal.ROUND_HALF_UP);
|
order.setTicketPrice(ticketPrice);
|
|
|
String result = dto.getVisitPersons().stream()
|
.map(String::valueOf) // Integer 转 String
|
.collect(Collectors.joining(","));
|
order.setTourist(result);
|
order.setTicketNum(dto.getQuantity());
|
order.setStatus(0);
|
|
order.setTicketInfo(dto.getProductName());
|
boolean save = this.save(order);
|
|
|
return save;
|
}
|
|
@Override
|
public boolean refundOrder(TTicketOrder order) throws Exception {
|
String nowTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
|
// 查询未使用的票
|
String visitPersons = order.getVisitPersons();
|
JSONArray jsonArray = JSONArray.parseArray(visitPersons);
|
List<String> ticketIds = new ArrayList<>();
|
for (int i = 0; i < jsonArray.size(); i++) {
|
JSONObject jsonObject = jsonArray.getJSONObject(i);
|
Integer status = jsonObject.getInteger("status");
|
if(status==null || status==0){
|
String ticketId = jsonObject.getString("ticketId");
|
ticketIds.add(ticketId);
|
}
|
}
|
if(ticketIds.isEmpty()){
|
throw new RuntimeException("无未使用的票");
|
}
|
boolean refund = ticketUtil.cannelTicket(order.getOrderNo(), order.getPartnerOrderId(), ticketIds);
|
if(refund){
|
for (int i = 0; i < jsonArray.size(); i++) {
|
JSONObject jsonObject = jsonArray.getJSONObject(i);
|
Integer status = jsonObject.getInteger("status");
|
if(status==null || status==0){
|
jsonObject.put("status",2);
|
jsonObject.put("refundTime",System.currentTimeMillis());
|
}
|
}
|
|
// jsonArray 转换为字符串
|
String result = jsonArray.toJSONString();
|
order.setVisitPersons(result);
|
order.setStatus(4);
|
order.setRefundMoney(order.getTicketPrice().multiply(new BigDecimal(ticketIds.size())));
|
boolean update = this.updateById(order);
|
return update;
|
}
|
return false;
|
}
|
}
|