Merge remote-tracking branch 'origin/master'

liweidong
绫Umbrella 4 weeks ago
commit 5674ca6a73
  1. 45
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/basic/pojo/entity/BsAssignEntity.java
  2. 13
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/basic/pojo/entity/Oem.java
  3. 50
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/dashboard/pojo/entity/BsWorkCenterEntity.java
  4. 8
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/dashboard/pojo/enums/DsCraftEnum.java
  5. 55
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/dashboard/pojo/enums/PartCraftStatusEnum.java
  6. 36
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/order/pojo/dto/YieldOrderAssignCount.java
  7. 8
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/order/pojo/entity/YieldOrder.java
  8. 63
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/order/pojo/entity/YieldOrderAssignDaily.java
  9. 62
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/order/pojo/entity/YieldOrderAssignSteer.java
  10. 1
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/order/pojo/entity/YieldOrderCraft.java
  11. 19
      blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/IBatConfigService.java
  12. 35
      blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/IBsAssignService.java
  13. 29
      blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/IOemCraftAbilityService.java
  14. 53
      blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/IOemService.java
  15. 30
      blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/IWorkCenterService.java
  16. 23
      blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/impl/BatConfigServiceImpl.java
  17. 34
      blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/impl/BsAssignServiceImpl.java
  18. 29
      blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/impl/OemCraftAbilityServiceImpl.java
  19. 146
      blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/impl/OemServiceImpl.java
  20. 83
      blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/impl/WorkCenterServiceImpl.java
  21. 22
      blade-service/blade-desk/src/main/java/org/springblade/desk/dashboard/service/IDsSimilarPartsService.java
  22. 63
      blade-service/blade-desk/src/main/java/org/springblade/desk/dashboard/service/impl/DsSimilarPartsServiceImpl.java
  23. 2
      blade-service/blade-desk/src/main/java/org/springblade/desk/order/controller/YieldOrderController.java
  24. 13
      blade-service/blade-desk/src/main/java/org/springblade/desk/order/mapper/YieldOrderAssignSteerMapper.java
  25. 8
      blade-service/blade-desk/src/main/java/org/springblade/desk/order/mapper/YieldOrderAssignSteerMapper.xml
  26. 23
      blade-service/blade-desk/src/main/java/org/springblade/desk/order/mapper/YieldOrderDailyAssignMapper.java
  27. 19
      blade-service/blade-desk/src/main/java/org/springblade/desk/order/mapper/YieldOrderDailyAssignMapper.xml
  28. 41
      blade-service/blade-desk/src/main/java/org/springblade/desk/order/service/IYieldOrderAssignSteerService.java
  29. 12
      blade-service/blade-desk/src/main/java/org/springblade/desk/order/service/IYieldOrderCraftService.java
  30. 44
      blade-service/blade-desk/src/main/java/org/springblade/desk/order/service/IYieldOrderDailyAssignService.java
  31. 75
      blade-service/blade-desk/src/main/java/org/springblade/desk/order/service/impl/YieldOrderAssignSteerImpl.java
  32. 637
      blade-service/blade-desk/src/main/java/org/springblade/desk/order/service/impl/YieldOrderCraftServiceImpl.java
  33. 85
      blade-service/blade-desk/src/main/java/org/springblade/desk/order/service/impl/YieldOrderDailyAssignImpl.java
  34. 120
      blade-service/blade-desk/src/main/java/org/springblade/desk/order/service/impl/YieldOrderServiceImpl.java
  35. 79
      doc/sql/mes/increase-20690321.sql

@ -1,28 +1,3 @@
/**
* 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.desk.basic.pojo.entity;
import com.baomidou.mybatisplus.annotation.TableName;
@ -30,7 +5,6 @@ import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springblade.core.mp.base.BaseEntity;
import org.springblade.core.tenant.mp.TenantEntity;
import java.io.Serial;
import java.math.BigDecimal;
@ -50,6 +24,23 @@ public class BsAssignEntity extends BaseEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* 优先
*/
public static Integer PRIORITY = 0;
/**
* 必须
*/
public static Integer MUST = 1;
/**
* 厂内
*/
public static Integer IN_FACTORY = 0;
/**
* 外协
*/
public static Integer OUTSOURCE = 1;
/**
* 工艺名称
*/
@ -131,7 +122,7 @@ public class BsAssignEntity extends BaseEntity {
@Schema(description = "备注")
private String remark;
/**
*
*
*/
@Schema(description = "")
private Long sort;

@ -160,4 +160,17 @@ public class Oem extends BaseEntity {
@TableField(exist = false)
private List<CraftAbilityEntity> crafs;
@TableField(exist = false)
private Integer limitType;
/**
* @Description: 是否零件匹配
* @param null
* @return null
* @Author dxl
* @CreateTime 2023/3/16 14:26
*/
@TableField(exist = false)
private Boolean partCodeYesOrNo = false;
}

@ -1,39 +1,14 @@
/**
* 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.desk.dashboard.pojo.entity;
import lombok.Data;
import io.swagger.v3.oas.annotations.media.Schema;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import java.math.BigDecimal;
import java.util.Date;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springblade.core.mp.base.BaseEntity;
import org.springblade.core.tenant.mp.TenantEntity;
import java.io.Serial;
import java.math.BigDecimal;
/**
* 工作中心表 实体类
@ -49,6 +24,18 @@ public class BsWorkCenterEntity extends BaseEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* 正常
*/
public static Integer LIMIT_TYPE_NORMAL = 0;
/**
* 优先
*/
public static Integer LIMIT_TYPE_PRIOR = 1;
/**
* 必须
*/
public static Integer LIMIT_TYPE_MUST = 2;
/**
* 饱和度
@ -151,4 +138,7 @@ public class BsWorkCenterEntity extends BaseEntity {
@Schema(description = "批次")
private Long batchNo;
@TableField(exist = false)
private Integer limitType;
}

@ -29,11 +29,11 @@ public enum DsCraftEnum {
STATUS_CLOSE("关闭", 10005),
/**
* 工艺级别; 11001新建11002:已下发11003已完成
* 工艺级别; 11001一级11002:二级11003三级
*/
RANK_ONE("新建", 11001),
RANK_TWO("已下发", 11002),
RANK_THREE("已完成", 11003),
RANK_ONE("一级", 11001),
RANK_TWO("二级", 11002),
RANK_THREE("三级", 11003),
/**
* 优先级

@ -1,32 +1,45 @@
package org.springblade.desk.dashboard.pojo.enums;
import lombok.Getter;
import org.springblade.core.tool.utils.ObjectUtil;
import org.springblade.core.tool.utils.StringPool;
import java.util.Arrays;
/**
* @author: liweidong
* @create: 2026-03-18
*/
@Getter
public enum PartCraftStatusEnum {
SUCCESS("0", "查询成功"),
PART_CODE_EMPTY("-6", "partCode不能为空"),
ROAM_NO_EMPTY("-7", "roamNo不能为空"),
PART_NOT_EXIST("-1", "零件信息为空"),
PART_EXPIRED("-2", "零件超期"),
NO_CRAFT_INFO("-3", "没有工艺信息,创建维护任务"),
NO_PROCEDURE_INFO("-4", "没有工序信息"),
NO_CRAFT_RANK_INFO("-5", "没有工艺等级信息");
private final String code;
private final String msg;
SUCCESS("0", "查询成功"),
PART_CODE_EMPTY("-6", "partCode不能为空"),
ROAM_NO_EMPTY("-7", "roamNo不能为空"),
PART_NOT_EXIST("-1", "零件信息为空"),
PART_EXPIRED("-2", "零件超期"),
NO_CRAFT_INFO("-3", "没有工艺信息,创建维护任务"),
NO_PROCEDURE_INFO("-4", "没有工序信息"),
NO_CRAFT_RANK_INFO("-5", "没有工艺等级信息");
PartCraftStatusEnum(String code, String msg) {
this.code = code;
this.msg = msg;
}
final String code;
final String msg;
public String getCode() {
return code;
}
PartCraftStatusEnum(String code, String msg) {
this.code = code;
this.msg = msg;
}
public String getMsg() {
return msg;
}
/**
* 根据值获取名称
*
* @param category
* @return
*/
public static String getMsg(String category) {
PartCraftStatusEnum item = Arrays.stream(PartCraftStatusEnum.values())
.filter(enumItem -> enumItem.getCode().equals(category))
.findFirst()
.orElse(null);
return ObjectUtil.isEmpty(item) ? StringPool.EMPTY : item.getMsg();
}
}

@ -0,0 +1,36 @@
package org.springblade.desk.order.pojo.dto;
import lombok.Data;
import org.springblade.core.mp.base.BaseEntity;
/**
* 生产订单日分派
*
* @author lqk
* @TableName MES_YIELD_ORDER_DAILY_ASSIGN
*/
@Data
public class YieldOrderAssignCount extends BaseEntity {
/**
* 1厂外 2厂内
*/
private Short appointType;
/**
* 分派次数
*/
private Long totalNum;
/**
* 已分派产能(数量)
*/
private Long totalQuantity;
/**
* 已分派产能(面积)
*/
private Double totalArea;
/**
* 已分派产能(批数)
*/
private Long totalBatch;
}

@ -157,10 +157,8 @@ public class YieldOrder extends BaseEntity {
private String partCode;
/**
* todo 只有字段没有动 mapper
* 零件号版本号
*/
// @TableField(value = "PART_VERSION", exist = false)
@TableField(value = "PART_VERSION")
private String partVersion;
@ -462,4 +460,10 @@ public class YieldOrder extends BaseEntity {
@TableField(value = "ACTUAL_WEIGHING")
private BigDecimal actualWeighing;
/**
* 工艺Id
*/
@TableField(value = "craft_id")
private Long craftId;
}

@ -0,0 +1,63 @@
package org.springblade.desk.order.pojo.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import org.springblade.core.mp.base.BaseEntity;
/**
* 生产订单日分派
*
* @author lqk
* @TableName MES_YIELD_ORDER_DAILY_ASSIGN
*/
@Data
@TableName(value = "MES_YIELD_ORDER_ASSIGN_DAILY")
public class YieldOrderAssignDaily extends BaseEntity {
@TableField(exist = false)
private static final long serialVersionUID = 1L;
/**
* 供应商
*/
@TableField(value = "OEM_ID")
private Long oemId;
/**
* 作业中心
*/
@TableField(value = "WORK_CENTER_ID")
private Long workCenterId;
/**
* 工艺能力
*/
@TableField(value = "CRAFT_ABILITY_ID")
private Long craftAbilityId;
/**
* 面积
*/
@TableField(value = "AREA")
private Double area = 0D;
/**
* 数量
*/
@TableField(value = "QUANTITY")
private Double quantity = 0d;
/**
* 批数
*/
@TableField(value = "BATCH")
private Long batch = 0L;
/**
* 分派数
*/
@TableField(value = "NUM")
private Long num = 0L;
}

@ -0,0 +1,62 @@
package org.springblade.desk.order.pojo.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import org.springblade.core.mp.base.BaseEntity;
/**
* 生产订单分派控制, 主要针对外协
*
* @author lqk
* @TableName MES_YIELD_ORDER_ASSIGN_STEER
*/
@Data
@TableName(value = "MES_YIELD_ORDER_ASSIGN_STEER")
public class YieldOrderAssignSteer extends BaseEntity {
@TableField(exist = false)
private static final long serialVersionUID = 1L;
/**
* 供应商
*/
@TableField(value = "oem_id")
private Long oemId;
/**
* 工艺能力
*/
@TableField(value = "craft_ability_id")
private Long craftAbilityId;
/**
* 零件编码
*/
@TableField(value = "part_code")
private String partCode;
/**
* 累计日分派量
*/
@TableField(value = "daily_assign")
private Double dailyAssign = 0D;
/**
* 周累计分派量
*/
@TableField(value = "week_assign")
private Double weekAssign = 0D;
/**
* 分派比例
*/
@TableField(value = "assign_scale")
private Double assignScale = 0D;
/**
* 比例偏差因子
*/
@TableField(value = "factor")
private Double factor = 0D;
}

@ -73,7 +73,6 @@ public class YieldOrderCraft extends BaseEntity {
@TableField(value = "HOUR_QUOTA")
private Double hourQuota;
/**
* 计划开始
*/

@ -36,9 +36,20 @@ public interface IBatConfigService extends BaseService<BatConfig> {
*/
List<BatConfigExcel> exportBatConfig(Wrapper<BatConfig> queryWrapper);
/**
* VO
* @param vo
*/
/**
* VO
*
* @param vo
*/
void setVOValue(BatConfigVO vo);
/**
* @param hostCaId
* @param part
* @return BsCraftSet
* @Description: 根据工艺能力设置大批量面积规则
* @Author dxl
* @CreateTime 2023/3/8 17:00
*/
BatConfig findByCaId(Long hostCaId, String part, Double singletonArea);
}

@ -27,14 +27,11 @@ package org.springblade.desk.basic.service;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import jakarta.validation.Valid;
import org.springblade.core.mp.base.BaseService;
import org.springblade.core.tool.api.R;
import org.springblade.desk.basic.excel.BsAssignExcel;
import org.springblade.desk.basic.pojo.entity.BsAssignEntity;
import org.springblade.desk.basic.pojo.vo.BsAssignVO;
import org.springframework.web.bind.annotation.RequestBody;
import java.util.List;
@ -48,14 +45,15 @@ public interface IBsAssignService extends BaseService<BsAssignEntity> {
/**
* 自定义分页
*
* @param page 分页参数
* @param page 分页参数
* @param bsAssign 查询参数
* @return IPage<BsAssignVO>
*/
IPage<BsAssignVO> selectBsAssignPage(IPage<BsAssignVO> page, BsAssignVO bsAssign);
public R saveBat(List<BsAssignEntity> addList);
public R importExcel(List<BsAssignExcel> addList);
R saveBat(List<BsAssignEntity> addList);
R importExcel(List<BsAssignExcel> addList);
/**
* 导出数据
@ -65,4 +63,29 @@ public interface IBsAssignService extends BaseService<BsAssignEntity> {
*/
List<BsAssignExcel> exportBsAssign(Wrapper<BsAssignEntity> queryWrapper);
/**
* 验证是否存在强制类规则
*
* @param appointType
* @return
*/
List<BsAssignEntity> listByPointType(int appointType);
/**
* 验证是否存在强制类规则
*
* @param abilityId
* @param appointType
* @return
*/
List<BsAssignEntity> listMustAssign(Long abilityId, int appointType);
/**
* 根据零件号+工艺能力获取唯一规则
*
* @param abilityId
* @param partCode
* @return
*/
BsAssignEntity getByPartCode(Long abilityId, String partCode);
}

@ -25,13 +25,8 @@
*/
package org.springblade.desk.basic.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.basic.excel.CraftAbilityExcel;
import org.springblade.desk.basic.pojo.entity.OemCraftAbilityEntity;
import org.springblade.desk.basic.pojo.vo.CraftAbilityVO;
import org.springblade.scheduling.pojo.entity.CraftAbilityEntity;
import java.util.List;
@ -43,12 +38,20 @@ import java.util.List;
*/
public interface IOemCraftAbilityService extends BaseService<OemCraftAbilityEntity> {
/**
* 根据工艺能力外协商获取关联信息
*
* @param ocId 外协商ID
* @param caId 工艺能力ID
* @return
*/
OemCraftAbilityEntity findBsOemAbility(Long ocId, Long caId);
/**
* 根据工艺能力外协商获取关联信息
*
* @param ocId 外协商ID
* @param caId 工艺能力ID
* @return
*/
OemCraftAbilityEntity findBsOemAbility(Long ocId, Long caId);
/**
* 根据工艺能力获取加工对象关联信息
*
* @param caId 工艺能力ID
* @return
*/
List<OemCraftAbilityEntity> findByAbility(Long caId);
}

@ -28,24 +28,45 @@ public interface IOemService extends BaseService<Oem> {
* @param oem 查询参数
* @return IPage<OemVO>
*/
IPage<OemVO> selectOemPage(IPage<OemVO> page, OemVO oem);
IPage<OemVO> selectOemPage(IPage<OemVO> page, OemVO oem);
/**
* 导出数据
*
* @param queryWrapper 查询条件
* @return List<OemExcel>
*/
List<OemExcel> exportOem(Wrapper<Oem> queryWrapper);
/**
* 导出数据
*
* @param queryWrapper 查询条件
* @return List<OemExcel>
*/
List<OemExcel> exportOem(Wrapper<Oem> queryWrapper);
/**
* VO
*
* @param vo
*/
void setVOValue(OemVO vo);
/**
* VO
*
* @param vo
*/
void setVOValue(OemVO vo);
IPage<Oem> listSearch(IPage<Oem> page, OemSearch search);
IPage<Oem> listSearch(IPage<Oem> page, OemSearch search);
R setPassword(Oem updateOne);
R setPassword(Oem updateOne);
/**
* 根据工艺能力查找作业中心列表
*
* @param abilityId
* @param ypQty
* @param ypArea
* @param partCode
* @param PrimaryCraft
* @param yieldType
* @param rxlSpace 是否需要特殊分派 null :不需要 true:需要
* @return
*/
List<Long> selectByAbility(Long abilityId,
Double ypQty,
Double ypArea,
String partCode,
String PrimaryCraft,
Integer yieldType,
String plate,
Boolean rxlSpace);
}

@ -9,8 +9,10 @@ import org.springblade.core.mp.base.BaseService;
import org.springblade.desk.basic.excel.WorkCenterExcel;
import org.springblade.desk.basic.pojo.entity.WorkCenter;
import org.springblade.desk.basic.pojo.vo.WorkCenterVO;
import org.springblade.desk.dashboard.pojo.entity.BsWorkCenterEntity;
import java.util.List;
import java.util.Map;
/**
* [作业中心] 服务类
@ -35,4 +37,32 @@ public interface IWorkCenterService extends BaseService<WorkCenter> {
* @return List<WorkCenterExcel>
*/
List<WorkCenterExcel> exportWorkCenter(Wrapper<WorkCenter> queryWrapper);
/**
* 根据工艺能力查找作业中心列表
*
* @param abilityId
* @param ypQty
* @param ypArea
* @param partCode
* @param PrimaryCraft
* @param yieldType
* @param rxlSpace 是否需要特殊分派 null :不需要 true:需要
* @return
*/
Map<Long, BsWorkCenterEntity> selectByAbility(Long abilityId,
Double ypQty,
Double ypArea,
String partCode,
String PrimaryCraft,
Integer yieldType,
Boolean rxlSpace);
/**
* 根据作业中心ID查找作业中心
*
* @param workCenterId
* @return BsWorkCenterEntity 对象
*/
BsWorkCenterEntity getWorkCenter(Long workCenterId);
}

@ -4,12 +4,16 @@
package org.springblade.desk.basic.service.impl;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import jakarta.annotation.Resource;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.extern.slf4j.Slf4j;
import org.springblade.common.constant.CommonConstant;
import org.springblade.core.mp.base.BaseServiceImpl;
import org.springblade.desk.basic.excel.BatConfigExcel;
import org.springblade.desk.basic.mapper.BatConfigMapper;
@ -52,7 +56,22 @@ public class BatConfigServiceImpl extends BaseServiceImpl<BatConfigMapper, BatCo
}
@Override
public void setVOValue(BatConfigVO vo) {
public void setVOValue(BatConfigVO vo) {
}
}
@Override
public BatConfig findByCaId(Long hostCaId, String part, Double singletonArea) {
boolean partIsNotBlank = StringUtils.isNotBlank(part);
LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(BatConfig.class)
.eq(BatConfig::getIsDeleted, CommonConstant.DELETE_FALSE)
.eq(BatConfig::getCaId, hostCaId)
.eq(partIsNotBlank, BatConfig::getPartCode, part)
.le(partIsNotBlank, BatConfig::getSingletonArea, singletonArea)
.orderByDesc(BatConfig::getSingletonArea)
.last("LIMIT 1");
BatConfig batConfig = baseMapper.selectOne(wrapper);
return batConfig;
}
}

