Commit 06b2cfa4 zshaohui

1.散料量测功能提交

2.迈征工单只出满盘的
1 个父辈 0308d3bd
......@@ -183,12 +183,12 @@ public class CodeResolve {
needUpdate = true;
}
//判断是否为空
if (barcodeFromRule.getProduceDate() != null) {
/*if (barcodeFromRule.getProduceDate() != null) {
barcode.setExpireDate(cn.hutool.core.date.DateUtil.offsetMonth(barcodeFromRule.getProduceDate(),12));
needUpdate = true;
} else {
barcode.setExpireDate(null);
}
}*/
//设置label数量
if (barcodeFromRule.getLabelAmount() != barcode.getLabelAmount()) {
barcode.setLabelAmount(barcodeFromRule.getLabelAmount());
......
......@@ -24,6 +24,8 @@ import com.neotel.smfcore.core.system.service.po.DataLog;
import com.neotel.smfcore.core.system.util.DevicesStatusUtil;
import com.neotel.smfcore.core.system.util.TaskService;
import com.neotel.smfcore.custom.lizhen.LizhenApi;
import com.neotel.smfcore.custom.lizhen.bean.apirequest.BrandQtyRequest;
import com.neotel.smfcore.custom.lizhen.bean.apiresult.BrandQtyResult;
import com.neotel.smfcore.custom.lizhen.innerBox.enums.ExtendType;
import com.neotel.smfcore.custom.lizhen.innerBox.rest.InnerBoxRestController;
import com.neotel.smfcore.security.TokenProvider;
......@@ -426,8 +428,8 @@ public class NLShelfHandler extends BaseDeviceHandler {
}
//校验是否可以入库
Map<String, Object> brandQty = lizhenApi.brandQty(barcode.getPartNumber(), barcode.getProvider());
if (brandQty == null || brandQty.isEmpty()) {
BrandQtyResult brandQtyResult = lizhenApi.brandQty(new BrandQtyRequest(barcode.getPartNumber(), barcode.getProvider()));
if (brandQtyResult == null) {
throw new ValidateException("smfcore.error.barcode.partNumber.invalid", "{0}不是有效的料号", new String[]{barcode.getPartNumber()});
}
......
......@@ -27,6 +27,8 @@ import com.neotel.smfcore.core.system.service.po.DataLog;
import com.neotel.smfcore.core.system.util.DevicesStatusUtil;
import com.neotel.smfcore.core.system.util.TaskService;
import com.neotel.smfcore.custom.lizhen.LizhenApi;
import com.neotel.smfcore.custom.lizhen.bean.apirequest.BrandQtyRequest;
import com.neotel.smfcore.custom.lizhen.bean.apiresult.BrandQtyResult;
import com.neotel.smfcore.custom.lizhen.innerBox.bean.WareHouseCode;
import com.neotel.smfcore.custom.lizhen.innerBox.enums.ExtendType;
import com.neotel.smfcore.custom.lizhen.innerBox.service.manager.WareHouseCodeManager;
......@@ -189,39 +191,22 @@ public class DeviceController {
if(barcode==null) {
throw new ValidateException("smfcore.error.barcode.invalid", "{0}不是有效的条码", new String[]{code});
}
//判断物料是否过期
Date expireDate = barcode.getExpireDate();
if (expireDate != null) {
if (System.currentTimeMillis() > expireDate.getTime()) {
throw new ValidateException("smfcore.error.barcode.expired", "物料已过期,无法入库.");
}
}
//料号为335S00571不允许入库
if ("335S00571".equals(barcode.getPartNumber()) || "155S00462".equals(barcode.getPartNumber())){
throw new ValidateException("", "335S00571/155S00462的料号不允许入到智能仓");
}
//判断是否过期
barcode = lizhenApi.getInDate(barcode);
//判断库别是否为空
/*Barcode reelBarcode = lizhenApi.fetchReel(barcode);
if (reelBarcode == null){
throw new ValidateException("", barcode.getBarcode()+"未找到对应的库别信息");
}
String warehouseCode = reelBarcode.getWarehouseCode();
if (StringUtils.isEmpty(warehouseCode)){
throw new ValidateException("", barcode.getBarcode()+"未找到对应的库别信息");
//判断物料是否过期
Date expireDate = barcode.getExpireDate();
if (expireDate != null) {
if (System.currentTimeMillis() > expireDate.getTime()) {
throw new ValidateException("smfcore.error.barcode.expired", "物料已过期,无法入库.");
}
//判断库别是否正确
WareHouseCode wareHouseCode = wareHouseCodeManager.findOneByQuery(new Query(Criteria.where("wareHouseCode").is(warehouseCode)));
if (wareHouseCode == null){
throw new ValidateException("", barcode.getBarcode()+"对应的库别信息是:"+warehouseCode+",在库别维护中,不存在,请先维护");
}
if (StringUtils.isNotEmpty(reelBarcode.getLabelId())) {
barcode.setLabelId(reelBarcode.getLabelId());
}*/
//判断虚拟仓有没有存在,如果有,把虚拟仓库位置空
StoragePos storagePos = storagePosManager.getByBarcode(barcode.getBarcode());
if (storagePos != null) {
......@@ -244,8 +229,8 @@ public class DeviceController {
}
}
//校验是否可以入库
Map<String, Object> brandQty = lizhenApi.brandQty(barcode.getPartNumber(), barcode.getProvider());
if (brandQty == null || brandQty.isEmpty()) {
BrandQtyResult brandQtyResult = lizhenApi.brandQty(new BrandQtyRequest(barcode.getPartNumber(), barcode.getProvider()));
if (brandQtyResult == null) {
throw new ValidateException("smfcore.error.barcode.partNumber.invalid", "{0}不是有效的料号", new String[]{barcode.getPartNumber()});
}
Barcode barcodeCanPutIn = smfApi.canPutInAfterResolve(barcode);
......
......@@ -31,6 +31,8 @@ import com.neotel.smfcore.core.storage.service.po.StoragePos;
import com.neotel.smfcore.core.system.service.po.DataLog;
import com.neotel.smfcore.core.system.util.TaskService;
import com.neotel.smfcore.custom.lizhen.LizhenApi;
import com.neotel.smfcore.custom.lizhen.bean.apirequest.BrandQtyRequest;
import com.neotel.smfcore.custom.lizhen.bean.apiresult.BrandQtyResult;
import com.neotel.smfcore.custom.lizhen.innerBox.bean.StorageExport;
import com.neotel.smfcore.custom.lizhen.innerBox.enums.ExtendType;
import com.neotel.smfcore.custom.lizhen.innerBox.util.StorageExportUtil;
......@@ -609,17 +611,17 @@ public class LiteOrderCache {
//先从数量少的,去挑
if (fewTasksStorageIdList != null && !fewTasksStorageIdList.isEmpty()) {
log.info("先从任务数量小于10的料仓,去挑,partNumber为[{}],工单号为[{}]",pn,orderNo);
pos = storagePosManager.findPartNumberInStorages(fewTasksStorageIdList, pn, excludePosIds, checkoutType, orderItem.getBrand());
pos = storagePosManager.findPartNumberInStorages(fewTasksStorageIdList, pn, excludePosIds, checkoutType, orderItem.getBrand(),cacheOrder.isMaiZheng());
}
if (pos == null){
if (secondFewTasksStorageIdList != null && !secondFewTasksStorageIdList.isEmpty()){
log.info("先从任务数量大于10小于15的料仓,去挑,partNumber为[{}],工单号为[{}]",pn,orderNo);
pos = storagePosManager.findPartNumberInStorages(secondFewTasksStorageIdList, pn, excludePosIds, checkoutType, orderItem.getBrand());
pos = storagePosManager.findPartNumberInStorages(secondFewTasksStorageIdList, pn, excludePosIds, checkoutType, orderItem.getBrand(),cacheOrder.isMaiZheng());
}
}
if (pos == null) {
log.info("从任务数量少的料仓未找到出库的物料,从全部料仓中去挑的料仓,去挑,partNumber为[{}],工单号为[{}]",pn,orderNo);
pos = storagePosManager.findPartNumberInStorages(storageIdList, pn, excludePosIds, checkoutType, orderItem.getBrand());
pos = storagePosManager.findPartNumberInStorages(storageIdList, pn, excludePosIds, checkoutType, orderItem.getBrand(),cacheOrder.isMaiZheng());
}
if (pos != null){
break;
......@@ -645,6 +647,17 @@ public class LiteOrderCache {
}
}
//如果是迈征工单,不是满料,不出库
if (cacheOrder.isMaiZheng()){
Barcode barcode = pos.getBarcode();
BrandQtyResult result = lizhenApi.brandQty(new BrandQtyRequest(barcode.getPartNumber(), barcode.getProvider()));
int qty = result.getQty();
log.info(barcode.getBarcode()+"的数量为[{}],partNumber为[{}],工单号为[{}],获取满卷数量为[{}]",barcode.getAmount(),barcode.getPartNumber(),orderNo,qty);
if (qty != barcode.getAmount()){
throw new ValidateException("",barcode.getBarcode()+"不是满卷数量,不允许出库");
}
}
List<String> batchCheckReel = lizhenApi.batchCheckReel(Arrays.asList(pos.getBarcode()), "",model);
if (batchCheckReel != null && !batchCheckReel.isEmpty()){
throw new ValidateException("",pos.getBarcode().getBarcode()+"被禁用,库位为:"+pos.getPosName());
......
......@@ -35,7 +35,7 @@ public interface IStoragePosManager extends IBaseManager<StoragePos> {
StoragePos findPartNumberInStorages(List<String> storageIdList,String labelId, String pn, Collection<String> excludePosIds, CHECKOUT_TYPE checkOutType);
StoragePos findPartNumberInStorages(List<String> storageIdList, String pn, Collection<String> excludePosIds, CHECKOUT_TYPE checkOutType,String brand);
StoragePos findPartNumberInStorages(List<String> storageIdList, String pn, Collection<String> excludePosIds, CHECKOUT_TYPE checkOutType,String brand,boolean isMaizheng);
List<StoragePos> findByQuery(Query query, Pageable pageable);
......
......@@ -347,7 +347,7 @@ public class StoragePosManagerImpl implements IStoragePosManager {
}
@Override
public StoragePos findPartNumberInStorages(List<String> storageIdList, String pn, Collection<String> excludePosIds, CHECKOUT_TYPE checkOutType, String brand) {
public StoragePos findPartNumberInStorages(List<String> storageIdList, String pn, Collection<String> excludePosIds, CHECKOUT_TYPE checkOutType, String brand,boolean isMaizheng) {
Criteria c = Criteria.where("barcode.partNumber").is(pn)
.and("id").nin(excludePosIds)
.and("enabled").is(true)//可用
......@@ -360,8 +360,14 @@ public class StoragePosManagerImpl implements IStoragePosManager {
}
Query q = new Query(c);
//Sort sort = getSortByCheckOutType(checkOutType);
Sort sort = Sort.by(Sort.Direction.ASC, "barcode.amount", "barcode.expireDate","barcode.createDate");
if (!isMaizheng) {
Sort sort = Sort.by(Sort.Direction.ASC, "barcode.amount", "barcode.expireDate", "barcode.createDate");
q.with(sort);
} else {
log.info("迈征工单,优先出数量最多的");
Sort sort =Sort.by(Sort.Direction.DESC,"barcode.amount").and(Sort.by(Sort.Direction.ASC,"barcode.expireDate", "barcode.createDate"));
q.with(sort);
}
StoragePos pos = storagePosDao.findOne(q);
if (pos == null) {
log.info("使用" + checkOutType + " 策略出库 partNumber=" + pn + ",未找到可以出库的物料 ");
......
......@@ -22,6 +22,9 @@ import com.neotel.smfcore.core.storage.service.po.Storage;
import com.neotel.smfcore.core.storage.service.po.StoragePos;
import com.neotel.smfcore.core.system.service.manager.IDataLogManager;
import com.neotel.smfcore.core.system.service.po.DataLog;
import com.neotel.smfcore.custom.lizhen.bean.apirequest.BrandQtyRequest;
import com.neotel.smfcore.custom.lizhen.bean.apiresult.BrandQtyResult;
import com.neotel.smfcore.custom.lizhen.bean.apiresult.LuxsanApiResult;
import com.neotel.smfcore.custom.lizhen.innerBox.bean.PreWarningItem;
import com.neotel.smfcore.custom.lizhen.innerBox.util.CommonUtil;
import com.neotel.smfcore.custom.lizhen.innerBox.util.PreWarningItemCache;
......@@ -96,6 +99,9 @@ public class LizhenApi extends DefaultSmfApiListener {
@Value("${api.commonRMRecordUrl}")
private String commonRMRecordUrl = "";
@Value("${api.getInDateUrl}")
private String getInDateUrl = "";
@PostConstruct
public void init(){
fetchGRUrl = dataCache.getConfigCache("fetchGRUrl",fetchGRUrl);
......@@ -110,47 +116,29 @@ public class LizhenApi extends DefaultSmfApiListener {
}
/**
* 根据partnumber和brand获取满卷数
*
* @param partnumber
* @param brand
* 获取尺寸和满卷数信息
* @param request
* @return
*/
public Map<String,Object> brandQty(String partnumber, String brand) {
log.info("brandQty--material_code:" + partnumber + ",brand:" + brand);
Map<String, Object> resultMap = new HashMap<>();
if (StringUtils.isBlank(brandQtyUrl)){
resultMap.put("qty", 0);
resultMap.put("reelSize", 0);
return resultMap;
}
int qty = 0;
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("material_code", partnumber);
paramMap.put("brand", brand);
public BrandQtyResult brandQty(BrandQtyRequest request) {
log.info("brandQtyUrl接口请求参数为:" + JSON.toJSONString(request));
try {
String result = HttpHelper.postJson(brandQtyUrl, paramMap);
log.info("brandQty-" + partnumber + ":请求结果为:" + result);
JSONObject jsonObject = JsonUtil.toObj(result, JSONObject.class);
String msgtx = jsonObject.getString("MSGTX");
if ("S".equals(msgtx)) {
JSONObject dataObject = jsonObject.getJSONObject("DATA");
if (dataObject != null) {
if (dataObject.getInteger("qty") != null) {
qty = dataObject.getInteger("qty");
resultMap.put("qty", qty);
}
String reelSize = dataObject.getString("reel_size");
if (StringUtils.isNotBlank(reelSize)) {
resultMap.put("reelSize", reelSize);
}
String resultStr = HttpHelper.postJson(brandQtyUrl, request);
log.info("brandQtyUrl接口返回为:" + resultStr);
LuxsanApiResult apiResult = JSONObject.parseObject(resultStr, LuxsanApiResult.class);
if ("E".equals(apiResult.getMSGTY())) {
throw new ValidateException("smfcore.api.error", "接口请求失败[{0}]", new String[]{apiResult.getMSGTX()});
}
if (apiResult.getDATA() != null) {
return JSONObject.parseObject(apiResult.getDATA(), BrandQtyResult.class);
}
} catch (ApiException e) {
e.printStackTrace();
log.info("brandQty--" + partnumber + ":异常:" + e.getMessage());
}
return resultMap;
throw new ValidateException("smfcore.api.error", "接口请求失败[{0}]", new String[]{"未找到料号信息"});
}
......@@ -705,8 +693,39 @@ public class LizhenApi extends DefaultSmfApiListener {
return apiName != null && apiName.equalsIgnoreCase("Lizhen");
}
public static void main(String[] args) {
public Barcode getInDate(Barcode barcode) {
if (StringUtils.isBlank(getInDateUrl)) {
return barcode;
}
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("MATERIAL_CODE", barcode.getPartNumber());
paramMap.put("DATE_CODE", barcode.getDateCode());
paramMap.put("PLANT_CODE", CommonUtil.plantCode);
paramMap.put("BRAND", barcode.getProvider());
try {
log.info(barcode.getBarcode() + ":getInDate入参为:" + JSON.toJSONString(paramMap));
String result = HttpHelper.postJson(getInDateUrl, paramMap);
log.info(barcode.getBarcode() + ":getInDate出参为:" + result);
JSONObject jsonObject = JSON.parseObject(result);
String msgty = jsonObject.getString("MSGTY");
if ("S".equalsIgnoreCase(msgty)) {
int data = jsonObject.getIntValue("DATA");
if (data < 0) {
throw new ValidateException("smfcore.error.barcode.expired", "物料已过期,无法入库");
} else if (data > 0) {
Date expireDate = DateUtil.offsetDay(new Date(), data);
barcode.setExpireDate(expireDate);
} else {
barcode.setExpireDate(null);
}
return barcode;
} else {
throw new ValidateException("smfcore.mesApi.getInDate.ng", barcode.getBarcode() + "验证ng:" + jsonObject.getString("MSGTX"));
}
} catch (Exception e) {
e.printStackTrace();
throw new ValidateException("smfcore.mesApi.getInDate.ng", barcode.getBarcode() + "验证ng:" + e.getMessage());
}
}
}
package com.neotel.smfcore.custom.lizhen.bean.apirequest;
import lombok.AllArgsConstructor;
import lombok.Data;
@Data
@AllArgsConstructor
public class BrandQtyRequest {
private String material_code;
private String brand;
}
\ No newline at end of file
package com.neotel.smfcore.custom.lizhen.bean.apiresult;
import lombok.Data;
@Data
public class BrandQtyResult {
private String id;
private String material_code;
private String brand;
private int qty;
private int reel_size;
private String create_by;
private String create_at;
private String update_by;
private String update_at;
}
package com.neotel.smfcore.custom.lizhen.bean.apiresult;
import lombok.Data;
@Data
public class LuxsanApiResult {
private String MSGTY;
private String MSGTX;
private String DATA;
}
......@@ -24,6 +24,8 @@ import com.neotel.smfcore.core.system.service.manager.IDataLogManager;
import com.neotel.smfcore.core.system.service.po.DataLog;
import com.neotel.smfcore.core.system.util.TaskService;
import com.neotel.smfcore.custom.lizhen.LizhenApi;
import com.neotel.smfcore.custom.lizhen.bean.apirequest.BrandQtyRequest;
import com.neotel.smfcore.custom.lizhen.bean.apiresult.BrandQtyResult;
import com.neotel.smfcore.custom.lizhen.innerBox.bean.VirImportLog;
import com.neotel.smfcore.custom.lizhen.innerBox.enums.ExtendType;
import com.neotel.smfcore.custom.lizhen.innerBox.service.manager.IVirImportLogManager;
......@@ -127,8 +129,8 @@ public class VirtualRestController {
}
//校验是否可以入库
Map<String, Object> brandQty = lizhenApi.brandQty(barcode.getPartNumber(), barcode.getProvider());
if (brandQty == null || brandQty.isEmpty()) {
BrandQtyResult brandQtyResult = lizhenApi.brandQty(new BrandQtyRequest(barcode.getPartNumber(), barcode.getProvider()));
if (brandQtyResult == null) {
return ResultBean.newErrorResult(-1, "smfcore.error.barcode.partNumber.invalid", "{0}不是有效的料号", new String[]{barcode.getPartNumber()});
}
......
......@@ -19,3 +19,9 @@ api:
commonGIRecordUrl: http://10.68.27.68:8002/Sct/CommonGIRecord
#退料
commonRMRecordUrl: http://10.68.27.68:8002/Sct/CommonRMRecord
#获取有限期
getInDateUrl: http://10.68.30.22:8082/api/mes/GetInDate
#散料是否量测
checkReelMeasureUrl: http://10.68.25.75:8001/Sct/CheckReelMeasure
#获取尺寸信息
brandQtyUrl: http://10.68.30.22:8082/api/wcs/brandQty
\ No newline at end of file
......@@ -20,3 +20,9 @@ api:
commonGIRecordUrl: http://10.68.27.68:8002/Sct/CommonGIRecord
#退料
commonRMRecordUrl: http://10.68.27.68:8002/Sct/CommonRMRecord
#获取有限期
getInDateUrl: http://10.42.220.171:8082/api/mes/GetInDate
#散料是否量测
checkReelMeasureUrl: http://10.68.25.75:8001/Sct/CheckReelMeasure
#获取尺寸信息
brandQtyUrl: http://10.42.220.171:8082/api/mlb/brandQty
\ No newline at end of file
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!