Merge remote-tracking branch 'origin/master'

develop-QA
liuqingkun 4 months ago
commit 4b08bc1bb8
  1. 2
      blade-common/src/main/java/org/springblade/common/constant/LauncherConstant.java
  2. 2
      blade-service/blade-desk/src/main/java/org/springblade/desk/basic/mapper/TeamSetMapper.java
  3. 2
      blade-service/blade-desk/src/main/java/org/springblade/desk/basic/mapper/WorkCenterMapper.java
  4. 13
      blade-service/blade-desk/src/main/java/org/springblade/desk/quality/service/CycleTestItemService2.java
  5. 11
      blade-service/blade-desk/src/main/java/org/springblade/desk/quality/service/CycleTestStandardService2.java
  6. 2
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/controller/WorkOrderController.java
  7. 2
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/dto/WorkOrderDto.java
  8. 6
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/entity/EquipResourceEntity.java
  9. 22
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/entity/PersonResourceEntity.java
  10. 1
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/mapper/WorkOrderMapper.xml
  11. 2
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/IWorkOrderService.java
  12. 48
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/impl/PersonResourceServiceImpl.java
  13. 99
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/impl/WorkOrderServiceImpl.java

@ -16,7 +16,7 @@ public interface LauncherConstant {
// 生产环境
String NACOS_NAMESPACE = "db3f4da1-ae19-4104-8c17-6d9b8f069401";
// 测试环境
// String NACOS_NAMESPACE = "6cdd0310-0d61-4f54-891a-7fb06224d9b8";
// String NACOS_NAMESPACE = "6cdd0310-0d61-4f54-891a-7fb06224d9b8";
/**
* nacos 用户名

@ -20,7 +20,7 @@ import java.util.List;
* @author Tom Shuo
* @since 2025-12-16
*/
public interface TeamSetMapper extends EnBaseMapper<TeamSet> {
public interface TeamSetMapper extends BaseMapper<TeamSet> {
/**
* 自定义分页

@ -20,7 +20,7 @@ import java.util.List;
* @author Tom Shuo
* @since 2025-12-16
*/
public interface WorkCenterMapper extends EnBaseMapper<WorkCenter> {
public interface WorkCenterMapper extends BaseMapper<WorkCenter> {
/**
* 自定义分页

@ -14,6 +14,7 @@ import org.springblade.desk.quality.pojo.entity.CycleTestItem;
import org.springblade.desk.quality.pojo.entity.CycleTestStandard;
import org.springblade.desk.quality.pojo.request.CycleTestItemSubmit;
import org.springblade.desk.quality.pojo.vo.CycleTestItemVO;
import org.springblade.desk.quality.util.IdUtil;
import org.springblade.desk.quality.wrapper.CycleTestItemWrapper;
import org.springblade.resource.feign.IAttachClient;
import org.springblade.resource.pojo.entity.Attach;
@ -144,11 +145,13 @@ public class CycleTestItemService2 {
CycleTestStandard standard = standardService.getById(vo.getCycleTestStandardId());
if (standard != null) {
vo.setCycleTestStandardName(standard.getName());
Attach attach = attachClient.detailById(standard.getStandardAttachId()).getData();
if (attach != null) {
vo.setStandardAttachId(attach.getId());
vo.setLink(attach.getLink());
vo.setOriginalName(attach.getOriginalName());
if (IdUtil.isValid(standard.getStandardAttachId())) {
Attach attach = attachClient.detailById(standard.getStandardAttachId()).getData();
if (attach != null) {
vo.setStandardAttachId(attach.getId());
vo.setLink(attach.getLink());
vo.setOriginalName(attach.getOriginalName());
}
}
}
}

@ -10,6 +10,7 @@ import org.springblade.desk.basic.constant.BaseCol;
import org.springblade.desk.quality.mapper.CycleTestStandardMapper;
import org.springblade.desk.quality.pojo.entity.CycleTestStandard;
import org.springblade.desk.quality.pojo.vo.CycleTestStandardVO;
import org.springblade.desk.quality.util.IdUtil;
import org.springblade.resource.feign.IAttachClient;
import org.springblade.resource.pojo.entity.Attach;
import org.springframework.stereotype.Service;
@ -61,10 +62,12 @@ public class CycleTestStandardService2 {
}
public void setVOValue(CycleTestStandardVO vo) {
Attach attach = attachClient.detailById(vo.getStandardAttachId()).getData();
if (attach != null) {
vo.setOriginalName(attach.getOriginalName());
vo.setLink(attach.getLink());
if(IdUtil.isValid(vo.getStandardAttachId())) {
Attach attach = attachClient.detailById(vo.getStandardAttachId()).getData();
if (attach != null) {
vo.setOriginalName(attach.getOriginalName());
vo.setLink(attach.getLink());
}
}
}
}

@ -181,7 +181,7 @@ public class WorkOrderController extends BladeController {
@PostMapping("/schedulingBoard")
@ApiOperationSupport(order = 6)
@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));
}

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

@ -151,6 +151,12 @@ public class EquipResourceEntity extends BaseEntity {
@Schema(description = "设备顺序")
private Long workCenterId;
/**
* 玻璃粉牌号
*/
@Schema(description = "玻璃粉牌号")
private String GlassCode;

@ -104,7 +104,29 @@ public class PersonResourceEntity extends BaseEntity {
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
<where>
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 != ''">
and to_char(b.start_time,'YYYY-MM-DD') <![CDATA[ >= ]]> #{startTime}
</if>

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

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

@ -119,12 +119,12 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
public void scheduling() {
//查询待排产订单,状态是3
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());
if (CollectionUtils.isNotEmpty(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));
Map<String, PersonAbilityEntity> personAbilityMap = new HashMap<>();
@ -182,12 +182,13 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
}
@Override
public Map<String, List<WorkOrderDto>> schedulingBoard(WorkOrderDto workOrder) {
public List<WorkOrderDto> schedulingBoard(WorkOrderDto 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));
List<WorkOrderDto> resultList = new ArrayList<>();
for (Map.Entry<String, List<WorkOrderDto>> entry : woCodeGroup.entrySet()) {
WorkOrderDto workOrderDto = new WorkOrderDto();
String woCode = entry.getKey();
List<WorkOrderDto> woList = entry.getValue();
@ -232,12 +233,13 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
mergedDto.setPlanStartTime(minStartTime);
mergedDto.setPlanEndTime(maxEndTime);
mergedProcessList.add(mergedDto);
}
resultList.put(woCode, mergedProcessList);
mergedProcessList.sort(Comparator.comparing(WorkOrderDto::getPlanStartTime));
workOrderDto.setWoCode(woCode);
workOrderDto.setWorkOrderList(mergedProcessList);
resultList.add(workOrderDto);
//resultList.put(woCode, mergedProcessList);
}
return resultList;
@ -396,12 +398,11 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
workPlanList.add(workPlan);
}else{
if ("设备".equals(mainProducerMap.get(craft.getPpsId()))) {
Map<String,List<EquipResourceEntity>> sameFurnaceMap = new HashMap<>();
String glassCodeStr = null;
//烧结
if(sintMap.containsKey(craft.getPpsId())){
if("2".equals(order.getYieldType())){//烧结订单
if(order.getYieldType() == 2 || order.getYieldType() == 3){//烧结订单
//获取当前工序的所有温度曲线
List<SintTempCurveEntity> sintList = sintMap.get(craft.getPpsId());
List<List<String>> sintMaterialList = new ArrayList<>();
@ -429,13 +430,56 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
}
}
//包含说明之前有过这个温度曲线的订单
if(sameFurnaceMap.containsKey(glassCodeStr)){
//根据当前时间查询包含玻璃粉牌号的设备资源
List<EquipResourceEntity> equipResourceList = equipResourceService.list(Wrappers.<EquipResourceEntity>lambdaQuery()
.eq(EquipResourceEntity::getWorkCenterId,craft.getWorkCenterId())
.eq(EquipResourceEntity::getCraftId,craft.getCaId())
.ge(EquipResourceEntity::getStartTime,prevProcessEnd)
.eq(EquipResourceEntity::getGlassCode,glassCodeStr));
if(CollectionUtils.isNotEmpty(equipResourceList)){
//计算生产所需产能,需将m2换算成dm2
BigDecimal sumCapacity = order.getYpArea().multiply(BigDecimal.valueOf(order.getYpQty()));
Boolean isSameFurnace = false;
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);
equipResource.setRestCapacity(equipResource.getRestCapacity().subtract(sumCapacity));
equipResourceService.updateById(equipResource);
isSameFurnace = true;
}
break;
}
//同炉的话就不用走下面的匹配了,直接下一工序
if(isSameFurnace){
continue;
}
}
}else if("3".equals(order.getYieldType())){//玻璃饼
}
}
@ -485,7 +529,6 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
BigDecimal sumCapacity = order.getYpArea().multiply(BigDecimal.valueOf(order.getYpQty()));
//需要判断设备额定生产能力是否满足订单总产能,如果不满足,则需要把总产能进行拆分
List<BigDecimal> capacityList = capacitySplit(equipResourceMap, sumCapacity);
List<EquipResourceEntity> sameFurnaceList = new ArrayList<>();
for (BigDecimal capacity : capacityList) {
for (Map.Entry<LocalDateTime, List<EquipResourceEntity>> entry1 : equipResourceMap.entrySet()) {
Boolean isOccupied = false;
@ -498,7 +541,7 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
//生成车间订单
WorkPlanEntity workPlan = new WorkPlanEntity();
workPlan.setStartTime(equipResource.getStartTime());
if (entry.getKey() == 1) {
if ("0".equals(equipResource.getEquipType())) {
workPlan.setEndTime(equipResource.getStartTime().plusMinutes(equipResource.getStandardTime().longValue()));
} else {
workPlan.setEndTime(equipResource.getEndTime());
@ -523,6 +566,9 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
//更新剩余产能
equipResource.setRestCapacity(equipResource.getRestCapacity().subtract(capacity));
equipResource.setIsUsed("1");
if(order.getYieldType() == 2 || order.getYieldType() == 3){
equipResource.setGlassCode(glassCodeStr);
}
//如果剩余产能占总产能不足20%,则修改为已占用
// if(equipResource.getRestCapacity().divide(equipResource.getTotalCapacity(),2,RoundingMode.HALF_UP).compareTo(BigDecimal.valueOf(0.2)) < 0){
//
@ -543,7 +589,7 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
EquipResourceEntity equipResource1 = new EquipResourceEntity();
equipResource1.setIsUsed("1");
equipResourceService.update(equipResource1, updateWrapper);
sameFurnaceList.add(equipResource);
//当前工序的结束时间作为下一工序的开始时间
prevProcessEnd = workPlan.getEndTime();
dateTime = workPlan.getEndTime();
@ -556,9 +602,7 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
}
}
}
if(sintMap.containsKey(craft.getPpsId()) && glassCodeStr != null && CollectionUtils.isNotEmpty(sameFurnaceList)){
sameFurnaceMap.put(glassCodeStr,sameFurnaceList);
}
}
if (!isSchecuding) {
break;
@ -599,8 +643,15 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
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();
Lock craftLock = getCraftLock(craftId);

Loading…
Cancel
Save