|
|
@@ -1,6 +1,7 @@
|
|
|
package com.trade.purchase.order.component.impl;
|
|
|
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
|
|
|
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
|
|
|
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
|
|
|
@@ -11,6 +12,8 @@ import com.trade.purchase.order.dto.OrderSubmitDto;
|
|
|
import com.trade.purchase.order.entity.Order;
|
|
|
import com.trade.purchase.order.entity.OrderFees;
|
|
|
import com.trade.purchase.order.entity.OrderFiles;
|
|
|
+import com.trade.purchase.order.entity.OrderItems;
|
|
|
+import com.trade.purchase.order.enums.OrderTypeEnum;
|
|
|
import com.trade.purchase.order.mapper.OrderFeesMapper;
|
|
|
import com.trade.purchase.order.mapper.OrderFilesMapper;
|
|
|
import com.trade.purchase.order.mapper.OrderItemsMapper;
|
|
|
@@ -18,15 +21,20 @@ import com.trade.purchase.order.mapper.OrderMapper;
|
|
|
import com.trade.purchase.order.vo.OrderItemsVO;
|
|
|
import lombok.AllArgsConstructor;
|
|
|
import org.springblade.client.entity.CorpsDesc;
|
|
|
+import org.springblade.client.entity.Message;
|
|
|
import org.springblade.client.feign.ICorpsDescClient;
|
|
|
+import org.springblade.client.feign.IMessageClient;
|
|
|
import org.springblade.client.feign.ISerialClient;
|
|
|
import org.springblade.core.secure.utils.AuthUtil;
|
|
|
+import org.springblade.core.secure.utils.SecureUtil;
|
|
|
import org.springblade.core.tool.api.R;
|
|
|
import org.springblade.core.tool.utils.Func;
|
|
|
import org.springframework.stereotype.Component;
|
|
|
import org.springframework.transaction.interceptor.TransactionAspectSupport;
|
|
|
|
|
|
import java.math.BigDecimal;
|
|
|
+import java.math.BigInteger;
|
|
|
+import java.math.RoundingMode;
|
|
|
import java.util.Date;
|
|
|
import java.util.List;
|
|
|
import java.util.Objects;
|
|
|
@@ -55,6 +63,8 @@ public class DefaultOrderSaveImpl implements IOrderSave {
|
|
|
|
|
|
private ICorpsDescClient corpsDescClient;//获取客户信息
|
|
|
|
|
|
+ private final IMessageClient messageClient;//消息
|
|
|
+
|
|
|
/**
|
|
|
* 订单暂存
|
|
|
*
|
|
|
@@ -64,6 +74,38 @@ public class DefaultOrderSaveImpl implements IOrderSave {
|
|
|
public void save(OrderSubmitDto orderSubmitDto) {
|
|
|
// 保存订单
|
|
|
Order order = saveOrder(orderSubmitDto);
|
|
|
+ // 保存订单明细
|
|
|
+ if (CollectionUtils.isNotEmpty(orderSubmitDto.getItemsVOList())) {
|
|
|
+ orderSubmitDto.getItemsVOList().forEach(item -> {
|
|
|
+ if (ObjectUtils.isNotNull(item.getCorpId())) {
|
|
|
+ CorpsDesc corpsDesc = corpsDescClient.getCorpId(item.getCorpId());
|
|
|
+ if (ObjectUtils.isNotNull(corpsDesc)) {
|
|
|
+ item.setCorpAddress(corpsDesc.getBelongtoarea());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ item.setBillNo(order.getOrderNo());
|
|
|
+ item.setBillType(order.getBillType());
|
|
|
+ item.setBusinesDate(order.getBusinesDate());
|
|
|
+ item.setPlannedDeliveryDate(order.getPlannedDeliveryDate());
|
|
|
+ item.setCarry(order.getBuyerName());
|
|
|
+ if (item.getId() == null) {
|
|
|
+ item.setTenantId(SecureUtil.getTenantId());
|
|
|
+ item.setCreateUser(SecureUtil.getUserId());
|
|
|
+ item.setCreateTime(new Date());
|
|
|
+ item.setPid(order.getId());
|
|
|
+ item.setBillType(order.getBillType());
|
|
|
+ orderItemsMapper.insert(item);
|
|
|
+ } else {
|
|
|
+ item.setTenantId(SecureUtil.getTenantId());
|
|
|
+ item.setUpdateUser(SecureUtil.getUserId());
|
|
|
+ item.setUpdateTime(new Date());
|
|
|
+ item.setPid(order.getId());
|
|
|
+ item.setBillType(order.getBillType());
|
|
|
+ orderItemsMapper.updateById(item);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
// 保存子订单
|
|
|
saveItem(orderSubmitDto.getItemsVOList(), orderSubmitDto.getDelItemIds(), order.getId());
|
|
|
// 保存费用信息
|
|
|
@@ -130,41 +172,186 @@ public class DefaultOrderSaveImpl implements IOrderSave {
|
|
|
}
|
|
|
order.setSysNo((String) billNo.getData());
|
|
|
R<CorpsDesc> corpMessage = corpsDescClient.getCorpMessage(order.getCorpId());
|
|
|
- if (StringUtils.isBlank(order.getOrderNo())) {
|
|
|
- //生成订单号
|
|
|
- R clientBillNo = serialClient.getBillNo(corpMessage.getData().getCode(), order.getTradeType(), order.getTradeType());
|
|
|
- if (!clientBillNo.isSuccess()) {
|
|
|
- TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
|
|
|
- throw new SecurityException("生成订单号失败");
|
|
|
+ if ("577435".equals(AuthUtil.getTenantId())) {
|
|
|
+ if (corpMessage.isSuccess() && StringUtils.isNotBlank(corpMessage.getData().getCode())) {
|
|
|
+ String substring = "";
|
|
|
+ if (order.getBillType().equals(OrderTypeEnum.ENQUIRY.getType())) {
|
|
|
+ substring = substring + "Q";
|
|
|
+ }
|
|
|
+ if (corpMessage.getData().getCode().length() > 10) {
|
|
|
+ substring = substring + corpMessage.getData().getCode().substring(corpMessage.getData().getCode().length() - 3, corpMessage.getData().getCode().length());
|
|
|
+ } else {
|
|
|
+ substring = substring + corpMessage.getData().getCode();
|
|
|
+ }
|
|
|
+ R clientBillNo = serialClient.getBillNo(substring, order.getTradeType(), order.getBillType());
|
|
|
+ if (!clientBillNo.isSuccess()) {
|
|
|
+ TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
|
|
|
+ throw new RuntimeException("生成订单编号失败");
|
|
|
+ }
|
|
|
+ order.setOrderNo((String) clientBillNo.getData());
|
|
|
+ // 进口的orgOrderNo 存的是采购订单号 出口国内存的是本身的订单号码
|
|
|
+ if (!order.getBillType().equals(OrderTypeEnum.IMPORT.getType())) {
|
|
|
+ order.setOrgOrderNo((String) clientBillNo.getData());
|
|
|
+ }
|
|
|
}
|
|
|
- order.setOrderNo((String) clientBillNo.getData());
|
|
|
- }
|
|
|
- //判断贸易类型
|
|
|
- if (order.getTradeType().equals("JK")) {
|
|
|
- order.setOrgOrderNo(order.getOrderNo());
|
|
|
- }
|
|
|
- if ("橡胶".equals(order.getOrderType())) {
|
|
|
- order.setOrderAmount(order.getSalesPrice().multiply(order.getContractWeight()));
|
|
|
+ if ("CG".equals(order.getBillType()) && ObjectUtils.isNotNull(order.getSrcIds())) {
|
|
|
+ String[] arrs = order.getSrcIds().split(",");
|
|
|
+ for (String arr : arrs) {
|
|
|
+ Order selectOrder = orderService.selectById(Long.parseLong(arr));
|
|
|
+ if (ObjectUtils.isNotNull(selectOrder)) {
|
|
|
+ selectOrder.setFudaPurchaseDate(new Date());
|
|
|
+ selectOrder.setFudaPurchaseStatus("采购中");
|
|
|
+ selectOrder.setUpdateTime(new Date());
|
|
|
+ selectOrder.setUpdateUser(AuthUtil.getUserId());
|
|
|
+ selectOrder.setUpdateUserName(AuthUtil.getUserName());
|
|
|
+ orderService.updateById(selectOrder);
|
|
|
+
|
|
|
+ //循环发送消息
|
|
|
+ Message sendMessage = new Message();
|
|
|
+ sendMessage.setParameter(String.valueOf(selectOrder.getId()));
|
|
|
+ sendMessage.setUserName(AuthUtil.getUserName());
|
|
|
+ sendMessage.setUserId(AuthUtil.getUserId());
|
|
|
+ sendMessage.setMessageType(1);
|
|
|
+ sendMessage.setTenantId(AuthUtil.getTenantId());
|
|
|
+ sendMessage.setCreateUser(AuthUtil.getUserId());
|
|
|
+ sendMessage.setCreateTime(new Date());
|
|
|
+ sendMessage.setUrl(selectOrder.getUrl());
|
|
|
+ sendMessage.setPageLabel(selectOrder.getPageLabel());
|
|
|
+ sendMessage.setPageStatus(selectOrder.getPageStatus());
|
|
|
+ if (true) {
|
|
|
+ sendMessage.setToUserId(selectOrder.getCreateUser());
|
|
|
+ sendMessage.setToUserName(selectOrder.getCreateUserName());
|
|
|
+ sendMessage.setMessageBody("您的销售订单" + selectOrder.getSysNo() + "正在采购中,请查看");
|
|
|
+ R save = messageClient.save(sendMessage);
|
|
|
+ if (!save.isSuccess()) {
|
|
|
+ throw new SecurityException("发送消息失败");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (true) {
|
|
|
+ sendMessage.setToUserId(selectOrder.getDocumenterId());
|
|
|
+ sendMessage.setToUserName(selectOrder.getDocumenterName());
|
|
|
+ sendMessage.setMessageBody("销售订单" + selectOrder.getSysNo() + "正在采购中,请查看");
|
|
|
+ R save = messageClient.save(sendMessage);
|
|
|
+ if (!save.isSuccess()) {
|
|
|
+ throw new SecurityException("发送消息失败");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ order.setFudaPurchaseDate(new Date());
|
|
|
+ order.setFudaPurchaseStatus("采购中");
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ if (StringUtils.isBlank(order.getOrderNo())) {
|
|
|
+ //生成订单号
|
|
|
+ R clientBillNo = serialClient.getBillNo(corpMessage.getData().getCode(), order.getTradeType(), order.getTradeType());
|
|
|
+ if (!clientBillNo.isSuccess()) {
|
|
|
+ TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
|
|
|
+ throw new SecurityException("生成订单号失败");
|
|
|
+ }
|
|
|
+ order.setOrderNo((String) clientBillNo.getData());
|
|
|
+ }
|
|
|
+ //判断贸易类型
|
|
|
+ if (order.getTradeType().equals("JK")) {
|
|
|
+ order.setOrgOrderNo(order.getOrderNo());
|
|
|
+ }
|
|
|
+ if ("橡胶".equals(order.getOrderType())) {
|
|
|
+ order.setOrderAmount(order.getSalesPrice().multiply(order.getContractWeight()));
|
|
|
+ }
|
|
|
+ //订单编号转大写
|
|
|
+ //order.setOrderNo(order.getOrderNo().toUpperCase());
|
|
|
+ //order.setSysNo(order.getSysNo().toUpperCase());
|
|
|
+ //order.setBillNo(order.getBillNo().toUpperCase());
|
|
|
+ order.setCreateTime(new Date());
|
|
|
+ order.setCreateUser(AuthUtil.getUserId());
|
|
|
+ order.setBuyerName(order.get$buyerId());
|
|
|
+ order.setDocumenterName(order.get$documenterId());
|
|
|
+ orderService.insert(order);
|
|
|
}
|
|
|
- //订单编号转大写
|
|
|
- //order.setOrderNo(order.getOrderNo().toUpperCase());
|
|
|
- //order.setSysNo(order.getSysNo().toUpperCase());
|
|
|
- //order.setBillNo(order.getBillNo().toUpperCase());
|
|
|
- order.setCreateTime(new Date());
|
|
|
- order.setCreateUser(AuthUtil.getUserId());
|
|
|
- orderService.insert(order);
|
|
|
} else {
|
|
|
- if ("橡胶".equals(order.getOrderType())) {
|
|
|
- order.setOrderAmount(order.getSalesPrice().multiply(order.getContractWeight()));
|
|
|
+ if ("577435".equals(AuthUtil.getTenantId())) {
|
|
|
+ LambdaQueryWrapper<Order> orderLambdaQueryWrapper = new LambdaQueryWrapper<>();
|
|
|
+ orderLambdaQueryWrapper
|
|
|
+ .eq(Order::getId, order.getId())
|
|
|
+ .eq(Order::getCorpId, order.getCorpId())
|
|
|
+ .eq(Order::getTradeType, order.getTradeType())
|
|
|
+ .eq(Order::getBillType, order.getBillType())
|
|
|
+ .eq(Order::getTenantId, AuthUtil.getTenantId())
|
|
|
+ .eq(Order::getIsDeleted, 0);
|
|
|
+ Integer count = orderService.selectCount(orderLambdaQueryWrapper);
|
|
|
+ if (count <= 0) {
|
|
|
+ // 出口贸易的报价单号和销售单号的生成规则是 Q + 客户编码后三位
|
|
|
+ if (order.getTradeType().equals(OrderTypeEnum.EXPORT.getType())) {
|
|
|
+ R<CorpsDesc> corpMessage = corpsDescClient.getCorpMessage(order.getCorpId());
|
|
|
+ if (corpMessage.isSuccess() && StringUtils.isNotBlank(corpMessage.getData().getCode())) {
|
|
|
+ String substring = "";
|
|
|
+ if (order.getBillType().equals(OrderTypeEnum.ENQUIRY.getType())) {
|
|
|
+ substring = substring + "Q";
|
|
|
+ }
|
|
|
+ if (corpMessage.getData().getCode().length() > 10) {
|
|
|
+ substring = substring + corpMessage.getData().getCode().substring(corpMessage.getData().getCode().length() - 3, corpMessage.getData().getCode().length());
|
|
|
+ } else {
|
|
|
+ substring = substring + corpMessage.getData().getCode();
|
|
|
+ }
|
|
|
+ R clientBillNo = serialClient.getBillNo(substring, order.getTradeType(), order.getBillType());
|
|
|
+ if (!clientBillNo.isSuccess()) {
|
|
|
+ TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
|
|
|
+ throw new RuntimeException("生成订单编号失败");
|
|
|
+ }
|
|
|
+ order.setOrderNo((String) clientBillNo.getData());
|
|
|
+ // 进口的orgOrderNo 存的是采购订单号 出口国内存的是本身的订单号码
|
|
|
+ if (!order.getBillType().equals(OrderTypeEnum.IMPORT.getType())) {
|
|
|
+ order.setOrgOrderNo((String) clientBillNo.getData());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 主订单号为空已订单号一致国内贸易
|
|
|
+ if (order.getTradeType().equals(OrderTypeEnum.DOMESTIC.getType())) {
|
|
|
+ order.setMorderNo(order.getOrderNo());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ if ("橡胶".equals(order.getOrderType())) {
|
|
|
+ order.setOrderAmount(order.getSalesPrice().multiply(order.getContractWeight()));
|
|
|
+ }
|
|
|
+ //防止有人改成小写的字母
|
|
|
+ //order.setOrderNo(order.getOrderNo().toUpperCase());
|
|
|
+ //order.setSysNo(order.getSysNo().toUpperCase());
|
|
|
+ //order.setBillNo(order.getBillNo().toUpperCase());
|
|
|
+ }
|
|
|
+ if ("577435".equals(AuthUtil.getTenantId())) {
|
|
|
+ // 生成毛利润 毛利额
|
|
|
+ List<OrderItems> list = orderItemsMapper.selectList(new QueryWrapper<OrderItems>().eq("pid", order.getId()).eq("good_type", 0).eq("is_deleted", 0));
|
|
|
+ // 出口的毛利额=销售价 * 汇率 - (采购价+配件价格) 毛利率 =毛利额/(采购单价+配件价格)
|
|
|
+ // 金额求和
|
|
|
+// BigDecimal amount = list.stream().reduce(BigDecimal.ZERO, (x, y) -> x.add(y.getPrice().multiply(y.getOrderQuantity())), BigDecimal::add);
|
|
|
+ BigDecimal amount = list.stream().reduce(BigDecimal.ZERO, (x, y) -> x.add(y.getOutFactoryPrice().multiply(y.getOrderQuantity())), BigDecimal::add);
|
|
|
+ // 采购金额求和
|
|
|
+ BigDecimal purchaseAmount = list.stream().reduce(BigDecimal.ZERO, (x, y) -> x.add(y.getPurchaseAmount().multiply(y.getOrderQuantity())), BigDecimal::add);
|
|
|
+ // 配件金额求和
|
|
|
+ BigDecimal partsPrice = list.stream().reduce(BigDecimal.ZERO, (x, y) -> x.add(y.getPartsPrice().multiply(y.getOrderQuantity())), BigDecimal::add);
|
|
|
+ // 毛利额
|
|
|
+ order.setGrossProfit(amount.multiply(order.getExchangeRate()).subtract((purchaseAmount.add(partsPrice))).setScale(2, RoundingMode.HALF_UP));
|
|
|
+ BigDecimal grossProfitRate = new BigDecimal(BigInteger.ZERO);
|
|
|
+ if ((amount.compareTo(BigDecimal.ZERO)) > 0) {
|
|
|
+ BigDecimal multiply = amount.multiply(order.getExchangeRate());
|
|
|
+ grossProfitRate = order.getGrossProfit().divide(multiply, 5, RoundingMode.HALF_UP).multiply(new BigDecimal(100)).setScale(2, RoundingMode.HALF_UP);
|
|
|
+ }
|
|
|
+ // 毛利率
|
|
|
+ order.setGrossProfitRate(grossProfitRate);
|
|
|
+ } else {
|
|
|
+ // 毛利额
|
|
|
+ order.setGrossProfit(new BigDecimal(BigInteger.ZERO));
|
|
|
+ // 毛利率
|
|
|
+ order.setGrossProfitRate(new BigDecimal(BigInteger.ZERO));
|
|
|
}
|
|
|
- //防止有人改成小写的字母
|
|
|
- //order.setOrderNo(order.getOrderNo().toUpperCase());
|
|
|
- //order.setSysNo(order.getSysNo().toUpperCase());
|
|
|
- //order.setBillNo(order.getBillNo().toUpperCase());
|
|
|
- order.setUpdateTime(new Date());
|
|
|
- order.setUpdateUser(AuthUtil.getUserId());
|
|
|
- orderService.updateById(order);
|
|
|
+ order.setStorageQuantity(order.getOrderItemsList().stream().map(OrderItems::getOrderQuantity).reduce(BigDecimal.ZERO, BigDecimal::add));
|
|
|
}
|
|
|
+ order.setUpdateTime(new Date());
|
|
|
+ order.setUpdateUser(AuthUtil.getUserId());
|
|
|
+ order.setBuyerName(order.get$buyerId());
|
|
|
+ order.setDocumenterName(order.get$documenterId());
|
|
|
+ orderService.updateById(order);
|
|
|
return order;
|
|
|
}
|
|
|
|