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;
/**
*
* 服务实现类
*
*
* @author L
* @since 2025-12-30
*/
@Service
public class TTicketOrderServiceImpl extends ServiceImpl 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 pageList(Page page, TTicketOrderQuery query) {
List list = this.baseMapper.pageList(page,query);
page.setRecords( list);
return page;
}
@Override
public Page getOrderList(AppletOrderListQuery query, Integer userId) {
Page page = new Page<>(query.getPageNum(), query.getPageSize());
List list = this.baseMapper.getOrderList(page,query,userId);
page.setRecords(list);
return page;
}
@Override
public Page refundPageList(Page page, TTicketOrderQuery query) {
List 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 tTourists = tTouristService.listByIds(dto.getVisitPersons());
ArrayList 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 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;
}
}