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);
+ }
}