订单相关提交

develop-QA^2
liuqingkun 1 week ago
parent cda789adcb
commit ee43fb65a9
  1. 4
      blade-common/pom.xml
  2. 26
      blade-common/src/main/java/org/springblade/common/exception/BusinessException.java
  3. 46
      blade-common/src/main/java/org/springblade/common/utils/StringPrefixUtils.java
  4. 109
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/order/entity/YieldOrder.java
  5. 31
      blade-service/blade-desk/src/main/java/org/springblade/desk/dashboard/constant/DsPartConst.java
  6. 20
      blade-service/blade-desk/src/main/java/org/springblade/desk/dashboard/pojo/entity/DsPartEntity.java
  7. 14
      blade-service/blade-desk/src/main/java/org/springblade/desk/dashboard/service/IDsCraftService.java
  8. 40
      blade-service/blade-desk/src/main/java/org/springblade/desk/dashboard/service/IDsPartService.java
  9. 33
      blade-service/blade-desk/src/main/java/org/springblade/desk/dashboard/service/impl/DsCraftServiceImpl.java
  10. 35
      blade-service/blade-desk/src/main/java/org/springblade/desk/dashboard/service/impl/DsPartServiceImpl.java
  11. 15
      blade-service/blade-desk/src/main/java/org/springblade/desk/order/constant/YieldOrderConst.java
  12. 36
      blade-service/blade-desk/src/main/java/org/springblade/desk/order/service/IYieldOrderService.java
  13. 303
      blade-service/blade-desk/src/main/java/org/springblade/desk/order/service/impl/YieldOrderServiceImpl.java

@ -27,6 +27,10 @@
<artifactId>blade-core-auto</artifactId> <artifactId>blade-core-auto</artifactId>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<dependency>
<groupId>org.springblade</groupId>
<artifactId>blade-core-tool</artifactId>
</dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId></dependency>
</dependencies> </dependencies>
<build> <build>

@ -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;
}
}

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

@ -8,7 +8,6 @@ import org.springblade.core.mp.base.BaseEntity;
import org.springblade.core.tool.utils.DateUtil; import org.springblade.core.tool.utils.DateUtil;
import org.springframework.format.annotation.DateTimeFormat; import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.util.Date; import java.util.Date;
/** /**
@ -23,12 +22,6 @@ public class YieldOrder extends BaseEntity {
@TableField(exist = false) @TableField(exist = false)
private static final long serialVersionUID = 1L; 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; private String ypCode;
/** /**
* 零件号 * 面积
*/ */
@TableField(value = "PART_CODE") @TableField(value = "YP_AREA")
private String partCode; private Double ypArea;
/** /**
* 产品型号 * 生产数量
*/ */
@TableField(value = "PRODUCT_TYPE") @TableField(value = "YP_QTY")
private String productType; 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; private String partName;
/** /**
* 镀种 * 产品型号
*/ */
@TableField(value = "PLATE") @TableField(value = "PRODUCT_TYPE")
private String plate; private String productType;
/** /**
* 生产标识 * 生产标识
*/ */
@ -66,16 +82,16 @@ public class YieldOrder extends BaseEntity {
private String productIdent; private String productIdent;
/** /**
* 使用部门 * 镀种
*/ */
@TableField(value = "USE_DEPT") @TableField(value = "PLATE")
private String useDept; private String plate;
/** /**
* 面积 * 使用部门
*/ */
@TableField(value = "YP_AREA") @TableField(value = "USE_DEPT")
private BigDecimal ypArea; private String useDept;
/** /**
* 需求交期 * 需求交期
@ -118,16 +134,10 @@ public class YieldOrder extends BaseEntity {
private String batchNo; private String batchNo;
/** /**
* 场内生产 * 是否场内生产
*/ */
@TableField(value = "SITE_WORK") @TableField(value = "SITE_WORK")
private String siteWork; private Boolean siteWork;
/**
* 生产数量
*/
@TableField(value = "YP_QTY")
private Long ypQty;
/** /**
* B号 * B号
@ -199,7 +209,7 @@ public class YieldOrder extends BaseEntity {
* 业务类型 * 业务类型
*/ */
@TableField(value = "BUSINESS_TYPE") @TableField(value = "BUSINESS_TYPE")
private Long businessType; private Integer businessType;
/** /**
* 分派人员 * 分派人员
@ -226,13 +236,13 @@ public class YieldOrder extends BaseEntity {
* 手动增加 * 手动增加
*/ */
@TableField(value = "MANUAL_INCREASE") @TableField(value = "MANUAL_INCREASE")
private String manualIncrease; private Boolean manualIncrease;
/** /**
* 订单类型 * 订单类型
*/ */
@TableField(value = "YIELD_TYPE") @TableField(value = "YIELD_TYPE")
private Long yieldType; private Integer yieldType;
/** /**
* 父级订单Id * 父级订单Id
@ -250,7 +260,7 @@ public class YieldOrder extends BaseEntity {
* 是否可生产;0: 1 * 是否可生产;0: 1
*/ */
@TableField(value = "PRODUCE_BOOL") @TableField(value = "PRODUCE_BOOL")
private String produceBool; private Boolean produceBool;
/** /**
* 使用部门代码 * 使用部门代码
@ -258,18 +268,6 @@ public class YieldOrder extends BaseEntity {
@TableField(value = "USE_DEPT_CODE") @TableField(value = "USE_DEPT_CODE")
private String useDeptCode; 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; private Date kitPreparationTime;
/** /**
* 校验结果0通过1数据缺失2工艺缺失3资源缺失2交期冲突 * 校验结果 校验结果0未验证1数据缺失2工艺缺失3资源缺失4交期冲突, 5:验证完成
*/ */
@TableField(value = "VALIDATION_RESULT") @TableField(value = "VALIDATION_RESULT")
private Integer validationResult; private Integer validationResult;
/** /**
* 校验描述 * 校验描述
*/ */
@TableField(value = "VALIDATION_MOMO") @TableField(value = "VALIDATION_MOMO")
private String validationMomo; private String validationMomo;
/** /**
* 校验时间 * 校验时间
*/ */
@ -327,6 +327,7 @@ public class YieldOrder extends BaseEntity {
@JsonFormat(pattern = DateUtil.PATTERN_DATETIME) @JsonFormat(pattern = DateUtil.PATTERN_DATETIME)
@TableField(value = "VALIDATION_TIME") @TableField(value = "VALIDATION_TIME")
private Date validationTime; private Date validationTime;
/** /**
* 校验人员 * 校验人员
*/ */
@ -338,4 +339,16 @@ public class YieldOrder extends BaseEntity {
*/ */
@TableField(value = "RECEIVE_STATUS") @TableField(value = "RECEIVE_STATUS")
private Integer receiveStatus; private Integer receiveStatus;
/**
* 接收人
*/
@TableField(value = "RECEIVE_USER")
private Long receiveUser;
/**
* 接收时间
*/
@TableField(value = "RECEIVE_TIME")
private Date receiveTime;
} }

@ -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
}

