package com.zteits.pay.biz.invoice; import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUtil; import cn.hutool.core.lang.Validator; import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.clouds.common.constants.InvoiceServiceTypeEnum; import com.clouds.common.cache.pay.AppOrgCacheUtil; import com.clouds.common.utils.*; import com.clouds.common.web.SpringContextUtil; import com.ejinshui.service.ZKInvoiceService; import com.github.pagehelper.PageInfo; import com.xiaoleilu.hutool.util.CollectionUtil; import com.zteits.clouds.api.apibase.bean.BizResult; import com.zteits.clouds.api.apibase.bean.PageBean; import com.zteits.clouds.api.apibase.constants.*; import com.zteits.clouds.api.apibase.exception.AppException; import com.zteits.clouds.api.apibase.exception.BizException; import com.zteits.clouds.api.dto.order.backorder.dto.OrderBackDTO; import com.zteits.clouds.api.dto.order.backorder.param.BackOrderPageQueryByContidionReq; import com.zteits.clouds.api.dto.order.backorder.param.UpdateOrderBackByOrderIdRequest; import com.zteits.clouds.api.dto.order.parkorder.dto.OrderParkQueryDTO; import com.zteits.clouds.api.dto.order.parkorder.param.OrderParkQueryReq; import com.zteits.clouds.api.dto.order.parkorder.param.ParkOrderByConditionQueryRequest; import com.zteits.clouds.api.dto.order.parkorder.param.UpdateOrderParkByOrderIdRequest; import com.zteits.clouds.api.dto.order.payorder.dto.PayOrderForInvoiceDTO; import com.zteits.clouds.api.dto.order.payorder.param.QueryPayOrderListsReq; import com.zteits.clouds.api.dto.order.rechargeorder.dto.OrderRechargeDTO; import com.zteits.clouds.api.dto.order.rechargeorder.param.OrderRechargeQueryReq; import com.zteits.clouds.api.dto.order.rechargeorder.param.OrderRechargeUpdateRequest; import com.zteits.clouds.api.dto.order.vipcardorder.dto.OrderVipcardDetailDTO; import com.zteits.clouds.api.dto.order.vipcardorder.param.QueryInvoiceStateByDetailOrderIdReqest; import com.zteits.clouds.api.dto.order.vipcardorder.param.QueryVipcardDetailsReq; import com.zteits.clouds.api.dto.order.vipcardorder.param.UpdateVipcardDetailReq; import com.zteits.clouds.api.dto.pay.*; 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.*; import com.zteits.clouds.api.dto.pay.param.einvoice.DownloadReturnMsg; import com.zteits.clouds.api.dto.pay.param.einvoice.InvoInfo; import com.zteits.clouds.api.dto.pay.param.einvoice.InvoInfo.Items; import com.zteits.clouds.api.dto.pay.param.einvoice.InvoInfo.Order; import com.zteits.clouds.api.dto.pay.param.einvoice.InvoInfo.Orders; import com.zteits.clouds.api.dto.pay.param.einvoice.InvoInfo.item; import com.zteits.clouds.api.dto.pay.param.einvoice.ReturnMsg; import com.zteits.clouds.api.dto.pay.param.einvoice.SYFPReturnMsg; import com.zteits.clouds.api.service.order.backorder.oper.BackParkOrderOperService; import com.zteits.clouds.api.service.order.backorder.query.BackOrderQueryService; import com.zteits.clouds.api.service.order.parkorder.oper.RNTParkOrderOperService; import com.zteits.clouds.api.service.order.parkorder.query.PubParkOrderQueryService; import com.zteits.clouds.api.service.order.payorder.query.PayOrderQueryService; import com.zteits.clouds.api.service.order.rechargeorder.oper.RechargeOrderOperService; import com.zteits.clouds.api.service.order.rechargeorder.query.RechargeOrderQueryService; import com.zteits.clouds.api.service.order.vipcardorder.oper.VipCardOrderOperService; import com.zteits.clouds.api.service.order.vipcardorder.query.VipCardOrderQueryService; import com.zteits.clouds.api.service.pay.AppOrgService; import com.zteits.clouds.api.service.pay.invoice.InvoiceHelperService; import com.zteits.pay.biz.invoice.handler.InvoiceOpenHandler; import com.zteits.pay.configuration.mail.MailService; import com.zteits.pay.dao.*; import com.zteits.pay.domain.*; import com.zteits.pay.domain.TdCCustInvoiceHisExample.Criteria; import com.zteits.pay.pagepager.PageBeanUtil; import com.zteits.pay.service.query.TdCCustInvoiceHisQueryInnerService; import org.apache.cxf.jaxws.JaxWsProxyFactoryBean; 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 org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; import javax.xml.bind.JAXBException; import java.io.UnsupportedEncodingException; import java.math.BigDecimal; import java.math.RoundingMode; import java.rmi.RemoteException; import java.util.*; import java.util.stream.Collectors; /** * 发票申领 * * @author hxz */ @Component public class InvoiceHelperServiceImpl implements InvoiceHelperService { private static final Logger logger = LoggerFactory.getLogger(InvoiceHelperServiceImpl.class); @Autowired private TdCCustInvoiceSaleParkRelDao tdCCustInvoiceSaleParkRelDao; @Autowired private TdCCustInvoiceinfoDao custInvoiceinfoDao; @Autowired private TdCCustMailingAddressDao custMailingAddressDao; @Autowired private TdCCustInvoiceHisDao custInvoiceHisDao; @Autowired private TdCCustInvoiceHisDetailDao custInvoiceHisDetailDao; @Autowired private TdCCustInvoiceHisItemDao tdCCustInvoiceHisItemDao; @Autowired private VipCardOrderQueryService vipCardOrderQueryService; @Autowired private VipCardOrderOperService vipCardOrderOperService; @Autowired private RNTParkOrderOperService rntParkOrderOperService; @Autowired private BackParkOrderOperService backParkOrderOperService; @Autowired private BackOrderQueryService backOrderQueryService; @Autowired private PubParkOrderQueryService pubParkOrderQueryService; @Autowired private PayOrderQueryService payOrderQueryService; @Autowired private RechargeOrderOperService rechargeOrderOperService; @Autowired private RechargeOrderQueryService rechargeOrderQueryService; @Autowired private TdCCustInvoiceSaleDao tdCCustInvoiceSaleDao; @Autowired private MailService mailService; @Autowired private AppOrgService appOrgService; @Autowired private TdCCustInvoiceMailDao tdCCustInvoiceMailDao; // @Value("${jinshui.wsdl.url}") // private String jinshuiWsdl; @Autowired private TdCCustInvoiceHisQueryInnerService tdCCustInvoiceHisQueryInnerService; /** * 会员卡开票列表 */ @Override public BizResult > queryVipCardTicketList(QueryVipcardDetailsReq requestObject) { List queryResult = new ArrayList<>(); //首先查询未开票的会员卡 BizResult> bizResult = vipCardOrderQueryService.queryVipCardDetails(requestObject); logger.info("---queryVipCardTicketList 返回={}", JSONObject.toJSON(bizResult)); if(bizResult.isSuccess()&&!CollectionUtils.isEmpty(bizResult.getData())){ for(OrderVipcardDetailDTO dto : bizResult.getData()){ VipCardTicketInfoDTO item = new VipCardTicketInfoDTO(); item.setOrderId(dto.getOrderId()); item.setCardType(dto.getCardType()); item.setCardTypeName(VipCardTypeEnum.getDesc(item.getCardType().intValue())); item.setBuyNum(dto.getBuyNum()); item.setCardAmount(new BigDecimal(dto.getPrice())); item.setCarNumber(dto.getCarNumber()); item.setCreateDate(dto.getCreateDate()); item.setDiscount(dto.getPrice() == 0 ? "0.00" : String.valueOf(10-(new BigDecimal((float)dto.getOrderDicountFee()/(dto.getPrice()*dto.getBuyNum())*10).setScale(1, BigDecimal.ROUND_HALF_UP).doubleValue()))); item.setDiscountAmount(new BigDecimal(dto.getOrderDicountFee())); item.setCardTotalAmount(new BigDecimal(dto.getCardActAmount())); queryResult.add(item); } } logger.info("---queryVipCardTicketList queryResult 返回={}", JSONObject.toJSON(queryResult)); return new BizResult > (queryResult); } /** * 记录客户开发票历史信息 */ @Override @Transactional public BizResult insertCustInvoiceHistoryInfo(TdCCustInvoiceHisRequest requestObject) { if (null == requestObject) { throw new BizException(ErrorType.PARAMM_NULL, "请求对象为空"); } TdCCustInvoiceHisDTO tdCCustInvoiceHisDTO = new TdCCustInvoiceHisDTO(); // 历史开票详情插入 List orderList = null; if (null != requestObject.getOrderIds() && requestObject.getOrderIds().size()>0) { QueryVipcardDetailsReq requestQ = new QueryVipcardDetailsReq(); requestQ.setOrderIds(requestObject.getOrderIds()); requestQ.setSysCode(BasicEnum.SYS_CODE.getValue()); BizResult> bizResult = vipCardOrderQueryService.queryVipCardDetails(requestQ); if(bizResult.isSuccess()&&!CollectionUtils.isEmpty(bizResult.getData())) { orderList = bizResult.getData(); // 校验发票金额 BigDecimal checkTotalInvoiceFee = new BigDecimal(0); // 校验是否已进行开票申请 QueryInvoiceStateByDetailOrderIdReqest req = new QueryInvoiceStateByDetailOrderIdReqest (); req.setSysCode(BasicEnum.SYS_CODE.getValue()); for (OrderVipcardDetailDTO orderItem: orderList) { //重复开票校验 req.setDetailOrderId(orderItem.getDetailOrderId()); BizResult bizresInvoiceState = vipCardOrderQueryService.queryInvoiceStateByDetailOrderId(req); if (bizresInvoiceState.isSuccess() && (null != bizresInvoiceState.getData())) { if (0 < bizresInvoiceState.getData()) { logger.info("insertCustInvoiceHistoryDetailInfo--不能重复开票 "); throw new BizException(ErrorType.APP_ERROR, "不能重复开票"); } } // sum实付金额 checkTotalInvoiceFee = checkTotalInvoiceFee.add(new BigDecimal(orderItem.getCardActAmount())); } if (0 != checkTotalInvoiceFee.compareTo(requestObject.getInvoiceTotalFee())) { logger.info("insertCustInvoiceHistoryDetailInfo--手机端开票金额计算有误 "); throw new BizException(ErrorType.APP_ERROR, "开票金额计算有误"); } } } else { logger.info("insertCustInvoiceHistoryDetailInfo--requestObject.getOrderIds 传入参数订单id列表为空 "); throw new BizException(ErrorType.PARAMM_NULL, "请求对象为空"); } List hisDetailList = new ArrayList(); if (null != orderList) { for (OrderVipcardDetailDTO orderItem: orderList) { // 更新是否已开发票状态 UpdateVipcardDetailReq updateVipcardDetailReq = new UpdateVipcardDetailReq(); updateVipcardDetailReq.setDetailOrderId(orderItem.getDetailOrderId()); updateVipcardDetailReq.setId(orderItem.getId()); updateVipcardDetailReq.setInvoiceState(InvoiceStateEnum.YES.getValue()); updateVipcardDetailReq.setSysCode(BasicEnum.SYS_CODE.getValue()); vipCardOrderOperService.updateVipCardDetail(updateVipcardDetailReq); // 新增已开发票详情 TdCCustInvoiceHisDetail record = new TdCCustInvoiceHisDetail(); record.setOrderId(orderItem.getOrderId()); record.setInvoiceId(requestObject.getInvoiceId()); record.setOrderType(orderItem.getOrderType()); record.setOrderActFee(new BigDecimal(orderItem.getCardActAmount())); record.setOrderPayedFee(new BigDecimal(orderItem.getCardActAmount())); record.setOrderTotalFee(new BigDecimal(orderItem.getPrice()*orderItem.getBuyNum())); record.setOrderDate(orderItem.getCreateDate()); record.setDataState(1); record.setCreateDate(new Date()); record.setId(custInvoiceHisDetailDao.insertCustInvoiceHistoryDetailInfo(record)); TdCCustInvoiceHisDetailDTO tdCCustInvoiceHisDetailDTO = new TdCCustInvoiceHisDetailDTO(); BeanUtils.copyProperties(record, tdCCustInvoiceHisDetailDTO); hisDetailList.add(tdCCustInvoiceHisDetailDTO); } } tdCCustInvoiceHisDTO.setCustInvoiceHisDetailDTOList(hisDetailList); // 历史开票插入 TdCCustInvoiceHis recordo = new TdCCustInvoiceHis(); BeanUtils.copyProperties(requestObject, recordo); logger.info("---begin--serviceinsertCustInvoiceHistoryInforecordo记录客户开发票历史信息,入参={}", JSONObject.toJSON(recordo)); recordo.setId(custInvoiceHisDao.insertCustInvoiceHistoryInfo(recordo)); BeanUtils.copyProperties(recordo, tdCCustInvoiceHisDTO); // //新增开票条目 // List items = new ArrayList<>(); // TdCCustInvoiceHisItem item = new TdCCustInvoiceHisItem(); // BeanUtils.copyProperties(requestObject, item); // item.setInvoiceId(requestObject.getInvoiceId()); // item.setItemName(saleInfo.getItemName()); // item.setItemCode(saleInfo.getItemCode()); // item.setLineType(InvoiceItemEnum.LINETYPE);//0:正常行1:折扣行2:被折扣行 // item.setTaxRate(saleInfo.getItemTaxRate()); // item.setQuantity(1D); // item.setTaxPrice(requestObject.getInvoiceTotalFee() == null?0:requestObject.getInvoiceTotalFee().doubleValue()); // item.setTotalAmount(requestObject.getInvoiceTotalFee() == null?0:requestObject.getInvoiceTotalFee().doubleValue()); // item.setYhzcbs("0");//税收优惠政策标志0:不使用 1:使用 // items.add(item); // custInvoiceHisDao.insertCustInvoiceHistorItems(items ); return new BizResult (tdCCustInvoiceHisDTO); } /** * 记录客户开发票历史详情信息(由几张vip订单组成一起开发票) */ @Transactional @Override public BizResult > insertCustInvoiceHistoryDetailInfo(TdCCustInvoiceHisDetailRequest requestObject) { if (null == requestObject) { throw new BizException(ErrorType.PARAMM_NULL, "请求对象为空"); } // 历史开票详情插入 List orderList = null; if (null != requestObject.getOrderIds() && requestObject.getOrderIds().size()>0) { QueryVipcardDetailsReq requestQ = new QueryVipcardDetailsReq(); requestQ.setOrderIds(requestObject.getOrderIds()); requestQ.setSysCode(BasicEnum.SYS_CODE.getValue()); BizResult> bizResult = vipCardOrderQueryService.queryVipCardDetails(requestQ); if(bizResult.isSuccess()&&!CollectionUtils.isEmpty(bizResult.getData())){ orderList = bizResult.getData(); } } else { logger.info("insertCustInvoiceHistoryDetailInfo--requestObject.getOrderIds 传入参数订单id列表为空 "); throw new BizException(ErrorType.PARAMM_NULL, "请求对象为空"); } List hisDetailList = new ArrayList(); if (null != orderList) { for (OrderVipcardDetailDTO orderItem: orderList) { // 更新是否已开发票状态 UpdateVipcardDetailReq updateVipcardDetailReq = new UpdateVipcardDetailReq(); updateVipcardDetailReq.setDetailOrderId(orderItem.getDetailOrderId()); updateVipcardDetailReq.setId(orderItem.getId()); updateVipcardDetailReq.setInvoiceState(InvoiceStateEnum.YES.getValue()); vipCardOrderOperService.updateVipCardDetail(updateVipcardDetailReq); // 新增已开发票详情 TdCCustInvoiceHisDetail record = new TdCCustInvoiceHisDetail(); record.setOrderId(orderItem.getOrderId()); record.setInvoiceId(requestObject.getInvoiceId()); record.setOrderType(orderItem.getOrderType()); record.setOrderActFee(new BigDecimal(orderItem.getCardActAmount())); record.setOrderPayedFee(new BigDecimal(orderItem.getCardActAmount())); record.setOrderTotalFee(new BigDecimal(orderItem.getPrice()*orderItem.getBuyNum())); record.setOrderDate(orderItem.getCreateDate()); record.setDataState(1); record.setCreateDate(new Date()); record.setId(custInvoiceHisDetailDao.insertCustInvoiceHistoryDetailInfo(record)); TdCCustInvoiceHisDetailDTO tdCCustInvoiceHisDetailDTO = new TdCCustInvoiceHisDetailDTO(); BeanUtils.copyProperties(record, tdCCustInvoiceHisDetailDTO); hisDetailList.add(tdCCustInvoiceHisDetailDTO); } } return new BizResult> (hisDetailList); } /** * 通过客户id(custId)查询开票历史列表 */ @Override public BizResult> queryCustInvoiceHistoryList( QueryCustInvoiceHistoryListRequest requestObject) { if (null == requestObject) { throw new BizException(ErrorType.PARAMM_NULL, "请求对象为空"); } TdCCustInvoiceHisExample example = new TdCCustInvoiceHisExample(); //202303增加数据有效1过滤条件,否则会查询出无效数据 example.createCriteria().andCustIdEqualTo(requestObject.getCustId()).andDataStateEqualTo(1) .andInvoiceStateIn(requestObject.getInvoiceStateList()); List tdCCustInvoiceHisList = custInvoiceHisDao.queryCustInvoiceHistoryList(example); List tdCCustInvoiceHisDTOList = new ArrayList (); if (null != tdCCustInvoiceHisList) { for (TdCCustInvoiceHis item: tdCCustInvoiceHisList) { TdCCustInvoiceHisDTO tdCCustInvoiceHisDTO = new TdCCustInvoiceHisDTO (); BeanUtils.copyProperties(item, tdCCustInvoiceHisDTO); //获取客服电话 String servicePhone = getServicePhone(tdCCustInvoiceHisDTO.getOrgId()); tdCCustInvoiceHisDTO.setServicePhone(servicePhone); // 获取历史详情列表 TdCCustInvoiceHisDetailExample detailExample = new TdCCustInvoiceHisDetailExample(); detailExample.createCriteria().andInvoiceIdEqualTo(item.getInvoiceId()); List tdCCustInvoiceHisDetailList = custInvoiceHisDetailDao. queryCustInvoiceHisDetailList(detailExample); List tdCCustInvoiceHisDetailDTOList = null; if (null != tdCCustInvoiceHisDetailList) { tdCCustInvoiceHisDetailDTOList = JSON.parseArray(JSON.toJSONString(tdCCustInvoiceHisDetailList, false), TdCCustInvoiceHisDetailDTO.class); tdCCustInvoiceHisDTO.setCustInvoiceHisDetailDTOList(tdCCustInvoiceHisDetailDTOList); } // 赋值给开票历史列表项 tdCCustInvoiceHisDTOList.add(tdCCustInvoiceHisDTO); } //tdCCustInvoiceHisDTOList = JSON.parseArray(JSON.toJSONString(tdCCustInvoiceHisList, false), TdCCustInvoiceHisDTO.class); } return new BizResult > (tdCCustInvoiceHisDTOList); } /** * 通过Id查询客户开票历史信息 */ @Override public BizResult queryCustInvoiceHistoryInfoById (QueryCustInvoiceHisRequest requestObject) { if (null == requestObject) { throw new BizException(ErrorType.PARAMM_NULL, "请求对象为空"); } TdCCustInvoiceHisDTO tdCCustInvoiceHisDTO = new TdCCustInvoiceHisDTO(); TdCCustInvoiceHis record = custInvoiceHisDao.queryCustInvoiceHistoryInfo(requestObject.getId()); List tdCCustInvoiceHisDetailDTOList = null; if (null != record) { BeanUtils.copyProperties(record, tdCCustInvoiceHisDTO); TdCCustInvoiceHisDetailExample example = new TdCCustInvoiceHisDetailExample(); example.createCriteria().andInvoiceIdEqualTo(record.getInvoiceId()); List tdCCustInvoiceHisDetailList = custInvoiceHisDetailDao.queryCustInvoiceHisDetailList(example); if (null != tdCCustInvoiceHisDetailList) { tdCCustInvoiceHisDetailDTOList = JSON.parseArray(JSON.toJSONString(tdCCustInvoiceHisDetailList, false), TdCCustInvoiceHisDetailDTO.class); tdCCustInvoiceHisDTO.setCustInvoiceHisDetailDTOList(tdCCustInvoiceHisDetailDTOList); } } return new BizResult (tdCCustInvoiceHisDTO); } /** * 通过Id查询客户开票历史详情 */ @Override public BizResult queryCustInvoiceHistoryDetailInfoById ( QueryCustInvoiceHisDetailRequest requestObject) { if (null == requestObject) { throw new BizException(ErrorType.PARAMM_NULL, "请求对象为空"); } TdCCustInvoiceHisDetailDTO tdCCustInvoiceHisDetailDTO = new TdCCustInvoiceHisDetailDTO(); TdCCustInvoiceHisDetail record = custInvoiceHisDetailDao.queryCustInvoiceHistoryDetailInfo(requestObject.getId()); if (null != record) { BeanUtils.copyProperties(record, tdCCustInvoiceHisDetailDTO); } return new BizResult (tdCCustInvoiceHisDetailDTO); } @Override public BizResult> queryCustInvoiceHisDetailList (QueryCustInvoiceHisDetailRequest requestObject) { if (null == requestObject) { throw new BizException(ErrorType.PARAMM_NULL, "请求对象为空"); } TdCCustInvoiceHisDetailExample detailExample = new TdCCustInvoiceHisDetailExample(); detailExample.createCriteria().andInvoiceIdEqualTo(requestObject.getInvoiceId()); List tdCCustInvoiceHisDetails = custInvoiceHisDetailDao.queryCustInvoiceHisDetailList(detailExample); List dtoList = new ArrayList<>(); if(!CollectionUtils.isEmpty(tdCCustInvoiceHisDetails)){ for(TdCCustInvoiceHisDetail detail:tdCCustInvoiceHisDetails){ TdCCustInvoiceHisDetailDTO tdCCustInvoiceHisDetailDTO = new TdCCustInvoiceHisDetailDTO(); BeanUtils.copyProperties(detail,tdCCustInvoiceHisDetailDTO); dtoList.add(tdCCustInvoiceHisDetailDTO); } } return new BizResult> (dtoList); } @Override public BizResult> selectListByOrderId(TdCCustInvoiceHisRequest record) { List tdCCustInvoiceHisDTOS = custInvoiceHisDao.selectListByOrderId(record); return new BizResult<>(tdCCustInvoiceHisDTOS); } @Override public BizResult CloudOpenTicketForCustInvoiceHisInfo(TdCCustInvoiceHisRequest request) { if (null == request) { throw new BizException(ErrorType.PARAMM_NULL, "请求对象为空"); } List hisDetailList = new ArrayList(); TdCCustInvoiceHisDTO tdCCustInvoiceHisDTO = new TdCCustInvoiceHisDTO(); /**对订单进行开票(包括临停,补缴和会员卡)*/ List orders = request.getOrders(); TdCCustInvoiceHis recordo = new TdCCustInvoiceHis(); BeanUtils.copyProperties(request, recordo); Long invoiceTotalFee = 0L; if(CollectionUtil.isNotEmpty(orders)){ //对订单根据类型进行分类 Map> aMap = new HashMap<>(); aMap = orders.stream().collect(Collectors.groupingBy(TdCCustInvoiceByOrdersRequest::getPayOrderType)); /**1.校验是否开票***/ for(Integer payOrderType :aMap.keySet()) { //校验是否已经开过电子发票 checkInvoiced(aMap, payOrderType); } /**2.进行开票***/ for(Integer payOrderType :aMap.keySet()){ logger.info("开票更改开票状态: "+JSONObject.toJSONString(aMap.get(payOrderType))); /**临停费用*/ if(PayOrderTypeEnum.PARK_PAY.value().equals(payOrderType)|| PayOrderTypeEnum.SHAREBERTH_PAY.value().equals(payOrderType)|| PayOrderTypeEnum.PARKPRE_PAY.value().equals(payOrderType)){ for(TdCCustInvoiceByOrdersRequest ordersRequest :aMap.get(payOrderType)) { /**临停*/ invoiceTotalFee = invoiceTotalFee+ordersRequest.getOrderActFee(); hisDetailList = this.createCustInvoiceHisDetail(request,ordersRequest,hisDetailList); } recordo.setInvoiceBigType(OrderBigTypeEnum.PARK_ORDER.value()); }else if(PayOrderTypeEnum.PARKBACK_PAY.value().equals(payOrderType)){ /**欠费补交*/ for(TdCCustInvoiceByOrdersRequest ordersRequest :aMap.get(payOrderType)) { /**欠费补交*/ invoiceTotalFee = invoiceTotalFee+ordersRequest.getOrderActFee(); hisDetailList = this.createCustInvoiceHisDetail(request,ordersRequest,hisDetailList); } recordo.setInvoiceBigType(OrderBigTypeEnum.PARK_ORDER.value()); }else if(PayOrderTypeEnum.VIP_CARD_ADDED.value().equals(payOrderType)|| PayOrderTypeEnum.VIP_CARD_RENEW.value().equals(payOrderType) || PayOrderTypeEnum.AREA_VIP_CARD_ADDED.value().equals(payOrderType) || PayOrderTypeEnum.AREA_VIP_CARD_CHANGE_CARNUM.value().equals(payOrderType) || PayOrderTypeEnum.TIME_VIP_CARD_ADDED.value().equals(payOrderType) || PayOrderTypeEnum.TIME_VIP_CARD_CHANGE_CARNUM.value().equals(payOrderType)) { for(TdCCustInvoiceByOrdersRequest ordersRequest :aMap.get(payOrderType)) { /**会员卡*/ invoiceTotalFee = invoiceTotalFee+ordersRequest.getOrderActFee(); hisDetailList = this.createCustInvoiceHisDetail(request,ordersRequest,hisDetailList); } recordo.setInvoiceBigType(OrderBigTypeEnum.VIP_ORDER.value()); }else if(PayOrderTypeEnum.BALANCE_PAY.value().equals(payOrderType)) { for(TdCCustInvoiceByOrdersRequest ordersRequest :aMap.get(payOrderType)) { /**账户充值*/ invoiceTotalFee = invoiceTotalFee+ordersRequest.getOrderActFee(); hisDetailList = this.createCustInvoiceHisDetail(request,ordersRequest,hisDetailList); } recordo.setInvoiceBigType(OrderBigTypeEnum.RECHARGE_ORDER.value()); } } } else { logger.info("openTicketForCustInvoiceHisInfo--requestObject.getOrders 传入参数订单列表为空 "); throw new BizException(ErrorType.PARAMM_NULL, "请求对象为空"); } //查询销方信息 TdCCustInvoiceSaleQueryRequest saleRequest = new TdCCustInvoiceSaleQueryRequest(); saleRequest.setSysCode(BasicEnum.SYS_CODE.getValue()); saleRequest.setOrgId(recordo.getOrgId()); // 根据税号去查询销方信息 saleRequest.setSaleTaxids(Collections.singletonList(request.getSaleTaxid())); if (null == recordo.getOrgId()) { throw new BizException(ErrorType.PARAMM_NULL, "获取销方信息,组织id为空!"); } List saleList = tdCCustInvoiceSaleDao.queryTdCCustInvoiceSale(saleRequest); if(CollectionUtils.isEmpty(saleList)){ throw new BizException(ErrorType.BIZ_ERROR, "根据当前组织编码["+recordo.getOrgId()+"],未查询到相应的销方信息!"); } tdCCustInvoiceHisDTO.setCustInvoiceHisDetailDTOList(hisDetailList); TdCCustInvoiceSale saleInfo = saleList.get(0); // 历史开票插入 recordo.setInvoiceTaxRate(new BigDecimal(saleInfo.getItemTaxRate())); //总价除以(1+9%)乘9% recordo.setInvoiceTaxFee(invoiceTotalFee == null ? new BigDecimal("0") : (new BigDecimal(invoiceTotalFee).multiply(recordo.getInvoiceTaxRate())) ); BigDecimal a = recordo.getInvoiceTaxRate().add(new BigDecimal(1)); recordo.setInvoiceTaxFee(recordo.getInvoiceTaxFee().divide(a,2, RoundingMode.HALF_UP) ); recordo.setInvoiceTotalFee(new BigDecimal(invoiceTotalFee)); recordo.setInvoiceFee(new BigDecimal(invoiceTotalFee) == null ? new BigDecimal("0") : (new BigDecimal(invoiceTotalFee)).subtract(recordo.getInvoiceTaxFee())); //放入销方信息 recordo.setSaleAddress(saleInfo.getAddress()); recordo.setSaleBankName(saleInfo.getSaleBankName()); recordo.setSaleCardNo(saleInfo.getSaleBankNo()); recordo.setSaleName(saleInfo.getSaleName()); recordo.setSaleTaxid(saleInfo.getSaleTaxid()); //放入开票人、复核人、收款人 recordo.setChecker(saleInfo.getChecker()); recordo.setPryee(saleInfo.getPryee()); recordo.setDrawer(saleInfo.getDrawer()); recordo.setTerminalSource(request.getTerminalSource()); if(StringUtils.isEmpty(recordo.getTicketContent())){ recordo.setTicketContent(saleInfo.getItemName()); } if(request.getOptState()==1){ recordo.setId(custInvoiceHisDao.insertCustInvoiceHistoryInfo(recordo)); } BeanUtils.copyProperties(recordo, tdCCustInvoiceHisDTO); //新增开票条目 List items = new ArrayList<>(); TdCCustInvoiceHisItem item = new TdCCustInvoiceHisItem(); BeanUtils.copyProperties(recordo, item); item.setInvoiceId(recordo.getInvoiceId()); item.setItemName(saleInfo.getItemName()); item.setItemCode(saleInfo.getItemCode()); item.setLineType(InvoiceItemEnum.LINETYPE);//0:正常行1:折扣行2:被折扣行 item.setTaxRate(saleInfo.getItemTaxRate()); item.setUnit(InvoiceItemEnum.UNIT); item.setSpec(InvoiceItemEnum.SPEC); item.setQuantity(1D); item.setTaxPrice(new BigDecimal(invoiceTotalFee) == null?0:(new BigDecimal(invoiceTotalFee).doubleValue())/100); item.setTotalAmount(new BigDecimal(invoiceTotalFee) == null?0:(new BigDecimal(invoiceTotalFee).doubleValue())/100); item.setYhzcbs("0");//税收优惠政策标志0:不使用 1:使用 items.add(item); if(request.getOptState()==1){ custInvoiceHisDao.insertCustInvoiceHistorItems(items ); } if(!CollectionUtils.isEmpty(items)){ List custInvoiceHisItemDTOs = new ArrayList<>(); ListCopyUtil.listCopyProperties(items,custInvoiceHisItemDTOs,TdCCustInvoiceHisItemDTO.class); tdCCustInvoiceHisDTO.setCustInvoiceHisItemDTOs(custInvoiceHisItemDTOs); } tdCCustInvoiceHisDTO.setInvoiceTotalYuanCase(AmountUtils.moneyUpperCase(new BigDecimal(AmountUtils.changeF2Y(invoiceTotalFee)).doubleValue())); logger.info("CliudopenTicketForCustInvoiceHisInfo--返回 :"+JSONObject.toJSON(tdCCustInvoiceHisDTO)); return new BizResult (tdCCustInvoiceHisDTO); } @Override public BizResult CloudOpenTicketForUpdateInvoiceStatus(TdCCustInvoiceHisRequest requestObject) { if (null == requestObject) { throw new BizException(ErrorType.PARAMM_NULL, "请求对象为空"); } TdCCustInvoiceHisDTO tdCCustInvoiceHisDTO = new TdCCustInvoiceHisDTO(); List orders = requestObject.getOrders(); if(CollectionUtil.isNotEmpty(orders)){ //对订单根据类型进行分类 Map> aMap = new HashMap<>(); aMap = orders.stream().collect(Collectors.groupingBy(TdCCustInvoiceByOrdersRequest::getPayOrderType)); /**修改开状态***/ for(Integer payOrderType :aMap.keySet()){ logger.info("开票更改开票状态: "+JSONObject.toJSONString(aMap.get(payOrderType))); /**临停费用*/ if(PayOrderTypeEnum.PARK_PAY.value().equals(payOrderType)|| PayOrderTypeEnum.SHAREBERTH_PAY.value().equals(payOrderType)|| PayOrderTypeEnum.PARKPRE_PAY.value().equals(payOrderType)){ for(TdCCustInvoiceByOrdersRequest ordersRequest :aMap.get(payOrderType)) { /**临停*/ // 更新已开发票状态 logger.info("临停车,开票更改开票状态: "+JSONObject.toJSONString(ordersRequest)); UpdateOrderParkByOrderIdRequest orderIdRequest = new UpdateOrderParkByOrderIdRequest(); orderIdRequest.setOrderId(ordersRequest.getRltOrderId()); orderIdRequest.setInvoiceState(InvoiceStateEnum.YES.getValue()); orderIdRequest.setSysCode(BasicEnum.SYS_CODE.getValue()); rntParkOrderOperService.updateOrderParkByOrderId(orderIdRequest); } }else if(PayOrderTypeEnum.PARKBACK_PAY.value().equals(payOrderType)){ /**欠费补交*/ for(TdCCustInvoiceByOrdersRequest ordersRequest :aMap.get(payOrderType)) { /**欠费补交*/ // 更新已开发票状态 UpdateOrderBackByOrderIdRequest orderIdRequest = new UpdateOrderBackByOrderIdRequest(); orderIdRequest.setOrderId(ordersRequest.getRltOrderId()); orderIdRequest.setInvoiceState(InvoiceStateEnum.YES.getValue()); orderIdRequest.setSysCode(BasicEnum.SYS_CODE.getValue()); backParkOrderOperService.updateBackOrderByOrderId(orderIdRequest); } }else if(PayOrderTypeEnum.VIP_CARD_ADDED.value().equals(payOrderType)|| PayOrderTypeEnum.VIP_CARD_RENEW.value().equals(payOrderType) || PayOrderTypeEnum.AREA_VIP_CARD_ADDED.value().equals(payOrderType) || PayOrderTypeEnum.AREA_VIP_CARD_CHANGE_CARNUM.value().equals(payOrderType) || PayOrderTypeEnum.TIME_VIP_CARD_ADDED.value().equals(payOrderType) || PayOrderTypeEnum.TIME_VIP_CARD_CHANGE_CARNUM.value().equals(payOrderType)) { for(TdCCustInvoiceByOrdersRequest ordersRequest :aMap.get(payOrderType)) { /**会员卡*/ // 更新是否已开发票状态 UpdateVipcardDetailReq updateVipcardDetailReq = new UpdateVipcardDetailReq(); updateVipcardDetailReq.setOrderId(ordersRequest.getRltOrderId()); updateVipcardDetailReq.setInvoiceState(InvoiceStateEnum.YES.getValue()); updateVipcardDetailReq.setSysCode(BasicEnum.SYS_CODE.getValue()); vipCardOrderOperService.updateVipCardDetailByOrderId(updateVipcardDetailReq); } }else if(PayOrderTypeEnum.BALANCE_PAY.value().equals(payOrderType)) { for(TdCCustInvoiceByOrdersRequest ordersRequest :aMap.get(payOrderType)) { /**账户充值*/ // 更新是否已开发票状态 OrderRechargeUpdateRequest orderRechargeUpdateRequest = new OrderRechargeUpdateRequest(); orderRechargeUpdateRequest.setOrderId(ordersRequest.getRltOrderId()); orderRechargeUpdateRequest.setInvoiceState(InvoiceStateEnum.YES.getValue()); orderRechargeUpdateRequest.setSysCode(BasicEnum.SYS_CODE.getValue()); rechargeOrderOperService.updateOrderRechargeByOrderIdOrId(orderRechargeUpdateRequest); } } } } else { logger.info("CloudOpenTicketForUpdateInvoiceStatus--requestObject.getOrders 传入参数订单列表为空 "); throw new BizException(ErrorType.PARAMM_NULL, "请求对象为空"); } return new BizResult (tdCCustInvoiceHisDTO); } /** * 校验是否已经开票 * @param aMap * @param payOrderType */ private void checkInvoiced(Map> aMap, Integer payOrderType) { /**临停费用*/ if (PayOrderTypeEnum.PARK_PAY.value().equals(payOrderType) || PayOrderTypeEnum.SHAREBERTH_PAY.value().equals(payOrderType) || PayOrderTypeEnum.PARKPRE_PAY.value().equals(payOrderType)) { List orderIds = aMap.get(payOrderType).stream().map(item -> item.getRltOrderId()).collect(Collectors.toList()); if (CollectionUtil.isNotEmpty(orderIds)) { OrderParkQueryReq requestQ = new OrderParkQueryReq(); requestQ.setOrderIds(orderIds); requestQ.setSysCode(BasicEnum.SYS_CODE.getValue()); BizResult> bizResult = pubParkOrderQueryService.queryParkOrderByCondition(requestQ); if (bizResult.isSuccess() && CollectionUtil.isNotEmpty(bizResult.getData())) { for (OrderParkQueryDTO dto : bizResult.getData()) { if (0 < dto.getInvoiceState()) { logger.info("insertCustInvoiceHistoryDetailInfo--不能重复开票 "); throw new BizException(ErrorType.APP_ERROR, "不能重复开票"); } } } } } else if (PayOrderTypeEnum.PARKBACK_PAY.value().equals(payOrderType)) { /**欠费补交*/ List orderIds = aMap.get(payOrderType).stream().map(item -> item.getRltOrderId()).collect(Collectors.toList()); BackOrderPageQueryByContidionReq requestQ = new BackOrderPageQueryByContidionReq(); requestQ.setOrderIds(orderIds); requestQ.setSysCode(BasicEnum.SYS_CODE.getValue()); requestQ.getBaseRequest().setPageNum(1); requestQ.getBaseRequest().setPageSize(999); BizResult> bizResult = backOrderQueryService.pageQueryBackOrderByCondition(requestQ); if (bizResult.isSuccess() && bizResult.getData() != null && CollectionUtil.isNotEmpty(bizResult.getData().getDataList())) { for (OrderBackDTO dto : bizResult.getData().getDataList()) { if (0 < dto.getInvoiceState()) { logger.info("insertCustInvoiceHistoryDetailInfo--不能重复开票 "); throw new BizException(ErrorType.APP_ERROR, "不能重复开票"); } } } } else if (PayOrderTypeEnum.VIP_CARD_ADDED.value().equals(payOrderType) || PayOrderTypeEnum.VIP_CARD_RENEW.value().equals(payOrderType)) { /**查询会员卡是否已经开票*/ List orderIds = aMap.get(payOrderType).stream().map(item -> item.getRltOrderId()).collect(Collectors.toList()); QueryVipcardDetailsReq requestQ = new QueryVipcardDetailsReq(); requestQ.setOrderIds(orderIds); requestQ.setSysCode(BasicEnum.SYS_CODE.getValue()); BizResult> bizResult = vipCardOrderQueryService.queryVipCardDetails(requestQ); if (bizResult.isSuccess() && CollectionUtil.isNotEmpty(bizResult.getData())) { for (OrderVipcardDetailDTO dto : bizResult.getData()) { if (0 < dto.getInvoiceState()) { logger.info("insertCustInvoiceHistoryDetailInfo--不能重复开票 "); throw new BizException(ErrorType.APP_ERROR, "不能重复开票"); } } } } else if (PayOrderTypeEnum.BALANCE_PAY.value().equals(payOrderType)) { /**查询账户充值是否已经开票*/ List orderIds = aMap.get(payOrderType).stream().map(item -> item.getRltOrderId()).collect(Collectors.toList()); OrderRechargeQueryReq requestQ = new OrderRechargeQueryReq(); requestQ.setOrderIds(orderIds); requestQ.setSysCode(BasicEnum.SYS_CODE.getValue()); BizResult> bizResult = rechargeOrderQueryService.queryOrderRechargeByCondition(requestQ); logger.info("查询账户充值是否已经开票返回:{}",JSONObject.toJSONString(bizResult)); if (bizResult.isSuccess() && CollectionUtil.isNotEmpty(bizResult.getData())) { for (OrderRechargeDTO dto : bizResult.getData()) { if (0 < dto.getInvoiceState()) { logger.info("insertCustInvoiceHistoryDetailInfo--不能重复开票 "); throw new BizException(ErrorType.APP_ERROR, "不能重复开票"); } } } } } @Override public BizResult> queryCustInvoiceHisList(TdCCustInvoiceHisRequest requestObject) { if (null == requestObject) { throw new BizException(ErrorType.PARAMM_NULL, "请求对象为空"); } TdCCustInvoiceHis record = new TdCCustInvoiceHis(); BeanUtils.copyProperties(requestObject, record); PageBean pageBean = new PageBean<>(); PageInfo pageInfo = custInvoiceHisDao.queryListByVO(requestObject); if(pageInfo!=null){ PageBeanUtil.copyProperties(pageInfo, pageBean, TdCCustInvoiceHisDTO.class); for (TdCCustInvoiceHisDTO dto : pageBean.getDataList()) { String invoiceBigTypeDesc = ""; //发票大类名称:100:停车,200-充值,300-会员卡 if(dto.getInvoiceBigType()==null){ dto.setInvoiceBigType(300); } switch (dto.getInvoiceBigType()) { case 100: invoiceBigTypeDesc = "临停开票"; break; case 200: invoiceBigTypeDesc = "充值开票"; case 300: invoiceBigTypeDesc = "会员卡开票"; default: break; } dto.setInvoiceBigTypeDesc(invoiceBigTypeDesc); } } return new BizResult<>(pageBean); } @Override public BizResult updateInvioceById(TdCCustInvoiceHisRequest requestObject) { if (null == requestObject) { throw new BizException(ErrorType.PARAMM_NULL, "请求对象为空"); } TdCCustInvoiceHis record = new TdCCustInvoiceHis(); BeanUtils.copyProperties(requestObject, record); return new BizResult (custInvoiceHisDao.updateInvioceById(record)); } @Override public BizResult openTicketForCustInvoiceHisInfo(TdCCustInvoiceHisRequest requestObject) { if (null == requestObject) { throw new BizException(ErrorType.PARAMM_NULL, "请求对象为空"); } logger.info("进入InvoiceHelperServiceImpl-openTicketForCustInvoiceHisInfo"); List hisDetailList = new ArrayList(); TdCCustInvoiceHisDTO tdCCustInvoiceHisDTO = new TdCCustInvoiceHisDTO(); /**对订单进行开票(包括临停,补缴和会员卡)*/ List orders = requestObject.getOrders(); TdCCustInvoiceHis recordo = new TdCCustInvoiceHis(); BeanUtils.copyProperties(requestObject, recordo); if(CollectionUtil.isNotEmpty(orders)){ //对订单根据类型进行分类 Map> aMap = new HashMap<>(); aMap = orders.stream().collect(Collectors.groupingBy(TdCCustInvoiceByOrdersRequest::getPayOrderType)); /**1.校验是否开票***/ Long invoiceTotalFee = 0L; for(Integer payOrderType :aMap.keySet()){ //校验是否已经开票 checkInvoiced(aMap, payOrderType); } logger.info("aMap对象{}",JSONObject.toJSONString(aMap)); /**2.比较开票金额*/ QueryPayOrderListsReq requestQP = new QueryPayOrderListsReq(); requestQP.setCustId(requestObject.getCustId()); List orderIds = orders.stream().map(item->item.getRltOrderId()).collect(Collectors.toList()); requestQP.setOrderIds(orderIds); requestQP.setSysCode(BasicEnum.SYS_CODE.getValue()); logger.info("queryRntPayOrderForInvoice 入参对象requestQP:{}", requestQP); BizResult> responseResult = payOrderQueryService.queryRntPayOrderForInvoice(requestQP); if(responseResult.isSuccess()&&CollectionUtil.isNotEmpty(responseResult.getData())){ recordo.setOrgId(Long.valueOf(responseResult.getData().get(0).getOrgId()));//放入组织id for(PayOrderForInvoiceDTO dto : responseResult.getData()){ invoiceTotalFee += dto.getOrderActFee(); } } if (0 != new BigDecimal(invoiceTotalFee).compareTo(requestObject.getInvoiceTotalFee())) { logger.info("insertCustInvoiceHistoryDetailInfo--手机端开票金额计算有误 "); throw new BizException(ErrorType.APP_ERROR, "开票金额计算有误"); } /**3.进行开票***/ for(Integer payOrderType :aMap.keySet()){ logger.info("开票更改开票状态: "+JSONObject.toJSONString(aMap.get(payOrderType))); /**临停费用*/ if(PayOrderTypeEnum.PARK_PAY.value().equals(payOrderType)|| PayOrderTypeEnum.SHAREBERTH_PAY.value().equals(payOrderType)|| PayOrderTypeEnum.PARKPRE_PAY.value().equals(payOrderType)){ for(TdCCustInvoiceByOrdersRequest ordersRequest :aMap.get(payOrderType)) { /**临停*/ // 更新已开发票状态 logger.info("临停车,开票更改开票状态: "+JSONObject.toJSONString(ordersRequest)); UpdateOrderParkByOrderIdRequest orderIdRequest = new UpdateOrderParkByOrderIdRequest(); orderIdRequest.setOrderId(ordersRequest.getRltOrderId()); orderIdRequest.setInvoiceState(InvoiceStateEnum.YES.getValue()); orderIdRequest.setSysCode(BasicEnum.SYS_CODE.getValue()); rntParkOrderOperService.updateOrderParkByOrderId(orderIdRequest); hisDetailList = this.getCustInvoiceHisDetail(requestObject,ordersRequest,hisDetailList); } recordo.setInvoiceBigType(OrderBigTypeEnum.PARK_ORDER.value()); }else if(PayOrderTypeEnum.PARKBACK_PAY.value().equals(payOrderType)){ /**欠费补交*/ for(TdCCustInvoiceByOrdersRequest ordersRequest :aMap.get(payOrderType)) { /**欠费补交*/ // 更新已开发票状态 UpdateOrderBackByOrderIdRequest orderIdRequest = new UpdateOrderBackByOrderIdRequest(); orderIdRequest.setOrderId(ordersRequest.getRltOrderId()); orderIdRequest.setInvoiceState(InvoiceStateEnum.YES.getValue()); orderIdRequest.setSysCode(BasicEnum.SYS_CODE.getValue()); backParkOrderOperService.updateBackOrderByOrderId(orderIdRequest); hisDetailList = this.getCustInvoiceHisDetail(requestObject,ordersRequest,hisDetailList); } recordo.setInvoiceBigType(OrderBigTypeEnum.PARK_ORDER.value()); }else if(PayOrderTypeEnum.VIP_CARD_ADDED.value().equals(payOrderType)|| PayOrderTypeEnum.VIP_CARD_RENEW.value().equals(payOrderType) || PayOrderTypeEnum.AREA_VIP_CARD_ADDED.value().equals(payOrderType) || PayOrderTypeEnum.AREA_VIP_CARD_CHANGE_CARNUM.value().equals(payOrderType) || PayOrderTypeEnum.TIME_VIP_CARD_ADDED.value().equals(payOrderType) || PayOrderTypeEnum.TIME_VIP_CARD_CHANGE_CARNUM.value().equals(payOrderType)) { for(TdCCustInvoiceByOrdersRequest ordersRequest :aMap.get(payOrderType)) { /**会员卡*/ // 更新是否已开发票状态 UpdateVipcardDetailReq updateVipcardDetailReq = new UpdateVipcardDetailReq(); updateVipcardDetailReq.setOrderId(ordersRequest.getRltOrderId()); updateVipcardDetailReq.setInvoiceState(InvoiceStateEnum.YES.getValue()); updateVipcardDetailReq.setSysCode(BasicEnum.SYS_CODE.getValue()); vipCardOrderOperService.updateVipCardDetailByOrderId(updateVipcardDetailReq); hisDetailList = this.getCustInvoiceHisDetail(requestObject,ordersRequest,hisDetailList); } recordo.setInvoiceBigType(OrderBigTypeEnum.VIP_ORDER.value()); }else if(PayOrderTypeEnum.BALANCE_PAY.value().equals(payOrderType)) { for(TdCCustInvoiceByOrdersRequest ordersRequest :aMap.get(payOrderType)) { /**账户充值*/ // 更新是否已开发票状态 OrderRechargeUpdateRequest orderRechargeUpdateRequest = new OrderRechargeUpdateRequest(); orderRechargeUpdateRequest.setOrderId(ordersRequest.getRltOrderId()); orderRechargeUpdateRequest.setInvoiceState(InvoiceStateEnum.YES.getValue()); orderRechargeUpdateRequest.setSysCode(BasicEnum.SYS_CODE.getValue()); rechargeOrderOperService.updateOrderRechargeByOrderIdOrId(orderRechargeUpdateRequest); hisDetailList = this.getCustInvoiceHisDetail(requestObject,ordersRequest,hisDetailList); } recordo.setInvoiceBigType(OrderBigTypeEnum.RECHARGE_ORDER.value()); } } } else { logger.info("openTicketForCustInvoiceHisInfo--requestObject.getOrders 传入参数订单列表为空 "); throw new BizException(ErrorType.PARAMM_NULL, "请求对象为空"); } //查询销方信息 TdCCustInvoiceSaleQueryRequest saleRequest = new TdCCustInvoiceSaleQueryRequest(); saleRequest.setSysCode(BasicEnum.SYS_CODE.getValue()); saleRequest.setOrgId(recordo.getOrgId()); // 新增了税号,根据税号获取对应的销方信息 by zegnqc if(!StringUtils.isEmpty(requestObject.getSaleTaxid())){ saleRequest.setSaleTaxids(Collections.singletonList(requestObject.getSaleTaxid())); } if (null == recordo.getOrgId()) { throw new BizException(ErrorType.PARAMM_NULL, "获取销方信息,组织id为空!"); } List saleList = tdCCustInvoiceSaleDao.queryTdCCustInvoiceSale(saleRequest); if (CollectionUtils.isEmpty(saleList)) { throw new BizException(ErrorType.BIZ_ERROR, "根据当前组织编码[" + requestObject.getOrgId() + "],未查询到相应的销方信息!"); } tdCCustInvoiceHisDTO.setCustInvoiceHisDetailDTOList(hisDetailList); TdCCustInvoiceSale saleInfo = saleList.get(0); // 历史开票插入 recordo.setInvoiceTaxRate(new BigDecimal(saleInfo.getItemTaxRate())); //总价除以(1+9%)乘9% recordo.setInvoiceTaxFee(recordo.getInvoiceTotalFee() == null ? new BigDecimal("0") : ((recordo.getInvoiceTotalFee()).multiply(recordo.getInvoiceTaxRate())) ); BigDecimal a = recordo.getInvoiceTaxRate().add(new BigDecimal(1)); recordo.setInvoiceTaxFee(recordo.getInvoiceTaxFee().divide(a,2, RoundingMode.HALF_UP) ); recordo.setInvoiceTotalFee(recordo.getInvoiceTotalFee()); recordo.setInvoiceFee(recordo.getInvoiceTotalFee() == null ? new BigDecimal("0") : (recordo.getInvoiceTotalFee()).subtract(recordo.getInvoiceTaxFee())); //放入销方信息 recordo.setSaleAddress(saleInfo.getAddress()); recordo.setSaleBankName(saleInfo.getSaleBankName()); recordo.setSaleCardNo(saleInfo.getSaleBankNo()); recordo.setSaleName(saleInfo.getSaleName()); recordo.setSaleTaxid(saleInfo.getSaleTaxid()); //放入开票人、复核人、收款人 recordo.setChecker(saleInfo.getChecker()); recordo.setPryee(saleInfo.getPryee()); recordo.setDrawer(saleInfo.getDrawer()); if(StringUtils.isEmpty(recordo.getTicketContent())){ recordo.setTicketContent(saleInfo.getItemName()); } recordo.setTerminalSource(requestObject.getTerminalSource()); logger.info("---begin--openTicketForCustInvoiceHisInfo记录客户开发票历史信息,入参={}", JSONObject.toJSON(recordo)); recordo.setId(custInvoiceHisDao.insertCustInvoiceHistoryInfo(recordo)); BeanUtils.copyProperties(recordo, tdCCustInvoiceHisDTO); //新增开票条目 List items = new ArrayList<>(); TdCCustInvoiceHisItem item = new TdCCustInvoiceHisItem(); BeanUtils.copyProperties(recordo, item); item.setInvoiceId(recordo.getInvoiceId()); item.setItemName(saleInfo.getItemName()); item.setItemCode(saleInfo.getItemCode()); item.setLineType(InvoiceItemEnum.LINETYPE);//0:正常行1:折扣行2:被折扣行 item.setTaxRate(saleInfo.getItemTaxRate()); item.setUnit(InvoiceItemEnum.UNIT); item.setSpec(InvoiceItemEnum.SPEC); item.setQuantity(1D); item.setTaxPrice(recordo.getInvoiceTotalFee() == null?0:(recordo.getInvoiceTotalFee().doubleValue())/100); item.setTotalAmount(recordo.getInvoiceTotalFee() == null?0:(recordo.getInvoiceTotalFee().doubleValue())/100); item.setYhzcbs("0");//税收优惠政策标志0:不使用 1:使用 items.add(item); custInvoiceHisDao.insertCustInvoiceHistorItems(items ); return new BizResult (tdCCustInvoiceHisDTO); } @Override public BizResult openTicketForBusinessInvoiceHisInfo(TdCCustInvoiceHisRequest requestObject) { return null; } private List getCustInvoiceHisDetail(TdCCustInvoiceHisRequest requestObject, TdCCustInvoiceByOrdersRequest ordersRequest,List hisDetailList){ // 新增已开发票详情 TdCCustInvoiceHisDetail record = new TdCCustInvoiceHisDetail(); record.setOrderId(ordersRequest.getRltOrderId()); record.setInvoiceId(requestObject.getInvoiceId()); record.setOrderType(ordersRequest.getPayOrderType()); record.setOrderActFee(new BigDecimal(ordersRequest.getOrderActFee())); record.setOrderPayedFee(new BigDecimal(ordersRequest.getOrderActFee())); record.setOrderTotalFee(new BigDecimal(ordersRequest.getOrderTotalFee())); record.setOrderDate(ordersRequest.getCreateDate()); record.setDataState(1); record.setCreateDate(new Date()); record.setCarNumber(ordersRequest.getCarNumber()); record.setPlNo(ordersRequest.getPlNo()); record.setPlName(ordersRequest.getPlName()); record.setId(custInvoiceHisDetailDao.insertCustInvoiceHistoryDetailInfo(record)); TdCCustInvoiceHisDetailDTO tdCCustInvoiceHisDetailDTO = new TdCCustInvoiceHisDetailDTO(); BeanUtils.copyProperties(record, tdCCustInvoiceHisDetailDTO); hisDetailList.add(tdCCustInvoiceHisDetailDTO); return hisDetailList; } private List createCustInvoiceHisDetail(TdCCustInvoiceHisRequest requestObject,TdCCustInvoiceByOrdersRequest ordersRequest,List hisDetailList){ // 新增已开发票详情 TdCCustInvoiceHisDetail record = new TdCCustInvoiceHisDetail(); record.setOrderId(ordersRequest.getRltOrderId()); record.setInvoiceId(requestObject.getInvoiceId()); record.setOrderType(ordersRequest.getPayOrderType()); record.setOrderActFee(new BigDecimal(ordersRequest.getOrderActFee())); record.setOrderPayedFee(new BigDecimal(ordersRequest.getOrderActFee())); record.setOrderTotalFee(new BigDecimal(ordersRequest.getOrderTotalFee())); record.setOrderDate(ordersRequest.getCreateDate()); record.setDataState(1); record.setCreateDate(new Date()); record.setCarNumber(ordersRequest.getCarNumber()); record.setPlNo(ordersRequest.getPlNo()); record.setPlName(ordersRequest.getPlName()); if(requestObject.getOptState()==1){ record.setId(custInvoiceHisDetailDao.insertCustInvoiceHistoryDetailInfo(record)); } TdCCustInvoiceHisDetailDTO tdCCustInvoiceHisDetailDTO = new TdCCustInvoiceHisDetailDTO(); BeanUtils.copyProperties(record, tdCCustInvoiceHisDetailDTO); hisDetailList.add(tdCCustInvoiceHisDetailDTO); return hisDetailList; } @Override public BizResult> queryCustInvoiceHisForPage(TdCCustInvoiceHisQueryRequest request) { PageBean pageBean = new PageBean<>(); PageInfo pageInfo = custInvoiceHisDao.queryCustInvoiceHisForPage(request); if(pageInfo!=null){ PageBeanUtil.copyProperties(pageInfo, pageBean, TdCCustInvoiceHisDTO.class); } return new BizResult<>(pageBean); } @Override public BizResult queryCustInvoiceHisById(TdCCustInvoiceHisQueryRequest request) { TdCCustInvoiceHisDTO dto = custInvoiceHisDao.queryCustInvoiceHisById(request); return new BizResult<>(dto); } @Override public BizResult openInvoiceRecordTest(TdCCustInvoiceHisRequest request) throws RemoteException, JAXBException { InvoInfo invoInfo = new InvoInfo(); invoInfo.setSwno("911390449563895037952"); invoInfo.setSaleTax("110101999999446"); invoInfo.setCustName("中兴-测试"); Orders orderList = new Orders(); List orders = new ArrayList(); Order order = new Order(); order.setBillNo("B10001"); Items itemList = new Items(); List items = new ArrayList<>(); item item = new item(); item.setKce(124.3D); items.add(item); items.add(item); itemList.setItem(items); order.setItems(itemList); orders.add(order); orders.add(order); orderList.setOrder(orders); invoInfo.setOrders(orderList); String xml = XMLHelper.converTomXml(invoInfo); logger.info("调用电子发票接口开票入参:{}",invoInfo); ZKInvoiceService zkInvoiceService = this.getEInvoiceServiceBean("http://218.249.166.20:8113","eisp-zk/ws/zkiService?wsdl"); String result = zkInvoiceService.submitEInvoiceInfo(xml); ReturnMsg returnMsg = XMLHelper.converyToJavaBean(result,ReturnMsg.class ); logger.info("调用电子发票接口开票返回:{}",JSONObject.toJSON(returnMsg)); return new BizResult<>(true); } @Override @Transactional public BizResult openInvoiceRecord(TdCCustInvoiceHisRequest request) { TdCCustInvoiceHis record = new TdCCustInvoiceHis(); List items = new ArrayList<>(); BeanUtils.copyProperties(request, record); //record.setInvoiceId(SequenceUtil.getNextId(SequenceTypeEnum.INVOICE_ID)); record.setInvoiceId(request.getSaleTaxid().substring(request.getSaleTaxid().length() - 4,request.getSaleTaxid().length())+ UUID28.generate28CharUUID()); record.setDataState(DataStatusEnum.DATA_STATUS_VALID.value()); record.setCustId("CLOUD1001"); record.setCreateDate(new Date()); List itemDTOs = request.getCustInvoiceHisItemDTOs(); ListCopyUtil.listCopyProperties(itemDTOs, items, TdCCustInvoiceHisItem.class); Long result = custInvoiceHisDao.insertCustInvoiceHistoryInfo(record); if(result <= 0){ throw new BizException(ErrorType.BIZ_ERROR,"新增电子发票失败!"); } for (TdCCustInvoiceHisItem item : items) { item.setCreateDate(record.getCreateDate()); item.setCreateEmpid(record.getCreateEmpid()); item.setDataState(DataStatusEnum.DATA_STATUS_VALID.value()); item.setInvoiceId(record.getInvoiceId()); item.setOrgId(record.getOrgId()); Boolean i = custInvoiceHisDao.insertCustInvoiceHistorItems(items); if(!i){ throw new BizException(ErrorType.BIZ_ERROR,"新增电子发票条目失败!"); } } return new BizResult<>(result>0); } /** * 获取金税发票接口bean * @return * 2019年8月12日 wangfei */ private ZKInvoiceService getEInvoiceServiceBean(String jinshuiWsdl,String serviceUrl){ // 接口地址 //http://218.249.166.20:8113/eisp-zk/ws/zkiService?wsdl String address = "http://" + jinshuiWsdl + "/"+serviceUrl; // 代理工厂 JaxWsProxyFactoryBean jaxWsProxyFactoryBean = new JaxWsProxyFactoryBean(); // 设置代理地址 jaxWsProxyFactoryBean.setAddress(address); // 设置接口类型 jaxWsProxyFactoryBean.setServiceClass(ZKInvoiceService.class); // 创建一个代理接口实现 ZKInvoiceService zkInvoiceService = (ZKInvoiceService) jaxWsProxyFactoryBean.create(); return zkInvoiceService; } @Override public BizResult openInvoiceListByOrderIds(TdCCustInvoiceHisRequest request) throws RemoteException, JAXBException { logger.info("开始调用接口循环开票入参request:{}",JSONObject.toJSON(request)); TdCCustInvoiceSaleQueryRequest saleRequest = new TdCCustInvoiceSaleQueryRequest(); saleRequest.setSysCode(BasicEnum.SYS_CODE.getValue()); saleRequest.setOrgId(request.getOrgId()); // 增加税号,后面根据税号查询对应的销方信息;by zengqc 2022-03-29 if(!StringUtils.isEmpty(request.getSaleTaxid())){ saleRequest.setSaleTaxids(Collections.singletonList(request.getSaleTaxid())); } if(CollectionUtils.isEmpty(request.getOrderIds())){ throw new BizException(ErrorType.PARAMM_NULL,"订单编号"); } if(StringUtils.isEmpty(request.getOrgId())){ throw new BizException(ErrorType.PARAMM_NULL,"组织编号"); } List invoices = this.queryCustInvoiceHisListByInvoiceIds(request.getOrderIds()); logger.info("开始调用接口循环开票入参invoices:{}",JSONObject.toJSON(request)); if(CollectionUtils.isEmpty(invoices)){ throw new BizException(ErrorType.BIZ_ERROR,"未查询到待开票订单信息!"); } //根据组织查询销方信息 //查询销方信息 if(invoices.get(0).getOrgId() != null){ saleRequest.setOrgId(invoices.get(0).getOrgId()); } List saleList = tdCCustInvoiceSaleDao.queryTdCCustInvoiceSale(saleRequest); if(CollectionUtils.isEmpty(saleList)){ throw new BizException(ErrorType.BIZ_ERROR, "根据当前组织编码["+request.getOrgId()+"],未查询到相应的销方信息!"); } TdCCustInvoiceSale saleInfo = saleList.get(0); Integer serverType = saleInfo.getServerType(); if(serverType == null){ throw new BizException(ErrorType.BIZ_ERROR, "未查询到当前组织编码["+request.getOrgId()+"]的销方信息!"); } String serverTypeName = InvoiceServiceTypeEnum.InvoiceServiceTypeNameEnum.getValue(serverType).getDesc(); InvoiceOpenHandler invoiceOpenHandler = (InvoiceOpenHandler) SpringContextUtil.getBean(serverTypeName); for (TdCCustInvoiceHisDTO i : invoices) { if (!Validator.isEmail(i.getCustEmail())) { throw new BizException(ErrorType.BIZ_ERROR, i.getCustEmail()+" 邮箱格式不符合开票要求!"); } // if (i.getCustPhone()!=null && !AppRsesultUtil.isMobils(i.getCustPhone())) { // throw new BizException(ErrorType.BIZ_ERROR, i.getCustPhone()+" 手机号格式不符合开票要求!"); // } if (i.getTerminalSource()!=null&& (i.getTerminalSource() == 4 || i.getTerminalSource() == 16)) { TdCCustInvoiceHis record = new TdCCustInvoiceHis(); record.setCustName(request.getCustName()); record.setInvoiceType(request.getInvoiceType()); record.setCustTaxid(request.getCustTaxid()); record.setCustEmail(request.getCustEmail()); record.setCustBankName(request.getCustBankName()); record.setCustPhone(request.getCustPhone()); record.setCustCardNo(request.getCustCardNo()); record.setCustAddress(request.getCustAddress()); record.setRemark(request.getRemark()); record.setInvoiceId(i.getInvoiceId()); custInvoiceHisDao.updateInvioceByInvoiceId(record); } logger.info("开始调用接口循环开票入参:{}",JSONObject.toJSON(request)); //开始调用接口循环开票 invoiceOpenHandler.blueInvoiceHandler(request, i, saleInfo); } //更新发票余量 invoiceOpenHandler.updateInvoiceSaleSurplus(request.getSaleTaxid(), saleInfo); return new BizResult<>(true); } /** * 更新发票余量 * @param taxId * 2019年9月2日 wangfei * @throws RemoteException * @throws JAXBException */ private void updateInvoiceSaleSurplus(String taxId,String jinshuiWsdl,String serviceUrl) { if(StringUtils.isEmpty(taxId)){ return; } try{ InvoInfo invoInfo = new InvoInfo(); invoInfo.setSaleTax(taxId); String xml = XMLHelper.converTomXml(invoInfo ); logger.info("调用电子发票余量查询接口入参:{}",xml); ZKInvoiceService zkInvoiceService = this.getEInvoiceServiceBean(jinshuiWsdl,serviceUrl); String result = zkInvoiceService.getKPYL(xml); logger.info("调用电子发票余量查询接口返回:{}",result); SYFPReturnMsg returnMsg = XMLHelper.converyToJavaBean(result,SYFPReturnMsg.class); if("0000".equals(returnMsg.getRETURNCODE())){ TdCCustInvoiceSale record = new TdCCustInvoiceSale(); record.setSaleTaxid(taxId); record.setInvoiceSurplusNum(returnMsg.getSYFPFS()); tdCCustInvoiceSaleDao.updateInvoiceSaleByTaxId(record ); }else{ logger.error("调用电子发票余量查询接口报错:{}",result); } }catch (Exception e){ logger.error("调用电子发票余量查询接口报错Exception:{}",e); } } /** * 开始处理开票 * @param request * @param i * @throws RemoteException * @throws JAXBException * 2019年9月2日 wangfei */ //@Transactional // private void invoiceOpenHandle(TdCCustInvoiceHisRequest request, TdCCustInvoiceHisDTO i,String jinshuiWsdl,String serviceUrl) // throws RemoteException, JAXBException { // // ZKInvoiceService zkInvoiceService = this.getEInvoiceServiceBean(jinshuiWsdl,serviceUrl); // // 开始转换参数 // InvoInfo invoInfo = new InvoInfo(); // invoInfo.setSwno(i.getInvoiceId()); // invoInfo.setSaleTax(i.getSaleTaxid()); //// invoInfo.setCustName(i.getSaleName()); // if(("0").equals(i.getInvoiceType())){//个人 // invoInfo.setCustName(i.getCustName()); // invoInfo.setCustType("03"); // }else if(("1").equals(i.getInvoiceType())){//企业 // invoInfo.setCustTaxNo(i.getCustTaxid()); // invoInfo.setCustName(i.getCustName()); // invoInfo.setCustType("01"); // }else if(("2").equals(i.getInvoiceType())){//表示非企业性质单位 // invoInfo.setCustTaxNo(i.getCustTaxid()); // invoInfo.setCustName(i.getCustName()); // invoInfo.setCustType("02"); // } // invoInfo.setCustAddr(i.getCustAddress()); //// invoInfo.setCustTelephone(i.getCustPhone()); // invoInfo.setCustPhone(i.getCustPhone()); // invoInfo.setCustEmail(i.getCustEmail()); // invoInfo.setCustBankAccount(i.getCustBankName() == null ? "" : i.getCustBankName() // + (i.getCustCardNo() == null ? "" : i.getCustCardNo())); // // invoInfo.setInvType(3); // invoInfo.setBillDate(DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss")); // invoInfo.setBillType(1); // invoInfo.setSpecialRedFlag("0"); // invoInfo.setOperationCode("10"); // //设置收款人、复核人、开票人 // if(org.apache.commons.lang3.StringUtils.isBlank(i.getDrawer())){ // invoInfo.setKpy(request.getCreateEmpid()); // }else{ // invoInfo.setKpy(i.getDrawer()); // } // invoInfo.setFhr(i.getChecker()); // invoInfo.setSky(i.getPryee()); // invoInfo.setInvoMemo(i.getRemark()); // // Orders orderList = new Orders(); // List orders = new ArrayList(); // Order order = new Order(); // order.setBillNo("B"+i.getInvoiceId()); // Items itemList = new Items(); // List items = new ArrayList<>(); // for (TdCCustInvoiceHisItemDTO m : i.getCustInvoiceHisItemDTOs()) { // item item = new item(); // item.setName(m.getItemName()); // item.setCode(m.getItemCode()); // item.setLineType(m.getLineType()); // item.setSpec(m.getSpec()); // item.setUnit(m.getUnit()); // item.setTaxRate(m.getTaxRate()); // item.setQuantity(m.getQuantity()); // item.setTaxPrice(m.getTaxPrice()); // item.setTotalAmount(m.getTotalAmount()); // item.setYhzcbs(m.getYhzcbs()); // item.setYhzcnr(m.getYhzcnr()); // items.add(item); // } // itemList.setItem(items); // order.setItems(itemList); // orders.add(order); // orderList.setOrder(orders); // invoInfo.setOrders(orderList); // String xml = XMLHelper.converTomXml(invoInfo); // logger.info("调用电子发票接口开票入参:{}",xml); // String result = zkInvoiceService.submitEInvoiceInfo(xml); // logger.info("调用电子发票接口开票返回:{}",result); // ReturnMsg returnMsg = XMLHelper.converyToJavaBean(result,ReturnMsg.class); // if("0000".equals(returnMsg.getMsgCode())){ // //开票成功 调用修改接口 // TdCCustInvoiceHis record = new TdCCustInvoiceHis(); // record.setInvoiceId(i.getInvoiceId()); // record.setModfiyEmpid(request.getModfiyEmpid()); // record.setInvoiceState(InvoiceStateEnum.ALREADY_OPEN_INVOICE.getValue()+""); // record.setMsg(returnMsg.getMsg()); //// record.setDrawerId(Long.valueOf(request.getModfiyEmpid())); //// record.setDrawer(request.getCreateEmpid()); // record.setInvoiceDate(new Date()); // custInvoiceHisDao.updateInvioceByInvoiceId(record); //// //开始查询开票后的信息,下载电子发票 //// Boolean down = this.downTheInvoice(i); //// if(!down){ //// throw new BizException(ErrorType.BIZ_ERROR,"开票下载失败!"); //// } // // }else if("9106".equals(returnMsg.getMsgCode())){ // //重复开票 // TdCCustInvoiceHis record = new TdCCustInvoiceHis(); // record.setInvoiceId(i.getInvoiceId()); // record.setModfiyEmpid(request.getModfiyEmpid()); // record.setInvoiceState(InvoiceStateEnum.REPEATED_INVOICING.getValue()+""); // record.setMsg(returnMsg.getMsg()); //// record.setDrawerId(Long.valueOf(request.getModfiyEmpid())); //// record.setDrawer(request.getCreateEmpid()); // custInvoiceHisDao.updateInvioceByInvoiceId(record); // }else { // //开票错误 // TdCCustInvoiceHis record = new TdCCustInvoiceHis(); // record.setInvoiceId(i.getInvoiceId()); // record.setModfiyEmpid(request.getModfiyEmpid()); // record.setInvoiceState(InvoiceStateEnum.INVOICE_PARAM_NOT_VALID.getValue()+""); // record.setMsg(returnMsg.getMsg()); //// record.setDrawerId(Long.valueOf(request.getModfiyEmpid())); //// record.setDrawer(request.getCreateEmpid()); // custInvoiceHisDao.updateInvioceByInvoiceId(record); // // } // logger.info("调用电子发票接口开票返回:{}",JSONObject.toJSON(returnMsg)); // } /** * 下载电子发票(单个的) * @param * @throws RemoteException * @throws JAXBException * 2019年9月2日 wangfei */ public BizResult downTheInvoice(TdCCustInvoiceHisRequest request) throws RemoteException, JAXBException { //获取销方信息 TdCCustInvoiceSale saleInfo = getTdCCustInvoiceSale(request); InvoiceOpenHandler invoiceOpenHandler = (InvoiceOpenHandler) SpringContextUtil.getBean(InvoiceServiceTypeEnum.InvoiceServiceTypeNameEnum.getValue(saleInfo.getServerType()).getDesc()); BizResult booleanBizResult = invoiceOpenHandler.downTheInvoice(request, saleInfo); return booleanBizResult; } private TdCCustInvoiceSale getTdCCustInvoiceSale(TdCCustInvoiceHisRequest request) { TdCCustInvoiceSaleQueryRequest saleRequest = new TdCCustInvoiceSaleQueryRequest(); saleRequest.setSysCode(BasicEnum.SYS_CODE.getValue()); saleRequest.setOrgId(request.getOrgId()); // 补充根据税号查询销方信息 saleRequest.setSaleTaxids(Collections.singletonList(request.getSaleTaxid())); List saleList = tdCCustInvoiceSaleDao.queryTdCCustInvoiceSale(saleRequest); if (CollectionUtils.isEmpty(saleList)) { throw new BizException(ErrorType.BIZ_ERROR, "根据当前组织编码[" + request.getOrgId() + "],未查询到相应的销方信息!"); } return saleList.get(0); } @Override public BizResult queryElectronicInvoiceBillingStatistics(InvoiceStatisticsRequest request) { TdCCustInvoiceHisStatisticsDTO tdCCustInvoiceHisStatisticsDTO = new TdCCustInvoiceHisStatisticsDTO(); tdCCustInvoiceHisStatisticsDTO.setCustName(request.getCustName()); tdCCustInvoiceHisStatisticsDTO.setSaleName(request.getSaleName()); tdCCustInvoiceHisStatisticsDTO.setReportDate(new Date()); tdCCustInvoiceHisStatisticsDTO.setExportDate(tdCCustInvoiceHisStatisticsDTO.getReportDate()); List rateDataDTOS = tdCCustInvoiceHisQueryInnerService.queryRateData(request); if (!CollectionUtils.isEmpty(rateDataDTOS)) { tdCCustInvoiceHisStatisticsDTO.setRateData(rateDataDTOS); } List statisticsDataDTOS = tdCCustInvoiceHisQueryInnerService.queryStatisticsData(request); if (!CollectionUtils.isEmpty(statisticsDataDTOS)) { tdCCustInvoiceHisStatisticsDTO.setCustTaxid(statisticsDataDTOS.get(0).getCustTaxID()); statisticsDataDTOS.stream().forEach(statisticsDataDTO -> tdCCustInvoiceHisStatisticsDTO.setTotaldata( tdCCustInvoiceHisStatisticsDTO.getTotaldata() == null ? 0 : tdCCustInvoiceHisStatisticsDTO.getTotaldata() + statisticsDataDTO.getAmount())); tdCCustInvoiceHisStatisticsDTO.setStatisticsData(statisticsDataDTOS); } return new BizResult<>(tdCCustInvoiceHisStatisticsDTO); } @Override public BizResult resendInvoiceMail(TdCCustInvoiceHisRequest request, String mailTemplet) throws UnsupportedEncodingException { TdCCustInvoiceHisDTO invoice = custInvoiceHisDao.queryCustInvoiceHisByInvoiceId(request.getInvoiceId()); if(!StringUtils.isEmpty(request.getCustEmail())){ invoice.setCustEmail(request.getCustEmail()); } //查询开票服务器信息 if(invoice == null || StringUtils.isEmpty(invoice.getInvoiceUrl())){ logger.error("开票信息错误"); throw new AppException(AppErrorEnum.APP_INVOICEURLNOTNULL_ERROR); } TdCCustInvoiceSaleQueryRequest saleRequest = new TdCCustInvoiceSaleQueryRequest(); saleRequest.setOrgId(request.getOrgId()); saleRequest.setSysCode(BasicEnum.SYS_CODE.getValue()); // 补充根据税号查询销方信息 by zengqc 2022-03-29 if(!StringUtils.isEmpty(request.getSaleTaxid())){ saleRequest.setSaleTaxids(Collections.singletonList(request.getSaleTaxid())); } List sales = tdCCustInvoiceSaleDao.queryTdCCustInvoiceSale(saleRequest); if(CollectionUtils.isEmpty(sales)){ logger.error("根据当前orgId["+request.getOrgId()+"]没有查询到相应的开票服务器信息,请及时添加!saleRequest={}", JSONObject.toJSON(saleRequest)); throw new AppException(AppErrorEnum.APP_UNGETSERVER_ERROR); } TdCCustInvoiceSaleDTO saleDTO = new TdCCustInvoiceSaleDTO(); BeanUtils.copyProperties(sales.get(0), saleDTO); //发邮件 if(saleDTO.getMessagePushSwitch() == null || 0 == (saleDTO.getMessagePushSwitch())){ logger.error("销方邮箱推送开关未开启,请联系工作人员!"); throw new AppException(AppErrorEnum.APP_MAILPUSHCLOSE_ERROR); } //查询开发件箱 TdCCustInvoiceMail mail = tdCCustInvoiceMailDao.queryTheLessMailByOrgId(request.getOrgId()); if(mail == null || mail.getId() == null){ logger.error("销方邮箱信息未查询到,请联系工作人员!"); logger.info("销方邮箱信息未查询到,请联系工作人员!"); } 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); logger.info("开始发送电子邮件!:"+invoice.getCustEmail()+subject+ content); mailService.sendHtmlMail(invoice.getCustEmail(), subject, content,mailDTO); return new BizResult<>(true); } /** * 任你停新版APP-重新发送发票邮件并返回发票下载地址 * @param request * @return */ @Override public BizResult resendInvoiceMailGetInvoiceUrl(TdCCustInvoiceHisRequest request, String mailTemplet) throws UnsupportedEncodingException { TdCCustInvoiceHisDTO invoice = custInvoiceHisDao.queryCustInvoiceHisByInvoiceId(request.getInvoiceId()); if (!StringUtils.isEmpty(request.getCustEmail())) { invoice.setCustEmail(request.getCustEmail()); } //查询开票服务器信息 if (invoice == null || StringUtils.isEmpty(invoice.getInvoiceUrl())) { logger.error("开票信息错误"); throw new AppException(AppErrorEnum.APP_INVOICEURLNOTNULL_ERROR); } TdCCustInvoiceSaleQueryRequest saleRequest = new TdCCustInvoiceSaleQueryRequest(); saleRequest.setOrgId(request.getOrgId()); saleRequest.setSysCode(BasicEnum.SYS_CODE.getValue()); // 补充根据税号查询销方信息 by zengqc 2022-03-29 if (!StringUtils.isEmpty(request.getSaleTaxid())) { saleRequest.setSaleTaxids(Collections.singletonList(request.getSaleTaxid())); } List sales = tdCCustInvoiceSaleDao.queryTdCCustInvoiceSale(saleRequest); if (CollectionUtils.isEmpty(sales)) { logger.error("根据当前orgId[" + request.getOrgId() + "]没有查询到相应的开票服务器信息,请及时添加!saleRequest={}", JSONObject.toJSON(saleRequest)); throw new AppException(AppErrorEnum.APP_UNGETSERVER_ERROR); } TdCCustInvoiceSaleDTO saleDTO = new TdCCustInvoiceSaleDTO(); BeanUtils.copyProperties(sales.get(0), saleDTO); //发邮件 if (saleDTO.getMessagePushSwitch() == null || 0 == (saleDTO.getMessagePushSwitch())) { logger.error("销方邮箱推送开关未开启,请联系工作人员!"); throw new AppException(AppErrorEnum.APP_MAILPUSHCLOSE_ERROR); } //查询开发件箱 TdCCustInvoiceMail mail = tdCCustInvoiceMailDao.queryTheLessMailByOrgId(request.getOrgId()); if (mail == null || mail.getId() == null) { logger.error("销方邮箱信息未查询到,请联系工作人员!"); logger.info("销方邮箱信息未查询到,请联系工作人员!"); } 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); logger.info("开始发送电子邮件!:" + invoice.getCustEmail() + subject + content); mailService.sendHtmlMail(invoice.getCustEmail(), subject, content, mailDTO); return new BizResult<>(invoice); } /** * 根据发票id获取发票详情以及条目 * * @param invoiceIds * @return 2019年8月26日 wangfei */ private List queryCustInvoiceHisListByInvoiceIds(List invoiceIds) { List result = new ArrayList<>(); TdCCustInvoiceHisExample example = new TdCCustInvoiceHisExample(); Criteria sql = example.createCriteria(); sql.andInvoiceIdIn(invoiceIds); sql.andDataStateEqualTo(DataStatusEnum.DATA_STATUS_VALID.value()); List list = custInvoiceHisDao.queryCustInvoiceHistoryList(example); if (CollectionUtil.isNotEmpty(list)) { //查询明细 for (TdCCustInvoiceHis i : list) { TdCCustInvoiceHisDTO dto = new TdCCustInvoiceHisDTO(); BeanUtils.copyProperties(i, dto); TdCCustInvoiceHisItemExample example2 = new TdCCustInvoiceHisItemExample(); example2.createCriteria().andInvoiceIdEqualTo(i.getInvoiceId()).andDataStateEqualTo(DataStatusEnum.DATA_STATUS_VALID.value()); List itemDTOs = new ArrayList<>(); List items = tdCCustInvoiceHisItemDao.queryCustInvoiceHistoryList(example2); if (!CollectionUtils.isEmpty(items)) { ListCopyUtil.listCopyProperties(items, itemDTOs, TdCCustInvoiceHisItemDTO.class); dto.setCustInvoiceHisItemDTOs(itemDTOs); } List tdCCustInvoiceHisDetailDTOList = null; TdCCustInvoiceHisDetailExample tdCCustInvoiceHisDetailExample = new TdCCustInvoiceHisDetailExample(); tdCCustInvoiceHisDetailExample.createCriteria().andInvoiceIdEqualTo(i.getInvoiceId()).andDataStateEqualTo(DataStatusEnum.DATA_STATUS_VALID.value()); List tdCCustInvoiceHisDetailList = custInvoiceHisDetailDao.queryCustInvoiceHisDetailList(tdCCustInvoiceHisDetailExample); if (null != tdCCustInvoiceHisDetailList) { tdCCustInvoiceHisDetailDTOList = JSON.parseArray(JSON.toJSONString(tdCCustInvoiceHisDetailList, false), TdCCustInvoiceHisDetailDTO.class); dto.setCustInvoiceHisDetailDTOList(tdCCustInvoiceHisDetailDTOList); } result.add(dto); } } return result; } /** * 获取客服电话 * * @param * @return * @Author: niueb * @Date: 2019/12/11 */ private String getServicePhone(Long orgId) { //查询缓存 AppOrgDTO appOrgDTO = AppOrgCacheUtil.getAppOrgInfoByOrgId(orgId + ""); if (appOrgDTO == null) { appOrgDTO = new AppOrgDTO(); appOrgDTO.setIsOpenActivity(0); AppOrgRequest apporgRequest = new AppOrgRequest(); apporgRequest.setOrgId(orgId + ""); apporgRequest.setSysCode(BasicEnum.SYS_CODE.getValue()); BizResult appOrgDTOBizResult = appOrgService.queryAppOrgByOrgId(apporgRequest); logger.info("查询APP组织:" + JSONObject.toJSON(appOrgDTOBizResult)); if (appOrgDTOBizResult.isSuccess() && appOrgDTOBizResult.getData() != null) { appOrgDTO = appOrgDTOBizResult.getData(); } } String servicePhone = appOrgDTO == null ? "" : appOrgDTO.getPhone(); return servicePhone; } /** * 查询客户所有发票抬头信息 */ @Override public BizResult> queryCustInvoiceInfoListByName(QueryCustInvoiceInfoListRequest requestObject) { if (null == requestObject) { throw new BizException(ErrorType.PARAMM_NULL, "请求对象为空"); } TdCCustInvoiceinfoExample example = new TdCCustInvoiceinfoExample(); example.createCriteria().andInvoiceTypeEqualTo("1").andNameLike(requestObject.getName()+"%"); List tdCCustInvoiceinfoList = custInvoiceinfoDao.queryCustInvoiceInfoList(example); List tdCCustInvoiceinfoDTOList = null; if (null != tdCCustInvoiceinfoList) { tdCCustInvoiceinfoDTOList = JSON.parseArray(JSON.toJSONString(tdCCustInvoiceinfoList, false), TdCCustInvoiceinfoDTO.class); } return new BizResult > (tdCCustInvoiceinfoDTOList); } /** * APP 传过来的开票请求,一次可以包含多个停车场的记录。 如果不同的停车场绑定不同的销方, * 则需要根据销方,将订单分开开票, 将一开始的一个请求,分解未多个请求的list */ @Override public BizResult> splitOneToList(InvoiceHisSplitOrderRequest invoiceHisSplitOrderRequest) { List invoiceHisRequestList = new ArrayList<>(); TdCCustInvoiceHisRequest baseRequest = invoiceHisSplitOrderRequest.getRequestObject(); // APP穿过来的待开票的所有订单记录 List orders = invoiceHisSplitOrderRequest.getOrders(); // 获取停车场编号去重列表 List plNos = orders.stream() .map(TdCCustInvoiceByOrdersRequest::getPlNo) .distinct() .collect(Collectors.toList()); // 根据停车场编号获取 停车场编号-税号 关联关系列表 List saleParkRelList = tdCCustInvoiceSaleParkRelDao.queryInvoiceSaleParkRelByPlNos(plNos); // 从订单中提取所有组织ID,为每个组织查询其默认销方税号 List orgIds = orders.stream() .map(TdCCustInvoiceByOrdersRequest::getOrgId) .filter(Objects::nonNull) .distinct() .collect(Collectors.toList()); Map orgDefaultTaxIdMap = new HashMap<>(); for (Long orgId : orgIds) { TdCCustInvoiceSaleQueryRequest request = new TdCCustInvoiceSaleQueryRequest(); request.setOrgId(orgId); TdCCustInvoiceSale defaultInvoiceSale = tdCCustInvoiceSaleDao.queryDefaultInvoiceSale(request); if (defaultInvoiceSale != null) { orgDefaultTaxIdMap.put(orgId, defaultInvoiceSale.getSaleTaxid()); } } // 如果没有关联的普通销方,并且所有组织都没有默认销方,则直接返回空 if (CollectionUtil.isEmpty(saleParkRelList) && orgDefaultTaxIdMap.isEmpty()) { logger.warn("没有默认的销方,并且没有关联的普通销方!!!"); return new BizResult<>(invoiceHisRequestList); } // 停车场编号-销方税号的map Map plNoTaxIdMap = saleParkRelList.stream() .collect(Collectors.toMap(TdCCustInvoiceSaleParkRel::getPlNo, TdCCustInvoiceSaleParkRel::getSaleTaxid, (k1, k2) -> k2)); // 订单根据停车场编号填充对应的税号:优先停车场关联的销方税号,其次使用订单所属组织的默认销方税号 orders.forEach(order -> { String saleTaxId = plNoTaxIdMap.get(order.getPlNo()); if (saleTaxId == null && order.getOrgId() != null) { saleTaxId = orgDefaultTaxIdMap.get(order.getOrgId()); } if (saleTaxId == null) { saleTaxId = "-1"; } order.setSaleTaxId(saleTaxId); if ("-1".equals(saleTaxId)) { logger.warn("订单未找到关联的销方数据orderId=[{}]-carNumber=[{}]-plNo=[{}]-orgId=[{}]", order.getRltOrderId(), order.getCarNumber(), order.getPlNo(), order.getOrgId()); } }); // KEY:销方税号 -- VALUE:关联的订单列表 MAP Map> saleIdOrdersMap = orders.stream() // 如果一个订单没有找到关联税号,也没有默认的税号,则不去开发票 .filter(order -> !order.getSaleTaxId().equals("-1")) .collect( Collectors.toMap( TdCCustInvoiceByOrdersRequest::getSaleTaxId, order -> { List requestList = new ArrayList<>(); requestList.add(order); return requestList; }, (List v1, List v2) -> { v1.addAll(v2); return v1; } ) ); /* 每个销方下,单独拼接出来自己的订单开票请求。【invoiceTotalFee】重新根据订单计算了一遍 APP 穿过来的开票请求,一次可以包含多个停车场的记录。 如果不同的停车场绑定不同的销方, 则需要根据销方,将订单分开开票。 所以前端传递过来的 invoiceTotalFee 总费用,查拆开以后,需要重新计算下 */ for(String key : saleIdOrdersMap.keySet()){ List requestList = saleIdOrdersMap.get(key); if(CollectionUtil.isEmpty(requestList)){ continue; } // 销方以及关联的订单list TdCCustInvoiceHisRequest temRequest = new TdCCustInvoiceHisRequest(); BeanUtils.copyProperties(baseRequest, temRequest); // 重新计算 invoiceTotalFee, 拆分以后,对应的开票订单列表可能变化了,所以重新计算 invoiceTotalFee long invoiceTotalFee = 0L; for(TdCCustInvoiceByOrdersRequest order : requestList){ invoiceTotalFee += order.getOrderActFee(); } temRequest.setOrders(requestList); temRequest.setSaleTaxid(key); temRequest.setInvoiceTotalFee(new BigDecimal(invoiceTotalFee)); //temRequest.setInvoiceId(SequenceUtil.getNextId(SequenceTypeEnum.INVOICE_ID)); temRequest.setInvoiceId(key.substring(key.length() - 4,key.length())+ UUID28.generate28CharUUID()); invoiceHisRequestList.add(temRequest); } return new BizResult<>(invoiceHisRequestList); } /** * 查询商户电子发票详情 * * @param request * @return */ @Override public BizResult queryCustBusinessInvoiceHisById(TdCCustInvoiceHisQueryRequest request) { TdCCustInvoiceHisDTO dto = new TdCCustInvoiceHisDTO();// custInvoiceHisDao.queryCustBusinessInvoiceHisById(request); return new BizResult<>(dto); } }