package com.dy.pmsStation.assemblyStep;
|
|
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
|
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
|
import com.dy.pmsGlobal.daoPlt.PltProductMapper;
|
import com.dy.pmsGlobal.daoPlt.PltProductQualityInspectionItemsMapper;
|
import com.dy.pmsGlobal.daoPlt.PltProductTestInspectionItemsMapper;
|
import com.dy.pmsGlobal.daoPr.PrAssemblyPlanMapper;
|
import com.dy.pmsGlobal.daoPr.PrProductionNodeMapper;
|
import com.dy.pmsGlobal.daoSta.*;
|
import com.dy.pmsGlobal.pojoPlt.PltProduct;
|
import com.dy.pmsGlobal.pojoPlt.PltProductQualityInspectionItems;
|
import com.dy.pmsGlobal.pojoPlt.PltProductTestInspectionItems;
|
import com.dy.pmsGlobal.pojoPr.PrAssemblyPlan;
|
import com.dy.pmsGlobal.pojoPr.PrProductionNode;
|
import com.dy.pmsGlobal.pojoSta.*;
|
import com.dy.pmsGlobal.util.DeviceStatus;
|
import com.dy.pmsGlobal.util.QrCodeConstant;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.beans.BeanUtils;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Service;
|
import org.springframework.transaction.annotation.Transactional;
|
|
import java.util.*;
|
|
@Slf4j
|
@Service
|
public class AssemblyStepSv {
|
private static final String WORK_TYPE_ASSEMBLY = "1";
|
private static final String WORK_TYPE_TEST = "2";
|
private static final String WORK_TYPE_INSPECTION = "3";
|
private static final String WORK_TYPE_REPAIR = "4";
|
|
private StaDeviceLastMapper deviceLastDao;
|
private StaDeviceLifeMapper deviceLifeDao;
|
private StaWipSnExMapper wipSnExDao;
|
private StaDeviceProductionLogMapper deviceProductionLogDao;
|
private StaAssemblyWorkLastMapper assemblyWorkLastDao;
|
private PrAssemblyPlanMapper assemblyPlanDao;
|
// private PrProductionProcessMapper processDao;
|
private PrProductionNodeMapper nodeDao;
|
private StaRepairInfoMapper repairInfoDao;
|
private PltProductQualityInspectionItemsMapper qualityItemsDao;
|
private PltProductTestInspectionItemsMapper testItemsDao;
|
private PltProductMapper productDao;
|
@Autowired
|
public void setDeviceLastDao(StaDeviceLastMapper deviceLastDao) {
|
this.deviceLastDao = deviceLastDao;
|
}
|
@Autowired
|
public void setDeviceLifeDao(StaDeviceLifeMapper deviceLifeDao) {
|
this.deviceLifeDao = deviceLifeDao;
|
}
|
@Autowired
|
public void setWipSnExDao(StaWipSnExMapper wipSnExDao) {
|
this.wipSnExDao = wipSnExDao;
|
}
|
@Autowired
|
public void setDeviceProductionLogDao(StaDeviceProductionLogMapper deviceProductionLogDao) {
|
this.deviceProductionLogDao = deviceProductionLogDao;
|
}
|
@Autowired
|
public void setAssemblyWorkLastDao(StaAssemblyWorkLastMapper assemblyWorkLastDao) {
|
this.assemblyWorkLastDao = assemblyWorkLastDao;
|
}
|
@Autowired
|
public void setAssemblyPlanDao(PrAssemblyPlanMapper assemblyPlanDao) {
|
this.assemblyPlanDao = assemblyPlanDao;
|
}
|
@Autowired
|
public void setNodeDao(PrProductionNodeMapper nodeDao) {
|
this.nodeDao = nodeDao;
|
}
|
@Autowired
|
public void setRepairInfoDao(StaRepairInfoMapper repairInfoDao) {
|
this.repairInfoDao = repairInfoDao;
|
}
|
@Autowired
|
public void setQualityItemsDao(PltProductQualityInspectionItemsMapper qualityItemsDao) {
|
this.qualityItemsDao = qualityItemsDao;
|
}
|
@Autowired
|
public void setTestItemsDao(PltProductTestInspectionItemsMapper testItemsDao) {
|
this.testItemsDao = testItemsDao;
|
}
|
@Autowired
|
public void setProductDao(PltProductMapper productDao) {
|
this.productDao = productDao;
|
}
|
|
@Transactional
|
public int save(QueryVo params) {
|
long workId = Long.parseLong(params.workId);
|
StaAssemblyWorkLast workLast = assemblyWorkLastDao.selectByPrimaryKey(workId);
|
if (workLast == null) {
|
throw new RuntimeException("系统中没有该条登录信息");//工单不存在
|
}
|
PrAssemblyPlan plan = assemblyPlanDao.selectByPrimaryKey(workLast.getPlanId());
|
// 验证并处理设备号和物料号
|
Set<String> deviceSet = new HashSet<>(Arrays.asList(params.deviceNo.split(",")));
|
// 分类设备号和物料号
|
List<String> deviceList = new ArrayList<>();
|
List<String> materialList = new ArrayList<>();
|
List<PltProduct> productList = productDao.selectAll(null);
|
deviceSet.forEach(device -> {
|
if (device.contains(plan.batchNo)) {
|
deviceList.add(device);
|
} else if(isOurProduct(device,productList)){
|
materialList.add(device);
|
}
|
});
|
|
if (deviceList.isEmpty()) {
|
throw new RuntimeException("设备号(" + params.deviceNo + ")均不属于当前任务计划");
|
}
|
if (deviceList.size() > 1) {
|
throw new RuntimeException("设备号有且只能有一个属于当前任务计划");
|
}
|
|
StaDeviceLast deviceLast = buildDeviceLast(params, workLast, deviceList.get(0));
|
int count = deviceLast.id == null ? deviceLastDao.insertSelective(deviceLast) :
|
deviceLastDao.updateByPrimaryKeySelective(deviceLast);
|
|
saveDeviceProductionLog(deviceLast);
|
|
PrProductionNode node = nodeDao.selectByPrimaryKey(workLast.nodeId);
|
if (node.isRecord) {
|
saveDeviceLife(deviceLast);
|
}
|
if (CollectionUtils.isNotEmpty(materialList)) {
|
saveSnEx(workLast, deviceList, materialList, plan);
|
}
|
return count;
|
}
|
|
private void saveDeviceProductionLog(StaDeviceLast deviceLast) {
|
StaDeviceProductionLog log = new StaDeviceProductionLog();
|
BeanUtils.copyProperties(deviceLast, log);
|
log.setId(null); // 设备生产日志ID设为null,表示新增
|
deviceProductionLogDao.insertSelective(log);
|
}
|
|
private void saveDeviceLife(StaDeviceLast deviceLast) {
|
StaDeviceLife life = new StaDeviceLife();
|
BeanUtils.copyProperties(deviceLast, life);
|
deviceLifeDao.insertSelective(life);
|
}
|
|
private StaDeviceLast buildDeviceLast(QueryVo params, StaAssemblyWorkLast workLast,String deviceNo) {
|
//组装数据
|
StaDeviceLast record = new StaDeviceLast();
|
|
StaDeviceLast preRecord = deviceLastDao.selectByDeviceNo(deviceNo);
|
if (preRecord != null) {
|
record.id = preRecord.id;
|
record.inTime = preRecord.outTime;
|
}
|
record.outTime = new Date();
|
|
record.planId = workLast.planId;
|
record.workId = Long.parseLong(params.workId);
|
record.stationId = workLast.stationId;
|
record.equipNo = deviceNo;
|
record.currNode = workLast.nodeId;
|
|
record.updatedBy = workLast.userId;
|
record.assistants = params.assistants;
|
|
PrProductionNode node = nodeDao.selectByPrimaryKey(workLast.nodeId);
|
record.nodeContent = node.content;
|
if (node.isRecord) {
|
record.equipCycleContent = node.equipCycleContent;
|
}
|
record.status = getStatus(params.status, node.isEnd,params.workType);
|
return record;
|
}
|
|
private void saveSnEx(StaAssemblyWorkLast workLast, List<String> deviceList, List<String> materialList, PrAssemblyPlan plan) {
|
for (String material : materialList) {
|
StaWipSnEx snEx = new StaWipSnEx();
|
snEx.deviceNo = deviceList.get(0);
|
snEx.productId = plan.process.proId;
|
snEx.productNo = material;
|
snEx.createTime = workLast.startTime;
|
snEx.createBy = workLast.userId;
|
snEx.productName = plan.proName;
|
wipSnExDao.insertSelective(snEx);
|
}
|
}
|
|
/**
|
* 状态: 1:组装中,2:完成,3:维修,4:报废
|
*
|
* @param status 状态
|
* @param isEndNode 是否结束节点
|
* @return 状态
|
*/
|
private int getStatus(String status, boolean isEndNode,String workType) {
|
//组装,维修
|
if (WORK_TYPE_ASSEMBLY.equals(workType)||WORK_TYPE_REPAIR.equals(workType)) {
|
return switch (status) {
|
case QrCodeConstant.MarkOk -> isEndNode? DeviceStatus.COMPLETED.getCode(): DeviceStatus.ASSEMBLING.getCode();
|
case QrCodeConstant.MarkUnqualified, QrCodeConstant.MarkPreUnqualified -> DeviceStatus.REPAIR.getCode();
|
case QrCodeConstant.MarkWaste -> DeviceStatus.WASTE.getCode();
|
default -> throw new RuntimeException("状态错误");
|
};
|
//品检,测试
|
}else if(WORK_TYPE_INSPECTION.equals(workType)||WORK_TYPE_TEST.equals(workType)){
|
return switch (status) {
|
case QrCodeConstant.MarkOk -> DeviceStatus.COMPLETED.getCode();
|
case QrCodeConstant.MarkUnqualified -> DeviceStatus.TEST_FAILED.getCode();
|
case QrCodeConstant.MarkWaste -> DeviceStatus.WASTE.getCode();
|
default -> throw new RuntimeException("状态错误");
|
};
|
}
|
throw new RuntimeException("状态错误,无效的节点类型: " + workType);
|
}
|
|
public int repair(QueryVo vo) {
|
long workId = Long.parseLong(vo.workId);
|
StaAssemblyWorkLast workLast = assemblyWorkLastDao.selectByPrimaryKey(workId);
|
if (workLast == null) {
|
throw new RuntimeException("系统中没有该条登录信息");
|
}
|
StaDeviceLast preDeviceRecord = deviceLastDao.selectByDeviceNo(vo.deviceNo);
|
StaRepairInfo repairInfo = new StaRepairInfo();
|
repairInfo.workId = workId;
|
repairInfo.equipNo = vo.deviceNo;
|
repairInfo.repairTime = new Date();
|
repairInfo.repairBy = workLast.userId;
|
repairInfo.repairReason = vo.errorMsg;
|
repairInfo.fromNode = preDeviceRecord.currNode;
|
repairInfoDao.insertSelective(repairInfo);
|
|
StaDeviceLast deviceLast = buildDeviceLast(vo, workLast, vo.deviceNo);
|
|
int count = deviceLast.id == null ? deviceLastDao.insertSelective(deviceLast) :
|
deviceLastDao.updateByPrimaryKeySelective(deviceLast);
|
saveDeviceProductionLog(deviceLast);
|
boolean isEndNode = nodeDao.isEndNode(preDeviceRecord.currNode);
|
if (isEndNode) {
|
saveDeviceLife(deviceLast);
|
}
|
return count;
|
}
|
|
public int testing(QueryVo vo) {
|
long workId = Long.parseLong(vo.workId);
|
StaAssemblyWorkLast workLast = assemblyWorkLastDao.selectByPrimaryKey(workId);
|
if (workLast == null) {
|
throw new RuntimeException("系统中没有该条登录信息");
|
}
|
|
StaDeviceLast deviceLast = buildDeviceLast(vo, workLast, vo.deviceNo);
|
int count = deviceLast.id == null ? deviceLastDao.insertSelective(deviceLast) :
|
deviceLastDao.updateByPrimaryKeySelective(deviceLast);
|
saveDeviceProductionLog(deviceLast);
|
return count;
|
}
|
|
public List<PltProductQualityInspectionItems> getQualityItems(String proId) {
|
Map<String, Object> params = new HashMap<>();
|
params.put("proId", proId);//item start count
|
//查询符合条件的记录
|
return qualityItemsDao.selectSome(params);
|
}
|
|
public List<PltProductTestInspectionItems> getTestItems(String proId) {
|
Map<String, Object> params = new HashMap<>();
|
params.put("proId", proId);
|
return testItemsDao.selectSome(params);
|
}
|
|
private boolean isOurProduct(String deviceNo, List<PltProduct> products){
|
if(StringUtils.isNotEmpty(deviceNo) && deviceNo.length() ==22 ){
|
for(PltProduct product:products){
|
if(deviceNo.startsWith(QrCodeConstant.TypeProduct + product.getCode())){
|
return true;
|
}
|
}
|
}
|
return false;
|
}
|
}
|