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