Commit f3918b9d by 杨浩

导出客户中订单子项目 Excel

parent 7a758668
package cn.iocoder.foodnexus.module.order.controller.admin.customerorder;
import cn.iocoder.foodnexus.framework.common.exception.ServiceException;
import cn.iocoder.foodnexus.framework.common.util.CommonUtil;
import cn.iocoder.foodnexus.framework.common.util.collection.MapUtils;
import cn.iocoder.foodnexus.framework.common.util.number.MoneyUtils;
import cn.iocoder.foodnexus.module.erp.api.service.ErpCustomerApi;
import cn.iocoder.foodnexus.module.order.api.CustomerOrderApi;
import cn.iocoder.foodnexus.module.order.controller.admin.customerorderitem.vo.CustomerOrderItemExcelVO;
import cn.iocoder.foodnexus.module.order.controller.admin.customerorderitem.vo.CustomerOrderItemRespVO;
import cn.iocoder.foodnexus.module.order.dal.dataobject.customerorderitem.CustomerOrderItemDO;
import cn.iocoder.foodnexus.module.order.service.customerorderitem.CustomerOrderItemService;
import cn.iocoder.foodnexus.module.order.service.customerorderrecord.CustomerOrderRecordService;
import cn.iocoder.foodnexus.module.system.service.dept.DeptService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.security.core.parameters.P;
import org.springframework.web.bind.annotation.*;
import jakarta.annotation.Resource;
import org.springframework.validation.annotation.Validated;
......@@ -19,16 +23,18 @@ import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Operation;
import jakarta.validation.constraints.*;
import jakarta.validation.*;
import jakarta.servlet.http.*;
import java.util.*;
import java.io.IOException;
import java.util.concurrent.atomic.AtomicReference;
import cn.iocoder.foodnexus.framework.common.pojo.PageParam;
import cn.iocoder.foodnexus.framework.common.pojo.PageResult;
import cn.iocoder.foodnexus.framework.common.pojo.CommonResult;
import cn.iocoder.foodnexus.framework.common.util.object.BeanUtils;
import static cn.iocoder.foodnexus.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.foodnexus.framework.common.pojo.CommonResult.success;
import cn.iocoder.foodnexus.framework.excel.core.util.ExcelUtils;
......@@ -49,6 +55,9 @@ public class CustomerOrderController {
@Resource
private CustomerOrderService customerOrderService;
@Resource
private CustomerOrderItemService customerOrderItemService;
@Autowired
private CustomerOrderApi customerOrderApi;
......@@ -116,6 +125,77 @@ public class CustomerOrderController {
return success(customerOrderRecordService.queryRecordMap(id));
}
@GetMapping("/item/export-excel")
@Operation(summary = "导出客户中订单子项目 Excel")
@PreAuthorize("@ss.hasPermission('order:customer-order:export')")
@ApiAccessLog(operateType = EXPORT)
public void exportCustomerOrderItemExcel(@Valid CustomerOrderPageReqVO pageReqVO,
HttpServletResponse response) throws IOException {
if (CommonUtil.isEmpty(pageReqVO.getCreateYearMonth())) {
throw exception("月份信息不能为空");
}
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<CustomerOrderDO> list = customerOrderService.getCustomerOrderPage(pageReqVO).getList();
if (CommonUtil.isEmpty(list)) {
return ;
}
List<CustomerOrderItemExcelVO> itemExcelList = new ArrayList<>();
AtomicReference<Integer> allSignedTotal = new AtomicReference<>(0);
AtomicReference<Integer> allReturnsTotal = new AtomicReference<>(0);
AtomicReference<Integer> allOrderItemTotal = new AtomicReference<>(0);
for (CustomerOrderDO order : list) {
List<CustomerOrderItemDO> customerOrderItems = customerOrderItemService.queryByOrderId(order.getId());
if (CommonUtil.isEmpty(customerOrderItems)) {
continue;
}
AtomicReference<Integer> signedTotal = new AtomicReference<>(0);
AtomicReference<Integer> returnsTotal = new AtomicReference<>(0);
AtomicReference<Integer> orderItemTotal = new AtomicReference<>(0);
List<CustomerOrderItemExcelVO> excelList = BeanUtils.toBean(customerOrderItems, CustomerOrderItemExcelVO.class, item -> {
item.setOrderCode(order.getCode());
item.setCreateDate(item.getCreateTime().toLocalDate());
item.setIntroduction(item.getProductInfo().getIntroduction());
item.setUnitName(item.getProductInfo().getUnitName());
signedTotal.updateAndGet(v -> v + item.getSignedTotal());
returnsTotal.updateAndGet(v -> v + item.getReturnsTotal());
orderItemTotal.updateAndGet(v -> v + item.getOrderItemTotal());
allSignedTotal.updateAndGet(v -> v + item.getSignedTotal());
allReturnsTotal.updateAndGet(v -> v + item.getReturnsTotal());
allOrderItemTotal.updateAndGet(v -> v + item.getOrderItemTotal());
});
itemExcelList.addAll(excelList);
CustomerOrderItemExcelVO totalItem = new CustomerOrderItemExcelVO();
totalItem.setSignedTotal(signedTotal.get());
totalItem.setReturnsTotal(returnsTotal.get());
totalItem.setOrderItemTotal(orderItemTotal.get());
itemExcelList.add(totalItem);
}
if (CommonUtil.isNotEmpty(itemExcelList)) {
// 处理金额
// 计算汇总
for (CustomerOrderItemExcelVO item : itemExcelList) {
item.setSignedTotalYuan(MoneyUtils.fenToYuan(item.getSignedTotal()));
item.setReturnsTotalYuan(MoneyUtils.fenToYuan(item.getReturnsTotal()));
item.setOrderItemPriceYuan(MoneyUtils.fenToYuan(item.getOrderItemPrice()));
item.setOrderItemTotalYuan(MoneyUtils.fenToYuan(item.getOrderItemTotal()));
}
CustomerOrderItemExcelVO totalItem = new CustomerOrderItemExcelVO();
totalItem.setSignedTotal(allSignedTotal.get());
totalItem.setReturnsTotal(allReturnsTotal.get());
totalItem.setOrderItemTotal(allOrderItemTotal.get());
totalItem.setSignedTotalYuan(MoneyUtils.fenToYuan(allSignedTotal.get()));
totalItem.setReturnsTotalYuan(MoneyUtils.fenToYuan(allReturnsTotal.get()));
totalItem.setOrderItemTotalYuan(MoneyUtils.fenToYuan(allOrderItemTotal.get()));
itemExcelList.add(totalItem);
}
ExcelUtils.write(response, pageReqVO.getCreateYearMonth() + "客户对账.xls", pageReqVO.getCreateYearMonth() + "汇总表", CustomerOrderItemExcelVO.class, itemExcelList);
}
@GetMapping("/export-excel")
@Operation(summary = "导出客户总订单 Excel")
@PreAuthorize("@ss.hasPermission('order:customer-order:export')")
......
package cn.iocoder.foodnexus.module.order.controller.admin.customerorderitem.vo;
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
import cn.idev.excel.annotation.ExcelProperty;
import cn.iocoder.foodnexus.module.order.dto.CustomerOrderRemark;
import cn.iocoder.foodnexus.module.product.api.dto.ProductInfo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
@Schema(description = "管理后台 - 客户订单-子订单 Response VO")
@Data
@ExcelIgnoreUnannotated
public class CustomerOrderItemExcelVO {
@Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "22980")
private Long id;
@Schema(description = "客户订单id", requiredMode = Schema.RequiredMode.REQUIRED, example = "15521")
private Long orderId;
@ExcelProperty("订单编号")
private String orderCode;
@ExcelProperty("日期")
private LocalDate createDate;
@Schema(description = "商品id", requiredMode = Schema.RequiredMode.REQUIRED, example = "9665")
@ExcelProperty("商品编号")
private Long productId;
@Schema(description = "商品名称", example = "李四")
@ExcelProperty("商品名称")
private String productName;
@Schema(description = "商品信息")
private ProductInfo productInfo;
@ExcelProperty("商品规格")
private String introduction;
@ExcelProperty("商品单位")
private String unitName;
@Schema(description = "客户下单备注")
@ExcelProperty("下单备注")
private String customerRemark;
@Schema(description = "签收数量", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("签收数量")
private BigDecimal signedQuantity;
@Schema(description = "签收总价,单位:分", requiredMode = Schema.RequiredMode.REQUIRED)
// @ExcelProperty("签收总价,单位:分")
private Integer signedTotal;
@ExcelProperty("签收总价")
private BigDecimal signedTotalYuan;
@Schema(description = "退货数量")
@ExcelProperty("退货数量")
private BigDecimal returnsQuantity;
// @ExcelProperty("退货总价,单位:分")
private Integer returnsTotal;
@ExcelProperty("退货总价")
private BigDecimal returnsTotalYuan;
@Schema(description = "订单商品数量", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("下单数量")
private Integer orderItemQuantity;
@Schema(description = "订单商品单价,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "29922")
// @ExcelProperty("订单商品单价,单位:分")
private Integer orderItemPrice;
@ExcelProperty("订单商品单价")
private BigDecimal orderItemPriceYuan;
@Schema(description = "订单商品总价,单位:分", requiredMode = Schema.RequiredMode.REQUIRED)
// @ExcelProperty("订单商品总价,单位:分")
private Integer orderItemTotal;
@ExcelProperty("订单商品总价")
private BigDecimal orderItemTotalYuan;
private LocalDateTime createTime;
}
\ No newline at end of file
......@@ -47,19 +47,19 @@ spring:
primary: master
datasource:
master:
url: jdbc:mysql://10.128.19.99:3316/foodnexus?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X 连接的示例
url: jdbc:mysql://10.212.49.66:3316/foodnexus?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X 连接的示例
username: foodnexus
password: X6e3ztPiWTzJpwz3
slave: # 模拟从库,可根据自己需要修改 # 模拟从库,可根据自己需要修改
lazy: true # 开启懒加载,保证启动速度
url: jdbc:mysql://10.128.19.99:3316/foodnexus?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X 连接的示例
url: jdbc:mysql://10.212.49.66:3316/foodnexus?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X 连接的示例
username: foodnexus
password: X6e3ztPiWTzJpwz3
# Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
data:
redis:
host: 10.128.19.99 # 地址
host: 10.212.49.66 # 地址
port: 16379 # 端口
database: 9 # 数据库索引
password: 'd43ed845' # 密码,建议生产环境开启
......
......@@ -3,7 +3,7 @@ spring:
name: foodnexus-server
profiles:
active: local
active: pro
main:
allow-circular-references: true # 允许循环依赖,因为项目是三层架构,无法避免这个情况。
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment