InvoiceDownAndMailJob.java 9.91 KB
package com.zteits.pay.job;


import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import com.alibaba.fastjson.JSONObject;
import com.clouds.common.cache.park.MessageTempletCacheUtil;
import com.clouds.common.utils.MsgTemplateUtil;
import com.xiaoleilu.hutool.date.DateTime;
import com.xiaoleilu.hutool.date.DateUtil;
import com.xxl.job.core.biz.model.ReturnT;

import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.core.handler.annotation.XxlJob;
import com.zteits.clouds.api.apibase.bean.BaseInfo;
import com.zteits.clouds.api.apibase.bean.BizResult;
import com.zteits.clouds.api.apibase.bean.PageBean;
import com.zteits.clouds.api.apibase.constants.BasicEnum;
import com.zteits.clouds.api.apibase.constants.InvoiceStateEnum;
import com.zteits.clouds.api.dto.pay.TdCCustInvoiceHisDTO;
import com.zteits.clouds.api.dto.pay.dto.TdCCustInvoiceMailDTO;
import com.zteits.clouds.api.dto.pay.dto.TdCCustInvoiceSaleDTO;
import com.zteits.clouds.api.dto.pay.param.TdCCustInvoiceHisQueryRequest;
import com.zteits.clouds.api.dto.pay.param.TdCCustInvoiceHisRequest;
import com.zteits.clouds.api.dto.pay.param.TdCCustInvoiceSaleQueryRequest;
import com.zteits.clouds.api.service.pay.invoice.InvoiceHelperService;
import com.zteits.pay.configuration.mail.MailService;
import com.zteits.pay.dao.TdCCustInvoiceHisDao;
import com.zteits.pay.dao.TdCCustInvoiceMailDao;
import com.zteits.pay.dao.TdCCustInvoiceSaleDao;
import com.zteits.pay.domain.TdCCustInvoiceHis;
import com.zteits.pay.domain.TdCCustInvoiceMail;
import com.zteits.pay.domain.TdCCustInvoiceSale;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.math.BigDecimal;
import java.util.Arrays;
import java.util.Collections;
import java.util.Date;
import java.util.List;

/**
 * 电子发票下载-邮寄
 * Copyright: Copyright (c) 2017  zteits
 *
 * @ClassName: InvoiceDownAndMailJob.java
 * @Description:
 * @version: v1.0.0
 * @author: wangfei
 * @date: 2019年9月4日   下午2:53:38
 * Modification History:
 * Date         Author          Version      Description
 * ---------------------------------------------------------*
 * 2019年9月4日      wangfei          v1.0.0          创建
 */
@Component
public class InvoiceDownAndMailJob {
    private static final Logger logger = LoggerFactory.getLogger(InvoiceDownAndMailJob.class);
    @Autowired
    private InvoiceHelperService invoiceHelperService;
    @Autowired
    private MailService mailService;
    @Autowired
    private TdCCustInvoiceHisDao custInvoiceHisDao;
    @Autowired
    private TdCCustInvoiceSaleDao tdCCustInvoiceSaleDao;
    @Autowired
    private TdCCustInvoiceMailDao tdCCustInvoiceMailDao;

