排产相关-sjx

liweidong
sunjianxi 3 months ago
parent 2d59d4ee12
commit fe4a62d3c7
  1. 31
      blade-service-api/blade-scheduling-api/src/main/java/org/springblade/scheduling/feign/IWorkOrderClient.java
  2. 43
      blade-service-api/blade-scheduling-api/src/main/java/org/springblade/scheduling/feign/IWorkOrderClientFallback.java
  3. 2
      blade-service-api/blade-scheduling-api/src/main/java/org/springblade/scheduling/pojo/entity/EquipAbilityEntity.java
  4. 15
      blade-service-api/blade-scheduling-api/src/main/java/org/springblade/scheduling/pojo/entity/PersonAbilityEntity.java
  5. 5
      blade-service-api/blade-scheduling-api/src/main/java/org/springblade/scheduling/pojo/entity/WorkPlanEntity.java
  6. 1
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/SchedulingApplication.java
  7. 4
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/controller/EquipAbilityController.java
  8. 12
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/controller/PersonAbilityController.java
  9. 2
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/dto/WorkOrderDto.java
  10. 57
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/feign/WorkOrderClient.java
  11. 3
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/mapper/PersonAbilityMapper.java
  12. 4
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/mapper/PersonAbilityMapper.xml
  13. 2
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/mapper/WorkOrderMapper.java
  14. 23
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/mapper/WorkOrderMapper.xml
  15. 3
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/IEquipResourceService.java
  16. 3
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/IPersonAbilityService.java
  17. 214
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/impl/EquipResourceServiceImpl.java
  18. 6
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/impl/PersonAbilityServiceImpl.java
  19. 367
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/impl/WorkOrderServiceImpl.java

@ -0,0 +1,31 @@
package org.springblade.scheduling.feign;
import org.springblade.core.tool.api.R;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
/**
* TODO功能描述
*
* @author sjx
* @version 1.0
* @BelongsProject jonhon-mes-svr
* @BelongsPackage org.springblade.scheduling.feign
* @since 2026-01-16 10:06
*/
@FeignClient(
value = "blade-scheduling"
)
public interface IWorkOrderClient {
String API_PREFIX = "/feign/client/workOrder";
String SCHEDULING = API_PREFIX + "/scheduling";
/**
* 排产
*
*/
@GetMapping(SCHEDULING)
R<Void> scheduling();
}

@ -0,0 +1,43 @@
/**
* BladeX Commercial License Agreement
* Copyright (c) 2018-2099, https://bladex.cn. All rights reserved.
* <p>
* Use of this software is governed by the Commercial License Agreement
* obtained after purchasing a license from BladeX.
* <p>
* 1. This software is for development use only under a valid license
* from BladeX.
* <p>
* 2. Redistribution of this software's source code to any third party
* without a commercial license is strictly prohibited.
* <p>
* 3. Licensees may copyright their own code but cannot use segments
* from this software for such purposes. Copyright of this software
* remains with BladeX.
* <p>
* Using this software signifies agreement to this License, and the software
* must not be used for illegal purposes.
* <p>
* THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is
* not liable for any claims arising from secondary or illegal development.
* <p>
* Author: Chill Zhuang (bladejava@qq.com)
*/
package org.springblade.scheduling.feign;
import org.springblade.core.tool.api.R;
import org.springframework.stereotype.Component;
/**
* Feign失败配置
*
* @author Chill
*/
@Component
public class IWorkOrderClientFallback implements IWorkOrderClient {
@Override
public R<Void> scheduling() {
return R.fail("获取数据失败");
}
}

@ -120,7 +120,7 @@ public class EquipAbilityEntity extends BaseEntity {
* 轮次间隔分钟
*/
@Schema(description = "轮次间隔(分钟)")
@JsonSerialize(using = ToStringSerializer.class)
@JsonSerialize(nullsUsing = NullSerializer.class)
private BigDecimal interval;
/**

@ -103,4 +103,19 @@ public class PersonAbilityEntity extends BaseEntity {
@Schema(description = "0-按单个零件统计 1-按订单统计")
private String type;
/**
* 证书ID
*/
private Long certificateId;
/**
* 证书名称
*/
private String certificateName;
/**
* 生产标识
*/
private String productIdent;
}

@ -264,4 +264,9 @@ public class WorkPlanEntity extends BaseEntity {
@Schema(description = "占用设备资源ID")
private String personResourceIds;
/**
* 班组人员
*/
private String teamMembers;
}

@ -28,7 +28,6 @@ package org.springblade.scheduling;
import org.springblade.common.constant.LauncherConstant;
import org.springblade.core.cloud.client.BladeCloudApplication;
import org.springblade.core.launch.BladeApplication;
import org.springblade.core.launch.constant.AppConstant;
import org.springframework.scheduling.annotation.EnableScheduling;
/**

@ -117,7 +117,7 @@ public class EquipAbilityController extends BladeController {
}
equipAbilityService.save(entity);
//初始化设备资源
equipResourceService.initSingleEquipResource(entity.getWorkCenterId(),entity.getCraftId(),entity.getEquipCode());
equipResourceService.initSingleEquipResource(entity);
return R.status(true);
}
@ -130,7 +130,7 @@ public class EquipAbilityController extends BladeController {
public R update(@Valid @RequestBody EquipAbilityEntity entity) {
equipAbilityService.updateById(entity);
//初始化设备资源
equipResourceService.initSingleEquipResource(entity.getWorkCenterId(),entity.getCraftId(),entity.getEquipCode());
equipResourceService.initSingleEquipResource(entity);
return R.status(true);
}

@ -46,6 +46,7 @@ import org.springblade.core.secure.annotation.IsAdmin;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.DateUtil;
import org.springblade.core.tool.utils.Func;
import org.springblade.desk.jobTransfer.pojo.entity.CertificateTypeEntity;
import org.springblade.scheduling.pojo.entity.PersonAbilityEntity;
import org.springblade.scheduling.scheduling.excel.PersonAbilityExcel;
import org.springblade.scheduling.scheduling.service.IPersonAbilityService;
@ -160,4 +161,15 @@ public class PersonAbilityController extends BladeController {
ExcelUtil.export(response, "人员能力表数据" + DateUtil.time(), "人员能力表数据表", list, PersonAbilityExcel.class);
}
/**
* 获取证书列表
*/
@GetMapping("/selectCertificateList")
@ApiOperationSupport(order = 2)
public R<List<CertificateTypeEntity>> selectCertificateList() {
List<CertificateTypeEntity> list = personAbilityService.selectCertificateList();
return R.data(list);
}
}