@ -26,9 +26,12 @@
package org.springblade.desk.basic.service.impl;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import jakarta.annotation.Resource;
import org.springblade.common.constant.CommonConstant;
import org.springblade.core.mp.base.BaseServiceImpl;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.BeanUtil;
@ -398,4 +401,35 @@ public class BsAssignServiceImpl extends BaseServiceImpl<BsAssignMapper, BsAssig
return bsAssignList;
}
@Override
public List<BsAssignEntity> listByPointType(int appointType) {
LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(BsAssignEntity.class)
.eq(BsAssignEntity::getIsDeleted, CommonConstant.BOOLEAN_FALSE)
.eq(BsAssignEntity::getPointType, appointType)
.orderByAsc(BsAssignEntity::getSort, BsAssignEntity::getLimitType);
return baseMapper.selectList(wrapper);
}
@Override
public List<BsAssignEntity> listMustAssign(Long abilityId, int appointType) {
LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(BsAssignEntity.class)
.eq(BsAssignEntity::getIsDeleted, CommonConstant.BOOLEAN_FALSE)
.eq(BsAssignEntity::getCraftAbilityId, abilityId)
.eq(BsAssignEntity::getLimitType, BsAssignEntity.MUST)
.eq(BsAssignEntity::getPointType, appointType)
.orderByAsc(BsAssignEntity::getSort);
return baseMapper.selectList(wrapper);
}
@Override
public BsAssignEntity getByPartCode(Long abilityId, String partCode) {
LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(BsAssignEntity.class)
.eq(BsAssignEntity::getIsDeleted, CommonConstant.BOOLEAN_FALSE)
.eq(BsAssignEntity::getCraftAbilityId, abilityId)
.eq(BsAssignEntity::getLimitType, BsAssignEntity.MUST)
.eq(BsAssignEntity::getPartCode, partCode)
.orderByAsc(BsAssignEntity::getSort);
return baseMapper.selectOne(wrapper);
}
}

@ -25,19 +25,12 @@
*/
package org.springblade.desk.basic.service.impl;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import org.springblade.core.mp.base.BaseServiceImpl;
import org.springblade.desk.basic.excel.CraftAbilityExcel;
import org.springblade.desk.basic.mapper.CraftAbilityMapper;
import org.springblade.desk.basic.mapper.OemCraftAbilityMapper;
import org.springblade.desk.basic.pojo.entity.OemCraftAbilityEntity;
import org.springblade.desk.basic.pojo.vo.CraftAbilityVO;
import org.springblade.desk.basic.service.ICraftAbilityService;
import org.springblade.desk.basic.service.IOemCraftAbilityService;
import org.springblade.scheduling.pojo.entity.CraftAbilityEntity;
import org.springframework.stereotype.Service;
import java.util.List;
@ -52,12 +45,18 @@ import java.util.List;
public class OemCraftAbilityServiceImpl extends BaseServiceImpl<OemCraftAbilityMapper, OemCraftAbilityEntity> implements IOemCraftAbilityService {
@Override
public OemCraftAbilityEntity findBsOemAbility(Long ocId, Long caId) {
List<OemCraftAbilityEntity> entities = this.list(Wrappers.lambdaQuery(OemCraftAbilityEntity.class).eq(OemCraftAbilityEntity::getOtherId, ocId).eq(OemCraftAbilityEntity::getCraftAbilityId, caId));
if (CollectionUtils.isNotEmpty(entities)) {
return entities.get(0);
}
return null;
}
@Override
public OemCraftAbilityEntity findBsOemAbility(Long ocId, Long caId) {
List<OemCraftAbilityEntity> entities = this.list(Wrappers.lambdaQuery(OemCraftAbilityEntity.class).eq(OemCraftAbilityEntity::getOtherId, ocId).eq(OemCraftAbilityEntity::getCraftAbilityId, caId));
if (CollectionUtils.isNotEmpty(entities)) {
return entities.get(0);
}
return null;
}
@Override
public List<OemCraftAbilityEntity> findByAbility(Long caId) {
List<OemCraftAbilityEntity> entities = this.list(Wrappers.lambdaQuery(OemCraftAbilityEntity.class).eq(OemCraftAbilityEntity::getCraftAbilityId, caId));
return entities;
}
}