    @XxlJob(value="InvoiceDownAndMailJob")
    public ReturnT<String> execute(String... params) throws Exception {
        String param = XxlJobHelper.getJobParam();
        if (StringUtils.isNotEmpty(param) && params == null) {
            params = param.split(",");
        }

        DateTime endTime = DateUtil.endOfDay(new Date());
        DateTime beginTime = DateUtil.beginOfDay(new Date());
        if (null != params && params.length == 1) {
            beginTime = DateUtil.beginOfDay(DateUtil.parse(params[0], "yyyy-MM-dd"));
            endTime = DateUtil.endOfDay(DateUtil.parse(params[0], "yyyy-MM-dd"));
        }
        if (null != params && params.length > 1) {
            beginTime = DateUtil.beginOfDay(DateUtil.parse(params[0], "yyyy-MM-dd"));
            endTime = DateUtil.endOfDay(DateUtil.parse(params[1], "yyyy-MM-dd"));
        }
        int updateCount =0;
        this.logger("---begin查询已开票未下载、邮寄的电子发票信息,统计时间:"+beginTime+"----"+endTime);
        TdCCustInvoiceHisQueryRequest request = new TdCCustInvoiceHisQueryRequest();
        request.setInvoiceBeginTime(beginTime);
        request.setInvoiceEndTime(endTime);
        request.setSysCode(BasicEnum.SYS_CODE.getValue());
        request.setBaseRequest(new BaseInfo(1, 100));
        request.setInvoiceStates(Arrays.asList(InvoiceStateEnum.ALREADY_OPEN_INVOICE.getValue()+""
                ,InvoiceStateEnum.DOWN_FAILD.getValue()+"",InvoiceStateEnum.ALREADY_DOWNLOAD.getValue()+""));

        BizResult<PageBean<TdCCustInvoiceHisDTO>> rsList = invoiceHelperService.queryCustInvoiceHisForPage(request);
        this.logger("本次查询已开票未下载、邮寄的电子发票条数="
                +(CollectionUtils.isNotEmpty(rsList.getData().getDataList()) ? rsList.getData().getDataList().size() :0));
        if(rsList.isSuccess() && rsList.getData()!=null && CollectionUtils.isNotEmpty(rsList.getData().getDataList())) {
            int index = 1;
            for(TdCCustInvoiceHisDTO dto :rsList.getData().getDataList()) {
                this.logger("begin开始下载、邮寄第"+(index++)+"条,获取到的发票信息="+JSONObject.toJSON(dto));
                if(dto == null || StringUtils.isEmpty(dto.getInvoiceId()) || StringUtils.isEmpty(dto.getSaleTaxid())){
                    this.logger("发票参数为空!");
                    continue;
                }
                String mailTemplet = MessageTempletCacheUtil.getTempletByTempletId("email_"+dto.getOrgId());
                if(StringUtils.isBlank(mailTemplet)){
                    //按组织没有获取到email模板,则取默认的
                    mailTemplet = MessageTempletCacheUtil.getTempletByTempletId("email");
                }
                if(StringUtils.isBlank(mailTemplet)){
                    this.logger("没有获取到电子邮件模板!!!");
                    continue;
                }

                //下载发票
                TdCCustInvoiceHisRequest downRequest = new TdCCustInvoiceHisRequest();
                downRequest.setSysCode(BasicEnum.SYS_CODE.getValue());
                downRequest.setOrderIds(Arrays.asList(dto.getInvoiceId()));
                downRequest.setSaleTaxid(dto.getSaleTaxid());
                downRequest.setOrgId(dto.getOrgId());
                BizResult<Boolean> downResult = invoiceHelperService.downTheInvoice(downRequest);
                if(!downResult.isSuccess() || !downResult.getData()){
                    this.logger("下载电子发票失败!:"+JSONObject.toJSONString(downResult));
                    continue;
                }
                TdCCustInvoiceHisDTO invoice = custInvoiceHisDao.queryCustInvoiceHisByInvoiceId(dto.getInvoiceId());
                if(invoice == null || StringUtils.isBlank(invoice.getInvoiceUrl())){
                    logger.error("开票信息为空!请先开票");
                    continue;
                }
                //查询开票服务器信息
                TdCCustInvoiceSaleQueryRequest saleRequest = new TdCCustInvoiceSaleQueryRequest();
                saleRequest.setOrgId(dto.getOrgId());
                // 补充税号 , 根据税号查询对应销方信息
                saleRequest.setSaleTaxids(Collections.singletonList(invoice.getSaleTaxid()));
                saleRequest.setSysCode(BasicEnum.SYS_CODE.getValue());
                List<TdCCustInvoiceSale> sales = tdCCustInvoiceSaleDao.queryTdCCustInvoiceSale(saleRequest);
                if(CollectionUtils.isEmpty(sales)){
                    logger.error("根据当前orgId["+dto.getOrgId()+"]没有查询到相应的开票服务器信息,请及时添加!");
                    continue;
                }
                TdCCustInvoiceSaleDTO saleDTO = new TdCCustInvoiceSaleDTO();
                BeanUtils.copyProperties(sales.get(0), saleDTO);
                //发邮件
                if(saleDTO.getMessagePushSwitch() == null || 0 == (saleDTO.getMessagePushSwitch())){
                    logger.error("销方邮箱推送开关未开启,请联系工作人员!");
                    this.logger("销方邮箱推送开关未开启,请联系工作人员!");
                    continue;
                }
                //查询开发件箱
                TdCCustInvoiceMail mail = tdCCustInvoiceMailDao.queryTheLessMailByOrgId(dto.getOrgId());
                if(mail == null || mail.getId() == null){
                    logger.error("销方邮箱信息未查询到,请联系工作人员!");
                    this.logger("销方邮箱信息未查询到,请联系工作人员!");
                    continue;
                }
                TdCCustInvoiceMailDTO mailDTO = new TdCCustInvoiceMailDTO();
                BeanUtils.copyProperties(mail,mailDTO);
                invoice.setInvoiceTotalYuan(invoice.getInvoiceTotalFee() == null ? "0" :
                        "" + ((invoice.getInvoiceTotalFee()).divide(new BigDecimal(100))));
                String[] str = mailTemplet.split("&&");
                String subject = str[0];
                String content = MsgTemplateUtil.render(str[1], invoice);
                this.logger("开始发送电子邮件!:"+invoice.getCustEmail()+subject+ content);
                mailService.sendHtmlMail(invoice.getCustEmail(), subject, content,mailDTO);

                //已邮寄
                TdCCustInvoiceHis record = new TdCCustInvoiceHis();
                record.setInvoiceId(invoice.getInvoiceId());
                record.setInvoiceState(InvoiceStateEnum.ALREADY_POST_INVOICE.getValue()+"");
                record.setModfiyDate(new Date());
                record.setPostDate(new Date());
                custInvoiceHisDao.updateInvioceByInvoiceId(record);
            }
        }else{
            this.logger("---本次没有要下载、邮寄的电子发票..");
            updateCount =1;
        }
        return updateCount > 0 ? ReturnT.SUCCESS :ReturnT.FAIL;
    }




    private void logger(String msg){
        XxlJobHelper.log(msg);
        logger.info(msg);
    }

    public static void main(String[] args) {
        BigDecimal a = new BigDecimal("1234");

        System.out.println(""+(a.divide(new BigDecimal("100"))));
    }
}