package cc.mrbird.febs.mall.service.impl; import cc.mrbird.febs.common.entity.FebsResponse; import cc.mrbird.febs.common.entity.QueryRequest; import cc.mrbird.febs.common.enumerates.OrderStatusEnum; import cc.mrbird.febs.common.utils.LoginUserUtil; import cc.mrbird.febs.common.utils.RedisUtils; import cc.mrbird.febs.mall.dto.AdminMallInvoiceDto; import cc.mrbird.febs.mall.dto.ApiMallInvoiceDto; import cc.mrbird.febs.mall.entity.MallInvoice; import cc.mrbird.febs.mall.entity.MallMember; import cc.mrbird.febs.mall.entity.MallOrderInfo; import cc.mrbird.febs.mall.entity.MallOrderItem; import cc.mrbird.febs.mall.mapper.MallInvoiceMapper; import cc.mrbird.febs.mall.mapper.MallOrderInfoMapper; import cc.mrbird.febs.mall.mapper.MallOrderItemMapper; import cc.mrbird.febs.mall.service.MallInvoiceService; import cc.mrbird.febs.mall.vo.AdminMallOrderInfoVo; import cc.mrbird.febs.mall.vo.ApiMallInvoiceVo; import cc.mrbird.febs.pay.service.WxFaPiaoService; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.io.IOException; import java.util.List; @Slf4j @Service @RequiredArgsConstructor public class MallInvoiceServiceImpl extends ServiceImpl implements MallInvoiceService { private final MallOrderInfoMapper mallOrderInfoMapper; private final MallOrderItemMapper mallOrderItemMapper; private final RedisUtils redisUtils; private final WxFaPiaoService wxFaPiaoService; @Override public FebsResponse getInvoices(ApiMallInvoiceDto apiMallInvoiceDto) { MallMember member = LoginUserUtil.getLoginUser(); apiMallInvoiceDto.setMemberId(member.getId()); IPage page = new Page<>(apiMallInvoiceDto.getPageNum(), apiMallInvoiceDto.getPageSize()); IPage apiMallInvoiceVoIPage = this.baseMapper.selectApiMallInvoiceVoInPage(page, apiMallInvoiceDto); return new FebsResponse().success().data(apiMallInvoiceVoIPage); } @Override public void mallInvoiceJob() { /** * 获取当前已经是已完成且未开过发票的订单 */ List mallOrderInfos = mallOrderInfoMapper.selectOrderInfoByStatusAndIsInvoice(OrderStatusEnum.FINISH.getValue(), 0); if(CollUtil.isEmpty(mallOrderInfos)){ return; } for(MallOrderInfo mallOrderInfo : mallOrderInfos){ /** * 生成开票记录 */ Long memberId = mallOrderInfo.getMemberId(); /** * fapiao_apply_id * 发票申请单号,唯一标识一次开票行为。微信支付场景下,为微信支付订单号;非微信支付场景下,为调用【获取抬头填写链接】接口时指定的发票申请单号 * 对应订单信息的pay_order_no支付订单号 */ String payOrderNo = mallOrderInfo.getPayOrderNo(); List mallInvoices = this.baseMapper.selectByFapiaoApplyIdAndMemberId(payOrderNo, memberId); if(CollUtil.isNotEmpty(mallInvoices)){ MallInvoice mallInvoice = mallInvoices.get(0); mallInvoice.setStatus(mallOrderInfo.getStatus()); this.baseMapper.updateById(mallInvoice); }else{ MallInvoice mallInvoice = new MallInvoice(); mallInvoice.setMemberId(memberId); mallInvoice.setFapiaoApplyId(payOrderNo); mallInvoice.setOrderNo(mallOrderInfo.getOrderNo()); mallInvoice.setOrderId(mallOrderInfo.getId()); mallInvoice.setStatus(mallOrderInfo.getStatus()); mallInvoice.setAmount(mallOrderInfo.getAmount()); List mallOrderItemList = mallOrderItemMapper.selectListByOrderId(mallOrderInfo.getId()); mallInvoice.setGoodsImg(mallOrderItemList.get(0).getSkuImage()); mallInvoice.setState(0); this.baseMapper.insert(mallInvoice); } /** * 更新订单为已开票 */ mallOrderInfo.setIsInvoice(1); mallOrderInfoMapper.updateById(mallOrderInfo); } } @Override public IPage getInvoiceList(AdminMallInvoiceDto mallInvoiceDto, QueryRequest request) { Page page = new Page<>(request.getPageNum(), request.getPageSize()); return this.baseMapper.getInvoiceListInPage(page, mallInvoiceDto); } @Override public List invoiceItemList() { Long existToken = Long.parseLong(redisUtils.getString("ADMIN_INVOICE_ID")); MallInvoice mallInvoice = this.baseMapper.selectById(existToken); if(ObjectUtil.isEmpty(mallInvoice)){ return null; } return this.baseMapper.getInvoiceItemList(mallInvoice); } @Override @Transactional public FebsResponse addInvoiceUrl(MallInvoice mallInvoice) { Long id = mallInvoice.getId(); MallInvoice mallInvoiceOld = this.baseMapper.selectById(id); if(ObjectUtil.isEmpty(mallInvoiceOld)){ return new FebsResponse().fail().message("开票信息异常。"); } Integer status = mallInvoiceOld.getStatus(); if(OrderStatusEnum.FINISH.getValue() != status){ return new FebsResponse().fail().message("订单还未完成,请勿开发票。"); } mallInvoiceOld.setInvoiceUrl(mallInvoice.getInvoiceUrl()); mallInvoiceOld.setState(2); this.baseMapper.updateById(mallInvoiceOld); return new FebsResponse().success(); } @Override @Transactional public FebsResponse updateInvoiceDetail(Long id) { MallInvoice mallInvoice = this.baseMapper.selectById(id); if(ObjectUtil.isEmpty(mallInvoice)){ return new FebsResponse().fail().message("开票信息异常。"); } String fapiaoApplyId = mallInvoice.getFapiaoApplyId(); try { String userInvoiceInfo = wxFaPiaoService.getUserInvoiceInfo(fapiaoApplyId); JSONObject userInvoiceInfoJson = JSONUtil.parseObj(userInvoiceInfo); mallInvoice.setType(userInvoiceInfoJson.getStr("type")); mallInvoice.setName(userInvoiceInfoJson.getStr("name")); mallInvoice.setTaxpayerId(userInvoiceInfoJson.getStr("taxpayer_id")); mallInvoice.setAddress(userInvoiceInfoJson.getStr("address")); mallInvoice.setTelephone(userInvoiceInfoJson.getStr("telephone")); mallInvoice.setBankName(userInvoiceInfoJson.getStr("bank_name")); mallInvoice.setBankAccount(userInvoiceInfoJson.getStr("bank_account")); this.baseMapper.updateById(mallInvoice); } catch (IOException e) { e.printStackTrace(); } return new FebsResponse().success(); } @Override @Transactional public FebsResponse updateOrderDetail(Long id) { MallInvoice mallInvoice = this.baseMapper.selectById(id); if(ObjectUtil.isEmpty(mallInvoice.getFapiaoApplyId())){ return new FebsResponse().fail().message("订单的支付方式不是微信支付。"); } String fapiaoApplyId = mallInvoice.getFapiaoApplyId(); MallOrderInfo mallOrderInfo = mallOrderInfoMapper.selectBypayOrderNo(fapiaoApplyId); if(OrderStatusEnum.FINISH.getValue() != mallOrderInfo.getStatus()){ return new FebsResponse().fail().message("当前订单还未完成。"); } /** * fapiao_apply_id * 发票申请单号,唯一标识一次开票行为。微信支付场景下,为微信支付订单号;非微信支付场景下,为调用【获取抬头填写链接】接口时指定的发票申请单号 * 对应订单信息的pay_order_no支付订单号 */ mallInvoice.setStatus(mallOrderInfo.getStatus()); this.baseMapper.updateById(mallInvoice); /** * 更新订单为已开票 */ mallOrderInfo.setIsInvoice(1); mallOrderInfoMapper.updateById(mallOrderInfo); return new FebsResponse().success(); } }