@ -46,6 +46,8 @@ public class WorkOrderDto {
private String productIdent;
private String receiveTime;
private String priorityAps;
private String teamMembers;
private String releaseDate;
private List<String> planStatusList;

@ -0,0 +1,57 @@
/**
* BladeX Commercial License Agreement
* Copyright (c) 2018-2099, https://bladex.cn. All rights reserved.
* <p>
* Use of this software is governed by the Commercial License Agreement
* obtained after purchasing a license from BladeX.
* <p>
* 1. This software is for development use only under a valid license
* from BladeX.
* <p>
* 2. Redistribution of this software's source code to any third party
* without a commercial license is strictly prohibited.
* <p>
* 3. Licensees may copyright their own code but cannot use segments
* from this software for such purposes. Copyright of this software
* remains with BladeX.
* <p>
* Using this software signifies agreement to this License, and the software
* must not be used for illegal purposes.
* <p>
* THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is
* not liable for any claims arising from secondary or illegal development.
* <p>
* Author: Chill Zhuang (bladejava@qq.com)
*/
package org.springblade.scheduling.scheduling.feign;
import io.swagger.v3.oas.annotations.Hidden;
import lombok.AllArgsConstructor;
import org.springblade.core.tenant.annotation.NonDS;
import org.springblade.core.tool.api.R;
import org.springblade.scheduling.feign.IWorkOrderClient;
import org.springblade.scheduling.scheduling.service.IWorkOrderService;
import org.springframework.web.bind.annotation.RestController;
/**
* 字典服务Feign实现类
*
* @author Chill
*/
@NonDS
@Hidden
@RestController
@AllArgsConstructor
public class WorkOrderClient implements IWorkOrderClient {
private final IWorkOrderService workOrderService;
@Override
public R<Void> scheduling() {
workOrderService.scheduling();
return R.success();
}
}

@ -29,6 +29,7 @@ import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.apache.ibatis.annotations.Param;
import org.springblade.desk.jobTransfer.pojo.entity.CertificateTypeEntity;
import org.springblade.scheduling.pojo.entity.PersonAbilityEntity;
import org.springblade.scheduling.scheduling.excel.PersonAbilityExcel;
import org.springblade.scheduling.scheduling.vo.PersonAbilityVO;
@ -60,5 +61,7 @@ public interface PersonAbilityMapper extends BaseMapper<PersonAbilityEntity> {
*/
List<PersonAbilityExcel> export(@Param("ew") Wrapper<PersonAbilityEntity> queryWrapper);
List<CertificateTypeEntity> selectCertificateList();
}

@ -42,4 +42,8 @@
<select id="export" resultType="org.springblade.scheduling.scheduling.excel.PersonAbilityExcel">
SELECT * FROM MES_PERSON_ABILITY ${ew.customSqlSegment}
</select>
<select id="selectCertificateList" resultType="org.springblade.desk.jobTransfer.pojo.entity.CertificateTypeEntity">
SELECT * FROM MES_CERTIFICATE_TYPE
</select>
</mapper>

@ -76,4 +76,6 @@ public interface WorkOrderMapper extends BaseMapper<WorkOrderEntity> {
List<SchedulingBoardExcel> exportSchedulingBoard(WorkOrderDto workOrderDto);
List<String> selectTeamMember(@Param("teamId") Long teamId,@Param("certificateId") Long certificateId);
}

@ -94,6 +94,7 @@
a.card_no AS "cardNO",
g.priority_aps AS "priorityAps",
g.product_ident AS "productIdent",
to_char(g.release_date,'YYYY-MM-DD') AS "releaseDate",
f.name AS "currentProcessName",
d.name AS "processName",
to_char(b.start_time,'YYYY-MM-DD HH24:MI') AS "startTime",
@ -106,7 +107,8 @@
b.equip_name AS "equipName",
b.equip_code AS "equipCode",
a.status AS "orderStatus",
b.status AS "planStatus"
b.status AS "planStatus",
b.team_members as "teamMembers"
FROM
MES_WORK_ORDER a
LEFT JOIN MES_WORK_PLAN b ON a.ID = b.WO_ID
@ -149,7 +151,7 @@
</foreach>
</if>
</where>
order by b.start_time,a.WO_CODE
order by g.release_date,b.start_time,a.WO_CODE
</select>
<select id="getMaxByCodePattern" resultType="java.lang.String">
@ -280,4 +282,21 @@
b.DEMAND_DATE
</select>
<select id="selectTeamMember" resultType="java.lang.String">
SELECT
ph.name
FROM
MES_POST_HANDLE ph
LEFT JOIN MES_CERTIFICATE_MAINTENANCE cm ON ph.id = cm.ph_id
AND cm.is_deleted = 0
LEFT JOIN MES_CERTIFICATE_TYPE ct ON cm.certificate_id = ct.id
AND ct.is_deleted = 0
LEFT JOIN BA_REL_TEAM_SET_USER tu ON ph.user_id = tu.user_id
LEFT JOIN BS_TEAM_SET ts ON tu.team_set_id = ts.id
WHERE
ph.is_deleted = 0
AND ts.id = #{teamId}
AND ct.id = #{certificateId}
</select>
</mapper>

@ -28,6 +28,7 @@ package org.springblade.scheduling.scheduling.service;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springblade.core.mp.base.BaseService;
import org.springblade.scheduling.pojo.entity.EquipAbilityEntity;
import org.springblade.scheduling.pojo.entity.EquipResourceEntity;
import org.springblade.scheduling.scheduling.excel.EquipResourceExcel;
import org.springblade.scheduling.scheduling.vo.EquipResourceVO;
@ -59,7 +60,7 @@ public interface IEquipResourceService extends BaseService<EquipResourceEntity>
List<EquipResourceExcel> export(Wrapper<EquipResourceEntity> queryWrapper);
public void initEquipResource();
public void initSingleEquipResource(Long workCenterId,Long craftId,String equipCode);
public void initSingleEquipResource(EquipAbilityEntity entity);
List<EquipResourceEntity> selectCommonCraftList();

@ -28,6 +28,7 @@ package org.springblade.scheduling.scheduling.service;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springblade.core.mp.base.BaseService;
import org.springblade.desk.jobTransfer.pojo.entity.CertificateTypeEntity;
import org.springblade.scheduling.pojo.entity.PersonAbilityEntity;
import org.springblade.scheduling.scheduling.excel.PersonAbilityExcel;
import org.springblade.scheduling.scheduling.vo.PersonAbilityVO;
@ -58,4 +59,6 @@ public interface IPersonAbilityService extends BaseService<PersonAbilityEntity>
*/
List<PersonAbilityExcel> export(Wrapper<PersonAbilityEntity> queryWrapper);
List<CertificateTypeEntity> selectCertificateList();
}