@ -10,19 +10,30 @@ import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.extern.slf4j.Slf4j;
import org.springblade.common.constant.CommonConstant;
import org.springblade.core.mp.base.BaseServiceImpl;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.Func;
import org.springblade.desk.basic.excel.OemExcel;
import org.springblade.desk.basic.mapper.OemMapper;
import org.springblade.desk.basic.pojo.entity.BatConfig;
import org.springblade.desk.basic.pojo.entity.Oem;
import org.springblade.desk.basic.pojo.entity.OemCraftAbilityEntity;
import org.springblade.desk.basic.pojo.request.OemSearch;
import org.springblade.desk.basic.pojo.vo.OemVO;
import org.springblade.desk.basic.service.IBatConfigService;
import org.springblade.desk.basic.service.IOemCraftAbilityService;
import org.springblade.desk.basic.service.IOemService;
import org.springblade.desk.dashboard.service.IDsSimilarPartsService;
import org.springblade.system.feign.IDictClient;
import org.springblade.system.feign.IUserClient;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* [外协厂家] 服务实现类
@ -37,45 +48,98 @@ import java.util.List;
@Slf4j
public class OemServiceImpl extends BaseServiceImpl<OemMapper, Oem> implements IOemService {
@Resource
private IUserClient userClient;
@Resource
private IDictClient dictClient;
@Override
public IPage<OemVO> selectOemPage(IPage<OemVO> page, OemVO oem) {
return page.setRecords(baseMapper.selectOemPage(page, oem));
}
@Override
public List<OemExcel> exportOem(Wrapper<Oem> queryWrapper) {
List<OemExcel> oemList = baseMapper.exportOem(queryWrapper);
//oemList.forEach(oem -> {
// oem.setTypeName(DictCache.getValue(DictEnum.YES_NO, Oem.getType()));
//});
return oemList;
}
@Override
public void setVOValue(OemVO vo) {
}
@Override
public IPage<Oem> listSearch(IPage<Oem> page, OemSearch search) {
// todo:
// Wrapper<Oem> qw = Wrappers.<Oem>query().lambda();
// qw.lambda().eq(CycleTestItem::getTenantId, bladeUser.getTenantId()); // todo:
return null;
}
@Override
public R setPassword(Oem updateOne) {
Oem find = getById(updateOne.getId());
if (find == null) {
return R.fail("没有找到对应外协厂商");
}
find.setOemPassword(updateOne.getOemPassword());
return R.success("设置密码成功");
}
@Resource
private IUserClient userClient;
@Resource
private IDictClient dictClient;
private final IOemCraftAbilityService oemCraftAbilityService;
private final IBatConfigService batConfigService;
private final IDsSimilarPartsService similarPartsService;
@Override
public IPage<OemVO> selectOemPage(IPage<OemVO> page, OemVO oem) {
return page.setRecords(baseMapper.selectOemPage(page, oem));
}
@Override
public List<OemExcel> exportOem(Wrapper<Oem> queryWrapper) {
List<OemExcel> oemList = baseMapper.exportOem(queryWrapper);
//oemList.forEach(oem -> {
// oem.setTypeName(DictCache.getValue(DictEnum.YES_NO, Oem.getType()));
//});
return oemList;
}
@Override
public void setVOValue(OemVO vo) {
}
@Override
public IPage<Oem> listSearch(IPage<Oem> page, OemSearch search) {
// todo:
// Wrapper<Oem> qw = Wrappers.<Oem>query().lambda();
// qw.lambda().eq(CycleTestItem::getTenantId, bladeUser.getTenantId()); // todo:
return null;
}
@Override
public R setPassword(Oem updateOne) {
Oem find = getById(updateOne.getId());
if (find == null) {
return R.fail("没有找到对应外协厂商");
}
find.setOemPassword(updateOne.getOemPassword());
return R.success("设置密码成功");
}
@Override
public List<Long> selectByAbility(Long abilityId, Double ypQty, Double ypArea, String partCode, String PrimaryCraft, Integer yieldType, String plate, Boolean rxlSpace) {
List<OemCraftAbilityEntity> abilityList = oemCraftAbilityService.findByAbility(abilityId);
if (Func.isEmpty(abilityList)) {
return null;
}
List<Long> companyIdList = abilityList.stream().map(OemCraftAbilityEntity::getOtherId).collect(Collectors.toList());
List<Oem> oemList = this.listByIds(companyIdList);
Map<Long, Oem> oemMap = oemList.stream().collect(Collectors.toMap(Oem::getId, Function.identity()));
List<Long> rtnLst = new ArrayList<>();
Double area = ypQty * ypArea;
// 工艺能力(大批量小批量)
BatConfig cs = batConfigService.findByCaId(abilityId, partCode, ypArea);
for (OemCraftAbilityEntity ability : abilityList) {
Oem oem = oemMap.get(ability.getOtherId());
// TODO 无特殊过程确认到期
// OemProcessTask opt = oemProcessTaskService.findByScsVendorVodeAndTypeb(plate, oem.getCode());
// if (opt != null) {
// continue;
// }
//如果没有设置大批量配置,则外协商全部装起来
if (cs != null) {
//如果单批面积大于等于设定面积,则为大批量,反之为小批量
if (area >= cs.getArea()) {
if (CommonConstant.BOOLEAN_FALSE.equals(ability.getIsBatch())) {
continue;
}
} else {
if (CommonConstant.BOOLEAN_TRUE.equals(ability.getIsBatch())) {
continue;
}
}
}
// 分派时先不考虑供应商
// 如果返回值是true,则代表供应商存在键位零件或者相似,直接跳过此供应商
// if (similarPartsService.checkKeyPosition(yieldOrder, null, oem.getId()))
// continue;
rtnLst.add(oem.getId());
}
return rtnLst;
}
}

@ -8,15 +8,26 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.apache.commons.lang3.StringUtils;
import org.springblade.core.mp.base.BaseServiceImpl;
import org.springblade.core.tool.utils.BeanUtil;
import org.springblade.core.tool.utils.Func;
import org.springblade.desk.basic.excel.WorkCenterExcel;
import org.springblade.desk.basic.mapper.WorkCenterMapper;
import org.springblade.desk.basic.pojo.entity.BatConfig;
import org.springblade.desk.basic.pojo.entity.OemCraftAbilityEntity;
import org.springblade.desk.basic.pojo.entity.WorkCenter;
import org.springblade.desk.basic.pojo.vo.WorkCenterVO;
import org.springblade.desk.basic.service.IBatConfigService;
import org.springblade.desk.basic.service.IOemCraftAbilityService;
import org.springblade.desk.basic.service.IWorkCenterService;
import org.springblade.desk.dashboard.pojo.entity.BsWorkCenterEntity;
import org.springframework.stereotype.Service;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* [作业中心] 服务实现类
@ -30,6 +41,11 @@ import java.util.List;
@EqualsAndHashCode(callSuper = true)
public class WorkCenterServiceImpl extends BaseServiceImpl<WorkCenterMapper, WorkCenter> implements IWorkCenterService {
private final IOemCraftAbilityService oemCraftAbilityService;
private final IWorkCenterService workCenterService;
private final IBatConfigService batConfigService;
@Override
public IPage<WorkCenterVO> selectWorkCenterPage(IPage<WorkCenterVO> page, WorkCenterVO workCenter) {
return page.setRecords(baseMapper.selectWorkCenterPage(page, workCenter));
@ -43,4 +59,71 @@ public class WorkCenterServiceImpl extends BaseServiceImpl<WorkCenterMapper, Wor
//});
return workCenterList;
}
@Override
public Map<Long, BsWorkCenterEntity> selectByAbility(Long abilityId, Double ypQty, Double ypArea, String partCode, String PrimaryCraft, Integer yieldType, Boolean rxlSpace) {
List<OemCraftAbilityEntity> abilityList = oemCraftAbilityService.findByAbility(abilityId);
if (Func.isEmpty(abilityList)) {
return null;
}
List<Long> companyIdList = abilityList.stream().map(OemCraftAbilityEntity::getOtherId).collect(Collectors.toList());
List<WorkCenter> workCenterList = workCenterService.listByIds(companyIdList);
Double area = ypQty * ypArea;
Map<Long, BsWorkCenterEntity> wcMap = new LinkedHashMap<>();
String part = "";
//如果判断是否包含.
if (partCode.contains(".")) {
part = partCode.substring(0, partCode.indexOf(".", partCode.indexOf(".") + 1));
} else {
part = partCode.substring(0, partCode.indexOf("-", partCode.indexOf("-") + 1)) + "-";
}
//工艺能力(大批量小批量),先根据零件号第二个“-”前的数据进行匹配,匹配不到走通用规则(根据档位获取信息)
BatConfig cs = batConfigService.findByCaId(abilityId, part, ypArea);
if (cs == null) {
cs = batConfigService.findByCaId(abilityId, null, null);
}
for (WorkCenter workCenter : workCenterList) {
// 如果没有设置大批量配置,则作业中心全部装起来
if (cs != null) {
//如果零件xxx-xxx匹配到了设置,且单件面积不为null
if (StringUtils.isNotBlank(cs.getPartCode()) && cs.getSingletonArea() != null) {
//单批面积大于等于设定的单批面积并且单件面积大于等于设定的单件面积,则代表是大批量
if (area >= cs.getArea() && ypArea >= cs.getSingletonArea()) {
if (workCenter.getBigBatch() == 0) {
continue;
}
} else {
if (workCenter.getBigBatch() == 1) {
continue;
}
}
//如果单批面积大于等于设定面积或者单件面积大于等于0.07,则为大批量,反之为小批量
} else {
if (area >= cs.getArea() || ypArea >= 0.06) {
if (workCenter.getBigBatch() == 0) {
continue;
}
} else {
if (workCenter.getBigBatch() == 1) {
continue;
}
}
}
}
BsWorkCenterEntity workCenterEntity = BeanUtil.copy(workCenter, BsWorkCenterEntity.class);
wcMap.put(workCenter.getId(), workCenterEntity);
}
return wcMap;
}
@Override
public BsWorkCenterEntity getWorkCenter(Long workCenterId) {
WorkCenter center = workCenterService.getById(workCenterId);
return BeanUtil.copy(center, BsWorkCenterEntity.class);
}
}

@ -26,11 +26,12 @@
package org.springblade.desk.dashboard.service;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import org.springblade.desk.dashboard.pojo.entity.DsSimilarPartsEntity;
import org.springblade.desk.dashboard.pojo.vo.DsSimilarPartsVO;
import org.springblade.desk.dashboard.excel.DsSimilarPartsExcel;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springblade.core.mp.base.BaseService;
import org.springblade.desk.dashboard.excel.DsSimilarPartsExcel;
import org.springblade.desk.dashboard.pojo.entity.DsSimilarPartsEntity;
import org.springblade.desk.dashboard.pojo.vo.DsSimilarPartsVO;
import java.util.List;
/**
@ -67,8 +68,21 @@ public interface IDsSimilarPartsService extends BaseService<DsSimilarPartsEntity
/**
* 新增
*
* @param dsSimilarParts
* @return
*/
boolean saveSimilarParts(DsSimilarPartsEntity dsSimilarParts);
boolean saveSimilarParts(DsSimilarPartsEntity dsSimilarParts);
// /**
// * 键位零件验证或者相似零件验证
// *
// * @param primaryCraft
// * @param yieldType
// * @param partCode
// * @param tsId
// * @param ocId
// * @return
// */
// Boolean checkKeyPosition(String primaryCraft, int yieldType, String partCode, Long tsId, Long ocId);
}

