From ee43fb65a9384708fb628cbd2874cccd7f670e15 Mon Sep 17 00:00:00 2001 From: liuqingkun Date: Fri, 5 Dec 2025 17:56:46 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AE=A2=E5=8D=95=E7=9B=B8=E5=85=B3=E6=8F=90?= =?UTF-8?q?=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- blade-common/pom.xml | 4 + .../common/exception/BusinessException.java | 26 ++ .../common/utils/StringPrefixUtils.java | 46 +++ .../desk/order/entity/YieldOrder.java | 109 ++++--- .../desk/dashboard/constant/DsPartConst.java | 31 ++ .../dashboard/pojo/entity/DsPartEntity.java | 20 +- .../dashboard/service/IDsCraftService.java | 14 +- .../dashboard/service/IDsPartService.java | 40 ++- .../service/impl/DsCraftServiceImpl.java | 33 +- .../service/impl/DsPartServiceImpl.java | 35 +- .../desk/order/constant/YieldOrderConst.java | 15 +- .../order/service/IYieldOrderService.java | 36 ++- .../service/impl/YieldOrderServiceImpl.java | 303 +++++++++++++++++- 13 files changed, 606 insertions(+), 106 deletions(-) create mode 100644 blade-common/src/main/java/org/springblade/common/exception/BusinessException.java create mode 100644 blade-common/src/main/java/org/springblade/common/utils/StringPrefixUtils.java create mode 100644 blade-service/blade-desk/src/main/java/org/springblade/desk/dashboard/constant/DsPartConst.java diff --git a/blade-common/pom.xml b/blade-common/pom.xml index b19dfb4..3ed3b1e 100644 --- a/blade-common/pom.xml +++ b/blade-common/pom.xml @@ -27,6 +27,10 @@ blade-core-auto provided + + org.springblade + blade-core-tool + org.apache.commonscommons-lang3 diff --git a/blade-common/src/main/java/org/springblade/common/exception/BusinessException.java b/blade-common/src/main/java/org/springblade/common/exception/BusinessException.java new file mode 100644 index 0000000..52e7cdd --- /dev/null +++ b/blade-common/src/main/java/org/springblade/common/exception/BusinessException.java @@ -0,0 +1,26 @@ +package org.springblade.common.exception; + +import lombok.Data; + +/** + * @author lqk + * @date 2025-12-05 17:02 + */ +@Data +public class BusinessException extends Exception { + private static final long serialVersionUID = 4332135048125461630L; + private int errorCode; + private String errorMessage; + private String i18n; + private Object[] i18nParams; + + public BusinessException(String errorMessage) { + this(-1, errorMessage); + } + + public BusinessException(int errorCode, String errorMessage) { + super(errorMessage); + this.errorCode = errorCode; + this.errorMessage = errorMessage; + } +} diff --git a/blade-common/src/main/java/org/springblade/common/utils/StringPrefixUtils.java b/blade-common/src/main/java/org/springblade/common/utils/StringPrefixUtils.java new file mode 100644 index 0000000..9bd4440 --- /dev/null +++ b/blade-common/src/main/java/org/springblade/common/utils/StringPrefixUtils.java @@ -0,0 +1,46 @@ +package org.springblade.common.utils; + +import org.apache.commons.lang3.StringUtils; + +/** + * @author lqk + * @date 2025-12-05 15:36 + */ +public class StringPrefixUtils { + /** + * 左侧填充指定字符,使字符串长度达到指定值 + * + * @param source 原始字符串(如数字转后的"123") + * @param padChar 填充字符(如"0") + * @param targetLen 目标长度(如6) + * @return 补位后的字符串(如"000123") + */ + public static String prefix(String source, String padChar, int targetLen) { + // 边界1:原始字符串为空 → 填充全指定字符 + if (StringUtils.isBlank(source)) { + return StringUtils.repeat(padChar, targetLen); + } + // 边界2:原始字符串长度≥目标长度 → 直接返回原串(或按需截断) + if (source.length() >= targetLen) { + // 可选:若需截断(如超过6位只保留后6位),打开下面注释 + // return source.substring(source.length() - targetLen); + return source; + } + // 核心逻辑:左侧填充指定字符至目标长度 + return StringUtils.leftPad(source, targetLen, padChar); + } + + /** + * 重载方法(简化数字补零场景,最常用) + * + * @param num + * @param targetLen + * @return + */ + public static String prefixZero(Number num, int targetLen) { + if (num == null) { + return StringUtils.repeat("0", targetLen); + } + return prefix(String.valueOf(num), "0", targetLen); + } +} diff --git a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/order/entity/YieldOrder.java b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/order/entity/YieldOrder.java index 0aa2f94..b86c01e 100644 --- a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/order/entity/YieldOrder.java +++ b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/order/entity/YieldOrder.java @@ -8,7 +8,6 @@ import org.springblade.core.mp.base.BaseEntity; import org.springblade.core.tool.utils.DateUtil; import org.springframework.format.annotation.DateTimeFormat; -import java.math.BigDecimal; import java.util.Date; /** @@ -23,12 +22,6 @@ public class YieldOrder extends BaseEntity { @TableField(exist = false) private static final long serialVersionUID = 1L; - /** - * 生产单号 - */ - @TableField(value = "YO_CODE") - private String yoCode; - /** * 计划单号 */ @@ -36,16 +29,40 @@ public class YieldOrder extends BaseEntity { private String ypCode; /** - * 零件号 + * 面积(㎡) */ - @TableField(value = "PART_CODE") - private String partCode; + @TableField(value = "YP_AREA") + private Double ypArea; /** - * 产品型号 + * 生产数量 */ - @TableField(value = "PRODUCT_TYPE") - private String productType; + @TableField(value = "YP_QTY") + private Long ypQty; + + /** + * 产品系列(mesYieldPlan.PRODUCT_Line) + */ + @TableField(value = "YP_PRODUCT_LINE") + private String ypProductLine; + + /** + * 工作订单备注(mesYieldPlan.memo) + */ + @TableField(value = "YP_MEMO") + private String ypMemo; + + /** + * 生产单号 + */ + @TableField(value = "YO_CODE") + private String yoCode; + + /** + * 零件号 + */ + @TableField(value = "PART_CODE") + private String partCode; /** * 名称 @@ -54,11 +71,10 @@ public class YieldOrder extends BaseEntity { private String partName; /** - * 镀种 + * 产品型号 */ - @TableField(value = "PLATE") - private String plate; - + @TableField(value = "PRODUCT_TYPE") + private String productType; /** * 生产标识 */ @@ -66,16 +82,16 @@ public class YieldOrder extends BaseEntity { private String productIdent; /** - * 使用部门 + * 镀种 */ - @TableField(value = "USE_DEPT") - private String useDept; + @TableField(value = "PLATE") + private String plate; /** - * 面积(㎡) + * 使用部门 */ - @TableField(value = "YP_AREA") - private BigDecimal ypArea; + @TableField(value = "USE_DEPT") + private String useDept; /** * 需求交期 @@ -118,16 +134,10 @@ public class YieldOrder extends BaseEntity { private String batchNo; /** - * 场内生产 + * 是否场内生产 */ @TableField(value = "SITE_WORK") - private String siteWork; - - /** - * 生产数量 - */ - @TableField(value = "YP_QTY") - private Long ypQty; + private Boolean siteWork; /** * B号 @@ -199,7 +209,7 @@ public class YieldOrder extends BaseEntity { * 业务类型 */ @TableField(value = "BUSINESS_TYPE") - private Long businessType; + private Integer businessType; /** * 分派人员 @@ -226,13 +236,13 @@ public class YieldOrder extends BaseEntity { * 手动增加 */ @TableField(value = "MANUAL_INCREASE") - private String manualIncrease; + private Boolean manualIncrease; /** * 订单类型 */ @TableField(value = "YIELD_TYPE") - private Long yieldType; + private Integer yieldType; /** * 父级订单Id @@ -250,7 +260,7 @@ public class YieldOrder extends BaseEntity { * 是否可生产;0:否 1:是 */ @TableField(value = "PRODUCE_BOOL") - private String produceBool; + private Boolean produceBool; /** * 使用部门代码 @@ -258,18 +268,6 @@ public class YieldOrder extends BaseEntity { @TableField(value = "USE_DEPT_CODE") private String useDeptCode; - /** - * 产品系列(mesYieldPlan.PRODUCT_Line) - */ - @TableField(value = "YP_PRODUCT_LINE") - private String ypProductLine; - - /** - * 工作订单备注(mesYieldPlan.memo) - */ - @TableField(value = "YP_MEMO") - private String ypMemo; - /** * 烧结石墨模准备状态 */ @@ -311,15 +309,17 @@ public class YieldOrder extends BaseEntity { private Date kitPreparationTime; /** - * 校验结果,0:通过,1:数据缺失,2:工艺缺失,3:资源缺失,2:交期冲突 + * 校验结果, 校验结果,0:未验证,1:数据缺失,2:工艺缺失,3:资源缺失,4:交期冲突, 5:验证完成 */ @TableField(value = "VALIDATION_RESULT") private Integer validationResult; + /** * 校验描述 */ @TableField(value = "VALIDATION_MOMO") private String validationMomo; + /** * 校验时间 */ @@ -327,6 +327,7 @@ public class YieldOrder extends BaseEntity { @JsonFormat(pattern = DateUtil.PATTERN_DATETIME) @TableField(value = "VALIDATION_TIME") private Date validationTime; + /** * 校验人员 */ @@ -338,4 +339,16 @@ public class YieldOrder extends BaseEntity { */ @TableField(value = "RECEIVE_STATUS") private Integer receiveStatus; + + /** + * 接收人 + */ + @TableField(value = "RECEIVE_USER") + private Long receiveUser; + + /** + * 接收时间 + */ + @TableField(value = "RECEIVE_TIME") + private Date receiveTime; } diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/dashboard/constant/DsPartConst.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/dashboard/constant/DsPartConst.java new file mode 100644 index 0000000..deed7ce --- /dev/null +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/dashboard/constant/DsPartConst.java @@ -0,0 +1,31 @@ +package org.springblade.desk.dashboard.constant; + +/** + * @author lqk + * @date 2025-12-05 16:51 + */ +public interface DsPartConst { + //region 烧结子件种类 + /** + * 插针 + */ + Integer SIN_TER_TYPE_CZ = 1; + /** + * 壳体 + */ + Integer SIN_TER_TYPE_KT = 2; + /** + * 自制玻璃饼 + */ + Integer SIN_TER_TYPE_BLB = 3; + /** + * 其他 + */ + Integer SIN_TER_TYPE_QT = 4; + /** + * 石墨模 + */ + Integer SIN_TER_TYPE_SMM = 5; + + //endregion +} diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/dashboard/pojo/entity/DsPartEntity.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/dashboard/pojo/entity/DsPartEntity.java index cec5cb4..f96f86b 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/dashboard/pojo/entity/DsPartEntity.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/dashboard/pojo/entity/DsPartEntity.java @@ -25,15 +25,15 @@ */ package org.springblade.desk.dashboard.pojo.entity; -import lombok.Data; -import io.swagger.v3.oas.annotations.media.Schema; 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; +import java.util.Date; /** * 零件信息表 实体类 @@ -79,7 +79,7 @@ public class DsPartEntity extends BaseEntity { * 面积 */ @Schema(description = "面积") - private BigDecimal area; + private Double area; /** * 镀种 */ @@ -246,5 +246,11 @@ public class DsPartEntity extends BaseEntity { * 零件类型 */ @Schema(description = "零件类型") - private String sinTerType; + private Integer sinTerType; + + /** + * 定额 + */ + @Schema(description = "定额") + private Double quota; } diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/dashboard/service/IDsCraftService.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/dashboard/service/IDsCraftService.java index 520db58..b2e8d79 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/dashboard/service/IDsCraftService.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/dashboard/service/IDsCraftService.java @@ -26,13 +26,12 @@ package org.springblade.desk.dashboard.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.dashboard.excel.DsCraftExcel; import org.springblade.desk.dashboard.pojo.entity.DsCraftEntity; import org.springblade.desk.dashboard.pojo.vo.DsCraftExpireVO; import org.springblade.desk.dashboard.pojo.vo.DsCraftVO; -import org.springblade.desk.dashboard.excel.DsCraftExcel; -import com.baomidou.mybatisplus.core.metadata.IPage; -import org.springblade.core.mp.base.BaseService; -import org.springblade.desk.dashboard.pojo.vo.DsPartSynthesisVO; import org.springblade.desk.dashboard.pojo.vo.DsProcessSynthesisVO; import java.util.List; @@ -84,4 +83,11 @@ public interface IDsCraftService extends BaseService { * @return */ List getVersion(Long partId); + + /** + * 根据零件ID查询工艺列表 + * @param partId + * @return + */ + List listByPartId(Long partId); } diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/dashboard/service/IDsPartService.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/dashboard/service/IDsPartService.java index 6408777..4f9f6ae 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/dashboard/service/IDsPartService.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/dashboard/service/IDsPartService.java @@ -26,12 +26,11 @@ package org.springblade.desk.dashboard.service; import com.baomidou.mybatisplus.core.conditions.Wrapper; -import org.springblade.desk.dashboard.pojo.entity.DsPartEntity; -import org.springblade.desk.dashboard.pojo.vo.*; -import org.springblade.desk.dashboard.excel.DsPartExcel; import com.baomidou.mybatisplus.core.metadata.IPage; import org.springblade.core.mp.base.BaseService; -import org.springblade.desk.dashboard.service.impl.DsPartServiceImpl; +import org.springblade.desk.dashboard.excel.DsPartExcel; +import org.springblade.desk.dashboard.pojo.entity.DsPartEntity; +import org.springblade.desk.dashboard.pojo.vo.*; import java.util.List; @@ -69,14 +68,25 @@ public interface IDsPartService extends BaseService { /** * 根据零件号查询 + * + * @param partCode + * @return + */ + DsPartEntity selectDsPartByPatCode(String partCode); + + /** + * 根据零件号和零件类型查询子件列表 + * * @param partCode + * @param sinTerType * @return */ - DsPartEntity selectDsPartByPatCode(String partCode); + List selectDsPartByPatCode(String partCode, Integer sinTerType); /** * 指派零件工艺员 - * @param id 零件ID + * + * @param id 零件ID * @param userName 工艺员 */ void assignTechnician(Long id, String userName); @@ -151,8 +161,26 @@ public interface IDsPartService extends BaseService { /** * 烧结树形结构 + * * @param partCode * @return */ List getSimpleTree(String partCode); + + /** + * 根据零件号获取最后一个不是库的b号工艺 + * + * @param partCode + * @return String + */ + String findRoamNoByPartCode(String partCode); + + /** + * 根据B号获取到它的描述信息 + * + * @param partCode + * @param roamNo + * @return + */ + String findNameByRoamNo(String partCode, String roamNo); } diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/dashboard/service/impl/DsCraftServiceImpl.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/dashboard/service/impl/DsCraftServiceImpl.java index 9fe06f6..518ceed 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/dashboard/service/impl/DsCraftServiceImpl.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/dashboard/service/impl/DsCraftServiceImpl.java @@ -25,34 +25,22 @@ */ package org.springblade.desk.dashboard.service.impl; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import org.apache.commons.lang3.ObjectUtils; -import org.springblade.core.log.exception.ServiceException; -import org.springblade.core.tool.utils.Func; -import org.springblade.desk.dashboard.constant.TaskingConstant; +import org.springblade.core.mp.base.BaseServiceImpl; +import org.springblade.desk.dashboard.excel.DsCraftExcel; +import org.springblade.desk.dashboard.mapper.DsCraftMapper; import org.springblade.desk.dashboard.pojo.entity.*; import org.springblade.desk.dashboard.pojo.vo.DsCraftExpireVO; import org.springblade.desk.dashboard.pojo.vo.DsCraftVO; -import org.springblade.desk.dashboard.excel.DsCraftExcel; -import org.springblade.desk.dashboard.mapper.DsCraftMapper; -import org.springblade.desk.dashboard.pojo.vo.DsPartSynthesisVO; import org.springblade.desk.dashboard.pojo.vo.DsProcessSynthesisVO; import org.springblade.desk.dashboard.service.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; 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 org.springframework.util.StringUtils; - -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.ZoneId; -import java.time.format.DateTimeFormatter; -import java.util.Date; + import java.util.List; import java.util.Objects; import java.util.stream.Collectors; @@ -141,4 +129,11 @@ public class DsCraftServiceImpl extends BaseServiceImpl listByPartId(Long partId) { + Wrapper queryWrapper = Wrappers.lambdaQuery(DsCraftEntity.class) + .eq(DsCraftEntity::getPartId, partId); + return baseMapper.selectList(queryWrapper); + } + } diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/dashboard/service/impl/DsPartServiceImpl.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/dashboard/service/impl/DsPartServiceImpl.java index aed369b..a5435ca 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/dashboard/service/impl/DsPartServiceImpl.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/dashboard/service/impl/DsPartServiceImpl.java @@ -25,6 +25,7 @@ */ package org.springblade.desk.dashboard.service.impl; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import org.springblade.core.log.exception.ServiceException; import org.springblade.core.tool.utils.Func; import org.springblade.desk.dashboard.constant.TaskingConstant; @@ -141,6 +142,14 @@ public class DsPartServiceImpl extends BaseServiceImpl selectDsPartByPatCode(String partCode, Integer sinTerType) { + Wrapper queryWrapper = Wrappers.lambdaQuery(DsPartEntity.class) + .eq(DsPartEntity::getPartCode, partCode) + .eq(DsPartEntity::getSinTerType, sinTerType); + return baseMapper.selectList(queryWrapper); + } + @Override public void assignTechnician(Long id, String userName) { DsPartEntity partEntity = new DsPartEntity(); @@ -151,7 +160,7 @@ public class DsPartServiceImpl extends BaseServiceImpl { /** * 订单校验-数据 * - * @param yieldOrderId + * @param yieldOrder * @return */ - Boolean verifyYieldOrderData(String yieldOrderId); + Boolean verifyYieldOrderData(YieldOrder yieldOrder); /** * 订单校验-工艺 * - * @param yieldOrderId + * @param yieldOrder * @return */ - Boolean verifyYieldOrderCraft(String yieldOrderId); + Boolean verifyYieldOrderCraft(YieldOrder yieldOrder); /** * 订单校验-资源 * - * @param yieldOrderId + * @param yieldOrder * @return */ - Boolean verifyYieldOrderResource(String yieldOrderId); + Boolean verifyYieldOrderResource(YieldOrder yieldOrder); /** * 订单校验-交期 * - * @param yieldOrderId + * @param yieldOrder + * @return + */ + Boolean verifyYieldOrderDelivery(YieldOrder yieldOrder); + + /** + * 生成烧结子件订单 + * + * @param pjYieldOrder 烧结订单 + * @param isManual 是否手动创建 + * @param receiveUser 接收人ID + * @throws BusinessException + * @date 2023-08-25 13:37 + */ + void saveSubYieldOrder(YieldOrder pjYieldOrder, Boolean isManual, Long receiveUser) throws BusinessException; + + /** + * 根据父级订单id查询子件订单 + * + * @param fatherYoId * @return */ - Boolean verifyYieldOrderDelivery(String yieldOrderId); + List listByFatherYoId(Long fatherYoId); } 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 5562910..84c6844 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 @@ -3,25 +3,43 @@ 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 org.apache.commons.lang3.StringUtils; +import org.springblade.common.exception.BusinessException; +import org.springblade.common.utils.StringPrefixUtils; import org.springblade.core.mp.base.BaseServiceImpl; +import org.springblade.core.tool.utils.BeanUtil; +import org.springblade.core.tool.utils.DateUtil; import org.springblade.core.tool.utils.ObjectUtil; +import org.springblade.desk.dashboard.constant.DsPartConst; +import org.springblade.desk.dashboard.pojo.entity.DsCraftEntity; +import org.springblade.desk.dashboard.pojo.entity.DsPartEntity; +import org.springblade.desk.dashboard.service.IDsCraftService; +import org.springblade.desk.dashboard.service.IDsPartService; import org.springblade.desk.order.constant.YieldOrderConst; import org.springblade.desk.order.entity.YieldOrder; import org.springblade.desk.order.mapper.YieldOrderMapper; import org.springblade.desk.order.service.IYieldOrderService; import org.springframework.stereotype.Service; +import java.text.MessageFormat; import java.util.ArrayList; import java.util.List; +import java.util.Random; /** * 服务实现类 * * @author BladeX */ +@RequiredArgsConstructor @Service public class YieldOrderServiceImpl extends BaseServiceImpl implements IYieldOrderService { + private final IDsPartService dsPartService; + + private final IDsCraftService dsCraftService; + @Override public IPage selectPage(IPage page, YieldOrder entity) { List dataList = baseMapper.selectPage(page, entity); @@ -66,24 +84,299 @@ public class YieldOrderServiceImpl extends BaseServiceImpl wrapper = Wrappers.lambdaQuery(YieldOrder.class) + .eq(YieldOrder::getYoCode, yieldOrder.getYoCode()) + .ne(YieldOrder::getId, yieldOrder.getId()); + YieldOrder yieldOrderCheck = baseMapper.selectOne(wrapper); + if (ObjectUtil.isNotEmpty(yieldOrderCheck)) { + yieldOrder.setValidationResult(YieldOrderConst.VALIDATION_RESULT_LESS_DATA); + yieldOrder.setValidationTime(DateUtil.now()); + yieldOrder.setValidationMomo("已存在该流程卡号的数据"); + this.updateById(yieldOrder); + return false; + } + + // 2. 当生产订单类型为:表处理,壳体,插针订单,当镀种为空或面积为0时,不得自动分派并提示 + if (YieldOrderConst.YIELD_TYPE_1.equals(yieldOrder.getYieldType()) || YieldOrderConst.YIELD_TYPE_4.equals(yieldOrder.getYieldType()) || YieldOrderConst.YIELD_TYPE_5.equals(yieldOrder.getYieldType())) { + if (StringUtils.isBlank(yieldOrder.getPlate()) || yieldOrder.getYpArea() == 0) { + yieldOrder.setValidationResult(YieldOrderConst.VALIDATION_RESULT_LESS_DATA); + yieldOrder.setValidationTime(DateUtil.now()); + yieldOrder.setValidationMomo("生产订单中镀种或面积为空,请维护基础数据"); + this.updateById(yieldOrder); + return false; + } + } + + // 3. 玻璃饼订单工艺路线包含外购不再自动分派,直接关闭订单 + if (YieldOrderConst.YIELD_TYPE_3.equals(yieldOrder.getYieldType()) && yieldOrder.getPrimaryCraft().contains(YieldOrderConst.PRIMARY_CRAFT_WG)) { + yieldOrder.setStatus(YieldOrderConst.STATUS_CLOSED); + yieldOrder.setValidationTime(DateUtil.now()); + yieldOrder.setValidationMomo("玻璃饼订单工艺路线包含外购,关闭订单无需自动分派"); + this.updateById(yieldOrder); + return true; + } + + // 4. 如果是烧结订单并且不是返工单据,则需要验证子件清单是否存在,存在跳过,不存在则新增 + if (YieldOrderConst.YIELD_TYPE_2.equals(yieldOrder.getYieldType()) && StringUtils.isBlank(yieldOrder.getReworkCode())) { + //验证订单是否存在当前B号,如果不存在则不能下发 + if (StringUtils.isBlank(yieldOrder.getRoamNo())) { + yieldOrder.setValidationResult(YieldOrderConst.VALIDATION_RESULT_LESS_DATA); + yieldOrder.setValidationTime(DateUtil.now()); + yieldOrder.setValidationMomo("订单不存在B号,请手动匹配B号!"); + this.updateById(yieldOrder); + return false; + } + + String roamNoText = dsPartService.findNameByRoamNo(yieldOrder.getPartCode(), yieldOrder.getRoamNo()); + if (StringUtils.isBlank(roamNoText)) { + yieldOrder.setValidationResult(YieldOrderConst.VALIDATION_RESULT_LESS_DATA); + yieldOrder.setValidationTime(DateUtil.now()); + yieldOrder.setValidationMomo("未找到ERP一级B号路线,请核查!"); + this.updateById(yieldOrder); + } + // 验证烧结订单的b号描述,如果包含封接字样则验证子件,不包含则不验证 + if (roamNoText.contains(YieldOrderConst.ROAMNO_TEXT_FJ)) { + try { + this.saveSubYieldOrder(yieldOrder, Boolean.FALSE, yieldOrder.getReceiveUser()); + } catch (BusinessException e) { + yieldOrder.setValidationResult(YieldOrderConst.VALIDATION_RESULT_LESS_DATA); + yieldOrder.setValidationTime(DateUtil.now()); + yieldOrder.setValidationMomo(e.getErrorMessage()); + this.updateById(yieldOrder); + } + } + } + + //TODO 急件维护标识厂内 +// pjAutomaticDispatchService.urgentUpholdOrder(yieldOrder); + + return true; } @Override - public Boolean verifyYieldOrderCraft(String yieldOrderId) { + public Boolean verifyYieldOrderCraft(YieldOrder yieldOrder) { + //TODO 匹配工艺 + if (StringUtils.isBlank(yieldOrder.getReworkCode())) { +// pjYieldCraftService.renewYieldCraft(yieldOrder); + } return null; } @Override - public Boolean verifyYieldOrderResource(String yieldOrderId) { + public Boolean verifyYieldOrderResource(YieldOrder yieldOrder) { return null; } @Override - public Boolean verifyYieldOrderDelivery(String yieldOrderId) { + public Boolean verifyYieldOrderDelivery(YieldOrder yieldOrder) { + // 根据工艺, 计算订单的额定加工时长 + + // 交期时间-当前时间, 与 额定加工时长对比, 判断是否有超期风险 return null; } + @Override + public void saveSubYieldOrder(YieldOrder yieldOrder, Boolean isManual, Long receiveUser) throws BusinessException { + // 验证是否存在玻璃饼子件信息 + this.checkSub(yieldOrder.getPartCode(), DsPartConst.SIN_TER_TYPE_BLB, "玻璃饼"); + + //查询所有的烧结子件清单 + List subList = new ArrayList<>(); + subList.addAll(this.checkSub(yieldOrder.getPartCode(), DsPartConst.SIN_TER_TYPE_SMM, "石墨模")); + subList.addAll(this.checkSub(yieldOrder.getPartCode(), DsPartConst.SIN_TER_TYPE_KT, "壳体")); + subList.addAll(this.checkSub(yieldOrder.getPartCode(), DsPartConst.SIN_TER_TYPE_CZ, "插针")); + if (subList.size() == 0) { + throw new BusinessException("未找到烧结前处理子件信息,请联系工艺编制!"); + } + //获取已经产生的烧结子件清单 + List subYieldOrderList = this.listByFatherYoId(yieldOrder.getFatherYoId()); + List keyLst = new ArrayList<>(); + List returnList = new ArrayList<>(); + if (subYieldOrderList.size() > 0) { + //组装已生成的子件号和父级订单id + for (YieldOrder yo : subYieldOrderList) { + keyLst.add(yieldOrder.getId() + "_" + yo.getPartCode()); + } + //剔除已经生成生成订单的子件 + for (DsPartEntity sub : subList) { + if (!keyLst.contains(yieldOrder.getId() + "_" + sub.getPartCode())) { + returnList.add(sub); + } + } + } else { + returnList.addAll(subList); + } + if (returnList != null && returnList.size() > 0) { + this.createSubYieldOrder(yieldOrder, returnList, isManual, receiveUser); + } + } + + @Override + public List listByFatherYoId(Long fatherYoId) { + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(YieldOrder.class).eq(YieldOrder::getFatherYoId, fatherYoId); + List subYieldOrderList = this.list(wrapper); + return subYieldOrderList; + } + + /** + * 验证零件子件信息 + * + * @param partCode + * @param sinTerType + * @param text + */ + private List checkSub(String partCode, Integer sinTerType, String text) throws BusinessException { + // 按零件号查询子件 + List lst = dsPartService.selectDsPartByPatCode(partCode, sinTerType); + if (lst == null || lst.size() == 0) { + String errMsg = MessageFormat.format("未找到{0}子件信息!", text); + throw new BusinessException(errMsg); + } + return lst; + } + + /** + * 验证并创建子件 + * + * @param yieldOrder + * @param subList + * @param receiveUser + */ + private void createSubYieldOrder(YieldOrder yieldOrder, List subList, Boolean isManual, Long receiveUser) throws BusinessException { + List dsCraftList; + for (DsPartEntity dsPartSub : subList) { + //如果子件号为空或者是无,则跳过 + if (StringUtils.isBlank(dsPartSub.getPartCode()) || dsPartSub.getPartCode().equals("无")) { + continue; + } + DsPartEntity dsPart = dsPartService.selectDsPartByPatCode(dsPartSub.getPartCode()); + //验证子件是否存在对应零件,不存在则提示异常 + if (dsPart == null) { + String errMsg = MessageFormat.format("子件{0}未编制!", dsPartSub.getPartCode()); + throw new BusinessException(errMsg); + } + Integer yieldType = YieldOrderConst.YIELD_TYPE_6; + if (DsPartConst.SIN_TER_TYPE_KT.equals(dsPartSub.getSinTerType())) { + yieldType = YieldOrderConst.YIELD_TYPE_4; + } else if (DsPartConst.SIN_TER_TYPE_CZ.equals(dsPartSub.getSinTerType())) { + yieldType = YieldOrderConst.YIELD_TYPE_5; + } + //非石墨模子件,面积不允许为空 + if (!yieldType.equals(YieldOrderConst.YIELD_TYPE_6) && dsPart.getArea() == null) { + String errMsg = "非石墨模子件面积为空无法创建生产订单!"; + throw new BusinessException(errMsg); + } + //验证子件是否存在二级工艺路线 + dsCraftList = dsCraftService.listByPartId(dsPart.getId()); + if (dsCraftList == null || dsCraftList.size() == 0) { + String errMsg = MessageFormat.format("子件{0}未编制二级工艺!", dsPartSub.getPartCode()); + throw new BusinessException(errMsg); + } + + //获取金属件子件B号,如果未获取到,提示异常 + String roamNo = null; + if (DsPartConst.SIN_TER_TYPE_KT.equals(dsPartSub.getSinTerType()) || DsPartConst.SIN_TER_TYPE_CZ.equals(dsPartSub.getSinTerType())) { + roamNo = dsPartService.findRoamNoByPartCode(dsPartSub.getPartCode()); + if (StringUtils.isBlank(roamNo)) { + String errMsg = MessageFormat.format("子件{0}未找到对应B号,请在ERP核查子件一级路线!", dsPartSub.getPartCode()); + throw new BusinessException(errMsg); + } + } + YieldOrder subYield = BeanUtil.copy(yieldOrder, YieldOrder.class); + subYield.setFatherYoId(yieldOrder.getId()); + subYield.setYoCode(nextYieldOrderCode(yieldOrder.getYoCode())); + subYield.setPartCode(dsPart.getPartCode()); + subYield.setProductType(dsPart.getProductType()); + subYield.setPartName(dsPart.getPartName()); + subYield.setPlate(dsPart.getPlate()); + subYield.setUseDept("热表分厂"); + subYield.setYpArea(dsPart.getArea() == null ? 0d : dsPart.getArea()); + subYield.setDemandDate(DateUtil.minusDays(DateUtil.now(), 2)); + subYield.setReleaseDate(DateUtil.now()); + subYield.setCardNo(nextCardNo()); + subYield.setBatchNo(nextBatchNo()); + subYield.setSiteWork(Boolean.TRUE); + subYield.setYpQty(yieldOrder.getYpQty() * dsPartSub.getQuota().intValue()); + subYield.setPrimaryCraft(dsPart.getCraftWay()); + subYield.setRoamNo(roamNo); + subYield.setStatus(YieldOrderConst.STATUS_NORMAL); + subYield.setYieldType(yieldType); + subYield.setEntrustDept("热表分厂"); + subYield.setBusinessType(-1); + // 父件订单中无接收人信息时, 以当前人为接收人 + if (yieldOrder.getReceiveUser() == null) { + subYield.setReceiveUser(receiveUser); + } + if (yieldOrder.getReceiveTime() == null) { + subYield.setReceiveTime(DateUtil.now()); + } + subYield.setProduceBool(Boolean.FALSE); + if (isManual) { + subYield.setManualIncrease(Boolean.TRUE); + subYield.setMemo("手动创建子件"); + } + this.save(subYield); + } + } + + private String nextYieldOrderCode(String yoCode) { + // 自增总长度 + int len = 2; + // 自增值 + Integer num = 0; + + // 编码模式 + String codePattern = yoCode.toString() + "-B"; + + // 当前模式下最大编码 + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(YieldOrder.class).likeRight(YieldOrder::getYoCode, codePattern).orderBy(true, false, YieldOrder::getYoCode); + YieldOrder yieldOrder = baseMapper.selectOne(wrapper); + + if (yieldOrder != null) { + num = Integer.parseInt(yieldOrder.getYoCode().substring(codePattern.length())); + } + + num++; + + // 下个编码 + return codePattern + StringPrefixUtils.prefix(String.valueOf(num), "0", len); + } + + private String nextCardNo() { + // 自增总长度 + int len = 5; + String codePattern = "R" + DateUtil.today() + StringPrefixUtils.prefix(String.valueOf(new Random().nextInt(10000)), "0", len); + + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(YieldOrder.class).eq(YieldOrder::getCardNo, codePattern); + YieldOrder yieldOrder = baseMapper.selectOne(wrapper); + + if (yieldOrder != null && yieldOrder.getId() != null) { + return this.nextCardNo(); + } else { + return codePattern; + } + } + + private String nextBatchNo() { + // 自增总长度 + int len = 3; + // 自增值 + int num = 0; + + // 编码模式 + String codePattern = "R" + DateUtil.today(); + + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(YieldOrder.class).likeRight(YieldOrder::getBatchNo, codePattern).orderBy(true, false, YieldOrder::getYoCode); + YieldOrder yieldOrder = baseMapper.selectOne(wrapper); + + if (yieldOrder != null) { + num = Integer.parseInt(yieldOrder.getBatchNo().substring(codePattern.length(), codePattern.length() + len)); + } + num++; + // 下个编码 + return codePattern + StringPrefixUtils.prefix(String.valueOf(num), "0", len); + } }