修改系统图表以及首页筛选框

master
杨万里 2 weeks ago
parent 1378b3fd71
commit 11b96058d9

@ -2,6 +2,8 @@ package com.ruoyi.web.controller.system;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import com.ruoyi.common.core.domain.entity.SysDeptVo;
import jakarta.servlet.http.Cookie; import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
@ -147,12 +149,14 @@ public class SysIndexController extends BaseController
@PostMapping("/queryIndexData") @PostMapping("/queryIndexData")
@ResponseBody @ResponseBody
public AjaxResult queryIndexData() public AjaxResult queryIndexData(SysDeptVo sysDeptVo)
{ {
Map map =new HashMap(); Map map =new HashMap();
//查询库存、在用轮胎数量、车辆数量 //查询库存、在用轮胎数量、车辆数量
Map tireTypeTotal = iBaseInventoryService.querytotal();
List<Map> mapList = iRecordWarehousingService.selectRecord(); Map tireTypeTotal = iBaseInventoryService.querytotal(sysDeptVo);
List<Map> mapList = iRecordWarehousingService.selectRecord(sysDeptVo);
//规格占比 //规格占比
List<Map> mapListTyreModel = iRecordWarehousingService.selectTyreModel(); List<Map> mapListTyreModel = iRecordWarehousingService.selectTyreModel();
//新胎装车统计 //新胎装车统计

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

After

Width:  |  Height:  |  Size: 26 KiB

@ -4,7 +4,7 @@
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="renderer" content="webkit"> <meta name="renderer" content="webkit">
<title>智能轮胎管理系统</title> <title>公交轮胎管理系统</title>
<!-- 避免IE使用兼容模式 --> <!-- 避免IE使用兼容模式 -->
<meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta http-equiv="X-UA-Compatible" content="IE=edge">
<link th:href="@{favicon.ico}" rel="shortcut icon"/> <link th:href="@{favicon.ico}" rel="shortcut icon"/>
@ -27,7 +27,7 @@
</div> </div>
<a th:href="@{/index}"> <a th:href="@{/index}">
<li class="logo hidden-xs"> <li class="logo hidden-xs">
<span class="logo-lg">智能轮胎管理系统</span> <span class="logo-lg">公交轮胎管理系统</span>
</li> </li>
</a> </a>
<div class="sidebar-collapse tab-content" id="side-menu"> <div class="sidebar-collapse tab-content" id="side-menu">

@ -4,7 +4,7 @@
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="renderer" content="webkit"> <meta name="renderer" content="webkit">
<title>智能轮胎管理系统</title> <title>公交轮胎管理系统</title>
<!-- 避免IE使用兼容模式 --> <!-- 避免IE使用兼容模式 -->
<meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta http-equiv="X-UA-Compatible" content="IE=edge">
<link th:href="@{favicon.ico}" rel="shortcut icon"/> <link th:href="@{favicon.ico}" rel="shortcut icon"/>
@ -26,7 +26,7 @@
</div> </div>
<a th:href="@{/index}"> <a th:href="@{/index}">
<li class="logo hidden-xs"> <li class="logo hidden-xs">
<span class="logo-lg">智能轮胎管理系统</span> <span class="logo-lg">公交轮胎管理系统</span>
</li> </li>
</a> </a>
<div class="sidebar-collapse"> <div class="sidebar-collapse">

@ -3,8 +3,8 @@
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
<title>智能轮胎系统登录</title> <title>公交轮胎管理系统登录</title>
<meta name="description" content="智能轮胎管理系统"> <meta name="description" content="公交轮胎管理系统">
<!-- 原有CSS引用保持不变 --> <!-- 原有CSS引用保持不变 -->
<link href="../static/css/bootstrap.min.css" th:href="@{/css/bootstrap.min.css}" rel="stylesheet"/> <link href="../static/css/bootstrap.min.css" th:href="@{/css/bootstrap.min.css}" rel="stylesheet"/>
<link href="../static/css/font-awesome.min.css" th:href="@{/css/font-awesome.min.css}" rel="stylesheet"/> <link href="../static/css/font-awesome.min.css" th:href="@{/css/font-awesome.min.css}" rel="stylesheet"/>

@ -30,8 +30,8 @@
<label>分公司: </label> <label>分公司: </label>
<select id="branchCompany" name="branchCompany" class="form-control" onchange="handleCompanyChange()"> <select id="branchCompany" name="branchCompany" class="form-control" onchange="handleCompanyChange()">
<option value="">-- 请选择 --</option> <option value="">-- 请选择 --</option>
<option value="one">一分公司</option> <option value="202">一分公司</option>
<option value="three">三分公司</option> <option value="227">三分公司</option>
</select> </select>
</li> </li>
@ -43,7 +43,7 @@
</select> </select>
</li> </li>
<li> <li>
<a class="btn btn-primary btn-rounded btn-sm" onclick="$.table.search()"><i class="fa fa-search"></i>&nbsp;搜索</a> <a class="btn btn-primary btn-rounded btn-sm" onclick="$.form.search()"><i class="fa fa-search"></i>&nbsp;搜索</a>
<a class="btn btn-warning btn-rounded btn-sm" onclick="$.form.reset()"><i class="fa fa-refresh"></i>&nbsp;重置</a> <a class="btn btn-warning btn-rounded btn-sm" onclick="$.form.reset()"><i class="fa fa-refresh"></i>&nbsp;重置</a>
</li> </li>
</ul> </ul>
@ -213,426 +213,248 @@
<th:block th:include="include :: datetimepicker-js" /> <th:block th:include="include :: datetimepicker-js" />
<th:block th:include="include :: echarts-js" /> <th:block th:include="include :: echarts-js" />
<script th:inline="javascript"> <script th:inline="javascript">
// ... (保持原有的 editFlag, prefix, shopData 等变量定义不变) ...
var editFlag = [[${@permission.hasPermi('tyre:tyre:edit')}]]; var editFlag = [[${@permission.hasPermi('tyre:tyre:edit')}]];
var removeFlag = [[${@permission.hasPermi('tyre:tyre:remove')}]]; var removeFlag = [[${@permission.hasPermi('tyre:tyre:remove')}]];
var prefix = ctx + "tyre/tyre"; var prefix = ctx + "tyre/tyre";
var datas = [[${@dict.getType('tyre_type')}]]; var datas = [[${@dict.getType('tyre_type')}]];
// 修理厂数据源
var shopData = { var shopData = {
'one': [ '202': [ { value: '229', name: '一分公司修理厂' }, ],
{ value: 'guangming', name: '一分公司修理厂' }, '227': [
], // 一分公司:空数组 { value: '200', name: '光明修理厂' },
'three': [ // 三分公司:包含两个选项 { value: '201', name: '石岩修理厂' }
{ value: 'guangming', name: '光明修理厂' },
{ value: 'shiyan', name: '石岩修理厂' }
] ]
}; };
// 初始化 ECharts 实例
var pieChart = echarts.init(document.getElementById('pieChart'));
var lineChart = echarts.init(document.getElementById('lineChart'));
var specChart = echarts.init(document.getElementById('specChart'));
var sourceChart = echarts.init(document.getElementById('sourceChart'));
$(function() { $(function() {
// 1. 初始化时间控件
$("input[name='birthday']").datetimepicker({ $("input[name='birthday']").datetimepicker({
format: "yyyy-mm-dd", format: "yyyy-mm-dd",
minView: "month", minView: "month",
autoclose: true autoclose: true
}); });
// 实时时间更新
function updateClock() {
const now = new Date();
const weekDays = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'];
const timeStr = now.toTimeString().substr(0, 8); // "11:14:10" // 2. 进入页面时,自动请求数据
const dateStr = now.toLocaleDateString(); // "2026/4/15" loadData();
const weekStr = weekDays[now.getDay()];
// 这里的 HTML 结构完全模拟了你图片中的样式 // 3. 启动时钟
$('#clock').html(`${timeStr} <small style="color:#999; margin: 0 10px;">|</small> ${dateStr} ${weekStr}`); updateClock();
} setInterval(updateClock, 1000);
// ================= 1. 环形图逻辑 (保持原有逻辑) ================= });
var pieChart = echarts.init(document.getElementById('pieChart')); // ================= 核心修改:统一的数据加载函数 =================
function loadData() {
// 显示加载层(可选,提升体验)
// var index = layer.load(1);
function renderPieChart(data) {
var option = {
color: ['#1ab394', '#f8ac59', '#5B7CD9', '#ed5565', '#999'], // 配色方案
tooltip: {
trigger: 'item',
formatter: '{a} <br/>{b}: {c} ({d}%)'
},
series: [
{
name: '实时库存',
type: 'pie',
radius: ['60%', '75%'], // 环形
avoidLabelOverlap: false,
label: {
show: false
},
labelLine: {
show: false
},
data: [
{ value: data.new, name: '新胎' },
{ value: data.circulating, name: '周转胎' },
{ value: data.renovate, name: '翻新胎' },
{ value: data.experimental, name: '试验胎' }
// 注意如果后端返回0这里也要传0否则图表会少一块
]
}
]
};
pieChart.setOption(option);
$('#new').text(`在库: ${data.new}`);
$('#circulating').text(`在库: ${data.circulating}`);
$('#renovate').text(`在库: ${data.renovate}`);
$('#experimental').text(`在库: ${data.experimental}`);
$('#newTop').text(`${data.new}`);
$('#circulatingTop').text(`${data.circulating}`);
$('#renovateTop').text(`${data.renovate}`);
$('#experimentalTop').text(`${data.experimental}`);
$('#right_new').text(`${data.new}`);
$('#right_circulating').text(`${data.circulating}`);
$('#right_renovate').text(`${data.renovate}`);
$('#right_experimental').text(`${data.experimental}`);
// 3. 动态更新中间的文字覆盖层
// 获取DOM元素并更新文本
const clockDiv = document.getElementById('pie-center-text');
if (clockDiv) {
// 这里复用你原本的逻辑,或者直接用接口返回的 total
clockDiv.innerHTML = `总数<br><span style="font-size:24px;font-weight:bold">${data.total || 0}</span>`;
}
}
// 4. 发起 AJAX 请求获取数据
$.ajax({ $.ajax({
url: ctx+'queryIndexData', // 你的接口地址 url: ctx + 'queryIndexData',
type: 'POST', type: 'POST',
// 关键点:使用 serialize() 自动收集表单内的 branchCompany 和 repairShop 值
data: $('#formId').serialize(),
dataType: 'json', dataType: 'json',
success: function(res) { success: function(res) {
if (res.code === 0) { // 假设 code 0 代表成功 // layer.close(index);
// 调用渲染函数 if (res.code === 0) {
// 渲染各个图表
renderPieChart(res.data.tireTypeTotal); renderPieChart(res.data.tireTypeTotal);
// --- 新增代码:渲染折线图 ---
// 假设 res.data.mapList 是包含日期和数量的数组
if (res.data.mapList && res.data.mapList.length > 0) {
renderLineChart(res.data.mapList);
} else {
// 处理空数据情况,防止报错
renderLineChart([]);
}
// --- 新增代码:渲染规格占比图 ---
// 假设接口返回的数据结构为 res.data.mapListTyreModel
if (res.data.mapListTyreModel && res.data.mapListTyreModel.length > 0) {
renderSpecChart(res.data.mapListTyreModel);
} else {
renderSpecChart([]); // 传空数组显示暂无数据
}
// --- 新增代码:渲染规格占比图 --- if (res.data.mapList) renderLineChart(res.data.mapList);
// 假设接口返回的数据结构为 res.data.mapListTyreModel if (res.data.mapListTyreModel) renderSpecChart(res.data.mapListTyreModel);
if (res.data.mapListInstall && res.data.mapListInstall.length > 0) { if (res.data.mapListInstall) renderSourceChart(res.data.mapListInstall);
renderSourceChart(res.data.mapListInstall);
} else {
renderSourceChart([]); // 传空数组显示暂无数据
}
} else { } else {
// 错误处理 $.modal.msgError(res.msg);
console.error('数据加载失败:', res.msg);
// 即使失败,也渲染一个默认的空数据或者错误提示
renderPieChart({total: 0, new: 0, circulating: 0, renovate: 0, experimental: 0});
renderLineChart([]);
renderSpecChart([]); // 错误时也传空
renderSourceChart([]); // 错误时也传空
} }
}, },
error: function() { error: function() {
console.error('网络请求出错'); // layer.close(index);
renderPieChart({total: 0, new: 0, circulating: 0, renovate: 0, experimental: 0}); $.modal.msgError("数据请求失败");
} }
}); });
}
// ================= 2. 折线图逻辑 (新增) ================= // ================= 表单操作逻辑 =================
var lineChart = echarts.init(document.getElementById('lineChart'));
function renderLineChart(mapList) { // 搜索:直接调用加载函数
// 1. 数据预处理:从 mapList 中提取 X轴(date) 和 Y轴数据 $.form.search = function() {
var dates = []; loadData();
var inData = []; // 入库数量 (type_0_count) };
var outData = []; // 出库数量 (type_1_count)
mapList.forEach(function(item) { // 重置:重置表单 + 恢复下拉框状态 + 重新加载
dates.push(item.date); // X轴日期 $.form.reset = function() {
inData.push(item.type_0_count); // Y轴入库 $('form')[0].reset(); // 重置表单域
outData.push(item.type_1_count); // Y轴出库 handleCompanyChange(); // 恢复修理厂下拉框的禁用状态
}); loadData(); // 重新加载默认数据
};
var lineOption = { // 分公司下拉框改变事件
tooltip: {
trigger: 'axis'
},
legend: {
data: ['入库数量', '出库数量'],
right: '10%'
},
grid: {
left: '3%',
right: '4%',
bottom: '3%',
containLabel: true
},
xAxis: {
type: 'category',
boundaryGap: false,
data: dates, // 使用接口返回的日期
axisLine: {
lineStyle: {
color: '#ccc'
}
}
},
yAxis: {
type: 'value',
axisLine: {
show: false
},
splitLine: {
lineStyle: {
type: 'dashed',
color: '#eee'
}
}
},
series: [
{
name: '入库数量',
type: 'line',
smooth: true,
symbol: 'circle',
symbolSize: 6,
itemStyle: {
color: '#1ab394' // 绿色
},
areaStyle: {
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
{ offset: 0, color: 'rgba(26, 179, 148, 0.5)' },
{ offset: 0.8, color: 'rgba(26, 179, 148, 0.1)' }
])
},
data: inData // 使用接口返回的入库数据
},
{
name: '出库数量',
type: 'line',
smooth: true,
symbol: 'circle',
symbolSize: 6,
itemStyle: {
color: '#ed5565' // 红色
},
data: outData // 使用接口返回的出库数据
}
]
};
lineChart.setOption(lineOption);
}
// 窗口大小改变时重绘图表
window.addEventListener('resize', function() {
pieChart.resize();
lineChart.resize();
});
// ================= 规格占比图表 (修改版:支持异步数据) =================
var specChart = echarts.init(document.getElementById("specChart"));
// 1. 定义一个全局的颜色数组 (放在函数外面,避免 undefined 错误)
var specColors = ['#5B7CD9', '#8CC657', '#F7C763', '#E96966', '#73C0DE', '#45B97C', '#9A60B4', '#EA7E53'];
function renderSpecChart(modelData) {
// 1. 数据预处理
if (!modelData || modelData.length === 0) {
specChart.clear(); // 清空图表
specChart.setOption({
title: { text: '', left: 'center', top: 'center', textStyle: { fontSize: 16 } },
xAxis: { show: false },
yAxis: { show: false },
series: []
});
return;
}
// 2. 动态生成 Series 数据
// 使用 map 遍历后端传来的规格列表
var specSeries = modelData.map(function(item, index) {
// 使用 index % specColors.length 确保颜色循环使用,且不会越界
var color = specColors[index % specColors.length];
return {
name: item.tyreModel,
type: 'bar',
stack: 'total',
barWidth: 20,
label: { show: false },
itemStyle: {
color: color // 使用计算出的颜色
},
data: [item.total]
};
});
// 3. 生成图例数据
var legendData = modelData.map(item => item.tyreModel);
// 4. 设置图表 Option
var specOption = {
tooltip: {
trigger: 'axis',
axisPointer: { type: 'shadow' }
},
legend: {
bottom: 0,
data: legendData,
textStyle: { fontSize: 12 }
},
grid: {
left: '50',
right: '20',
bottom: '60',
top: '10',
containLabel: true
},
xAxis: {
type: 'value',
max: function(value) {
return Math.ceil(value.max * 1.2);
},
splitLine: { show: true, lineStyle: { type: 'dashed' } }
},
yAxis: {
type: 'category',
data: ['规格统计'] // 可以改为动态的,或者保持单维度
},
series: specSeries
};
specChart.setOption(specOption);
}
// 初始化时传空数据
renderSpecChart([]);
// ================= 来源占比图表 (修改版:支持异步数据) =================
var sourceChart = echarts.init(document.getElementById("sourceChart"));
function renderSourceChart(modelData) {
// 1. 数据预处理
if (!modelData || modelData.length === 0) {
sourceChart.clear(); // 清空图表
sourceChart.setOption({
title: { text: '', left: 'center', top: 'center', textStyle: { fontSize: 16 } },
xAxis: { show: false },
yAxis: { show: false },
series: []
});
return;
}
// 2. 动态生成 Series 数据
// 使用 map 遍历后端传来的规格列表
var sourceSeries = modelData.map(function(item, index) {
// 使用 index % specColors.length 确保颜色循环使用,且不会越界
var color = specColors[index % specColors.length];
return {
name: item.tyreModel,
type: 'bar',
stack: 'total',
barWidth: 20,
label: { show: false },
itemStyle: {
color: color // 使用计算出的颜色
},
data: [item.total]
};
});
// 3. 生成图例数据
var legendData = modelData.map(item => item.tyreModel);
// 4. 设置图表 Option
var sourceOption = {
tooltip: {
trigger: 'axis',
axisPointer: { type: 'shadow' }
},
legend: {
bottom: 0,
data: legendData,
textStyle: { fontSize: 12 }
},
grid: {
left: '50',
right: '20',
bottom: '60',
top: '10',
containLabel: true
},
xAxis: {
type: 'value',
max: function(value) {
return Math.ceil(value.max * 1.2);
},
splitLine: { show: true, lineStyle: { type: 'dashed' } }
},
yAxis: {
type: 'category',
data: ['装车统计'] // 可以改为动态的,或者保持单维度
},
series: sourceSeries
};
sourceChart.setOption(sourceOption);
}
renderSourceChart([])
// 窗口大小改变时自适应
window.addEventListener('resize', function() {
specChart.resize();
sourceChart.resize();
});
updateClock(); // 初始化
setInterval(updateClock, 1000); // 每秒刷新
});
// 分公司下拉框改变时触发的函数
function handleCompanyChange() { function handleCompanyChange() {
var companyVal = $("#branchCompany").val(); // 获取选中的分公司值 var companyVal = $("#branchCompany").val();
var $shopSelect = $("#repairShop"); // 获取修理厂下拉框对象 var $shopSelect = $("#repairShop");
// 1. 清空修理厂下拉框现有的选项 $shopSelect.empty(); // 清空旧选项
$shopSelect.empty();
if (!companyVal) { if (!companyVal) {
// 如果没选分公司
$shopSelect.append('<option value="">-- 请先选分公司 --</option>'); $shopSelect.append('<option value="">-- 请先选分公司 --</option>');
$shopSelect.prop('disabled', true); // 禁用下拉框 $shopSelect.prop('disabled', true);
} else { } else {
// 获取对应的修理厂数据
var shops = shopData[companyVal]; var shops = shopData[companyVal];
if (shops && shops.length > 0) { if (shops && shops.length > 0) {
// 如果有数据,遍历添加 $shopSelect.append('<option value="">-- 请选择修理厂 --</option>'); // 增加一个空选项方便重置
shops.forEach(function(item) { shops.forEach(function(item) {
$shopSelect.append('<option value="' + item.value + '">' + item.name + '</option>'); $shopSelect.append('<option value="' + item.value + '">' + item.name + '</option>');
}); });
$shopSelect.prop('disabled', false); // 启用下拉框 $shopSelect.prop('disabled', false);
} else { } else {
// 如果是空数组(如一分公司)
$shopSelect.append('<option value="">-- 暂无数据 --</option>'); $shopSelect.append('<option value="">-- 暂无数据 --</option>');
$shopSelect.prop('disabled', true); // 禁用下拉框 $shopSelect.prop('disabled', true);
} }
} }
} }
$.form.reset = function() {
$('form').each(function() { // ================= 图表渲染逻辑 (保持原有逻辑不变) =================
this.reset();
// 1. 时钟逻辑
function updateClock() {
const now = new Date();
const weekDays = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'];
const timeStr = now.toTimeString().substr(0, 8);
const dateStr = now.toLocaleDateString();
const weekStr = weekDays[now.getDay()];
$('#clock').html(`${timeStr} <small style="color:#999; margin: 0 10px;">|</small> ${dateStr} ${weekStr}`);
}
// 2. 环形图
function renderPieChart(data) {
// ... (保持你原有的 renderPieChart 代码不变) ...
var option = {
color: ['#1ab394', '#f8ac59', '#5B7CD9', '#ed5565', '#999'],
tooltip: { trigger: 'item', formatter: '{a} <br/>{b}: {c} ({d}%)' },
series: [{
name: '实时库存',
type: 'pie',
radius: ['60%', '75%'],
avoidLabelOverlap: false,
label: { show: false },
labelLine: { show: false },
data: [
{ value: data.new, name: '新胎' },
{ value: data.circulating, name: '周转胎' },
{ value: data.renovate, name: '翻新胎' },
{ value: data.experimental, name: '试验胎' }
]
}]
};
pieChart.setOption(option);
// 更新DOM文本...
$('#new').text(`在库: ${data.new}`);
$('#circulating').text(`在库: ${data.circulating}`);
$('#renovate').text(`在库: ${data.renovate}`);
$('#experimental').text(`在库: ${data.experimental}`);
$('#newTop').text(`${data.new}`);
$('#circulatingTop').text(`${data.circulating}`);
$('#renovateTop').text(`${data.renovate}`);
$('#experimentalTop').text(`${data.experimental}`);
$('#right_new').text(`${data.new}`);
$('#right_circulating').text(`${data.circulating}`);
$('#right_renovate').text(`${data.renovate}`);
$('#right_experimental').text(`${data.experimental}`);
const clockDiv = document.getElementById('pie-center-text');
if (clockDiv) {
clockDiv.innerHTML = `总数<br><span style="font-size:24px;font-weight:bold">${data.total || 0}</span>`;
}
}
// 3. 折线图
function renderLineChart(mapList) {
// ... (保持你原有的 renderLineChart 代码不变) ...
var dates = [], inData = [], outData = [];
if(mapList){
mapList.forEach(function(item) {
dates.push(item.date);
inData.push(item.type_0_count);
outData.push(item.type_1_count);
});
}
var lineOption = {
tooltip: { trigger: 'axis' },
legend: { data: ['入库数量', '出库数量'], right: '10%' },
grid: { left: '3%', right: '4%', bottom: '3%', containLabel: true },
xAxis: { type: 'category', boundaryGap: false, data: dates, axisLine: { lineStyle: { color: '#ccc' } } },
yAxis: { type: 'value', axisLine: { show: false }, splitLine: { lineStyle: { type: 'dashed', color: '#eee' } } },
series: [
{
name: '入库数量', type: 'line', smooth: true, symbol: 'circle', symbolSize: 6,
itemStyle: { color: '#1ab394' },
areaStyle: { color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{ offset: 0, color: 'rgba(26, 179, 148, 0.5)' }, { offset: 0.8, color: 'rgba(26, 179, 148, 0.1)' }]) },
data: inData
},
{
name: '出库数量', type: 'line', smooth: true, symbol: 'circle', symbolSize: 6,
itemStyle: { color: '#ed5565' },
data: outData
}
]
};
lineChart.setOption(lineOption);
}
// 4. 规格占比图
var specColors = ['#5B7CD9', '#8CC657', '#F7C763', '#E96966', '#73C0DE', '#45B97C', '#9A60B4', '#EA7E53'];
function renderSpecChart(modelData) {
// ... (保持你原有的 renderSpecChart 代码不变) ...
if (!modelData || modelData.length === 0) { specChart.clear(); return; }
var specSeries = modelData.map(function(item, index) {
var color = specColors[index % specColors.length];
return { name: item.tyreModel, type: 'bar', stack: 'total', barWidth: 20, label: { show: false }, itemStyle: { color: color }, data: [item.total] };
}); });
// 手动触发一次 change 事件,确保修理厂下拉框回到初始禁用状态 var specOption = {
handleCompanyChange(); tooltip: { trigger: 'axis', axisPointer: { type: 'shadow' } },
}; legend: { bottom: 0, data: modelData.map(i => i.tyreModel), textStyle: { fontSize: 12 } },
grid: { left: '50', right: '20', bottom: '60', top: '10', containLabel: true },
xAxis: { type: 'value', max: function(value) { return Math.ceil(value.max * 1.2); }, splitLine: { show: true, lineStyle: { type: 'dashed' } } },
yAxis: { type: 'category', data: ['规格统计'] },
series: specSeries
};
specChart.setOption(specOption);
}
// 5. 来源占比图
function renderSourceChart(modelData) {
// ... (保持你原有的 renderSourceChart 代码不变) ...
if (!modelData || modelData.length === 0) { sourceChart.clear(); return; }
var sourceSeries = modelData.map(function(item, index) {
var color = specColors[index % specColors.length];
return { name: item.tyreModel, type: 'bar', stack: 'total', barWidth: 20, label: { show: false }, itemStyle: { color: color }, data: [item.total] };
});
var sourceOption = {
tooltip: { trigger: 'axis', axisPointer: { type: 'shadow' } },
legend: { bottom: 0, data: modelData.map(i => i.tyreModel), textStyle: { fontSize: 12 } },
grid: { left: '50', right: '20', bottom: '60', top: '10', containLabel: true },
xAxis: { type: 'value', max: function(value) { return Math.ceil(value.max * 1.2); }, splitLine: { show: true, lineStyle: { type: 'dashed' } } },
yAxis: { type: 'category', data: ['装车统计'] },
series: sourceSeries
};
sourceChart.setOption(sourceOption);
}
// 窗口大小改变自适应
window.addEventListener('resize', function() {
pieChart.resize();
lineChart.resize();
specChart.resize();
sourceChart.resize();
});
</script> </script>
</body> </body>
</html> </html>

