云
2 天以前 616a6b2e9a7824da8d11a4e11730fd2f9b615299
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
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;
    }
}