no message

main
HUOJIN\92525 2024-07-08 15:46:40 +08:00
parent a68252805c
commit b16000a98c
14 changed files with 125 additions and 114 deletions

View File

@ -37,6 +37,7 @@ public class BydAppController {
@AnonymousAccess
public ResponseEntity<Object> materialIn(@RequestBody BindStock bindStock) {
try {
//P:A17A;V:148795;M:10441666-00/PCS;B:240512JFET;Lot:20240427;S:124051200181131;PO:5913490946/00020;Q:36/20/32;D:2024-04-27;SN:;YX:2025-04-26;DN:D12405120005031AS
String stockCode = bindStock.getStockCode();//容器编号
List<String> boxNumbers = bindStock.getBoxNumbers();//箱号集合
String pointCode = bindStock.getPointCode();//点位编号
@ -164,8 +165,4 @@ public class BydAppController {
private ResponseEntity<Object> successResponse(Object data) {
return new ResponseEntity<>(data, HttpStatus.OK);
}
/* private ResponseEntity<Object> successResponse(String message, Object data) {
return new ResponseEntity<>(ApiResult.fail(OK.value(), message, data), HttpStatus.OK);
}*/
}

View File

@ -15,6 +15,7 @@
*/
package com.youchain.basicdata.service;
import com.youchain.RequestData.TransTask;
import com.youchain.appupdate.ReturnJson.ReturnTaskVo;
import com.youchain.basicdata.domain.Stock;
import com.youchain.basicdata.service.dto.StockDto;
@ -197,4 +198,11 @@ public interface StockService {
*/
void fbPicking(Long taskId, String orderNumber, String dstStockCode);
/**
*
*
* @param transTask
*/
void moveStock(TransTask transTask);
}

View File

@ -18,6 +18,7 @@ package com.youchain.basicdata.service.impl;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.youchain.RequestData.TransTask;
import com.youchain.appupdate.ReturnJson.ReturnTaskVo;
import com.youchain.basicdata.domain.Item;
import com.youchain.basicdata.domain.Point;
@ -345,7 +346,7 @@ public class StockServiceImpl implements StockService {
/**验证终点点位*/
String areaCode = stockTypeToAreaMap.getValueByKey(item.getGoodType());
Point endPoint = validateEndPoint(item, areaCode);
Point endPoint = validateEndPoint(areaCode);
/**创建下发任务*/
AgvTask agvTask = createAndSendAgvTask(stock, srcPoint, endPoint);
@ -614,6 +615,25 @@ public class StockServiceImpl implements StockService {
returnFBAgvTask(task.getDstPoint(), task.getSrcStock(), task.getItem());
}
@Override
@Transactional(rollbackFor = Exception.class)
public void moveStock(TransTask transTask) {
if (BizStatus.Cp_Off_Line.equals(transTask.getTaskType())) {
Point srcPoint = validateSrcPoint(transTask.getPointCode());//起点
Point endPoint = validateEndPoint(null, BaseStatus.FREE, BaseStatus.BOX, AreaNameDic.CPRKQ);//终点
AgvTask agvTask = new AgvTask(BizStatus.Cp_Off_Line, null, srcPoint.getCode(), endPoint.getCode(), BizStatus.OPEN, "RACK_MOVE");
agvTaskService.create(agvTask);
agvTaskService.sendAgvTaskImpl(agvTask);
srcPoint.setStatus(BaseStatus.USED);
pointService.update(srcPoint);
endPoint.setStatus(BaseStatus.USED);
pointService.update(endPoint);
}else{
throw new RuntimeException("任务类型不存在!");
}
}
/**
*
*
@ -753,7 +773,7 @@ public class StockServiceImpl implements StockService {
return srcPoint;
}
private Point validateEndPoint(Item item, String areaCode) {
private Point validateEndPoint(String areaCode) {
Point endPoint = pointService.findByCode(null, BaseStatus.FREE, BaseStatus.STORAGE, areaCode, null, null);
if (endPoint == null) {
throw new RuntimeException(areaCode + "没有空闲点位!");
@ -761,6 +781,14 @@ public class StockServiceImpl implements StockService {
return endPoint;
}
private Point validateEndPoint(String code, String status, String type, String areaCode) {
Point endPoint = pointService.findByCode(code, status, type, areaCode, null, null);
if (endPoint == null) {
throw new RuntimeException(areaCode + "没有空闲点位!");
}
return endPoint;
}
private void checkPointStatus(Point srcPoint) {
if (BaseStatus.USED.equals(srcPoint.getStatus())) {
@ -797,20 +825,14 @@ public class StockServiceImpl implements StockService {
if (!isValidMCJLArea(endPointAreaCode)) {
throw new RuntimeException(endPoint.getCode() + "点位不能叫满车!");
}
String areaCode = null;
if (item.getGoodType().contains("大件")) {
areaCode = stockTypeToAreaMap.getValueByKey("大件入库");
} else if (item.getGoodType().contains("小件")) {
areaCode = stockTypeToAreaMap.getValueByKey("小件入库");
}
Set<String> areaCodes = Collections.singleton(areaCode);
List<Inventory> inventoryList = inventoryService.findByItemIdAndAreaCode(item.getId(), areaCodes);
List<Inventory> inventoryList = inventoryService.findByItemIdAndAreaCode(item.getId(), item.getGoodType());
if (inventoryList.isEmpty()) {
throw new RuntimeException(itemCode + "物料无库存,呼叫失败!");
}
PickDetail pickDetail = pickDetailService.createPickDetail(item, "");
try {
pickDetailService.allocateAll(pickDetail.getId(), endPoint, areaCode);
pickDetailService.allocateAll(pickDetail.getId(), endPoint, item.getGoodType());
List<Task> taskList = taskService.findByPickNotAllTask(pickDetail.getId());
AgvTask agvTask = taskList.get(0).getAgvTask();
sendAgvTaskAndHandleResponse(agvTask);
@ -849,7 +871,7 @@ public class StockServiceImpl implements StockService {
}
private boolean isRestrictedArea(String areaName) {
return areaName.equals(AreaNameDic.XJQ) || areaName.equals(AreaNameDic.DJQ) || areaName.equals(AreaNameDic.CPRKQ);
return areaName.equals(AreaNameDic.XJQ) || areaName.equals(AreaNameDic.DJQ);
}
private void handleFullContainer(Stock stock, Point point, String itemCode) {

View File

@ -34,8 +34,8 @@ import java.util.Set;
* @date 2023-08-22
**/
public interface InventoryRepository extends JpaRepository<Inventory, Long>, JpaSpecificationExecutor<Inventory> {
@Query("from Inventory inv where inv.itemKey.item.id =:itemId and inv.point.area.code in :areaCode order by inv.itemKey.propC1")
List<Inventory> findByItemIdAndAreaCode(long itemId, Set areaCode);
@Query("from Inventory inv where inv.itemKey.item.id =:itemId and inv.point.area.code = :areaCode order by inv.itemKey.propC1")
List<Inventory> findByItemIdAndAreaCode(long itemId, String areaCode);
@Query("from Inventory inv where inv.quantity > 0 " +
"and (:itemKeyId is null or inv.itemKey.id = :itemKeyId) " +

View File

@ -19,6 +19,7 @@ import com.youchain.businessdata.domain.Task;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
import java.util.List;
import java.util.Set;
@ -67,8 +68,8 @@ public interface TaskRepository extends JpaRepository<Task, Long>, JpaSpecificat
@Query(value = " FROM Task t WHERE t.pickDetail.pick.id=?1 and t.taskType='PICK' and t.planQty>t.moveQty ")
List<Task> findByNotPickTask(Long pickId);
@Query(value = " select count(t.id) FROM Task t WHERE t.taskType='PICK' and t.taskStatus not in ('FINISH') and t.srcPoint.id=?1 ")
int existsByTask(Long srcPointId);
@Query(value = " select count(t.id) FROM Task t WHERE t.srcStock.code=:stockCode and t.taskType='PICK' and t.taskStatus not in ('FINISH') ")
int existsByStock(String stockCode);
@Query(value = " from Task t WHERE t.taskType='PICK' and t.taskStatus='ARRIVED' and t.srcStock.code=:srcStockCode ")
Task findBySrcStockCode(String srcStockCode);

View File

@ -1,5 +1,6 @@
package com.youchain.businessdata.rest;
import com.youchain.basicdata.service.StockService;
import com.youchain.exception.handler.ApiResult;
import org.springframework.http.HttpStatus;
import com.youchain.RequestData.*;
@ -26,6 +27,8 @@ import static org.springframework.http.HttpStatus.OK;
public class MesController {
private final GdService gdService;
private final PickService pickService;
private final StockService stockService;
@PostMapping("/yclbl")
@Log("mes-原材料备料")
@ -70,7 +73,7 @@ public class MesController {
pickService.bigItemCall(orderNo, completeCode, station, pointCode);
return successResponse("叫料成功!");
} catch (Exception e) {
return badResponse("叫料失败!");
return badResponse("叫料失败!" + e.getMessage());
}
}
@ -88,7 +91,12 @@ public class MesController {
@ApiOperation("mes-搬运任务")
@AnonymousAccess
public ResponseEntity<Object> transTask(@Validated @RequestBody TransTask transTask) {
return new ResponseEntity<>(ApiResult.result(200, "成功", null), HttpStatus.OK);
try {
stockService.moveStock(transTask);
return successResponse("下发成功!");
} catch (Exception e) {
return badResponse("下发失败!" + e.getMessage());
}
}

View File

@ -128,7 +128,7 @@ public class PickDetailController {
if (pickDetailIds.size() > 0) {
for (Long id : pickDetailIds) {
PickDetailDto pickDetailDto = pickDetailService.findById(id);
pickDetailService.allocate(id, pickDetailDto.getOrderQty(),null,null);
pickDetailService.allocate(id, pickDetailDto.getOrderQty(),null);
}
} else {
return new ResponseEntity(ApiResult.fail(BAD_REQUEST.value(), "参数错误或者为null", ""), HttpStatus.BAD_REQUEST);

View File

@ -101,7 +101,7 @@ public interface InventoryService {
Inventory toEntity(InventoryDto inventoryDto);
List<Inventory> findByItemIdAndAreaCode(long itemId, Set areaCode);
List<Inventory> findByItemIdAndAreaCode(long itemId, String areaCode);
Inventory getInventory(ItemKey itemKey, Point point, Stock stock, Dept dept, String type);

View File

@ -98,12 +98,12 @@ public interface PickDetailService {
/**
*
*/
String allocate(long id, double quantity, String areaName, Point endPoint);
String allocate(long id, double quantity, Point endPoint);
/**
*
*/
void allocateAll(long id, Point endPoint, String areaName) throws Exception;
void allocateAll(long id, Point endPoint, String areaCode) throws Exception;
/**
*

View File

@ -150,15 +150,8 @@ public class AgvTaskServiceImpl implements AgvTaskService {
objMap.put("orgId", agvTasks.getId());//库存组织 ID
objMap.put("requestId", agvTasks.getId());//请求 id
objMap.put("missionCode", agvTasks.getId());//任务编号
objMap.put("missionType", agvTasks.getJobType());//货 架 ( 托 盘 ) 移动 RACK_MOVE
String viewBoardType = "";
Point point = pointService.findByCode(agvTasks.getStartSlotCode(), null, null, null, null, null);
//到达上视自动识别
if (AreaNameDic.CPRKQ.equals(point.getArea().getCode())) {
viewBoardType = "IDENTIFY_REQUIRE";
}
objMap.put("viewBoardType", viewBoardType);//上视识别类型;需要 IDENTIFY_REQUIRE 不需要NORMAL
objMap.put("viewBoardType", "");//
objMap.put("robotType", "LIFT");//机器人功能类型
JSONArray robotModels = new JSONArray();
objMap.put("robotModels", robotModels);//机器人具体型号
@ -166,7 +159,7 @@ public class AgvTaskServiceImpl implements AgvTaskService {
objMap.put("robotIds", robotIds);//机器人编号
objMap.put("priority", "1");//数值越小,优先级越高,默认是 1
objMap.put("containerModelCode", "");//容器模型编码
objMap.put("containerCode", agvTasks.getStockCode() == null ? "" : agvTasks.getStockCode());//容器编号
objMap.put("containerCode", "");//
objMap.put("templateCode", "");//作业流程模板编号
objMap.put("lockRobotAfterFinish", false);//是否需要流程结束后机器人保持任务锁定状态
objMap.put("unlockRobotId", "");//解锁当前小车的在上个任务的锁定状态
@ -176,46 +169,28 @@ public class AgvTaskServiceImpl implements AgvTaskService {
JSONObject missionDataObj = new JSONObject(new LinkedHashMap<>());
Map<String, Object> missionDataMap = new LinkedHashMap<>();
missionDataMap.put("sequence", 1);//序号
missionDataMap.put("position", agvTasks.getStartSlotCode());//起始点
missionDataMap.put("type", "NODE_POINT");//作业位置类型点位NODE_POINT
missionDataMap.put("putDown", false);//作业点位是否需要放下货架
missionDataMap.put("passStrategy", "AUTO");//当前任务点结束后放行策略
missionDataMap.put("waitingMillis", "0");//自动触发离开当前任务节点的时间,默认单位:毫秒
missionDataMap.put("containerCode", agvTasks.getStockCode());//容器编号
missionDataMap.put("startPosition", agvTasks.getStartSlotCode());//起始点
missionDataMap.put("startPositionType", "NODE_POINT");//作业位置类型点位NODE_POINT
missionDataMap.put("endPosition", agvTasks.getEndSlotCode());//目标点
missionDataMap.put("endPositionType", "NODE_POINT");//作业位置类型点位NODE_POINT
missionDataObj.putAll(missionDataMap);
missionDataArray.add(missionDataObj);
JSONObject missionDataObj2 = new JSONObject(new LinkedHashMap<>());
Map<String, Object> missionDataMap2 = new LinkedHashMap<>();
missionDataMap2.put("sequence", 2);//序号
missionDataMap2.put("position", agvTasks.getEndSlotCode());//目标点
missionDataMap2.put("type", "NODE_POINT");//作业位置类型点位NODE_POINT
missionDataMap2.put("putDown", true);//作业点位是否需要放下货架
missionDataMap2.put("passStrategy", "AUTO");//当前任务点结束后放行策略
missionDataMap2.put("waitingMillis", "0");//自动触发离开当前任务节点的时间,默认单位:毫秒
missionDataObj2.putAll(missionDataMap2);
missionDataArray.add(missionDataObj2);
objMap.put("missionData", missionDataArray);
jsonObject.putAll(objMap);
String resultJson = "";
// String resultJson = HttpPostUtil.sendPostReq(UrlApi.submitMission(), jsonObject.toString());//返回ResponseJson*/
// if (StringUtils.isEmpty(resultJson)) {
// throw new RuntimeException("AGV返回信息:下发任务接口调用失败!");
// }
// JSONObject resulObject = JSON.parseObject(resultJson);
// if (resulObject == null) {
// throw new RuntimeException("AGV返回信息:下发任务接口返回为空!");
// }
//
// String code = resulObject.getString("code");
// String message = resulObject.getString("message");
String code = "0";
String message = "";
String resultJson = HttpPostUtil.sendPostReq(UrlApi.submitMission(), jsonObject.toString());
if (StringUtils.isEmpty(resultJson)) {
throw new RuntimeException("AGV返回信息:下发任务接口调用失败!");
}
JSONObject resulObject = JSON.parseObject(resultJson);
if (resulObject == null) {
throw new RuntimeException("AGV返回信息:下发任务接口返回为空!");
}
String code = resulObject.getString("code");
String message = resulObject.getString("message");
if (!"0".equals(code)) {
agvTasks.setJobMessage(resultJson);
agvTasks.setReqMessage(jsonObject.toString());
update(agvTasks);
throw new RuntimeException("AGV返回信息:" + message);
} else {
agvTasks.setJobForce(agvTasks.getId().toString());//任务组
agvTasks.setJobForceAsc((1));
@ -240,13 +215,7 @@ public class AgvTaskServiceImpl implements AgvTaskService {
objMap.put("missionCode", agvTasks.getId());//任务编号
objMap.put("missionType", agvTasks.getJobType());//货 架 ( 托 盘 ) 移动 RACK_MOVE
String viewBoardType = "";
Point point = pointService.findByCode(agvTasks.getStartSlotCode(), null, null, null, null, null);
//到达上视自动识别
if (AreaNameDic.CPRKQ.equals(point.getArea().getCode())) {
viewBoardType = "IDENTIFY_REQUIRE";
}
objMap.put("viewBoardType", viewBoardType);//上视识别类型;需要 IDENTIFY_REQUIRE 不需要NORMAL
objMap.put("viewBoardType", "");//上视识别类型;需要 IDENTIFY_REQUIRE 不需要NORMAL
objMap.put("robotType", "LIFT");//机器人功能类型
JSONArray robotModels = new JSONArray();
objMap.put("robotModels", robotModels);//机器人具体型号
@ -254,7 +223,7 @@ public class AgvTaskServiceImpl implements AgvTaskService {
objMap.put("robotIds", robotIds);//机器人编号
objMap.put("priority", "1");//数值越小,优先级越高,默认是 1
objMap.put("containerModelCode", "");//容器模型编码
objMap.put("containerCode", agvTasks.getStockCode() == null ? "" : agvTasks.getStockCode());//容器编号
objMap.put("containerCode", "");//容器编号
objMap.put("templateCode", "");//作业流程模板编号
objMap.put("lockRobotAfterFinish", false);//是否需要流程结束后机器人保持任务锁定状态
objMap.put("unlockRobotId", "");//解锁当前小车的在上个任务的锁定状态
@ -264,26 +233,14 @@ public class AgvTaskServiceImpl implements AgvTaskService {
JSONObject missionDataObj = new JSONObject(new LinkedHashMap<>());
Map<String, Object> missionDataMap = new LinkedHashMap<>();
missionDataMap.put("sequence", 1);//序号
missionDataMap.put("position", agvTasks.getStartSlotCode());//起始点
missionDataMap.put("type", "NODE_POINT");//作业位置类型点位NODE_POINT
missionDataMap.put("putDown", false);//作业点位是否需要放下货架
missionDataMap.put("passStrategy", "AUTO");//当前任务点结束后放行策略
missionDataMap.put("waitingMillis", "0");//自动触发离开当前任务节点的时间,默认单位:毫秒
missionDataMap.put("containerCode", agvTasks.getStockCode());//容器编号
missionDataMap.put("startPosition", agvTasks.getStartSlotCode());//起始点
missionDataMap.put("startPositionType", "NODE_POINT");//作业位置类型点位NODE_POINT
missionDataMap.put("endPosition", agvTasks.getEndSlotCode());//目标点
missionDataMap.put("endPositionType", "NODE_POINT");//作业位置类型点位NODE_POINT
missionDataObj.putAll(missionDataMap);
missionDataArray.add(missionDataObj);
JSONObject missionDataObj2 = new JSONObject(new LinkedHashMap<>());
Map<String, Object> missionDataMap2 = new LinkedHashMap<>();
missionDataMap2.put("sequence", 2);//序号
missionDataMap2.put("position", agvTasks.getEndSlotCode());//目标点
missionDataMap2.put("type", "NODE_POINT");//作业位置类型点位NODE_POINT
missionDataMap2.put("putDown", true);//作业点位是否需要放下货架
missionDataMap2.put("passStrategy", "AUTO");//当前任务点结束后放行策略
missionDataMap2.put("waitingMillis", "0");//自动触发离开当前任务节点的时间,默认单位:毫秒
missionDataObj2.putAll(missionDataMap2);
missionDataArray.add(missionDataObj2);
objMap.put("missionData", missionDataArray);
jsonObject.putAll(objMap);
return jsonObject.toString();

View File

@ -136,7 +136,7 @@ public class InventoryServiceImpl implements InventoryService {
}
@Override
public List<Inventory> findByItemIdAndAreaCode(long itemId, Set areaCode) {
public List<Inventory> findByItemIdAndAreaCode(long itemId, String areaCode) {
return inventoryRepository.findByItemIdAndAreaCode(itemId, areaCode);
}

View File

@ -67,6 +67,7 @@ public class PickDetailServiceImpl implements PickDetailService {
private final LogService logService;
private final EntityManager entityMapper;
private final PickDetailMapper pickDetailMapper;
private final StockTypeToAreaMap stockTypeToAreaMap;
@Override
public Map<String, Object> queryAll(PickDetailQueryCriteria criteria, Pageable pageable) {
@ -133,7 +134,7 @@ public class PickDetailServiceImpl implements PickDetailService {
@Override
@Transactional(rollbackFor = Exception.class)
public synchronized String allocate(long id, double quantity, String areaCode, Point endPoint) {
public synchronized String allocate(long id, double quantity, Point endPoint) {
PickDetailDto pickDetailDto = findById(id);
PickDetail pd = toEntity(pickDetailDto);//Dto转实体
@ -146,20 +147,15 @@ public class PickDetailServiceImpl implements PickDetailService {
if (pd.getAllocatedQty() >= pd.getOrderQty()) {
return pick.getCode() + "出库单;" + item.getCode() + "数量已分配!";
}
Set<String> areaCodes = Collections.singleton(areaCode);
List<Inventory> Inventorys = inventoryService.findByItemIdAndAreaCode(item.getId(), areaCodes);
if (Inventorys.isEmpty()) {
String areaCode = stockTypeToAreaMap.getValueByKey(item.getGoodType());
List<Inventory> inventoryList = inventoryService.findByItemIdAndAreaCode(item.getId(), areaCode);
if (inventoryList.isEmpty()) {
return pick.getCode() + "出库单;" + item.getCode() + "物料库存不足,请先补充库存!";
}
double allocateQty = 0;
double unQty = quantity;//未分配数量
for (Inventory inv : Inventorys) {
for (Inventory inv : inventoryList) {
Point startPoint = inv.getPoint();//起始点位
//判断任务起始点位是否有任务
if (taskRepository.existsByTask(startPoint.getId())>=1) {
return pick.getCode() + "出库单;" + item.getCode() + "起始点位有任务,请先完成任务!";
}
if (unQty == 0) {
break;
}
@ -167,6 +163,10 @@ public class PickDetailServiceImpl implements PickDetailService {
if (allocateQty <= 0) {
continue;
}
//判断托盘是否有任务
if (taskRepository.existsByStock(inv.getStockCode()) >= 1) {
return pick.getCode() + "出库单;" + item.getCode() + "的" + inv.getStockCode() + "托盘有任务,请先完成任务!";
}
if (unQty < allocateQty) {
allocateQty = unQty;
}
@ -210,8 +210,7 @@ public class PickDetailServiceImpl implements PickDetailService {
ItemDto itemDto = pickDetailDto.getItem();
Item item = itemService.toEntity(itemDto);
Dept dept = item.getDept();//仓库
Set<String> areaCodes = Collections.singleton(areaCode);
List<Inventory> Inventorys = inventoryService.findByItemIdAndAreaCode(item.getId(), areaCodes);
List<Inventory> Inventorys = inventoryService.findByItemIdAndAreaCode(item.getId(), item.getGoodType());
if (Inventorys.size() > 0) {
Inventory inv = Inventorys.get(0);
//库存冻结状态不允许出库
@ -364,14 +363,16 @@ public class PickDetailServiceImpl implements PickDetailService {
List<String> MsgList = new ArrayList<>();//存放提示信息
//查询出待分配的pickDetail
String areaCode = AreaNameDic.XJQ + "," + AreaNameDic.DJQ;
List<PickDetail> pickDetails = pickDetailRepository.findByPickDetailNoAllocate(pick.getId());
for (PickDetail pickDetail : pickDetails) {
MsgList.add(allocate(pickDetail.getId(), pickDetail.getOrderQty(), areaCode, endPoint));
MsgList.add(allocate(pickDetail.getId(), pickDetail.getOrderQty(), endPoint));
}
boolean containsSuccess = MsgList.stream().anyMatch(s -> s.contains("分配成功"));
if (containsSuccess) {
/* 更新出库单状态并写入目标点位*/
refreshPickStatus(pick, endPoint);
}
//保存日志
logService.saveLogInfo(pick.getCode(), pick.getCode(), "/pick/allocatePick", MsgList.toString(), "出库单分配", 200, "info");

View File

@ -37,6 +37,11 @@ public interface AreaNameDic {
*/
public static String CPRKQ = "CPRKQ";
/**
* 线
*/
public static String CPXXQ = "CPXXQ";
/**
*
*/

View File

@ -84,13 +84,20 @@ public interface BizStatus {
*/
public static String FB_RETURN = "FB_RETURN";
/**
* -线
*/
public static String Cp_Off_Line = "Cp_Off_Line";
/**
* -
*/
public static String FINISH = "FINISH";
/**
*
*
*/
public static String ASN = "ASN";
/**
@ -98,6 +105,11 @@ public interface BizStatus {
*/
public static String PICK = "PICK";
/**
*
*/
public static String CALL_PICK = "CALL_PICK";
/**
*
*/