| | |
| | | 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; |
| | |
| | | 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; |
| | |
| | | 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; |
| | |
| | | private MesProWorkOrderParamRecordMapper paramRecordMapper; |
| | | @Resource |
| | | private MesProWorkOrderParamRecordDetailMapper paramRecordDetailMapper; |
| | | @Resource |
| | | private MesProFeedbackAuxMapper feedbackAuxMapper; |
| | | @Resource |
| | | private MesProWorktimeService worktimeService; |
| | | @Resource |
| | | private MesDvMachineryService machineryService; |
| | | |
| | | @PostMapping("/create") |
| | | @Operation(summary = "创建生产报工") |
| | |
| | | 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')") |
| | |
| | | } |
| | | })); |
| | | 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 -> { |
| | |
| | | // 工序 |
| | | 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)); |
| | |
| | | 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); |
| | | } |
| | | }); |
| | | } |
| | | |