@ -25,15 +25,15 @@
*/ */
package org.springblade.desk.dashboard.pojo.entity; 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 com.baomidou.mybatisplus.annotation.TableName;
import java.math.BigDecimal; import io.swagger.v3.oas.annotations.media.Schema;
import java.util.Date; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import org.springblade.core.mp.base.BaseEntity; import org.springblade.core.mp.base.BaseEntity;
import org.springblade.core.tenant.mp.TenantEntity;
import java.io.Serial; import java.io.Serial;
import java.math.BigDecimal;
import java.util.Date;
/** /**
* 零件信息表 实体类 * 零件信息表 实体类
@ -79,7 +79,7 @@ public class DsPartEntity extends BaseEntity {
* 面积 * 面积
*/ */
@Schema(description = "面积") @Schema(description = "面积")
private BigDecimal area; private Double area;
/** /**
* 镀种 * 镀种
*/ */
@ -246,5 +246,11 @@ public class DsPartEntity extends BaseEntity {
* 零件类型 * 零件类型
*/ */
@Schema(description = "零件类型") @Schema(description = "零件类型")
private String sinTerType; private Integer sinTerType;
/**
* 定额
*/
@Schema(description = "定额")
private Double quota;
} }

@ -26,13 +26,12 @@
package org.springblade.desk.dashboard.service; package org.springblade.desk.dashboard.service;
import com.baomidou.mybatisplus.core.conditions.Wrapper; 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.entity.DsCraftEntity;
import org.springblade.desk.dashboard.pojo.vo.DsCraftExpireVO; import org.springblade.desk.dashboard.pojo.vo.DsCraftExpireVO;
import org.springblade.desk.dashboard.pojo.vo.DsCraftVO; 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 org.springblade.desk.dashboard.pojo.vo.DsProcessSynthesisVO;
import java.util.List; import java.util.List;
@ -84,4 +83,11 @@ public interface IDsCraftService extends BaseService<DsCraftEntity> {
* @return * @return
*/ */
List<DsCraftExpireVO> getVersion(Long partId); List<DsCraftExpireVO> getVersion(Long partId);
/**
* 根据零件ID查询工艺列表
* @param partId
* @return
*/
List<DsCraftEntity> listByPartId(Long partId);
} }