@ -25,26 +25,24 @@
*/
package org.springblade.desk.dashboard.service.impl;
import org.apache.commons.lang3.StringUtils;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springblade.core.log.exception.ServiceException;
import org.springblade.core.tool.api.R;
import org.springblade.core.mp.base.BaseServiceImpl;
import org.springblade.desk.dashboard.excel.DsSimilarPartsExcel;
import org.springblade.desk.dashboard.mapper.DsSimilarPartsMapper;
import org.springblade.desk.dashboard.pojo.entity.DsPartEntity;
import org.springblade.desk.dashboard.pojo.entity.DsSimilarPartsEntity;
import org.springblade.desk.dashboard.pojo.vo.DsSimilarPartsVO;
import org.springblade.desk.dashboard.excel.DsSimilarPartsExcel;
import org.springblade.desk.dashboard.mapper.DsSimilarPartsMapper;
import org.springblade.desk.dashboard.service.IDsPartService;
import org.springblade.desk.dashboard.service.IDsSimilarPartsService;
import org.springblade.desk.order.pojo.enums.YieldOrderEnum;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springblade.core.mp.base.BaseServiceImpl;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
* 相似零件表 服务实现类
@ -58,9 +56,6 @@ public class DsSimilarPartsServiceImpl extends BaseServiceImpl<DsSimilarPartsMap
@Autowired
IDsPartService partService;
@Autowired
DsSimilarPartsMapper similarPartsMapper;
@Override
public IPage<DsSimilarPartsVO> selectDsSimilarPartsPage(IPage<DsSimilarPartsVO> page, DsSimilarPartsVO dsSimilarParts) {
List<DsSimilarPartsVO> dsSimilarPartsList = baseMapper.selectDsSimilarPartsPage(page, dsSimilarParts);
@ -103,16 +98,48 @@ public class DsSimilarPartsServiceImpl extends BaseServiceImpl<DsSimilarPartsMap
@Override
public boolean saveSimilarParts(DsSimilarPartsEntity dsSimilarParts) {
DsSimilarPartsEntity similarParts = similarPartsMapper.selectByPartOneAndPartTwo(dsSimilarParts);
if(null != similarParts ){
throw new ServiceException("零件号: "+similarParts.getPartOne()+"与 "+similarParts.getPartTwo()+"以存在");
DsSimilarPartsEntity similarParts = baseMapper.selectByPartOneAndPartTwo(dsSimilarParts);
if (null != similarParts) {
throw new ServiceException("零件号: " + similarParts.getPartOne() + "与 " + similarParts.getPartTwo() + "以存在");
}
int insert = similarPartsMapper.insert(dsSimilarParts);
if(insert <= 0){
int insert = baseMapper.insert(dsSimilarParts);
if (insert <= 0) {
throw new ServiceException("相似零件添加失败");
}
return true;
}
//
// @Override
// public Boolean checkKeyPosition(String primaryCraft, int yieldType, String partCode, Long tsId, Long ocId) {
// // 查询当前订单零件号是否键位零件(零件号第4个“-”前的编号匹配班组在制零件库记录,如果能匹配到信息,则更换班组,直到匹配到合适的班组或者分派外协)
// // 24/6/24 要求工艺路线为LX08-04-008 的不受键位限制
// if ("库1-2(粗机加)-4(高温退火)-2(精机加)-库2-4(热)".equals(primaryCraft) && YieldOrderEnum.YIELD_TYPE_1.getCode() == yieldType) {
// return false;
// }
// int num = partCode.split("-").length - 1;
// if (num > 3) {
//
// String[] splitArr = yieldOrder.getPartCode().split("-");
// //毛纽扣零件(21E8-550)不考虑键位因素
// String mnkPart = String.join("-", splitArr[0], splitArr[1]);
// if (!mnkPart.trim().equals("21E8-550")) {
// //判断键位
// String partCode = String.join("-", splitArr[0], splitArr[1], splitArr[2], splitArr[3]);
// //验证第一道工序未完成的厂内订单零件号班组是否存在键位零件
// wpList = prWorkPlanService.queryPartCodeByFirstWpNoClose(partCode, null, yieldOrder.getPartCode(), tsId, ocId);
// //如果存在,则停止并不分派
// if (wpList != null && wpList.size() > 0)
// return true;
// }
// }
// //查询当前订单零件号存在的相似零件
// List<String> partCodeLst = dsSimilarPartsDao.queryPartIdLstByPartCode(yieldOrder.getPartCode());
// if (partCodeLst != null && partCodeLst.size() > 0) {
// wpList = prWorkPlanService.queryPartCodeByFirstWpNoClose(null, partCodeLst, yieldOrder.getPartCode(), tsId, ocId);
// //如果存在,则停止并不分派
// if (wpList != null && wpList.size() > 0)
// return true;
// }
// return false;
// }
}

@ -183,8 +183,6 @@ public class YieldOrderController extends BladeController {
@PostMapping("/closeBatch")
@Operation(summary = "批量关闭", description = "传入ids")
public R closeBatch(@Parameter(description = "主键集合", required = true) @RequestParam String ids) {
// TODO 关闭前先验证订单状态
Boolean result = yieldOrderService.changeStatus(Func.toLongList(ids), YieldOrderEnum.STATUS_CLOSED.getCode());
return R.status(result);
}

@ -0,0 +1,13 @@
package org.springblade.desk.order.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.springblade.desk.order.pojo.entity.YieldOrderAssignSteer;
/**
* 生产订单日分派Mapper
*
* @author lqk
* @createDate 2025-11-24
*/
public interface YieldOrderAssignSteerMapper extends BaseMapper<YieldOrderAssignSteer> {
}

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace = "org.springblade.desk.order.mapper.YieldOrderAssignSteerMapper">
<select id = "queryCount" resultType = "org.springblade.desk.order.pojo.entity.YieldOrderAssignSteer">
</select>
</mapper>

@ -0,0 +1,23 @@
package org.springblade.desk.order.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.springblade.desk.order.pojo.dto.YieldOrderAssignCount;
import org.springblade.desk.order.pojo.entity.YieldOrderAssignDaily;
/**
* 生产订单日分派Mapper
*
* @author lqk
* @createDate 2025-11-24
*/
public interface YieldOrderDailyAssignMapper extends BaseMapper<YieldOrderAssignDaily> {
/**
* 根据工艺能力获取厂内外制作批数
*
* @param dayStr
* @param abilityId
* @param orgType 生产单位类型 0厂内 1厂外
* @return
*/
YieldOrderAssignCount queryCount(String dayStr, Long abilityId, int orgType);
}

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace = "org.springblade.desk.order.mapper.YieldOrderDailyAssignMapper">
<select id = "queryCount" resultType = "org.springblade.desk.order.pojo.dto.YieldOrderAssignCount">
SELECT SUM(a.NUM) AS totalNum, SUM(a.QUANTITY) AS totalQuantity, SUM(a.BATCH) AS totalBatch, SUM(a.AREA) AS totalArea
FROM MES_YIELD_ORDER_ASSIGN_DAILY a
WHERE
and a.CREATE_TIME = to_date(#{date},'yyyy-mm-dd')
AND a.CRAFT_ABILITY_ID = #{abilityId}
<if test = "orgType == 0">
AND a.WORK_CENTER_ID IS NOT NULL
</if>
<if test = "orgType == 1">
AND a.OEM_ID IS NOT NULL
</if>
</select>
</mapper>

@ -0,0 +1,41 @@
package org.springblade.desk.order.service;
import org.springblade.core.mp.base.BaseService;
import org.springblade.desk.order.pojo.entity.YieldOrderAssignSteer;
import java.util.List;
/**
* 服务实现类
*
* @author BladeX
*/
public interface IYieldOrderAssignSteerService extends BaseService<YieldOrderAssignSteer> {
/**
* 根据条件获取到满足条件的供应商
*
* @param ocIdLst
* @param oemCaId
* @param partCode
* @return
*/
YieldOrderAssignSteer findByOcIdLstAndCaId(List<Long> ocIdLst, Long oemCaId, String partCode);
/**
* 对有能力做这个单子厂家按照偏差因子排序
*
* @param oemIdList
* @param abilityId
* @return
*/
List<YieldOrderAssignSteer> sortDataByFactor(List<Long> oemIdList, Long abilityId);
/**
* 根据外协厂家与生产标识调取erp来判断是否符合要求
*
* @param ocCode
* @param prodIdent
* @return
*/
Boolean queryOemAndCaid(String ocCode, String prodIdent);
}

@ -1,7 +1,9 @@
package org.springblade.desk.order.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springblade.common.exception.BusinessException;
import org.springblade.core.mp.base.BaseService;
import org.springblade.desk.order.pojo.entity.YieldOrder;
import org.springblade.desk.order.pojo.entity.YieldOrderCraft;
import java.util.List;
@ -39,7 +41,13 @@ public interface IYieldOrderCraftService extends BaseService<YieldOrderCraft> {
int deleteByYoId(Long yoId);
/**
* 同步旧MES的待排产订单工艺数据
* 查找订单各工序的加工单位
*
* @param yieldOrderCraftList 订单工艺列表
* @param yieldOrder 生产订单
* @param factor null 整体 true : 转厂内 false转厂外
* @param rxlSpace 需要特殊分派true:需要 false不需要null不需要
* @throws BusinessException
*/
void syncYieldOrderCraftData();
void automaticDispatch(List<YieldOrderCraft> yieldOrderCraftList, YieldOrder yieldOrder, Boolean factor, Boolean rxlSpace) throws BusinessException;
}

@ -0,0 +1,44 @@
package org.springblade.desk.order.service;
import org.springblade.core.mp.base.BaseService;
import org.springblade.desk.order.pojo.dto.YieldOrderAssignCount;
import org.springblade.desk.order.pojo.entity.YieldOrderAssignDaily;
import java.util.List;
/**
* 服务实现类
*
* @author BladeX
*/
public interface IYieldOrderDailyAssignService extends BaseService<YieldOrderAssignDaily> {
/**
* 添加或更新日分排量
*
* @param workCenterId
* @param oemId
* @param abilityId
* @param area
* @param quantity
*/
void saveOrEdit(Long workCenterId, Long oemId, Long abilityId, Double area, Double quantity);
/**
* 根据工艺能力获取厂内外制作批数
*
* @param abilityId
* @param orgType 生产单位类型 0厂内 1厂外
* @return
*/
YieldOrderAssignCount queryCount(Long abilityId, int orgType);
/**
* 根据条件找到分派次数最小的作业中心
*
* @param abilityId 工艺能力
* @param workCenterIdList 作业中心集合
* @return
*/
YieldOrderAssignDaily findMinNum(Long abilityId, List<Long> workCenterIdList);
}

@ -0,0 +1,75 @@
package org.springblade.desk.order.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.springblade.common.constant.CommonConstant;
import org.springblade.core.mp.base.BaseServiceImpl;
import org.springblade.core.tool.utils.Func;
import org.springblade.desk.order.mapper.YieldOrderAssignSteerMapper;
import org.springblade.desk.order.pojo.entity.YieldOrderAssignSteer;
import org.springblade.desk.order.service.IYieldOrderAssignSteerService;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* 服务实现类
*
* @author BladeX
*/
@RequiredArgsConstructor
@Service
public class YieldOrderAssignSteerImpl extends BaseServiceImpl<YieldOrderAssignSteerMapper, YieldOrderAssignSteer> implements IYieldOrderAssignSteerService {
@Override
public YieldOrderAssignSteer findByOcIdLstAndCaId(List<Long> ocIdLst, Long oemCaId, String partCode) {
LambdaQueryWrapper<YieldOrderAssignSteer> wrapper = Wrappers.<YieldOrderAssignSteer>query().lambda()
.eq(YieldOrderAssignSteer::getIsDeleted, CommonConstant.BOOLEAN_FALSE)
.in(YieldOrderAssignSteer::getOemId, ocIdLst);
if (Func.isNotEmpty(partCode)) {
wrapper.eq(YieldOrderAssignSteer::getPartCode, partCode);
}
if (Func.isNotEmpty(oemCaId)) {
wrapper.eq(YieldOrderAssignSteer::getCraftAbilityId, oemCaId);
}
wrapper.orderByAsc(YieldOrderAssignSteer::getFactor).last("LIMIT 1");
return baseMapper.selectOne(wrapper);
}
@Override
public List<YieldOrderAssignSteer> sortDataByFactor(List<Long> oemIdList, Long abilityId) {
LambdaQueryWrapper<YieldOrderAssignSteer> wrapper = Wrappers.<YieldOrderAssignSteer>query().lambda()
.eq(YieldOrderAssignSteer::getIsDeleted, CommonConstant.BOOLEAN_FALSE)
.in(YieldOrderAssignSteer::getOemId, oemIdList)
.eq(YieldOrderAssignSteer::getCraftAbilityId, abilityId)
.orderByAsc(YieldOrderAssignSteer::getFactor);
return baseMapper.selectList(wrapper);
}
@Override
public Boolean queryOemAndCaid(String ocCode, String prodIdent) {
if (StringUtils.isBlank(ocCode) || StringUtils.isBlank(prodIdent)) {
return false;
}
//TODO 调用ERP存储过程
// ProcedureCall pc = this.getSession().createStoredProcedureCall("dba_mgr.pro_wxprtlotno@erp_mes_link");
// // 设置输入参数
// pc.registerParameter("v_splycode", String.class, ParameterMode.IN).bindValue(ocCode);
// pc.registerParameter("v_prtlotno", String.class, ParameterMode.IN).bindValue(prodIdent);
// // 设置输出参数
// pc.registerParameter("v_excnote", String.class, ParameterMode.OUT);
// pc.registerParameter("v_excflag", String.class, ParameterMode.OUT);
// // 获取输出参数的值
// String v_excnote = pc.getOutputs().getOutputParameterValue("v_excnote").toString();
// String v_excflag = pc.getOutputs().getOutputParameterValue("v_excflag").toString();
// if ("1".equals(v_excflag)) {
// return true;
// }
return false;
}
}

@ -3,23 +3,56 @@ package org.springblade.desk.order.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springblade.common.constant.CommonConstant;
import org.springblade.common.exception.BusinessException;
import org.springblade.core.mp.base.BaseServiceImpl;
import org.springblade.desk.order.pojo.entity.YieldOrderCraft;
import org.springblade.core.tool.utils.Func;
import org.springblade.desk.basic.pojo.entity.BsAssignEntity;
import org.springblade.desk.basic.pojo.entity.Oem;
import org.springblade.desk.basic.pojo.entity.OemCraftAbilityEntity;
import org.springblade.desk.basic.service.IBsAssignService;
import org.springblade.desk.basic.service.IOemCraftAbilityService;
import org.springblade.desk.basic.service.IOemService;
import org.springblade.desk.basic.service.IWorkCenterService;
import org.springblade.desk.dashboard.pojo.entity.BsWorkCenterEntity;
import org.springblade.desk.dashboard.service.IBsCraftAbilityService;
import org.springblade.desk.order.mapper.YieldOrderCraftMapper;
import org.springblade.desk.order.pojo.dto.YieldOrderAssignCount;
import org.springblade.desk.order.pojo.entity.YieldOrder;
import org.springblade.desk.order.pojo.entity.YieldOrderAssignDaily;
import org.springblade.desk.order.pojo.entity.YieldOrderAssignSteer;
import org.springblade.desk.order.pojo.entity.YieldOrderCraft;
import org.springblade.desk.order.service.IYieldOrderAssignSteerService;
import org.springblade.desk.order.service.IYieldOrderCraftService;
import org.springblade.desk.order.service.IYieldOrderDailyAssignService;
import org.springframework.stereotype.Service;
import java.util.List;
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
/**
* 服务实现类
*
* @author BladeX
*/
@Slf4j
@RequiredArgsConstructor
@Service
public class YieldOrderCraftServiceImpl extends BaseServiceImpl<YieldOrderCraftMapper, YieldOrderCraft> implements IYieldOrderCraftService {
private final IWorkCenterService workCenterService;
private final IOemService oemService;
private final IOemCraftAbilityService oemCraftAbilityService;
private final IBsCraftAbilityService craftAbilityService;
private final IBsAssignService assignService;
private final IYieldOrderDailyAssignService dailyAssignService;
private final IYieldOrderAssignSteerService assignSteerService;
@Override
public IPage<YieldOrderCraft> selectPage(IPage<YieldOrderCraft> page, YieldOrderCraft entity) {
List<YieldOrderCraft> dataList = baseMapper.selectPage(page, entity);
@ -37,14 +70,606 @@ public class YieldOrderCraftServiceImpl extends BaseServiceImpl<YieldOrderCraftM
@Override
public int deleteByYoId(Long yoId) {
LambdaQueryWrapper<YieldOrderCraft> deleteWrapper = Wrappers.lambdaQuery(YieldOrderCraft.class)
.eq(YieldOrderCraft::getYoId, yoId)
.eq(YieldOrderCraft::getIsDeleted, CommonConstant.DELETE_FALSE);
LambdaQueryWrapper<YieldOrderCraft> deleteWrapper = Wrappers.lambdaQuery(YieldOrderCraft.class).eq(YieldOrderCraft::getYoId, yoId).eq(YieldOrderCraft::getIsDeleted, CommonConstant.DELETE_FALSE);
return baseMapper.delete(deleteWrapper);
}
@Override
public void syncYieldOrderCraftData() {
public void automaticDispatch(List<YieldOrderCraft> yieldOrderCraftList, YieldOrder yieldOrder, Boolean factor, Boolean rxlSpace) throws BusinessException {
// 组装key为工艺能力的作业计划map
Map<Long, List<YieldOrderCraft>> craftAbilityMap = yieldOrderCraftList.stream().collect(Collectors.groupingBy(YieldOrderCraft::getCaId));
//作业计划map工艺能力key集合
Set<Long> craftKeys = craftAbilityMap.keySet();
//获取到认定的主工艺能力(默认第一个工艺能力为主工艺能力)
Long hostAbilityId = craftKeys.iterator().next();
//获取可以做此主工艺能力的作业中心集合
Map<Long, BsWorkCenterEntity> workCenterMap = workCenterService.selectByAbility(hostAbilityId, yieldOrder.getYpQty(), yieldOrder.getYpArea(), yieldOrder.getPartCode(), yieldOrder.getPrimaryCraft(), yieldOrder.getYieldType(), rxlSpace);
//获取可以做此主工艺能力的外协商集合
List<Long> oemList = oemService.selectByAbility(hostAbilityId, yieldOrder.getYpQty(), yieldOrder.getYpArea(), yieldOrder.getPartCode(), yieldOrder.getPrimaryCraft(), yieldOrder.getYieldType(), yieldOrder.getPlate(), rxlSpace);
// 如果未找到适合的班组或者供应商,提示排查方向
if ((workCenterMap == null || workCenterMap.size() == 0) && (oemList == null || oemList.size() == 0)) {
throw new BusinessException("未找到合适的作业中心或者供应商!请排查工艺能力、作业中心等因素!");
}
// 查询是否存在必须厂内且等级要求的规则,如果是则需要验证作业中心必须有值
List<BsAssignEntity> mustAssignList = assignService.listMustAssign(hostAbilityId, BsAssignEntity.IN_FACTORY);
if (mustAssignList != null && mustAssignList.size() > 0) {
// 遍历强制规则,查找跟订单匹配的质量等级规则,若规则不为空,判定厂内作业中心列表是否为空
for (BsAssignEntity mustAssign : mustAssignList) {
if (StringUtils.isNotBlank(mustAssign.getProdMark())) {
if (mustAssign.getProdMark().contains("\"" + yieldOrder.getProductIdent() + "\"")) {
if (workCenterMap == null || workCenterMap.size() == 0) {
throw new BusinessException("未找到合适的作业中心或者供应商!请排查工艺能力、作业中心等因素!");
}
}
}
}
}
//获取到可以做主工艺能力的最合适的作业中心,并且标记必须、优先、正常
BsWorkCenterEntity workCenter = null;
//获取到可以做主工艺能力的最合适的外协商,并且标记必须、优先、正常
Oem oemCustomer = null;
//自动分派后的结果集
List<YieldOrderCraft> dispatchCraftList = null;
// 根据车间订单是否厂内标识判定是否强制厂内(单工序时不进行标识验证)
if (yieldOrder.getSiteWork() && factor == null) {
//订单强制分派厂内,若未找到工艺能力对应的作业中心,则提示异常
if (workCenterMap == null || workCenterMap.size() == 0) {
throw new BusinessException("此订单需强制分派厂内,未找到满足条件得作业中心,自动分派失败!");
}
//寻找最合适的作业中心
workCenter = this.inPlantDistribution(hostAbilityId, workCenterMap, yieldOrder, BsWorkCenterEntity.LIMIT_TYPE_MUST);
if (workCenter == null) {
throw new BusinessException("此订单需强制分派厂内,未找到满足条件得作业中心,自动分派失败!");
}
} else if (factor != null) {
if (factor) {
workCenter = this.inPlantDistribution(hostAbilityId, workCenterMap, yieldOrder, BsWorkCenterEntity.LIMIT_TYPE_MUST);
} else if (!factor) {
oemCustomer = this.offsiteDistribution(hostAbilityId, oemList, yieldOrder, BsWorkCenterEntity.LIMIT_TYPE_MUST);
}
} else {
// 先判定规则是否存在零件级强制匹配
BsAssignEntity partAssign = assignService.getByPartCode(hostAbilityId, yieldOrder.getPartCode());
if (partAssign != null && partAssign.getCenterId() != null) {
// 指定厂内作业中心生产
workCenter = workCenterService.getWorkCenter(partAssign.getCenterId());
} else if (partAssign != null && partAssign.getOemId() != null) {
// 指定外协商生产
oemCustomer = oemService.getById(partAssign.getOemId());
} else if (partAssign != null && partAssign.getLimitType().equals(BsAssignEntity.MUST)) {
if (partAssign.getPointType().equals(BsAssignEntity.IN_FACTORY)) {
// 必须厂内生产
workCenter = this.inPlantDistribution(hostAbilityId, workCenterMap, yieldOrder, BsWorkCenterEntity.LIMIT_TYPE_MUST);
} else {
//必须外协生产
oemCustomer = this.offsiteDistribution(hostAbilityId, oemList, yieldOrder, BsWorkCenterEntity.LIMIT_TYPE_MUST);
}
} else {
// 寻找最合适的作业中心
workCenter = this.inPlantDistribution(hostAbilityId, workCenterMap, yieldOrder, BsWorkCenterEntity.LIMIT_TYPE_NORMAL);
oemCustomer = this.offsiteDistribution(hostAbilityId, oemList, yieldOrder, BsWorkCenterEntity.LIMIT_TYPE_NORMAL);
}
}
// factor等于null代表是整体,有值时代表是单工序,true转厂内,false转厂外
if (factor == null) {
if (workCenter != null && oemCustomer == null) {
//只有厂内有工艺能力
dispatchCraftList = this.bindWorkCenter(workCenter.getId(), workCenterMap, hostAbilityId, craftAbilityMap, craftKeys, yieldOrder, null);
} else if (oemCustomer != null && workCenter == null) {
//只有厂外有工艺能力
dispatchCraftList = this.bindOem(oemCustomer, hostAbilityId, craftAbilityMap, craftKeys, yieldOrder, null);
} else if (workCenter != null && oemCustomer != null) {
//场内外共有工艺能力
if (workCenter.getLimitType().equals(BsWorkCenterEntity.LIMIT_TYPE_MUST)) {
dispatchCraftList = this.bindWorkCenter(workCenter.getId(), workCenterMap, hostAbilityId, craftAbilityMap, craftKeys, yieldOrder, null);
} else if (oemCustomer.getLimitType().equals(BsWorkCenterEntity.LIMIT_TYPE_MUST)) {
dispatchCraftList = this.bindOem(oemCustomer, hostAbilityId, craftAbilityMap, craftKeys, yieldOrder, null);
}
//如果匹配到了作业单位,则直接停止
if (dispatchCraftList != null && dispatchCraftList.size() > 0) {
return;
}
// 厂内优先
if (workCenter.getLimitType().equals(BsWorkCenterEntity.LIMIT_TYPE_PRIOR)) {
dispatchCraftList = this.bindWorkCenter(workCenter.getId(), workCenterMap, hostAbilityId, craftAbilityMap, craftKeys, yieldOrder, null);
}
//如果匹配到了作业单位,则直接停止
if (dispatchCraftList != null && dispatchCraftList.size() > 0) {
return;
}
//外协优先
if (oemCustomer.getLimitType().equals(BsWorkCenterEntity.LIMIT_TYPE_PRIOR)) {
dispatchCraftList = this.bindOem(oemCustomer, hostAbilityId, craftAbilityMap, craftKeys, yieldOrder, null);
}
//如果匹配到了作业单位,则直接停止
if (dispatchCraftList != null && dispatchCraftList.size() > 0) {
return;
}
// 开始根据分派比例分派
Long facTotalNum = 0L;
YieldOrderAssignCount facCapacity = dailyAssignService.queryCount(hostAbilityId, BsAssignEntity.IN_FACTORY);
if (facCapacity != null) {
facTotalNum = facCapacity.getTotalNum();
}
// 获取厂外已经分派的总量
Long oemTotalNum = 0L;
YieldOrderAssignCount oemCapacity = dailyAssignService.queryCount(hostAbilityId, BsAssignEntity.OUTSOURCE);
if (oemCapacity != null) {
oemTotalNum = oemCapacity.getTotalNum();
}
//日分派总量
Long totalNum = facTotalNum + oemTotalNum;
// 厂内分派比列
Double rate = 0D;
if (totalNum > 0) {
rate = Double.valueOf(facTotalNum) / Double.valueOf(totalNum) * 100;
}
// TODO 根据工艺能力编码获取厂内应分比例
// BsDispatch dispatch = bsDispatchService.findByType(hostAbilityId, BsDispatch.D_TYPE_CLASS);
// if (dispatch == null) {
// // 获取厂内通用应分比列
// dispatch = bsDispatchService.findByType(null, BsDispatch.D_TYPE_FACTORY);
// }
//
// //如果厂内占比大于已经设置的比列,则直接分派外协
// if (rate <= Double.valueOf(dispatch.getdValue())) {
// log.info("{}自动分派按照比例分派给厂内:{},分派比例:{} 应分比例:{}", yieldOrder.getCardNo(),
// workCenter.getWcName(), rate, dispatch.getdValue());
// dispatchCraftList = this.bindWorkCenter(workCenter.getId(), workCenterMap, hostAbilityId, craftAbilityMap, craftKeys, yieldOrder, null);
// }
//如果匹配到了作业单位,则直接停止
if (dispatchCraftList != null && dispatchCraftList.size() > 0) {
return;
}
//外协
// log.info("{}自动分派按照比例分派给外协:{},分派比例:{} 应分比例:{}", yieldOrder.getCardNo(),
// oemCustomer.getOcName(), rate, dispatch.getdValue());
dispatchCraftList = this.bindOem(oemCustomer, hostAbilityId, craftAbilityMap, craftKeys, yieldOrder, null);
}
} else {
if (Boolean.TRUE.equals(factor)) {
if (workCenter == null) {
throw new BusinessException("未找到合适的班组或者供应商!请排查工艺能力、班组日分派时间、相似零件、键位零件等因素!");
}
dispatchCraftList = this.bindWorkCenter(workCenter.getId(), workCenterMap, hostAbilityId, craftAbilityMap, craftKeys, yieldOrder, true);
} else {
if (oemCustomer == null) {
throw new BusinessException("未找到合适的班组或者供应商!请排查工艺能力、班组日分派时间、相似零件、键位零件等因素!");
}
dispatchCraftList = this.bindOem(oemCustomer, hostAbilityId, craftAbilityMap, craftKeys, yieldOrder, false);
}
}
if (dispatchCraftList == null || dispatchCraftList.size() == 0) {
throw new BusinessException("自动分派失败,未找到合适的班组或者供应商!");
}
// 分派成功,保存分派结果
this.saveBatch(dispatchCraftList);
}
/**
* @param hostCaId 主工艺能力
* @param wcMap 拥有主工艺能力的作业中心
* @param yieldOrder 生产订单
* @param limitType 0: 正常1优先2:必须
* @return BsWorkCenter
* @Description: 寻找满足条件的作业中心
* @Author dxl
* @CreateTime 2023/3/7 18:30
*/
private BsWorkCenterEntity inPlantDistribution(Long hostCaId, Map<Long, BsWorkCenterEntity> wcMap, YieldOrder yieldOrder, Integer limitType) {
//没有工艺能力的对应作业中心,直接分派厂外
if (wcMap == null || wcMap.size() == 0) {
return null;
}
//组装wcList集合
List<Long> wcList = new ArrayList<>();
wcList.addAll(wcMap.keySet());
//作业中心
BsWorkCenterEntity workCenter = null;
//在规则表中匹配是否存在匹配的条件(查厂内)
BsAssignEntity assign = this.getRules(yieldOrder, hostCaId, BsAssignEntity.IN_FACTORY);
if (assign != null) {
//限制类型是必须(强制运用此规则),反之则优先分派厂内
if (assign.getLimitType().equals(BsAssignEntity.MUST)) {
if (assign.getCenterId() != null) {
//判断规则中配置的工作中心是否满足当前工艺能力要求,如果不满足,则此条规则作废
if (wcMap.get(assign.getCenterId()) != null) {
workCenter = workCenterService.getWorkCenter(assign.getCenterId());
workCenter.setLimitType(BsWorkCenterEntity.LIMIT_TYPE_MUST);
return workCenter;
}
}
//挑选一个最合适的作业中心
return this.priorityInPlantDistribution(hostCaId, wcList, yieldOrder, BsWorkCenterEntity.LIMIT_TYPE_MUST);
} else {
//优先规则配置的作业中心,若无则,规则
if (assign.getCenterId() != null) {
//判断规则中配置的工作中心是否满足当前工艺能力要求,如果不满足,则此条规则作废
if (wcMap.get(assign.getCenterId()) != null) {
//查询当前作业中心是否满足生产当前这批活的条件,若不满足,则考虑其他满足的作业中心
YieldOrderAssignDaily dayAbilityAssignment = dailyAssignService.findMinNum(hostCaId, wcList);
if (dayAbilityAssignment != null) {
workCenter = workCenterService.getWorkCenter(assign.getCenterId());
//外部如果限制类型不是必须,则直接考虑规则限制类型
if (limitType.equals(BsWorkCenterEntity.LIMIT_TYPE_MUST)) {
workCenter.setLimitType(limitType);
} else {
workCenter.setLimitType(BsWorkCenterEntity.LIMIT_TYPE_PRIOR);
}
return workCenter;
}
}
}
}
}
//挑选一个最合适的作业中心
return this.priorityInPlantDistribution(hostCaId, wcList, yieldOrder, limitType);
}
/**
* @param hostCaId 主工艺能力
* @param wcList 作业中心集合
* @param yieldOrder 生产订单
* @param limitType 正常1优先2:必须
* @return BsWorkCenter
* @Description: 多作业中心挑选合适的作业中心
* @Author dxl
* @CreateTime 2023/3/7 18:31
*/
private BsWorkCenterEntity priorityInPlantDistribution(Long hostCaId, List<Long> wcList, YieldOrder yieldOrder, Integer limitType) {
//没有工艺能力的对应作业中心,直接分派厂外
if (wcList == null || wcList.size() == 0) {
return null;
}
//作业中心
BsWorkCenterEntity workCenter = null;
//如果找到合适的作业中心直接分派,反之如果未找到合适的作业中心(bool 是true的情况下强制厂内,bool是false是优先厂内,不满足的情况下直接返回空)
YieldOrderAssignDaily dayAbilityAssignment = dailyAssignService.findMinNum(hostCaId, wcList);
if (Func.isEmpty(dayAbilityAssignment)) {
return null;
}
workCenter = workCenterService.getWorkCenter(dayAbilityAssignment.getWorkCenterId());
workCenter.setLimitType(limitType);
return workCenter;
}
/**
* 为每个工序绑定作业中心
*
* @param workCenterId 作业中心
* @param workCenterMap 作业中心和班组集合
* @param craftAbilityId 工艺能力
* @param craftAbilityMap 工艺能力组装的生产计划map
* @param craftKeys 当前生产订单下的工艺能力集合
* @return List<YieldOrderCraft>
* @Description: 分配到班组
* @Author dxl
* @CreateTime 2023/3/8 15:30
*/
private List<YieldOrderCraft> bindWorkCenter(Long workCenterId, Map<Long, BsWorkCenterEntity> workCenterMap, Long craftAbilityId,
Map<Long, List<YieldOrderCraft>> craftAbilityMap, Set<Long> craftKeys,
YieldOrder yieldOrder, Boolean factor) {
List<YieldOrderCraft> orderCrafts = new ArrayList<>();
// 开始循环生产订单中组合的工艺能力key集合, 主工艺能力之前的全部分配到此作业中心
for (Long craftId : craftKeys) {
//验证工艺能力
BsWorkCenterEntity workCenter = workCenterMap.get(craftId);
if (workCenter == null) {
break;
}
orderCrafts.addAll(craftAbilityMap.get(craftId));
}
// 开始分派到作业中心
for (YieldOrderCraft orderCraft : orderCrafts) {
BsWorkCenterEntity workCenter = workCenterMap.get(orderCraft.getCaId());
orderCraft.setWorkCenterId(workCenter.getId());
orderCraft.setIsOutsource(Boolean.FALSE);
}
//factor等于null代表是整体,有值时代表是单工序
if (factor == null) {
// 更新主工序工艺能力日产能信息
dailyAssignService.saveOrEdit(workCenterId, null, craftAbilityId, yieldOrder.getYpArea(), yieldOrder.getYpQty());
}
return orderCrafts;
}
/**
* @param hostCaId 主工艺能力
* @param ocList 拥有主工艺能力的外协商
* @param yieldOrder 生产订单
* @param limitType 0: 正常1优先2:必须
* @return Oem
* @Description: 寻找满足条件的外协商
* @Author dxl
* @CreateTime 2023/3/8 13:49
*/
private Oem offsiteDistribution(Long hostCaId, List<Long> ocList, YieldOrder yieldOrder, Integer limitType) {
//没有工艺能力直接跳过
if (ocList == null || ocList.size() == 0) {
return null;
}
//作业中心
Oem oemCustomer = null;
//在规则表中匹配是否存在匹配的条件(查厂外)
BsAssignEntity assign = this.getRules(yieldOrder, hostCaId, BsAssignEntity.OUTSOURCE);
if (assign != null) {
//限制类型是必须(强制按此规则分派)
if (assign.getLimitType().equals(BsAssignEntity.MUST)) {
//如果指定了外协商,则强制分派到此外协商;反之则分派至厂外有同种工艺能力的外协商
if (assign.getOemId() != null) {
//判断规则中配置的外协商是否满足当前工艺能力要求,如果不满足,则此条规则作废
if (ocList.contains(assign.getOemId())) {
//直接安排给主工艺能力对应的外协商
oemCustomer = oemService.getById(assign.getOemId());
oemCustomer.setLimitType(BsWorkCenterEntity.LIMIT_TYPE_MUST);
return oemCustomer;
}
}
//挑选一个最合适的外协商
return this.priorityOffsiteDistribution(hostCaId, ocList, BsWorkCenterEntity.LIMIT_TYPE_MUST, yieldOrder);
} else {
//如果指定了外协商,则优先判定此外协商是否满足条件,满足则分给当前外协商;反之则分派至厂外有同种工艺能力的外协商
if (assign.getOemId() != null) {
//指定了外协商(判断规则中配置的供应商是否满足当前工艺能力要求,如果不满足,则此条规则作废)
if (ocList.contains(assign.getOemId())) {
//验证此外协商是否满足分派条件,若不满足,则在现有规则中挑选一个满足条件的供应商
List<Long> thisLst = new ArrayList<>();
thisLst.add(assign.getOemId());
//查询当前外协商是否满足生产当前这批活的条件,若不满足,则考虑其他满足的供应商
YieldOrderAssignSteer planAssignSteer = assignSteerService.findByOcIdLstAndCaId(thisLst, null, yieldOrder.getPartCode());
//用于标识匹配规则是按零件还是工艺能力
boolean bool = true;
if (planAssignSteer == null) {
bool = false;
planAssignSteer = assignSteerService.findByOcIdLstAndCaId(thisLst, hostCaId, null);
}
if (planAssignSteer != null) {
oemCustomer = oemService.getById(assign.getOemId());
oemCustomer.setLimitType(BsWorkCenterEntity.LIMIT_TYPE_PRIOR);
oemCustomer.setPartCodeYesOrNo(bool);
return oemCustomer;
}
}
}
}
}
//挑选一个最合适的外协商
return this.priorityOffsiteDistribution(hostCaId, ocList, limitType, yieldOrder);
}
/**
* @param hostCaId 主工艺能力
* @param ocList 外协商集合
* @param limitType 正常1优先2:必须
* @return Oem
* @Description: 多外协商挑选合适的作业中心
* @Author dxl
* @CreateTime 2023/3/8 14:03
*/
private Oem priorityOffsiteDistribution(Long hostCaId, List<Long> ocList, Integer limitType, YieldOrder yieldOrder) {
// 没有工艺能力的对应作业中心,直接分派厂外
if (ocList == null || ocList.size() == 0) {
return null;
}
// 外协商
Oem oemCustomer = null;
// 首先根据零件号查询是否存在零件级的分派规则
YieldOrderAssignSteer planAssignSteer = assignSteerService.findByOcIdLstAndCaId(ocList, null, yieldOrder.getPartCode());
//用于标识匹配规则是按零件还是工艺能力
boolean bool = true;
if (planAssignSteer == null) {
bool = false;
// 获取到满足条件的供应商
// 对有能力做这个单子厂家按照偏差因子排序
if (ocList != null && ocList.size() > 0) {
List<YieldOrderAssignSteer> bsPlanAssignSteerList = assignSteerService.sortDataByFactor(ocList, hostCaId);
for (YieldOrderAssignSteer bsPlanAssignSteer : bsPlanAssignSteerList) {
oemCustomer = oemService.getById(bsPlanAssignSteer.getOemId());
String oemCode = oemCustomer.getCode();
// 改伊川喷砂工艺能力不限制厂家等级资质
// 使用工艺能力表中加工类型字段控制工艺能力是否需要进行外协等级资质判断
boolean aBoolean = false;
aBoolean = assignSteerService.queryOemAndCaid(oemCode, yieldOrder.getProductIdent());
//zxh 20251015 工作订单备注中包含zdzx时,单独校验厂家是否有JI以及JHT资质,若不存在相关等级资质,不允许派此厂家
if (yieldOrder.getYpMemo() != null && yieldOrder.getYpMemo().toLowerCase(Locale.ROOT).contains("zdzx")) {
boolean aBooleanJI = assignSteerService.queryOemAndCaid(oemCode, "JI");
boolean aBooleanJHT = assignSteerService.queryOemAndCaid(oemCode, "JHT");
if (!aBooleanJI || !aBooleanJHT) {
aBoolean = false;
}
}
if (aBoolean) {
oemCustomer.setLimitType(limitType);
oemCustomer.setPartCodeYesOrNo(bool);
return oemCustomer;
}
}
}
}
// 如果找到合适的外协商直接分派,反之如果未找到合适的外协商
if (planAssignSteer != null) {
oemCustomer = oemService.getById(planAssignSteer.getOemId());
oemCustomer.setLimitType(limitType);
oemCustomer.setPartCodeYesOrNo(bool);
return oemCustomer;
}
return null;
}
/**
* @param oemCustomer 外协商
* @param craftAbilityMap 工艺能力组装的生产计划map
* @param keys 当前生产订单下的工艺能力集合
* @return List<YieldOrderCraft>
* @Description: 绑定外协商到生成计划
* @Author dxl
* @CreateTime 2023/2/17 16:28
*/
private List<YieldOrderCraft> bindOem(Oem oemCustomer, Long craftAbilityId, Map<Long,
List<YieldOrderCraft>> craftAbilityMap, Set<Long> keys, YieldOrder yieldOrder, Boolean factor) {
List<YieldOrderCraft> rtnList = new ArrayList<>();
OemCraftAbilityEntity oemAbility = null;
//开始循环生产订单中组合的工艺能力key集合,主工艺能力之前的全部分配到此外协商
for (Long key : keys) {
//验证工艺能力
oemAbility = oemCraftAbilityService.findBsOemAbility(oemCustomer.getId(), key);
if (oemAbility == null) {
break;
}
rtnList.addAll(craftAbilityMap.get(key));
}
// 开始分派到外协商
for (YieldOrderCraft orderCraft : rtnList) {
orderCraft.setOcId(oemCustomer.getId());
orderCraft.setIsOutsource(Boolean.TRUE);
}
// 更新主工序工艺能力日产能信息
dailyAssignService.saveOrEdit(null, oemCustomer.getId(), craftAbilityId, yieldOrder.getYpArea(), yieldOrder.getYpQty());
return rtnList;
}
/**
* 获取一个优先级最高的规则
*
* @param yieldOrder 生产订单
* @param caId 工艺能力
* @return PjRules
* @Description: 匹配规则条件
* @Author dxl
* @CreateTime 2023/2/16 17:30
*/
private BsAssignEntity getRules(YieldOrder yieldOrder, Long caId, int appointType) {
List<BsAssignEntity> rulesList = assignService.listByPointType(appointType);
BsAssignEntity rtnRule = null;
int num = 0, rtn = 0;
for (BsAssignEntity rules : rulesList) {
rtn = this.analysesRule(rules, yieldOrder, caId);
if (rtn > num) {
// 判定规则优先级,如果本次匹配到的规则的RulesOrder如果大于上次匹配规则的RulesOrder,则跳过
if (rtnRule != null && rtnRule.getSort() < rules.getSort()) {
continue;
}
num = rtn;
rtnRule = rules;
}
}
// 质量等级规则监控
if (rtnRule != null && StringUtils.isNotBlank(rtnRule.getProdMark())) {
log.error("生产订单id: " + yieldOrder.getId() + "等级:" + yieldOrder.getProductIdent() + "规则id:" + (rtnRule == null ? "" : rtnRule.getId()));
}
return rtnRule;
}
/**
* 根据规则的匹配项 计算使用能力的优先级
*
* @param rules 规则记录
* @param yieldOrder 生产订单
* @param caId 工艺能力
* @return int
* @Description: 匹配条件
* @Author dxl
* @CreateTime 2023/2/16 17:26
*/
private int analysesRule(BsAssignEntity rules, YieldOrder yieldOrder, Long caId) {
//条件匹配根据占比累计
int sum = 0;
//工艺能力
if (rules.getCraftAbilityId() != null) {
if (caId.equals(rules.getCraftAbilityId())) {
sum = sum + 51;
} else {
return 0;
}
}
//零件号
if (StringUtils.isNotBlank(rules.getPartCode())) {
if (yieldOrder.getPartCode().equals(rules.getPartCode())) {
sum = sum + 25;
} else {
return 0;
}
}
// 质量等级
if (StringUtils.isNotBlank(rules.getProdMark())) {
if (rules.getProdMark().contains("\"" + yieldOrder.getProductIdent() + "\"")) {
sum = sum + 13;
} else {
return 0;
}
}
Double totalArea = yieldOrder.getYpArea() * yieldOrder.getYpQty();
BigDecimal areaVal = new BigDecimal(totalArea);
//单批面积规则和单位面积规则取其一,如果单批面积存在则按照单批面积规则
if ((rules.getSingleUpArea() != null && rules.getSingleUpArea().compareTo(BigDecimal.ZERO) > 0) || (rules.getSingleDownArea() != null && rules.getSingleDownArea().compareTo(BigDecimal.ZERO) > 0)) {
//单批面积下限
if (rules.getSingleDownArea() != null && rules.getSingleDownArea().compareTo(BigDecimal.ZERO) > 0) {
if (areaVal.compareTo(rules.getSingleDownArea()) >= 0) {
sum = sum + 7;
} else {
return 0;
}
}
//单批面积上限
if (rules.getSingleUpArea() != null && rules.getSingleUpArea().compareTo(BigDecimal.ZERO) > 0) {
if (areaVal.compareTo(rules.getSingleUpArea()) <= 0) {
sum = sum + 4;
} else {
return 0;
}
}
} else {
//单位面积下限
if (rules.getLowArea() != null && rules.getLowArea().compareTo(BigDecimal.ZERO) > 0) {
if (areaVal.compareTo(rules.getLowArea()) >= 0) {
sum = sum + 7;
} else {
return 0;
}
}
//单位面积上限
if (rules.getUpArea() != null && rules.getUpArea().compareTo(BigDecimal.ZERO) > 0) {
if (areaVal.compareTo(rules.getUpArea()) <= 0) {
sum = sum + 4;
} else {
return 0;
}
}
}
return sum;
}
}

@ -0,0 +1,85 @@
package org.springblade.desk.order.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import org.springblade.common.constant.CommonConstant;
import org.springblade.core.mp.base.BaseServiceImpl;
import org.springblade.core.tool.utils.DateUtil;
import org.springblade.core.tool.utils.Func;
import org.springblade.desk.order.mapper.YieldOrderDailyAssignMapper;
import org.springblade.desk.order.pojo.dto.YieldOrderAssignCount;
import org.springblade.desk.order.pojo.entity.YieldOrderAssignDaily;
import org.springblade.desk.order.service.IYieldOrderDailyAssignService;
import org.springframework.stereotype.Service;
import java.time.LocalDate;
import java.util.List;
/**
* 服务实现类
*
* @author BladeX
*/
@RequiredArgsConstructor
@Service
public class YieldOrderDailyAssignImpl extends BaseServiceImpl<YieldOrderDailyAssignMapper, YieldOrderAssignDaily> implements IYieldOrderDailyAssignService {
@Override
public void saveOrEdit(Long workCenterId, Long oemId, Long abilityId, Double area, Double quantity) {
LambdaQueryWrapper<YieldOrderAssignDaily> wrapper = Wrappers.<YieldOrderAssignDaily>query().lambda()
.eq(YieldOrderAssignDaily::getIsDeleted, CommonConstant.BOOLEAN_FALSE)
.eq(YieldOrderAssignDaily::getCraftAbilityId, abilityId)
.eq(YieldOrderAssignDaily::getCreateTime, DateUtil.toDate(LocalDate.now()));
if (Func.isNotEmpty(workCenterId)) {
wrapper.eq(YieldOrderAssignDaily::getWorkCenterId, workCenterId);
}
if (Func.isNotEmpty(oemId)) {
wrapper.eq(YieldOrderAssignDaily::getOemId, oemId);
}
YieldOrderAssignDaily assignDaily = baseMapper.selectOne(wrapper);
if (Func.isEmpty(assignDaily)) {
assignDaily = new YieldOrderAssignDaily();
assignDaily.setCraftAbilityId(abilityId);
assignDaily.setWorkCenterId(workCenterId);
assignDaily.setOemId(oemId);
assignDaily.setArea(area);
assignDaily.setQuantity(quantity);
assignDaily.setBatch(1L);
assignDaily.setNum(1L);
assignDaily.setCreateTime(DateUtil.toDate(LocalDate.now()));
this.save(assignDaily);
} else {
assignDaily.setArea(area + assignDaily.getArea());
assignDaily.setQuantity(quantity + assignDaily.getQuantity());
assignDaily.setBatch(1L + assignDaily.getBatch());
assignDaily.setNum(1L + assignDaily.getNum());
this.updateById(assignDaily);
}
// TODO 更新周分派汇总
}
@Override
public YieldOrderAssignCount queryCount(Long abilityId, int orgType) {
return baseMapper.queryCount(LocalDate.now().toString(), abilityId, orgType);
}
@Override
public YieldOrderAssignDaily findMinNum(Long abilityId, List<Long> workCenterIdList) {
LambdaQueryWrapper<YieldOrderAssignDaily> wrapper = Wrappers.<YieldOrderAssignDaily>query().lambda()
.eq(YieldOrderAssignDaily::getIsDeleted, CommonConstant.BOOLEAN_FALSE)
.eq(YieldOrderAssignDaily::getCraftAbilityId, abilityId)
.eq(YieldOrderAssignDaily::getCreateTime, DateUtil.toDate(LocalDate.now()));
if (Func.isNotEmpty(workCenterIdList)) {
wrapper.in(YieldOrderAssignDaily::getWorkCenterId, workCenterIdList);
}
wrapper.orderByAsc(YieldOrderAssignDaily::getNum).last("LIMIT 1");
return baseMapper.selectOne(wrapper);
}
}

@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springblade.common.constant.CommonConstant;
import org.springblade.common.exception.BusinessException;
@ -27,6 +28,8 @@ import org.springblade.desk.dashboard.pojo.entity.DsCraftEntity;
import org.springblade.desk.dashboard.pojo.entity.DsPartEntity;
import org.springblade.desk.dashboard.pojo.entity.DsProcessEntity;
import org.springblade.desk.dashboard.pojo.enums.DsCraftEnum;
import org.springblade.desk.dashboard.pojo.enums.PartCraftStatusEnum;
import org.springblade.desk.dashboard.pojo.vo.PartCraftVO;
import org.springblade.desk.dashboard.service.IDsCraftService;
import org.springblade.desk.dashboard.service.IDsPartService;
import org.springblade.desk.dashboard.service.IDsProcessService;
@ -36,7 +39,6 @@ import org.springblade.desk.order.pojo.entity.YieldOrder;
import org.springblade.desk.order.pojo.entity.YieldOrderCraft;
import org.springblade.desk.order.pojo.entity.YieldPlan;
import org.springblade.desk.order.pojo.enums.YieldOrderEnum;
import org.springblade.desk.order.pojo.enums.YieldPlanEnum;
import org.springblade.desk.order.service.IYieldOrderCraftService;
import org.springblade.desk.order.service.IYieldOrderService;
import org.springblade.desk.produce.mapper.WorkOrderMapper;
@ -55,6 +57,7 @@ import java.util.*;
* @author BladeX
*/
@RequiredArgsConstructor
@Slf4j
@Service
public class YieldOrderServiceImpl extends BaseServiceImpl<YieldOrderMapper, YieldOrder> implements IYieldOrderService {
@ -306,31 +309,27 @@ public class YieldOrderServiceImpl extends BaseServiceImpl<YieldOrderMapper, Yie
return Boolean.TRUE;
}
String roamNo = yieldOrder.getRoamNo();
String prodIdent = yieldOrder.getProductIdent();
String partCode = yieldOrder.getPartCode();
DsCraftEntity craft = null;
// 石墨模零件不考虑B号匹配因素
if (YieldOrderEnum.YIELD_TYPE_6.equals(yieldOrder.getYieldType())) {
craft = dsCraftService.getCraft(partCode, null, prodIdent, DsCraftEnum.RANK_TWO.getCode(), null);
String roamNo = yieldOrder.getRoamNo();
// 石墨模零件不考虑B号匹配因素, 使用默认的B号
if (YieldOrderEnum.YIELD_TYPE_6.getCode() == yieldOrder.getYieldType()) {
roamNo = "B000000";
}
Integer rank;
// 先判断是否是烧结订单
if (YieldOrderEnum.YIELD_TYPE_1.getCode() != yieldOrder.getYieldType()) {
rank = DsCraftEnum.RANK_TWO.getCode();
} else {
Integer rank = judgeRank(yieldOrder);
if (rank == null) {
craft = dsCraftService.getCraft(partCode, roamNo, prodIdent, DsCraftEnum.RANK_TWO.getCode(), null);
if (craft == null) {
craft = dsCraftService.getCraft(partCode, roamNo, prodIdent, DsCraftEnum.RANK_ONE.getCode(), null);
}
if (craft == null) {
craft = dsCraftService.getCraft(partCode, roamNo, prodIdent, DsCraftEnum.RANK_THREE.getCode(), null);
}
} else {
craft = dsCraftService.getCraft(partCode, roamNo, prodIdent, rank, null);
}
rank = judgeRank(yieldOrder);
}
String rankStr = rank == null ? null : String.valueOf(rank);
if (ObjectUtil.isEmpty(craft)) {
String errMsg = StringUtils.isNotBlank(roamNo) ? "订单流转单号匹配失败,请联系工艺员!" : "未找到B号工艺,请核实订单是否存在B号!";
PartCraftVO craftVO = dsPartService.selectPartCraft(partCode, roamNo, rankStr, null);
if (ObjectUtil.isEmpty(craftVO) || PartCraftStatusEnum.SUCCESS.getCode() != craftVO.getCode()) {
String errMsg = "工艺匹配失败,原因:" + PartCraftStatusEnum.getMsg(craftVO.getCode());
yieldOrder.setValidationResult(YieldOrderEnum.VALIDATION_RESULT_LESS_CRAFT.getCode());
yieldOrder.setValidationTime(DateUtil.now());
yieldOrder.setValidationMomo(errMsg);
@ -338,20 +337,12 @@ public class YieldOrderServiceImpl extends BaseServiceImpl<YieldOrderMapper, Yie
return Boolean.FALSE;
}
DsCraftEntity craft = craftVO.getCraft();
DsPartEntity part = dsPartService.getById(craft.getPartId());
//验证零件是否已经被删除
if (CommonConstant.DELETE_TRUE.equals(part.getIsDeleted())) {
yieldOrder.setValidationResult(YieldOrderEnum.VALIDATION_RESULT_LESS_CRAFT.getCode());
yieldOrder.setValidationTime(DateUtil.now());
yieldOrder.setValidationMomo("零件信息已删除,工艺匹配失败,请联系工艺员!");
this.updateById(yieldOrder);
return Boolean.FALSE;
}
//石墨模不参与验证
if (!YieldOrderEnum.YIELD_TYPE_2.equals(yieldOrder.getYieldType())
&& !YieldOrderEnum.YIELD_TYPE_6.equals(yieldOrder.getYieldType())
&& ObjectUtil.isEmpty(part.getArea())) {
&& !YieldOrderEnum.YIELD_TYPE_6.equals(yieldOrder.getYieldType()) && ObjectUtil.isEmpty(part.getArea())) {
yieldOrder.setValidationResult(YieldOrderEnum.VALIDATION_RESULT_LESS_CRAFT.getCode());
yieldOrder.setValidationTime(DateUtil.now());
yieldOrder.setValidationMomo("零件面积为空,工艺匹配失败,请联系工艺员!");
@ -361,8 +352,8 @@ public class YieldOrderServiceImpl extends BaseServiceImpl<YieldOrderMapper, Yie
yieldOrder.setYpArea(part.getArea() == null ? 0D : part.getArea());
yieldOrder.setPlate(part.getPlate());
// yieldOrder.setCraftId(craft.getCraftId());
// yieldOrder.setPdmUrl(craft.getPdmUrl());
yieldOrder.setCraftId(craft.getId());
yieldOrder.setPartVersion(craft.getPartVersions());
List<DsProcessEntity> dsProcessEntityList = dsProcessService.selectDsProcessByCraftId(craft.getId());
//删除之前的
@ -376,13 +367,15 @@ public class YieldOrderServiceImpl extends BaseServiceImpl<YieldOrderMapper, Yie
for (DsProcessEntity processEntity : dsProcessEntityList) {
YieldOrderCraft yieldOrderCraft = new YieldOrderCraft();
yieldOrderCraft.setYoId(yieldOrder.getId());
yieldOrderCraft.setCraftNo(craft.getCraftNo());
yieldOrderCraft.setPid(processEntity.getId());
yieldOrderCraft.setProcessNo(processEntity.getProcessNo());
yieldOrderCraft.setProcessCode(processEntity.getProcessCode());
yieldOrderCraft.setProcessName(processEntity.getProcessName());
yieldOrderCraft.setMakeMemo(processEntity.getRemarks());
yieldOrderCraft.setHourQuota(processEntity.getProHours());
// yieldOrderCraft.setPpsId(processEntity.getBsProcedureSet());
// yieldOrderCraft.setCraftNo(processEntity.getDsCraft().getCraftNo());
// yieldOrderCraft.setPid(processEntity.getPid());
// yieldOrderCraft.setCaId(processEntity.getBsCraftAbility());
yieldOrderCraft.setPpsId(processEntity.getPpsId());
yieldOrderCraft.setCaId(processEntity.getCaId());
yieldOrderCraftList.add(yieldOrderCraft);
}
yieldOrderCraftService.saveBatch(yieldOrderCraftList);
@ -393,6 +386,17 @@ public class YieldOrderServiceImpl extends BaseServiceImpl<YieldOrderMapper, Yie
@Override
public Boolean verifyYieldOrderResource(YieldOrder yieldOrder) {
// 根据生产订单,给各工序分派作业中心||外协
List<YieldOrderCraft> craftList = yieldOrderCraftService.listByYoId(yieldOrder.getId());
try {
yieldOrderCraftService.automaticDispatch(craftList, yieldOrder, null, null);
} catch (Exception e) {
yieldOrder.setValidationResult(YieldOrderEnum.VALIDATION_RESULT_LESS_RESOURCE.getCode());
yieldOrder.setValidationTime(DateUtil.now());
yieldOrder.setValidationMomo(e.getMessage());
this.updateById(yieldOrder);
return Boolean.FALSE;
}
return Boolean.TRUE;
}
@ -983,28 +987,31 @@ public class YieldOrderServiceImpl extends BaseServiceImpl<YieldOrderMapper, Yie
* @throws BusinessException
*/
private Integer judgeRank(YieldOrder yieldOrder) {
DsPartEntity part = dsPartService.selectDsPartByPatCodeAndVersion(yieldOrder.getPartCode(), null);
String configNo = part.getConfigCode();
String prodIdent = yieldOrder.getProductIdent();
// TODO 工序资质未维护
// BsProcedureQua qua = bsProcedureQuaService.getByPqCode(prodIdent);
// if (qua == null) {
// throw new BusinessException("basic.not.prodIdent", new String[]{prodIdent});
// }
// 判定是否为镀金零件
DsPartEntity part = dsPartService.selectDsPartByPatCodeAndVersion(yieldOrder.getPartCode(), yieldOrder.getPartVersion());
// 工作订单备注中包含大小写的HTBY时,执行二级工艺
if (yieldOrder.getYpMemo() != null && yieldOrder.getYpMemo().toLowerCase(Locale.ROOT).contains("htby")) {
return DsCraftEnum.RANK_TWO.getCode();
}
// TODO 判定是否为镀金零件
if (CommonConstant.BOOLEAN_TRUE.equals(part.getGoldMark())) {
//zxh 20251015 针对局部镀厚金零件,工作订单备注中包含大小写的HTBY时,执行二级工艺
if (yieldOrder.getYpMemo() != null && yieldOrder.getYpMemo().toLowerCase(Locale.ROOT).contains("htby")) {
return DsCraftEnum.RANK_TWO.getCode();
// 获取零件工艺级别面积判定值
Integer levConfirmVal = 20;
if (levConfirmVal != null) {
// 计算生产订单总面积
Double totalArea = yieldOrder.getYpArea() * yieldOrder.getYpQty();
if (totalArea > levConfirmVal) {
return DsCraftEnum.RANK_ONE.getCode();
} else {
// 若局部镀质量等级存在, 返回一级工艺
}
}
// if (qua.getGoldMark()) {
// // 生产订单总面积大于20时取一级工艺
// if (yieldOrder.getYpArea() * yieldOrder.getYpQty() > 20) {
// return DsCraftEnum.RANK_ONE.getCode();
// }
// }
return DsCraftEnum.RANK_TWO.getCode();
}
// 获取零件配置码
String configNo = part.getConfigCode();
if ("E9".equals(configNo) || "E12".equals(configNo)) {
//E9判定
if (yieldOrder.getBatchNo().contains("MP") || yieldOrder.getBatchNo().contains("mp")) {
@ -1015,4 +1022,5 @@ public class YieldOrderServiceImpl extends BaseServiceImpl<YieldOrderMapper, Yie
return null;
}
}

@ -0,0 +1,79 @@
CREATE TABLE "MES_YIELD_ORDER_ASSIGN_DAILY"
(
"ID" NUMBER(20, 0) NOT NULL,
"TENANT_ID" NVARCHAR2(12),
"CREATE_USER" NUMBER(20, 0),
"CREATE_TIME" DATE,
"CREATE_DEPT" NUMBER(20, 0),
"UPDATE_USER" NUMBER(20, 0),
"UPDATE_TIME" DATE,
"STATUS" NUMBER(11, 0) NOT NULL,
"IS_DELETED" NUMBER(11, 0),
"OEM_ID" NUMBER(20, 0),
"WORK_CENTER_ID" NUMBER(20, 0),
"CRAFT_ABILITY_ID" NUMBER(20, 0),
"AREA" NUMBER(20, 4),
"QUANTITY" NUMBER(20, 4),
"BATCH" NUMBER(12, 0),
"NUM" NUMBER(12, 0)
) LOGGING NOCOMPRESS PCTFREE 10 INITRANS 1 STORAGE
(
BUFFER_POOL DEFAULT
) PARALLEL 1 NOCACHE DISABLE ROW MOVEMENT
;
COMMENT ON COLUMN "MES_YIELD_ORDER_ASSIGN_DAILY"."ID" IS '主键';
COMMENT ON COLUMN "MES_YIELD_ORDER_ASSIGN_DAILY"."CREATE_USER" IS '创建人';
COMMENT ON COLUMN "MES_YIELD_ORDER_ASSIGN_DAILY"."CREATE_TIME" IS '创建时间';
COMMENT ON COLUMN "MES_YIELD_ORDER_ASSIGN_DAILY"."CREATE_DEPT" IS '创建部门';
COMMENT ON COLUMN "MES_YIELD_ORDER_ASSIGN_DAILY"."UPDATE_USER" IS '更新人';
COMMENT ON COLUMN "MES_YIELD_ORDER_ASSIGN_DAILY"."UPDATE_TIME" IS '更新时间';
COMMENT ON COLUMN "MES_YIELD_ORDER_ASSIGN_DAILY"."STATUS" IS '状态';
COMMENT ON COLUMN "MES_YIELD_ORDER_ASSIGN_DAILY"."IS_DELETED" IS '删除标记';
COMMENT ON COLUMN "MES_YIELD_ORDER_ASSIGN_DAILY"."OEM_ID" IS '供应商';
COMMENT ON COLUMN "MES_YIELD_ORDER_ASSIGN_DAILY"."WORK_CENTER_ID" IS '作业中心';
COMMENT ON COLUMN "MES_YIELD_ORDER_ASSIGN_DAILY"."CRAFT_ABILITY_ID" IS '工艺能力';
COMMENT ON COLUMN "MES_YIELD_ORDER_ASSIGN_DAILY"."AREA" IS '面积';
COMMENT ON COLUMN "MES_YIELD_ORDER_ASSIGN_DAILY"."QUANTITY" IS '数量';
COMMENT ON COLUMN "MES_YIELD_ORDER_ASSIGN_DAILY"."BATCH" IS '批数';
COMMENT ON COLUMN "MES_YIELD_ORDER_ASSIGN_DAILY"."NUM" IS '分派数';
COMMENT ON TABLE "MES_YIELD_ORDER_ASSIGN_DAILY" IS '生产订单日分派';
CREATE TABLE "MES_YIELD_ORDER_ASSIGN_STEER"
(
"ID" NUMBER(20, 0) NOT NULL,
"TENANT_ID" NVARCHAR2(12),
"CREATE_USER" NUMBER(20, 0),
"CREATE_TIME" DATE,
"CREATE_DEPT" NUMBER(20, 0),
"UPDATE_USER" NUMBER(20, 0),
"UPDATE_TIME" DATE,
"STATUS" NUMBER(11, 0) NOT NULL,
"IS_DELETED" NUMBER(11, 0),
"OEM_ID" NUMBER(20, 0),
"CRAFT_ABILITY_ID" NUMBER(20, 0),
"PART_CODE" NUMBER(20, 0),
"DAILY_ASSIGN" NUMBER(20, 4),
"WEEK_ASSIGN" NUMBER(20, 4),
"ASSIGN_SCALE" NUMBER(12, 0),
"FACTOR" NUMBER(12, 0)
) LOGGING NOCOMPRESS PCTFREE 10 INITRANS 1 STORAGE
(
BUFFER_POOL DEFAULT
) PARALLEL 1 NOCACHE DISABLE ROW MOVEMENT
;
COMMENT ON COLUMN "MES_YIELD_ORDER_ASSIGN_STEER"."ID" IS '主键';
COMMENT ON COLUMN "MES_YIELD_ORDER_ASSIGN_STEER"."CREATE_USER" IS '创建人';
COMMENT ON COLUMN "MES_YIELD_ORDER_ASSIGN_STEER"."CREATE_TIME" IS '创建时间';
COMMENT ON COLUMN "MES_YIELD_ORDER_ASSIGN_STEER"."CREATE_DEPT" IS '创建部门';
COMMENT ON COLUMN "MES_YIELD_ORDER_ASSIGN_STEER"."UPDATE_USER" IS '更新人';
COMMENT ON COLUMN "MES_YIELD_ORDER_ASSIGN_STEER"."UPDATE_TIME" IS '更新时间';
COMMENT ON COLUMN "MES_YIELD_ORDER_ASSIGN_STEER"."STATUS" IS '状态';
COMMENT ON COLUMN "MES_YIELD_ORDER_ASSIGN_STEER"."IS_DELETED" IS '删除标记';
COMMENT ON COLUMN "MES_YIELD_ORDER_ASSIGN_STEER"."OEM_ID" IS '供应商';
COMMENT ON COLUMN "MES_YIELD_ORDER_ASSIGN_STEER"."CRAFT_ABILITY_ID" IS '工艺能力';
COMMENT ON COLUMN "MES_YIELD_ORDER_ASSIGN_STEER"."PART_CODE" IS '零件编码';
COMMENT ON COLUMN "MES_YIELD_ORDER_ASSIGN_STEER"."DAILY_ASSIGN" IS '累计日分派量';
COMMENT ON COLUMN "MES_YIELD_ORDER_ASSIGN_STEER"."WEEK_ASSIGN" IS '周累计分派量';
COMMENT ON COLUMN "MES_YIELD_ORDER_ASSIGN_STEER"."ASSIGN_SCALE" IS '分派比例';
COMMENT ON COLUMN "MES_YIELD_ORDER_ASSIGN_STEER"."FACTOR" IS '比例偏差因子';
COMMENT ON TABLE "MES_YIELD_ORDER_ASSIGN_STEER" IS '生产订单分派控制, 主要针对外协';
Loading…
Cancel
Save