@ -115,9 +115,17 @@
field : 'tyreModel', field : 'tyreModel',
title : '规格型号' title : '规格型号'
}, },
{
field : 'company',
title : '所属分公司'
},
{ {
field : 'team', field : 'team',
title : '所属分公司车队' title : '所属分公司修理厂'
},
{
field : 'carTeam',
title : '车队'
}, },
{ {
field : 'carNo', field : 'carNo',

@ -60,8 +60,7 @@
{ {
title : '在车轮胎', title : '在车轮胎',
align : 'center', align : 'center',
rowspan : 2 rowspan : 1
} }
], ],
[{ [{
@ -79,7 +78,11 @@
}, { }, {
field : '实验胎', field : '实验胎',
title : '实验胎' title : '实验胎'
} },
{
field : '在车轮胎',
title : '在车轮胎'
}
] ]
] ]
}; };

@ -42,7 +42,7 @@
</select> </select>
</li> </li>
<li> <li>
<p>所属车队</p> <p>修理厂</p>
<input type="text" name="team"/> <input type="text" name="team"/>
</li> </li>
<li class="select-time"> <li class="select-time">
@ -166,10 +166,18 @@
field : 'wheelPostion', field : 'wheelPostion',
title : '安装轮位' title : '安装轮位'
}, },
{
field : 'company',
title : '所属公司'
},
{ {
field : 'team', field : 'team',
title : '所属车队' title : '所属修理厂'
}, },
{
field : 'carTeam',
title : '所属车队'
},
{ {
field : 'remark', field : 'remark',
title : '备注' title : '备注'

@ -115,9 +115,17 @@
field : 'tyreModel', field : 'tyreModel',
title : '规格型号' title : '规格型号'
}, },
{
field : 'company',
title : '所属分公司'
},
{ {
field : 'team', field : 'team',
title : '所属分公司车队' title : '所属分公司修理厂'
},
{
field : 'carTeam',
title : '车队'
}, },
{ {
field : 'carNo', field : 'carNo',

@ -95,6 +95,11 @@
<groupId>jakarta.servlet</groupId> <groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId> <artifactId>jakarta.servlet-api</artifactId>
</dependency> </dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
</dependencies> </dependencies>

@ -0,0 +1,9 @@
package com.ruoyi.common.core.domain.entity;
import lombok.Data;
@Data
public class SysDeptVo {
private Long branchCompany;
private Long repairShop;
}

@ -57,10 +57,14 @@ public class BaseTyre extends BaseEntity
/** 轮胎类别 */ /** 轮胎类别 */
@Excel(name = "轮胎类别") @Excel(name = "轮胎类别")
private String tyreType; private String tyreType;
@Excel(name = "所属公司")
private String company;
/** 所属车队 */ /** 所属车队 */
@Excel(name = "所属车队") @Excel(name = "所属修理厂")
private String team; private String team;
@Excel(name = "所属车队")
private String carTeam;
@Excel(name = "安装车辆") @Excel(name = "安装车辆")
private String carNo; private String carNo;
@ -68,6 +72,22 @@ public class BaseTyre extends BaseEntity
private String wheelPostion; private String wheelPostion;
public String getCompany() {
return company;
}
public void setCompany(String company) {
this.company = company;
}
public String getCarTeam() {
return carTeam;
}
public void setCarTeam(String carTeam) {
this.carTeam = carTeam;
}
public String getPatternDepth() { public String getPatternDepth() {
return patternDepth; return patternDepth;
} }

@ -25,8 +25,12 @@ public class RecordTyreInstall extends BaseEntity
private String tyreNo; private String tyreNo;
@Excel(name = "规格型号") @Excel(name = "规格型号")
private String tyreModel; private String tyreModel;
@Excel(name = "所属") @Excel(name = "分公司")
private String company;
@Excel(name = "修理厂")
private String team; private String team;
@Excel(name = "车队")
private String carTeam;
private String tyreBrand; private String tyreBrand;
/** 类型 0安装 1卸下 */ /** 类型 0安装 1卸下 */
@ -45,6 +49,21 @@ public class RecordTyreInstall extends BaseEntity
private String selfNo; private String selfNo;
public String getCompany() {
return company;
}
public void setCompany(String company) {
this.company = company;
}
public String getCarTeam() {
return carTeam;
}
public void setCarTeam(String carTeam) {
this.carTeam = carTeam;
}
public String getTyreModel() { public String getTyreModel() {
return tyreModel; return tyreModel;

@ -2,6 +2,7 @@ package com.ruoyi.system.mapper;
import com.ruoyi.common.core.domain.entity.SysDeptVo;
import com.ruoyi.system.domain.BaseInventory; import com.ruoyi.system.domain.BaseInventory;
import java.util.List; import java.util.List;
@ -67,7 +68,7 @@ public interface BaseInventoryMapper
int updateBaseInventoryByEpc(BaseInventory baseInventory); int updateBaseInventoryByEpc(BaseInventory baseInventory);
Map querytotal(); Map querytotal(SysDeptVo sysDeptVo);
int queryInCar(); int queryInCar();

@ -2,6 +2,7 @@ package com.ruoyi.system.mapper;
import com.ruoyi.common.core.domain.entity.SysDeptVo;
import com.ruoyi.system.domain.RecordWarehousing; import com.ruoyi.system.domain.RecordWarehousing;
import java.util.List; import java.util.List;
@ -63,7 +64,7 @@ public interface RecordWarehousingMapper
*/ */
public int deleteRecordWarehousingByIds(String[] ids); public int deleteRecordWarehousingByIds(String[] ids);
List<Map> selectRecord(); List<Map> selectRecord(SysDeptVo sysDeptVo);
List<Map> selectTyreModel(); List<Map> selectTyreModel();

@ -1,6 +1,7 @@
package com.ruoyi.system.service; package com.ruoyi.system.service;
import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.SysDeptVo;
import com.ruoyi.system.domain.BaseInventory; import com.ruoyi.system.domain.BaseInventory;
import com.ruoyi.system.domain.BaseTyre; import com.ruoyi.system.domain.BaseTyre;
@ -68,7 +69,7 @@ public interface IBaseInventoryService
AjaxResult OutInventoryByPda(BaseInventory baseInventory, BaseTyre baseTyre); AjaxResult OutInventoryByPda(BaseInventory baseInventory, BaseTyre baseTyre);
Map querytotal(); Map querytotal(SysDeptVo sysDeptVo);
int queryInCar(); int queryInCar();

@ -1,6 +1,7 @@
package com.ruoyi.system.service; package com.ruoyi.system.service;
import com.ruoyi.common.core.domain.entity.SysDeptVo;
import com.ruoyi.system.domain.RecordWarehousing; import com.ruoyi.system.domain.RecordWarehousing;
import java.util.List; import java.util.List;
@ -62,7 +63,7 @@ public interface IRecordWarehousingService
*/ */
public int deleteRecordWarehousingById(Long id); public int deleteRecordWarehousingById(Long id);
List<Map> selectRecord(); List<Map> selectRecord(SysDeptVo sysDeptVo);
List<Map> selectTyreModel(); List<Map> selectTyreModel();

@ -2,6 +2,7 @@ package com.ruoyi.system.service.impl;
import com.ruoyi.common.annotation.DataScope; import com.ruoyi.common.annotation.DataScope;
import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.SysDeptVo;
import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.text.Convert; import com.ruoyi.common.core.text.Convert;
import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.DateUtils;
@ -208,8 +209,8 @@ public class BaseInventoryServiceImpl implements IBaseInventoryService
} }
@Override @Override
public Map querytotal() { public Map querytotal(SysDeptVo sysDeptVo) {
return baseInventoryMapper.querytotal(); return baseInventoryMapper.querytotal(sysDeptVo);
} }
@Override @Override

@ -208,6 +208,7 @@ public class BaseTyreServiceImpl implements IBaseTyreService
} }
@Override @Override
@DataScope(deptAlias = "d", userAlias = "u")
public List<Map> vTyreStockSummary(SysDept sysDept) { public List<Map> vTyreStockSummary(SysDept sysDept) {
List<Map> mapList = baseTyreMapper.vTyreStockSummary(sysDept); List<Map> mapList = baseTyreMapper.vTyreStockSummary(sysDept);
return mapList; return mapList;

@ -1,6 +1,7 @@
package com.ruoyi.system.service.impl; package com.ruoyi.system.service.impl;
import com.ruoyi.common.annotation.DataScope; import com.ruoyi.common.annotation.DataScope;
import com.ruoyi.common.core.domain.entity.SysDeptVo;
import com.ruoyi.common.core.text.Convert; import com.ruoyi.common.core.text.Convert;
import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.DateUtils;
@ -101,8 +102,8 @@ public class RecordWarehousingServiceImpl implements IRecordWarehousingService
} }
@Override @Override
public List<Map> selectRecord() { public List<Map> selectRecord(SysDeptVo sysDeptVo) {
return recordWarehousingMapper.selectRecord(); return recordWarehousingMapper.selectRecord(sysDeptVo);
} }
@Override @Override

