huminmin
8 天以前 71b15a5c69dcc421bad71d558e191e12cb7bae3e
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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
package cn.iocoder.yudao.module.mes.controller.admin.qc.ncr;
 
import cn.hutool.core.collection.CollUtil;
import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
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.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.module.mes.controller.admin.qc.ncr.vo.*;
import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.qc.ncr.MesQcNcrDO;
import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
import cn.iocoder.yudao.module.mes.service.qc.ncr.MesQcNcrService;
import cn.iocoder.yudao.module.system.api.dept.DeptApi;
import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
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.servlet.http.HttpServletResponse;
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.io.IOException;
import java.util.*;
 
import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
import static cn.iocoder.yudao.framework.common.util.collection.MapUtils.findAndThen;
 
@Tag(name = "管理后台 - MES 不合格品处理单(NCR)")
@RestController
@RequestMapping("/mes/qc/ncr")
@Validated
public class MesQcNcrController {
 
    @Resource
    private MesQcNcrService ncrService;
 
    @Resource
    private MesMdItemService itemService;
 
    @Resource
    private AdminUserApi adminUserApi;
 
    @Resource
    private DeptApi deptApi;
 
    @PostMapping("/create")
    @Operation(summary = "创建不合格品处理单")
    @PreAuthorize("@ss.hasPermission('mes:qc-ncr:create')")
    public CommonResult<Long> createNcr(@Valid @RequestBody MesQcNcrSaveReqVO createReqVO) {
        return success(ncrService.createNcr(createReqVO));
    }
 
    @PutMapping("/update")
    @Operation(summary = "更新不合格品处理单")
    @PreAuthorize("@ss.hasPermission('mes:qc-ncr:update')")
    public CommonResult<Boolean> updateNcr(@Valid @RequestBody MesQcNcrSaveReqVO updateReqVO) {
        ncrService.updateNcr(updateReqVO);
        return success(true);
    }
 
    @PutMapping("/review")
    @Operation(summary = "评审不合格品处理单")
    @PreAuthorize("@ss.hasPermission('mes:qc-ncr:review')")
    public CommonResult<Boolean> reviewNcr(@Valid @RequestBody MesQcNcrReviewReqVO reviewReqVO) {
        ncrService.reviewNcr(reviewReqVO.getId(), reviewReqVO.getDisposition(),
                reviewReqVO.getResponsibleDeptId(), reviewReqVO.getDefectLevel(),
                reviewReqVO.getReviewOpinion());
        return success(true);
    }
 
    @PutMapping("/dispose")
    @Operation(summary = "执行不合格品处置")
    @PreAuthorize("@ss.hasPermission('mes:qc-ncr:dispose')")
    public CommonResult<Boolean> disposeNcr(@Valid @RequestBody MesQcNcrDisposeReqVO disposeReqVO) {
        ncrService.disposeNcr(disposeReqVO.getId(),
                disposeReqVO.getHandlerUserId(), disposeReqVO.getHandleResult());
        return success(true);
    }
 
    @PutMapping("/close")
    @Operation(summary = "关闭不合格品处理单")
    @PreAuthorize("@ss.hasPermission('mes:qc-ncr:close')")
    public CommonResult<Boolean> closeNcr(@Valid @RequestBody MesQcNcrCloseReqVO closeReqVO) {
        ncrService.closeNcr(closeReqVO.getId(), closeReqVO.getCloseOpinion());
        return success(true);
    }
 
    @DeleteMapping("/delete")
    @Operation(summary = "删除不合格品处理单")
    @Parameter(name = "id", description = "编号", required = true)
    @PreAuthorize("@ss.hasPermission('mes:qc-ncr:delete')")
    public CommonResult<Boolean> deleteNcr(@RequestParam("id") Long id) {
        ncrService.deleteNcr(id);
        return success(true);
    }
 
    @GetMapping("/get")
    @Operation(summary = "获得不合格品处理单详情")
    @Parameter(name = "id", description = "编号", required = true, example = "1024")
    @PreAuthorize("@ss.hasPermission('mes:qc-ncr:query')")
    public CommonResult<MesQcNcrRespVO> getNcr(@RequestParam("id") Long id) {
        MesQcNcrDO ncr = ncrService.getNcr(id);
        return success(buildNcrRespVOList(Collections.singletonList(ncr)).get(0));
    }
 
