package cn.iocoder.yudao.module.mes.controller.admin.wm.returnvendor; import cn.hutool.core.collection.CollUtil; 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.mes.controller.admin.wm.returnvendor.vo.MesWmReturnVendorPageReqVO; import cn.iocoder.yudao.module.mes.controller.admin.wm.returnvendor.vo.MesWmReturnVendorRespVO; import cn.iocoder.yudao.module.mes.controller.admin.wm.returnvendor.vo.MesWmReturnVendorSaveReqVO; import cn.iocoder.yudao.module.srm.api.supplier.SrmSupplierApi; import cn.iocoder.yudao.module.srm.api.supplier.dto.SrmSupplierRespDTO; import cn.iocoder.yudao.module.erp.api.finance.ErpFinancePaymentApi; import cn.iocoder.yudao.module.erp.api.finance.dto.ErpFinancePaymentRespDTO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.arrivalnotice.MesWmArrivalNoticeDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnvendor.MesWmReturnVendorDO; import cn.iocoder.yudao.module.mes.enums.wm.MesWmReturnVendorStatusEnum; import cn.iocoder.yudao.module.mes.service.wm.arrivalnotice.MesWmArrivalNoticeService; import cn.iocoder.yudao.module.mes.service.wm.returnvendor.MesWmReturnVendorService; import cn.iocoder.yudao.module.mes.service.wm.returnvendor.MesWmReturnVendorServiceImpl; import cn.iocoder.yudao.module.system.api.storage.StorageAttachmentApi; import cn.iocoder.yudao.module.system.api.storage.dto.StorageBlobRespDTO; 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.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Map; 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.convertSet; @Tag(name = "管理后台 - MES 供应商退货单") @RestController @RequestMapping("/mes/wm/return-vendor") @Validated public class MesWmReturnVendorController { @Resource private MesWmReturnVendorService returnVendorService; @Resource private SrmSupplierApi srmSupplierApi; @Resource private StorageAttachmentApi storageAttachmentApi; @Resource private ErpFinancePaymentApi financePaymentApi; @Resource private MesWmArrivalNoticeService arrivalNoticeService; @PostMapping("/create") @Operation(summary = "创建供应商退货单") @PreAuthorize("@ss.hasPermission('mes:wm-return-vendor:create')") public CommonResult createReturnVendor(@Valid @RequestBody MesWmReturnVendorSaveReqVO createReqVO) { return success(returnVendorService.createReturnVendor(createReqVO)); } @PutMapping("/update") @Operation(summary = "修改供应商退货单") @PreAuthorize("@ss.hasPermission('mes:wm-return-vendor:update')") public CommonResult updateReturnVendor(@Valid @RequestBody MesWmReturnVendorSaveReqVO updateReqVO) { returnVendorService.updateReturnVendor(updateReqVO); return success(true); } @DeleteMapping("/delete") @Operation(summary = "删除供应商退货单") @Parameter(name = "id", description = "编号", required = true) @PreAuthorize("@ss.hasPermission('mes:wm-return-vendor:delete')") public CommonResult deleteReturnVendor(@RequestParam("id") Long id) { returnVendorService.deleteReturnVendor(id); return success(true); } @GetMapping("/get") @Operation(summary = "获得供应商退货单") @Parameter(name = "id", description = "编号", required = true, example = "1024") public CommonResult getReturnVendor(@RequestParam("id") Long id) { MesWmReturnVendorDO returnVendor = returnVendorService.getReturnVendor(id); if (returnVendor == null) { return success(null); } return success(buildRespVOList(Collections.singletonList(returnVendor)).get(0)); } @GetMapping("/page") @Operation(summary = "获得供应商退货单分页") public CommonResult> getReturnVendorPage( @Valid MesWmReturnVendorPageReqVO pageReqVO) { PageResult pageResult = returnVendorService.getReturnVendorPage(pageReqVO); return success(new PageResult<>(buildRespVOList(pageResult.getList()), pageResult.getTotal())); } @GetMapping("/export-excel") @Operation(summary = "导出供应商退货单 Excel") @PreAuthorize("@ss.hasPermission('mes:wm-return-vendor:export')") @ApiAccessLog(operateType = EXPORT) public void exportReturnVendorExcel(@Valid MesWmReturnVendorPageReqVO pageReqVO, HttpServletResponse response) throws IOException { pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); PageResult pageResult = returnVendorService.getReturnVendorPage(pageReqVO); ExcelUtils.write(response, "供应商退货单.xls", "数据", MesWmReturnVendorRespVO.class, buildRespVOList(pageResult.getList())); } @PutMapping("/submit") @Operation(summary = "提交供应商退货单") @Parameter(name = "id", description = "编号", required = true) @PreAuthorize("@ss.hasPermission('mes:wm-return-vendor:update')") public CommonResult submitReturnVendor(@RequestParam("id") Long id) { returnVendorService.submitReturnVendor(id); return success(true); } @PutMapping("/submit-approval") @Operation(summary = "提交供应商退货单审批", description = "走 BPM 流程:采购 -> 质量 -> 仓库") @Parameter(name = "id", description = "编号", required = true) @Parameter(name = "processDefinitionKey", description = "流程定义 Key", required = true, example = "purchase_return_vendor_approve") @PreAuthorize("@ss.hasPermission('mes:wm-return-vendor:submit-approval')") public CommonResult submitReturnVendorApproval(@RequestParam("id") Long id, @RequestParam("processDefinitionKey") String processDefinitionKey) { returnVendorService.submitReturnVendorApproval(id, processDefinitionKey); return success(true); } @GetMapping("/attachments") @Operation(summary = "获得供应商退货单附件列表") @Parameter(name = "id", description = "编号", required = true) public CommonResult> getReturnVendorAttachments(@RequestParam("id") Long id) { return success(storageAttachmentApi.listAttachments( MesWmReturnVendorServiceImpl.RETURN_VENDOR_RECORD_TYPE, id)); } @PostMapping("/red-flush") @Operation(summary = "生成采购退货负数冲红付款单", description = "幂等:已生成则直接返回已有冲红单编号") @Parameter(name = "id", description = "编号", required = true) @PreAuthorize("@ss.hasPermission('mes:wm-return-vendor:finish')") public CommonResult createRedFlushPayment(@RequestParam("id") Long id) { return success(returnVendorService.createRedFlushPayment(id)); } @PostMapping("/replacement-notice") @Operation(summary = "生成换货到货通知单", description = "幂等:已生成则直接返回已有到货通知单编号") @Parameter(name = "id", description = "编号", required = true) @PreAuthorize("@ss.hasPermission('mes:wm-return-vendor:finish')") public CommonResult createReplacementNotice(@RequestParam("id") Long id) { return success(returnVendorService.createReplacementNotice(id)); } @PutMapping("/stock") @Operation(summary = "执行拣货") @Parameter(name = "id", description = "编号", required = true) @PreAuthorize("@ss.hasPermission('mes:wm-return-vendor:update')") public CommonResult stockReturnVendor(@RequestParam("id") Long id) { returnVendorService.stockReturnVendor(id); return success(true); } @PutMapping("/finish") @Operation(summary = "完成供应商退货单") @Parameter(name = "id", description = "编号", required = true) @PreAuthorize("@ss.hasPermission('mes:wm-return-vendor:finish')") public CommonResult finishReturnVendor(@RequestParam("id") Long id) { returnVendorService.finishReturnVendor(id); return success(true); } @PutMapping("/cancel") @Operation(summary = "取消供应商退货单") @Parameter(name = "id", description = "编号", required = true) @PreAuthorize("@ss.hasPermission('mes:wm-return-vendor:update')") public CommonResult cancelReturnVendor(@RequestParam("id") Long id) { returnVendorService.cancelReturnVendor(id); return success(true); } @GetMapping("/check-quantity") @Operation(summary = "校验供应商退货单数量", description = "校验每行明细数量之和是否等于行退货数量") @Parameter(name = "id", description = "编号", required = true) public CommonResult checkReturnVendorQuantity(@RequestParam("id") Long id) { return success(returnVendorService.checkReturnVendorQuantity(id)); } @PostMapping("/import-purchase-order-items") @Operation(summary = "根据关联采购订单带入物料明细") @Parameter(name = "id", description = "编号", required = true) @PreAuthorize("@ss.hasPermission('mes:wm-return-vendor:update')") public CommonResult importPurchaseOrderItems(@RequestParam("id") Long id) { return success(returnVendorService.importPurchaseOrderItems(id)); } // ==================== 拼接 VO ==================== private List buildRespVOList(List list) { if (CollUtil.isEmpty(list)) { return Collections.emptyList(); } // 1. 获得关联数据 Map vendorMap = srmSupplierApi.getSupplierList( convertSet(list, MesWmReturnVendorDO::getVendorId)).getCheckedData().stream() .collect(java.util.stream.Collectors.toMap(SrmSupplierRespDTO::getId, s -> s)); // 2. 构建结果 return BeanUtils.toBean(list, MesWmReturnVendorRespVO.class, vo -> { MapUtils.findAndThen(vendorMap, vo.getVendorId(), vendor -> { vo.setVendorName(vendor.getName()); vo.setVendorCode(vendor.getCode()); }); vo.setStatusName(resolveStatusName(vo.getStatus())); vo.setAttachmentList(storageAttachmentApi.listAttachments( MesWmReturnVendorServiceImpl.RETURN_VENDOR_RECORD_TYPE, vo.getId())); // 冲红单号 / 换货到货单号(仅在已生成时查询) if (vo.getRedFlushPaymentId() != null) { ErpFinancePaymentRespDTO payment = financePaymentApi .getFinancePayment(vo.getRedFlushPaymentId()).getCheckedData(); if (payment != null) { vo.setRedFlushPaymentNo(payment.getNo()); } } if (vo.getReplacementNoticeId() != null) { MesWmArrivalNoticeDO notice = arrivalNoticeService.getArrivalNotice(vo.getReplacementNoticeId()); if (notice != null) { vo.setReplacementNoticeCode(notice.getCode()); } } }); } private String resolveStatusName(Integer status) { MesWmReturnVendorStatusEnum statusEnum = Arrays.stream(MesWmReturnVendorStatusEnum.values()) .filter(item -> item.getStatus().equals(status)).findFirst().orElse(null); return statusEnum != null ? statusEnum.getName() : null; } }