Commit a6ea5055 LN

工单锁定取消物料需要将锁定状态上传到TMS. reelID出库修改。websocket连接后延几秒再同步数据。

1 个父辈 112657c3
......@@ -438,7 +438,7 @@ public class LiteOrderCache {
return checkOutLiteOrder(orderNo,outBom,singleOut,false);
}
public synchronized String checkOutLiteOrder(String orderNo, boolean outBom,boolean singleOut,boolean needCheck) {
return checkOutLiteOrder(orderNo,outBom,singleOut,needCheck);
return checkOutLiteOrder(orderNo,outBom,singleOut,needCheck,new ArrayList<>());
}
/**
* 执行工单出库
......@@ -740,19 +740,26 @@ public class LiteOrderCache {
List<StoragePos> lockPosList = storagePosManager.findLockPos(liteOrder.getOrderNo());
//绑定料需要解绑
storagePosManager.clearLockPos(liteOrder.getOrderNo());
List<StoragePos > newPosLis=new ArrayList<>();
//缓存清除锁定 TODO
if(lockPosList!=null){
if(lockPosList!=null&&lockPosList.size()>0) {
for (StoragePos pos :
lockPosList) {
Storage storage=dataCache.getStorageById(pos.getStorageId());
dataCache.unLockOneReel(storage.getCid(),pos.getBarcode().getPartNumber());
Storage storage = dataCache.getStorageById(pos.getStorageId());
dataCache.unLockOneReel(storage.getCid(), pos.getBarcode().getPartNumber());
pos.getBarcode().setLockId(null);
newPosLis.add(pos);
}
//TODO 需要转移到工单状态改变中处理
liteOrder.setLockReelList(newPosLis);
}
//绑定料需要解绑
storagePosManager.clearLockPos(liteOrder.getOrderNo());
log.info("关闭工单[" + orderNo + "]成功");
liteOrder.setClosed(true);
liteOrderManager.save(liteOrder);
......
......@@ -4,6 +4,7 @@ import com.neotel.smfcore.common.base.BasePo;
import com.neotel.smfcore.common.utils.StorageConstants;
import com.neotel.smfcore.common.utils.StringUtils;
import com.neotel.smfcore.core.order.enums.LITEORDER_STATUS;
import com.neotel.smfcore.core.storage.service.po.StoragePos;
import lombok.Data;
import org.springframework.data.annotation.Transient;
import org.springframework.data.mongodb.core.mapping.Document;
......@@ -92,6 +93,13 @@ public class LiteOrder extends BasePo implements Serializable {
@Transient
private List<LiteOrderItem> orderItems;
/**
* 锁定的物料,关闭工单时,TMS需要更新锁定物料状态
*/
@Transient
private List<StoragePos> lockReelList;
/**
* 建议出仓时间
*/
......
......@@ -72,12 +72,16 @@ public class HanwhaApiHandler extends BaseSmfApiListener {
@Override
public Barcode canPutInBeforeResolve(String codeResolveUrl, CodeValidateParam params) throws ValidateException {
log.info("barcode[" + params.getCode() + "] 解析条码");
CodeBean codeBean = BarcodeRule.splitCodeAndSize(params.getCode());
String[] codeStr = params.getCode().split("##");
for (int i = codeStr.length-1; i >= 0; i--) {
String codeStr1 = codeStr[i];
CodeBean codeBean = BarcodeRule.splitCodeAndSize(codeStr1);
String fullCode = codeBean.getCodeStr();
if (fullCode.endsWith("##")) {
fullCode = fullCode.substring(0, fullCode.length() - 2);
}
log.info("barcode[" + params.getCode() + "] 解析条码到完整条码:"+fullCode+",调用 RequestGetPartInfo");
log.info("barcode[" + params.getCode() + "] 解析条码到完整条码:" + fullCode + ",调用 RequestGetPartInfo");
List<TMSPart> result = tmsApis.RequestGetPartInfo(0, fullCode);
if (result.size() > 0) {
String pn = result.get(0).getPartName();
......@@ -138,12 +142,13 @@ public class HanwhaApiHandler extends BaseSmfApiListener {
barcode = barcodeManager.saveBarcode(barcode);
log.info("barcode[" + params.getCode() + "] RequestGetPartInfo ,PN=[" + pn + "],code=[" + code + "],count=[" + count + "]新增条码准备入库");
return barcode;
} else {
log.info("barcode[" + params.getCode() + "] 解析条码到完整条码:" + fullCode + ",调用 RequestGetPartInfo 未收到反馈");
throw new ValidateException("smfcore.mesApi.inCheck.error", "RequestGetPartInfo no data",new String[]{" no data "});
}
else{
log.info("barcode[" + params.getCode() + "] 解析条码到完整条码:"+fullCode+",调用 RequestGetPartInfo 未收到反馈");
throw new ValidateException("smfcore.mesApi.inCheck.error", "RequestGetPartInfo no data");
}
// return null;
return null;
}
private Date getDate(String str) {
......@@ -196,7 +201,7 @@ public class HanwhaApiHandler extends BaseSmfApiListener {
}
if (task.isFinished()||task.isEnd()) {
List<TMSPartReelPos> list = new ArrayList<>();
TMSPartReelPos bean = TMSPartReelPos.newBean(task.getPartNumber(), task.getBarcode(), task.getNum(), task.getCid(), task.getPosName(), 1, task.getUpdateDate().getTime(), -1);
TMSPartReelPos bean = TMSPartReelPos.newBean(task.getPartNumber(), task.getBarcode(), task.getNum(), task.getCid(), task.getPosName(), 1, task.getUpdateDate().getTime(), -1,0);
list.add(bean);
log.info("barcode[" + task.getBarcode() + "],pn[" + task.getPartNumber() + "],posName[" + task.getPosName() + "]入库完成,调用 RequestSyncPartReelPosInfo");
......@@ -211,7 +216,7 @@ public class HanwhaApiHandler extends BaseSmfApiListener {
}
if (task.isFinished()||task.isEnd()) {
List<TMSPartReelPos> list = new ArrayList<>();
TMSPartReelPos bean = TMSPartReelPos.newBean(task.getPartNumber(), task.getBarcode(), task.getNum(), task.getCid(), task.getPosName(), 2, -1, task.getUpdateDate().getTime());
TMSPartReelPos bean = TMSPartReelPos.newBean(task.getPartNumber(), task.getBarcode(), task.getNum(), task.getCid(), task.getPosName(), 2, -1, task.getUpdateDate().getTime(),0);
list.add(bean);
log.info("barcode[" + task.getBarcode() + "],pn[" + task.getPartNumber() + "],posName[" + task.getPosName() + "]出库完成,调用 RequestSyncPartReelPosInfo");
......@@ -224,11 +229,17 @@ public class HanwhaApiHandler extends BaseSmfApiListener {
}
@Override
public void onOrderStatusChange(String orderNotifyUrl, LiteOrder liteOrder) {
public void onOrderStatusChange(String orderNotifyUrl, LiteOrder liteOrder ) {
//ResponseUpdateDeliveryReserveState-all work order
if (liteOrder.isClosed()) {
//工单取消,且解锁了物料,需要通知TMS
if(liteOrder.getLockReelList() !=null&&liteOrder.getLockReelList().size()>0){
tmsUtil.SyncReelLockS(liteOrder.getLockReelList());
}
String isCancel=liteOrder.getAppend("cancel");
if(isCancel.equals("true")){
log.info("工单取消处理中,此处不通知TMS");
......@@ -348,13 +359,14 @@ public class HanwhaApiHandler extends BaseSmfApiListener {
if (pos.getBarcode() == null) {
TMSPartReelPos bean = TMSPartReelPos.newBean("", "", -1,
storage.getCid(), pos.getPosName(), 4, -1, -1);
storage.getCid(), pos.getPosName(), 4, -1, -1,0);
list.add(bean);
} else {
Barcode barcode = pos.getBarcode();
int s=ObjectUtil.isNotEmpty(barcode.getLockId())?1:0;
TMSPartReelPos bean = TMSPartReelPos.newBean(barcode.getPartNumber(), barcode.getBarcode(), barcode.getAmount(),
storage.getCid(), pos.getPosName(), 4, barcode.getPutInDate().getTime(), -1);
storage.getCid(), pos.getPosName(), 4, barcode.getPutInDate().getTime(), -1,s);
list.add(bean);
}
......
......@@ -143,10 +143,13 @@ public class TMSCommunicator implements WsMsgReceivedListener {
log.info("启动 webService 状态检查");
while(true) {
try {
TimeUnit.SECONDS.sleep(5);
TimeUnit.SECONDS.sleep(4);
if (needCheck) {
stateCheck();
}
if(waitSync&&System.currentTimeMillis()>syncTime){
SyncData();
}
} catch (Exception e) {
log.error("webService" + e.getMessage());
}
......@@ -183,6 +186,7 @@ public class TMSCommunicator implements WsMsgReceivedListener {
websocket = new MyWebSocketClient(new URI(wsURL), this);
websocket.setConnectionLostTimeout(3000);
websocket.connect();
SetNeedSync(false);
} catch (URISyntaxException e) {
e.printStackTrace();
}
......@@ -193,10 +197,19 @@ public class TMSCommunicator implements WsMsgReceivedListener {
parseMessage(message);
}
private boolean waitSync=false;
private Long syncTime=0L;
private void SetNeedSync(boolean needS){
waitSync=needS;
syncTime=System.currentTimeMillis()+5000;
}
@Override
public void onOpen() {
Initialize(clientType, clientSubType);
SyncData();
SetNeedSync(true);
//三到五秒后再同步数据
// SyncData();
}
public static boolean isEnable() {
......@@ -285,6 +298,7 @@ public class TMSCommunicator implements WsMsgReceivedListener {
@Override
public void run() {
try {
SetNeedSync(false);
// 同步数据
List<String> cids = new ArrayList<>(dataCache.getAllStorage().keySet());
SyncStorageConnectionInfo(cids.toArray(new String[cids.size()]), new Integer[]{});
......@@ -325,13 +339,15 @@ public class TMSCommunicator implements WsMsgReceivedListener {
if (pos.getBarcode() == null) {
TMSPartReelPos bean = TMSPartReelPos.newBean("", "", -1,
storage.getCid(), pos.getPosName(), 4, -1, -1);
storage.getCid(), pos.getPosName(), 4, -1, -1,0);
list.add(bean);
} else {
Barcode barcode = pos.getBarcode();
int s=ObjectUtil.isNotEmpty(barcode.getLockId())?1:0;
TMSPartReelPos bean = TMSPartReelPos.newBean(barcode.getPartNumber(), barcode.getBarcode(), barcode.getAmount(),
storage.getCid(), pos.getPosName(), 4, barcode.getPutInDate().getTime(), -1);
storage.getCid(), pos.getPosName(), 4, barcode.getPutInDate().getTime(), -1,s);
list.add(bean);
}
......@@ -486,7 +502,10 @@ public class TMSCommunicator implements WsMsgReceivedListener {
break;
case "RequestDeliveryOrderByLocation":
log.info("onMsgReceived: requestID=[" + requestID + "],Topic=[" + topic + "],message:[" + message + "],");
Locations = getMapValue(msgMap, "Locations");
Locations = getTMSPosList(msgMap, "Locations");
// 2024-12-11 18:05:08.428 INFO [TMSCommunicator.java:504] - onMsgReceived: requestID=[1],Topic=[RequestDeliveryOrderByLocation],message:
// [{"Locations":[{"RackID":"01","RowID":"111","ColID":"11"}],"Topic":"RequestDeliveryOrderByLocation","id":1,"uid":74240}],
//3.10 RequestDeliveryOrderByLocation
RequestDeliveryOrderByLocation(requestID, Locations);
break;
......@@ -524,7 +543,7 @@ public class TMSCommunicator implements WsMsgReceivedListener {
case "RequestDeliveryReserveByLocation":
log.info("onMsgReceived: requestID=[" + requestID + "],Topic=[" + topic + "],message:[" + message + "],");
Locations = getMapValue(msgMap, "Locations");
Locations = getTMSPosList(msgMap, "Locations");
// 3.16 ,RequestDeliveryReserveByLocation
RequestDeliveryReserveByLocation(requestID, Locations);
break;
......@@ -601,6 +620,21 @@ public class TMSCommunicator implements WsMsgReceivedListener {
return null;
}
private static List<TMSPos> getTMSPosList(Map<String,Object> resultMap, String key ) throws ApiException {
List<TMSPos> results=new ArrayList<>();
if (key != null && !key.isEmpty()) {
Object value = resultMap.get(key);
if (value != null) {
List<Object> result=(List<Object>)value;
for (Object str :
result) {
TMSPos obj=TMSPos.ToBean((Map<String,Object>)str);
results.add(obj);
}
}
}
return results;
}
public void OrderProEndUpdateState(String requestCmd,int requestID, LiteOrder liteOrder){
......@@ -929,8 +963,10 @@ public class TMSCommunicator implements WsMsgReceivedListener {
liteOrder = liteOrderCache.getLiteOrder(liteOrder.getOrderNo());
if (liteOrder != null) {
List<TMSPart> parts =tmsUtil.GetReserveList(requestCmd,liteOrder);
List<StoragePos> lockPosList = storagePosManager.findLockPos(liteOrder.getOrderNo());
//同步锁定物料状态
tmsUtil.SyncReelLockS(lockPosList);
List<TMSPart> parts =tmsUtil.GetReserveList(requestCmd,liteOrder,lockPosList);
ResponseDeliveryReserve(responseCmd, requestID, parts, liteOrder.getOrderNo(), "");
......@@ -1004,6 +1040,8 @@ public class TMSCommunicator implements WsMsgReceivedListener {
posResultMap.put(pos.getPosName(), TMS_Code.CODE_2010);//准备出库
log.info(requestCmd + " : pos=" + pos.getPosName() + ",锁定成功,code=" + TMS_Code.CODE_2010);
}
//同步锁定物料状态
tmsUtil.SyncReelLockS(lockPosList);
}
//返回消息
......@@ -1074,6 +1112,8 @@ public class TMSCommunicator implements WsMsgReceivedListener {
posResultMap.put(pos.getBarcode().getBarcode(), TMS_Code.CODE_2010);//准备出库
log.info(requestCmd + " : barcode=" + pos.getBarcode().getBarcode() + ",锁定成功,code=" + TMS_Code.CODE_2010);
}
//同步锁定物料状态
tmsUtil.SyncReelLockS(lockPosList);
}
//返回消息
......@@ -1217,22 +1257,6 @@ public class TMSCommunicator implements WsMsgReceivedListener {
public void ResponseDeliveryReserve(String topic, int requestID, List<TMSPart> Parts, String OrderCode,String ReserveCode) {
ResponseDeliveryOrder(topic,requestID,Parts,OrderCode,ReserveCode);
// Map<String, Object> dataMap = new HashMap<>();
// dataMap.put("Topic", topic);
// dataMap.put("RequestID", requestID);
// List<Map<String, Object>> arrayList = new ArrayList<>();
// for (TMSPart Part : Parts) {
// arrayList.add(Part.getJson());
// }
//
// if(ObjectUtil.isEmpty(ReserveCode)){
// ReserveCode= OrderCode;
// }
//
// dataMap.put("PartList", arrayList);
// dataMap.put("OrderCode", OrderCode);
// dataMap.put("ReserveCode", ReserveCode);
// SendData(dataMap);
}
/**
......
......@@ -20,6 +20,7 @@ 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.hanwha.handler.bean.TMSPart;
import com.neotel.smfcore.custom.hanwha.handler.bean.TMSPartReelPos;
import com.neotel.smfcore.custom.hanwha.handler.bean.TMSReserve;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -53,6 +54,9 @@ public class TMSUtil {
@Autowired
private IComponentManager componentManager;
@Autowired
private TMSApis tmsApis;
public TMSReserve GetOrderInfo(LiteOrder liteOrder) {
TMSReserve tmsReserve = new TMSReserve();
......@@ -115,8 +119,9 @@ public class TMSUtil {
for (StoragePos pos :
lockPosList) {
Barcode code = pos.getBarcode();
Storage storage=dataCache.getStorageById(pos.getStorageId());
TMSPart part = TMSPart.newBean(tmsParts.size(), code.getPartNumber(), code.getBarcode(), code.getAmount(), code.getAmount(),
TMS_Code.CODE_2010, "", pos.getPosName());
TMS_Code.CODE_2010, storage.getCid(), pos.getPosName());
tmsParts.add(part);
}
}
......@@ -182,6 +187,8 @@ public class TMSUtil {
//先锁定物料
liteOrderCache.LiteOrderLockReel(liteOrder.getOrderNo(), false, false, true, rackList);
}
return liteOrder;
}
......@@ -219,8 +226,8 @@ public class TMSUtil {
}
return p;
}
public List<TMSPart> GetReserveList(String requestCmd, LiteOrder liteOrder) {
List<StoragePos> lockPosList = storagePosManager.findLockPos(liteOrder.getOrderNo());
public List<TMSPart> GetReserveList(String requestCmd, LiteOrder liteOrder,List<StoragePos> lockPosList) {
List<TMSPart> parts = new ArrayList<>();
for (LiteOrderItem item :
......@@ -232,7 +239,7 @@ public class TMSUtil {
for (StoragePos pos :
lockPosList) {
if (pos.getBarcode().getPartNumber().equals(item.getPn())) {
if (pos.getBarcode().getPartNumber().equals(item.getPn()) ) {
int requestNum = pos.getBarcode().getAmount();
curroNum += requestNum;
if (curroNum > item.getNeedNum()) {
......@@ -291,12 +298,39 @@ public class TMSUtil {
return parts;
}
public void SyncReelLockS(List<StoragePos> posList){
if(posList==null||posList.size()<=0){
return;
}
List<TMSPartReelPos> list = new ArrayList<>();
for (StoragePos pos:posList
) {
int s=ObjectUtil.isNotEmpty(pos.getBarcode().getLockId())?1:0;
Storage storage=dataCache.getStorageById(pos.getStorageId());
TMSPartReelPos bean = TMSPartReelPos.newBean(pos.getBarcode().getPartNumber(), pos.getBarcode().getBarcode(), pos.getBarcode().getAmount(), storage.getCid(), pos.getPosName(), 1, pos.getUpdateDate().getTime(), -1,s);
list.add(bean);
}
tmsApis.RequestSyncPartReelPosInfo(0, list);
}
public boolean HasExeOrder(){
if(liteOrderCache.SingleOrderMode()){
Query query = new Query(Criteria.where("status").ne(LITEORDER_STATUS.CLOSED).ne(LITEORDER_STATUS.NEW));
Query query = new Query(Criteria.where("status").ne(LITEORDER_STATUS.CLOSED));
List<LiteOrder> orderList = liteOrderManager.findByQuery(query);
if (orderList.size() > 0) {
List<LiteOrder> nOder=new ArrayList<>();
for (LiteOrder or:orderList
) {
if(or.isNew()){
continue;
}
nOder.add(or);
}
if (nOder.size() > 0) {
log.info( " 有正在执行的工单" + orderList.size() + "");
return true;
}
......@@ -314,14 +348,26 @@ public class TMSUtil {
LiteOrder order = liteOrderCache.getLiteOrder(reserveCode);
if (order != null) {
if (order.isOutBom() || order.isOutTails() || order.isOutOne()) {
if (order.isOutBom() || order.isOutTails() || order.isOutOne()||order.isNew()) {
log.info("ProcessOrder 准备取消工单:" + reserveCode + ",设置取消标记");
log.info("ProcessOrder 准备取消工单:" + reserveCode + ",当前状态:"+order.getStatus()+",设置取消标记");
order.addAppendDate("cancel", "true");
liteOrderManager.save(order);
liteOrderCache.addOrderToMap(order);
if(order.isNew()){
List<StoragePos> lockPosList = storagePosManager.findLockPos(order.getOrderNo());
for (StoragePos pos :
lockPosList) {
Storage storage=dataCache.getStorageById(pos.getStorageId());
log.info("RequestUpdateDeliveryReserveState 取消锁定物料,工单:" + order.getOrderNo() + ", barcode:" + pos.getBarcode().getBarcode() + ", posName:" + pos.getPosName() );
TMSPart part = TMSPart.newBean(tmsParts.size(), pos.getBarcode().getPartNumber(), pos.getBarcode().getBarcode(), pos.getBarcode().getAmount(), pos.getBarcode().getAmount(), TMS_Code.CODE_2012, storage.getCid(), pos.getPosName());
tmsParts.add(part);
}
}else {
//查找工单的所有任务
Criteria c = Criteria.where("sourceName").is(order.getOrderNo()).and("type").is(2);
List<DataLog> dataLogs = dataLogManager.findByQuery(new Query(c));
......@@ -352,7 +398,7 @@ public class TMSUtil {
tmsParts.add(part);
}
}
}
//判断工单是否可以取消,
liteOrderCache.closeOrder(order.getOrderNo());
if (order.isClosed()) {
......@@ -374,8 +420,8 @@ public class TMSUtil {
} else {
log.error("ProcessOrder 未找到工单号:" + reserveCode);
}
} else if (reserveCode.equals(TMS_Code.CODE_2011)) {
tmsReserve.setResultCode(TMS_Code.CODE_2014);
} else if (resultCode.equals(TMS_Code.CODE_2011)) {
tmsReserve.setResultCode(TMS_Code.CODE_2010);
//工单出库
LiteOrder order = liteOrderCache.getLiteOrder(reserveCode);
if (order != null) {
......@@ -383,15 +429,20 @@ public class TMSUtil {
if (HasExeOrder()) {
List<StoragePos> lockPosList = storagePosManager.findLockPos(order.getOrderNo());
log.info("ProcessOrder: 当前有未关闭的工单 ,工单出库失败");
tmsParts = GetReserveList("ProcessOrder", order);
tmsParts = GetReserveList("ProcessOrder", order,lockPosList);
} else { //工单出库
liteOrderCache.checkOutLiteOrder(order.getOrderNo(), false, false, true);
String result = liteOrderCache.checkOutLiteOrder(order.getOrderNo(), false, false, true);
tmsReserve.setResultCode(TMS_Code.CODE_2011);
//查找工单的所有任务
Criteria c = Criteria.where("sourceName").is(order.getOrderNo()).and("type").is(2);
List<DataLog> dataLogs = dataLogManager.findByQuery(new Query(c));
if (dataLogs == null || dataLogs.size() <= 0) {
tmsReserve.setResultCode(TMS_Code.CODE_2010);
log.info("ProcessOrder 工单出库:" + order.getOrderNo() + "失败:code=" + result+" :任务数为0");
} else {
for (DataLog task :
dataLogs) {
//是工单出库任务
......@@ -405,6 +456,7 @@ public class TMSUtil {
}
}
}
}
} else {
log.error("ProcessOrder 未找到工单号:" + reserveCode);
}
......
......@@ -22,7 +22,10 @@ public class TMSPartReelPos extends TMSPos implements Serializable {
*/
private int flag = 0;
private int state = 0;
/**
* 1=锁定,0=未锁定
*/
private int state=0;
//yyyy-MM-dd HH:mm:ss
private String indate;
......@@ -51,17 +54,18 @@ public class TMSPartReelPos extends TMSPos implements Serializable {
map.put("Flag", getFlag());
map.put("Indate", getIndate());
map.put("Outdate", getOutdate());
map.put("State",getState());
return map;
}
public static TMSPartReelPos newBean(String pn,String barcode,int count,String cid,String posName,int flag,long inTime,long outTime) {
public static TMSPartReelPos newBean(String pn,String barcode,int count,String cid,String posName,int flag,long inTime,long outTime,int reelS) {
TMSPartReelPos bean = new TMSPartReelPos();
bean.setPartName(pn);
bean.setReelCode(barcode);
bean.setCount(count);
bean.setRackID(cid);
bean.setFlag(flag);
bean.setState(0);
bean.setState(reelS);
bean.setPosName(posName);
String format="yyyy-MM-dd HH:mm:ss";
if (inTime > 0) {
......
......@@ -28,6 +28,31 @@ public class TMSPos implements Serializable {
jObject.put("ColID", ColID);
return jObject;
}
public static TMSPos ToBean(Map<String,Object> map) {
try {
TMSPos obj = new TMSPos();
obj.setRackID(getMapValue(map,"RackID"));
obj.setRowID(getMapValue(map,"RowID"));
obj.setColID(getMapValue(map,"ColID"));
return obj;
} catch (Exception ex) {
log.error("转换为TMSPos出错:" + ex.toString());
return null;
}
}
private static <T> T getMapValue(Map<String,Object> resultMap, String key ) {
if (key != null && !key.isEmpty()) {
Object value = resultMap.get(key);
if (value != null) {
return (T) value;
}
}
return null;
}
public String getPosName(){
return getRowID()+"_"+getColID();
}
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!