|
|
@@ -1,9 +1,11 @@
|
|
|
package org.springblade.purchase.sales.export;
|
|
|
|
|
|
+import com.alibaba.fastjson.JSON;
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
|
|
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
|
|
|
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
|
|
|
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
|
|
|
import com.trade.purchase.order.enums.OrderTypeEnum;
|
|
|
import io.swagger.annotations.Api;
|
|
|
@@ -13,6 +15,7 @@ import lombok.AllArgsConstructor;
|
|
|
import org.springblade.client.entity.CorpsDesc;
|
|
|
import org.springblade.client.feign.ICorpsDescClient;
|
|
|
import org.springblade.core.boot.ctrl.BladeController;
|
|
|
+import org.springblade.core.excel.util.ExcelUtil;
|
|
|
import org.springblade.core.mp.support.Condition;
|
|
|
import org.springblade.core.mp.support.Query;
|
|
|
import org.springblade.core.secure.utils.SecureUtil;
|
|
|
@@ -25,6 +28,7 @@ import org.springblade.finance.vojo.Acc;
|
|
|
import org.springblade.purchase.sales.entity.Order;
|
|
|
import org.springblade.purchase.sales.entity.OrderFees;
|
|
|
import org.springblade.purchase.sales.entity.OrderItems;
|
|
|
+import org.springblade.purchase.sales.excel.ProfitItemExcel;
|
|
|
import org.springblade.purchase.sales.service.*;
|
|
|
import org.springblade.purchase.sales.vo.OrderItemsVO;
|
|
|
import org.springblade.purchase.sales.vo.OrderVO;
|
|
|
@@ -32,8 +36,10 @@ import org.springblade.system.user.entity.User;
|
|
|
import org.springblade.system.user.feign.IUserClient;
|
|
|
import org.springframework.web.bind.annotation.*;
|
|
|
|
|
|
+import javax.servlet.http.HttpServletResponse;
|
|
|
import javax.validation.Valid;
|
|
|
import java.math.BigDecimal;
|
|
|
+import java.util.ArrayList;
|
|
|
import java.util.List;
|
|
|
|
|
|
/**
|
|
|
@@ -291,10 +297,13 @@ public class ExportOrderController extends BladeController {
|
|
|
@ApiOperationSupport(order = 11)
|
|
|
@ApiOperation(value = "销售利润", notes = "传入order")
|
|
|
public R<IPage<Order>> profit(OrderVO order, Query query) {
|
|
|
+ if (StringUtils.isBlank(order.getBillType())){
|
|
|
+ throw new SecurityException("请选择查询订单类型");
|
|
|
+ }
|
|
|
LambdaQueryWrapper<Order> lambdaQueryWrapper = new LambdaQueryWrapper<>();
|
|
|
lambdaQueryWrapper.eq(Order::getTenantId,SecureUtil.getTenantId());//租户id
|
|
|
lambdaQueryWrapper.eq(Order::getIsDeleted,0);//订单是否有效
|
|
|
- lambdaQueryWrapper.eq(Order::getBillType,OrderTypeEnum.SALES.getType());//订单类型
|
|
|
+ lambdaQueryWrapper.eq(Order::getBillType,order.getBillType());//订单类型
|
|
|
lambdaQueryWrapper.eq(Order::getTradeType,OrderTypeEnum.EXPORT.getType());//贸易类型
|
|
|
lambdaQueryWrapper.like(Func.isNotEmpty(order.getOrderNo()),Order::getOrderNo,order.getOrderNo());//订单号
|
|
|
lambdaQueryWrapper.like(Func.isNotEmpty(order.getCorpId()),Order::getCorpId,order.getCorpId());//客户id
|
|
|
@@ -356,4 +365,69 @@ public class ExportOrderController extends BladeController {
|
|
|
}
|
|
|
return R.data(orderItemsService.getProfitItem(order.getId()));
|
|
|
}
|
|
|
+ /**
|
|
|
+ * 销售利润
|
|
|
+ */
|
|
|
+ @GetMapping("/exportProfit")
|
|
|
+ @ApiOperationSupport(order = 13)
|
|
|
+ @ApiOperation(value = "销售利润", notes = "传入order")
|
|
|
+ public void exportProfit(OrderVO order, Query query, HttpServletResponse response) {
|
|
|
+ if (StringUtils.isBlank(order.getBillType())){
|
|
|
+ throw new SecurityException("请选择查询订单类型");
|
|
|
+ }
|
|
|
+ List<ProfitItemExcel> profitItemExcelList = new ArrayList<>();
|
|
|
+ LambdaQueryWrapper<Order> lambdaQueryWrapper = new LambdaQueryWrapper<>();
|
|
|
+ lambdaQueryWrapper.eq(Order::getTenantId,SecureUtil.getTenantId());//租户id
|
|
|
+ lambdaQueryWrapper.eq(Order::getIsDeleted,0);//订单是否有效
|
|
|
+ lambdaQueryWrapper.eq(Order::getBillType,order.getBillType());//订单类型
|
|
|
+ lambdaQueryWrapper.eq(Order::getTradeType,OrderTypeEnum.EXPORT.getType());//贸易类型
|
|
|
+ lambdaQueryWrapper.like(Func.isNotEmpty(order.getOrderNo()),Order::getOrderNo,order.getOrderNo());//订单号
|
|
|
+ lambdaQueryWrapper.like(Func.isNotEmpty(order.getCorpId()),Order::getCorpId,order.getCorpId());//客户id
|
|
|
+ lambdaQueryWrapper.ge(Func.isNotEmpty(order.getContractStartDate()),Order::getBusinesDate,order.getContractStartDate());//合同日期开始
|
|
|
+ lambdaQueryWrapper.le(Func.isNotEmpty(order.getContractEndDate()),Order::getBusinesDate,order.getContractEndDate());//合同日期结束
|
|
|
+ lambdaQueryWrapper.like(Func.isNotEmpty(order.getPortOfLoad()),Order::getPortOfLoad,order.getPortOfLoad());//装货港
|
|
|
+ lambdaQueryWrapper.like(Func.isNotEmpty(order.getPortOfDestination()),Order::getPortOfDestination,order.getPortOfDestination());//目的港
|
|
|
+ lambdaQueryWrapper.like(Func.isNotEmpty(order.getOrderRemark()),Order::getOrderRemark,order.getOrderRemark());//备注
|
|
|
+ lambdaQueryWrapper.orderByDesc(Order::getId);
|
|
|
+ IPage<Order> page = orderService.page(Condition.getPage(query), lambdaQueryWrapper);
|
|
|
+ if (CollectionUtils.isNotEmpty(page.getRecords())){
|
|
|
+ page.getRecords().stream().forEach(item ->{
|
|
|
+ if (item.getCorpId() != null){
|
|
|
+ R<CorpsDesc> corpMessage = corpsDescClient.getCorpMessage(item.getCorpId());//客户
|
|
|
+ if (corpMessage.isSuccess() && corpMessage.getData() != null){
|
|
|
+ item.setCorpsName(corpMessage.getData().getCname());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //获取订单明细
|
|
|
+ List<OrderItems> list = orderItemsService.list(new QueryWrapper<OrderItems>().eq("pid", item.getId()).eq("is_deleted", 0).eq("tenant_id",item.getTenantId()));
|
|
|
+ if (CollectionUtils.isNotEmpty(list)){
|
|
|
+ item.setAmount(list.stream().filter(e -> e.getAmount() != null).map(OrderItems::getAmount).reduce(BigDecimal.ZERO,BigDecimal::add));//销售金额
|
|
|
+ item.setProcurementCost(list.stream().reduce(BigDecimal.ZERO,(x,y) ->{
|
|
|
+ return x.add(y.getPurchaseCost().multiply(y.getOrderQuantity()));
|
|
|
+ },BigDecimal::add));//采购成本和
|
|
|
+ item.setPurchasePrice(list.stream().reduce(BigDecimal.ZERO,(x,y) ->{
|
|
|
+ return x.add(y.getPurchaseAmount().multiply(y.getOrderQuantity()));
|
|
|
+ },BigDecimal::add));//采购报价金额和
|
|
|
+ }
|
|
|
+ //获取应收费用
|
|
|
+ List<OrderFees> orderFees = orderFeesService.list(new QueryWrapper<OrderFees>().eq("pid", item.getId()).eq("is_deleted", 0).eq("tenant_id", item.getTenantId()).eq("fees_type", 1));
|
|
|
+ //获取应付费用
|
|
|
+ List<OrderFees> orderFeesList = orderFeesService.list(new QueryWrapper<OrderFees>().eq("pid", item.getId()).eq("is_deleted", 0).eq("tenant_id", item.getTenantId()).eq("fees_type", 2));
|
|
|
+ if (CollectionUtils.isNotEmpty(orderFees)){
|
|
|
+ item.setFd(orderFees.stream().filter(e -> e.getAmount() != null).map(OrderFees::getAmount).reduce(BigDecimal.ZERO,BigDecimal::add));
|
|
|
+ }else {
|
|
|
+ item.setFd(BigDecimal.ZERO);
|
|
|
+ }
|
|
|
+ if (CollectionUtils.isNotEmpty(orderFeesList)){
|
|
|
+ item.setFc(orderFeesList.stream().filter(e -> e.getAmount() != null).map(OrderFees::getAmount).reduce(BigDecimal.ZERO,BigDecimal::add));
|
|
|
+ }else {
|
|
|
+ item.setFc(BigDecimal.ZERO);
|
|
|
+ }
|
|
|
+ //计算单票利润=单票利润+费用应收-费用应付
|
|
|
+ item.setSingleTicketMargin(item.getSingleTicketMargin().add(item.getFd()).subtract(item.getFc()));
|
|
|
+ });
|
|
|
+ profitItemExcelList = JSON.parseArray(JSON.toJSONString(page.getRecords()), ProfitItemExcel.class);
|
|
|
+ }
|
|
|
+ ExcelUtil.export(response, "销售利润", "销售利润", profitItemExcelList, ProfitItemExcel.class);
|
|
|
+ }
|
|
|
}
|