Commit fbed650f LN

转储出库界面增加搜索功能。

增加齐套代码。
1 个父辈 d878bfe6
...@@ -7,6 +7,7 @@ import com.neotel.smfcore.core.message.enums.MessageType; ...@@ -7,6 +7,7 @@ import com.neotel.smfcore.core.message.enums.MessageType;
import com.neotel.smfcore.core.message.service.manager.IMessageManager; import com.neotel.smfcore.core.message.service.manager.IMessageManager;
import com.neotel.smfcore.core.message.service.po.Message; import com.neotel.smfcore.core.message.service.po.Message;
import com.neotel.smfcore.core.message.util.DeviceMessageUtil; import com.neotel.smfcore.core.message.util.DeviceMessageUtil;
import com.neotel.smfcore.core.order.OrderPnCache;
import com.neotel.smfcore.core.order.util.OrderFileWatch; import com.neotel.smfcore.core.order.util.OrderFileWatch;
import com.neotel.smfcore.core.outList.util.OutListCache; import com.neotel.smfcore.core.outList.util.OutListCache;
import com.neotel.smfcore.hikvision.bean.api.ResponseParam; import com.neotel.smfcore.hikvision.bean.api.ResponseParam;
...@@ -56,6 +57,9 @@ public class DataInitManager { ...@@ -56,6 +57,9 @@ public class DataInitManager {
private OutListCache outListCache; private OutListCache outListCache;
@Autowired @Autowired
private IMessageManager messageManager; private IMessageManager messageManager;
@Autowired
private OrderPnCache orderPnCache;
/** /**
* 当前版本 * 当前版本
*/ */
...@@ -121,6 +125,8 @@ public class DataInitManager { ...@@ -121,6 +125,8 @@ public class DataInitManager {
outListCache.loadMap(); outListCache.loadMap();
orderPnCache.init();
Message message=Message.newMsg(MessageType.INFO ,"server", "", "", "smfcore.messages.serverStart","服务器启动",null); Message message=Message.newMsg(MessageType.INFO ,"server", "", "", "smfcore.messages.serverStart","服务器启动",null);
messageManager.save(message); messageManager.save(message);
} catch (Exception exception) { } catch (Exception exception) {
......
...@@ -175,7 +175,48 @@ public class DateUtil { ...@@ -175,7 +175,48 @@ public class DateUtil {
return date0.after(date1)? date0 : date1; return date0.after(date1)? date0 : date1;
} }
public static boolean isBelong(String beginStr,String endStr){
SimpleDateFormat df = new SimpleDateFormat("HH:mm");//设置日期格式
Date now =null;
Date beginTime = null;
Date endTime = null;
try {
now = df.parse(df.format(new Date()));
beginTime = df.parse(beginStr);
endTime = df.parse(endStr);
} catch (Exception e) {
e.printStackTrace();
}
Boolean flag = belongCalendar(now, beginTime, endTime);
return flag;
}
/**
* 判断时间是否在时间段内
* @param nowTime
* @param beginTime
* @param endTime
* @return
*/
private static boolean belongCalendar(Date nowTime, Date beginTime, Date endTime) {
Calendar date = Calendar.getInstance();
date.setTime(nowTime);
Calendar begin = Calendar.getInstance();
begin.setTime(beginTime);
Calendar end = Calendar.getInstance();
end.setTime(endTime);
if (date.after(begin) && date.before(end)) {
return true;
} else {
return false;
}
}
public static class Req{ public static class Req{
private String seq; private String seq;
......
...@@ -480,6 +480,9 @@ public class NLPShelfHandler extends BaseDeviceHandler{ ...@@ -480,6 +480,9 @@ public class NLPShelfHandler extends BaseDeviceHandler{
public ResultBean shelfStatus(HttpServletRequest request){ public ResultBean shelfStatus(HttpServletRequest request){
String cid = request.getParameter("cid"); String cid = request.getParameter("cid");
Storage storage = dataCache.getStorage(cid); Storage storage = dataCache.getStorage(cid);
if(storage == null){
return ResultBean.newErrorResult(-1,"smfcore.shelfNotExist", "{0}对应的料架不存在",new String[]{cid} );
}
List<StoragePos> allPos = storagePosManager.findNotEmptyByStorageId(storage.getId()); List<StoragePos> allPos = storagePosManager.findNotEmptyByStorageId(storage.getId());
List<String> posList = new ArrayList<>(); List<String> posList = new ArrayList<>();
for (StoragePos pos : allPos) { for (StoragePos pos : allPos) {
......
...@@ -12,6 +12,7 @@ import com.neotel.smfcore.core.device.util.DataCache; ...@@ -12,6 +12,7 @@ import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.core.language.util.MessageUtils; import com.neotel.smfcore.core.language.util.MessageUtils;
import com.neotel.smfcore.core.order.enums.LITEORDER_STATUS; import com.neotel.smfcore.core.order.enums.LITEORDER_STATUS;
import com.neotel.smfcore.core.order.enums.ORDER_COLOR; import com.neotel.smfcore.core.order.enums.ORDER_COLOR;
import com.neotel.smfcore.core.order.rest.bean.mapstruct.OrderPnMapper;
import com.neotel.smfcore.core.order.service.manager.ILiteOrderItemManager; import com.neotel.smfcore.core.order.service.manager.ILiteOrderItemManager;
import com.neotel.smfcore.core.order.service.manager.ILiteOrderManager; import com.neotel.smfcore.core.order.service.manager.ILiteOrderManager;
import com.neotel.smfcore.core.order.service.po.LiteOrder; import com.neotel.smfcore.core.order.service.po.LiteOrder;
...@@ -53,6 +54,8 @@ public class LiteOrderCache implements ITaskListener { ...@@ -53,6 +54,8 @@ public class LiteOrderCache implements ITaskListener {
@Autowired @Autowired
private IStoragePosManager storagePosManager; private IStoragePosManager storagePosManager;
@Autowired
private OrderPnMapper orderPnMapper;
/** /**
...@@ -193,8 +196,8 @@ public class LiteOrderCache implements ITaskListener { ...@@ -193,8 +196,8 @@ public class LiteOrderCache implements ITaskListener {
if (liteOrderItem.getId().equals(orderItemId)) { if (liteOrderItem.getId().equals(orderItemId)) {
log.info("工单[" + orderNo + "]的任务" + task.getPartNumber() + "[" + task.getBarcode() + "]出库完成,已完成数量+1=" + order.getFinishedReelCount() + "/" + order.getTaskReelCount()); log.info("工单[" + orderNo + "]的任务" + task.getPartNumber() + "[" + task.getBarcode() + "]出库完成,已完成数量+1=" + order.getFinishedReelCount() + "/" + order.getTaskReelCount());
//更新对应条目的已出库数量和出库盘数 //更新对应条目的已出库数量和出库盘数
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.setTotalOutNum(liteOrderItem.getTotalOutNum() + task.getNum());
liteOrderItem.setTotalOutReelCount(liteOrderItem.getTotalOutReelCount() + 1); liteOrderItem.setTotalOutReelCount(liteOrderItem.getTotalOutReelCount() + 1);
liteOrderItem = liteOrderItemManager.save(liteOrderItem); liteOrderItem = liteOrderItemManager.save(liteOrderItem);
...@@ -630,8 +633,8 @@ public class LiteOrderCache implements ITaskListener { ...@@ -630,8 +633,8 @@ public class LiteOrderCache implements ITaskListener {
itemOutCount+=pos.getBarcode().getAmount(); itemOutCount+=pos.getBarcode().getAmount();
} }
orderItem.setTotalOutReelCount(orderItem.getTotalOutReelCount()+itemReelCount); // orderItem.setTotalOutReelCount(orderItem.getTotalOutReelCount()+itemReelCount);
orderItem.setTotalOutNum(orderItem.getTotalOutNum()+itemOutCount); // orderItem.setTotalOutNum(orderItem.getTotalOutNum()+itemOutCount);
orderItem.setOutReelCount(itemReelCount); orderItem.setOutReelCount(itemReelCount);
orderItem.setOutNum(itemOutCount); orderItem.setOutNum(itemOutCount);
liteOrderItemManager.save(orderItem); liteOrderItemManager.save(orderItem);
......
package com.neotel.smfcore.core.order;
import com.neotel.smfcore.common.utils.DateUtil;
import com.neotel.smfcore.core.barcode.service.manager.IComponentManager;
import com.neotel.smfcore.core.barcode.service.po.Component;
import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.core.order.bean.OrderPnInfo;
import com.neotel.smfcore.core.order.service.manager.ILiteOrderManager;
import com.neotel.smfcore.core.order.service.po.LiteOrder;
import com.neotel.smfcore.core.order.service.po.LiteOrderItem;
import com.neotel.smfcore.core.storage.bean.InventoryItem;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.*;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
/**
* 齐套功能
*/
@Service
@Slf4j
public class OrderPnCache {
@Autowired
private ILiteOrderManager liteOrderManager;
@Autowired
private DataCache dataCache;
@Autowired
private IComponentManager componentManager;
private Date lastUpdateDate;
private Map<String, OrderPnInfo> orderPnInfoMap=null;
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(1);
private static boolean isRunning = false;
public void init(){
if(!isRunning){
isRunning = true;
log.info("开启订单监控任务");
//10秒之后执行,每60秒(一分钟)钟执行一次
scheduledThreadPool.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
autoUpdateData();
}
}, 10, 60, TimeUnit.SECONDS);
}
}
public List<OrderPnInfo> getDataList(){
if(orderPnInfoMap==null){
return new ArrayList<>();
}
return new ArrayList<>(orderPnInfoMap.values());
}
private void autoUpdateData(){
if(orderPnInfoMap==null){
//软件重启,需要更新
reloadData();
}else{
//如果十分钟内才更新过,就不需要再更新了
long timeSpans=System.currentTimeMillis()-lastUpdateDate.getTime();
int m=(int)(timeSpans/1000/60);
if(m<10){
return;
}
//每天 8:30,20:30 自动更新
if(DateUtil.isBelong("08:30","08:36")){
reloadData();
}
if(DateUtil.isBelong("20:30","20:36")){
reloadData();
}
}
}
public synchronized void reloadData() {
log.info("开始更新齐套数据----------");
List<LiteOrder> liteOrders = liteOrderManager.findUnEndOrdersList();
orderPnInfoMap = new HashMap<>();
Map<String, Integer> needPnMap = new HashMap<>();
for (LiteOrder order :
liteOrders) {
if (order.isClosed()) {
continue;
}
for (LiteOrderItem item :
order.getOrderItems()) {
if (item.isOutFinished()) {
continue;
}
String pn = item.getMaterialNo();
int needNum = item.getQty() - item.getOutNum();
if (needNum > 0) {
Integer recordNum = needPnMap.get(pn);
if (recordNum == null) {
recordNum = needNum;
} else {
recordNum += needNum;
}
needPnMap.put(pn, recordNum);
}
}
}
//查询总库存
Map<String, InventoryItem> inventoryItemMap = dataCache.getAllInventory(new ArrayList<>(), "");
List<String> pnList = new ArrayList<>(needPnMap.keySet());
for (String pn : pnList
) {
Integer needNum = needPnMap.get(pn);
//先取库存数,判断是否缺料
InventoryItem inventoryItem = inventoryItemMap.get(pn);
if (inventoryItem == null) {
inventoryItem = new InventoryItem();
inventoryItem.setPartNumber(pn);
}
int stockCount = inventoryItem.getStockCount() - inventoryItem.getLockCount();
int lackNum = needNum - stockCount;
if (lackNum <= 0) {
continue;
}
Component component = componentManager.findOneByPN(pn);
int reelAmount = 1000;//每盘料数量
if (component != null) {
reelAmount = component.getAmount();
}
int needReel = lackNum / reelAmount;
OrderPnInfo pnInfo = new OrderPnInfo(pn, needNum, lackNum, stockCount, reelAmount, needReel, new Date());
orderPnInfoMap.put(pn, pnInfo);
}
log.info("结束更新齐套数据,共有[" + orderPnInfoMap.size() + "]元器件缺料----------");
lastUpdateDate = new Date();
}
}
package com.neotel.smfcore.core.order.bean;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.Date;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class OrderPnInfo implements Serializable {
/**
* 物编
*/
private String partNumber;
// /**
// * 总需求数量
// */
// private int allNeedNum=0;
//
// /**
// * 锁定的数量,已分配出库任务的数量
// */
// private int lockCount = 0;
/**
* 当前需求数量
*/
private int needNum=0;
/**
* 缺料数
*/
private int lackNum=0;
/**
* 库存数量
*/
private int stockCount = 0;
/**
* 每盘料的包装数量
*/
private int reelAmount=0;
/**
* 缺料盘数
*/
private int reelCount=0;
private Date updateTime=new Date();
}
...@@ -9,10 +9,14 @@ import com.neotel.smfcore.common.exception.ValidateException; ...@@ -9,10 +9,14 @@ import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.common.utils.*; import com.neotel.smfcore.common.utils.*;
import com.neotel.smfcore.core.device.util.DataCache; import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.core.order.LiteOrderCache; import com.neotel.smfcore.core.order.LiteOrderCache;
import com.neotel.smfcore.core.order.OrderPnCache;
import com.neotel.smfcore.core.order.bean.OrderPnInfo;
import com.neotel.smfcore.core.order.enums.LITEORDER_STATUS; import com.neotel.smfcore.core.order.enums.LITEORDER_STATUS;
import com.neotel.smfcore.core.order.rest.bean.dto.OrderDto; import com.neotel.smfcore.core.order.rest.bean.dto.OrderDto;
import com.neotel.smfcore.core.order.rest.bean.dto.OrderPnDto;
import com.neotel.smfcore.core.order.rest.bean.mapstruct.OrderItemMapper; import com.neotel.smfcore.core.order.rest.bean.mapstruct.OrderItemMapper;
import com.neotel.smfcore.core.order.rest.bean.mapstruct.OrderMapper; import com.neotel.smfcore.core.order.rest.bean.mapstruct.OrderMapper;
import com.neotel.smfcore.core.order.rest.bean.mapstruct.OrderPnMapper;
import com.neotel.smfcore.core.order.rest.bean.query.OrderQueryCondition; import com.neotel.smfcore.core.order.rest.bean.query.OrderQueryCondition;
import com.neotel.smfcore.core.order.service.manager.ILiteOrderItemManager; import com.neotel.smfcore.core.order.service.manager.ILiteOrderItemManager;
import com.neotel.smfcore.core.order.service.manager.ILiteOrderManager; import com.neotel.smfcore.core.order.service.manager.ILiteOrderManager;
...@@ -90,6 +94,11 @@ public class OrderController { ...@@ -90,6 +94,11 @@ public class OrderController {
@Autowired @Autowired
private TaskMapper taskMapper; private TaskMapper taskMapper;
@Autowired
private OrderPnMapper orderPnMapper;
@Autowired
private OrderPnCache orderPnCache;
// @ApiOperation("导出用户数据") // @ApiOperation("导出用户数据")
// @GetMapping(value = "/download") // @GetMapping(value = "/download")
// @PreAuthorize("@el.check('user:list')") // @PreAuthorize("@el.check('user:list')")
...@@ -392,6 +401,24 @@ public class OrderController { ...@@ -392,6 +401,24 @@ public class OrderController {
return ResultBean.newOkResult("smfcore.order.nextOk", "成功切换到下一个工单", ""); return ResultBean.newOkResult("smfcore.order.nextOk", "成功切换到下一个工单", "");
} }
@ApiOperation("齐套页面,获取齐套数据")
@GetMapping("/orderSet")
@PreAuthorize("@el.check('workOrder')")
public List<OrderPnDto> orderSetData( ) {
List<OrderPnInfo> orderPnInfos=orderPnCache.getDataList();
List<OrderPnDto> dtos=orderPnMapper.toDto(orderPnInfos);
return dtos;
}
@ApiOperation("齐套页面,刷新齐套数据")
@PostMapping("/orderSet/update")
@PreAuthorize("@el.check('workOrder')")
public List<OrderPnDto> updateOrderSet( ) {
orderPnCache.reloadData();
List<OrderPnInfo> orderPnInfos=orderPnCache.getDataList();
List<OrderPnDto> dtos=orderPnMapper.toDto(orderPnInfos);
return dtos;
}
private List<LiteOrder> getExecuteOrders(User user) { private List<LiteOrder> getExecuteOrders(User user) {
//查询正在执行的工单列表 //查询正在执行的工单列表
......
package com.neotel.smfcore.core.order.rest.bean.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
@Getter
@Setter
public class OrderPnDto implements Serializable {
@ApiModelProperty(value = "物料编号")
private String partNumber;
@ApiModelProperty(value = "缺料数")
private int lackNum=0;
@ApiModelProperty(value = "缺料盘数")
private int reelCount=0;
// @ApiModelProperty(value = "当前需求数量")
// private int needNum=0;
// @ApiModelProperty(value = "库存数量")
// private int stockCount = 0;
// @ApiModelProperty(value = "每盘料的包装数量")
// private int reelAmount=0;
}
package com.neotel.smfcore.core.order.rest.bean.mapstruct;
import com.neotel.smfcore.common.base.BaseMapper;
import com.neotel.smfcore.core.order.bean.OrderPnInfo;
import com.neotel.smfcore.core.order.rest.bean.dto.OrderPnDto;
import org.mapstruct.Mapper;
import org.mapstruct.ReportingPolicy;
@Mapper(componentModel = "spring",unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface OrderPnMapper extends BaseMapper<OrderPnDto, OrderPnInfo> {
}
...@@ -57,22 +57,22 @@ public class LiteOrderItem extends BasePo implements Serializable ,Comparable<Li ...@@ -57,22 +57,22 @@ public class LiteOrderItem extends BasePo implements Serializable ,Comparable<Li
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 totalOutNum = 0;
/** /**
* 累计已出盘数 * 累计已出盘数,已完成
*/ */
private int totalOutReelCount = 0; private int totalOutReelCount = 0;
......
...@@ -13,6 +13,6 @@ public class OutListQueryCondition { ...@@ -13,6 +13,6 @@ public class OutListQueryCondition {
@QueryCondition(type = QueryCondition.Type.BETWEEN) @QueryCondition(type = QueryCondition.Type.BETWEEN)
private BetweenData<Date> createDate; private BetweenData<Date> createDate;
@QueryCondition //状态,0=所有,1=已关闭,2=未关闭
private Integer status; private Integer status;
} }
...@@ -25,10 +25,12 @@ import lombok.RequiredArgsConstructor; ...@@ -25,10 +25,12 @@ import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.mongodb.core.query.Query;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.util.ObjectUtils; import org.springframework.util.ObjectUtils;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import sun.java2d.pipe.OutlineTextRenderer;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
...@@ -60,11 +62,62 @@ public class OutListController { ...@@ -60,11 +62,62 @@ public class OutListController {
@PreAuthorize("@el.check('outList')") @PreAuthorize("@el.check('outList')")
public PageData<OutListDto> query(OutListQueryCondition criteria, Pageable pageable) { public PageData<OutListDto> query(OutListQueryCondition criteria, Pageable pageable) {
Query query = QueryHelp.getQuery(criteria); Query query = QueryHelp.getQuery(criteria);
if (criteria.getStatus() != null) {
if (criteria.getStatus() == 1) {
query.addCriteria(Criteria.where("status").is(LITEORDER_STATUS.CLOSED));
} else if (criteria.getStatus() == 2) {
query.addCriteria(Criteria.where("status").ne(LITEORDER_STATUS.CLOSED));
}
}
PageData<OutList> outList = outListManager.findByPage(query, pageable); PageData<OutList> outList = outListManager.findByPage(query, pageable);
PageData<OutListDto> resultList=outListMapper.toDto(outList); PageData<OutListDto> resultList=outListMapper.toDto(outList);
// if(outList.getTotalElements()<=0){
// addTestData();
// }
return resultList; return resultList;
} }
// private void addTestData(){
// for (int i=1;i<=5;i++){
// String name="test"+i;
// int type=0;
// //从接口获取出库单
// List<ReservedOrderItem> outOrderLists =new ArrayList<>();
// for (int j=0;j<=5;j++
// ) {
// ReservedOrderItem item=new ReservedOrderItem();
// item.setDocNo(name);
// item.setBaseCode("8001");
// item.setDumpQty(1000);
// item.setInLgort("M9143");
// item.setOutLgort("M9142");
// item.setMaterialNo("PN"+j);
// outOrderLists.add(item);
// }
//
// OutList outList = new OutList(name, LITEORDER_STATUS.NEW, type, new ArrayList<>());
// //新建出库单
// List<OutListItem> outListItems = new ArrayList<>();
// for (ReservedOrderItem obj :
// outOrderLists) {
// OutListItem item = obj.creatOutListItem();
// item.setName(name);
// outListItems.add(item);
//
// outList.setBaseCode(obj.getBaseCode());
// outList.setInLgort(obj.getInLgort());
// outList.setOutLgort(obj.getOutLgort());
// }
// outList.setOutListItems(outListItems);
// log.info("获取到转储单,新增加出库单:" + outList.getName() + ",共" + outListItems.size() + "条工单详情");
// outList = outListManager.createWithItems(outList);
// outListCache.addOutListToMap(outList);
// }
//
// }
@ApiOperation("查看出库单详情") @ApiOperation("查看出库单详情")
@GetMapping("/detial") @GetMapping("/detial")
@PreAuthorize("@el.check('outList')") @PreAuthorize("@el.check('outList')")
...@@ -137,8 +190,8 @@ public class OutListController { ...@@ -137,8 +190,8 @@ public class OutListController {
@ApiOperation("出库操作") @ApiOperation("出库操作")
@PostMapping(value = "/out") @PostMapping(value = "/out")
@PreAuthorize("@el.check('outList')") @PreAuthorize("@el.check('outList')")
public ResultBean checkOut(@RequestBody Map<String, String> mapValues) { public ResultBean checkOut(@RequestBody String name) {
String name = mapValues.get("name"); // String name = mapValues.get("name");
if (name == null) { if (name == null) {
throw new ValidateException("smfcore.valueCanotNull", "{0}不能为空", new String[]{"orderNo"}); throw new ValidateException("smfcore.valueCanotNull", "{0}不能为空", new String[]{"orderNo"});
} }
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!