@ -26,12 +26,11 @@
package org.springblade.desk.dashboard.service; package org.springblade.desk.dashboard.service;
import com.baomidou.mybatisplus.core.conditions.Wrapper; 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 com.baomidou.mybatisplus.core.metadata.IPage;
import org.springblade.core.mp.base.BaseService; 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; import java.util.List;
@ -69,14 +68,25 @@ public interface IDsPartService extends BaseService<DsPartEntity> {
/** /**
* 根据零件号查询 * 根据零件号查询
*
* @param partCode
* @return
*/
DsPartEntity selectDsPartByPatCode(String partCode);
/**
* 根据零件号和零件类型查询子件列表
*
* @param partCode * @param partCode
* @param sinTerType
* @return * @return
*/ */
DsPartEntity selectDsPartByPatCode(String partCode); List<DsPartEntity> selectDsPartByPatCode(String partCode, Integer sinTerType);
/** /**
* 指派零件工艺员 * 指派零件工艺员
* @param id 零件ID *
* @param id 零件ID
* @param userName 工艺员 * @param userName 工艺员
*/ */
void assignTechnician(Long id, String userName); void assignTechnician(Long id, String userName);
@ -151,8 +161,26 @@ public interface IDsPartService extends BaseService<DsPartEntity> {
/** /**
* 烧结树形结构 * 烧结树形结构
*
* @param partCode * @param partCode
* @return * @return
*/ */
List<DsPartTreeVO> getSimpleTree(String partCode); List<DsPartTreeVO> getSimpleTree(String partCode);
/**
* 根据零件号获取最后一个不是库的b号工艺
*
* @param partCode
* @return String
*/
String findRoamNoByPartCode(String partCode);
/**
* 根据B号获取到它的描述信息
*
* @param partCode
* @param roamNo
* @return
*/
String findNameByRoamNo(String partCode, String roamNo);
} }

@ -25,34 +25,22 @@
*/ */
package org.springblade.desk.dashboard.service.impl; 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.apache.commons.lang3.ObjectUtils;
import org.springblade.core.log.exception.ServiceException; import org.springblade.core.mp.base.BaseServiceImpl;
import org.springblade.core.tool.utils.Func; import org.springblade.desk.dashboard.excel.DsCraftExcel;
import org.springblade.desk.dashboard.constant.TaskingConstant; import org.springblade.desk.dashboard.mapper.DsCraftMapper;
import org.springblade.desk.dashboard.pojo.entity.*; import org.springblade.desk.dashboard.pojo.entity.*;
import org.springblade.desk.dashboard.pojo.vo.DsCraftExpireVO; import org.springblade.desk.dashboard.pojo.vo.DsCraftExpireVO;
import org.springblade.desk.dashboard.pojo.vo.DsCraftVO; 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.pojo.vo.DsProcessSynthesisVO;
import org.springblade.desk.dashboard.service.*; import org.springblade.desk.dashboard.service.*;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy; import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service; 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.List;
import java.util.Objects; import java.util.Objects;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -141,4 +129,11 @@ public class DsCraftServiceImpl extends BaseServiceImpl<DsCraftMapper, DsCraftEn
return craftMapper.selectDsCraftByPartId(partId); return craftMapper.selectDsCraftByPartId(partId);
} }
@Override
public List<DsCraftEntity> listByPartId(Long partId) {
Wrapper<DsCraftEntity> queryWrapper = Wrappers.lambdaQuery(DsCraftEntity.class)
.eq(DsCraftEntity::getPartId, partId);
return baseMapper.selectList(queryWrapper);
}
} }

