Commit 0d05ba78 zshaohui

平板页面和功能优化提交

1 个父辈 d74e613e
正在显示 27 个修改的文件 包含 639 行增加83 行删除
...@@ -212,4 +212,15 @@ public class Constants { ...@@ -212,4 +212,15 @@ public class Constants {
*/ */
public static final String Cache_Setting_Export = "Cache_Setting_Export"; public static final String Cache_Setting_Export = "Cache_Setting_Export";
/**
* 出料口设置,Ip和Mac
*/
public static final String Cache_Setting_Ip_Mac = "Cache_Setting_Ip_Mac";
/**
* 料串缓存
*/
public static final String Cache_Stacker_PutIN = "Cache_Stacker_PutIN";
} }
...@@ -407,7 +407,11 @@ public class FileUtil extends cn.hutool.core.io.FileUtil { ...@@ -407,7 +407,11 @@ public class FileUtil extends cn.hutool.core.io.FileUtil {
// 假设这是您要导出的数据 // 假设这是您要导出的数据
List<String> dataToExport = new ArrayList<>(); List<String> dataToExport = new ArrayList<>();
//for (List<String> header : headers) { //for (List<String> header : headers) {
dataToExport.add(org.apache.logging.log4j.util.Strings.join( headers, ',')); List<String> headerList = new ArrayList<>();
for (List<String> header : headers) {
headerList.addAll(header);
}
dataToExport.add(org.apache.logging.log4j.util.Strings.join( headerList, ','));
//} //}
for (List<Object> data : datas) { for (List<Object> data : datas) {
dataToExport.add(org.apache.logging.log4j.util.Strings.join( data, ',')); dataToExport.add(org.apache.logging.log4j.util.Strings.join( data, ','));
......
...@@ -120,7 +120,7 @@ public class CodeResolve { ...@@ -120,7 +120,7 @@ public class CodeResolve {
try{ try{
if((codeBeanFromRule.getBarcode()!=null)&&(codeBeanFromRule.getBarcode().getPartNumber()!=null)) { if((codeBeanFromRule.getBarcode()!=null)&&(codeBeanFromRule.getBarcode().getPartNumber()!=null)) {
if (!barcode.getPartNumber().equals(codeBeanFromRule.getBarcode().getPartNumber())) { if (!barcode.getPartNumber().equals(codeBeanFromRule.getBarcode().getPartNumber()) && !barcode.isBox()) {
try { try {
log.warn("[" + barcode.getBarcode() + "]重新设置PN[" + barcode.getPartNumber() + "]为[" + codeBeanFromRule.getBarcode().getPartNumber() + "]"); log.warn("[" + barcode.getBarcode() + "]重新设置PN[" + barcode.getPartNumber() + "]为[" + codeBeanFromRule.getBarcode().getPartNumber() + "]");
barcode.setPartNumber(codeBeanFromRule.getBarcode().getPartNumber()); barcode.setPartNumber(codeBeanFromRule.getBarcode().getPartNumber());
......
...@@ -65,6 +65,16 @@ public enum OP_STATUS { ...@@ -65,6 +65,16 @@ public enum OP_STATUS {
/** /**
* 等待取出 * 等待取出
*/ */
WAITING_FOR_RETRIEVAL WAITING_FOR_RETRIEVAL,
/**
* 正在出库
*/
OUTTING,
/**
* 出库完成
*/
OUTBOX,
; ;
} }
...@@ -259,6 +259,7 @@ public class XLRBoxHandler extends BaseDeviceHandler { ...@@ -259,6 +259,7 @@ public class XLRBoxHandler extends BaseDeviceHandler {
} }
if (outTask != null) { if (outTask != null) {
log.info("分配优先(单盘或无工单)出库任务" + outTask.getBarcode() + "[" + outTask.getPosName() + "]到 " + cid); log.info("分配优先(单盘或无工单)出库任务" + outTask.getBarcode() + "[" + outTask.getPosName() + "]到 " + cid);
return outTask;
} }
//分配出料口不为空的 //分配出料口不为空的
......
...@@ -760,7 +760,7 @@ public class LiteOrderCache { ...@@ -760,7 +760,7 @@ public class LiteOrderCache {
if (task.isCheckOutTask()) { if (task.isCheckOutTask()) {
String posId = task.getPosId(); String posId = task.getPosId();
if (!Strings.isNullOrEmpty(posId)) { if (!Strings.isNullOrEmpty(posId)) {
log.info("需要排除的库位为:" + task.getPosName() + ",barcode为:" + task.getBarcode() + ",任务状态为:" + task.getStatus() + ",上一次修改时间为:" + task.getUpdateDate()); log.info("需要排除的库位为:" + task.getPosName() + ",barcode为:" + task.getBarcode() + ",任务状态为:" + task.getStatus() + ",上一次修改时间为:" + task.getUpdateDate()+",物料编号为:"+task.getPartNumber());
operatingPosIds.add(task.getPosId()); operatingPosIds.add(task.getPosId());
} }
} }
...@@ -981,6 +981,9 @@ public class LiteOrderCache { ...@@ -981,6 +981,9 @@ public class LiteOrderCache {
//根据站位号,分配到不同出料口 //根据站位号,分配到不同出料口
String putInExport = StorageExportUtil.getPutInExport(emptyExportList, countTask > 1, feederInfo); String putInExport = StorageExportUtil.getPutInExport(emptyExportList, countTask > 1, feederInfo);
log.info("feeder为:" + feederInfo + ",工单号为:" + orderNo + ",获取到的出料口为:" + putInExport); log.info("feeder为:" + feederInfo + ",工单号为:" + orderNo + ",获取到的出料口为:" + putInExport);
if (StringUtils.isEmpty(putInExport)){
break;
}
//开始生成出库任务 //开始生成出库任务
Barcode barcode = pos.getBarcode(); Barcode barcode = pos.getBarcode();
//List<Barcode> subCodeList = barcode.getSubCodeList(); //List<Barcode> subCodeList = barcode.getSubCodeList();
...@@ -1035,7 +1038,9 @@ public class LiteOrderCache { ...@@ -1035,7 +1038,9 @@ public class LiteOrderCache {
} }
// task = dataLogDao.save(task); // task = dataLogDao.save(task);
taskService.addTaskToExecute(task); taskService.addTaskToExecute(task);
StorageExportUtil.updateExportData(putInExport, barcode.getBarcode(), feederInfo, orderNo, task.getStatus()); if (!barcode.isBox()) {
StorageExportUtil.updateExportData(putInExport, barcode.getBarcode(), feederInfo, orderNo, task.getStatus());
}
} }
} }
} }
......
...@@ -412,7 +412,11 @@ public class OrderController { ...@@ -412,7 +412,11 @@ public class OrderController {
data.add(orderItem.getOutReelCount()); data.add(orderItem.getOutReelCount());
data.add(orderItem.getNeedNum()); data.add(orderItem.getNeedNum());
data.add(orderItem.getOutNum()); data.add(orderItem.getOutNum());
data.add(orderItem.getBarcodeStr()); String barcodeStr = orderItem.getBarcodeStr();
if (StringUtils.isNotEmpty(barcodeStr)){
barcodeStr = barcodeStr.replace("\n","_");
}
data.add(barcodeStr);
String export = ""; String export = "";
List<Barcode> outBarcodeList = orderItem.getOutBarcodeList(); List<Barcode> outBarcodeList = orderItem.getOutBarcodeList();
......
...@@ -279,7 +279,7 @@ public class MaterialBoxController { ...@@ -279,7 +279,7 @@ public class MaterialBoxController {
dataLog.setBarcode(barcode.getBarcode()); dataLog.setBarcode(barcode.getBarcode());
dataLog.setNum(amount); dataLog.setNum(amount);
dataLog.setType(OP.PUT_IN); dataLog.setType(OP.PUT_IN);
dataLog.setPosName(boxBarcode.getPosName()); dataLog.setPosName(boxBarcode.getBarcode());
dataLog.setPartNumber(barcode.getPartNumber()); dataLog.setPartNumber(barcode.getPartNumber());
dataLog.setStatus(OP_STATUS.FINISHED.name()); dataLog.setStatus(OP_STATUS.FINISHED.name());
dataLogManager.save(dataLog); dataLogManager.save(dataLog);
......
...@@ -167,12 +167,17 @@ public class TaskService { ...@@ -167,12 +167,17 @@ public class TaskService {
smfApi.onTaskStatusChange(task); smfApi.onTaskStatusChange(task);
selfAuditUtil.onTaskStatusChange(task); selfAuditUtil.onTaskStatusChange(task);
//修改出料口信息 //修改出料口信息
if (task.isCheckOutTask()) { try {
String export = task.getExport(); if (task.isCheckOutTask()) {
if (StringUtils.isNotEmpty(export)) { String export = task.getExport();
StorageExportUtil.updateExportData(export, task.getBarcode(), task.getAppendData("feederInfo"), task.getSourceName(), task.getStatus()); if (StringUtils.isNotEmpty(export)) {
StorageExportUtil.updateExportData(export, task.getBarcode(), task.getAppendData("feederInfo"), task.getSourceName(), task.getStatus());
}
} }
} catch (Exception e){
log.error("修改出料口报错:",e);
} }
} }
/** /**
......
package com.neotel.smfcore.custom.Jkem21481.bean;
import lombok.AllArgsConstructor;
import lombok.Data;
@Data
@AllArgsConstructor
public class StackerCache {
private String stacker;
private int h;
private int w;
private int msd;
private int count;
}
...@@ -3,12 +3,11 @@ package com.neotel.smfcore.custom.Jkem21481.bean; ...@@ -3,12 +3,11 @@ package com.neotel.smfcore.custom.Jkem21481.bean;
import lombok.Data; import lombok.Data;
@Data @Data
public class UmSetting { public class UmSettingMacAndIp {
//ip //ip
private String ip; private String ip;
//对应的出料口 //出料口
private String export; private String outLet;
} }
...@@ -10,7 +10,7 @@ import java.util.Date; ...@@ -10,7 +10,7 @@ import java.util.Date;
public class MjPartNumberQueryCondition { public class MjPartNumberQueryCondition {
@QueryCondition(blurry = "makerPartNumber,jkemPartNumber") @QueryCondition(blurry = "makerPartNumber,jkemPartNumber")
private String bluuy; private String blurry;
@QueryCondition(type = QueryCondition.Type.BETWEEN) @QueryCondition(type = QueryCondition.Type.BETWEEN)
private BetweenData<Date> createDate; private BetweenData<Date> createDate;
......
package com.neotel.smfcore.custom.Jkem21481; package com.neotel.smfcore.custom.Jkem21481.controller;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.google.common.base.Strings; import com.google.common.base.Strings;
...@@ -163,13 +163,13 @@ public class JkemController { ...@@ -163,13 +163,13 @@ public class JkemController {
//判断是不是要入到指定的料仓 //判断是不是要入到指定的料仓
List<String> newCidList = new ArrayList<>(); List<String> newCidList = new ArrayList<>();
List<Storage> newStorageList = new ArrayList<>(); List<Storage> newStorageList = new ArrayList<>();
MJPartNumber mjPartNumber = partNumberManager.findByMakerPartNumber(barcode.getPartNumber()); MJPartNumber mjPartNumber = partNumberManager.findByJkemPartNumber(barcode.getPartNumber());
if (mjPartNumber != null){ if (mjPartNumber != null){
log.info(barcode.getBarcode()+"查询到的信息为:"+JSON.toJSONString(mjPartNumber)); log.info(barcode.getBarcode()+"查询到的信息为:"+JSON.toJSONString(mjPartNumber));
int msd = mjPartNumber.getMsd(); int msd = mjPartNumber.getMsd();
if (msd == 1){ if (msd == 1){
for (String cid : cidList) { for (String cid : cidList) {
if (!msdCidList.contains(cid)){ if (msdCidList.contains(cid)){
newCidList.add(cid); newCidList.add(cid);
Storage storage = dataCache.getStorage(cid); Storage storage = dataCache.getStorage(cid);
newStorageList.add(storage); newStorageList.add(storage);
...@@ -368,6 +368,15 @@ public class JkemController { ...@@ -368,6 +368,15 @@ public class JkemController {
log.info(barcodeStr + "获取目的地信息"); log.info(barcodeStr + "获取目的地信息");
CodeBean codeBean = codeResolve.resolveSingleCode(barcodeStr); CodeBean codeBean = codeResolve.resolveSingleCode(barcodeStr);
Barcode barcode = codeBean.getBarcode(); Barcode barcode = codeBean.getBarcode();
if(barcode == null){
if (barcodeStr.endsWith("##")){
barcodeStr=barcodeStr.substring(0,barcodeStr.length()-2);
codeBean=codeResolve.resolveSingleCode(barcodeStr);
barcode = codeBean.getBarcode();
}
}
if (barcode != null) { if (barcode != null) {
log.info("解析到的条码信息为:"+barcode.getBarcode()); log.info("解析到的条码信息为:"+barcode.getBarcode());
List<DataLog> allTasks = taskService.getAllTasks(); List<DataLog> allTasks = taskService.getAllTasks();
...@@ -427,6 +436,15 @@ public class JkemController { ...@@ -427,6 +436,15 @@ public class JkemController {
log.info("IA 出库更新任务状态--barcode:{},status:{},loc:{},hSerial:{},outlet:{},boxSide:{},cid:{},outlet:{},x:{},y:{}", code, status, loc, hSerial, outlet, boxSide, cid, outlet, x, y); log.info("IA 出库更新任务状态--barcode:{},status:{},loc:{},hSerial:{},outlet:{},boxSide:{},cid:{},outlet:{},x:{},y:{}", code, status, loc, hSerial, outlet, boxSide, cid, outlet, x, y);
CodeBean codeBean = codeResolve.resolveSingleCode(code); CodeBean codeBean = codeResolve.resolveSingleCode(code);
Barcode barcode = codeBean.getBarcode(); Barcode barcode = codeBean.getBarcode();
if(barcode == null){
if (code.endsWith("##")){
code=code.substring(0,code.length()-2);
codeBean=codeResolve.resolveSingleCode(code);
barcode = codeBean.getBarcode();
}
}
if (barcode == null) { if (barcode == null) {
return ResultBean.newErrorResult(-1,"smfcore.error.barcode.invalid","{0}不是有效的条码",new String[]{code}); return ResultBean.newErrorResult(-1,"smfcore.error.barcode.invalid","{0}不是有效的条码",new String[]{code});
} }
...@@ -517,6 +535,22 @@ public class JkemController { ...@@ -517,6 +535,22 @@ public class JkemController {
} }
@ApiOperation("获取未完成的出库任务数量")
@RequestMapping("/jkem/getCheckOutTaskCount")
@AnonymousAccess
public ResultBean getCheckOutTaskCount(){
int count = 0;
List<DataLog> allTasks = taskService.getAllTasks();
for (DataLog dataLog : allTasks) {
if (dataLog.isCheckOutTask() && !dataLog.isFinished() && !dataLog.isCancel()){
count ++;
}
}
return ResultBean.newOkResult(count);
}
/** /**
* 物料取出 * 物料取出
......
...@@ -18,6 +18,7 @@ import lombok.RequiredArgsConstructor; ...@@ -18,6 +18,7 @@ import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestParam;
...@@ -64,7 +65,7 @@ public class PartNumberController { ...@@ -64,7 +65,7 @@ public class PartNumberController {
//根据供应商的pn,查询是否存在,修改 //根据供应商的pn,查询是否存在,修改
for (MJPartNumber mjPartNumber : partNumberList) { for (MJPartNumber mjPartNumber : partNumberList) {
MJPartNumber daMjPartNumber = partNumberManager.findByMakerPartNumber(mjPartNumber.getMakerPartNumber()); MJPartNumber daMjPartNumber = partNumberManager.findByJkemPartNumber(mjPartNumber.getJkemPartNumber());
if (daMjPartNumber == null){ if (daMjPartNumber == null){
partNumberManager.save(mjPartNumber); partNumberManager.save(mjPartNumber);
} else { } else {
...@@ -77,6 +78,7 @@ public class PartNumberController { ...@@ -77,6 +78,7 @@ public class PartNumberController {
daMjPartNumber.setMakerPartNumber(mjPartNumber.getMakerPartNumber()); daMjPartNumber.setMakerPartNumber(mjPartNumber.getMakerPartNumber());
daMjPartNumber.setMsd(mjPartNumber.getMsd()); daMjPartNumber.setMsd(mjPartNumber.getMsd());
daMjPartNumber.setPitch(mjPartNumber.getPitch()); daMjPartNumber.setPitch(mjPartNumber.getPitch());
partNumberManager.save(daMjPartNumber);
} }
} }
} }
...@@ -87,7 +89,8 @@ public class PartNumberController { ...@@ -87,7 +89,8 @@ public class PartNumberController {
@RequestMapping("/list") @RequestMapping("/list")
//@AnonymousAccess //@AnonymousAccess
public PageData<MJPartNumber> list(MjPartNumberQueryCondition queryCondition, Pageable pageable){ public PageData<MJPartNumber> list(MjPartNumberQueryCondition queryCondition, Pageable pageable){
return partNumberManager.findByPage(QueryHelp.getQuery(queryCondition),pageable); Query query = QueryHelp.getQuery(queryCondition);
return partNumberManager.findByPage(query,pageable);
} }
...@@ -184,8 +187,19 @@ public class PartNumberController { ...@@ -184,8 +187,19 @@ public class PartNumberController {
Map<Integer, String> dataMap = dataMapList.get(i); Map<Integer, String> dataMap = dataMapList.get(i);
MJPartNumber mjPartNumber = new MJPartNumber(); MJPartNumber mjPartNumber = new MJPartNumber();
mjPartNumber.setJkemPartNumber(dataMap.get(jkemPartNumberIndex));
mjPartNumber.setMakerPartNumber(dataMap.get(makerPartNumberIndex)); String jkemPartNumber = dataMap.get(jkemPartNumberIndex);
String makerPartNumber = dataMap.get(makerPartNumberIndex);
if (StringUtils.isEmpty(makerPartNumber)){
continue;
}
if (StringUtils.isEmpty(jkemPartNumber)){
continue;
}
mjPartNumber.setJkemPartNumber(jkemPartNumber);
makerPartNumber = makerPartNumber.replace(" ","");
mjPartNumber.setMakerPartNumber(makerPartNumber);
//-1代表解析失败 //-1代表解析失败
mjPartNumber.setPitch(-1); mjPartNumber.setPitch(-1);
......
package com.neotel.smfcore.custom.Jkem21481.controller;
import com.alibaba.fastjson.JSON;
import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.common.utils.StringUtils;
import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.core.storage.service.po.Storage;
import com.neotel.smfcore.core.system.util.TaskService;
import com.neotel.smfcore.custom.Jkem21481.bean.MJPartNumber;
import com.neotel.smfcore.custom.Jkem21481.bean.StackerCache;
import com.neotel.smfcore.custom.Jkem21481.manager.IPartNumberManager;
import com.neotel.smfcore.custom.Jkem21481.util.StackerUtil;
import com.neotel.smfcore.security.annotation.AnonymousAccess;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.*;
import java.util.stream.Collectors;
@Api(tags = "料串信息类")
@Slf4j
@RestController
@RequestMapping("/stacker")
public class StackerController {
@Autowired
private DataCache dataCache;
@Autowired
private TaskService taskService;
@Autowired
private IPartNumberManager partNumberManager;
@ApiOperation("修改料串信息")
@RequestMapping("/updateStacker")
@AnonymousAccess
public ResultBean updateStacker(int w, int h, String stacker, String partNumber) {
log.info("收到修改料串[{}]信息,宽为[{}],高为[{}],partNumber为[{}]", stacker, w, h, partNumber);
if (StringUtils.isEmpty(stacker)) {
return ResultBean.newErrorResult(-1, "smfcore.valueCanotNull", "{0}不能为空", new String[]{"stacker"});
}
if (StringUtils.isEmpty(partNumber)) {
return ResultBean.newErrorResult(-1, "smfcore.valueCanotNull", "{0}不能为空", new String[]{"partNumber"});
}
if (w <= 0) {
return ResultBean.newErrorResult(-1, "smfcore.valueInvalid", "[{0}]不是有效的参数", new String[]{w + ""});
}
if (h <= 0) {
return ResultBean.newErrorResult(-1, "smfcore.valueInvalid", "[{0}]不是有效的参数", new String[]{h + ""});
}
int msd = 0;
MJPartNumber mjPartNumber = partNumberManager.findByJkemPartNumber(partNumber);
if (mjPartNumber != null){
msd = mjPartNumber.getMsd() < 0 ? 0 : mjPartNumber.getMsd();
}
StackerUtil.updateStacker(stacker,h,w,msd);
return ResultBean.newOkResult("");
}
@ApiOperation("移除料串信息")
@RequestMapping("/removeStacker")
@AnonymousAccess
public ResultBean removeStacker(String stacker) {
log.info("移除料串[{}]信息",stacker);
if (StringUtils.isEmpty(stacker)) {
return ResultBean.newErrorResult(-1, "smfcore.valueCanotNull", "{0}不能为空", new String[]{"stacker"});
}
StackerUtil.removeStacker(stacker);
return ResultBean.newOkResult("");
}
@ApiOperation("根据料串信息,获取可用的料仓")
@RequestMapping("/getAvailableStorageByStacker")
@AnonymousAccess
public ResultBean getAvailableStorageByStacker(String stacker) {
log.info("移除料串[{}]信息", stacker);
if (StringUtils.isEmpty(stacker)) {
return ResultBean.newErrorResult(-1, "smfcore.valueCanotNull", "{0}不能为空", new String[]{"stacker"});
}
boolean bindStacker = StackerUtil.isBindStacker(stacker);
if (!bindStacker) {
return ResultBean.newErrorResult(-1, "smfcore.valueNotFind", "未找到{0}[{1}]", new String[]{"stacker", stacker});
}
List<String> availableStorageList = getAvailableStorage(stacker);
return ResultBean.newOkResult(availableStorageList);
}
private static final List<String> msdCidList = Arrays.asList("XLR4A","XLR4B","XLR5A","XLR5B","XLR6A","XLR6B");
private List<String> getAvailableStorage(String stacker) {
List<StackerCache> stackerCacheList = StackerUtil.getDetailByStacker(stacker);
//Msd和非Msd列表
List<StackerCache> msdList = new ArrayList<>();
List<StackerCache> noMsdList = new ArrayList<>();
for (StackerCache cache : stackerCacheList) {
if (cache.getMsd() == 1) {
msdList.add(cache);
} else {
noMsdList.add(cache);
}
}
if (msdList != null && !msdList.isEmpty()) {
log.info("料串[{}]的msd不为空,信息为[{}],直接返回Msd列表", stacker, JSON.toJSONString(msdList));
return msdCidList;
}
List<String> availableStorageList = new ArrayList<>();
for (Storage storage : dataCache.getAllStorage().values()) {
if (msdCidList.contains(storage.getCid())){
continue;
}
for (StackerCache stackerCache : noMsdList) {
if (storage.canPutIn(stackerCache.getW(),stackerCache.getH())){
availableStorageList.add(storage.getCid());
}
}
}
if (availableStorageList != null && !availableStorageList.isEmpty()){
availableStorageList = availableStorageList.stream().distinct().collect(Collectors.toList());
return availableStorageList;
}
for (Storage storage : dataCache.getAllStorage().values()) {
if (!msdCidList.contains(storage.getCid())){
continue;
}
for (StackerCache stackerCache : noMsdList) {
if (storage.canPutIn(stackerCache.getW(),stackerCache.getH())){
availableStorageList.add(storage.getCid());
}
}
}
if (availableStorageList != null && !availableStorageList.isEmpty()){
availableStorageList = availableStorageList.stream().distinct().collect(Collectors.toList());
return availableStorageList;
}
return new ArrayList<>();
}
}
...@@ -7,15 +7,24 @@ import com.neotel.smfcore.core.device.util.DataCache; ...@@ -7,15 +7,24 @@ import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.core.system.service.po.DataLog; import com.neotel.smfcore.core.system.service.po.DataLog;
import com.neotel.smfcore.core.system.util.TaskService; import com.neotel.smfcore.core.system.util.TaskService;
import com.neotel.smfcore.custom.Jkem21481.bean.StorageExport; import com.neotel.smfcore.custom.Jkem21481.bean.StorageExport;
import com.neotel.smfcore.custom.Jkem21481.bean.StorageExportOutDetail;
import com.neotel.smfcore.custom.Jkem21481.bean.dto.StorageExportDto; import com.neotel.smfcore.custom.Jkem21481.bean.dto.StorageExportDto;
import com.neotel.smfcore.custom.Jkem21481.util.NetworkUtil;
import com.neotel.smfcore.custom.Jkem21481.util.StorageExportUtil; import com.neotel.smfcore.custom.Jkem21481.util.StorageExportUtil;
import com.neotel.smfcore.custom.Jkem21481.util.UmSettingUtil;
import com.neotel.smfcore.security.annotation.AnonymousAccess; import com.neotel.smfcore.security.annotation.AnonymousAccess;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.UnknownHostException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Comparator; import java.util.Comparator;
import java.util.List; import java.util.List;
...@@ -43,6 +52,31 @@ public class StorageExportController { ...@@ -43,6 +52,31 @@ public class StorageExportController {
} }
@ApiOperation("平板电脑获取出料口详情")
@PostMapping("/tabletGetExportDetail")
@AnonymousAccess
public ResultBean getDetailByExport(HttpServletRequest request, @RequestBody Map<String, String> paramMap) {
String type = paramMap.get("type");
if (!"tablet".equals(type)) {
return ResultBean.newErrorResult(-1, "smfcore.valueInvalid", "[{0}]不是有效的参数", new String[]{type});
}
String requestIp = NetworkUtil.getIpAddress(request);
//保存配置信息
UmSettingUtil.updateMacAndIp(requestIp, "");
//获取出料口信息
String outLet = UmSettingUtil.getOutLetByIp(requestIp);
if (StringUtils.isNotEmpty(outLet)) {
return ResultBean.newOkResult(getStorageExportDto(outLet));
}
return ResultBean.newErrorResult(-1,"smfcore.valueNotFind","未找到{0}[{1}]",new String[]{"outLet",requestIp});
}
@ApiOperation("清空出料口") @ApiOperation("清空出料口")
@RequestMapping("/clearExport") @RequestMapping("/clearExport")
@AnonymousAccess @AnonymousAccess
...@@ -58,8 +92,10 @@ public class StorageExportController { ...@@ -58,8 +92,10 @@ public class StorageExportController {
String taskExport = dataLog.getExport(); String taskExport = dataLog.getExport();
if (StringUtils.isNotEmpty(taskExport) && StringUtils.isNotEmpty(feederInfo)) { if (StringUtils.isNotEmpty(taskExport) && StringUtils.isNotEmpty(feederInfo)) {
if (taskExport.startsWith(export) && feederInfo.startsWith(feeder)) { if (taskExport.startsWith(export) && feederInfo.startsWith(feeder)) {
log.info("清空出料口:" + export + ",feeder为:" + feeder + ",任务需要取消,barcode为:" + dataLog.getBarcode() + ",状态为:" + dataLog.getStatus()); if (dataLog.isWait()) {
needCancelTask.add(dataLog); log.info("清空出料口:" + export + ",feeder为:" + feeder + ",任务需要取消,barcode为:" + dataLog.getBarcode() + ",状态为:" + dataLog.getStatus());
needCancelTask.add(dataLog);
}
} }
} }
} }
...@@ -121,6 +157,11 @@ public class StorageExportController { ...@@ -121,6 +157,11 @@ public class StorageExportController {
dto.setFeederInfo(feeder); dto.setFeederInfo(feeder);
} }
dto.setHSerial(storageExport.getHSerial()); dto.setHSerial(storageExport.getHSerial());
List<StorageExportOutDetail> detailList = storageExport.getDetailList();
if (detailList != null && !detailList.isEmpty()){
detailList = detailList.stream().sorted(Comparator.comparing(StorageExportOutDetail::getFeederInfo)).collect(Collectors.toList());
}
storageExport.setDetailList(detailList);
outDetailList.add(storageExport); outDetailList.add(storageExport);
} }
} }
......
package com.neotel.smfcore.custom.Jkem21481.controller;
import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.common.utils.Constants;
import com.neotel.smfcore.core.barcode.service.po.Barcode;
import com.neotel.smfcore.core.barcode.utils.CodeResolve;
import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.custom.Jkem21481.bean.StorageExportOutDetail;
import com.neotel.smfcore.custom.Jkem21481.bean.UmSettingMacAndIp;
import com.neotel.smfcore.custom.Jkem21481.util.StorageExportUtil;
import com.neotel.smfcore.custom.Jkem21481.util.UmSettingUtil;
import com.neotel.smfcore.security.annotation.AnonymousAccess;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@ApiOperation("出料口配置")
@RestController
@RequestMapping("/umExportSetting")
public class UmExportSettingController {
@Autowired
private DataCache dataCache;
@Autowired
private CodeResolve codeResolve;
@ApiOperation("获取平板上出料口设置")
@RequestMapping("/getUmSetting")
@AnonymousAccess
public ResultBean getUmSetting() {
Map<String, UmSettingMacAndIp> cacheMap = dataCache.getCache(Constants.Cache_Setting_Ip_Mac);
if (cacheMap == null) {
cacheMap = new ConcurrentHashMap<>();
}
return ResultBean.newOkResult(cacheMap.values());
}
@ApiOperation("平板上出料口设置")
@RequestMapping("/updateUmSetting")
@AnonymousAccess
public ResultBean updateUmSetting(@RequestBody List<UmSettingMacAndIp> settingList) {
for (UmSettingMacAndIp macAndIp : settingList) {
UmSettingUtil.updateMacAndIp(macAndIp.getIp(), macAndIp.getOutLet());
}
return ResultBean.newOkResult("");
}
@ApiOperation("获取所有的的Mac地址")
@RequestMapping("/getAllClientIp")
@AnonymousAccess
public ResultBean getAllMac() {
Map<String, UmSettingMacAndIp> cacheMap = dataCache.getCache(Constants.Cache_Setting_Ip_Mac);
if (cacheMap == null) {
cacheMap = new ConcurrentHashMap<>();
}
List<String> requestIdList = new ArrayList<>();
for (UmSettingMacAndIp macAndIp : cacheMap.values()) {
requestIdList.add(macAndIp.getIp());
}
return ResultBean.newOkResult(requestIdList);
}
@ApiOperation("平板上出料口设置")
@RequestMapping("/deleteByIp")
@AnonymousAccess
public ResultBean removeByIp(String requestIp) {
UmSettingUtil.removeByIp(requestIp);
return ResultBean.newOkResult("");
}
@ApiOperation("获取料盘的Feeder")
@RequestMapping("/getFeederByCode")
@AnonymousAccess
public ResultBean getFeederByCode(String code) {
Barcode barcode = codeResolve.resolveOneValideBarcode(code);
if (barcode == null) {
return ResultBean.newErrorResult(-1, "smfcore.error.barcode.invalid", "{0}不是有效的条码", new String[]{code});
}
//根据barcode获取
String barcodeStr = barcode.getBarcode();
StorageExportOutDetail detail = StorageExportUtil.getFeederByBarcode(barcodeStr);
if (detail != null){
return ResultBean.newOkResult(detail);
}
return ResultBean.newErrorResult(-1,"smfcore.valueNotFind","未找到{0}[{1}]",new String[]{"feeder",barcodeStr});
}
}
package com.neotel.smfcore.custom.Jkem21481.controller;
import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.common.utils.Constants;
import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.custom.Jkem21481.bean.UmSetting;
import com.neotel.smfcore.security.annotation.AnonymousAccess;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@ApiOperation("出料口配置")
@RestController
@RequestMapping("/umSetting")
public class UmSettingController {
/*@Autowired
private DataCache dataCache;
@ApiOperation("平板上出料口设置")
@RequestMapping("/updateUmSetting")
@AnonymousAccess
public ResultBean updateUmSetting(@RequestBody List<UmSetting> settingList) {
Map<String, String> cacheMap = dataCache.getCache(Constants.Cache_Setting_Export);
if (cacheMap == null) {
cacheMap = new ConcurrentHashMap<>();
}
for (UmSetting umSetting : settingList) {
cacheMap.put(umSetting.getIp(), umSetting.getExport());
}
dataCache.updateCache(Constants.Cache_Setting_Export, cacheMap);
return ResultBean.newOkResult(cacheMap);
}
@ApiOperation("获取平板上出料口设置")
@RequestMapping("/updateUmSetting")
@AnonymousAccess
public ResultBean getUmSetting() {
Map<String, String> cacheMap = dataCache.getCache(Constants.Cache_Setting_Export);
if (cacheMap == null) {
cacheMap = new ConcurrentHashMap<>();
}
return ResultBean.newOkResult(cacheMap);
}*/
}
package com.neotel.smfcore.custom.Jkem21481.util;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import java.net.InetAddress;
@Component
public class NetworkUtil {
/**
* 获取ip地址
*/
public static String getIpAddress(HttpServletRequest request) {
String ip = request.getHeader("x-forwarded-for");
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_CLIENT_IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_X_FORWARDED_FOR");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
// 本机访问
if ("localhost".equalsIgnoreCase(ip) || "127.0.0.1".equalsIgnoreCase(ip) || "0:0:0:0:0:0:0:1".equalsIgnoreCase(ip)){
// 根据网卡取本机配置的IP
InetAddress inet;
try {
inet = InetAddress.getLocalHost();
ip = inet.getHostAddress();
} catch (Exception e) {
e.printStackTrace();
}
}
// 对于通过多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割
if (null != ip && ip.length() > 15) {
if (ip.indexOf(",") > 15) {
ip = ip.substring(0, ip.indexOf(","));
}
}
return ip;
}
}
package com.neotel.smfcore.custom.Jkem21481.util;
import com.neotel.smfcore.common.utils.Constants;
import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.custom.Jkem21481.bean.StackerCache;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
@Slf4j
@Component
public class StackerUtil {
private static DataCache dataCache;
@Autowired
private void setDataCache(DataCache cache){
StackerUtil.dataCache = cache;
}
public static synchronized void updateStacker(String stacker, int h, int w, int msd) {
Map<String, List<StackerCache>> cacheMap = dataCache.getCache(Constants.Cache_Stacker_PutIN);
if (cacheMap == null) {
cacheMap = new ConcurrentHashMap<>();
}
List<StackerCache> cacheList = cacheMap.get(stacker);
if (cacheList == null) {
cacheList = new ArrayList<>();
cacheList.add(new StackerCache(stacker, h, w, msd, 1));
} else {
StackerCache cache = null;
for (StackerCache stackerCache : cacheList) {
if (stackerCache.getH() == h && stackerCache.getW() == w && stackerCache.getMsd() == stackerCache.getMsd()) {
stackerCache.setCount(stackerCache.getCount()+1);
cache = stackerCache;
break;
}
}
if (cache == null) {
cache = new StackerCache(stacker, h, w, msd, 0);
cacheList.add(cache);
}
}
cacheMap.put(stacker,cacheList);
dataCache.updateCache(Constants.Cache_Stacker_PutIN,cacheMap);
}
public static synchronized void removeStacker(String stacker) {
Map<String, List<StackerCache>> cacheMap = dataCache.getCache(Constants.Cache_Stacker_PutIN);
if (cacheMap == null) {
cacheMap = new ConcurrentHashMap<>();
}
cacheMap.remove(stacker);
dataCache.updateCache(Constants.Cache_Stacker_PutIN,cacheMap);
}
public static boolean isBindStacker(String stacker){
Map<String, List<StackerCache>> cacheMap = dataCache.getCache(Constants.Cache_Stacker_PutIN);
if (cacheMap == null) {
cacheMap = new ConcurrentHashMap<>();
}
return cacheMap.containsKey(stacker);
}
public static List<StackerCache> getDetailByStacker(String stacker){
Map<String, List<StackerCache>> cacheMap = dataCache.getCache(Constants.Cache_Stacker_PutIN);
if (cacheMap == null) {
cacheMap = new ConcurrentHashMap<>();
}
return cacheMap.get(stacker);
}
}
...@@ -389,4 +389,19 @@ public class StorageExportUtil { ...@@ -389,4 +389,19 @@ public class StorageExportUtil {
} }
return storageExport; return storageExport;
} }
public static StorageExportOutDetail getFeederByBarcode(String barcodeStr) {
for (StorageExport export : exportMap.values()) {
List<StorageExportOutDetail> detailList = export.getDetailList();
if (detailList != null && !detailList.isEmpty()) {
for (StorageExportOutDetail detail : detailList) {
if (detail.getBarcode().equals(barcodeStr)){
return detail;
}
}
}
}
return null;
}
} }
package com.neotel.smfcore.custom.Jkem21481.util;
import com.neotel.smfcore.common.utils.Constants;
import com.neotel.smfcore.common.utils.StringUtils;
import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.custom.Jkem21481.bean.UmSettingMacAndIp;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@Slf4j
@Component
public class UmSettingUtil {
private static DataCache dataCache;
@Autowired
private void setDataCache(DataCache cache){
UmSettingUtil.dataCache = cache;
}
public static void updateMacAndIp(String requestIp,String outLet) {
Map<String, UmSettingMacAndIp> cacheMap = dataCache.getCache(Constants.Cache_Setting_Ip_Mac);
if (cacheMap == null) {
cacheMap = new ConcurrentHashMap<>();
}
String newRequestIp = requestIp.replace(".", "_");
UmSettingMacAndIp setting = cacheMap.get(newRequestIp);
if (setting == null) {
setting = new UmSettingMacAndIp();
}
setting.setIp(requestIp);
if (StringUtils.isNotEmpty(outLet)){
setting.setOutLet(outLet);
}
cacheMap.put(newRequestIp,setting);
dataCache.updateCache(Constants.Cache_Setting_Ip_Mac,cacheMap);
}
public static String getOutLetByIp(String requestIp) {
String newRequestIp = requestIp.replace(".", "_");
Map<String, UmSettingMacAndIp> cacheMap = dataCache.getCache(Constants.Cache_Setting_Ip_Mac);
if (cacheMap == null) {
cacheMap = new ConcurrentHashMap<>();
}
UmSettingMacAndIp setting = cacheMap.get(newRequestIp);
if (setting == null){
return "";
}
return setting.getOutLet();
}
public static void removeByIp(String requestIp) {
String newRequestIp = requestIp.replace(".", "_");
Map<String, UmSettingMacAndIp> cacheMap = dataCache.getCache(Constants.Cache_Setting_Ip_Mac);
if (cacheMap == null) {
cacheMap = new ConcurrentHashMap<>();
}
cacheMap.remove(newRequestIp);
dataCache.updateCache(Constants.Cache_Setting_Ip_Mac,cacheMap);
}
}
...@@ -395,4 +395,5 @@ smfcore.returnStorage=\u56DE\u5E93 ...@@ -395,4 +395,5 @@ smfcore.returnStorage=\u56DE\u5E93
smf.barcode.msd.validate=\u8BE5\u7269\u6599\u9700\u8981MSD\u7BA1\u63A7\u4E0D\u80FD\u5728\u672C\u6599\u4ED3\u5165\u5E93 smf.barcode.msd.validate=\u8BE5\u7269\u6599\u9700\u8981MSD\u7BA1\u63A7\u4E0D\u80FD\u5728\u672C\u6599\u4ED3\u5165\u5E93
smfcore.materialBox.differentPn=\u6CBB\u5177\u5BF9\u5E94\u7684\u6599\u53F7\u4E3A{0}\u4E0E\u8F93\u5165\u7684\u7269\u6599\u7F16\u53F7{1}\u4E0D\u540C smfcore.materialBox.differentPn=\u6CBB\u5177\u5BF9\u5E94\u7684\u6599\u53F7\u4E3A{0}\u4E0E\u8F93\u5165\u7684\u7269\u6599\u7F16\u53F7{1}\u4E0D\u540C
smfcore.materialBox.differentPn.continue=\u6CBB\u5177\u5BF9\u5E94\u7684\u6599\u53F7\u4E3A{0}\u4E0E\u8F93\u5165\u7684\u7269\u6599\u7F16\u53F7{1}\u4E0D\u540C,\u662F\u5426\u7EE7\u7EED\u5165\u5E93 smfcore.materialBox.differentPn.continue=\u6CBB\u5177\u5BF9\u5E94\u7684\u6599\u53F7\u4E3A{0}\u4E0E\u8F93\u5165\u7684\u7269\u6599\u7F16\u53F7{1}\u4E0D\u540C,\u662F\u5426\u7EE7\u7EED\u5165\u5E93
smfcore.barcode.checkAmount.error=\u70B9\u6599\u6570\u91CF[{0}]\u5927\u4E8E\u5B9E\u9645\u6CBB\u5177\u6570\u91CF[{1}]
\ No newline at end of file \ No newline at end of file
smfcore.barcode.checkAmount.error=\u70B9\u6599\u6570\u91CF[{0}]\u5927\u4E8E\u5B9E\u9645\u6CBB\u5177\u6570\u91CF[{1}]
smfcore.order.outLet=\u51FA\u6599\u53E3
\ No newline at end of file \ No newline at end of file
...@@ -386,4 +386,5 @@ smfcore.returnStorage=Return to Inventory ...@@ -386,4 +386,5 @@ smfcore.returnStorage=Return to Inventory
smf.barcode.msd.validate=This material requires MSD control and cannot be stored in this warehouse smf.barcode.msd.validate=This material requires MSD control and cannot be stored in this warehouse
smfcore.materialBox.differentPn=The material number corresponding to the fixture is {0}, which is different from the input material number {1} smfcore.materialBox.differentPn=The material number corresponding to the fixture is {0}, which is different from the input material number {1}
smfcore.materialBox.differentPn.continue=The material number corresponding to the fixture is {0}, which differs from the input material number {1}. Do you wish to continue with the inventory process smfcore.materialBox.differentPn.continue=The material number corresponding to the fixture is {0}, which differs from the input material number {1}. Do you wish to continue with the inventory process
smfcore.barcode.checkAmount.error=The counted material quantity [{0}] exceeds the actual fixture quantity [{1}]
\ No newline at end of file \ No newline at end of file
smfcore.barcode.checkAmount.error=The counted material quantity [{0}] exceeds the actual fixture quantity [{1}]
smfcore.order.outLet=outLet
\ No newline at end of file \ No newline at end of file
...@@ -382,4 +382,5 @@ smfcore.returnStorage=\u305D\u3046\u3053\u306B\u3082\u3069\u308B ...@@ -382,4 +382,5 @@ smfcore.returnStorage=\u305D\u3046\u3053\u306B\u3082\u3069\u308B
smf.barcode.msd.validate=\u3053\u306E\u6750\u6599\u306FMSD\u7BA1\u7406\u304C\u5FC5\u8981\u3067\u3001\u672C\u5009\u5EAB\u306B\u5165\u5EAB\u3067\u304D\u307E\u305B\u3093\u3002 smf.barcode.msd.validate=\u3053\u306E\u6750\u6599\u306FMSD\u7BA1\u7406\u304C\u5FC5\u8981\u3067\u3001\u672C\u5009\u5EAB\u306B\u5165\u5EAB\u3067\u304D\u307E\u305B\u3093\u3002
smfcore.materialBox.differentPn=\u6CBB\u5177\u306B\u5BFE\u5FDC\u3059\u308B\u6750\u6599\u756A\u53F7\u306F{0}\u3067\u3001\u5165\u529B\u3055\u308C\u305F\u6750\u6599\u756A\u53F7{1}\u3068\u7570\u306A\u308A\u307E\u3059 smfcore.materialBox.differentPn=\u6CBB\u5177\u306B\u5BFE\u5FDC\u3059\u308B\u6750\u6599\u756A\u53F7\u306F{0}\u3067\u3001\u5165\u529B\u3055\u308C\u305F\u6750\u6599\u756A\u53F7{1}\u3068\u7570\u306A\u308A\u307E\u3059
smfcore.materialBox.differentPn.continue=\u6CBB\u5177\u306B\u5BFE\u5FDC\u3059\u308B\u6750\u6599\u756A\u53F7\u306F{0}\u3067\u3001\u5165\u529B\u3055\u308C\u305F\u6750\u6599\u756A\u53F7{1}\u3068\u7570\u306A\u308A\u307E\u3059\u3002\u5728\u5EAB\u767B\u9332\u3092\u7D9A\u884C\u3057\u307E\u3059\u304B smfcore.materialBox.differentPn.continue=\u6CBB\u5177\u306B\u5BFE\u5FDC\u3059\u308B\u6750\u6599\u756A\u53F7\u306F{0}\u3067\u3001\u5165\u529B\u3055\u308C\u305F\u6750\u6599\u756A\u53F7{1}\u3068\u7570\u306A\u308A\u307E\u3059\u3002\u5728\u5EAB\u767B\u9332\u3092\u7D9A\u884C\u3057\u307E\u3059\u304B
smfcore.barcode.checkAmount.error=\u30AB\u30A6\u30F3\u30C8\u3055\u308C\u305F\u6750\u6599\u6570[{0}]\u306F\u5B9F\u969B\u306E\u6CBB\u5177\u6570[{1}]\u3092\u8D85\u3048\u3066\u3044\u307E\u3059
\ No newline at end of file \ No newline at end of file
smfcore.barcode.checkAmount.error=\u30AB\u30A6\u30F3\u30C8\u3055\u308C\u305F\u6750\u6599\u6570[{0}]\u306F\u5B9F\u969B\u306E\u6CBB\u5177\u6570[{1}]\u3092\u8D85\u3048\u3066\u3044\u307E\u3059
smfcore.order.outLet=\u306F\u3044\u3057\u3085\u3064\u3053\u3046
\ No newline at end of file \ No newline at end of file
...@@ -382,4 +382,5 @@ smfcore.returnStorage=\u56DE\u5E93 ...@@ -382,4 +382,5 @@ smfcore.returnStorage=\u56DE\u5E93
smf.barcode.msd.validate=\u8BE5\u7269\u6599\u9700\u8981MSD\u7BA1\u63A7\u4E0D\u80FD\u5728\u672C\u6599\u4ED3\u5165\u5E93 smf.barcode.msd.validate=\u8BE5\u7269\u6599\u9700\u8981MSD\u7BA1\u63A7\u4E0D\u80FD\u5728\u672C\u6599\u4ED3\u5165\u5E93
smfcore.materialBox.differentPn=\u6CBB\u5177\u5BF9\u5E94\u7684\u6599\u53F7\u4E3A{0}\u4E0E\u8F93\u5165\u7684\u7269\u6599\u7F16\u53F7{1}\u4E0D\u540C smfcore.materialBox.differentPn=\u6CBB\u5177\u5BF9\u5E94\u7684\u6599\u53F7\u4E3A{0}\u4E0E\u8F93\u5165\u7684\u7269\u6599\u7F16\u53F7{1}\u4E0D\u540C
smfcore.materialBox.differentPn.continue=\u6CBB\u5177\u5BF9\u5E94\u7684\u6599\u53F7\u4E3A{0}\u4E0E\u8F93\u5165\u7684\u7269\u6599\u7F16\u53F7{1}\u4E0D\u540C,\u662F\u5426\u7EE7\u7EED\u5165\u5E93 smfcore.materialBox.differentPn.continue=\u6CBB\u5177\u5BF9\u5E94\u7684\u6599\u53F7\u4E3A{0}\u4E0E\u8F93\u5165\u7684\u7269\u6599\u7F16\u53F7{1}\u4E0D\u540C,\u662F\u5426\u7EE7\u7EED\u5165\u5E93
smfcore.barcode.checkAmount.error=\u70B9\u6599\u6570\u91CF[{0}]\u5927\u4E8E\u5B9E\u9645\u6CBB\u5177\u6570\u91CF[{1}]
\ No newline at end of file \ No newline at end of file
smfcore.barcode.checkAmount.error=\u70B9\u6599\u6570\u91CF[{0}]\u5927\u4E8E\u5B9E\u9645\u6CBB\u5177\u6570\u91CF[{1}]
smfcore.order.outLet=\u51FA\u6599\u53E3
\ No newline at end of file \ No newline at end of file
...@@ -382,4 +382,5 @@ smfcore.returnStorage=\u56DE\u5EAB ...@@ -382,4 +382,5 @@ smfcore.returnStorage=\u56DE\u5EAB
smf.barcode.msd.validate=\u8A72\u7269\u6599\u9700\u9032\u884CMSD\u7BA1\u63A7\uFF0C\u4E0D\u53EF\u5728\u672C\u6599\u5009\u5165\u5EAB smf.barcode.msd.validate=\u8A72\u7269\u6599\u9700\u9032\u884CMSD\u7BA1\u63A7\uFF0C\u4E0D\u53EF\u5728\u672C\u6599\u5009\u5165\u5EAB
smfcore.materialBox.differentPn=\u6CBB\u5177\u5C0D\u61C9\u7684\u6599\u865F\u70BA{0}\u8207\u8F38\u5165\u7684\u7269\u6599\u7DE8\u865F{1}\u4E0D\u540C smfcore.materialBox.differentPn=\u6CBB\u5177\u5C0D\u61C9\u7684\u6599\u865F\u70BA{0}\u8207\u8F38\u5165\u7684\u7269\u6599\u7DE8\u865F{1}\u4E0D\u540C
smfcore.materialBox.differentPn.continue=\u6CBB\u5177\u5C0D\u61C9\u7684\u6599\u865F\u70BA{0}\u8207\u8F38\u5165\u7684\u7269\u6599\u7DE8\u865F{1}\u4E0D\u540C\uFF0C\u662F\u5426\u7E7C\u7E8C\u5165\u5EAB smfcore.materialBox.differentPn.continue=\u6CBB\u5177\u5C0D\u61C9\u7684\u6599\u865F\u70BA{0}\u8207\u8F38\u5165\u7684\u7269\u6599\u7DE8\u865F{1}\u4E0D\u540C\uFF0C\u662F\u5426\u7E7C\u7E8C\u5165\u5EAB
smfcore.barcode.checkAmount.error=\u9EDE\u6599\u6578\u91CF[{0}]\u5927\u65BC\u5BE6\u969B\u6CBB\u5177\u6578\u91CF[{1}]
\ No newline at end of file \ No newline at end of file
smfcore.barcode.checkAmount.error=\u9EDE\u6599\u6578\u91CF[{0}]\u5927\u65BC\u5BE6\u969B\u6CBB\u5177\u6578\u91CF[{1}]
smfcore.order.outLet=\u51FA\u6599\u53E3
\ No newline at end of file \ No newline at end of file
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!