package cn.iocoder.yudao.module.erp.controller.admin.purchase; import cn.hutool.core.collection.CollUtil; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageParam; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.collection.MapUtils; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; import cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.contract.ErpSupplierContractPageReqVO; import cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.contract.ErpSupplierContractRespVO; import cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.contract.ErpSupplierContractSaveReqVO; import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseOrderDO; import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpSupplierContractDO; import cn.iocoder.yudao.module.erp.dal.mysql.purchase.ErpPurchaseOrderMapper; import cn.iocoder.yudao.module.erp.service.purchase.ErpSupplierContractService; import cn.iocoder.yudao.module.srm.api.supplier.SrmSupplierApi; import cn.iocoder.yudao.module.srm.api.supplier.dto.SrmSupplierRespDTO; import cn.iocoder.yudao.module.system.api.storage.StorageAttachmentApi; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.Valid; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import java.io.IOException; import java.math.BigDecimal; import java.util.Collection; import java.util.List; import java.util.Map; import java.util.stream.Collectors; import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; @Tag(name = "管理后台 - ERP 供应商合同") @RestController @RequestMapping("/erp/supplier-contract") @Validated public class ErpSupplierContractController { @Resource private ErpSupplierContractService contractService; @Resource private ErpPurchaseOrderMapper purchaseOrderMapper; @Resource private StorageAttachmentApi storageAttachmentApi; @Resource private SrmSupplierApi srmSupplierApi; @PostMapping("/create") @Operation(summary = "创建供应商合同") @PreAuthorize("@ss.hasPermission('erp:supplier-contract:create')") public CommonResult createContract(@Valid @RequestBody ErpSupplierContractSaveReqVO createReqVO) { return success(contractService.createContract(createReqVO)); } @PutMapping("/update") @Operation(summary = "更新供应商合同") @PreAuthorize("@ss.hasPermission('erp:supplier-contract:update')") public CommonResult updateContract(@Valid @RequestBody ErpSupplierContractSaveReqVO updateReqVO) { contractService.updateContract(updateReqVO); return success(true); } @DeleteMapping("/delete") @Operation(summary = "删除供应商合同") @Parameter(name = "id", description = "编号", required = true) @PreAuthorize("@ss.hasPermission('erp:supplier-contract:delete')") public CommonResult deleteContract(@RequestParam("id") Long id) { contractService.deleteContract(id); return success(true); } @GetMapping("/get") @Operation(summary = "获得供应商合同") @Parameter(name = "id", description = "编号", required = true, example = "1024") @PreAuthorize("@ss.hasPermission('erp:supplier-contract:query')") public CommonResult getContract(@RequestParam("id") Long id) { ErpSupplierContractDO contract = contractService.getContract(id); if (contract == null) { return success(null); } ErpSupplierContractRespVO respVO = buildRespList(java.util.Collections.singletonList(contract)).get(0); respVO.setAttachmentList(storageAttachmentApi.listAttachments("erp_supplier_contract", id)); return success(respVO); } @GetMapping("/page") @Operation(summary = "获得供应商合同分页") @PreAuthorize("@ss.hasPermission('erp:supplier-contract:query')") public CommonResult> getContractPage( @Valid ErpSupplierContractPageReqVO pageReqVO) { PageResult pageResult = contractService.getContractPage(pageReqVO); return success(new PageResult<>(buildRespList(pageResult.getList()), pageResult.getTotal())); } @GetMapping("/list-by-supplier") @Operation(summary = "获得指定供应商的合同列表", description = "采购订单关联合同时使用,返回采购合同与合同模板") @Parameter(name = "supplierId", description = "供应商编号", required = true, example = "1") @PreAuthorize("@ss.hasPermission('erp:supplier-contract:query')") public CommonResult> getContractListBySupplier( @RequestParam("supplierId") Long supplierId) { return success(buildRespList(contractService.getContractListBySupplierId(supplierId))); } @GetMapping("/export-excel") @Operation(summary = "导出供应商合同 Excel") @PreAuthorize("@ss.hasPermission('erp:supplier-contract:export')") @ApiAccessLog(operateType = EXPORT) public void exportContractExcel(@Valid ErpSupplierContractPageReqVO pageReqVO, HttpServletResponse response) throws IOException { pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); List list = contractService.getContractPage(pageReqVO).getList(); ExcelUtils.write(response, "供应商合同.xls", "数据", ErpSupplierContractRespVO.class, buildRespList(list)); } // ==================== 拼接 VO ==================== private List buildRespList(List list) { if (CollUtil.isEmpty(list)) { return java.util.Collections.emptyList(); } // 供应商名称:批量查询后回填,避免逐行查库 Map supplierMap = getSupplierMap( list.stream().map(ErpSupplierContractDO::getSupplierId) .filter(java.util.Objects::nonNull) .collect(Collectors.toSet())); List result = new java.util.ArrayList<>(list.size()); for (ErpSupplierContractDO contract : list) { result.add(buildResp(contract, supplierMap)); } return result; } private ErpSupplierContractRespVO buildResp(ErpSupplierContractDO contract, Map supplierMap) { ErpSupplierContractRespVO vo = BeanUtils.toBean(contract, ErpSupplierContractRespVO.class); // 供应商名称(列表、详情、导出都要反显,否则供应商列是空的) MapUtils.findAndThen(supplierMap, vo.getSupplierId(), supplier -> vo.setSupplierName(supplier.getName())); // 执行进度:关联的采购订单数量与金额合计 List orders = purchaseOrderMapper.selectListByContractId(contract.getId()); vo.setOrderCount(orders.size()); vo.setOrderAmount(orders.stream() .map(ErpPurchaseOrderDO::getTotalPrice) .filter(java.util.Objects::nonNull) .reduce(BigDecimal.ZERO, BigDecimal::add)); return vo; } private Map getSupplierMap(Collection supplierIds) { if (CollUtil.isEmpty(supplierIds)) { return java.util.Collections.emptyMap(); } return srmSupplierApi.getSupplierList(supplierIds).getCheckedData().stream() .collect(Collectors.toMap(SrmSupplierRespDTO::getId, v -> v, (a, b) -> a)); } }