Commit 93ddd934 sunke

1 条码尺寸从Qisda获取,并与测量尺寸进行比对

2 需求单无库存时,返回Not Found
1 个父辈 3cc971a5
......@@ -9,7 +9,9 @@ import java.util.List;
*/
public interface IComponentManager extends IManager<Component> {
public Component findByPartNumber(String partNumber);
public Component findByPartNumber(String partNumber, String provider);
List<Component> listByPn(String pn);
List<Component> allNeedAlarmComponents();
......
......@@ -57,7 +57,7 @@ public class BarcodeManagerImpl implements IBarcodeManager {
@Override
public Barcode save(Barcode barcode) throws ValidateException{
validateSave(barcode);
Component component = componentManager.findByPartNumber(barcode.getPartNumber());
Component component = componentManager.findByPartNumber(barcode.getPartNumber(), barcode.getProvider());
if(component != null){
if(barcode.getMaxStorageTime() <= 0){
barcode.setMaxStorageTime(component.getMaxStorageTime());
......@@ -119,7 +119,7 @@ public class BarcodeManagerImpl implements IBarcodeManager {
protected boolean validateComponent(Barcode barcode) {
return componentManager.findByPartNumber(barcode.getPartNumber()) != null;
return componentManager.findByPartNumber(barcode.getPartNumber(),barcode.getProvider()) != null;
}
protected boolean validateUnique(Barcode barcode) {
......
......@@ -33,10 +33,17 @@ public class ComponentManagerImpl implements IComponentManager {
}
@Override
public Component findByPartNumber(String partNumber) {
public Component findByPartNumber(String partNumber, String provider) {
if (StringUtils.isEmpty(partNumber))
return null;
else return componentDao.findOneByCondition(new String[] {"partNumber"}, new String[] {partNumber});
else return componentDao.findOneByCondition(new String[] {"partNumber","provider"}, new String[] {partNumber,provider});
}
@Override
public List<Component> listByPn(String pn){
Criteria c = Criteria.where("partNumber").is(pn);
Query query = Query.query(c);
return componentDao.findByQuery(query);
}
@Override
......@@ -64,7 +71,7 @@ public class ComponentManagerImpl implements IComponentManager {
public Component save(Component component) throws ValidateException{
String partNumber = component.getPartNumber();
Component dbComponent = findByPartNumber(partNumber);
Component dbComponent = findByPartNumber(partNumber, component.getProvider());
if(dbComponent != null){
//数据库中已存在,但不是更新(要保存的没有 ID,或者有 ID但与数据库中的 ID不一致)
if(Strings.isNullOrEmpty(component.getId()) || !dbComponent.getId().equals(component.getId()) ){
......
......@@ -177,7 +177,7 @@ public class TcpServer {
barcode.setAmount(amount);
//未补过料
if(Strings.isNullOrEmpty(barcode.getNextBarcode())){
Component component = componentManager.findByPartNumber(barcode.getPartNumber());
Component component = componentManager.findByPartNumber(barcode.getPartNumber(), barcode.getProvider());
int alarmAmount = component.getAlarmAmount();
if(amount <= alarmAmount){
StoragePos pos = storagePosManager.findPartNumberPos(null,barcode.getPartNumber(),new ArrayList<String>(), StorageConstants.CHECKOUT_TYPE.FIFO);
......
......@@ -185,7 +185,7 @@ public class FileUploadController extends BaseFormController {
log.debug("Parse component to list with size: " + list.size());
if (list != null && list.size() > 0) {
for (ComponentExcel componentExcel : list) {
Component component = componentManager.findByPartNumber(componentExcel.getPartNumber());
Component component = componentManager.findByPartNumber(componentExcel.getPartNumber(), null);
if (component == null) {
component = new Component();
}
......@@ -254,7 +254,7 @@ public class FileUploadController extends BaseFormController {
if(partNumber.isEmpty()){
log.warn("行[partNumber="+partNumber + ","+"reelId="+reelId+",qty="+qty+"]中PN 为空,此行忽略");
}else{
Component component = componentManager.findByPartNumber(partNumber);
Component component = componentManager.findByPartNumber(partNumber,"");
if(component == null){
log.info("未找到["+ partNumber+"]的档案,创建新的数量为["+qty+"]档案");
component = new Component();
......
......@@ -65,7 +65,7 @@ public class BarcodeGenerateController extends BaseUpdateController {
barcode.setStatus(StorageConstants.BARCODE_STATUS.NEW);
barcode.setUsed(false);
//String componentId = barcode.getComponentId();
Component component = componentManager.findByPartNumber(barcode.getPartNumber());
Component component = componentManager.findByPartNumber(barcode.getPartNumber(),barcode.getProvider());
if(StringUtils.isEmpty(barcode.getBarcode())) {
String bs = getUuid();
......
......@@ -282,7 +282,7 @@ public class BoxChartController extends BaseController {
List<SolderInventoryItem> results = Lists.newArrayList();
for (InventoryItem inventoryItem : storageTypeInventory.values()) {
String partNumber = inventoryItem.getPartNumber();
Component component = componentManager.findByPartNumber(partNumber);
Component component = componentManager.findByPartNumber(partNumber, "");
int minStoreNum = component.getMinStoreNum();
int maxStoreNum = component.getMaxStoreNum();
......
......@@ -106,7 +106,7 @@ public class ComponentUpdateController extends BaseUpdateController{
if(Strings.isNullOrEmpty(component.getFixtureNumber())){
throw new ValidateException("夹具编号不能为空");
}else {
Component fixture = componentmanager.findByPartNumber(component.getFixtureNumber());
Component fixture = componentmanager.findByPartNumber(component.getFixtureNumber(), null);
if(fixture == null){
throw new ValidateException("不存在编号为【"+component.getFixtureNumber()+"】的夹具");
}else{
......
......@@ -16,10 +16,7 @@ import com.myproject.manager.IBarcodeManager;
import com.myproject.manager.IComponentManager;
import com.myproject.manager.IStorageManager;
import com.myproject.manager.IStoragePosManager;
import com.myproject.util.BarcodeRule;
import com.myproject.util.DateUtil;
import com.myproject.util.PLATE_SIZE;
import com.myproject.util.StorageConstants;
import com.myproject.util.*;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -210,6 +207,56 @@ public class DataCache{
return settings;
}
private Component getComponent(Barcode barcode) throws ValidateException {
boolean needSave = false;
Component component = componentManager.findByPartNumber(barcode.getPartNumber(), barcode.getProvider());
if(component == null){
component = componentManager.findByPartNumber(barcode.getPartNumber(), null);
if(component != null){
if(component.getProvider() == null){
component.setProvider(barcode.getProvider());
needSave = true;
}
}
}
if(component == null){
if(barcode.getPlateSize() > 0){
log.info("自动添加["+barcode.getPartNumber()+"]的档案信息");
component = new Component();
component.setPartNumber(barcode.getPartNumber());
component.setAmount(barcode.getAmount());
component.setPlateSize(barcode.getPlateSize());
component.setHeight(barcode.getHeight());
component.setName(barcode.getPartNumber());
component.setProvider(barcode.getProvider());
needSave = true;
}
}
if(component == null){
throw new ValidateException("档案不存在");
}
if(!component.isSizeConfirmed()){
//尺寸未确认过,从Qisda获取
PLATE_SIZE plateSize = QisdaApi.PartNoRule(barcode.getPartNumber(), barcode.getProvider());
if(plateSize != null){
component.setPlateSize(plateSize.getW());
component.setHeight(plateSize.getH());
if(Strings.isNullOrEmpty(component.getProvider())){
component.setProvider(barcode.getProvider());
}
component.setSizeConfirmed(true);
needSave = true;
}
}
if(needSave){
component = componentManager.save(component);
}
return component;
}
/**
* 解析条码为单个 Barcode
*/
......@@ -256,34 +303,36 @@ public class DataCache{
}
}
}
Component component = componentManager.findByPartNumber(barcode.getPartNumber());
int validDay = 0;
if(component != null){
validDay = component.getValidDay();
codeBeanFromRule.setShowImg(component.getShowImg());
try {
Component component = getComponent(barcode);
codeBeanFromRule.setError(null);
if(component.isSizeConfirmed()){
//尺寸已经确认的,判断尺寸,如果大小不符合,直接NG,如果大小符合,尺寸差别在4mm内的修改尺寸
if(barcode.getPlateSize() != component.getPlateSize()){
String msg = barcode.getBarcode() + "测量尺寸["+barcode.getSizeStr()+"]与确认PN尺寸["+component.getSizeStr()+"]不符";
String msg = barcode.getBarcode() + "测量尺寸["+barcode.getSizeStr()+"]与给定尺寸["+component.getSizeStr()+"]不符";
codeBeanFromRule.setError(msg);
throw new ValidateException(msg);
}else{
//如果厚度小于4mm,使用确认的尺寸入库
int diffHeight = barcode.getHeight() - component.getHeight();
if(diffHeight !=0 && Math.abs(diffHeight) <= 4){
log.info(barcode.getBarcode() + "测量尺寸["+barcode.getSizeStr()+"]与确认PN尺寸["+component.getSizeStr()+"]厚度误差在4mm以内,使用确认的尺寸进行入库");
try {
barcode.setHeight(component.getHeight());
barcodeManager.save(barcode);
}catch (Exception e){
}
if(Math.abs(diffHeight) > 4){
String msg = barcode.getBarcode() + "测量厚度["+barcode.getSizeStr()+"]与给定厚度["+component.getSizeStr()+"]误差过大";
//codeBeanFromRule.setError(msg);
throw new ValidateException(msg);
}else if(diffHeight !=0 && Math.abs(diffHeight) <= 4){
log.info(barcode.getBarcode() + "测量尺寸["+barcode.getSizeStr()+"]与给定尺寸["+component.getSizeStr()+"]厚度误差在4mm以内,使用给定尺寸进行入库");
barcode.setHeight(component.getHeight());
barcodeManager.save(barcode);
}
}
}
} catch (ValidateException e) {
codeBeanFromRule.setError(e.getMessage());
log.info(e.getMessage());
}
codeBeanFromRule.setError(null);
codeBeanFromRule.setCodeStr(barcode.getBarcode());
codeBeanFromRule.setBarcode(barcode);
return codeBeanFromRule;
......@@ -292,74 +341,50 @@ public class DataCache{
try{
//如果有料盘尺寸,重新设置料盘尺寸信息,没有档案时自动添加档案
if(codeBeanFromRule.hasReelSizeInfo()){
//log.info("料盘["+barcode.getBarcode()+"]的尺寸信息从["+barcode.getPlateSize()+"x"+barcode.getHeight()+"]设置为["+codeBeanFromRule.getReelWidth()+"x"+codeBeanFromRule.getReelHeight()+"]");
Component component = componentManager.findByPartNumber(barcodeFromRule.getPartNumber());
if(component == null){
log.info("自动添加["+barcodeFromRule.getPartNumber()+"]的档案信息["+codeBeanFromRule.getReelWidth()+"x"+codeBeanFromRule.getReelHeight()+"]");
component = new Component();
component.setPartNumber(barcodeFromRule.getPartNumber());
component.setAmount(barcodeFromRule.getAmount());
component.setPlateSize(barcodeFromRule.getPlateSize());
component.setHeight(barcodeFromRule.getHeight());
component.setName(barcodeFromRule.getPartNumber());
component.setProvider(barcodeFromRule.getProvider());
componentManager.save(component);
}else{
//尺寸已经确认的,不再更新尺寸
if(!component.isSizeConfirmed()){
//如果 barcode 里的料盘信息比 Component 中的大,使用比较大的,防止放不进去撞击
if(codeBeanFromRule.getReelHeight() > component.getHeight() || codeBeanFromRule.getReelWidth() > component.getPlateSize()){
log.info("更新物料["+component.getPartNumber()+"]档案尺寸["+component.getPlateSize()+"x"+component.getHeight()+"]为["+codeBeanFromRule.getReelWidth()+"x"+codeBeanFromRule.getReelHeight()+"]");
component.setPlateSize(barcodeFromRule.getPlateSize());
component.setHeight(barcodeFromRule.getHeight());
componentManager.save(component);
}
}else{
barcodeFromRule.setPlateSize(codeBeanFromRule.getReelWidth());
barcodeFromRule.setHeight(codeBeanFromRule.getReelHeight());
}
Component component = getComponent(barcodeFromRule);
if(component.isSizeConfirmed()){
//尺寸已经确认的,判断尺寸,如果大小不符合,直接NG,如果大小符合,尺寸差别在4mm内的修改尺寸
if(barcodeFromRule.getPlateSize() != component.getPlateSize()){
String msg = barcodeFromRule.getBarcode() + "测量尺寸["+barcodeFromRule.getSizeStr()+"]与给定尺寸["+component.getSizeStr()+"]不符";
codeBeanFromRule.setError(msg);
throw new ValidateException(msg);
}else{
//如果厚度小于4mm,使用确认的尺寸入库
int diffHeight = barcodeFromRule.getHeight() - component.getHeight();
if(Math.abs(diffHeight) > 4){
String msg = barcodeFromRule.getBarcode() + "测量厚度["+barcodeFromRule.getSizeStr()+"]与给定厚度["+component.getSizeStr()+"]误差过大";
codeBeanFromRule.setError(msg);
throw new ValidateException(msg);
}else if(diffHeight !=0 && Math.abs(diffHeight) <= 4){
log.info(barcodeFromRule.getBarcode() + "测量尺寸["+barcodeFromRule.getSizeStr()+"]与给定寸["+component.getSizeStr()+"]厚度误差在4mm以内,使用给定尺寸进行入库");
barcodeFromRule.setHeight(component.getHeight());
}
//codeBeanFromRule.setShowImg(component.getShowImg());
}
}
boolean needAddNew = true;
if(isProductionFor(CUSTOMER.LIAN_DIAN)){
//联电的唯一码中必须带有-,否则无效
if(!barcodeFromRule.getBarcode().contains("-")){
needAddNew = false;
log.info("唯一码["+barcodeFromRule.getBarcode()+"]中不带符号-,忽略");
return null;
//codeBeanFromRule.setShowImg(component.getShowImg());
Date produceDate = barcodeFromRule.getProduceDate();
if(produceDate != null && barcodeFromRule.getExpireDate() == null){
int validDay = component.getValidDay();
if( validDay > 0){
log.info("设置"+barcodeFromRule.getBarcode()+"的过期时间");
Date expireDate = DateUtil.addDays(produceDate, validDay);
barcodeFromRule.setExpireDate(expireDate);
}
}
if(needAddNew){
log.info("自动添加条码"+barcodeItemStr+"到数据库中");
Component component = componentManager.findByPartNumber(barcodeFromRule.getPartNumber());
if(component == null){
throw new ValidateException("档案不存在");
}
//codeBeanFromRule.setShowImg(component.getShowImg());
Date produceDate = barcodeFromRule.getProduceDate();
if(produceDate != null && barcodeFromRule.getExpireDate() == null){
int validDay = component.getValidDay();
if( validDay > 0){
log.info("设置"+barcodeFromRule.getBarcode()+"的过期时间");
Date expireDate = DateUtil.addDays(produceDate, validDay);
barcodeFromRule.setExpireDate(expireDate);
barcodeManager.save(barcodeFromRule);
}
}
barcode = barcodeManager.save(barcodeFromRule);
codeBeanFromRule.setCodeStr(barcode.getBarcode());
codeBeanFromRule.setBarcode(barcode);
codeBeanFromRule.setError(null);
}
log.info("自动添加条码"+barcodeItemStr+"到数据库中");
barcode = barcodeManager.save(barcodeFromRule);
codeBeanFromRule.setCodeStr(barcode.getBarcode());
codeBeanFromRule.setBarcode(barcode);
codeBeanFromRule.setError(null);
}catch (ValidateException ve){
//档案不存在
codeBeanFromRule.setError("x档案 "+barcodeFromRule.getPartNumber()+" 不存在");
log.warn("x档案"+barcodeFromRule.getPartNumber()+"不存在");
codeBeanFromRule.setError(ve.getMessage());
log.info(ve.getMessage());
}
//解析成功了,直接返回
return codeBeanFromRule;
......
......@@ -66,7 +66,7 @@ public class MesApiController extends BaseController {
log.info("收到 MES 的 数据同步信息"+Partnumber+"【"+w+"x"+h+"】");
Component c = componentManager.findByPartNumber(Partnumber);
Component c = componentManager.findByPartNumber(Partnumber, null);
if(c == null){
c = new Component();
}
......@@ -98,7 +98,7 @@ public class MesApiController extends BaseController {
String PARTNUMBER = checkParameter(request,"PN");
String QTY = checkParameter(request,"QTY");
log.info("收到条码同步信息:RI="+REEL_ID + " PN=" + PARTNUMBER + " QTY="+QTY);
Component c = componentManager.findByPartNumber(PARTNUMBER);
Component c = componentManager.findByPartNumber(PARTNUMBER, null);
if(c == null){
return "Error: 物料编号[" + PARTNUMBER + "]的档案不存在";
}
......
......@@ -181,6 +181,12 @@ public class QisdaApiController extends BaseController {
map.put("so", appendInfo.getSo());
bindReelInfos.add(map);
}
}else{
//无库存,返回Not Found
Map<String,String> map = new HashMap<>();
map.put("reelId", reelId);
map.put("so", "Not Found");
bindReelInfos.add(map);
}
}
} catch (Exception e) {
......@@ -935,17 +941,23 @@ public class QisdaApiController extends BaseController {
//缺料,查看是否有本工单,同PN的,如果有抢一个过来
//缺料,料架留空
Component c = componentManager.findByPartNumber(outItem.getPn());
if(c != null){
String shelfType = StorageConstants.SHEFL_TYPE.D;
boolean hasBigSizePn = false;
List<Component> pnList = componentManager.listByPn(outItem.getPn());
for (Component c : pnList) {
if(c.getPlateSize() > 7 || c.getHeight() > 12){
shelfType = StorageConstants.SHEFL_TYPE.C;
hasBigSizePn = true;
break;
}
log.info(outItem.getSlotlocation() + "["+outItem.getPn()+"]缺料,保留"+shelfType+"类型架位");
InquiryShelfBean.addEmptyLoc(outItem, shelfType);
}else{
}
if(pnList.isEmpty()){
log.error("未找到物料["+outItem.getPn()+"]的尺寸信息,保留C类型架位");
InquiryShelfBean.addEmptyLoc(outItem, StorageConstants.SHEFL_TYPE.C);
}else if(hasBigSizePn){
log.info(outItem.getSlotlocation() + "["+outItem.getPn()+"]缺料,且PN数据中有大料,保留C类型架位");
InquiryShelfBean.addEmptyLoc(outItem, StorageConstants.SHEFL_TYPE.C);
}else {
log.info(outItem.getSlotlocation() + "["+outItem.getPn()+"]缺料,保留D类型架位");
InquiryShelfBean.addEmptyLoc(outItem, StorageConstants.SHEFL_TYPE.D);
}
}
return tasks;
......
......@@ -1854,10 +1854,10 @@ public class TaskService implements ITaskService {
barcode.setCheckOutDate(null,"");
barcode.setPosName(task.getPosName());
barcode.setInitialAmount(barcode.getAmount());
if(Strings.isNullOrEmpty(barcode.getProviderNumber())){//补上供应商编号
Component component = componentManager.findByPartNumber(barcode.getPartNumber());
barcode.setProviderNumber(component.getProviderNumber());
}
// if(Strings.isNullOrEmpty(barcode.getProviderNumber())){//补上供应商编号
// Component component = componentManager.findByPartNumber(barcode.getPartNumber());
// barcode.setProviderNumber(component.getProviderNumber());
// }
// AppendInfo appendInfo = barcode.getAppendInfo();
// appendInfo.setDnNo(task.getSourceName());
......
......@@ -112,7 +112,7 @@
<!--/span-->
<div class="col-md-6">
<div class="form-group">
<label class="control-label col-md-3"><fmt:message key="component.providerNumber"/>
<label class="control-label col-md-3"><fmt:message key="component.provider"/>
:</label>
<div class="col-md-9">
......@@ -290,12 +290,12 @@
$(this).attr("placeholder", codeValue);
$(this).val("");
$.post("${ctx}/service/store/resolveBarcode", {code: codeValue}, function (data) {
if (data.error == null) {
if (data.valid) {
$("#barcode").text(data.barcode.barcode);
$("#partNumber").text(data.barcode.partNumber);
$("#batch").text(data.barcode.batch);
$("#amount").text(data.barcode.amount);
$("#providerNumber").text(data.barcode.providerNumber);
$("#providerNumber").text(data.barcode.provider);
$("#modifyNum").focus();
} else {
printErrorMessage(data.error);
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!