InvAccountIncoiceServiceImpl.java 16 KB

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