|
|
@@ -16,13 +16,32 @@
|
|
|
*/
|
|
|
package org.springblade.salesPart.settlement.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.client.feign.ISerialClient;
|
|
|
+import org.springblade.core.secure.utils.AuthUtil;
|
|
|
+import org.springblade.core.tool.api.R;
|
|
|
+import org.springblade.salesPart.accountManagement.service.IAccountManagementService;
|
|
|
+import org.springblade.salesPart.entity.PjAccountManagement;
|
|
|
+import org.springblade.salesPart.entity.PjOrder;
|
|
|
import org.springblade.salesPart.entity.PjSettlement;
|
|
|
-import org.springblade.salesPart.vo.SettlementVO;
|
|
|
+import org.springblade.salesPart.entity.PjSettlementItems;
|
|
|
+import org.springblade.salesPart.enums.OrderTypeEnum;
|
|
|
+import org.springblade.salesPart.order.service.IOrderService;
|
|
|
import org.springblade.salesPart.settlement.mapper.SettlementMapper;
|
|
|
+import org.springblade.salesPart.settlement.service.ISettlementItemsService;
|
|
|
import org.springblade.salesPart.settlement.service.ISettlementService;
|
|
|
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
+import org.springblade.salesPart.vo.SettlementVO;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
-import com.baomidou.mybatisplus.core.metadata.IPage;
|
|
|
+
|
|
|
+import java.math.BigDecimal;
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.Date;
|
|
|
+import java.util.List;
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
|
/**
|
|
|
* 配件批发收付款结算表 服务实现类
|
|
|
@@ -31,11 +50,187 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
|
|
|
* @since 2023-04-21
|
|
|
*/
|
|
|
@Service
|
|
|
+@AllArgsConstructor
|
|
|
public class SettlementServiceImpl extends ServiceImpl<SettlementMapper, PjSettlement> implements ISettlementService {
|
|
|
|
|
|
+
|
|
|
+ private final ISettlementItemsService settlementItemsService;
|
|
|
+
|
|
|
+ private final IOrderService orderService;
|
|
|
+
|
|
|
+ private final IAccountManagementService accountManagementService;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 生成系统编号
|
|
|
+ */
|
|
|
+ private ISerialClient serialClient;
|
|
|
+
|
|
|
@Override
|
|
|
public IPage<SettlementVO> selectSettlementPage(IPage<SettlementVO> page, SettlementVO settlement) {
|
|
|
return page.setRecords(baseMapper.selectSettlementPage(page, settlement));
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ public R add(PjSettlement settlement) {
|
|
|
+ if (settlement.getId() == null) {
|
|
|
+ // 获取系统编号
|
|
|
+ R billNo = serialClient.getBillNo(settlement.getBillType(), settlement.getBillType(), settlement.getBillType());
|
|
|
+ if (billNo.getCode() != 200) {
|
|
|
+ return R.fail(500, "生成系统编号失败");
|
|
|
+ }
|
|
|
+ settlement.setSysNo((String) billNo.getData());
|
|
|
+ settlement.setCreateTime(new Date());
|
|
|
+ settlement.setCreateUser(AuthUtil.getUserId());
|
|
|
+ settlement.setTenantId(AuthUtil.getTenantId());
|
|
|
+ settlement.setSalesCompanyId(Long.parseLong(AuthUtil.getDeptId()));
|
|
|
+ settlement.setFinanceStatus(OrderTypeEnum.WAITPAYMENT.getType());
|
|
|
+ } else {
|
|
|
+ settlement.setUpdateTime(new Date());
|
|
|
+ settlement.setUpdateUser(AuthUtil.getUserId());
|
|
|
+ }
|
|
|
+ this.saveOrUpdate(settlement);
|
|
|
+ StringBuilder stringBuilder = new StringBuilder();
|
|
|
+ if (ObjectUtils.isNotNull(settlement.getSettlementItemsList())) {
|
|
|
+ for (PjSettlementItems item : settlement.getSettlementItemsList()) {
|
|
|
+ stringBuilder.append(item.getSrcBillNo()).append(",");
|
|
|
+ if (item.getId() == null) {
|
|
|
+ item.setCreateTime(new Date());
|
|
|
+ item.setPid(settlement.getId());
|
|
|
+ item.setCreateUser(AuthUtil.getUserId());
|
|
|
+ item.setTenantId(AuthUtil.getTenantId());
|
|
|
+ } else {
|
|
|
+ item.setUpdateTime(new Date());
|
|
|
+ item.setUpdateUser(AuthUtil.getUserId());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ settlementItemsService.saveOrUpdateBatch(settlement.getSettlementItemsList());
|
|
|
+ }
|
|
|
+ settlement.setContractNumber(stringBuilder.toString());
|
|
|
+ this.saveOrUpdate(settlement);
|
|
|
+ return R.data(settlement);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public R collectionAndPayment(PjSettlement settlement) {
|
|
|
+ if (ObjectUtils.isNotNull(settlement.getSettlementItemsList())) {
|
|
|
+ List<Long> ids = settlement.getSettlementItemsList().stream().map(PjSettlementItems::getSrcParentId).collect(Collectors.toList());
|
|
|
+ if (ObjectUtils.isNull(ids) || ids.size() == 0) {
|
|
|
+ throw new RuntimeException("未找到订单");
|
|
|
+ }
|
|
|
+ List<PjOrder> pjOrderList = orderService.list(new LambdaQueryWrapper<PjOrder>().in(PjOrder::getId, ids));
|
|
|
+ if (ObjectUtils.isNull(pjOrderList) || pjOrderList.size() == 0) {
|
|
|
+ throw new RuntimeException("未找到订单信息");
|
|
|
+ }
|
|
|
+ List<PjOrder> orderArrayList = new ArrayList<>();
|
|
|
+ BigDecimal thisAmount = new BigDecimal("0.00");
|
|
|
+ for (PjSettlementItems item : settlement.getSettlementItemsList()) {
|
|
|
+ item.setUpdateTime(new Date());
|
|
|
+ item.setUpdateUser(AuthUtil.getUserId());
|
|
|
+ PjOrder pjOrder = pjOrderList.stream().findFirst().orElse(null);
|
|
|
+ if (pjOrder == null) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ if (ObjectUtils.isNotNull(pjOrder.getPaymentAmountTl())) {
|
|
|
+ pjOrder.setPaymentAmountTl(pjOrder.getPaymentAmountTl().add(item.getThisAmount()));
|
|
|
+ } else {
|
|
|
+ pjOrder.setPaymentAmountTl(item.getThisAmount());
|
|
|
+ }
|
|
|
+ if (pjOrder.getPaymentAmountTl().equals(pjOrder.getTotalMoney())) {
|
|
|
+ pjOrder.setActualPaymentStatus(2);
|
|
|
+ } else {
|
|
|
+ pjOrder.setActualPaymentStatus(3);
|
|
|
+ }
|
|
|
+ pjOrder.setUpdateTime(new Date());
|
|
|
+ pjOrder.setUpdateUser(AuthUtil.getUserId());
|
|
|
+ orderArrayList.add(pjOrder);
|
|
|
+ thisAmount = thisAmount.add(item.getThisAmount());
|
|
|
+ }
|
|
|
+ settlementItemsService.saveOrUpdateBatch(settlement.getSettlementItemsList());
|
|
|
+ orderService.updateBatchById(orderArrayList);
|
|
|
+ PjAccountManagement pjAccountManagement = accountManagementService.getById(settlement.getAccountId());
|
|
|
+ if (ObjectUtils.isNotNull(pjAccountManagement)) {
|
|
|
+ pjAccountManagement.setId(settlement.getAccountId());
|
|
|
+ pjAccountManagement.setUpdateTime(new Date());
|
|
|
+ pjAccountManagement.setUpdateUser(AuthUtil.getUserId());
|
|
|
+ if ("D".equals(settlement.getDc())) {
|
|
|
+ if (ObjectUtils.isNotNull(pjAccountManagement.getAccountBalance())) {
|
|
|
+ pjAccountManagement.setAccountBalance(pjAccountManagement.getAccountBalance().add(thisAmount));
|
|
|
+ } else {
|
|
|
+ pjAccountManagement.setAccountBalance(thisAmount);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ if (ObjectUtils.isNull(pjAccountManagement.getAccountBalance()) || pjAccountManagement.getAccountBalance().compareTo(thisAmount) < 0) {
|
|
|
+ throw new RuntimeException("账户:" + pjAccountManagement.getCname() + "余额不足,支付失败");
|
|
|
+ } else {
|
|
|
+ pjAccountManagement.setAccountBalance(pjAccountManagement.getAccountBalance().subtract(thisAmount));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ accountManagementService.updateById(pjAccountManagement);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ settlement.setFinanceStatus(OrderTypeEnum.PAID.getType());
|
|
|
+ baseMapper.updateById(settlement);
|
|
|
+ return R.data(settlement);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public R revokeCollectionAndPayment(PjSettlement settlement) {
|
|
|
+ if (ObjectUtils.isNotNull(settlement.getSettlementItemsList())) {
|
|
|
+ List<Long> ids = settlement.getSettlementItemsList().stream().map(PjSettlementItems::getSrcParentId).collect(Collectors.toList());
|
|
|
+ if (ObjectUtils.isNull(ids) || ids.size() == 0) {
|
|
|
+ throw new RuntimeException("未找到订单");
|
|
|
+ }
|
|
|
+ List<PjOrder> pjOrderList = orderService.list(new LambdaQueryWrapper<PjOrder>().in(PjOrder::getId, ids));
|
|
|
+ if (ObjectUtils.isNull(pjOrderList) || pjOrderList.size() == 0) {
|
|
|
+ throw new RuntimeException("未找到订单信息");
|
|
|
+ }
|
|
|
+ List<PjOrder> orderArrayList = new ArrayList<>();
|
|
|
+ BigDecimal thisAmount = new BigDecimal("0.00");
|
|
|
+ for (PjSettlementItems item : settlement.getSettlementItemsList()) {
|
|
|
+ item.setUpdateTime(new Date());
|
|
|
+ item.setUpdateUser(AuthUtil.getUserId());
|
|
|
+ PjOrder pjOrder = pjOrderList.stream().findFirst().orElse(null);
|
|
|
+ if (pjOrder == null) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ if (ObjectUtils.isNotNull(pjOrder.getPaymentAmountTl())) {
|
|
|
+ pjOrder.setPaymentAmountTl(pjOrder.getPaymentAmountTl().subtract(item.getThisAmount()));
|
|
|
+ } else {
|
|
|
+ pjOrder.setPaymentAmountTl(new BigDecimal("0.00"));
|
|
|
+ }
|
|
|
+ if (pjOrder.getPaymentAmountTl().equals(new BigDecimal("0.00"))) {
|
|
|
+ pjOrder.setActualPaymentStatus(1);
|
|
|
+ } else {
|
|
|
+ pjOrder.setActualPaymentStatus(3);
|
|
|
+ }
|
|
|
+ pjOrder.setUpdateTime(new Date());
|
|
|
+ pjOrder.setUpdateUser(AuthUtil.getUserId());
|
|
|
+ orderArrayList.add(pjOrder);
|
|
|
+ thisAmount = thisAmount.add(item.getThisAmount());
|
|
|
+ }
|
|
|
+ settlementItemsService.saveOrUpdateBatch(settlement.getSettlementItemsList());
|
|
|
+ orderService.updateBatchById(orderArrayList);
|
|
|
+ PjAccountManagement pjAccountManagement = accountManagementService.getById(settlement.getAccountId());
|
|
|
+ if (ObjectUtils.isNotNull(pjAccountManagement)) {
|
|
|
+ pjAccountManagement.setId(settlement.getAccountId());
|
|
|
+ pjAccountManagement.setUpdateTime(new Date());
|
|
|
+ pjAccountManagement.setUpdateUser(AuthUtil.getUserId());
|
|
|
+ if ("D".equals(settlement.getDc())) {
|
|
|
+ if (ObjectUtils.isNotNull(pjAccountManagement.getAccountBalance())) {
|
|
|
+ pjAccountManagement.setAccountBalance(pjAccountManagement.getAccountBalance().subtract(thisAmount));
|
|
|
+ } else {
|
|
|
+ pjAccountManagement.setAccountBalance(new BigDecimal("0.00"));
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ pjAccountManagement.setAccountBalance(pjAccountManagement.getAccountBalance().add(thisAmount));
|
|
|
+ }
|
|
|
+ accountManagementService.updateById(pjAccountManagement);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ settlement.setFinanceStatus(OrderTypeEnum.WAITPAYMENT.getType());
|
|
|
+ baseMapper.updateById(settlement);
|
|
|
+ return R.data(settlement);
|
|
|
+ }
|
|
|
+
|
|
|
}
|