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 = "创建生产报工")
@@ -221,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')")
@@ -314,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 -> {
@@ -326,6 +359,9 @@
            // 工序
            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));
@@ -363,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);
            }
        });
    }