gaoluyang
昨天 8c65f898ed6e5b0c7a94c792c4562f6ec831dccd
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/feedback/MesProFeedbackController.java
@@ -18,6 +18,10 @@
import cn.iocoder.yudao.module.mes.controller.admin.pro.feedback.vo.MesProFeedbackRespVO;
import cn.iocoder.yudao.module.mes.controller.admin.pro.feedback.vo.MesProFeedbackSaveReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.pro.feedback.vo.MesProFeedbackSubmitReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.pro.feedback.vo.MesProFeedbackWagePreviewReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.pro.feedback.vo.MesProFeedbackWagePreviewRespVO;
import cn.iocoder.yudao.module.mes.service.pro.wage.MesProFeedbackWageBreakdown;
import cn.iocoder.yudao.module.mes.dal.dataobject.dv.machinery.MesDvMachineryDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.md.workstation.MesMdWorkstationDO;
@@ -27,6 +31,7 @@
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.route.MesProRouteProcessDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.task.MesProTaskDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderDO;
import cn.iocoder.yudao.module.mes.service.dv.machinery.MesDvMachineryService;
import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService;
import cn.iocoder.yudao.module.mes.service.md.workstation.MesMdWorkstationService;
@@ -63,6 +68,11 @@
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderParamRecordDetailDO;
import cn.iocoder.yudao.module.mes.dal.mysql.pro.workorder.MesProWorkOrderParamRecordMapper;
import cn.iocoder.yudao.module.mes.dal.mysql.pro.workorder.MesProWorkOrderParamRecordDetailMapper;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.feedback.MesProFeedbackAuxDO;
import cn.iocoder.yudao.module.mes.dal.mysql.pro.feedback.MesProFeedbackAuxMapper;
import cn.iocoder.yudao.module.mes.service.pro.worktime.MesProWorktimeService;
import java.math.BigDecimal;
import java.math.RoundingMode;
import cn.iocoder.yudao.module.mes.enums.MesBizTypeConstants;
import java.io.IOException;
@@ -118,6 +128,12 @@
    private MesProWorkOrderParamRecordMapper paramRecordMapper;
    @Resource
    private MesProWorkOrderParamRecordDetailMapper paramRecordDetailMapper;
    @Resource
    private MesProFeedbackAuxMapper feedbackAuxMapper;
    @Resource
    private MesProWorktimeService worktimeService;
    @Resource
    private MesDvMachineryService machineryService;
    @PostMapping("/create")
    @Operation(summary = "创建生产报工")
