From cf59c548d06bcb8dd824a97403658ca90164abfd Mon Sep 17 00:00:00 2001
From: Helius <wangdoubleone@gmail.com>
Date: Tue, 23 Jan 2024 10:06:08 +0800
Subject: [PATCH] Merge branch 'blnka' into blnka-vip

---
 src/main/java/cc/mrbird/febs/mall/service/impl/MallInvoiceServiceImpl.java |  160 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 160 insertions(+), 0 deletions(-)

diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/MallInvoiceServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/MallInvoiceServiceImpl.java
new file mode 100644
index 0000000..1739659
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/service/impl/MallInvoiceServiceImpl.java
@@ -0,0 +1,160 @@
+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<MallInvoiceMapper, MallInvoice> 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<ApiMallInvoiceVo> page = new Page<>(apiMallInvoiceDto.getPageNum(), apiMallInvoiceDto.getPageSize());
+        IPage<ApiMallInvoiceVo> apiMallInvoiceVoIPage = this.baseMapper.selectApiMallInvoiceVoInPage(page, apiMallInvoiceDto);
+        return new FebsResponse().success().data(apiMallInvoiceVoIPage);
+    }
+
+    @Override
+    public void mallInvoiceJob() {
+        /**
+         * 获取当前已经是已完成且未开过发票的订单
+         */
+        List<MallOrderInfo> 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<MallInvoice> 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<MallOrderItem> 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<MallInvoice> getInvoiceList(AdminMallInvoiceDto mallInvoiceDto, QueryRequest request) {
+        Page<MallInvoice> page = new Page<>(request.getPageNum(), request.getPageSize());
+        return  this.baseMapper.getInvoiceListInPage(page, mallInvoiceDto);
+    }
+
+    @Override
+    public List<MallOrderItem> 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();
+    }
+}

--
Gitblit v1.9.1