Commit a216d74e LN

1.工单增加数量修改,套料出库,尾料出库,关闭工单接口

2.库位查询增加是否启用搜索
2.个人资料修改,密码修改,密码重置功能
1 个父辈 97a874f1
...@@ -206,9 +206,11 @@ public class DataInitManager { ...@@ -206,9 +206,11 @@ public class DataInitManager {
Menu menuOut = new Menu(new ArrayList<Menu>(), 1, "checkOut", "查找出库", 1, "singleOuput", "neolight/singleOuput/index", "", 0, "export1"); Menu menuOut = new Menu(new ArrayList<Menu>(), 1, "checkOut", "查找出库", 1, "singleOuput", "neolight/singleOuput/index", "", 0, "export1");
Menu celueOut = new Menu(new ArrayList<Menu>(), 1, "tacticsOuput", "策略出库", 1, "tacticsOuput", "neolight/tacticsOuput/index", "", 0, "workOrder"); Menu celueOut = new Menu(new ArrayList<Menu>(), 1, "tacticsOuput", "策略出库", 1, "tacticsOuput", "neolight/tacticsOuput/index", "", 0, "workOrder");
Menu groupOut = new Menu(new ArrayList<Menu>(), 1, "labelOuput", "物料分组", 1, "labelOuput", "neolight/labelOuput/index", "", 0, "export1"); Menu groupOut = new Menu(new ArrayList<Menu>(), 1, "labelOuput", "物料分组", 1, "labelOuput", "neolight/labelOuput/index", "", 0, "export1");
Menu manualOut = new Menu(new ArrayList<Menu>(), 1, "manualOut", "手动出库", 1, "manualOut", "neolight/manualOut/index", "", 0, "export1");
celueOut.setHidden(true); celueOut.setHidden(true);
groupOut.setHidden(true); groupOut.setHidden(true);
menus.addAll(createMenus(poutOut, menuOrder, menuOut,celueOut,groupOut)); manualOut.setHidden(true);
menus.addAll(createMenus(poutOut, menuOrder, menuOut,celueOut,groupOut,manualOut));
//设置:料仓管理,菜单管理 //设置:料仓管理,菜单管理
Menu poutSet = Menu.CreatePMenu("设置", 30, "system", 2, "system"); Menu poutSet = Menu.CreatePMenu("设置", 30, "system", 2, "system");
......
...@@ -10,6 +10,8 @@ public class Constants { ...@@ -10,6 +10,8 @@ public class Constants {
* 超级管理员用户名 * 超级管理员用户名
*/ */
public static final String SUPER_USERNAME= "admin"; public static final String SUPER_USERNAME= "admin";
public static final String USER_DEFAULTP_PWD="123456";
/** /**
* Assets Version constant * Assets Version constant
*/ */
......
...@@ -23,6 +23,7 @@ import com.neotel.smfcore.core.storage.service.po.StoragePos; ...@@ -23,6 +23,7 @@ import com.neotel.smfcore.core.storage.service.po.StoragePos;
import com.neotel.smfcore.core.system.listener.ITaskListener; import com.neotel.smfcore.core.system.listener.ITaskListener;
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 javafx.concurrent.Task;
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.stereotype.Service; import org.springframework.stereotype.Service;
...@@ -60,9 +61,13 @@ public class LiteOrderCache implements ITaskListener { ...@@ -60,9 +61,13 @@ public class LiteOrderCache implements ITaskListener {
@Override @Override
public void onTaskStatusChange(DataLog task) { public void onTaskStatusChange(DataLog task) {
try { try {
finishedOrderTask(task); //只有任务完成或取消时才处理,任务未完成直接返回
if (task.isFinished() || task.isCancel()) {
finishedOrderTask(task);
}
} catch (Exception e) { } catch (Exception e) {
log.error("更新工单状态出错",e); log.error("更新工单状态出错", e);
} }
} }
...@@ -102,6 +107,7 @@ public class LiteOrderCache implements ITaskListener { ...@@ -102,6 +107,7 @@ public class LiteOrderCache implements ITaskListener {
} }
liteOrder.setTaskReelCount(taskReelCount); liteOrder.setTaskReelCount(taskReelCount);
liteOrder.setTotalTaskReelCount(liteOrder.getTotalTaskReelCount()+taskReelCount);
log.info("工单[" + liteOrder.getOrderNo() + "]任务分配结束,任务数[" + taskReelCount + "]"); log.info("工单[" + liteOrder.getOrderNo() + "]任务分配结束,任务数[" + taskReelCount + "]");
//有需要出库的 //有需要出库的
if (taskReelCount <= 0) { if (taskReelCount <= 0) {
...@@ -120,6 +126,7 @@ public class LiteOrderCache implements ITaskListener { ...@@ -120,6 +126,7 @@ public class LiteOrderCache implements ITaskListener {
*/ */
private synchronized void finishedOrderTask(DataLog task) throws ValidateException { private synchronized void finishedOrderTask(DataLog task) throws ValidateException {
if (OP.CHECKOUT == task.getType()) { if (OP.CHECKOUT == task.getType()) {
//更新工单状态 //更新工单状态
String orderNo = task.getSourceName(); String orderNo = task.getSourceName();
if (!Strings.isNullOrEmpty(orderNo)) { if (!Strings.isNullOrEmpty(orderNo)) {
...@@ -136,9 +143,12 @@ public class LiteOrderCache implements ITaskListener { ...@@ -136,9 +143,12 @@ public class LiteOrderCache implements ITaskListener {
//任务是取消的,需要将总待出库数量-1 //任务是取消的,需要将总待出库数量-1
if (task.isCancel()) { if (task.isCancel()) {
order.setTaskReelCount(order.getTaskReelCount() - 1); order.setTaskReelCount(order.getTaskReelCount() - 1);
order.setTotalTaskReelCount(order.getTotalTaskReelCount()-1);
log.info("工单[" + orderNo + "]的任务" + task.getPartNumber() + "[" + task.getBarcode() + "]已取消,任务数-1=" + order.getFinishedReelCount() + "/" + order.getTaskReelCount()); log.info("工单[" + orderNo + "]的任务" + task.getPartNumber() + "[" + task.getBarcode() + "]已取消,任务数-1=" + order.getFinishedReelCount() + "/" + order.getTaskReelCount());
} else if (task.isFinished()) { }
else if (task.isFinished()) {
order.setFinishedReelCount(order.getFinishedReelCount() + 1); order.setFinishedReelCount(order.getFinishedReelCount() + 1);
order.setTotalFinishedReelCount(order.getTotalFinishedReelCount()+1);
String orderItemId = task.getSubSourceId(); String orderItemId = task.getSubSourceId();
List<LiteOrderItem> items = new ArrayList<>(); List<LiteOrderItem> items = new ArrayList<>();
for (LiteOrderItem liteOrderItem : order.getOrderItems()) { for (LiteOrderItem liteOrderItem : order.getOrderItems()) {
...@@ -147,6 +157,8 @@ public class LiteOrderCache implements ITaskListener { ...@@ -147,6 +157,8 @@ public class LiteOrderCache implements ITaskListener {
//更新对应条目的已出库数量和出库盘数 //更新对应条目的已出库数量和出库盘数
liteOrderItem.setOutNum(liteOrderItem.getOutNum() + task.getNum()); liteOrderItem.setOutNum(liteOrderItem.getOutNum() + task.getNum());
liteOrderItem.setOutReelCount(liteOrderItem.getOutReelCount() + 1); liteOrderItem.setOutReelCount(liteOrderItem.getOutReelCount() + 1);
liteOrderItem.setTotalOutNum(liteOrderItem.getTotalOutNum()+task.getNum());
liteOrderItem.setTotalOutReelCount(liteOrderItem.getTotalOutReelCount()+1);
liteOrderItem = liteOrderItemManager.save(liteOrderItem); liteOrderItem = liteOrderItemManager.save(liteOrderItem);
// Barcode barcode = barcodeManager.findByBarcode(task.getBarcode()); // Barcode barcode = barcodeManager.findByBarcode(task.getBarcode());
// if (barcode != null) { // if (barcode != null) {
...@@ -202,14 +214,14 @@ public class LiteOrderCache implements ITaskListener { ...@@ -202,14 +214,14 @@ public class LiteOrderCache implements ITaskListener {
LiteOrder cacheOrder = liteOrderMap.get(orderNo); LiteOrder cacheOrder = liteOrderMap.get(orderNo);
if (cacheOrder != null && !cacheOrder.isTaskFinished() && !cacheOrder.isNew()) { if (cacheOrder != null && !cacheOrder.isTaskFinished() && !cacheOrder.isNew()) {
log.info("工单[" + orderNo + "]正在执行"); log.info("工单[" + orderNo + "]正在执行");
return "order.out.executing"; return "smfcode.order.out.executing";
} }
if (cacheOrder == null) { if (cacheOrder == null) {
cacheOrder = liteOrderManager.findByOrderNo(orderNo); cacheOrder = liteOrderManager.findByOrderNo(orderNo);
} }
if (cacheOrder == null) { if (cacheOrder == null) {
return "order.out.notFound"; return "smfcode.order.out.notFound";
} }
...@@ -222,7 +234,7 @@ public class LiteOrderCache implements ITaskListener { ...@@ -222,7 +234,7 @@ public class LiteOrderCache implements ITaskListener {
ORDER_COLOR nextColor = ORDER_COLOR.nextColor(currentColors); ORDER_COLOR nextColor = ORDER_COLOR.nextColor(currentColors);
if (nextColor == null) { if (nextColor == null) {
log.info("执行工单[" + orderNo + "] outBom=" + outBom + "时,已达最大可执行工单数"); log.info("执行工单[" + orderNo + "] outBom=" + outBom + "时,已达最大可执行工单数");
return "order.out.maxOrder"; return "smfcode.order.out.maxOrder";
} }
log.info("开始执行工单[" + orderNo + "] outBom=" + outBom); log.info("开始执行工单[" + orderNo + "] outBom=" + outBom);
...@@ -250,9 +262,14 @@ public class LiteOrderCache implements ITaskListener { ...@@ -250,9 +262,14 @@ public class LiteOrderCache implements ITaskListener {
//其他出库模式一次性全部生成任务 //其他出库模式一次性全部生成任务
for (LiteOrderItem orderItem : cacheOrder.getOrderItems()) { for (LiteOrderItem orderItem : cacheOrder.getOrderItems()) {
orderItem.setOutNum(0);
orderItem.setOutReelCount(0);
liteOrderItemManager.save(orderItem);
//剩余未出数量 //剩余未出数量
Float totalNum = orderItem.getNeedNum() * cacheOrder.getOrderTimes(); Float totalNum = orderItem.getNeedNum() * cacheOrder.getOrderTimes();
int remainNum = totalNum.intValue() - orderItem.getOutNum(); int remainNum = totalNum.intValue() - orderItem.getOutNum();
//此PN未完成 //此PN未完成
if (remainNum > 0) { if (remainNum > 0) {
if (outBom) { if (outBom) {
...@@ -265,7 +282,7 @@ public class LiteOrderCache implements ITaskListener { ...@@ -265,7 +282,7 @@ public class LiteOrderCache implements ITaskListener {
String partNumber = orderItem.getPn(); String partNumber = orderItem.getPn();
StoragePos pos = storagePosManager.findPartNumberInStorages(availableStorageIds, partNumber, excludePosIds, checkoutType); StoragePos pos = storagePosManager.findPartNumberInStorages(availableStorageIds, partNumber, excludePosIds, checkoutType);
if (pos == null) { if (pos == null) {
log.error("未找到可以出库的物料[" + partNumber + "]"); // log.error("未找到可以出库的物料[" + partNumber + "]");
break; break;
} else { } else {
assignNum = assignNum + pos.getBarcode().getAmount(); assignNum = assignNum + pos.getBarcode().getAmount();
...@@ -282,12 +299,16 @@ public class LiteOrderCache implements ITaskListener { ...@@ -282,12 +299,16 @@ public class LiteOrderCache implements ITaskListener {
task.setStatus(OP_STATUS.WAIT.name()); task.setStatus(OP_STATUS.WAIT.name());
// task = dataLogDao.save(task); // task = dataLogDao.save(task);
taskService.addTaskToExecute(task); taskService.addTaskToExecute(task);
} }
} }
} }
} }
cacheOrder.setTaskReelCount(taskReelCount); cacheOrder.setTaskReelCount(taskReelCount);
cacheOrder.setTotalTaskReelCount(cacheOrder.getTotalTaskReelCount()+taskReelCount);
log.info("工单[" + orderNo + "]任务分配结束,任务数[" + taskReelCount + "]"); log.info("工单[" + orderNo + "]任务分配结束,任务数[" + taskReelCount + "]");
//有需要出库的 //有需要出库的
if (taskReelCount <= 0) { if (taskReelCount <= 0) {
...@@ -295,10 +316,11 @@ public class LiteOrderCache implements ITaskListener { ...@@ -295,10 +316,11 @@ public class LiteOrderCache implements ITaskListener {
} }
liteOrderManager.save(cacheOrder); liteOrderManager.save(cacheOrder);
liteOrderMap.put(cacheOrder.getOrderNo(), cacheOrder); liteOrderMap.put(cacheOrder.getOrderNo(), cacheOrder);
if (taskReelCount <= 0) { if (taskReelCount <= 0) {
//return "工单无可执行的任务"; //return "工单无可执行的任务";
return "order.out.noTask"; return "smfcode.order.out.noTask";
} }
return ""; return "";
} }
...@@ -339,4 +361,38 @@ public class LiteOrderCache implements ITaskListener { ...@@ -339,4 +361,38 @@ public class LiteOrderCache implements ITaskListener {
return task; return task;
} }
/**
* 关闭工单
* @param orderNo
*/
public String closeOrder(String orderNo) {
LiteOrder liteOrder = liteOrderMap.get(orderNo);
if (liteOrder == null) {
liteOrder=liteOrderManager.findByOrderNo(orderNo);
if(liteOrder==null){
return "smfcode.order.out.notFound";
}
}
//有任务的工单不能关闭
List<DataLog> allTask=taskService.getAllTasks();
for (DataLog task:allTask
) {
if (OP.CHECKOUT == task.getType()&&(!task.isEnd())) {
//更新工单状态
String taskSourceName = task.getSourceName();
if (!Strings.isNullOrEmpty(taskSourceName) && orderNo.equals(taskSourceName)) {
log.info("关闭工单[" + orderNo + "]失败,有未完成的出库任务:"+task.getPosName());
return "smfcode.order.close.taskNotEnd";
}
}
}
//绑定料需要解绑
storagePosManager.clearLockPos(liteOrder.getOrderNo());
log.info("关闭工单[" + orderNo + "]成功");
liteOrder.setClosed(true);
liteOrderManager.save(liteOrder);
return "smfcode.order.close.success";
}
} }
package com.neotel.smfcore.core.order.rest; package com.neotel.smfcore.core.order.rest;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.db.sql.Order; import cn.hutool.db.sql.Order;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.neotel.smfcore.common.annotation.QueryCondition; import com.neotel.smfcore.common.annotation.QueryCondition;
...@@ -33,6 +34,7 @@ import com.neotel.smfcore.security.service.po.Role; ...@@ -33,6 +34,7 @@ import com.neotel.smfcore.security.service.po.Role;
import com.neotel.smfcore.security.service.po.User; import com.neotel.smfcore.security.service.po.User;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import javafx.concurrent.Task;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.logging.log4j.util.Strings; import org.apache.logging.log4j.util.Strings;
...@@ -152,18 +154,56 @@ public class OrderController { ...@@ -152,18 +154,56 @@ public class OrderController {
@ApiOperation("工单出库") @ApiOperation("工单出库")
@PostMapping(value = "/out") @PostMapping(value = "/out")
@PreAuthorize("@el.check('workOrder')") @PreAuthorize("@el.check('workOrder')")
public ResultBean delete(@RequestBody Map<String, String> mapValues) { public ResultBean checkOut(@RequestBody Map<String, String> mapValues) {
String orderNo = mapValues.get("orderNo"); String orderNo = mapValues.get("orderNo");
if (orderNo == null) { if (orderNo == null) {
// throw new ValidateException("工单号不能为空");
throw new ValidateException("smfcode.valueCanotNull", "{0}不能为空", new String[]{"orderNo"}); throw new ValidateException("smfcode.valueCanotNull", "{0}不能为空", new String[]{"orderNo"});
} }
LiteOrder liteOrder = liteOrderManager.findByOrderNo(orderNo); LiteOrder liteOrder = liteOrderManager.findByOrderNo(orderNo);
if (liteOrder == null) { if (liteOrder == null) {
throw new ValidateException("smfcode.valueNotFind", "未找到{0}[{1}]", new String[]{"orderNo", orderNo}); throw new ValidateException("smfcode.valueNotFind", "未找到{0}[{1}]", new String[]{"orderNo", orderNo});
} }
// ResultBean resultBean = liteOrderCache.checkOutOrder(liteOrder); String result= liteOrderCache.checkOutLiteOrder(liteOrder.getOrderNo(),false);
return liteOrderCache.checkOutOrder(liteOrder); if(ObjectUtil.isEmpty(result)){
return ResultBean.newOkResult(result);
}else{
return ResultBean.newErrorResult(-1,result,result);
}
}
@ApiOperation("套料出库")
@PostMapping(value = "/outBom")
@PreAuthorize("@el.check('workOrder')")
public ResultBean outBom(@RequestBody Map<String, String> mapValues) {
String orderNo = mapValues.get("orderNo");
if (orderNo == null) {
throw new ValidateException("smfcode.valueCanotNull", "{0}不能为空", new String[]{"orderNo"});
}
String result= liteOrderCache.checkOutLiteOrder(orderNo,true);
if(ObjectUtil.isEmpty(result)){
return ResultBean.newOkResult(result);
}else{
return ResultBean.newErrorResult(-1,result,result);
}
}
@ApiOperation("尾料出库")
@PostMapping(value = "/outTails")
@PreAuthorize("@el.check('workOrder')")
public ResultBean outTails(@RequestBody Map<String, String> mapValues) {
String orderNo = mapValues.get("orderNo");
if (orderNo == null) {
throw new ValidateException("smfcode.valueCanotNull", "{0}不能为空", new String[]{"orderNo"});
}
String result= liteOrderCache.checkOutLiteOrder(orderNo,false);
if(ObjectUtil.isEmpty(result)){
return ResultBean.newOkResult(result);
}else{
return ResultBean.newErrorResult(-1,result,result);
}
} }
@ApiOperation("查询工单") @ApiOperation("查询工单")
...@@ -298,4 +338,48 @@ public class OrderController { ...@@ -298,4 +338,48 @@ public class OrderController {
throw new ValidateException("smfcode.valueCanotNull", "{0}不能为空", new String[]{"orderNo"}); throw new ValidateException("smfcode.valueCanotNull", "{0}不能为空", new String[]{"orderNo"});
} }
@ApiOperation("修改工单数量")
@PostMapping(value = "/updateNum")
@PreAuthorize("@el.check('workOrder')")
public ResultBean updateNum(@RequestBody OrderDto param) {
String orderNo = param.getOrderNo();
float orderTimes= param.getOrderTimes();
if (orderNo == null) {
// throw new ValidateException("工单号不能为空");
throw new ValidateException("smfcode.valueCanotNull", "{0}不能为空", new String[]{"orderNo"});
}
LiteOrder liteOrder = liteOrderManager.findByOrderNo(orderNo);
if (liteOrder == null) {
throw new ValidateException("smfcode.valueNotFind", "未找到{0}[{1}]", new String[]{"orderNo", orderNo});
}
if(!liteOrder.isNew()){
throw new ValidateException("smfcode.cannotUpdateOrderNum", "工单已出库,不能修改数量" );
}
if(orderTimes<1){
orderTimes=1;
}
liteOrder.setOrderTimes(orderTimes);
liteOrderManager.save(liteOrder );
return ResultBean.newOkResult(orderMapper.toDto(liteOrder) );
}
@ApiOperation("关闭工单")
@PostMapping(value = "/closeOrder")
@PreAuthorize("@el.check('workOrder')")
public ResultBean closeOrder(@RequestBody Map<String, String> mapValues) {
String orderNo = mapValues.get("orderNo");
if (orderNo == null) {
throw new ValidateException("smfcode.valueCanotNull", "{0}不能为空", new String[]{"orderNo"});
}
String result=liteOrderCache.closeOrder(orderNo);
if(ObjectUtil.isEmpty(result)){
return ResultBean.newOkResult(result);
}else{
return ResultBean.newErrorResult(-1,result,result);
}
}
} }
...@@ -33,6 +33,11 @@ public class OrderDto implements Serializable { ...@@ -33,6 +33,11 @@ public class OrderDto implements Serializable {
@ApiModelProperty("当前任务已完成盘数") @ApiModelProperty("当前任务已完成盘数")
private int finishedReelCount = 0; private int finishedReelCount = 0;
@ApiModelProperty("累计任务盘数")
private int totalTaskReelCount = 0;
@ApiModelProperty("累计任务已完成盘数")
private int totalFinishedReelCount = 0;
/** /**
* 订单状态 * 订单状态
* 0=新建工单 * 0=新建工单
...@@ -52,28 +57,18 @@ public class OrderDto implements Serializable { ...@@ -52,28 +57,18 @@ public class OrderDto implements Serializable {
@ApiModelProperty("出库状态, 2表示已完成") @ApiModelProperty("出库状态, 2表示已完成")
private boolean closed = false; private boolean closed = false;
/**
* 工单来源
*/
@ApiModelProperty("工单来源") @ApiModelProperty("工单来源")
private String source = ""; private String source = "";
/**
* 任务完成时间(用于关闭页面显示)
*/
@ApiModelProperty("任务完成时间(用于关闭页面显示)") @ApiModelProperty("任务完成时间(用于关闭页面显示)")
@Transient @Transient
private long taskFinishedTime = -1; private long taskFinishedTime = -1;
/**
* 套(倍)数
*/
@ApiModelProperty("套(倍)数") @ApiModelProperty("套(倍)数")
private float orderTimes = 1f; private float orderTimes = 1f;
/**
* 订单的详细信息
*/
@Transient @Transient
@ApiModelProperty("订单的详细信息") @ApiModelProperty("订单的详细信息")
private List<OrderItemDto> orderItems; private List<OrderItemDto> orderItems;
......
...@@ -25,10 +25,14 @@ public class LiteOrder extends BasePo implements Serializable { ...@@ -25,10 +25,14 @@ public class LiteOrder extends BasePo implements Serializable {
} }
/** /**
* 单号 * 需求单号
*/ */
private String orderNo; private String orderNo;
/** /**
* 工单号
*/
private String so;
/**
* 当前任务盘数 * 当前任务盘数
*/ */
private int taskReelCount = 0; private int taskReelCount = 0;
...@@ -39,6 +43,16 @@ public class LiteOrder extends BasePo implements Serializable { ...@@ -39,6 +43,16 @@ public class LiteOrder extends BasePo implements Serializable {
private int finishedReelCount = 0; private int finishedReelCount = 0;
/** /**
* 累计任务盘数
*/
private int totalTaskReelCount = 0;
/**
* 累计任务已完成盘数
*/
private int totalFinishedReelCount = 0;
/**
* 订单状态 * 订单状态
*/ */
private int status = LITEORDER_STATUS.NEW; private int status = LITEORDER_STATUS.NEW;
...@@ -48,13 +62,6 @@ public class LiteOrder extends BasePo implements Serializable { ...@@ -48,13 +62,6 @@ public class LiteOrder extends BasePo implements Serializable {
*/ */
private boolean closed = false; private boolean closed = false;
public void setClosed(boolean value){
this.closed=value;
if(value){
setStatus(LITEORDER_STATUS.CLOSED);
}
}
/** /**
* 工单来源 * 工单来源
...@@ -62,6 +69,11 @@ public class LiteOrder extends BasePo implements Serializable { ...@@ -62,6 +69,11 @@ public class LiteOrder extends BasePo implements Serializable {
private String source = ""; private String source = "";
/** /**
* 线别,AGV运送时使用此值做为目的地
*/
private String line = "";
/**
* 任务完成时间(用于关闭页面显示) * 任务完成时间(用于关闭页面显示)
*/ */
@Transient @Transient
...@@ -88,6 +100,13 @@ public class LiteOrder extends BasePo implements Serializable { ...@@ -88,6 +100,13 @@ public class LiteOrder extends BasePo implements Serializable {
*/ */
private Date sdate=new Date(); private Date sdate=new Date();
public void setClosed(boolean value){
this.closed=value;
if(value){
setStatus(LITEORDER_STATUS.CLOSED);
}
}
/** /**
* 结束当前的任务 * 结束当前的任务
*/ */
...@@ -150,6 +169,13 @@ public class LiteOrder extends BasePo implements Serializable { ...@@ -150,6 +169,13 @@ public class LiteOrder extends BasePo implements Serializable {
this.taskReelCount = taskReelCount; this.taskReelCount = taskReelCount;
} }
public void setTotalTaskReelCount(int totalReelCount){
if(totalReelCount<0){
totalReelCount=0;
}
this.totalTaskReelCount=totalReelCount;
}
/** /**
* 是否需要展示(已完成的,过20 秒自动清除) * 是否需要展示(已完成的,过20 秒自动清除)
......
...@@ -20,24 +20,44 @@ public class LiteOrderItem extends BasePo implements Serializable { ...@@ -20,24 +20,44 @@ public class LiteOrderItem extends BasePo implements Serializable {
private String ri; private String ri;
//需求数量 /**
* 总需求数量
*/
private int needNum = 0; private int needNum = 0;
/** /**
* 需求料盘数 * 需求料盘数
*/ */
private int needReelCount = 0; private int needReelCount = 0;
//已出数量 /**
* 当前任务已出数量
*/
private int outNum = 0; private int outNum = 0;
//已出盘数 /**
* 当前任务已出盘数
*/
private int outReelCount = 0; private int outReelCount = 0;
/** /**
* 累计已出数量
*/
private int totalOutNum = 0;
/**
* 累计已出盘数
*/
private int totalOutReelCount = 0;
/**
* 订单信息 * 订单信息
*/ */
private String orderNo = ""; private String orderNo = "";
/**
* 站位编号
*/
private String slotNum="";
/** /**
* 站位信息 * 站位信息
......
...@@ -2,6 +2,7 @@ package com.neotel.smfcore.core.storage.rest.query; ...@@ -2,6 +2,7 @@ package com.neotel.smfcore.core.storage.rest.query;
import com.neotel.smfcore.common.annotation.QueryCondition; import com.neotel.smfcore.common.annotation.QueryCondition;
import com.neotel.smfcore.common.bean.BetweenData; import com.neotel.smfcore.common.bean.BetweenData;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat; import org.springframework.format.annotation.DateTimeFormat;
...@@ -27,4 +28,8 @@ public class StoragePosQueryCriteria { ...@@ -27,4 +28,8 @@ public class StoragePosQueryCriteria {
@QueryCondition(type = QueryCondition.Type.IN, propName = "storageId") @QueryCondition(type = QueryCondition.Type.IN, propName = "storageId")
private List<String> storageIdList; private List<String> storageIdList;
@ApiModelProperty("是否启用")
@QueryCondition
private Boolean enabled;
} }
...@@ -17,8 +17,10 @@ import java.util.Set; ...@@ -17,8 +17,10 @@ import java.util.Set;
public interface IStoragePosManager extends IBaseManager<StoragePos> { public interface IStoragePosManager extends IBaseManager<StoragePos> {
List<PlateSizeBean> getStoragePosUsage(String storageId); List<PlateSizeBean> getStoragePosUsage(String storageId);
StoragePos getByPosName(String posName); StoragePos getByPosName(String posName);
Map<String,InventoryItem> getInventory(String id);
Map<String, InventoryItem> getInventory(String id);
StoragePos getByBarcode(String barcode); StoragePos getByBarcode(String barcode);
...@@ -32,7 +34,7 @@ public interface IStoragePosManager extends IBaseManager<StoragePos> { ...@@ -32,7 +34,7 @@ public interface IStoragePosManager extends IBaseManager<StoragePos> {
void deletePoss(Set<String> ids); void deletePoss(Set<String> ids);
StoragePos getEmptyPosByStorage(Storage storage, Barcode barcode, Collection<String> excludePosIds) throws ValidateException ; StoragePos getEmptyPosByStorage(Storage storage, Barcode barcode, Collection<String> excludePosIds) throws ValidateException;
StoragePos getEmptyPosByStorage(Storage storage, Barcode barcode, Collection<String> excludePosIds, String lastPosId) throws ValidateException; StoragePos getEmptyPosByStorage(Storage storage, Barcode barcode, Collection<String> excludePosIds, String lastPosId) throws ValidateException;
...@@ -48,5 +50,7 @@ public interface IStoragePosManager extends IBaseManager<StoragePos> { ...@@ -48,5 +50,7 @@ public interface IStoragePosManager extends IBaseManager<StoragePos> {
void clearStoragePosLabel(String id); void clearStoragePosLabel(String id);
void updatePosLabel( String[] posIds, String labelId); void updatePosLabel(String[] posIds, String labelId);
void clearLockPos(String lockId);
} }
...@@ -217,8 +217,13 @@ public class StoragePosManagerImpl implements IStoragePosManager { ...@@ -217,8 +217,13 @@ public class StoragePosManagerImpl implements IStoragePosManager {
Query q = new Query(c); Query q = new Query(c);
Sort sort = getSortByCheckOutType(checkOutType); Sort sort = getSortByCheckOutType(checkOutType);
q.with(sort); q.with(sort);
log.info("使用"+checkOutType+"策略出库partNumber="+pn); StoragePos pos=storagePosDao.findOne(q);
return storagePosDao.findOne(q); if(pos==null){
log.info("使用"+checkOutType+" 策略出库 partNumber="+pn+",未找到可以出库的物料 ");
}else{
log.info("使用"+checkOutType+" 策略出库 partNumber="+pn+",找到出仓位置【"+ pos.getPosName()+"】,RI【"+pos.getBarcode().getBarcode()+"】 ");
}
return pos;
} }
...@@ -388,4 +393,10 @@ public class StoragePosManagerImpl implements IStoragePosManager { ...@@ -388,4 +393,10 @@ public class StoragePosManagerImpl implements IStoragePosManager {
storagePosDao.updateMulti(query, Update.update("labelId",labelId)); storagePosDao.updateMulti(query, Update.update("labelId",labelId));
} }
@Override
public void clearLockPos(String lockId) {
Query query = new Query( Criteria.where("barcode.lockId").is(lockId));
storagePosDao.updateMulti(query, Update.update("barcode.lockId",""));
}
} }
...@@ -90,7 +90,6 @@ public class UserController { ...@@ -90,7 +90,6 @@ public class UserController {
@ApiOperation("查询用户") @ApiOperation("查询用户")
@GetMapping @GetMapping
@PreAuthorize("@el.check('user:list')") @PreAuthorize("@el.check('user:list')")
// public ResponseEntity<Object> query(UserQueryCriteria criteria, Pageable pageable){
public PageData<UserDto> query(UserQueryCriteria criteria, Pageable pageable) { public PageData<UserDto> query(UserQueryCriteria criteria, Pageable pageable) {
Query query = QueryHelp.getQuery(criteria); Query query = QueryHelp.getQuery(criteria);
PageData<User> userPageData = userManager.findByPage(query, pageable); PageData<User> userPageData = userManager.findByPage(query, pageable);
...@@ -127,7 +126,7 @@ public class UserController { ...@@ -127,7 +126,7 @@ public class UserController {
if(resources.getCheckCode()==null){ if(resources.getCheckCode()==null){
resources.setCheckCode(""); resources.setCheckCode("");
} }
resources.setPassword(passwordEncoder.encode("123456")); resources.setPassword(passwordEncoder.encode("Constants.USER_DEFAULTP_PWD"));
resources.setUpdateDate(new Date()); resources.setUpdateDate(new Date());
resources.setPwdResetTime(new Date()); resources.setPwdResetTime(new Date());
userManager.save(resources); userManager.save(resources);
...@@ -137,20 +136,16 @@ public class UserController { ...@@ -137,20 +136,16 @@ public class UserController {
@ApiOperation("修改用户") @ApiOperation("修改用户")
@PutMapping @PutMapping
@PreAuthorize("@el.check('user:edit')") @PreAuthorize("@el.check('user:edit')")
// public ResponseEntity<Object> update(@Validated(User.Update.class) @RequestBody User resources) throws Exception {
public ResponseEntity<Object> update(@Validated @RequestBody UserDto userDto) { public ResponseEntity<Object> update(@Validated @RequestBody UserDto userDto) {
User resources=userMapper.toEntity(userDto); User resources=userMapper.toEntity(userDto);
if (resources.getId() == null) { if (resources.getId() == null) {
throw new ValidateException("smfcode.valueCanotNull","{0}不能为空",new String[]{"ID"} ); throw new ValidateException("smfcode.valueCanotNull","{0}不能为空",new String[]{"ID"} );
// throw new ValidateException("修改用户:ID不能为空");
} }
if(resources.getUsername()==null){ if(resources.getUsername()==null){
throw new ValidateException("smfcode.valueCanotNull","{0}不能为空",new String[]{"username"} ); throw new ValidateException("smfcode.valueCanotNull","{0}不能为空",new String[]{"username"} );
// throw new ValidateException("修改用户:用户名不能为空");
} }
if(resources.getRoleId()==null){ if(resources.getRoleId()==null){
throw new ValidateException("smfcode.valueCanotNull","{0}不能为空",new String[]{"roleId"} ); throw new ValidateException("smfcode.valueCanotNull","{0}不能为空",new String[]{"roleId"} );
// throw new ValidateException("修改用户:角色ID不能为空");
} }
userManager.update(resources); userManager.update(resources);
...@@ -158,19 +153,53 @@ public class UserController { ...@@ -158,19 +153,53 @@ public class UserController {
return new ResponseEntity<>(HttpStatus.NO_CONTENT); return new ResponseEntity<>(HttpStatus.NO_CONTENT);
} }
@ApiOperation("修改用户:个人中心") @ApiOperation("重置密码")
@PutMapping(value = "center") @PutMapping(value = "/resetPass")
// public ResponseEntity<Object> center(@Validated(User.Update.class) @RequestBody User resources){ @PreAuthorize("@el.check('user:edit')")
public ResponseEntity<Object> center(@Validated @RequestBody UserDto userDto) { public ResultBean resetPass(@Validated @RequestBody UserDto userDto) {
if (userDto.getId() == null) {
throw new ValidateException("smfcode.valueCanotNull","{0}不能为空",new String[]{"ID"} );
}
User resources=userManager.get(userDto.getId());
resources.setPassword(passwordEncoder.encode(Constants.USER_DEFAULTP_PWD));
userManager.update(resources);
return ResultBean.newOkResult("");
}
@ApiOperation("个人中心:获取个人资料")
@GetMapping(value = "/center")
public UserDto getCenter() {
User user = userManager.get(SecurityUtils.getCurrentUserId());
return userMapper.toDto(user);
}
@ApiOperation("个人中心:修改个人资料")
@PutMapping(value = "/center")
public ResultBean center(@Validated @RequestBody UserDto userDto) {
User resources=userMapper.toEntity(userDto); User resources=userMapper.toEntity(userDto);
if (!resources.getId().equals(SecurityUtils.getCurrentUserId())) { if (!resources.getId().equals(SecurityUtils.getCurrentUserId())) {
throw new ValidateException("smfcode.hasNoAccess","无权限修改此用户信息" ); throw new ValidateException("smfcode.hasNoAccess","无权限修改此用户信息" );
// throw new ValidateException("不能修改他人资料"); // throw new ValidateException("不能修改他人资料");
} }
userManager.updateCenter(resources); userManager.updateCenter(resources);
return new ResponseEntity<>(HttpStatus.NO_CONTENT); return ResultBean.newOkResult("");
} }
@ApiOperation("个人中心:修改密码")
@PostMapping(value = "/updatePass")
public ResultBean updatePass(@RequestBody UserPassVo passVo) throws Exception {
User user = userManager.get(SecurityUtils.getCurrentUserId());
String oldPass = RsaUtils.decryptByPrivateKey(RsaProperties.privateKey, passVo.getOldPass());
String newPass = RsaUtils.decryptByPrivateKey(RsaProperties.privateKey, passVo.getNewPass());
if (!passwordEncoder.matches(oldPass, user.getPassword())) {
throw new ValidateException("smfcode.oldPwdError","修改失败,旧密码错误");
}
if (passwordEncoder.matches(newPass, user.getPassword())) {
throw new ValidateException("smfcode.newPwdError","新密码不能与旧密码相同");
}
userManager.updatePass(user.getUsername(), passwordEncoder.encode(newPass));
return ResultBean.newOkResult("");
}
@ApiOperation("删除用户") @ApiOperation("删除用户")
@DeleteMapping @DeleteMapping
...@@ -194,35 +223,21 @@ public class UserController { ...@@ -194,35 +223,21 @@ public class UserController {
return new ResponseEntity<>(HttpStatus.OK); return new ResponseEntity<>(HttpStatus.OK);
} }
@ApiOperation("修改密码")
@PostMapping(value = "/updatePass")
public ResponseEntity<Object> updatePass(@RequestBody UserPassVo passVo) throws Exception {
User user = userManager.get(SecurityUtils.getCurrentUserId());
if (!passwordEncoder.matches(passVo.getOldPass(), user.getPassword())) {
throw new ValidateException("smfcode.oldPwdError","修改失败,旧密码错误");
}
if (passwordEncoder.matches(passVo.getNewPass(), user.getPassword())) {
throw new ValidateException("smfcode.newPwdError","新密码不能与旧密码相同");
}
userManager.updatePass(user.getUsername(), passwordEncoder.encode(passVo.getNewPass()));
return new ResponseEntity<>(HttpStatus.OK);
}
@ApiOperation("修改邮箱") // @ApiOperation("修改邮箱")
@PostMapping(value = "/updateEmail/{code}") // @PostMapping(value = "/updateEmail/{code}")
public ResponseEntity<Object> updateEmail(@PathVariable String code, @RequestBody UserDto userDto) throws Exception { // public ResponseEntity<Object> updateEmail(@PathVariable String code, @RequestBody UserDto userDto) throws Exception {
User user=userMapper.toEntity(userDto); // User user=userMapper.toEntity(userDto);
String password = RsaUtils.decryptByPrivateKey(RsaProperties.privateKey, user.getPassword()); // String password = RsaUtils.decryptByPrivateKey(RsaProperties.privateKey, user.getPassword());
User myUser = userManager.findByUserName(SecurityUtils.getCurrentUsername()); // User myUser = userManager.findByUserName(SecurityUtils.getCurrentUsername());
if (!passwordEncoder.matches(password, myUser.getPassword())) { // if (!passwordEncoder.matches(password, myUser.getPassword())) {
throw new ValidateException("smfcode.pwdError","修改邮箱失败,密码错误"); // throw new ValidateException("smfcode.pwdError","修改邮箱失败,密码错误");
} // }
// verificationCodeService.validated(CodeEnum.EMAIL_RESET_EMAIL_CODE.getKey() + user.getEmail(), code); //// verificationCodeService.validated(CodeEnum.EMAIL_RESET_EMAIL_CODE.getKey() + user.getEmail(), code);
userManager.updateEmail(myUser.getUsername(), myUser.getEmail()); // userManager.updateEmail(myUser.getUsername(), myUser.getEmail());
return new ResponseEntity<>(HttpStatus.OK); // return new ResponseEntity<>(HttpStatus.OK);
} // }
@ApiOperation("修改用户组") @ApiOperation("修改用户组")
@PutMapping(value = "/updateGroup") @PutMapping(value = "/updateGroup")
@PreAuthorize("@el.check('user:edit')") @PreAuthorize("@el.check('user:edit')")
...@@ -236,6 +251,8 @@ public class UserController { ...@@ -236,6 +251,8 @@ public class UserController {
userManager.updateGroups(resources); userManager.updateGroups(resources);
return new ResponseEntity<>(HttpStatus.OK); return new ResponseEntity<>(HttpStatus.OK);
} }
@ApiOperation("上传用户列表:激活用户") @ApiOperation("上传用户列表:激活用户")
@PostMapping(value = "/upload") @PostMapping(value = "/upload")
public ResultBean upload( @RequestParam MultipartFile uploadFile) throws Exception { public ResultBean upload( @RequestParam MultipartFile uploadFile) throws Exception {
......
...@@ -109,10 +109,11 @@ public class UserManagerImpl implements IUserManager { ...@@ -109,10 +109,11 @@ public class UserManagerImpl implements IUserManager {
public void updateCenter(User resources) { public void updateCenter(User resources) {
User dataUser=this.get(resources.getId()); User dataUser=this.get(resources.getId());
if(dataUser!=null){ if(dataUser!=null){
//用户名admin不能修改 // //用户名admin不能修改
if(!dataUser.equals(Constants.SUPER_USERNAME)){ // if(!dataUser.equals(Constants.SUPER_USERNAME)){
dataUser.setUsername(resources.getUsername()); // dataUser.setUsername(resources.getUsername());
} // }
//只能修改邮箱和语言
dataUser.setEmail(resources.getEmail()); dataUser.setEmail(resources.getEmail());
dataUser.setLanguage(resources.getLanguage()); dataUser.setLanguage(resources.getLanguage());
......
...@@ -93,6 +93,13 @@ smfcore.instruction=\u8BF4\u660E\u4E66 ...@@ -93,6 +93,13 @@ smfcore.instruction=\u8BF4\u660E\u4E66
smfcore.about=\u5173\u4E8E smfcore.about=\u5173\u4E8E
smfcore.tacticsOuput=\u7B56\u7565\u51FA\u5E93 smfcore.tacticsOuput=\u7B56\u7565\u51FA\u5E93
smfcore.labelOuput=\u7269\u6599\u5206\u7EC4 smfcore.labelOuput=\u7269\u6599\u5206\u7EC4
smfcode.order.out.executing=\u5DE5\u5355\u6B63\u5728\u6267\u884C
smfcode.order.out.notFound=\u5DE5\u5355\u672A\u627E\u5230
smfcode.order.out.maxOrder=\u5DF2\u8FBE\u5230\u6700\u5927\u53EF\u6267\u884C\u5DE5\u5355\u6570
smfcode.order.out.noTask=\u5DE5\u5355\u65E0\u53EF\u6267\u884C\u7684\u4EFB\u52A1
smfcode.cannotUpdateOrderNum=\u5DE5\u5355\u5DF2\u51FA\u5E93\uFF0C\u4E0D\u80FD\u4FEE\u6539\u6570\u91CF
smfcode.order.close.success=\u5DE5\u5355\u5173\u95ED\u6210\u529F
smfcode.order.close.taskNotEnd=\u5DE5\u5355\u8FD8\u6709\u672A\u5B8C\u6210\u7684\u4EFB\u52A1
......
...@@ -92,4 +92,11 @@ smfcore.help=Help ...@@ -92,4 +92,11 @@ smfcore.help=Help
smfcore.instruction=Instruction manual smfcore.instruction=Instruction manual
smfcore.about=About smfcore.about=About
smfcore.tacticsOuput=Strategies Retrival smfcore.tacticsOuput=Strategies Retrival
smfcore.labelOuput=Material grouping
\ No newline at end of file \ No newline at end of file
smfcore.labelOuput=Material grouping
smfcode.order.out.executing=Work orders are being executed
smfcode.order.out.notFound=Work order not found
smfcode.order.out.maxOrder=The maximum number of executable work orders has been reached
smfcode.order.out.noTask=Work order No executable tasks
smfcode.cannotUpdateOrderNum=The work order has been issued and the quantity cannot be modified
smfcode.order.close.success=Work order closed successfully
smfcode.order.close.taskNotEnd=Work orders with outstanding tasks
\ No newline at end of file \ No newline at end of file
...@@ -92,4 +92,11 @@ smfcore.help=\u30D8\u30EB\u30D7 ...@@ -92,4 +92,11 @@ smfcore.help=\u30D8\u30EB\u30D7
smfcore.instruction=\u53D6\u6271\u8AAC\u660E\u66F8 smfcore.instruction=\u53D6\u6271\u8AAC\u660E\u66F8
smfcore.about=\u306B\u3064\u3044\u3066 smfcore.about=\u306B\u3064\u3044\u3066
smfcore.tacticsOuput=\u30B9\u30C8\u30E9\u30C6\u30B8\u30FC\u306F\u5728\u5EAB\u5207\u308C\u3067\u3059 smfcore.tacticsOuput=\u30B9\u30C8\u30E9\u30C6\u30B8\u30FC\u306F\u5728\u5EAB\u5207\u308C\u3067\u3059
smfcore.labelOuput=\u6750\u6599\u306E\u30B0\u30EB\u30FC\u30D7\u5316
\ No newline at end of file \ No newline at end of file
smfcore.labelOuput=\u6750\u6599\u306E\u30B0\u30EB\u30FC\u30D7\u5316
smfcode.order.out.executing=\u4F5C\u696D\u6307\u793A\u304C\u5B9F\u884C\u3055\u308C\u3066\u3044\u308B
smfcode.order.out.notFound=\u4F5C\u696D\u6307\u793A\u66F8\u304C\u898B\u3064\u304B\u3089\u306A\u3044
smfcode.order.out.maxOrder=\u5B9F\u884C\u53EF\u80FD\u306A\u30EF\u30FC\u30AF\u30AA\u30FC\u30C0\u30FC\u306E\u6700\u5927\u6570\u306B\u9054\u3057\u3066\u3044\u308B
smfcode.order.out.noTask=\u4F5C\u696D\u6307\u793A\u304C\u5B9F\u884C\u3067\u304D\u306A\u3044\u30BF\u30B9\u30AF
smfcode.cannotUpdateOrderNum=\u30EF\u30FC\u30AF\u30AA\u30FC\u30C0\u30FC\u304C\u5728\u5EAB\u5207\u308C\u3067\u6570\u91CF\u304C\u5909\u66F4\u3067\u304D\u306A\u3044
smfcode.order.close.success=\u30EF\u30FC\u30AF\u30AA\u30FC\u30C0\u30FC\u304C\u6B63\u5E38\u306B\u7D42\u4E86\u3057\u307E\u3057\u305F\u3002
smfcode.order.close.taskNotEnd=\u672A\u51E6\u7406\u306E\u30BF\u30B9\u30AF\u304C\u3042\u308B\u30EF\u30FC\u30AF\u30AA\u30FC\u30C0\u30FC
\ No newline at end of file \ No newline at end of file
...@@ -92,4 +92,11 @@ smfcore.help=\u5E2E\u52A9 ...@@ -92,4 +92,11 @@ smfcore.help=\u5E2E\u52A9
smfcore.instruction=\u8BF4\u660E\u4E66 smfcore.instruction=\u8BF4\u660E\u4E66
smfcore.about=\u5173\u4E8E smfcore.about=\u5173\u4E8E
smfcore.tacticsOuput=\u7B56\u7565\u51FA\u5E93 smfcore.tacticsOuput=\u7B56\u7565\u51FA\u5E93
smfcore.labelOuput=\u7269\u6599\u5206\u7EC4
\ No newline at end of file \ No newline at end of file
smfcore.labelOuput=\u7269\u6599\u5206\u7EC4
smfcode.order.out.executing=\u5DE5\u5355\u6B63\u5728\u6267\u884C
smfcode.order.out.notFound=\u5DE5\u5355\u672A\u627E\u5230
smfcode.order.out.maxOrder=\u5DF2\u8FBE\u6700\u5927\u53EF\u6267\u884C\u5DE5\u5355\u6570
smfcode.order.out.noTask=\u5DE5\u5355\u65E0\u53EF\u6267\u884C\u7684\u4EFB\u52A1
smfcode.cannotUpdateOrderNum=\u5DE5\u5355\u5DF2\u51FA\u5E93\uFF0C\u4E0D\u80FD\u4FEE\u6539\u6570\u91CF
smfcode.order.close.success=\u5DE5\u5355\u5173\u95ED\u6210\u529F
smfcode.order.close.taskNotEnd=\u5DE5\u5355\u8FD8\u6709\u672A\u5B8C\u6210\u7684\u4EFB\u52A1
\ No newline at end of file \ No newline at end of file
...@@ -92,4 +92,11 @@ smfcore.help=\u5E6B\u52A9 ...@@ -92,4 +92,11 @@ smfcore.help=\u5E6B\u52A9
smfcore.instruction=\u8AAA\u660E\u66F8 smfcore.instruction=\u8AAA\u660E\u66F8
smfcore.about=\u95DC\u65BC smfcore.about=\u95DC\u65BC
smfcore.tacticsOuput=\u7B56\u7565\u51FA\u5EAB smfcore.tacticsOuput=\u7B56\u7565\u51FA\u5EAB
smfcore.labelOuput=\u7269\u6599\u5206\u7D44
\ No newline at end of file \ No newline at end of file
smfcore.labelOuput=\u7269\u6599\u5206\u7D44
smfcode.order.out.executing=\u5DE5\u55AE\u6B63\u5728\u57F7\u884C
smfcode.order.out.notFound=\u5DE5\u55AE\u672A\u627E\u5230
smfcode.order.out.maxOrder=\u5DF2\u9054\u5230\u6700\u5927\u53EF\u57F7\u884C\u5DE5\u55AE\u6578
smfcode.order.out.noTask=\u5DE5\u55AE\u7121\u53EF\u57F7\u884C\u7684\u4EFB\u52D9
smfcode.cannotUpdateOrderNum=\u5DE5\u55AE\u5DF2\u51FA\u5EAB\uFF0C\u4E0D\u80FD\u4FEE\u6539\u6578\u91CF
smfcode.order.close.success=\u5DE5\u55AE\u95DC\u9589\u6210\u529F
smfcode.order.close.taskNotEnd=\u5DE5\u55AE\u9084\u6709\u672A\u5B8C\u6210\u7684\u4EFB\u52D9
\ No newline at end of file \ No newline at end of file
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!