@ -25,6 +25,7 @@
*/ */
package org.springblade.desk.dashboard.service.impl; 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.log.exception.ServiceException;
import org.springblade.core.tool.utils.Func; import org.springblade.core.tool.utils.Func;
import org.springblade.desk.dashboard.constant.TaskingConstant; import org.springblade.desk.dashboard.constant.TaskingConstant;
@ -141,6 +142,14 @@ public class DsPartServiceImpl extends BaseServiceImpl<DsPartMapper, DsPartEntit
return dsPartMapper.selectDsPartByPatCode(partCode); return dsPartMapper.selectDsPartByPatCode(partCode);
} }
@Override
public List<DsPartEntity> selectDsPartByPatCode(String partCode, Integer sinTerType) {
Wrapper<DsPartEntity> queryWrapper = Wrappers.lambdaQuery(DsPartEntity.class)
.eq(DsPartEntity::getPartCode, partCode)
.eq(DsPartEntity::getSinTerType, sinTerType);
return baseMapper.selectList(queryWrapper);
}
@Override @Override
public void assignTechnician(Long id, String userName) { public void assignTechnician(Long id, String userName) {
DsPartEntity partEntity = new DsPartEntity(); DsPartEntity partEntity = new DsPartEntity();
@ -151,7 +160,7 @@ public class DsPartServiceImpl extends BaseServiceImpl<DsPartMapper, DsPartEntit
@Override @Override
public boolean syncPdmPart(DsPartEntity dsPart) { public boolean syncPdmPart(DsPartEntity dsPart) {
if(null == dsPart){ if (null == dsPart) {
return false; return false;
} }
@ -353,14 +362,28 @@ public class DsPartServiceImpl extends BaseServiceImpl<DsPartMapper, DsPartEntit
public int compareDateOnly(Date date1, Date date2) { public int compareDateOnly(Date date1, Date date2) {
LocalDate localDate1 = date1.toInstant() LocalDate localDate1 = date1.toInstant()
.atZone(ZoneId.systemDefault()) .atZone(ZoneId.systemDefault())
.toLocalDate(); .toLocalDate();
LocalDate localDate2 = date2.toInstant() LocalDate localDate2 = date2.toInstant()
.atZone(ZoneId.systemDefault()) .atZone(ZoneId.systemDefault())
.toLocalDate(); .toLocalDate();
return localDate1.compareTo(localDate2); return localDate1.compareTo(localDate2);
} }
@Override
public String findRoamNoByPartCode(String partCode) {
//TODO 到ERP数据中查询数据
// sb.append(" select b.firseq from ( select a.* from dba_mgr.v_mes_rb_partoplink@erp_mes_link a ");
// sb.append(" where a.prtno=:partCode and a.firseqname not like '库%' order by a.firseqno desc ");
// sb.append(" ) b where rownum=1 ");
return null;
}
@Override
public String findNameByRoamNo(String partCode, String roamNo) {
//TODO 到ERP数据中查询数据
// sb.append(" select a.firseqname from dba_mgr.v_mes_rb_partoplink@erp_mes_link a ");
// sb.append(" where a.prtno=:partCode and a.firseq=:roamNo ");
return null;
}
} }

@ -120,11 +120,12 @@ public interface YieldOrderConst {
Integer PRIORITY_ERP_SCH_IMP = 5; Integer PRIORITY_ERP_SCH_IMP = 5;
//endregion //endregion
//region 生产订单 校验结果,0:通过,1:数据缺失,2:工艺缺失,3:资源缺失,2:交期冲突 //region 生产订单 校验结果,0:未验证,1:数据缺失,2:工艺缺失,3:资源缺失,4:交期冲突, 5:验证完成
/** /**
* 通过 * 未验证
*/ */
Integer VALIDATION_RESULT_PASS = 0; Integer VALIDATION_NO = 0;
/** /**
* 数据缺失 * 数据缺失
*/ */
@ -141,5 +142,13 @@ public interface YieldOrderConst {
* 交期冲突 * 交期冲突
*/ */
Integer VALIDATION_RESULT_DELIVERY = 4; Integer VALIDATION_RESULT_DELIVERY = 4;
/**
* 验证完成
*/
Integer VALIDATION_RESULT_PASS = 5;
//endregion //endregion
String PRIMARY_CRAFT_WG = "外购";
String ROAMNO_TEXT_FJ = "封接";
} }

@ -2,6 +2,7 @@ package org.springblade.desk.order.service;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotEmpty;
import org.springblade.common.exception.BusinessException;
import org.springblade.core.mp.base.BaseService; import org.springblade.core.mp.base.BaseService;
import org.springblade.desk.order.entity.YieldOrder; import org.springblade.desk.order.entity.YieldOrder;
@ -52,32 +53,51 @@ public interface IYieldOrderService extends BaseService<YieldOrder> {
/** /**
* 订单校验-数据 * 订单校验-数据
* *
* @param yieldOrderId * @param yieldOrder
* @return * @return
*/ */
Boolean verifyYieldOrderData(String yieldOrderId); Boolean verifyYieldOrderData(YieldOrder yieldOrder);
/** /**
* 订单校验-工艺 * 订单校验-工艺
* *
* @param yieldOrderId * @param yieldOrder
* @return * @return
*/ */
Boolean verifyYieldOrderCraft(String yieldOrderId); Boolean verifyYieldOrderCraft(YieldOrder yieldOrder);
/** /**
* 订单校验-资源 * 订单校验-资源
* *
* @param yieldOrderId * @param yieldOrder
* @return * @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 * @return
*/ */
Boolean verifyYieldOrderDelivery(String yieldOrderId); List<YieldOrder> listByFatherYoId(Long fatherYoId);
} }

@ -3,25 +3,43 @@ package org.springblade.desk.order.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; 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.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.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.constant.YieldOrderConst;
import org.springblade.desk.order.entity.YieldOrder; import org.springblade.desk.order.entity.YieldOrder;
import org.springblade.desk.order.mapper.YieldOrderMapper; import org.springblade.desk.order.mapper.YieldOrderMapper;
import org.springblade.desk.order.service.IYieldOrderService; import org.springblade.desk.order.service.IYieldOrderService;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.text.MessageFormat;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Random;
/** /**
* 服务实现类 * 服务实现类
* *
* @author BladeX * @author BladeX
*/ */
@RequiredArgsConstructor
@Service @Service
public class YieldOrderServiceImpl extends BaseServiceImpl<YieldOrderMapper, YieldOrder> implements IYieldOrderService { public class YieldOrderServiceImpl extends BaseServiceImpl<YieldOrderMapper, YieldOrder> implements IYieldOrderService {
private final IDsPartService dsPartService;
private final IDsCraftService dsCraftService;
@Override @Override
public IPage<YieldOrder> selectPage(IPage<YieldOrder> page, YieldOrder entity) { public IPage<YieldOrder> selectPage(IPage<YieldOrder> page, YieldOrder entity) {
List<YieldOrder> dataList = baseMapper.selectPage(page, entity); List<YieldOrder> dataList = baseMapper.selectPage(page, entity);
@ -66,24 +84,299 @@ public class YieldOrderServiceImpl extends BaseServiceImpl<YieldOrderMapper, Yie
} }
@Override @Override
public Boolean verifyYieldOrderData(String yieldOrderId) { public Boolean verifyYieldOrderData(YieldOrder yieldOrder) {
return null; // 1. 验证是否已有该流程卡号的数据, 若已有
LambdaQueryWrapper<YieldOrder> 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 @Override
public Boolean verifyYieldOrderCraft(String yieldOrderId) { public Boolean verifyYieldOrderCraft(YieldOrder yieldOrder) {
//TODO 匹配工艺
if (StringUtils.isBlank(yieldOrder.getReworkCode())) {
// pjYieldCraftService.renewYieldCraft(yieldOrder);
}
return null; return null;
} }
@Override @Override
public Boolean verifyYieldOrderResource(String yieldOrderId) { public Boolean verifyYieldOrderResource(YieldOrder yieldOrder) {
return null; return null;
} }
@Override @Override
public Boolean verifyYieldOrderDelivery(String yieldOrderId) { public Boolean verifyYieldOrderDelivery(YieldOrder yieldOrder) {
// 根据工艺, 计算订单的额定加工时长
// 交期时间-当前时间, 与 额定加工时长对比, 判断是否有超期风险
return null; return null;
} }
@Override
public void saveSubYieldOrder(YieldOrder yieldOrder, Boolean isManual, Long receiveUser) throws BusinessException {
// 验证是否存在玻璃饼子件信息
this.checkSub(yieldOrder.getPartCode(), DsPartConst.SIN_TER_TYPE_BLB, "玻璃饼");
//查询所有的烧结子件清单
List<DsPartEntity> 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<YieldOrder> subYieldOrderList = this.listByFatherYoId(yieldOrder.getFatherYoId());
List<String> keyLst = new ArrayList<>();
List<DsPartEntity> 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<YieldOrder> listByFatherYoId(Long fatherYoId) {
LambdaQueryWrapper<YieldOrder> wrapper = Wrappers.lambdaQuery(YieldOrder.class).eq(YieldOrder::getFatherYoId, fatherYoId);
List<YieldOrder> subYieldOrderList = this.list(wrapper);
return subYieldOrderList;
}
/**
* 验证零件子件信息
*
* @param partCode
* @param sinTerType
* @param text
*/
private List<DsPartEntity> checkSub(String partCode, Integer sinTerType, String text) throws BusinessException {
// 按零件号查询子件
List<DsPartEntity> 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<DsPartEntity> subList, Boolean isManual, Long receiveUser) throws BusinessException {
List<DsCraftEntity> 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<YieldOrder> 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<YieldOrder> 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<YieldOrder> 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);
}
} }

Loading…
Cancel
Save