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.google.gson.JsonElement; import com.google.gson.JsonObject; 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.util.ArrayList; import java.util.List; import java.util.Map; 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) { 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()); if (new BigDecimal(invAccountIncoice1.getInvoiceMoney()).subtract(new BigDecimal(invAccountIncoice1.getPayoutMoney()).add(new BigDecimal(invAccountIncoice.getPayoutMoney()))).compareTo(new BigDecimal("0")) < 0) { throw new SystemException("进账金额大于开票金额"); } //进账卡号 String bankCardNum = invAccountIncoice1.getRevBankCardNum(); //进账金额 String payoutMoney = new BigDecimal(invAccountIncoice.getPayoutMoney()).toString(); 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(); //修改发票增加卡的收入 InvAccountOperate invAccountOperate = new InvAccountOperate(); invAccountOperate.setEnterCardId(bankCardNum); 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()); //计算收入百分比 JSONObject entProfit = invAccountIncoice.getEntProfit(); JSONObject jsonObject = new JSONObject(); for (Map.Entry entry : entProfit.entrySet()) { BigDecimal multiply = new BigDecimal(String.valueOf(entry.getValue())).multiply(new BigDecimal(invAccountIncoice.getPayoutMoney())).divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP); jsonObject.put(entry.getKey(), multiply); } invAccountOperate.setOutProfit(jsonObject); invAccountOperate.setEnterCardId(invAccountIncoice.getRevBankCardNum()); InvAccount account = invAccountService.getById(invAccountIncoice1.getAccountId()); InvAccountCard entCard = invAccountCardService.getById(invAccountIncoice1.getRevBankCardNum()); InvAccountCard outCard = invAccountCardService.getById(invAccountIncoice1.getOutBankCardNum()); List list = new ArrayList<>(); for (Map.Entry entry : invAccountIncoice.getEntProfit().entrySet()) { if (Integer.parseInt(entry.getValue().toString()) != 0) { InvAccountOp invAccountOp = new InvAccountOp(); invAccountOp.setAccountId(invAccountIncoice1.getAccountId()); invAccountOp.setAccountName(account.getAccountName()); invAccountOp.setCardNum(entCard.getBankCardNum()); invAccountOp.setCardName(entCard.getBankName()); invAccountOp.setProfit(entry.getKey()); invAccountOp.setMoney(new BigDecimal(String.valueOf(entry.getValue())).multiply(new BigDecimal(invAccountIncoice.getPayoutMoney())).divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP).toString()); invAccountOp.setInvoiceId(invAccountIncoice1.getInvoiceId()); list.add(invAccountOp); } } //支出操作 InvAccountOperate outInvAccountOperate = new InvAccountOperate(); outInvAccountOperate.setEnterCardId(bankCardNum); 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()); //计算支出百分比 JSONObject outProfit = invAccountIncoice.getOutProfit(); JSONObject outJsonObject = new JSONObject(); for (Map.Entry entry : outProfit.entrySet()) { BigDecimal multiply = new BigDecimal(String.valueOf(entry.getValue())).multiply(new BigDecimal(invAccountIncoice.getPayoutMoney())).divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP).negate(); outJsonObject.put(entry.getKey(), multiply.negate()); } outInvAccountOperate.setOutProfit(outJsonObject); invAccountOperate.setEnterCardId(invAccountIncoice.getOutBankCardNum()); List invAccountOperateList = new ArrayList<>(); invAccountOperateList.add(outInvAccountOperate); invAccountOperateList.add(invAccountOperate); for (Map.Entry entry : outInvAccountOperate.getOutProfit().entrySet()) { if (Integer.parseInt(entry.getValue().toString()) != 0) { InvAccountOp invAccountOp = new InvAccountOp(); invAccountOp.setAccountId(invAccountIncoice1.getAccountId()); invAccountOp.setAccountName(account.getAccountName()); invAccountOp.setCardNum(outCard.getBankCardNum()); invAccountOp.setCardName(outCard.getBankName()); invAccountOp.setProfit(entry.getKey()); invAccountOp.setMoney(new BigDecimal(String.valueOf(entry.getValue())).multiply(new BigDecimal(invAccountIncoice.getPayoutMoney())).divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP).negate().toString()); invAccountOp.setInvoiceId(invAccountIncoice1.getInvoiceId()); list.add(invAccountOp); } } //支出卡号 String outBankCardNum = invAccountIncoice1.getOutBankCardNum(); //支出账户 InvAccountCard outInvAccountCard = invAccountCardService.getById(outBankCardNum); //收入账户 InvAccountCard revInvAccountCard = invAccountCardService.getById(bankCardNum); if (outInvAccountCard == null || revInvAccountCard == null) { throw new SystemException("支出账户或收入账户为空"); } //判断收款方是内部还是外部 InvAccount revInvAccount = invAccountService.getById(revInvAccountCard.getAccountId()); InvAccount outInvAccount = invAccountService.getById(outInvAccountCard.getAccountId()); //转账 if (outInvAccount.getOuterFlag().equals("0")) { if (revInvAccount.getOuterFlag().equals("0")) { InvAccountExcel invAccountExcel = new InvAccountExcel(); invAccountExcel.setApplyAmount(invAccountIncoice.getPayoutMoney()); List invAccountCards = insideTransfer(outInvAccountCard, revInvAccountCard, invAccountExcel); invAccountCardService.updateBatchById(invAccountCards); invAccountOperateService.saveBatch(invAccountOperateList); invAccountOpService.saveBatch(list); } else { InvAccountExcel invAccountExcel = new InvAccountExcel(); invAccountExcel.setOutAccountQuality(revInvAccount.getOuterFlag()); invAccountExcel.setApplyAmount(invAccountIncoice.getPayoutMoney()); List invAccountCards = enterDeTransfer(outInvAccountCard, revInvAccountCard, invAccountExcel); invAccountCardService.updateBatchById(invAccountCards); invAccountOperateService.saveBatch(invAccountOperateList); invAccountOpService.saveBatch(list); } } else { InvAccountOperate invAccountOperate1 = new InvAccountOperate(); invAccountOperate1.setOutCardNum(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()); 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, enInvAccountIncoice); 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("文件导出失败"); } } } }