package com.ydtech.modules.inv.service.impl; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ydtech.constants.enums.inv.InvoiceTypeEnum; import com.ydtech.core.page.HttpResult; import com.ydtech.exception.SystemException; import com.ydtech.modules.inv.dao.InvAccountIncoiceMapper; import com.ydtech.modules.inv.model.*; import com.ydtech.modules.inv.model.vo.InvAccountIncoiceQueryVo; import com.ydtech.modules.inv.service.*; import com.ydtech.modules.inv.utils.EasyExcelUtils; import com.ydtech.utils.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.util.ObjectUtils; import java.io.File; import java.math.BigDecimal; import java.math.RoundingMode; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.Date; import java.util.List; import static com.ydtech.modules.inv.utils.TransferUtils.*; /** * 发票管理表(InvAccountIncoice)表服务实现类 * * @author makejava * @since 2024-01-18 16:01:31 */ @Service("invAccountIncoiceService") public class InvAccountIncoiceServiceImpl extends ServiceImpl implements InvAccountIncoiceService { @Autowired private InvAccountIncoiceMapper invAccountIncoiceMapper; @Autowired private InvAccountCardService invAccountCardService; @Autowired private InvAccountOperateService invAccountOperateService; @Autowired private InvAccountService invAccountService; @Autowired private InvAccountOpService invAccountOpService; @Value("${upload.file.path}") String uploadFilePath; @Override public HttpResult insertInvAccountIncoice(InvAccountIncoice invAccountIncoice) { if (invAccountIncoice.getRevBankCardNum().equals(invAccountIncoice.getOutBankCardNum())) { throw new SystemException("无法给本公司开票"); } BigDecimal tax = getBigDecimal(invAccountIncoice); //不含税金额 BigDecimal noHasTax = new BigDecimal(invAccountIncoice.getInvoiceMoney()).subtract(tax); invAccountIncoice.setNotPayoutMoney(invAccountIncoice.getInvoiceMoney()); //税额 invAccountIncoice.setTax(noHasTax.toString()); //不含税金额 invAccountIncoice.setNoHasTax(tax.toString()); return HttpResult.ok(invAccountIncoiceMapper.insert(invAccountIncoice)); } /** * 新增收入 * * @param invAccountIncoice * @return */ @Override public HttpResult updateInvAccountIncoice(InvAccountIncoice invAccountIncoice) { InvAccountIncoice invAccountIncoice1 = invAccountIncoiceMapper.selectById(invAccountIncoice.getInvoiceId()); //支出卡号 String outBankCardNum = invAccountIncoice1.getOutBankCardNum(); //进账卡号 String entBankCardNum = invAccountIncoice1.getRevBankCardNum(); //收入卡 InvAccountCard entCard = invAccountCardService.getById(invAccountIncoice1.getRevBankCardNum()); //支出卡 InvAccountCard outCard = invAccountCardService.getById(invAccountIncoice1.getOutBankCardNum()); //收入账户 InvAccount revInvAccount = invAccountService.getById(entCard.getAccountId()); //支出账户 InvAccount outInvAccount = invAccountService.getById(outCard.getAccountId()); //收入金额 String payoutMoney = invAccountIncoice.getPayoutMoney(); //支出归属 JSONObject outProfit = invAccountIncoice.getOutProfit(); //收入归属 JSONObject entProfit = invAccountIncoice.getEntProfit(); if (new BigDecimal(invAccountIncoice1.getInvoiceMoney()).subtract(new BigDecimal(invAccountIncoice1.getPayoutMoney()).add(new BigDecimal(payoutMoney))).compareTo(new BigDecimal("0")) < 0) { throw new SystemException("进账金额大于开票金额"); } //进账金额 invAccountIncoice1.setPayoutMoney(new BigDecimal(invAccountIncoice1.getPayoutMoney()).add(new BigDecimal(payoutMoney)).toString()); invAccountIncoice1.setNotPayoutMoney(new BigDecimal(invAccountIncoice1.getInvoiceMoney()).subtract(new BigDecimal(invAccountIncoice1.getPayoutMoney())).toString()); invAccountIncoice1.setPayoutTime(invAccountIncoice.getPayoutTime()); if (invAccountIncoice1.getNotPayoutMoney().equals("0")) { invAccountIncoice1.setClearFlag("1"); } //资金流出 String fundFlow = invAccountIncoice1.getOtherUnit() + "→" + invAccountIncoice1.getInvoiceBy(); Date date = new Date(); //收入操作记录 InvAccountOperate invAccountOperate = new InvAccountOperate(); invAccountOperate.setEnterCardId(entBankCardNum); invAccountOperate.setApplyAmount(payoutMoney); invAccountOperate.setRevenueOutlay("0"); invAccountOperate.setFundFlow(fundFlow); invAccountOperate.setPayMethod(invAccountIncoice.getPayMethod()); invAccountOperate.setCompany(invAccountIncoice1.getOtherUnit()); invAccountOperate.setFundUse(invAccountIncoice.getFundUse()); invAccountOperate.setFundFen(invAccountIncoice.getFundFen()); invAccountOperate.setInvoiceId(invAccountIncoice1.getInvoiceId()); invAccountOperate.setCreateTime(LocalDateTime.now()); invAccountOperate.setEntProfit(entProfit); invAccountOperate.setDel(String.valueOf(date.getTime())); invAccountOperate.setOutCardNum(outCard.getBankCardNum()); invAccountOperate.setEnterCardNum(entCard.getBankCardNum()); //支出操作记录 InvAccountOperate outInvAccountOperate = new InvAccountOperate(); outInvAccountOperate.setOutCardNum(outBankCardNum); outInvAccountOperate.setApplyAmount(payoutMoney); outInvAccountOperate.setRevenueOutlay("1"); outInvAccountOperate.setFundFlow(fundFlow); outInvAccountOperate.setPayMethod(invAccountIncoice.getPayMethod()); outInvAccountOperate.setCompany(invAccountIncoice1.getOtherUnit()); outInvAccountOperate.setFundUse(invAccountIncoice.getFundUse()); outInvAccountOperate.setFundFen(invAccountIncoice.getFundFen()); outInvAccountOperate.setInvoiceId(invAccountIncoice1.getInvoiceId()); outInvAccountOperate.setCreateTime(LocalDateTime.now()); outInvAccountOperate.setOutProfit(outProfit); outInvAccountOperate.setDel(String.valueOf(date.getTime())); outInvAccountOperate.setOutCardNum(outCard.getBankCardNum()); outInvAccountOperate.setEnterCardNum(entCard.getBankCardNum()); //放入操作记录list中 List invAccountOperateList = new ArrayList<>(); invAccountOperateList.add(outInvAccountOperate); invAccountOperateList.add(invAccountOperate); //判断收款方是内部还是外部 if (outInvAccount.getOuterFlag().equals("0")) { if (revInvAccount.getOuterFlag().equals("0")) { InvAccountExcel invAccountExcel = new InvAccountExcel(); invAccountExcel.setApplyAmount(payoutMoney); List invAccountCards = insideTransfer(outCard, outInvAccount, entCard, revInvAccount, payoutMoney); invAccountCardService.updateBatchById(invAccountCards); invAccountOperateService.saveBatch(invAccountOperateList); //归属列表 List list = new ArrayList<>(); List list1 = invAccountEntOpList(entProfit, revInvAccount, entCard, payoutMoney,invAccountOperateList.get(0).getAccountOperateId()); List list2 = invAccountOutOpList(outProfit, outInvAccount, outCard, payoutMoney,invAccountOperateList.get(0).getAccountOperateId()); //将发票id放入 防止撤销发票时对应归属没删掉 list1.forEach(invAccountOp -> { invAccountOp.setInvoiceId(invAccountIncoice1.getInvoiceId()); }); list2.forEach(invAccountOp -> { invAccountOp.setInvoiceId(invAccountIncoice1.getInvoiceId()); }); list.addAll(list1); list.addAll(list2); invAccountOpService.saveBatch(list); } else { InvAccountExcel invAccountExcel = new InvAccountExcel(); invAccountExcel.setOutAccountQuality(revInvAccount.getOuterFlag()); invAccountExcel.setApplyAmount(payoutMoney); List invAccountCards = enterDeTransfer(outCard, outInvAccount, entCard, revInvAccount, payoutMoney); invAccountCardService.updateBatchById(invAccountCards); invAccountOperateService.saveBatch(invAccountOperateList); //归属列表 List list = new ArrayList<>(); List list1 = invAccountEntOpList(entProfit, revInvAccount, entCard, payoutMoney,invAccountOperateList.get(0).getAccountOperateId()); List list2 = invAccountOutOpList(outProfit, outInvAccount, outCard, payoutMoney,invAccountOperateList.get(0).getAccountOperateId()); //将发票id放入 防止撤销发票时对应归属没删掉 list1.forEach(invAccountOp -> { invAccountOp.setInvoiceId(invAccountIncoice1.getInvoiceId()); }); list2.forEach(invAccountOp -> { invAccountOp.setInvoiceId(invAccountIncoice1.getInvoiceId()); }); list.addAll(list1); list.addAll(list2); invAccountOpService.saveBatch(list); } } else { //转账给外部重新设置操作 InvAccountOperate invAccountOperate1 = new InvAccountOperate(); invAccountOperate1.setOutCardId(invAccountIncoice1.getOutBankCardNum()); invAccountOperate1.setEnterCardId(invAccountIncoice1.getRevBankCardNum()); invAccountOperate1.setApplyAmount(payoutMoney); invAccountOperate1.setRevenueOutlay("0"); invAccountOperate1.setFundFlow(fundFlow); invAccountOperate1.setPayMethod(invAccountIncoice.getPayMethod()); invAccountOperate1.setCompany(invAccountIncoice1.getOtherUnit()); invAccountOperate1.setFundUse(invAccountIncoice.getFundUse()); invAccountOperate1.setFundFen(invAccountIncoice.getFundFen()); invAccountOperate1.setInvoiceId(invAccountIncoice1.getInvoiceId()); invAccountOperate1.setOutProfit(outProfit); invAccountOperate1.setEntProfit(entProfit); outInvAccountOperate.setEnterCardNum(entCard.getBankCardNum()); invAccountOperateService.insert(invAccountOperate1); } return HttpResult.ok(invAccountIncoiceMapper.updateById(invAccountIncoice1)); } public static BigDecimal getBigDecimal(InvAccountIncoice invAccountIncoice) { if (invAccountIncoice.getRate().isEmpty()) { throw new SystemException("请填写税率"); } if (invAccountIncoice.getInvoiceMoney().isEmpty()) { throw new SystemException("请填写开票金额"); } if (invAccountIncoice.getPayoutMoney().isEmpty()) { throw new SystemException("请填写进账金额"); } //税率百分数转为小数 BigDecimal divide = new BigDecimal(invAccountIncoice.getRate()).divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP); //税额 return new BigDecimal(invAccountIncoice.getInvoiceMoney()).divide((divide.add(new BigDecimal("1"))), 2, RoundingMode.HALF_UP); } @Override public HttpResult delInvAccountIncoice(InvAccountIncoice invAccountIncoice) { //发票信息 InvAccountIncoice enInvAccountIncoice = invAccountIncoiceMapper.selectById(invAccountIncoice.getInvoiceId()); //回滚收入 InvAccountCard enterAccount = invAccountCardService.getById(enInvAccountIncoice.getRevBankCardNum()); InvAccountCard outAccount = invAccountCardService.getById(enInvAccountIncoice.getOutBankCardNum()); //新增收入回滚操作 List invAccount = quashOutsideTransfer(outAccount, enterAccount, new BigDecimal(enInvAccountIncoice.getInvoiceMoney())); InvAccountOperate invAccountOperate = new InvAccountOperate(); invAccountOperate.setRevenueOutlay("1"); invAccountOperate.setApplyAmount("发票撤销 收入撤销"); invAccountOperate.setCompany(enInvAccountIncoice.getInvoiceBy()); LambdaQueryWrapper lambdaQuery = new LambdaQueryWrapper<>(); lambdaQuery.eq(InvAccountOperate::getInvoiceId, invAccountIncoice.getInvoiceId()); LambdaQueryWrapper lambdaQuery1 = new LambdaQueryWrapper<>(); lambdaQuery1.eq(InvAccountOperate::getInvoiceId, invAccountIncoice.getInvoiceId()); LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); lambdaQueryWrapper.eq(InvAccountOp::getInvoiceId, invAccountIncoice.getInvoiceId()); try { invAccountIncoiceMapper.updateById(invAccountIncoice); invAccountCardService.updateBatchById(invAccount); invAccountOperateService.remove(lambdaQuery); invAccountOperateService.remove(lambdaQuery1); invAccountOpService.remove(lambdaQueryWrapper); } catch (Exception e) { return HttpResult.error("撤销失败"); } return HttpResult.ok("撤销成功"); } @Override public String excel(InvAccountIncoiceQueryVo invAccountIncoiceQueryVo) { LambdaQueryWrapper lambdaQuery = new LambdaQueryWrapper<>(); lambdaQuery .like(!StringUtils.isEmpty(invAccountIncoiceQueryVo.getBiller()), InvAccountIncoice::getBiller, invAccountIncoiceQueryVo.getBiller()) .like(!StringUtils.isEmpty(invAccountIncoiceQueryVo.getInvoiceBy()), InvAccountIncoice::getInvoiceBy, invAccountIncoiceQueryVo.getInvoiceBy()) .eq(InvAccountIncoice::getDelFlag, "0") .eq(!StringUtils.isEmpty(invAccountIncoiceQueryVo.getInvoiceType()), InvAccountIncoice::getInvoiceType, invAccountIncoiceQueryVo.getInvoiceType()) .like(!StringUtils.isEmpty(invAccountIncoiceQueryVo.getOtherUnit()), InvAccountIncoice::getOtherUnit, invAccountIncoiceQueryVo.getOtherUnit()); if (!ObjectUtils.isEmpty(invAccountIncoiceQueryVo.getInvoiceTime())) { lambdaQuery.eq(InvAccountIncoice::getInvoiceTime, invAccountIncoiceQueryVo.getInvoiceTime().toString()); } List invAccountIncoices = invAccountIncoiceMapper.selectList(lambdaQuery); //解决时间格式报错问题 invAccountIncoices.forEach(invAccountIncoice -> { if (invAccountIncoice.getPayoutTime() != null) { invAccountIncoice.setPayoutDate(invAccountIncoice.getPayoutTime().toString()); } if (invAccountIncoice.getInvoiceTime() != null) { invAccountIncoice.setInvoiceDate(invAccountIncoice.getInvoiceTime().toString()); } if (invAccountIncoice.getInvoiceType() != null) { invAccountIncoice.setInvoiceType(InvoiceTypeEnum.getNameByCode(invAccountIncoice.getInvoiceType())); } if (invAccountIncoice.getRate() != null) { invAccountIncoice.setRate(invAccountIncoice.getRate() + "%"); } }); File folder = new File(uploadFilePath); if (folder.exists()) { return EasyExcelUtils.downExcel(uploadFilePath, InvAccountIncoice.class, invAccountIncoices); } else { if (folder.mkdirs()) { return EasyExcelUtils.downExcel(uploadFilePath, InvAccountIncoice.class, invAccountIncoices); } else { throw new SystemException("文件导出失败"); } } } }