package cn.iocoder.yudao.module.mes.controller.admin.wm.scrap; import cn.iocoder.yudao.framework.common.exception.ServiceException; 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.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.scrap.MesWmScrapSaleDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.scrap.MesWmScrapSaleLineDO; import cn.iocoder.yudao.module.mes.dal.mysql.wm.scrap.MesWmScrapReceiptMapper; import cn.iocoder.yudao.module.mes.dal.mysql.wm.scrap.MesWmScrapSaleLineMapper; import cn.iocoder.yudao.module.mes.dal.mysql.wm.scrap.MesWmScrapSaleMapper; import cn.iocoder.yudao.module.mes.service.wm.materialstock.MesWmMaterialStockService; import cn.iocoder.yudao.module.mes.service.wm.scrap.MesWmScrapSaleService; import jakarta.annotation.Resource; import jakarta.validation.Valid; import jakarta.validation.constraints.DecimalMin; import jakarta.validation.constraints.Digits; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Pattern; import jakarta.validation.constraints.Size; import lombok.Data; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import java.math.BigDecimal; import java.util.HashSet; import java.util.List; import java.util.Set; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; @RestController @RequestMapping("/mes/wm/scrap-sale") @Validated public class MesWmScrapSaleController { @Resource private MesWmScrapSaleMapper saleMapper; @Resource private MesWmScrapSaleLineMapper lineMapper; @Resource private MesWmScrapReceiptMapper receiptMapper; @Resource private MesWmMaterialStockService stockService; @Resource private MesWmScrapSaleService saleService; @GetMapping("/page") @PreAuthorize("@ss.hasPermission('mes:wm-scrap-sale:query')") public CommonResult> page(@Valid PageParam page) { return success(saleMapper.selectPage(page, new LambdaQueryWrapperX() .orderByDesc(MesWmScrapSaleDO::getId))); } @GetMapping("/lines") @PreAuthorize("@ss.hasPermission('mes:wm-scrap-sale:query')") public CommonResult> lines(@RequestParam Long id) { return success(lineMapper.selectBySaleId(id)); } @PutMapping("/submit") @PreAuthorize("@ss.hasPermission('mes:wm-scrap-sale:submit')") public CommonResult submit(@RequestParam Long id) { saleService.submit(id, getLoginUserId()); return success(true); } /** requestId 由客户端为每次业务操作生成并在重试时复用。 */ @PostMapping("/create") @PreAuthorize("@ss.hasPermission('mes:wm-scrap-sale:create')") @Transactional(rollbackFor = Exception.class) public CommonResult create(@Valid @RequestBody CreateReq req) { String code = "SS-" + req.getRequestId(); if (saleMapper.selectByCode(code) != null) { throw new ServiceException(400, "请求已提交,请刷新出售单列表"); } Set stocks = new HashSet<>(); for (LineReq line : req.getLines()) { if (!stocks.add(line.getMaterialStockId())) throw new ServiceException(400, "同一库存不能重复添加"); if (stockService.getMaterialStock(line.getMaterialStockId()) == null || receiptMapper.countByStockId(line.getMaterialStockId()) == 0) { throw new ServiceException(400, "请选择废料入库产生的库存"); } } MesWmScrapSaleDO sale = new MesWmScrapSaleDO(); sale.setCode(code); sale.setBuyer(req.getBuyer()); sale.setRemark(req.getRemark()); sale.setStatus(0); saleMapper.insert(sale); for (LineReq input : req.getLines()) { MesWmScrapSaleLineDO line = new MesWmScrapSaleLineDO(); line.setSaleId(sale.getId()); line.setMaterialStockId(input.getMaterialStockId()); line.setQuantity(input.getQuantity()); line.setUnitPrice(input.getUnitPrice()); lineMapper.insert(line); } return success(sale.getId()); } @Data public static class CreateReq { @NotBlank @Pattern(regexp = "[A-Za-z0-9-]{1,60}") private String requestId; @NotBlank @Size(max = 200) private String buyer; @Size(max = 500) private String remark; @NotEmpty @Size(max = 100) private List<@Valid LineReq> lines; } @Data public static class LineReq { @NotNull private Long materialStockId; @NotNull @DecimalMin(value = "0", inclusive = false) @Digits(integer = 16, fraction = 4) private BigDecimal quantity; @NotNull @DecimalMin("0") @Digits(integer = 16, fraction = 4) private BigDecimal unitPrice; } }