Commit 9445d90f sunke

Merge remote-tracking branch 'origin/master'

2 个父辈 059e83fc 13011d6e
正在显示 50 个修改的文件 包含 2174 行增加100 行删除
......@@ -198,6 +198,24 @@ public class DataInitManager {
manualOut.setHidden(true);
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 menuStorage = new Menu(new ArrayList<Menu>(), 1, "storage:list", "设备管理", 1, "bunker", "storage/storage/index", "", 0, "database");
......@@ -206,24 +224,15 @@ public class DataInitManager {
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 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);
outSet.setHidden(true);
sysSet.setHidden(true);
// menuMenu.setHidden(true);
// sysSetting.setHidden(true);
menus.addAll(createMenus(poutSet, menuStorage, menuStoragePos, menuMenu, sysSetting,outSet,sysSet));
//物料管理:元器件管理,条形码管理
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));
menus.addAll(createMenus(poutSet, menuStorage, menuStoragePos, menuMenu, sysSetting,outSet,sysSet,translationSet));
//日志管理:物料日志
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 {
public static final String CACHE_StopJob="stopJob";
/**
* 出库方式类型 出库策略配置
*出库策略配置: 出库方式类型
*/
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;
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.QueryHelp;
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.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.po.Barcode;
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.ApiOperation;
import lombok.RequiredArgsConstructor;
......@@ -38,6 +41,9 @@ public class ComponentController {
@Autowired
private final ComponentMapper componentMapper;
@Autowired
private final IStoragePosManager storagePosManager;
@ApiOperation("导出元器件信息")
@GetMapping(value = "/download")
public void download(HttpServletResponse response, ComponentQueryCriteria criteria) throws Exception {
......@@ -73,6 +79,14 @@ public class ComponentController {
throw new ValidateException("smfcode.valueCanotNull","{0}不能为空",new String[]{"ID"} );
}
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);
}
@ApiOperation("删除元器件")
......
package com.neotel.smfcore.core.barcode.rest.bean.dto;
import cn.hutool.core.date.DateTime;
import com.google.common.collect.Lists;
import com.neotel.smfcore.core.barcode.enums.BARCODE_STATUS;
import com.neotel.smfcore.core.barcode.enums.COMPONENT_TYPE;
......@@ -10,6 +11,8 @@ import lombok.Setter;
import org.springframework.data.annotation.Transient;
import java.io.Serializable;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;
......@@ -68,6 +71,7 @@ public class BarcodeDto implements Serializable {
@ApiModelProperty("批次")
private String batch;
@ApiModelProperty("等级")
private String msl;
//备用字段1(配套单号))或 family
......@@ -196,12 +200,19 @@ public class BarcodeDto implements Serializable {
@ApiModelProperty("锁定名")
private String lockName;
/**
* 原始条码
*/
@ApiModelProperty("原始条码")
private String fullCode;
@ApiModelProperty("开包时间")
private Date openTime;
@ApiModelProperty("描述")
private String describe;
@ApiModelProperty("器件厚度")
private String thickness="";
public String getSize(){
return (""+plateSize+"X"+height);
......@@ -211,4 +222,12 @@ public class BarcodeDto implements Serializable {
* 料箱中的物料信息
*/
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 {
@ApiModelProperty("展示的图片")
private String showImg = "";
@ApiModelProperty("厚度")
private String thickness="";
@ApiModelProperty("有效时长(生产日期+此天数为过期日期),设置默认有效期为2年")
private int validDay = 0;
......
package com.neotel.smfcore.core.barcode.service.po;
import cn.hutool.core.date.DateTime;
import com.google.common.collect.Lists;
import com.neotel.smfcore.common.base.BasePo;
import com.neotel.smfcore.common.utils.DateUtil;
......@@ -86,6 +87,9 @@ public class Barcode extends BasePo implements Serializable {
* 批次
*/
private String batch="";
/**
* 等级
*/
private String msl;
//备用字段1(配套单号))或 family
......@@ -135,7 +139,7 @@ public class Barcode extends BasePo implements Serializable {
private long startWarmTime = -1;
/**
* 入库时间
* 最后一次 入库时间
*/
private Date putInDate;
......@@ -206,8 +210,24 @@ public class Barcode extends BasePo implements Serializable {
* 原始条码
*/
private String fullCode;
/**
* 开包时间
*/
private Date openTime;
/**
* 描述
*/
private String describe;
/**
* 厚度
* 请选择
*<2.1mm
* 2.1mm~3.1mm
* >=3.1mm
*/
private String thickness="";
/**
* 添加相关联条码
*
* @param relationCode
......@@ -226,9 +246,9 @@ public class Barcode extends BasePo implements Serializable {
public void setPutInTime(long putInTime) {
if (this.putInTime == -1) {
this.putInTime = putInTime;
this.putInDate = new Date(putInTime);
}
this.putInDate = new Date(putInTime);
status = BARCODE_STATUS.IN_STORE;
updateExpTime();
......
......@@ -135,6 +135,20 @@ public class Component extends BasePo implements Serializable {
private String showImg = "";
/**
* 厚度
* 请选择
*<2.1mm
* 2.1mm~3.1mm
* >=3.1mm
*/
private String thickness="";
/**
* 是否有包装,默认无
*/
private boolean MBB=false;
/**
* 有效时长(生产日期+此天数为过期日期),设置默认有效期为2年
*/
private int validDay = 0;
......
......@@ -61,7 +61,7 @@ public class BaseDeviceHandler implements IDeviceHandler {
private IHumitureManager humitureManager;
@Autowired
private IBarcodeManager barcodeManager;
protected IBarcodeManager barcodeManager;
@Autowired
protected TaskService taskService;
......
......@@ -143,6 +143,10 @@ public class SensorShelfHandler extends BaseDeviceHandler {
dataLog.setBarcode(reelId);
dataLog.setPartNumber(pn);
dataLog.setType(OP.PUT_IN);
barcode.setPutInTime(System.currentTimeMillis());
barcodeManager.saveBarcode(barcode);
dataLog.setNum(barcode.getAmount());
dataLog.setStatus(OP_STATUS.WAIT.name());
dataLog.setGroupId(groupId);
......
package com.neotel.smfcore.core.device.handler.impl;
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.core.barcode.service.po.Barcode;
import com.neotel.smfcore.core.device.api.IOpAuthApi;
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.enums.BOX_STATUS;
import com.neotel.smfcore.core.device.enums.OP;
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.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.system.service.po.DataLog;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
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.util.ObjectUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
@Service
//北京方仓
@RestController
@Api(tags = "XLC方仓")
@Slf4j
public class XLCBoxHandler extends BaseDeviceHandler {
public XLCBoxHandler(List<IOpAuthApi> apiList) {
super(apiList);
}
@Autowired
private IStoragePosManager storagePosManager;
@Autowired
private StoragePosMapper storagePosMapper;
/**
* 当前出入库操作的库位(key为cid, value为当前执行的任务)
*/
......@@ -39,6 +69,69 @@ public class XLCBoxHandler extends BaseDeviceHandler {
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)当前正在执行的任务
*/
......
......@@ -149,7 +149,7 @@ public class DeviceController {
try {
Barcode barcode = codeResolve.resolveOneValideBarcode(code);
for (DataLog dataLog : taskService.getAllTasks()) {
for (DataLog dataLog : taskService.getQueueTasks()) {
// if(!dataLog.isPackageReel()){
//已经在任务当中,返回对应的信息
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 cn.hutool.core.util.ObjectUtil;
import com.neotel.smfcore.common.bean.PageData;
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.FileUtil;
import com.neotel.smfcore.common.utils.QueryHelp;
import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.core.language.rest.bean.dto.LanguageMsgDto;
import com.neotel.smfcore.core.language.rest.bean.dto.LanguageResourceDto;
import com.neotel.smfcore.core.language.rest.bean.mapstruct.LanguageMsgMapper;
import com.neotel.smfcore.core.language.rest.bean.query.LanguageMsgCriteria;
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 com.neotel.smfcore.core.language.util.MessageUtils;
import com.neotel.smfcore.security.annotation.AnonymousAccess;
import com.neotel.smfcore.security.bean.FileProperties;
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.data.domain.Pageable;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.*;
@Slf4j
@RestController
@RequiredArgsConstructor
@Api(tags = "设置:资源翻译")
@RequestMapping("api/translation")
public class LanguageMsgController {
@Autowired
ILanguageMsgManager languageMsgManager;
@Autowired
LanguageMsgMapper languageMsgMapper;
@Autowired
private final FileProperties properties;
@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("导入资源文件")
@PostMapping(value = "/upload")
public ResultBean upload(@RequestParam MultipartFile uploadFile) throws Exception {
// 验证文件上传的格式
String smfcodeType = "properties";
String smfclientType = "js";
String fileType = FileUtil.getExtensionName(uploadFile.getOriginalFilename());
if (fileType == null) {
throw new ValidateException("smfcode.feleFormatError", "文件格式错误!, 仅支持{0}格式", new String[]{smfclientType + "/" + smfcodeType});
}
if ((!smfclientType.contains(fileType)) && !smfcodeType.contains(fileType)) {
throw new ValidateException("smfcode.feleFormatError", "文件格式错误!, 仅支持{0}格式", new String[]{smfclientType + "/" + smfcodeType});
}
File folder = new File(properties.getPath(), "resource");
File file = FileUtil.upload(uploadFile, folder.getAbsolutePath());
String resultMsg = "";
//只能新增不能修改
String lanType = getLanTypeByFileName(uploadFile.getOriginalFilename());
if (smfclientType.contains(fileType)) {
//客户端js文件处理
Map<String, String> proMap = readJsFile(file);
resultMsg = ResourceUpload(uploadFile.getOriginalFilename(), proMap, lanType, "smfclient");
} else if (smfcodeType.contains(fileType)) {
Map<String, String> proMap = MessageUtils.ReadPropertiesFile(file);
resultMsg = ResourceUpload(uploadFile.getOriginalFilename(), proMap, lanType, "");
}
return ResultBean.newOkResult(resultMsg);
}
@ApiOperation("导出资源文件")
@GetMapping(value = "/download")
public void download(HttpServletResponse response, LanguageMsgCriteria criteria) throws Exception {
Query query = QueryHelp.getQuery(criteria);
int languageSize=getAllLanList().size();
if (criteria.getTranslationState() != null) {
if (criteria.getTranslationState() == 1) {
// db.getCollection('languageMsg').find({contentList:{$elemMatch:{lanCode:"en-US"}}})
// query.addCriteria(Criteria.where("contentList").elemMatch(Criteria.where("lanCode").is(MessageUtils.EN_US)));
// db.getCollection('languageMsg').find({contentList:{"$size":4}})
query.addCriteria(Criteria.where("contentList").size(languageSize));
} else if (criteria.getTranslationState() == 2) {
// db.getCollection("Array").find({ $where: "this.vendor.length <= 0" })//数组length<= 0
String proName="contentList."+(languageSize-1);
query.addCriteria(Criteria.where(proName).exists(false));
}
}
List<LanguageMsg> list = languageMsgManager.findByQuery(query);
//下载
languageMsgManager.download(list, response);
}
@ApiOperation("查询列表")
@GetMapping
@PreAuthorize("@el.check('translation')")
public PageData<LanguageMsgDto> query(LanguageMsgCriteria criteria, Pageable pageable){
List<String> typeList=languageMsgManager.findTypeList();
int languageSize=getAllLanList().size();
Query query= QueryHelp.getQuery(criteria);
if (criteria.getTranslationState() != null) {
if (criteria.getTranslationState() == 1) {
query.addCriteria(Criteria.where("contentList").size(languageSize));
} else if (criteria.getTranslationState() == 2) {
// db.getCollection('languageMsg').find({ "contentList.3" : { "$exists" : 0 } })
String proName="contentList."+(languageSize-1);
query.addCriteria(Criteria.where(proName).exists(false));
}
}
PageData<LanguageMsg> barcodes=languageMsgManager.findByPage(query,pageable);
List<LanguageMsgDto> barcodeDtos=languageMsgMapper.toDto(barcodes.getContent());
return new PageData(barcodeDtos,barcodes.getTotalElements());
}
@ApiOperation("新增资源")
@PostMapping
@PreAuthorize("@el.check('translation')")
public ResponseEntity<Object> create( @RequestBody LanguageMsgDto resources) {
LanguageMsg msg=languageMsgMapper.toEntity(resources);
languageMsgManager.saveMsg(msg);
return new ResponseEntity<>(HttpStatus.CREATED);
}
@ApiOperation("修改资源")
@PutMapping
@PreAuthorize("@el.check('translation')")
public ResponseEntity<Object> update( @RequestBody LanguageMsgDto resources) {
LanguageMsg msg=languageMsgMapper.toEntity(resources);
if (msg.getId() == null) {
throw new ValidateException("smfcode.valueCanotNull","{0}不能为空",new String[]{"ID"});
}
languageMsgManager.saveMsg(msg);
return new ResponseEntity<>(HttpStatus.OK);
}
@ApiOperation("删除资源")
@DeleteMapping
@PreAuthorize("@el.check('translation')")
public ResponseEntity<Object> delete(@RequestBody Set<String> ids) {
for (String id : ids) {
if (id == null) {
throw new ValidateException("smfcode.valueCanotNull","{0}不能为空",new String[]{"ID"} );
}
}
languageMsgManager.deleteMsgs(ids);
return new ResponseEntity<>(HttpStatus.OK);
}
@ApiOperation("客户端获取资源列表")
@GetMapping(value = "/resource")
@AnonymousAccess
public List<LanguageResourceDto> resourceDownload(String type,String lanCode ) {
lanCode=lanCode.replace("_","-");
List<LanguageMsg> msgList=MessageUtils.getLanMsgByType(type);
Map<String,Map<String,String>> resourceMap=new HashMap<>();
List<String> allLantypeList=getAllLanList();
for (LanguageMsg msg :
msgList) {
for (Content con :
msg.getContentList()) {
if (ObjectUtil.isEmpty(con.getLanCode()) || ObjectUtil.isEmpty(con.getMsg())) {
continue;
}
if (ObjectUtil.isNotEmpty(lanCode) && (!lanCode.equals(con.getLanCode()))) {
continue;
}
if(!allLantypeList.contains(con.getLanCode())){
continue;
}
Map<String, String> valueMap = resourceMap.get(con.getLanCode());
if (valueMap == null) {
valueMap = new HashMap<>();
}
valueMap.put(msg.getCode(), con.getMsg());
resourceMap.put(con.getLanCode(), valueMap);
}
}
List<LanguageResourceDto> list=new ArrayList<>();
for (String key :
resourceMap.keySet()) {
Map<String, String> valueMap = resourceMap.get(key);
if(valueMap!=null&&valueMap.size()>0){
LanguageResourceDto dto=new LanguageResourceDto(key,valueMap);
list.add(dto);
}
}
return list;
}
@ApiOperation("客户端提交资源列表:只增加不修改")
@PostMapping(value = "/resource")
@AnonymousAccess
public ResultBean resourceUpload(@RequestBody Map<String,Object> paramsMap ) {
String type = paramsMap.get("type").toString();
List<String> lanList = getAllLanList();
for (String key :
paramsMap.keySet()) {
if (key.toString().equals("type")) {
continue;
}
Object value = paramsMap.get(key);
// log.info("收到客户端上传资源类型[" + type + "],语言[" + key + "],值[" + value.toString() + "]");
String lanType = key.replace("_", "-");
if (!lanList.contains(lanType)) {
log.info("收到客户端上传资源,未找到指定语言:类型[" + type + "],语言[" + key + "] ");
continue;
}
log.info("收到客户端上传资源类型[" + type + "],语言[" + key + "]");
Map<String, String> lanResourceMap = new HashMap<>();
Map<String, Object> reMap = (Map<String, Object>) value;
for (String resKey :
reMap.keySet()) {
Object resValue = reMap.get(resKey);
if(resValue instanceof Map){
processResourceMap(resKey, resValue, lanResourceMap);
}else{
lanResourceMap.put(resKey,resValue.toString());
}
}
ResourceUpload("接口上传", lanResourceMap, lanType, type);
}
return ResultBean.newOkResult("ok");
}
private void processResourceMap(String codeKey,Object value,Map<String,String> lanResourceMap){
if(value instanceof Map){
Map<String,Object> valueMap=(Map<String,Object>)value;
for (String vkey :
valueMap.keySet()) {
Object vValue=valueMap.get(vkey);
String code=codeKey+"."+vkey;
processResourceMap(code,vValue,lanResourceMap);
}
}else{
lanResourceMap.put(codeKey,value.toString());
}
}
@ApiOperation("获取资源类型集合")
@GetMapping(value = "/typeList")
@PreAuthorize("@el.check('translation')")
public List<String> getTypeList( ) {
List<String> typeList=languageMsgManager.findTypeList();
return typeList;
}
private String getLanTypeByFileName(String orgFilename) {
String tname = orgFilename.replace('_', '-');
for (String lanType :
getAllLanList()) {
if(tname.contains(lanType)){
return lanType;
}
}
return "";
}
private String ResourceUpload(String orgFileName,Map<String, String> proMap ,String lanCode, String type) {
List<LanguageMsg> newLanguageList = new ArrayList<>();
List<LanguageMsg> updateLanguageList = new ArrayList<>();
if (proMap != null && proMap.size() > 0) {
for (String key :
proMap.keySet()) {
String msgStr = proMap.get(key);
LanguageMsg msg = MessageUtils.getMsg(key);
//导入时只能新增不能修改
if (msg == null) {
msg = new LanguageMsg(key, msgStr,"smfclient");
msg.setContent(lanCode, msgStr);
newLanguageList.add(msg);
} else {
String oldMsg = msg.getContent(lanCode);
// if (!oldMsg.equals(msgStr)) {
if(ObjectUtil.isEmpty(oldMsg)){
msg.setContent(lanCode, msgStr);
updateLanguageList.add(msg);
languageMsgManager.save(msg);
MessageUtils.updateMsg(msg);
}
}
}
}
if (newLanguageList.size() > 0) {
languageMsgManager.insertAll(newLanguageList);
for (LanguageMsg msg :
newLanguageList) {
MessageUtils.updateMsg(msg);
}
}
log.info("导入资源[" + orgFileName + "]["+type+"]["+lanCode+"]共更新[" + updateLanguageList.size() + "]条资源,新增[" + newLanguageList.size() + "]条资源");
return "ok";
}
private Map<String,String> readJsFile(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;
//网友推荐更加简洁的写法
int lineIndex=-1;
String currNodeName="";
while ((line = br.readLine()) != null) {
lineIndex++;
// if(lineIndex==0){
// continue;
// }
if(ObjectUtil.isEmpty(line)){
continue;
}
if (line.contains("{")){
if(line.contains("=")){
currNodeName="";
}else{
int dendIndex=line.indexOf(':');
String lineNode=line.substring(0,dendIndex).trim();
if(ObjectUtil.isEmpty(currNodeName)){
currNodeName=lineNode;
}else{
//节点名称+
currNodeName=currNodeName+"."+lineNode;
}
}
}else if(line.contains("}")){
//节点名称-
if(currNodeName.contains(".")){
int endIndex=currNodeName.lastIndexOf(".");
currNodeName=currNodeName.substring(0,endIndex );
}else{
currNodeName="";
}
}
else if(line .contains(":")){
if(line.endsWith(",")){
line=line.substring(0,line.length()-1);
}
String[] array=line.replace("'","").replace("\"","").split(":");
if(array.length==2){
String linekey=array[0].trim();
String lineValue=array[1].trim();
map.put(currNodeName+"."+linekey,lineValue);
}
}
}
} catch (IOException e) {
log.error("readJsFile 出错:"+e.toString());
e.printStackTrace();
}
return map;
}
// private void msgListUpload(String type, List<LanguageMsg> msgList) {
//
// List<LanguageMsg> newLanguageList = new ArrayList<>();
// List<LanguageMsg> updateLanguageList = new ArrayList<>();
// for (LanguageMsg msg :
// msgList) {
// msg.setType(type);
// if(ObjectUtil.isEmpty(msg.getCode())) {
// //code不能为空
// continue;
// }
// if(ObjectUtil.isEmpty(msg.getMsg())){
// //内容不能为空
// continue;
// }
//
// List<Content> contentList = new ArrayList<>();
// for (Content con :
// msg.getContentList()) {
// if (ObjectUtil.isEmpty(con.getLanCode()) || ObjectUtil.isEmpty(con.getMsg())) {
// continue;
// }
// contentList.add(con);
// }
//
//
// //判断是否是新增
// LanguageMsg oldMsg=MessageUtils.getMsg(msg.getCode());
// if(oldMsg==null){
// newLanguageList.add(msg);
// }
// else{
// //只新增不修改
// List<String> allLanList=getAllLanList();
// for (String lanType :
// allLanList) {
// String oldValue= oldMsg.getContent(lanType);
// if(ObjectUtil.isEmpty(oldValue)){
// oldMsg.setContent(lanType,msg.getContent(lanType));
// }
// }
// updateLanguageList.add(oldMsg);
// languageMsgManager.save(oldMsg);
// MessageUtils.updateMsg(oldMsg);
// }
//
// }
//
//
//
// if (newLanguageList.size() > 0) {
// languageMsgManager.insertAll(newLanguageList);
// for (LanguageMsg msg :
// newLanguageList) {
// MessageUtils.updateMsg(msg);
// }
// }
// log.info("导入[" + type + "]类型的资源列表,共更新[" + updateLanguageList.size() + "]条资源,新增[" + newLanguageList.size() + "]条资源");
//
// }
}
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;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* Created by sunke on 2021/7/29.
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
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;
import cn.hutool.core.util.ObjectUtil;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.neotel.smfcore.common.base.BasePo;
......@@ -11,6 +12,7 @@ import org.springframework.data.annotation.Transient;
import org.springframework.data.mongodb.core.mapping.Document;
import java.io.Serializable;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
......@@ -18,17 +20,37 @@ import java.util.Map;
@Document
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;
/**
* 资源 code
*/
private String code;
/**
* 消息key,第一个.之前为设备名称
* 设备类型,一般为code的第一个单词
* smfcode:服务器
*
*/
private String key;
private String type;
/**
* 默认值
* 默认值,文本内容
*/
private String msg;
......@@ -37,4 +59,47 @@ public class LanguageMsg extends BasePo implements Serializable {
*/
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;
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 org.springframework.beans.factory.annotation.Autowired;
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.util.ObjectUtils;
import java.text.MessageFormat;
import java.util.Locale;
import javax.annotation.PostConstruct;
import java.io.*;
import java.util.*;
/**
* 国际化工具类
* Created by sunke on 2021/7/30.
* 资源缓存
*/
@Component
@Slf4j
public class MessageUtils {
//-----------------以下为从配置文件读取资源-------------------------------------
public static Locale getDefaultLocal(){
return new Locale("zh-CH");
}
......@@ -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;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.util.ObjectUtil;
import com.google.common.base.Strings;
import com.neotel.smfcore.common.bean.PageData;
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.QueryHelp;
import com.neotel.smfcore.common.utils.StorageConstants;
import com.neotel.smfcore.common.utils.StringUtils;
import com.neotel.smfcore.core.barcode.enums.COMPONENT_TYPE;
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.po.Barcode;
import com.neotel.smfcore.core.barcode.service.po.Component;
import com.neotel.smfcore.core.device.bean.BoxStatusBean;
import com.neotel.smfcore.core.device.bean.StatusBean;
import com.neotel.smfcore.core.device.enums.OP_STATUS;
import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.core.msd.bean.MSDSettiings;
import com.neotel.smfcore.core.msd.bean.MSLSetInfo;
import com.neotel.smfcore.core.msd.rest.bean.dto.MSDSettiingsDto;
import com.neotel.smfcore.core.msd.rest.bean.mapstruct.MSDSettingsMapper;
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.StoragePosFindCriteria;
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.system.bean.MSDAppendInfo;
import com.neotel.smfcore.core.system.rest.bean.dto.SysSettingsDto;
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.rest.bean.query.TaskQueryCondition;
import com.neotel.smfcore.core.system.service.manager.IDataLogManager;
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.DevicesStatusUtil;
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.data.domain.Pageable;
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.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import java.util.*;
@Slf4j
@RestController
@RequiredArgsConstructor
@Api(tags = "MSD:管理和设置")
@RequestMapping("api/msd")
public class MSDController {
@Autowired
private DataCache dataCache;
@Autowired
private MSDSettingsMapper msdSettingsMapper;
@Autowired
private final StoragePosMapper storagePosMapper;
@Autowired
private final IComponentManager componentManager;
@Autowired
private final IStoragePosManager storagePosManager;
@Autowired
private IDataLogManager dataLogManager;
@Autowired
private final TaskMapper taskMapper;
@Autowired
private final IBarcodeManager barcodeManager;
@ApiOperation("获取MSD设置信息")
@GetMapping("/settings")
@PreAuthorize("@el.check('msd')")
public MSDSettiingsDto getSysSettings() {
MSDSettiings msdSettiings = dataCache.getCache(Constants.CACHE_msdSetting);
if(msdSettiings==null){
msdSettiings=new MSDSettiings() ;
String[] levels=new String[]{"1","2","2a","3","4","5","5a","6"};
List<MSLSetInfo> list=new ArrayList<>();
for (String level :
levels) {
MSLSetInfo setInfo=new MSLSetInfo() ;
setInfo.setMsl(level);
setInfo.setThickness("1");
setInfo.setTimeHour(48);
list.add(setInfo);
}
msdSettiings.setMslSetList(list);
dataCache.updateCache(Constants.CACHE_msdSetting, msdSettiings);
log.info("默认MSD:CACHE_msdSetting=" + msdSettiings.toString());
}
MSDSettiingsDto dto = msdSettingsMapper.toDto(msdSettiings);
return dto;
}
@ApiOperation("修改MSD设置信息")
@PutMapping("/settings")
@PreAuthorize("@el.check('msd')")
public ResultBean updateSysSettings(@Validated @RequestBody MSDSettiingsDto msdSettiingsDto) {
MSDSettiings settiings = msdSettingsMapper.toEntity(msdSettiingsDto);
if (settiings.getMaxHumidity() <= settiings.getMinHumidity()) {
throw new ValidateException("smfcode.humidityValueError", "温度范围数据错误");
}
if (settiings.getMaxTemperature() <= settiings.getMinTemperature()) {
throw new ValidateException("smfcode.temperatureValueError", "湿度范围数据错误");
}
dataCache.updateCache(Constants.CACHE_msdSetting, settiings);
log.info("更改MSD:CACHE_msdSetting=" + settiings.toString());
return ResultBean.newOkResult("保存成功");
}
@ApiOperation("MSD库存数据查询")
@GetMapping("/query")
@PreAuthorize("@el.check('msd')")
public PageData<StoragePosDto> query(StoragePosFindCriteria criteria, Pageable pageable, HttpServletRequest request) {
if (criteria.getStorageId() != null && criteria.getStorageId().equals("0")) {
criteria.setStorageId(null);
}
Query query = QueryHelp.getQuery(criteria);
Criteria baseCriteria = Criteria.where("used").is(true);
int componentType = criteria.getType();
String name = "";
if (componentType != -1) {
int type = componentType;
request.setAttribute("type", componentType);
if (componentType == 41) {//锡膏夹具
type = COMPONENT_TYPE.FIXTURE;
name = StorageConstants.PACKAGE_TYPE.SOLDER_FIXTURE.getCode();
} else if (componentType == 42) {//PCB夹具
type = COMPONENT_TYPE.FIXTURE;
name = StorageConstants.PACKAGE_TYPE.PCB_FIXTURE.getCode();
}
baseCriteria.and("barcode.type").is(type);
}
query.addCriteria(Criteria.where("barcode.msl").exists(true));
query.addCriteria(baseCriteria);
PageData<StoragePos> pages = storagePosManager.findByPage(query, pageable);
List<StoragePosDto> StoragePosDtos = storagePosMapper.toDto(pages.getContent());
for (StoragePosDto dto :
StoragePosDtos) {
if(ObjectUtil.isEmpty(dto.getBarcode().getMsl())|| ObjectUtil.isEmpty(dto.getBarcode().getThickness()))
{
Component component=componentManager.findOneByPN(dto.getBarcode().getPartNumber());
if(component!=null){
dto.getBarcode().setMsl(component.getMsl());
dto.getBarcode().setThickness(component.getThickness());
}
}
Storage storage=dataCache.getStorageById(dto.getStorageId());
StatusBean bean = DevicesStatusUtil.getStatusBean(storage.getCid());
if (bean != null && bean.getBoxStatus() != null) {
for (BoxStatusBean boxStatus : bean.getBoxStatus().values()) {
String humidity = boxStatus.getHumidity();
String temperature = boxStatus.getTemperature();
dto.setHumidity(humidity);
dto.setTemperature(temperature);
break;
}
}
}
return new PageData(StoragePosDtos, pages.getTotalElements());
}
@ApiOperation("开封")
@PutMapping("/open")
@PreAuthorize("@el.check('msd')")
public ResultBean open(@RequestBody Map<String,String> paramsMap) {
String posName = paramsMap.get("posName");
StoragePos pos = storagePosManager.getByPosName(posName);
if (pos == null || (pos.isUsed() == false) || pos.getBarcode() == null) {
throw new ValidateException("smfcode.msd.noPos", "未找到可开封的物料");
}
Barcode barcode = barcodeManager.findByBarcode(pos.getBarcode().getBarcode());
if (barcode == null) {
throw new ValidateException("smfcode.msd.noPos", "未找到可开封的物料");
}
DateTime dateTime = new DateTime();
pos.getBarcode().setOpenTime(dateTime);
barcode.setOpenTime(dateTime);
storagePosManager.save(pos);
barcodeManager.saveBarcode(barcode);
return ResultBean.newOkResult("");
}
@ApiOperation("追溯数据查询")
@GetMapping("/history")
@PreAuthorize("@el.check('msd')")
public PageData<TaskDto> history(TaskQueryCondition criteria, Pageable pageable) {
//只查询出库已完成
criteria.setType(2);
criteria.setStatus(OP_STATUS.FINISHED.name());
// String un_End = "UN_END";
// boolean unEnd = false;
// if (criteria.getStatus() != null && criteria.getStatus().equals(un_End)) {
// criteria.setStatus(null);
// unEnd = true;
// }
Query query = QueryHelp.getQuery(criteria);
// if (unEnd) {
// query.addCriteria(Criteria.where("status").nin(OP_STATUS.END.name(), OP_STATUS.FINISHED.name()));
// }
PageData<DataLog> taskList = dataLogManager.findByPage(query, pageable);
List<TaskDto> dtos = taskMapper.toDto(taskList.getContent());
for (TaskDto dto :
dtos) {
Random r = new Random();
String[] levels = new String[]{"1", "2", "2a", "3", "4", "5", "5a", "6"};
int num = r.nextInt(levels.length);
MSDAppendInfo appendInfo = new MSDAppendInfo();
appendInfo.setMsl(levels[num]);
int thickness = r.nextInt(3);
appendInfo.setThickness(thickness + "");
appendInfo.setOpenTime(new Date());
dto.setMsdAppendInfo(appendInfo);
}
// PageData<TaskDto> result= taskMapper.toDto(taskList);
return new PageData<>(dtos, taskList.getTotalElements());
}
}
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;
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.system.bean.MSDAppendInfo;
import com.neotel.smfcore.core.system.listener.ITaskListener;
import com.neotel.smfcore.core.system.service.po.DataLog;
import com.neotel.smfcore.core.system.util.TaskService;
......@@ -169,6 +170,7 @@ public class LiteOrderCache implements ITaskListener {
task.setSubSourceId(barcode.getLockName());
task.setSubSourceInfo(barcode.getLockName());
task.setType(OP.CHECKOUT);
task.setPutInDate(barcode.getPutInDate());
task.setLightColor(nextColor.getRgb());
task.setStatus(OP_STATUS.WAIT.name());
taskService.addTaskToExecute(task);
......@@ -428,23 +430,8 @@ public class LiteOrderCache implements ITaskListener {
}
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());
task.setCid(storage.getCid());
task.setStorageId(storage.getId());
task.setStorageName(storage.getName());
task.setPosId(pos.getId());
task.setPosName(pos.getPosName());
DataLog task = new DataLog(storage,pos.getBarcode(),pos);
return task;
}
......
......@@ -88,6 +88,27 @@ public class MaterialBoxController {
}
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("取出物料")
@PostMapping("exeOut")
......
......@@ -87,6 +87,7 @@ public class StoragePosController {
Query query = QueryHelp.getQuery(criteria);
PageData<StoragePos> pages = storagePosManager.findByPage(query, pageable);
List<StoragePosDto> StoragePosDtos = storagePosMapper.toDto(pages.getContent());
return new PageData(StoragePosDtos, pages.getTotalElements());
}
......@@ -298,7 +299,7 @@ public class StoragePosController {
return new PageData(StoragePosDtos, pages.getTotalElements());
}
@ApiOperation("查找出库")
@ApiOperation("出库操作")
@PutMapping("/checkout")
public ResultBean checkout(@Validated @RequestBody CheckOutDto checkOutDto) {
......
......@@ -62,4 +62,12 @@ public class StoragePosDto implements Serializable {
@ApiModelProperty("标签名称")
private String labelName;
@ApiModelProperty("湿度")
private String humidity="";
@ApiModelProperty("温度")
private String temperature="";
}
......@@ -29,6 +29,8 @@ public class StoragePosFindCriteria {
@QueryCondition(propName = "barcode.barcode")
@ApiModelProperty("条码")
private String barcode;
@QueryCondition
@ApiModelProperty("库位号")
private String posName;
......@@ -66,4 +68,8 @@ public class StoragePosFindCriteria {
private String otherField4;
@QueryCondition(blurry = "barcode.otherField5")
private String otherField5;
@QueryCondition(propName = "barcode.msl")
@ApiModelProperty("等级")
private String msl;
}
......@@ -32,4 +32,8 @@ public class StoragePosQueryCriteria {
@ApiModelProperty("是否启用")
@QueryCondition
private Boolean enabled;
@ApiModelProperty("是否使用")
@QueryCondition
private Boolean used;
}
......@@ -55,4 +55,6 @@ public interface IStoragePosManager extends IBaseManager<StoragePos> {
void clearLockPos(String lockId);
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 {
storagePosDao.updateMulti(query, Update.update("barcode.lockId",""));
}
@Override
public StoragePos autoFindNextEmptyPos(Storage storage, Collection<String> excludePosIds,StoragePos currentPos) {
Criteria c = Criteria.where("storageId").is(storage.getId());
......@@ -441,5 +443,11 @@ public class StoragePosManagerImpl implements IStoragePosManager {
StoragePos pos = storagePosDao.findOne(query);
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;
import com.neotel.smfcore.core.system.bean.MSDAppendInfo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
......@@ -132,4 +133,11 @@ public class TaskDto implements Serializable {
@ApiModelProperty("创建时间")
private Date createDate ;
@ApiModelProperty("MSD附加信息")
private MSDAppendInfo msdAppendInfo;
@ApiModelProperty("如果是出库任务,需要记录入库时间")
private Date putInDate;
}
......@@ -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.storage.service.po.Storage;
import com.neotel.smfcore.core.storage.service.po.StoragePos;
import com.neotel.smfcore.core.system.bean.MSDAppendInfo;
import lombok.Data;
import org.springframework.data.mongodb.core.mapping.Document;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
@Data
......@@ -29,6 +31,12 @@ public class DataLog extends BasePo implements Serializable {
setBarcode(barcode.getBarcode());
setNum(barcode.getAmount());
setMemo(barcode.getMemo());
setPutInDate(barcode.getPutInDate());
msdAppendInfo = new MSDAppendInfo();
msdAppendInfo.setMsl(barcode.getMsl());
msdAppendInfo.setOpenTime(barcode.getOpenTime());
msdAppendInfo.setThickness(barcode.getThickness());
}
setCid(storage.getCid());
setStorageId(storage.getId());
......@@ -37,6 +45,7 @@ public class DataLog extends BasePo implements Serializable {
setPosId(pos.getId());
setPosName(pos.getPosName());
setStatus(OP_STATUS.WAIT.name());
}
/**
......@@ -191,6 +200,15 @@ public class DataLog extends BasePo implements Serializable {
* 出库时记录此料在库时长 ,分钟
*/
private long inStoreTime=0l;
/**
* 如果是出库任务,需要记录入库时间
*/
private Date putInDate;
/**
* MSD附加信息
*/
private MSDAppendInfo msdAppendInfo;
public String getBarcode() {
if(barcode == null){
......
......@@ -73,11 +73,6 @@ public class TaskService {
// }
// }
private void check(String barcode, String posName) throws ValidateException {
}
/**
* 条码入库,加入要执行的任务
*/
......@@ -87,6 +82,10 @@ public class TaskService {
task.setType(OP.PUT_IN);
task.setStatus(OP_STATUS.EXECUTING.name());
if(barcode!=null){
barcode.setPutInTime(System.currentTimeMillis());
barcodeManager.saveBarcode(barcode);
}
String loginUser = SecurityUtils.getLoginUsername();
task.setOperator(loginUser);
task = updateQueueTask(task);
......@@ -112,6 +111,7 @@ public class TaskService {
DataLog task = new DataLog(storage, pos.getBarcode(), pos);
task.setType(OP.CHECKOUT);
task.setPutInDate(pos.getBarcode().getPutInDate());
task.setStatus(OP_STATUS.WAIT.name());
task.setSingleOut(isSingleOut);
task.setOperator(opUserName);
......@@ -525,26 +525,8 @@ public class TaskService {
}
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());
task.setCid(storage.getCid());
task.setStorageId(storage.getId());
task.setStorageName(storage.getName());
task.setPosId(pos.getId());
task.setPosName(pos.getPosName());
task.setStatus(OP_STATUS.WAIT.name());
DataLog task = new DataLog(storage,pos.getBarcode(),pos);
return task;
}
......
......@@ -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.inOtherBox=\u7269\u6599\u5DF2\u5728\u6599\u76D2{0}\u4E2D
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
......@@ -60,39 +60,39 @@ smfcore.noconnecttion=No connecttion
smfcore.loadMaterialFailed=Loading material failed:{0}
smfcore.checkNg=checking material is ng:{0}
smfcore.loadMaterialFinished=Loading material finished: {0}
smfcore.lockMaterial=Equipment kanban
smfcore.lockMaterial=Equipment Performance Monitor
smfcore.lightGroup=Neo Light Grouping
smfcore.order=Material Management
smfcore.workOrder=Work Order
smfcore.singleOuput=Check to Retrieve
smfcore.system=Set
smfcore.bunker=Device Management
smfcore.storagePos=Position Management
smfcore.menu=Menu Management
smfcore.materiel =Archives Management
smfcore.singleOuput=Search
smfcore.system=System
smfcore.bunker=Equipment
smfcore.storagePos=Storage Location
smfcore.menu=Menu Manager
smfcore.materiel =Product Info
smfcore.componentParts=Component
smfcore.barcode=Barcode
smfcore.log=Log Management
smfcore.barcode=Material ID
smfcore.log=Big Data
smfcore.taskLog=Material Log
smfcore.user=User Management
smfcore.peoples=User Management
smfcore.role=Role Management
smfcore.user=Users
smfcore.peoples=Users
smfcore.role=Authority
smfcode.menuNotExist=Menu{0} does not exist
smfcode.noValidStorage=No available bin found in bin list
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.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.nogroupaccess=No operation rights for the group [{0}]
smfcore.outSetting=Material Retrieval Tatic
smfcore.sysSetting=System Settings
smfcore.outSetting=Retrieval Method
smfcore.sysSetting=System Setting
smfcore.help=Help
smfcore.instruction=Instruction manual
smfcore.about=About
smfcore.tacticsOuput=Strategies Retrival
smfcore.labelOuput=Material grouping
smfcore.tacticsOuput=Retrieval Method
smfcore.labelOuput=Grouping
smfcode.order.out.executing=Work orders are being executed
smfcode.order.out.notFound=Work order not found
smfcode.order.out.maxOrder=The maximum number of executable work orders has been reached
......@@ -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.inPos=The material is already in the storage space {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
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.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
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
......@@ -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.inPos=\u7269\u6599\u5DF2\u5728\u5E93\u4F4D{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
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
......@@ -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.inPos=\u7269\u6599\u5DF2\u5728\u5EAB\u4F4D{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
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
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!