自动分派逻辑修改

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. 17
      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.dto.YieldOrderAssignCount;
import org.springblade.desk.order.pojo.entity.YieldOrderAssignDaily; import org.springblade.desk.order.pojo.entity.YieldOrderAssignDaily;
import java.util.List;
/** /**
* 生产订单日分派Mapper * 生产订单日分派Mapper
* *
@ -20,4 +22,8 @@ public interface YieldOrderDailyAssignMapper extends BaseMapper<YieldOrderAssign
* @return * @return
*/ */
YieldOrderAssignCount queryCount(String dayStr, Long abilityId, int orgType); 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 AND a.OEM_ID IS NOT NULL
</if> </if>
</select> </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> </mapper>

@ -43,4 +43,17 @@ public interface IYieldOrderDailyAssignService extends BaseService<YieldOrderAss
YieldOrderAssignDaily findMinNum(Long abilityId, List<Long> workCenterIdList); YieldOrderAssignDaily findMinNum(Long abilityId, List<Long> workCenterIdList);
void init() throws Exception; 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) { 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) { if (dayAbilityAssignment != null) {
workCenter = workCenterService.getWorkCenter(assign.getCenterId()); workCenter = workCenterService.getWorkCenter(assign.getCenterId());
//外部如果限制类型不是必须,则直接考虑规则限制类型 //外部如果限制类型不是必须,则直接考虑规则限制类型
@ -417,13 +417,20 @@ public class YieldOrderCraftServiceImpl extends BaseServiceImpl<YieldOrderCraftM
//作业中心 //作业中心
WorkCenter workCenter = null; WorkCenter workCenter = null;
//如果找到合适的作业中心直接分派,反之如果未找到合适的作业中心(bool 是true的情况下强制厂内,bool是false是优先厂内,不满足的情况下直接返回空) //如果找到合适的作业中心直接分派,反之如果未找到合适的作业中心(bool 是true的情况下强制厂内,bool是false是优先厂内,不满足的情况下直接返回空)
// todo 待完善 YieldOrderAssignDaily dayAbilityAssignment = dailyAssignService.findSuitableByParams(hostCaId, wcList, yieldOrder.getYpQty(), 1, yieldOrder.getYpQty() * yieldOrder.getYpArea());
YieldOrderAssignDaily dayAbilityAssignment = dailyAssignService.findMinNum(hostCaId, wcList); if (dayAbilityAssignment != null) {
if (Func.isEmpty(dayAbilityAssignment)) { 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; return null;
} }
workCenter = workCenterService.getWorkCenter(dayAbilityAssignment.getWorkCenterId()); workCenter = workCenterService.getWorkCenter(assignServiceMinNum.getWorkCenterId());
if (workCenter != null) {
workCenter.setLimitType(limitType); workCenter.setLimitType(limitType);
}
}
return workCenter; return workCenter;
} }

@ -26,6 +26,7 @@ import java.math.BigDecimal;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.LocalTime; import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -102,23 +103,25 @@ public class YieldOrderDailyAssignImpl extends BaseServiceImpl<YieldOrderDailyAs
@Override @Override
public YieldOrderAssignDaily findMinNum(Long abilityId, List<Long> workCenterIdList) { public YieldOrderAssignDaily findMinNum(Long abilityId, List<Long> workCenterIdList) {
LocalDate today = LocalDate.now(); // LocalDate today = LocalDate.now();
LocalDateTime startOfDay = today.atStartOfDay(); // LocalDateTime startOfDay = today.atStartOfDay();
LocalDateTime endOfDay = today.atTime(LocalTime.MAX); // LocalDateTime endOfDay = today.atTime(LocalTime.MAX);
LambdaQueryWrapper<YieldOrderAssignDaily> wrapper = Wrappers.<YieldOrderAssignDaily>query().lambda() // LambdaQueryWrapper<YieldOrderAssignDaily> wrapper = Wrappers.<YieldOrderAssignDaily>query().lambda()
.eq(YieldOrderAssignDaily::getIsDeleted, CommonConstant.BOOLEAN_FALSE) // .eq(YieldOrderAssignDaily::getIsDeleted, CommonConstant.BOOLEAN_FALSE)
.eq(YieldOrderAssignDaily::getCraftAbilityId, abilityId) // .eq(YieldOrderAssignDaily::getCraftAbilityId, abilityId)
.between(YieldOrderAssignDaily::getCreateTime, // .between(YieldOrderAssignDaily::getCreateTime,
DateUtil.toDate(startOfDay), // DateUtil.toDate(startOfDay),
DateUtil.toDate(endOfDay)); // DateUtil.toDate(endOfDay));
if (Func.isNotEmpty(workCenterIdList)) { // if (Func.isNotEmpty(workCenterIdList)) {
wrapper.in(YieldOrderAssignDaily::getWorkCenterId, workCenterIdList); // wrapper.in(YieldOrderAssignDaily::getWorkCenterId, workCenterIdList);
} // }
List<YieldOrderAssignDaily> list = baseMapper.selectList(wrapper); // List<YieldOrderAssignDaily> list = baseMapper.selectList(wrapper);
if(CollectionUtils.isEmpty(list)){ // if(CollectionUtils.isEmpty(list)){
return null; // return null;
} // }
return list.get(0); // return list.get(0);
List<YieldOrderAssignDaily> list = baseMapper.findMinNum(abilityId, workCenterIdList);
return CollectionUtils.isNotEmpty(list) ? list.get(0) : null;
} }
@Override @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 { 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, prWorkPlan.getMakeTeam(), null, null, "分派默认(厂内)",
null, "1", "0", null); null, "1", "0", null);
workOrderRunService.save(wr); workOrderRunService.save(wr);
//更改订单调度员和计划员 //更改订单调度员和计划员
BsTeamSetEntity teamSet = teamSetService.getById(prWorkPlan.getMakeTeam()); BsTeamSetEntity teamSet = teamSetService.getById(prWorkPlan.getMakeTeam());
// 2025-07-23 线上迁移修改 增加if判断 // 2025-07-23 线上迁移修改 增加if判断
if (prWorkPlan.getMakeTeam() != null) { if (teamSet != null) {
this.maintainOrder(workOrder, teamSet.getPlanner(), teamSet.getDispatcher(), wr, false); this.maintainOrder(workOrder, teamSet.getPlanner(), teamSet.getDispatcher(), wr, false);
} else { } else {
throw new ServiceException("未找到合适的班组或厂家"); throw new ServiceException("未找到合适的班组或厂家");

Loading…
Cancel
Save