| | |
| | | <html> |
| | | |
| | | <head> |
| | | <meta charset="utf-8"> |
| | | <title>layuiAdmin 控制台主页一</title> |
| | | <meta name="renderer" content="webkit"> |
| | | <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> |
| | | <meta name="viewport" |
| | | content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0"> |
| | | <link rel="stylesheet" href="../../layuiadmin/layui/css/layui.css" media="all"> |
| | | <link rel="stylesheet" href="../../layuiadmin/style/admin.css" media="all"> |
| | | <style type="text/css"> |
| | | html, |
| | | body { |
| | | height: 100%; |
| | | } |
| | | <meta charset="utf-8"> |
| | | <title>layuiAdmin 控制台主页一</title> |
| | | <meta name="renderer" content="webkit"> |
| | | <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> |
| | | <meta name="viewport" |
| | | content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0"> |
| | | <link rel="stylesheet" href="../../layuiadmin/layui/css/layui.css" media="all"> |
| | | <link rel="stylesheet" href="../../layuiadmin/style/admin.css" media="all"> |
| | | <style type="text/css"> |
| | | html, |
| | | body { |
| | | height: 100%; |
| | | } |
| | | |
| | | .ceshi { |
| | | display: flex; |
| | | justify-content: space-around; |
| | | } |
| | | .ceshi { |
| | | display: flex; |
| | | justify-content: space-around; |
| | | } |
| | | |
| | | .acls { |
| | | display: inline-block; |
| | | width: 125px; |
| | | height: 60px; |
| | | } |
| | | .acls { |
| | | display: inline-block; |
| | | width: 125px; |
| | | height: 60px; |
| | | } |
| | | |
| | | .water-ball { |
| | | position: relative; |
| | |
| | | .wave { |
| | | position: absolute; |
| | | bottom: 0; |
| | | left: -50%; /* 调整波浪的起始位置 */ |
| | | left: -50%; |
| | | /* 调整波浪的起始位置 */ |
| | | width: 200%; |
| | | height: 200%; |
| | | background: #00bcd4; |
| | |
| | | font-size: 12px; |
| | | color: #00796b; |
| | | font-weight: bold; |
| | | margin-bottom: 5px; /* 调整文字和百分数之间的间距 */ |
| | | margin-bottom: 5px; |
| | | /* 调整文字和百分数之间的间距 */ |
| | | } |
| | | |
| | | .percentage { |
| | |
| | | .gradient-line { |
| | | margin-top: 30px; |
| | | width: 80%; |
| | | height: 2px; /* 线条的高度 */ |
| | | background: linear-gradient(to right, |
| | | #74f2e57f, /* 左边浅色 */ |
| | | #03d5c0, /* 中间深色 */ |
| | | #74f2e57f); /* 右边浅色 */ |
| | | height: 2px; |
| | | /* 线条的高度 */ |
| | | background: linear-gradient(to right, |
| | | #74f2e57f, |
| | | /* 左边浅色 */ |
| | | #03d5c0, |
| | | /* 中间深色 */ |
| | | #74f2e57f); |
| | | /* 右边浅色 */ |
| | | opacity: 0.5; |
| | | } |
| | | |
| | | |
| | | |
| | | .cuboid_group{ |
| | | .cuboid_group { |
| | | display: flex; |
| | | justify-content: center; |
| | | align-items: center; |
| | |
| | | } |
| | | |
| | | .cuboid { |
| | | width: 200px; /* 长方体的宽度 */ |
| | | height: 100px; /* 长方体的高度 */ |
| | | width: 200px; |
| | | /* 长方体的宽度 */ |
| | | height: 100px; |
| | | /* 长方体的高度 */ |
| | | position: relative; |
| | | transform-style: preserve-3d; |
| | | transform: rotateX(-25deg) rotateY(45deg); /* 初始旋转角度 */ |
| | | transform: rotateX(-25deg) rotateY(45deg); |
| | | /* 初始旋转角度 */ |
| | | } |
| | | |
| | | .cuboid .face { |
| | |
| | | background-color: rgba(0, 123, 255, 0.8); |
| | | border: 2px solid #007bff; |
| | | box-sizing: border-box; |
| | | overflow: hidden; /* 隐藏超出部分 */ |
| | | overflow: hidden; |
| | | /* 隐藏超出部分 */ |
| | | opacity: 0.6; |
| | | } |
| | | |
| | |
| | | .cuboid .front { |
| | | width: 100px; |
| | | height: 50px; |
| | | transform: translateZ(25px); /* 向前移动 */ |
| | | border-radius: 5px; /* 圆角 */ |
| | | transform: translateZ(25px); |
| | | /* 向前移动 */ |
| | | border-radius: 5px; |
| | | /* 圆角 */ |
| | | } |
| | | |
| | | /* 后面 */ |
| | | .cuboid .back { |
| | | width: 100px; |
| | | height: 50px; |
| | | transform: rotateY(180deg) translateZ(25px); /* 向后移动 */ |
| | | border-radius: 5px; /* 圆角 */ |
| | | transform: rotateY(180deg) translateZ(25px); |
| | | /* 向后移动 */ |
| | | border-radius: 5px; |
| | | /* 圆角 */ |
| | | } |
| | | |
| | | /* 右面 */ |
| | | .cuboid .right { |
| | | width: 50px; |
| | | height: 50px; |
| | | transform: rotateY(90deg) translateZ(75px); /* 向右移动 */ |
| | | border-radius: 5px; /* 圆角 */ |
| | | transform: rotateY(90deg) translateZ(75px); |
| | | /* 向右移动 */ |
| | | border-radius: 5px; |
| | | /* 圆角 */ |
| | | } |
| | | |
| | | /* 左面 */ |
| | | .cuboid .left { |
| | | width: 50px; |
| | | height: 50px; |
| | | transform: rotateY(-90deg) translateZ(25px); /* 向左移动 */ |
| | | transform: rotateY(-90deg) translateZ(25px); |
| | | /* 向左移动 */ |
| | | display: flex; |
| | | flex-wrap: wrap; |
| | | justify-content: space-around; |
| | | align-content: space-around; |
| | | background-color: rgba(0, 123, 255, 0.8); |
| | | border-radius: 5px; /* 圆角 */ |
| | | border-radius: 5px; |
| | | /* 圆角 */ |
| | | } |
| | | |
| | | /* 窗户样式 */ |
| | | .cuboid .left .window { |
| | | width: 16px; /* 窗户宽度 */ |
| | | height: 16px; /* 窗户高度 */ |
| | | width: 16px; |
| | | /* 窗户宽度 */ |
| | | height: 16px; |
| | | /* 窗户高度 */ |
| | | background-color: yellow; |
| | | } |
| | | |
| | |
| | | .cuboid .top { |
| | | width: 100px; |
| | | height: 50px; |
| | | transform: rotateX(90deg) translateZ(25px); /* 向上移动 */ |
| | | border-radius: 5px; /* 圆角 */ |
| | | |
| | | transform: rotateX(90deg) translateZ(25px); |
| | | /* 向上移动 */ |
| | | border-radius: 5px; |
| | | /* 圆角 */ |
| | | |
| | | } |
| | | |
| | | /* 底面 */ |
| | | .cuboid .bottom { |
| | | width: 100px; |
| | | height: 50px; |
| | | transform: rotateX(-90deg) translateZ(25px); /* 向下移动 */ |
| | | border-radius: 5px; /* 圆角 */ |
| | | transform: rotateX(-90deg) translateZ(25px); |
| | | /* 向下移动 */ |
| | | border-radius: 5px; |
| | | /* 圆角 */ |
| | | } |
| | | |
| | | /* 去掉表格的边框线 */ |
| | | .layui-table { |
| | | border: none; |
| | | } |
| | | .layui-table th, .layui-table td { |
| | | |
| | | .layui-table th, |
| | | .layui-table td { |
| | | border: none; |
| | | } |
| | | |
| | | /* 去掉表头的下边框 */ |
| | | .layui-table thead tr { |
| | | border-bottom: none; |
| | | } |
| | | |
| | | /* 去掉表格行的下边框 */ |
| | | .layui-table tbody tr { |
| | | border-bottom: none; |
| | | } |
| | | </style> |
| | | </style> |
| | | </head> |
| | | |
| | | <body> |
| | | <!-- background: radial-gradient(circle,#bce2aa, #6ce6da); --> |
| | | <div class="layui-fluid" style="padding: 10px;height: 97%;"> |
| | | <div class="layui-row layui-col-space15" style="height: 100%;"> |
| | | <div class="layui-fluid" style="padding: 10px;height: 97%;"> |
| | | <div class="layui-row layui-col-space15" style="height: 100%;"> |
| | | <!-- 左 --> |
| | | <div class="layui-col-md4" style="height: 100%;margin-top: 10px;"> |
| | | <div class="layui-card" style="height: 100%;border-radius: 15px;box-shadow: 0px 0px 10px 1px #a4a3a3;"> |
| | | <div class="layui-col-md4" style="height: 100%;margin-top: 10px;"> |
| | | <div class="layui-card" style="height: 100%;border-radius: 15px;box-shadow: 0px 0px 10px 1px #a4a3a3;"> |
| | | <div style="width: 100%;height: 23.33%;"> |
| | | <div class="layui-card-header"> |
| | | <img src="../../img/console/xiexian.png" style="height: 20px;"> |
| | | 系统监控 |
| | | </div> |
| | | <div class="layui-card-body" style="padding-top: 0px; height: 90%;display: flex; justify-content: space-between; "> |
| | | <div class="mokuan"style="display: flex; flex-direction: column; justify-content: center; align-items: center; height: 100px;width: 100px;"> |
| | | <div class="layui-card-body" |
| | | style="padding-top: 0px; height: 90%;display: flex; justify-content: space-between; "> |
| | | <div class="mokuan" |
| | | style="display: flex; flex-direction: column; justify-content: center; align-items: center; height: 100px;width: 100px;"> |
| | | <img src="../../img/console/zaixianyonghu.png" style="width: 30px;"> |
| | | <label style="height: 35px;line-height: 35px;">在线用户数</label> |
| | | <label style="font-size: 32px;color: #009688;">108</label> |
| | | <label style="font-size: 32px;color: #009688;">106</label> |
| | | </div> |
| | | <div class="mokuan"style="display: flex; flex-direction: column; justify-content: center; align-items: center; height: 100px;width: 100px;"> |
| | | <div class="mokuan" |
| | | style="display: flex; flex-direction: column; justify-content: center; align-items: center; height: 100px;width: 100px;"> |
| | | <img src="../../img/console/PDA.png" style="width: 30px;"> |
| | | <label style="height: 35px;line-height: 35px;">接入PDA数</label> |
| | | <label style="font-size: 32px;color: #009688;">108</label> |
| | | <label style="font-size: 32px;color: #009688;">107</label> |
| | | </div> |
| | | <div class="mokuan"style="display: flex; flex-direction: column; justify-content: center; align-items: center; height: 100px;width: 100px;"> |
| | | <div class="mokuan" |
| | | style="display: flex; flex-direction: column; justify-content: center; align-items: center; height: 100px;width: 100px;"> |
| | | <img src="../../img/console/pc.png" style="width: 30px;"> |
| | | <label style="height: 35px;line-height: 35px;">接入PC数</label> |
| | | <label style="font-size: 32px;color: #009688;">108</label> |
| | | <label style="font-size: 32px;color: #009688;">108</label> |
| | | </div> |
| | | <div class="mokuan"style="display: flex; flex-direction: column; justify-content: center; align-items: center; height: 100px;width: 100px;"> |
| | | <div class="mokuan" |
| | | style="display: flex; flex-direction: column; justify-content: center; align-items: center; height: 100px;width: 100px;"> |
| | | <img src="../../img/console/dayinji.png" style="width: 30px;"> |
| | | <label style="height: 35px;line-height: 35px;">接入打印机数</label> |
| | | <label style="font-size: 32px;color: #009688;">108</label> |
| | | <label style="font-size: 32px;color: #009688;">109</label> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div style="width: 100%;height: 38.33%;"> |
| | | <div class="layui-card-header"> |
| | |
| | | 库存物料类型分布 |
| | | </div> |
| | | <div class="layui-card-body" style="padding: 0;height: 100%;"> |
| | | <div id="zhuOrder" style="width: 100%; height: 100%; display: flex; align-items: center;justify-content: center;"> |
| | | <div id="zhuOrder" |
| | | style="width: 100%; height: 100%; display: flex; align-items: center;justify-content: center;"> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div style="width: 100%;height: 38.33%;"> |
| | | <div class="layui-card-header"> |
| | | <img src="../../img/console/xiexian.png" style="height: 20px;"> |
| | | 库存质量状态分布 |
| | | </div> |
| | | <div class="layui-card-body" style="padding: 0;height: 90%;"> |
| | | <div id="yuanOrder" style="width: 100%; height: 100%; display: flex; align-items: center;justify-content: center;"> |
| | | <div id="yuanOrder" |
| | | style="width: 100%; height: 100%; display: flex; align-items: center;justify-content: center;"> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <!-- 中 --> |
| | | <div class="layui-col-md4" style="height: 100%;margin-top: 10px;"> |
| | | <div style="width: 100%;height: 15%;"> |
| | | <div class="layui-card-body" style="padding-top: 0px; height: 100%;display: flex; justify-content: space-between;"> |
| | | <div class="mokuan"style="display: flex; flex-direction: column; justify-content: center; align-items: center; height: 100px;width: 100px;"> |
| | | <label style="height: 50px;line-height: 50px;font-size: 36px;color: #009688;font-weight: 600;">5</label> |
| | | <label style="font-size: 20px;">库区总数</label> |
| | | <div class="layui-card-body" |
| | | style="padding-top: 0px; height: 100%;display: flex; justify-content: space-between;"> |
| | | <div class="mokuan" |
| | | style="display: flex; flex-direction: column; justify-content: center; align-items: center; height: 100px;width: 100px;"> |
| | | <label id="wareHouseNum" |
| | | style="height: 50px;line-height: 50px;font-size: 36px;color: #009688;font-weight: 600;"></label> |
| | | <label style="font-size: 20px;">库区总数</label> |
| | | </div> |
| | | <div class="mokuan"style="display: flex; flex-direction: column; justify-content: center; align-items: center; height: 100px;width: 100px;"> |
| | | <label style="height: 50px;line-height: 50px;font-size: 32px;color: #009688;font-weight: 600;">2270</label> |
| | | <label style="font-size: 20px;">库位总数</label> |
| | | <div class="mokuan" |
| | | style="display: flex; flex-direction: column; justify-content: center; align-items: center; height: 100px;width: 100px;"> |
| | | <label id="stockTotal" |
| | | style="height: 50px;line-height: 50px;font-size: 32px;color: #009688;font-weight: 600;"></label> |
| | | <label style="font-size: 20px;">库位总数</label> |
| | | </div> |
| | | <div class="mokuan"style="display: flex; flex-direction: column; justify-content: center; align-items: center; height: 100px;width: 100px;"> |
| | | <label style="height: 50px;line-height: 50px;font-size: 32px;color: #009688;font-weight: 600;">108</label> |
| | | <label style="font-size: 20px;">已使用库位</label> |
| | | <div class="mokuan" |
| | | style="display: flex; flex-direction: column; justify-content: center; align-items: center; height: 100px;width: 100px;"> |
| | | <label id="useStock" |
| | | style="height: 50px;line-height: 50px;font-size: 32px;color: #009688;font-weight: 600;"></label> |
| | | <label style="font-size: 20px;">已使用库位</label> |
| | | </div> |
| | | <div class="mokuan"style="display: flex;justify-content: center;align-items: center;height: 100px;margin: 0;"> |
| | | <div class="mokuan" |
| | | style="display: flex;justify-content: center;align-items: center;height: 100px;margin: 0;"> |
| | | <div class="water-ball"> |
| | | <div class="wave"></div> |
| | | <div class="text-container"> |
| | | <div class="label">总利用率</div> |
| | | <div class="percentage">50%</div> |
| | | <div class="percentage" id="allUseRate"></div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div style="width: 100%;height: 85%;display: flex; align-items: center;flex-direction: column;"> |
| | | |
| | | <div class="gradient-line"></div> |
| | | |
| | | <div style="width: 300px;height: 120px;box-shadow: 0px 0px 10px 1px #009688; border-radius:15px;margin-top: 30px;"> |
| | | <div class="layui-card-header"> |
| | | <img src="../../img/console/xiexian.png" style="height: 20px;"> |
| | | 原辅料仓库,常温库区 |
| | | </div> |
| | | <div class="layui-card-body" style="padding-top: 0px; height: 90%;display: flex; justify-content: space-between; "> |
| | | <div class="mokuan"style="display: flex; flex-direction: column; justify-content: center; align-items: center; height: 60px;width: 100px;"> |
| | | <label style="height: 50px;line-height: 50px;font-size: 28px;color: #009688;font-weight: 600;">1008</label> |
| | | <label style="font-size: 18px;">库位总数</label> |
| | | </div> |
| | | <div class="mokuan"style="display: flex; flex-direction: column; justify-content: center; align-items: center; height: 60px;width: 100px;"> |
| | | <label style="height: 50px;line-height: 50px;font-size: 28px;color: #009688;font-weight: 600;">270</label> |
| | | <label style="font-size: 18px;">已使用</label> |
| | | </div> |
| | | |
| | | </div> |
| | | </div> |
| | | <div id="warehouseInfo"></div> |
| | | |
| | | <!-- <div style="width: auto;height: 220px;display: grid;align-items: center; justify-content: center; grid-template-columns: repeat(3, 1fr); gap: 10px;margin-top: 30px;"> |
| | | <div class="cuboid_group"> |
| | |
| | | </div> |
| | | |
| | | </div> --> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <!-- 右 --> |
| | | <div class="layui-col-md4" style="height: 100%;margin-top: 10px;"> |
| | | <div class="layui-card" style="height: 100%;border-radius: 15px;box-shadow: 0px 0px 10px 1px #a4a3a3;"> |
| | | <div style="width: 100%;height: 33.33%;"> |
| | | <!-- 右 --> |
| | | <div class="layui-col-md4" style="height: 100%;margin-top: 10px;"> |
| | | <div class="layui-card" style="height: 100%;border-radius: 15px;box-shadow: 0px 0px 10px 1px #a4a3a3;"> |
| | | <div style="width: 100%;height: 33.33%;"> |
| | | <div class="layui-card-header"> |
| | | <img src="../../img/console/xiexian.png" style="height: 20px;"> |
| | | 近一月热度物料 |
| | | </div> |
| | | <div class="layui-card-body" style="padding: 0;height: 90%;width: 90%;margin-left: 5%;"> |
| | | <table id="LAY-app-content-list" lay-filter="LAY-app-content-list"border="0" cellpadding="0" cellspacing="0"></table> |
| | | </div> |
| | | <table id="LAY-app-content-list" lay-filter="LAY-app-content-list" border="0" |
| | | cellpadding="0" cellspacing="0"></table> |
| | | </div> |
| | | </div> |
| | | <div style="width: 100%;height: 33.33%;"> |
| | | <div class="layui-card-header"> |
| | |
| | | </div> |
| | | <div class="layui-card-body" style="padding: 0;height: 90%;width: 90%;margin-left: 5%;"> |
| | | <table id="LAY-app-content-list2" lay-filter="LAY-app-content-list2"></table> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div style="width: 100%;height: 33.33%;"> |
| | | <div class="layui-card-header"> |
| | | <img src="../../img/console/xiexian.png" style="height: 20px;"> |
| | | 月度出入库趋势 |
| | | </div> |
| | | <div class="layui-card-body" style="padding: 0;height: 90%;"> |
| | | <div id="xianOrder" style="width: 100%; height: 100%; display: flex; align-items: center;justify-content: center;"> |
| | | <div id="xianOrder" |
| | | style="width: 100%; height: 100%; display: flex; align-items: center;justify-content: center;"> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | |
| | | <script src="../../layuiadmin/layui/layui.js?t=1"></script> |
| | | <script src="../../layuiadmin/layui/layui.js?t=1"></script> |
| | |
| | | }).extend({ |
| | | |
| | | index: 'lib/index', //主入口模块 |
| | | |
| | | |
| | | }); |
| | | // 直接使用全局的 echarts |
| | | var echarts = window.echarts; |
| | |
| | | laypage = layui.laypage, |
| | | layer = layui.layer |
| | | |
| | | //库存物料类型分布(柱状) |
| | | this.chartLine = echarts.init(document.getElementById("zhuOrder")); |
| | | option = { |
| | | xAxis: { |
| | | type: 'category', |
| | | data: ['成品', '原料', '外包材', '内包材', '中间品', '耗材'], |
| | | axisLine: { show: false }, // 隐藏 x 轴线 |
| | | axisTick: { show: false }, // 隐藏 x 轴刻度线 |
| | | }, |
| | | yAxis: { |
| | | type: 'value' |
| | | }, |
| | | grid: { |
| | | top:'5%', |
| | | containLabel: true |
| | | }, |
| | | series: [ |
| | | { |
| | | data: [ |
| | | { |
| | | value: 120, |
| | | itemStyle: { |
| | | color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [ |
| | | { offset: 0, color: '#37A2FF' }, |
| | | { offset: 1, color: '#9EE7FF' } |
| | | ]), |
| | | borderRadius: [15, 15, 0, 0] |
| | | } |
| | | }, |
| | | { |
| | | value: 200, |
| | | itemStyle: { |
| | | color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [ |
| | | { offset: 0, color: '#FF9F7F' }, |
| | | { offset: 1, color: '#FFD97F' } |
| | | ]), |
| | | borderRadius: [15, 15, 0, 0] |
| | | } |
| | | }, |
| | | { |
| | | value: 150, |
| | | itemStyle: { |
| | | color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [ |
| | | { offset: 0, color: '#73F0A0' }, |
| | | { offset: 1, color: '#B8F7D4' } |
| | | ]), |
| | | borderRadius: [15, 15, 0, 0] |
| | | } |
| | | }, |
| | | { |
| | | value: 80, |
| | | itemStyle: { |
| | | color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [ |
| | | { offset: 0, color: '#FF6B6B' }, |
| | | { offset: 1, color: '#FFA8A8' } |
| | | ]), |
| | | borderRadius: [15, 15, 0, 0] |
| | | } |
| | | }, |
| | | { |
| | | value: 70, |
| | | itemStyle: { |
| | | color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [ |
| | | { offset: 0, color: '#A28DFF' }, |
| | | { offset: 1, color: '#D5C7FF' } |
| | | ]), |
| | | borderRadius: [15, 15, 0, 0] |
| | | } |
| | | }, |
| | | { |
| | | value: 110, |
| | | itemStyle: { |
| | | color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [ |
| | | { offset: 0, color: '#FFD700' }, |
| | | { offset: 1, color: '#FFFACD' } |
| | | ]), |
| | | borderRadius: [15, 15, 0, 0] |
| | | } |
| | | } |
| | | ], |
| | | type: 'bar', |
| | | barWidth: '30%', |
| | | showBackground: true, |
| | | backgroundStyle: { |
| | | color: 'rgba(180, 180, 180, 0.2)', |
| | | borderRadius: [25, 25, 0, 0] |
| | | } |
| | | } |
| | | ] |
| | | }; |
| | | this.chartLine.setOption(option); |
| | | |
| | | |
| | | //库存质量状态分布(饼状) |
| | | this.chartYuan = echarts.init(document.getElementById("yuanOrder")); |
| | | var option2; |
| | | |
| | | option2 = { |
| | | tooltip: { |
| | | trigger: 'item' |
| | | }, |
| | | legend: { |
| | | top: '5%', |
| | | left: 'center' |
| | | }, |
| | | series: [ |
| | | { |
| | | name: '数量', |
| | | type: 'pie', |
| | | radius: ['40%', '70%'], |
| | | avoidLabelOverlap: false, |
| | | itemStyle: { |
| | | borderRadius: 10, |
| | | borderColor: '#fff', |
| | | borderWidth: 2 |
| | | }, |
| | | label: { |
| | | show: true, // 显示标签 |
| | | position: 'outside', // 标签位置在饼图外部 |
| | | formatter: '{b}: {c} ({d}%)' // 标签格式,显示名称、值和百分比 |
| | | }, |
| | | labelLine: { |
| | | show: true, // 显示引导线 |
| | | length: 20, // 第一段引导线的长度 |
| | | length2: 30 // 第二段引导线的长度 |
| | | }, |
| | | data: [ |
| | | { value: 1048, name: '合格' }, |
| | | { value: 735, name: '不合格' }, |
| | | { value: 580, name: '待验证' } |
| | | ] |
| | | }] |
| | | |
| | | //库存物料类型分布(柱状) |
| | | refreshGoodsTypeFb(); |
| | | function refreshGoodsTypeFb() { |
| | | var param = {}; |
| | | |
| | | sendData(IP + "/Statistical/GetGoodsTypeFb", param, 'get', function (res) { |
| | | if (res.code == 0) { //成功 |
| | | this.chartLine = echarts.init(document.getElementById("zhuOrder")); |
| | | |
| | | var goodsType = []; |
| | | var seriesData = []; |
| | | |
| | | // 定义颜色渐变数组 |
| | | var colorGradients = [ |
| | | [ |
| | | { offset: 0, color: '#37A2FF' }, |
| | | { offset: 1, color: '#9EE7FF' } |
| | | ], |
| | | [ |
| | | { offset: 0, color: '#FF9F7F' }, |
| | | { offset: 1, color: '#FFD97F' } |
| | | ], |
| | | [ |
| | | { offset: 0, color: '#73F0A0' }, |
| | | { offset: 1, color: '#B8F7D4' } |
| | | ], |
| | | [ |
| | | { offset: 0, color: '#A28DFF' }, |
| | | { offset: 1, color: '#D5C7FF' } |
| | | ], |
| | | [ |
| | | { offset: 0, color: '#FFD700' }, |
| | | { offset: 1, color: '#FFFACD' } |
| | | ] |
| | | ]; |
| | | |
| | | //正确遍历数组并处理数据 |
| | | res.data.forEach(function (item, index) { |
| | | goodsType.push(item.TypeName); |
| | | |
| | | //动态创建数据项,避免硬编码 |
| | | var dataItem = { |
| | | value: item.TypeNum, |
| | | itemStyle: { |
| | | color: new echarts.graphic.LinearGradient(0, 0, 0, 1, |
| | | colorGradients[index % colorGradients.length] // 循环使用颜色 |
| | | ), |
| | | borderRadius: [15, 15, 0, 0] |
| | | } |
| | | }; |
| | | seriesData.push(dataItem); |
| | | }); |
| | | |
| | | var option = { |
| | | title: { |
| | | //text: '库存物料类型分布', |
| | | left: 'center', |
| | | textStyle: { |
| | | fontSize: 16, |
| | | fontWeight: 'bold' |
| | | } |
| | | }, |
| | | tooltip: { |
| | | trigger: 'axis', |
| | | axisPointer: { |
| | | type: 'shadow' |
| | | }, |
| | | formatter: function (params) { |
| | | var data = params[0]; |
| | | return data.name + ': ' + data.value; |
| | | } |
| | | }, |
| | | xAxis: { |
| | | type: 'category', |
| | | data: goodsType, |
| | | axisLine: { show: false }, |
| | | axisTick: { show: false }, |
| | | axisLabel: { |
| | | interval: 0, |
| | | rotate: 0 // 如果分类名太长可以设置旋转 |
| | | } |
| | | }, |
| | | yAxis: { |
| | | type: 'value', |
| | | name: '数量' |
| | | }, |
| | | grid: { |
| | | top: '15%', |
| | | left: '3%', |
| | | right: '4%', |
| | | bottom: '3%', |
| | | containLabel: true |
| | | }, |
| | | series: [ |
| | | { |
| | | data: seriesData, |
| | | type: 'bar', |
| | | barWidth: '30%', |
| | | showBackground: true, |
| | | backgroundStyle: { |
| | | color: 'rgba(180, 180, 180, 0.2)', |
| | | borderRadius: [25, 25, 0, 0] |
| | | }, |
| | | label: { |
| | | show: true, |
| | | position: 'top', |
| | | formatter: '{c}' |
| | | } |
| | | } |
| | | ] |
| | | }; |
| | | this.chartLine.setOption(option); |
| | | |
| | | } |
| | | else { //不成功 |
| | | layer.msg('获取总量列表信息失败!', { |
| | | icon: 2, |
| | | time: 2000 //2秒关闭(如果不配置,默认是3秒) |
| | | }, function () { }); |
| | | } |
| | | }); |
| | | }; |
| | | this.chartYuan.setOption(option2); |
| | | |
| | | |
| | | //库存质量状态分布(饼状) |
| | | refreshQualityStatusFb(); |
| | | function refreshQualityStatusFb() { |
| | | var param = {}; |
| | | |
| | | sendData(IP + "/Statistical/GetQualityStatusFb", param, 'get', function (res) { |
| | | if (res.code == 0) { //成功 |
| | | //库存质量状态分布(饼状) |
| | | this.chartYuan = echarts.init(document.getElementById("yuanOrder")); |
| | | var option2 = { |
| | | tooltip: { |
| | | trigger: 'item' |
| | | }, |
| | | legend: { |
| | | top: '5%', |
| | | left: 'center' |
| | | }, |
| | | series: [{ |
| | | name: '数量', |
| | | type: 'pie', |
| | | radius: ['40%', '75%'], |
| | | avoidLabelOverlap: false, |
| | | itemStyle: { |
| | | borderRadius: 10, |
| | | borderColor: '#fff', |
| | | borderWidth: 2 |
| | | }, |
| | | label: { |
| | | show: true, // 显示标签 |
| | | position: 'outside', // 标签位置在饼图外部 |
| | | formatter: '{b}: {c} ({d}%)' // 标签格式,显示名称、值和百分比 |
| | | }, |
| | | labelLine: { |
| | | show: true, // 显示引导线 |
| | | length: 20, // 第一段引导线的长度 |
| | | length2: 30 // 第二段引导线的长度 |
| | | }, |
| | | data: res.data.map(function (item) { |
| | | return { |
| | | name: item.TypeName, |
| | | value: item.TypeNum |
| | | }; |
| | | }) |
| | | }] |
| | | }; |
| | | this.chartYuan.setOption(option2); |
| | | } |
| | | else { //不成功 |
| | | layer.msg('获取总量列表信息失败!', { |
| | | icon: 2, |
| | | time: 2000 //2秒关闭(如果不配置,默认是3秒) |
| | | }, function () { }); |
| | | } |
| | | }); |
| | | }; |
| | | |
| | | |
| | | //获取月度出入库趋势(折线) |
| | | this.chartXian = echarts.init(document.getElementById("xianOrder")); |
| | |
| | | data: ['入库', '出库'] |
| | | }, |
| | | grid: { |
| | | top: '15%', |
| | | left:'5%', |
| | | bottom:'15%', |
| | | top: '15%', |
| | | left: '5%', |
| | | bottom: '15%', |
| | | containLabel: true |
| | | }, |
| | | toolbox: { |
| | |
| | | ] |
| | | }; |
| | | this.chartXian.setOption(option3); |
| | | |
| | | |
| | | |
| | | //仓库状况总 |
| | | refreshWarehouseState(); |
| | | function refreshWarehouseState() { |
| | | var param = { |
| | | |
| | | }; |
| | | sendData(IP + "/Statistical/GetWareHouseState", param, 'get', function (res) { |
| | | if (res.code == 0) { //成功 |
| | | $("#wareHouseNum").append(res.data.WarehouseNum); |
| | | $("#stockTotal").append(res.data.StockAllNum); |
| | | $("#useStock").append(res.data.StockUseNum); |
| | | $("#allUseRate").append(res.data.StockUseRate); |
| | | setPercentage(parseFloat(res.data.StockUseRate.replace('%', ''))); |
| | | } |
| | | else { //不成功 |
| | | layer.msg('获取总量列表信息失败!', { |
| | | icon: 2, |
| | | time: 2000 //2秒关闭(如果不配置,默认是3秒) |
| | | }, function () { }); |
| | | } |
| | | }); |
| | | } |
| | | |
| | | |
| | | //仓库详情 |
| | | refreshWarehouseInfo(); |
| | | function refreshWarehouseInfo() { |
| | | var param = { |
| | | |
| | | }; |
| | | sendData(IP + "/Statistical/GetWareHouseStateInfo", param, 'get', function (res) { |
| | | if (res.code == 0) { //成功 |
| | | var html = ''; |
| | | res.data.forEach(function (item) { |
| | | html += `<div style="width: 300px;height: 120px;box-shadow: 0px 0px 10px 1px #009688; border-radius:15px;margin-top: 40px;"> |
| | | <div class="layui-card-header"> <img src="../../img/console/xiexian.png" style="height: 20px;">${item.WarehouseName}</div> |
| | | <div class="layui-card-body" |
| | | style="padding-top: 0px; height: 90%;display: flex; justify-content: space-between; "> |
| | | <div class="mokuan" |
| | | style="display: flex; flex-direction: column; justify-content: center; align-items: center; height: 60px;width: 100px;"> |
| | | <label style="height: 50px;line-height: 50px;font-size: 28px;color: #009688;font-weight: 600;">${item.StockAllNum}</label> |
| | | <label style="font-size: 18px;">库位总数</label> |
| | | </div> |
| | | <div class="mokuan" |
| | | style="display: flex; flex-direction: column; justify-content: center; align-items: center; height: 60px;width: 100px;"> |
| | | <label style="height: 50px;line-height: 50px;font-size: 28px;color: #009688;font-weight: 600;">${item.StockUseNum}</label> |
| | | <label style="font-size: 18px;">已使用</label> |
| | | </div> |
| | | </div> |
| | | </div>`; |
| | | }) |
| | | $('#warehouseInfo').html(html); |
| | | } |
| | | else { //不成功 |
| | | layer.msg('获取总量列表信息失败!', { |
| | | icon: 2, |
| | | time: 2000 //2秒关闭(如果不配置,默认是3秒) |
| | | }, function () { }); |
| | | } |
| | | }); |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | //近一月热度物料 |
| | | refreshTable(); |
| | | function refreshTable() { |
| | | infoOptions = { |
| | | infoOptions = { |
| | | elem: '#LAY-app-content-list', |
| | | height: 'full-600', |
| | | id: 'LAY-app-content-list', |
| | |
| | | }, function () { }); |
| | | } |
| | | }); |
| | | } |
| | | } |
| | | |
| | | |
| | | //安全库存预警 |
| | |
| | | limits: pageLimits, |
| | | cellMinWidth: 60, //全局定义常规单元格的最小宽度,layui 2.2.1 新增 |
| | | even: true, |
| | | cols:[[ |
| | | {field: '',title: '序号',type:'numbers',fixed: 'left', "disabled": true}, |
| | | {field: 'SkuNo', title: '物料编码', align: 'center'}, |
| | | {field: 'SkuName', title: '物料名称', align: 'center'}, |
| | | {title: '批次', field: 'LotNo', align: 'center'}, |
| | | {field: 'ResidueQty', title: '剩余数量', align: 'center'}, |
| | | ]] |
| | | cols: [[ |
| | | { field: '', title: '序号', type: 'numbers', fixed: 'left', "disabled": true }, |
| | | { field: 'SkuNo', title: '物料编码', align: 'center' }, |
| | | { field: 'SkuName', title: '物料名称', align: 'center' }, |
| | | { title: '批次', field: 'LotNo', align: 'center' }, |
| | | { field: 'ResidueQty', title: '剩余数量', align: 'center' }, |
| | | ]] |
| | | }; |
| | | |
| | | var param = { |
| | | }; |
| | | |
| | | sendData(IP + "/Statistical/GetInventoryWarning", param, 'get', function(res) { |
| | | sendData(IP + "/Statistical/GetInventoryWarning", param, 'get', function (res) { |
| | | if (res.code == 0) { //成功 |
| | | var list = res.data; |
| | | $.extend(infoOptions2, { |
| | |
| | | layer.msg('获取低库存物料信息失败!', { |
| | | icon: 2, |
| | | time: 2000 //2秒关闭(如果不配置,默认是3秒) |
| | | }, function() {}); |
| | | }, function () { }); |
| | | } |
| | | }); |
| | | } |
| | | } |
| | | |
| | | // 设置初始百分比 |
| | | setPercentage(50); |
| | | // setPercentage(50); |
| | | function setPercentage(percent) { |
| | | const wave = $('.wave'); |
| | | const percentageText = $('.percentage'); |
| | | const waterBallHeight = $('.water-ball').height(); |
| | | |
| | | // 计算波浪的高度(百分比越高,波浪越低) |
| | | const waveHeight =(100 - percent) / 100 * waterBallHeight; |
| | | const waveHeight = (100 - percent) / 100 * waterBallHeight; |
| | | |
| | | // 设置波浪的高度 |
| | | wave.css('top', waveHeight + 'px'); |
| | |
| | | using System; |
| | | using System.Collections; |
| | | using System.Collections.Generic; |
| | | using System.DirectoryServices; |
| | | using System.Text; |
| | | |
| | | namespace Model.ModelDto.DataDto |
| | |
| | | /// 储位地址 |
| | | /// </summary> |
| | | public string LocatNo { get; set; } |
| | | |
| | | |
| | | /// <summary> |
| | | /// 托盘号 |
| | | /// </summary> |
| | | public string PalletNo { get; set; } |
| | | |
| | | |
| | | /// <summary> |
| | | /// 生产时间 |
| | | /// </summary> |
| | | public DateTime ProductionTime { get; set; } |
| | | |
| | | |
| | | /// <summary> |
| | | /// 过期时间 |
| | | /// </summary> |
| | | public DateTime ExpirationTime { get; set; } |
| | | |
| | | |
| | | /// <summary> |
| | | /// 状态 |
| | | /// </summary> |
| | | public string Status { get; set; } |
| | | |
| | | |
| | | /// <summary> |
| | | /// 检验标记 |
| | | /// </summary> |
| | |
| | | /// 零托标记 |
| | | /// </summary> |
| | | public string BitPalletMark { get; set; } |
| | | |
| | | |
| | | /// <summary> |
| | | /// 质量状态 |
| | | /// </summary> |
| | | public string InspectStatus { get; set; } |
| | | |
| | | |
| | | /// <summary> |
| | | /// 是否裹包 |
| | | /// </summary> |
| | | public string IsBale { get; set; } |
| | | |
| | | |
| | | /// <summary> |
| | | /// 是否打带 |
| | | /// </summary> |
| | |
| | | public string AreaName { get; set; } |
| | | public string AreaNo { get; set; } |
| | | public string LocatNo { get; set; } |
| | | |
| | | |
| | | public int Id { get; set; } |
| | | |
| | | /// <summary> |
| | |
| | | } |
| | | |
| | | |
| | | |
| | | /// <summary> |
| | | /// 仓库库位使用dto |
| | | /// </summary> |
| | | public class WarehouseUseDto |
| | | { |
| | | /// <summary> |
| | | /// 仓库名称 |
| | | /// </summary> |
| | | public string WarehouseName { get; set; } = ""; |
| | | |
| | | /// <summary> |
| | | /// 库位总数 |
| | | /// </summary> |
| | | public string StockAllNum { get; set; } |
| | | |
| | | /// <summary> |
| | | /// 库位使用数 |
| | | /// </summary> |
| | | public string StockUseNum { get; set; } |
| | | } |
| | | |
| | | |
| | | /// <summary> |
| | | /// 仓库概况dto |
| | | /// </summary> |
| | | public class WarehouseStateDto : WarehouseUseDto |
| | | { |
| | | /// <summary> |
| | | /// 库区总数 |
| | | /// </summary> |
| | | public string WarehouseNum { get; set; } |
| | | |
| | | /// <summary> |
| | | /// 总利用率 |
| | | /// </summary> |
| | | public string StockUseRate { get; set; } |
| | | } |
| | | |
| | | |
| | | /// <summary> |
| | | /// 类型的名称数量比例dto |
| | | /// </summary> |
| | | public class IdNameNumRateDto |
| | | { |
| | | /// <summary> |
| | | /// 类型id |
| | | /// </summary> |
| | | public string TypeId { get; set; } |
| | | |
| | | /// <summary> |
| | | /// 类型名称 |
| | | /// </summary> |
| | | public string TypeName { get; set; } |
| | | |
| | | /// <summary> |
| | | /// 类型数量 |
| | | /// </summary> |
| | | public double TypeNum { get; set; } |
| | | |
| | | /// <summary> |
| | | /// 类型比例 |
| | | /// </summary> |
| | | public string TypeRate { get; set; } = "0%"; |
| | | } |
| | | |
| | | } |
| | |
| | | using System; |
| | | using System.Collections; |
| | | using System.Collections.Generic; |
| | | using System.Data; |
| | | using System.Linq; |
| | | using System.Linq.Expressions; |
| | | using System.Net.WebSockets; |
| | | using System.Runtime.Intrinsics.X86; |
| | | using System.Security.Claims; |
| | | using System.Text; |
| | |
| | | using Model.ModelVm.SysVm; |
| | | using MySqlConnector; |
| | | using SqlSugar; |
| | | using Talk.Extensions; |
| | | using WMS.DAL; |
| | | using WMS.Entity.BllAsnEntity; |
| | | using WMS.Entity.BllQualityEntity; |
| | |
| | | public class StockServer : DbHelper<DataStock>, IStockServer |
| | | { |
| | | private static readonly SqlSugarScope Db = DataContext.Db; |
| | | |
| | | public StockServer() : base(Db) |
| | | { |
| | | |
| | | } |
| | | |
| | | |
| | | /// <summary> |
| | | /// 获取库存物料类型分布 |
| | | /// </summary> |
| | | /// <returns></returns> |
| | | public IEnumerable<IdNameNumRateDto> GetGoodsTypeFb() |
| | | { |
| | | string stockNumSql = $@"select a.Type,sum(b.num) as num |
| | | from SysMaterials a |
| | | inner join (select SkuNo,sum(Qty) as num from DataStockDetail where IsDel='0' group by SkuNo) b on b.SkuNo=a.SkuNo |
| | | where a.IsDel='0' |
| | | group by a.Type"; |
| | | DataTable stockNumDt = Db.Ado.GetDataTable(stockNumSql); |
| | | var stockNumIE = stockNumDt.Rows.Cast<DataRow>().Select(e => new |
| | | { |
| | | typeName = e["Type"] + "", |
| | | num = e["num"] + "" |
| | | }); |
| | | |
| | | //物料类型 |
| | | string goodsTypeSql = $@"select DictNo,DictName,0.00 as num |
| | | from SysDictionary |
| | | where IsDel='0' and ParentNo='MaterialType' |
| | | order by Id"; |
| | | DataTable goodsTypeDt = Db.Ado.GetDataTable(goodsTypeSql); |
| | | |
| | | IEnumerable<IdNameNumRateDto> result = goodsTypeDt.Rows.Cast<DataRow>().Select(e => new IdNameNumRateDto |
| | | { |
| | | TypeId = e["DictNo"] + "", |
| | | TypeName = e["DictName"] + "", |
| | | TypeNum = Convert.ToDouble((stockNumIE.FirstOrDefault(f => f.typeName == e["DictNo"] + "") == null) ? "0.00" : stockNumIE.First(f => f.typeName == e["DictNo"] + "").num), |
| | | }); |
| | | return result; |
| | | } |
| | | |
| | | |
| | | /// <summary> |
| | | /// 获取库存质量状态分布 |
| | | /// </summary> |
| | | /// <returns></returns> |
| | | public IEnumerable<IdNameNumRateDto> GetQualityStatusFb() |
| | | { |
| | | string stockNumSql = $@"select InspectStatus,sum(Qty) as num |
| | | from DataStockDetail |
| | | where IsDel='0' and InspectStatus is not null |
| | | group by InspectStatus"; |
| | | DataTable stockNumDt = Db.Ado.GetDataTable(stockNumSql); |
| | | object totalObj = stockNumDt.Compute("sum(num)", ""); |
| | | |
| | | var stockNumIE = stockNumDt.Rows.Cast<DataRow>().Select(e => new |
| | | { |
| | | typeName = e["InspectStatus"] + "", |
| | | num = e["num"] + "" |
| | | }); |
| | | |
| | | //物料类型 |
| | | string inspectStatusSql = $@"select DictNo,DictName,0.00 as num,'0%' as rate |
| | | from SysDictionary |
| | | where IsDel='0' and ParentNo='InspectStatus' |
| | | order by Id"; |
| | | DataTable goodsTypeDt = Db.Ado.GetDataTable(inspectStatusSql); |
| | | |
| | | foreach (DataRow dr in goodsTypeDt.Rows) |
| | | { |
| | | var stockNum = stockNumIE.FirstOrDefault(e => e.typeName == dr["DictNo"] + ""); |
| | | |
| | | if (stockNum != null) |
| | | { |
| | | dr["num"] = stockNum.num; |
| | | dr["rate"] = (stockNum.num.ToDouble() / Convert.ToDouble(totalObj) * 100.00).ToString("0.00") + "%"; |
| | | } |
| | | } |
| | | |
| | | IEnumerable<IdNameNumRateDto> result = goodsTypeDt.Rows.Cast<DataRow>().Select(e => new IdNameNumRateDto |
| | | { |
| | | TypeId = e["DictNo"] + "", |
| | | TypeName = e["DictName"] + "", |
| | | TypeNum = Convert.ToDouble(e["num"]), |
| | | TypeRate = e["rate"] + "" |
| | | }); |
| | | return result; |
| | | } |
| | | |
| | | |
| | | /// <summary> |
| | | /// 获取仓库状况总 |
| | | /// </summary> |
| | | /// <returns></returns> |
| | | public WarehouseStateDto GetWareHouseState() |
| | | { |
| | | //库区总数 |
| | | string houseNumSql = $@"select count(Id) as num |
| | | from SysWareHouse |
| | | where IsDel='0'"; |
| | | int houseNum = Db.Ado.GetInt(houseNumSql); |
| | | |
| | | //库位总数 |
| | | string stockNumSql = $@"select count(Id) as num |
| | | from SysStorageLocat |
| | | where IsDel='0'"; |
| | | int stockNum = Db.Ado.GetInt(stockNumSql); |
| | | |
| | | //已使用库位 |
| | | string stockUseNumSql = $@"select count(Id) as num |
| | | from SysStorageLocat |
| | | where IsDel='0' and Status='1'"; |
| | | int stockUseNum = Db.Ado.GetInt(stockUseNumSql); |
| | | |
| | | WarehouseStateDto result = new WarehouseStateDto() |
| | | { |
| | | WarehouseNum = houseNum + "", |
| | | StockAllNum = stockNum + "", |
| | | StockUseNum = stockUseNum + "", |
| | | StockUseRate = ((double)stockUseNum / stockNum * 100.00).ToString("0.00") + "%" |
| | | }; |
| | | return result; |
| | | } |
| | | |
| | | |
| | | /// <summary> |
| | | /// 获取仓库详情 |
| | | /// </summary> |
| | | /// <returns></returns> |
| | | public IEnumerable<WarehouseUseDto> GetWareHouseStateInfo() |
| | | { |
| | | string stockUseSql = $@"select a.Id,a.WareHouseNo,a.WareHouseName,b.num as stockNum,c.num as useNum |
| | | from SysWareHouse a |
| | | left join (select WareHouseNo,count(Id) as num from SysStorageLocat where IsDel='0' group by WareHouseNo) b on b.WareHouseNo=a.WareHouseNo |
| | | left join (select WareHouseNo,count(Id) as num from SysStorageLocat where IsDel='0' and Status='1' group by WareHouseNo) c on c.WareHouseNo=a.WareHouseNo |
| | | where a.IsDel='0' |
| | | order by a.WareHouseNo"; |
| | | DataTable stockUseDt = Db.Ado.GetDataTable(stockUseSql); |
| | | |
| | | IEnumerable<WarehouseUseDto> result = stockUseDt.Rows.Cast<DataRow>().Select(e => new WarehouseUseDto |
| | | { |
| | | WarehouseName = e["WareHouseName"] + "", |
| | | StockAllNum = e["stockNum"] + "", |
| | | StockUseNum = e["useNum"] + "" |
| | | }); |
| | | return result; |
| | | } |
| | | |
| | | |
| | |
| | | /// <param name="wareHouseNo">所属仓库</param> |
| | | /// <param name="areaNo">所属区域</param> |
| | | /// <returns></returns> |
| | | public async Task<List<MateDataStockDto>> GetDataStockList(string selectType, string skuNo, string skuName, string ownerNo, |
| | | public async Task<List<MateDataStockDto>> GetDataStockList(string selectType, string skuNo, string skuName, string ownerNo, |
| | | string ownerName, string lotNo, string status, string inspectStatus, string wareHouseNo, string areaNo) |
| | | { |
| | | Expression<Func<DataStockDetail, bool>> item = Expressionable.Create<DataStockDetail>() |
| | |
| | | var data = Db.Queryable<DataStockDetail>().Where(item); |
| | | |
| | | List<MateDataStockDto> data2; |
| | | switch (selectType) |
| | | switch (selectType) |
| | | { |
| | | // 按物料统计 |
| | | case "0": |
| | | data2 = await data.GroupBy(a => new { a.SkuNo, a.SkuName, a.Standard }) |
| | | .Select(a => new MateDataStockDto() |
| | | { |
| | | SkuNo = a.SkuNo, //物料编码 |
| | | SkuName = a.SkuName, //物料名称 |
| | | Standard = a.Standard, //规格 |
| | | //LotNo = a.LotNo, //批次 |
| | | //LotText = a.LotText, //批次描述 |
| | | //OwnerNo = a.OwnerNo, //货主编码 |
| | | //OwnerName = a.OwnerName, //货主名称 |
| | | Status = status, //库存状态 |
| | | InspectStatus = inspectStatus, //质检状态 |
| | | Qty = SqlFunc.AggregateSumNoNull(a.Qty), //库存数量 |
| | | LockQty = SqlFunc.AggregateSumNoNull(a.LockQty), //锁定数量 |
| | | FrozenQty = SqlFunc.AggregateSumNoNull(a.LockQty), |
| | | InspectQty = SqlFunc.AggregateSumNoNull(a.InspectQty) |
| | | }).ToListAsync(); |
| | | data2 = await data.GroupBy(a => new { a.SkuNo, a.SkuName, a.Standard }) |
| | | .Select(a => new MateDataStockDto() |
| | | { |
| | | SkuNo = a.SkuNo, //物料编码 |
| | | SkuName = a.SkuName, //物料名称 |
| | | Standard = a.Standard, //规格 |
| | | //LotNo = a.LotNo, //批次 |
| | | //LotText = a.LotText, //批次描述 |
| | | //OwnerNo = a.OwnerNo, //货主编码 |
| | | //OwnerName = a.OwnerName, //货主名称 |
| | | Status = status, //库存状态 |
| | | InspectStatus = inspectStatus, //质检状态 |
| | | Qty = SqlFunc.AggregateSumNoNull(a.Qty), //库存数量 |
| | | LockQty = SqlFunc.AggregateSumNoNull(a.LockQty), //锁定数量 |
| | | FrozenQty = SqlFunc.AggregateSumNoNull(a.LockQty), |
| | | InspectQty = SqlFunc.AggregateSumNoNull(a.InspectQty) |
| | | }).ToListAsync(); |
| | | break; |
| | | |
| | | // 按批次统计 |
| | | case "1": |
| | | data2 = await data.GroupBy(a => new { a.LotNo, a.LotText, a.SkuNo, a.SkuName, a.Standard }) |
| | | .Select(a => new MateDataStockDto() |
| | | { |
| | | SkuNo = a.SkuNo, //物料编码 |
| | | SkuName = a.SkuName, //物料名称 |
| | | Standard = a.Standard, //规格 |
| | | LotNo = a.LotNo, //批次 |
| | | LotText = a.LotText, //批次描述 |
| | | //OwnerNo = a.OwnerNo, //货主编码 |
| | | //OwnerName = a.OwnerName, //货主名称 |
| | | Status = status, //库存状态 |
| | | InspectStatus = inspectStatus, //质检状态 |
| | | Qty = SqlFunc.AggregateSumNoNull(a.Qty), //库存数量 |
| | | LockQty = SqlFunc.AggregateSumNoNull(a.LockQty), //锁定数量 |
| | | FrozenQty = SqlFunc.AggregateSumNoNull(a.LockQty), |
| | | InspectQty = SqlFunc.AggregateSumNoNull(a.InspectQty) |
| | | }).ToListAsync(); |
| | | data2 = await data.GroupBy(a => new { a.LotNo, a.LotText, a.SkuNo, a.SkuName, a.Standard }) |
| | | .Select(a => new MateDataStockDto() |
| | | { |
| | | SkuNo = a.SkuNo, //物料编码 |
| | | SkuName = a.SkuName, //物料名称 |
| | | Standard = a.Standard, //规格 |
| | | LotNo = a.LotNo, //批次 |
| | | LotText = a.LotText, //批次描述 |
| | | //OwnerNo = a.OwnerNo, //货主编码 |
| | | //OwnerName = a.OwnerName, //货主名称 |
| | | Status = status, //库存状态 |
| | | InspectStatus = inspectStatus, //质检状态 |
| | | Qty = SqlFunc.AggregateSumNoNull(a.Qty), //库存数量 |
| | | LockQty = SqlFunc.AggregateSumNoNull(a.LockQty), //锁定数量 |
| | | FrozenQty = SqlFunc.AggregateSumNoNull(a.LockQty), |
| | | InspectQty = SqlFunc.AggregateSumNoNull(a.InspectQty) |
| | | }).ToListAsync(); |
| | | break; |
| | | |
| | | // 按质检状态统计 |
| | | case "2": |
| | | data2 = await data.GroupBy(a => new { a.SkuNo, a.SkuName, a.Standard,a.InspectStatus}) |
| | | data2 = await data.GroupBy(a => new { a.SkuNo, a.SkuName, a.Standard, a.InspectStatus }) |
| | | .Select(a => new MateDataStockDto() |
| | | { |
| | | SkuNo = a.SkuNo, //物料编码 |
| | |
| | | FrozenQty = SqlFunc.AggregateSumNoNull(a.LockQty), |
| | | InspectQty = SqlFunc.AggregateSumNoNull(a.InspectQty), |
| | | }).ToListAsync(); |
| | | break; |
| | | break; |
| | | |
| | | // 按货主统计 |
| | | case "3": |
| | |
| | | FrozenQty = SqlFunc.AggregateSumNoNull(a.LockQty), |
| | | InspectQty = SqlFunc.AggregateSumNoNull(a.InspectQty), |
| | | }).ToListAsync(); |
| | | break; |
| | | break; |
| | | |
| | | // 默认统计(物料 批次 质检 库存状态 货主) |
| | | default: |
| | | data2 = await data.GroupBy(a => new { a.SkuNo, a.SkuName, a.Standard ,a.LotNo, a.LotText, a.OwnerNo, a.OwnerName , a.InspectStatus }) |
| | | data2 = await data.GroupBy(a => new { a.SkuNo, a.SkuName, a.Standard, a.LotNo, a.LotText, a.OwnerNo, a.OwnerName, a.InspectStatus }) |
| | | .Select(a => new MateDataStockDto() |
| | | { |
| | | SkuNo = a.SkuNo, //物料编码 |
| | |
| | | .GroupBy(a => new { a.LotNo, a.SkuNo, a.SkuName }) |
| | | .Select(a => new TotalRecordDto() |
| | | { |
| | | LotNo=a.LotNo, |
| | | SkuNo=a.SkuNo, |
| | | SkuName=a.SkuName, |
| | | LotNo = a.LotNo, |
| | | SkuNo = a.SkuNo, |
| | | SkuName = a.SkuName, |
| | | RQty = SqlFunc.AggregateSumNoNull(a.Qty), |
| | | RFactQty = (decimal)SqlFunc.AggregateSum(a.FactQty), |
| | | RCompleteQty = (decimal)SqlFunc.AggregateSum(a.CompleteQty), |
| | |
| | | /// <param name="startTime">开始时间</param> |
| | | /// <param name="endTime">结束时间</param> |
| | | /// <returns></returns> |
| | | public List<TotalRecordDto> GetDetailedRecord(string skuNo, string skuName, string lotNo, string palletNo,string startTime, string endTime) |
| | | public List<TotalRecordDto> GetDetailedRecord(string skuNo, string skuName, string lotNo, string palletNo, string startTime, string endTime) |
| | | { |
| | | // 获取入库单明细信息 |
| | | var asnList = Db.Queryable<BllPalletBind,BllArrivalNoticeDetail> |
| | | ((tb1,tb2)=>new JoinQueryInfos( |
| | | var asnList = Db.Queryable<BllPalletBind, BllArrivalNoticeDetail> |
| | | ((tb1, tb2) => new JoinQueryInfos( |
| | | JoinType.Left, tb1.ASNDetailNo == tb2.Id |
| | | )) |
| | | .Where((tb1,tb2) => tb1.IsDel == "0" && tb2.IsDel == "0") |
| | | .Where((tb1, tb2) => tb1.IsDel == "0" && tb2.IsDel == "0") |
| | | .WhereIF(!string.IsNullOrWhiteSpace(startTime), tb1 => tb1.CompleteTime >= Convert.ToDateTime(startTime)) |
| | | .WhereIF(!string.IsNullOrWhiteSpace(endTime), tb1 => tb1.CompleteTime <= Convert.ToDateTime(endTime).AddDays(1)) |
| | | .WhereIF(!string.IsNullOrEmpty(palletNo), tb1 => tb1.PalletNo.Contains(palletNo)) |
| | | .WhereIF(!string.IsNullOrEmpty(skuNo), (tb1,tb2) => tb2.SkuNo.Contains(skuNo)) |
| | | .WhereIF(!string.IsNullOrEmpty(skuNo), (tb1, tb2) => tb2.SkuNo.Contains(skuNo)) |
| | | .WhereIF(!string.IsNullOrEmpty(skuName), (tb1, tb2) => tb2.SkuName.Contains(skuName)) |
| | | .WhereIF(!string.IsNullOrEmpty(lotNo), (tb1, tb2) => tb2.LotNo.Contains(lotNo)) |
| | | //.GroupBy((tb1,tb2) => new { tb2.LotNo, tb2.SkuNo, tb2.SkuName }) |
| | | .Select((tb1,tb2) => new TotalRecordDto() |
| | | .Select((tb1, tb2) => new TotalRecordDto() |
| | | { |
| | | ASNNo = tb2.ASNNo, |
| | | LotNo = tb1.LotNo, |
| | |
| | | CompleteTime = tb2.CreateTime, |
| | | LotText = tb1.LotText, |
| | | SupplierLot = tb2.SupplierLot, |
| | | |
| | | |
| | | SONo = "", |
| | | CTaskNo = "", |
| | | CCreateTime = null, |
| | |
| | | { |
| | | public interface IStockServer |
| | | { |
| | | /// <summary> |
| | | /// 获取库存物料类型分布 |
| | | /// </summary> |
| | | /// <returns></returns> |
| | | IEnumerable<IdNameNumRateDto> GetGoodsTypeFb(); |
| | | |
| | | |
| | | /// <summary> |
| | | /// 获取库存质量状态分布 |
| | | /// </summary> |
| | | /// <returns></returns> |
| | | IEnumerable<IdNameNumRateDto> GetQualityStatusFb(); |
| | | |
| | | |
| | | /// <summary> |
| | | /// 获取仓库状况总 |
| | | /// </summary> |
| | | /// <returns></returns> |
| | | WarehouseStateDto GetWareHouseState(); |
| | | |
| | | |
| | | /// <summary> |
| | | /// 获取仓库状况详情 |
| | | /// </summary> |
| | | /// <returns></returns> |
| | | IEnumerable<WarehouseUseDto> GetWareHouseStateInfo(); |
| | | |
| | | |
| | | #region 库存明细 |
| | | |
| | | /// <summary> |
| | |
| | | /// <param name="wareHouseNo">所属仓库</param> |
| | | /// <param name="areaNo">所属区域</param> |
| | | /// <returns></returns> |
| | | Task<List<MateDataStockDto>> GetDataStockList(string selectType, string skuNo, string skuName, string ownerNo, string ownerName, string lotNo, |
| | | Task<List<MateDataStockDto>> GetDataStockList(string selectType, string skuNo, string skuName, string ownerNo, string ownerName, string lotNo, |
| | | string status, string inspectStatus, string wareHouseNo, string areaNo); |
| | | |
| | | /// <summary> |
| | |
| | | /// <param name="status">库存状态</param> |
| | | /// <param name="inspectStatus">质检状态</param> |
| | | /// <returns></returns> |
| | | List<StockDetailDto> GetInventoryList1(string skuNo, string skuName, string lotNo, string locatNo, |
| | | List<StockDetailDto> GetInventoryList1(string skuNo, string skuName, string lotNo, string locatNo, |
| | | string palletNo, string status, string inspectStatus, string ownerNo, string ownerName, string startTime, string endTime); |
| | | |
| | | #endregion |