@ -80,13 +80,19 @@ public class EquipResourceServiceImpl extends BaseServiceImpl<EquipResourceMappe
public void initEquipResource(){
//获取包括今天在内未来7天
Date date = new Date();
List<EquipAbilityEntity> equipAbilityList = equipAbilityService.list(Wrappers.<EquipAbilityEntity>lambdaQuery().isNotNull(EquipAbilityEntity::getWorkCenterId).isNotNull(EquipAbilityEntity::getCraftId).isNotNull(EquipAbilityEntity::getEquipCode));
for(int i=0;i<7;i++){
String today = DateFormatUtils.format(DateUtils.addDays(date,i),"yyyy-MM-dd");
LambdaQueryWrapper<EquipResourceEntity> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(EquipResourceEntity::getDateTime,today);
List<EquipResourceEntity> list = this.list(wrapper);
if(CollectionUtils.isEmpty(list)){
generateData(today,null,null,null);
for(EquipAbilityEntity equipAbility : equipAbilityList){
LambdaQueryWrapper<EquipResourceEntity> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(EquipResourceEntity::getDateTime,today);
wrapper.eq(EquipResourceEntity::getWorkCenterId,equipAbility.getWorkCenterId());
wrapper.eq(EquipResourceEntity::getCraftId,equipAbility.getCraftId());
wrapper.eq(EquipResourceEntity::getEquipCode,equipAbility.getEquipCode());
List<EquipResourceEntity> list = this.list(wrapper);
if(CollectionUtils.isEmpty(list)){
generateData(today,equipAbility);
}
}
}
//删除3天之前的数据
@ -94,12 +100,12 @@ public class EquipResourceServiceImpl extends BaseServiceImpl<EquipResourceMappe
deleteList.forEach(item -> baseMapper.deleteById(item.getId()));
}
public void initSingleEquipResource(Long workCenterId,Long craftId,String equipCode){
public void initSingleEquipResource(EquipAbilityEntity entity){
//获取包括今天在内未来7天
Date date = new Date();
for(int i=0;i<7;i++){
String today = DateFormatUtils.format(DateUtils.addDays(date,i),"yyyy-MM-dd");
generateData(today,workCenterId,craftId,equipCode);
generateData(today,entity);
}
}
@ -108,27 +114,27 @@ public class EquipResourceServiceImpl extends BaseServiceImpl<EquipResourceMappe
return baseMapper.selectCommonCraftList();
}
public void generateData(String day,Long workCenterId,Long craftId,String equipCode){
public void generateData(String day,EquipAbilityEntity equipAbility){
//获取设备能力列表
LambdaQueryWrapper<EquipAbilityEntity> wrapper = new LambdaQueryWrapper<>();
wrapper.isNotNull(EquipAbilityEntity::getStandardTime);
if(workCenterId != null){
wrapper.eq(EquipAbilityEntity::getWorkCenterId,workCenterId);
if(equipAbility.getWorkCenterId() != null){
wrapper.eq(EquipAbilityEntity::getWorkCenterId,equipAbility.getWorkCenterId());
}
if(craftId != null){
wrapper.eq(EquipAbilityEntity::getCraftId,craftId);
if(equipAbility.getCraftId() != null){
wrapper.eq(EquipAbilityEntity::getCraftId,equipAbility.getCraftId());
}
if(StringUtils.isNotBlank(equipCode)){
wrapper.eq(EquipAbilityEntity::getEquipCode,equipCode);
if(StringUtils.isNotBlank(equipAbility.getEquipCode())){
wrapper.eq(EquipAbilityEntity::getEquipCode,equipAbility.getEquipCode());
}
List<EquipAbilityEntity> equipAbilityList = equipAbilityService.list(wrapper);
if(CollectionUtils.isNotEmpty(equipAbilityList)){
if(workCenterId != null && craftId != null && StringUtils.isNotBlank(equipCode)){
if(equipAbility.getWorkCenterId() != null && equipAbility.getCraftId() != null && StringUtils.isNotBlank(equipAbility.getEquipCode())){
List<EquipResourceEntity> list = this.list(Wrappers.<EquipResourceEntity>lambdaQuery()
.eq(EquipResourceEntity::getWorkCenterId,workCenterId)
.eq(EquipResourceEntity::getCraftId,craftId)
.eq(EquipResourceEntity::getEquipCode,equipCode)
.eq(EquipResourceEntity::getWorkCenterId,equipAbility.getWorkCenterId())
.eq(EquipResourceEntity::getCraftId,equipAbility.getCraftId())
.eq(EquipResourceEntity::getEquipCode,equipAbility.getEquipCode())
.eq(EquipResourceEntity::getDateTime,day));
if(CollectionUtils.isNotEmpty(list)){
list.forEach(item -> baseMapper.deleteById(item.getId()));
@ -139,98 +145,96 @@ public class EquipResourceServiceImpl extends BaseServiceImpl<EquipResourceMappe
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
LocalDate targetDate = LocalDate.parse(day, dateFormatter);
LocalDateTime startOfDay = LocalDateTime.of(targetDate, LocalTime.MIDNIGHT);
for(EquipAbilityEntity equipAbility : equipAbilityList){
//获取
List<Map<String,Object>> teamIdList = baseMapper.selectTeamByWorkCenter(equipAbility.getWorkCenterId());
//0-产线设备 1-普通设备
if("0".equals(equipAbility.getEquipType())){
//产线设备根据轮询间隔生成数据,根据轮询间隔判断一天要分成多少段
int interval = equipAbility.getInterval() == null ? 60 : Integer.parseInt(equipAbility.getInterval().toString()); // 默认60分钟
int totalMinutes = 24 * 60; // 一天总分钟数
int totalCount = totalMinutes / interval; // 生成条数
List<EquipResourceEntity> resourceList = new ArrayList<>();
for (int i = 0; i < totalCount; i++) {
LocalDateTime startTime = startOfDay.plusMinutes(i * interval);
LocalDateTime endTime = startTime.plusMinutes(interval);
EquipResourceEntity equipResource = new EquipResourceEntity();
equipResource.setDateTime(day);
equipResource.setEquipCode(equipAbility.getEquipCode());
equipResource.setEquipName(equipAbility.getEquipName());
equipResource.setCraftId(equipAbility.getCraftId().toString());
equipResource.setCraftName(equipAbility.getCraftName());
equipResource.setPeriod(startTime.format(timeFormatter) + "-" + endTime.format(timeFormatter));
equipResource.setTotalCapacity(equipAbility.getStandardProcessAbility());
equipResource.setRestCapacity(equipAbility.getStandardProcessAbility());
equipResource.setStartTime(startTime);
equipResource.setEndTime(endTime);
equipResource.setEquipOrder(equipAbility.getEquipOrder());
equipResource.setStandardTime(equipAbility.getStandardTime());
equipResource.setIsUsed("0");
equipResource.setEquipType(equipAbility.getEquipType());
equipResource.setWorkCenterId(equipAbility.getWorkCenterId());
Long teamId = null;
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);
if((startTime.compareTo(teamStartTime) >=0 && endTime.compareTo(teamEndTime) <= 0) || (startTime.compareTo(teamStartTime) >=0 && startTime.compareTo(teamEndTime) <0)){
teamId = Long.parseLong(map.get("teamId").toString());
}
//获取
List<Map<String,Object>> teamIdList = baseMapper.selectTeamByWorkCenter(equipAbility.getWorkCenterId());
//0-产线设备 1-普通设备
if("0".equals(equipAbility.getEquipType())){
//产线设备根据轮询间隔生成数据,根据轮询间隔判断一天要分成多少段
int interval = equipAbility.getInterval() == null ? 60 : Integer.parseInt(equipAbility.getInterval().toString()); // 默认60分钟
int totalMinutes = 24 * 60; // 一天总分钟数
int totalCount = totalMinutes / interval; // 生成条数
List<EquipResourceEntity> resourceList = new ArrayList<>();
for (int i = 0; i < totalCount; i++) {
LocalDateTime startTime = startOfDay.plusMinutes(i * interval);
LocalDateTime endTime = startTime.plusMinutes(interval);
EquipResourceEntity equipResource = new EquipResourceEntity();
equipResource.setDateTime(day);
equipResource.setEquipCode(equipAbility.getEquipCode());
equipResource.setEquipName(equipAbility.getEquipName());
equipResource.setCraftId(equipAbility.getCraftId().toString());
equipResource.setCraftName(equipAbility.getCraftName());
equipResource.setPeriod(startTime.format(timeFormatter) + "-" + endTime.format(timeFormatter));
equipResource.setTotalCapacity(equipAbility.getStandardProcessAbility());
equipResource.setRestCapacity(equipAbility.getStandardProcessAbility());
equipResource.setStartTime(startTime);
equipResource.setEndTime(endTime);
equipResource.setEquipOrder(equipAbility.getEquipOrder());
equipResource.setStandardTime(equipAbility.getStandardTime());
equipResource.setIsUsed("0");
equipResource.setEquipType(equipAbility.getEquipType());
equipResource.setWorkCenterId(equipAbility.getWorkCenterId());
Long teamId = null;
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);
if((startTime.compareTo(teamStartTime) >=0 && endTime.compareTo(teamEndTime) <= 0) || (startTime.compareTo(teamStartTime) >=0 && startTime.compareTo(teamEndTime) <0)){
teamId = Long.parseLong(map.get("teamId").toString());
}
equipResource.setTeamId(teamId);
resourceList.add(equipResource);
}
if(CollectionUtils.isNotEmpty(resourceList)){
this.saveBatch(resourceList);
}
}else{
//普通设备每30分钟间隔生成数据
int interval = 30;
int totalMinutes = 24 * 60; // 一天总分钟数
int totalCount = totalMinutes / interval; // 生成条数
List<EquipResourceEntity> resourceList = new ArrayList<>();
for (int i = 0; i < totalCount; i++) {
LocalDateTime startTime = startOfDay.plusMinutes(i * interval);
LocalDateTime endTime = startTime.plusMinutes(equipAbility.getStandardTime().longValue());
EquipResourceEntity equipResource = new EquipResourceEntity();
equipResource.setDateTime(day);
equipResource.setEquipCode(equipAbility.getEquipCode());
equipResource.setEquipName(equipAbility.getEquipName());
equipResource.setCraftId(equipAbility.getCraftId().toString());
equipResource.setCraftName(equipAbility.getCraftName());
equipResource.setPeriod(startTime.format(timeFormatter) + "-" + endTime.format(timeFormatter));
equipResource.setTotalCapacity(equipAbility.getStandardProcessAbility());
equipResource.setRestCapacity(equipAbility.getStandardProcessAbility());
equipResource.setStartTime(startTime);
equipResource.setEndTime(endTime);
equipResource.setEquipOrder(equipAbility.getEquipOrder());
equipResource.setStandardTime(equipAbility.getStandardTime());
equipResource.setIsUsed("0");
equipResource.setEquipType(equipAbility.getEquipType());
equipResource.setWorkCenterId(equipAbility.getWorkCenterId());
Long teamId = null;
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);
if((startTime.compareTo(teamStartTime) >=0 && endTime.compareTo(teamEndTime) <= 0) || (startTime.compareTo(teamStartTime) >=0 && startTime.compareTo(teamEndTime) <0)){
teamId = Long.parseLong(map.get("teamId").toString());
}
}
equipResource.setTeamId(teamId);
resourceList.add(equipResource);
equipResource.setTeamId(teamId);
resourceList.add(equipResource);
}
if(CollectionUtils.isNotEmpty(resourceList)){
this.saveBatch(resourceList);
}
}else{
//普通设备每30分钟间隔生成数据
int interval = equipAbility.getInterval() == null ? 60 : Integer.parseInt(equipAbility.getInterval().toString());
int totalMinutes = 24 * 60; // 一天总分钟数
int totalCount = totalMinutes / interval; // 生成条数
List<EquipResourceEntity> resourceList = new ArrayList<>();
for (int i = 0; i < totalCount; i++) {
LocalDateTime startTime = startOfDay.plusMinutes(i * interval);
LocalDateTime endTime = startTime.plusMinutes(equipAbility.getStandardTime().longValue());
EquipResourceEntity equipResource = new EquipResourceEntity();
equipResource.setDateTime(day);
equipResource.setEquipCode(equipAbility.getEquipCode());
equipResource.setEquipName(equipAbility.getEquipName());
equipResource.setCraftId(equipAbility.getCraftId().toString());
equipResource.setCraftName(equipAbility.getCraftName());
equipResource.setPeriod(startTime.format(timeFormatter) + "-" + endTime.format(timeFormatter));
equipResource.setTotalCapacity(equipAbility.getStandardProcessAbility());
equipResource.setRestCapacity(equipAbility.getStandardProcessAbility());
equipResource.setStartTime(startTime);
equipResource.setEndTime(endTime);
equipResource.setEquipOrder(equipAbility.getEquipOrder());
equipResource.setStandardTime(equipAbility.getStandardTime());
equipResource.setIsUsed("0");
equipResource.setEquipType(equipAbility.getEquipType());
equipResource.setWorkCenterId(equipAbility.getWorkCenterId());
Long teamId = null;
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);
if((startTime.compareTo(teamStartTime) >=0 && endTime.compareTo(teamEndTime) <= 0) || (startTime.compareTo(teamStartTime) >=0 && startTime.compareTo(teamEndTime) <0)){
teamId = Long.parseLong(map.get("teamId").toString());
}
}
if(CollectionUtils.isNotEmpty(resourceList)){
this.saveBatch(resourceList);
}
equipResource.setTeamId(teamId);
resourceList.add(equipResource);
}
if(CollectionUtils.isNotEmpty(resourceList)){
this.saveBatch(resourceList);
}
}
}

@ -28,6 +28,7 @@ package org.springblade.scheduling.scheduling.service.impl;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springblade.core.mp.base.BaseServiceImpl;
import org.springblade.desk.jobTransfer.pojo.entity.CertificateTypeEntity;
import org.springblade.scheduling.pojo.entity.PersonAbilityEntity;
import org.springblade.scheduling.scheduling.excel.PersonAbilityExcel;
import org.springblade.scheduling.scheduling.mapper.PersonAbilityMapper;
@ -58,4 +59,9 @@ public class PersonAbilityServiceImpl extends BaseServiceImpl<PersonAbilityMappe
return list;
}
@Override
public List<CertificateTypeEntity> selectCertificateList() {
return baseMapper.selectCertificateList();
}
}

@ -122,14 +122,43 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
@Override
public void scheduling() {
//处理参数不全的订单,更新为异常订单
List<YieldOrderEntity> errorlist1 = yieldOrderService.list(Wrappers.<YieldOrderEntity>lambdaQuery()
.in(BaseEntity::getStatus, YieldOrderEnum.STATUS_APS.getCode())
.isNull(YieldOrderEntity::getWorkCenterId));
errorlist1.forEach(item -> {
item.setErrorInfo("作业中心为空");
item.setStatus(YieldOrderEnum.STATUS_PROCESS_ERROR.getCode());
yieldOrderService.updateById(item);
});
List<YieldOrderEntity> errorlist2 = yieldOrderService.list(Wrappers.<YieldOrderEntity>lambdaQuery()
.in(BaseEntity::getStatus, YieldOrderEnum.STATUS_APS.getCode())
.isNull(YieldOrderEntity::getReleaseDate));
errorlist2.forEach(item -> {
item.setErrorInfo("计划下达时间为空");
item.setStatus(YieldOrderEnum.STATUS_PROCESS_ERROR.getCode());
yieldOrderService.updateById(item);
});
List<YieldOrderEntity> errorlist3 = yieldOrderService.list(Wrappers.<YieldOrderEntity>lambdaQuery()
.in(BaseEntity::getStatus, YieldOrderEnum.STATUS_APS.getCode())
.isNull(YieldOrderEntity::getDemandDate));
errorlist3.forEach(item -> {
item.setErrorInfo("需求交期为空");
item.setStatus(YieldOrderEnum.STATUS_PROCESS_ERROR.getCode());
yieldOrderService.updateById(item);
});
//查询待排产订单,状态是3
List<YieldOrderEntity> list =
yieldOrderService.list(Wrappers.<YieldOrderEntity>lambdaQuery().in(BaseEntity::getStatus, YieldOrderEnum.STATUS_APS.getCode(),YieldOrderEnum.STATUS_PROCESS_ERROR.getCode()).isNotNull(YieldOrderEntity::getWorkCenterId).isNotNull(YieldOrderEntity::getReleaseDate).isNotNull(YieldOrderEntity::getDemandDate));
yieldOrderService.list(Wrappers.<YieldOrderEntity>lambdaQuery()
.in(BaseEntity::getStatus, YieldOrderEnum.STATUS_APS.getCode())
.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().in(BaseEntity::getStatus, YieldOrderEnum.STATUS_APS.getCode(),YieldOrderEnum.STATUS_PROCESS_ERROR.getCode()).isNotNull(YieldOrderEntity::getWorkCenterId).isNotNull(YieldOrderEntity::getReleaseDate).isNotNull(YieldOrderEntity::getDemandDate));
list = yieldOrderService.list(Wrappers.<YieldOrderEntity>lambdaQuery().in(BaseEntity::getStatus, YieldOrderEnum.STATUS_APS.getCode()).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<>();
@ -331,7 +360,13 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
List<YieldOrderCraftEntity> craftList1 = craftList.stream().filter(item -> item.getIsOutsource() == false).collect(Collectors.toList());
List<Long> workCenterList = craftList1.stream().filter(item -> item.getWorkCenterId() != null).map(YieldOrderCraftEntity::getWorkCenterId).collect(Collectors.toList());
if (workCenterList.size() != craftList1.size()) {
order.setErrorInfo("工序信息不完整,含有未匹配作业中心的工序");
String errorInfo = craftList1.stream().filter(item -> item.getWorkCenterId() == null)
.map(YieldOrderCraftEntity::getPpsId)
.filter(ppsId -> ppsId != null)
.map(ppsId -> processMap.get(ppsId))
.filter(chineseName -> chineseName != null && !chineseName.isEmpty())
.collect(Collectors.joining(","));
order.setErrorInfo("工序信息不完整,工序:"+errorInfo+"未匹配作业中心");
order.setStatus(YieldOrderEnum.STATUS_PROCESS_ERROR.getCode());
yieldOrderService.updateById(order);
continue;
@ -385,88 +420,19 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
workPlanList.add(workPlan);
}else{
if ("设备".equals(mainProducerMap.get(craft.getPpsId()))) {
//热表同槽
Boolean isSameTrough = sameTrough(order,craft,prevProcessEnd,workPlanList);
//同槽就不需要继续匹配了
if(isSameTrough){
continue;
}
String glassCodeStr = null;
//烧结
//烧结同炉
if(sintMap.containsKey(craft.getPpsId())){
if(order.getYieldType() == 2 || order.getYieldType() == 3){//烧结订单
//获取当前工序的所有温度曲线
List<SintTempCurveEntity> sintList = sintMap.get(craft.getPpsId());
List<List<String>> sintMaterialList = new ArrayList<>();
sintList.stream().map(SintTempCurveEntity::getGlassCode).collect(Collectors.toList()).forEach(item -> sintMaterialList.add(Arrays.asList(item.split(","))));
//根据零件号获取子件信息
PartEntity part = new PartEntity();
part.setPartCode(order.getPartCode());
List<PartEntity> childPartList = partService.selectChildPart(part);
if(CollectionUtils.isNotEmpty(childPartList)){
//获取子件的所有玻璃粉牌号
List<String> materialList = childPartList.stream().filter(item -> StringUtils.isNotEmpty(item.getMaterial())).map(PartEntity::getMaterial).collect(Collectors.toList());
List<String> maxMatchList = null;
int maxCount = 0;
for(List<String> glassCodeList : sintMaterialList){
int currentCount = (int) glassCodeList.stream().filter(materialList::contains).count();
if (currentCount > maxCount) {
maxCount = currentCount;
maxMatchList = glassCodeList;
}
}
if(maxMatchList != null){
glassCodeStr = maxMatchList.stream().collect(Collectors.joining(","));
log.info("订单:"+order.getYoCode()+",温度曲线是:"+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;
}
}
Boolean isSameFurnace = sameFurnace(order,craft,workPlanList,prevProcessEnd,glassCodeStr,sintMap);
//同炉的话就不用走下面的匹配了,直接下一工序
if(isSameFurnace){
continue;
}
}
@ -493,7 +459,7 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
.eq(EquipResourceEntity::getIsUsed, 0)
.in(EquipResourceEntity::getEquipOrder, entry.getKey()));
if (CollectionUtils.isEmpty(equipResourceList)) {
order.setStatus(YieldOrderEnum.STATUS_PROCESS_ERROR.getCode());
order.setStatus(YieldOrderEnum.STATUS_APS.getCode());
order.setErrorInfo("工序:" + processMap.get(craft.getPpsId()) + ",未匹配到对应的设备资源");
yieldOrderService.updateById(order);
isSchecuding = false;
@ -622,6 +588,7 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
} else {
totalTime = totalTime.add(ability.getStandardTime()).add(ability.getPrepareTime());
}
prevProcessEnd = prevProcessEnd.plusMinutes(totalTime.longValue());
}
List<PersonResourceEntity> personResourceList = personResourceService.list(Wrappers.<PersonResourceEntity>lambdaQuery()
.eq(PersonResourceEntity::getWorkCenterId, craft.getWorkCenterId())
@ -632,7 +599,16 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
if(CollectionUtils.isNotEmpty(personResourceList)){
workPlan.setMakeTeam(personResourceList.get(0).getTeamId());
}
//需要人员资质的指定到人
if(StringUtils.isNotEmpty(ability.getProductIdent())
&& StringUtils.isNotEmpty(order.getProductIdent())
&& ability.getProductIdent().equals(order.getProductIdent())
&& workPlan.getMakeTeam() != null){
List<String> memberList = baseMapper.selectTeamMember(workPlan.getMakeTeam(),ability.getCertificateId());
if(CollectionUtils.isNotEmpty(memberList)){
workPlan.setTeamMembers(memberList.stream().collect(Collectors.joining(",")));
}
}
}else{
prevProcessEnd = prevProcessEnd.plusMinutes(30);
totalTime = BigDecimal.valueOf(30);
@ -1176,17 +1152,224 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
}
}
/*public void sameTrough(YieldOrderCraftEntity yieldOrderCraft,LocalDateTime dateTime){
SameTroughEntity sameTrough =sameTroughService.getOne(Wrappers.<SameTroughEntity>lambdaQuery().eq(SameTroughEntity::getWorkCenterId,yieldOrderCraft.getWorkCenterId()).eq(SameTroughEntity::getCraftId,yieldOrderCraft.getCaId()).eq(SameTroughEntity::getProcessId,yieldOrderCraft.getPpsId()));
public Boolean sameTrough(YieldOrderEntity order,YieldOrderCraftEntity craft,LocalDateTime dateTime,List<WorkPlanEntity> workPlanList){
Boolean isSameTrough = false;
SameTroughEntity sameTrough =sameTroughService.getOne(Wrappers.<SameTroughEntity>lambdaQuery()
.eq(SameTroughEntity::getWorkCenterId,craft.getWorkCenterId())
.eq(SameTroughEntity::getCraftId,craft.getCaId())
.eq(SameTroughEntity::getProcessId,craft.getPpsId()));
if(sameTrough != null){
//查询是否有已经排产的计划
List<WorkPlanEntity> workPlanList = workPlanService.list(Wrappers.<WorkPlanEntity>lambdaQuery().eq(WorkPlanEntity::getWorkCenterId,yieldOrderCraft.getWorkCenterId()).eq(WorkPlanEntity::getCaId,yieldOrderCraft.getCaId()).eq(WorkPlanEntity::getPpsId,yieldOrderCraft.getPpsId()));
if(CollectionUtils.isNotEmpty(workPlanList)){
Map<>
List<WorkPlanEntity> workPlanOldList = workPlanService.list(Wrappers.<WorkPlanEntity>lambdaQuery()
.eq(WorkPlanEntity::getWorkCenterId,craft.getWorkCenterId())
.eq(WorkPlanEntity::getCaId,craft.getCaId())
.eq(WorkPlanEntity::getPpsId,craft.getPpsId())
.ge(WorkPlanEntity::getStartTime,dateTime).orderByAsc(WorkPlanEntity::getStartTime));
if(CollectionUtils.isNotEmpty(workPlanOldList)){
//总生产量
BigDecimal sumCapacity = order.getYpArea().multiply(BigDecimal.valueOf(order.getYpQty()));
//可能有多个订单符合要求,按照车间订单、时间分组排序
Map<Long,List<WorkPlanEntity>> workPlanMap = workPlanOldList.stream().collect(Collectors.groupingBy(WorkPlanEntity::getWoId));
for(Map.Entry<Long,List<WorkPlanEntity>> entry : workPlanMap.entrySet()){
List<WorkPlanEntity> planList = entry.getValue();
Boolean isEnough = true;
List<Long> resourceList = new ArrayList<>();
for(WorkPlanEntity workPlan : planList){
if(workPlan.getEquipResourceId() != null){
EquipResourceEntity equipResource = equipResourceService.getById(workPlan.getEquipResourceId());
//判断剩余产能是否满足总产能
if(sumCapacity.compareTo(equipResource.getRestCapacity()) > 0){
isEnough = false;
resourceList.clear();
break;
}else{
resourceList.add(workPlan.getEquipResourceId());
}
}
}
//如果产能满足,再判断是否满足同槽条件
if(isEnough){
WorkOrderEntity workOrder = this.getById(workPlanOldList.get(0).getWoId());
YieldOrderEntity yieldOrderEntity = yieldOrderService.getById(workOrder.getYoId());
List<YieldOrderCraftEntity> orderCraftList = yieldOrderCraftService.list(Wrappers.<YieldOrderCraftEntity>lambdaQuery()
.eq(YieldOrderCraftEntity::getYoId,yieldOrderEntity.getId())
.eq(YieldOrderCraftEntity::getPpsId,craft.getPpsId())
.eq(YieldOrderCraftEntity::getCaId,craft.getCaId())
.eq(YieldOrderCraftEntity::getWorkCenterId,craft.getWorkCenterId()));
SameTroughVO voNew = sameTroughService.selectSameTroughInfo(craft.getId());
SameTroughVO voOld = sameTroughService.selectSameTroughInfo(orderCraftList.get(0).getId());
//根据同槽因素进行比对
Boolean isSameTrough2 = true;
//键位
if("1".equals(sameTrough.getKeyBinding()) && voNew.getPartCode().equals(voOld.getPartCode()) && StringUtils.isNotEmpty(voNew.getKeyBinding()) && StringUtils.isNotEmpty(voOld.getKeyBinding()) && !voNew.getKeyBinding().equals(voOld.getKeyBinding())){
isSameTrough2 = false;
}
//生产厂家
if("1".equals(sameTrough.getProducter()) && voNew.getPartCode().equals(voOld.getPartCode()) && StringUtils.isNotEmpty(voNew.getProducter()) && StringUtils.isNotEmpty(voOld.getProducter()) && !voNew.getProducter().equals(voOld.getProducter())){
isSameTrough2 = false;
}
//检验编号
if("1".equals(sameTrough.getInspectionCode()) && voNew.getPartCode().equals(voOld.getPartCode()) && StringUtils.isNotEmpty(voNew.getInspectionCode()) && StringUtils.isNotEmpty(voOld.getInspectionCode()) && !voNew.getInspectionCode().equals(voOld.getInspectionCode())){
isSameTrough2 = false;
}
//材料
if("1".equals(sameTrough.getMaterial()) && StringUtils.isNotEmpty(voNew.getMaterial()) && StringUtils.isNotEmpty(voOld.getMaterial()) && !voNew.getMaterial().equals(voOld.getMaterial())){
isSameTrough2 = false;
}
//厚度
if("1".equals(sameTrough.getThickness()) && StringUtils.isNotEmpty(voNew.getThickness()) && StringUtils.isNotEmpty(voOld.getThickness()) && !voNew.getThickness().equals(voOld.getThickness())){
isSameTrough2 = false;
}
//钝化
if("1".equals(sameTrough.getPassivation())){
if(StringUtils.isNotEmpty(voNew.getPlate())
&& StringUtils.isNotEmpty(voOld.getPlate())
&& ((voNew.getPlate().contains("不钝化")
&& !voOld.getPlate().contains("不钝化"))
|| (voOld.getPlate().contains("不钝化")
&& !voNew.getPlate().contains("不钝化")))){
isSameTrough2 = false;
}
}
//硬度
if("1".equals(sameTrough.getHardness()) && StringUtils.isNotEmpty(voNew.getHardness()) && StringUtils.isNotEmpty(voOld.getHardness()) && !voNew.getHardness().equals(voOld.getHardness())){
isSameTrough2 = false;
}
//生产标识
if("1".equals(sameTrough.getProductIdent())){
List<String> highIdentList = Arrays.asList(new String[]{"JHT","JI","JIX","YH","CC","SATA"});
if(StringUtils.isNotEmpty(order.getProductIdent()) && highIdentList.contains(order.getProductIdent())){
isSameTrough2 = false;
}
if(!(voNew.getPartCode().equals(voOld.getPartCode())
&& StringUtils.isNotEmpty(voNew.getProductIdent())
&& StringUtils.isNotEmpty(voOld.getProductIdent())
&& voNew.getProductIdent().equals(voOld.getProductIdent()))){
isSameTrough2 = false;
}
}
if(isSameTrough2){
for(Long resourceId : resourceList){
EquipResourceEntity equipResource = equipResourceService.getById(resourceId);
//生成车间订单
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);
isSameTrough = true;
}
}
}
}
}
}
return isSameTrough;
}
public Boolean sameFurnace(YieldOrderEntity order,YieldOrderCraftEntity craft,List<WorkPlanEntity> workPlanList,LocalDateTime prevProcessEnd,String glassCodeStr,Map<Long, List<SintTempCurveEntity>> sintMap){
Boolean isSameFurnace = false;
if(order.getYieldType() == 2 || order.getYieldType() == 3){//烧结订单
//获取当前工序的所有温度曲线
List<SintTempCurveEntity> sintList = sintMap.get(craft.getPpsId());
List<List<String>> sintMaterialList = new ArrayList<>();
sintList.stream().map(SintTempCurveEntity::getGlassCode).collect(Collectors.toList()).forEach(item -> sintMaterialList.add(Arrays.asList(item.split(","))));
//根据零件号获取子件信息
PartEntity part = new PartEntity();
part.setPartCode(order.getPartCode());
List<PartEntity> childPartList = partService.selectChildPart(part);
if(CollectionUtils.isNotEmpty(childPartList)){
//获取子件的所有玻璃粉牌号
List<String> materialList = childPartList.stream().filter(item -> StringUtils.isNotEmpty(item.getMaterial())).map(PartEntity::getMaterial).collect(Collectors.toList());
List<String> maxMatchList = null;
int maxCount = 0;
for(List<String> glassCodeList : sintMaterialList){
int currentCount = (int) glassCodeList.stream().filter(materialList::contains).count();
if (currentCount > maxCount) {
maxCount = currentCount;
maxMatchList = glassCodeList;
}
}
if(maxMatchList != null){
glassCodeStr = maxMatchList.stream().collect(Collectors.joining(","));
log.info("订单:"+order.getYoCode()+",温度曲线是:"+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()));
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;
}
}
SameTroughVO vo = sameTroughService.selectSameTroughInfo(yieldOrderCraft.getId());
}
}*/
return isSameFurnace;
}
}

Loading…
Cancel
Save