@@ -146,7 +162,6 @@
    @GetMapping("/get")
    @Operation(summary = "获得生产报工")
    @Parameter(name = "id", description = "编号", required = true, example = "1024")
    @PreAuthorize("@ss.hasPermission('mes:pro-feedback:query')")
    public CommonResult<MesProFeedbackRespVO> getFeedback(@RequestParam("id") Long id) {
        MesProFeedbackDO feedback = feedbackService.getFeedback(id);
        if (feedback == null) {
@@ -157,7 +172,6 @@
    @GetMapping("/page")
    @Operation(summary = "获得生产报工分页")
    @PreAuthorize("@ss.hasPermission('mes:pro-feedback:query')")
    public CommonResult<PageResult<MesProFeedbackRespVO>> getFeedbackPage(@Valid MesProFeedbackPageReqVO pageReqVO) {
        PageResult<MesProFeedbackDO> pageResult = feedbackService.getFeedbackPage(pageReqVO);
        return success(new PageResult<>(buildFeedbackRespVOList(pageResult.getList()), pageResult.getTotal()));
@@ -166,7 +180,6 @@
    @GetMapping("/list-by-task")
    @Operation(summary = "按任务获得报工历史列表")
    @Parameter(name = "taskId", description = "任务编号", required = true, example = "1024")
    @PreAuthorize("@ss.hasPermission('mes:pro-feedback:query')")
    public CommonResult<List<MesProFeedbackRespVO>> getFeedbackListByTask(@RequestParam("taskId") Long taskId) {
        List<MesProFeedbackDO> list = feedbackService.getFeedbackListByTaskId(taskId);
        return success(buildFeedbackRespVOList(list));
@@ -224,6 +237,16 @@
        return success(feedbackService.quickCreateFeedback(reqVO));
    }
    @PostMapping("/preview-wage")
    @Operation(summary = "报工工资试算(不落库)")
    @PreAuthorize("@ss.hasPermission('mes:pro-feedback:query')")
    public CommonResult<MesProFeedbackWagePreviewRespVO> previewWage(
            @Valid @RequestBody MesProFeedbackWagePreviewReqVO reqVO) {
        MesProFeedbackWageBreakdown breakdown = feedbackService.previewWage(reqVO);
        MesProFeedbackWagePreviewRespVO resp = BeanUtils.toBean(breakdown, MesProFeedbackWagePreviewRespVO.class);
        return success(resp);
    }
    @PostMapping("/batch-create")
    @Operation(summary = "批量报工")
    @PreAuthorize("@ss.hasPermission('mes:pro-feedback:create')")
@@ -237,7 +260,6 @@
    @GetMapping("/trace/{id}")
    @Operation(summary = "获得报工追溯信息", description = "报工 + 产出/产出明细 + 消耗/消耗明细 + IPQC检验")
    @Parameter(name = "id", description = "报工编号", required = true, example = "1024")
    @PreAuthorize("@ss.hasPermission('mes:pro-feedback:query')")
    public CommonResult<MesProFeedbackTraceRespVO> getFeedbackTrace(@PathVariable("id") Long id) {
        MesProFeedbackDO feedback = feedbackService.getFeedback(id);
        if (feedback == null) {
@@ -318,6 +340,13 @@
            }
        }));
        Map<Long, MesMdUnitMeasureDO> paramUnitMeasureMap = unitMeasureService.getUnitMeasureMap(paramUnitIds);
        // 1.11 主计价设备
        Map<Long, MesDvMachineryDO> machineryMap = machineryService.getMachineryMap(
                convertSet(list, MesProFeedbackDO::getMachineryId));
        // 1.10 辅助工时明细
        Map<Long, List<MesProFeedbackAuxDO>> feedbackAuxMap = feedbackAuxMapper
                .selectListByFeedbackIds(convertSet(list, MesProFeedbackDO::getId)).stream()
                .collect(Collectors.groupingBy(MesProFeedbackAuxDO::getFeedbackId));
        // 2. 拼接 VO
        return BeanUtils.toBean(list, MesProFeedbackRespVO.class, vo -> {
@@ -330,12 +359,15 @@
            // 工序
            findAndThen(processMap, vo.getProcessId(), process ->
                    vo.setProcessCode(process.getCode()).setProcessName(process.getName()));
            // 主计价设备
            findAndThen(machineryMap, vo.getMachineryId(), machinery ->
                    vo.setMachineryName(machinery.getName()));
            // checkFlag
            findAndThen(routeProcessCheckFlagMap, vo.getRouteId(), processCheckMap ->
                    findAndThen(processCheckMap, vo.getProcessId(), vo::setCheckFlag));
            // 工单
            findAndThen(workOrderMap, vo.getWorkOrderId(), wo ->
                    vo.setWorkOrderCode(wo.getCode()).setWorkOrderName(wo.getName()));
                    vo.setWorkOrderCode(wo.getCode()).setWorkOrderName(wo.getName()).setReelNo(wo.getReelNo()));
            // 任务
            findAndThen(taskMap, vo.getTaskId(), task ->
                    vo.setTaskCode(task.getCode()));
@@ -367,6 +399,24 @@
                    return pv;
                }).toList());
            }
            // 辅助工时明细 + 工时差异(标准工时只用于考核对比)
            List<MesProFeedbackAuxDO> auxList = feedbackAuxMap.get(vo.getId());
            if (CollUtil.isNotEmpty(auxList)) {
                vo.setAuxList(BeanUtils.toBean(auxList, MesProFeedbackRespVO.AuxResp.class));
            }
            BigDecimal standardHours = vo.getStandardWorkHours();
            BigDecimal actualHours = vo.getWorkHours() != null ? vo.getWorkHours() : BigDecimal.ZERO;
            if (standardHours != null && standardHours.signum() > 0) {
                BigDecimal diff = actualHours.subtract(standardHours).setScale(2, RoundingMode.HALF_UP);
                vo.setWorkHoursDiff(diff);
                vo.setWorkHoursDiffRate(diff.multiply(BigDecimal.valueOf(100))
                        .divide(standardHours, 2, RoundingMode.HALF_UP));
                String warnMessage = worktimeService.buildWarnMessage(actualHours, standardHours);
                vo.setStandardWarnFlag(warnMessage != null);
                vo.setStandardWarnMessage(warnMessage);
            } else {
                vo.setStandardWarnFlag(false);
            }
        });
    }