package com.ruoyi.order.service.impl;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.account.api.feignClient.AppUserClient;
import com.ruoyi.account.api.model.TAppUser;
import com.ruoyi.account.api.model.TAppUserCar;
import com.ruoyi.chargingPile.api.feignClient.ChargingGunClient;
import com.ruoyi.chargingPile.api.feignClient.SiteClient;
import com.ruoyi.chargingPile.api.model.Site;
import com.ruoyi.common.core.utils.StringUtils;
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.common.core.web.page.PageInfo;
import com.ruoyi.common.security.service.TokenService;
import com.ruoyi.order.api.model.*;
import com.ruoyi.order.api.query.TOrderInvoiceQuery;
import com.ruoyi.order.api.vo.TOrderEvaluateVO;
import com.ruoyi.order.api.vo.TOrderInvoiceVO;
import com.ruoyi.order.dto.*;
import com.ruoyi.order.mapper.TOrderInvoiceMapper;
import com.ruoyi.order.service.*;
import com.ruoyi.other.api.domain.TCoupon;
import com.ruoyi.other.api.domain.TGoods;
import com.ruoyi.other.api.domain.TInvoiceType;
import com.ruoyi.other.api.feignClient.CouponClient;
import com.ruoyi.other.api.feignClient.GoodsClient;
import com.ruoyi.other.api.feignClient.InvoiceTypeClient;
import io.seata.spring.annotation.GlobalTransactional;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
/**
*
* 服务实现类
*
*
* @author xiaochen
* @since 2024-08-07
*/
@Service
public class TOrderInvoiceServiceImpl extends ServiceImpl implements TOrderInvoiceService {
@Resource
private TokenService tokenService;
@Resource
private TOrderInvoiceDetailService orderInvoiceDetailService;
@Resource
private InvoiceTypeClient invoiceTypeClient;
@Resource
private TChargingOrderService chargingOrderService;
@Resource
private TShoppingOrderService shoppingOrderService;
@Resource
private ChargingGunClient chargingGunClient;
@Resource
private SiteClient siteClient;
@Resource
private GoodsClient goodsClient;
@Resource
private CouponClient couponClient;
@Resource
private AppUserClient appUserClient;
@Resource
private TChargingOrderAccountingStrategyService chargingOrderAccountingStrategyService;
@Autowired
private RedissonClient redissonClient;
/**
* 添加开票申请
* @param addOrderInvoice
* @return
*/
@Override
public AjaxResult addOrderInvoice(AddOrderInvoice addOrderInvoice) {
Long userId = tokenService.getLoginUserApplet().getUserId();
RLock lock = redissonClient.getLock("ADD_ORDER_INVOICE:" + userId);
try {
boolean tryLock = lock.tryLock(5, 5, TimeUnit.SECONDS);
if(tryLock){
String orders = addOrderInvoice.getOrders();
if(StringUtils.isEmpty(orders)){
return AjaxResult.error("请选择有效的订单");
}
JSONArray parse = JSONArray.parse(orders);
List orderIds = new ArrayList<>();
Map map = new HashMap<>();
for (int i = 0; i < parse.size(); i++) {
JSONObject jsonObject = parse.getJSONObject(i);
Long id = jsonObject.getLong("id");
BigDecimal amount = jsonObject.getBigDecimal("amount");
orderIds.add(id);
map.put(id, amount);
}
long count = orderInvoiceDetailService.count(new LambdaQueryWrapper().eq(TOrderInvoiceDetail::getOrderType, addOrderInvoice.getOrderType())
.in(TOrderInvoiceDetail::getOrderId, orderIds));
if(count > 0){
return AjaxResult.error("不能重复申请开票,请刷新数据后重试");
}
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
String code = Double.valueOf(Math.random() * 1000).intValue() + sdf.format(new Date());
//获取开票类型
TInvoiceType invoiceType = invoiceTypeClient.getInvoiceType(addOrderInvoice.getInvoiceTypeId()).getData();
addOrderInvoice.setInvoicingCompany(invoiceType.getInvoicingCompany());
addOrderInvoice.setInvoiceType(invoiceType.getName());
addOrderInvoice.setInvoiceMaterial(2);
addOrderInvoice.setInvoicingMethod(invoiceType.getInvoicingMethod());
addOrderInvoice.setAppUserId(userId);
addOrderInvoice.setCode(code);
addOrderInvoice.setStatus(1);
addOrderInvoice.setCreateTime(LocalDateTime.now());
this.save(addOrderInvoice);
for (Long orderId : orderIds) {
List list = chargingOrderAccountingStrategyService.list(new LambdaQueryWrapper()
.eq(TChargingOrderAccountingStrategy::getChargingOrderId, orderId));
BigDecimal electrovalence = list.stream().map(TChargingOrderAccountingStrategy::getElectrovalence).reduce(BigDecimal.ZERO, BigDecimal::add);
BigDecimal serviceCharge = list.stream().map(TChargingOrderAccountingStrategy::getServiceCharge).reduce(BigDecimal.ZERO, BigDecimal::add);
TOrderInvoiceDetail orderInvoiceDetail = new TOrderInvoiceDetail();
orderInvoiceDetail.setOrderInvoiceId(addOrderInvoice.getId());
orderInvoiceDetail.setInvoiceAmount(map.get(orderId));
orderInvoiceDetail.setOrderType(addOrderInvoice.getOrderType());
orderInvoiceDetail.setOrderId(orderId);
orderInvoiceDetail.setElectricityTariff(invoiceType.getElectricityTariff());
orderInvoiceDetail.setServiceTariff(invoiceType.getServiceTariff());
orderInvoiceDetail.setAddedServiceTariff(invoiceType.getAddedServiceTariff());
orderInvoiceDetail.setElectrovalence(electrovalence);
orderInvoiceDetail.setServiceCharge(serviceCharge);
orderInvoiceDetail.setAddedService(serviceCharge.multiply(null == invoiceType.getAddedServiceTariff()
? new BigDecimal(1) : invoiceType.getAddedServiceTariff().divide(new BigDecimal(100))));
orderInvoiceDetailService.save(orderInvoiceDetail);
}
}
}catch (Exception e){
e.printStackTrace();
}finally {
lock.unlock();
}
return AjaxResult.success();
}
/**
* 获取开票记录列表
* @param query
* @return
*/
@Override
public List getMyOrderInvoiceList(GetOrderInvoiceList query) {
Long userId = tokenService.getLoginUserApplet().getUserId();
Integer pageCurr = (query.getPageCurr() - 1) * query.getPageSize();
LambdaQueryWrapper wrapper = new LambdaQueryWrapper().eq(TOrderInvoice::getAppUserId, userId);
if(query.getStatus() != 1){
wrapper.eq(TOrderInvoice::getStatus, query.getStatus());
}
List list = this.list(wrapper.orderByDesc(TOrderInvoice::getCreateTime).last(" limit " + pageCurr + ", " + query.getPageSize()));
List pageList = new ArrayList<>();
for (TOrderInvoice tOrderInvoice : list) {
OrderInvoiceList orderInvoiceList = new OrderInvoiceList();
orderInvoiceList.setId(tOrderInvoice.getId().toString());
orderInvoiceList.setOrderType(tOrderInvoice.getOrderType());
orderInvoiceList.setTotalAmount(tOrderInvoice.getTotalAmount());
orderInvoiceList.setName(tOrderInvoice.getName());
orderInvoiceList.setCreateTime(tOrderInvoice.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
pageList.add(orderInvoiceList);
}
return pageList;
}
/**
* 获取开票申请详情
* @param id
* @return
*/
@Override
public MyOrderInvoiceInfo getMyOrderInvoiceInfo(String id) {
TOrderInvoice orderInvoice = this.getById(id);
MyOrderInvoiceInfo myOrderInvoiceInfo = new MyOrderInvoiceInfo();
myOrderInvoiceInfo.setId(id);
myOrderInvoiceInfo.setCode(orderInvoice.getCode());
myOrderInvoiceInfo.setInvoiceType(orderInvoice.getInvoiceType());
myOrderInvoiceInfo.setOrderType(orderInvoice.getOrderType());
myOrderInvoiceInfo.setInvoicingObjectType(orderInvoice.getInvoicingObjectType());
myOrderInvoiceInfo.setTotalAmount(orderInvoice.getTotalAmount());
myOrderInvoiceInfo.setInvoiceUrl(orderInvoice.getInvoiceUrl());
myOrderInvoiceInfo.setStatus(orderInvoice.getStatus());
Integer orderType = orderInvoice.getOrderType();
List list = orderInvoiceDetailService.list(new LambdaQueryWrapper().eq(TOrderInvoiceDetail::getOrderInvoiceId, id));
List orderIds = list.stream().map(TOrderInvoiceDetail::getOrderId).collect(Collectors.toList());
//充电订单
if(orderType == 1){
List orderList = chargingOrderService.listByIds(orderIds);
List chargingOrder = new ArrayList<>();
for (TChargingOrder tChargingOrder : orderList) {
MyChargingOrderList myChargingOrderList = new MyChargingOrderList();
myChargingOrderList.setId(tChargingOrder.getId().toString());
myChargingOrderList.setStatus(tChargingOrder.getStatus());
Site site = siteClient.getSiteByIds(Arrays.asList(tChargingOrder.getSiteId())).getData().get(0);
myChargingOrderList.setTitle(site.getName());
myChargingOrderList.setChargingDegree(tChargingOrder.getChargingCapacity());
String name = chargingGunClient.getAllName(tChargingOrder.getChargingGunId()).getData();
myChargingOrderList.setName(name);
myChargingOrderList.setEndMode(tChargingOrder.getEndMode());
BigDecimal payMoney = tChargingOrder.getStatus() < 4 ? tChargingOrder.getRechargeAmount() : tChargingOrder.getPaymentAmount();
myChargingOrderList.setPayMoney(payMoney);
myChargingOrderList.setCreateTime(tChargingOrder.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy.MM.dd HH:mm:ss")));
myChargingOrderList.setElectricCharge(tChargingOrder.getElectrovalence());
myChargingOrderList.setServiceCharge(tChargingOrder.getServiceCharge());
chargingOrder.add(myChargingOrderList);
}
myOrderInvoiceInfo.setChargingOrder(chargingOrder);
}
//购物订单
if(orderType == 2){
List orderList = shoppingOrderService.listByIds(orderIds);
List shoppingOrder = new ArrayList<>();
for (TShoppingOrder tShoppingOrder : orderList) {
MyShoppingOrderList myShoppingOrderList = new MyShoppingOrderList();
myShoppingOrderList.setId(tShoppingOrder.getId().toString());
String name = "";
String imgUrl = "";
if(tShoppingOrder.getOrderType() == 1){
TGoods goods = goodsClient.getGoodsById(tShoppingOrder.getGoodsId()).getData();
name = goods.getName();
imgUrl = goods.getCoverPicture();
}else{
TCoupon coupon = couponClient.getCouponById1(tShoppingOrder.getGoodsId()).getData();
name = coupon.getName();
imgUrl = coupon.getCoverPicture();
}
myShoppingOrderList.setName(name);
myShoppingOrderList.setImgUrl(imgUrl);
myShoppingOrderList.setStatus(tShoppingOrder.getStatus());
BigDecimal unitPrice = tShoppingOrder.getPaymentAmount().divide(new BigDecimal(tShoppingOrder.getPurchaseQuantity())).setScale(2, BigDecimal.ROUND_HALF_EVEN);
myShoppingOrderList.setUnitPrice(unitPrice);
myShoppingOrderList.setNumber(tShoppingOrder.getPurchaseQuantity());
myShoppingOrderList.setPaymentAmount(tShoppingOrder.getPaymentAmount());
myShoppingOrderList.setCreateTime(tShoppingOrder.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy.MM.dd HH:mm:ss")));
shoppingOrder.add(myShoppingOrderList);
}
myOrderInvoiceInfo.setShoppingOrder(shoppingOrder);
}
return myOrderInvoiceInfo;
}
@Override
public PageInfo pageList(TOrderInvoiceQuery query) {
List tAppUsers = new ArrayList<>();
// 查询申请用户
if (org.springframework.util.StringUtils.hasLength(query.getUserPhone())){
tAppUsers = appUserClient.selectByPhoneLike(query.getUserPhone()).getData();
if(CollectionUtils.isEmpty(tAppUsers)){
return new PageInfo<>();
}
}
query.setUserIds(tAppUsers.stream().map(TAppUser::getId).collect(Collectors.toList()));
PageInfo pageInfo = new PageInfo<>(query.getPageCurr(),query.getPageSize());
List list = this.baseMapper.pageList(query,pageInfo);
List siteList = siteClient.getSiteAll().getData();
for (TOrderInvoiceVO tOrderInvoiceVO : list) {
tOrderInvoiceVO.setUid(tOrderInvoiceVO.getId().toString());
List collect = orderInvoiceDetailService.lambdaQuery().eq(TOrderInvoiceDetail::getOrderInvoiceId, tOrderInvoiceVO.getId()).list().stream()
.map(TOrderInvoiceDetail::getOrderId).collect(Collectors.toList());
Integer siteId = chargingOrderService.listByIds(collect).get(0).getSiteId();
Site site = siteList.stream().filter(o -> o.getId().equals(siteId)).findFirst().orElse(null);
if(null != site){
tOrderInvoiceVO.setSiteName(site.getName());
}
// 将其全部转化为String
tOrderInvoiceVO.setIds(collect.stream().map(String::valueOf).collect(Collectors.toList()));
TAppUser appUser = appUserClient.getUserById(tOrderInvoiceVO.getAppUserId()).getData();
if (appUser!=null){
tOrderInvoiceVO.setUserPhone(appUser.getPhone());
}
}
// 查询这个开票的订单ids
if (!list.isEmpty()){
List ids = list.stream().map(TOrderInvoiceVO::getId).collect(Collectors.toList());
List orderInvoiceDetailList = orderInvoiceDetailService.list(new LambdaQueryWrapper()
.in(TOrderInvoiceDetail::getOrderInvoiceId, ids));
List finalTAppUsers = tAppUsers;
list.forEach(e->{
if (e.getOrderType()!=null&&e.getOrderType()==1){
e.setServiceTariff(orderInvoiceDetailList.get(0).getServiceTariff());
}else{
e.setServiceTariff(new BigDecimal("0"));
}
e.setElectricityTariff(orderInvoiceDetailList.get(0).getElectricityTariff());
e.setAddedServiceTariff(orderInvoiceDetailList.get(0).getAddedServiceTariff());
e.setAddedService(orderInvoiceDetailList.stream().filter(t->t.getOrderInvoiceId().equals(e.getId()) &&t.getAddedService()!=null).map(TOrderInvoiceDetail::getAddedService).reduce(BigDecimal::add).get());
e.setElectrovalence(orderInvoiceDetailList.stream().filter(t->t.getOrderInvoiceId().equals(e.getId()) &&t.getElectrovalence()!=null).map(TOrderInvoiceDetail::getElectrovalence).reduce(BigDecimal::add).get());
e.setServiceCharge(orderInvoiceDetailList.stream().filter(t->t.getOrderInvoiceId().equals(e.getId()) && t.getServiceCharge()!=null).map(TOrderInvoiceDetail::getServiceCharge).reduce(BigDecimal::add).get());
});
}
pageInfo.setRecords(list);
return pageInfo;
}
@Override
public Map statusCount(TOrderInvoiceQuery query) {
Map map = new HashMap<>();
List tAppUsers = new ArrayList<>();
if (org.springframework.util.StringUtils.hasLength(query.getUserPhone())){
tAppUsers = appUserClient.selectByPhoneLike(query.getUserPhone()).getData();
if(CollectionUtils.isEmpty(tAppUsers)){
map.put("notAccepted",0);
map.put("processing",0);
map.put("finished",0);
return map;
}
}
query.setUserIds(tAppUsers.stream().map(TAppUser::getId).collect(Collectors.toList()));
map = this.baseMapper.statusCount(query);
return map;
}
@Override
public List export(TOrderInvoiceQuery query) {
List tAppUsers = new ArrayList<>();
// 查询申请用户
if (org.springframework.util.StringUtils.hasLength(query.getUserPhone())){
tAppUsers = appUserClient.selectByPhoneLike(query.getUserPhone()).getData();
if(CollectionUtils.isEmpty(tAppUsers)){
return new ArrayList();
}
}
query.setUserIds(tAppUsers.stream().map(TAppUser::getId).collect(Collectors.toList()));
PageInfo pageInfo = new PageInfo<>(query.getPageCurr(),query.getPageSize());
List list = this.baseMapper.export(query);
List ids = list.stream().map(TOrderInvoiceVO::getId).collect(Collectors.toList());
List orderInvoiceDetailList = orderInvoiceDetailService.list(new LambdaQueryWrapper()
.in(TOrderInvoiceDetail::getOrderInvoiceId, ids));
List finalTAppUsers = tAppUsers;
list.forEach(e->{
e.setServiceTariff(orderInvoiceDetailList.get(0).getServiceTariff());
e.setElectricityTariff(orderInvoiceDetailList.get(0).getElectricityTariff());
e.setAddedServiceTariff(orderInvoiceDetailList.get(0).getAddedServiceTariff());
e.setAddedService(orderInvoiceDetailList.stream().filter(t->t.getAddedService()!=null).map(TOrderInvoiceDetail::getAddedService).reduce(BigDecimal::add).get());
e.setElectrovalence(orderInvoiceDetailList.stream().filter(t->t.getElectrovalence()!=null).map(TOrderInvoiceDetail::getElectrovalence).reduce(BigDecimal::add).get());
e.setServiceCharge(orderInvoiceDetailList.stream().filter(t->t.getServiceCharge()!=null).map(TOrderInvoiceDetail::getServiceCharge).reduce(BigDecimal::add).get());
if (e.getBillingUserId()!=null){
e.setUserPhone(finalTAppUsers.stream().filter(m->m.getId().equals(Long.parseLong(e.getBillingUserId().toString()))).findFirst().get().getPhone());
}
});
return list;
}
}