Commit e8801c52 sunke

增加点料机解析条码获取尺寸信息接口

增加AGV锁定VMI线入库包装料架接口
出入库统计信息优化
1 个父辈 aae06944
......@@ -240,7 +240,7 @@
>>rfid : RFID
>
> 返回:
>>` {"code":0,"msg":"ok","data":[{"barcode":"S20052301213","cid":"packing-20","rfid":"A12","rfidLoc":"3","lockPos":"4D2001AA0006","lockPosId":"1231"}]} `
>>` {"code":0,"msg":"ok","data":[{"barcode":"S20052301213","cid":"packing-20","rfid":"A12","rfidLoc":"3","lockPosName":"4D2001AA0006","lockPosId":"1231"}]} `
>>
>> - code: 0为正常,其他为异常,
>> - msg:消息,
......@@ -249,7 +249,8 @@
>> - rfidLoc: 料架的库位
>> - barcode: 库位中料盘的条码
>> - cid: 库位中料盘的锁定库位对应的料仓编号
>> - lockPos: 库位中料盘的锁定库位
>> - lockPosName: 库位中料盘的锁定库位
>> - lockPosId: 库位中料盘的锁定库位的ID,
12. 包装线AGV获取料架中的任务数,如果当前料架的任务数不为0,需要用当前料架去其他包装仓继续放料
......@@ -414,4 +415,39 @@
>>
>> - code: 0为正常,其他为异常,
>> - msg:消息,
>> - data:
\ No newline at end of file
>> - data:
22. AGV锁定包装仓入库料架, AGV从VMI拉上包装料架准备入库时,调用此接口,用于包装仓判断料架是否是入库料架
>地址:
>>/rest/api/qisda/device/lockPutInAShelf
>
>参数:
>>rfid : 包装料架的RFID
>
> 返回:
>>` {"code":0,"msg":"ok","data":""}`
>>
>> - code: 0为正常,其他为异常,
>> - msg:消息,
>> - data:
23. 点料机解析条码,获取料盘尺寸
>地址:
>>/rest/api/qisda/device/resolveCode
>
>参数:
>>code: 扫描到的条码信息,多个条码用##分割,条码前带尺寸信息会自动创建
>
> 返回:
>>` {"code":0,"msg":"ok","data":{"barcode":"xxxx","pn":"xxxx","qty":1000,"w":7,"h":8}}`
>>
>> - code: 0为正常,其他为异常,(未传参数, 未找到有效条码,多个有效条码)
>> - msg:消息,
>> - data:
>> - barcode: 需求单号
>> - pn: 物料编号
>> - qty: 数量
>> - w: 料盘直径(未配置尺寸信息时使用传入尺寸,否则使用配置尺寸)
>> - h: 厚度(未配置尺寸信息时使用传入尺寸,否则使用配置尺寸)
......@@ -7,6 +7,8 @@ package com.myproject.bean.json;
*/
public class ChartItem {
private DateBean dateBean;
private String label;
private int value;
......@@ -56,4 +58,12 @@ public class ChartItem {
public void setValue4(int value4) {
this.value4 = value4;
}
public DateBean getDateBean() {
return dateBean;
}
public void setDateBean(DateBean dateBean) {
this.dateBean = dateBean;
}
}
......@@ -77,9 +77,9 @@ public class DataLogDaoImpl extends AbstractMongoDao implements IDataLogDao {
}
Aggregation agg = Aggregation.newAggregation(
Aggregation.match(c),
Aggregation.project().and("updateDate").extractDayOfYear().as("label"),
Aggregation.group("label").count().as("value"),
Aggregation.project("value").and("label").previousOperation()
Aggregation.project().and("updateDate").extractDayOfYear().as("dayOfYear").and("updateDate").extractYear().as("year"),
Aggregation.group("dayOfYear","year").count().as("value"),
Aggregation.project("value").and("dateBean").previousOperation()
);
AggregationResults<ChartItem> results = getMongoTemplate().aggregate(agg, getEntityClass(), ChartItem.class);
return results.getMappedResults();
......
package com.myproject.manager.impl;
import com.myproject.bean.json.ChartItem;
import com.myproject.bean.json.DateBean;
import com.myproject.bean.search.PageList;
import com.myproject.bean.update.Storage;
......@@ -79,18 +80,20 @@ public class StorageManagerImpl implements IStorageManager {
c.setTime(startDay);
do{
int dayOfYear = c.get(Calendar.DAY_OF_YEAR);
int year = c.get(Calendar.YEAR);
String dayStr = DateUtil.toDateString(c.getTime());
ChartItem item = new ChartItem();
item.setLabel(dayStr);
inOutDataMap.put(String.valueOf(dayOfYear), item);
String yearAndDay = year + "-" + dayOfYear;
inOutDataMap.put(yearAndDay, item);
c.add(Calendar.DAY_OF_YEAR,1);
}while (c.getTimeInMillis() <= endTime);
List<ChartItem> putInData = dataLogDao.putInChart(startDay, endDay,partNumber);
for (ChartItem putInItem : putInData){
String dayOfYear = putInItem.getLabel();
ChartItem item = inOutDataMap.get(dayOfYear);
DateBean dateBean = putInItem.getDateBean();
ChartItem item = inOutDataMap.get(dateBean.getYear() + "-" + dateBean.getDayOfYear());
if(item != null){
item.setValue(putInItem.getValue());
}
......@@ -99,22 +102,22 @@ public class StorageManagerImpl implements IStorageManager {
List<ChartItem> checkOutData = dataLogDao.checkOutChart(startDay, endDay,partNumber);
for (ChartItem checkOutItem : checkOutData){
String dayOfYear = checkOutItem.getLabel();
ChartItem item = inOutDataMap.get(dayOfYear);
DateBean dateBean = checkOutItem.getDateBean();
ChartItem item = inOutDataMap.get(dateBean.getYear() + "-" + dateBean.getDayOfYear());
if(item != null){
item.setValue2(checkOutItem.getValue());
}
}
List<ChartItem> alarmData = alarmInfoDao.alarmChart(startDay, endDay);
for (ChartItem alarmItem : alarmData){
String dayOfYear = alarmItem.getLabel();
ChartItem item = inOutDataMap.get(dayOfYear);
if(item != null){
item.setValue3(alarmItem.getValue());
item.setValue4(alarmItem.getValue2());
}
}
// List<ChartItem> alarmData = alarmInfoDao.alarmChart(startDay, endDay);
// for (ChartItem alarmItem : alarmData){
// DateBean dateBean = alarmItem.getDateBean();
// ChartItem item = inOutDataMap.get(dateBean.getYear() + "-" + dateBean.getDayOfYear());
// if(item != null){
// item.setValue3(alarmItem.getValue());
// item.setValue4(alarmItem.getValue2());
// }
// }
//alarmInfoDao.alarmChartByType(startDay,endDay);
//alarmInfoDao.alarmChartByBox(startDay,endDay);
return inOutDataMap.values();
......
......@@ -1432,4 +1432,76 @@ public class QisdaDeviceController extends BaseController {
}
}
/**
* AGV锁定包装仓入库料架, AGV从VMI拉上包装料架准备入库时,调用此接口,用于包装仓判断料架是否是入库料架
*/
@RequestMapping("/lockPutInAShelf")
@ResponseBody
public ResultBean lockPutInAShelf(HttpServletRequest request) {
String rfid = request.getParameter("rfid");
try {
log.info("AGV锁定料架["+rfid+"]为入库料架");
ReelLockPosInfo reelLocInfo = new ReelLockPosInfo();
reelLocInfo.setBarcode(rfid);
reelLocInfo.setCid(rfid);
reelLocInfo.setLockPosName(rfid);
reelLocInfo.setLockPosId(rfid);
reelLocInfo.setRfid(rfid);
reelLocInfo.setRfidLoc("0");
reelLocInfo = QisdaCache.addReelLockPosInfo(reelLocInfo);
if(reelLocInfo == null){
return ResultBean.newErrorResult(5201,"库位锁定失败");
}else{
ResultBean.newOkResult("");
}
return ResultBean.newOkResult("");
}catch (Exception e){
log.error("锁定包装仓入库料架出错",e);
return ResultBean.newErrorResult(5202,"锁定包装仓入库料架出错:" + e.getMessage());
}
}
/**
* 点料机解析条码,用于获取料盘尺寸
*/
@RequestMapping("/resolveCode")
@ResponseBody
public ResultBean resolveCode(HttpServletRequest request) {
try {
String code = request.getParameter("code");
log.info("点料机解析获取条码["+code+"]尺寸");
if(Strings.isNotBlank(code)){
Collection<CodeBean> codeBeans = dataCache.resolveCodeStr(code);
Barcode barcode = null;
for (CodeBean codeBean : codeBeans) {
if(codeBean.isValid()){
if(barcode != null){
String msg = "找到多个有效条码";
return ResultBean.newErrorResult(5100,msg);
}else{
barcode = codeBean.getBarcode();
}
}
}
if(barcode == null){
String msg = "未找到有效条码";
return ResultBean.newErrorResult(5101,msg);
}
Map<String,Object> resultMap = new HashMap<>();
resultMap.put("barcode", barcode.getBarcode());
resultMap.put("pn",barcode.getPartNumber());
resultMap.put("qty",barcode.getAmount());
resultMap.put("w",barcode.getPlateSize());
resultMap.put("h",barcode.getHeight());
return ResultBean.newOkResult(resultMap);
}
return ResultBean.newErrorResult(5102,"未找到code参数");
}catch (Exception e){
log.error("点料机获取料盘尺寸出错",e);
return ResultBean.newErrorResult(5103,"点料机获取料盘尺寸出错:" + e.getMessage());
}
}
}
......@@ -177,8 +177,8 @@
</display:column>
<display:column property="barcode.appendInfo.facility" titleKey="Facility" sortProperty="barcode.appendInfo.facility" sortable="true"/>
<display:column titleKey="时间" sortProperty="barcode.updateDate" sortable="true">
<fmt:formatDate value="${pos.barcode.updateDate}" pattern="yyyy-MM-dd HH:mm"/>
<display:column titleKey="时间" sortProperty="barcode.putInDate" sortable="true">
<fmt:formatDate value="${pos.barcode.putInDate}" pattern="yyyy-MM-dd HH:mm"/>
</display:column>
<display:column titleKey="barcode.amount" sortProperty="barcode.amount" sortable="true">
......
......@@ -72,39 +72,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.stockOut" var="label_stockOut"/>
......@@ -439,60 +439,60 @@
};
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 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);--%>
......
......@@ -12,6 +12,26 @@
<div class="row">
<div class="col-md-12">
<ul class="timeline">
<li class="timeline-purple">
<div class="timeline-time">
<span class="date">2021</span>
<span class="time">03-15</span>
</div>
<div class="timeline-icon">
<i class="fa fa-clock-o"></i>
</div>
<div class="timeline-body">
<h2>版本: V2021031516</h2>
<div class="timeline-content">
<ul>
<li>增加点料机解析条码获取尺寸信息接口</li>
<li>增加AGV锁定VMI线入库包装料架接口</li>
<li>出入库统计信息优化</li>
</ul>
</div>
</div>
</li>
<li class="timeline-green">
<div class="timeline-time">
<span class="date">2021</span>
......
......@@ -239,7 +239,7 @@
<div class="page-footer-inner">
2016&copy; <a href="${ctx}/updateHistory.html">SMD BOX</a>
</div>
<span class="right" style="color: #a3a3a3;">Version: 2021.03.10</span>
<span class="right" style="color: #a3a3a3;">Version: 2021.03.15</span>
<div class="scroll-to-top">
<i class="icon-arrow-up"></i>
</div>
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!