|
|
@@ -0,0 +1,326 @@
|
|
|
+/*
|
|
|
+ * Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
|
|
|
+ *
|
|
|
+ * Redistribution and use in source and binary forms, with or without
|
|
|
+ * modification, are permitted provided that the following conditions are met:
|
|
|
+ *
|
|
|
+ * Redistributions of source code must retain the above copyright notice,
|
|
|
+ * this list of conditions and the following disclaimer.
|
|
|
+ * Redistributions in binary form must reproduce the above copyright
|
|
|
+ * notice, this list of conditions and the following disclaimer in the
|
|
|
+ * documentation and/or other materials provided with the distribution.
|
|
|
+ * Neither the name of the dreamlu.net developer nor the names of its
|
|
|
+ * contributors may be used to endorse or promote products derived from
|
|
|
+ * this software without specific prior written permission.
|
|
|
+ * Author: Chill 庄骞 (smallchill@163.com)
|
|
|
+ */
|
|
|
+package org.springblade.los.finance.vouchers.service.impl;
|
|
|
+
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
+import com.baomidou.mybatisplus.core.metadata.IPage;
|
|
|
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
|
|
|
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
+import lombok.AllArgsConstructor;
|
|
|
+import org.springblade.core.secure.utils.AuthUtil;
|
|
|
+import org.springblade.core.tool.api.R;
|
|
|
+import org.springblade.los.basic.business.entity.BusinessType;
|
|
|
+import org.springblade.los.basic.business.service.IBusinessTypeService;
|
|
|
+import org.springblade.los.basic.cur.service.IBCurrencyService;
|
|
|
+import org.springblade.los.billno.entity.BusinessBillNo;
|
|
|
+import org.springblade.los.billno.service.IBusinessBillNoService;
|
|
|
+import org.springblade.los.business.sea.entity.Bills;
|
|
|
+import org.springblade.los.finance.fee.entity.FeeCenter;
|
|
|
+import org.springblade.los.finance.fee.entity.FinAccBills;
|
|
|
+import org.springblade.los.finance.fee.service.IFeeCenterService;
|
|
|
+import org.springblade.los.finance.fee.service.IFinAccBillsService;
|
|
|
+import org.springblade.los.finance.stl.entity.FinStlBills;
|
|
|
+import org.springblade.los.finance.stl.entity.FinStlBillsItems;
|
|
|
+import org.springblade.los.finance.vouchers.entity.FinVouchers;
|
|
|
+import org.springblade.los.finance.vouchers.entity.FinVouchersItems;
|
|
|
+import org.springblade.los.finance.vouchers.mapper.FinVouchersMapper;
|
|
|
+import org.springblade.los.finance.vouchers.service.IFinVouchersItemsService;
|
|
|
+import org.springblade.los.finance.vouchers.service.IFinVouchersService;
|
|
|
+import org.springblade.los.finance.vouchers.vo.FinVouchersVO;
|
|
|
+import org.springblade.system.feign.ISysClient;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+import org.springframework.transaction.interceptor.TransactionAspectSupport;
|
|
|
+
|
|
|
+import java.math.BigDecimal;
|
|
|
+import java.math.RoundingMode;
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.Date;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Objects;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
+/**
|
|
|
+ * 业务-财务凭证 服务实现类
|
|
|
+ *
|
|
|
+ * @author BladeX
|
|
|
+ * @since 2023-12-11
|
|
|
+ */
|
|
|
+@Service
|
|
|
+@AllArgsConstructor
|
|
|
+public class FinVouchersServiceImpl extends ServiceImpl<FinVouchersMapper, FinVouchers> implements IFinVouchersService {
|
|
|
+
|
|
|
+ private final ISysClient sysClient;
|
|
|
+
|
|
|
+ private final IFinVouchersItemsService finVouchersItemsService;
|
|
|
+
|
|
|
+ private final IBCurrencyService bCurrencyService;
|
|
|
+
|
|
|
+ private final IBusinessTypeService bBusinessTypeService;
|
|
|
+
|
|
|
+ private final IBusinessBillNoService businessBillNoService;
|
|
|
+
|
|
|
+ private final IFinAccBillsService finAccBillsService;
|
|
|
+
|
|
|
+ private final IFeeCenterService feeCenterService;
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public IPage<FinVouchersVO> selectFinVouchersPage(IPage<FinVouchersVO> page, FinVouchersVO finVouchers) {
|
|
|
+ return page.setRecords(baseMapper.selectFinVouchersPage(page, finVouchers));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public FinVouchers detail(FinVouchers finVouchers) {
|
|
|
+ if (finVouchers.getId() == null) {
|
|
|
+ throw new RuntimeException("缺少必要参数");
|
|
|
+ }
|
|
|
+ FinVouchers detail = baseMapper.selectById(finVouchers.getId());
|
|
|
+ detail.setFinVouchersItemsList(finVouchersItemsService.list(new LambdaQueryWrapper<FinVouchersItems>()
|
|
|
+ .eq(FinVouchersItems::getIsDeleted, 0)
|
|
|
+ .eq(FinVouchersItems::getTenantId, AuthUtil.getTenantId())
|
|
|
+ .eq(FinVouchersItems::getPid, detail.getId())
|
|
|
+ ));
|
|
|
+ return detail;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public R submit(FinVouchers finVouchers) {
|
|
|
+ String deptId = "";
|
|
|
+ String deptName = "";
|
|
|
+ //获取部门ids对应中文名
|
|
|
+ if (ObjectUtils.isNotNull(AuthUtil.getDeptId())) {
|
|
|
+ deptId = AuthUtil.getDeptId();
|
|
|
+ R<List<String>> res = sysClient.getDeptNames(AuthUtil.getDeptId());
|
|
|
+ if (res.isSuccess() && ObjectUtils.isNotNull(res.getData())) {
|
|
|
+ deptName = String.join(",", res.getData());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (finVouchers.getId() == null) {
|
|
|
+ BusinessType businessType = bBusinessTypeService.getOne(new LambdaQueryWrapper<BusinessType>()
|
|
|
+ .eq(BusinessType::getTenantId, AuthUtil.getTenantId())
|
|
|
+ .eq(BusinessType::getIsDeleted, 0)
|
|
|
+ .eq(BusinessType::getStatus, 0)
|
|
|
+ .eq(BusinessType::getCode, finVouchers.getBusinessTypeCode()));
|
|
|
+ if (businessType == null) {
|
|
|
+ throw new RuntimeException("未找到可用业务类型");
|
|
|
+ }
|
|
|
+ BusinessBillNo businessBillNo = new BusinessBillNo();
|
|
|
+ businessBillNo.setBusinessTypeId(businessType.getId());
|
|
|
+ businessBillNo.setCode(finVouchers.getBillNoFormat());
|
|
|
+ R clientBillNo = businessBillNoService.getBillNoLos(businessBillNo);
|
|
|
+ if (!clientBillNo.isSuccess()) {
|
|
|
+ TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
|
|
|
+ return R.fail(500, "生成订单编号失败");
|
|
|
+ }
|
|
|
+ finVouchers.setBillNo((String) clientBillNo.getData());
|
|
|
+ finVouchers.setCreateTime(new Date());
|
|
|
+ finVouchers.setCreateUser(AuthUtil.getUserId());
|
|
|
+ finVouchers.setCreateUserName(AuthUtil.getUserName());
|
|
|
+ if (ObjectUtils.isNotNull(AuthUtil.getDeptId())) {
|
|
|
+ finVouchers.setCreateDept(deptId);
|
|
|
+ finVouchers.setBranchId(deptId);
|
|
|
+ finVouchers.setCreateDeptName(deptName);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ finVouchers.setUpdateUser(AuthUtil.getUserId());
|
|
|
+ finVouchers.setUpdateTime(new Date());
|
|
|
+ finVouchers.setUpdateUserName(AuthUtil.getUserName());
|
|
|
+ }
|
|
|
+ this.saveOrUpdate(finVouchers);
|
|
|
+ if (ObjectUtils.isNotNull(finVouchers.getFinVouchersItemsList())) {
|
|
|
+ for (FinVouchersItems item : finVouchers.getFinVouchersItemsList()) {
|
|
|
+ //计算字段null值处理
|
|
|
+ item.setQuantityCr(ObjectUtils.isNotNull(item.getQuantityCr()) ? item.getQuantityCr() : new BigDecimal("0.00"));
|
|
|
+ item.setQuantityDr(ObjectUtils.isNotNull(item.getQuantityDr()) ? item.getQuantityDr() : new BigDecimal("0.00"));
|
|
|
+ item.setPrice(ObjectUtils.isNotNull(item.getPrice()) ? item.getPrice() : new BigDecimal("0.00"));
|
|
|
+ item.setPid(finVouchers.getId());
|
|
|
+ //判断是否是本位币
|
|
|
+ if ("CNY".equals(item.getCurCode())) {
|
|
|
+ if ("D".equals(item.getDc())){
|
|
|
+ item.setAmountDr(item.getQuantityDr().multiply(item.getPrice()));
|
|
|
+ }else{
|
|
|
+ item.setAmountCr(item.getQuantityCr().multiply(item.getPrice()));
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ if ("D".equals(item.getDc())){
|
|
|
+ item.setAmountDrUsd(item.getQuantityDr().multiply(item.getPrice()));
|
|
|
+ }else{
|
|
|
+ item.setAmountCrUsd(item.getQuantityCr().multiply(item.getPrice()));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (item.getId() == null) {
|
|
|
+ item.setCreateTime(new Date());
|
|
|
+ item.setCreateUser(AuthUtil.getUserId());
|
|
|
+ item.setCreateUserName(AuthUtil.getUserName());
|
|
|
+ if (ObjectUtils.isNotNull(AuthUtil.getDeptId())) {
|
|
|
+ item.setCreateDept(deptId);
|
|
|
+ item.setBranchId(deptId);
|
|
|
+ item.setCreateDeptName(deptName);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ item.setUpdateUser(AuthUtil.getUserId());
|
|
|
+ item.setUpdateTime(new Date());
|
|
|
+ item.setUpdateUserName(AuthUtil.getUserName());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ finVouchersItemsService.saveOrUpdateBatch(finVouchers.getFinVouchersItemsList());
|
|
|
+ BigDecimal amountDrCNY = new BigDecimal("0.00");
|
|
|
+ BigDecimal amountCrCNY = new BigDecimal("0.00");
|
|
|
+ BigDecimal amountDrUSD = new BigDecimal("0.00");
|
|
|
+ BigDecimal amountCrUSD = new BigDecimal("0.00");
|
|
|
+ amountDrCNY = amountDrCNY.add(finVouchers.getFinVouchersItemsList().stream()
|
|
|
+ .filter(e -> "CNY".equals(e.getCurCode()) && "D".equals(e.getDc())).map(FinVouchersItems::getAmountDr)
|
|
|
+ .filter(ObjectUtils::isNotNull).reduce(BigDecimal.ZERO, BigDecimal::add));
|
|
|
+ finVouchers.setAmountDr(amountDrCNY);
|
|
|
+ amountCrCNY = amountCrCNY.add(finVouchers.getFinVouchersItemsList().stream()
|
|
|
+ .filter(e -> "CNY".equals(e.getCurCode()) && "C".equals(e.getDc())).map(FinVouchersItems::getAmountCr)
|
|
|
+ .filter(ObjectUtils::isNotNull).reduce(BigDecimal.ZERO, BigDecimal::add));
|
|
|
+ finVouchers.setAmountCr(amountCrCNY);
|
|
|
+ amountDrUSD = amountDrUSD.add(finVouchers.getFinVouchersItemsList().stream()
|
|
|
+ .filter(e -> "USD".equals(e.getCurCode()) && "D".equals(e.getDc())).map(FinVouchersItems::getAmountDrUsd)
|
|
|
+ .filter(ObjectUtils::isNotNull).reduce(BigDecimal.ZERO, BigDecimal::add));
|
|
|
+ finVouchers.setAmountDrUsd(amountDrUSD);
|
|
|
+ amountCrUSD = amountCrUSD.add(finVouchers.getFinVouchersItemsList().stream()
|
|
|
+ .filter(e -> "USD".equals(e.getCurCode()) && "C".equals(e.getDc())).map(FinVouchersItems::getAmountCrUsd)
|
|
|
+ .filter(ObjectUtils::isNotNull).reduce(BigDecimal.ZERO, BigDecimal::add));
|
|
|
+ finVouchers.setAmountCrUsd(amountCrUSD);
|
|
|
+ finVouchers.setAmountDrLoc(amountDrCNY.add(bCurrencyService.converterCny("USD", amountDrUSD)));
|
|
|
+ finVouchers.setAmountCrLoc(amountCrCNY.add(bCurrencyService.converterCny("USD", amountCrUSD)));
|
|
|
+ }
|
|
|
+ this.saveOrUpdate(finVouchers);
|
|
|
+ return R.data(finVouchers);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public R confirmFinVouchers(FinVouchers finVouchers) {
|
|
|
+ if (finVouchers.getId() == null) {
|
|
|
+ throw new RuntimeException("缺少必要参数");
|
|
|
+ }
|
|
|
+ FinVouchers detail = baseMapper.selectById(finVouchers.getId());
|
|
|
+ if (ObjectUtils.isNotNull(finVouchers.getFinVouchersItemsList())) {
|
|
|
+ //对账明细状态修改 已对账
|
|
|
+ for (FinVouchersItems item : finVouchers.getFinVouchersItemsList()) {
|
|
|
+ item.setStatus(1);
|
|
|
+ item.setVoucherDate(finVouchers.getVoucherDate());
|
|
|
+ item.setUpdateUser(AuthUtil.getUserId());
|
|
|
+ item.setUpdateTime(new Date());
|
|
|
+ item.setUpdateUserName(AuthUtil.getUserName());
|
|
|
+ }
|
|
|
+ finVouchersItemsService.saveOrUpdateBatch(finVouchers.getFinVouchersItemsList());
|
|
|
+ //通过对账明细里账单id查询具体账单数据
|
|
|
+ List<String> billNos = finVouchers.getFinVouchersItemsList().stream().map(FinVouchersItems::getBillNo)
|
|
|
+ .filter(Objects::nonNull).collect(Collectors.toList());
|
|
|
+ List<FinAccBills> finAccBillsList = finAccBillsService.list(new LambdaQueryWrapper<FinAccBills>()
|
|
|
+ .eq(FinAccBills::getTenantId, AuthUtil.getTenantId())
|
|
|
+ .eq(FinAccBills::getIsDeleted, 0)
|
|
|
+ .in(FinAccBills::getBillNo, billNos));
|
|
|
+ //修改账单中对账状态
|
|
|
+ for (FinAccBills item : finAccBillsList) {
|
|
|
+ item.setVoucherBillId(detail.getId());
|
|
|
+ item.setVoucherBillNo(detail.getBillNo());
|
|
|
+ item.setVoucherNo(detail.getVoucherNo());
|
|
|
+ item.setVoucherDate(detail.getVoucherDate());
|
|
|
+ item.setUpdateUser(AuthUtil.getUserId());
|
|
|
+ item.setUpdateTime(new Date());
|
|
|
+ item.setUpdateUserName(AuthUtil.getUserName());
|
|
|
+ }
|
|
|
+ //通过账单id查询具体费用中心数据
|
|
|
+ List<FeeCenter> feeCenterList = feeCenterService.list(new LambdaQueryWrapper<FeeCenter>()
|
|
|
+ .in(FeeCenter::getAccBillNo, billNos)
|
|
|
+ .eq(FeeCenter::getTenantId, AuthUtil.getTenantId())
|
|
|
+ .eq(FeeCenter::getIsDeleted, 0));
|
|
|
+ List<FeeCenter> feeCenterListNew = reconciliationFeeCenter(detail, feeCenterList, 1);
|
|
|
+ feeCenterService.saveOrUpdateBatch(feeCenterListNew);
|
|
|
+ finAccBillsService.saveOrUpdateBatch(finAccBillsList);
|
|
|
+ }
|
|
|
+ detail.setStatus(3);
|
|
|
+ detail.setVoucherStatus(1);
|
|
|
+ baseMapper.updateById(detail);
|
|
|
+ return R.data(detail);
|
|
|
+ }
|
|
|
+
|
|
|
+ private List<FeeCenter> reconciliationFeeCenter(FinVouchers detail, List<FeeCenter> feeCenterList, int count) {
|
|
|
+ for (FeeCenter item : feeCenterList) {
|
|
|
+ if (count == 1) {
|
|
|
+ item.setVoucherBillId(detail.getId());
|
|
|
+ item.setVoucherBillNo(detail.getBillNo());
|
|
|
+ item.setVoucherNo(detail.getVoucherNo());
|
|
|
+ item.setVoucherDate(detail.getVoucherDate());
|
|
|
+ item.setVoucherStatus(1);
|
|
|
+ item.setVoucherById(detail.getCreateUser());
|
|
|
+ item.setVoucherByName(detail.getCreateUserName());
|
|
|
+ } else {
|
|
|
+ item.setVoucherBillId(0L);
|
|
|
+ item.setVoucherBillNo("");
|
|
|
+ item.setVoucherNo("");
|
|
|
+ item.setVoucherDate(null);
|
|
|
+ item.setVoucherStatus(0);
|
|
|
+ item.setVoucherById(0L);
|
|
|
+ item.setVoucherByName("");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return feeCenterList;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public R revokeFinVouchers(FinVouchers finVouchers) {
|
|
|
+ if (finVouchers.getId() == null) {
|
|
|
+ throw new RuntimeException("缺少必要参数");
|
|
|
+ }
|
|
|
+ FinVouchers detail = baseMapper.selectById(finVouchers.getId());
|
|
|
+ if (ObjectUtils.isNotNull(finVouchers.getFinVouchersItemsList())) {
|
|
|
+ //对账明细状态修改 已对账
|
|
|
+ for (FinVouchersItems item : finVouchers.getFinVouchersItemsList()) {
|
|
|
+ item.setStatus(0);
|
|
|
+ item.setVoucherDate(finVouchers.getVoucherDate());
|
|
|
+ item.setUpdateUser(AuthUtil.getUserId());
|
|
|
+ item.setUpdateTime(new Date());
|
|
|
+ item.setUpdateUserName(AuthUtil.getUserName());
|
|
|
+ }
|
|
|
+ finVouchersItemsService.saveOrUpdateBatch(finVouchers.getFinVouchersItemsList());
|
|
|
+ //通过对账明细里账单id查询具体账单数据
|
|
|
+ List<String> billNos = finVouchers.getFinVouchersItemsList().stream().map(FinVouchersItems::getBillNo)
|
|
|
+ .filter(Objects::nonNull).collect(Collectors.toList());
|
|
|
+ List<FinAccBills> finAccBillsList = finAccBillsService.list(new LambdaQueryWrapper<FinAccBills>()
|
|
|
+ .eq(FinAccBills::getTenantId, AuthUtil.getTenantId())
|
|
|
+ .eq(FinAccBills::getIsDeleted, 0)
|
|
|
+ .in(FinAccBills::getBillNo, billNos));
|
|
|
+ //修改账单中对账状态
|
|
|
+ for (FinAccBills item : finAccBillsList) {
|
|
|
+ item.setVoucherBillId(0L);
|
|
|
+ item.setVoucherBillNo("");
|
|
|
+ item.setVoucherNo("");
|
|
|
+ item.setVoucherDate(null);
|
|
|
+ item.setUpdateUser(AuthUtil.getUserId());
|
|
|
+ item.setUpdateTime(new Date());
|
|
|
+ item.setUpdateUserName(AuthUtil.getUserName());
|
|
|
+ }
|
|
|
+ //通过账单id查询具体费用中心数据
|
|
|
+ List<FeeCenter> feeCenterList = feeCenterService.list(new LambdaQueryWrapper<FeeCenter>()
|
|
|
+ .in(FeeCenter::getAccBillNo, billNos)
|
|
|
+ .eq(FeeCenter::getTenantId, AuthUtil.getTenantId())
|
|
|
+ .eq(FeeCenter::getIsDeleted, 0));
|
|
|
+ List<FeeCenter> feeCenterListNew = reconciliationFeeCenter(detail, feeCenterList, 2);
|
|
|
+ feeCenterService.saveOrUpdateBatch(feeCenterListNew);
|
|
|
+ finAccBillsService.saveOrUpdateBatch(finAccBillsList);
|
|
|
+ }
|
|
|
+ detail.setStatus(0);
|
|
|
+ detail.setVoucherStatus(0);
|
|
|
+ baseMapper.updateById(detail);
|
|
|
+ return R.data(detail);
|
|
|
+ }
|
|
|
+
|
|
|
+}
|