Commit e6e4df6f zshaohui

1.工单批量出库,批量执行

2.工单出库逻辑修改
1 个父辈 8926170a
......@@ -45,7 +45,7 @@ public class DataInitManager {
MainTimer mainTimer;
//@Value("${menu.show}")
private String[] menuShowList = new String[]{"commonIn","returnIn","cutIn","elecKanban"};
private String[] menuShowList = new String[]{"commonIn","returnIn","cutIn","elecKanban","orderSetting"};
//@Value("${menu.hide}")
private String[] menuHideList = new String[]{"singleDiskWarehousing"};
......@@ -167,6 +167,9 @@ public class DataInitManager {
addNewFunctionMenu(orderM,new ArrayList<Menu>(), 1, "productionLineReple", "产线补料", 1, "productionLineReple", "system/productionLineReple/index", "", 0, "orderShortageSheet",functionMenuMap);
addNewFunctionMenu(orderM,new ArrayList<Menu>(), 1, "productionLineOut", "补料料盘出库", 1, "productionLineOut", "system/productionLineOut/index", "", 0, "orderShortageSheet",functionMenuMap);
//new Menu(new ArrayList<Menu>(), 1, "orderSetting", "工单设置", 1, "orderSetting", "system/orderSetting/index", "", 0, "sysSet");
addNewFunctionMenu(orderM,new ArrayList<Menu>(), 1, "orderSetting", "工单设置", 2, "orderSetting", "system/orderSetting/index", "", 0, "orderSetting",functionMenuMap);
//MSD管理:MSD库存.MSD追溯性.MSD设置
Menu msd = Menu.CreatePMenu("MSD管理", 20, "msd", 2, "MSD", null);
addNewFunctionMenu(msd, new ArrayList<Menu>(), 1, "msdManage", "MSD库存", 1, "msdManage", "neolight/msdManage/index", "", 0, "MSDManager",functionMenuMap);
......@@ -215,7 +218,7 @@ public class DataInitManager {
// //物联网:共享文件夹
// Menu pMenuWulian = Menu.CreatePMenu("物联网", 30, "internet", 2, "interMenu");
// Menu orderSet = new Menu(new ArrayList<Menu>(), 1, "orderSetting", "共享文件夹", 1, "orderSetting", "system/orderSetting/index", "", 0, "sysSet");
// Menu orderSet = new Menu(new ArrayList<Menu>(), 1, "orderSetting", "工单设置", 1, "orderSetting", "system/orderSetting/index", "", 0, "sysSet");
// orderSet.setHidden(true);
// menus.addAll(createMenus(pMenuWulian, orderSet));
......@@ -255,7 +258,7 @@ public class DataInitManager {
"reelOut", "orderSheet", "orderShortageOut", "orderShortageSheet", "productionLineReple","productionLineOut",
"componentParts","barcode","barcodeSetting","taskLog","message", "interfaceException",
"bunker","storagePos",
"peoples","role","about"
"peoples","role","about","orderSetting"
};
}
......
......@@ -26,8 +26,10 @@ import com.neotel.smfcore.core.order.service.po.LiteOrderItem;
import com.neotel.smfcore.core.storage.rest.mapstruct.SafetyInventoryMapper;
import com.neotel.smfcore.core.storage.service.manager.IStoragePosManager;
import com.neotel.smfcore.core.storage.service.po.StoragePos;
import com.neotel.smfcore.core.system.bean.OrderSetting;
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.Settings;
import com.neotel.smfcore.core.system.util.TaskService;
import com.neotel.smfcore.hikvision.HikApi;
import com.neotel.smfcore.hikvision.bean.HikOrderInfo;
......@@ -441,6 +443,8 @@ public class LiteOrderCache implements ITaskListener {
return "smfcore.order.out.maxOrder";
}
OrderSetting orderSetting = dataCache.getOrderSetting();
// 出库策略(系统判断逻辑由上到下依次满足):
//①湿敏超期物料所在仓位锁定,不允许备料;
//②贵重物料,不允许超发,按实际需求发料;
......@@ -522,13 +526,13 @@ public class LiteOrderCache implements ITaskListener {
//产线补料出库,补料逻辑:单盘最大5000 需求补料1000,按照满足需求最少料盘补料,补料需求6000时首发最大盘第二盘发满足需求最小盘
outPosList = pickRepleReels(outPosNameList, posList, targetNum);
} else {
if (orderItem.getWemng() > 200) {
if (orderItem.getWemng() > orderSetting.getOrderNum() || posList.size() > orderSetting.getInventoryNum()) {
// 2.1、订单数量>200;
// 2.1.1 散盘:整盘=3:7(比例可调,物料数量)
// 2.1.2 整盘数量=需求数量*整盘占比/最小包装(四舍五入)
// 2.1.3 剩余发散盘,优先取散盘(由多到少发送),
// 散盘不满足情况下补充整盘
outPosList = pickBigOrderReels(pn, outPosNameList, posList, targetNum);
outPosList = pickBigOrderReels(pn, outPosNameList, posList, targetNum,orderSetting.getNotFullNum());
} else {
//2.2、订单数量≤200;(料盘最少原则)
......@@ -790,7 +794,7 @@ public class LiteOrderCache implements ITaskListener {
* @param targetNum
* @return
*/
private List<StoragePos> pickBigOrderReels(String pn, Set<String> outPosNameList, List<StoragePos> posList, int targetNum) {
private List<StoragePos> pickBigOrderReels(String pn, Set<String> outPosNameList, List<StoragePos> posList, int targetNum,int notFullNum) {
List<String> excludePosNameList = new ArrayList<>(outPosNameList);
List<StoragePos> outPosList = new ArrayList<>();
......@@ -827,25 +831,31 @@ public class LiteOrderCache implements ITaskListener {
//挑选散盘
log.info("开始挑选散盘料,剩余需求" + targetNum);
//已挑选的散盘数量
int notWholeReelCount = 0;
while (true) {
//取散盘
StoragePos outPos = pickNotWholeReel(excludePosNameList, posList, targetNum, oneReelNum);
List<StoragePos> notWholePosList = findNotWholePosList(excludePosNameList, posList, targetNum, oneReelNum, pn,notFullNum);
if (notWholePosList == null || notWholePosList.size() <= 0) {
break;
}
if (notWholePosList.size() >= notFullNum) {
StoragePos outPos = pickWholeReel(excludePosNameList, posList, targetNum, oneReelNum);
if (outPos == null) {
break;
} else {
log.info("挑选批次[" + outPos.getBarcode().getBatch() + "]的整盘物料:" + outPos.getBarcode().getBarcode() + " 数量:" + outPos.getBarcode().getAmount());
outPosList.add(outPos);
excludePosNameList.add(outPos.getPosName());
targetNum = targetNum - outPos.getBarcode().getAmount();
}
} else {
for (StoragePos outPos : notWholePosList) {
log.info("挑选到批次[" + outPos.getBarcode().getBatch() + "]的散盘物料:" + outPos.getBarcode().getBarcode() + " 数量:" + outPos.getBarcode().getAmount());
outPosList.add(outPos);
excludePosNameList.add(outPos.getPosName());
targetNum = targetNum - outPos.getBarcode().getAmount();
if (targetNum <= 0) {
break;
}
notWholeReelCount = notWholeReelCount + 1;
if (notWholeReelCount >= 5) {
log.info(pn + "的散盘已挑选5盘,跳出");
break;
}
if (targetNum <= 0) {
break;
}
}
if (targetNum > 0) {
......@@ -970,4 +980,33 @@ public class LiteOrderCache implements ITaskListener {
}
return outPos;
}
private List<StoragePos> findNotWholePosList(List<String> excludePosNameList, List<StoragePos> posList, int targetNum, int oneReelNum, String pn,int notFullNum) {
List<StoragePos> storagePosList = new ArrayList<>();
while (true) {
if (storagePosList != null && !storagePosList.isEmpty()) {
for (StoragePos pos : storagePosList) {
excludePosNameList.add(pos.getPosName());
}
}
//取散盘
StoragePos outPos = pickNotWholeReel(excludePosNameList, posList, targetNum, oneReelNum);
if (outPos == null) {
break;
} else {
log.info("挑选到批次[" + outPos.getBarcode().getBatch() + "]的散盘物料:" + outPos.getBarcode().getBarcode() + " 数量:" + outPos.getBarcode().getAmount());
storagePosList.add(outPos);
targetNum = targetNum - outPos.getBarcode().getAmount();
if (targetNum <= 0) {
break;
}
if (storagePosList != null && storagePosList.size() >= notFullNum) {
log.info(pn + "的散盘已挑选5盘,跳出");
break;
}
}
}
return storagePosList;
}
}
......@@ -2,6 +2,7 @@
package com.neotel.smfcore.core.order.rest;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Lists;
import com.neotel.smfcore.common.bean.PageData;
import com.neotel.smfcore.common.bean.ResultBean;
......@@ -30,7 +31,9 @@ import com.neotel.smfcore.core.system.rest.bean.dto.TaskDto;
import com.neotel.smfcore.core.system.rest.bean.mapstruct.TaskMapper;
import com.neotel.smfcore.core.system.service.po.DataLog;
import com.neotel.smfcore.core.system.util.TaskService;
import com.neotel.smfcore.hikvision.HikApi;
import com.neotel.smfcore.hikvision.bean.HikOrderInfo;
import com.neotel.smfcore.hikvision.bean.result.ApiResult;
import com.neotel.smfcore.security.annotation.AnonymousAccess;
import com.neotel.smfcore.security.bean.FileProperties;
import com.neotel.smfcore.security.service.manager.IGroupManager;
......@@ -376,13 +379,26 @@ public class OrderController {
//查询正在执行的工单列表
User user = userManager.findByUserName(SecurityUtils.getCurrentUsername());
String orderNo = user.getCurrOrderNo();
if (ObjectUtil.isEmpty(orderNo)) {
List<LiteOrder> orderList = getExecuteOrders(user);
if (orderList == null || orderList.isEmpty()){
return new ArrayList<>();
}
List<DataLog> taskList = new ArrayList<>();
for (LiteOrder liteOrder : orderList) {
if (liteOrder.isNew() || liteOrder.isClosed()){
continue;
}
List<DataLog> orderTaskList = getOrderTaskByUser(user, liteOrder, false);
if (orderTaskList != null && !orderTaskList.isEmpty()){
taskList.addAll(orderTaskList);
}
}
LiteOrder liteOrder = liteOrderCache.findOrderByNo(orderNo);
/*if (ObjectUtil.isEmpty(orderNo)) {
return new ArrayList<>();
}*/
/*LiteOrder liteOrder = liteOrderCache.findOrderByNo(orderNo);
if (liteOrder == null) {
return new ArrayList<>();
//throw new ValidateException("smfcore.valueNotFind", "未找到{0}[{1}]", new String[]{"orderNo", orderNo});
......@@ -391,7 +407,7 @@ public class OrderController {
return new ArrayList<>();
//throw new ValidateException("smfcore.order.notExecute", "工单[{0}]不在出库中", new String[]{liteOrder.getOrderNo()});
}
List<DataLog> taskList = getOrderTaskByUser(user, liteOrder, false);
List<DataLog> taskList = getOrderTaskByUser(user, liteOrder, false);*/
return taskMapper.toDto(taskList);
}
......@@ -399,9 +415,19 @@ public class OrderController {
@ApiOperation("料盘出库界面,切换到下一个工单")
@PostMapping("/nextOrder")
@PreAuthorize("@el.check('reelOut')")
public ResultBean nextOrder(@RequestParam Map<String, String> paramsMap) {
public ResultBean nextOrder(@RequestBody Map<String, String> paramsMap) {
String idStr = paramsMap.get("id");
if (StringUtils.isEmpty(idStr)) {
return ResultBean.newErrorResult(-1, "smfcore.order.choose", "请选择工单");
}
List<String> idList = JSONObject.parseArray(idStr, String.class);
if (idList == null || idList.isEmpty()) {
return ResultBean.newErrorResult(-1, "smfcore.order.choose", "请选择工单");
}
User user = userManager.findByUserName(SecurityUtils.getCurrentUsername());
if (ObjectUtil.isNotEmpty(user.getCurrOrderNo())) {
/*if (ObjectUtil.isNotEmpty(user.getCurrOrderNo())) {
//判断上个工单是否已完成
LiteOrder preOrder = liteOrderCache.findOrderByNo(user.getCurrOrderNo());
List<DataLog> preTasks = getOrderTaskByUser(user, preOrder, true);
......@@ -409,31 +435,56 @@ public class OrderController {
return ResultBean.newErrorResult(-1, "smfcore.order.preNotEnd", "工单[" + preOrder.getOrderNo() + "]还有[" + preTasks.size() + "]个出库任务未结束",
new String[]{user.getCurrOrderNo(), preTasks.size() + ""});
}
}
}*/
List<LiteOrder> orderList = getExecuteOrders(user);
if (orderList.size() <= 0) {
return ResultBean.newErrorResult(-1, "smfcore.order.noOrder", "暂无可操作的工单");
}
LiteOrder liteOrder = orderList.get(0);
//判断是否在列表中
List<LiteOrder> newOrderList = new ArrayList<>();
for (LiteOrder liteOrder : orderList) {
/*List<DataLog> preTasks = getOrderTaskByUser(user, liteOrder, true);
if (preTasks.size() > 0) {
continue;
}*/
for (String orderId : idList) {
if (liteOrder.getId().equals(orderId)) {
newOrderList.add(liteOrder);
break;
}
}
}
if (newOrderList == null || newOrderList.isEmpty()) {
return ResultBean.newErrorResult(-1, "smfcore.order.noOrder", "暂无可操作的工单");
}
//判断工单有没有进行绑定
for (LiteOrder liteOrder : newOrderList) {
//判断是否绑定过箱子
boolean isbind=false;
if(liteOrder.getBoxInfos()!=null){
for (OrderBoxInfo boxInfo:
boolean isbind = false;
if (liteOrder.getBoxInfos() != null) {
for (OrderBoxInfo boxInfo :
liteOrder.getBoxInfos()) {
if(boxInfo.getOperater().equals(user.getUsername())){
isbind=true;
if (boxInfo.getOperater().equals(user.getUsername())) {
isbind = true;
}
}
}
if (!isbind) {
return ResultBean.newErrorResult(-1, "smfcore.order.noBind", "操作失败,请先为工单{0}绑定箱子", new String[]{liteOrder.getOrderNo()});
}
if(!isbind){
return ResultBean.newErrorResult(-1, "smfcore.order.noBind", "操作失败,请先为工单{0}绑定箱子",new String[]{liteOrder.getOrderNo()});
}
//开始生成任务
for (LiteOrder liteOrder : newOrderList) {
//设置此工单的任务可以发送给料架
List<DataLog> taskList = getOrderTaskByUser(user, liteOrder, true);
for (DataLog datalog : taskList) {
if (datalog.isInOperate()) {
continue;
}
datalog.setInOperate(true);
datalog.setOperator(user.getUsername());
taskService.updateQueueTask(datalog);
......@@ -441,10 +492,11 @@ public class OrderController {
user.setCurrOrderNo(liteOrder.getOrderNo());
userManager.save(user);
log.info("用户[" + user.getUsername() + "]切换到工单[" + liteOrder.getOrderNo() + "],共更新["+taskList.size()+"]个任务状态为操作中");
return ResultBean.newOkResult("smfcore.order.nextOk", "成功切换到下一个工单", "");
log.info("用户[" + user.getUsername() + "]切换到工单[" + liteOrder.getOrderNo() + "],共更新[" + taskList.size() + "]个任务状态为操作中");
}
return ResultBean.newOkResult("");
}
@ApiOperation("齐套页面,获取齐套数据")
@GetMapping("/orderSet")
@PreAuthorize("@el.check('workOrder')")
......@@ -467,6 +519,68 @@ public class OrderController {
return ResultBean.newOkResult(dtos);
}
@ApiOperation("更新开工时间")
@RequestMapping("/updateStartDate")
@AnonymousAccess
public ResultBean updateStartDate(OrderQueryCondition criteria) {
User user = userManager.findByUserName(SecurityUtils.getCurrentUsername());
if (user != null) {
//数据权限 查找没有权限的组列表
if (!user.getIsAdmin()) {
Set<String> groupIds = user.getGroups();
List<String> excludeSources = Lists.newArrayList();
List<Group> groups = groupManager.findAll();
for (Group group : groups) {
if (groupIds.contains(group.getId())) {
continue;
}
excludeSources.add(group.getGroupName());
}
criteria.setExcludeSourceList(excludeSources);
}
}
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));
} else if (criteria.getStatus() == 3) {
query.addCriteria(Criteria.where("status").is(LITEORDER_STATUS.EXECUTING));
}
}
query.addCriteria(Criteria.where("replenishmentNo").isNull());
List<LiteOrder> orderList = liteOrderManager.findByQuery(query);
if (orderList != null && !orderList.isEmpty()) {
for (LiteOrder order : orderList) {
if (order.isClosed()) {
continue;
}
ApiResult apiResult = HikApi.updateOrderApi("system", order.getOrderNo());
if (apiResult == null) {
continue;
}
if (apiResult.getCode() == 33) {
continue;
}
List<HikOrderInfo> newItems = (ArrayList<HikOrderInfo>) apiResult.getData();
if (newItems == null || newItems.isEmpty()) {
continue;
}
HikOrderInfo hikOrderInfo = newItems.get(0);
Date startD = hikOrderInfo.getStartD();
order.setStartDate(startD);
order = liteOrderManager.save(order);
liteOrderCache.addOrderToMap(order);
}
} else {
return ResultBean.newErrorResult(-1,"smfcore.order.out.notFound","工单未找到");
}
return ResultBean.newOkResult("");
}
@ApiOperation("导出齐套列表")
@GetMapping(value = "/orderSet/download")
@PreAuthorize("@el.check('workOrder')")
......
......@@ -32,6 +32,9 @@ public class OrderQueryCondition {
//状态,0=所有,1=已关闭,2=未关闭,3=出库中
private Integer status;
@QueryCondition(type = QueryCondition.Type.IN, propName = "orderNo")
private List<String> idList;
//
// @QueryCondition(type=QueryCondition.Type.IN,propName = "status")
// private List<Integer> statusList ;
......
......@@ -34,4 +34,10 @@ public class OrderSetting implements Serializable {
*/
@ApiModelProperty("料架亮灯方式,0=全部亮灯,1=亮灯指引,默认0")
public Integer shelfLightType=0;
private Integer inventoryNum = 3;
private Integer orderNum = 200;
private Integer notFullNum = 5;
}
......@@ -126,7 +126,7 @@ public class SettingsController {
public ResultBean updateOrderSetting( @RequestBody OrderSetting orderSetting) {
// String type=map.get("checkOutType");
if(orderSetting.getPn()==null){
/*if(orderSetting.getPn()==null){
throw new ValidateException("smfcore.valueCanotNull", "{0}不能为空", new String[]{"PN"});
}
if(orderSetting.getFeeder()==null){
......@@ -157,7 +157,7 @@ public class SettingsController {
throw new ValidateException("smfcore.enterCorrectFolder", "请输入正确的文件夹" );
}
}
}
}*/
dataCache.updateCache(Constants.CACHE_OrderSetting, orderSetting);
log.info("更改工单设置:"+Constants.CACHE_OrderSetting+"=" + orderSetting.toString());
......
......@@ -39,7 +39,7 @@ public class TaskQueryCondition {
private String operator;
@QueryCondition(type = QueryCondition.Type.BETWEEN, propName = "updateDate")
@DateTimeFormat(pattern = "yyyy-MM-dd")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private BetweenData<Date> updateDate;
@QueryCondition
......
......@@ -146,7 +146,7 @@ smfcore.solderPasteKanban=\u8BBE\u5907\u6982\u89C8
smfcore.solderPasteManage=\u5E93\u5B58
smfcore.solderPasteData=\u8FFD\u6EAF\u6027
smfcore.solderPasteSetting=\u8BBE\u7F6E
smfcore.orderSetting=\u5171\u4EAB\u6587\u4EF6\u5939
smfcore.orderSetting=\u5DE5\u5355\u8BBE\u7F6E
smfcore.enterCorrectFolder=\u8BF7\u8F93\u5165\u6B63\u786E\u7684\u6587\u4EF6\u5939
smfcore.taskHasEnd=\u4EFB\u52A1{0}\u5DF2\u53D6\u6D88\u6216\u5DF2\u7ED3\u675F
smfcore.virtual.notFound=\u672A\u627E\u5230\u865A\u62DF\u4ED3
......@@ -262,6 +262,7 @@ smfcore.orderShortage.statusError=\u64CD\u4F5C\u5931\u8D25\uFF0C{0}\u975E\u5DE5\
smfcore.orderSheet.taskNotEnd=\u64CD\u4F5C\u5931\u8D25\uFF0C\u5DE5\u5355\u51FA\u5E93\u4EFB\u52A1[{0}][{1}}]\u8FD8\u672A\u7ED3\u675F
smfcore.orderSheet.end.error=\u64CD\u4F5C\u5931\u8D25\uFF0C\u5DE5\u5355{0}\u8FD8\u672A\u51FA\u5E93\u5B8C\u6210
smfcore.order.noBind=\u64CD\u4F5C\u5931\u8D25\uFF0C\u8BF7\u5148\u4E3A\u5DE5\u5355{0}\u7ED1\u5B9A\u7BB1\u5B50
smfcore.order.choose=\u8BF7\u9009\u62E9\u5DE5\u5355
#smfcore.order.out.short=\u5DE5\u5355\u51FA\u5E93\u5931\u8D25\uFF0C\u5DE5\u5355\u7F3A\u6599
......
......@@ -149,7 +149,7 @@ smfcore.solderPasteKanban=Equipment Overview
smfcore.solderPasteManage=Inventory
smfcore.solderPasteData=Traceability
smfcore.solderPasteSetting=Setting
smfcore.orderSetting=Shared Folder
smfcore.orderSetting=Work Order Settings
smfcore.enterCorrectFolder=Please enter the correct folder
smfcore.taskHasEnd=Task {0} has been cancelled or has ended
smfcore.virtual.notFound=No virtual warehouse found
......@@ -253,4 +253,4 @@ smfcore.safetyInventory.supplementReel=Number of additional plates
smfcore.safetyInventory.amount=Amount
smfcore.component.storeError=Please enter the correct stock, minimum stock <= safety stock <= maximum stock
smfcore.user.group.error=Group [{0}] has been assigned to operator [{1}]
smfcore.order.choose=Please select a ticket
......@@ -148,7 +148,7 @@ smfcore.solderPasteKanban=\u6A5F\u5668\u6982\u8981
smfcore.solderPasteManage=\u30A4\u30F3\u30D9\u30F3\u30C8\u30EA\u30FC
smfcore.solderPasteData=\u9061\u53CA
smfcore.solderPasteSetting=\u8A2D\u5B9A
smfcore.orderSetting=\u5171\u6709\u30D5\u30A9\u30EB\u30C0\u30FC
smfcore.orderSetting=\u4F5C\u696D\u6307\u793A\u66F8\u8A2D\u5B9A
smfcore.enterCorrectFolder=\u6B63\u3057\u3044\u30D5\u30A9\u30EB\u30C0\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044
smfcore.taskHasEnd=\u30BF\u30B9\u30AF{0}\u304C\u30AD\u30E3\u30F3\u30BB\u30EB\u3055\u308C\u305F\u304B\u7D42\u4E86\u3057\u305F
smfcore.virtual.notFound=\u30D0\u30FC\u30C1\u30E3\u30EB\u30A6\u30A8\u30A2\u30CF\u30A6\u30B9\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093
......@@ -252,4 +252,4 @@ smfcore.safetyInventory.supplementReel=\u8FFD\u52A0\u30D7\u30EC\u30FC\u30C8\u679
smfcore.safetyInventory.amount=\u6578\u91CF
smfcore.component.storeError=\u6B63\u3057\u3044\u5728\u5EAB\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3001\u6700\u5C0F\u5728\u5EAB\u2266\u5B89\u5168\u5728\u5EAB\u2266\u6700\u5927\u5728\u5EAB
smfcore.user.group.error=\u30B0\u30EB\u30FC\u30D7[{0}]\u304C\u30AA\u30DA\u30EC\u30FC\u30BF[{1}]\u306B\u5272\u308A\u5F53\u3066\u3089\u308C\u307E\u3057\u305F\u3002
smfcore.order.choose=\u30C1\u30B1\u30C3\u30C8\u3092\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044
......@@ -148,7 +148,7 @@ smfcore.solderPasteKanban=\u8BBE\u5907\u6982\u89C8
smfcore.solderPasteManage=\u5E93\u5B58
smfcore.solderPasteData=\u8FFD\u6EAF\u6027
smfcore.solderPasteSetting=\u8BBE\u7F6E
smfcore.orderSetting=\u5171\u4EAB\u6587\u4EF6\u5939
smfcore.orderSetting=\u5DE5\u5355\u8BBE\u7F6E
smfcore.enterCorrectFolder=\u8BF7\u8F93\u5165\u6B63\u786E\u7684\u6587\u4EF6\u5939
smfcore.taskHasEnd=\u4EFB\u52A1{0}\u5DF2\u53D6\u6D88\u6216\u5DF2\u7ED3\u675F
smfcore.virtual.notFound=\u672A\u627E\u5230\u865A\u62DF\u4ED3
......@@ -252,3 +252,4 @@ smfcore.safetyInventory.supplementReel=\u8865\u5145\u76D8\u6570
smfcore.safetyInventory.amount=\u6700\u5C0F\u5305\u88C5
smfcore.component.storeError=\u8BF7\u8F93\u5165\u6B63\u786E\u7684\u5E93\u5B58\uFF0C\u6700\u5C0F\u5E93\u5B58<=\u5B89\u5168\u5E93\u5B58<=\u6700\u5927\u5E93\u5B58
smfcore.user.group.error=\u7EC4[{0}]\u5DF2\u7ECF\u5206\u914D\u7ED9\u64CD\u4F5C\u5458[{1}]
smfcore.order.choose=\u8BF7\u9009\u62E9\u5DE5\u5355
\ No newline at end of file
......@@ -148,7 +148,7 @@ smfcore.solderPasteKanban=\u8A2D\u5099\u6982\u89BD
smfcore.solderPasteManage=\u5EAB\u5B58
smfcore.solderPasteData=\u8FFD\u6EAF\u6027
smfcore.solderPasteSetting=\u8A2D\u7F6E
smfcore.orderSetting=\u5171\u4EAB\u6587\u4EF6\u593E
smfcore.orderSetting=\u5DE5\u55AE\u8A2D\u7F6E
smfcore.enterCorrectFolder=\u8ACB\u8F38\u5165\u6B63\u78BA\u7684\u6587\u4EF6\u593E
smfcore.taskHasEnd=\u4EFB\u52D9{0}\u5DF2\u53D6\u6D88\u6216\u5DF2\u7D50\u675F
smfcore.virtual.notFound=\u672A\u627E\u5230\u865B\u64EC\u5009
......@@ -252,3 +252,4 @@ smfcore.safetyInventory.supplementReel=\u88DC\u5145\u76E4\u6578
smfcore.safetyInventory.amount=\u6700\u5C0F\u5305\u88DD
smfcore.component.storeError=\u8ACB\u8F38\u5165\u6B63\u78BA\u7684\u5EAB\u5B58\uFF0C\u6700\u5C0F\u5EAB\u5B58<=\u5B89\u5168\u5EAB\u5B58<=\u6700\u5927\u5EAB\u5B58
smfcore.user.group.error=\u7D44[{0}]\u5DF2\u7D93\u5206\u914D\u7D66\u64CD\u4F5C\u54E1[{1}]
smfcore.order.choose=\u8ACB\u9078\u64C7\u5DE5\u55AE
\ No newline at end of file
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!