package cn.iocoder.yudao.module.erp.controller.admin.presale; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.erp.controller.admin.presale.vo.ErpPresaleOrderPageReqVO; import cn.iocoder.yudao.module.erp.controller.admin.presale.vo.ErpPresaleOrderRespVO; import cn.iocoder.yudao.module.erp.controller.admin.presale.vo.ErpPresaleOrderSaveReqVO; import cn.iocoder.yudao.module.erp.controller.admin.presale.vo.ErpPresaleTaskPageReqVO; import cn.iocoder.yudao.module.erp.controller.admin.presale.vo.ErpPresaleTaskRespVO; import cn.iocoder.yudao.module.erp.controller.admin.presale.vo.ErpPresaleTaskSaveReqVO; import cn.iocoder.yudao.module.erp.dal.dataobject.presale.ErpPresaleOrderDO; import cn.iocoder.yudao.module.erp.dal.dataobject.presale.ErpPresaleTaskDO; import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpSupplierDO; import cn.iocoder.yudao.module.erp.service.presale.ErpPresaleService; import cn.iocoder.yudao.module.erp.service.purchase.ErpSupplierService; import cn.iocoder.yudao.module.mdm.api.item.MdmItemApi; import cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemRespDTO; 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.validation.Valid; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.Collection; import java.util.List; import java.util.Map; import java.util.Set; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; /** * 管理后台 - ERP 预订货管理(需求 6.5) * * 业务流程:预定任务(客户预定) → 向供货商下单 → 自动生成 ERP 采购订单 → 备货完成 * * @author 超级管理员 */ @Tag(name = "管理后台 - ERP 预订货") @RestController @RequestMapping("/erp") @Validated public class ErpPresaleController { @Resource private ErpPresaleService presaleService; @Resource private ErpSupplierService supplierService; @Resource private MdmItemApi mdmItemApi; // ========== 预定任务 ========== @PostMapping("/presale-task/create") @Operation(summary = "创建预定任务") @PreAuthorize("@ss.hasPermission('erp:presale-task:create')") public CommonResult createTask(@Valid @RequestBody ErpPresaleTaskSaveReqVO createReqVO) { return success(presaleService.createTask(createReqVO)); } @PutMapping("/presale-task/update") @Operation(summary = "更新预定任务") @PreAuthorize("@ss.hasPermission('erp:presale-task:update')") public CommonResult updateTask(@Valid @RequestBody ErpPresaleTaskSaveReqVO updateReqVO) { presaleService.updateTask(updateReqVO); return success(true); } @DeleteMapping("/presale-task/delete") @Operation(summary = "删除预定任务") @Parameter(name = "id", description = "编号", required = true, example = "1024") @PreAuthorize("@ss.hasPermission('erp:presale-task:delete')") public CommonResult deleteTask(@RequestParam("id") Long id) { presaleService.deleteTask(id); return success(true); } @GetMapping("/presale-task/get") @Operation(summary = "获得预定任务") @Parameter(name = "id", description = "编号", required = true, example = "1024") @PreAuthorize("@ss.hasPermission('erp:presale-task:query')") public CommonResult getTask(@RequestParam("id") Long id) { ErpPresaleTaskDO task = presaleService.getTask(id); return success(buildTaskRespVOList(java.util.Collections.singletonList(task)).get(0)); } @GetMapping("/presale-task/page") @Operation(summary = "获得预定任务分页") @PreAuthorize("@ss.hasPermission('erp:presale-task:query')") public CommonResult> getTaskPage(@Valid ErpPresaleTaskPageReqVO pageReqVO) { PageResult pageResult = presaleService.getTaskPage(pageReqVO); return success(new PageResult<>(buildTaskRespVOList(pageResult.getList()), pageResult.getTotal())); } @PutMapping("/presale-task/finish") @Operation(summary = "预定任务备货完成") @Parameter(name = "id", description = "编号", required = true, example = "1024") @PreAuthorize("@ss.hasPermission('erp:presale-task:update')") public CommonResult finishTask(@RequestParam("id") Long id) { presaleService.finishTask(id); return success(true); } @PutMapping("/presale-task/cancel") @Operation(summary = "取消预定任务") @Parameter(name = "id", description = "编号", required = true, example = "1024") @PreAuthorize("@ss.hasPermission('erp:presale-task:update')") public CommonResult cancelTask(@RequestParam("id") Long id) { presaleService.cancelTask(id); return success(true); } @PostMapping("/presale-task/create-supplier-order") @Operation(summary = "向供货商下单(生成 ERP 采购订单)") @PreAuthorize("@ss.hasPermission('erp:presale-task:update')") public CommonResult createSupplierOrder(@Valid @RequestBody ErpPresaleOrderSaveReqVO reqVO) { return success(presaleService.createSupplierOrder(reqVO)); } // ========== 下单记录(历史下单任务) ========== @GetMapping("/presale-order/page") @Operation(summary = "获得预定货下单记录分页") @PreAuthorize("@ss.hasPermission('erp:presale-order:query')") public CommonResult> getOrderPage(@Valid ErpPresaleOrderPageReqVO pageReqVO) { PageResult pageResult = presaleService.getOrderPage(pageReqVO); return success(new PageResult<>(buildOrderRespVOList(pageResult.getList()), pageResult.getTotal())); } // ========== 组装 ========== private List buildTaskRespVOList(List list) { if (list == null || list.isEmpty()) { return java.util.Collections.emptyList(); } Set itemIds = convertSet(list, ErpPresaleTaskDO::getItemId); Map itemMap = mdmItemApi.getItemMap(itemIds); return BeanUtils.toBean(list, ErpPresaleTaskRespVO.class, vo -> { BigDecimal quantity = vo.getQuantity() != null ? vo.getQuantity() : BigDecimal.ZERO; BigDecimal purchaseQuantity = vo.getPurchaseQuantity() != null ? vo.getPurchaseQuantity() : BigDecimal.ZERO; vo.setRemainQuantity(quantity.subtract(purchaseQuantity)); // 完成度:已下单数量占预定数量的百分比,保留两位小数;预定数量为 0 时按 0 处理 vo.setFinishPercent(quantity.compareTo(BigDecimal.ZERO) > 0 ? purchaseQuantity.multiply(BigDecimal.valueOf(100)).divide(quantity, 2, RoundingMode.HALF_UP) : BigDecimal.ZERO); MdmItemRespDTO item = itemMap.get(vo.getItemId()); if (item != null) { vo.setItemCode(item.getCode()); vo.setItemName(item.getName()); } }); } private List buildOrderRespVOList(List list) { if (list == null || list.isEmpty()) { return java.util.Collections.emptyList(); } Collection supplierIds = convertSet(list, ErpPresaleOrderDO::getSupplierId); Map supplierMap = supplierService.getSupplierMap(supplierIds); Set itemIds = convertSet(list, ErpPresaleOrderDO::getItemId); Map itemMap = mdmItemApi.getItemMap(itemIds); return BeanUtils.toBean(list, ErpPresaleOrderRespVO.class, vo -> { ErpSupplierDO supplier = supplierMap.get(vo.getSupplierId()); if (supplier != null) { vo.setSupplierName(supplier.getName()); } MdmItemRespDTO item = itemMap.get(vo.getItemId()); if (item != null) { vo.setItemCode(item.getCode()); vo.setItemName(item.getName()); } }); } }