Commit 2c8a7a76 sunke

新增库位管理功能

1 个父辈 afe0c59c
...@@ -34,6 +34,9 @@ public class UsageItem { ...@@ -34,6 +34,9 @@ public class UsageItem {
} }
public int getUsedCount() { public int getUsedCount() {
if(usedCount > totalCount){
return totalCount;
}
return usedCount; return usedCount;
} }
......
package com.myproject.bean.qisda;
import com.myproject.bean.update.StoragePos;
import com.myproject.bean.update.qisda.OutItem;
import java.util.ArrayList;
import java.util.List;
/**
* Created by sunke on 2020/12/2.
* 需求单详情绑定
*/
public class OutItemBindBean {
public OutItemBindBean(OutItem outItem) {
this.outItem = outItem;
}
private OutItem outItem;
private List<StoragePos> bindReelPosList = new ArrayList<>();
public List<StoragePos> getBindReelPosList() {
return bindReelPosList;
}
public void setBindReelPosList(List<StoragePos> bindReelPosList) {
this.bindReelPosList = bindReelPosList;
}
public OutItem getOutItem() {
return outItem;
}
public void setOutItem(OutItem outItem) {
this.outItem = outItem;
}
public void addBindPos(StoragePos pos){
bindReelPosList.add(pos);
}
public StoragePos takeOnePos(){
StoragePos pos = null;
if(bindReelPosList.size() > 0){
pos = bindReelPosList.get(0);
bindReelPosList.remove(pos);
}
return pos;
}
public Integer getBindReelCount(){
return bindReelPosList.size();
}
}
package com.myproject.bean.search;
/**
* Created by kangmor on 2015/12/4.
*/
public class StoragePosManageCriteria extends BaseSearchCriteria {
/**
* 类型
*/
private Boolean enabled = false;
private String storageId;
private String posName;
public String getStorageId() {
return storageId;
}
public void setStorageId(String storageId) {
this.storageId = storageId;
}
public Boolean getEnabled() {
return enabled;
}
public void setEnabled(Boolean enabled) {
this.enabled = enabled;
}
public String getPosName() {
return posName;
}
public void setPosName(String posName) {
this.posName = posName;
}
}
package com.myproject.webapp.controller.storage;
import com.google.common.base.Strings;
import com.myproject.bean.search.BaseSearchCriteria;
import com.myproject.bean.search.PageList;
import com.myproject.bean.search.StoragePosFindCriteria;
import com.myproject.bean.search.StoragePosManageCriteria;
import com.myproject.bean.update.Storage;
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 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;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import java.util.regex.Pattern;
/**
* Created by kangmor on 2015/12/4.
*/
@Controller
public class StoragePosManageController extends BaseSearchController {
@Autowired
protected IStoragePosManager storagePosManager;
@Autowired
protected ITaskService taskService;
@Autowired
protected DataCache dataCache;
public final static String SUCCESS_VIEW = "storage/storagePosManage";
@RequestMapping("/storage/storagePosManage*")
public String onSubmit(@ModelAttribute("searchCriteria") StoragePosManageCriteria searchCriteria, HttpServletRequest request) {
List<Storage> storages = new ArrayList<>(dataCache.getAllStorage().values());
storages.sort(new Comparator<Storage>() {
@Override
public int compare(Storage o1, Storage o2) {
return o1.getCid().compareTo(o2.getCid());
}
});
request.setAttribute("allStorage",storages);
Query query = new Query();
Criteria baseCriteria = new Criteria();
if(searchCriteria.getEnabled() != null){
baseCriteria.and("enabled").is(searchCriteria.getEnabled());
}
String storageId = searchCriteria.getStorageId();
if(!Strings.isNullOrEmpty(storageId)){
baseCriteria.and("storageId").is(storageId);
}
String posName = searchCriteria.getPosName();
if(!Strings.isNullOrEmpty(posName)){
Pattern pattern = Pattern.compile(posName, Pattern.CASE_INSENSITIVE);
baseCriteria.and("posName").regex(pattern);
}
query.addCriteria(baseCriteria);
//最近入库的
//query.with(new Sort(Sort.Direction.ASC,"updateDate"));
PageList pageList = searchCriteria.getPageList();
if("id".equals(pageList.getSortCriterion())){
pageList.setSortCriterion("updateDate");
pageList.setSortDirection(SortOrderEnum.DESCENDING);
}
//导出
if (request.getParameter(TableTagParameters.PARAMETER_EXPORTING) != null){
pageList.setPageNumber(-1);
}
searchCriteria.setPageList(storagePosManager.findByQuery(query, pageList));
return SUCCESS_VIEW;
}
private Criteria addLikeParam(Criteria criteria,HttpServletRequest request, String fieldStr){
String fieldValue = request.getParameter(fieldStr);
if(!Strings.isNullOrEmpty(fieldValue)){
Pattern pattern = Pattern.compile(fieldValue, Pattern.CASE_INSENSITIVE);
criteria.and("barcode."+fieldStr).regex(pattern);
request.setAttribute(fieldStr,fieldValue);
}
return criteria;
}
@Override
protected BaseSearchCriteria getNewSearchCriteria() {
return new StoragePosManageCriteria();
}
}
...@@ -730,6 +730,11 @@ public class TaskService implements ITaskService { ...@@ -730,6 +730,11 @@ public class TaskService implements ITaskService {
//从正在执行和等待列表中移除 //从正在执行和等待列表中移除
taskMap.remove(task.getId()); taskMap.remove(task.getId());
String barcode = task.getBarcode(); String barcode = task.getBarcode();
if(task.isExecuting() || task.isWait()){
task.setStatus(StorageConstants.OP_STATUS.CANCEL.name());
}
if(!Strings.isNullOrEmpty(barcode)){ if(!Strings.isNullOrEmpty(barcode)){
task.setStopSendToQisda(true); task.setStopSendToQisda(true);
task.setStatus(StorageConstants.OP_STATUS.CANCEL.name()); task.setStatus(StorageConstants.OP_STATUS.CANCEL.name());
...@@ -770,10 +775,16 @@ public class TaskService implements ITaskService { ...@@ -770,10 +775,16 @@ public class TaskService implements ITaskService {
public boolean cancelTask(String taskId) { public boolean cancelTask(String taskId) {
DataLog task = dataLogDao.findOneById(taskId); DataLog task = dataLogDao.findOneById(taskId);
if(task != null){ if(task != null){
List<DataLog> tasks = dataLogDao.findUnExecuteTasks(task.getBarcode(), task.getType()); String barcode = task.getBarcode();
for (DataLog dataLog : tasks) { if(Strings.isNullOrEmpty(barcode)){
cancelTask(dataLog); cancelTask(task);
}else{
List<DataLog> tasks = dataLogDao.findUnExecuteTasks(barcode, task.getType());
for (DataLog dataLog : tasks) {
cancelTask(dataLog);
}
} }
return true; return true;
} }
......
...@@ -178,7 +178,7 @@ ...@@ -178,7 +178,7 @@
<display:column property="barcode.appendInfo.facility" titleKey="Facility" sortProperty="barcode.appendInfo.facility" sortable="true"/> <display:column property="barcode.appendInfo.facility" titleKey="Facility" sortProperty="barcode.appendInfo.facility" sortable="true"/>
<display:column titleKey="时间" sortProperty="barcode.updateDate" sortable="true"> <display:column titleKey="时间" sortProperty="barcode.updateDate" sortable="true">
<fmt:formatDate value="${pos.updateDate}" pattern="yyyy-MM-dd HH:mm"/> <fmt:formatDate value="${pos.barcode.updateDate}" pattern="yyyy-MM-dd HH:mm"/>
</display:column> </display:column>
<display:column titleKey="barcode.amount" sortProperty="barcode.amount" sortable="true"> <display:column titleKey="barcode.amount" sortProperty="barcode.amount" sortable="true">
......
<%@ page import="com.myproject.webapp.controller.webService.DataCache" %>
<%@ page import="java.util.Date" %><%--
Created by IntelliJ IDEA.
User: kangmor
Date: 2015/12/4
Time: 9:28
To change this template use File | Settings | File Templates.
--%>
<%@ include file="/common/taglibs.jsp" %>
<%@ page language="java" pageEncoding="UTF-8" %>
<c:if test="${screen != 'tablet'}">
<!-- BEGIN PAGE HEADER-->
<h3 class="page-title">
库位管理
</h3>
</c:if>
<!-- BEGIN PAGE CONTENT-->
<div class="row">
<div class="col-md-12">
<div class="portlet box blue">
<c:if test="${screen != 'tablet'}">
<div class="portlet-title">
<div class="caption">
<%--<i class="fa fa-list-alt"></i><fmt:message key="component.list"/>--%>
</div>
<div class="tools">
</div>
</div>
</c:if>
<div class="portlet-body">
<!-- 正常展示-->
<form:form commandName="searchCriteria" class="form-horizontal form-bordered" id="searchCriteria"
action="storagePosManage.html">
<div class="form-group">
<label class="control-label col-md-1 col-xs-2"><fmt:message key="dataLog.storageName"/></label>
<div class="col-md-2">
<form:select path="storageId" class="form-control">
<form:option value=""><fmt:message key="select.all"/></form:option>
<c:forEach items="${allStorage}" var="storage">
<form:option value="${storage.id}"> ${storage.name}</form:option>
</c:forEach>
</form:select>
</div>
<label class="control-label col-md-1"><fmt:message key="仓位"/></label>
<div class="col-md-2">
<div style="text-align:left">
<form:input path="posName" class="form-control"/>
</div>
</div>
<label class="control-label col-md-1 col-xs-2"><fmt:message key="storage.enable"/></label>
<div class="col-md-2">
<form:select path="enabled" class="form-control">
<form:option value=""><fmt:message key="select.all"/></form:option>
<form:option value="true"> <fmt:message key="storage.enable.yes"/></form:option>
<form:option value="false"> <fmt:message key="storage.enable.no"/></form:option>
</form:select>
</div>
<div class="col-md-2">
<button class="btn purple" type="submit"><i class="fa fa-search"></i><fmt:message key="button.search"/> </button>
</div>
</div>
</form:form>
<div class="table-scrollable">
<c:set var="today" value="<%= new Date()%>"/>
<display:table name="searchCriteria.pageList" requestURI="storagePosManage.html" sort="external"
defaultsort="1" class="table table-striped table-bordered table-hover" export="true"
id="pos" >
<display:setProperty name="export.csv.filename" value="posList.csv" />
<c:set var="enabledClass" value=""/>
<c:if test="${!pos.enabled}">
<c:set var="enabledClass" value="enabled"/>
</c:if>
<display:column titleKey="storagePosFind.index">${pos_rowNum}</display:column>
<display:column property="posName" titleKey="checkOut.pos" sortProperty="posName" sortable="true"/>
<display:column titleKey="storage.enable" class="${enabledClass}">
<c:if test="${!pos.enabled}">
<fmt:message key="storage.enable.no"/>
[
<a onclick="enablePos(this,'${pos.id}',true);">
启用
</a>]
</c:if>
<c:if test="${pos.enabled}" >
<fmt:message key="storage.enable.yes"/>
[
<a onclick="enablePos(this,'${pos.id}',false);">
禁用
</a>]
</c:if>
</display:column>
<display:column titleKey="storage.posSize">
${pos.sizeStr}
</display:column>
<display:column property="barcode.barcode" titleKey="barcode.barcode" sortProperty="barcode.barcode" sortable="true"/>
<display:column titleKey="时间" sortProperty="updateDate" sortable="true">
<fmt:formatDate value="${pos.updateDate}" pattern="yyyy-MM-dd HH:mm"/>
</display:column>
<display:column titleKey="">
<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>
</display:column>
</display:table>
</div>
</div>
</div>
<!-- END EXAMPLE TABLE PORTLET-->
</div>
</div>
<!-- END PAGE CONTENT-->
<form method="get" action="${ctx}/service/store/checkout.html" id="checkoutForm">
<input type="hidden" name="pid" id="pid"/>
</form>
<c:set var="scripts" scope="request">
<script>
function enablePos(linkDom, posId,enabled){
$.post("${ctx}/service/store/enablePos", {pid: posId,enabled:enabled }, function (data) {
if(data != ''){
alert(data);
}else{
$(linkDom).parents("tr").toggleClass("font-grey");
$(linkDom).toggleClass("enabled");
if(enabled){
$(linkDom).parents("td").html("是[<a onclick='enablePos(this,"+posId+",false);'>禁用</a>]");
}else{
$(linkDom).parents("td").html("否[<a onclick='enablePos(this,"+posId+",true);'>启用</a>]");
}
alert("操作成功");
}
})
}
$(".enabled").each(function(){
var oldClass = $(this).parent().attr("class");
$(this).parents("tr").attr("class",oldClass + " font-grey");
});
function checkoutPos(posId) {
$("#btn"+posId).attr("disabled","true");
$.post("${ctx}/service/store/checkout.html", {pids: posId}, function (data) {
alert(data);
});
}
</script>
</c:set>
\ No newline at end of file \ No newline at end of file
...@@ -25,6 +25,8 @@ ...@@ -25,6 +25,8 @@
<i class="fa fa-list-alt"></i><fmt:message key="storage.search.subtitle"/> <i class="fa fa-list-alt"></i><fmt:message key="storage.search.subtitle"/>
</div> </div>
<div class="actions"> <div class="actions">
<a href="storagePosManage.html" class="btn btn-default btn-sm">
<i class="fa fa-building"></i> <fmt:message key="库位管理"/> </a>
<a href="storageUpdate.html" class="btn btn-default btn-sm"> <a href="storageUpdate.html" class="btn btn-default btn-sm">
<i class="fa fa-plus"></i> <fmt:message key="button.add"/> </a> <i class="fa fa-plus"></i> <fmt:message key="button.add"/> </a>
</div> </div>
...@@ -48,11 +50,6 @@ ...@@ -48,11 +50,6 @@
<display:table name="searchCriteria.pageList" id="storage" <display:table name="searchCriteria.pageList" id="storage"
defaultsort="1" class="table table-striped table-bordered table-hover" export="false" requestURI="storageSearch.html"> defaultsort="1" class="table table-striped table-bordered table-hover" export="false" requestURI="storageSearch.html">
<display:column property="name" escapeXml="true" titleKey="storage.name"/> <display:column property="name" escapeXml="true" titleKey="storage.name"/>
<display:column titleKey="storage.boxCount" property="boxCount"/>
<display:column titleKey="storage.slotAmount">
${storage.totalSlots - storage.emptySlots} / ${storage.totalSlots}
</display:column>
<display:setProperty name="paging.banner.items_name"><fmt:message <display:setProperty name="paging.banner.items_name"><fmt:message
key="storage.item.name"/></display:setProperty> key="storage.item.name"/></display:setProperty>
<display:column escapeXml="true" titleKey="" <display:column escapeXml="true" titleKey=""
......
...@@ -512,7 +512,7 @@ ...@@ -512,7 +512,7 @@
}else{ }else{
$("#"+posId).toggleClass("font-grey"); $("#"+posId).toggleClass("font-grey");
if(enabled){ if(enabled){
$("#td"+posId).html("[<a onclick='enablePos("+posId+",false);'>禁用</a>]"); $("#td"+posId).html("[<a onclick='enablePos("+posId+",false);'>禁用</a>]");
}else{ }else{
$("#td"+posId).html("否[<a onclick='enablePos("+posId+",true);'>启用</a>]"); $("#td"+posId).html("否[<a onclick='enablePos("+posId+",true);'>启用</a>]");
} }
......
...@@ -12,6 +12,23 @@ ...@@ -12,6 +12,23 @@
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<ul class="timeline"> <ul class="timeline">
<li class="timeline-green">
<div class="timeline-time">
<span class="date">2021</span>
<span class="time">01-25</span>
</div>
<div class="timeline-icon">
<i class="fa fa-clock-o"></i>
</div>
<div class="timeline-body">
<h2>版本: V2021012514</h2>
<div class="timeline-content">
<ul>
<li>优化未出完的指定料需求单再次出库功能</li>
</ul>
</div>
</div>
</li>
<li class="timeline-blue"> <li class="timeline-blue">
<div class="timeline-time"> <div class="timeline-time">
<span class="date">2021 </span> <span class="date">2021 </span>
......
...@@ -8050,7 +8050,7 @@ Grey Default ...@@ -8050,7 +8050,7 @@ Grey Default
/* General Text & Icon Font Colors */ /* General Text & Icon Font Colors */
.font-grey { .font-grey {
color: #e5e5e5 !important; color: #b5b5b5 !important;
} }
/*** /***
...@@ -8060,7 +8060,7 @@ Grey Steel ...@@ -8060,7 +8060,7 @@ Grey Steel
.grey-steel.btn { .grey-steel.btn {
color: #80898e; color: #80898e;
background-color: #e9edef; background-color: #e9edef;
border-color: ""; border-color: none;
} }
.grey-steel.btn:hover, .grey-steel.btn:focus, .grey-steel.btn:active, .grey-steel.btn.active { .grey-steel.btn:hover, .grey-steel.btn:focus, .grey-steel.btn:active, .grey-steel.btn.active {
color: #80898e; color: #80898e;
......
...@@ -40,7 +40,7 @@ ...@@ -40,7 +40,7 @@
<!-- END PAGE STYLES --> <!-- END PAGE STYLES -->
<!-- BEGIN THEME STYLES --> <!-- BEGIN THEME STYLES -->
<!-- DOC: To use 'rounded corners' style just load 'components-rounded.css' stylesheet instead of 'components.css' in the below style tag --> <!-- DOC: To use 'rounded corners' style just load 'components-rounded.css' stylesheet instead of 'components.css' in the below style tag -->
<link href="${ctx}/assets/global/css/components.css?id=3" id="style_components" rel="stylesheet" type="text/css"/> <link href="${ctx}/assets/global/css/components.css?id=4" id="style_components" rel="stylesheet" type="text/css"/>
<link href="${ctx}/assets/global/css/plugins.css" rel="stylesheet" type="text/css"/> <link href="${ctx}/assets/global/css/plugins.css" rel="stylesheet" type="text/css"/>
<link href="${ctx}/assets/admin/layout/css/layout.css" rel="stylesheet" type="text/css"/> <link href="${ctx}/assets/admin/layout/css/layout.css" rel="stylesheet" type="text/css"/>
<link href="${ctx}/assets/admin/layout/css/themes/default.css" rel="stylesheet" type="text/css" id="style_color"/> <link href="${ctx}/assets/admin/layout/css/themes/default.css" rel="stylesheet" type="text/css" id="style_color"/>
...@@ -239,7 +239,7 @@ ...@@ -239,7 +239,7 @@
<div class="page-footer-inner"> <div class="page-footer-inner">
2016&copy; <a href="${ctx}/updateHistory.html">SMD BOX</a> 2016&copy; <a href="${ctx}/updateHistory.html">SMD BOX</a>
</div> </div>
<span class="right" style="color: #a3a3a3;">Version: 2021.03.02</span> <span class="right" style="color: #a3a3a3;">Version: 2021.03.10</span>
<div class="scroll-to-top"> <div class="scroll-to-top">
<i class="icon-arrow-up"></i> <i class="icon-arrow-up"></i>
</div> </div>
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!