package com.by4cloud.platformx.business.controller; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.by4cloud.platformx.business.entity.ContractOutBound; import com.by4cloud.platformx.business.entity.SaleCredit; import com.by4cloud.platformx.business.entity.invoice.InvoiceResult; import com.by4cloud.platformx.business.entity.invoice.InvoiceResultItem; import com.by4cloud.platformx.business.entity.invoice.InvoicingVo; import com.by4cloud.platformx.business.invoice.service.FpInvoiceResultItemService; import com.by4cloud.platformx.business.service.ContractOutBoundService; import com.by4cloud.platformx.business.service.InvoiceService; import com.by4cloud.platformx.business.service.SaleCreditService; import com.by4cloud.platformx.common.core.util.R; import com.by4cloud.platformx.common.log.annotation.SysLog; import com.google.gson.Gson; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; import java.math.BigDecimal; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * 销售挂账 * * @author wjli * @date 2026-05-21 16:16:31 */ @RestController @RequiredArgsConstructor @RequestMapping("/invoiceResult" ) @Tag(description = "invoice" , name = "开票管理" ) public class InvoiceResultController { //发票结果 private final FpInvoiceResultItemService invoiceResultItemService; private final InvoiceService invoiceService; private final SaleCreditService saleCreditService; private final ContractOutBoundService contractOutBoundService; @Operation(summary = "推送应付蓝票" , description = "推送应付蓝票" ) @GetMapping("/pushYfBlue" ) public R pushYfBlue(@RequestBody SaleCredit saleCredit1) { SaleCredit byId = saleCreditService.getById(saleCredit1.getId()); if(byId.getBipStatus()==null ||!byId.getBipStatus().equals("200")){ return R.failed("请先推送单据后再推送发票"); } if(byId.getBlueInvoiceResultId()==null){ return R.failed("发票未开具"); } boolean b = invoiceService.pushBlue(saleCredit1.getId(), 1); if(b){ return R.ok(null,"推送成功"); }else { return R.failed(null,"推送失败"); } } @Operation(summary = "推送应收蓝票" , description = "推送应收蓝票" ) @GetMapping("/pushYsBlue" ) public R pushYsBlue(@RequestBody SaleCredit saleCredit1) { SaleCredit byId = saleCreditService.getById(saleCredit1.getId()); if(byId.getBipStatus()==null || !byId.getBipStatus().equals("200")){ return R.failed("请先推送单据后再推送发票"); } if(byId.getBlueInvoiceResultId()==null){ return R.failed("发票未开具"); } boolean b = invoiceService.pushBlue(saleCredit1.getId(),0); if(b){ return R.ok(null,"推送成功"); }else { return R.failed(null,"推送失败"); } } /** * 去开蓝票 * @param saleCredit1 去开蓝票 * @return R */ @Operation(summary = "去开蓝票" , description = "去开蓝票" ) @SysLog("去开蓝票" ) @PostMapping("/toBluePiao") @PreAuthorize("@pms.hasPermission('business_saleCredit_add')" ) public R toBluePiao(@RequestBody SaleCredit saleCredit1) { if(saleCredit1.getId()==null){ return R.failed("销售挂账id不能为空!"); } SaleCredit saleCredit = saleCreditService.getById(saleCredit1.getId()); List contractOutBoundList = contractOutBoundService.list(new LambdaQueryWrapper() .eq(ContractOutBound::getSaleCreditId,saleCredit.getId()) ); //生成vo InvoicingVo invoicingVo = invoiceService.toGetByCompare(saleCredit,contractOutBoundList); try { Map objectMap = invoiceService.toKaipiao(invoicingVo); Boolean success = (Boolean) objectMap.get("success"); String message = (String) objectMap.get("message"); System.out.println(saleCredit.getEntrustCode() + "的railwayEntrust蓝字开票结果为:" + success + "------" + message); if(success){ saleCredit.setStatus(2); saleCreditService.updateById(saleCredit); return R.ok("开票成功!"); }else{ saleCredit.setStatus(3); saleCreditService.updateById(saleCredit); return R.failed("开票失败!"); } }catch (Exception e){ saleCredit.setStatus(3); saleCreditService.updateById(saleCredit); return R.failed("开票失败!"); } } @Operation(summary = "发票查看" , description = "发票查看" ) @GetMapping("/downInvoice" ) public R downInvoice(String code) { QueryWrapper invoiceResultQueryWrapper = new QueryWrapper<>(); invoiceResultQueryWrapper.lambda() .eq(InvoiceResult::getEntrustCode,code) .eq(InvoiceResult::getMethodName,"蓝字开票接口") .eq(InvoiceResult::getSuccess,1) .orderByDesc(InvoiceResult::getCreateTime); List list = invoiceService.list(invoiceResultQueryWrapper); if(list !=null && list.size()>0){ InvoiceResult result = list.get(0); Map objectMap = invoiceService.downInvoiceMethod(result); Boolean success = (Boolean) objectMap.get("success"); String message = (String) objectMap.get("message"); if(success){ // if(result.getPushBip()==null||result.getPushBip()!=1){ // QueryWrapper wrapper = new QueryWrapper<>(); // wrapper.lambda() // .eq(RailwayEntrust::getEntrustCode,code); // List railwayEntrusts = railwayEntrustService.list(wrapper); // if(railwayEntrusts !=null && railwayEntrusts.size()>0){ // RailwayEntrust railwayEntrust = railwayEntrusts.get(0); // System.out.println(railwayEntrust.getEntrustCode()+"开始推送bip蓝票"); // try { // pushBip(railwayEntrust.getId(),railwayEntrust.getInvoicUrl()); // System.out.println(railwayEntrust.getEntrustCode()+"推送bip蓝票成功"); // result.setPushBip(1); // result.setPushBipyf(1); // invoiceResultService.updateById(result); // }catch (Exception e){ // e.printStackTrace(); // } // } // } return R.ok(objectMap); }else { return R.failed(message); } }else { return R.failed("未查询到开票记录"); } } /** * 去开红票 * @param saleCredit1 去开红票 * @return R */ @Operation(summary = "去开红票" , description = "去开红票" ) @SysLog("去开红票" ) @PostMapping("/toRedPiao") @PreAuthorize("@pms.hasPermission('business_saleCredit_add')" ) public R toRedPiao(@RequestBody SaleCredit saleCredit1){ if(saleCredit1.getId()==null){ return R.failed("销售挂账id不能为空!"); } SaleCredit saleCredit = saleCreditService.getById(saleCredit1.getId()); try { Map map = invoiceService.toRedTicket(saleCredit); Boolean success = (Boolean) map.get("success"); if(success){ return R.ok("红字开票成功"); }else { return R.failed((String) map.get("message")); } }catch (Exception e){ e.printStackTrace(); return R.failed("红字开票失败"); } } @Operation(summary = "红票查看" , description = "红票查看" ) @GetMapping("/downRedInvoice" ) public R downRedInvoice(String code) { QueryWrapper invoiceResultQueryWrapper = new QueryWrapper<>(); invoiceResultQueryWrapper.lambda() .eq(InvoiceResult::getEntrustCode,code) .eq(InvoiceResult::getMethodName,"红字确认单确认接口") .eq(InvoiceResult::getSuccess,1) .orderByDesc(InvoiceResult::getCreateTime); List list = invoiceService.list(invoiceResultQueryWrapper); if(list !=null && list.size()>0){ Map objectMap = null; Boolean success = null; String message = null; InvoiceResult result = list.get(0); if(result.getConfirmBillingMark().equals("Y")){ objectMap = invoiceService.downInvoiceMethod(result); success = (Boolean) objectMap.get("success"); message = (String) objectMap.get("message"); }else { QueryWrapper invoiceResultQueryWrapper1 = new QueryWrapper<>(); invoiceResultQueryWrapper1.lambda() .eq(InvoiceResult::getEntrustCode,code) .eq(InvoiceResult::getMethodName,"红字开票接口") .eq(InvoiceResult::getSuccess,1) .orderByDesc(InvoiceResult::getCreateTime); List list1 = invoiceService.list(invoiceResultQueryWrapper1); InvoiceResult result1 = list1.get(0); objectMap = invoiceService.downInvoiceMethod(result1); success = (Boolean) objectMap.get("success"); message = (String) objectMap.get("message"); } if(success){ return R.ok(objectMap); }else { return R.failed(message); } }else { return R.failed("未查询到开票记录"); } } /* @Operation(summary = "红冲确认单" , description = "红冲确认单" ) @PostMapping("/redConfirm" ) public R redConfirm(@RequestBody InvoicingVo vo) { SaleCredit saleCredit = saleCreditService.getOne(new LambdaQueryWrapper() .eq(SaleCredit::getEntrustCode,vo.getEntrustCode()) .last("limit 1") ); if(saleCredit==null){ return R.failed("未找到对应结算单"); } try { Map objectMap = invoiceService.toRedTicket(saleCredit); Boolean success = (Boolean) objectMap.get("success"); String message = (String) objectMap.get("message"); if(success){ return R.ok(null,message); }else { return R.failed(null,message); } }catch (Exception e){ e.printStackTrace(); return R.failed("开红票失败"); } }*/ //发红冲之前,先进行红票确认。 @Operation(summary = "红冲发票form" , description = "红冲发票form" ) @GetMapping("/issueRed" ) public R issueRed(@RequestBody SaleCredit saleCredit1) { SaleCredit saleCredit = saleCreditService.getById(saleCredit1.getId()); InvoiceResult blueResult = null; InvoiceResult redResult = null; if(saleCredit.getBlueInvoiceResultId()==null){ return R.failed("请先开具蓝字发票"); } blueResult = invoiceService.getById(saleCredit.getRedInvoiceResultId()); InvoicingVo invoicingVo = new InvoicingVo(); QueryWrapper itemQueryWrapper = new QueryWrapper<>(); itemQueryWrapper.lambda() .eq(InvoiceResultItem::getResultId,blueResult.getId()); List resultItems = invoiceResultItemService.list(itemQueryWrapper); if(saleCredit!=null) { invoicingVo.setTaxNo(saleCredit.getCreditCodeB()); invoicingVo.setLedgerName(saleCredit.getPartyB()); invoicingVo.setOrgCode(saleCredit.getCreditCodeB()); invoicingVo.setFormatGenerate(false); invoicingVo.setIsSplit(false); invoicingVo.setFormatPushType(false); invoicingVo.setTaxUserName(saleCredit.getContactPhoneB()); invoicingVo.setEntrustCode(saleCredit.getEntrustCode()); InvoicingVo.InvoicingVoInfo invoicingVoInfo = new InvoicingVo.InvoicingVoInfo(); invoicingVoInfo.setInvoiceTypeCode("01"); invoicingVoInfo.setInvoiceType("1"); invoicingVoInfo.setSerialNo("MX_REDPP_" + System.currentTimeMillis()); // invoicingVoInfo.setRedInfoNo(redResult.getInvoiceNo()); // invoicingVoInfo.setRedIssueReason("1"); // invoicingVoInfo.setRedConfirmUuid(redResult.getRedConfirmUuid()); invoicingVoInfo.setDrawer(saleCredit.getContactPhoneB()); /*Map ext1 = new HashMap<>(); ContractOrder order = contractOrderService.getOrderByNum(railwayEntrust.getOrderNumber()); if(order!=null){ ext1.put("htbh",order.getContractNum()); invoicingVoInfo.setExt(ext1); }*/ invoicingVoInfo.setSystemName("**销售管理信息系统"); List details = new ArrayList<>(); for (int i = 0; i < resultItems.size(); i++) { InvoiceResultItem resultItem = resultItems.get(i); Map ext = new HashMap<>(); ext.put("coalType",resultItem.getCoalType()); InvoicingVo.InvoiceDetail invoiceDetail = new InvoicingVo.InvoiceDetail(); invoiceDetail.setGoodsLineNo(resultItem.getGoodsLineNo()); invoiceDetail.setOriginalInvoiceDetailNo(resultItem.getGoodsLineNo()+""); invoiceDetail.setGoodsTaxRate(resultItem.getGoodsTaxRate()); invoiceDetail.setGoodsUnit(resultItem.getGoodsUnit()); invoiceDetail.setGoodsName(resultItem.getCoalName()); invoiceDetail.setGoodsType(resultItem.getGoodsType()); invoiceDetail.setGoodsCode(resultItem.getGoodsCode()); invoiceDetail.setGoodsSpecification(resultItem.getGoodsSpecification()); invoiceDetail.setExt(ext); invoiceDetail.setGoodsQuantity(new BigDecimal(resultItem.getGoodsQuantity()*-1).setScale(3,BigDecimal.ROUND_HALF_UP)); invoiceDetail.setGoodsPrice(new BigDecimal(resultItem.getGoodsPrice()).setScale(8,BigDecimal.ROUND_HALF_UP)); invoiceDetail.setGoodsTotalPrice(new BigDecimal(resultItem.getGoodsTotalPrice()*-1).setScale(2,BigDecimal.ROUND_HALF_UP)); invoiceDetail.setGoodsTotalTax(new BigDecimal(resultItem.getGoodsTotalTax()*-1).setScale(2,BigDecimal.ROUND_HALF_UP)); details.add(invoiceDetail); } invoicingVoInfo.setBuyerTaxNo(saleCredit.getCreditCodeA()); invoicingVoInfo.setBuyerName(saleCredit.getPartyA()); invoicingVoInfo.setInvoiceTotalPrice(new BigDecimal(blueResult.getInvoiceTotalPrice()*-1).setScale(2,BigDecimal.ROUND_HALF_UP)); invoicingVoInfo.setInvoiceTotalTax(new BigDecimal(blueResult.getInvoiceTotalTax()*-1).setScale(2,BigDecimal.ROUND_HALF_UP)); invoicingVoInfo.setInvoiceTotalPriceTax(new BigDecimal(blueResult.getInvoiceTotalPriceTax()*-1).setScale(2,BigDecimal.ROUND_HALF_UP)); invoicingVoInfo.setBuyerBankName(saleCredit.getBankNameA()); invoicingVoInfo.setBuyerBankNumber(saleCredit.getBankAccountA()); //invoicingVoInfo.setBuyerAddress(invoiceCustomer.getBuyerAddress()); invoicingVoInfo.setBuyerTelphone(saleCredit.getContactPhoneA()); invoicingVoInfo.setInvoiceDetailsList(details); invoicingVo.setData(invoicingVoInfo); Gson gson =new Gson(); String vostr = gson.toJson(invoicingVo); System.out.println(vostr); return R.ok(invoicingVo); }else { return R.failed("暂未查询到销方开票信息"); } } }