| | |
| | | import com.baomidou.mybatisplus.core.metadata.IPage; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import com.ruoyi.common.utils.DateUtils; |
| | | import com.ruoyi.common.utils.SecurityUtils; |
| | | import com.ruoyi.common.utils.poi.ExcelUtil; |
| | | import com.ruoyi.framework.security.LoginUser; |
| | | import com.ruoyi.production.dto.*; |
| | | import com.ruoyi.production.mapper.SalesLedgerSchedulingMapper; |
| | | import com.ruoyi.production.mapper.SalesLedgerWorkMapper; |
| | |
| | | .map(SalesLedgerWork::getFinishedNum) |
| | | .reduce(BigDecimal.ZERO, BigDecimal::add)); |
| | | // 状态 = 数量和完工数量比较 |
| | | if(i.getSchedulingNum().compareTo(i.getSuccessNum()) == 0){ |
| | | if(i.getSchedulingNum().compareTo(new BigDecimal(0)) == 0){ |
| | | i.setStatus("未完成"); |
| | | } else if(i.getSchedulingNum().compareTo(i.getSuccessNum()) == 0){ |
| | | i.setStatus("已完成"); |
| | | }else{ |
| | | i.setStatus("未完成"); |
| | | i.setStatus("生产中"); |
| | | } |
| | | }); |
| | | return list; |
| | |
| | | private final SpeculativeTradingInfoMapper speculativeTradingInfoMapper; |
| | | |
| | | @Override |
| | | public int productionDispatch(ProductionDispatchAddDto productionDispatchAddDto) { |
| | | SysUser sysUser = sysUserMapper.selectUserById(productionDispatchAddDto.getSchedulingUserId()); |
| | | if(sysUser == null) throw new RuntimeException("排产人不存在"); |
| | | // 获取空余炒机 |
| | | String[] split = productionDispatchAddDto.getSpeculativeTradingName().split(","); |
| | | if(split != null && split.length == 0){ |
| | | throw new RuntimeException("生产炒机不能为空"); |
| | | } |
| | | List<SpeculativeTradingInfo> speculativeTradingInfos = speculativeTradingInfoMapper.selectList(new LambdaQueryWrapper<SpeculativeTradingInfo>() |
| | | .in(SpeculativeTradingInfo::getName, Arrays.asList(split)) |
| | | .orderByAsc(SpeculativeTradingInfo::getSort)); |
| | | if(CollectionUtils.isEmpty(speculativeTradingInfos)){ |
| | | throw new RuntimeException("无空余炒机,请检查炒机表"); |
| | | } |
| | | AtomicReference<String> name = new AtomicReference<>(""); //需要绑定的炒机 |
| | | //通过规格型号和排产数量计算本次生产产量 |
| | | String[] split1 = productionDispatchAddDto.getSpecificationModel().split("\\*"); |
| | | if(split1.length != 2) throw new RuntimeException("规格型号格式错误"); |
| | | // 本次生产产量 |
| | | BigDecimal productionNum = new BigDecimal(split1[0]) |
| | | .multiply(new BigDecimal(split1[1]).multiply(productionDispatchAddDto.getSchedulingNum())); |
| | | // 多个炒机情况 |
| | | if(speculativeTradingInfos.size() > 1){ |
| | | speculativeTradingInfos.forEach(item ->{ |
| | | // 获取该炒机正在排产量 |
| | | BigDecimal schedulingNumBySpeculativeTradingName = getSchedulingNumBySpeculativeTradingName(item.getName()); |
| | | // 如果该炒机总量 - 正在排产量 >=本次生产产量就分配此炒机 |
| | | if(item.getWorkLoad().subtract(schedulingNumBySpeculativeTradingName).compareTo(productionNum) >= 0){ |
| | | name.set(item.getName()); |
| | | public String productionDispatch(List<ProductionDispatchAddDto> productionDispatchAddDtoList) { |
| | | int i = 0; |
| | | int successNum = 0; |
| | | LoginUser loginUser = SecurityUtils.getLoginUser(); |
| | | for (ProductionDispatchAddDto productionDispatchAddDto : productionDispatchAddDtoList) { |
| | | SysUser sysUser = sysUserMapper.selectUserById(productionDispatchAddDto.getSchedulingUserId() == null ? loginUser.getUser().getUserId() : productionDispatchAddDto.getSchedulingUserId()); |
| | | if(sysUser == null){ |
| | | i++; |
| | | continue; |
| | | } |
| | | // 获取空余炒机 |
| | | String[] split = productionDispatchAddDto.getSpeculativeTradingName().split(","); |
| | | if(split != null && split.length == 0){ |
| | | i++; |
| | | continue; |
| | | } |
| | | List<SpeculativeTradingInfo> speculativeTradingInfos = speculativeTradingInfoMapper.selectList(new LambdaQueryWrapper<SpeculativeTradingInfo>() |
| | | .in(SpeculativeTradingInfo::getName, Arrays.asList(split)) |
| | | .orderByAsc(SpeculativeTradingInfo::getSort)); |
| | | if(CollectionUtils.isEmpty(speculativeTradingInfos)){ |
| | | i++; |
| | | continue; |
| | | } |
| | | AtomicReference<String> name = new AtomicReference<>(""); //需要绑定的炒机 |
| | | //通过规格型号和排产数量计算本次生产产量 |
| | | String[] split1 = productionDispatchAddDto.getSpecificationModel().split("\\*"); |
| | | if(split1.length != 2){ |
| | | i++; |
| | | continue; |
| | | } |
| | | // 本次生产产量 |
| | | BigDecimal productionNum = new BigDecimal(split1[0]) |
| | | .multiply(new BigDecimal(split1[1]).multiply(productionDispatchAddDto.getSchedulingNum())); |
| | | // 多个炒机情况 |
| | | if(speculativeTradingInfos.size() > 1){ |
| | | for (SpeculativeTradingInfo speculativeTradingInfo : speculativeTradingInfos) { |
| | | // 获取该炒机正在排产量 |
| | | BigDecimal schedulingNumBySpeculativeTradingName = getSchedulingNumBySpeculativeTradingName(speculativeTradingInfo.getName()); |
| | | // 如果该炒机总量(单位kg需要乘1000) - 正在排产量 >=本次生产产量就分配此炒机 |
| | | if(speculativeTradingInfo.getWorkLoad().multiply(new BigDecimal(1000)).subtract(schedulingNumBySpeculativeTradingName).compareTo(productionNum) >= 0){ |
| | | name.set(speculativeTradingInfo.getName()); |
| | | break; |
| | | } |
| | | } |
| | | }); |
| | | }else{ |
| | | // 单个炒机情况 |
| | | name.set(speculativeTradingInfos.get(0).getName()); |
| | | } |
| | | if(name.get().isEmpty()){ |
| | | i++; |
| | | continue; |
| | | } |
| | | SalesLedgerScheduling salesLedgerScheduling = SalesLedgerScheduling.builder() |
| | | .salesLedgerId(productionDispatchAddDto.getSalesLedgerId()) |
| | | .salesLedgerProductId(productionDispatchAddDto.getSalesLedgerProductId()) |
| | | .speculativeTradingName(name.get()) |
| | | .schedulingUserId(sysUser.getUserId()) |
| | | .schedulingUserName(sysUser.getNickName()) |
| | | .schedulingNum(productionDispatchAddDto.getSchedulingNum()) |
| | | .schedulingDate(productionDispatchAddDto.getSchedulingDate() == null ? LocalDate.now() : LocalDate.parse(productionDispatchAddDto.getSchedulingDate(), DateTimeFormatter.ofPattern("yyyy-MM-dd"))) |
| | | .status(1) |
| | | .build(); |
| | | salesLedgerSchedulingMapper.insert(salesLedgerScheduling); |
| | | successNum++; |
| | | } |
| | | if(name.get().isEmpty()) throw new RuntimeException("无空余炒机,请检查炒机表"); |
| | | SalesLedgerScheduling salesLedgerScheduling = SalesLedgerScheduling.builder() |
| | | .salesLedgerId(productionDispatchAddDto.getSalesLedgerId()) |
| | | .salesLedgerProductId(productionDispatchAddDto.getSalesLedgerProductId()) |
| | | .speculativeTradingName(name.get()) |
| | | .schedulingUserId(productionDispatchAddDto.getSchedulingUserId()) |
| | | .schedulingUserName(sysUser.getNickName()) |
| | | .schedulingNum(productionDispatchAddDto.getSchedulingNum()) |
| | | .schedulingDate(LocalDate.parse(productionDispatchAddDto.getSchedulingDate(), DateTimeFormatter.ISO_LOCAL_DATE)) |
| | | .status(1) |
| | | .build(); |
| | | return salesLedgerSchedulingMapper.insert(salesLedgerScheduling); |
| | | |
| | | return "派工成功数量" + successNum + ",失败数量" + i; |
| | | } |
| | | |
| | | private final SalesLedgerProductMapper salesLedgerProductMapper; |