    @GetMapping("/page")
    @Operation(summary = "获得不合格品处理单分页")
    @PreAuthorize("@ss.hasPermission('mes:qc-ncr:query')")
    public CommonResult<PageResult<MesQcNcrRespVO>> getNcrPage(@Valid MesQcNcrPageReqVO pageReqVO) {
        PageResult<MesQcNcrDO> pageResult = ncrService.getNcrPage(pageReqVO);
        return success(new PageResult<>(buildNcrRespVOList(pageResult.getList()), pageResult.getTotal()));
    }
 
    @GetMapping("/export-excel")
    @Operation(summary = "导出不合格品处理单 Excel")
    @PreAuthorize("@ss.hasPermission('mes:qc-ncr:export')")
    @ApiAccessLog(operateType = EXPORT)
    public void exportNcrExcel(@Valid MesQcNcrPageReqVO pageReqVO,
                                HttpServletResponse response) throws IOException {
        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
        List<MesQcNcrDO> list = ncrService.getNcrPage(pageReqVO).getList();
        List<MesQcNcrRespVO> voList = buildNcrRespVOList(list);
        ExcelUtils.write(response, "不合格品处理单.xls", "数据", MesQcNcrRespVO.class, voList);
    }
 
    // ==================== 拼接 VO ====================
 
    private List<MesQcNcrRespVO> buildNcrRespVOList(List<MesQcNcrDO> list) {
        if (CollUtil.isEmpty(list)) {
            return Collections.emptyList();
        }
        // 批量查询物料
        Map<Long, MesMdItemDO> itemMap = itemService.getItemMap(
                convertSet(list, MesQcNcrDO::getItemId));
        // 批量查询评审人
        Set<Long> reviewerUserIds = convertSet(list, MesQcNcrDO::getReviewerUserId);
        Map<Long, AdminUserRespDTO> reviewerMap = CollUtil.isNotEmpty(reviewerUserIds)
                ? adminUserApi.getUserMap(reviewerUserIds) : Collections.emptyMap();
        // 批量查询处理人
        Set<Long> handlerUserIds = convertSet(list, MesQcNcrDO::getHandlerUserId);
        Map<Long, AdminUserRespDTO> handlerMap = CollUtil.isNotEmpty(handlerUserIds)
                ? adminUserApi.getUserMap(handlerUserIds) : Collections.emptyMap();
        // 批量查询关闭人
        Set<Long> closeUserIds = convertSet(list, MesQcNcrDO::getCloseUserId);
        Map<Long, AdminUserRespDTO> closeUserMap = CollUtil.isNotEmpty(closeUserIds)
                ? adminUserApi.getUserMap(closeUserIds) : Collections.emptyMap();
        // 批量查询责任部门
        Set<Long> deptIds = convertSet(list, MesQcNcrDO::getResponsibleDeptId);
        Map<Long, DeptRespDTO> deptMap = CollUtil.isNotEmpty(deptIds)
                ? deptApi.getDeptMap(deptIds) : Collections.emptyMap();
        // 拼装 VO
        return BeanUtils.toBean(list, MesQcNcrRespVO.class, vo -> {
            findAndThen(itemMap, vo.getItemId(), item -> {
                vo.setItemCode(item.getCode());
                vo.setItemName(item.getName());
                vo.setItemSpecification(item.getSpecification());
            });
            findAndThen(reviewerMap, vo.getReviewerUserId(),
                    user -> vo.setReviewerNickname(user.getNickname()));
            findAndThen(handlerMap, vo.getHandlerUserId(),
                    user -> vo.setHandlerNickname(user.getNickname()));
            findAndThen(closeUserMap, vo.getCloseUserId(),
                    user -> vo.setCloseUserNickname(user.getNickname()));
            findAndThen(deptMap, vo.getResponsibleDeptId(),
                    dept -> vo.setResponsibleDeptName(dept.getName()));
        });
    }
 
}