自动分派逻辑修改

liweidong
李涛 4 days ago
parent 6e1e8cc781
commit 1b6280be76
  1. 6
      blade-service/blade-desk/src/main/java/org/springblade/desk/order/mapper/YieldOrderDailyAssignMapper.java
  2. 55
      blade-service/blade-desk/src/main/java/org/springblade/desk/order/mapper/YieldOrderDailyAssignMapper.xml
  3. 13
      blade-service/blade-desk/src/main/java/org/springblade/desk/order/service/IYieldOrderDailyAssignService.java
  4. 21
      blade-service/blade-desk/src/main/java/org/springblade/desk/order/service/impl/YieldOrderCraftServiceImpl.java
  5. 44
      blade-service/blade-desk/src/main/java/org/springblade/desk/order/service/impl/YieldOrderDailyAssignImpl.java
  6. 3
      blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/impl/WorkOrderServiceImpl.java

@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.springblade.desk.order.pojo.dto.YieldOrderAssignCount;
import org.springblade.desk.order.pojo.entity.YieldOrderAssignDaily;
import java.util.List;
/**
* 生产订单日分派Mapper
*
@ -20,4 +22,8 @@ public interface YieldOrderDailyAssignMapper extends BaseMapper<YieldOrderAssign
* @return
*/
YieldOrderAssignCount queryCount(String dayStr, Long abilityId, int orgType);
List<YieldOrderAssignDaily> findSuitableByParams(Long hostCaId, List<Long> wcList, Double quantity, int batch, double area, String time);
List<YieldOrderAssignDaily> findMinNum(Long abilityId, List<Long> wcList);
}

