Commit 9441cab4 hjh

Merge remote-tracking branch 'origin/smf-core-21088' into smf-core-21088

2 个父辈 ae6ff58f 8e34d7a1
正在显示 17 个修改的文件 包含 281 行增加49 行删除
......@@ -163,6 +163,9 @@ public class BarcodeDto implements Serializable {
@Transient
private List<String> relationCodes;
private boolean needExpand = false;
/**
* 是否是锡膏
*/
......
......@@ -98,11 +98,13 @@ public class EquipStatusBean implements Serializable {
}
public EquipMsg getMsgByType(String type){
for (EquipMsg msg : getMsgList()){
if(msg.getType().equals(type)){
if (getMsgList() != null) {
for (EquipMsg msg : getMsgList()) {
if (msg.getType().equals(type)) {
return msg;
}
}
}
return null;
}
......
......@@ -133,6 +133,11 @@ public class BoxKanbanController {
List<BoxTaskDto> dtos=new ArrayList<>();
for (DataLog datalog :
allTasks) {
if (datalog.isFinished() || datalog.isCancel()){
continue;
}
//判断类型
if (criteria.getType() != null && (!criteria.getType().equals(datalog.getType()))) {
continue;
......@@ -209,7 +214,16 @@ public class BoxKanbanController {
blurryOk = true;
}
if (blurryOk) {
dtos.add(boxTaskMapper.toDto(datalog));
BoxTaskDto boxTaskDto = boxTaskMapper.toDto(datalog);
boxTaskDto.setSourceName(datalog.getSourceName());
if (datalog.isPutInTask()){
boxTaskDto.setLoc(datalog.getLoc());
boxTaskDto.setTargetLoc(datalog.getPosName());
} else {
boxTaskDto.setLoc(datalog.getPosName());
boxTaskDto.setTargetLoc(datalog.getLoc());
}
dtos.add(boxTaskDto);
}
}
return new PageData<>(dtos, dtos.size());
......
......@@ -99,6 +99,8 @@ public class BoxTaskDto {
@ApiModelProperty("目的地")
private String loc = "";
private String targetLoc = "";
@ApiModelProperty("创建时间")
private Date createDate = new Date();
@ApiModelProperty("更新时间")
......
......@@ -503,21 +503,30 @@ public class StoragePosController {
barcodeDto.setFirstPutInDate(barcodeDto.getCreateDate());
//storagePosDto.setBarcode(barcode);
}
Barcode barcode = barcodeManager.findByBarcode(barcodeDto.getBarcode());
if (ObjectUtil.isNotNull(barcode)) {
barcodeDto.setLabelId(barcode.getLabelId());
barcodeDto.setPosName(storagePosDto.getPosName());
List<BarcodeDto> subCodeList = barcodeDto.getSubCodeList();
if (subCodeList != null && !subCodeList.isEmpty()){
barcodeDto.setNeedExpand(true);
barcodeDto.setSubCodeList(new ArrayList<>());
}
}
}
// for (StoragePosDto storagePosDto : StoragePosDtos) {
// BarcodeDto barcode = storagePosDto.getBarcode();
// List<BarcodeDto> subCodes = Lists.newArrayList(barcode);
// barcode.setSubCodeList(subCodes);
// storagePosDto.setBarcode(barcode);
// }
return new PageData(StoragePosDtos, pages.getTotalElements());
}
@ApiOperation("根据料箱号查询barcode信息")
@GetMapping("/getBarcodeInfo")
public BarcodeDto getBarcodeInfo(String boxStr) {
StoragePos pos = storagePosManager.getByBarcode(boxStr);
if (pos != null) {
StoragePosDto dto = storagePosMapper.toDto(pos);
BarcodeDto barcode = dto.getBarcode();
return barcode;
}
return null;
}
@ApiOperation("根据条件查找出库")
@GetMapping("/out")
......@@ -557,16 +566,35 @@ public class StoragePosController {
return ResultBean.newErrorResult(-1, "", "未找到可以出库的物料");
}
boolean hasTask = false;
for (StoragePos pos : storagePosList) {
Barcode barcode = pos.getBarcode();
//排除正在执行的库位
Collection<String> excludePosIds = taskService.excludePosIds();
if (excludePosIds != null && !excludePosIds.isEmpty() && excludePosIds.contains(pos.getId())) {
log.info("库位:" + pos.getPosName() + "正在执行,跳过");
continue;
boolean boxHasTask = false;
List<DataLog> allTasks = taskService.getAllTasks();
for (DataLog task : allTasks) {
if (pos.getPosName().equals(task.getPosName())){
if (!task.isCancel() && !task.isFinished()){
boxHasTask = true;
log.info(barcode.getBarcode()+"库位:" + pos.getPosName() + "正在执行,跳过");
break;
}
}
if (task.getBarcode().equals(barcode.getBarcode())){
if (!task.isCancel() && !task.isFinished()){
boxHasTask = true;
log.info(barcode.getBarcode()+"库位:" + pos.getPosName() + "正在执行,跳过");
break;
}
}
}
Barcode barcode = pos.getBarcode();
if (boxHasTask){
log.info("当前料箱:"+barcode.getBarcode()+",库位:"+pos.getPosName()+"有正在执行的任务,跳过");
continue;
}
//判断有没有输入箱子号
if (StringUtils.isNotEmpty(box) && !box.equals(barcode.getBarcode())) {
......@@ -678,8 +706,13 @@ public class StoragePosController {
}
task.setBoxPosName(pos.getPosName());
task.setCartonId(barcode.getCartonId());
log.info("按条件查找出库,箱子号为:"+barcode.getBarcode()+",库位号为:"+barcode.getPosName()+",查询条件为:"+getSelectMsg(partNumber,provider,batch,dateCode));
taskService.updateQueueTask(task);
hasTask = true;
}
}
if (!hasTask){
return ResultBean.newErrorResult(-1,"","未找到可以出库的任务");
}
return ResultBean.newOkResult("");
}
......
......@@ -256,6 +256,7 @@ public class TaskService {
public void addTaskToExecute(DataLog taskToExecute) throws ValidateException {
Collection<DataLog> tasks = taskMap.values();
for (DataLog task : tasks) {
if (!task.isFinished() && !task.isCancel()) {
String barcode = taskToExecute.getBarcode();
String posName = taskToExecute.getPosName();
if (task.getType() == taskToExecute.getType()) {
......@@ -268,6 +269,7 @@ public class TaskService {
}
}
}
}
updateQueueTask(taskToExecute);
}
......@@ -325,6 +327,7 @@ public class TaskService {
//从正在执行和等待列表中移除
removeQueueTask(task);
task.setStatus(OP_STATUS.CANCEL.name());
task.setOperator(SecurityUtils.getLoginUsername());
task.setUpdateDate(new Date());
updateFinishedTask(task);
log.info("任务[" + task.getId() + "] posName[" + task.getPosName() + "] Reel Id[" + task.getBarcode() + "]取消成功");
......@@ -394,9 +397,11 @@ public class TaskService {
if (task.needRemoveFromCache()) {
theFinishedTaskMap.remove(task.getId());
} else {
if (!task.isFinished() && !task.isCancel()) {
resultTasks.add(task);
}
}
}
return resultTasks;
}
......@@ -710,11 +715,13 @@ public class TaskService {
Collection<DataLog> allTasks = taskMap.values();
Collection<String> operatingPosIds = ReelLockPosUtil.getAllLockPosIds();
for (DataLog task : allTasks) {
if (!task.isCancel() && !task.isFinished()) {
String posId = task.getPosId();
if (!Strings.isNullOrEmpty(posId)) {
operatingPosIds.add(task.getPosId());
}
}
}
return operatingPosIds;
}
......
......@@ -673,7 +673,7 @@ public class OutLineController {
if (barcode.getBarcode().equals(task.getBarcode())){
if (!task.isFinished() && !task.isCancel()){
if (task.isPutInTask()) {
return ResultBean.newErrorResult(-1, "", code + "有正在执行中的任务,请确认");
return ResultBean.newErrorResult(-1, "", code + "有正在执行中的入库任务,请确认");
} else {
dataLog = task;
break;
......
......@@ -788,7 +788,8 @@ public class CDeviceController {
callAgvTask(stackerId, stackerBarcode);
} catch (Exception e) {
e.printStackTrace();
log.info("入料机构获取可用料格:"+stackerId+"结果异常:"+e.getMessage());
//e.printStackTrace();
isProcess.set(false);
}
......
......@@ -48,7 +48,7 @@ public class GrPutInController {
@ApiOperation("判断料串是否已经绑定Gr信息")
@RequestMapping("/alreadyBindGr")
@AnonymousAccess
//@AnonymousAccess
public ResultBean alreadyBindGr(String materialStr) {
//判断GR有没有绑定成功
Map<String, BindGrInfo> cacheMap = dataCache.getCache(CacheNameUtil.CACHE_BIND_GR);
......@@ -64,7 +64,7 @@ public class GrPutInController {
@ApiOperation("获取Gr列表")
@RequestMapping("/grList")
@AnonymousAccess
//@AnonymousAccess
public ResultBean grList(@RequestBody Map<String, String> paramMap) {
//料串
......@@ -105,7 +105,7 @@ public class GrPutInController {
@ApiOperation("获取GR已过账的列表")
@RequestMapping("/grStatus")
@AnonymousAccess
//@AnonymousAccess
public ResultBean grStatus(@RequestBody Map<String, String> paramMap) {
//料串
......@@ -148,7 +148,7 @@ public class GrPutInController {
@ApiOperation("绑定GR信息")
@RequestMapping("/bindGr")
@AnonymousAccess
//@AnonymousAccess
public synchronized ResultBean bindGr(@RequestBody BindGrInfo info) {
String materialStr = info.getMaterialStr();
......@@ -216,8 +216,8 @@ public class GrPutInController {
@ApiOperation("GR与料串绑定信息")
@RequestMapping("/bindGrInfo")
@AnonymousAccess
public synchronized ResultBean bindGrInfo() {
//@AnonymousAccess
public ResultBean bindGrInfo() {
Map<String, BindGrInfo> cacheMap = dataCache.getCache(CacheNameUtil.CACHE_BIND_GR);
if (cacheMap != null){
return ResultBean.newOkResult(cacheMap.values());
......@@ -226,4 +226,22 @@ public class GrPutInController {
}
@ApiOperation("移除绑定GR信息")
@RequestMapping("/removeBindGr")
@AnonymousAccess
public synchronized ResultBean bindGrInfo(String materialStr) {
if (StringUtils.isEmpty(materialStr)) {
return ResultBean.newErrorResult(-1, "", "料串信息不能为空");
}
log.info("人工手动移除料串信息");
Map<String, BindGrInfo> cacheMap = dataCache.getCache(CacheNameUtil.CACHE_BIND_GR);
if (cacheMap == null) {
cacheMap = new HashMap<>();
}
cacheMap.remove(materialStr);
dataCache.updateCache(CacheNameUtil.CACHE_BIND_GR, cacheMap);
return ResultBean.newOkResult("");
}
}
......@@ -4,6 +4,7 @@ import cn.hutool.core.util.ObjectUtil;
import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.common.utils.DateUtil;
import com.neotel.smfcore.common.utils.ReelLockPosUtil;
import com.neotel.smfcore.common.utils.SecurityUtils;
import com.neotel.smfcore.common.utils.StringUtils;
import com.neotel.smfcore.core.api.SmfApi;
......@@ -207,7 +208,7 @@ public class ManualGrPutInController {
int w = 7;
int h = 8;
Component component = componentManager.findByPartNumberAndProvider(noDbBarcode.getPartNumber(), noDbBarcode.getProvider());
Component component = null;
if (component == null) {
BrandQtyResult result = LuxsanApi.brandQtyUrl(new BrandQtyRequest(noDbBarcode.getPartNumber(), noDbBarcode.getProvider()));
if (result == null) {
......@@ -226,6 +227,22 @@ public class ManualGrPutInController {
h = component.getHeight();
}
if (13 == w){
if (!binCode.startsWith("C13") && !binCode.endsWith("-01")){
return ResultBean.newErrorResult(-1,"","13寸的物料,请放入C13的01号料格中");
}
} else if (15 == w){
if (!binCode.startsWith("C15") && !binCode.endsWith("-01")){
return ResultBean.newErrorResult(-1,"","15寸的物料,请放入C15的01号料格中");
}
} else if (7 == w){
if (binCode.startsWith("C15") || binCode.startsWith("C13")){
if (binCode.endsWith("01")){
return ResultBean.newErrorResult(-1,"","7寸的物料,不可以放入C15或者C13的料格中,请选择其他料格");
}
}
}
//判断条码是否正常
Barcode barcode = null;
......@@ -364,7 +381,7 @@ public class ManualGrPutInController {
//如果是type为0时,入智能仓
if ("0".equals(type)){
StoragePos pos = BoxHandleUtil.locOnePos(boxBarcode);
/*StoragePos pos = BoxHandleUtil.locOnePos(boxBarcode);
if (pos == null) {
return ResultBean.newErrorResult(-1, "", boxStr + "未找到可用库位");
}
......@@ -374,12 +391,12 @@ public class ManualGrPutInController {
if (storage.isVirtual()){
return ResultBean.newErrorResult(-1,"","料箱:"+boxStr+"所属的库位为:"+pos.getPosName()+",属于虚拟仓,请在虚拟仓页面进行操作");
}
boxBarcode.setPosName(pos.getPosName());
pos.setBarcode(boxBarcode);
storagePosManager.save(pos);
log.info(boxStr+"入库到智能仓,分配的储位为:"+pos.getPosName());
DataLog dataLog = taskService.addPutInTaskToExecute(storage, boxBarcode, pos, TaskCurrentLoc.Manual_DischargeHole);
DataLog dataLog = taskService.addPutInTaskToExecute(storage, boxBarcode, pos, TaskCurrentLoc.Manual_DischargeHole);*/
return ResultBean.newOkResult("");
}
else if ("1".equals(type)){
......@@ -396,6 +413,19 @@ public class ManualGrPutInController {
}
}
//判断当前箱子是否在其他库位中
StoragePos oldPos = storagePosManager.getByBarcode(boxBarcode.getBarcode());
if (oldPos != null){
log.info(boxStr+"原来的储位为:"+oldPos.getPosName()+",当前输入的储位为:"+posName);
if (!posName.equals(oldPos.getPosName())){
return ResultBean.newErrorResult(-1,"",boxStr+"请放入原来的库位:"+oldPos.getPosName()+",不可以放到库位:"+posName);
}
//oldPos.setBarcode(null);
//oldPos.setUsed(false);
//storagePosManager.save(oldPos);
}
StoragePos pos = storagePosManager.getByPosName(posName);
if (pos == null){
return ResultBean.newErrorResult(-1,"",boxStr+"对应的库位"+posName+"不存在");
......@@ -406,17 +436,10 @@ public class ManualGrPutInController {
return ResultBean.newErrorResult(-1, "", posName + "已经存在料箱:" + barcode.getBarcode());
}
}
//判断当前箱子是否在其他库位中
StoragePos oldPos = storagePosManager.getByBarcode(boxBarcode.getBarcode());
if (oldPos != null){
log.info(boxStr+"清空原来的储位:"+oldPos.getPosName());
oldPos.setBarcode(null);
oldPos.setUsed(false);
storagePosManager.save(oldPos);
}
pos.setBarcode(null);
taskService.addTaskToFinished(pos,boxBarcode,"手动入库");
ReelLockPosUtil.removeReelLockPosInfo(barcode.getBarcode());
return ResultBean.newOkResult("");
}
return ResultBean.newErrorResult(-1,"","请选择手动入库");
......
......@@ -16,8 +16,4 @@ public class KafkaConfig {
* MachineParameter
*/
public static final String MACHINEPARAMETER_TOPIC = "MachineParameter";
public static final String LINE_CID = "line";
}
package com.neotel.smfcore.custom.luxsan.factory_c.rawstor.kafka.config;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.List;
@Component
public class StorageNameConfig {
public static List<String> rawMaterialList = new ArrayList<>();
@PostConstruct
public void initList(){
rawMaterialList.add(rawMaterialIn01);
rawMaterialList.add(rawMaterialIn02);
rawMaterialList.add(rawMaterialIn03);
rawMaterialList.add(rawMaterialIn04);
rawMaterialList.add(rawMaterialIn05);
rawMaterialList.add(rawMaterialIn06);
rawMaterialList.add(rawMaterialOut01);
rawMaterialList.add(rawMaterialOut02);
rawMaterialList.add(rawMaterialOut03);
rawMaterialList.add(rawMaterialOut04);
rawMaterialList.add(rawMaterialOut05);
rawMaterialList.add(rawMaterialOut06);
}
public static List<String> getRawMaterialList(){
return rawMaterialList;
}
//原材料仓货架
public static final String rawMaterialTower = "raw-material-tower";
......
......@@ -6,11 +6,17 @@ import com.neotel.smfcore.core.barcode.enums.BARCODE_STATUS;
import com.neotel.smfcore.core.device.enums.OP;
import com.neotel.smfcore.core.device.enums.OP_STATUS;
import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.core.device.util.EquipmentCache;
import com.neotel.smfcore.core.equipment.bean.EquipMsg;
import com.neotel.smfcore.core.equipment.bean.EquipStatusBean;
import com.neotel.smfcore.core.storage.service.manager.IStoragePosManager;
import com.neotel.smfcore.core.storage.service.po.Storage;
import com.neotel.smfcore.core.system.service.manager.IDataLogManager;
import com.neotel.smfcore.core.system.util.EquipStatusUtil;
import com.neotel.smfcore.custom.luxsan.factory_c.rawstor.kafka.bean.Heartbeat;
import com.neotel.smfcore.custom.luxsan.factory_c.rawstor.kafka.bean.MachineParameter;
import com.neotel.smfcore.custom.luxsan.factory_c.rawstor.kafka.bean.MachineParameterData;
import com.neotel.smfcore.custom.luxsan.factory_c.rawstor.kafka.bean.MachineStatus;
import com.neotel.smfcore.custom.luxsan.factory_c.rawstor.kafka.config.KafkaConfig;
import com.neotel.smfcore.custom.luxsan.factory_c.rawstor.kafka.config.StorageNameConfig;
import lombok.extern.slf4j.Slf4j;
......@@ -44,6 +50,107 @@ public class KafkaService {
private IStoragePosManager storagePosManager;
/**
* 抛送入料机构,分拣机构的设备状态信息,每1分钟抛送一次
*/
//@Scheduled(fixedRate = 1000 * 60 * 1)
public void setRawMaterialInOutMachineStatus() {
//获取所有的设备
List<String> rawMaterialList = StorageNameConfig.getRawMaterialList();
for (String machineId : rawMaterialList) {
String currentStatus = "1"; //正常
List<EquipMsg> equipMsgList = new ArrayList<>();
EquipStatusBean statusBean = EquipStatusUtil.getStatusBean(machineId);
if (statusBean == null){
currentStatus = "5";
} else {
int status = statusBean.getStatus(); //状态
if (2 == status || 3 == status) {
currentStatus = "3"; //故障
}
if (0 == status) {
currentStatus = "5";
}
equipMsgList = statusBean.getMsgList();
}
if (equipMsgList != null && !equipMsgList.isEmpty()){
for (EquipMsg equipMsg : equipMsgList) {
MachineStatus machineStatus = new MachineStatus();
String dateStr = DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss.SSS");
machineStatus.setOccurrenceTime(dateStr);
machineStatus.setMachineID(machineId);
machineStatus.setTopicType(KafkaConfig.MACHINESTATUS_TOPIC);
machineStatus.setCurrentStatus(currentStatus);
machineStatus.setErrorCode(equipMsg.getErrorCode());
machineStatus.setErrorMsg(equipMsg.getMsg());
machineStatus.setClientIP("");
String statusStr = JSON.toJSONString(machineStatus);
log.info(machineId+"抛送设备状态主题为:" + KafkaConfig.MACHINESTATUS_TOPIC + "内容为:" + statusStr);
ListenableFuture future = kafkaTemplate.send(KafkaConfig.MACHINESTATUS_TOPIC, statusStr);
log.info(machineId+"抛送设备状态返回结果为:" + JSON.toJSONString(future));
}
} else {
MachineStatus machineStatus = new MachineStatus();
String dateStr = DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss.SSS");
machineStatus.setOccurrenceTime(dateStr);
machineStatus.setMachineID(machineId);
machineStatus.setTopicType(KafkaConfig.MACHINESTATUS_TOPIC);
machineStatus.setCurrentStatus(currentStatus);
machineStatus.setErrorCode("");
machineStatus.setErrorMsg("");
machineStatus.setClientIP("");
String statusStr = JSON.toJSONString(machineStatus);
log.info(machineId+"抛送设备状态主题为:" + KafkaConfig.MACHINESTATUS_TOPIC + "内容为:" + statusStr);
ListenableFuture future = kafkaTemplate.send(KafkaConfig.MACHINESTATUS_TOPIC, statusStr);
log.info(machineId+"抛送设备状态返回结果为:" + JSON.toJSONString(future));
}
}
}
/**
* 抛送入料机构,分拣机构的心跳,每10s抛送一次
*/
//@Scheduled(fixedRate = 1000 * 10)
public void setRawMaterialInOutHeartbeat() {
//获取所有的设备
List<String> rawMaterialList = StorageNameConfig.getRawMaterialList();
for (String machineId : rawMaterialList) {
EquipStatusBean equipStatus = EquipStatusUtil.getStatusBean(machineId);
if (equipStatus != null) {
if (!equipStatus.timeOut()) {
int status = equipStatus.getStatus(); //状态
String currentStatus = "1"; //正常
if (2 == status || 3 == status) {
currentStatus = "3"; //故障
}
if (0 == status) {
currentStatus = "5"; //离线
}
if ("1".equals(currentStatus)) {
Heartbeat heartbeat = new Heartbeat();
String dateStr = DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss.SSS");
heartbeat.setOccurrenceTime(dateStr);
heartbeat.setMachineID(machineId);
heartbeat.setTopicType(KafkaConfig.HEARTBEAT_TOPIC);
String statusStr = JSON.toJSONString(heartbeat);
log.info("出料口主题为:" + KafkaConfig.HEARTBEAT_TOPIC + "内容为:" + statusStr);
ListenableFuture future = kafkaTemplate.send(KafkaConfig.HEARTBEAT_TOPIC, statusStr);
log.info("出料口返回结果为:" + JSON.toJSONString(future));
}
}
}
}
}
/**
* 推送原材料仓的储位,出入库信息,每5分钟抛送一次
*/
@Scheduled(fixedRate = 1000 * 60 * 5)
public void setTowerDataMachineParamter() {
log.info("开始推送原材料仓tower数据");
......
......@@ -375,14 +375,7 @@ public class BoxHandleUtil {
//判断信息是否在已经在库位中(出入库只改变料箱位置状态,不从StoragePos表中清除)
StoragePos pos = storagePosManager.getByBarcode(boxBarcode.getBarcode());
if (pos != null) {
if (warehouseCode.equals(pos.getWareHouseCode())){
return pos;
} else {
log.info(barcode+"对应的库别为:"+warehouseCode+",与当前库位:"+pos.getPosName()+"的库别:"+pos.getWareHouseCode()+"不一致,清空原来库位");
pos.setBarcode(null);
pos.setUsed(false);
storagePosManager.save(pos);
}
}
List<String> cidList = new ArrayList<>();
......@@ -405,6 +398,7 @@ public class BoxHandleUtil {
return null;
} else {
log.info("料箱[" + boxBarcode.getBarcode() + "]信息加入库位[" + pos.getPosName() + "]中");
boxBarcode.setWarehouseCode(warehouseCode);
pos.setBarcode(boxBarcode);
pos.setUsed(true);
storagePosManager.save(pos);
......
......@@ -33,7 +33,7 @@ lizhen:
url: #http://172.30.88.19:8001/smf-core/api/Mes/machineCallMaterial
F3:
name: 3F
line: C02-3FSMT-01,C02-3FSMT-03,C02-3FSMT-04,C02-3FSMT-08,C02-3FSMT-13,C02-3FSMT-14,C02-3FSMT-18,C03-1FSMT-01,C03-1FSMT-02,C03-1FSMT-11,C03-1FSMT-12
line: C03-1FSMT-01,C03-3FSMT-13,C02-3FSMT-12,C02-3FSMT-18,C02-3FSMT-19,C03-1FSMT-12,C02-3FSMT-02,C02-3FSMT-09,C02-3FSMT-11,C03-3FSMT-03,C03-1FSMT-11,C02-3FSMT-01,C03-1FSMT-02,C02-3FSMT-08,C02-3FSMT-06,C02-3FSMT-07,C02-3FSMT-17,C02-3FSMT-04,C02-3FSMT-14,C03-1FSMT-12,C02-3FSMT-05,C02-3FSMT-13,C02-3FSMT-03,C02-3FSMT-16,C03-1FSMT-02,C02-3FSMT-15
url: http://10.68.27.85/smf-core/wcs/machineCallMaterial
F5:
name: #5F
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!