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<PageResult<MesWmScrapSaleDO>> page(@Valid PageParam page) {
|
return success(saleMapper.selectPage(page, new LambdaQueryWrapperX<MesWmScrapSaleDO>()
|
.orderByDesc(MesWmScrapSaleDO::getId)));
|
}
|
|
@GetMapping("/lines")
|
@PreAuthorize("@ss.hasPermission('mes:wm-scrap-sale:query')")
|
public CommonResult<List<MesWmScrapSaleLineDO>> lines(@RequestParam Long id) {
|
return success(lineMapper.selectBySaleId(id));
|
}
|
|
@PutMapping("/submit")
|
@PreAuthorize("@ss.hasPermission('mes:wm-scrap-sale:submit')")
|
public CommonResult<Boolean> 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<Long> create(@Valid @RequestBody CreateReq req) {
|
String code = "SS-" + req.getRequestId();
|
if (saleMapper.selectByCode(code) != null) {
|
throw new ServiceException(400, "请求已提交,请刷新出售单列表");
|
}
|
Set<Long> 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;
|
}
|
}
|