InvAccountIncoiceServiceImpl.java 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323
  1. package com.ydtech.modules.inv.service.impl;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  4. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  5. import com.google.gson.JsonElement;
  6. import com.google.gson.JsonObject;
  7. import com.ydtech.constants.enums.inv.InvoiceTypeEnum;
  8. import com.ydtech.core.page.HttpResult;
  9. import com.ydtech.exception.SystemException;
  10. import com.ydtech.modules.inv.dao.InvAccountIncoiceMapper;
  11. import com.ydtech.modules.inv.model.*;
  12. import com.ydtech.modules.inv.model.vo.InvAccountIncoiceQueryVo;
  13. import com.ydtech.modules.inv.service.*;
  14. import com.ydtech.modules.inv.utils.EasyExcelUtils;
  15. import com.ydtech.modules.inv.utils.TransferUtils;
  16. import com.ydtech.utils.StringUtils;
  17. import org.springframework.beans.factory.annotation.Autowired;
  18. import org.springframework.beans.factory.annotation.Value;
  19. import org.springframework.stereotype.Service;
  20. import org.springframework.util.ObjectUtils;
  21. import java.io.File;
  22. import java.math.BigDecimal;
  23. import java.math.RoundingMode;
  24. import java.time.LocalDateTime;
  25. import java.util.ArrayList;
  26. import java.util.List;
  27. import java.util.Map;
  28. import static com.ydtech.modules.inv.utils.TransferUtils.*;
  29. /**
  30. * 发票管理表(InvAccountIncoice)表服务实现类
  31. *
  32. * @author makejava
  33. * @since 2024-01-18 16:01:31
  34. */
  35. @Service("invAccountIncoiceService")
  36. public class InvAccountIncoiceServiceImpl extends ServiceImpl<InvAccountIncoiceMapper, InvAccountIncoice> implements InvAccountIncoiceService {
  37. @Autowired
  38. private InvAccountIncoiceMapper invAccountIncoiceMapper;
  39. @Autowired
  40. private InvAccountCardService invAccountCardService;
  41. @Autowired
  42. private InvAccountOperateService invAccountOperateService;
  43. @Autowired
  44. private InvAccountService invAccountService;
  45. @Autowired
  46. private InvAccountOpService invAccountOpService;
  47. @Value("${upload.file.path}")
  48. String uploadFilePath;
  49. @Override
  50. public HttpResult insertInvAccountIncoice(InvAccountIncoice invAccountIncoice) {
  51. if (invAccountIncoice.getRevBankCardNum().equals(invAccountIncoice.getOutBankCardNum())) {
  52. throw new SystemException("无法给本公司开票");
  53. }
  54. BigDecimal tax = getBigDecimal(invAccountIncoice);
  55. //不含税金额
  56. BigDecimal noHasTax = new BigDecimal(invAccountIncoice.getInvoiceMoney()).subtract(tax);
  57. invAccountIncoice.setNotPayoutMoney(invAccountIncoice.getInvoiceMoney());
  58. //税额
  59. invAccountIncoice.setTax(noHasTax.toString());
  60. //不含税金额
  61. invAccountIncoice.setNoHasTax(tax.toString());
  62. return HttpResult.ok(invAccountIncoiceMapper.insert(invAccountIncoice));
  63. }
  64. /**
  65. * 新增收入
  66. *
  67. * @param invAccountIncoice
  68. * @return
  69. */
  70. @Override
  71. public HttpResult updateInvAccountIncoice(InvAccountIncoice invAccountIncoice) {
  72. InvAccountIncoice invAccountIncoice1 = invAccountIncoiceMapper.selectById(invAccountIncoice.getInvoiceId());
  73. //支出卡号
  74. String outBankCardNum = invAccountIncoice1.getOutBankCardNum();
  75. //进账卡号
  76. String entBankCardNum = invAccountIncoice1.getRevBankCardNum();
  77. //收入卡
  78. InvAccountCard entCard = invAccountCardService.getById(invAccountIncoice1.getRevBankCardNum());
  79. //支出卡
  80. InvAccountCard outCard = invAccountCardService.getById(invAccountIncoice1.getOutBankCardNum());
  81. //收入账户
  82. InvAccount revInvAccount = invAccountService.getById(entCard.getAccountId());
  83. //支出账户
  84. InvAccount outInvAccount = invAccountService.getById(outCard.getAccountId());
  85. //收入金额
  86. String payoutMoney = invAccountIncoice.getPayoutMoney();
  87. //支出归属
  88. JSONObject outProfit = invAccountIncoice.getOutProfit();
  89. //收入归属
  90. JSONObject entProfit = invAccountIncoice.getEntProfit();
  91. if (new BigDecimal(invAccountIncoice1.getInvoiceMoney()).subtract(new BigDecimal(invAccountIncoice1.getPayoutMoney()).add(new BigDecimal(payoutMoney))).compareTo(new BigDecimal("0")) < 0) {
  92. throw new SystemException("进账金额大于开票金额");
  93. }
  94. //进账金额
  95. invAccountIncoice1.setPayoutMoney(new BigDecimal(invAccountIncoice1.getPayoutMoney()).add(new BigDecimal(payoutMoney)).toString());
  96. invAccountIncoice1.setNotPayoutMoney(new BigDecimal(invAccountIncoice1.getInvoiceMoney()).subtract(new BigDecimal(invAccountIncoice1.getPayoutMoney())).toString());
  97. invAccountIncoice1.setPayoutTime(invAccountIncoice.getPayoutTime());
  98. if (invAccountIncoice1.getNotPayoutMoney().equals("0")) {
  99. invAccountIncoice1.setClearFlag("1");
  100. }
  101. //资金流出
  102. String fundFlow = invAccountIncoice1.getOtherUnit() + "→" + invAccountIncoice1.getInvoiceBy();
  103. //收入操作记录
  104. InvAccountOperate invAccountOperate = new InvAccountOperate();
  105. invAccountOperate.setEnterCardId(entBankCardNum);
  106. invAccountOperate.setApplyAmount(payoutMoney);
  107. invAccountOperate.setRevenueOutlay("0");
  108. invAccountOperate.setFundFlow(fundFlow);
  109. invAccountOperate.setPayMethod(invAccountIncoice.getPayMethod());
  110. invAccountOperate.setCompany(invAccountIncoice1.getOtherUnit());
  111. invAccountOperate.setFundUse(invAccountIncoice.getFundUse());
  112. invAccountOperate.setFundFen(invAccountIncoice.getFundFen());
  113. invAccountOperate.setInvoiceId(invAccountIncoice1.getInvoiceId());
  114. invAccountOperate.setCreateTime(LocalDateTime.now());
  115. invAccountOperate.setEntProfit(entProfit);
  116. //支出操作记录
  117. InvAccountOperate outInvAccountOperate = new InvAccountOperate();
  118. outInvAccountOperate.setOutCardNum(outBankCardNum);
  119. outInvAccountOperate.setApplyAmount(payoutMoney);
  120. outInvAccountOperate.setRevenueOutlay("1");
  121. outInvAccountOperate.setFundFlow(fundFlow);
  122. outInvAccountOperate.setPayMethod(invAccountIncoice.getPayMethod());
  123. outInvAccountOperate.setCompany(invAccountIncoice1.getOtherUnit());
  124. outInvAccountOperate.setFundUse(invAccountIncoice.getFundUse());
  125. outInvAccountOperate.setFundFen(invAccountIncoice.getFundFen());
  126. outInvAccountOperate.setInvoiceId(invAccountIncoice1.getInvoiceId());
  127. outInvAccountOperate.setCreateTime(LocalDateTime.now());
  128. for (Map.Entry<String, Object> entry : outProfit.entrySet()) {
  129. outProfit.put(entry.getKey(), new BigDecimal(String.valueOf(entry.getValue())).negate().toString());
  130. }
  131. outInvAccountOperate.setOutProfit(outProfit);
  132. //归属列表
  133. List<InvAccountOp> list = new ArrayList<>();
  134. List<InvAccountOp> list1 = invAccountEntOpList(entProfit, revInvAccount, entCard, payoutMoney);
  135. List<InvAccountOp> list2 = invAccountOutOpList(outProfit, outInvAccount, outCard, payoutMoney);
  136. //将发票id放入 防止撤销发票时对应归属没删掉
  137. list1.forEach(invAccountOp -> {
  138. invAccountOp.setInvoiceId(invAccountIncoice1.getInvoiceId());
  139. });
  140. list2.forEach(invAccountOp -> {
  141. invAccountOp.setInvoiceId(invAccountIncoice1.getInvoiceId());
  142. });
  143. list.addAll(list1);
  144. list.addAll(list2);
  145. //放入操作记录list中
  146. List<InvAccountOperate> invAccountOperateList = new ArrayList<>();
  147. invAccountOperateList.add(outInvAccountOperate);
  148. invAccountOperateList.add(invAccountOperate);
  149. //判断收款方是内部还是外部
  150. if (outInvAccount.getOuterFlag().equals("0")) {
  151. if (revInvAccount.getOuterFlag().equals("0")) {
  152. InvAccountExcel invAccountExcel = new InvAccountExcel();
  153. invAccountExcel.setApplyAmount(payoutMoney);
  154. List<InvAccountCard> invAccountCards = insideTransfer(outCard, outInvAccount, entCard, revInvAccount, payoutMoney);
  155. invAccountCardService.updateBatchById(invAccountCards);
  156. invAccountOperateService.saveBatch(invAccountOperateList);
  157. invAccountOpService.saveBatch(list);
  158. } else {
  159. InvAccountExcel invAccountExcel = new InvAccountExcel();
  160. invAccountExcel.setOutAccountQuality(revInvAccount.getOuterFlag());
  161. invAccountExcel.setApplyAmount(payoutMoney);
  162. List<InvAccountCard> invAccountCards = enterDeTransfer(outCard, outInvAccount, entCard, revInvAccount, payoutMoney);
  163. invAccountCardService.updateBatchById(invAccountCards);
  164. invAccountOperateService.saveBatch(invAccountOperateList);
  165. invAccountOpService.saveBatch(list);
  166. }
  167. } else {
  168. //转账给外部重新设置操作
  169. InvAccountOperate invAccountOperate1 = new InvAccountOperate();
  170. invAccountOperate1.setOutCardNum(invAccountIncoice1.getOutBankCardNum());
  171. invAccountOperate1.setEnterCardId(invAccountIncoice1.getRevBankCardNum());
  172. invAccountOperate1.setApplyAmount(payoutMoney);
  173. invAccountOperate1.setRevenueOutlay("0");
  174. invAccountOperate1.setFundFlow(fundFlow);
  175. invAccountOperate1.setPayMethod(invAccountIncoice.getPayMethod());
  176. invAccountOperate1.setCompany(invAccountIncoice1.getOtherUnit());
  177. invAccountOperate1.setFundUse(invAccountIncoice.getFundUse());
  178. invAccountOperate1.setFundFen(invAccountIncoice.getFundFen());
  179. invAccountOperate1.setInvoiceId(invAccountIncoice1.getInvoiceId());
  180. invAccountOperateService.insert(invAccountOperate1);
  181. }
  182. return HttpResult.ok(invAccountIncoiceMapper.updateById(invAccountIncoice1));
  183. }
  184. public static BigDecimal getBigDecimal(InvAccountIncoice invAccountIncoice) {
  185. if (invAccountIncoice.getRate().isEmpty()) {
  186. throw new SystemException("请填写税率");
  187. }
  188. if (invAccountIncoice.getInvoiceMoney().isEmpty()) {
  189. throw new SystemException("请填写开票金额");
  190. }
  191. if (invAccountIncoice.getPayoutMoney().isEmpty()) {
  192. throw new SystemException("请填写进账金额");
  193. }
  194. //税率百分数转为小数
  195. BigDecimal divide = new BigDecimal(invAccountIncoice.getRate()).divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP);
  196. //税额
  197. return new BigDecimal(invAccountIncoice.getInvoiceMoney()).divide((divide.add(new BigDecimal("1"))), 2, RoundingMode.HALF_UP);
  198. }
  199. @Override
  200. public HttpResult delInvAccountIncoice(InvAccountIncoice invAccountIncoice) {
  201. //发票信息
  202. InvAccountIncoice enInvAccountIncoice = invAccountIncoiceMapper.selectById(invAccountIncoice.getInvoiceId());
  203. //回滚收入
  204. InvAccountCard enterAccount = invAccountCardService.getById(enInvAccountIncoice.getRevBankCardNum());
  205. InvAccountCard outAccount = invAccountCardService.getById(enInvAccountIncoice.getOutBankCardNum());
  206. //新增收入回滚操作
  207. List<InvAccountCard> invAccount = quashOutsideTransfer(outAccount, enterAccount, enInvAccountIncoice);
  208. InvAccountOperate invAccountOperate = new InvAccountOperate();
  209. invAccountOperate.setRevenueOutlay("1");
  210. invAccountOperate.setApplyAmount("发票撤销 收入撤销");
  211. invAccountOperate.setCompany(enInvAccountIncoice.getInvoiceBy());
  212. LambdaQueryWrapper<InvAccountOperate> lambdaQuery = new LambdaQueryWrapper<>();
  213. lambdaQuery.eq(InvAccountOperate::getInvoiceId, invAccountIncoice.getInvoiceId());
  214. LambdaQueryWrapper<InvAccountOperate> lambdaQuery1 = new LambdaQueryWrapper<>();
  215. lambdaQuery1.eq(InvAccountOperate::getInvoiceId, invAccountIncoice.getInvoiceId());
  216. LambdaQueryWrapper<InvAccountOp> lambdaQueryWrapper = new LambdaQueryWrapper<>();
  217. lambdaQueryWrapper.eq(InvAccountOp::getInvoiceId, invAccountIncoice.getInvoiceId());
  218. try {
  219. invAccountIncoiceMapper.updateById(invAccountIncoice);
  220. invAccountCardService.updateBatchById(invAccount);
  221. invAccountOperateService.remove(lambdaQuery);
  222. invAccountOperateService.remove(lambdaQuery1);
  223. invAccountOpService.remove(lambdaQueryWrapper);
  224. } catch (Exception e) {
  225. return HttpResult.error("撤销失败");
  226. }
  227. return HttpResult.ok("撤销成功");
  228. }
  229. @Override
  230. public String excel(InvAccountIncoiceQueryVo invAccountIncoiceQueryVo) {
  231. LambdaQueryWrapper<InvAccountIncoice> lambdaQuery = new LambdaQueryWrapper<>();
  232. lambdaQuery
  233. .like(!StringUtils.isEmpty(invAccountIncoiceQueryVo.getBiller()), InvAccountIncoice::getBiller, invAccountIncoiceQueryVo.getBiller())
  234. .like(!StringUtils.isEmpty(invAccountIncoiceQueryVo.getInvoiceBy()), InvAccountIncoice::getInvoiceBy,
  235. invAccountIncoiceQueryVo.getInvoiceBy())
  236. .eq(InvAccountIncoice::getDelFlag, "0")
  237. .eq(!StringUtils.isEmpty(invAccountIncoiceQueryVo.getInvoiceType()), InvAccountIncoice::getInvoiceType,
  238. invAccountIncoiceQueryVo.getInvoiceType())
  239. .like(!StringUtils.isEmpty(invAccountIncoiceQueryVo.getOtherUnit()), InvAccountIncoice::getOtherUnit, invAccountIncoiceQueryVo.getOtherUnit());
  240. if (!ObjectUtils.isEmpty(invAccountIncoiceQueryVo.getInvoiceTime())) {
  241. lambdaQuery.eq(InvAccountIncoice::getInvoiceTime, invAccountIncoiceQueryVo.getInvoiceTime().toString());
  242. }
  243. List<InvAccountIncoice> invAccountIncoices = invAccountIncoiceMapper.selectList(lambdaQuery);
  244. //解决时间格式报错问题
  245. invAccountIncoices.forEach(invAccountIncoice -> {
  246. if (invAccountIncoice.getPayoutTime() != null) {
  247. invAccountIncoice.setPayoutDate(invAccountIncoice.getPayoutTime().toString());
  248. }
  249. if (invAccountIncoice.getInvoiceTime() != null) {
  250. invAccountIncoice.setInvoiceDate(invAccountIncoice.getInvoiceTime().toString());
  251. }
  252. if (invAccountIncoice.getInvoiceType() != null) {
  253. invAccountIncoice.setInvoiceType(InvoiceTypeEnum.getNameByCode(invAccountIncoice.getInvoiceType()));
  254. }
  255. if (invAccountIncoice.getRate() != null) {
  256. invAccountIncoice.setRate(invAccountIncoice.getRate() + "%");
  257. }
  258. });
  259. File folder = new File(uploadFilePath);
  260. if (folder.exists()) {
  261. return EasyExcelUtils.downExcel(uploadFilePath, InvAccountIncoice.class, invAccountIncoices);
  262. } else {
  263. if (folder.mkdirs()) {
  264. return EasyExcelUtils.downExcel(uploadFilePath, InvAccountIncoice.class, invAccountIncoices);
  265. } else {
  266. throw new SystemException("文件导出失败");
  267. }
  268. }
  269. }
  270. }