@ -61,7 +61,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<select id="queryCarTotal" resultType="java.lang.Integer"> <select id="queryCarTotal" resultType="java.lang.Integer">
SELECT COUNT(*) FROM `base_car` SELECT COUNT(*) FROM `base_car`
</select> </select>
<select id="querytotal" resultType="java.util.Map"> <select id="querytotal" resultType="java.util.Map" parameterType="SysDeptVo">
SELECT SELECT
COUNT(bi.id) AS total, COUNT(bi.id) AS total,
COUNT(CASE WHEN bt.tyre_type IN ('全新胎', 'new') THEN 1 END) AS new, COUNT(CASE WHEN bt.tyre_type IN ('全新胎', 'new') THEN 1 END) AS new,
@ -69,8 +69,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
COUNT(CASE WHEN bt.tyre_type IN ('renovate') THEN 1 END) AS renovate, COUNT(CASE WHEN bt.tyre_type IN ('renovate') THEN 1 END) AS renovate,
COUNT(CASE WHEN bt.tyre_type IN ('experimental') THEN 1 END) AS experimental COUNT(CASE WHEN bt.tyre_type IN ('experimental') THEN 1 END) AS experimental
FROM base_inventory bi FROM base_inventory bi
INNER JOIN base_tyre bt ON bi.tyre_rfid = bt.tyre_epc INNER JOIN base_tyre bt ON bi.tyre_rfid = bt.tyre_epc
WHERE bi.status = '0'; LEFT JOIN sys_dept d ON d.dept_id = bt.dept_id
WHERE bi.status = '0'
<if test="branchCompany != null and branchCompany != ''"> AND (bt.dept_id IN (SELECT dept_id FROM sys_dept WHERE dept_id = #{branchCompany} OR find_in_set( #{branchCompany}, ancestors)))</if>
<if test="repairShop != null and repairShop != ''"> AND (bt.dept_id IN (SELECT dept_id FROM sys_dept WHERE dept_id = #{repairShop} OR find_in_set( #{repairShop}, ancestors)))</if>
</select> </select>
<insert id="insertBaseInventory" parameterType="BaseInventory"> <insert id="insertBaseInventory" parameterType="BaseInventory">

@ -23,7 +23,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="carNo" column="car_no" /> <result property="carNo" column="car_no" />
<result property="wheelPostion" column="wheel_postion" /> <result property="wheelPostion" column="wheel_postion" />
<result property="patternDepth" column="pattern_depth" /> <result property="patternDepth" column="pattern_depth" />
<result property="company" column="company" />
<result property="carTeam" column="carTeam" />
</resultMap> </resultMap>
<sql id="selectBaseTyreVo"> <sql id="selectBaseTyreVo">
@ -31,9 +32,34 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</sql> </sql>
<select id="selectBaseTyreList" parameterType="BaseTyre" resultMap="BaseTyreResult"> <select id="selectBaseTyreList" parameterType="BaseTyre" resultMap="BaseTyreResult">
select tyre_id, tyre_no,self_no, tyre_epc, tyre_brand, tyre_model, tyre_level, tyre_pattern, pattern_depth,tyre_type, team, su.user_name as create_by, d.create_time, d.update_by, d.update_time, d.remark,car_no,wheel_postion SELECT
from base_tyre d tyre_id,
left join sys_user su ON su.login_name = d.create_by tyre_no,
self_no,
tyre_epc,
tyre_brand,
tyre_model,
tyre_level,
tyre_pattern,
pattern_depth,
tyre_type,
sdss.dept_name as company,
d.team,
sd.dept_name as carTeam,
su.user_name AS create_by,
d.create_time,
d.update_by,
d.update_time,
d.remark,
d.car_no,
wheel_postion
FROM
base_tyre d
LEFT JOIN sys_user su ON su.login_name = d.create_by
LEFT JOIN base_car bc ON bc.car_no = d.car_no
LEFT JOIN sys_dept sd ON bc.dept_id = sd.dept_id
LEFT JOIN sys_dept sds ON sd.parent_id = sds.dept_id
LEFT JOIN sys_dept sdss ON sds.parent_id = sdss.dept_id
where tyre_id is not null where tyre_id is not null
<if test="tyreNo != null and tyreNo != ''"> and tyre_no like concat('%', #{tyreNo}, '%')</if> <if test="tyreNo != null and tyreNo != ''"> and tyre_no like concat('%', #{tyreNo}, '%')</if>
<if test="selfNo != null and selfNo != ''"> and self_no like concat('%', #{selfNo}, '%')</if> <if test="selfNo != null and selfNo != ''"> and self_no like concat('%', #{selfNo}, '%')</if>
@ -43,7 +69,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="tyreLevel != null and tyreLevel != ''"> and tyre_level = #{tyreLevel}</if> <if test="tyreLevel != null and tyreLevel != ''"> and tyre_level = #{tyreLevel}</if>
<if test="tyrePattern != null and tyrePattern != ''"> and tyre_pattern = #{tyrePattern}</if> <if test="tyrePattern != null and tyrePattern != ''"> and tyre_pattern = #{tyrePattern}</if>
<if test="tyreType != null and tyreType != ''"> and tyre_type = #{tyreType}</if> <if test="tyreType != null and tyreType != ''"> and tyre_type = #{tyreType}</if>
<if test="team != null and team != ''"> and team like concat('%', #{team}, '%')</if> <if test="team != null and team != ''"> and d.team like concat('%', #{team}, '%')</if>
<if test="carNo != null and carNo != ''"> and car_no = #{carNo}</if> <if test="carNo != null and carNo != ''"> and car_no = #{carNo}</if>
<if test="params.beginTime != null and params.beginTime != ''"><!-- 开始时间检索 --> <if test="params.beginTime != null and params.beginTime != ''"><!-- 开始时间检索 -->
AND date_format(d.create_time,'%Y%m%d') &gt;= date_format(#{params.beginTime},'%Y%m%d') AND date_format(d.create_time,'%Y%m%d') &gt;= date_format(#{params.beginTime},'%Y%m%d')
@ -79,16 +105,20 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</select> </select>
<select id="vTyreStockSummary" resultType="java.util.Map" parameterType="SysDept"> <select id="vTyreStockSummary" resultType="java.util.Map" parameterType="SysDept">
SELECT SELECT
IFNULL(dept_name, '合计') AS dept_name, IFNULL(v.dept_name, '合计') AS dept_name,
new_count AS '新胎', new_count AS '新胎',
circulating_count AS '周转胎', circulating_count AS '周转胎',
renovate_count AS '翻新胎', renovate_count AS '翻新胎',
experimental_count AS '实验胎' experimental_count AS '实验胎',
incar AS '在车轮胎'
FROM FROM
v_tyre_stock_summary v_tyre_stock_summary v
left join sys_dept d on v.dept_name = d.dept_name
<where> <where>
<if test="deptName != null and deptName != ''"> and dept_name = #{deptName}</if> <if test="deptName != null and deptName != ''"> and v.dept_name = #{deptName}</if>
${params.dataScope}
</where> </where>
</select> </select>

@ -22,6 +22,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="tyreModel" column="tyre_model" /> <result property="tyreModel" column="tyre_model" />
<result property="team" column="team" /> <result property="team" column="team" />
<result property="patternDepth" column="patter_depth" /> <result property="patternDepth" column="patter_depth" />
<result property="company" column="company" />
<result property="carTeam" column="carTeam" />
</resultMap> </resultMap>
<sql id="selectRecordTyreInstallVo"> <sql id="selectRecordTyreInstallVo">
@ -30,10 +32,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<select id="selectRecordTyreInstallList" parameterType="RecordTyreInstall" resultMap="RecordTyreInstallResult"> <select id="selectRecordTyreInstallList" parameterType="RecordTyreInstall" resultMap="RecordTyreInstallResult">
select rti.id, rti.tyre_rfid, rti.type, rti.mileage, su.user_name as create_by, rti.create_time,rti.update_by,rti.car_no, select rti.id, rti.tyre_rfid, rti.type, rti.mileage, su.user_name as create_by, rti.create_time,rti.update_by,rti.car_no,
rti.wheel_postion,rti.update_time, rti.remark,rti.pattern_depth,bt.tyre_brand,bt.tyre_no,bt.self_no,bt.tyre_model,bt.team rti.wheel_postion,rti.update_time, rti.remark,rti.pattern_depth,bt.tyre_brand,bt.tyre_no,bt.self_no,bt.tyre_model,
sdss.dept_name as company,bt.team,sd.dept_name as carTeam
from record_tyre_install rti from record_tyre_install rti
LEFT JOIN base_tyre bt ON rti.tyre_rfid = bt.tyre_epc LEFT JOIN base_tyre bt ON rti.tyre_rfid = bt.tyre_epc
left join sys_user su ON su.login_name = rti.create_by left join sys_user su ON su.login_name = rti.create_by
LEFT JOIN base_car bc ON bc.car_no = bt.car_no
LEFT JOIN sys_dept sd ON bc.dept_id = sd.dept_id
LEFT JOIN sys_dept sds ON sd.parent_id = sds.dept_id
LEFT JOIN sys_dept sdss ON sds.parent_id = sdss.dept_id
where rti.id is not null where rti.id is not null
<if test="tyreRfid != null and tyreRfid != ''"> and rti.tyre_rfid = #{tyreRfid}</if> <if test="tyreRfid != null and tyreRfid != ''"> and rti.tyre_rfid = #{tyreRfid}</if>

@ -43,15 +43,16 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<include refid="selectRecordWarehousingVo"/> <include refid="selectRecordWarehousingVo"/>
where id = #{id} where id = #{id}
</select> </select>
<select id="selectRecord" resultType="java.util.Map"> <select id="selectRecord" resultType="java.util.Map" parameterType="SysDept">
SELECT SELECT
DATE(create_time) AS date, DATE(rw.create_time) AS date,
SUM(CASE WHEN type = 0 THEN 1 ELSE 0 END) AS type_0_count, SUM(CASE WHEN type = 0 THEN 1 ELSE 0 END) AS type_0_count,
SUM(CASE WHEN type = 1 THEN 1 ELSE 0 END) AS type_1_count SUM(CASE WHEN type = 1 THEN 1 ELSE 0 END) AS type_1_count
FROM record_warehousing FROM record_warehousing rw
WHERE create_time >= DATE_SUB(CURDATE(), INTERVAL 1 MONTH) LEFT JOIN base_tyre bt ON bt.tyre_epc = rw.tyre_rfid
AND create_time &lt; CURDATE() + INTERVAL 1 DAY WHERE rw.create_time >= DATE_SUB(CURDATE(), INTERVAL 1 MONTH)
GROUP BY DATE(create_time) AND rw.create_time &lt; CURDATE() + INTERVAL 1 DAY
GROUP BY DATE(rw.create_time)
ORDER BY date; ORDER BY date;
</select> </select>
<select id="selectTyreModel" resultType="java.util.Map"> <select id="selectTyreModel" resultType="java.util.Map">

Loading…
Cancel
Save