| | |
| | | import cn.iocoder.yudao.module.crm.enums.common.CrmAuditStatusEnum; |
| | | import cn.iocoder.yudao.module.mdm.api.item.MdmItemApi; |
| | | import cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemRespDTO; |
| | | import cn.iocoder.yudao.module.mdm.api.unit.MdmUnitMeasureApi; |
| | | import cn.iocoder.yudao.module.mdm.api.unit.dto.MdmUnitMeasureRespDTO; |
| | | import cn.iocoder.yudao.module.crm.service.business.CrmBusinessService; |
| | | import cn.iocoder.yudao.module.crm.service.contact.CrmContactService; |
| | | import cn.iocoder.yudao.module.crm.service.contract.CrmContractService; |
| | |
| | | |
| | | @Resource |
| | | private MdmItemApi mdmItemApi; |
| | | @Resource |
| | | private MdmUnitMeasureApi mdmUnitMeasureApi; |
| | | |
| | | @Resource |
| | | private AdminUserApi adminUserApi; |
| | |
| | | contractVO.setProducts(BeanUtils.toBean(businessProducts, CrmContractRespVO.Product.class, businessProductVO -> |
| | | MapUtils.findAndThen(itemMap, businessProductVO.getItemId(), |
| | | item -> businessProductVO.setItemCode(item.getCode()) |
| | | .setItemName(item.getName()).setItemBarCode(item.getBarCode())))); |
| | | .setItemName(item.getName()).setBarCode(item.getBarCode()) |
| | | .setItemSpecification(item.getSpecification())))); |
| | | // 拼接计量单位名称 |
| | | Map<Long, MdmUnitMeasureRespDTO> unitMap = mdmUnitMeasureApi.getUnitMeasureMap( |
| | | convertSet(businessProducts, CrmContractProductDO::getItemUnitId)); |
| | | contractVO.getProducts().forEach(product -> MapUtils.findAndThen(unitMap, product.getItemUnitId(), |
| | | unit -> product.setItemUnitName(unit.getName()))); |
| | | return contractVO; |
| | | } |
| | | |
| | | @GetMapping("/download-document") |
| | | @Operation(summary = "按购销合同模板下载合同 Word 文件") |
| | | @PreAuthorize("@ss.hasPermission('crm:contract:query')") |
| | | public void downloadDocument(@RequestParam("id") Long id, HttpServletResponse response) throws IOException { |
| | | // getContract 包含合同数据权限校验;沿用详情页的产品、单位和客户信息。 |
| | | CrmContractRespVO contract = buildContractDetail(contractService.getContract(id)); |
| | | Assert.notNull(contract, "合同不存在"); |
| | | byte[] content = cn.iocoder.yudao.module.crm.service.contract.CrmContractDocumentRenderer.render(contract); |
| | | String filename = "购销合同-" + contract.getNo() + ".docx"; |
| | | response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document"); |
| | | response.setHeader("Cache-Control", "no-store"); |
| | | response.setHeader("Content-Disposition", "attachment; filename*=UTF-8''" + java.net.URLEncoder.encode(filename, java.nio.charset.StandardCharsets.UTF_8).replace("+", "%20")); |
| | | response.setContentLength(content.length); |
| | | response.getOutputStream().write(content); |
| | | } |
| | | |
| | | @GetMapping("/page") |
| | |
| | | @ApiAccessLog(operateType = EXPORT) |
| | | public void exportContractExcel(@Valid CrmContractPageReqVO exportReqVO, |
| | | HttpServletResponse response) throws IOException { |
| | | exportReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); // 不分页,导出全部符合条件的合同 |
| | | PageResult<CrmContractDO> pageResult = contractService.getContractPage(exportReqVO, getLoginUserId()); |
| | | // 拼接客户、商机、签约人、回款金额等关联信息 |
| | | List<CrmContractRespVO> list = buildContractDetailList(pageResult.getList()); |
| | |
| | | .orderDate("2026-01-01 10:00:00").startTime("2026-01-01").endTime("2026-12-31") |
| | | .discountPercent(new BigDecimal("0")).depositPrice(new BigDecimal("0")) |
| | | .productCode("ITEM001").productName("示例产品A") |
| | | .count(100).contractPrice(new BigDecimal("20.00")).remark("示例数据,导入前请替换") |
| | | .count(new BigDecimal("100")).contractPrice(new BigDecimal("20.00")).remark("示例数据,导入前请替换") |
| | | .build()); |
| | | ExcelUtils.write(response, "合同导入模板.xls", "合同", CrmContractImportExcelVO.class, list); |
| | | } |
| | |
| | | @Operation(summary = "导入合同") |
| | | @PreAuthorize("@ss.hasPermission('crm:contract:import')") |
| | | public CommonResult<CrmContractImportRespVO> importContractExcel(@RequestParam("file") MultipartFile file) throws Exception { |
| | | List<CrmContractImportExcelVO> list = ExcelUtils.read(file, CrmContractImportExcelVO.class); |
| | | // readFlat:把纵向合并单元格(同一张合同的多行明细)拉平,否则除首行外的主表字段会读不到 |
| | | List<CrmContractImportExcelVO> list = ExcelUtils.readFlat(file, CrmContractImportExcelVO.class); |
| | | return success(contractService.importContractList(list)); |
| | | } |
| | | |