package org.jeecg.modules.mes.controller; import cn.hutool.core.collection.CollectionUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang.StringUtils; import org.apache.shiro.SecurityUtils; import org.jeecg.common.api.vo.Result; import org.jeecg.common.aspect.annotation.AutoLog; import org.jeecg.common.constant.CommonConstant; import org.jeecg.common.system.base.controller.JeecgController; import org.jeecg.common.system.query.QueryGenerator; import org.jeecg.common.system.vo.LoginUser; import org.jeecg.modules.mes.dto.MesProductionWorkOrderRepublishRequest; import org.jeecg.modules.mes.dto.MesProductionWorkScheduleRequest; import org.jeecg.modules.mes.entity.MesProductionWorkOrder; import org.jeecg.modules.mes.enums.ProductionWorkOrderStatus; import org.jeecg.modules.mes.service.IMesProductionWorkOrderService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.*; import java.util.stream.Collectors; /** * @Description: 排产工单 * @Author: jeecg-boot * @Date: 2025-07-04 * @Version: V1.0 */ @Api(tags = "排产工单") @RestController @RequestMapping("/mesproductionworkorder/mesProductionWorkOrder") @Slf4j public class MesProductionWorkOrderController extends JeecgController { @Autowired private IMesProductionWorkOrderService mesProductionWorkOrderService; /** * 分页列表查询 * * @param mesProductionWorkOrder * @param pageNo * @param pageSize * @param req * @return */ //@AutoLog(value = "排产工单-分页列表查询") @ApiOperation(value = "排产工单-分页列表查询", notes = "排产工单-分页列表查询") @GetMapping(value = "/list") public Result> queryPageList(MesProductionWorkOrder mesProductionWorkOrder, @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo, @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize, HttpServletRequest req) { Map parameterMap = req.getParameterMap(); QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(mesProductionWorkOrder, parameterMap); Page page = new Page(pageNo, pageSize); IPage pageList = mesProductionWorkOrderService.queryPageList(page, parameterMap); return Result.OK(pageList); } /** * 添加 * * @param mesProductionWorkOrder * @return */ @AutoLog(value = "排产工单-添加") @ApiOperation(value = "排产工单-添加", notes = "排产工单-添加") //@RequiresPermissions("org.jeecg.modules:mes_production_work_order:add") @PostMapping(value = "/add") public Result add(@RequestBody MesProductionWorkOrder mesProductionWorkOrder) { mesProductionWorkOrderService.save(mesProductionWorkOrder); return Result.OK("添加成功!"); } @AutoLog(value = "排产工单-保存排产计划") @ApiOperation(value = "排产工单-保存排产计划", notes = "排产工单-保存排产计划") //@RequiresPermissions("org.jeecg.modules:mes_production_work_order:saveSchedulePlan") @PostMapping("/addSchedulePlan") public Result addSchedulePlan(@RequestBody List mesProductionWorkOrderList) { if (!validatePlan(mesProductionWorkOrderList)) { return Result.error("排产计划不合理,保存失败!"); } mesProductionWorkOrderList.forEach(item -> { if (Objects.isNull(item.getId())) { item.setWorkOrderStatus(ProductionWorkOrderStatus.NEW.name()); } }); mesProductionWorkOrderService.saveOrUpdateBatch(mesProductionWorkOrderList); return Result.OK("添加成功!"); } private boolean validatePlan(List mesProductionWorkOrderList) { //同一物料、同一日期下、只能存在一个班次 Map> orderMapByMaterial = mesProductionWorkOrderList.stream() .collect(Collectors.groupingBy(MesProductionWorkOrder::getMaterialNumber)); for (String materialNumber : orderMapByMaterial.keySet()) { List workOrderList = orderMapByMaterial.get(materialNumber); Map> orderMapByDate = workOrderList.stream() .collect(Collectors.groupingBy(MesProductionWorkOrder::getWorkOrderDate)); for (Date date : orderMapByDate.keySet()) { List orderList = orderMapByDate.get(date); Map> orderMapByShift = orderList.stream() .collect(Collectors.groupingBy(MesProductionWorkOrder::getShiftId)); for (String shiftId : orderMapByShift.keySet()) { List list = orderMapByShift.get(shiftId); if (list.size() > 1) { return false; } } } } return true; } @AutoLog(value = "排产工单-生成排产计划") @ApiOperation(value = "排产工单-生成排产计划", notes = "排产工单-生成排产计划") //@RequiresPermissions("org.jeecg.modules:mes_production_work_order:schedule") @GetMapping(value = "/schedule") public Result schedule(MesProductionWorkScheduleRequest request) { if (StringUtils.isBlank(request.getFactoryId()) || Objects.isNull(request.getStartDate()) || Objects.isNull(request.getEndDate())) { return Result.error("请传入必要参数!"); } return Result.ok(mesProductionWorkOrderService.schedule(request)); } @AutoLog(value = "排产工单-发布排产计划") @ApiOperation(value = "排产工单-发布排产计划", notes = "排产工单-发布排产计划") //@RequiresPermissions("mes:production:work:order:publish") @RequestMapping(value = "/publish", method = {RequestMethod.POST, RequestMethod.PUT}) public Result publish(@RequestParam("ids") String ids) { List idList = Arrays.asList(ids.split(",")); List list = mesProductionWorkOrderService.list(new LambdaQueryWrapper() .in(MesProductionWorkOrder::getId, idList) .eq(MesProductionWorkOrder::getDelFlag, CommonConstant.DEL_FLAG_0)).stream() .filter(i -> !ProductionWorkOrderStatus.NEW.name().equals(i.getWorkOrderStatus())) .collect(Collectors.toList()); if (!list.isEmpty()) { return Result.error("已发布的排产计划不能重复发布!"); } List publishList = CollectionUtil.newArrayList(); idList.forEach(id -> { MesProductionWorkOrder publish = new MesProductionWorkOrder() .setId(id) .setPublishTime(new Date()) .setPublisher(Objects.requireNonNull(getCurrentUser()).getUsername()) .setWorkOrderStatus(ProductionWorkOrderStatus.PUBLISHED.name()); publishList.add(publish); }); mesProductionWorkOrderService.updateBatchById(publishList); return Result.OK("发布成功"); } @AutoLog(value = "排产工单-重发布排产计划") @ApiOperation(value="排产工单-重发布排产计划", notes="重发布排产计划") //@RequiresPermissions("mes:production:work:order:republish") @PostMapping(value = "/republish") public Result republish(@RequestBody MesProductionWorkOrderRepublishRequest request) { MesProductionWorkOrder workOrder = mesProductionWorkOrderService.getById(request.getId()); if (ProductionWorkOrderStatus.NEW.name().equals(workOrder.getWorkOrderStatus()) || ProductionWorkOrderStatus.CLOSED.name().equals(workOrder.getWorkOrderStatus())) { return Result.error("当前工单状态不支持重发布!"); } MesProductionWorkOrder republish = new MesProductionWorkOrder() .setId(request.getId()) .setPlanQuantity(request.getPlanQuantity()) .setRepublisher(Objects.requireNonNull(getCurrentUser()).getUsername()) .setRepublishTime(new Date()) .setRepublishReason(request.getRepublishReason()); mesProductionWorkOrderService.updateById(republish); return Result.ok("重发布成功!"); } @AutoLog(value = "排产工单-执行排产工单计划") @ApiOperation(value = "排产工单-执行排产工单计划", notes = "排产工单-执行排产工单计划") @GetMapping(value = "/execute") public Result execute(@RequestParam("id") String id) { MesProductionWorkOrder workOrder = mesProductionWorkOrderService.getById(id); if (!ProductionWorkOrderStatus.PUBLISHED.name().equals(workOrder.getWorkOrderStatus())) { return Result.error("当前工单状态不能执行!"); } //todo 齐套性检查、工艺点检、设备点检 的校验逻辑 MesProductionWorkOrder executeOrder = new MesProductionWorkOrder() .setId(id) .setWorkOrderStatus(ProductionWorkOrderStatus.EXECUTING.name()); mesProductionWorkOrderService.updateById(executeOrder); return Result.ok("执行成功!"); } /** * 编辑 * * @param mesProductionWorkOrder * @return */ @AutoLog(value = "排产工单-编辑") @ApiOperation(value = "排产工单-编辑", notes = "排产工单-编辑") //@RequiresPermissions("org.jeecg.modules:mes_production_work_order:edit") @RequestMapping(value = "/edit", method = {RequestMethod.PUT, RequestMethod.POST}) public Result edit(@RequestBody MesProductionWorkOrder mesProductionWorkOrder) { mesProductionWorkOrderService.updateById(mesProductionWorkOrder); return Result.OK("编辑成功!"); } /** * 通过id删除 * * @param id * @return */ @AutoLog(value = "排产工单-通过id删除") @ApiOperation(value = "排产工单-通过id删除", notes = "排产工单-通过id删除") //@RequiresPermissions("org.jeecg.modules:mes_production_work_order:delete") @DeleteMapping(value = "/delete") public Result delete(@RequestParam(name = "id", required = true) String id) { mesProductionWorkOrderService.removeById(id); return Result.OK("删除成功!"); } /** * 批量删除 * * @param ids * @return */ @AutoLog(value = "排产工单-批量删除") @ApiOperation(value = "排产工单-批量删除", notes = "排产工单-批量删除") //@RequiresPermissions("org.jeecg.modules:mes_production_work_order:deleteBatch") @DeleteMapping(value = "/deleteBatch") public Result deleteBatch(@RequestParam(name = "ids", required = true) String ids) { this.mesProductionWorkOrderService.removeByIds(Arrays.asList(ids.split(","))); return Result.OK("批量删除成功!"); } /** * 通过id查询 * * @param id * @return */ //@AutoLog(value = "排产工单-通过id查询") @ApiOperation(value = "排产工单-通过id查询", notes = "排产工单-通过id查询") @GetMapping(value = "/queryById") public Result queryById(@RequestParam(name = "id", required = true) String id) { MesProductionWorkOrder mesProductionWorkOrder = mesProductionWorkOrderService.getById(id); if (mesProductionWorkOrder == null) { return Result.error("未找到对应数据"); } return Result.OK(mesProductionWorkOrder); } /** * 导出excel * * @param request * @param mesProductionWorkOrder */ //@RequiresPermissions("org.jeecg.modules:mes_production_work_order:exportXls") @RequestMapping(value = "/exportXls") public ModelAndView exportXls(HttpServletRequest request, MesProductionWorkOrder mesProductionWorkOrder) { return super.exportXls(request, mesProductionWorkOrder, MesProductionWorkOrder.class, "排产工单"); } /** * 通过excel导入数据 * * @param request * @param response * @return */ //@RequiresPermissions("mes_production_work_order:importExcel") @RequestMapping(value = "/importExcel", method = RequestMethod.POST) public Result importExcel(HttpServletRequest request, HttpServletResponse response) { return super.importExcel(request, response, MesProductionWorkOrder.class); } private LoginUser getCurrentUser() { try { return (LoginUser) SecurityUtils.getSubject().getPrincipal(); } catch (Exception e) { return null; } } }