package cn.iocoder.yudao.module.mes.controller.admin.qc.seedquality; 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.mes.controller.admin.qc.seedquality.vo.MesQcSeedQualityBatchRespVO; import cn.iocoder.yudao.module.mes.controller.admin.qc.seedquality.vo.MesQcSeedQualityPageReqVO; import cn.iocoder.yudao.module.mes.controller.admin.qc.seedquality.vo.MesQcSeedQualityRespVO; import cn.iocoder.yudao.module.mes.controller.admin.qc.seedquality.vo.MesQcSeedQualitySubmitReqVO; import cn.iocoder.yudao.module.mes.controller.admin.qc.seedquality.vo.MesQcSeedQualityApprovalReqVO; import cn.iocoder.yudao.module.mes.controller.admin.qc.seedquality.vo.MesQcSeedQualityRetestReqVO; import cn.iocoder.yudao.module.mes.controller.admin.qc.seedquality.vo.MesQcSeedQualityBatchApprovalReqVO; import cn.iocoder.yudao.module.mes.controller.admin.qc.seedquality.vo.MesQcSeedQualityBatchRetestReqVO; import cn.iocoder.yudao.module.mes.controller.admin.qc.seedquality.vo.MesQcSeedQualityScopeRetestReqVO; import cn.iocoder.yudao.module.mes.controller.admin.qc.seedquality.vo.MesQcSeedReturnQualitySubmitReqVO; import cn.iocoder.yudao.module.mes.controller.admin.qc.seedquality.vo.MesQcSeedIndicatorRangeSaveReqVO; import cn.iocoder.yudao.module.mes.controller.admin.qc.seedquality.vo.MesQcSeedIndicatorRangeRespVO; import cn.iocoder.yudao.module.mes.controller.admin.qc.seedquality.vo.MesQcSeedQualityActionRespVO; import cn.iocoder.yudao.module.mes.dal.dataobject.pro.bagcode.MesProBagCodeDO; import cn.iocoder.yudao.module.mes.dal.dataobject.qc.seedquality.MesQcSeedQualityActionDO; import cn.iocoder.yudao.module.system.api.user.AdminUserApi; import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; import cn.iocoder.yudao.module.mes.dal.mysql.pro.bagcode.MesProBagCodeMapper; import cn.iocoder.yudao.module.mes.service.qc.seedquality.MesQcSeedQualityService; import cn.iocoder.yudao.module.mes.service.qc.seedquality.MesQcSeedIndicatorRangeService; import io.swagger.v3.oas.annotations.Operation; 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.util.List; import java.util.Map; import java.util.function.Function; import java.util.stream.Collectors; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; @Tag(name = "管理后台 - MES 种子质检") @RestController @RequestMapping("/mes/qc/seed-quality") @Validated public class MesQcSeedQualityController { @Resource private MesQcSeedQualityService service; @Resource private MesQcSeedIndicatorRangeService rangeService; @Resource private MesProBagCodeMapper bagCodeMapper; @Resource private AdminUserApi adminUserApi; @GetMapping("/ranges") @Operation(summary = "获得产品质检项配置") @PreAuthorize("@ss.hasAnyPermissions('mes:qc-seed-quality:submit', 'mes:qc-seed-quality:retest', 'mes:qc-seed-range:query')") public CommonResult> ranges(@RequestParam(required = false) Long itemId, @RequestParam(required = false) String keyword, @RequestParam(required = false) Integer status) { return success(BeanUtils.toBean(rangeService.getRanges(itemId, keyword, status), MesQcSeedIndicatorRangeRespVO.class)); } @GetMapping("/ranges/effective") @Operation(summary = "获得产品生效的质检项") @PreAuthorize("@ss.hasAnyPermissions('mes:qc-seed-quality:submit', 'mes:qc-seed-quality:retest', 'mes:qc-seed-range:query')") public CommonResult> effectiveRanges(@RequestParam Long itemId) { return success(BeanUtils.toBean(rangeService.getEffectiveRanges(itemId), MesQcSeedIndicatorRangeRespVO.class)); } @PostMapping("/ranges") @Operation(summary = "新增产品质检项") @PreAuthorize("@ss.hasPermission('mes:qc-seed-range:update')") public CommonResult createRange(@Valid @RequestBody MesQcSeedIndicatorRangeSaveReqVO reqVO) { return success(rangeService.create(reqVO)); } @PutMapping("/ranges/{id}") @Operation(summary = "修改产品质检项") @PreAuthorize("@ss.hasPermission('mes:qc-seed-range:update')") public CommonResult updateRange(@PathVariable Long id, @Valid @RequestBody MesQcSeedIndicatorRangeSaveReqVO reqVO) { rangeService.update(id, reqVO); return success(true); } @DeleteMapping("/ranges/{id}") @Operation(summary = "删除产品质检项") @PreAuthorize("@ss.hasPermission('mes:qc-seed-range:update')") public CommonResult deleteRange(@PathVariable Long id) { rangeService.delete(id); return success(true); } @PostMapping("/ranges/copy-default") @Operation(summary = "复制通用默认质检项到产品") @PreAuthorize("@ss.hasPermission('mes:qc-seed-range:update')") public CommonResult copyDefaultRanges(@RequestParam Long itemId) { return success(rangeService.copyDefaults(itemId)); } @GetMapping("/resolve") @Operation(summary = "解析待质检袋码及确认该袋质检结果") @PreAuthorize("@ss.hasAnyPermissions('mes:qc-seed-quality:submit', 'mes:qc-seed-quality:retest', 'mes:qc-seed-quality:process-approve', 'mes:qc-seed-quality:company-approve')") public CommonResult> resolve(@RequestParam String code, @RequestParam(defaultValue = "BAG") String scanType, @RequestParam(defaultValue = "1") Integer qcLine) { return success(service.resolveScan(code, scanType, qcLine)); } @GetMapping("/page") @Operation(summary = "获得种子质检记录分页") @PreAuthorize("@ss.hasAnyPermissions('mes:qc-seed-quality:query', 'mes:qc-seed-quality:submit', " + "'mes:qc-seed-quality:retest', 'mes:qc-seed-quality:process-approve', 'mes:qc-seed-quality:company-approve')") public CommonResult> getQualityPage(@Valid MesQcSeedQualityPageReqVO pageReqVO) { PageResult page = BeanUtils.toBean( service.getQualityPage(pageReqVO), MesQcSeedQualityRespVO.class); List codes = page.getList().stream().map(MesQcSeedQualityRespVO::getCode) .filter(java.util.Objects::nonNull).distinct().toList(); if (!codes.isEmpty()) { Map bagMap = bagCodeMapper.selectList(MesProBagCodeDO::getCode, codes).stream() .collect(Collectors.toMap(MesProBagCodeDO::getCode, Function.identity(), (first, ignored) -> first)); page.getList().forEach(record -> { MesProBagCodeDO bag = bagMap.get(record.getCode()); if (bag != null) record.setPalletCode(bag.getPalletCode()); }); } return success(page); } @GetMapping("/batch-page") @Operation(summary = "获得种子质检记录按生产批次分组分页") @PreAuthorize("@ss.hasPermission('mes:qc-seed-quality:query')") public CommonResult> getQualityBatchPage(@Valid MesQcSeedQualityPageReqVO pageReqVO) { return success(service.getQualityBatchPage(pageReqVO)); } @GetMapping("/indicators") @Operation(summary = "获得种子质检最新指标") @PreAuthorize("@ss.hasAnyPermissions('mes:qc-seed-quality:query', 'mes:qc-seed-quality:submit', " + "'mes:qc-seed-quality:retest', 'mes:qc-seed-quality:process-approve', 'mes:qc-seed-quality:company-approve')") public CommonResult> indicators(@RequestParam Long id) { return success(service.getIndicatorsByQualityId(id)); } @GetMapping("/actions") @Operation(summary = "获得种子质检流程留痕") @PreAuthorize("@ss.hasAnyPermissions('mes:qc-seed-quality:query', 'mes:qc-seed-quality:submit', " + "'mes:qc-seed-quality:retest', 'mes:qc-seed-quality:process-approve', 'mes:qc-seed-quality:company-approve')") public CommonResult> actions(@RequestParam Long id) { List actions = service.getActions(id); Map userMap = adminUserApi.getUserMap(actions.stream() .map(MesQcSeedQualityActionDO::getOperatorId).filter(java.util.Objects::nonNull) .collect(Collectors.toSet())); return success(BeanUtils.toBean(actions, MesQcSeedQualityActionRespVO.class, vo -> { AdminUserRespDTO user = userMap.get(vo.getOperatorId()); if (user != null) vo.setOperatorName(user.getNickname()); })); } @PostMapping("/submit") @Operation(summary = "提交种子质检") @PreAuthorize("@ss.hasPermission('mes:qc-seed-quality:submit')") public CommonResult submit(@Valid @RequestBody MesQcSeedQualitySubmitReqVO reqVO) { return success(service.submit(reqVO)); } @PostMapping("/submit-group") @Operation(summary = "按袋码、托盘或生产批次统一提交种子质检") @PreAuthorize("@ss.hasPermission('mes:qc-seed-quality:submit')") public CommonResult> submitGroup(@Valid @RequestBody cn.iocoder.yudao.module.mes.controller.admin.qc.seedquality.vo.MesQcSeedQualityGroupSubmitReqVO reqVO) { return success(service.submitGroup(reqVO)); } @PostMapping("/retry-bpm") @Operation(summary = "重新发起质检 BPM 审批") @PreAuthorize("@ss.hasPermission('mes:qc-seed-quality:process-approve')") public CommonResult retryBpm(@RequestParam Long id) { service.retryBpmProcess(id); return success(true); } @PostMapping("/retest") @Operation(summary = "种子质检复检") @PreAuthorize("@ss.hasPermission('mes:qc-seed-quality:retest')") public CommonResult retest(@RequestParam Long id, @Valid @RequestBody MesQcSeedQualityRetestReqVO reqVO) { service.retest(id, reqVO); return success(true); } @PostMapping("/retest-batch") @Operation(summary = "同批次种子批量复检或重新初检") @PreAuthorize("@ss.hasPermission('mes:qc-seed-quality:retest')") public CommonResult retestBatch(@Valid @RequestBody MesQcSeedQualityBatchRetestReqVO reqVO) { service.retestBatch(reqVO); return success(true); } @GetMapping("/retest-scope/resolve") @Operation(summary = "按托盘码或生产批次码解析待批量质检记录") @PreAuthorize("@ss.hasAnyPermissions('mes:qc-seed-quality:submit', 'mes:qc-seed-quality:retest', 'mes:qc-seed-quality:process-approve', 'mes:qc-seed-quality:company-approve')") public CommonResult> resolveRetestScope(@RequestParam String code, @RequestParam String scanType, @RequestParam(defaultValue = "1") Integer qcLine) { return success(service.resolveRetestScope(code, scanType, qcLine)); } @PostMapping("/retest-scope") @Operation(summary = "按托盘码或生产批次码批量复检或重新初检") @PreAuthorize("@ss.hasPermission('mes:qc-seed-quality:retest')") public CommonResult> retestScope(@Valid @RequestBody MesQcSeedQualityScopeRetestReqVO reqVO) { return success(service.retestScope(reqVO)); } @PostMapping("/process-approve") @Operation(summary = "初检审核") @PreAuthorize("@ss.hasPermission('mes:qc-seed-quality:process-approve')") public CommonResult processApprove(@Valid @RequestBody MesQcSeedQualityApprovalReqVO reqVO) { service.processApprove(reqVO.getId(), reqVO.getApproved(), reqVO.getOpinion()); return success(true); } @PostMapping("/company-approve") @Operation(summary = "复检审核并流转库存") @PreAuthorize("@ss.hasPermission('mes:qc-seed-quality:company-approve')") public CommonResult companyApprove(@Valid @RequestBody MesQcSeedQualityApprovalReqVO reqVO) { service.companyApprove(reqVO.getId(), reqVO.getApproved(), reqVO.getOpinion()); return success(true); } @PostMapping("/process-approve-batch") @Operation(summary = "批量初检审核") @PreAuthorize("@ss.hasPermission('mes:qc-seed-quality:process-approve')") public CommonResult processApproveBatch(@Valid @RequestBody MesQcSeedQualityBatchApprovalReqVO reqVO) { service.processApproveBatch(reqVO.getIds(), reqVO.getApproved(), reqVO.getOpinion()); return success(true); } @PostMapping("/company-approve-batch") @Operation(summary = "批量复检审核并流转库存") @PreAuthorize("@ss.hasPermission('mes:qc-seed-quality:company-approve')") public CommonResult companyApproveBatch(@Valid @RequestBody MesQcSeedQualityBatchApprovalReqVO reqVO) { service.companyApproveBatch(reqVO.getIds(), reqVO.getApproved(), reqVO.getOpinion()); return success(true); } @GetMapping("/return/resolve") @Operation(summary = "解析经销商退货单待质检信息") @PreAuthorize("@ss.hasAnyPermissions('mes:qc-seed-quality:submit', 'mes:qc-seed-quality:retest', 'mes:qc-seed-quality:process-approve')") public CommonResult> resolveReturnQuality(@RequestParam Long returnSalesId) { return success(service.resolveReturnQuality(returnSalesId)); } @PostMapping("/return/submit") @Operation(summary = "提交经销商退货质检") @PreAuthorize("@ss.hasPermission('mes:qc-seed-quality:submit')") public CommonResult submitReturnQuality(@Valid @RequestBody MesQcSeedReturnQualitySubmitReqVO reqVO) { return success(service.submitReturnQuality(reqVO)); } @PostMapping("/return/approve") @Operation(summary = "经销商退货质检销售部审批") @PreAuthorize("@ss.hasPermission('mes:qc-seed-quality:process-approve')") public CommonResult returnApprove(@Valid @RequestBody MesQcSeedQualityApprovalReqVO reqVO) { service.returnApprove(reqVO.getId(), reqVO.getApproved(), reqVO.getOpinion()); return success(true); } }