|
|
|
@ -2,26 +2,30 @@ package org.jeecg.modules.productplan.service.impl; |
|
|
|
|
|
|
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
|
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
|
|
|
|
import org.apache.commons.lang3.StringUtils; |
|
|
|
|
import org.jeecg.common.exception.JeecgBootException; |
|
|
|
|
import org.jeecg.modules.demo.pro.entity.ZyProcessMachine; |
|
|
|
|
import org.jeecg.modules.demo.pro.service.IZyProcessMachineService; |
|
|
|
|
import org.jeecg.modules.operationtool.entity.ZyOperationtool; |
|
|
|
|
import org.jeecg.modules.operationtool.service.IZyOperationtoolService; |
|
|
|
|
import org.jeecg.modules.productplan.entity.ZyPlanProcess; |
|
|
|
|
import org.jeecg.modules.productplan.entity.ZyPlanProcessAccessories; |
|
|
|
|
import org.jeecg.modules.productplan.entity.ZyPlanProcessFabric; |
|
|
|
|
import org.jeecg.modules.productplan.entity.ZyProductPlan; |
|
|
|
|
import org.jeecg.modules.productplan.enums.ProductPlanStatusEnum; |
|
|
|
|
import org.jeecg.modules.productplan.mapper.ZyPlanProcessAccessoriesMapper; |
|
|
|
|
import org.jeecg.modules.productplan.mapper.ZyPlanProcessFabricMapper; |
|
|
|
|
import org.jeecg.modules.productplan.mapper.ZyProductPlanMapper; |
|
|
|
|
import org.jeecg.modules.productplan.service.IZyPlanProcessService; |
|
|
|
|
import org.jeecg.modules.productplan.service.IZyProductPlanAutoService; |
|
|
|
|
import org.jeecg.modules.productplan.service.IZyProductPlanService; |
|
|
|
|
import org.jeecg.modules.productplan.service.*; |
|
|
|
|
import org.jeecg.modules.productprocessaccessories.service.IProductProcessAccessoriesService; |
|
|
|
|
import org.jeecg.modules.productprocessfabric.entity.ProductProcessFabric; |
|
|
|
|
import org.jeecg.modules.productprocessfabric.service.IProductProcessFabricService; |
|
|
|
|
import org.jeecg.modules.system.entity.SysDepart; |
|
|
|
|
import org.jeecg.modules.system.entity.SysUser; |
|
|
|
|
import org.jeecg.modules.system.service.ISysDepartService; |
|
|
|
|
import org.jeecg.modules.system.service.ISysUserService; |
|
|
|
|
import org.jeecg.modules.team.entity.Groupx; |
|
|
|
|
import org.jeecg.modules.team.entity.Station; |
|
|
|
|
import org.jeecg.modules.team.entity.StationMachine; |
|
|
|
|
import org.jeecg.modules.team.service.IGroupxService; |
|
|
|
|
import org.jeecg.modules.team.service.IStationMachineService; |
|
|
|
|
import org.jeecg.modules.team.service.IStationService; |
|
|
|
|
import org.jeecg.modules.team.entity.*; |
|
|
|
|
import org.jeecg.modules.team.service.*; |
|
|
|
|
import org.jeecg.modules.workorder.entity.WorkOrder; |
|
|
|
|
import org.jeecg.modules.workorder.enums.WorkOrderStatusEnum; |
|
|
|
|
import org.jeecg.modules.workorder.service.IWorkOrderService; |
|
|
|
@ -63,15 +67,30 @@ public class IZyProductPlanAutoServiceImpl extends ServiceImpl<ZyProductPlanMapp |
|
|
|
|
@Autowired |
|
|
|
|
private IGroupxService iGroupxService; |
|
|
|
|
|
|
|
|
|
@Autowired |
|
|
|
|
private IGroupxMemberService iGroupxMemberService; |
|
|
|
|
|
|
|
|
|
@Autowired |
|
|
|
|
private IStationService iStationService; |
|
|
|
|
|
|
|
|
|
@Autowired |
|
|
|
|
private IZyProcessMachineService iZyProcessMachineService; |
|
|
|
|
|
|
|
|
|
@Autowired |
|
|
|
|
private IZyOperationtoolService iZyOperationtoolService; |
|
|
|
|
@Autowired |
|
|
|
|
private IStationMachineService iStationMachineService; |
|
|
|
|
|
|
|
|
|
@Transactional(rollbackFor = Exception.class, readOnly = false) |
|
|
|
|
@Autowired |
|
|
|
|
private IStationToolService iStationToolService; |
|
|
|
|
|
|
|
|
|
@Autowired |
|
|
|
|
private IZyPlanProcessFabricService iZyPlanProcessFabricService; |
|
|
|
|
@Autowired |
|
|
|
|
private IZyPlanProcessAccessoriesService iZyPlanProcessAccessoriesService; |
|
|
|
|
|
|
|
|
|
// @Transactional(rollbackFor = Exception.class, readOnly = false)
|
|
|
|
|
@Transactional |
|
|
|
|
List<ZyProductPlan> saveProductPlan(List<WorkOrder> workOrderList) { |
|
|
|
|
|
|
|
|
|
if (ObjectUtils.isEmpty(workOrderList)) return Collections.EMPTY_LIST; |
|
|
|
@ -90,6 +109,8 @@ public class IZyProductPlanAutoServiceImpl extends ServiceImpl<ZyProductPlanMapp |
|
|
|
|
//2,保存生产计划
|
|
|
|
|
ZyProductPlan zyProductPlan = new ZyProductPlan(); |
|
|
|
|
zyProductPlan.setProductCode(productCode); |
|
|
|
|
// zyProductPlan.setProductNo(StringUtils.isNotBlank(zyProduct.getProductCode()) ? zyProduct.getProductCode() : "");
|
|
|
|
|
zyProductPlan.setProductName(zyProduct.getProductName()); |
|
|
|
|
//生产时长,取zy_product表生产时间
|
|
|
|
|
zyProductPlan.setDuration(zyProduct.getProduceTime()); |
|
|
|
|
SysDepart sysDepart = sysDepartList2.get(i.get()); |
|
|
|
@ -104,7 +125,7 @@ public class IZyProductPlanAutoServiceImpl extends ServiceImpl<ZyProductPlanMapp |
|
|
|
|
} |
|
|
|
|
//车间
|
|
|
|
|
zyProductPlan.setWorkshopId(sysDepart.getId()); |
|
|
|
|
List<Groupx> groupxList = iGroupxService.list(new LambdaQueryWrapper<Groupx>().eq(Groupx::getDepartId, sysDepart)); |
|
|
|
|
List<Groupx> groupxList = iGroupxService.list(new LambdaQueryWrapper<Groupx>().eq(Groupx::getDepartId, sysDepart.getId())); |
|
|
|
|
if (!ObjectUtils.isEmpty(groupxList)) { |
|
|
|
|
Groupx groupx = groupxList.get(0); |
|
|
|
|
//班组
|
|
|
|
@ -112,8 +133,13 @@ public class IZyProductPlanAutoServiceImpl extends ServiceImpl<ZyProductPlanMapp |
|
|
|
|
//班长
|
|
|
|
|
zyProductPlan.setTeamLeader(groupx.getEnterprisesManager()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
//保存生产计划
|
|
|
|
|
iZyProductPlanService.create(zyProductPlan); |
|
|
|
|
zyProductPlan.setStatus(new Integer(ProductPlanStatusEnum.UNAUDITED.getCode())); |
|
|
|
|
iZyProductPlanService.save(zyProductPlan); |
|
|
|
|
//更新work_order表work_order_status为“1” (不能为其新增生产计划)
|
|
|
|
|
iWorkOrderService.lambdaUpdate().set(WorkOrder::getWorkOrderStatus, WorkOrderStatusEnum.REVIEWED.getCode()).update(); |
|
|
|
|
|
|
|
|
|
zyProductPlanProductCodes.add(productCode); |
|
|
|
|
}); |
|
|
|
|
//根据productCode,查询本次创建生产计划
|
|
|
|
@ -182,16 +208,28 @@ public class IZyProductPlanAutoServiceImpl extends ServiceImpl<ZyProductPlanMapp |
|
|
|
|
List<ZyProductPlan> productPlanList = this.saveProductPlan(workOrderList); |
|
|
|
|
if (ObjectUtils.isEmpty(productPlanList)) return; |
|
|
|
|
|
|
|
|
|
//3,保存计划生产工序
|
|
|
|
|
//3,同步计划生产工序、同步生产计划工序面料、同步生产计划辅料
|
|
|
|
|
productPlanList.stream().forEach(f -> { |
|
|
|
|
ZyPlanProcess zyPlanProcess = new ZyPlanProcess(); |
|
|
|
|
zyPlanProcess.setPlanId(f.getId()); |
|
|
|
|
zyPlanProcessService.syncProductBaseProcess(zyPlanProcess); |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
//4,自动排位
|
|
|
|
|
//4,自动排位(匹配工序设备、工序工具、工人)
|
|
|
|
|
// 匹配工序设备、工序工具有一个工序失败,则工单作为异常处理,删除生产计划及相关子表
|
|
|
|
|
//只有一个生产计划的设备、工具都匹配成功才进行一下操作(生成物料单、发送到仓库)
|
|
|
|
|
productPlanList.stream().forEach(k -> { |
|
|
|
|
this.filling4Auto(k.getId()); |
|
|
|
|
// boolean b = this.filling4Auto(k.getId());
|
|
|
|
|
// if (b) {
|
|
|
|
|
List<ZyPlanProcess> planProcessList = zyPlanProcessService.list(new LambdaQueryWrapper<ZyPlanProcess>().eq(ZyPlanProcess::getPlanId, k.getId())); |
|
|
|
|
Optional.ofNullable(planProcessList).orElse(new LinkedList<>()).forEach(e -> { |
|
|
|
|
// 5,生成物料单
|
|
|
|
|
zyPlanProcessService.createMaterialBill(e); |
|
|
|
|
// 5,发送到仓库
|
|
|
|
|
zyPlanProcessService.sendToRepository(e); |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
// }
|
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -202,7 +240,7 @@ public class IZyProductPlanAutoServiceImpl extends ServiceImpl<ZyProductPlanMapp |
|
|
|
|
* @param planId |
|
|
|
|
*/ |
|
|
|
|
@Override |
|
|
|
|
public void filling4Auto(String planId) { |
|
|
|
|
public boolean filling4Auto(String planId) { |
|
|
|
|
ZyProductPlan zyProductPlan = iZyProductPlanService.getById(planId); |
|
|
|
|
if (ObjectUtils.isEmpty(zyProductPlan)) { |
|
|
|
|
throw new JeecgBootException("生产计划不存在!"); |
|
|
|
@ -210,7 +248,7 @@ public class IZyProductPlanAutoServiceImpl extends ServiceImpl<ZyProductPlanMapp |
|
|
|
|
|
|
|
|
|
List<ZyPlanProcess> planProcessList = zyPlanProcessService.list(new LambdaQueryWrapper<ZyPlanProcess>().eq(ZyPlanProcess::getPlanId, planId)); |
|
|
|
|
//是否有计划工序
|
|
|
|
|
if (ObjectUtils.isEmpty(planProcessList)) return; |
|
|
|
|
if (ObjectUtils.isEmpty(planProcessList)) return false; |
|
|
|
|
|
|
|
|
|
//生产计划车间工位列表
|
|
|
|
|
List<Station> stationList = iStationService.list(new LambdaQueryWrapper<Station>().eq(Station::getDepartId, zyProductPlan.getWorkshopId())); |
|
|
|
@ -221,9 +259,15 @@ public class IZyProductPlanAutoServiceImpl extends ServiceImpl<ZyProductPlanMapp |
|
|
|
|
* 依次用该生产计划的车间工位设备循环与工序设备比对【(工位设备包含工序设备即是匹配成功,则自动填充工位、设备字段数据,匹配不上则不自动填充,由用户自己录入)】 |
|
|
|
|
* 根据工序,查询工序设备表zy_process_machine, |
|
|
|
|
*/ |
|
|
|
|
if(this.diffMachine(planProcessList, stationList, planId)){ |
|
|
|
|
//TODO 匹配工具
|
|
|
|
|
boolean b = this.diff(planProcessList, stationList, planId); |
|
|
|
|
//工序匹配失败,已删除生产计划、生产计划工序
|
|
|
|
|
if (!b) { |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
//匹配工人
|
|
|
|
|
this.diffWorker(planProcessList, planId); |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
@ -234,48 +278,119 @@ public class IZyProductPlanAutoServiceImpl extends ServiceImpl<ZyProductPlanMapp |
|
|
|
|
* @param stationList |
|
|
|
|
*/ |
|
|
|
|
@Transactional(rollbackFor = Exception.class, readOnly = false) |
|
|
|
|
public boolean diffMachine(List<ZyPlanProcess> planProcessList, List<Station> stationList, final String planId) { |
|
|
|
|
if (ObjectUtils.isEmpty(stationList) || ObjectUtils.isEmpty(planProcessList)) return false; |
|
|
|
|
public boolean diff(List<ZyPlanProcess> planProcessList, List<Station> stationList, final String planId) { |
|
|
|
|
|
|
|
|
|
AtomicBoolean b = new AtomicBoolean(true); |
|
|
|
|
List<ZyPlanProcess> updateList = new LinkedList<>(); |
|
|
|
|
k: if (b.get()) { |
|
|
|
|
f: for (int i = 0; i < planProcessList.size(); i++) { |
|
|
|
|
if (ObjectUtils.isEmpty(stationList) || ObjectUtils.isEmpty(planProcessList)) return false; |
|
|
|
|
AtomicBoolean b = new AtomicBoolean(true); |
|
|
|
|
flag: |
|
|
|
|
if (b.get()) { |
|
|
|
|
planProcessList: |
|
|
|
|
for (int i = 0; i < planProcessList.size(); i++) { |
|
|
|
|
ZyPlanProcess obj = planProcessList.get(i); |
|
|
|
|
List<ZyProcessMachine> machineList = iZyProcessMachineService.list(new LambdaQueryWrapper<ZyProcessMachine>().eq(ZyProcessMachine::getProcessId, obj.getProcessId())); |
|
|
|
|
List<ZyOperationtool> toolList = iZyOperationtoolService.list(new LambdaQueryWrapper<ZyOperationtool>().eq(ZyOperationtool::getOperationid, obj.getProcessId())); |
|
|
|
|
List<String> zyProcessMachineIds = machineList.stream().map(ZyProcessMachine::getMachineId).collect(Collectors.toList()); |
|
|
|
|
for (int j = 0; j < stationList.size(); j++) { |
|
|
|
|
Station station = stationList.get(j); |
|
|
|
|
List<StationMachine> stationMachineList = iStationMachineService.list(new LambdaQueryWrapper<StationMachine>().eq(StationMachine::getStationId, station.getId())); |
|
|
|
|
List<String> stationMachineIds = Optional.ofNullable(stationMachineList).orElse(new ArrayList<>()).stream() |
|
|
|
|
.map(StationMachine::getMachineId).collect(Collectors.toList()); |
|
|
|
|
// 设备匹配成功
|
|
|
|
|
if (stationMachineIds.containsAll(zyProcessMachineIds)) { |
|
|
|
|
String collect = zyProcessMachineIds.stream().collect(Collectors.joining(",")); |
|
|
|
|
obj.setMachineIds(collect); |
|
|
|
|
obj.setMachineNames(iStationMachineService.convertByMachineIds(zyProcessMachineIds)); |
|
|
|
|
obj.setStationId(station.getId()); |
|
|
|
|
obj.setStationName(station.getStationName()); |
|
|
|
|
obj.setStationNum(station.getStationNum()); |
|
|
|
|
updateList.add(obj); |
|
|
|
|
break f; |
|
|
|
|
} else { |
|
|
|
|
// 作工单异常处理,删除该工单的生产计划,删除生产计划工序
|
|
|
|
|
ZyProductPlan zyProductPlan = iZyProductPlanService.getById(planId); |
|
|
|
|
iWorkOrderService.lambdaUpdate() |
|
|
|
|
.set(WorkOrder::getWorkOrderStatus, WorkOrderStatusEnum.EXCEPTION.getCode()) |
|
|
|
|
.eq(WorkOrder::getProductCode, zyProductPlan.getProductCode()).update(); |
|
|
|
|
zyPlanProcessService.remove(new LambdaQueryWrapper<ZyPlanProcess>().in(ZyPlanProcess::getPlanId, planId)); |
|
|
|
|
iZyProductPlanService.remove(new LambdaQueryWrapper<ZyProductPlan>().in(ZyProductPlan::getId, planId)); |
|
|
|
|
List<String> zyProcessToolIds = toolList.stream().map(ZyOperationtool::getOperationid).collect(Collectors.toList()); |
|
|
|
|
|
|
|
|
|
ZyPlanProcess diffMachine = this.diffMachine(obj, zyProcessMachineIds, stationList); |
|
|
|
|
//设备匹配失败,直接结束
|
|
|
|
|
if (ObjectUtils.isEmpty(diffMachine)) { |
|
|
|
|
b.set(false); |
|
|
|
|
break flag; |
|
|
|
|
} else { // 设备匹配,则匹配工具
|
|
|
|
|
ZyPlanProcess diffTool = this.diffTool(diffMachine, zyProcessToolIds, stationList); |
|
|
|
|
if (ObjectUtils.isEmpty(diffTool)) { |
|
|
|
|
b.set(false); |
|
|
|
|
break k; |
|
|
|
|
break flag; |
|
|
|
|
} else { // 匹配工人
|
|
|
|
|
updateList.add(diffTool); |
|
|
|
|
//匹配下一个工序的设备和工具
|
|
|
|
|
continue planProcessList; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if (b.get()) { |
|
|
|
|
zyPlanProcessService.saveOrUpdateBatch(updateList); |
|
|
|
|
return true; |
|
|
|
|
} else { |
|
|
|
|
ZyProductPlan zyProductPlan = iZyProductPlanService.getById(planId); |
|
|
|
|
// 1,作工单异常处理,
|
|
|
|
|
iWorkOrderService.lambdaUpdate() |
|
|
|
|
.set(WorkOrder::getWorkOrderStatus, WorkOrderStatusEnum.EXCEPTION.getCode()) |
|
|
|
|
.eq(WorkOrder::getProductCode, zyProductPlan.getProductCode()).update(); |
|
|
|
|
// 2,删除生产计划工序面料
|
|
|
|
|
iZyPlanProcessFabricService.remove(new LambdaQueryWrapper<ZyPlanProcessFabric>().in(ZyPlanProcessFabric::getPlanId, planId)); |
|
|
|
|
// 3,删除生产计划工序辅料
|
|
|
|
|
iZyPlanProcessAccessoriesService.remove(new LambdaQueryWrapper<ZyPlanProcessAccessories>().in(ZyPlanProcessAccessories::getPlanId, planId)); |
|
|
|
|
// 4,删除生产计划工序
|
|
|
|
|
zyPlanProcessService.remove(new LambdaQueryWrapper<ZyPlanProcess>().in(ZyPlanProcess::getPlanId, planId)); |
|
|
|
|
// 5,删除生产计划
|
|
|
|
|
iZyProductPlanService.remove(new LambdaQueryWrapper<ZyProductPlan>().in(ZyProductPlan::getId, planId)); |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Transactional(rollbackFor = Exception.class, readOnly = false) |
|
|
|
|
public void diffWorker(List<ZyPlanProcess> zyPlanProcessList, final String planId) { |
|
|
|
|
ZyProductPlan zyProductPlan = iZyProductPlanService.getById(planId); |
|
|
|
|
Groupx groupx = iGroupxService.getOne(new LambdaQueryWrapper<Groupx>().eq(Groupx::getDepartId, zyProductPlan.getWorkshopId())); |
|
|
|
|
List<GroupxMember> memberList = iGroupxMemberService.list(new LambdaQueryWrapper<GroupxMember>() |
|
|
|
|
.eq(GroupxMember::getGroupxId, groupx.getId())); |
|
|
|
|
if (ObjectUtils.isEmpty(memberList)) return; |
|
|
|
|
|
|
|
|
|
int size = zyPlanProcessList.size(); |
|
|
|
|
List<GroupxMember> groupxMember2 = new LinkedList<>(); |
|
|
|
|
groupxMember2.addAll(memberList); |
|
|
|
|
int size2 = groupxMember2.size(); |
|
|
|
|
while (size2 < size) { |
|
|
|
|
groupxMember2.addAll(memberList); |
|
|
|
|
size2 = groupxMember2.size(); |
|
|
|
|
} |
|
|
|
|
AtomicInteger i = new AtomicInteger(0); |
|
|
|
|
Optional.ofNullable(zyPlanProcessList).orElse(new LinkedList<>()).forEach(e -> { |
|
|
|
|
GroupxMember groupxMember = groupxMember2.get(i.get()); |
|
|
|
|
e.setUserIds(groupxMember.getUserId()); |
|
|
|
|
SysUser sysUser = iSysUserService.getById(groupxMember.getUserId()); |
|
|
|
|
e.setUserNames(sysUser.getRealname()); |
|
|
|
|
i.set(i.get() + 1); |
|
|
|
|
}); |
|
|
|
|
zyPlanProcessService.saveOrUpdateBatch(zyPlanProcessList); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
ZyPlanProcess diffMachine(ZyPlanProcess zyPlanProcess, List<String> zyProcessMachineIds, List<Station> stationList) { |
|
|
|
|
for (int j = 0; j < stationList.size(); j++) { |
|
|
|
|
Station station = stationList.get(j); |
|
|
|
|
List<StationMachine> stationMachineList = iStationMachineService.list(new LambdaQueryWrapper<StationMachine>().eq(StationMachine::getStationId, station.getId())); |
|
|
|
|
List<String> stationMachineIds = Optional.ofNullable(stationMachineList).orElse(new ArrayList<>()).stream() |
|
|
|
|
.map(StationMachine::getMachineId).collect(Collectors.toList()); |
|
|
|
|
// 设备匹配成功
|
|
|
|
|
if (stationMachineIds.containsAll(zyProcessMachineIds)) { |
|
|
|
|
String machineIds = zyProcessMachineIds.stream().collect(Collectors.joining(",")); |
|
|
|
|
zyPlanProcess.setMachineIds(machineIds); |
|
|
|
|
zyPlanProcess.setMachineNames(iStationMachineService.convertByMachineIds(zyProcessMachineIds)); |
|
|
|
|
zyPlanProcess.setStationId(station.getId()); |
|
|
|
|
zyPlanProcess.setStationName(station.getStationName()); |
|
|
|
|
zyPlanProcess.setStationNum(station.getStationNum()); |
|
|
|
|
return zyPlanProcess; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
return null; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
ZyPlanProcess diffTool(ZyPlanProcess zyPlanProcess, List<String> zyProcessToolIds, List<Station> stationList) { |
|
|
|
|
for (int j = 0; j < stationList.size(); j++) { |
|
|
|
|
Station station = stationList.get(j); |
|
|
|
|
List<StationTool> stationToolList = iStationToolService.list(new LambdaQueryWrapper<StationTool>().eq(StationTool::getToolsId, station.getId())); |
|
|
|
|
List<String> stationToolIds = Optional.ofNullable(stationToolList).orElse(new ArrayList<>()).stream() |
|
|
|
|
.map(StationTool::getToolsId).collect(Collectors.toList()); |
|
|
|
|
// 工具匹配成功
|
|
|
|
|
if (stationToolIds.containsAll(zyProcessToolIds)) { |
|
|
|
|
String toolIds = zyProcessToolIds.stream().collect(Collectors.joining(",")); |
|
|
|
|
zyPlanProcess.setToolsIds(toolIds); |
|
|
|
|
return zyPlanProcess; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
return b.get(); |
|
|
|
|
return null; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|