Commit e4b1e93e sunke

物料维护界面导出所有数据

运行统计界面报警删除
已在库位中提示信息添加线别
条码设置,出库策略移入系统菜单
MiniStock时间可在系统设置页面进行配置
轻工单页面出库后不需要再次选择线体
操作界面出库流程修改:选择单个物料后弹出输入工号框进行验证

单独出库增加线别和在库时间展示,去除供应商
保存产品后自动进入下一个新增产品页面
出库授权码只允许使用当前登陆用户
1 个父辈 90a52008
正在显示 22 个修改的文件 包含 490 行增加451 行删除
2020-12-23 13:36:09 INFO [BarcodeRule.java:394] - 准备发送到ministock
2020-12-23 13:37:26 INFO [BarcodeRule.java:394] - 准备发送到ministock
2021-03-03 09:09:50 INFO [BarcodeRule.java:52] - 开始解析二维码规则:1@2@3@PN@5@6@7@8@9@10@xxPRODATEyyyyMMdd@xxxEXPDATEyyyyMMdd@13@14@15@16@17@RI@xQTYxxxxxx@20@21@22@23
2021-03-03 09:09:50 INFO [BarcodeRule.java:77] - 分割符为:@长度为:23
2021-03-03 09:09:50 INFO [BarcodeRule.java:81] - partNumber: 为{name='PN', index=3, prefix='', suffix=''}
2021-03-03 09:09:50 INFO [BarcodeRule.java:94] - produceDate: 为{name='PRODATE', index=10, prefix='xx', suffix='yyyyMMdd'}
2021-03-03 09:09:50 INFO [BarcodeRule.java:96] - expireDate: 为{name='EXPDATE', index=11, prefix='xxx', suffix='yyyyMMdd'}
2021-03-03 09:09:50 INFO [BarcodeRule.java:83] - reelId: 为{name='RI', index=17, prefix='', suffix=''}
2021-03-03 09:09:50 INFO [BarcodeRule.java:88] - quantity: 为{name='QTY', index=18, prefix='x', suffix='xxxxxx'}
2021-03-03 09:09:50 INFO [BarcodeRule.java:220] - 开始解析条码[[)>@06@12S0002@P1267370498@1PGCM31CR71E475KA51K@31PGCM31CR71E475KA51K@12V690588124@10VJPN-IA@2P@20P@6D20210114@14D20220714@30PY@Z1@K0@16K0@V97294419@3SS2871011499X9@Q6000NAR000@20T1@1TIA1107LX5@2T@1Z@@]
......@@ -132,7 +132,7 @@ public class Settings extends BaseMongoBean {
/**
* 备份周期
*/
private int backupHours = 0;
private int backupHours = 10;
/**
* 维护周期
......
......@@ -71,8 +71,18 @@ public class ComponentManagerImpl implements IComponentManager {
{
log.debug("Search components with Query " + query.toString());
pageList.setList(componentDao.findByQuery(query, pageList.getPageNumber(), pageList.getObjectsPerPage()));
pageList.setFullListSize(componentDao.countByQuery(query));
int sizePerPage = pageList.getObjectsPerPage();
int totalSize = componentDao.countByQuery(query);
pageList.setFullListSize(totalSize);
int pageNumber = pageList.getPageNumber();
if(pageNumber == -1){
sizePerPage = totalSize;
pageNumber = 1;
}
pageList.setList(componentDao.findByQuery(query, pageNumber, sizePerPage));
log.debug("Search returns " + pageList.getFullListSize() + " components");
return pageList;
}
......
......@@ -18,7 +18,7 @@ import javax.validation.Valid;
@Controller
@RequestMapping("/barcode/barcodeSettings.html")
@RequestMapping("/system/barcodeSettings.html")
public class BarcodeSettingsController extends SettingsController {
......
......@@ -7,6 +7,7 @@ import com.myproject.bean.search.PageList;
import com.myproject.manager.IComponentManager;
import com.myproject.util.StorageConstants;
import com.myproject.webapp.controller.FileUpload;
import org.displaytag.tags.TableTagParameters;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.query.Criteria;
......@@ -89,8 +90,13 @@ public class ComponentSearchController extends BaseSearchController {
request.setAttribute("type", componentType);
}
PageList pageList = searchCriteria.getPageList();
if (request.getParameter(TableTagParameters.PARAMETER_EXPORTING) != null){
pageList.setPageNumber(-1);
}
query.with(new Sort(Sort.Direction.DESC, "updateDate"));
searchCriteria.setPageList(componentmanager.findByQuery(query, searchCriteria.getPageList()));
searchCriteria.setPageList(componentmanager.findByQuery(query, pageList));
//model.addAttribute("searchResult", searchCriteria.getPageList());
// return new ModelAndView(getSuccessView(), model.asMap());
......
......@@ -28,6 +28,7 @@ import org.springframework.web.multipart.commons.CommonsMultipartResolver;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.io.File;
import java.io.FileOutputStream;
......@@ -91,7 +92,7 @@ public class ComponentUpdateController extends BaseUpdateController{
@RequestMapping(method = RequestMethod.POST)
public String submit(@Valid Component component, BindingResult result,
HttpServletRequest request) throws Exception {
HttpServletRequest request, HttpServletResponse response) throws Exception {
if(result.hasErrors()) {
return getSuccessView();
} else {
......@@ -149,7 +150,11 @@ public class ComponentUpdateController extends BaseUpdateController{
}
}
saveMessage(request, getText("component.saveSuccess", request.getLocale()));
break;
//return "/component/componentSearch.html";
//break;
response.sendRedirect(request.getContextPath() + "/component/componentUpdate.html");
//return StorageConstants.COMPONENT_SEARCH_VIEW;
return null;
case StorageConstants.DELETE:
componentmanager.delete(component);
saveMessage(request, getText("component.deleteSuccess", request.getLocale()));
......
......@@ -32,7 +32,6 @@ import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
@Controller
......@@ -135,7 +134,8 @@ public class SzShelfController extends BaseController {
private void sendToMiniStock(){
try{
//2个小时还在库中的,发送到MiniStock
List<StoragePos> posListToSend = storagePosManager.findBeforePutinTime(10);
int miniStockHours = dataCache.getSettings().getBackupHours();
List<StoragePos> posListToSend = storagePosManager.findBeforePutinTime(miniStockHours);
sendToMiniStock(posListToSend);
}catch (Exception e){
log.error("发送到MiniStock出错",e);
......@@ -492,30 +492,30 @@ public class SzShelfController extends BaseController {
@ResponseBody
public String outFromShelf(HttpServletRequest request){
final String cid = request.getParameter("cid");
String partnumber = request.getParameter("pn");
String opUser = request.getParameter("opUser");
if(Strings.isNullOrEmpty(opUser)){
String outPosId = request.getParameter("outPosId");
String authCode = request.getParameter("opUser");
if(Strings.isNullOrEmpty(authCode)){
return getText("shelf.msg.emptyEmployeeNo",request.getLocale(),"请输入工号");
}
User user = userManager.findByAuthCode(opUser);
User user = StorageDataController.getLoginUser();
if(user == null){
return getText("shelf.msg.noPermission",request.getLocale(),"无权执行此操作");
}
if(partnumber != null){
partnumber = partnumber.trim();
}
Storage storage = dataCache.getStorage(cid);
if(storage == null){
String msg = getText("shelf.msg.notFound",request.getLocale(),"未找到料架");
return msg;
return getText("shelf.msg.noPermission",request.getLocale(),"无权执行此操作,请重新登陆");
}else{
if(!user.getAuthCode().equals(authCode)){
return getText("shelf.msg.authCodeError",request.getLocale(),"授权码错误");
}
}
String storageId = storage.getId();
String areaId = storage.getAreaId();
StorageConstants.CHECKOUT_TYPE checkoutType = dataCache.getCheckOutType();
Collection<String> excludePosIds = taskService.excludePosIds(areaId);
StoragePos pos = storagePosManager.findPartNumberPos(storageId,partnumber,excludePosIds, checkoutType);
StoragePos pos = storagePosManager.get(outPosId);
if(pos != null){
Storage storage = dataCache.getStorage(cid);
if(storage == null){
String msg = getText("shelf.msg.notFound",request.getLocale(),"未找到料架");
return msg;
}else if(!storage.getId().equals(pos.getStorageId())){
return getText("shelf.msg.noPermission",request.getLocale(),"无权执行此操作,该物料不属于该料架");
}
log.info(pos.getBarcode().getBarcode() + " 从["+pos.getPosName()+"]手动出库,点亮对应库位");
int delayCloseTime = 10000;
......@@ -527,7 +527,7 @@ public class SzShelfController extends BaseController {
}
openAndCloseLights(storage,posNames,delayCloseTime,color);
taskService.addTaskToFinished(pos,null,opUser);
taskService.addTaskToFinished(pos,null,authCode);
return "OK"+getText("shelf.msg.outOk",new String[]{pos.getShortPosName()},request.getLocale(),"操作成功,请从库位["+pos.getPosName()+"]中取出物料");
}else{
......@@ -649,7 +649,9 @@ public class SzShelfController extends BaseController {
}
posName = posName.substring(1);
}
return getText("shelf.msg.alreadyInPos",new String[]{inPos.getShortPosName()},request.getLocale(),"该物料已在库位["+posName+"]中");
String lineName = inPos.getBarcode().getLineInfoStr();
String inName = lineName +"(" + inPos.getShortPosName() + ")";
return getText("shelf.msg.alreadyInPos",new String[]{inName},request.getLocale(),"该物料已在["+posName+"]中");
}
String putInColor = "red";
......@@ -676,7 +678,7 @@ public class SzShelfController extends BaseController {
//线别信息不一致
if(Strings.isNullOrEmpty(lineInfoStr)){
log.error("["+packageId+"]线别信息与配置不一致");
return "n"+getText("shelf.msg.erroLine",new String[]{ecall.getSmtLineNo()}, request.getLocale(),"该物料是"+ecall.getSmtLineNo()+"物料,如确认入库请选择对应线别");
return "n"+getText("shelf.msg.erroLine",new String[]{ecall.getSmtLineNo()}, request.getLocale(),"该物料是"+ecall.getSmtLineNo()+"线物料,如确认入库请选择对应线别");
}
}
}else{
......@@ -787,6 +789,14 @@ public class SzShelfController extends BaseController {
}
}
@RequestMapping("/service/store/shelfInventory")
@ResponseBody
public List<StoragePos> shelfInventory(HttpServletRequest request) {
String cid = request.getParameter("cid");
String storageId = dataCache.getStorage(cid).getId();
return storagePosManager.findNotEmptyByStorageId(storageId);
}
@RequestMapping("/service/store/testNet")
@ResponseBody
public String testNet(HttpServletRequest request) {
......
......@@ -8,6 +8,7 @@ import com.myproject.dao.mongo.IDataLogDao;
import com.myproject.util.StorageConstants;
import com.myproject.webapp.controller.storage.BaseSearchController;
import org.displaytag.properties.SortOrderEnum;
import org.displaytag.tags.TableTagParameters;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
......@@ -70,15 +71,20 @@ public class DataLogSearchController extends BaseSearchController {
criteria.and("partNumber").regex(pattern);
}
query.addCriteria(criteria);
PageList pageList = searchCriteria.getPageList();
if(pageList.getSortCriterion().equals("id")){
pageList.setSortCriterion("updateDate");
pageList.setSortDirection(SortOrderEnum.DESCENDING);
searchCriteria.setPageList(pageList);
}
searchCriteria.setPageList(dataLogDao.findByQuery(query, searchCriteria.getPageList()));
if (request.getParameter(TableTagParameters.PARAMETER_EXPORTING) != null){
pageList.setPageNumber(-1);
}
searchCriteria.setPageList(dataLogDao.findByQuery(query, pageList));
return SUCCESS_VIEW;
}
......
......@@ -15,7 +15,7 @@ import javax.validation.Valid;
@Controller
@RequestMapping("/workOrder/checkOutSettings.html")
@RequestMapping("/system/checkOutSettings.html")
public class CheckOutSettingsController extends SettingsController {
......
......@@ -304,6 +304,7 @@ settings.pcbEmail.everyday=Everyday
settings.pcbEmail.reminder=Remind
settings.pcbEmail.reminderDay=Before Due
settings.remind.deadday=days dead metiral remind
settings.miniStock.hours=hours to MiniStock
settings.pcbEmail.expire=PCB expiration
settings.pcbEmail.adress=Emails (seperated by ;)
barCodeSettings.rule=Barcode Rules
......
......@@ -409,4 +409,5 @@ settings.restore.warning=Warning\: This operation cannot be undone. \!\!\!
settings.restore.confirm=Would you like to proceed?
settings.restore.success=Operation succeeded
checkout.sucess=Add task list successn
settings.remind.deadday=days dead metiral remind
\ No newline at end of file
settings.remind.deadday=days dead metiral remind
settings.miniStock.hours=hours to MiniStock
\ No newline at end of file
......@@ -366,4 +366,5 @@ settings.restore.warning=\u8B66\u544A\:\u8FD8\u539F\u540E,\u7CFB\u7EDF\u5C06\u8F
settings.restore.confirm=\u786E\u5B9A\u8981\u8FD8\u539F\u5230\u6B64\u7248\u672C
settings.restore.success=\u64CD\u4F5C\u6210\u529F
checkout.sucess=\u52A0\u5165\u51FA\u5E93\u4EFB\u52A1\u5217\u8868\u6210\u529F
settings.remind.deadday=\u5929\u524D\u5446\u6EDE\u7269\u6599\u63D0\u9192
\ No newline at end of file
settings.remind.deadday=\u5929\u524D\u5446\u6EDE\u7269\u6599\u63D0\u9192
settings.miniStock.hours=\u5C0F\u65F6\u524D\u7269\u6599\u53D1\u9001\u5230MiniStock
\ No newline at end of file
......@@ -361,11 +361,12 @@ shelf.employeeNo=Employee No.
shelf.msg.opSucess=Operation complete
shelf.msg.notFound=Shelf not found.
shelf.msg.emptyEmployeeNo=Employee No. is required.
shelf.msg.noPermission=No permission to operate.
shelf.msg.noPermission=No permission to operate, please relogin.
shelf.msg.authCodeError=The auth code is error.
shelf.msg.outOk=Please take out the material from the location [{0}]
shelf.msg.outError=No material is found.
shelf.msg.noLine=The line information is not found, please select the line if confirmed.
shelf.msg.erroLine=The material is for {0}, please select the line if confirmed.
shelf.msg.erroLine=The material is for Line {0}, please select the line if confirmed.
shelf.msg.alreadyInPos=The material is already exists in [{0}]
shelf.msg.inOk=Please put the material in the location [{0}]
shelf.msg.inMergeOk=Please merge the location [{0}], then put in the material.
......
......@@ -360,11 +360,12 @@ shelf.employeeNo=Employee No.
shelf.msg.opSucess=Operation complete
shelf.msg.notFound=Shelf not found.
shelf.msg.emptyEmployeeNo=Employee No. is required.
shelf.msg.noPermission=No permission to operate.
shelf.msg.noPermission=No permission to operate, please relogin.
shelf.msg.authCodeError=The auth code is error.
shelf.msg.outOk=Please take out the material from the location [{0}]
shelf.msg.outError=No material is found.
shelf.msg.noLine=The line information is not found, please select the line if confirmed.
shelf.msg.erroLine=The material is for {0}, please select the line if confirmed.
shelf.msg.erroLine=The material is for Line {0}, please select the line if confirmed.
shelf.msg.alreadyInPos=The material is already exists in [{0}]
shelf.msg.inOk=Please put the material in the location [{0}]
shelf.msg.inMergeOk=Please merge the location [{0}], then put in the material.
......
......@@ -360,11 +360,12 @@ shelf.employeeNo=\u5458\u5DE5\u5DE5\u53F7
shelf.msg.opSucess=\u64CD\u4F5C\u5B8C\u6210
shelf.msg.notFound=\u672A\u627E\u5230\u6599\u67B6
shelf.msg.emptyEmployeeNo=\u8BF7\u8F93\u5165\u5DE5\u53F7
shelf.msg.noPermission=\u65E0\u6743\u6267\u884C\u6B64\u64CD\u4F5C
shelf.msg.noPermission=\u65E0\u6743\u6267\u884C\u6B64\u64CD\u4F5C,\u8BF7\u91CD\u65B0\u767B\u9646
shelf.msg.authCodeError=\u6388\u6743\u7801\u9519\u8BEF
shelf.msg.outOk=\u64CD\u4F5C\u6210\u529F,\u8BF7\u4ECE\u5E93\u4F4D[{0}]\u4E2D\u53D6\u51FA\u7269\u6599
shelf.msg.outError=\u64CD\u4F5C\u5931\u8D25,\u672A\u627E\u5230\u53EF\u4EE5\u51FA\u5E93\u7684\u7269\u6599
shelf.msg.noLine=\u672A\u67E5\u5230\u8BE5\u7269\u6599\u7684\u7EBF\u522B\u4FE1\u606F,\u5982\u786E\u8BA4\u5165\u5E93\u8BF7\u9009\u62E9\u5BF9\u5E94\u7EBF\u522B
shelf.msg.erroLine=\u8BE5\u7269\u6599\u662F{0}\u7269\u6599,\u5982\u786E\u8BA4\u5165\u5E93\u8BF7\u9009\u62E9\u5BF9\u5E94\u7EBF\u522B
shelf.msg.erroLine=\u8BE5\u7269\u6599\u662F{0}\u7EBF\u7269\u6599,\u5982\u786E\u8BA4\u5165\u5E93\u8BF7\u9009\u62E9\u5BF9\u5E94\u7EBF\u522B
shelf.msg.alreadyInPos=\u8BE5\u7269\u6599\u5DF2\u5728\u5E93\u4F4D[{0}]\u4E2D
shelf.msg.inOk=\u64CD\u4F5C\u6210\u529F,\u8BF7\u653E\u5165\u5E93\u4F4D[{0}]
shelf.msg.inMergeOk=\u64CD\u4F5C\u6210\u529F,\u8BF7\u5408\u5E76\u5E93\u4F4D[{0}]\u5E76\u653E\u5165\u6599\u76D8
......
......@@ -94,11 +94,15 @@
<div class="table-scrollable">
<display:table name="searchCriteria.pageList" cellspacing="0" cellpadding="0" requestURI="componentSearch.html?type=${type}"
sort="external"
defaultsort="1" class="table table-striped table-bordered table-hover" export="false" id="component">
defaultsort="1" class="table table-striped table-bordered table-hover" export="true" id="component">
<%--<display:column property="name" titleKey="component.name"/>--%>
<display:column titleKey="component.partNumber">
<display:setProperty name="export.csv.filename" value="components.csv" />
<display:column titleKey="component.partNumber" media="html">
<a href="${ctx}/component/componentUpdate.html?type=${component.type}&id=${component.id}">${component.partNumber}</a>
</display:column>
<display:column titleKey="component.partNumber" media="csv">
${component.partNumber}
</display:column>
<display:column property="provider" titleKey="component.provider"/>
<display:column titleKey="component.plate.size">
${component.plateSize} x ${component.height}
......
......@@ -287,7 +287,8 @@
$("#btn"+ids[i]).parent().parent().attr("class","hide");
}
$.post("${ctx}/service/store/clearInactionPos", {pids: posId}, function (data) {
window.location.href="";
//window.location.href="";
$("#btn"+ids[i]).parent().parent().attr("class","hide");
});
}
......
......@@ -71,17 +71,6 @@
<a href="#" onclick="cancelTask('${dataLog.id}')"><fmt:message key="button.cancel"/></a>
</c:if>
</display:column>
<display:column titleKey="dataLog.orderSource" sortable="true" sortProperty="sourceName" media="html">
${dataLog.sourceStr}
</display:column>
<display:column titleKey="dataLog.batch" sortable="true" sortProperty="batchInfo" property="batchInfo" media="html"/>
<%--<display:column titleKey="产品工程"></display:column>--%>
<%--<display:column titleKey="产品代号"></display:column>--%>
<%--<display:column titleKey="产品印制板代号"></display:column>--%>
<%--<display:column titleKey="印制板编号"></display:column>--%>
<%--<display:column titleKey="代料名称"></display:column>--%>
<%--<display:column titleKey="代料型号"></display:column>--%>
<%--<display:column titleKey="代料单"></display:column>--%>
<display:column property="operator" titleKey="操作人" sortable="true" sortProperty="operator"/>
<display:column titleKey="dataLog.date" sortable="true" sortProperty="updateDate">
<fmt:formatDate value="${dataLog.updateDate}" pattern="yyyy-MM-dd HH:mm"/>
......
......@@ -34,6 +34,17 @@
background-color: #00FF00 !important;
}
.modal-body {
position: relative;
padding: 15px;
height: 360px;
overflow-y: scroll;
}
.td-item{
display: block;
}
</style>
<link href="${ctx}/scripts/lobibox/css/lobibox.min.css?id=2" rel="stylesheet" type="text/css"/>
......@@ -64,7 +75,7 @@
<%--<fmt:message key="shelf.btn.ministock"/>--%>
<%--</button>--%>
<button type="button" class="btn btn-fit-height yellow" onclick="showPartNumbers();">
<button type="button" class="btn btn-fit-height yellow" onclick="showInventory();">
<i class="fa fa-sign-out"></i><fmt:message key="button.checkout"/>
</button>
</div>
......@@ -106,7 +117,7 @@
<th><fmt:message key="shelf.cabinet"/></th>
</tr>
</thead>
<tbody class="dataTable">
<tbody class="taskTable">
</tbody>
</table>
......@@ -138,7 +149,7 @@
<th><fmt:message key="shelf.cabinet"/></th>
</tr>
</thead>
<tbody class="dataTable">
<tbody class="taskTable">
</tbody>
</table>
</div>
......@@ -148,32 +159,47 @@
</div>
</div>
<div id="allPartNumbers" class="modal fade" tabindex="-1" data-backdrop="static" data-keyboard="false">
<div id="shelfInventory" class="modal fade" tabindex="-1" data-backdrop="static" data-keyboard="false">
<div class="modal-dialog" style="margin-top: 10%;width:80%;margin-left:10%;">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
<h4 class="modal-title" id="modal-title" style="font-weight: 500;"><fmt:message key="button.checkout"/></h4>
<button type="button" class="close" data-dismiss="modal" aria-hidden="true"></button>
<h4 class="modal-title" style="margin:10px;">
<span id="detailTitle">&nbsp<fmt:message key="button.checkout"/></span>
</h4>
<div class="input-group">
<input type="text" class="form-control" id="searchPn" />
</div>
<input type="text" class="form-control filterInput" id="filterInput"/>
</div>
</div>
<div class="modal-body">
<div class="row" id="partNumberItems">
<div class="col-lg-3 col-md-3 col-sm-6 col-xs-12">
<div class="bg-blue-madison partnumber-box">xxx</div>
</div>
</div>
<table class="table table-striped table-hover" id="itemsTable">
<thead>
<tr>
<th>
<fmt:message key="barcode.barcode"/>
</th>
<th>
<fmt:message key="barcode.partNumber"/>
</th>
<th>
<fmt:message key="Line"/>
</th>
<th>
<fmt:message key="barcode.inStoreRemainTime"/>
</th>
<th>
<fmt:message key="checkOut.pos"/>
</th>
<th>
<fmt:message key="checkOut.operate"/>
</th>
</tr>
</thead>
<tbody class="theItems">
</tbody>
</table>
</div>
<div class="modal-footer">
<div id="footerBtn">
<%--<a href="" class="btn yellow left" id="findAndOut"><i class="fa fa-sign-out"></i><fmt:message key="allBoxView.findAndOut"/></a>--%>
<button type="button" class="btn green" onclick="lastPage()" id="lastPage">
<fmt:message key="allBoxView.lastPage"/></button>
<button type="button" class="btn green" onclick="nextPage()" id="nextPage">
<fmt:message key="allBoxView.nextPage"/></button>
</div>
<%--<button type="button" data-dismiss="modal" class="btn default" id="cancelAuthBtn">取消</button>--%>
</div>
</div>
......@@ -203,17 +229,22 @@
</div>
<div id="opUserConfirm" class="modal fade" tabindex="-1" data-backdrop="static" data-keyboard="false">
<div class="modal-dialog" style="margin-top: 10%;width:80%;margin-left:10%;">
<div class="modal-dialog" style="margin-top: 10%;width:50%;margin-left:25%;">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
<h4 class="modal-title" style="font-weight: 500;"><fmt:message key="shelf.employeeNo"/><span id="authErrorMsg" style="font-weight: 500;color:red;"></span></h4>
<h4 class="modal-title" style="font-weight: 500;"><fmt:message key="shelf.employeeNo"/></h4>
</div>
<div class="modal-body">
<div class="modal-body" style="height:80px;overflow-y:hidden;">
<div class="row">
<div class="input-group">
<input type="hidden" id="outPosId" value=""/>
<input type="text" class="form-control" id="opUser" />
</div>
<h4>
<span id="authErrorMsg" style="font-weight: 500;color:red;"></span>
</h4>
</div>
</div>
<div class="modal-footer">
......@@ -246,6 +277,9 @@
<fmt:message key="network.error.failed" var="networkFailed"/>
<fmt:message key="runStatus.minutes" var="minuteLabel"/>
<fmt:message key="solder.hour" var="hourLabel"/>
<c:set var="scripts" scope="request">
<script type="text/javascript">
......@@ -299,22 +333,86 @@
}).error(function(){showMsg("put in error");});
setInterval(function(){
if($('#allPartNumbers').is(':visible')) {
$("#opUserConfirm").modal("hide");
if($("#searchPn_keyboard").is(':visible')){
$("#searchPn_keyboard input").focus();
showInventory = function(){
$("#opUser").val("");
$("#authErrorMsg").text("");
$(".filterInput").val("");
$("#theItems").html("");
$.post("${ctx}/service/store/shelfInventory", {cid: '${show}'}, function (posList) {
var table = $('#itemsTable').DataTable();
table.clear();
for(var i in posList){
//var index = parseInt(i) + 1;
var pos = posList[i];
var reelId = "<span class='td-item'>"+pos.barcode.barcode+"</span>";
var line = pos.barcode.lineInfoStr;
if(pos.barcode.lockId != null){
line = line + "("+pos.barcode.lockId+")";
}
var inStoreTime = "";
if(pos.inStoreHour >= 1){
inStoreTime = pos.inStoreHour + "${hourLabel}";
}
if(pos.inStoreMiniute != 0){
inStoreTime = inStoreTime + pos.inStoreMiniute + "${minuteLabel}";
}
var pn = "<span class='td-item'>"+pos.barcode.partNumber+"</span>";
var posName = pos.shortPosName;
var btn = '<button class="btn yellow " id="btn'+pos.id+'" onclick="checkoutPos(\''+pos.id+'\');">' +
'<i class="fa fa-sign-out"></i><fmt:message key="button.checkout"/></button>';
table.row.add( [ reelId,pn,line,inStoreTime,posName, btn] );
}
table.order( [ 0, 'asc' ] ).draw();
});
$("#shelfInventory").modal("show");
}
$('#itemsTable').dataTable( {
"searching": false,
"info": false,
paging: false,
"order": [[ 1, "asc" ]]
} );
filterItems = function(searchStr){
$(".theItems").children().each(function(){
if(!searchStr || $(this).text().indexOf(searchStr) >= 0){
$(this).show();
}else{
$("#searchPn").focus();
FilterPnItems();
$(this).hide();
}
}else if($("#opUserConfirm").is(':visible')){
});
};
checkoutPos = function(posId){
$("#outPosId").val(posId);
$("#authErrorMsg").text("");
$("#opUser").val("");
$("#opUserConfirm").modal("show");
}
setInterval(function(){
if($("#opUserConfirm").is(':visible')){
if($("#opUser_keyboard").is(':visible')){
$("#opUser_keyboard input.ui-keyboard-preview").focus();
}else{
$("#opUser").focus();
}
}else{
}else if($('#shelfInventory').is(':visible')) {
if($("#filterInput_keyboard").is(':visible')){
$("#filterInput_keyboard input").focus();
searchStr = $("#filterInput_keyboard input").val();
filterItems(searchStr);
}else{
$("#filterInput").focus();
var searchStr = $("#filterInput").val();
filterItems(searchStr);
}
}
else{
if($("#scan-code_keyboard").is(':visible')){
$("#scan-code_keyboard input").focus();
}else{
......@@ -325,126 +423,22 @@
//页码从0开始
var pageIndex = 0;
var partNumberItems = [];
var itemPerPage = 12;
var bgColors = ["bg-blue-madison","bg-green-haze","bg-purple-plum","bg-red-intense","bg-green","bg-yellow","bg-blue","bg-red","bg-purple","bg-blue-ebonyclay","bg-red-sunglo","bg-yellow-crusta"];
showPartNumbers = function(){
$("#opUser").val("");
$("#authErrorMsg").text("");
$("#opUserConfirm").modal("show");
<%--var findAndOutHref = '${ctx}/component/storagePosFind.html';--%>
<%--$("#findAndOut").attr("href",findAndOutHref);--%>
}
opUserOk = function(type){
var opUser = $("#opUser").val();
if(opUser != ""){
$.post("${ctx}/service/store/accshelf/checkAuthCode", {opUser: opUser}, function (data) {
if(data == ""){
$("#opUserConfirm").attr("style","z-index:100000");
$("#opUserConfirm").modal("hide");
$("#opUserConfirm").attr("style","");
$("#searchPn").val("");
$.post("${ctx}/service/store/storageTypeInventory", {type: type, cid: '${show}'}, function (data) {
pageIndex = -1;
partNumberItems = data;
nextPage();
}).error(function(){showMsg("request inventory error");});
}else{
$("#authErrorMsg").text(data);
}
}).error(function(){showMsg("request check user error");});
}
}
nextPage=function(){
pageIndex ++ ;
pageShow();
}
lastPage = function(){
pageIndex -- ;
pageShow();
}
disableBtn = function(){
$("#lastPage").show();
$("#nextPage").show();
$("#footerBtn").show();
//上一页不可用
if(pageIndex <= 0){
$("#lastPage").addClass("disabled");
}else{
$("#lastPage").removeClass("disabled");
}
var totalPage = Math.ceil(partNumberItems.length/itemPerPage);
if(pageIndex + 1 >= totalPage - 1){
$("#nextPage").addClass("disabled");
}else{
$("#nextPage").removeClass("disabled");
}
if(totalPage <= 1){
$("#lastPage").hide();
$("#nextPage").hide();
}
}
pageShow = function(){
var itemStr = "";
var endIndex = itemPerPage * (pageIndex+1);
if(endIndex > partNumberItems.length){
endIndex = partNumberItems.length;
}
for(var index = itemPerPage * pageIndex;index<endIndex;index++){
var pn = partNumberItems[index].partNumber;
itemStr = itemStr + "<div class='col-lg-3 col-md-3 col-sm-6 col-xs-12' onclick='checkoutByPartNumber(\""+pn+"\");'> " +
"<div class='"+bgColors[index%itemPerPage]+" partnumber-box'>"+pn+"</div></div>";
}
if(itemStr == ""){
itemStr = "<div style='font-size: 20px;text-align: center;'>${noReel_label}</div>";
}
$("#partNumberItems").html(itemStr);
disableBtn();
var outPosId = $("#outPosId").val();
$.post("${ctx}/service/store/accshelf/checkOut", {cid:'${show}', opUser: opUser, outPosId: outPosId}, function (data) {
if(data.indexOf("OK") == 0){
$("#opUserConfirm").attr("style","z-index:100000");
$("#opUserConfirm").modal("hide");
$("#opUserConfirm").attr("style","");
showMsg(data);
}else{
$("#authErrorMsg").text(data);
}
//$("#opUserConfirm").modal("hide");
$("#allPartNumbers").modal("show");
}).error(function(){showMsg("request check out error");});
}
$("#searchPn").on('input propertychange',function(){
FilterPnItems();
});
function FilterPnItems(){
$("#lastPage").hide();
$("#nextPage").hide();
var itemStr = "";
var pnForSearch = $("#searchPn").val();
if(pnForSearch == ""){
pageShow();
return;
}
for(var index in partNumberItems){
var pn = partNumberItems[index].partNumber;
if(pn.indexOf(pnForSearch) >= 0){
itemStr = itemStr + "<div class='col-lg-3 col-md-3 col-sm-6 col-xs-12' onclick='checkoutByPartNumber(\""+pn+"\");'> " +
"<div class='"+bgColors[index%itemPerPage]+" partnumber-box'>"+pn+"</div></div>";
}
}
if(itemStr == ""){
itemStr = "<div style='font-size: 20px;text-align: center;'>${noReel_label}</div>";
}
$("#partNumberItems").html(itemStr);
}
closeAllLights = function(){
$.post("${ctx}/service/store/accshelf/op", {opKey: 'closeAll', opValue:'true', cid: '${show}'}, function (data) {
......@@ -470,14 +464,7 @@
}
checkoutByPartNumber = function(partnumber) {
var opUser = $("#opUser").val();
$.post("${ctx}/service/store/accshelf/checkOut", {pn: partnumber, cid: '${show}',opUser:opUser}, function (data) {
$("#allPartNumbers").modal("hide");
showMsg(data);
}).error(function(){showMsg("check out request error");});
}
$(".dataTable").html("");
$(".taskTable").html("");
closeVolume = function(guid){
......@@ -496,7 +483,7 @@
showMsg("");
}
$(".dataTable").html("");
$(".taskTable").html("");
var newRows = [];
//data = [{"key":"12-160023-0-8909000864","tableNo":2,"lineNo":12,"colorClass":"red","shelfLoc":"1-1-2","status":1,"guid":"ABCDEF"}];
for(var item in data) {
......@@ -590,7 +577,7 @@
trLine.attr("style","color:"+trColor);
}else{
var trStr = "<tr id='"+key+"' style='background-color:"+trColor+"'>" + tdStr +"</tr>";
lineBox.find(".dataTable").append(trStr);
lineBox.find(".taskTable").append(trStr);
}
}
......
......@@ -57,39 +57,39 @@
</div>
<div class="row">
<div class="col-md-12">
<!-- BEGIN CHART PORTLET-->
<div class="portlet light bordered">
<div class="portlet-title">
<div class="caption">
<i class="icon-bar-chart font-green-haze"></i>
<span class="caption-subject bold uppercase font-green-haze"><fmt:message key="runStatus.alarmInfo"/></span>
</div>
<div class="tools">
</div>
</div>
<div class="portlet-body">
<div class="row">
<div class="col-md-12">
<div id="alarmChart" class="chart" style="height: 350px; overflow: hidden;">
</div>
</div>
<div class="col-md-6">
<div id="alarmTypeChart" class="chart col-md-6" style="height: 250px; overflow: hidden;">
</div>
</div>
<div class="col-md-6">
<div id="alarmBoxChart" class="chart col-md-6" style="height: 250px; overflow: hidden;">
</div>
</div>
</div>
</div>
</div>
<!-- END CHART PORTLET-->
</div>
</div>
<%--<div class="row">--%>
<%--<div class="col-md-12">--%>
<%--<!-- BEGIN CHART PORTLET-->--%>
<%--<div class="portlet light bordered">--%>
<%--<div class="portlet-title">--%>
<%--<div class="caption">--%>
<%--<i class="icon-bar-chart font-green-haze"></i>--%>
<%--<span class="caption-subject bold uppercase font-green-haze"><fmt:message key="runStatus.alarmInfo"/></span>--%>
<%--</div>--%>
<%--<div class="tools">--%>
<%--</div>--%>
<%--</div>--%>
<%--<div class="portlet-body">--%>
<%--<div class="row">--%>
<%--<div class="col-md-12">--%>
<%--<div id="alarmChart" class="chart" style="height: 350px; overflow: hidden;">--%>
<%--</div>--%>
<%--</div>--%>
<%--<div class="col-md-6">--%>
<%--<div id="alarmTypeChart" class="chart col-md-6" style="height: 250px; overflow: hidden;">--%>
<%--</div>--%>
<%--</div>--%>
<%--<div class="col-md-6">--%>
<%--<div id="alarmBoxChart" class="chart col-md-6" style="height: 250px; overflow: hidden;">--%>
<%--</div>--%>
<%--</div>--%>
<%--</div>--%>
<%--</div>--%>
<%--</div>--%>
<%--<!-- END CHART PORTLET-->--%>
<%--</div>--%>
<%--</div>--%>
<fmt:message key="runStatus.throughput" var="label_throughput"/>
<fmt:message key="runStatus.alarmTimes" var="label_alarmTimes"/>
......@@ -191,202 +191,202 @@
};
inOutChart.setOption(inOutOption);
alarmOption = {
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'shadow',
crossStyle: {
color: '#999'
}
}
},
legend: {
data:['${label_alarmTimes}','${label_alarmLastTime}']
},
grid: {
left: '3%',
right: '4%',
bottom: '3%',
containLabel: true
},
xAxis: [
{
type: 'category',
data: days,
axisPointer: {
type: 'shadow'
}
}
],
yAxis: [
{
type: 'value',
name: '${label_alarmTimes}',
min: 0,
max: 500,
//interval: 5,
minInterval: 1,
axisLabel: {
formatter: '{value} ${label_times}'
}
},
{
type: 'value',
name: '${label_alarmLastTime}(${label_minutes})',
min: 0,
max: 1000,
//interval: 50,
minInterval: 1,
axisLabel: {
formatter: '{value} ${label_minutes}'
}
}
],
series: [
{
name:'${label_alarmTimes}',
type:'line',
symbol: 'emptyCircle',
symbolSize: 10,
itemStyle:{
normal: {
color: '#F3565D'
}
},
data:alarms
}
,
{
name:'${label_alarmLastTime}',
type:'line',
symbol: 'emptyCircle',
stack: '总量',
symbolSize: 10,
itemStyle:{
normal: {
color: '#4b77be'
}
},
areaStyle: {normal: {}},
smooth:true,
symbol: 'none',
sampling: 'average',
yAxisIndex: 1,
data:lastTimes
}
]
};
var alarmChart = echarts.init(document.getElementById("alarmChart"));
alarmChart.setOption(alarmOption);
//报警类型
var types = new Array();
var typeCount = new Array();
var typeLastTimes = new Array();
<c:forEach items="${alarmTypeData}" var="alarmTypeItem">
types.push("${alarmTypeItem.label}");
typeCount.push({name:"${alarmTypeItem.label}",value:${alarmTypeItem.value}});
typeLastTimes.push({name:"${alarmTypeItem.label}",value:${alarmTypeItem.value2}});
</c:forEach>
alarmTypeOption = {
tooltip: {
trigger: 'item',
formatter: "{b} <br/>{a}: {c} ({d}%)"
},
legend: {
orient: 'vertical',
x: 'left',
data:types
},
color: ['#4b8df8','#4da74d','#edc240','#cb4b4b', '#afd8f8','#9440ed','#36d7b7','#b074ff','#749f83','#91c7ae','#d48265','#61a0a8', '#2f4554', '#c23531'],
series: [
{
name:'报警次数',
type:'pie',
selectedMode: 'single',
radius: [0, '40%'],
label: {
normal: {
show: false
}
},
data:typeCount
},
{
name:'报警持续时间',
type:'pie',
radius: ['55%', '75%'],
label: {
normal: {
show: false
}
},
data:typeLastTimes
}
]
};
var alarmTypeChart = echarts.init(document.getElementById("alarmTypeChart"));
alarmTypeChart.setOption(alarmTypeOption);
<%--alarmOption = {--%>
<%--tooltip: {--%>
<%--trigger: 'axis',--%>
<%--axisPointer: {--%>
<%--type: 'shadow',--%>
<%--crossStyle: {--%>
<%--color: '#999'--%>
<%--}--%>
<%--}--%>
<%--},--%>
<%--legend: {--%>
<%--data:['${label_alarmTimes}','${label_alarmLastTime}']--%>
<%--},--%>
<%--grid: {--%>
<%--left: '3%',--%>
<%--right: '4%',--%>
<%--bottom: '3%',--%>
<%--containLabel: true--%>
<%--},--%>
<%--xAxis: [--%>
<%--{--%>
<%--type: 'category',--%>
<%--data: days,--%>
<%--axisPointer: {--%>
<%--type: 'shadow'--%>
<%--}--%>
<%--}--%>
<%--],--%>
<%--yAxis: [--%>
<%--{--%>
<%--type: 'value',--%>
<%--name: '${label_alarmTimes}',--%>
<%--min: 0,--%>
<%--max: 500,--%>
<%--//interval: 5,--%>
<%--minInterval: 1,--%>
<%--axisLabel: {--%>
<%--formatter: '{value} ${label_times}'--%>
<%--}--%>
<%--},--%>
<%--{--%>
<%--type: 'value',--%>
<%--name: '${label_alarmLastTime}(${label_minutes})',--%>
<%--min: 0,--%>
<%--max: 1000,--%>
<%--//interval: 50,--%>
<%--minInterval: 1,--%>
<%--axisLabel: {--%>
<%--formatter: '{value} ${label_minutes}'--%>
<%--}--%>
<%--}--%>
<%--],--%>
<%--series: [--%>
<%--{--%>
<%--name:'${label_alarmTimes}',--%>
<%--type:'line',--%>
<%--symbol: 'emptyCircle',--%>
<%--symbolSize: 10,--%>
<%--itemStyle:{--%>
<%--normal: {--%>
<%--color: '#F3565D'--%>
<%--}--%>
<%--},--%>
<%--data:alarms--%>
<%--}--%>
<%--,--%>
<%--{--%>
<%--name:'${label_alarmLastTime}',--%>
<%--type:'line',--%>
<%--symbol: 'emptyCircle',--%>
<%--stack: '总量',--%>
<%--symbolSize: 10,--%>
<%--itemStyle:{--%>
<%--normal: {--%>
<%--color: '#4b77be'--%>
<%--}--%>
<%--},--%>
<%--areaStyle: {normal: {}},--%>
<%--smooth:true,--%>
<%--symbol: 'none',--%>
<%--sampling: 'average',--%>
<%--yAxisIndex: 1,--%>
<%--data:lastTimes--%>
<%--}--%>
<%--]--%>
<%--};--%>
<%--var alarmChart = echarts.init(document.getElementById("alarmChart"));--%>
<%--alarmChart.setOption(alarmOption);--%>
<%--//报警类型--%>
<%--var types = new Array();--%>
<%--var typeCount = new Array();--%>
<%--var typeLastTimes = new Array();--%>
<%--<c:forEach items="${alarmTypeData}" var="alarmTypeItem">--%>
<%--types.push("${alarmTypeItem.label}");--%>
<%--typeCount.push({name:"${alarmTypeItem.label}",value:${alarmTypeItem.value}});--%>
<%--typeLastTimes.push({name:"${alarmTypeItem.label}",value:${alarmTypeItem.value2}});--%>
<%--</c:forEach>--%>
<%--alarmTypeOption = {--%>
<%--tooltip: {--%>
<%--trigger: 'item',--%>
<%--formatter: "{b} <br/>{a}: {c} ({d}%)"--%>
<%--},--%>
<%--legend: {--%>
<%--orient: 'vertical',--%>
<%--x: 'left',--%>
<%--data:types--%>
<%--},--%>
<%--color: ['#4b8df8','#4da74d','#edc240','#cb4b4b', '#afd8f8','#9440ed','#36d7b7','#b074ff','#749f83','#91c7ae','#d48265','#61a0a8', '#2f4554', '#c23531'],--%>
<%--series: [--%>
<%--{--%>
<%--name:'报警次数',--%>
<%--type:'pie',--%>
<%--selectedMode: 'single',--%>
<%--radius: [0, '40%'],--%>
<%--label: {--%>
<%--normal: {--%>
<%--show: false--%>
<%--}--%>
<%--},--%>
<%--data:typeCount--%>
<%--},--%>
<%--{--%>
<%--name:'报警持续时间',--%>
<%--type:'pie',--%>
<%--radius: ['55%', '75%'],--%>
<%--label: {--%>
<%--normal: {--%>
<%--show: false--%>
<%--}--%>
<%--},--%>
<%--data:typeLastTimes--%>
<%--}--%>
<%--]--%>
<%--};--%>
<%--var alarmTypeChart = echarts.init(document.getElementById("alarmTypeChart"));--%>
<%--alarmTypeChart.setOption(alarmTypeOption);--%>
//报警BOX
var boxs = new Array();
var boxCount = new Array();
var boxLastTimes = new Array();
<c:forEach items="${alarmBoxData}" var="alarmBoxItem">
boxs.push("${alarmBoxItem.label}");
boxCount.push({name:"${alarmBoxItem.label}",value:${alarmBoxItem.value}});
boxLastTimes.push({name:"${alarmBoxItem.label}",value:${alarmBoxItem.value2}});
</c:forEach>
alarmBoxOption = {
tooltip: {
trigger: 'item',
formatter: "{b} <br/>{a}: {c} ({d}%)"
},
legend: {
orient: 'vertical',
x: 'left',
data:boxs
},
series: [
{
name:'报警次数',
type:'pie',
selectedMode: 'single',
radius: [0, '40%'],
label: {
normal: {
show: false
}
},
data:boxCount
},
{
name:'报警持续时间',
type:'pie',
radius: ['55%', '75%'],
label: {
normal: {
show: false
}
},
data:boxLastTimes
}
]
};
var alarmBoxChart = echarts.init(document.getElementById("alarmBoxChart"));
alarmBoxChart.setOption(alarmBoxOption);
<%--var boxs = new Array();--%>
<%--var boxCount = new Array();--%>
<%--var boxLastTimes = new Array();--%>
<%--<c:forEach items="${alarmBoxData}" var="alarmBoxItem">--%>
<%--boxs.push("${alarmBoxItem.label}");--%>
<%--boxCount.push({name:"${alarmBoxItem.label}",value:${alarmBoxItem.value}});--%>
<%--boxLastTimes.push({name:"${alarmBoxItem.label}",value:${alarmBoxItem.value2}});--%>
<%--</c:forEach>--%>
<%--alarmBoxOption = {--%>
<%--tooltip: {--%>
<%--trigger: 'item',--%>
<%--formatter: "{b} <br/>{a}: {c} ({d}%)"--%>
<%--},--%>
<%--legend: {--%>
<%--orient: 'vertical',--%>
<%--x: 'left',--%>
<%--data:boxs--%>
<%--},--%>
<%--series: [--%>
<%--{--%>
<%--name:'报警次数',--%>
<%--type:'pie',--%>
<%--selectedMode: 'single',--%>
<%--radius: [0, '40%'],--%>
<%--label: {--%>
<%--normal: {--%>
<%--show: false--%>
<%--}--%>
<%--},--%>
<%--data:boxCount--%>
<%--},--%>
<%--{--%>
<%--name:'报警持续时间',--%>
<%--type:'pie',--%>
<%--radius: ['55%', '75%'],--%>
<%--label: {--%>
<%--normal: {--%>
<%--show: false--%>
<%--}--%>
<%--},--%>
<%--data:boxLastTimes--%>
<%--}--%>
<%--]--%>
<%--};--%>
<%--var alarmBoxChart = echarts.init(document.getElementById("alarmBoxChart"));--%>
<%--alarmBoxChart.setOption(alarmBoxOption);--%>
......
......@@ -39,6 +39,12 @@
<span class="input-group-addon"><fmt:message key="settings.remind.deadday"/></span>
</div>
</div>
<div class="form-group form-inline">
<div class="input-group margin-top-10">
<form:input path="backupHours" cssClass="form-control input-small"/>
<span class="input-group-addon"><fmt:message key="settings.miniStock.hours"/></span>
</div>
</div>
</div>
<div class="portlet-title">
......
......@@ -52,11 +52,7 @@
<%--</a>--%>
<%--</li>--%>
<li class="classic-menu-dropdown">
<a href="${ctx}/workOrder/checkOutSettings.html" name="workOrder">
<fmt:message key="menu.outRule"/><span class="selected"></span>
</a>
</li>
</security:authorize>
</ul>
</security:authorize>
......@@ -89,12 +85,6 @@
<fmt:message key="menu.barCode.search"/><span class="selected"></span>
</a>
</li>
<li class="classic-menu-dropdown">
<a href="${ctx}/barcode/barcodeSettings.html" name="barcode">
<fmt:message key="menu.barCode.settings"/><span class="selected"></span>
</a>
</li>
</ul>
</security:authorize>
......@@ -151,6 +141,17 @@
</security:authorize>
<li class="classic-menu-dropdown">
<a href="${ctx}/system/barcodeSettings.html" name="system">
<fmt:message key="menu.barCode.settings"/><span class="selected"></span>
</a>
</li>
<li class="classic-menu-dropdown">
<a href="${ctx}/system/checkOutSettings.html" name="system">
<fmt:message key="menu.outRule"/><span class="selected"></span>
</a>
</li>
<security:authorize ifAnyGranted="ROLE_MANAGE_ROLE,ROLE_MANAGE_USER">
<li class="classic-menu-dropdown">
<a href="${ctx}/system/storageSearch.html" name="system">
......@@ -158,6 +159,8 @@
</a>
</li>
</security:authorize>
</ul>
</div>
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!