Files
klp-oa/klp-crm/src/main/java/com/klp/crm/controller/CrmOrderItemController.java
王文昊 93bb094566 feat: 新增合同、订单明细导出功能,补充业务员字段展示
1.  新增crm订单主、订单明细的导出接口,支持业务精简字段导出
2.  为订单明细VO新增业务员字段,关联查询订单表填充数据
3.  在订单列表页新增业务员表格列展示
4.  为合同编辑页、订单明细页添加导出按钮并实现导出逻辑
5.  新增导出专用的VO类,处理日期格式化和状态转文本
2026-07-06 17:19:49 +08:00

201 lines
8.8 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package com.klp.crm.controller;
import java.text.SimpleDateFormat;
import java.util.List;
import java.util.Arrays;
import java.util.stream.Collectors;
import cn.hutool.core.bean.BeanUtil;
import lombok.RequiredArgsConstructor;
import javax.servlet.http.HttpServletResponse;
import javax.validation.constraints.*;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import com.klp.common.annotation.RepeatSubmit;
import com.klp.common.annotation.Log;
import com.klp.common.core.controller.BaseController;
import com.klp.common.core.domain.PageQuery;
import com.klp.common.core.domain.R;
import com.klp.common.core.validate.AddGroup;
import com.klp.common.core.validate.EditGroup;
import com.klp.common.enums.BusinessType;
import com.klp.common.utils.poi.ExcelUtil;
import com.klp.crm.domain.vo.CrmOrderItemVo;
import com.klp.crm.domain.vo.CrmOrderItemExportVo;
import com.klp.crm.domain.vo.CrmContractOrderFinanceVo;
import com.klp.crm.domain.bo.CrmOrderItemBo;
import com.klp.crm.service.ICrmOrderItemService;
import com.klp.domain.vo.WmsMaterialCoilVo;
import com.klp.common.core.page.TableDataInfo;
/**
* 正式订单明细
*
* @author klp
* @date 2025-12-15
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/crm/orderItem")
public class CrmOrderItemController extends BaseController {
private final ICrmOrderItemService iCrmOrderItemService;
/**
* 查询正式订单明细列表
*/
@GetMapping("/list")
public TableDataInfo<CrmOrderItemVo> list(CrmOrderItemBo bo, PageQuery pageQuery) {
return iCrmOrderItemService.queryPageList(bo, pageQuery);
}
/**
* 导出正式订单明细列表
*/
@Log(title = "正式订单明细", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(CrmOrderItemBo bo, HttpServletResponse response) {
List<CrmOrderItemVo> list = iCrmOrderItemService.queryList(bo);
ExcelUtil.exportExcel(list, "正式订单明细", CrmOrderItemVo.class, response);
}
/**
* 导出正式订单明细列表(业务精简字段,用于订单明细列表页导出)
*/
@Log(title = "正式订单明细", businessType = BusinessType.EXPORT)
@PostMapping("/exportDetail")
public void exportDetail(@RequestBody CrmOrderItemBo bo, HttpServletResponse response) {
List<CrmOrderItemVo> list = iCrmOrderItemService.queryList(bo);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
List<CrmOrderItemExportVo> exportList = list.stream().map(vo -> {
CrmOrderItemExportVo export = new CrmOrderItemExportVo();
BeanUtil.copyProperties(vo, export);
// 日期格式化
export.setSignTime(vo.getSignTime() != null ? sdf.format(vo.getSignTime()) : null);
// 展平 orderInfo 中的 salesman、orderCode、contractName
if (vo.getOrderInfo() != null) {
export.setSalesman(vo.getOrderInfo().getSalesman());
export.setOrderCode(vo.getOrderInfo().getOrderCode());
export.setContractName(vo.getOrderInfo().getContractName());
}
return export;
}).collect(Collectors.toList());
ExcelUtil.exportExcel(exportList, "订单明细列表", CrmOrderItemExportVo.class, response);
}
/**
* 获取正式订单明细详细信息
*
* @param itemId 主键
*/
@GetMapping("/{itemId}")
public R<CrmOrderItemVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable String itemId) {
return R.ok(iCrmOrderItemService.queryById(itemId));
}
/**
* 新增正式订单明细
*/
@Log(title = "正式订单明细", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<CrmOrderItemVo> add(@Validated(AddGroup.class) @RequestBody CrmOrderItemBo bo) {
return R.ok(iCrmOrderItemService.insertByBo(bo));
}
/**
* 修改正式订单明细
*/
@Log(title = "正式订单明细", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody CrmOrderItemBo bo) {
return toAjax(iCrmOrderItemService.updateByBo(bo));
}
/**
* 删除正式订单明细
*
* @param itemIds 主键串
*/
@Log(title = "正式订单明细", businessType = BusinessType.DELETE)
@DeleteMapping("/{itemIds}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable String[] itemIds) {
return toAjax(iCrmOrderItemService.deleteWithValidByIds(Arrays.asList(itemIds), true));
}
// 根据合同id查询该合同下属订单关联的异议和财务信息。。
@GetMapping("/contractFinance/{contractId}")
public R<CrmContractOrderFinanceVo> getContractFinance(@NotNull(message = "合同ID不能为空")
@PathVariable Long contractId) {
return R.ok(iCrmOrderItemService.queryFinanceAndObjectionByContractId(contractId));
}
// 根据订单id查询发货单据中的配卷分页
@GetMapping("/coils/order/{orderId}")
public TableDataInfo<WmsMaterialCoilVo> getCoilsByOrderId(@NotNull(message = "订单ID不能为空")
@PathVariable Long orderId,
PageQuery pageQuery) {
return iCrmOrderItemService.queryCoilsByOrderId(orderId, pageQuery);
}
// 根据合同id查询发货单据中的配卷。
@GetMapping("/coils/contract/{contractId}")
public R<List<WmsMaterialCoilVo>> getCoilsByContractId(@NotNull(message = "合同ID不能为空")
@PathVariable Long contractId) {
return R.ok(iCrmOrderItemService.queryCoilsByContractId(contractId));
}
// 根据客户id查询该客户下属订单关联的异议和财务信息。
@GetMapping("/customerFinance/{customerId}")
public R<CrmContractOrderFinanceVo> getCustomerFinance(@NotNull(message = "客户ID不能为空")
@PathVariable String customerId) {
return R.ok(iCrmOrderItemService.queryFinanceAndObjectionByCustomerId(customerId));
}
// 根据客户id查询发货单据中的配卷。
@GetMapping("/coils/customer/{customerId}")
public R<List<WmsMaterialCoilVo>> getCoilsByCustomerId(@NotNull(message = "客户ID不能为空")
@PathVariable String customerId) {
return R.ok(iCrmOrderItemService.queryCoilsByCustomerId(customerId));
}
// 根据销售员查询生产成果(钢卷列表),分页
@GetMapping("/coils/bySalesman")
public TableDataInfo<WmsMaterialCoilVo> getCoilsBySalesman(@RequestParam String salesman,
PageQuery pageQuery) {
return iCrmOrderItemService.queryCoilsBySalesman(salesman, pageQuery);
}
// 根据合同ID查询生产成果钢卷列表分页
@GetMapping("/coils/byContract/{contractId}")
public TableDataInfo<WmsMaterialCoilVo> getCoilsByContractIdPaginated(@NotNull(message = "合同ID不能为空")
@PathVariable Long contractId,
PageQuery pageQuery) {
return iCrmOrderItemService.queryCoilsByContractIdPaginated(contractId, pageQuery);
}
// 根据订单ID统计配卷汇总
@GetMapping("/coils/order/{orderId}/statistics")
public R<java.util.Map<String, java.math.BigDecimal>> getCoilsByOrderIdStatistics(@NotNull(message = "订单ID不能为空")
@PathVariable Long orderId) {
return R.ok(iCrmOrderItemService.queryCoilsByOrderIdStatistics(orderId));
}
// 根据销售员统计生产成果汇总
@GetMapping("/coils/bySalesman/statistics")
public R<java.util.Map<String, java.math.BigDecimal>> getCoilsBySalesmanStatistics(@RequestParam String salesman) {
return R.ok(iCrmOrderItemService.queryCoilsBySalesmanStatistics(salesman));
}
// 根据合同ID统计生产成果汇总
@GetMapping("/coils/byContract/{contractId}/statistics")
public R<java.util.Map<String, java.math.BigDecimal>> getCoilsByContractIdStatistics(@NotNull(message = "合同ID不能为空")
@PathVariable Long contractId) {
return R.ok(iCrmOrderItemService.queryCoilsByContractIdStatistics(contractId));
}
}