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<Long> 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<Boolean> 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<Boolean> 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<ErpPresaleTaskRespVO> 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<PageResult<ErpPresaleTaskRespVO>> getTaskPage(@Valid ErpPresaleTaskPageReqVO pageReqVO) {
|
PageResult<ErpPresaleTaskDO> 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<Boolean> 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<Boolean> 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<Long> 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<PageResult<ErpPresaleOrderRespVO>> getOrderPage(@Valid ErpPresaleOrderPageReqVO pageReqVO) {
|
PageResult<ErpPresaleOrderDO> pageResult = presaleService.getOrderPage(pageReqVO);
|
return success(new PageResult<>(buildOrderRespVOList(pageResult.getList()), pageResult.getTotal()));
|
}
|
|
// ========== 组装 ==========
|
|
private List<ErpPresaleTaskRespVO> buildTaskRespVOList(List<ErpPresaleTaskDO> list) {
|
if (list == null || list.isEmpty()) {
|
return java.util.Collections.emptyList();
|
}
|
Set<Long> itemIds = convertSet(list, ErpPresaleTaskDO::getItemId);
|
Map<Long, MdmItemRespDTO> 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<ErpPresaleOrderRespVO> buildOrderRespVOList(List<ErpPresaleOrderDO> list) {
|
if (list == null || list.isEmpty()) {
|
return java.util.Collections.emptyList();
|
}
|
Collection<Long> supplierIds = convertSet(list, ErpPresaleOrderDO::getSupplierId);
|
Map<Long, ErpSupplierDO> supplierMap = supplierService.getSupplierMap(supplierIds);
|
Set<Long> itemIds = convertSet(list, ErpPresaleOrderDO::getItemId);
|
Map<Long, MdmItemRespDTO> 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());
|
}
|
});
|
}
|
|
}
|