Commit 8d45b57d sunke

关闭三天前的工单出库需求

关闭工单接口
1 个父辈 93ddd934
......@@ -20,6 +20,7 @@ public class OutInfo extends BaseMongoBean {
this.action = outItem.getAction();
this.hSerial = outItem.gethSerial();
this.so = outItem.getSo();
this.soseq = outItem.getSoseq();
this.refno = outItem.getRefno();
this.sdate = outItem.getSdate();
this.mdate = outItem.getMdate();
......@@ -40,6 +41,11 @@ public class OutInfo extends BaseMongoBean {
private String so;
/**
* 工单序号
*/
private String soseq;
/**
* 备料单号
*/
private String refno;
......@@ -210,6 +216,9 @@ public class OutInfo extends BaseMongoBean {
return "M";
}
/**
* 放上料架顺序
*/
public String getShelfLatest(){
if(taskNum == 1){
return "L";
......@@ -235,14 +244,34 @@ public class OutInfo extends BaseMongoBean {
return sendStatus;
}
/**
* 是否发料完成(不缺料)
*/
public boolean isSendEnd(){
return sendStatus == StorageConstants.SEND_STATUS.SEND_OK;
}
/**
* 是否已关闭
*/
public boolean isClosed(){
return sendStatus == StorageConstants.SEND_STATUS.CLOSED;
}
/**
* 是否本次任务执行完成
*/
public boolean isTaskEnd(){
return taskNum > 0 && taskFinishNum >= taskNum;
}
/**
* 是否正在执行
*/
public boolean isExecuting(){
return taskNum > 0 && sendStatus == StorageConstants.SEND_STATUS.EXECUTING;
}
public void setSendStatus(int sendStatus) {
this.sendStatus = sendStatus;
}
......@@ -259,6 +288,14 @@ public class OutInfo extends BaseMongoBean {
this.outItemMap = outItemMap;
}
public String getSoseq() {
return soseq;
}
public void setSoseq(String soseq) {
this.soseq = soseq;
}
@Override
public String toString() {
return "OutInfo{" +
......
......@@ -79,6 +79,8 @@ public interface IStoragePosDao extends IMongoDao {
List<StoragePos> allBindPos(String so);
List<StoragePos> listSoSeqBindPos(String soseq);
StoragePos findByBarcode(String barcode);
StoragePos unbindReel(StoragePos storagePos);
......
......@@ -428,6 +428,16 @@ public class StoragePosDaoImpl extends AbstractMongoDao implements IStoragePosDa
return findByQuery(q);
}
/**
* 获取工单的所有绑定料盘
*/
@Override
public List<StoragePos> listSoSeqBindPos(String soseq) {
Criteria c = Criteria.where("barcode.appendInfo.soseq").is(soseq);
Query q = new Query(c);
return findByQuery(q);
}
@Override
public StoragePos findByBarcode(String barcode){
return findOneByCondition(new String[]{"barcode.barcode"}, new String[]{barcode});
......
......@@ -10,6 +10,10 @@ public interface IOutInfoDao extends IMongoDao {
OutInfo findByHSerial(String hSerial);
List<OutInfo> listBySo(String so);
List<OutInfo> listBySoSeq(String soseq);
List<OutInfo> findUnEndOutInfos();
void updateStatus(String hSerial, int bindStatus, int sendStatus);
......
......@@ -6,6 +6,7 @@ import com.myproject.bean.update.qisda.OutItem;
import com.myproject.dao.mongo.AbstractMongoDao;
import com.myproject.dao.mongo.qisda.IOutInfoDao;
import com.myproject.dao.mongo.qisda.IOutItemDao;
import com.myproject.util.StorageConstants;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
......@@ -26,12 +27,34 @@ public class OutIInfoDaoImpl extends AbstractMongoDao implements IOutInfoDao {
}
/**
* 查找所有发料状态不为2(未发料完成)的工单需求单
*/
@Override
public List<OutInfo> listBySo(String so){
Criteria c = new Criteria();
c.and("so").is(so);
Query query = new Query(c);
return findByQuery(query);
}
/**
* 查找所有发料状态不为2(未发料完成)的工单需求单
*/
@Override
public List<OutInfo> listBySoSeq(String soseq){
Criteria c = new Criteria();
c.and("soseq").is(soseq);
Query query = new Query(c);
return findByQuery(query);
}
/**
* 查找所有发料状态不为2(未发料完成)的需求单
*/
@Override
public List<OutInfo> findUnEndOutInfos(){
Criteria c = new Criteria();
c.and("sendStatus").ne(2);
c.and("sendStatus").nin(StorageConstants.SEND_STATUS.CLOSED,StorageConstants.SEND_STATUS.SEND_OK);
Query query = new Query(c);
return findByQuery(query);
}
......
......@@ -697,6 +697,11 @@ public class StorageConstants {
*/
public static int CLOSED = 3;
/**
* 需求单正在执行
*/
public static int EXECUTING = 4;
}
}
......@@ -180,18 +180,9 @@ public class QisdaController extends BaseController {
public String unBindAllReel(HttpServletRequest request){
String so = request.getParameter("so");
if(Strings.isNullOrEmpty(so)){
return "无工单号参数so,无法解绑";
return "无工单号参数so,无法解绑";
}
log.info("开始解绑绑定工单["+so+"]的料盘");
int count = 0;
List<StoragePos> bindPosList = storagePosDao.allBindPos(so);
for (StoragePos storagePos : bindPosList) {
storagePosDao.unbindReel(storagePos);
log.info("解除["+storagePos.getBarcode().getBarcode()+"]的工单["+so+"]绑定");
count = count + 1;
}
String msg = "工单["+so+"]解除绑定完成,共解绑["+count+"]盘";
log.info(msg);
String msg = outInfoCache.closeSo(so);
return msg;
}
......
package com.myproject.webapp.controller.qisda.util;
import com.myproject.bean.qisda.InquiryShelfBean;
import com.myproject.bean.update.Barcode;
import com.myproject.bean.update.StoragePos;
import com.myproject.bean.update.qisda.OutInfo;
import com.myproject.bean.update.qisda.OutItem;
import com.myproject.dao.mongo.IStoragePosDao;
import com.myproject.dao.mongo.qisda.IOutInfoDao;
import com.myproject.dao.mongo.qisda.IOutItemDao;
import com.myproject.util.DateUtil;
import com.myproject.util.StorageConstants;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.util.Strings;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
......@@ -50,6 +55,9 @@ public class OutInfoCache {
@Autowired
private IOutItemDao outItemDao;
@Autowired
private IStoragePosDao storagePosDao;
/**
* 更新需求项
*/
......@@ -80,7 +88,7 @@ public class OutInfoCache {
if(!outInfo.getOutItemMap().isEmpty()){
outInfoMap.put(hserial, outInfo);
}else{
outInfo.setSendStatus(2);
outInfo.setSendStatus(StorageConstants.SEND_STATUS.SEND_OK);
outInfoDao.save(outInfo);
}
......@@ -94,12 +102,74 @@ public class OutInfoCache {
public void loadUnEndOutInfos(){
log.info("开始加载未完成的需求单");
List<OutInfo> unEndOutInfoList = outInfoDao.findUnEndOutInfos();
long now = System.currentTimeMillis();
for (OutInfo outInfo : unEndOutInfoList) {
addOutInfo(outInfo);
updateStatus(outInfo.gethSerial());
if(now - outInfo.getMdate().getTime() > 3 * 24 * 60 * 60 * 1000){
//3天前的需求单(非紧急料),关闭,并解绑
if(!outInfo.isUrgentAction()){
String so = outInfo.getSo();
String mDataStr = DateUtil.toDateString(outInfo.getMdate(),"yyyy-MM-dd HH:mm");
log.info("工单["+so+"]的必须出库日期["+mDataStr+"]为3天前,关闭并解绑工单");
closeSo(outInfo.getSo());
}
}else{
addOutInfo(outInfo);
updateStatus(outInfo.gethSerial());
}
}
}
public String closeSoSeq(String soseq){
log.info("开始关闭并解绑工单soseq=["+soseq+"]的料盘");
List<OutInfo> outInfoList = outInfoDao.listBySoSeq(soseq);
if(outInfoList.isEmpty()){
return "未找到工单序号soseq为["+soseq+"]的数据";
}
for (OutInfo outInfo : outInfoList) {
if(!outInfo.isClosed() && !outInfo.isSendEnd()){
log.info("关闭需求单["+outInfo.gethSerial()+"]so=["+outInfo.getSo()+"]soseq=["+outInfo.getSoseq()+"]");
int sendStatus = StorageConstants.SEND_STATUS.CLOSED;
outInfoDao.updateStatus(outInfo.gethSerial(),outInfo.getBindStatus(),sendStatus);
}
}
int count = 0;
List<StoragePos> bindPosList = storagePosDao.listSoSeqBindPos(soseq);
for (StoragePos storagePos : bindPosList) {
Barcode barcode = storagePos.getBarcode();
storagePosDao.unbindReel(storagePos);
count = count + 1;
log.info("解除["+barcode.getBarcode()+"]的工单so=["+barcode.getAppendInfo().getSo()+"]soseq=["+barcode.getAppendInfo().getSoseq()+"]绑定,累计解除"+count);
}
return "";
}
public String closeSo(String so){
if(Strings.isBlank(so)){
return "无效的工单序号";
}
List<OutInfo> outInfoList = outInfoDao.listBySo(so);
for (OutInfo outInfo : outInfoList) {
if(!outInfo.isClosed() && !outInfo.isSendEnd()){
log.info("关闭需求单["+outInfo.gethSerial()+"]");
int sendStatus = StorageConstants.SEND_STATUS.CLOSED;
outInfoDao.updateStatus(outInfo.gethSerial(),outInfo.getBindStatus(),sendStatus);
}
}
int count = 0;
List<StoragePos> bindPosList = storagePosDao.allBindPos(so);
for (StoragePos storagePos : bindPosList) {
storagePosDao.unbindReel(storagePos);
log.info("解除["+storagePos.getBarcode().getBarcode()+"]的工单so=["+so+"]绑定");
count = count + 1;
}
String msg = "工单so=["+so+"]解除绑定完成,共解绑["+count+"]盘";
log.info(msg);
return msg;
}
/**
* 获取缓存的需求单信息
*/
......@@ -118,6 +188,12 @@ public class OutInfoCache {
outInfo.setOutReelNum(0);
outInfo.setTaskFinishNum(0);
outInfo.setTaskNum(outReelNum);
if(outReelNum != 0){
outInfo.setSendStatus(StorageConstants.SEND_STATUS.EXECUTING);
}else{
outInfo.setSendStatus(StorageConstants.SEND_STATUS.SEND_LESS);
}
outInfoMap.put(hSerial, outInfo);
}
}
......@@ -175,7 +251,6 @@ public class OutInfoCache {
}
log.info("更新需求单["+hSerial+"]的发料状态 [" + outInfo.getSendStatus()+"]");
boolean sendEnd = true;
boolean hasOut = false;
//默认为绑定OK,
int bindStatus = 2;
for (OutItem outItem : outInfo.getOutItemMap().values()) {
......@@ -186,9 +261,6 @@ public class OutInfoCache {
if(!outItem.isItemEnd()){
sendEnd = false;
}
if(outItem.getOutQty() > 0){
hasOut = true;
}
if(!outItem.isBindOk()){
//有绑定缺料的情况,即认为是绑定缺料
bindStatus = 1;
......@@ -197,12 +269,11 @@ public class OutInfoCache {
if(sendEnd){
outInfo.setSendStatus(StorageConstants.SEND_STATUS.SEND_OK);
}else{
if(hasOut){
//有出库的,状态为发料缺料
//有出库的,状态为发料缺料
if(outInfo.isTaskEnd()){
outInfo.setSendStatus(StorageConstants.SEND_STATUS.SEND_LESS);
}else{
//无出过库的,状态为未发料
outInfo.setSendStatus(StorageConstants.SEND_STATUS.NEW);
outInfo.setSendStatus(StorageConstants.SEND_STATUS.EXECUTING);
}
}
outInfo.setBindStatus(bindStatus);
......@@ -216,5 +287,4 @@ public class OutInfoCache {
}
}
}
......@@ -183,11 +183,16 @@ public class BaseController {
}
protected void addLikeParam(HttpServletRequest request,Criteria criteria, String fieldStr){
String fieldValue = request.getParameter(fieldStr);
String parmaKey = fieldStr;
int splitIndex = fieldStr.lastIndexOf('.');
if(splitIndex >= 0){
parmaKey = fieldStr.substring(splitIndex + 1);
}
String fieldValue = request.getParameter(parmaKey);
if(!Strings.isNullOrEmpty(fieldValue)){
Pattern pattern = Pattern.compile(fieldValue, Pattern.CASE_INSENSITIVE);
criteria.and(fieldStr).regex(pattern);
request.setAttribute(fieldStr,fieldValue);
request.setAttribute(parmaKey,fieldValue);
}
}
......
......@@ -98,19 +98,9 @@ public class StoragePosFindController extends BaseSearchController {
addFromToDateParam(request,baseCriteria,"updateDate");
String memo = request.getParameter("memo");
if(!Strings.isNullOrEmpty(memo)){
Pattern pattern = Pattern.compile(memo, Pattern.CASE_INSENSITIVE);
baseCriteria.and("barcode.memo").regex(pattern);
request.setAttribute("memo",memo);
}
String facility = request.getParameter("facility");
if(!Strings.isNullOrEmpty(facility)){
Pattern pattern = Pattern.compile(facility, Pattern.CASE_INSENSITIVE);
baseCriteria.and("barcode.appendInfo.facility").regex(pattern);
request.setAttribute("facility",facility);
}
addLikeParam(request, baseCriteria,"barcode.memo");
addLikeParam(request, baseCriteria,"barcode.appendInfo.facility");
addLikeParam(request, baseCriteria,"barcode.appendInfo.so");
String expire = request.getParameter("expire");
if(!Strings.isNullOrEmpty(expire)){
......@@ -122,11 +112,8 @@ public class StoragePosFindController extends BaseSearchController {
request.setAttribute("expire",expire);
}
String lockId = request.getParameter("lockId");
if(!Strings.isNullOrEmpty(lockId)){
baseCriteria.and("barcode.lockId").is(lockId);
request.setAttribute("lockId",lockId);
}
addLikeParam(request, baseCriteria,"barcode.lockId");
addLikeParam(baseCriteria, request, "otherField1");
addLikeParam(baseCriteria, request, "otherField2");
......@@ -140,6 +127,7 @@ public class StoragePosFindController extends BaseSearchController {
baseCriteria.and("barcode.barcode").regex(pattern);
}
int inactionDay = dataCache.getSettings().getInactionDay();
if(inactionDay <=0){
inactionDay = 3;
......
......@@ -161,7 +161,7 @@ public class QisdaApiController extends BaseController {
public ResultBean checkLockSo(HttpServletRequest request) {
List<Map<String, String>> bindReelInfos = new ArrayList<>();
try {
String paramInfo = receiveParamInfo(request);
String paramInfo = receiveParamInfo(request,"paramInfo");
log.info("收到检测锁定工单请求:"+paramInfo);
if(paramInfo == null){
return ResultBean.newErrorResult(-1,"参数为空");
......@@ -190,13 +190,38 @@ public class QisdaApiController extends BaseController {
}
}
} catch (Exception e) {
log.error("需求单请求处理出错", e);
log.error("检测料盘是否绑定工单请求处理出错", e);
return ResultBean.newErrorResult(1001,"内部错误:" + e.getMessage());
}
return ResultBean.newOkResult(bindReelInfos);
}
/**
* 检测料盘是否绑定工单
*/
@RequestMapping(value = "/closeSoSeq",method = RequestMethod.POST)
@ResponseBody
public ResultBean closeSo(HttpServletRequest request) {
List<Map<String, String>> bindReelInfos = new ArrayList<>();
try {
String soseq = receiveParamInfo(request,"soseq");
log.info("收到检测锁定工单请求:"+soseq);
if(soseq == null){
return ResultBean.newErrorResult(-1,"未找到soseq参数");
}
String result = outInfoCache.closeSoSeq(soseq);
if(result.isEmpty()){
return ResultBean.newOkResult("OK");
}else{
return ResultBean.newErrorResult(2003,result);
}
} catch (Exception e) {
log.error("需求单请求处理出错", e);
return ResultBean.newErrorResult(1001,"内部错误:" + e.getMessage());
}
}
/**
* 出库
*/
@RequestMapping(value = "/out",method = RequestMethod.POST)
......@@ -204,7 +229,7 @@ public class QisdaApiController extends BaseController {
public Object out(HttpServletRequest request) {
List<String> failedReelIdList = new ArrayList<>();
try {
String paramInfo = receiveParamInfo(request);
String paramInfo = receiveParamInfo(request,"paramInfo");
log.info("收到需求单请求:"+paramInfo);
if(paramInfo == null){
return ResultBean.newErrorResult(-1,"参数为空");
......@@ -246,7 +271,7 @@ public class QisdaApiController extends BaseController {
appendInfo.sethSerial(outItem.gethSerial());
appendInfo.setRefno(outItem.getRefno());
appendInfo.setSo("HSerial-" + outItem.gethSerial());
appendInfo.setSoseq("HSerial-" + outItem.getSoseq());
appendInfo.setSoseq("HSerial-" + outItem.gethSerial());
appendInfo.setSlotStr(outItem.getSlotStr());
appendInfo.setBindSlot("1");
......@@ -1052,6 +1077,7 @@ public class QisdaApiController extends BaseController {
outInfo.setOutReelNum(0);
outInfo.setTaskFinishNum(0);
outInfo.setTaskNum(outReelNum);
outInfo.setSendStatus(StorageConstants.SEND_STATUS.EXECUTING);
outInfo = outInfoDao.save(outInfo);
outInfoCache.resetTaskNum(hSerial, outReelNum);
......@@ -1088,12 +1114,12 @@ public class QisdaApiController extends BaseController {
/**
* 获取接收参数
*/
private String receiveParamInfo(HttpServletRequest request){
String paramInfo = request.getParameter("paramInfo");
private String receiveParamInfo(HttpServletRequest request, String paramKey){
String paramInfo = request.getParameter(paramKey);
if(Strings.isNullOrEmpty(paramInfo)){
//从body里面再获取一次
Map<String, String> bodyParamMap = getParamMapFromBody(request);
paramInfo = bodyParamMap.get("paramInfo");
paramInfo = bodyParamMap.get(paramKey);
}
return paramInfo;
}
......
......@@ -18,7 +18,6 @@ import com.myproject.bean.utils.BoxStatusBean;
import com.myproject.bean.utils.StatusBean;
import com.myproject.dao.mongo.*;
import com.myproject.dao.mongo.qisda.IDNItemDao;
import com.myproject.dao.mongo.qisda.IOutInfoDao;
import com.myproject.dao.mongo.qisda.IOutItemDao;
import com.myproject.exception.ValidateException;
import com.myproject.manager.IBarcodeManager;
......@@ -91,9 +90,6 @@ public class TaskService implements ITaskService {
@Autowired
private OutInfoCache outInfoCache;
@Autowired
private IOutInfoDao outInfoDao;
/**
* 任务队列,Key 为dataLog的ID,value 为本区域待执行的任务
*/
......
......@@ -83,6 +83,14 @@
</div>
</div>
<label class="control-label col-md-1"><fmt:message key="工单"/></label>
<div class="col-md-2">
<div style="text-align:left">
<input type="text" name="so" class="form-control" value="${so}"/>
</div>
</div>
<div class="col-md-2">
<button class="btn purple" type="submit"><i class="fa fa-search"></i><fmt:message key="button.search"/> </button>
......@@ -177,6 +185,9 @@
<c:if test="${pos.barcode.type == 1 || pos.barcode.type == 4}">-</c:if>
<c:if test="${pos.barcode.type != 1 && pos.barcode.type != 4}">${pos.barcode.amount} ${pos.barcode.appendInfo.cutMap}</c:if>
</display:column>
<%--<display:column titleKey="工单序号" sortProperty="barcode.appendInfo.soseq" sortable="true">--%>
<%--${pos.barcode.appendInfo.soseq}--%>
<%--</display:column>--%>
<display:column titleKey="工单" sortProperty="barcode.appendInfo.so" sortable="true">
${pos.barcode.appendInfo.so}
</display:column>
......
......@@ -82,7 +82,9 @@
<a href="#" onclick="showDetail('${outInfo.hSerial}')">${outInfo.hSerial}</a>
</display:column>
<display:column titleKey="动作" property="action" sortable="true" sortProperty="action"/>
<display:column titleKey="工单" property="so" sortable="true" sortProperty="so"/>
<display:column titleKey="工单" sortable="true" sortProperty="so">
${outInfo.so}<c:if test="${outInfo.soseq != null}">(${outInfo.soseq})</c:if>
</display:column>
<display:column titleKey="备料单号" property="refno" sortable="true" sortProperty="refno"/>
<display:column titleKey="建议出仓时间" sortable="true" sortProperty="sdate">
<fmt:formatDate value="${outInfo.sdate}" pattern="yyyy-MM-dd HH:mm"/>
......@@ -102,8 +104,7 @@
</display:column>
<display:column titleKey="checkOut.operate" media="html" sortProperty="sendStatus" sortable="true">
<span class="hide">${outInfo.sendStatus}</span>
<c:if test="${outInfo.sendStatus != 2 && outInfo.taskNum == 0}">
<c:if test="${!outInfo.sendEnd && outInfo.taskNum == 0 && !outInfo.closed}">
<button class="btn yellow" id="btn${outInfo.hSerial}"
onclick="executeOut('${outInfo.hSerial}')">
<i class="fa fa-sign-out"></i><fmt:message key="button.checkout"/></button>
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!