Files
klp-oa/klp-crm/src/main/java/com/klp/crm/controller/CrmOrderItemController.java
Joshi 002ac3f3ab refactor(crm): 统一配卷查询接口并增加筛选功能
- 将所有配卷查询接口统一为POST + Body BO方式
- 为配卷查询添加钢卷号、材料类型、质量状态、发货状态筛选条件
- 在合同详情页面为生产成果和发货配卷添加筛选表单
- 在订单页面为发货配卷添加筛选功能
- 在销售员页面为生产成果和计划发货添加筛选功能
- 更新异议管理页面的配卷查询参数结构
- 增加订单ID参数用于合同ID相关查询的兼容性处理
2026-07-09 19:01:36 +08:00

227 lines
9.4 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.domain.bo.OrderCoilQueryBo;
import com.klp.crm.domain.bo.SalesmanCoilQueryBo;
import com.klp.crm.domain.bo.ContractCoilQueryBo;
import com.klp.crm.service.ICrmOrderItemService;
import com.klp.domain.vo.WmsMaterialCoilVo;
import com.klp.domain.bo.WmsMaterialCoilBo;
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));
}
// ==================== 钢卷查询(统一使用 POST + RequestBody BO ====================
/**
* 根据订单ID分页查询发货配卷支持钢卷信息筛选
*/
@PostMapping("/coils/order/query")
public TableDataInfo<WmsMaterialCoilVo> getCoilsByOrderId(@RequestBody @Validated OrderCoilQueryBo bo) {
return iCrmOrderItemService.queryCoilsByOrderId(bo.getOrderId(), toPageQuery(bo), bo.getCoilBo());
}
/**
* 根据销售员分页查询生产成果,支持钢卷信息筛选
*/
@PostMapping("/coils/salesman/query")
public TableDataInfo<WmsMaterialCoilVo> getCoilsBySalesman(@RequestBody @Validated SalesmanCoilQueryBo bo) {
return iCrmOrderItemService.queryCoilsBySalesman(bo.getSalesman(), toPageQuery(bo), bo.getCoilBo());
}
/**
* 根据合同ID分页查询生产成果支持钢卷信息筛选
*/
@PostMapping("/coils/contract/query")
public TableDataInfo<WmsMaterialCoilVo> getCoilsByContractIdPaginated(@RequestBody @Validated ContractCoilQueryBo bo) {
return iCrmOrderItemService.queryCoilsByContractIdPaginated(bo.getOrderId(), toPageQuery(bo), bo.getCoilBo());
}
/**
* 根据订单ID统计配卷汇总支持钢卷信息筛选
*/
@PostMapping("/coils/order/statistics")
public R<java.util.Map<String, java.math.BigDecimal>> getCoilsByOrderIdStatistics(@RequestBody @Validated OrderCoilQueryBo bo) {
return R.ok(iCrmOrderItemService.queryCoilsByOrderIdStatistics(bo.getOrderId(), bo.getCoilBo()));
}
/**
* 根据销售员统计生产成果汇总,支持钢卷信息筛选
*/
@PostMapping("/coils/salesman/statistics")
public R<java.util.Map<String, java.math.BigDecimal>> getCoilsBySalesmanStatistics(@RequestBody @Validated SalesmanCoilQueryBo bo) {
return R.ok(iCrmOrderItemService.queryCoilsBySalesmanStatistics(bo.getSalesman(), bo.getCoilBo()));
}
/**
* 根据合同ID统计生产成果汇总支持钢卷信息筛选
*/
@PostMapping("/coils/contract/statistics")
public R<java.util.Map<String, java.math.BigDecimal>> getCoilsByContractIdStatistics(@RequestBody @Validated ContractCoilQueryBo bo) {
return R.ok(iCrmOrderItemService.queryCoilsByContractIdStatistics(bo.getOrderId(), bo.getCoilBo()));
}
// ==================== 已有接口 ====================
// 根据合同id查询发货单据中的配卷。
@GetMapping("/coils/contract/{contractId}")
public R<List<WmsMaterialCoilVo>> getCoilsByContractId(@NotNull(message = "合同ID不能为空")
@PathVariable Long orderId) {
return R.ok(iCrmOrderItemService.queryCoilsByContractId(orderId));
}
// 根据客户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));
}
// ==================== 私有辅助方法 ====================
private PageQuery toPageQuery(OrderCoilQueryBo bo) { return buildPageQuery(bo.getPageNum(), bo.getPageSize()); }
private PageQuery toPageQuery(SalesmanCoilQueryBo bo) { return buildPageQuery(bo.getPageNum(), bo.getPageSize()); }
private PageQuery toPageQuery(ContractCoilQueryBo bo) { return buildPageQuery(bo.getPageNum(), bo.getPageSize()); }
private PageQuery buildPageQuery(Integer pageNum, Integer pageSize) {
PageQuery pageQuery = new PageQuery();
pageQuery.setPageNum(pageNum);
pageQuery.setPageSize(pageSize);
return pageQuery;
}
}