订单相关提交

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>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springblade</groupId>
<artifactId>blade-core-tool</artifactId>
</dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId></dependency>
</dependencies>
<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.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;
}

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

@ -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<DsCraftEntity> {
* @return
*/
List<DsCraftExpireVO> getVersion(Long partId);
/**
* 根据零件ID查询工艺列表
* @param partId
* @return
*/
List<DsCraftEntity> listByPartId(Long partId);
}

@ -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<DsPartEntity> {
/**
* 根据零件号查询
*
* @param partCode
* @return
*/
DsPartEntity selectDsPartByPatCode(String partCode);
/**
* 根据零件号和零件类型查询子件列表
*
* @param partCode
* @param sinTerType
* @return
*/
DsPartEntity selectDsPartByPatCode(String partCode);
List<DsPartEntity> 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<DsPartEntity> {
/**
* 烧结树形结构
*
* @param partCode
* @return
*/
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;
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<DsCraftMapper, DsCraftEn
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;
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<DsPartMapper, DsPartEntit
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
public void assignTechnician(Long id, String userName) {
DsPartEntity partEntity = new DsPartEntity();
@ -151,7 +160,7 @@ public class DsPartServiceImpl extends BaseServiceImpl<DsPartMapper, DsPartEntit
@Override
public boolean syncPdmPart(DsPartEntity dsPart) {
if(null == dsPart){
if (null == dsPart) {
return false;
}
@ -353,14 +362,28 @@ public class DsPartServiceImpl extends BaseServiceImpl<DsPartMapper, DsPartEntit
public int compareDateOnly(Date date1, Date date2) {
LocalDate localDate1 = date1.toInstant()
.atZone(ZoneId.systemDefault())
.toLocalDate();
.atZone(ZoneId.systemDefault())
.toLocalDate();
LocalDate localDate2 = date2.toInstant()
.atZone(ZoneId.systemDefault())
.toLocalDate();
.atZone(ZoneId.systemDefault())
.toLocalDate();
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;
//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_PASS = 5;
//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 jakarta.validation.constraints.NotEmpty;
import org.springblade.common.exception.BusinessException;
import org.springblade.core.mp.base.BaseService;
import org.springblade.desk.order.entity.YieldOrder;
@ -52,32 +53,51 @@ public interface IYieldOrderService extends BaseService<YieldOrder> {
/**
* 订单校验-数据
*
* @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<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.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<YieldOrderMapper, YieldOrder> implements IYieldOrderService {
private final IDsPartService dsPartService;
private final IDsCraftService dsCraftService;
@Override
public IPage<YieldOrder> selectPage(IPage<YieldOrder> page, YieldOrder entity) {
List<YieldOrder> dataList = baseMapper.selectPage(page, entity);
@ -66,24 +84,299 @@ public class YieldOrderServiceImpl extends BaseServiceImpl<YieldOrderMapper, Yie
}
@Override
public Boolean verifyYieldOrderData(String yieldOrderId) {
return null;
public Boolean verifyYieldOrderData(YieldOrder yieldOrder) {
// 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
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<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