Commit 788296b6 sunke

扫码料架

日历框中文乱码问题
1 个父辈 d5453cda
...@@ -179,6 +179,13 @@ public class Storage extends BaseMongoBean { ...@@ -179,6 +179,13 @@ public class Storage extends BaseMongoBean {
return StorageConstants.TYPE.ACCSHELF.name().equals(type); return StorageConstants.TYPE.ACCSHELF.name().equals(type);
} }
/**
* 是否是扫码料架
*/
public boolean isCodeShelf() {
return StorageConstants.TYPE.CODESHELF.name().equals(type);
}
/** /**
* 是否是料柜 * 是否是料柜
......
...@@ -218,6 +218,11 @@ public class StorageConstants { ...@@ -218,6 +218,11 @@ public class StorageConstants {
*/ */
NEWSHELF("storage.type.newShelf"), NEWSHELF("storage.type.newShelf"),
/**
* 9 扫码料架
*/
CODESHELF("storage.type.codeShelf"),
; ;
private String key; private String key;
......
package com.myproject.webapp.controller.storage;
import com.google.common.base.Strings;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import com.myproject.bean.CodeBean;
import com.myproject.bean.json.InventoryItem;
import com.myproject.bean.json.UsageItem;
import com.myproject.bean.update.Barcode;
import com.myproject.bean.update.DataLog;
import com.myproject.bean.update.Storage;
import com.myproject.bean.update.StoragePos;
import com.myproject.dao.mongo.IDataLogDao;
import com.myproject.exception.ValidateException;
import com.myproject.manager.IBarcodeManager;
import com.myproject.manager.IStoragePosManager;
import com.myproject.util.StorageConstants;
import com.myproject.webapp.controller.webService.DataCache;
import com.myproject.webapp.controller.webService.ITaskService;
import com.myproject.webapp.controller.webService.StorageDataController;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
/**
* 扫码料架
*/
@Controller
public class CodeShelfController extends BaseController {
@Autowired
private DataCache dataCache;
@Autowired
private ITaskService taskService;
@Autowired
protected IStoragePosManager storagePosManager;
@Autowired
protected IBarcodeManager barcodeManager;
@Autowired
private IDataLogDao dataLogDao;
//上一次入库的库位,用于扫下一条码时灭灯
private static Map<String,StoragePos> lastPutinPosMap = new ConcurrentHashMap<>();
@RequestMapping("/storage/codeShelf")
public String cabinetView(HttpServletRequest request, HttpSession httpSession){
Map<String, UsageItem> sizeMap = new HashMap<>();
for (Storage storage : dataCache.getAllStorage().values()) {
if(storage.isCodeShelf()){
for (UsageItem usageItem : storage.getUsageMap().values()) {
String sizeStr = usageItem.getSizeStr();
sizeMap.put(sizeStr, usageItem);
}
}
}
List<UsageItem> usageItemList = new ArrayList<>(sizeMap.values());
usageItemList.sort(new Comparator<UsageItem>() {
@Override
public int compare(UsageItem o1, UsageItem o2) {
if(o1.getW() != o2.getW()){
return o1.getW() - o2.getW();
}else{
return o1.getH() - o2.getH();
}
}
});
request.setAttribute("usageItemList",usageItemList);
return "storage/codeShelf";
}
/**
*
*/
@RequestMapping("/service/store/codeShelf/op")
@ResponseBody
public String clientOp(HttpServletRequest request){
final String opKey = request.getParameter("opKey");
String opValue = request.getParameter("opValue");
String cid = request.getParameter("cid");
log.info(cid + "界面执行操作:" + opKey + "=" + opValue);
StorageDataController.addOp(cid,opKey, opValue);
return "OK"+getText("shelf.msg.opSucess",request.getLocale(),"操作成功");
}
/**
* 关闭上一个入库库位(与给定库位一致才进行关闭)
*/
private void closeLastPutInPos(String sessionId, String posNameToCheck){
StoragePos lastPutinPos= lastPutinPosMap.get(sessionId);
if(lastPutinPos != null){
boolean needToClose = true;
if(posNameToCheck != null && !posNameToCheck.isEmpty()){
//相同的库位才进行关闭
needToClose = lastPutinPos.getPosName().equals(posNameToCheck);
}
if(needToClose){
log.info(sessionId + "关闭库位:"+ lastPutinPos.getPosName());
lastPutinPosMap.remove(sessionId);
opPosLight("close", lastPutinPos, "");
}
}
}
/**
* 查找下一个空位,并且点亮灯
*/
@RequestMapping("/service/store/codeShelf/codeIn")
@ResponseBody
public String outFromShelf(HttpServletRequest request, HttpSession httpSession){
String sessionId = httpSession.getId();
String codeStr = request.getParameter("code");
if(!Strings.isNullOrEmpty(codeStr)){
StoragePos pos = storagePosManager.getByPosName(codeStr);
if(pos != null){
closeLastPutInPos(sessionId, null);
//扫描的为库位条码,库位中没有物料的话点亮库位灯
Storage currentStorage = dataCache.getStorageById(pos.getStorageId());
if(currentStorage == null || !currentStorage.isCodeShelf()){
return getText("shelf.msg.notFound",request.getLocale(),"未找到料架");
}
if(pos.getBarcode() != null){
return "库位中已有物料";
}else{
//设置上一个入库操作库位
lastPutinPosMap.put(sessionId, pos);
return "OK操作成功,请扫描要放入的物料";
}
}else{
//扫的是物料条码
CodeBean codeBean = dataCache.resolveSingleCode(codeStr);
if(codeBean.isValid()){
Barcode barcode = codeBean.getBarcode();
try {
if(barcode.getPlateSize() == 1){
//长宽为1的需要弹框设置尺寸
throw new ValidateException("error.barcode.errorSize","条码未设置尺寸");
}
long now = System.currentTimeMillis();
//5秒内同一个条码忽略
Date usedDate = barcode.getUsedDate();
if(usedDate != null && now - usedDate.getTime() < 5000){
return "条码操作频繁,请稍后再试";
}
StoragePos inPos = storagePosManager.getByBarcodeId(barcode.getId());
if(inPos != null){
Collection<DataLog> allTasks = taskService.getQueueTasks();
for (DataLog task : allTasks) {
if(task.isCheckOutTask() && task.getBarcode() != null && task.getBarcode().equals(barcode.getBarcode())){
taskService.addTaskToFinished(inPos,null,null);
opPosLight("close",inPos,null);
return "OK"+getText("shelf.msg.outConfirm",new String[]{inPos.getPosName()},request.getLocale(),"出库完成, 库位["+inPos.getPosName()+"]灭灯");
}
}
return getText("shelf.msg.noTask",new String[]{inPos.getPosName()},request.getLocale(),"操作失败,已在库位["+inPos.getPosName()+"]中,未找到对应的出库任务");
}
//入库
StoragePos lastPutinPos= lastPutinPosMap.get(sessionId);
if(lastPutinPos == null){
return "请先扫描库位码";
}
int delayCloseTime = 30000;
String color = "red";
if(lastPutinPos != null){
log.info(barcode.getPartNumber()+" [ "+barcode.getBarcode()+" ] " + "入库到:" + lastPutinPos.getPosName());
lastPutinPos.setCanCheckOutTime(System.currentTimeMillis() + delayCloseTime);
taskService.addTaskToFinished(lastPutinPos,barcode,null);
openAndCloseLights(sessionId, lastPutinPos,color,delayCloseTime);
lastPutinPosMap.put(sessionId, lastPutinPos);
return "OK"+getText("shelf.msg.inOk",new String[]{lastPutinPos.getPosName()},request.getLocale(),"操作成功,请放入库位["+lastPutinPos.getPosName()+"]");
}else{
//库位没找到
String sizeInfo = barcode.getPlateSize()+" x "+ barcode.getHeight();
String msg = "未找到适合["+sizeInfo +"]的库位";
log.info(msg);
msg = getText("shelf.msg.inError",new String[]{sizeInfo},request.getLocale(),msg);
return msg;
}
} catch (ValidateException e) {
log.error("Error:"+e.getMessage());
return getText(e.getMessage(), e.getParams(),request.getLocale(),e.getMessage());
}
}else{
String msg = getText(codeBean.getErrorCode(),codeBean.getParams(),request.getLocale(),codeBean.getError());
return msg;
}
}
}
return "";
}
/**
* 开灯, 等30秒后关闭
*/
private void openAndCloseLights(final String sessionId, final StoragePos pos, String color, final long delayCloseTime){
if(pos == null){
return;
}
final Storage storage = dataCache.getStorageById(pos.getStorageId());
final String cid = storage.getCid();
String lightOnStr = pos.getPosName() + "=" + color;
StorageDataController.appendOp(cid,"open", lightOnStr);
log.info("点亮库位:" + lightOnStr);
//5秒后灭灯
Thread closeTask = new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(delayCloseTime);
closeLastPutInPos(sessionId, pos.getPosName());
}catch (Exception e){
}
}
});
closeTask.start();
}
/**
* 查找下一个空位,并且点亮灯
*/
@RequestMapping("/service/store/codeShelf/checkAll")
@ResponseBody
public String checkAll(HttpServletRequest request){
String cid = request.getParameter("cid");
log.info(cid + "界面执行检查库位操作");
Storage storage = dataCache.getStorage(cid);
if(storage == null){
return getText("shelf.msg.notFound",request.getLocale(),"未找到料架");
}
List<StoragePos> allPos = storagePosManager.findNotEmptyByStorageId(storage.getId());
for (StoragePos pos : allPos) {
opPosLight("open",pos,"Green");
}
return "OK"+getText("shelf.msg.opSucess",request.getLocale(),"操作成功");
}
/**
* 操作库位灯(开灯,或关灯)
* @param opKey
* @param pos
* @param colorStr
*/
private void opPosLight(String opKey, StoragePos pos, String colorStr){
String opStr = pos.getPosName();
if(!Strings.isNullOrEmpty(colorStr)){
opStr =opStr+ "=" + colorStr;
}
Storage storage = dataCache.getStorageById(pos.getStorageId());
StorageDataController.appendOp(storage.getCid(), opKey , opStr);
log.info("操作库位["+pos.getPosName()+"]" + opKey + " : " + opStr);
}
@RequestMapping(value = "/service/store/codeShelf/inventory")
@ResponseBody
public Collection<InventoryItem> storageInventory(HttpServletRequest request) {
List<Storage> codeShelfList = new ArrayList<>();
for (Storage storage : dataCache.getAllStorage().values()) {
if(storage.isCodeShelf()){
codeShelfList.add(storage);
}
}
return dataCache.getInventory(codeShelfList).values();
}
@RequestMapping(value = "/service/store/codeShelf/currentPos")
@ResponseBody
public StoragePos getCurrentPos(HttpSession httpSession){
String sessionId = httpSession.getId();
StoragePos currentPos = lastPutinPosMap.get(sessionId);
return currentPos;
}
}
...@@ -557,9 +557,10 @@ public class DataCache{ ...@@ -557,9 +557,10 @@ public class DataCache{
return null; return null;
} }
public Storage reloadStorage(Storage storage){ public Storage reloadStorage(Storage storage) throws ValidateException {
List<PlateSizeBean> plateSizeBeanList = storagePosManager.getStoragePosUsage(storage.getId()); List<PlateSizeBean> plateSizeBeanList = storagePosManager.getStoragePosUsage(storage.getId());
storage.initUsage(plateSizeBeanList); storage.initUsage(plateSizeBeanList);
storage = storageManager.save(storage);
allStorage.put(storage.getCid(), storage); allStorage.put(storage.getCid(), storage);
return storage; return storage;
} }
...@@ -601,14 +602,20 @@ public class DataCache{ ...@@ -601,14 +602,20 @@ public class DataCache{
* 获取库存信息,key 为 PN * 获取库存信息,key 为 PN
*/ */
public Map<String,InventoryItem> getAllInventory(){ public Map<String,InventoryItem> getAllInventory(){
Map<String,InventoryItem> allInventory = Maps.newHashMap();
Map<String, Storage> allStorages = getAllStorage(); Map<String, Storage> allStorages = getAllStorage();
for (String cid : allStorages.keySet()) { return getInventory(allStorages.values());
Map<String, InventoryItem> storageInventory = getStorageInventory(cid); }
/**
* 获取某些料仓的库存信息
*/
public Map<String,InventoryItem> getInventory(Collection<Storage> storageList){
Map<String,InventoryItem> resultMap = Maps.newHashMap();
for (Storage storage : storageList) {
Map<String, InventoryItem> storageInventory = getStorageInventory(storage.getCid());
for(InventoryItem storageInventoryItem : storageInventory.values()){ for(InventoryItem storageInventoryItem : storageInventory.values()){
String partNumber = storageInventoryItem.getPartNumber(); String partNumber = storageInventoryItem.getPartNumber();
InventoryItem pnInventoryItem = allInventory.get(storageInventoryItem.getPartNumber()); InventoryItem pnInventoryItem = resultMap.get(storageInventoryItem.getPartNumber());
if(pnInventoryItem == null){ if(pnInventoryItem == null){
pnInventoryItem = new InventoryItem(); pnInventoryItem = new InventoryItem();
} }
...@@ -617,12 +624,15 @@ public class DataCache{ ...@@ -617,12 +624,15 @@ public class DataCache{
pnInventoryItem.setLockCount(pnInventoryItem.getLockCount() + storageInventoryItem.getLockCount()); pnInventoryItem.setLockCount(pnInventoryItem.getLockCount() + storageInventoryItem.getLockCount());
pnInventoryItem.setStockReel(pnInventoryItem.getStockReel() + storageInventoryItem.getStockReel()); pnInventoryItem.setStockReel(pnInventoryItem.getStockReel() + storageInventoryItem.getStockReel());
pnInventoryItem.setLockReel(pnInventoryItem.getLockReel() + storageInventoryItem.getLockReel()); pnInventoryItem.setLockReel(pnInventoryItem.getLockReel() + storageInventoryItem.getLockReel());
allInventory.put(partNumber,pnInventoryItem); resultMap.put(partNumber,pnInventoryItem);
} }
} }
return allInventory; return resultMap;
} }
/**
* 获取料仓的库存信息
*/
public Map<String, InventoryItem> getStorageInventory(String cid){ public Map<String, InventoryItem> getStorageInventory(String cid){
Map<String, InventoryItem> storageInventory = inventoryMap.get(cid); Map<String, InventoryItem> storageInventory = inventoryMap.get(cid);
if(storageInventory == null){ if(storageInventory == null){
......
...@@ -349,13 +349,6 @@ ...@@ -349,13 +349,6 @@
<c:set var="scripts" scope="request"> <c:set var="scripts" scope="request">
<script> <script>
$('.date-picker').datepicker({
rtl: Metronic.isRTL(),
orientation: "left",
autoclose: true,
language:'${locale}'
});
var limitCodes = "${limitCodes}".split(","); var limitCodes = "${limitCodes}".split(",");
for (i=0;i<limitCodes.length ;i++ ) { for (i=0;i<limitCodes.length ;i++ ) {
var limitClass = ".limit"+limitCodes[i]; var limitClass = ".limit"+limitCodes[i];
......
...@@ -174,12 +174,16 @@ ...@@ -174,12 +174,16 @@
<c:set var="detailUrl" value="${ctx}/storage/accShelf/${storage.cid}"/> <c:set var="detailUrl" value="${ctx}/storage/accShelf/${storage.cid}"/>
</c:if> </c:if>
<c:if test="${storage.codeShelf}">
<c:set var="detailUrl" value="${ctx}/storage/codeShelf"/>
</c:if>
<c:if test="${storage.virtual}"> <c:if test="${storage.virtual}">
<c:set var="detailUrl" value="${ctx}/storage/virtual/${storage.cid}"/> <c:set var="detailUrl" value="${ctx}/storage/virtual/${storage.cid}"/>
</c:if> </c:if>
<div class="portlet box green-haze tasks-widget"> <div class="portlet box green-haze tasks-widget">
<c:choose> <c:choose>
<c:when test="${storage.shelf || storage.cabinet || storage.accShelf || storage.virtual}"> <c:when test="${storage.shelf || storage.cabinet || storage.accShelf || storage.virtual || storage.codeShelf}">
<%--智能料架--%> <%--智能料架--%>
<div class="portlet-title"> <div class="portlet-title">
<div style="text-align:center;font-size: 28px;"><a style="color:#FFFFFF;" href="${detailUrl}">${storage.name}</a></div> <div style="text-align:center;font-size: 28px;"><a style="color:#FFFFFF;" href="${detailUrl}">${storage.name}</a></div>
...@@ -805,12 +809,14 @@ ...@@ -805,12 +809,14 @@
var allContent = $(".task-content"); var allContent = $(".task-content");
allContent.each(function(index){ allContent.each(function(index){
var itemCount = $(this).children(".itembox").size();
$(this).attr("style","height:"+itemCount*34+"px;");
if(index % 2 == 1){ if(index % 2 == 1){
var height = $(this).attr("style"); var height = $(this).attr("style");
if(height){ if(height){
return; return;
} }
var itemCount = $(this).children(".itembox").size();
var lastContent = allContent.eq(index -1); var lastContent = allContent.eq(index -1);
var lastItemCount = lastContent.children(".itembox").size(); var lastItemCount = lastContent.children(".itembox").size();
if(itemCount < lastItemCount){ if(itemCount < lastItemCount){
......
<%@ page import="com.myproject.util.StorageConstants" %>
<%@ include file="/common/taglibs.jsp" %>
<%@ page language="java" pageEncoding="UTF-8" %>
<style type="text/css">
.box{
margin-top: 10px;
}
.alert{
padding:8px;
}
.partnumber-box{
height: 100px;text-align: center;
padding-top:35px;
margin-bottom:10px;
font-size: 16px;
vertical-align: middle;
word-wrap:break-word ;
cursor: pointer;
}
.table-scrollable{
overflow-y: auto;
}
</style>
<link href="${ctx}/scripts/lobibox/css/lobibox.min.css?id=2" rel="stylesheet" type="text/css"/>
<div class="row" id="codeBox">
<div class="col-md-6 col-sm-6">
<input type="text" class="form-control" id="scan-code"/>
</div>
<div class="col-md-6 col-sm-6">
<div class="alert alert-success" id="msg">&nbsp;
</div>
</div>
</div>
<div class="row">
<div class="col-md-12 col-sm-12">
<!-- BEGIN EXAMPLE TABLE PORTLET-->
<div class="portlet box blue">
<div class="portlet-title">
<div class="caption">
${storage.name}
</div>
<div class="actions">
<%--<button type="button" class="btn btn-fit-height default" onclick="checkAllPos();">--%>
<%--<fmt:message key="shelf.btn.posCheck"/>--%>
<%--</button>--%>
<%--<button type="button" class="btn btn-fit-height default" onclick="closeAllLights();">--%>
<%--<fmt:message key="shelf.btn.closeAll"/>--%>
<%--</button>--%>
<button type="button" class="btn btn-fit-height yellow" onclick="showPartNumbers();">
<i class="fa fa-sign-out"></i><fmt:message key="button.checkout"/>
</button>
</div>
</div>
<div class="portlet-body">
<div class="table-scrollable" style="height:400px;">
<table class="table table-striped table-hover table-bordered no-footer" role="grid" aria-describedby="sample_editable_1_info">
<thead>
<tr role="row">
<th><fmt:message key="barcode.barcode"/></th>
<th><fmt:message key="barcode.partNumber"/></th>
<th><fmt:message key="checkOut.pos"/></th>
<th><fmt:message key="dataLog.type"/></th>
<th><fmt:message key="dataLog.status"/></th>
<th><fmt:message key="dataLog.date"/></th>
</tr>
</thead>
<tbody class="dataTable">
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tbody>
</table>
</div>
</div>
</div>
<!-- END EXAMPLE TABLE PORTLET-->
</div>
</div>
<div id="allPartNumbers" 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>
<input type="text" class="form-control" id="searchPn"/>
</div>
<div class="modal-body">
<div class="row" id="partNumberItems">
<div class="col-lg-3 col-md-3 col-sm-3 col-xs-3">
<div class="bg-blue-madison partnumber-box">xxx</div>
</div>
</div>
</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>
</div>
</div>
<div id="sizeConfirm" 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" style="font-weight: 500;"><fmt:message key="shelf.size.title"/></h4>
</div>
<div class="modal-body">
<div class="row">
<c:forEach items="${usageItemList}" var="usageItem">
<div class="col-lg-3 col-md-3 col-sm-3 col-xs-3">
<div class="bg-blue-madison partnumber-box psizeBox">${usageItem.sizeStr}</div>
</div>
</c:forEach>
</div>
</div>
<div class="modal-footer">
<%--<button type="button" data-dismiss="modal" class="btn default" id="cancelAuthBtn">取消</button>--%>
</div>
</div>
</div>
</div>
<fmt:message key="op.1" var="op.1"/>
<fmt:message key="op.2" var="op.2"/>
<fmt:message key="inOutList.in" var="in_label"/>
<fmt:message key="inOutList.out" var="out_label"/>
<fmt:message key="op.status.wait" var="op_status_wait"/>
<fmt:message key="op.status.executing" var="op_status_executing"/>
<fmt:message key="op.status.pause" var="op_status_pause"/>
<fmt:message key="op.status.finished" var="op_status_finished"/>
<fmt:message key="op.status.cancel" var="op_status_cancel"/>
<fmt:message key="op.status.end" var="op_status_end"/>
<c:set var="scripts" scope="request">
<script type="text/javascript">
function showMsg(msg){
if(msg == ""){
$("#msg").attr("class","");
$("#msg").text("");
}else{
var error = true;
if(msg.indexOf("OK") == 0){
error = false;
msg = msg.substr(2);
}
if(msg.indexOf("0") == 0){
error = false;
msg = msg.substr(1);
}
if(msg.indexOf("x") == 0){
msg = msg.substr(1);
}
if(error){
$("#msg").attr("class","alert alert-danger");
}else{
$("#msg").attr("class","alert alert-success");
}
$("#msg").text(msg);
}
}
$("#scan-code").change(function () {
var codeValue = $(this).val();
$(this).val("");
showMsg("");
$(this).attr("placeholder", codeValue);
$.post("${ctx}/service/store/codeShelf/codeIn", {cid: '${show}', code: codeValue}, function (data) {
showMsg(data);
if(data.indexOf("x") == 0){
//弹框,添加=7x8=尺寸信息后重新请求
$("#sizeConfirm").modal("show");
}
});
});
$(".psizeBox").click(function(){
$("#sizeConfirm").modal("hide");
var codeValue = $("#scan-code").attr("placeholder");
var sizeStr = $(this).text();
if(codeValue){
var newCodeStr = "="+sizeStr+"="+codeValue;
$.post("${ctx}/service/store/codeShelf/codeIn", {cid: '${show}', code: newCodeStr}, function (data) {
showMsg(data);
});
}
});
setInterval(function(){
if($('#allPartNumbers').is(':visible')) {
$("#searchPn").focus();
}else{
$("#scan-code").focus();
}
}, 1000);
//页码从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(type){
var findAndOutHref = '${ctx}/component/storagePosFind.html';
$("#findAndOut").attr("href",findAndOutHref);
$("#searchPn").val("");
$.post("${ctx}/service/store/codeShelf/inventory", {}, function (data) {
pageIndex = -1;
partNumberItems = data;
nextPage();
});
}
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();
$("#allPartNumbers").modal("show");
}
$("#searchPn").on('input propertychange',function(){
FilterPnItems();
});
function FilterPnItems(){
$("#lastPage").hide();
$("#nextPage").hide();
var itemStr = "";
var pnForSearch = $("#searchPn").val();
if(pnForSearch == ""){
pageShow();
return;
}
$.post("${ctx}/service/store/resolveBarcode", {code: pnForSearch}, function (data) {
var thePn = pnForSearch;
if (data.error == null) {
thePn = data.barcode.partNumber;
}
for(var index in partNumberItems){
var pn = partNumberItems[index].partNumber;
if(pn.indexOf(thePn) >= 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/codeShelf/op", {opKey: 'closeAll', opValue:'true', cid: '${show}'}, function (data) {
showMsg(data);
waitting();
});
}
checkAllPos = function(){
$.post("${ctx}/service/store/codeShelf/checkAll", {cid: '${show}'}, function (data) {
showMsg(data);
waitting();
});
}
checkoutByPartNumber = function(partnumber) {
$.post("${ctx}/service/store/checkout.html", {pn: partnumber, cid: '${show}',cl:'0'}, function (data) {
$("#allPartNumbers").modal("hide");
showMsg(data);
waitting();
});
}
function updateTasks(cid,seconds){
//任务列表
$.post("${ctx}/service/store/tasks", {cid: cid, seconds:seconds}, function (data) {
$(".dataTable").html("");
for(var item in data){
var taskId = data[item].id;
var partNumber = data[item].partNumber;
var barcode = data[item].barcode;
var posStr = data[item].posStr;
var typeStr = "${in_label}";
if(data[item].type == 2){//出库
typeStr = "${out_label}";
}
var statusStr = "";
if(data[item].cancel){
statusStr ="${op_status_cancel}";
} else if(data[item].executing){
statusStr ="${op_status_executing}";
}else if(data[item].finished){
statusStr ="${op_status_finished}";
}else if(data[item].wait){
statusStr ="${op_status_wait}";
}else if(data[item].end){
statusStr ="${op_status_end}";
}
var dateStr = data[item].updateDateStr;
var tdStr =
"<td>"+barcode+"</td>"+
"<td>"+partNumber+"</td>"+
"<td>"+posStr+"</td>"+
"<td>"+typeStr+"</td>"+
"<td><span class='label label-sm label-"+data[item].status.toLowerCase()+"'>"+statusStr+"</span></td>"+
"<td>"+dateStr+"</td>";
var trStr = "<tr>" + tdStr+ "</tr>";
$(".dataTable").append(trStr);
}
});
}
//updateTasks('${show}',-10*60);
setInterval(function(){
updateTasks('${show}',-10*60);
}, 1000);
waitting = function(){
Metronic.blockUI({
iconOnly: true,
overlayColor: '#4b8df8'
});
window.setTimeout(function() {
Metronic.unblockUI();
}, 1500);
}
</script>
</c:set>
\ No newline at end of file \ No newline at end of file
...@@ -4,12 +4,12 @@ ...@@ -4,12 +4,12 @@
*/ */
;(function($){ ;(function($){
$.fn.datepicker.dates['zh-CN'] = { $.fn.datepicker.dates['zh-CN'] = {
days: ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"], days: ["\u661F\u671F\u65E5", "\u661F\u671F\u4E00", "\u661F\u671F\u4E8C", "\u661F\u671F\u4E09", "\u661F\u671F\u56DB", "\u661F\u671F\u4E94", "\u661F\u671F\u516D", "\u661F\u671F\u65E5"],
daysShort: ["周日", "周一", "周二", "周三", "周四", "周五", "周六", "周日"], daysShort: ["\u5468\u65E5", "\u5468\u4E00", "\u5468\u4E8C", "\u5468\u4E09", "\u5468\u56DB", "\u5468\u4E94", "\u5468\u516D", "\u5468\u65E5"],
daysMin: ["日", "一", "二", "三", "四", "五", "六", "日"], daysMin: ["\u65E5", "\u4E00", "\u4E8C", "\u4E09", "\u56DB", "\u4E94", "\u516D", "\u65E5"],
months: ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"], months: ["\u4E00\u6708", "\u4E8C\u6708", "\u4E09\u6708", "\u56DB\u6708", "\u4E94\u6708", "\u516D\u6708", "\u4E03\u6708", "\u516B\u6708", "\u4E5D\u6708", "\u5341\u6708", "\u5341\u4E00\u6708", "\u5341\u4E8C\u6708"],
monthsShort: ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"], monthsShort: ["\u4E00\u6708", "\u4E8C\u6708", "\u4E09\u6708", "\u56DB\u6708", "\u4E94\u6708", "\u516D\u6708", "\u4E03\u6708", "\u516B\u6708", "\u4E5D\u6708", "\u5341\u6708", "\u5341\u4E00\u6708", "\u5341\u4E8C\u6708"],
today: "今日", today: "\u4ECA\u65E5",
weekStart: 1 weekStart: 1
}; };
$.fn.datepicker.dates['en'] = { $.fn.datepicker.dates['en'] = {
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!