Commit 9445d90f sunke

Merge remote-tracking branch 'origin/master'

2 个父辈 059e83fc 13011d6e
正在显示 50 个修改的文件 包含 1452 行增加100 行删除
...@@ -198,6 +198,24 @@ public class DataInitManager { ...@@ -198,6 +198,24 @@ public class DataInitManager {
manualOut.setHidden(true); manualOut.setHidden(true);
menus.addAll(createMenus(poutOut, menuOrder, menuOut,celueOut,groupOut,manualOut,materialBox)); menus.addAll(createMenus(poutOut, menuOrder, menuOut,celueOut,groupOut,manualOut,materialBox));
Menu msd = Menu.CreatePMenu("MSD管理", 20, "msd", 2, "MSD");
Menu msdManage = new Menu(new ArrayList<Menu>(), 1, "msdManage", "MSD库存", 1, "msdManage", "neolight/msdManage/index", "", 0, "MSDManager");
Menu msdData = new Menu(new ArrayList<Menu>(), 1, "msdData", "MSD追溯性", 1, "msdData", "neolight/msdData/index", "", 0, "MSDData");
Menu msdSetting = new Menu(new ArrayList<Menu>(), 1, "msdSetting", "MSD设置", 1, "msdSetting", "neolight/msdSetting/index", "", 0, "MSDSet");
menus.addAll(createMenus(msd,msdManage,msdData,msdSetting));
//物料管理:元器件管理,条形码管理
Menu pMenuWl = Menu.CreatePMenu("档案管理", 30, "materiel ", 2, "BOM");
Menu menucom = new Menu(new ArrayList<Menu>(), 1, "component:list", "元器件", 1, "componentParts", "parts/component/index", "", 0, "server");
Menu menubarcode = new Menu(new ArrayList<Menu>(), 1, "barcode:list", "条形码", 1, "barcode", "barcode/barcode/index", "", 0, "chart");
menus.addAll(createMenus(pMenuWl, menucom, menubarcode));
//日志管理:物料日志
Menu pMenuLog = Menu.CreatePMenu("日志管理", 30, "log", 2, "log");
Menu menuLog = new Menu(new ArrayList<Menu>(), 1, "taskLog", "物料日志", 1, "taskLog", "neolight/taskLog/index", "", 0, "education");
menus.addAll(createMenus(pMenuLog, menuLog));
//设置:料仓管理,菜单管理 //设置:料仓管理,菜单管理
Menu poutSet = Menu.CreatePMenu("设置", 30, "system", 2, "system"); Menu poutSet = Menu.CreatePMenu("设置", 30, "system", 2, "system");
Menu menuStorage = new Menu(new ArrayList<Menu>(), 1, "storage:list", "设备管理", 1, "bunker", "storage/storage/index", "", 0, "database"); Menu menuStorage = new Menu(new ArrayList<Menu>(), 1, "storage:list", "设备管理", 1, "bunker", "storage/storage/index", "", 0, "database");
...@@ -206,24 +224,15 @@ public class DataInitManager { ...@@ -206,24 +224,15 @@ public class DataInitManager {
Menu sysSetting = new Menu(new ArrayList<Menu>(), 1, "barcode", "条码设置", 1, "barcodeSetting", "system/barcodeSetting/index", "", 0, "database"); Menu sysSetting = new Menu(new ArrayList<Menu>(), 1, "barcode", "条码设置", 1, "barcodeSetting", "system/barcodeSetting/index", "", 0, "database");
Menu outSet = new Menu(new ArrayList<Menu>(), 1, "outSetting", "出库策略", 1, "outSetting", "system/outSetting/index", "", 0, "outSet"); Menu outSet = new Menu(new ArrayList<Menu>(), 1, "outSetting", "出库策略", 1, "outSetting", "system/outSetting/index", "", 0, "outSet");
Menu sysSet = new Menu(new ArrayList<Menu>(), 1, "sysSetting", "系统设置", 1, "sysSetting", "system/sysSetting/index", "", 0, "sysSet"); Menu sysSet = new Menu(new ArrayList<Menu>(), 1, "sysSetting", "系统设置", 1, "sysSetting", "system/sysSetting/index", "", 0, "sysSet");
Menu translationSet = new Menu(new ArrayList<Menu>(), 1, "translation", "资源翻译", 1, "translation", "system/translation/index", "", 0, "sysSet");
menuMenu.setHidden(true); menuMenu.setHidden(true);
outSet.setHidden(true); outSet.setHidden(true);
sysSet.setHidden(true); sysSet.setHidden(true);
// menuMenu.setHidden(true); // menuMenu.setHidden(true);
// sysSetting.setHidden(true); // sysSetting.setHidden(true);
menus.addAll(createMenus(poutSet, menuStorage, menuStoragePos, menuMenu, sysSetting,outSet,sysSet)); menus.addAll(createMenus(poutSet, menuStorage, menuStoragePos, menuMenu, sysSetting,outSet,sysSet,translationSet));
//物料管理:元器件管理,条形码管理
Menu pMenuWl = Menu.CreatePMenu("档案管理", 30, "materiel ", 2, "BOM");
Menu menucom = new Menu(new ArrayList<Menu>(), 1, "component:list", "元器件", 1, "componentParts", "parts/component/index", "", 0, "server");
Menu menubarcode = new Menu(new ArrayList<Menu>(), 1, "barcode:list", "条形码", 1, "barcode", "barcode/barcode/index", "", 0, "chart");
menus.addAll(createMenus(pMenuWl, menucom, menubarcode));
//日志管理:物料日志
Menu pMenuLog = Menu.CreatePMenu("日志管理", 30, "log", 2, "log");
Menu menuLog = new Menu(new ArrayList<Menu>(), 1, "taskLog", "物料日志", 1, "taskLog", "neolight/taskLog/index", "", 0, "education");
menus.addAll(createMenus(pMenuLog, menuLog));
//用户管理:用户管理,角色管理 //用户管理:用户管理,角色管理
......
...@@ -100,7 +100,24 @@ public class Constants { ...@@ -100,7 +100,24 @@ public class Constants {
public static final String CACHE_StopJob="stopJob"; public static final String CACHE_StopJob="stopJob";
/** /**
* 出库方式类型 出库策略配置 *出库策略配置: 出库方式类型
*/ */
public static final String CACHE_CheckOutType="checkoutType"; public static final String CACHE_CheckOutType="checkoutType";
/**
*MSD设置
*/
public static final String CACHE_msdSetting="msdSetting";
/**
* 客户端自定义配置
*/
public static final String CACHE_clientSetting="clientSetting";
/**
* 语言列表配置
*/
public static final String CACHE_languageType="CACHE_languageType";
} }
package com.neotel.smfcore.core.barcode.rest; package com.neotel.smfcore.core.barcode.rest;
import cn.hutool.core.util.ObjectUtil;
import com.neotel.smfcore.common.bean.PageData; import com.neotel.smfcore.common.bean.PageData;
import com.neotel.smfcore.common.exception.ValidateException; import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.common.utils.QueryHelp; import com.neotel.smfcore.common.utils.QueryHelp;
import com.neotel.smfcore.core.barcode.rest.bean.dto.ComponentDto; import com.neotel.smfcore.core.barcode.rest.bean.dto.ComponentDto;
import com.neotel.smfcore.core.barcode.rest.bean.mapstruct.ComponentMapper; import com.neotel.smfcore.core.barcode.rest.bean.mapstruct.ComponentMapper;
import com.neotel.smfcore.core.barcode.rest.bean.query.ComponentQueryCriteria; import com.neotel.smfcore.core.barcode.rest.bean.query.ComponentQueryCriteria;
import com.neotel.smfcore.core.barcode.service.manager.IBarcodeManager;
import com.neotel.smfcore.core.barcode.service.manager.IComponentManager; import com.neotel.smfcore.core.barcode.service.manager.IComponentManager;
import com.neotel.smfcore.core.barcode.service.po.Barcode; import com.neotel.smfcore.core.barcode.service.po.Barcode;
import com.neotel.smfcore.core.barcode.service.po.Component; import com.neotel.smfcore.core.barcode.service.po.Component;
import com.neotel.smfcore.core.storage.service.manager.IStoragePosManager;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
...@@ -38,6 +41,9 @@ public class ComponentController { ...@@ -38,6 +41,9 @@ public class ComponentController {
@Autowired @Autowired
private final ComponentMapper componentMapper; private final ComponentMapper componentMapper;
@Autowired
private final IStoragePosManager storagePosManager;
@ApiOperation("导出元器件信息") @ApiOperation("导出元器件信息")
@GetMapping(value = "/download") @GetMapping(value = "/download")
public void download(HttpServletResponse response, ComponentQueryCriteria criteria) throws Exception { public void download(HttpServletResponse response, ComponentQueryCriteria criteria) throws Exception {
...@@ -73,6 +79,14 @@ public class ComponentController { ...@@ -73,6 +79,14 @@ public class ComponentController {
throw new ValidateException("smfcode.valueCanotNull","{0}不能为空",new String[]{"ID"} ); throw new ValidateException("smfcode.valueCanotNull","{0}不能为空",new String[]{"ID"} );
} }
componentManager.saveComponent(component); componentManager.saveComponent(component);
// //修改元器件时更新storagePos中的数据
// if(!ObjectUtil.isEmpty(component.getPartNumber()))
// {
// if(!ObjectUtil.isEmpty(component.getMsl()) ){
// storagePosManager.updateBarcodeMsd(component.getPartNumber(),component.getMsl(),component.getThickness());
// }
// }
return new ResponseEntity<>(HttpStatus.OK); return new ResponseEntity<>(HttpStatus.OK);
} }
@ApiOperation("删除元器件") @ApiOperation("删除元器件")
......
package com.neotel.smfcore.core.barcode.rest.bean.dto; package com.neotel.smfcore.core.barcode.rest.bean.dto;
import cn.hutool.core.date.DateTime;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.neotel.smfcore.core.barcode.enums.BARCODE_STATUS; import com.neotel.smfcore.core.barcode.enums.BARCODE_STATUS;
import com.neotel.smfcore.core.barcode.enums.COMPONENT_TYPE; import com.neotel.smfcore.core.barcode.enums.COMPONENT_TYPE;
...@@ -10,6 +11,8 @@ import lombok.Setter; ...@@ -10,6 +11,8 @@ import lombok.Setter;
import org.springframework.data.annotation.Transient; import org.springframework.data.annotation.Transient;
import java.io.Serializable; import java.io.Serializable;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
...@@ -68,6 +71,7 @@ public class BarcodeDto implements Serializable { ...@@ -68,6 +71,7 @@ public class BarcodeDto implements Serializable {
@ApiModelProperty("批次") @ApiModelProperty("批次")
private String batch; private String batch;
@ApiModelProperty("等级")
private String msl; private String msl;
//备用字段1(配套单号))或 family //备用字段1(配套单号))或 family
...@@ -196,12 +200,19 @@ public class BarcodeDto implements Serializable { ...@@ -196,12 +200,19 @@ public class BarcodeDto implements Serializable {
@ApiModelProperty("锁定名") @ApiModelProperty("锁定名")
private String lockName; private String lockName;
/**
* 原始条码
*/
@ApiModelProperty("原始条码") @ApiModelProperty("原始条码")
private String fullCode; private String fullCode;
@ApiModelProperty("开包时间")
private Date openTime;
@ApiModelProperty("描述")
private String describe;
@ApiModelProperty("器件厚度")
private String thickness="";
public String getSize(){ public String getSize(){
return (""+plateSize+"X"+height); return (""+plateSize+"X"+height);
...@@ -211,4 +222,12 @@ public class BarcodeDto implements Serializable { ...@@ -211,4 +222,12 @@ public class BarcodeDto implements Serializable {
* 料箱中的物料信息 * 料箱中的物料信息
*/ */
private Map<String, BarcodeDto> subCodeMap; private Map<String, BarcodeDto> subCodeMap;
public String getPutInTimeStr() {
if (putInTime == -1) {
return null;
}
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:SS");
return dateFormat.format( new Date(putInTime));
}
} }
...@@ -116,6 +116,8 @@ public class ComponentDto implements Serializable { ...@@ -116,6 +116,8 @@ public class ComponentDto implements Serializable {
@ApiModelProperty("展示的图片") @ApiModelProperty("展示的图片")
private String showImg = ""; private String showImg = "";
@ApiModelProperty("厚度")
private String thickness="";
@ApiModelProperty("有效时长(生产日期+此天数为过期日期),设置默认有效期为2年") @ApiModelProperty("有效时长(生产日期+此天数为过期日期),设置默认有效期为2年")
private int validDay = 0; private int validDay = 0;
......
package com.neotel.smfcore.core.barcode.service.po; package com.neotel.smfcore.core.barcode.service.po;
import cn.hutool.core.date.DateTime;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.neotel.smfcore.common.base.BasePo; import com.neotel.smfcore.common.base.BasePo;
import com.neotel.smfcore.common.utils.DateUtil; import com.neotel.smfcore.common.utils.DateUtil;
...@@ -86,6 +87,9 @@ public class Barcode extends BasePo implements Serializable { ...@@ -86,6 +87,9 @@ public class Barcode extends BasePo implements Serializable {
* 批次 * 批次
*/ */
private String batch=""; private String batch="";
/**
* 等级
*/
private String msl; private String msl;
//备用字段1(配套单号))或 family //备用字段1(配套单号))或 family
...@@ -135,7 +139,7 @@ public class Barcode extends BasePo implements Serializable { ...@@ -135,7 +139,7 @@ public class Barcode extends BasePo implements Serializable {
private long startWarmTime = -1; private long startWarmTime = -1;
/** /**
* 入库时间 * 最后一次 入库时间
*/ */
private Date putInDate; private Date putInDate;
...@@ -206,8 +210,24 @@ public class Barcode extends BasePo implements Serializable { ...@@ -206,8 +210,24 @@ public class Barcode extends BasePo implements Serializable {
* 原始条码 * 原始条码
*/ */
private String fullCode; private String fullCode;
/**
* 开包时间
*/
private Date openTime;
/** /**
* 描述
*/
private String describe;
/**
* 厚度
* 请选择
*<2.1mm
* 2.1mm~3.1mm
* >=3.1mm
*/
private String thickness="";
/**
* 添加相关联条码 * 添加相关联条码
* *
* @param relationCode * @param relationCode
...@@ -226,9 +246,9 @@ public class Barcode extends BasePo implements Serializable { ...@@ -226,9 +246,9 @@ public class Barcode extends BasePo implements Serializable {
public void setPutInTime(long putInTime) { public void setPutInTime(long putInTime) {
if (this.putInTime == -1) { if (this.putInTime == -1) {
this.putInTime = putInTime; this.putInTime = putInTime;
this.putInDate = new Date(putInTime);
} }
this.putInDate = new Date(putInTime);
status = BARCODE_STATUS.IN_STORE; status = BARCODE_STATUS.IN_STORE;
updateExpTime(); updateExpTime();
......
...@@ -135,6 +135,20 @@ public class Component extends BasePo implements Serializable { ...@@ -135,6 +135,20 @@ public class Component extends BasePo implements Serializable {
private String showImg = ""; private String showImg = "";
/** /**
* 厚度
* 请选择
*<2.1mm
* 2.1mm~3.1mm
* >=3.1mm
*/
private String thickness="";
/**
* 是否有包装,默认无
*/
private boolean MBB=false;
/**
* 有效时长(生产日期+此天数为过期日期),设置默认有效期为2年 * 有效时长(生产日期+此天数为过期日期),设置默认有效期为2年
*/ */
private int validDay = 0; private int validDay = 0;
......
...@@ -61,7 +61,7 @@ public class BaseDeviceHandler implements IDeviceHandler { ...@@ -61,7 +61,7 @@ public class BaseDeviceHandler implements IDeviceHandler {
private IHumitureManager humitureManager; private IHumitureManager humitureManager;
@Autowired @Autowired
private IBarcodeManager barcodeManager; protected IBarcodeManager barcodeManager;
@Autowired @Autowired
protected TaskService taskService; protected TaskService taskService;
......
...@@ -143,6 +143,10 @@ public class SensorShelfHandler extends BaseDeviceHandler { ...@@ -143,6 +143,10 @@ public class SensorShelfHandler extends BaseDeviceHandler {
dataLog.setBarcode(reelId); dataLog.setBarcode(reelId);
dataLog.setPartNumber(pn); dataLog.setPartNumber(pn);
dataLog.setType(OP.PUT_IN); dataLog.setType(OP.PUT_IN);
barcode.setPutInTime(System.currentTimeMillis());
barcodeManager.saveBarcode(barcode);
dataLog.setNum(barcode.getAmount()); dataLog.setNum(barcode.getAmount());
dataLog.setStatus(OP_STATUS.WAIT.name()); dataLog.setStatus(OP_STATUS.WAIT.name());
dataLog.setGroupId(groupId); dataLog.setGroupId(groupId);
......
package com.neotel.smfcore.core.device.handler.impl; package com.neotel.smfcore.core.device.handler.impl;
import com.google.common.base.Strings; import com.google.common.base.Strings;
import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.common.utils.QueryHelp;
import com.neotel.smfcore.common.utils.SecurityUtils;
import com.neotel.smfcore.common.utils.StorageConstants; import com.neotel.smfcore.common.utils.StorageConstants;
import com.neotel.smfcore.core.barcode.service.po.Barcode;
import com.neotel.smfcore.core.device.api.IOpAuthApi; import com.neotel.smfcore.core.device.api.IOpAuthApi;
import com.neotel.smfcore.core.device.bean.BoxStatusBean; import com.neotel.smfcore.core.device.bean.BoxStatusBean;
import com.neotel.smfcore.core.device.bean.NLShelfOperateBean;
import com.neotel.smfcore.core.device.bean.StatusBean; import com.neotel.smfcore.core.device.bean.StatusBean;
import com.neotel.smfcore.core.device.enums.BOX_STATUS; import com.neotel.smfcore.core.device.enums.BOX_STATUS;
import com.neotel.smfcore.core.device.enums.OP; import com.neotel.smfcore.core.device.enums.OP;
import com.neotel.smfcore.core.device.enums.OP_STATUS; import com.neotel.smfcore.core.device.enums.OP_STATUS;
import com.neotel.smfcore.core.device.rest.dto.XLCPosBarcodeDto;
import com.neotel.smfcore.core.device.rest.dto.XLCPosDetailDto;
import com.neotel.smfcore.core.storage.enums.DeviceType; import com.neotel.smfcore.core.storage.enums.DeviceType;
import com.neotel.smfcore.core.storage.rest.dto.CheckOutDto;
import com.neotel.smfcore.core.storage.rest.dto.StoragePosDto;
import com.neotel.smfcore.core.storage.rest.mapstruct.StoragePosMapper;
import com.neotel.smfcore.core.storage.rest.query.StoragePosQueryCriteria;
import com.neotel.smfcore.core.storage.service.manager.IStoragePosManager;
import com.neotel.smfcore.core.storage.service.po.Storage;
import com.neotel.smfcore.core.storage.service.po.StoragePos; import com.neotel.smfcore.core.storage.service.po.StoragePos;
import com.neotel.smfcore.core.system.service.po.DataLog; import com.neotel.smfcore.core.system.service.po.DataLog;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import java.util.Collection; import java.util.*;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
@Service //北京方仓
@RestController
@Api(tags = "XLC方仓")
@Slf4j @Slf4j
public class XLCBoxHandler extends BaseDeviceHandler { public class XLCBoxHandler extends BaseDeviceHandler {
public XLCBoxHandler(List<IOpAuthApi> apiList) { public XLCBoxHandler(List<IOpAuthApi> apiList) {
super(apiList); super(apiList);
} }
@Autowired
private IStoragePosManager storagePosManager;
@Autowired
private StoragePosMapper storagePosMapper;
/** /**
* 当前出入库操作的库位(key为cid, value为当前执行的任务) * 当前出入库操作的库位(key为cid, value为当前执行的任务)
*/ */
...@@ -39,6 +69,69 @@ public class XLCBoxHandler extends BaseDeviceHandler { ...@@ -39,6 +69,69 @@ public class XLCBoxHandler extends BaseDeviceHandler {
return operateTaskMap.get(cid); return operateTaskMap.get(cid);
} }
@ApiOperation("XLC方仓容量详情")
@GetMapping("/api/boxkanban/xlcDetails")
@PreAuthorize("@el.check('boxkanban:info')")
public List<XLCPosDetailDto> xlcDetails(StoragePosQueryCriteria criteria) {
criteria.setUsed(true);
// String storageId = mapValues.get("storageId");
// Query query = new Query(Criteria.where("storageId").is(storageId).and("used").is(true));
Query query = QueryHelp.getQuery(criteria);
List<StoragePos> enabledPosList = storagePosManager.findByQuery(query);
// List<StoragePosDto> dtos = new ArrayList<>();
// for (StoragePos storagePos : enabledPosList) {
// if (!storagePos.isExpandPos()) {
// dtos.add(storagePosMapper.toDto(storagePos));
// }
// }
List<XLCPosDetailDto> dtos = new ArrayList<>();
for (StoragePos pos : enabledPosList) {
boolean isEx=pos.isExpandPos();
if ((!pos.isExpandPos()) && (pos.getBarcode() != null)) {
List< XLCPosBarcodeDto> list = new ArrayList<>();
if (pos.getBarcode().getSubCodeMap() != null) {
Set<String> keys = pos.getBarcode().getSubCodeMap().keySet();
for (String key :
keys) {
Barcode barcode = pos.getBarcode().getSubCodeMap().get(key);
list.add( toPosBarcodeDto(barcode));
}
}
if(list.size()<=0) {
Random r = new Random();
int num = r.nextInt(10) ;
for (int i = 1; i <= num; i++) {
XLCPosBarcodeDto dto1 = toPosBarcodeDto(pos.getBarcode());
dto1.setBarcode(i+ dto1.getBarcode());
dto1.setAmount(i * 1111);
list.add(dto1);
}
}
XLCPosBarcodeDto barcodeDto = toPosBarcodeDto(pos.getBarcode());
barcodeDto.setSubCodeList(list);
XLCPosDetailDto dto = new XLCPosDetailDto(pos.getId(), pos.getStorageId(), pos.getPosName(), barcodeDto);
dtos.add(dto);
}
}
return dtos;
}
private XLCPosBarcodeDto toPosBarcodeDto(Barcode barcode){
XLCPosBarcodeDto dto=new XLCPosBarcodeDto();
dto.setAmount(barcode.getAmount());
dto.setBarcode(barcode.getBarcode());
dto.setPartNumber(barcode.getPartNumber());
dto.setId(barcode.getId());
dto.setDescribe(barcode.getDescribe());
return dto;
}
/** /**
* 更新或清理(task为null)当前正在执行的任务 * 更新或清理(task为null)当前正在执行的任务
*/ */
......
...@@ -149,7 +149,7 @@ public class DeviceController { ...@@ -149,7 +149,7 @@ public class DeviceController {
try { try {
Barcode barcode = codeResolve.resolveOneValideBarcode(code); Barcode barcode = codeResolve.resolveOneValideBarcode(code);
for (DataLog dataLog : taskService.getAllTasks()) { for (DataLog dataLog : taskService.getQueueTasks()) {
// if(!dataLog.isPackageReel()){ // if(!dataLog.isPackageReel()){
//已经在任务当中,返回对应的信息 //已经在任务当中,返回对应的信息
if (dataLog.getBarcode().equals(barcode.getBarcode())) { if (dataLog.getBarcode().equals(barcode.getBarcode())) {
......
package com.neotel.smfcore.core.device.rest.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.*;
import java.io.Serializable;
import java.util.List;
import java.util.Map;
@Getter
@Setter
public class XLCPosBarcodeDto implements Serializable {
@ApiModelProperty(value = "ID")
private String id;
@ApiModelProperty("条码编号")
private String barcode;
@ApiModelProperty("料件编号")
private String partNumber;
@ApiModelProperty("数量")
private int amount;
@ApiModelProperty("描述")
private String describe;
/**
* 料箱中的物料信息
*/
@ApiModelProperty("料箱中的物料信息")
private List<XLCPosBarcodeDto> subCodeList;
}
package com.neotel.smfcore.core.device.rest.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.springframework.stereotype.Service;
import java.io.Serializable;
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
public class XLCPosDetailDto implements Serializable {
@ApiModelProperty("库位ID")
private String id;
@ApiModelProperty("料仓ID")
private String storageId;
@ApiModelProperty("库位号")
private String posName;
@ApiModelProperty("条码")
private XLCPosBarcodeDto barcode;
}
package com.neotel.smfcore.core.language.rest;
import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.common.utils.Constants;
import com.neotel.smfcore.common.utils.SecurityUtils;
import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.core.language.util.MessageUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
@Slf4j
@RestController
@RequiredArgsConstructor
@Api(tags = "设置:语言设置")
@RequestMapping("api/language")
public class LanguageSetController {
@Autowired
DataCache dataCache;
public List<String> getAllLanList() {
List<String> lanList = dataCache.getCache(Constants.CACHE_languageType);
if (lanList == null || lanList.size() <= 0) {
lanList=new ArrayList<>();
lanList.add(MessageUtils.ZH_CN);
lanList.add(MessageUtils.ZH_TW);
lanList.add(MessageUtils.EN_US);
lanList.add(MessageUtils.JA_JP);
dataCache.updateCache(Constants.CACHE_languageType, lanList);
}
return lanList;
}
@ApiOperation("获取语言列表")
@GetMapping
@PreAuthorize("@el.check('translation')")
public List<String> getList(){
return getAllLanList();
}
@ApiOperation("新增语言")
@PostMapping
@PreAuthorize("@el.check('translation')")
public ResponseEntity<Object> create( @RequestBody String languageType) {
//判断是否是admin
String userName= SecurityUtils.getCurrentUsername();
if(!userName.equals(Constants.SUPER_USERNAME)){
throw new ValidateException("smfcode.noLanguageSetAccess","没有编辑语言的权限");
}
if(languageType==null ){
throw new ValidateException("smfcode.languageCanotNull","语言类型不能为空" );
}
List<String> languageTypeList =getAllLanList();
if(!languageTypeList.contains(languageType)){
log.info("用户["+SecurityUtils.getCurrentUsername()+"] 新增语言:"+languageType);
languageTypeList.add(languageType);
dataCache.updateCache(Constants.CACHE_languageType, languageTypeList);
}
return new ResponseEntity<>(HttpStatus.CREATED);
}
@ApiOperation("删除指定语言")
@DeleteMapping
@PreAuthorize("@el.check('translation')")
public ResponseEntity<Object> delete(@RequestBody Set<String> languageTypes) {
//判断是否是admin
String userName = SecurityUtils.getCurrentUsername();
if (!userName.equals(Constants.SUPER_USERNAME)) {
throw new ValidateException("smfcode.noLanguageSetAccess", "没有编辑语言的权限");
}
List<String> languageTypeList = getAllLanList();
for (String type : languageTypes) {
if (type == null) {
throw new ValidateException("smfcode.languageCanotNull", "语言类型不能为空");
}
languageTypeList.remove(type);
log.info("用户["+SecurityUtils.getCurrentUsername()+"] 删除语言:"+type);
}
if (languageTypeList == null || languageTypeList.size() <= 0) {
throw new ValidateException("smfcode.languageCanotRemoveAll", "不能删除所有语言");
}
dataCache.updateCache(Constants.CACHE_languageType, languageTypeList);
return new ResponseEntity<>(HttpStatus.OK);
}
// @ApiOperation("修改语言列表")
// @PostMapping
// @PreAuthorize("@el.check('translation')")
// public ResultBean create(@RequestBody List<String> languageTypeList) {
// if(languageTypeList==null||languageTypeList.size()<=0){
// throw new ValidateException("smfcode.languageCanotNull","语言类型不能为空" );
// }
//
// //判断是否是admin
// String userName= SecurityUtils.getCurrentUsername();
// if(!userName.equals(Constants.SUPER_USERNAME)){
// throw new ValidateException("smfcode.noLanguageSetAccess","没有修改语言的权限");
// }
// dataCache.updateCache(Constants.CACHE_languageType, languageTypeList);
//
// return ResultBean.newOkResult("ok");
// }
}
package com.neotel.smfcore.core.language.rest.bean.dto;
import com.google.common.collect.Lists;
import com.neotel.smfcore.core.language.service.bean.Content;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Data
public class LanguageMsgDto implements Serializable {
@ApiModelProperty(value = "ID")
private String id;
@ApiModelProperty("资源code")
private String code;
@ApiModelProperty("默认值,文本内容")
private String msg;
@ApiModelProperty("设备类型,一般为code的第一个单词,smfcode:服务器")
private String type;
@ApiModelProperty("存放翻译内容List")
private List<Content> contentList = Lists.newArrayList();
// private Map<String,String> contentMap=new HashMap<>();
//
//
// public List<Content> GetContentList(){
// List<Content> list=new ArrayList<>();
// for (String key :
// contentMap.keySet()) {
// list.add(new Content(key,contentMap.get(key)));
// }
// return list;
// }
}
package com.neotel.smfcore.core.language.rest.bean.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.HashMap;
import java.util.Map;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class LanguageResourceDto {
@ApiModelProperty("语言类型")
private String lanCode;
@ApiModelProperty("资源集合,key=code")
private Map<String,String> resourceMap=new HashMap<>();
}
package com.neotel.smfcore.core.language.rest.bean.mapstruct;
import com.neotel.smfcore.common.base.BaseMapper;
import com.neotel.smfcore.core.language.rest.bean.dto.LanguageMsgDto;
import com.neotel.smfcore.core.language.service.po.LanguageMsg;
import org.mapstruct.Mapper;
import org.mapstruct.ReportingPolicy;
@Mapper(componentModel = "spring" ,unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface LanguageMsgMapper extends BaseMapper<LanguageMsgDto, LanguageMsg> {
}
package com.neotel.smfcore.core.language.rest.bean.query;
import com.neotel.smfcore.common.annotation.QueryCondition;
import com.neotel.smfcore.common.bean.BetweenData;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
@Data
public class LanguageMsgCriteria {
@QueryCondition(blurry = "code,type,msg")
private String blurry;
@QueryCondition(type = QueryCondition.Type.BETWEEN, propName = "updateDate")
@DateTimeFormat(pattern = "yyyy-MM-dd")
private BetweenData<Date> createDate;
@QueryCondition
@ApiModelProperty("编号")
private String code;
@QueryCondition
@ApiModelProperty("类型")
private String type;
@QueryCondition
@ApiModelProperty("默认内容")
private String msg;
@ApiModelProperty("翻译状态,全部时不发,1=已完成,2=未完成")
private Integer translationState;
}
package com.neotel.smfcore.core.language.service.bean; package com.neotel.smfcore.core.language.service.bean;
import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor;
/** /**
* Created by sunke on 2021/7/29. * Created by sunke on 2021/7/29.
*/ */
@Data @Data
@NoArgsConstructor
@AllArgsConstructor
public class Content { public class Content {
/** /**
......
package com.neotel.smfcore.core.language.service.dao;
import com.neotel.smfcore.common.base.IBaseDao;
public interface ILanguageMsgDao extends IBaseDao {
}
package com.neotel.smfcore.core.language.service.dao.impl;
import com.neotel.smfcore.common.base.AbstractBaseDao;
import com.neotel.smfcore.core.language.service.dao.ILanguageMsgDao;
import com.neotel.smfcore.core.language.service.po.LanguageMsg;
import org.springframework.stereotype.Service;
@Service
public class LanguageMsgDao extends AbstractBaseDao implements ILanguageMsgDao {
@Override
public Class getEntityClass() {
return LanguageMsg.class;
}
}
package com.neotel.smfcore.core.language.service.nanager;
import com.neotel.smfcore.common.base.IBaseManager;
import com.neotel.smfcore.core.language.service.po.LanguageMsg;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.Set;
public interface ILanguageMsgManager extends IBaseManager<LanguageMsg> {
void download(List<LanguageMsg> list, HttpServletResponse response) throws IOException;
LanguageMsg saveMsg(LanguageMsg msg);
void deleteMsgs(Set<String> ids);
void insertAll(List<LanguageMsg> languageMsgs);
List<String> findTypeList();
}
package com.neotel.smfcore.core.language.service.nanager.impl;
import cn.hutool.core.util.ObjectUtil;
import com.neotel.smfcore.common.bean.PageData;
import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.common.utils.Constants;
import com.neotel.smfcore.common.utils.FileUtil;
import com.neotel.smfcore.core.barcode.bean.PlateSizeBean;
import com.neotel.smfcore.core.barcode.service.po.Barcode;
import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.core.language.service.bean.Content;
import com.neotel.smfcore.core.language.service.dao.ILanguageMsgDao;
import com.neotel.smfcore.core.language.service.nanager.ILanguageMsgManager;
import com.neotel.smfcore.core.language.service.po.LanguageMsg;
import com.neotel.smfcore.core.language.util.MessageUtils;
import com.neotel.smfcore.core.storage.service.po.StoragePos;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.core.aggregation.Aggregation;
import org.springframework.data.mongodb.core.aggregation.AggregationResults;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.KPropertyPathExtensionsKt;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.*;
@Service
@Slf4j
public class LanguageMsgManagerImpl implements ILanguageMsgManager {
@Autowired
private ILanguageMsgDao languageMsgDao;
@Override
public LanguageMsg get(String id) {
return languageMsgDao.findOneById(id);
}
@Override
public LanguageMsg save(LanguageMsg object) throws ValidateException {
return languageMsgDao.save(object);
}
@Override
public void delete(LanguageMsg object) throws ValidateException {
languageMsgDao.removeOneById(object.getId());
}
@Override
public PageData<LanguageMsg> findByPage(Query query, Pageable pageable) {
int totalCount = languageMsgDao.countByQuery(query);
List<Barcode> barcodes = languageMsgDao.findByQuery(query, pageable);
return new PageData(barcodes, totalCount);
}
@Override
public List<LanguageMsg> findByQuery(Query query) {
return languageMsgDao.findByQuery(query);
}
@Autowired
DataCache dataCache;
public List<String> getAllLanList(){
List<String> lanList=dataCache.getCache(Constants.CACHE_languageType);
if(lanList==null||lanList.size()<=0){
lanList.add(MessageUtils. ZH_CN);
lanList.add(MessageUtils.ZH_TW);
lanList.add(MessageUtils.EN_US);
lanList.add(MessageUtils.JA_JP);
dataCache.updateCache(Constants.CACHE_languageType,lanList);
}
return lanList;
}
@Override
public void download(List<LanguageMsg> msgList, HttpServletResponse response) throws IOException {
List<Map<String, Object>> list = new ArrayList<>();
for (LanguageMsg msg : msgList) {
Map<String, Object> map = new LinkedHashMap<>();
map.put("编号", msg.getCode());
map.put("类型", msg.getType());
map.put("默认值", msg.getMsg());
List<String> lanList=getAllLanList();
for (String lanType :
lanList) {
map.put(lanType,msg.getContent(lanType));
}
// map.put("简体中文", msg.getContent(MessageUtils.ZH_CN));
// map.put("繁体中文", msg.getContent(MessageUtils.ZH_TW));
// map.put("英文", msg.getContent(MessageUtils.EN_US));
// map.put("日文", msg.getContent(MessageUtils.JA_JP));
list.add(map);
}
FileUtil.downloadExcel(list, response);
}
@Override
public LanguageMsg saveMsg(LanguageMsg resources) {
if (resources.getCode() == null) {
throw new ValidateException("smfcode.valueCanotNull", "{0}不能为空", new String[]{"code"});
}
if (resources.getMsg() == null) {
throw new ValidateException("smfcode.valueCanotNull", "{0}不能为空", new String[]{"msg"});
}
if (resources.getType() == null) {
throw new ValidateException("smfcode.valueCanotNull", "{0}不能为空", new String[]{"type"});
}
if (resources.getContentList() == null) {
resources.setContentList(new ArrayList<>());
}
Criteria c = Criteria.where("code").is(resources.getCode());
String logName = "新增资源:";
if (resources.getId() != null) {
logName = "修改资源:";
c.and("id").ne(resources.getId());
} //code不能重复
LanguageMsg result = languageMsgDao.findOne(new Query(c));
if (result != null) {
throw new ValidateException("smfcode.resourcesExist", "资源[" + resources.getCode() + "]已存在");
}
Query query = new Query(c);
List<Content> list = new ArrayList<>();
for (Content con :
resources.getContentList()) {
if (ObjectUtil.isEmpty(con.getLanCode()) || ObjectUtil.isEmpty(con.getMsg())) {
continue;
}
list.add(con);
}
resources.setContentList(list);
LanguageMsg saveResult = languageMsgDao.save(resources);
MessageUtils.updateMsg(saveResult);
return saveResult;
}
@Override
public void deleteMsgs(Set<String> ids) {
Query query = new Query(Criteria.where("id").in(ids));
List<LanguageMsg> languageMsgs = languageMsgDao.findByQuery(query);
String delnames = "";
for (LanguageMsg msg :
languageMsgs) {
delnames += "[" + msg.getCode() + "_" + msg.getMsg() + "]";
MessageUtils.removeMsg(msg);
}
languageMsgDao.removeByQuery(query);
log.info("手动删除资源:" + delnames + "完成");
}
@Override
public void insertAll(List<LanguageMsg> languageMsgs) {
languageMsgDao.insertAll(languageMsgs);
}
@Override
public List<String> findTypeList() {
Aggregation agg = Aggregation.newAggregation(
Aggregation.match(Criteria.where("type").exists(true)),
Aggregation.group("type").first("type").as("type")
);
AggregationResults<MsgType> results = languageMsgDao.getMongoTemplate().aggregate(agg, LanguageMsg.class, MsgType.class);
List<MsgType> types = results.getMappedResults();
List<String> result = new ArrayList<>();
for (MsgType type :
types) {
result.add(type.getType());
}
return result;
}
@Data
private class MsgType {
private String type;
}
}
package com.neotel.smfcore.core.language.service.po; package com.neotel.smfcore.core.language.service.po;
import cn.hutool.core.util.ObjectUtil;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
import com.neotel.smfcore.common.base.BasePo; import com.neotel.smfcore.common.base.BasePo;
...@@ -11,6 +12,7 @@ import org.springframework.data.annotation.Transient; ...@@ -11,6 +12,7 @@ import org.springframework.data.annotation.Transient;
import org.springframework.data.mongodb.core.mapping.Document; import org.springframework.data.mongodb.core.mapping.Document;
import java.io.Serializable; import java.io.Serializable;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
...@@ -18,17 +20,37 @@ import java.util.Map; ...@@ -18,17 +20,37 @@ import java.util.Map;
@Document @Document
public class LanguageMsg extends BasePo implements Serializable { public class LanguageMsg extends BasePo implements Serializable {
public LanguageMsg(){
}
public LanguageMsg(String code,String msg,String type) {
if (ObjectUtil.isEmpty(type)) {
int index = code.indexOf('.');
type = code.substring(0, index);
}
this.setUpdateDate(getCreateDate());
this.setCode(code);
this.setType(type);
this.setMsg(msg);
}
private String name; private String name;
/**
* 资源 code
*/
private String code; private String code;
/** /**
* 消息key,第一个.之前为设备名称 * 设备类型,一般为code的第一个单词
* smfcode:服务器
*
*/ */
private String key; private String type;
/** /**
* 默认值 * 默认值,文本内容
*/ */
private String msg; private String msg;
...@@ -37,4 +59,47 @@ public class LanguageMsg extends BasePo implements Serializable { ...@@ -37,4 +59,47 @@ public class LanguageMsg extends BasePo implements Serializable {
*/ */
private List<Content> contentList = Lists.newArrayList(); private List<Content> contentList = Lists.newArrayList();
/**
* 查找指定语言的内容
* @param lanCode
* @return
*/
public String getContent(String lanCode) {
if(ObjectUtil.isEmpty(lanCode)){
return getMsg();
}
for (Content con :
contentList) {
if(con.getLanCode().equals(lanCode)){
return con.getMsg();
}
}
return "";
}
public void setContent(String lanCode, String lanMsg) {
if(ObjectUtil.isEmpty(lanCode)){
setMsg(lanCode);
return;
}
for (Content con :
contentList) {
if (con.getLanCode().equals(lanCode)) {
con.setMsg(lanMsg);
return;
}
}
Content content = new Content(lanCode, lanMsg);
contentList.add(content);
}
public Map<String,String> GetContentMap(){
HashMap<String,String> map=new HashMap<>();
for (Content c :
contentList) {
map.put(c.getLanCode(),c.getMsg());
}
return map;
}
} }
package com.neotel.smfcore.core.language.util; package com.neotel.smfcore.core.language.util;
import cn.hutool.core.util.ObjectUtil;
import com.neotel.smfcore.core.language.service.bean.Content;
import com.neotel.smfcore.core.language.service.nanager.ILanguageMsgManager;
import com.neotel.smfcore.core.language.service.po.LanguageMsg;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource; import org.springframework.context.MessageSource;
import org.springframework.context.i18n.LocaleContextHolder; import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;
import java.text.MessageFormat; import javax.annotation.PostConstruct;
import java.util.Locale; import java.io.*;
import java.util.*;
/** /**
* 国际化工具类 * 资源缓存
* Created by sunke on 2021/7/30.
*/ */
@Component @Component
@Slf4j @Slf4j
public class MessageUtils { public class MessageUtils {
//-----------------以下为从配置文件读取资源-------------------------------------
public static Locale getDefaultLocal(){ public static Locale getDefaultLocal(){
return new Locale("zh-CH"); return new Locale("zh-CH");
} }
...@@ -47,4 +52,209 @@ public class MessageUtils { ...@@ -47,4 +52,209 @@ public class MessageUtils {
} }
} }
//-------------------------------------------------------------------------------
/**
* key=code
*/
private static Map<String, LanguageMsg> msgMap = new HashMap<>();
@Autowired
ILanguageMsgManager languageMsgManager;
public static final String ZH_CN = "zh-CN";
public static final String ZH_TW = "zh-TW";
public static final String EN_US = "en-US";
public static final String JA_JP = "ja-JP";
@PostConstruct
public void initialize() {
initLanguageMsgList();
}
// public static List<String> getAllLanList(){
//
//
// List<String> lanList=new ArrayList<>();
// lanList.add(ZH_CN);
// lanList.add(ZH_TW);
// lanList.add(EN_US);
// lanList.add(JA_JP);
// return lanList;
// }
// public static Locale getDefaultLocal(){
// return new Locale("zh-CH");
// }
// public static String getText(String msgKey, Locale locale,String defaultMsg) {
// return getText(msgKey,null, locale,defaultMsg);
// }
//
// public static String getText(String msgKey, String[] params, Locale locale, String defaultMsg) {
// try{
// String msg=getMessage(msgKey,locale.toLanguageTag(),defaultMsg);
// if (params == null) {
// return msg;
// } else {
// return MessageFormat.format(msg,params);
// }
// }catch (Exception ex){
// log.error("获取资源["+msgKey+"]["+defaultMsg+"]["+locale.getLanguage()+"]出错:"+ex.toString());
// if(defaultMsg != null){
// return defaultMsg;
// }
// return msgKey;
// }
// }
private static String getMessage(String msgKey, String lanType, String defaultMsg) {
if (msgMap != null) {
LanguageMsg msg = msgMap.get(msgKey);
if (msg != null) {
for (Content con :
msg.getContentList()) {
String lanT = con.getLanCode();
if (lanT.equals(lanType)) {
return con.getMsg();
}
}
log.info("获取资源[" + msgKey + "][" + defaultMsg + "][" + lanType + "]失败:未找到code[" + msgKey + "]对应语言[" + lanType + "]");
return msg.getMsg();
}
log.info("获取资源[" + msgKey + "][" + defaultMsg + "][" + lanType + "]失败:未找到code[" + msgKey + "]");
}
return defaultMsg;
}
public static void updateMsg(LanguageMsg msg) {
msgMap.put(msg.getCode(), msg);
}
public static void removeMsg(LanguageMsg msg) {
msgMap.remove(msg.getCode());
}
public static LanguageMsg getMsg(String code) {
return msgMap.get(code);
}
public static List<LanguageMsg> getLanMsgByType(String type) {
List<LanguageMsg> msgList=new ArrayList<>();
for (LanguageMsg msg :
msgMap.values()) {
if(msg.getType().equals(type)){
msgList.add(msg);
}
}
return msgList;
}
private Map<String, LanguageMsg> loadMsgMap() {
Map<String, LanguageMsg> msgMap = new HashMap<>();
List<LanguageMsg> msgs = languageMsgManager.findByQuery(new Query());
for (LanguageMsg msg :
msgs) {
msgMap.put(msg.getCode(), msg);
}
log.info("MessageCache共加载到" + msgMap.size() + "条Msg");
return msgMap;
}
private void initLanguageMsgList() {
msgMap = loadMsgMap();
if (msgMap.size() > 0) {
return;
}
String fielPath = "D:\\resources";
File file = new File(fielPath); //需要获取的文件的路径
if (file.exists() && file.isDirectory()) {
String[] fileNameLists = file.list(); //存储文件名的String数组
File[] filePathLists = file.listFiles(); //存储文件路径的String数组
Map<String, String> defaultLanMap = new HashMap<>();
Map<String, Map<String, String>> lanMsgMap = new HashMap<>();
for (int i = 0; i < filePathLists.length; i++) {
if (filePathLists[i].isFile()) {
String fileName = filePathLists[i].getName();
if (fileName.endsWith(".properties")) {
String lanType = fileName.replace("messages", "").replace(".properties", "");
if (ObjectUtil.isEmpty(lanType)) {
defaultLanMap = ReadPropertiesFile(filePathLists[i]);
log.info("MessageCache 从文件[" + fileName + "]中导入[" + defaultLanMap.size() + "]条默认资源");
} else {
String lan = lanType.substring(1);
lan = lan.replace('_', '-');
Map<String, String> map = ReadPropertiesFile(filePathLists[i]);
lanMsgMap.put(lan, map);
log.info("MessageCache 从文件[" + fileName + "]中导入[" + defaultLanMap.size() + "]条[" + lan + "]资源");
}
}
}
}
List<LanguageMsg> languageMsgs = new ArrayList<>();
for (String code :
defaultLanMap.keySet()) {
String defMsg = defaultLanMap.get(code);
// int index = code.indexOf('.');
// String type = code.substring(0, index);
// LanguageMsg msg = new LanguageMsg();
// msg.setUpdateDate(msg.getCreateDate());
// msg.setCode(code);
// msg.setType(type);
// msg.setMsg(defMsg);
LanguageMsg msg = new LanguageMsg(code, defMsg, "");
for (String lan :
lanMsgMap.keySet()) {
if (lanMsgMap.get(lan).containsKey(code)) {
String lanMsg = lanMsgMap.get(lan).get(code);
msg.setContent(lan, lanMsg);
}
}
languageMsgs.add(msg);
}
languageMsgManager.insertAll(languageMsgs);
}
msgMap = loadMsgMap();
}
public static Map<String, String> ReadPropertiesFile(File file) {
Map<String, String> map = new HashMap<>();
try (FileInputStream fis = new FileInputStream(file.getPath());
InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
BufferedReader br = new BufferedReader(isr)
) {
String line;
//网友推荐更加简洁的写法
while ((line = br.readLine()) != null) {
// 一次读入一行数据
// System.out.println(line);
String[] array = line.split("=");
if (array.length == 2) {
map.put(array[0].trim(), array[1].trim());
}
}
} catch (IOException e) {
log.error("ReadPropertiesFile 出错:" + e.toString());
e.printStackTrace();
}
return map;
}
} }
package com.neotel.smfcore.core.msd.bean;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
@Data
public class MSDSettiings implements Serializable {
/**
* 入库设置
* 0=每次确认是否开包
* 1=带包装(无开包时间)
* 2=不带包装(开包时间为入库时间)
*/
private int InputSet = 0;
/**
* 预警时间,提前小时
*/
private int prewarningTime = 2;
/**
* 最低温度
*/
private float minTemperature = 22.0F;
/**
* 最高温度
*/
private float maxTemperature = 38.0F;
/**
* 最低湿度值
*/
private float minHumidity = 0.0F;
/**
* 最大湿度值
*/
private float maxHumidity = 100.0F;
/**
* 等级列表
*/
private List<MSLSetInfo> mslSetList;
}
package com.neotel.smfcore.core.msd.bean;
import lombok.Data;
import java.io.Serializable;
@Data
public class MSLSetInfo implements Serializable {
/**
* MSL 等级
*/
private String msl;
/**
* 器件厚度
*/
private String thickness;
/**
* 保存时长(小时)
*/
private Integer timeHour;
}
package com.neotel.smfcore.core.msd.rest.bean.dto;
import com.neotel.smfcore.core.msd.bean.MSLSetInfo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.util.List;
@Getter
@Setter
public class MSDSettiingsDto implements Serializable {
@ApiModelProperty("入库设置,0=每次确认是否开包,1=带包装(无开包时间),2=不带包装(开包时间为入库时间)")
private int InputSet = 0;
@ApiModelProperty("预警时间,提前小时")
private int prewarningTime = 2;
@ApiModelProperty("最低温度")
private float minTemperature = 22.0F;
@ApiModelProperty("最高温度")
private float maxTemperature = 38.0F;
@ApiModelProperty("最低湿度值")
private float minHumidity = 0.0F;
@ApiModelProperty("最大湿度值")
private float maxHumidity = 100.0F;
@ApiModelProperty("等级列表")
private List<MSLSetInfo> mslSetList;
}
package com.neotel.smfcore.core.msd.rest.bean.mapstruct;
import com.neotel.smfcore.common.base.BaseMapper;
import com.neotel.smfcore.core.msd.bean.MSDSettiings;
import com.neotel.smfcore.core.msd.rest.bean.dto.MSDSettiingsDto;
import org.mapstruct.Mapper;
import org.mapstruct.ReportingPolicy;
@Mapper(componentModel = "spring" ,unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface MSDSettingsMapper extends BaseMapper<MSDSettiingsDto, MSDSettiings> {
}
...@@ -23,6 +23,7 @@ import com.neotel.smfcore.core.storage.enums.CHECKOUT_TYPE; ...@@ -23,6 +23,7 @@ import com.neotel.smfcore.core.storage.enums.CHECKOUT_TYPE;
import com.neotel.smfcore.core.storage.service.manager.IStoragePosManager; import com.neotel.smfcore.core.storage.service.manager.IStoragePosManager;
import com.neotel.smfcore.core.storage.service.po.Storage; import com.neotel.smfcore.core.storage.service.po.Storage;
import com.neotel.smfcore.core.storage.service.po.StoragePos; import com.neotel.smfcore.core.storage.service.po.StoragePos;
import com.neotel.smfcore.core.system.bean.MSDAppendInfo;
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;
...@@ -169,6 +170,7 @@ public class LiteOrderCache implements ITaskListener { ...@@ -169,6 +170,7 @@ public class LiteOrderCache implements ITaskListener {
task.setSubSourceId(barcode.getLockName()); task.setSubSourceId(barcode.getLockName());
task.setSubSourceInfo(barcode.getLockName()); task.setSubSourceInfo(barcode.getLockName());
task.setType(OP.CHECKOUT); task.setType(OP.CHECKOUT);
task.setPutInDate(barcode.getPutInDate());
task.setLightColor(nextColor.getRgb()); task.setLightColor(nextColor.getRgb());
task.setStatus(OP_STATUS.WAIT.name()); task.setStatus(OP_STATUS.WAIT.name());
taskService.addTaskToExecute(task); taskService.addTaskToExecute(task);
...@@ -428,23 +430,8 @@ public class LiteOrderCache implements ITaskListener { ...@@ -428,23 +430,8 @@ public class LiteOrderCache implements ITaskListener {
} }
public DataLog newTask(StoragePos pos) { public DataLog newTask(StoragePos pos) {
DataLog task = new DataLog();
Barcode barcode = pos.getBarcode();
if (barcode != null) {
task.setPartNumber(barcode.getPartNumber());
task.setBarcode(barcode.getBarcode());
task.setNum(barcode.getAmount());
task.setMemo(barcode.getMemo());
}
Storage storage = dataCache.getStorageById(pos.getStorageId()); Storage storage = dataCache.getStorageById(pos.getStorageId());
task.setCid(storage.getCid()); DataLog task = new DataLog(storage,pos.getBarcode(),pos);
task.setStorageId(storage.getId());
task.setStorageName(storage.getName());
task.setPosId(pos.getId());
task.setPosName(pos.getPosName());
return task; return task;
} }
......
...@@ -88,6 +88,27 @@ public class MaterialBoxController { ...@@ -88,6 +88,27 @@ public class MaterialBoxController {
} }
return barcodeDto; return barcodeDto;
} }
@ApiOperation("修改料盒描述信息")
@PostMapping("updateDescribe")
@PreAuthorize("@el.check('materialBox')")
public ResultBean updateDescribe(@RequestBody Map<String, String> paramMap) {
String code = paramMap.get("barcode");//料盒条码
String describe = paramMap.get("describe");//物料条码
Barcode barcode = barcodeManager.findByBarcode(code);
if (barcode == null) {
throw new ValidateException("smfcode.materialBox.invalid", "未找到料盒信息{0}", new String[]{code});
}
if(describe==null){
throw new ValidateException("smfcode.valueCanotNull","{0}不能为空",new String[]{"describe"} );
}
barcode.setDescribe(describe);
barcodeManager.saveBarcode(barcode);
log.info("更改料盒[" + code + "]的描述信息为:" + describe);
return ResultBean.newOkResult("");
}
@ApiOperation("取出物料") @ApiOperation("取出物料")
@PostMapping("exeOut") @PostMapping("exeOut")
......
...@@ -87,6 +87,7 @@ public class StoragePosController { ...@@ -87,6 +87,7 @@ public class StoragePosController {
Query query = QueryHelp.getQuery(criteria); Query query = QueryHelp.getQuery(criteria);
PageData<StoragePos> pages = storagePosManager.findByPage(query, pageable); PageData<StoragePos> pages = storagePosManager.findByPage(query, pageable);
List<StoragePosDto> StoragePosDtos = storagePosMapper.toDto(pages.getContent()); List<StoragePosDto> StoragePosDtos = storagePosMapper.toDto(pages.getContent());
return new PageData(StoragePosDtos, pages.getTotalElements()); return new PageData(StoragePosDtos, pages.getTotalElements());
} }
...@@ -298,7 +299,7 @@ public class StoragePosController { ...@@ -298,7 +299,7 @@ public class StoragePosController {
return new PageData(StoragePosDtos, pages.getTotalElements()); return new PageData(StoragePosDtos, pages.getTotalElements());
} }
@ApiOperation("查找出库") @ApiOperation("出库操作")
@PutMapping("/checkout") @PutMapping("/checkout")
public ResultBean checkout(@Validated @RequestBody CheckOutDto checkOutDto) { public ResultBean checkout(@Validated @RequestBody CheckOutDto checkOutDto) {
......
...@@ -62,4 +62,12 @@ public class StoragePosDto implements Serializable { ...@@ -62,4 +62,12 @@ public class StoragePosDto implements Serializable {
@ApiModelProperty("标签名称") @ApiModelProperty("标签名称")
private String labelName; private String labelName;
@ApiModelProperty("湿度")
private String humidity="";
@ApiModelProperty("温度")
private String temperature="";
} }
...@@ -29,6 +29,8 @@ public class StoragePosFindCriteria { ...@@ -29,6 +29,8 @@ public class StoragePosFindCriteria {
@QueryCondition(propName = "barcode.barcode") @QueryCondition(propName = "barcode.barcode")
@ApiModelProperty("条码") @ApiModelProperty("条码")
private String barcode; private String barcode;
@QueryCondition @QueryCondition
@ApiModelProperty("库位号") @ApiModelProperty("库位号")
private String posName; private String posName;
...@@ -66,4 +68,8 @@ public class StoragePosFindCriteria { ...@@ -66,4 +68,8 @@ public class StoragePosFindCriteria {
private String otherField4; private String otherField4;
@QueryCondition(blurry = "barcode.otherField5") @QueryCondition(blurry = "barcode.otherField5")
private String otherField5; private String otherField5;
@QueryCondition(propName = "barcode.msl")
@ApiModelProperty("等级")
private String msl;
} }
...@@ -32,4 +32,8 @@ public class StoragePosQueryCriteria { ...@@ -32,4 +32,8 @@ public class StoragePosQueryCriteria {
@ApiModelProperty("是否启用") @ApiModelProperty("是否启用")
@QueryCondition @QueryCondition
private Boolean enabled; private Boolean enabled;
@ApiModelProperty("是否使用")
@QueryCondition
private Boolean used;
} }
...@@ -55,4 +55,6 @@ public interface IStoragePosManager extends IBaseManager<StoragePos> { ...@@ -55,4 +55,6 @@ public interface IStoragePosManager extends IBaseManager<StoragePos> {
void clearLockPos(String lockId); void clearLockPos(String lockId);
StoragePos autoFindNextEmptyPos(Storage storage, Collection<String> excludePosIds,StoragePos currentPos); StoragePos autoFindNextEmptyPos(Storage storage, Collection<String> excludePosIds,StoragePos currentPos);
public void updateBarcodeMsd(String pn,String msl,String thickness);
} }
...@@ -408,6 +408,8 @@ public class StoragePosManagerImpl implements IStoragePosManager { ...@@ -408,6 +408,8 @@ public class StoragePosManagerImpl implements IStoragePosManager {
storagePosDao.updateMulti(query, Update.update("barcode.lockId","")); storagePosDao.updateMulti(query, Update.update("barcode.lockId",""));
} }
@Override @Override
public StoragePos autoFindNextEmptyPos(Storage storage, Collection<String> excludePosIds,StoragePos currentPos) { public StoragePos autoFindNextEmptyPos(Storage storage, Collection<String> excludePosIds,StoragePos currentPos) {
Criteria c = Criteria.where("storageId").is(storage.getId()); Criteria c = Criteria.where("storageId").is(storage.getId());
...@@ -441,5 +443,11 @@ public class StoragePosManagerImpl implements IStoragePosManager { ...@@ -441,5 +443,11 @@ public class StoragePosManagerImpl implements IStoragePosManager {
StoragePos pos = storagePosDao.findOne(query); StoragePos pos = storagePosDao.findOne(query);
return pos; return pos;
} }
@Override
public void updateBarcodeMsd(String pn,String msl,String thickness){
Query query = new Query( Criteria.where("barcode.partNumber").is(pn));
storagePosDao.updateMulti(query, Update.update("barcode.msl",msl));
storagePosDao.updateMulti(query, Update.update("barcode.thickness",thickness));
}
} }
package com.neotel.smfcore.core.system.bean;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* MSD附加信息
*/
@Data
public class MSDAppendInfo implements Serializable {
/**
* 等级
*/
private String msl="";
/**
* 器件厚度
*/
private String thickness="";
/**
* 开包时间
*/
private Date openTime;
}
package com.neotel.smfcore.core.system.rest;
import cn.hutool.core.util.ObjectUtil;
import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.common.utils.Constants;
import com.neotel.smfcore.common.utils.SecurityUtils;
import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.core.system.rest.bean.dto.ClientSettingDto;
import com.neotel.smfcore.core.system.rest.bean.dto.SysSettingsDto;
import com.neotel.smfcore.core.system.service.po.Settings;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
@Slf4j
@Api(tags = "界面:设置")
@RestController
@RequestMapping("/api/clientSettings")
@RequiredArgsConstructor
public class ClientSettingsController {
@Autowired
DataCache dataCache;
@ApiOperation("获取界面设置")
@GetMapping()
@PreAuthorize("@el.check('sysSetting')")
public ClientSettingDto getSettings(ClientSettingDto settingDto) {
if (settingDto == null || ObjectUtil.isEmpty(settingDto.getKey()) ) {
throw new ValidateException("smfcode.valueCanotNull", "{0}不能为空", new String[]{"key"});
}
//先查找自己的用户名,没找到时再找admin
String userName = SecurityUtils.getCurrentUsername();
String key = Constants.CACHE_clientSetting + "_" + userName + "_" + settingDto.getKey();
String value = dataCache.getCache(key);
if (ObjectUtil.isEmpty(value)) {
if (!userName.equals(Constants.SUPER_USERNAME)) {
key = Constants.CACHE_clientSetting + "_" + Constants.SUPER_USERNAME + "_" + settingDto.getKey();
value = dataCache.getCache(key);
}
}
settingDto.setValue(value);
return settingDto;
}
@ApiOperation("修改界面设置")
@PutMapping()
@PreAuthorize("@el.check('sysSetting')")
public ResultBean updateSettings(@RequestBody ClientSettingDto settingDto) {
if (settingDto == null || ObjectUtil.isEmpty(settingDto.getKey()) || ObjectUtil.isEmpty(settingDto.getValue())) {
throw new ValidateException("smfcode.valueCanotNull", "{0}不能为空", new String[]{"key"});
}
String userName = SecurityUtils.getCurrentUsername();
String key = Constants.CACHE_clientSetting + "_" + userName + "_" + settingDto.getKey();
dataCache.updateCache(key, settingDto.getValue());
// log.info("修改界面配置:[" + key + "]=[" + settingDto.getValue() + "]");
return ResultBean.newOkResult("");
}
}
package com.neotel.smfcore.core.system.rest.bean.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
@Getter
@Setter
public class ClientSettingDto implements Serializable {
@ApiModelProperty("设置的key")
private String key;
@ApiModelProperty("设置的值")
private String value;
}
package com.neotel.smfcore.core.system.rest.bean.dto; package com.neotel.smfcore.core.system.rest.bean.dto;
import com.neotel.smfcore.core.system.bean.MSDAppendInfo;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
...@@ -132,4 +133,11 @@ public class TaskDto implements Serializable { ...@@ -132,4 +133,11 @@ public class TaskDto implements Serializable {
@ApiModelProperty("创建时间") @ApiModelProperty("创建时间")
private Date createDate ; private Date createDate ;
@ApiModelProperty("MSD附加信息")
private MSDAppendInfo msdAppendInfo;
@ApiModelProperty("如果是出库任务,需要记录入库时间")
private Date putInDate;
} }
...@@ -9,10 +9,12 @@ import com.neotel.smfcore.core.device.enums.OP; ...@@ -9,10 +9,12 @@ import com.neotel.smfcore.core.device.enums.OP;
import com.neotel.smfcore.core.device.enums.OP_STATUS; import com.neotel.smfcore.core.device.enums.OP_STATUS;
import com.neotel.smfcore.core.storage.service.po.Storage; import com.neotel.smfcore.core.storage.service.po.Storage;
import com.neotel.smfcore.core.storage.service.po.StoragePos; import com.neotel.smfcore.core.storage.service.po.StoragePos;
import com.neotel.smfcore.core.system.bean.MSDAppendInfo;
import lombok.Data; import lombok.Data;
import org.springframework.data.mongodb.core.mapping.Document; import org.springframework.data.mongodb.core.mapping.Document;
import java.io.Serializable; import java.io.Serializable;
import java.util.Date;
import java.util.List; import java.util.List;
@Data @Data
...@@ -29,6 +31,12 @@ public class DataLog extends BasePo implements Serializable { ...@@ -29,6 +31,12 @@ public class DataLog extends BasePo implements Serializable {
setBarcode(barcode.getBarcode()); setBarcode(barcode.getBarcode());
setNum(barcode.getAmount()); setNum(barcode.getAmount());
setMemo(barcode.getMemo()); setMemo(barcode.getMemo());
setPutInDate(barcode.getPutInDate());
msdAppendInfo = new MSDAppendInfo();
msdAppendInfo.setMsl(barcode.getMsl());
msdAppendInfo.setOpenTime(barcode.getOpenTime());
msdAppendInfo.setThickness(barcode.getThickness());
} }
setCid(storage.getCid()); setCid(storage.getCid());
setStorageId(storage.getId()); setStorageId(storage.getId());
...@@ -37,6 +45,7 @@ public class DataLog extends BasePo implements Serializable { ...@@ -37,6 +45,7 @@ public class DataLog extends BasePo implements Serializable {
setPosId(pos.getId()); setPosId(pos.getId());
setPosName(pos.getPosName()); setPosName(pos.getPosName());
setStatus(OP_STATUS.WAIT.name()); setStatus(OP_STATUS.WAIT.name());
} }
/** /**
...@@ -191,6 +200,15 @@ public class DataLog extends BasePo implements Serializable { ...@@ -191,6 +200,15 @@ public class DataLog extends BasePo implements Serializable {
* 出库时记录此料在库时长 ,分钟 * 出库时记录此料在库时长 ,分钟
*/ */
private long inStoreTime=0l; private long inStoreTime=0l;
/**
* 如果是出库任务,需要记录入库时间
*/
private Date putInDate;
/**
* MSD附加信息
*/
private MSDAppendInfo msdAppendInfo;
public String getBarcode() { public String getBarcode() {
if(barcode == null){ if(barcode == null){
......
...@@ -73,11 +73,6 @@ public class TaskService { ...@@ -73,11 +73,6 @@ public class TaskService {
// } // }
// } // }
private void check(String barcode, String posName) throws ValidateException {
}
/** /**
* 条码入库,加入要执行的任务 * 条码入库,加入要执行的任务
*/ */
...@@ -87,6 +82,10 @@ public class TaskService { ...@@ -87,6 +82,10 @@ public class TaskService {
task.setType(OP.PUT_IN); task.setType(OP.PUT_IN);
task.setStatus(OP_STATUS.EXECUTING.name()); task.setStatus(OP_STATUS.EXECUTING.name());
if(barcode!=null){
barcode.setPutInTime(System.currentTimeMillis());
barcodeManager.saveBarcode(barcode);
}
String loginUser = SecurityUtils.getLoginUsername(); String loginUser = SecurityUtils.getLoginUsername();
task.setOperator(loginUser); task.setOperator(loginUser);
task = updateQueueTask(task); task = updateQueueTask(task);
...@@ -112,6 +111,7 @@ public class TaskService { ...@@ -112,6 +111,7 @@ public class TaskService {
DataLog task = new DataLog(storage, pos.getBarcode(), pos); DataLog task = new DataLog(storage, pos.getBarcode(), pos);
task.setType(OP.CHECKOUT); task.setType(OP.CHECKOUT);
task.setPutInDate(pos.getBarcode().getPutInDate());
task.setStatus(OP_STATUS.WAIT.name()); task.setStatus(OP_STATUS.WAIT.name());
task.setSingleOut(isSingleOut); task.setSingleOut(isSingleOut);
task.setOperator(opUserName); task.setOperator(opUserName);
...@@ -525,26 +525,8 @@ public class TaskService { ...@@ -525,26 +525,8 @@ public class TaskService {
} }
public DataLog newTask(StoragePos pos) { public DataLog newTask(StoragePos pos) {
DataLog task = new DataLog();
Barcode barcode = pos.getBarcode();
if (barcode != null) {
task.setPartNumber(barcode.getPartNumber());
task.setBarcode(barcode.getBarcode());
task.setNum(barcode.getAmount());
task.setMemo(barcode.getMemo());
}
Storage storage = dataCache.getStorageById(pos.getStorageId()); Storage storage = dataCache.getStorageById(pos.getStorageId());
task.setCid(storage.getCid()); DataLog task = new DataLog(storage,pos.getBarcode(),pos);
task.setStorageId(storage.getId());
task.setStorageName(storage.getName());
task.setPosId(pos.getId());
task.setPosName(pos.getPosName());
task.setStatus(OP_STATUS.WAIT.name());
return task; return task;
} }
......
...@@ -122,7 +122,24 @@ smfcode.materialBox.boxNoReel=\u6599\u76D2\u4E2D\u65E0\u7269\u6599 ...@@ -122,7 +122,24 @@ smfcode.materialBox.boxNoReel=\u6599\u76D2\u4E2D\u65E0\u7269\u6599
smfcode.materialBox.inPos=\u7269\u6599\u5DF2\u5728\u5E93\u4F4D{0}\u4E2D smfcode.materialBox.inPos=\u7269\u6599\u5DF2\u5728\u5E93\u4F4D{0}\u4E2D
smfcode.materialBox.inOtherBox=\u7269\u6599\u5DF2\u5728\u6599\u76D2{0}\u4E2D smfcode.materialBox.inOtherBox=\u7269\u6599\u5DF2\u5728\u6599\u76D2{0}\u4E2D
smfcore.materialBox=\u6599\u76D2\u64CD\u4F5C smfcore.materialBox=\u6599\u76D2\u64CD\u4F5C
smfcode.shelf.nextPos.hasReel=\u5E93\u4F4D[{0}]\u5DF2\u6709\u7269\u6599,\u8BF7\u91CD\u65B0\u626B\u63CF\u5E93\u4F4D\u7801
smfcode.shelf.nextPos.hasTask=\u5E93\u4F4D[{0}]\u5DF2\u6709\u4EFB\u52A1,\u8BF7\u91CD\u65B0\u626B\u63CF\u5E93\u4F4D\u7801
smfcode.shelf.notFound=\u672A\u627E\u5230\u6599\u67B6
smfcode.shelf.pos.notInStorage=\u6599\u67B6[{0}]\u4E2D\u672A\u627E\u5230\u5E93\u4F4D[{1}]
smfcode.shelf.pos.notInGroup=\u7EC4\u4E2D\u672A\u627E\u5230\u5E93\u4F4D[{0}]
smfcode.shelf.msg.hasReel=\u5E93\u4F4D\u4E2D[{0}]\u5DF2\u6709\u7269\u6599
smfcode.shelf.msg.tipScanReel=\u5E93\u4F4D[{0}]\u64CD\u4F5C\u6210\u529F,\u8BF7\u626B\u63CF\u8981\u653E\u5165\u7684\u7269\u6599
smfcode.shelf.msg.fastop=\u6761\u7801\u64CD\u4F5C\u9891\u7E41,\u8BF7\u7A0D\u540E\u518D\u8BD5
smfcode.shelf.msg.outConfirm=\u51FA\u5E93\u5B8C\u6210, \u5E93\u4F4D[{0}]\u706D\u706F
smfcode.shelf.msg.noTask=\u64CD\u4F5C\u5931\u8D25,\u5DF2\u5728\u5E93\u4F4D[{0}]\u4E2D,\u672A\u627E\u5230\u5BF9\u5E94\u7684\u51FA\u5E93\u4EFB\u52A1
smfcode.shelf.msg.scanPos=\u8BF7\u5148\u626B\u63CF\u5E93\u4F4D\u7801
smfcode.shelf.msg.inOk=\u64CD\u4F5C\u6210\u529F,\u8BF7\u653E\u5165\u5E93\u4F4D[{0}]
smfcode.label.noReel=\u672A\u627E\u5230\u53EF\u51FA\u5E93\u7684\u7269\u6599
smfcore.msd=MSD\u7BA1\u7406
smfcore.msdManage=MSD\u5E93\u5B58
smfcore.msdData=MSD\u8FFD\u6EAF\u6027
smfcore.msdSetting=MSD\u8BBE\u7F6E
smfcore.translation=\u8D44\u6E90\u7FFB\u8BD1
smfcode.languageCanotNull=\u8BED\u8A00\u7C7B\u578B\u4E0D\u80FD\u4E3A\u7A7A
smfcode.noLanguageSetAccess=\u6CA1\u6709\u7F16\u8F91\u8BED\u8A00\u7684\u6743\u9650
smfcode.languageCanotRemoveAll=\u4E0D\u80FD\u5220\u9664\u6240\u6709\u8BED\u8A00
\ No newline at end of file \ No newline at end of file
...@@ -60,39 +60,39 @@ smfcore.noconnecttion=No connecttion ...@@ -60,39 +60,39 @@ smfcore.noconnecttion=No connecttion
smfcore.loadMaterialFailed=Loading material failed:{0} smfcore.loadMaterialFailed=Loading material failed:{0}
smfcore.checkNg=checking material is ng:{0} smfcore.checkNg=checking material is ng:{0}
smfcore.loadMaterialFinished=Loading material finished: {0} smfcore.loadMaterialFinished=Loading material finished: {0}
smfcore.lockMaterial=Equipment kanban smfcore.lockMaterial=Equipment Performance Monitor
smfcore.lightGroup=Neo Light Grouping smfcore.lightGroup=Neo Light Grouping
smfcore.order=Material Management smfcore.order=Material Management
smfcore.workOrder=Work Order smfcore.workOrder=Work Order
smfcore.singleOuput=Check to Retrieve smfcore.singleOuput=Search
smfcore.system=Set smfcore.system=System
smfcore.bunker=Device Management smfcore.bunker=Equipment
smfcore.storagePos=Position Management smfcore.storagePos=Storage Location
smfcore.menu=Menu Management smfcore.menu=Menu Manager
smfcore.materiel =Archives Management smfcore.materiel =Product Info
smfcore.componentParts=Component smfcore.componentParts=Component
smfcore.barcode=Barcode smfcore.barcode=Material ID
smfcore.log=Log Management smfcore.log=Big Data
smfcore.taskLog=Material Log smfcore.taskLog=Material Log
smfcore.user=User Management smfcore.user=Users
smfcore.peoples=User Management smfcore.peoples=Users
smfcore.role=Role Management smfcore.role=Authority
smfcode.menuNotExist=Menu{0} does not exist smfcode.menuNotExist=Menu{0} does not exist
smfcode.noValidStorage=No available bin found in bin list smfcode.noValidStorage=No available bin found in bin list
smfcode.error.barcode.exist=[{0}}] is already in {1}}[{2}}] smfcode.error.barcode.exist=[{0}}] is already in {1}}[{2}}]
smfcore.barcodeSetting=Barcode setting smfcore.barcodeSetting=Material ID
smfcore.posNotExist=Positions do not exist smfcore.posNotExist=Positions do not exist
smfcore.error=Error{0} smfcore.error=Error{0}
smfcore.userManager=User Management smfcore.userManager=Users
smfcode.cannotRemove=Failed to delete the location, there is material in the location [{0}]. smfcode.cannotRemove=Failed to delete the location, there is material in the location [{0}].
smfcode.nogroupaccess=No operation rights for the group [{0}] smfcode.nogroupaccess=No operation rights for the group [{0}]
smfcore.outSetting=Material Retrieval Tatic smfcore.outSetting=Retrieval Method
smfcore.sysSetting=System Settings smfcore.sysSetting=System Setting
smfcore.help=Help smfcore.help=Help
smfcore.instruction=Instruction manual smfcore.instruction=Instruction manual
smfcore.about=About smfcore.about=About
smfcore.tacticsOuput=Strategies Retrival smfcore.tacticsOuput=Retrieval Method
smfcore.labelOuput=Material grouping smfcore.labelOuput=Grouping
smfcode.order.out.executing=Work orders are being executed smfcode.order.out.executing=Work orders are being executed
smfcode.order.out.notFound=Work order not found 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.maxOrder=The maximum number of executable work orders has been reached
...@@ -121,4 +121,25 @@ smfcode.materialBox.noReel=The corresponding material is not found in the materi ...@@ -121,4 +121,25 @@ smfcode.materialBox.noReel=The corresponding material is not found in the materi
smfcode.materialBox.boxNoReel=No material in the cassette smfcode.materialBox.boxNoReel=No material in the cassette
smfcode.materialBox.inPos=The material is already in the storage space {0} smfcode.materialBox.inPos=The material is already in the storage space {0}
smfcode.materialBox.inOtherBox=The material is already in the cassette {0} smfcode.materialBox.inOtherBox=The material is already in the cassette {0}
smfcore.materialBox=Cassette operation smfcore.materialBox=Container
smfcode.shelf.nextPos.hasReel=There is already material in the warehouse [{0}], please scan the warehouse code again.
smfcode.shelf.nextPos.hasTask=The library position [{0}] has an existing task, please re-scan the library code
smfcode.shelf.notFound=No shelf found
smfcode.shelf.pos.notInStorage=No storage space [{1}] was found in the shelf [{0}].
smfcode.shelf.pos.notInGroup=Library not found in group[{0}]
smfcode.shelf.msg.hasReel=There is already material in [{0}] in the storage space
smfcode.shelf.msg.tipScanReel=The operation of [{0}] is successful, please scan the material to be put in.
smfcode.shelf.msg.fastop=The barcode operation is frequent, please try again later
smfcode.shelf.msg.outConfirm=When the exit of the warehouse is completed, the light of the warehouse position [{0}] goes out
smfcode.shelf.msg.noTask=The operation failed, and the corresponding outgoing task was not found in the storage location [{0}]
smfcode.shelf.msg.scanPos=Please scan the library code first
smfcode.shelf.msg.inOk=The operation is successful, please put it into the storage space[{0}]
smfcode.label.noReel=Material not found for release
smfcore.msd=MSD Management
smfcore.msdManage=MSD Inventory
smfcore.msdData=MSD Traceability
smfcore.msdSetting=MSD Setting
smfcore.translation=Resource Translation
smfcode.languageCanotNull=Language type cannot be empty
smfcode.noLanguageSetAccess=No permission to edit the language
smfcode.languageCanotRemoveAll=Cannot delete all languages
...@@ -121,4 +121,25 @@ smfcode.materialBox.noReel=\u30AB\u30BB\u30C3\u30C8\u5185\u306B\u8A72\u5F53\u305 ...@@ -121,4 +121,25 @@ smfcode.materialBox.noReel=\u30AB\u30BB\u30C3\u30C8\u5185\u306B\u8A72\u5F53\u305
smfcode.materialBox.boxNoReel=\u30AB\u30BB\u30C3\u30C8\u306B\u7D20\u6750\u304C\u306A\u3044 smfcode.materialBox.boxNoReel=\u30AB\u30BB\u30C3\u30C8\u306B\u7D20\u6750\u304C\u306A\u3044
smfcode.materialBox.inPos=\u3059\u3067\u306B\u5728\u5EAB\u306E\u3042\u308B\u7D20\u6750 {0} smfcode.materialBox.inPos=\u3059\u3067\u306B\u5728\u5EAB\u306E\u3042\u308B\u7D20\u6750 {0}
smfcode.materialBox.inOtherBox=\u30AB\u30BB\u30C3\u30C8\u306B\u65E2\u306B\u5165\u3063\u3066\u3044\u308B\u7D20\u6750 {0} smfcode.materialBox.inOtherBox=\u30AB\u30BB\u30C3\u30C8\u306B\u65E2\u306B\u5165\u3063\u3066\u3044\u308B\u7D20\u6750 {0}
smfcore.materialBox=\u30AB\u30BB\u30C3\u30C8\u64CD\u4F5C
\ No newline at end of file \ No newline at end of file
smfcore.materialBox=\u30AB\u30BB\u30C3\u30C8\u64CD\u4F5C
smfcode.shelf.nextPos.hasReel=\u30B9\u30C8\u30A2[{0}]\u306B\u3059\u3067\u306B\u7D20\u6750\u304C\u3042\u308A\u307E\u3059\u3002\u30B9\u30C8\u30A2\u30B3\u30FC\u30C9\u3092\u518D\u30B9\u30AD\u30E3\u30F3\u3057\u3066\u304F\u3060\u3055\u3044\u3002
smfcode.shelf.nextPos.hasTask=[0}]\u65E2\u5B58\u306E\u30BF\u30B9\u30AF\u3001\u518D\u30B9\u30AD\u30E3\u30F3\u3057\u3066\u304F\u3060\u3055\u3044
smfcode.shelf.notFound=\u68DA\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093
smfcode.shelf.pos.notInStorage=\u68DA[{0}]\u306B\u53CE\u7D0D\u30B9\u30DA\u30FC\u30B9[{1}]\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093
smfcode.shelf.pos.notInGroup=\u30ED\u30B1\u30FC\u30B7\u30E7\u30F3\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093 [{0}]
smfcode.shelf.msg.hasReel=\u5834\u6240 [{0}] \u65E2\u5B58\u306E\u7D20\u6750
smfcode.shelf.msg.tipScanReel=\u30DD\u30B8\u30B7\u30E7\u30F3[{0}]\u304C\u6210\u529F\u3057\u305F\u306E\u3067\u3001\u6295\u5165\u3059\u308B\u7D20\u6750\u3092\u30B9\u30AD\u30E3\u30F3\u3057\u3066\u304F\u3060\u3055\u3044
smfcode.shelf.msg.fastop=\u983B\u7E41\u306B\u52D5\u4F5C\u3059\u308B\u305F\u3081\u3001\u5F8C\u3067\u3082\u3046\u4E00\u5EA6\u304A\u8A66\u3057\u304F\u3060\u3055\u3044
smfcode.shelf.msg.outConfirm=\u9000\u51FA\u304C\u5B8C\u4E86\u3057\u3001[{0}]\u3067\u6D88\u706F\u3057\u3066\u3044\u307E\u3059
smfcode.shelf.msg.noTask=\u5009\u5EAB\u306E\u4F4D\u7F6E[{0}]\u306B\u5BFE\u5FDC\u3059\u308B\u9001\u51FA\u30BF\u30B9\u30AF\u304C\u898B\u3064\u304B\u3089\u306A\u304B\u3063\u305F\u305F\u3081\u3001\u64CD\u4F5C\u306B\u5931\u6557\u3057\u307E\u3057\u305F
smfcode.shelf.msg.scanPos=\u307E\u305A\u306F\u30E9\u30A4\u30D6\u30E9\u30EA\u30B3\u30FC\u30C9\u3092\u30B9\u30AD\u30E3\u30F3\u3057\u3066\u304F\u3060\u3055\u3044
smfcode.shelf.msg.inOk=\u64CD\u4F5C\u306F\u6210\u529F\u3057\u3066\u3044\u307E\u3059\u304C\u3001\u53CE\u7D0D\u30B9\u30DA\u30FC\u30B9\u306B\u300C{0}\u300D\u3092\u5165\u308C\u3066\u304F\u3060\u3055\u3044
smfcode.label.noReel=\u6750\u6599\u304C\u898B\u3064\u304B\u3089\u306A\u3044
smfcore.msd=MSD\u7BA1\u7406
smfcore.msdManage=MSD\u5E93\u5B58
smfcore.msdData=MSD\u8FFD\u6EAF\u6027
smfcore.msdSetting=MSD\u8BBE\u7F6E
smfcore.translation=\u30EA\u30BD\u30FC\u30B9\u306E\u7FFB\u8A33
smfcode.languageCanotNull=\u8A00\u8A9E\u30BF\u30A4\u30D7\u306F\u7A7A\u3067\u306F\u3042\u308A\u307E\u305B\u3093
smfcode.noLanguageSetAccess=\u8A00\u8A9E\u3092\u7DE8\u96C6\u3059\u308B\u6A29\u9650\u304C\u306A\u3044
smfcode.languageCanotRemoveAll=\u3059\u3079\u3066\u306E\u8A00\u8A9E\u3092\u524A\u9664\u3067\u304D\u306A\u3044
\ No newline at end of file \ No newline at end of file
...@@ -121,4 +121,25 @@ smfcode.materialBox.noReel=\u6599\u76D2\u4E2D\u672A\u627E\u5230\u5BF9\u5E94\u726 ...@@ -121,4 +121,25 @@ smfcode.materialBox.noReel=\u6599\u76D2\u4E2D\u672A\u627E\u5230\u5BF9\u5E94\u726
smfcode.materialBox.boxNoReel=\u6599\u76D2\u4E2D\u65E0\u7269\u6599 smfcode.materialBox.boxNoReel=\u6599\u76D2\u4E2D\u65E0\u7269\u6599
smfcode.materialBox.inPos=\u7269\u6599\u5DF2\u5728\u5E93\u4F4D{0}\u4E2D smfcode.materialBox.inPos=\u7269\u6599\u5DF2\u5728\u5E93\u4F4D{0}\u4E2D
smfcode.materialBox.inOtherBox=\u7269\u6599\u5DF2\u5728\u6599\u76D2{0}\u4E2D smfcode.materialBox.inOtherBox=\u7269\u6599\u5DF2\u5728\u6599\u76D2{0}\u4E2D
smfcore.materialBox=\u6599\u76D2\u64CD\u4F5C
\ No newline at end of file \ No newline at end of file
smfcore.materialBox=\u6599\u76D2\u64CD\u4F5C
smfcode.shelf.nextPos.hasReel=\u5E93\u4F4D[{0}]\u5DF2\u6709\u7269\u6599,\u8BF7\u91CD\u65B0\u626B\u63CF\u5E93\u4F4D\u7801
smfcode.shelf.nextPos.hasTask=\u5E93\u4F4D[{0}]\u5DF2\u6709\u4EFB\u52A1,\u8BF7\u91CD\u65B0\u626B\u63CF\u5E93\u4F4D\u7801
smfcode.shelf.notFound=\u672A\u627E\u5230\u6599\u67B6
smfcode.shelf.pos.notInStorage=\u6599\u67B6[{0}]\u4E2D\u672A\u627E\u5230\u5E93\u4F4D[{1}]
smfcode.shelf.pos.notInGroup=\u7EC4\u4E2D\u672A\u627E\u5230\u5E93\u4F4D[{0}]
smfcode.shelf.msg.hasReel=\u5E93\u4F4D\u4E2D[{0}]\u5DF2\u6709\u7269\u6599
smfcode.shelf.msg.tipScanReel=\u5E93\u4F4D[{0}]\u64CD\u4F5C\u6210\u529F,\u8BF7\u626B\u63CF\u8981\u653E\u5165\u7684\u7269\u6599
smfcode.shelf.msg.fastop=\u6761\u7801\u64CD\u4F5C\u9891\u7E41,\u8BF7\u7A0D\u540E\u518D\u8BD5
smfcode.shelf.msg.outConfirm=\u51FA\u5E93\u5B8C\u6210, \u5E93\u4F4D[{0}]\u706D\u706F
smfcode.shelf.msg.noTask=\u64CD\u4F5C\u5931\u8D25,\u5DF2\u5728\u5E93\u4F4D[{0}]\u4E2D,\u672A\u627E\u5230\u5BF9\u5E94\u7684\u51FA\u5E93\u4EFB\u52A1
smfcode.shelf.msg.scanPos=\u8BF7\u5148\u626B\u63CF\u5E93\u4F4D\u7801
smfcode.shelf.msg.inOk=\u64CD\u4F5C\u6210\u529F,\u8BF7\u653E\u5165\u5E93\u4F4D[{0}]
smfcode.label.noReel=\u672A\u627E\u5230\u53EF\u51FA\u5E93\u7684\u7269\u6599
smfcore.msd=MSD\u7BA1\u7406
smfcore.msdManage=MSD\u5E93\u5B58
smfcore.msdData=MSD\u8FFD\u6EAF\u6027
smfcore.msdSetting=MSD\u8BBE\u7F6E
smfcore.translation=\u8D44\u6E90\u7FFB\u8BD1
smfcode.languageCanotNull=\u8BED\u8A00\u7C7B\u578B\u4E0D\u80FD\u4E3A\u7A7A
smfcode.noLanguageSetAccess=\u6CA1\u6709\u7F16\u8F91\u8BED\u8A00\u7684\u6743\u9650
smfcode.languageCanotRemoveAll=\u4E0D\u80FD\u5220\u9664\u6240\u6709\u8BED\u8A00
\ No newline at end of file \ No newline at end of file
...@@ -121,4 +121,25 @@ smfcode.materialBox.noReel=\u6599\u76D2\u4E2D\u672A\u627E\u5230\u5C0D\u61C9\u726 ...@@ -121,4 +121,25 @@ smfcode.materialBox.noReel=\u6599\u76D2\u4E2D\u672A\u627E\u5230\u5C0D\u61C9\u726
smfcode.materialBox.boxNoReel=\u6599\u76D2\u4E2D\u7121\u7269\u6599 smfcode.materialBox.boxNoReel=\u6599\u76D2\u4E2D\u7121\u7269\u6599
smfcode.materialBox.inPos=\u7269\u6599\u5DF2\u5728\u5EAB\u4F4D{0}\u4E2D smfcode.materialBox.inPos=\u7269\u6599\u5DF2\u5728\u5EAB\u4F4D{0}\u4E2D
smfcode.materialBox.inOtherBox=\u7269\u6599\u5DF2\u5728\u6599\u76D2{0}\u4E2D smfcode.materialBox.inOtherBox=\u7269\u6599\u5DF2\u5728\u6599\u76D2{0}\u4E2D
smfcore.materialBox=\u6599\u76D2\u64CD\u4F5C
\ No newline at end of file \ No newline at end of file
smfcore.materialBox=\u6599\u76D2\u64CD\u4F5C
smfcode.shelf.nextPos.hasReel=\u5EAB\u4F4D[{0}]\u5DF2\u6709\u7269\u6599\uFF0C\u8ACB\u91CD\u65B0\u6383\u63CF\u5EAB\u4F4D\u78BC
smfcode.shelf.nextPos.hasTask=\u5EAB\u4F4D[{0}]\u5DF2\u6709\u4EFB\u52D9\uFF0C\u8ACB\u91CD\u65B0\u6383\u63CF\u5EAB\u4F4D\u78BC
smfcode.shelf.notFound=\u672A\u627E\u5230\u6599\u67B6
smfcode.shelf.pos.notInStorage=\u6599\u67B6[{0}]\u4E2D\u672A\u627E\u5230\u5EAB\u4F4D[{1}]
smfcode.shelf.pos.notInGroup=\u7D44\u4E2D\u672A\u627E\u5230\u5EAB\u4F4D[{0}]
smfcode.shelf.msg.hasReel=\u5EAB\u4F4D[{0}]\u4E2D\u5DF2\u6709\u7269\u6599
smfcode.shelf.msg.tipScanReel=\u5EAB\u4F4D[{0}]\u64CD\u4F5C\u6210\u529F\uFF0C\u8ACB\u6383\u63CF\u8981\u653E\u5165\u7684\u7269\u6599
smfcode.shelf.msg.fastop=\u689D\u78BC\u64CD\u4F5C\u983B\u7E41\uFF0C\u8ACB\u7A0D\u5F8C\u518D\u8A66
smfcode.shelf.msg.outConfirm=\u51FA\u5EAB\u5B8C\u6210\uFF0C\u5EAB\u4F4D[{0}]\u6EC5\u71C8
smfcode.shelf.msg.noTask=\u64CD\u4F5C\u5931\u6557\uFF0C\u5DF2\u5728\u5EAB\u4F4D[{0}]\u4E2D\uFF0C\u672A\u627E\u5230\u5C0D\u61C9\u7684\u51FA\u5EAB\u4EFB\u52D9
smfcode.shelf.msg.scanPos=\u6E05\u9592\u6383\u63CF\u5EAB\u4F4D\u78BC
smfcode.shelf.msg.inOk=\u64CD\u4F5C\u6210\u529F\uFF0C\u8ACB\u653E\u5165\u5EAB\u4F4D[{0}]
smfcode.label.noReel=\u672A\u627E\u5230\u53EF\u51FA\u5EAB\u7684\u7269\u6599
smfcore.msd=MSD\u7BA1\u7406
smfcore.msdManage=MSD\u5E93\u5B58
smfcore.msdData=MSD\u8FFD\u6EAF\u6027
smfcore.msdSetting=MSD\u8A2D\u7F6E
smfcore.translation=\u8CC7\u6E90\u7FFB\u8B6F
smfcode.languageCanotNull=\u8A9E\u8A00\u985E\u578B\u4E0D\u80FD\u70BA\u7A7A
smfcode.noLanguageSetAccess=\u6C92\u6709\u7DE8\u8F2F\u8A9E\u8A00\u7684\u6B0A\u9650
smfcode.languageCanotRemoveAll=\u4E0D\u80FD\u522A\u9664\u6240\u6709\u8A9E\u8A00
\ No newline at end of file \ No newline at end of file
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!