Commit 17b6c565 sunke

阳光电源看板

1 个父辈 b1cd5c35
...@@ -17,6 +17,8 @@ public class ChartItem { ...@@ -17,6 +17,8 @@ public class ChartItem {
private int value4; private int value4;
private int value5;
public String getLabel() { public String getLabel() {
return label; return label;
} }
...@@ -53,6 +55,14 @@ public class ChartItem { ...@@ -53,6 +55,14 @@ public class ChartItem {
return value4; return value4;
} }
public int getValue5() {
return value5;
}
public void setValue5(int value5) {
this.value5 = value5;
}
public void setValue4(int value4) { public void setValue4(int value4) {
this.value4 = value4; this.value4 = value4;
} }
......
...@@ -24,7 +24,11 @@ public interface IDataLogDao extends IMongoDao { ...@@ -24,7 +24,11 @@ public interface IDataLogDao extends IMongoDao {
List<ChartItem> putInChart(Date fromTime, Date toTime,String partNumber); List<ChartItem> putInChart(Date fromTime, Date toTime,String partNumber);
List<ChartItem> checkOutChart(Date fromTime, Date toTime,String partNumber); int countCheckOut(Date fromTime, Date toTime);
int countPutIn(Date fromTime, Date toTime);
List<ChartItem> checkOutChart(Date fromTime, Date toTime, String partNumber);
DataLog findLastOut(String areaId, String barcode); DataLog findLastOut(String areaId, String barcode);
...@@ -46,5 +50,5 @@ public interface IDataLogDao extends IMongoDao { ...@@ -46,5 +50,5 @@ public interface IDataLogDao extends IMongoDao {
*/ */
List<DataLog> findByFeedPosId(String feederPosId); List<DataLog> findByFeedPosId(String feederPosId);
List<DataLog> findHistory(String barcode, Date startDate, Date endDate); List<DataLog> findHistory(String barcode, int num);
} }
package com.myproject.dao.mongo; package com.myproject.dao.mongo;
import com.myproject.bean.json.ChartItem;
import com.myproject.bean.json.LiteOrder; import com.myproject.bean.json.LiteOrder;
import java.util.Date;
import java.util.List; import java.util.List;
public interface ILiteOrderDao extends IMongoDao { public interface ILiteOrderDao extends IMongoDao {
...@@ -12,6 +14,10 @@ public interface ILiteOrderDao extends IMongoDao { ...@@ -12,6 +14,10 @@ public interface ILiteOrderDao extends IMongoDao {
LiteOrder findWithItemsByOrderNo(String orderNo); LiteOrder findWithItemsByOrderNo(String orderNo);
int countFinishOrder(Date fromTime, Date toTime);
List<ChartItem> orderChart(Date fromTime, Date toTime);
LiteOrder findBySource(String source); LiteOrder findBySource(String source);
List<LiteOrder> findUnCloseOrders(); List<LiteOrder> findUnCloseOrders();
......
...@@ -52,6 +52,24 @@ public class DataLogDaoImpl extends AbstractMongoDao implements IDataLogDao { ...@@ -52,6 +52,24 @@ public class DataLogDaoImpl extends AbstractMongoDao implements IDataLogDao {
} }
@Override @Override
public int countCheckOut(Date fromTime, Date toTime){
return count(fromTime, toTime, StorageConstants.OP.CHECKOUT);
}
@Override
public int countPutIn(Date fromTime, Date toTime){
return count(fromTime, toTime, StorageConstants.OP.PUT_IN);
}
private int count(Date fromTime, Date toTime, int type){
Date addOneDayToTime = DateUtil.addOneDayNoTime(toTime);
Criteria c = new Criteria().andOperator(Criteria.where("updateDate").gte(fromTime),
Criteria.where("updateDate").lt(addOneDayToTime)).and("type").is(type);
c.and("status").in(StorageConstants.OP_STATUS.END.name(),StorageConstants.OP_STATUS.FINISHED.name());
return countByQuery(Query.query(c));
}
@Override
public List<ChartItem> checkOutChart(Date fromTime, Date toTime,String partNumber){ public List<ChartItem> checkOutChart(Date fromTime, Date toTime,String partNumber){
return chart(fromTime, toTime, StorageConstants.OP.CHECKOUT,partNumber); return chart(fromTime, toTime, StorageConstants.OP.CHECKOUT,partNumber);
} }
...@@ -151,19 +169,15 @@ public class DataLogDaoImpl extends AbstractMongoDao implements IDataLogDao { ...@@ -151,19 +169,15 @@ public class DataLogDaoImpl extends AbstractMongoDao implements IDataLogDao {
} }
@Override @Override
public List<DataLog> findHistory(String barcode, Date startDate, Date endDate) { public List<DataLog> findHistory(String barcode, int num) {
Criteria c = new Criteria(); Criteria c = new Criteria();
if(barcode != null && !barcode.isEmpty()){ if(barcode != null && !barcode.isEmpty()){
c.and("barcode").is(barcode); c.and("barcode").is(barcode);
} }
if(startDate != null){ Query q = Query.query(c);
c.and("createDate").gte(startDate); q.limit(num);
} q.with(new Sort(Sort.Direction.DESC, "updateDate"));
return findByQuery(q);
if(endDate != null){
c.and("updateDate").lte(endDate);
}
return findByQuery(Query.query(c));
} }
} }
package com.myproject.dao.mongo.impl; package com.myproject.dao.mongo.impl;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.myproject.bean.json.ChartItem;
import com.myproject.bean.json.LiteOrder; import com.myproject.bean.json.LiteOrder;
import com.myproject.bean.json.LiteOrderItem; import com.myproject.bean.json.LiteOrderItem;
import com.myproject.dao.mongo.AbstractMongoDao; import com.myproject.dao.mongo.AbstractMongoDao;
import com.myproject.dao.mongo.ILiteOrderDao; import com.myproject.dao.mongo.ILiteOrderDao;
import com.myproject.dao.mongo.ILiteOrderItemDao; import com.myproject.dao.mongo.ILiteOrderItemDao;
import com.myproject.util.DateUtil;
import com.myproject.util.StorageConstants; import com.myproject.util.StorageConstants;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.util.Strings;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort; import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.aggregation.Aggregation;
import org.springframework.data.mongodb.core.aggregation.AggregationResults;
import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
...@@ -56,6 +61,29 @@ public class LiteOrderDaoImpl extends AbstractMongoDao implements ILiteOrderDao ...@@ -56,6 +61,29 @@ public class LiteOrderDaoImpl extends AbstractMongoDao implements ILiteOrderDao
} }
@Override @Override
public int countFinishOrder(Date fromTime, Date toTime){
Date addOneDayToTime = DateUtil.addOneDayNoTime(toTime);
Criteria c = new Criteria().andOperator(Criteria.where("updateDate").gte(fromTime),
Criteria.where("updateDate").lt(addOneDayToTime));
return countByQuery(Query.query(c));
}
@Override
public List<ChartItem> orderChart(Date fromTime, Date toTime){
Date addOneDayToTime = DateUtil.addOneDayNoTime(toTime);
Criteria c = new Criteria().andOperator(Criteria.where("updateDate").gte(fromTime),
Criteria.where("updateDate").lt(addOneDayToTime));
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()
);
AggregationResults<ChartItem> results = getMongoTemplate().aggregate(agg, getEntityClass(), ChartItem.class);
return results.getMappedResults();
}
@Override
public LiteOrder findBySource(String source) { public LiteOrder findBySource(String source) {
if (StringUtils.isEmpty(source)) if (StringUtils.isEmpty(source))
return null; return null;
......
...@@ -17,6 +17,8 @@ public interface IStorageManager extends IManager<Storage> { ...@@ -17,6 +17,8 @@ public interface IStorageManager extends IManager<Storage> {
public Storage findEmptyStorage(); public Storage findEmptyStorage();
ChartItem getWeekData();
Collection<ChartItem> getRunStatusData(Date fromDate, Date toDate, String partNumber); Collection<ChartItem> getRunStatusData(Date fromDate, Date toDate, String partNumber);
List<Storage> findByArea(String areaId); List<Storage> findByArea(String areaId);
......
...@@ -6,6 +6,7 @@ import com.myproject.bean.search.PageList; ...@@ -6,6 +6,7 @@ import com.myproject.bean.search.PageList;
import com.myproject.bean.update.Storage; import com.myproject.bean.update.Storage;
import com.myproject.dao.mongo.IAlarmInfoDao; import com.myproject.dao.mongo.IAlarmInfoDao;
import com.myproject.dao.mongo.IDataLogDao; import com.myproject.dao.mongo.IDataLogDao;
import com.myproject.dao.mongo.ILiteOrderDao;
import com.myproject.dao.mongo.IStorageDao; import com.myproject.dao.mongo.IStorageDao;
import com.myproject.exception.ValidateException; import com.myproject.exception.ValidateException;
import com.myproject.manager.IStorageManager; import com.myproject.manager.IStorageManager;
...@@ -27,6 +28,9 @@ public class StorageManagerImpl implements IStorageManager { ...@@ -27,6 +28,9 @@ public class StorageManagerImpl implements IStorageManager {
IDataLogDao dataLogDao; IDataLogDao dataLogDao;
@Autowired @Autowired
IAlarmInfoDao alarmInfoDao; IAlarmInfoDao alarmInfoDao;
@Autowired
ILiteOrderDao liteOrderDao;
protected final transient Logger log = LogManager.getLogger(getClass()); protected final transient Logger log = LogManager.getLogger(getClass());
...@@ -59,6 +63,20 @@ public class StorageManagerImpl implements IStorageManager { ...@@ -59,6 +63,20 @@ public class StorageManagerImpl implements IStorageManager {
return storage; return storage;
} }
@Override
public ChartItem getWeekData(){
Date startDay = DateUtil.getFirstDayOfThisWeek();
Date endDay = new Date();
int putInCount = dataLogDao.countPutIn(startDay, endDay);
int checkOutCount = dataLogDao.countCheckOut(startDay, endDay);
int orderCount = liteOrderDao.countFinishOrder(startDay, endDay);
ChartItem item = new ChartItem();
item.setValue(putInCount);
item.setValue2(checkOutCount);
item.setValue3(orderCount);
return item;
}
/** /**
* 获取某个时间段的统计信息ChartItem 的 value 为入库量,value2为出库量,value3为报警次数,value4为报警持续时间 * 获取某个时间段的统计信息ChartItem 的 value 为入库量,value2为出库量,value3为报警次数,value4为报警持续时间
*/ */
...@@ -115,6 +133,15 @@ public class StorageManagerImpl implements IStorageManager { ...@@ -115,6 +133,15 @@ public class StorageManagerImpl implements IStorageManager {
item.setValue4(alarmItem.getValue2()); item.setValue4(alarmItem.getValue2());
} }
} }
List<ChartItem> orderData = liteOrderDao.orderChart(startDay, endDay);
for (ChartItem orderItem : orderData){
String dayOfYear = orderItem.getLabel();
ChartItem item = inOutDataMap.get(dayOfYear);
if(item != null){
item.setValue5(orderItem.getValue());
}
}
//alarmInfoDao.alarmChartByType(startDay,endDay); //alarmInfoDao.alarmChartByType(startDay,endDay);
//alarmInfoDao.alarmChartByBox(startDay,endDay); //alarmInfoDao.alarmChartByBox(startDay,endDay);
return inOutDataMap.values(); return inOutDataMap.values();
......
...@@ -126,6 +126,15 @@ public final class DateUtil { ...@@ -126,6 +126,15 @@ public final class DateUtil {
} }
/** /**
* 获取本周的第一天
*/
public static Date getFirstDayOfThisWeek(){
Calendar c = noTimeCalendar();
c.set(Calendar.DAY_OF_WEEK,Calendar.MONDAY);
return c.getTime();
}
/**
* 将日期添加一天,时间设置为00:00:00 * 将日期添加一天,时间设置为00:00:00
*/ */
public static Date addOneDayNoTime(Date date){ public static Date addOneDayNoTime(Date date){
......
...@@ -75,6 +75,12 @@ public class ChartController extends BaseController{ ...@@ -75,6 +75,12 @@ public class ChartController extends BaseController{
return storageManager.getRunStatusData(startDay, today, null); return storageManager.getRunStatusData(startDay, today, null);
} }
@RequestMapping("/rest/api/weekData")
@ResponseBody
public ChartItem weekData(HttpServletRequest request){
return storageManager.getWeekData();
}
@RequestMapping("/rest/api/humiture") @RequestMapping("/rest/api/humiture")
@ResponseBody @ResponseBody
public HumitureData humitureData(HttpServletRequest request){ public HumitureData humitureData(HttpServletRequest request){
......
...@@ -6,6 +6,8 @@ import com.google.common.collect.Maps; ...@@ -6,6 +6,8 @@ import com.google.common.collect.Maps;
import com.google.common.collect.Sets; import com.google.common.collect.Sets;
import com.myproject.bean.CodeBean; import com.myproject.bean.CodeBean;
import com.myproject.bean.update.*; import com.myproject.bean.update.*;
import com.myproject.bean.utils.BoxStatusBean;
import com.myproject.bean.utils.StatusBean;
import com.myproject.dao.mongo.IDataLogDao; import com.myproject.dao.mongo.IDataLogDao;
import com.myproject.exception.ValidateException; import com.myproject.exception.ValidateException;
import com.myproject.manager.IBarcodeManager; import com.myproject.manager.IBarcodeManager;
...@@ -306,22 +308,34 @@ public class MesApiController extends BaseController { ...@@ -306,22 +308,34 @@ public class MesApiController extends BaseController {
} }
@RequestMapping(value = "/history") @RequestMapping(value = "/history")
@ResponseBody @ResponseBody
public List<Map<String,Object>> history(HttpServletRequest request) { public List<Map<String,Object>> history(HttpServletRequest request) {
String bid = request.getParameter("bid"); String bid = request.getParameter("bid");
String start = request.getParameter("start"); // String start = request.getParameter("start");
String end = request.getParameter("end"); // String end = request.getParameter("end");
Date startDate = toDate(start); // Date startDate = toDate(start);
Date endDate = toDate(end); // Date endDate = toDate(end);
String numStr = request.getParameter("num");
int num = 20;
if(!Strings.isNullOrEmpty(numStr)){
try{
num = Integer.valueOf(numStr);
}catch (Exception e){
}
}
List<Map<String,Object>> results = Lists.newArrayList(); List<Map<String,Object>> results = Lists.newArrayList();
List<DataLog> datas = dataLogDao.findHistory(bid,startDate,endDate); List<DataLog> datas = dataLogDao.findHistory(bid,num);
datas.sort(new Comparator<DataLog>() {
@Override
public int compare(DataLog o1, DataLog o2) {
return o1.getCreateDate().compareTo(o2.getCreateDate());
}
});
for (DataLog dataItem : datas){ for (DataLog dataItem : datas){
Map<String,Object> item = Maps.newHashMap(); Map<String,Object> item = Maps.newHashMap();
item.put("barcode",dataItem.getBarcode()); item.put("barcode",dataItem.getBarcode());
...@@ -329,15 +343,41 @@ public class MesApiController extends BaseController { ...@@ -329,15 +343,41 @@ public class MesApiController extends BaseController {
item.put("qty",dataItem.getNum()); item.put("qty",dataItem.getNum());
item.put("type", dataItem.getType()); item.put("type", dataItem.getType());
item.put("opor", dataItem.getOperator()); item.put("opor", dataItem.getOperator());
item.put("pos",dataItem.getPosStr()); item.put("boxName",dataItem.getStorageName());
item.put("posName",dataItem.getPosName());
item.put("source",dataItem.getSourceId());
item.put("status", dataItem.getStatus()); item.put("status", dataItem.getStatus());
item.put("memo", dataItem.getMemo());
item.put("date", DateUtil.toDateTimeString(dataItem.getCreateDate())); item.put("date", DateUtil.toDateTimeString(dataItem.getCreateDate()));
results.add(item); results.add(item);
} }
return results; return results;
} }
@RequestMapping(value = "/status")
@ResponseBody
public Map<String,Object> status(HttpServletRequest request) {
Map<String,Object> results = Maps.newHashMap();
for (Storage storage : dataCache.getAllStorage().values()){
StatusBean statusBean = taskService.getStatus(storage.getCid());
Map<Integer, BoxStatusBean> boxStatusMap = statusBean.getBoxStatus();
int status = -1;
if(boxStatusMap != null){
BoxStatusBean boxStatusBean = boxStatusMap.get(1);
if(boxStatusBean != null){
status = boxStatusBean.getStatus();
}
}
int storageStatus = status;
if(status == StorageConstants.STATUS.OFFLINE || statusBean.timeOut()){
//离线
storageStatus = -1;
}
results.put(storage.getName(), storageStatus);
}
return results;
}
private Date toDate(String dateStr){ private Date toDate(String dateStr){
try { try {
return DateUtil.toDate(dateStr,"yyyyMMddHHmmss"); return DateUtil.toDate(dateStr,"yyyyMMddHHmmss");
......
...@@ -541,7 +541,7 @@ public class StorageDataController extends BaseController { ...@@ -541,7 +541,7 @@ public class StorageDataController extends BaseController {
@RequestMapping(value = "/getLineMsg") @RequestMapping(value = "/getLineMsg")
@ResponseBody @ResponseBody
public String getLineMsg(HttpServletRequest request) { public String getLineMsg(HttpServletRequest request) {
if(lineMsgParams != null){ if(lineMsgParams == null){
return ""; return "";
} }
return getText(lineMsgParams.getMessage(),lineMsgParams.getParams(), request.getLocale(),lineMsgParams.getDefaultMsg()); return getText(lineMsgParams.getMessage(),lineMsgParams.getParams(), request.getLocale(),lineMsgParams.getDefaultMsg());
...@@ -600,7 +600,7 @@ public class StorageDataController extends BaseController { ...@@ -600,7 +600,7 @@ public class StorageDataController extends BaseController {
Storage theStorage = dataCache.getStorageById(pos.getStorageId()); Storage theStorage = dataCache.getStorageById(pos.getStorageId());
resultMap.put("cid",theStorage.getCid()); resultMap.put("cid",theStorage.getCid());
String lineMsg = "["+barcode.getBarcode()+"]准备入库到["+pos.getPosName()+"]"; String lineMsg = "["+barcode.getBarcode()+"]准备入库到["+pos.getPosName()+"]";
lineMsgParams = new ValidateException("msg.line.putIn",new String[]{code}, lineMsg); lineMsgParams = new ValidateException("msg.line.putIn",new String[]{code,pos.getPosName()}, lineMsg);
}else{ }else{
resultMap.put("result","104"); resultMap.put("result","104");
lineMsgParams = new ValidateException("error.storage.noPosFind",new String[]{code}, "未找到可用的仓位"); lineMsgParams = new ValidateException("error.storage.noPosFind",new String[]{code}, "未找到可用的仓位");
......
...@@ -1690,7 +1690,7 @@ public class TaskService implements ITaskService { ...@@ -1690,7 +1690,7 @@ public class TaskService implements ITaskService {
items.add(liteOrderItem); items.add(liteOrderItem);
} }
order.setOrderItems(items); order.setOrderItems(items);
if(order.isClosed()){ if(!order.isClosed()){
//工单未关闭的话,检查状态,全部都出完进行关闭 //工单未关闭的话,检查状态,全部都出完进行关闭
boolean closed = true; boolean closed = true;
for (LiteOrderItem liteOrderItem : order.getOrderItems()) { for (LiteOrderItem liteOrderItem : order.getOrderItems()) {
......
...@@ -11,24 +11,19 @@ ...@@ -11,24 +11,19 @@
<div class="clearfix"> <div class="clearfix">
</div> </div>
<div class="row"> <div class="row">
<div class="col-md-6 col-sm-6"> <div class="col-md-6 col-sm-6">
<!-- BEGIN PORTLET--> <!-- BEGIN PORTLET-->
<div class="portlet solid bordered grey-cararra"> <div class="portlet solid grey-cararra bordered">
<div class="portlet-title"> <div class="portlet-title">
<div class="caption"> <div class="caption">
<a href="${ctx}/system/dataReport.html"><i class="fa fa-bar-chart-o"></i><fmt:message key="chart.solder.used"/></a> <i class="fa fa-bullhorn"></i><fmt:message key="料仓利用率"/>
</div> </div>
<%--<div class="actions">
<div class="btn-group" data-toggle="buttons">
<label class="btn grey-steel btn-sm active" id="inOutShow" >
<input type="radio" class="toggle">吞吐量</label>
<label class="btn grey-steel btn-sm" id="alarmShow" >
<input type="radio" class="toggle">报警</label>
</div>
</div>--%>
</div> </div>
<div class="portlet-body"> <div class="portlet-body">
<div id="inOutChart" style="height: 330px;">
<div id="storageUsedChart" style="height: 330px;">
</div> </div>
</div> </div>
...@@ -37,16 +32,14 @@ ...@@ -37,16 +32,14 @@
</div> </div>
<div class="col-md-6 col-sm-6"> <div class="col-md-6 col-sm-6">
<!-- BEGIN PORTLET--> <!-- BEGIN PORTLET-->
<div class="portlet solid grey-cararra bordered"> <div class="portlet solid bordered grey-cararra">
<div class="portlet-title"> <div class="portlet-title">
<div class="caption"> <div class="caption">
<i class="fa fa-bullhorn"></i><fmt:message key="chart.solder.stock"/> <a href="${ctx}/system/dataReport.html"><i class="fa fa-bar-chart-o"></i><fmt:message key="物料分布"/></a>
</div> </div>
</div> </div>
<div class="portlet-body"> <div class="portlet-body">
<div id="sizeUsageChart" style="height: 330px;">
<div id="storageUsedChart" style="height: 330px;">
</div> </div>
</div> </div>
...@@ -63,11 +56,11 @@ ...@@ -63,11 +56,11 @@
<div class="portlet box purple-wisteria"> <div class="portlet box purple-wisteria">
<div class="portlet-title"> <div class="portlet-title">
<div class="caption"> <div class="caption">
<i class="fa fa-calendar"></i><fmt:message key="chart.temperature"/> <i class="fa fa-calendar"></i><fmt:message key="最近7日数据"/>
</div> </div>
</div> </div>
<div class="portlet-body"> <div class="portlet-body">
<div id="temperatureChart" style="height:300px"> <div id="inOutChart" style="height:300px">
</div> </div>
...@@ -80,11 +73,11 @@ ...@@ -80,11 +73,11 @@
<div class="portlet box red-sunglo"> <div class="portlet box red-sunglo">
<div class="portlet-title"> <div class="portlet-title">
<div class="caption"> <div class="caption">
<i class="fa fa-calendar"></i><fmt:message key="chart.humidity"/> <i class="fa fa-calendar"></i><fmt:message key="本周数据"/>
</div> </div>
</div> </div>
<div class="portlet-body"> <div class="portlet-body">
<div id="humidityChart" style="height:300px"> <div id="weekChart" style="height:300px">
</div> </div>
...@@ -94,99 +87,6 @@ ...@@ -94,99 +87,6 @@
</div> </div>
<%-- <div class="clearfix">
</div>
<div class="row">
<div class="col-md-6 col-sm-6">
<div class="portlet box green-haze tasks-widget">
<div class="portlet-title">
<div class="caption">
<i class="fa fa-check"></i>任务列表
</div>
</div>
<div class="portlet-body">
<div class="task-content">
<div class="slimScrollDiv"
style="position: relative; overflow: hidden; width: auto; height: 305px;">
<div class="scroller" style="height: 305px; overflow: hidden; width: auto;"
data-always-visible="1" data-rail-visible1="1" data-initialized="1">
<!-- START TASK LIST -->
<ul class="task-list" id="task">
<c:forEach items="${feeders}" var="feeder">
<li>
<div class='task-title'>
<span class='task-title-sp'>
<a href="${ctx}/workOrder/feederView.html?fid=${feeder.id}">${feeder.name}</a>
</span>
<span class='label label-sm label-${fn:toLowerCase(feeder.status)}'>[<fmt:message key="op.status.${fn:toLowerCase(feeder.status)}"/> ]</span>
</div>
</li>
</c:forEach>
</ul>
<!-- END START TASK LIST -->
</div>
</div>
</div>
<div class="task-footer">
<div class="btn-arrow-link pull-right">
<a href="${ctx}/workOrder/feederSearch.html">more</a>
<i class="icon-arrow-right"></i>
</div>
</div>
</div>
</div>
</div>
<!--任务
-->
<div class="col-md-6 col-sm-6">
<div class="portlet box blue-steel">
<div class="portlet-title">
<div class="caption">
<i class="fa fa-bell-o"></i>任务
</div>
</div>
<div class="portlet-body">
<div class="scroller" style="height: 300px;" data-always-visible="1" data-rail-visible="0">
<ul class="feeds" id="logs">
<c:forEach items="${dataLogs}" var="dataLog">
<c:set var="typeIcon" value="fa-sign-in"/>
<c:if test="${dataLog.type == 2}">
<c:set var="typeIcon" value="fa-sign-out"/>
</c:if>
<li>
<div class='col1'><div class='cont'>
<div class='cont-col1'>
<div class='label label-sm label-${fn:toLowerCase(dataLog.status)}'><i class='fa ${typeIcon}'></i></div>
</div>
<div class='cont-col2'><div class='desc'>${dataLog.showStr}</div></div>
</div></div>
<div class='col2'><div class='date'>
<span class='label label-sm label-${fn:toLowerCase(dataLog.status)}'><fmt:message key="op.status.${fn:toLowerCase(dataLog.status)}"/> </span>
</div></div>
</li>
</c:forEach>
</ul>
</div>
<div class="scroller-footer">
<div class="btn-arrow-link pull-right">
<a href="${ctx}/dataLog/search.html">more</a>
<i class="icon-arrow-right"></i>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="clearfix">
</div>
</div>
</div>
--%>
<fmt:message key="home.chart.storage.total" scope="page" var="storageTotal"/> <fmt:message key="home.chart.storage.total" scope="page" var="storageTotal"/>
<fmt:message key="home.chart.storage.useage" scope="page" var="storageUsage"/> <fmt:message key="home.chart.storage.useage" scope="page" var="storageUsage"/>
...@@ -204,130 +104,226 @@ ...@@ -204,130 +104,226 @@
<script type="text/javascript"> <script type="text/javascript">
setCtx('${ctx}'); setCtx('${ctx}');
//-----------利用率----------- //-----------料仓利用率-----------
/*var dom = document.getElementById("storageUsedChart"); function showStorageUsageBar(storageList){
var usedChart = echarts.init(dom); var dom = document.getElementById("storageUsedChart");
usedChart.showLoading(); var usedChart = echarts.init(dom);
loadUsedData = function(){ usedChart.clear();
$.post('${ctx}/rest/api/allStorages', function(data) { usedChart.showLoading();
usedChart.hideLoading(); var data = storageList;
var usedCounts = new Array();
var emptyCounts = new Array(); usedChart.hideLoading();
var names = new Array(); var usedCounts = new Array();
for(i in data){ var emptyCounts = new Array();
var storage = data[i]; var names = new Array();
names.push(storage.name); for(i in data){
usedCounts.push(storage.totalSlots - storage.emptySlots); var storage = data[i];
emptyCounts.push(storage.emptySlots); names.push(storage.name);
} usedCounts.push(storage.totalSlots - storage.emptySlots);
emptyCounts.push(storage.emptySlots);
usedOption = { }
tooltip : {
trigger: 'axis', usedOption = {
axisPointer : { // 坐标轴指示器,坐标轴触发有效 color: ['#c23531','#308014'],
type : 'shadow' // 默认为直线,可选为:'line' | 'shadow' tooltip : {
} trigger: 'axis',
}, axisPointer : { // 坐标轴指示器,坐标轴触发有效
toolbox: { type : 'shadow' // 默认为直线,可选为:'line' | 'shadow'
feature: { }
dataView: {show: true, readOnly: true},
saveAsImage: {show: true}
}
},
legend: {
data: ['${storageUsage}', '${storageEmpty}']
},
grid: {
left: '3%',
right: '4%',
bottom: '3%',
containLabel: true
},
xAxis: {
type: 'category',
data: names,
axisTick: {
//alignWithLabel: true
}
},
yAxis: {
type: 'value'
},
series: [
{
name: '${storageUsage}',
type: 'bar',
stack: '${storageTotal}',
barMaxWidth : 35,
itemStyle:{
normal: {
color: '#c23531'
}
},
label: {
normal: {
show: true,
position: 'insideRight'
}
},
data: usedCounts
}, },
{ toolbox: {
name: '${storageEmpty}', feature: {
type: 'bar', dataView: {show: true, readOnly: true},
stack: '${storageTotal}', saveAsImage: {show: true}
itemStyle:{ }
normal: {
color: '#308014'
}
},
label: {
normal: {
show: true,
position: 'insideRight'
}
},
data: emptyCounts
}, },
{ legend: {
name: '${storageTotal} : ${usedPosData.value}', data: ['${storageUsage}', '${storageEmpty}']
type: 'pie', },
radius : '15%', grid: {
center: ['28%', '28%'], left: '3%',
tooltip : { right: '4%',
trigger: 'item', bottom: '3%',
formatter: "{a} <br/>{b} : {c} ({d}%)" containLabel: true
},
xAxis: {
type: 'category',
data: names,
axisTick: {
alignWithLabel: true
}
},
yAxis: {
type: 'value'
},
series: [
{
name: '${storageUsage}',
type: 'bar',
stack: '${storageTotal}',
// label: {
// normal: {
// show: true,
// position: 'insideRight'
// }
// },
data: usedCounts
}, },
data:[ {
{value:${usedPosData.value - usedPosData.value2}, name:'${storageUsage}',itemStyle:{normal:{color:'#c23531'}}}, name: '${storageEmpty}',
{value:${usedPosData.value2}, name:'${storageEmpty}',itemStyle:{normal:{color:'#308014'}}} type: 'bar',
] stack: '${storageTotal}',
} // label: {
] // normal: {
}; // show: true,
usedChart.setOption(usedOption); // position: 'insideRight'
}); // }
}*/ // },
data: emptyCounts
},
{
name: '${storageTotal} : ${usedPosData.value}',
type: 'pie',
radius : '15%',
center: ['20%', '20%'],
tooltip : {
trigger: 'item',
formatter: "{a} <br/>{b} : {c} ({d}%)"
},
data:[
{value:${usedPosData.value - usedPosData.value2}, name:'${storageUsage}',itemStyle:{normal:{color:'#c23531'}}},
{value:${usedPosData.value2}, name:'${storageEmpty}',itemStyle:{normal:{color:'#308014'}}}
]
}
]
};
usedChart.setOption(usedOption);
}
function showSizeUsageBar(storageList){
var dom = document.getElementById("sizeUsageChart");
var usedChart = echarts.init(dom);
usedChart.clear();
usedChart.showLoading();
var data = storageList;
usedChart.hideLoading();
var sizeData = {};
for(var i in data){
var usageMap = data[i].usageMap;
for(var sizeStr in usageMap){
var usageData = usageMap[sizeStr];
var sizeItem = sizeData[sizeStr];
if(sizeItem){
sizeItem.totalCount = sizeItem.totalCount + usageData.totalCount;
sizeItem.usedCount = sizeItem.usedCount + usageData.usedCount;
}else{
sizeItem = usageData;
}
sizeData[sizeStr] = sizeItem;
}
}
//-------------出入库------------- var usedCounts = new Array();
/*var inOutDom = document.getElementById("inOutChart"); var emptyCounts = new Array();
var inOutChart = echarts.init(inOutDom); var names = new Array();
for(var sizeStr in sizeData){
var sizeItem = sizeData[sizeStr];
names.push(sizeStr);
usedCounts.push(sizeItem.usedCount);
emptyCounts.push(sizeItem.totalCount - sizeItem.usedCount);
}
var inOutOption; usedOption = {
var alarmOption; color: ['#3398DB'],
tooltip : {
trigger: 'axis',
axisPointer : { // 坐标轴指示器,坐标轴触发有效
type : 'shadow' // 默认为直线,可选为:'line' | 'shadow'
}
},
toolbox: {
feature: {
dataView: {show: true, readOnly: true},
saveAsImage: {show: true}
}
},
legend: {
//data: ['${storageUsage}', '${storageEmpty}']
},
grid: {
left: '3%',
right: '4%',
bottom: '3%',
containLabel: true
},
xAxis: {
type: 'category',
data: names,
axisTick: {
alignWithLabel: true
}
},
yAxis: {
type: 'value'
},
series: [
{
name: '${storageUsage}',
type: 'bar',
stack: '${storageTotal}',
//barMaxWidth : 35,
itemStyle:{
normal: {
//color: '#c23531'
}
},
// label: {
// normal: {
// show: true,
// position: 'insideRight'
// }
// },
data: usedCounts
},
<%--{--%>
<%--name: '${storageEmpty}',--%>
<%--type: 'bar',--%>
<%--stack: '${storageTotal}',--%>
<%--itemStyle:{--%>
<%--normal: {--%>
<%--color: '#308014'--%>
<%--}--%>
<%--},--%>
<%--// label: {--%>
<%--// normal: {--%>
<%--// show: true,--%>
<%--// position: 'insideRight'--%>
<%--// }--%>
<%--// },--%>
<%--data: emptyCounts--%>
<%--},--%>
]
};
usedChart.setOption(usedOption);
}
//-------------出入库-------------
function showInOutChart(days){
var inOutDom = document.getElementById("inOutChart");
var inOutChart = echarts.init(inOutDom);
inOutChart.showLoading(); var inOutOption;
loadInOutData = function(days){ var alarmOption;
inOutChart.showLoading();
$.post('${ctx}/rest/api/inOutData?days='+days, function(data) { $.post('${ctx}/rest/api/inOutData?days='+days, function(data) {
var days = new Array(); var days = new Array();
var putIns = new Array(); var putIns = new Array();
var checkOuts = new Array(); var checkOuts = new Array();
var alarms = new Array(); var orders = new Array();
var lastTimes = new Array(); var lastTimes = new Array();
for(i in data){ for(i in data){
...@@ -335,7 +331,7 @@ ...@@ -335,7 +331,7 @@
days.push(inOutItem.label); days.push(inOutItem.label);
putIns.push(inOutItem.value); putIns.push(inOutItem.value);
checkOuts.push(inOutItem.value2); checkOuts.push(inOutItem.value2);
alarms.push(inOutItem.value3); orders.push(inOutItem.value5);
lastTimes.push(inOutItem.value4); lastTimes.push(inOutItem.value4);
} }
inOutChart.hideLoading(); inOutChart.hideLoading();
...@@ -357,7 +353,7 @@ ...@@ -357,7 +353,7 @@
} }
}, },
legend: { legend: {
data:['入库量','出库量'] data:['入库量','出库量',"工单数"]
}, },
grid: { grid: {
left: '3%', left: '3%',
...@@ -390,7 +386,7 @@ ...@@ -390,7 +386,7 @@
series: [ series: [
{ {
name:'入库量', name:'入库量',
type:'bar', type:'line',
itemStyle:{ itemStyle:{
normal: { normal: {
color: '#9b59b6' color: '#9b59b6'
...@@ -400,398 +396,105 @@ ...@@ -400,398 +396,105 @@
}, },
{ {
name:'出库量', name:'出库量',
type:'bar', type:'line',
itemStyle:{ itemStyle:{
normal: { normal: {
color: '#dfba49' color: '#dfba49'
} }
}, },
data:checkOuts data:checkOuts
}
]
};
alarmOption = {
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'shadow',
crossStyle: {
color: '#999'
}
}
},
toolbox: {
feature: {
dataView: {show: true, readOnly: true},
saveAsImage: {show: true}
}
},
legend: {
data:['报警次数','报警持续时间']
},
grid: {
left: '3%',
right: '4%',
bottom: '3%',
containLabel: true
},
xAxis: [
{
type: 'category',
data: days,
axisPointer: {
type: 'shadow'
}
}
],
yAxis: [
{
type: 'value',
name: '报警次数',
min: 0,
max: 500,
//interval: 5,
minInterval: 1,
axisLabel: {
formatter: '{value} 次'
}
}, },
{ {
type: 'value', name:'工单数',
name: '持续时间(分钟)',
min: 0,
max: 1000,
//interval: 50,
minInterval: 1,
axisLabel: {
formatter: '{value} 分钟'
}
}
],
series: [
{
name:'报警次数',
type:'line',
symbol: 'emptyCircle',
symbolSize: 10,
itemStyle:{
normal: {
color: '#F3565D'
}
},
data:alarms
}
,
{
name:'报警持续时间',
type:'line', type:'line',
symbol: 'emptyCircle', // itemStyle:{
stack: '总量', // normal: {
symbolSize: 10, // color: '#dfba49'
itemStyle:{ // }
normal: { // },
color: '#4b77be' data:orders
}
},
areaStyle: {normal: {}},
smooth:true,
symbol: 'none',
sampling: 'average',
yAxisIndex: 1,
data:lastTimes
} }
] ]
}; };
inOutChart.setOption(inOutOption); inOutChart.setOption(inOutOption);
}); });
} }
*/
/* $("#inOutShow").click(function (){
inOutChart.setOption(inOutOption,true);
//showSolderInventoryChart('inOutChart','${show}',false);
//showOutSolderChart("inOutChart","DAY"); //---------本周数据------------
})*/ function showWeekDataChart(){
showOutSolderChart("inOutChart","DAY"); var dom = document.getElementById("weekChart");
solderInventoryChart('storageUsedChart','${show}',false); var usedChart = echarts.init(dom);
usedChart.clear();
/*$("#alarmShow").click(function (){ usedChart.showLoading();
inOutChart.setOption(alarmOption,true); $.post('${ctx}/rest/api/weekData', function(data) {
})*/ usedChart.hideLoading();
//-----------温湿度-----------
var temperaturetDom = document.getElementById("temperatureChart");
var temperatureChart = echarts.init(temperaturetDom);
var humidityDom = document.getElementById("humidityChart");
var humidityChart = echarts.init(humidityDom);
humidityChart.showLoading();
temperatureChart.showLoading();
var names = ["入库盘数","出库盘数","工单数"];
var dataArray = new Array();
dataArray.push(data.value);
dataArray.push(data.value1);
dataArray.push(data.value2);
loadHumidityData = function(days){ usedOption = {
// 异步加载数据 color: ['#91c7ae'],
$.post('${ctx}/rest/api/humiture?hours='+days, function(data) { tooltip : {
humidityChart.hideLoading(); trigger: 'axis',
temperatureChart.hideLoading(); axisPointer : { // 坐标轴指示器,坐标轴触发有效
// 填入数据 type : 'shadow' // 默认为直线,可选为:'line' | 'shadow'
temperatureChart.setOption({ }
tooltip: {
trigger: 'axis'
},
legend: {
data:data.boxNames
},
grid: {
left: '3%',
right: '4%',
bottom: '3%',
containLabel: true
}, },
toolbox: { toolbox: {
show: true,
feature: { feature: {
//dataView: {readOnly: false}, dataView: {show: true, readOnly: true},
//magicType: {type: ['line', 'bar']}, saveAsImage: {show: true}
//restore: {},
//saveAsImage: {}
}
},
xAxis: {type: 'category',
boundaryGap: false,
data: data.times
},
yAxis: {
type: 'value',
axisLabel: {
formatter: '{value} °C'
} }
}, },
series: data.temperatureData
});
humidityChart.setOption({
tooltip: {
trigger: 'axis'
},
legend: {
data:data.boxNames
},
grid: { grid: {
left: '3%', left: '3%',
right: '4%', right: '4%',
bottom: '3%', bottom: '3%',
containLabel: true containLabel: true
}, },
toolbox: { xAxis: {
show: true, type: 'category',
feature: { data: names,
//dataView: {readOnly: false}, axisTick: {
//magicType: {type: ['line', 'bar']}, alignWithLabel: true
//restore: {},
//saveAsImage: {}
} }
}, },
xAxis: {type: 'category',
boundaryGap: false,
data: data.times
},
yAxis: { yAxis: {
type: 'value',
axisLabel: {
formatter: '{value} '
}
},
series: data.humidityData
});
});
}
/**
* 锡膏实时库存
* @param elementId
* @param cid
* @reload 是否重新加载
*/
function solderInventoryChart(elementId,cid, reload){
var inventoryDom = document.getElementById(elementId);
var inventoryChart = echarts.init(inventoryDom);
var lengend = {
height:10,
itemWidth: 23,
data: ['${label_warming}','${label_warmed}','${label_soonToExpire}', '${label_invalid}',{name:'max', icon: 'image://'+ctx+'/assets/global/img/maxIcon.png'}, {name:'min', icon: 'image://'+ctx+'/assets/global/img/minIcon.png'}],
};
if(reload){
inventoryChart.clear();
inventoryChart.showLoading();
lengend.width = 350;
}
$.get(ctx + '/service/store/solderInventory?cid='+cid).done(function (data) {
inventoryChart.hideLoading();
var xAxisLabel = new Array();
var finishWarmData = new Array();//回温完成
var inWarmData = new Array();//正在回温
var willExpireData = new Array();//即将过期
var expireData = new Array();//失效
var maxAlarm = new Array();//
var minAlarm = new Array();
for(i in data){
var item = data[i];
pushToArr(xAxisLabel, item.partNumber);
pushToArr(finishWarmData,item.stockNum - item.inWarmNum - item.expireNum - item.willExpireNum);
pushToArr(inWarmData,item.inWarmNum);
pushToArr(willExpireData,item.willExpireNum);
pushToArr(expireData,item.expireNum);
pushToArr(minAlarm,item.minStoreNum);
pushToArr(maxAlarm,item.maxStoreNum);
}
//alert(xAxisLabel);
inventoryChart.setOption({
tooltip : {
trigger: 'axis',
axisPointer : { // 坐标轴指示器,坐标轴触发有效
type : 'shadow' // 默认为直线,可选为:'line' | 'shadow'
}
},
legend:lengend,
grid: {
left: '3%',
right: '4%',
bottom: '3%',
containLabel: true,
},
yAxis: {
type: 'value' type: 'value'
}, },
xAxis: {
type: 'category',
data: xAxisLabel
},
series: [ series: [
{ {
name: '${label_warmed}',
type: 'bar',
stack: '回温数量',
label: {
normal: {
show: true,
position:'insideTop'
}
},
itemStyle:{
normal: {
color: '#35aa47',
position:'insideTop'
}
},
data: finishWarmData
},
{
name: '${label_warming}',
type: 'bar',
stack: '回温数量',
label: {
normal: {
show: true,
position:'insideTop'
}
},
itemStyle:{
normal: {
color: '#ffb848'
}
},
data: inWarmData
},
{
name: '${label_soonToExpire}',
type: 'bar', type: 'bar',
stack: '回温数量', data: dataArray
label: {
normal: {
show: true,
position:'insideTop'
}
},
itemStyle:{
normal: {
color: '#e08283'
}
},
data: willExpireData
}, },
{ ]
name: '${label_invalid}', };
type: 'bar', usedChart.setOption(usedOption);
stack: '回温数量', });
label: { }
normal: {
show: true,
position:'insideTop'
}
},
itemStyle:{
normal: {
color: '#d91e18'
}
},
data: expireData
},
{
name: 'max',
type: 'scatter',
symbol:'rect',
symbolSize:[30, 1],
label: {
normal: {
show: true,
position:'top'
}
},
itemStyle:{
normal: {
color: '#f64501'
}
},
data: maxAlarm,
},
{
name: 'min',
type: 'scatter',
symbol:'rect',
symbolSize:[30, 1],
itemStyle:{
normal:{
color:'#9d00ff',
}
},
label: {
normal: { loadUsedData = function(){
show: true, $.post('${ctx}/service/store/storageList', function(data) {
position:'bottom' showStorageUsageBar(data);
} showSizeUsageBar(data);
},
data: minAlarm
}
]
});
}); });
} }
loadUsedData();
showInOutChart(7);
showWeekDataChart();
//setTimeout(function(){ //setTimeout(function(){
//loadInOutData(6); //loadInOutData(6);
//loadUsedData(); //loadUsedData();
loadHumidityData(7); //loadHumidityData(7);
//},1000); //},1000);
</script> </script>
......
...@@ -101,6 +101,11 @@ ...@@ -101,6 +101,11 @@
<fmt:message key="menu.bigdata.runStatus" /><span class="selected"></span> <fmt:message key="menu.bigdata.runStatus" /><span class="selected"></span>
</a> </a>
</li> </li>
<li class="classic-menu-dropdown">
<a href="${ctx}/storage/chart.html" name="data">
<fmt:message key="数据看板" /><span class="selected"></span>
</a>
</li>
<%--<li class="classic-menu-dropdown">--%> <%--<li class="classic-menu-dropdown">--%>
<%--<a href="${ctx}/system/dataReport.html" name="data">--%> <%--<a href="${ctx}/system/dataReport.html" name="data">--%>
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!