package cn.iocoder.yudao.module.erp.controller.admin.purchase; import cn.hutool.core.collection.CollUtil; import cn.idev.excel.annotation.ExcelIgnoreUnannotated; import cn.idev.excel.annotation.ExcelProperty; import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; 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.module.erp.controller.admin.purchase.vo.demand.ErpPurchaseDemandPageReqVO; import cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.demand.ErpPurchaseDemandPurchaseRespVO; import cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.demand.ErpPurchaseDemandRespVO; import cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.demand.ErpPurchaseDemandSaveReqVO; import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseDemandDO; import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseDemandItemDO; import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseOrderDO; import cn.iocoder.yudao.module.erp.service.purchase.ErpPurchaseDemandService; 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.srm.api.supplier.SrmSupplierApi; import cn.iocoder.yudao.module.srm.api.supplier.dto.SrmSupplierRespDTO; 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 lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; 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.time.LocalDate; import java.time.LocalDateTime; import java.util.*; 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; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMultiMap; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; @Tag(name = "管理后台 - ERP 申请采购单(需求单)") @RestController @RequestMapping("/erp/purchase-demand") @Validated public class ErpPurchaseDemandController { @Resource private ErpPurchaseDemandService demandService; @Resource private SrmSupplierApi srmSupplierApi; @Resource private MdmItemApi mdmItemApi; @Resource private MdmUnitMeasureApi mdmUnitMeasureApi; @PostMapping("/create") @Operation(summary = "创建申请采购单") @PreAuthorize("@ss.hasPermission('erp:purchase-demand:create')") public CommonResult createDemand(@Valid @RequestBody ErpPurchaseDemandSaveReqVO createReqVO) { return success(demandService.createDemand(createReqVO)); } @PutMapping("/update") @Operation(summary = "更新申请采购单") @PreAuthorize("@ss.hasPermission('erp:purchase-demand:update')") public CommonResult updateDemand(@Valid @RequestBody ErpPurchaseDemandSaveReqVO updateReqVO) { demandService.updateDemand(updateReqVO); return success(true); } @DeleteMapping("/delete") @Operation(summary = "删除申请采购单") @Parameter(name = "id", description = "编号", required = true, example = "1024") @PreAuthorize("@ss.hasPermission('erp:purchase-demand:delete')") public CommonResult deleteDemand(@RequestParam("id") Long id) { demandService.deleteDemand(id); return success(true); } @GetMapping("/get") @Operation(summary = "获得申请采购单") @Parameter(name = "id", description = "编号", required = true, example = "1024") public CommonResult getDemand(@RequestParam("id") Long id) { ErpPurchaseDemandDO demand = demandService.getDemand(id); if (demand == null) { return success(null); } return success(buildRespList(Collections.singletonList(demand)).get(0)); } @GetMapping("/page") @Operation(summary = "获得申请采购单分页") public CommonResult> getDemandPage(@Valid ErpPurchaseDemandPageReqVO pageReqVO) { PageResult pageResult = demandService.getDemandPage(pageReqVO); if (CollUtil.isEmpty(pageResult.getList())) { return success(PageResult.empty(pageResult.getTotal())); } return success(new PageResult<>(buildRespList(pageResult.getList()), pageResult.getTotal())); } @PostMapping("/purchase-order") @Operation(summary = "需求单采购下单(支持批量,所选需求单需属于同一供货商)") @Parameter(name = "ids", description = "需求单编号列表", required = true) @PreAuthorize("@ss.hasPermission('erp:purchase-demand:purchase')") public CommonResult generatePurchaseOrder(@RequestBody List ids) { ErpPurchaseOrderDO order = demandService.generatePurchaseOrder(ids); return success(new ErpPurchaseDemandPurchaseRespVO(order.getId(), order.getNo())); } @GetMapping("/export-excel") @Operation(summary = "导出申请采购单 Excel") @PreAuthorize("@ss.hasPermission('erp:purchase-demand:export')") @ApiAccessLog(operateType = EXPORT) public void exportDemandExcel(@Valid ErpPurchaseDemandPageReqVO pageReqVO, HttpServletResponse response) throws IOException { // 复用分页过滤条件,导出内容与列表一致 pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); List list = demandService.getDemandPage(pageReqVO).getList(); List rows = buildRespList(list).stream() .map(vo -> new ErpPurchaseDemandExcelRow(vo.getNo(), vo.getSupplierName(), toPurchaseCategoryLabel(vo.getPurchaseCategory()), toSourceTypeLabel(vo.getSourceType()), vo.getWorkOrderNo(), vo.getDemandTime(), vo.getTotalCount(), toStatusLabel(vo.getStatus()), vo.getOrderNo(), vo.getPurpose(), vo.getRemark(), vo.getCreateTime())) .collect(Collectors.toList()); ExcelUtils.write(response, "申请采购单.xlsx", "申请采购单", ErpPurchaseDemandExcelRow.class, rows); } private List buildRespList(List list) { // 1.1 需求明细 List itemList = demandService.getDemandItemListByDemandIds( convertSet(list, ErpPurchaseDemandDO::getId)); Map> itemMap = convertMultiMap(itemList, ErpPurchaseDemandItemDO::getDemandId); // 1.2 物料 / 单位 / 供货商 Map mdmItemMap = mdmItemApi.getItemMap(convertSet(itemList, ErpPurchaseDemandItemDO::getProductId)); Map unitMap = mdmUnitMeasureApi.getUnitMeasureMap( convertSet(itemList, ErpPurchaseDemandItemDO::getProductUnitId)); Map supplierMap = srmSupplierApi.getSupplierList( convertSet(list, ErpPurchaseDemandDO::getSupplierId)).getCheckedData().stream() .collect(Collectors.toMap(SrmSupplierRespDTO::getId, v -> v, (a, b) -> a)); // 2. 拼接 return BeanUtils.toBean(list, ErpPurchaseDemandRespVO.class, demand -> { demand.setItems(BeanUtils.toBean(itemMap.get(demand.getId()), ErpPurchaseDemandRespVO.Item.class, item -> { MapUtils.findAndThen(mdmItemMap, item.getProductId(), mdmItem -> item.setProductName(mdmItem.getName()).setProductBarCode(mdmItem.getBarCode())); MapUtils.findAndThen(unitMap, item.getProductUnitId(), unit -> item.setProductUnitName(unit.getName())); })); demand.setProductNames(CollUtil.join(demand.getItems(), ",", ErpPurchaseDemandRespVO.Item::getProductName)); MapUtils.findAndThen(supplierMap, demand.getSupplierId(), supplier -> demand.setSupplierName(supplier.getName())); }); } private static String toPurchaseCategoryLabel(Integer purchaseCategory) { if (purchaseCategory == null) { return ""; } return purchaseCategory == 2 ? "原辅料" : "代理商品"; } private static String toSourceTypeLabel(Integer sourceType) { if (sourceType == null) { return ""; } return sourceType == 1 ? "生产计划" : "手工创建"; } private static String toStatusLabel(Integer status) { if (status == null) { return ""; } return status == 2 ? "已采购" : "未采购"; } /** * 导出用行结构(Excel 列) */ @ExcelIgnoreUnannotated @Data @AllArgsConstructor @NoArgsConstructor public static class ErpPurchaseDemandExcelRow { @ExcelProperty("需求单号") private String no; @ExcelProperty("供货商") private String supplierName; @ExcelProperty("采购品类") private String purchaseCategoryLabel; @ExcelProperty("来源") private String sourceTypeLabel; @ExcelProperty("关联生产任务") private String workOrderNo; @ExcelProperty("需求日期") private LocalDate demandTime; @ExcelProperty("合计数量") private BigDecimal totalCount; @ExcelProperty("状态") private String statusLabel; @ExcelProperty("采购订单号") private String orderNo; @ExcelProperty("用途说明") private String purpose; @ExcelProperty("备注") private String remark; @ExcelProperty("创建时间") private LocalDateTime createTime; } }