排产相关-sjx

develop-QA^2
sunjianxi 22 hours ago
parent 439cb648fa
commit a0d29d1898
  1. 2
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/controller/WorkOrderController.java
  2. 2
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/dto/WorkOrderDto.java
  3. 22
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/entity/PersonResourceEntity.java
  4. 1
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/mapper/WorkOrderMapper.xml
  5. 2
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/IWorkOrderService.java
  6. 44
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/impl/PersonResourceServiceImpl.java
  7. 88
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/impl/WorkOrderServiceImpl.java

@ -181,7 +181,7 @@ public class WorkOrderController extends BladeController {
@PostMapping("/schedulingBoard") @PostMapping("/schedulingBoard")
@ApiOperationSupport(order = 6) @ApiOperationSupport(order = 6)
@Operation(summary = "排产看板", description = "传入WorkOrderDto") @Operation(summary = "排产看板", description = "传入WorkOrderDto")
public R<Map<String,List<WorkOrderDto>>> schedulingBoard(@RequestBody WorkOrderDto workOrderDto) { public R<List<WorkOrderDto>> schedulingBoard(@RequestBody WorkOrderDto workOrderDto) {
return R.data(workOrderService.schedulingBoard(workOrderDto)); return R.data(workOrderService.schedulingBoard(workOrderDto));
} }

@ -46,4 +46,6 @@ public class WorkOrderDto {
private List<String> planStatusList; private List<String> planStatusList;
private List<WorkOrderDto> workOrderList;
} }

