InvAccountIncoiceServiceImpl.java 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338
  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.utils.StringUtils;
  16. import org.springframework.beans.factory.annotation.Autowired;
  17. import org.springframework.beans.factory.annotation.Value;
  18. import org.springframework.stereotype.Service;
  19. import org.springframework.util.ObjectUtils;
  20. import java.io.File;
  21. import java.math.BigDecimal;
  22. import java.math.RoundingMode;
  23. import java.util.ArrayList;
  24. import java.util.List;
  25. import java.util.Map;
  26. import static com.ydtech.modules.inv.utils.TransferUtils.*;
  27. /**
  28. * 发票管理表(InvAccountIncoice)表服务实现类
  29. *
  30. * @author makejava
  31. * @since 2024-01-18 16:01:31
  32. */
  33. @Service("invAccountIncoiceService")
  34. public class InvAccountIncoiceServiceImpl extends ServiceImpl<InvAccountIncoiceMapper, InvAccountIncoice> implements InvAccountIncoiceService {
  35. @Autowired
  36. private InvAccountIncoiceMapper invAccountIncoiceMapper;
  37. @Autowired
  38. private InvAccountCardService invAccountCardService;
  39. @Autowired
  40. private InvAccountOperateService invAccountOperateService;
  41. @Autowired
  42. private InvAccountService invAccountService;
  43. @Autowired
  44. private InvAccountOpService invAccountOpService;
  45. @Value("${upload.file.path}")
  46. String uploadFilePath;
  47. @Override
  48. public HttpResult insertInvAccountIncoice(InvAccountIncoice invAccountIncoice) {
  49. BigDecimal tax = getBigDecimal(invAccountIncoice);
  50. //不含税金额
  51. BigDecimal noHasTax = new BigDecimal(invAccountIncoice.getInvoiceMoney()).subtract(tax);
  52. invAccountIncoice.setNotPayoutMoney(invAccountIncoice.getInvoiceMoney());
  53. //税额
  54. invAccountIncoice.setTax(noHasTax.toString());
  55. //不含税金额
  56. invAccountIncoice.setNoHasTax(tax.toString());
  57. return HttpResult.ok(invAccountIncoiceMapper.insert(invAccountIncoice));
  58. }
  59. /**
  60. * 新增收入
  61. *
  62. * @param invAccountIncoice
  63. * @return
  64. */
  65. @Override
  66. public HttpResult updateInvAccountIncoice(InvAccountIncoice invAccountIncoice) {
  67. InvAccountIncoice invAccountIncoice1 = invAccountIncoiceMapper.selectById(invAccountIncoice.getInvoiceId());
  68. if (new BigDecimal(invAccountIncoice1.getInvoiceMoney()).subtract(new BigDecimal(invAccountIncoice1.getPayoutMoney()).add(new BigDecimal(invAccountIncoice.getPayoutMoney()))).compareTo(new BigDecimal("0")) < 0) {
  69. throw new SystemException("进账金额大于开票金额");
  70. }
  71. //进账卡号
  72. String bankCardNum = invAccountIncoice1.getRevBankCardNum();
  73. //进账金额
  74. String payoutMoney = new BigDecimal(invAccountIncoice.getPayoutMoney()).toString();
  75. invAccountIncoice1.setPayoutMoney(new BigDecimal(invAccountIncoice1.getPayoutMoney()).add(new BigDecimal(payoutMoney)).toString());
  76. invAccountIncoice1.setNotPayoutMoney(new BigDecimal(invAccountIncoice1.getInvoiceMoney()).subtract(new BigDecimal(invAccountIncoice1.getPayoutMoney())).toString());
  77. invAccountIncoice1.setPayoutTime(invAccountIncoice.getPayoutTime());
  78. if (invAccountIncoice1.getNotPayoutMoney().equals("0")) {
  79. invAccountIncoice1.setClearFlag("1");
  80. }
  81. String fundFlow = invAccountIncoice1.getOtherUnit() + "→" + invAccountIncoice1.getInvoiceBy();
  82. //修改发票增加卡的收入
  83. InvAccountOperate invAccountOperate = new InvAccountOperate();
  84. invAccountOperate.setEnterCardId(bankCardNum);
  85. invAccountOperate.setApplyAmount(payoutMoney);
  86. invAccountOperate.setRevenueOutlay("0");
  87. invAccountOperate.setFundFlow(fundFlow);
  88. invAccountOperate.setPayMethod(invAccountIncoice.getPayMethod());
  89. invAccountOperate.setCompany(invAccountIncoice1.getOtherUnit());
  90. invAccountOperate.setFundUse(invAccountIncoice.getFundUse());
  91. invAccountOperate.setFundFen(invAccountIncoice.getFundFen());
  92. invAccountOperate.setInvoiceId(invAccountIncoice1.getInvoiceId());
  93. //计算收入百分比
  94. JSONObject entProfit = invAccountIncoice.getEntProfit();
  95. JSONObject jsonObject = new JSONObject();
  96. for (Map.Entry<String, Object> entry : entProfit.entrySet()) {
  97. BigDecimal multiply = new BigDecimal(String.valueOf(entry.getValue())).multiply(new BigDecimal(invAccountIncoice.getPayoutMoney())).divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP);
  98. jsonObject.put(entry.getKey(), multiply);
  99. }
  100. invAccountOperate.setOutProfit(jsonObject);
  101. invAccountOperate.setEnterCardId(invAccountIncoice.getRevBankCardNum());
  102. InvAccount account = invAccountService.getById(invAccountIncoice1.getAccountId());
  103. InvAccountCard entCard = invAccountCardService.getById(invAccountIncoice1.getRevBankCardNum());
  104. InvAccountCard outCard = invAccountCardService.getById(invAccountIncoice1.getOutBankCardNum());
  105. List<InvAccountOp> list = new ArrayList<>();
  106. for (Map.Entry<String, Object> entry : invAccountIncoice.getEntProfit().entrySet()) {
  107. if (Integer.parseInt(entry.getValue().toString()) != 0) {
  108. InvAccountOp invAccountOp = new InvAccountOp();
  109. invAccountOp.setAccountId(invAccountIncoice1.getAccountId());
  110. invAccountOp.setAccountName(account.getAccountName());
  111. invAccountOp.setCardNum(entCard.getBankCardNum());
  112. invAccountOp.setCardName(entCard.getBankName());
  113. invAccountOp.setProfit(entry.getKey());
  114. invAccountOp.setMoney(new BigDecimal(String.valueOf(entry.getValue())).multiply(new BigDecimal(invAccountIncoice.getPayoutMoney())).divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP).toString());
  115. invAccountOp.setInvoiceId(invAccountIncoice1.getInvoiceId());
  116. list.add(invAccountOp);
  117. }
  118. }
  119. //支出操作
  120. InvAccountOperate outInvAccountOperate = new InvAccountOperate();
  121. outInvAccountOperate.setEnterCardId(bankCardNum);
  122. outInvAccountOperate.setApplyAmount(payoutMoney);
  123. outInvAccountOperate.setRevenueOutlay("1");
  124. outInvAccountOperate.setFundFlow(fundFlow);
  125. outInvAccountOperate.setPayMethod(invAccountIncoice.getPayMethod());
  126. outInvAccountOperate.setCompany(invAccountIncoice1.getOtherUnit());
  127. outInvAccountOperate.setFundUse(invAccountIncoice.getFundUse());
  128. outInvAccountOperate.setFundFen(invAccountIncoice.getFundFen());
  129. outInvAccountOperate.setInvoiceId(invAccountIncoice1.getInvoiceId());
  130. //计算支出百分比
  131. JSONObject outProfit = invAccountIncoice.getOutProfit();
  132. JSONObject outJsonObject = new JSONObject();
  133. for (Map.Entry<String, Object> entry : outProfit.entrySet()) {
  134. BigDecimal multiply = new BigDecimal(String.valueOf(entry.getValue())).multiply(new BigDecimal(invAccountIncoice.getPayoutMoney())).divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP).negate();
  135. outJsonObject.put(entry.getKey(), multiply.negate());
  136. }
  137. outInvAccountOperate.setOutProfit(outJsonObject);
  138. invAccountOperate.setEnterCardId(invAccountIncoice.getOutBankCardNum());
  139. List<InvAccountOperate> invAccountOperateList = new ArrayList<>();
  140. invAccountOperateList.add(outInvAccountOperate);
  141. invAccountOperateList.add(invAccountOperate);
  142. for (Map.Entry<String, Object> entry : outInvAccountOperate.getOutProfit().entrySet()) {
  143. if (Integer.parseInt(entry.getValue().toString()) != 0) {
  144. InvAccountOp invAccountOp = new InvAccountOp();
  145. invAccountOp.setAccountId(invAccountIncoice1.getAccountId());
  146. invAccountOp.setAccountName(account.getAccountName());
  147. invAccountOp.setCardNum(outCard.getBankCardNum());
  148. invAccountOp.setCardName(outCard.getBankName());
  149. invAccountOp.setProfit(entry.getKey());
  150. invAccountOp.setMoney(new BigDecimal(String.valueOf(entry.getValue())).multiply(new BigDecimal(invAccountIncoice.getPayoutMoney())).divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP).negate().toString());
  151. invAccountOp.setInvoiceId(invAccountIncoice1.getInvoiceId());
  152. list.add(invAccountOp);
  153. }
  154. }
  155. //支出卡号
  156. String outBankCardNum = invAccountIncoice1.getOutBankCardNum();
  157. //支出账户
  158. InvAccountCard outInvAccountCard = invAccountCardService.getById(outBankCardNum);
  159. //收入账户
  160. InvAccountCard revInvAccountCard = invAccountCardService.getById(bankCardNum);
  161. if (outInvAccountCard == null || revInvAccountCard == null) {
  162. throw new SystemException("支出账户或收入账户为空");
  163. }
  164. //判断收款方是内部还是外部
  165. InvAccount revInvAccount = invAccountService.getById(revInvAccountCard.getAccountId());
  166. InvAccount outInvAccount = invAccountService.getById(outInvAccountCard.getAccountId());
  167. //转账
  168. if (outInvAccount.getOuterFlag().equals("0")) {
  169. if (revInvAccount.getOuterFlag().equals("0")) {
  170. InvAccountExcel invAccountExcel = new InvAccountExcel();
  171. invAccountExcel.setApplyAmount(invAccountIncoice.getPayoutMoney());
  172. List<InvAccountCard> invAccountCards = insideTransfer(outInvAccountCard, revInvAccountCard, invAccountExcel);
  173. invAccountCardService.updateBatchById(invAccountCards);
  174. invAccountOperateService.saveBatch(invAccountOperateList);
  175. invAccountOpService.saveBatch(list);
  176. } else {
  177. InvAccountExcel invAccountExcel = new InvAccountExcel();
  178. invAccountExcel.setOutAccountQuality(revInvAccount.getOuterFlag());
  179. invAccountExcel.setApplyAmount(invAccountIncoice.getPayoutMoney());
  180. List<InvAccountCard> invAccountCards = enterDeTransfer(outInvAccountCard, revInvAccountCard, invAccountExcel);
  181. invAccountCardService.updateBatchById(invAccountCards);
  182. invAccountOperateService.saveBatch(invAccountOperateList);
  183. invAccountOpService.saveBatch(list);
  184. }
  185. } else {
  186. InvAccountOperate invAccountOperate1 = new InvAccountOperate();
  187. invAccountOperate1.setOutCardNum(invAccountIncoice1.getOutBankCardNum());
  188. invAccountOperate1.setEnterCardId(invAccountIncoice1.getRevBankCardNum());
  189. invAccountOperate1.setApplyAmount(payoutMoney);
  190. invAccountOperate1.setRevenueOutlay("0");
  191. invAccountOperate1.setFundFlow(fundFlow);
  192. invAccountOperate1.setPayMethod(invAccountIncoice.getPayMethod());
  193. invAccountOperate1.setCompany(invAccountIncoice1.getOtherUnit());
  194. invAccountOperate1.setFundUse(invAccountIncoice.getFundUse());
  195. invAccountOperate1.setFundFen(invAccountIncoice.getFundFen());
  196. invAccountOperate1.setInvoiceId(invAccountIncoice1.getInvoiceId());
  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, enInvAccountIncoice);
  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. }