|
|
@@ -0,0 +1,345 @@
|
|
|
+package org.springblade.salesPart.order.service.impl;
|
|
|
+
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
|
|
|
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
|
|
|
+import lombok.AllArgsConstructor;
|
|
|
+import org.springblade.core.secure.utils.AuthUtil;
|
|
|
+import org.springblade.core.tool.api.R;
|
|
|
+import org.springblade.core.tool.utils.BeanUtil;
|
|
|
+import org.springblade.core.tool.utils.ObjectUtil;
|
|
|
+import org.springblade.salesPart.corps.mapper.CorpsDescMapper;
|
|
|
+import org.springblade.salesPart.entity.*;
|
|
|
+import org.springblade.salesPart.enums.OrderTypeEnum;
|
|
|
+import org.springblade.salesPart.goods.mapper.GoodsDescMapper;
|
|
|
+import org.springblade.salesPart.order.service.IOrderItemsService;
|
|
|
+import org.springblade.salesPart.order.service.IOrderService;
|
|
|
+import org.springblade.salesPart.order.service.ITransferSalesService;
|
|
|
+import org.springblade.salesPart.serial.service.IPjpfSerialService;
|
|
|
+import org.springblade.salesPart.stock.service.IStockDescService;
|
|
|
+import org.springblade.system.entity.Dept;
|
|
|
+import org.springblade.system.feign.ISysClient;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
+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-04-21
|
|
|
+ */
|
|
|
+@Service
|
|
|
+@AllArgsConstructor
|
|
|
+public class TransferSalesServiceImpl implements ITransferSalesService {
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 生成系统编号
|
|
|
+ */
|
|
|
+ private final IPjpfSerialService serialService;
|
|
|
+ private final IOrderService orderService;
|
|
|
+ private final IOrderItemsService orderItemsService;
|
|
|
+ private final CorpsDescMapper corpsDescMapper;
|
|
|
+ private final IStockDescService stockDescService;
|
|
|
+ private final GoodsDescMapper goodsDescMapper;
|
|
|
+ private final ISysClient sysClient;
|
|
|
+
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public R submitTransferSales(PjOrder order) {
|
|
|
+ //客户名称
|
|
|
+ PjCorpsDesc corpsDesc = corpsDescMapper.selectById(order.getCustomerId());
|
|
|
+ order.setCustomerName(corpsDesc.getCname());
|
|
|
+
|
|
|
+ // 获取系统编号
|
|
|
+ String billNo = serialService.getBillNo("DBXS", "DBXS", "DBXS");
|
|
|
+ if (ObjectUtils.isNull(billNo)) {
|
|
|
+ TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
|
|
|
+ return R.fail(500, "生成系统编号失败");
|
|
|
+ }
|
|
|
+ if (order.getId() == null) {
|
|
|
+ order.setOrdNo(billNo);
|
|
|
+ order.setBsType("DBXS");
|
|
|
+ order.setSrcOrdNo(billNo);
|
|
|
+ order.setCreateTime(new Date());
|
|
|
+ order.setCreateUser(AuthUtil.getUserId());
|
|
|
+ order.setCreateDept(Long.valueOf(AuthUtil.getDeptId()));
|
|
|
+ order.setTenantId(AuthUtil.getTenantId());
|
|
|
+ order.setStatus(OrderTypeEnum.XSLR.getType());
|
|
|
+ order.setBusinessSource(OrderTypeEnum.DBXS.getType());
|
|
|
+ order.setVersion(1);
|
|
|
+ orderService.save(order);
|
|
|
+ } else {
|
|
|
+ PjOrder orderVersion = orderService.getById(order.getId());
|
|
|
+ if (orderVersion != null && !orderVersion.getVersion().equals(order.getVersion())) {
|
|
|
+ throw new RuntimeException("订单数据已被修改,请返回列表重新操作!");
|
|
|
+ }
|
|
|
+ order.setVersion(order.getVersion() + 1);
|
|
|
+ order.setUpdateUser(AuthUtil.getUserId());
|
|
|
+ order.setUpdateTime(new Date());
|
|
|
+ orderService.updateById(order);
|
|
|
+ }
|
|
|
+ // 保存订单明细
|
|
|
+ if (CollectionUtils.isNotEmpty(order.getOrderItemsList())) {
|
|
|
+ //所属公司
|
|
|
+ R<Dept> dept = sysClient.getDept(Long.valueOf(AuthUtil.getDeptId()));
|
|
|
+ if (ObjectUtil.isNotEmpty(dept)) {
|
|
|
+ order.setSalesCompanyId(dept.getData().getId());
|
|
|
+ order.setSalesCompanyName(dept.getData().getFullName());
|
|
|
+ } else {
|
|
|
+ throw new SecurityException("未维护所属公司");
|
|
|
+ }
|
|
|
+ StringBuilder goodsName = new StringBuilder();
|
|
|
+ StringBuilder retrieval = new StringBuilder();
|
|
|
+ List<Long> goodsId = order.getOrderItemsList().stream().map(PjOrderItems::getGoodsId).distinct().collect(Collectors.toList());
|
|
|
+ List<String> goodsNames = order.getOrderItemsList().stream().map(PjOrderItems::getGoodsName).distinct().collect(Collectors.toList());
|
|
|
+ if (goodsId.size() != order.getOrderItemsList().size()) {
|
|
|
+ throw new RuntimeException("明细存在重复商品,请修改明细数据");
|
|
|
+ }
|
|
|
+ LambdaQueryWrapper<PjStockDesc> stockLambdaQueryWrapper = new LambdaQueryWrapper<>();
|
|
|
+ stockLambdaQueryWrapper.eq(ObjectUtils.isNotNull(order.getStorageId()), PjStockDesc::getStorageId, order.getStorageId())
|
|
|
+ .eq(PjStockDesc::getTenantId, AuthUtil.getTenantId())
|
|
|
+ .eq(PjStockDesc::getIsDeleted, 0)
|
|
|
+ .in(PjStockDesc::getGoodsId, goodsId);
|
|
|
+ List<PjStockDesc> pjStockDescList = stockDescService.list(stockLambdaQueryWrapper);
|
|
|
+ if (ObjectUtils.isNotNull(order.getStorageId())) {
|
|
|
+ if (goodsId.size() != pjStockDescList.size()) {
|
|
|
+ List<PjStockDesc> difference = pjStockDescList.stream().filter(e -> !goodsId.contains(e.getGoodsId())).collect(Collectors.toList());
|
|
|
+ if (!difference.isEmpty()) {
|
|
|
+ String name = difference.stream().map(PjStockDesc::getCname).collect(Collectors.joining(","));
|
|
|
+ throw new RuntimeException(name + "未查到库存,请修改");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (goodsId.size() != goodsNames.size()) {
|
|
|
+ throw new RuntimeException("明细数据存在改名并重名商品,请联系管理员处理");
|
|
|
+ }
|
|
|
+ for (PjOrderItems item : order.getOrderItemsList()) {
|
|
|
+ item.setSendNum(new BigDecimal("0.00"));
|
|
|
+ if (new BigDecimal("0.00").compareTo(item.getPrice()) == 0) {
|
|
|
+ throw new RuntimeException("商品:" + item.getGoodsName() + "单价为零");
|
|
|
+ }
|
|
|
+ item.setBizType(order.getBsType());
|
|
|
+ item.setBillNo(order.getOrdNo());
|
|
|
+ if (item.getId() == null) {
|
|
|
+ item.setCreateDept(Long.valueOf(AuthUtil.getDeptId()));
|
|
|
+ item.setCreateTime(new Date());
|
|
|
+ item.setCreateUser(AuthUtil.getUserId());
|
|
|
+ item.setPid(order.getId());
|
|
|
+ item.setTenantId(AuthUtil.getTenantId());
|
|
|
+ } else {
|
|
|
+ item.setUpdateTime(new Date());
|
|
|
+ item.setUpdateUser(AuthUtil.getUserId());
|
|
|
+ item.setPid(order.getId());
|
|
|
+ }
|
|
|
+ //计算小计
|
|
|
+ item.setSubTotalMoney(item.getGoodsNum().multiply(item.getPrice()));
|
|
|
+ if (ObjectUtils.isNull(order.getStatus()) || "录入".equals(order.getStatus())) {
|
|
|
+ item.setPrimaryGoodsTotalNum(item.getGoodsNum());
|
|
|
+ }
|
|
|
+ //获得商品
|
|
|
+ PjGoodsDesc goodsDesc = goodsDescMapper.selectById(item.getGoodsId());
|
|
|
+ if (ObjectUtil.isEmpty(goodsDesc)) {
|
|
|
+ throw new RuntimeException("商品数据异常");
|
|
|
+ }
|
|
|
+ item.setBrandId(goodsDesc.getBrandId());
|
|
|
+ item.setBrandName(goodsDesc.getBrandName());
|
|
|
+ if (!pjStockDescList.isEmpty()) {
|
|
|
+ //管理批次号
|
|
|
+ PjStockDesc stockOne;
|
|
|
+ if (ObjectUtil.isNotEmpty(goodsDesc.getWhether()) && "1".equals(goodsDesc.getWhether())) {
|
|
|
+ stockOne = pjStockDescList.stream()
|
|
|
+ .filter(e -> e.getGoodsId().equals(item.getGoodsId())
|
|
|
+ && ObjectUtils.isNotNull(e.getDot()) && e.getDot().equals(item.getDot())).findFirst().orElse(null);
|
|
|
+ } else {
|
|
|
+ stockOne = pjStockDescList.stream()
|
|
|
+ .filter(e -> e.getGoodsId().equals(item.getGoodsId())
|
|
|
+ && ObjectUtils.isNull(e.getDot())).findFirst().orElse(null);
|
|
|
+ }
|
|
|
+ if (stockOne != null) {
|
|
|
+ item.setInventory(stockOne.getBalanceQuantity());
|
|
|
+ item.setInventoryFinancing(stockOne.getBalanceQuantityFinancing());
|
|
|
+ item.setInventoryHave(stockOne.getBalanceQuantityHave());
|
|
|
+ item.setCostprie(item.getGoodsNum().multiply(stockOne.getInventoryCostPrice()));
|
|
|
+ item.setCostpriePrice(stockOne.getInventoryCostPrice());
|
|
|
+ item.setRebateCostprie(item.getGoodsNum().multiply(stockOne.getRebatePrice()));
|
|
|
+ //计算毛利
|
|
|
+ item.setGrossProfit(item.getSubTotalMoney().subtract(item.getCostprie()));
|
|
|
+ item.setRebateProfit(item.getSubTotalMoney().subtract(item.getRebateCostprie()));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //计算成本
|
|
|
+ goodsName.append(goodsDesc.getCname()).append(",");
|
|
|
+ retrieval.append(goodsDesc.getCnameInt()).append(",");
|
|
|
+ if (ObjectUtils.isNull(item.getSendNum())) {
|
|
|
+ item.setSendNum(new BigDecimal("0.00"));
|
|
|
+ }
|
|
|
+ orderItemsService.saveOrUpdate(item);
|
|
|
+ }
|
|
|
+ if (goodsName.length() > 0) {
|
|
|
+ order.setGoodsNameJoin(goodsName.substring(0, goodsName.length() - 1));
|
|
|
+ }
|
|
|
+ if (retrieval.length() > 0) {
|
|
|
+ order.setShortcutJoin(retrieval.substring(0, retrieval.length() - 1));
|
|
|
+ }
|
|
|
+ order.setNumberRows(order.getOrderItemsList().size());//行数
|
|
|
+ //总数量
|
|
|
+ order.setGoodsTotalNum(order.getOrderItemsList().stream().map(PjOrderItems::getGoodsNum).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
|
|
|
+ //总已发数量
|
|
|
+ order.setGoodsTotalShipNum(order.getOrderItemsList().stream().map(PjOrderItems::getSendNum).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
|
|
|
+ //实际金额
|
|
|
+ order.setGoodsTotalShipAmount(order.getOrderItemsList().stream().map(PjOrderItems::getGoodsTotalShipAmount).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
|
|
|
+ //总金额
|
|
|
+ BigDecimal totalMoney = order.getOrderItemsList().stream().reduce(BigDecimal.ZERO, (x, y) -> x.add(y.getGoodsNum().multiply(y.getPrice())), BigDecimal::add)
|
|
|
+ .setScale(2, RoundingMode.HALF_UP);
|
|
|
+ order.setSalesAmount(totalMoney);
|
|
|
+ order.setTotalMoney(totalMoney);
|
|
|
+ //毛利
|
|
|
+ order.setGrossProfit(order.getOrderItemsList().stream().map(PjOrderItems::getGrossProfit).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
|
|
|
+ //成本
|
|
|
+ order.setCost(order.getOrderItemsList().stream().map(PjOrderItems::getCostprie).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
|
|
|
+ order.setRebateGrossProfit(order.getOrderItemsList().stream().map(PjOrderItems::getRebateProfit).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
|
|
|
+ //成本
|
|
|
+ order.setRebateCost(order.getOrderItemsList().stream().map(PjOrderItems::getRebateCostprie).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
|
|
|
+ } else {
|
|
|
+ order.setNumberRows(0);//行数
|
|
|
+ //总数量
|
|
|
+ order.setGoodsTotalNum(new BigDecimal("0"));
|
|
|
+ order.setSalesAmount(new BigDecimal("0.00"));
|
|
|
+ order.setTotalMoney(new BigDecimal("0.00"));
|
|
|
+ }
|
|
|
+ orderService.updateById(order);
|
|
|
+ return R.data(order);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public R generateDocument(PjOrder orderData) {
|
|
|
+ PjOrder pjOrder = orderService.getById(orderData.getId());
|
|
|
+ if (pjOrder == null) {
|
|
|
+ throw new RuntimeException("未查到单据信息");
|
|
|
+ }
|
|
|
+ List<PjOrderItems> orderItemsList = orderItemsService.list(new LambdaQueryWrapper<PjOrderItems>()
|
|
|
+ .eq(PjOrderItems::getIsDeleted, 0)
|
|
|
+ .eq(PjOrderItems::getTenantId, AuthUtil.getTenantId())
|
|
|
+ .eq(PjOrderItems::getPid, orderData.getId()));
|
|
|
+ if (orderItemsList.isEmpty()) {
|
|
|
+ throw new RuntimeException("未查到单据明细信息");
|
|
|
+ }
|
|
|
+ // 获取系统编号
|
|
|
+ String billNo = serialService.getBillNo(orderData.getBsType(), orderData.getBsType(), orderData.getBsType());
|
|
|
+ if (ObjectUtils.isNull(billNo)) {
|
|
|
+ TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
|
|
|
+ return R.fail(500, "生成系统编号失败");
|
|
|
+ }
|
|
|
+ PjOrder order = new PjOrder();
|
|
|
+ BeanUtil.copyProperties(pjOrder, order);
|
|
|
+ order.setTransferSalesNo(pjOrder.getOrdNo());
|
|
|
+ order.setTransferSalesId(pjOrder.getId());
|
|
|
+ order.setId(null);
|
|
|
+ order.setOrdNo(billNo);
|
|
|
+ order.setSrcOrdNo(billNo);
|
|
|
+ order.setCreateTime(new Date());
|
|
|
+ order.setCreateUser(AuthUtil.getUserId());
|
|
|
+ order.setCreateDept(Long.valueOf(AuthUtil.getDeptId()));
|
|
|
+ order.setUpdateUser(null);
|
|
|
+ order.setUpdateTime(null);
|
|
|
+ order.setStatus(OrderTypeEnum.XSLR.getType());
|
|
|
+ order.setXcxStatus(OrderTypeEnum.XSLR.getType());
|
|
|
+ order.setBsType(orderData.getBsType());
|
|
|
+ order.setVersion(1);
|
|
|
+ order.setDueDate(new Date());
|
|
|
+ order.setBusinessSource(OrderTypeEnum.WEB.getType());
|
|
|
+ if ("CG".equals(order.getBsType())) {
|
|
|
+ order.setStorageId(pjOrder.getCallInStorageId());
|
|
|
+ order.setStorageName(pjOrder.getCallInStorageName());
|
|
|
+ }
|
|
|
+ orderService.save(order);
|
|
|
+ List<PjOrderItems> orderItems = new ArrayList<>();
|
|
|
+ for (PjOrderItems item : orderItemsList) {
|
|
|
+ item.setBizType(order.getBsType());
|
|
|
+ item.setBillNo(order.getOrdNo());
|
|
|
+ item.setCreateDept(order.getCreateDept());
|
|
|
+ item.setCreateTime(new Date());
|
|
|
+ item.setCreateUser(AuthUtil.getUserId());
|
|
|
+ item.setPid(order.getId());
|
|
|
+ item.setUpdateTime(null);
|
|
|
+ item.setUpdateUser(null);
|
|
|
+ item.setId(null);
|
|
|
+ if ("CG".equals(order.getBsType())) {
|
|
|
+ item.setCostpriePrice(item.getPrice());
|
|
|
+ item.setCostprie(item.getTotalAmount());
|
|
|
+ item.setRebatePrice(item.getPrice());
|
|
|
+ item.setRebateCostprie(item.getTotalAmount());
|
|
|
+ item.setRebateProfit(new BigDecimal("0.00"));
|
|
|
+ item.setGrossProfit(new BigDecimal("0.00"));
|
|
|
+ item.setProfit(new BigDecimal("0.00"));
|
|
|
+ }
|
|
|
+ orderItems.add(item);
|
|
|
+ }
|
|
|
+ if (!orderItems.isEmpty()) {
|
|
|
+ orderItemsService.saveBatch(orderItems);
|
|
|
+ }
|
|
|
+ pjOrder.setUpdateUser(AuthUtil.getUserId());
|
|
|
+ pjOrder.setUpdateTime(new Date());
|
|
|
+ pjOrder.setVersion(pjOrder.getVersion() + 1);
|
|
|
+ if ("CG".equals(order.getBsType())) {
|
|
|
+ order.setRebateGrossProfit(orderItems.stream().map(PjOrderItems::getRebateProfit).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
|
|
|
+ //成本
|
|
|
+ order.setRebateCost(orderItems.stream().map(PjOrderItems::getRebateCostprie).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
|
|
|
+ orderService.updateById(order);
|
|
|
+ pjOrder.setCgStatus("1");
|
|
|
+ } else {
|
|
|
+ pjOrder.setXsStatus("1");
|
|
|
+ }
|
|
|
+ orderService.updateById(pjOrder);
|
|
|
+ return R.data(pjOrder);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public R revokeGenerateDocument(PjOrder orderData) {
|
|
|
+ PjOrder pjOrder = orderService.getById(orderData.getId());
|
|
|
+ if (pjOrder == null) {
|
|
|
+ throw new RuntimeException("未查到单据信息");
|
|
|
+ }
|
|
|
+ pjOrder.setUpdateUser(AuthUtil.getUserId());
|
|
|
+ pjOrder.setUpdateTime(new Date());
|
|
|
+ pjOrder.setVersion(pjOrder.getVersion() + 1);
|
|
|
+ if ("CG".equals(orderData.getBsType())) {
|
|
|
+ pjOrder.setCgStatus("1");
|
|
|
+ } else {
|
|
|
+ pjOrder.setXsStatus("1");
|
|
|
+ }
|
|
|
+ orderService.updateById(pjOrder);
|
|
|
+ PjOrder order = orderService.getOne(new LambdaQueryWrapper<PjOrder>()
|
|
|
+ .eq(PjOrder::getIsDeleted, 0)
|
|
|
+ .eq(PjOrder::getTenantId, AuthUtil.getTenantId())
|
|
|
+ .eq(PjOrder::getBsType, orderData.getBsType())
|
|
|
+ .eq(PjOrder::getTransferSalesId, pjOrder.getId())
|
|
|
+ .eq(PjOrder::getTransferSalesNo, pjOrder.getOrdNo()));
|
|
|
+ if (order == null) {
|
|
|
+ throw new RuntimeException("未查到生成的单据");
|
|
|
+ }
|
|
|
+ List<PjOrderItems> orderItemsList = orderItemsService.list(new LambdaQueryWrapper<PjOrderItems>()
|
|
|
+ .eq(PjOrderItems::getTenantId, AuthUtil.getTenantId())
|
|
|
+ .eq(PjOrderItems::getIsDeleted, 0)
|
|
|
+ .eq(PjOrderItems::getPid, order.getId()));
|
|
|
+ if (!orderItemsList.isEmpty()) {
|
|
|
+ orderItemsService.removeByIds(orderItemsList.stream().map(PjOrderItems::getId).collect(Collectors.toList()));
|
|
|
+ }
|
|
|
+ orderService.removeById(order.getId());
|
|
|
+ return R.data(pjOrder);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+}
|