@ -16,4 +16,59 @@
AND a.OEM_ID IS NOT NULL
</if>
</select>
<select id="findSuitableByParams" resultType="org.springblade.desk.order.pojo.entity.YieldOrderAssignDaily">
SELECT DISTINCT
a.*
FROM
MES_YIELD_ORDER_ASSIGN_DAILY a
INNER JOIN BS_OEM_CRAFT b ON a.WORK_CENTER_ID = b.OTHER_ID AND a.CRAFT_ABILITY_ID = b.CRAFT_ABILITY_ID
INNER JOIN BS_CENTER_TEAM c ON b.OTHER_ID = c.wc_id
INNER JOIN BS_TEAM_TIME d ON c.TS_ID = d.TS_ID
WHERE
a.CA_ID = #{hostCaId}
AND a.DAA_DATE >= TRUNC(SYSDATE) AND a.DAA_DATE &lt; TRUNC(SYSDATE) + 1
AND a.wc_id IN
<foreach collection="wcList" item="id" open="(" close=")" separator=",">
#{id}
</foreach>
AND d.START_TIME &lt; #{time}
AND (
d.END_TIME >= #{time} OR d.END_TIME &lt;= d.START_TIME)
AND (
b.QUANTITY IS NULL
OR b.QUANTITY = 0
OR ( b.QUANTITY * ( b.saturation / 100 ) ) > to_char( a.DAA_QTY + #{quantity})
)
AND (
b.BATCH_NO IS NULL
OR b.BATCH_NO = 0
OR ( b.BATCH_NO * ( b.saturation / 100 ) ) > to_char( a.DAA_BACTH + #{batch})
)
AND (
b.AREA IS NULL
OR b.AREA = 0
OR ( b.AREA * ( b.saturation / 100 ) ) > to_char( a.DAA_AREA + #{area})
)
ORDER BY a.DAA_NUM ASC
</select>
<select id="findMinNum" resultType="org.springblade.desk.order.pojo.entity.YieldOrderAssignDaily">
SELECT DISTINCT
a.*
FROM
MES_YIELD_ORDER_ASSIGN_DAILY a
INNER JOIN BS_WORK_CENTER b ON a.WORK_CENTER_ID = b.ID
INNER JOIN BS_CENTER_TEAM c ON b.ID = c.wc_id
INNER JOIN BS_TEAM_TIME d ON c.TS_ID = d.TS_ID
WHERE
a.CA_ID = #{hostCaId}
AND a.DAA_DATE >= TRUNC(SYSDATE) AND a.DAA_DATE &lt; TRUNC(SYSDATE) + 1
AND a.wc_id IN
<foreach collection="wcList" item="id" open="(" close=")" separator=",">
#{id}
</foreach>
AND d.START_TIME &lt; #{time}
AND (
d.END_TIME >= #{time} OR d.END_TIME &lt;= d.START_TIME)
ORDER BY a.DAA_NUM ASC
</select>
</mapper>

@ -43,4 +43,17 @@ public interface IYieldOrderDailyAssignService extends BaseService<YieldOrderAss
YieldOrderAssignDaily findMinNum(Long abilityId, List<Long> workCenterIdList);
void init() throws Exception;
/**
* @Description: 根据条件匹配最合适的作业中心
* @param hostCaId 工艺能力
* @param wcList 作业中心集合
* @param quantity 数量
* @param batch 批数
* @param area 面积
* @return PjDayAbilityAssignment
* @Author dxl
* @CreateTime 2023/3/8 10:50
*/
YieldOrderAssignDaily findSuitableByParams(Long hostCaId, List<Long> wcList, Double quantity, int batch, double area);
}

@ -379,7 +379,7 @@ public class YieldOrderCraftServiceImpl extends BaseServiceImpl<YieldOrderCraftM
//判断规则中配置的工作中心是否满足当前工艺能力要求,如果不满足,则此条规则作废
if (wcMap.get(assign.getCenterId()) != null) {
//查询当前作业中心是否满足生产当前这批活的条件,若不满足,则考虑其他满足的作业中心
YieldOrderAssignDaily dayAbilityAssignment = dailyAssignService.findMinNum(hostCaId, wcList);
YieldOrderAssignDaily dayAbilityAssignment = dailyAssignService.findSuitableByParams(hostCaId, wcList, yieldOrder.getYpQty(), 1, yieldOrder.getYpQty() * yieldOrder.getYpArea());
if (dayAbilityAssignment != null) {
workCenter = workCenterService.getWorkCenter(assign.getCenterId());
//外部如果限制类型不是必须,则直接考虑规则限制类型
@ -417,13 +417,20 @@ public class YieldOrderCraftServiceImpl extends BaseServiceImpl<YieldOrderCraftM
//作业中心
WorkCenter workCenter = null;
//如果找到合适的作业中心直接分派,反之如果未找到合适的作业中心(bool 是true的情况下强制厂内,bool是false是优先厂内,不满足的情况下直接返回空)
// todo 待完善
YieldOrderAssignDaily dayAbilityAssignment = dailyAssignService.findMinNum(hostCaId, wcList);
if (Func.isEmpty(dayAbilityAssignment)) {
return null;
YieldOrderAssignDaily dayAbilityAssignment = dailyAssignService.findSuitableByParams(hostCaId, wcList, yieldOrder.getYpQty(), 1, yieldOrder.getYpQty() * yieldOrder.getYpArea());
if (dayAbilityAssignment != null) {
workCenter = workCenterService.getWorkCenter(dayAbilityAssignment.getWorkCenterId());
workCenter.setLimitType(limitType);
} else if (WorkCenter.LIMIT_TYPE_MUST.equals(limitType)) {
YieldOrderAssignDaily assignServiceMinNum = dailyAssignService.findMinNum(hostCaId, wcList);
if (assignServiceMinNum == null) {
return null;
}
workCenter = workCenterService.getWorkCenter(assignServiceMinNum.getWorkCenterId());
if (workCenter != null) {
workCenter.setLimitType(limitType);
}
}
workCenter = workCenterService.getWorkCenter(dayAbilityAssignment.getWorkCenterId());
workCenter.setLimitType(limitType);
return workCenter;
}

@ -26,6 +26,7 @@ import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
@ -102,23 +103,25 @@ public class YieldOrderDailyAssignImpl extends BaseServiceImpl<YieldOrderDailyAs
@Override
public YieldOrderAssignDaily findMinNum(Long abilityId, List<Long> workCenterIdList) {
LocalDate today = LocalDate.now();
LocalDateTime startOfDay = today.atStartOfDay();
LocalDateTime endOfDay = today.atTime(LocalTime.MAX);
LambdaQueryWrapper<YieldOrderAssignDaily> wrapper = Wrappers.<YieldOrderAssignDaily>query().lambda()
.eq(YieldOrderAssignDaily::getIsDeleted, CommonConstant.BOOLEAN_FALSE)
.eq(YieldOrderAssignDaily::getCraftAbilityId, abilityId)
.between(YieldOrderAssignDaily::getCreateTime,
DateUtil.toDate(startOfDay),
DateUtil.toDate(endOfDay));
if (Func.isNotEmpty(workCenterIdList)) {
wrapper.in(YieldOrderAssignDaily::getWorkCenterId, workCenterIdList);
}
List<YieldOrderAssignDaily> list = baseMapper.selectList(wrapper);
if(CollectionUtils.isEmpty(list)){
return null;
}
return list.get(0);
// LocalDate today = LocalDate.now();
// LocalDateTime startOfDay = today.atStartOfDay();
// LocalDateTime endOfDay = today.atTime(LocalTime.MAX);
// LambdaQueryWrapper<YieldOrderAssignDaily> wrapper = Wrappers.<YieldOrderAssignDaily>query().lambda()
// .eq(YieldOrderAssignDaily::getIsDeleted, CommonConstant.BOOLEAN_FALSE)
// .eq(YieldOrderAssignDaily::getCraftAbilityId, abilityId)
// .between(YieldOrderAssignDaily::getCreateTime,
// DateUtil.toDate(startOfDay),
// DateUtil.toDate(endOfDay));
// if (Func.isNotEmpty(workCenterIdList)) {
// wrapper.in(YieldOrderAssignDaily::getWorkCenterId, workCenterIdList);
// }
// List<YieldOrderAssignDaily> list = baseMapper.selectList(wrapper);
// if(CollectionUtils.isEmpty(list)){
// return null;
// }
// return list.get(0);
List<YieldOrderAssignDaily> list = baseMapper.findMinNum(abilityId, workCenterIdList);
return CollectionUtils.isNotEmpty(list) ? list.get(0) : null;
}
@Override
@ -148,6 +151,13 @@ public class YieldOrderDailyAssignImpl extends BaseServiceImpl<YieldOrderDailyAs
}
}
@Override
public YieldOrderAssignDaily findSuitableByParams(Long hostCaId, List<Long> wcList, Double quantity, int batch, double area) {
String format = LocalTime.now().format(DateTimeFormatter.ofPattern("HH:mm"));
List<YieldOrderAssignDaily> list = baseMapper.findSuitableByParams(hostCaId, wcList, quantity, batch, area, format);
return CollectionUtils.isNotEmpty(list) ? list.get(0) : null;
}
private void handelPlanAssignSteer(Long ocId, Double area, Long caId, String partCode) throws Exception {
//开始处理所有有这个工艺能力或者零件能力的厂家

@ -2951,11 +2951,10 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
null, prWorkPlan.getMakeTeam(), null, null, "分派默认(厂内)",
null, "1", "0", null);
workOrderRunService.save(wr);
//更改订单调度员和计划员
BsTeamSetEntity teamSet = teamSetService.getById(prWorkPlan.getMakeTeam());
// 2025-07-23 线上迁移修改 增加if判断
if (prWorkPlan.getMakeTeam() != null) {
if (teamSet != null) {
this.maintainOrder(workOrder, teamSet.getPlanner(), teamSet.getDispatcher(), wr, false);
} else {
throw new ServiceException("未找到合适的班组或厂家");

Loading…
Cancel
Save