From 14aee0849e80e57c2685340c1667f26f4ae26de8 Mon Sep 17 00:00:00 2001 From: liuqingkun Date: Mon, 23 Mar 2026 14:28:07 +0800 Subject: [PATCH] =?UTF-8?q?=E7=94=9F=E4=BA=A7=E8=AE=A2=E5=8D=95=EF=BC=8C?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E5=88=86=E6=B4=BE=E4=BD=9C=E4=B8=9A=E4=B8=AD?= =?UTF-8?q?=E5=BF=83=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../basic/pojo/entity/BsAssignEntity.java | 45 +- .../desk/basic/pojo/entity/Oem.java | 13 + .../pojo/entity/BsWorkCenterEntity.java | 50 +- .../dashboard/pojo/enums/DsCraftEnum.java | 8 +- .../pojo/enums/PartCraftStatusEnum.java | 55 +- .../order/pojo/dto/YieldOrderAssignCount.java | 36 + .../desk/order/pojo/entity/YieldOrder.java | 8 +- .../pojo/entity/YieldOrderAssignDaily.java | 63 ++ .../pojo/entity/YieldOrderAssignSteer.java | 62 ++ .../order/pojo/entity/YieldOrderCraft.java | 1 - .../desk/basic/service/IBatConfigService.java | 19 +- .../desk/basic/service/IBsAssignService.java | 35 +- .../service/IOemCraftAbilityService.java | 29 +- .../desk/basic/service/IOemService.java | 53 +- .../basic/service/IWorkCenterService.java | 30 + .../service/impl/BatConfigServiceImpl.java | 23 +- .../service/impl/BsAssignServiceImpl.java | 34 + .../impl/OemCraftAbilityServiceImpl.java | 29 +- .../basic/service/impl/OemServiceImpl.java | 146 ++-- .../service/impl/WorkCenterServiceImpl.java | 83 +++ .../service/IDsSimilarPartsService.java | 22 +- .../impl/DsSimilarPartsServiceImpl.java | 63 +- .../controller/YieldOrderController.java | 2 - .../mapper/YieldOrderAssignSteerMapper.java | 13 + .../mapper/YieldOrderAssignSteerMapper.xml | 8 + .../mapper/YieldOrderDailyAssignMapper.java | 23 + .../mapper/YieldOrderDailyAssignMapper.xml | 19 + .../IYieldOrderAssignSteerService.java | 41 ++ .../service/IYieldOrderCraftService.java | 12 +- .../IYieldOrderDailyAssignService.java | 44 ++ .../impl/YieldOrderAssignSteerImpl.java | 75 +++ .../impl/YieldOrderCraftServiceImpl.java | 637 +++++++++++++++++- .../impl/YieldOrderDailyAssignImpl.java | 85 +++ .../service/impl/YieldOrderServiceImpl.java | 120 ++-- doc/sql/mes/increase-20690321.sql | 79 +++ 35 files changed, 1795 insertions(+), 270 deletions(-) create mode 100644 blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/order/pojo/dto/YieldOrderAssignCount.java create mode 100644 blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/order/pojo/entity/YieldOrderAssignDaily.java create mode 100644 blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/order/pojo/entity/YieldOrderAssignSteer.java create mode 100644 blade-service/blade-desk/src/main/java/org/springblade/desk/order/mapper/YieldOrderAssignSteerMapper.java create mode 100644 blade-service/blade-desk/src/main/java/org/springblade/desk/order/mapper/YieldOrderAssignSteerMapper.xml create mode 100644 blade-service/blade-desk/src/main/java/org/springblade/desk/order/mapper/YieldOrderDailyAssignMapper.java create mode 100644 blade-service/blade-desk/src/main/java/org/springblade/desk/order/mapper/YieldOrderDailyAssignMapper.xml create mode 100644 blade-service/blade-desk/src/main/java/org/springblade/desk/order/service/IYieldOrderAssignSteerService.java create mode 100644 blade-service/blade-desk/src/main/java/org/springblade/desk/order/service/IYieldOrderDailyAssignService.java create mode 100644 blade-service/blade-desk/src/main/java/org/springblade/desk/order/service/impl/YieldOrderAssignSteerImpl.java create mode 100644 blade-service/blade-desk/src/main/java/org/springblade/desk/order/service/impl/YieldOrderDailyAssignImpl.java create mode 100644 doc/sql/mes/increase-20690321.sql diff --git a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/basic/pojo/entity/BsAssignEntity.java b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/basic/pojo/entity/BsAssignEntity.java index 1777e11e..518f70b0 100644 --- a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/basic/pojo/entity/BsAssignEntity.java +++ b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/basic/pojo/entity/BsAssignEntity.java @@ -1,28 +1,3 @@ -/** - * BladeX Commercial License Agreement - * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. - *

- * Use of this software is governed by the Commercial License Agreement - * obtained after purchasing a license from BladeX. - *

- * 1. This software is for development use only under a valid license - * from BladeX. - *

- * 2. Redistribution of this software's source code to any third party - * without a commercial license is strictly prohibited. - *

- * 3. Licensees may copyright their own code but cannot use segments - * from this software for such purposes. Copyright of this software - * remains with BladeX. - *

- * Using this software signifies agreement to this License, and the software - * must not be used for illegal purposes. - *

- * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is - * not liable for any claims arising from secondary or illegal development. - *

- * 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; diff --git a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/basic/pojo/entity/Oem.java b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/basic/pojo/entity/Oem.java index 78c524a8..0862884c 100644 --- a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/basic/pojo/entity/Oem.java +++ b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/basic/pojo/entity/Oem.java @@ -160,4 +160,17 @@ public class Oem extends BaseEntity { @TableField(exist = false) private List 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; } diff --git a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/dashboard/pojo/entity/BsWorkCenterEntity.java b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/dashboard/pojo/entity/BsWorkCenterEntity.java index e5eb1a4b..f82d1864 100644 --- a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/dashboard/pojo/entity/BsWorkCenterEntity.java +++ b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/dashboard/pojo/entity/BsWorkCenterEntity.java @@ -1,39 +1,14 @@ -/** - * BladeX Commercial License Agreement - * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. - *

- * Use of this software is governed by the Commercial License Agreement - * obtained after purchasing a license from BladeX. - *

- * 1. This software is for development use only under a valid license - * from BladeX. - *

- * 2. Redistribution of this software's source code to any third party - * without a commercial license is strictly prohibited. - *

- * 3. Licensees may copyright their own code but cannot use segments - * from this software for such purposes. Copyright of this software - * remains with BladeX. - *

- * Using this software signifies agreement to this License, and the software - * must not be used for illegal purposes. - *

- * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is - * not liable for any claims arising from secondary or illegal development. - *

- * 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; + } diff --git a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/dashboard/pojo/enums/DsCraftEnum.java b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/dashboard/pojo/enums/DsCraftEnum.java index f6b8153f..4b06736f 100644 --- a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/dashboard/pojo/enums/DsCraftEnum.java +++ b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/dashboard/pojo/enums/DsCraftEnum.java @@ -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), /** * 优先级 diff --git a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/dashboard/pojo/enums/PartCraftStatusEnum.java b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/dashboard/pojo/enums/PartCraftStatusEnum.java index 22dc754d..4b8038c3 100644 --- a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/dashboard/pojo/enums/PartCraftStatusEnum.java +++ b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/dashboard/pojo/enums/PartCraftStatusEnum.java @@ -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(); + } } diff --git a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/order/pojo/dto/YieldOrderAssignCount.java b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/order/pojo/dto/YieldOrderAssignCount.java new file mode 100644 index 00000000..5dca3c1c --- /dev/null +++ b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/order/pojo/dto/YieldOrderAssignCount.java @@ -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; +} + diff --git a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/order/pojo/entity/YieldOrder.java b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/order/pojo/entity/YieldOrder.java index 6a1261db..29d4c7f2 100644 --- a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/order/pojo/entity/YieldOrder.java +++ b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/order/pojo/entity/YieldOrder.java @@ -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; + } diff --git a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/order/pojo/entity/YieldOrderAssignDaily.java b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/order/pojo/entity/YieldOrderAssignDaily.java new file mode 100644 index 00000000..e8071f49 --- /dev/null +++ b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/order/pojo/entity/YieldOrderAssignDaily.java @@ -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; +} + diff --git a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/order/pojo/entity/YieldOrderAssignSteer.java b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/order/pojo/entity/YieldOrderAssignSteer.java new file mode 100644 index 00000000..f5c2d241 --- /dev/null +++ b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/order/pojo/entity/YieldOrderAssignSteer.java @@ -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; +} + diff --git a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/order/pojo/entity/YieldOrderCraft.java b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/order/pojo/entity/YieldOrderCraft.java index 1ffa6a3d..c3da748e 100644 --- a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/order/pojo/entity/YieldOrderCraft.java +++ b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/order/pojo/entity/YieldOrderCraft.java @@ -73,7 +73,6 @@ public class YieldOrderCraft extends BaseEntity { @TableField(value = "HOUR_QUOTA") private Double hourQuota; - /** * 计划开始 */ diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/IBatConfigService.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/IBatConfigService.java index 9712f26a..fb06cd94 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/IBatConfigService.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/IBatConfigService.java @@ -36,9 +36,20 @@ public interface IBatConfigService extends BaseService { */ List exportBatConfig(Wrapper 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); } diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/IBsAssignService.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/IBsAssignService.java index d0da5f53..6f62795c 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/IBsAssignService.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/IBsAssignService.java @@ -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 { /** * 自定义分页 * - * @param page 分页参数 + * @param page 分页参数 * @param bsAssign 查询参数 * @return IPage */ IPage selectBsAssignPage(IPage page, BsAssignVO bsAssign); - public R saveBat(List addList); - public R importExcel(List addList); + R saveBat(List addList); + + R importExcel(List addList); /** * 导出数据 @@ -65,4 +63,29 @@ public interface IBsAssignService extends BaseService { */ List exportBsAssign(Wrapper queryWrapper); + /** + * 验证是否存在强制类规则 + * + * @param appointType + * @return + */ + List listByPointType(int appointType); + /** + * 验证是否存在强制类规则 + * + * @param abilityId + * @param appointType + * @return + */ + List listMustAssign(Long abilityId, int appointType); + + /** + * 根据零件号+工艺能力获取唯一规则 + * + * @param abilityId + * @param partCode + * @return + */ + BsAssignEntity getByPartCode(Long abilityId, String partCode); + } diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/IOemCraftAbilityService.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/IOemCraftAbilityService.java index 10981cb1..b4bab9ef 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/IOemCraftAbilityService.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/IOemCraftAbilityService.java @@ -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 { - /** - * 根据工艺能力、外协商获取关联信息 - * - * @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 findByAbility(Long caId); } diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/IOemService.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/IOemService.java index ceaf5592..1ed649f7 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/IOemService.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/IOemService.java @@ -28,24 +28,45 @@ public interface IOemService extends BaseService { * @param oem 查询参数 * @return IPage */ - IPage selectOemPage(IPage page, OemVO oem); + IPage selectOemPage(IPage page, OemVO oem); - /** - * 导出数据 - * - * @param queryWrapper 查询条件 - * @return List - */ - List exportOem(Wrapper queryWrapper); + /** + * 导出数据 + * + * @param queryWrapper 查询条件 + * @return List + */ + List exportOem(Wrapper queryWrapper); - /** - * VO - * - * @param vo - */ - void setVOValue(OemVO vo); + /** + * VO + * + * @param vo + */ + void setVOValue(OemVO vo); + + IPage listSearch(IPage page, OemSearch search); - IPage listSearch(IPage 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 selectByAbility(Long abilityId, + Double ypQty, + Double ypArea, + String partCode, + String PrimaryCraft, + Integer yieldType, + String plate, + Boolean rxlSpace); } diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/IWorkCenterService.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/IWorkCenterService.java index 801b5c5b..f4e41b53 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/IWorkCenterService.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/IWorkCenterService.java @@ -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 { * @return List */ List exportWorkCenter(Wrapper queryWrapper); + + /** + * 根据工艺能力查找作业中心列表 + * + * @param abilityId + * @param ypQty + * @param ypArea + * @param partCode + * @param PrimaryCraft + * @param yieldType + * @param rxlSpace 是否需要特殊分派 null :不需要 true:需要 + * @return + */ + Map selectByAbility(Long abilityId, + Double ypQty, + Double ypArea, + String partCode, + String PrimaryCraft, + Integer yieldType, + Boolean rxlSpace); + + /** + * 根据作业中心ID查找作业中心 + * + * @param workCenterId + * @return BsWorkCenterEntity 对象 + */ + BsWorkCenterEntity getWorkCenter(Long workCenterId); } diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/impl/BatConfigServiceImpl.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/impl/BatConfigServiceImpl.java index 55f18715..4fb221ec 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/impl/BatConfigServiceImpl.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/impl/BatConfigServiceImpl.java @@ -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 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 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); + } + } diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/impl/OemCraftAbilityServiceImpl.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/impl/OemCraftAbilityServiceImpl.java index 79db2a78..621a7733 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/impl/OemCraftAbilityServiceImpl.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/impl/OemCraftAbilityServiceImpl.java @@ -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 implements IOemCraftAbilityService { - @Override - public OemCraftAbilityEntity findBsOemAbility(Long ocId, Long caId) { - List 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 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 findByAbility(Long caId) { + List entities = this.list(Wrappers.lambdaQuery(OemCraftAbilityEntity.class).eq(OemCraftAbilityEntity::getCraftAbilityId, caId)); + return entities; + } } diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/impl/OemServiceImpl.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/impl/OemServiceImpl.java index a856665e..898547f7 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/impl/OemServiceImpl.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/impl/OemServiceImpl.java @@ -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 implements IOemService { - @Resource - private IUserClient userClient; - @Resource - private IDictClient dictClient; - - @Override - public IPage selectOemPage(IPage page, OemVO oem) { - return page.setRecords(baseMapper.selectOemPage(page, oem)); - } - - @Override - public List exportOem(Wrapper queryWrapper) { - List 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 listSearch(IPage page, OemSearch search) { - // todo: - // Wrapper qw = Wrappers.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 selectOemPage(IPage page, OemVO oem) { + return page.setRecords(baseMapper.selectOemPage(page, oem)); + } + + @Override + public List exportOem(Wrapper queryWrapper) { + List 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 listSearch(IPage page, OemSearch search) { + // todo: + // Wrapper qw = Wrappers.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 selectByAbility(Long abilityId, Double ypQty, Double ypArea, String partCode, String PrimaryCraft, Integer yieldType, String plate, Boolean rxlSpace) { + List abilityList = oemCraftAbilityService.findByAbility(abilityId); + if (Func.isEmpty(abilityList)) { + return null; + } + + List companyIdList = abilityList.stream().map(OemCraftAbilityEntity::getOtherId).collect(Collectors.toList()); + List oemList = this.listByIds(companyIdList); + Map oemMap = oemList.stream().collect(Collectors.toMap(Oem::getId, Function.identity())); + + List 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; + } } diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/impl/WorkCenterServiceImpl.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/impl/WorkCenterServiceImpl.java index 0a60a856..1cc2b0de 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/impl/WorkCenterServiceImpl.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/impl/WorkCenterServiceImpl.java @@ -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 implements IWorkCenterService { + + private final IOemCraftAbilityService oemCraftAbilityService; + private final IWorkCenterService workCenterService; + private final IBatConfigService batConfigService; + @Override public IPage selectWorkCenterPage(IPage page, WorkCenterVO workCenter) { return page.setRecords(baseMapper.selectWorkCenterPage(page, workCenter)); @@ -43,4 +59,71 @@ public class WorkCenterServiceImpl extends BaseServiceImpl selectByAbility(Long abilityId, Double ypQty, Double ypArea, String partCode, String PrimaryCraft, Integer yieldType, Boolean rxlSpace) { + List abilityList = oemCraftAbilityService.findByAbility(abilityId); + if (Func.isEmpty(abilityList)) { + return null; + } + + List companyIdList = abilityList.stream().map(OemCraftAbilityEntity::getOtherId).collect(Collectors.toList()); + List workCenterList = workCenterService.listByIds(companyIdList); + + Double area = ypQty * ypArea; + Map 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); + } } diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/dashboard/service/IDsSimilarPartsService.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/dashboard/service/IDsSimilarPartsService.java index d5039a5e..602be393 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/dashboard/service/IDsSimilarPartsService.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/dashboard/service/IDsSimilarPartsService.java @@ -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 selectDsSimilarPartsPage(IPage page, DsSimilarPartsVO dsSimilarParts) { List dsSimilarPartsList = baseMapper.selectDsSimilarPartsPage(page, dsSimilarParts); @@ -103,16 +98,48 @@ public class DsSimilarPartsServiceImpl extends BaseServiceImpl 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 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; +// } } diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/order/controller/YieldOrderController.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/order/controller/YieldOrderController.java index 20f55a8e..1e186ea4 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/order/controller/YieldOrderController.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/order/controller/YieldOrderController.java @@ -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); } diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/order/mapper/YieldOrderAssignSteerMapper.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/order/mapper/YieldOrderAssignSteerMapper.java new file mode 100644 index 00000000..ed2c5a07 --- /dev/null +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/order/mapper/YieldOrderAssignSteerMapper.java @@ -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 { +} diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/order/mapper/YieldOrderAssignSteerMapper.xml b/blade-service/blade-desk/src/main/java/org/springblade/desk/order/mapper/YieldOrderAssignSteerMapper.xml new file mode 100644 index 00000000..32942e8e --- /dev/null +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/order/mapper/YieldOrderAssignSteerMapper.xml @@ -0,0 +1,8 @@ + + + + + diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/order/mapper/YieldOrderDailyAssignMapper.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/order/mapper/YieldOrderDailyAssignMapper.java new file mode 100644 index 00000000..6990443a --- /dev/null +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/order/mapper/YieldOrderDailyAssignMapper.java @@ -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 { + /** + * 根据工艺能力获取厂内外制作批数 + * + * @param dayStr + * @param abilityId + * @param orgType 生产单位类型 0:厂内, 1:厂外 + * @return + */ + YieldOrderAssignCount queryCount(String dayStr, Long abilityId, int orgType); +} diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/order/mapper/YieldOrderDailyAssignMapper.xml b/blade-service/blade-desk/src/main/java/org/springblade/desk/order/mapper/YieldOrderDailyAssignMapper.xml new file mode 100644 index 00000000..decefbd6 --- /dev/null +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/order/mapper/YieldOrderDailyAssignMapper.xml @@ -0,0 +1,19 @@ + + + + + diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/order/service/IYieldOrderAssignSteerService.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/order/service/IYieldOrderAssignSteerService.java new file mode 100644 index 00000000..013dccc4 --- /dev/null +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/order/service/IYieldOrderAssignSteerService.java @@ -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 { + /** + * 根据条件获取到满足条件的供应商 + * + * @param ocIdLst + * @param oemCaId + * @param partCode + * @return + */ + YieldOrderAssignSteer findByOcIdLstAndCaId(List ocIdLst, Long oemCaId, String partCode); + + /** + * 对有能力做这个单子厂家按照偏差因子排序 + * + * @param oemIdList + * @param abilityId + * @return + */ + List sortDataByFactor(List oemIdList, Long abilityId); + + /** + * 根据外协厂家与生产标识调取erp来判断是否符合要求 + * + * @param ocCode + * @param prodIdent + * @return + */ + Boolean queryOemAndCaid(String ocCode, String prodIdent); +} diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/order/service/IYieldOrderCraftService.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/order/service/IYieldOrderCraftService.java index d6e65687..994e8a26 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/order/service/IYieldOrderCraftService.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/order/service/IYieldOrderCraftService.java @@ -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 { 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 yieldOrderCraftList, YieldOrder yieldOrder, Boolean factor, Boolean rxlSpace) throws BusinessException; } diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/order/service/IYieldOrderDailyAssignService.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/order/service/IYieldOrderDailyAssignService.java new file mode 100644 index 00000000..2dac2aef --- /dev/null +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/order/service/IYieldOrderDailyAssignService.java @@ -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 { + + /** + * 添加或更新日分排量 + * + * @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 workCenterIdList); +} diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/order/service/impl/YieldOrderAssignSteerImpl.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/order/service/impl/YieldOrderAssignSteerImpl.java new file mode 100644 index 00000000..3e1a5c81 --- /dev/null +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/order/service/impl/YieldOrderAssignSteerImpl.java @@ -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 implements IYieldOrderAssignSteerService { + + + @Override + public YieldOrderAssignSteer findByOcIdLstAndCaId(List ocIdLst, Long oemCaId, String partCode) { + LambdaQueryWrapper wrapper = Wrappers.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 sortDataByFactor(List oemIdList, Long abilityId) { + LambdaQueryWrapper wrapper = Wrappers.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; + } +} diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/order/service/impl/YieldOrderCraftServiceImpl.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/order/service/impl/YieldOrderCraftServiceImpl.java index 3853d3d9..ca96158b 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/order/service/impl/YieldOrderCraftServiceImpl.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/order/service/impl/YieldOrderCraftServiceImpl.java @@ -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 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 selectPage(IPage page, YieldOrderCraft entity) { List dataList = baseMapper.selectPage(page, entity); @@ -37,14 +70,606 @@ public class YieldOrderCraftServiceImpl extends BaseServiceImpl deleteWrapper = Wrappers.lambdaQuery(YieldOrderCraft.class) - .eq(YieldOrderCraft::getYoId, yoId) - .eq(YieldOrderCraft::getIsDeleted, CommonConstant.DELETE_FALSE); + LambdaQueryWrapper 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 yieldOrderCraftList, YieldOrder yieldOrder, Boolean factor, Boolean rxlSpace) throws BusinessException { + // 组装key为工艺能力的作业计划map + Map> craftAbilityMap = yieldOrderCraftList.stream().collect(Collectors.groupingBy(YieldOrderCraft::getCaId)); + //作业计划map工艺能力key集合 + Set craftKeys = craftAbilityMap.keySet(); + //获取到认定的主工艺能力(默认第一个工艺能力为主工艺能力) + Long hostAbilityId = craftKeys.iterator().next(); + //获取可以做此主工艺能力的作业中心集合 + Map workCenterMap = workCenterService.selectByAbility(hostAbilityId, yieldOrder.getYpQty(), yieldOrder.getYpArea(), yieldOrder.getPartCode(), yieldOrder.getPrimaryCraft(), yieldOrder.getYieldType(), rxlSpace); + //获取可以做此主工艺能力的外协商集合 + List 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 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 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 wcMap, YieldOrder yieldOrder, Integer limitType) { + //没有工艺能力的对应作业中心,直接分派厂外 + if (wcMap == null || wcMap.size() == 0) { + return null; + } + + //组装wcList集合 + List 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 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 + * @Description: 分配到班组 + * @Author dxl + * @CreateTime 2023/3/8 15:30 + */ + private List bindWorkCenter(Long workCenterId, Map workCenterMap, Long craftAbilityId, + Map> craftAbilityMap, Set craftKeys, + YieldOrder yieldOrder, Boolean factor) { + List 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 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 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 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 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 + * @Description: 绑定外协商到生成计划 + * @Author dxl + * @CreateTime 2023/2/17 16:28 + */ + private List bindOem(Oem oemCustomer, Long craftAbilityId, Map> craftAbilityMap, Set keys, YieldOrder yieldOrder, Boolean factor) { + + List 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 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; } } diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/order/service/impl/YieldOrderDailyAssignImpl.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/order/service/impl/YieldOrderDailyAssignImpl.java new file mode 100644 index 00000000..6b3423c7 --- /dev/null +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/order/service/impl/YieldOrderDailyAssignImpl.java @@ -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 implements IYieldOrderDailyAssignService { + + @Override + public void saveOrEdit(Long workCenterId, Long oemId, Long abilityId, Double area, Double quantity) { + LambdaQueryWrapper wrapper = Wrappers.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 workCenterIdList) { + LambdaQueryWrapper wrapper = Wrappers.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); + } +} diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/order/service/impl/YieldOrderServiceImpl.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/order/service/impl/YieldOrderServiceImpl.java index 032c8e41..24df2461 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/order/service/impl/YieldOrderServiceImpl.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/order/service/impl/YieldOrderServiceImpl.java @@ -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 implements IYieldOrderService { @@ -306,31 +309,27 @@ public class YieldOrderServiceImpl extends BaseServiceImpl dsProcessEntityList = dsProcessService.selectDsProcessByCraftId(craft.getId()); //删除之前的 @@ -376,13 +367,15 @@ public class YieldOrderServiceImpl extends BaseServiceImpl 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 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