Commit ca930820 by Tuomas Riihimäki

Merge branch 'tkfftk/multibarcode' into 'master'

Tkfftk/multibarcode

Ekaa insomniasta

See merge request !123
2 parents e4aed2ca 8d1c4001
...@@ -95,10 +95,17 @@ public class ReaderBean implements ReaderBeanLocal { ...@@ -95,10 +95,17 @@ public class ReaderBean implements ReaderBeanLocal {
if (reader == null || code == null || code.isEmpty()) { if (reader == null || code == null || code.isEmpty()) {
return null; return null;
} }
logger.info("got code from reader {}", code); logger.info("got code from reader {}", code);
code = code.replace("\"\b", ""); code = code.replace("\"\b", "");
/**
* Some of rfid-readers adds zeros to start, some to end
*
* Also, under 16 char -rdid (the smaller one) should be 16 character long,
* with zeros on beginning.
*/
if (ReaderType.RFID.equals(reader.getType())) { if (ReaderType.RFID.equals(reader.getType())) {
if (Pattern.matches("^.*000000$", code)) if (Pattern.matches("^.*000000$", code))
...@@ -113,6 +120,7 @@ public class ReaderBean implements ReaderBeanLocal { ...@@ -113,6 +120,7 @@ public class ReaderBean implements ReaderBeanLocal {
code = sb.toString(); code = sb.toString();
} }
ReaderEvent event = new ReaderEvent(new Date(), reader, code); ReaderEvent event = new ReaderEvent(new Date(), reader, code);
// first, check if dublicate, there is 30s timeout for dublicates, // first, check if dublicate, there is 30s timeout for dublicates,
......
...@@ -21,6 +21,7 @@ ...@@ -21,6 +21,7 @@
<reader:backendReader selectvalue="#{i18n['barcodeReader.readBarcode']}" selectaction="#{incomingView.polledRead}" /> <reader:backendReader selectvalue="#{i18n['barcodeReader.readBarcode']}" selectaction="#{incomingView.polledRead}" />
<h:form> <h:form>
<p:autoComplete id="acsb" value="#{infoView.multiSearchUser}" completeMethod="#{infoView.matchMulti}" converter="#{eventUserConverter}" var="usrx" itemLabel="#{usrx.shortUserDescriptor}" itemValue="#{usrx}"> <p:autoComplete id="acsb" value="#{infoView.multiSearchUser}" completeMethod="#{infoView.matchMulti}" converter="#{eventUserConverter}" var="usrx" itemLabel="#{usrx.shortUserDescriptor}" itemValue="#{usrx}">
<p:ajax event="itemSelect" listener="#{incomingView.changeUser}" /> <p:ajax event="itemSelect" listener="#{incomingView.changeUser}" />
......
...@@ -30,6 +30,8 @@ ...@@ -30,6 +30,8 @@
</ui:define> </ui:define>
<ui:define name="content"> <ui:define name="content">
<infoview:userselector /> <infoview:userselector />
<br /><br /><br /><br /><br /><br />
<reader:multireaderselect />
......
...@@ -52,7 +52,7 @@ xmlns:reader="http://java.sun.com/jsf/composite/cditools/reader" ...@@ -52,7 +52,7 @@ xmlns:reader="http://java.sun.com/jsf/composite/cditools/reader"
<p:outputLabel value="#{i18n['reader.autopoll']}" />&nbsp; <p:outputLabel value="#{i18n['reader.autopoll']}" />&nbsp;
<p:selectBooleanButton offLabel="#{i18n['off']}" onLabel="#{i18n['on']}" value="#{readerView.pollingMode}" immediate="true"> <p:selectBooleanButton offLabel="#{i18n['off']}" onLabel="#{i18n['on']}" value="#{readerView.pollingMode}" immediate="true">
<p:ajax update="reader_autopoll,readerevents" /> <p:ajax update="reader_autopoll,readerevents" />
</p:selectBooleanButton> </p:selectBooleanButton>
<p:commandLink actionListener="#{readerView.changeReader}" value="#{i18n['incomingflow.changereader']}" update="@all" /> <p:commandLink actionListener="#{readerView.changeReader}" value="#{i18n['incomingflow.changereader']}" update="@all" />
<h:panelGroup id="readerevents"> <h:panelGroup id="readerevents">
<reader:readerevents rendered="#{!empty readerNameContainer.readerId and !readerView.pollingMode}" showAssociateToUser="#{cc.attrs.showAssociateToUser}" selectvalue="#{cc.attrs.selectvalue}" selectaction="#{cc.attrs.selectaction}" linkvalue="#{cc.attrs.linkvalue}" linkoutcome="#{cc.attrs.linkoutcome}" /> <reader:readerevents rendered="#{!empty readerNameContainer.readerId and !readerView.pollingMode}" showAssociateToUser="#{cc.attrs.showAssociateToUser}" selectvalue="#{cc.attrs.selectvalue}" selectaction="#{cc.attrs.selectaction}" linkvalue="#{cc.attrs.linkvalue}" linkoutcome="#{cc.attrs.linkoutcome}" />
......
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xmlns:composite="http://java.sun.com/jsf/composite"
xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:p="http://primefaces.org/ui" xmlns:tools="http://java.sun.com/jsf/composite/tools">
<composite:interface>
</composite:interface>
<composite:implementation>
<h:form>
Valitut lukijat, valitse "vaihda lukija" poistaaksesi kaikki
<p:dataTable border="1" value="#{readerListDataView.selectedReaders}" var="rr">
<p:column>
<f:facet name="header">
<h:outputText value="#{i18n['reader.name']}" />
</f:facet>
<h:outputText value="#{rr.identification}" />
</p:column>
</p:dataTable>
Valitse uusi / ensimmäinen lukija
<p:dataTable border="1" id="reader" value="#{readerListDataView.readers}" var="rr">
<p:column>
<f:facet name="header">
<h:outputText value="#{i18n['reader.name']}" />
</f:facet>
<h:outputText value="#{rr.identification}" />
</p:column>
<p:column>
<p:commandButton actionListener="#{readerListDataView.selectMultipleReaders}" value="#{i18n['reader.select']}" update="@all" />
</p:column>
</p:dataTable>
</h:form>
</composite:implementation>
</html>
...@@ -18,6 +18,8 @@ ...@@ -18,6 +18,8 @@
*/ */
package fi.codecrew.moya.web.cdiview.reader; package fi.codecrew.moya.web.cdiview.reader;
import java.util.ArrayList;
import javax.ejb.EJB; import javax.ejb.EJB;
import javax.enterprise.context.RequestScoped; import javax.enterprise.context.RequestScoped;
import javax.faces.model.ListDataModel; import javax.faces.model.ListDataModel;
...@@ -72,5 +74,30 @@ public class ReaderListDataView extends GenericCDIView { ...@@ -72,5 +74,30 @@ public class ReaderListDataView extends GenericCDIView {
return null; return null;
} }
public void selectMultipleReaders() {
if(readers.isRowAvailable()) {
readerNameContainer.addReader(readers.getRowData().getId());
}
}
public ListDataModel<Reader> getSelectedReaders() {
ArrayList<Reader> readers = new ArrayList<Reader>();
for(Integer rid : readerNameContainer.getReaders()) {
Reader r = readerbean.getReader(rid);
if(r != null)
readers.add(r);
}
return new ListDataModel<Reader>(readers);
}
} }
...@@ -19,6 +19,8 @@ ...@@ -19,6 +19,8 @@
package fi.codecrew.moya.web.cdiview.reader; package fi.codecrew.moya.web.cdiview.reader;
import java.io.Serializable; import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.enterprise.context.SessionScoped; import javax.enterprise.context.SessionScoped;
import javax.inject.Named; import javax.inject.Named;
...@@ -29,15 +31,52 @@ public class ReaderNameContainer implements Serializable { ...@@ -29,15 +31,52 @@ public class ReaderNameContainer implements Serializable {
private static final long serialVersionUID = 571747919767505523L; private static final long serialVersionUID = 571747919767505523L;
private Integer readerId; //private Integer readerId;
// handling first user when using via getReaderId and setReaderId;
private List<Integer> readers;
private boolean autopoll = false; private boolean autopoll = false;
/**
* use this function when using readers in "only one reader" -mode
*
* @return first selected reader, or null if no reader selected
*/
public Integer getReaderId() { public Integer getReaderId() {
return readerId; if(getReaders().size() == 0)
return null;
return readers.get(0);
} }
/**
* Use this function when using readers in "only one reader" -mode
* @param readerId to set, or null to clear all readers
*/
public void setReaderId(Integer readerId) { public void setReaderId(Integer readerId) {
this.readerId = readerId; if(readerId == null)
clearReaders();
if(getReaders().size() == 0) {
getReaders().add(readerId);
} else {
getReaders().set(0, readerId);
}
}
public void addReader(Integer readerId) {
if(!getReaders().contains(readerId)) {
getReaders().add(readerId);
}
}
public List<Integer> getReaders() {
if(readers == null)
readers = new ArrayList<Integer>();
return readers;
} }
public boolean isAutopoll() { public boolean isAutopoll() {
...@@ -47,5 +86,9 @@ public class ReaderNameContainer implements Serializable { ...@@ -47,5 +86,9 @@ public class ReaderNameContainer implements Serializable {
public void setAutopoll(boolean autopoll) { public void setAutopoll(boolean autopoll) {
this.autopoll = autopoll; this.autopoll = autopoll;
} }
public void clearReaders() {
readers = null;
}
} }
...@@ -247,21 +247,37 @@ public class ReaderView extends GenericCDIView { ...@@ -247,21 +247,37 @@ public class ReaderView extends GenericCDIView {
return ReaderType.values(); return ReaderType.values();
} }
/**
* Get newest readerevent from any reader
* @return
*/
public ReaderEvent getNewestEvent() {
ReaderEvent newestEvent = null;
for(Integer rid : namecontainer.getReaders()) {
ReaderEvent event = readerbean.getLastReaderEvent(rid);
if(newestEvent == null || event.getUpdatetime().getTime() > newestEvent.getUpdatetime().getTime()) {
newestEvent = event;
}
}
return newestEvent;
}
public ReaderEvent getReaderEvent() { public ReaderEvent getReaderEvent() {
if(namecontainer.isAutopoll()) { if(namecontainer.isAutopoll()) {
if(isNewCodes()) { if(isNewCodes()) {
pollingCodeHandled(); return pollingCodeHandled();
return readerbean.getLastReaderEvent(namecontainer.getReaderId()); // return getNewestEvent();
// return readerbean.getLastReaderEvent(namecontainer.getReaderId());
} else { } else {
return null; return null;
} }
} }
if (readerEventList == null) if (readerEventList == null)
return null; return null;
...@@ -277,11 +293,19 @@ public class ReaderView extends GenericCDIView { ...@@ -277,11 +293,19 @@ public class ReaderView extends GenericCDIView {
// on polling mode, we do not use list, we use database and remember last readerEvent // on polling mode, we do not use list, we use database and remember last readerEvent
namecontainer.setAutopoll(true); namecontainer.setAutopoll(true);
lastReadEvent = readerbean.getLastReaderEvent(namecontainer.getReaderId()); lastReadEvent = getNewestEvent();// readerbean.getLastReaderEvent(namecontainer.getReaderId());
} }
public void pollingCodeHandled() { /**
lastReadEvent = readerbean.getLastReaderEvent(namecontainer.getReaderId()); * Mark pollingcode handled (for autoread-stuff)
*
* And also return last code, just in case.
* @return
*/
public ReaderEvent pollingCodeHandled() {
lastReadEvent = getNewestEvent();
return lastReadEvent;
} }
public String saveUser() { public String saveUser() {
...@@ -294,16 +318,27 @@ public class ReaderView extends GenericCDIView { ...@@ -294,16 +318,27 @@ public class ReaderView extends GenericCDIView {
if (!namecontainer.isAutopoll()) if (!namecontainer.isAutopoll())
return false; return false;
ReaderEvent newEvent = readerbean.getLastReaderEvent(namecontainer.getReaderId()); for(Integer rid : namecontainer.getReaders()) {
ReaderEvent event = readerbean.getLastReaderEvent(rid);
if(newEvent == null || newEvent.getId() == null)
return false;
if(event == null || event.getId() == null) {
continue;
}
// found new code, and there is no previous code, that's true
if(lastReadEvent == null || lastReadEvent.getId() == null)
return true;
// is new code newer than previous code?
if(lastReadEvent.getUpdatetime().getTime() < event.getUpdatetime().getTime())
return true;
}
if(lastReadEvent == null || lastReadEvent.getId() == null)
return true;
return (newEvent.getId().equals(lastReadEvent.getId())); return false;
} }
public String getUserInsertCode() { public String getUserInsertCode() {
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!