@ -104,7 +104,29 @@ public class PersonResourceEntity extends BaseEntity {
private String dateTime; private String dateTime;
/**
* 工序id
*/
@Schema(description = "工序id")
private Long processId;
/**
* 工序名称
*/
@Schema(description = "工序名称")
private String processName;
/**
* 作业中心Id
*/
@Schema(description = "作业中心Id")
private Long workCenterId;
/**
* 作业中心名称
*/
@Schema(description = "作业中心名称")
private String workCenterName;

@ -117,6 +117,7 @@
LEFT JOIN MES_YIELD_ORDER g on g.id = a.yo_id LEFT JOIN MES_YIELD_ORDER g on g.id = a.yo_id
<where> <where>
a.is_deleted = 0 and b.is_deleted = 0 and a.status in (1,2,3,5) a.is_deleted = 0 and b.is_deleted = 0 and a.status in (1,2,3,5)
and b.start_time is not null and b.end_time is not null
<if test="startTime !=null and startTime != ''"> <if test="startTime !=null and startTime != ''">
and to_char(b.start_time,'YYYY-MM-DD') <![CDATA[ >= ]]> #{startTime} and to_char(b.start_time,'YYYY-MM-DD') <![CDATA[ >= ]]> #{startTime}
</if> </if>

@ -71,7 +71,7 @@ public interface IWorkOrderService extends BaseService<WorkOrderEntity> {
**/ **/
void scheduling(); void scheduling();
Map<String, List<WorkOrderDto>> schedulingBoard(WorkOrderDto workOrder); List<WorkOrderDto> schedulingBoard(WorkOrderDto workOrder);
/** /**
* 向旧mes发送排产结果数据 * 向旧mes发送排产结果数据

@ -33,6 +33,7 @@ import lombok.AllArgsConstructor;
import org.apache.commons.lang3.time.DateFormatUtils; import org.apache.commons.lang3.time.DateFormatUtils;
import org.apache.commons.lang3.time.DateUtils; import org.apache.commons.lang3.time.DateUtils;
import org.springblade.core.mp.base.BaseServiceImpl; import org.springblade.core.mp.base.BaseServiceImpl;
import org.springblade.scheduling.scheduling.entity.EquipResourceEntity;
import org.springblade.scheduling.scheduling.entity.PersonAbilityEntity; import org.springblade.scheduling.scheduling.entity.PersonAbilityEntity;
import org.springblade.scheduling.scheduling.entity.PersonResourceEntity; import org.springblade.scheduling.scheduling.entity.PersonResourceEntity;
import org.springblade.scheduling.scheduling.excel.PersonResourceExcel; import org.springblade.scheduling.scheduling.excel.PersonResourceExcel;
@ -74,28 +75,20 @@ public class PersonResourceServiceImpl extends BaseServiceImpl<PersonResourceMap
public void initPersonResource(){ public void initPersonResource(){
//获取包括今天在内未来3天 //获取包括今天在内未来3天
Date date = new Date(); Date date = new Date();
String today = DateFormatUtils.format(date,"yyyy-MM-dd"); for(int i=0;i<7;i++){
String tomorrow = DateFormatUtils.format(DateUtils.addDays(date,1),"yyyy-MM-dd"); String today = DateFormatUtils.format(DateUtils.addDays(date,i),"yyyy-MM-dd");
String dayAfterTomorrow = DateFormatUtils.format(DateUtils.addDays(date,2),"yyyy-MM-dd"); List<PersonResourceEntity> list = this.list(Wrappers.<PersonResourceEntity>lambdaQuery().eq(PersonResourceEntity::getDateTime,today));
List<PersonResourceEntity> list1 = this.list(Wrappers.<PersonResourceEntity>lambdaQuery().eq(PersonResourceEntity::getDateTime,today)); if(CollectionUtils.isEmpty(list)){
List<PersonResourceEntity> list2 = this.list(Wrappers.<PersonResourceEntity>lambdaQuery().eq(PersonResourceEntity::getDateTime,tomorrow));
List<PersonResourceEntity> list3 = this.list(Wrappers.<PersonResourceEntity>lambdaQuery().eq(PersonResourceEntity::getDateTime,dayAfterTomorrow));
if(CollectionUtils.isEmpty(list1)){
generateData(today); generateData(today);
} }
if(CollectionUtils.isEmpty(list2)){
generateData(tomorrow);
}
if(CollectionUtils.isEmpty(list3)){
generateData(dayAfterTomorrow);
} }
} }
public void generateData(String day){ public void generateData(String day){
//获取设备能力列表 //获取设备能力列表
List<String> workCenterList = Arrays.asList("86","85"); // List<String> workCenterList = Arrays.asList("86","85");
List<PersonAbilityEntity> personAbilityList = personAbilityService.list(Wrappers.<PersonAbilityEntity>lambdaQuery().in(PersonAbilityEntity::getWorkCenterId,workCenterList)); List<PersonAbilityEntity> personAbilityList = personAbilityService.list();
if(CollectionUtils.isNotEmpty(personAbilityList)){ if(CollectionUtils.isNotEmpty(personAbilityList)){
DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("HH:mm"); DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("HH:mm");
@ -105,11 +98,12 @@ public class PersonResourceServiceImpl extends BaseServiceImpl<PersonResourceMap
for(PersonAbilityEntity personAbility : personAbilityList){ for(PersonAbilityEntity personAbility : personAbilityList){
//获取 //获取
List<Map<String,Object>> teamIdList = baseMapper.selectTeamByWorkCenter(personAbility.getWorkCenterId()); List<Map<String,Object>> teamIdList = baseMapper.selectTeamByWorkCenter(personAbility.getWorkCenterId());
List<PersonResourceEntity> resourceList = new ArrayList<>();
//普通设备每30分钟间隔生成数据 //普通设备每30分钟间隔生成数据
int interval = 30; /*int interval = 30;
int totalMinutes = 24 * 60; // 一天总分钟数 int totalMinutes = 24 * 60; // 一天总分钟数
int totalCount = totalMinutes / interval; // 生成条数 int totalCount = totalMinutes / interval; // 生成条数
List<PersonResourceEntity> resourceList = new ArrayList<>();
for (int i = 0; i < totalCount; i++) { for (int i = 0; i < totalCount; i++) {
LocalDateTime startTime = startOfDay.plusMinutes(i * interval); LocalDateTime startTime = startOfDay.plusMinutes(i * interval);
LocalDateTime endTime = startTime.plusMinutes(30); LocalDateTime endTime = startTime.plusMinutes(30);
@ -136,6 +130,24 @@ public class PersonResourceServiceImpl extends BaseServiceImpl<PersonResourceMap
personResource.setTeamId(teamId); personResource.setTeamId(teamId);
resourceList.add(personResource); resourceList.add(personResource);
}*/
for(Map<String,Object> map : teamIdList){
LocalDateTime teamStartTime = LocalDateTime.parse(day + ' '+ map.get("startTime").toString(), dateTimeFormatter);
LocalDateTime teamEndTime = LocalDateTime.parse(day + ' '+ map.get("endTime").toString(), dateTimeFormatter);
PersonResourceEntity personResource = new PersonResourceEntity();
personResource.setDateTime(day);
personResource.setCraftId(personAbility.getCraftId());
personResource.setCraftName(personAbility.getCraftName());
personResource.setPeriod(map.get("startTime").toString() + "-" + map.get("endTime").toString());
personResource.setStartTime(teamStartTime);
personResource.setEndTime(teamEndTime);
personResource.setIsUsed("0");
personResource.setProcessId(personAbility.getProcessId());
personResource.setProcessName(personAbility.getProcessName());
personResource.setTeamId(Long.parseLong(map.get("teamId").toString()));
personResource.setWorkCenterId(personAbility.getWorkCenterId());
personResource.setWorkCenterName(personAbility.getWorkCenterName());
resourceList.add(personResource);
} }
if(CollectionUtils.isNotEmpty(resourceList)){ if(CollectionUtils.isNotEmpty(resourceList)){
this.saveBatch(resourceList); this.saveBatch(resourceList);

@ -119,12 +119,12 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
public void scheduling() { public void scheduling() {
//查询待排产订单,状态是3 //查询待排产订单,状态是3
List<YieldOrderEntity> list = List<YieldOrderEntity> list =
yieldOrderService.list(Wrappers.<YieldOrderEntity>lambdaQuery().in(BaseEntity::getStatus, YieldOrderEnum.STATUS_APS.getCategory(),YieldOrderEnum.STATUS_PROCESS_ERROR.getCategory()).isNotNull(YieldOrderEntity::getWorkCenterId).isNotNull(YieldOrderEntity::getReleaseDate)); yieldOrderService.list(Wrappers.<YieldOrderEntity>lambdaQuery().in(BaseEntity::getStatus, YieldOrderEnum.STATUS_APS.getCategory(),YieldOrderEnum.STATUS_PROCESS_ERROR.getCategory()).isNotNull(YieldOrderEntity::getWorkCenterId).isNotNull(YieldOrderEntity::getReleaseDate).isNotNull(YieldOrderEntity::getDemandDate));
log.info("待排产订单数量为:" + list.size()); log.info("待排产订单数量为:" + list.size());
if (CollectionUtils.isNotEmpty(list)) { if (CollectionUtils.isNotEmpty(list)) {
//校验已排产订单 //校验已排产订单
checkSchedulingOrder(list); checkSchedulingOrder(list);
list = yieldOrderService.list(Wrappers.<YieldOrderEntity>lambdaQuery().eq(BaseEntity::getStatus, YieldOrderEnum.STATUS_APS.getCategory()).isNotNull(YieldOrderEntity::getWorkCenterId).isNotNull(YieldOrderEntity::getReleaseDate)); list = yieldOrderService.list(Wrappers.<YieldOrderEntity>lambdaQuery().in(BaseEntity::getStatus, YieldOrderEnum.STATUS_APS.getCategory(),YieldOrderEnum.STATUS_PROCESS_ERROR.getCategory()).isNotNull(YieldOrderEntity::getWorkCenterId).isNotNull(YieldOrderEntity::getReleaseDate).isNotNull(YieldOrderEntity::getDemandDate));
//初始化人员能力 //初始化人员能力
List<PersonAbilityEntity> personAbilityEntityList = personAbilityService.list(Wrappers.<PersonAbilityEntity>lambdaQuery().isNotNull(PersonAbilityEntity::getWorkCenterId).isNotNull(PersonAbilityEntity::getProcessId).isNotNull(PersonAbilityEntity::getCraftId)); List<PersonAbilityEntity> personAbilityEntityList = personAbilityService.list(Wrappers.<PersonAbilityEntity>lambdaQuery().isNotNull(PersonAbilityEntity::getWorkCenterId).isNotNull(PersonAbilityEntity::getProcessId).isNotNull(PersonAbilityEntity::getCraftId));
Map<String, PersonAbilityEntity> personAbilityMap = new HashMap<>(); Map<String, PersonAbilityEntity> personAbilityMap = new HashMap<>();
@ -182,12 +182,13 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
} }
@Override @Override
public Map<String, List<WorkOrderDto>> schedulingBoard(WorkOrderDto workOrder) { public List<WorkOrderDto> schedulingBoard(WorkOrderDto workOrder) {
List<WorkOrderDto> list = baseMapper.selectWorkOrderList(workOrder); List<WorkOrderDto> list = baseMapper.selectWorkOrderList(workOrder);
Map<String, List<WorkOrderDto>> resultList = new HashMap<>(); //Map<String, List<WorkOrderDto>> resultList = new HashMap<>();
Map<String, List<WorkOrderDto>> woCodeGroup = list.stream().collect(Collectors.groupingBy(WorkOrderDto::getWoCode)); Map<String, List<WorkOrderDto>> woCodeGroup = list.stream().collect(Collectors.groupingBy(WorkOrderDto::getWoCode));
List<WorkOrderDto> resultList = new ArrayList<>();
for (Map.Entry<String, List<WorkOrderDto>> entry : woCodeGroup.entrySet()) { for (Map.Entry<String, List<WorkOrderDto>> entry : woCodeGroup.entrySet()) {
WorkOrderDto workOrderDto = new WorkOrderDto();
String woCode = entry.getKey(); String woCode = entry.getKey();
List<WorkOrderDto> woList = entry.getValue(); List<WorkOrderDto> woList = entry.getValue();
@ -232,12 +233,13 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
mergedDto.setPlanStartTime(minStartTime); mergedDto.setPlanStartTime(minStartTime);
mergedDto.setPlanEndTime(maxEndTime); mergedDto.setPlanEndTime(maxEndTime);
mergedProcessList.add(mergedDto); mergedProcessList.add(mergedDto);
} }
mergedProcessList.sort(Comparator.comparing(WorkOrderDto::getPlanStartTime));
resultList.put(woCode, mergedProcessList); workOrderDto.setWoCode(woCode);
workOrderDto.setWorkOrderList(mergedProcessList);
resultList.add(workOrderDto);
//resultList.put(woCode, mergedProcessList);
} }
return resultList; return resultList;
@ -400,8 +402,7 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
String glassCodeStr = null; String glassCodeStr = null;
//烧结 //烧结
if(sintMap.containsKey(craft.getPpsId())){ if(sintMap.containsKey(craft.getPpsId())){
if(order.getYieldType() == 2 || order.getYieldType() == 3){//烧结订单
if("2".equals(order.getYieldType())){//烧结订单
//获取当前工序的所有温度曲线 //获取当前工序的所有温度曲线
List<SintTempCurveEntity> sintList = sintMap.get(craft.getPpsId()); List<SintTempCurveEntity> sintList = sintMap.get(craft.getPpsId());
List<List<String>> sintMaterialList = new ArrayList<>(); List<List<String>> sintMaterialList = new ArrayList<>();
@ -430,11 +431,42 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
} }
//包含说明之前有过这个温度曲线的订单 //包含说明之前有过这个温度曲线的订单
if(sameFurnaceMap.containsKey(glassCodeStr)){ if(sameFurnaceMap.containsKey(glassCodeStr)){
List<EquipResourceEntity> equipResourceList = sameFurnaceMap.get(glassCodeStr);
//计算生产所需产能,需将m2换算成dm2
BigDecimal sumCapacity = order.getYpArea().multiply(BigDecimal.valueOf(order.getYpQty()));
for(EquipResourceEntity equipResource : equipResourceList){
if(equipResource.getRestCapacity().compareTo(sumCapacity) > 0){
//生成车间订单
WorkPlanEntity workPlan = new WorkPlanEntity();
workPlan.setStartTime(equipResource.getStartTime());
if ("0".equals(equipResource.getEquipType())) {
workPlan.setEndTime(equipResource.getStartTime().plusMinutes(equipResource.getStandardTime().longValue()));
} else {
workPlan.setEndTime(equipResource.getEndTime());
} }
workPlan.setWorkQty(order.getYpQty());
workPlan.setCaId(craft.getCaId());
workPlan.setPpsId(craft.getPpsId());
workPlan.setMakeTeam(equipResource.getTeamId());
workPlan.setWorkCenterId(craft.getWorkCenterId());
workPlan.setOrders(craft.getProcessNo());
workPlan.setWoId(order.getId());
workPlan.setOem("0");
workPlan.setTestQty(0);
workPlan.setQualifiedQty(0);
workPlan.setUnqualifiedQty(0);
workPlan.setScrapQty(0);
workPlan.setHourQuota(BigDecimal.valueOf(ChronoUnit.MINUTES.between(workPlan.getStartTime(), workPlan.getEndTime())));
workPlan.setEquipCode(equipResource.getEquipCode());
workPlan.setEquipName(equipResource.getEquipName());
workPlan.setEquipResourceId(equipResource.getId());
workPlanList.add(workPlan);
}else if("3".equals(order.getYieldType())){//玻璃饼 equipResource.setRestCapacity(equipResource.getRestCapacity().subtract(sumCapacity));
equipResourceService.updateById(equipResource);
}
}
}
} }
} }
@ -498,7 +530,7 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
//生成车间订单 //生成车间订单
WorkPlanEntity workPlan = new WorkPlanEntity(); WorkPlanEntity workPlan = new WorkPlanEntity();
workPlan.setStartTime(equipResource.getStartTime()); workPlan.setStartTime(equipResource.getStartTime());
if (entry.getKey() == 1) { if ("0".equals(equipResource.getEquipType())) {
workPlan.setEndTime(equipResource.getStartTime().plusMinutes(equipResource.getStandardTime().longValue())); workPlan.setEndTime(equipResource.getStartTime().plusMinutes(equipResource.getStandardTime().longValue()));
} else { } else {
workPlan.setEndTime(equipResource.getEndTime()); workPlan.setEndTime(equipResource.getEndTime());
@ -581,6 +613,21 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
PersonAbilityEntity ability = personAbilityMap.get(craft.getWorkCenterId() + "-" + craft.getPpsId() + "-" + craft.getCaId()); PersonAbilityEntity ability = personAbilityMap.get(craft.getWorkCenterId() + "-" + craft.getPpsId() + "-" + craft.getCaId());
//镀后检验和镀后接收先按半小时计算 //镀后检验和镀后接收先按半小时计算
if (ability != null) { if (ability != null) {
/* if(ability.getWorkCenterId() != order.getWorkCenterId()){
prevProcessEnd = prevProcessEnd.plusMinutes(30);
if ("0".equals(ability.getType())) {
totalTime = totalTime.add(BigDecimal.valueOf(order.getYpQty()).multiply(ability.getStandardTime()).add(ability.getPrepareTime()));
} else {
totalTime = totalTime.add(ability.getStandardTime()).add(ability.getPrepareTime());
}
}else{
if ("0".equals(ability.getType())) {
totalTime = totalTime.add(BigDecimal.valueOf(order.getYpQty()).multiply(ability.getStandardTime()).add(ability.getPrepareTime()));
} else {
totalTime = totalTime.add(ability.getStandardTime()).add(ability.getPrepareTime());
}
}*/
if ("镀后检验".equals(ability.getProcessName()) || "镀后接收".equals(ability.getProcessName())) { if ("镀后检验".equals(ability.getProcessName()) || "镀后接收".equals(ability.getProcessName())) {
totalTime = BigDecimal.valueOf(30); totalTime = BigDecimal.valueOf(30);
workPlan.setStartTime(prevProcessEnd.plusMinutes(30)); workPlan.setStartTime(prevProcessEnd.plusMinutes(30));
@ -599,8 +646,15 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
totalTime = totalTime.add(ability.getStandardTime()).add(ability.getPrepareTime()); totalTime = totalTime.add(ability.getStandardTime()).add(ability.getPrepareTime());
} }
} }
List<PersonResourceEntity> personResourceList = personResourceService.list(Wrappers.<PersonResourceEntity>lambdaQuery()
.eq(PersonResourceEntity::getWorkCenterId, craft.getWorkCenterId())
.eq(PersonResourceEntity::getProcessId, craft.getPpsId())
.eq(PersonResourceEntity::getCraftId, craft.getCaId())
.le(PersonResourceEntity::getStartTime, prevProcessEnd)
.ge(PersonResourceEntity::getEndTime, prevProcessEnd));
if(CollectionUtils.isNotEmpty(personResourceList)){
workPlan.setMakeTeam(personResourceList.get(0).getTeamId());
}
//通过加锁的方式保证每次查询到的人力资源都是最新的 //通过加锁的方式保证每次查询到的人力资源都是最新的
/*Long craftId = craft.getCaId(); /*Long craftId = craft.getCaId();
Lock craftLock = getCraftLock(craftId); Lock craftLock = getCraftLock(craftId);

Loading…
Cancel
Save