问题修改

This commit is contained in:
jiang 2025-11-07 18:00:43 +08:00
parent 76a2ef5347
commit 8435db8876
5 changed files with 119 additions and 67 deletions

View File

@ -305,5 +305,7 @@ public interface DevInfoMapper {
Integer getTotalEquipmentByLevel(DevInfoReq devInfoReq);
int getTurnoverRateByLevel(DevInfoReq devInfoReq);
int getProjectNUm();
}

View File

@ -301,7 +301,9 @@ public class ProvinceScreenServiceImpl implements ProvinceScreenService {
//年度总投资额 TODO 输入的
res.put("annualTotal", "140.6");
//在建工程数 TODO e基建2.0获取
res.put("projectNUm", 50);
int projectNUm = devInfoMapper.getProjectNUm();
res.put("projectNUm", projectNUm);
//在用装备数
//自用--2

View File

@ -10,7 +10,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
IFNULL(sum( buy_price * device_count ),0) AS totalValue
FROM
ma_dev_info
WHERE is_active = 1 and on_company = #{companyId}
WHERE is_active = 1 and on_company = #{companyId} and entry_status = '1' and change_status !='4'
</select>
<select id="getTodayDeviceEnterOutNum" resultType="com.bonus.material.cityScreen.VO.BasicTitleVO">
@ -94,14 +95,51 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
where mdi.is_active = 1 and mdi.on_company = #{companyId} and mdi.change_status != 4
</select>
<select id="retirementAlarm" resultType="com.bonus.material.cityScreen.VO.AlarmVO">
select
mdi.device_name as deviceName,
mtv.devCategory as procedureName,
concat('差',TIMESTAMPDIFF(DAY, NOW(),mdi.expiration_time),'天退役') as situation
from ma_dev_info mdi
INNER join ma_type_view mtv on mtv.typeId = mdi.type_id
where mdi.is_active = 1 and mdi.on_company = #{companyId} and mdi.change_status != 4
order by TIMESTAMPDIFF(YEAR, NOW(),mdi.expiration_time)
SELECT
mdi.device_name AS deviceName,
mtv.devCategory AS procedureName,
-- 核心:按「剩余可用年限」判断状态(剩余年限 = 最大年限 - 已使用年限)
CASE
-- 告警2已超期剩余年限≤0
WHEN ROUND(TIMESTAMPDIFF(DAY, mdi.production_date, NOW()) / 365.25, 1) &gt;= mdi.max_working_hours
THEN CONCAT('告警:已超最大使用年限', ROUND(
ROUND(TIMESTAMPDIFF(DAY, mdi.production_date, NOW()) / 365.25, 1) - mdi.max_working_hours,
1
), '年')
-- 告警1未超期但剩余可用年限≤1年相差小于等于1年
WHEN (mdi.max_working_hours - ROUND(TIMESTAMPDIFF(DAY, mdi.production_date, NOW()) / 365.25, 1)) &lt;= 1
THEN CONCAT('告警:即将超期,剩余可用年限', ROUND(
mdi.max_working_hours - ROUND(TIMESTAMPDIFF(DAY, mdi.production_date, NOW()) / 365.25, 1),
1
), '年')
-- 正常未超期且剩余可用年限1年相差大于1年
ELSE CONCAT('正常:剩余可用年限', ROUND(
mdi.max_working_hours - ROUND(TIMESTAMPDIFF(DAY, mdi.production_date, NOW()) / 365.25, 1),
1
), '年')
END AS situation
FROM
ma_dev_info mdi
INNER JOIN ma_type_view mtv
ON mtv.typeId = mdi.type_id
WHERE
mdi.is_active = 1
AND mdi.on_company = #{companyId} -- MyBatis 参数占位符(安全防注入)
AND mdi.change_status != 4
-- 排序:超期告警>即将超期告警>正常(按紧急程度)
ORDER BY
CASE
-- 超期告警优先级1
WHEN ROUND(TIMESTAMPDIFF(DAY, mdi.production_date, NOW()) / 365.25, 1) &gt;= mdi.max_working_hours THEN 0
-- 即将超期告警优先级2
WHEN (mdi.max_working_hours - ROUND(TIMESTAMPDIFF(DAY, mdi.production_date, NOW()) / 365.25, 1)) &lt;= 1 THEN 1
-- 正常优先级3
ELSE 2
END ASC,
-- 超期告警:超期越久越靠前
(ROUND(TIMESTAMPDIFF(DAY, mdi.production_date, NOW()) / 365.25, 1) - mdi.max_working_hours) DESC,
-- 即将超期告警:剩余年限越少越靠前
(mdi.max_working_hours - ROUND(TIMESTAMPDIFF(DAY, mdi.production_date, NOW()) / 365.25, 1)) ASC
</select>
<select id="countRetirementAlarm" resultType="int">

View File

@ -1352,7 +1352,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
LEFT JOIN sys_dept sd ON mli.publish_company = sd.dept_id
</select>
<select id="getTotalEquipment" resultType="java.lang.Integer">
select count(1) from ma_dev_info where is_active ='1'
select count(1) from ma_dev_info where is_active ='1' and entry_status = '1' and change_status !='4'
<if test="ownCo != null ">
AND on_company = #{ownCo}
</if>
@ -1361,7 +1361,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</if>
</select>
<select id="getTotalValue" resultType="java.math.BigDecimal">
select SUM(buy_price) from ma_dev_info where is_active ='1'
select SUM(buy_price) from ma_dev_info where is_active ='1' and entry_status = '1' and change_status !='4'
<if test="ownCo != null ">
AND on_company = #{ownCo}
</if>
@ -1371,14 +1371,16 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
from ma_dev_info mdi
INNER JOIN ma_type_view mtv ON mtv.typeId = mdi.type_id
where mtv.maxTypeId = #{typeId}
and mdi.is_active = '1'
and mdi.is_active = '1' and mdi.entry_status = '1' and mdi.change_status !='4'
and on_company = #{ownCo}
</select>
<select id="getLinePrice" resultType="java.math.BigDecimal">
select sum(mdi.buy_price)
from ma_dev_info mdi
INNER JOIN ma_type_view mtv ON mtv.typeId = mdi.type_id
where mtv.maxTypeId = #{typeId}
and mdi.is_active = '1'
and mdi.is_active = '1' and mdi.entry_status = '1' and mdi.change_status !='4'
and on_company = #{ownCo}
</select>
<select id="getLineProductionDateList" resultType="java.lang.String">
select production_date
@ -1386,6 +1388,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
INNER JOIN ma_type_view mtv ON mtv.typeId = mdi.type_id
where mtv.maxTypeId = #{typeId}
and mdi.is_active = '1'
and on_company = #{ownCo}
</select>
<select id="getUnitEquipmentConfiguration" resultType="com.bonus.material.equipment.domain.SysDept">
select production_date
@ -1524,4 +1527,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
AND mtv.typeId = #{typeId}
</if>
</select>
<select id="getProjectNUm" resultType="java.lang.Integer">
SELECT COUNT(1)
from jj_sing_project
</select>
</mapper>

View File

@ -727,44 +727,46 @@
ORDER BY proportion DESC
</select>
<select id="getEquipmentUse" resultType="java.util.Map">
SELECT
-- 工程基础信息
-- 工程基础信息(确保唯一)
jsp.pro_code AS proCode,
jsp.pro_name AS projectName,
-- 该工程的装备数量(有效设备
-- 该工程的有效装备数量DISTINCT 去重,避免设备重复统计
COUNT(DISTINCT mdi.ma_id) AS inUser,
-- 生成60-100的随机规模值保留0位小数整数
-- 随机规模值60-100整数每个工程仅生成1次与分组绑定
FLOOR(RAND() * (100 - 60 + 1) + 60) AS scale,
-- 计算:装备数/规模×100保留2位小数避免除数为0
-- 装备使用率:装备数/规模×100保留2位小数除数/装备数为0时显示0
ROUND(
IF(
COUNT(DISTINCT mdi.ma_id) = 0, -- 若装备数为0结果为0
COUNT(DISTINCT mdi.ma_id) = 0 OR FLOOR(RAND() * (100 - 60 + 1) + 60) = 0,
0,
COUNT(DISTINCT mdi.ma_id) / FLOOR(RAND() * (100 - 60 + 1) + 60) * 100
-- 复用随机数逻辑:用 USER() + pro_code 作为 RAND() 种子,确保同一行随机数一致
COUNT(DISTINCT mdi.ma_id) / FLOOR(RAND(CONCAT(USER(), jsp.pro_code)) * (100 - 60 + 1) + 60) * 100
),
2
) AS `usage`
FROM jj_sing_project jsp
-- 左连接设备表:关联“工程编码”jsp.pro_code和“设备所属工程”mdi.on_project
-- 左连接设备表:保留所有工程,无设备则 inUser=0
LEFT JOIN ma_dev_info mdi
ON mdi.on_project = jsp.pro_code
-- 可选:筛选“有效设备”(排除未激活/已报废的设备,根据业务补充)
AND mdi.is_active = '1' -- 假设is_active=1代表设备有效
-- 设备筛选条件写在 ON 后,不过滤无设备的工程
AND mdi.is_active = '1'
AND mdi.change_status IN (2, 3)
AND mdi.entry_status = '1'
<where>
<!-- 条件筛选(不影响左连接的全量工程,仅过滤工程本身) -->
<if test="proCode != null and proCode != ''">
AND jsp.pro_code = #{proCode}
</if>
<if test="proType!= null and proType != ''">
<if test="proType != null and proType != ''">
AND jsp.project_type = #{proType}
</if>
</where>
-- 按工程分组,统计每个工程的设备数量
GROUP BY jsp.pro_code, jsp.pro_name -- 按工程编码+名称分组(确保工程唯一)
-- 可选:排序(按设备数量倒序,查看设备最多的工程)
ORDER BY inUser DESC
-- 按工程唯一标识分组核心去重确保每个工程仅1行记录
GROUP BY jsp.pro_code, jsp.pro_name
-- 排序:按使用率降序,设备数量降序
ORDER BY `usage` DESC, inUser DESC
</select>
<select id="getProNum" resultType="java.lang.Integer">
SELECT
@ -835,61 +837,62 @@
ORDER BY inUser DESC
</select>
<select id="getDeptEquipment">
-- 按单位统计:设备在用率 + 近12个月每月出库次数含无数据单位MySQL 5 兼容版)
SELECT
-- 单位唯一标识取自sys_dept全量单位确保无数据单位也显示
sd_all.dept_id AS deptId,
-- 单位名称sys_dept表中字段为dept_name
sd_all.dept_name AS name,
-- 单位设备在用率无数据时显示0
IFNULL(ur.use_rate_percent, 0) AS proportion,
-- 近12个月每月出库次数无记录时显示0
IFNULL(oc.monthly_outbound_count, 0) AS turnoverRate
sd_all.dept_id AS deptId, -- 字段1单位ID
sd_all.dept_name AS name, -- 字段2单位名称
IFNULL(ur.use_rate_percent, 0) AS proportion, -- 字段3设备在用率无数据显示0
IFNULL(oc.total_outbound_count, 0) AS turnoverRate -- 字段4近12个月总出库次数无数据显示0
FROM
-- 核心先获取sys_dept表中所有单位(确保无数据单位不丢失)
-- 全量单位表(确保无数据单位不丢失)
sys_dept sd_all
-- 左连接“在用率统计结果”全量单位关联在用率数据无数据则为NULL
-- 左连接单位在用率统计1单位1行
LEFT JOIN (
-- 子查询1按单位统计设备在用率MySQL 5 多字段去重兼容)
SELECT sd.dept_id,
ROUND(
IF(
-- 用CONCAT解决MySQL 5 不支持多字段DISTINCT的问题
COUNT(DISTINCT CONCAT(mdi.ma_id, '_', DATE(mddu.create_time))) = 0,
0,
-- 单位内在用天数 ÷ 单位总记录天数 × 100%
COUNT(DISTINCT CASE
WHEN mddu.`status` = 1
THEN CONCAT(mdi.ma_id, '_', DATE(mddu.create_time)) END)
/ COUNT(DISTINCT CONCAT(mdi.ma_id, '_', DATE(mddu.create_time))) * 100
),
2
) AS use_rate_percent
-- 子查询1按单位统计设备在用率MySQL 5 兼容)
SELECT
sd.dept_id,
ROUND(
IF(
COUNT(DISTINCT CONCAT(mdi.ma_id, '_', DATE(mddu.create_time))) = 0,
0,
COUNT(DISTINCT CASE
WHEN mddu.`status` = 1 THEN CONCAT(mdi.ma_id, '_', DATE(mddu.create_time))
END)
/ COUNT(DISTINCT CONCAT(mdi.ma_id, '_', DATE(mddu.create_time))) * 100
),
2
) AS use_rate_percent
FROM ma_dev_info mdi
LEFT JOIN ma_dev_daily_use mddu ON mddu.ma_id = mdi.ma_id
LEFT JOIN sys_dept sd ON sd.dept_id = mdi.on_company
WHERE mdi.is_active = '1'
WHERE
mdi.is_active = '1'
AND mdi.change_status != '4'
AND mdi.entry_status = '1'
GROUP BY sd.dept_id) AS ur ON sd_all.dept_id = ur.dept_id
-- 左连接“出库次数统计结果”全量单位关联出库数据无数据则为NULL
GROUP BY sd.dept_id
) AS ur ON sd_all.dept_id = ur.dept_id
-- 左连接单位近12个月总出库次数1单位1行无重复
LEFT JOIN (
-- 子查询2按单位统计近12个月每月出库次数
SELECT sd.dept_id,
DATE_FORMAT(cdcd.use_time, '%Y-%m') AS stat_year_month,
COUNT(*) AS monthly_outbound_count
-- 子查询2按单位统计近12个月出库次数
SELECT
sd.dept_id,
COUNT(*) AS total_outbound_count
FROM cs_device_change_details cdcd
-- 关联设备表过滤有效设备
INNER JOIN ma_dev_info mdi
ON mdi.ma_id = cdcd.dev_id
AND mdi.is_active = '1'
AND mdi.change_status != '4'
AND mdi.entry_status = '1'
-- 关联单位表获取所属单位
LEFT JOIN sys_dept sd ON sd.dept_id = mdi.on_company
WHERE cdcd.`status` = 2 -- 出库状态(按实际业务调整)
WHERE
cdcd.`status` = 2 -- 出库状态(按实际业务调整)
AND cdcd.use_time IS NOT NULL
AND cdcd.use_time >= DATE_SUB(CURDATE(), INTERVAL 12 MONTH)
GROUP BY sd.dept_id, DATE_FORMAT(cdcd.use_time, '%Y-%m')) AS oc ON sd_all.dept_id = oc.dept_id
-- 可选按单位ID排序确保结果顺序稳定
ORDER BY proportion DESC
GROUP BY sd.dept_id
) AS oc ON sd_all.dept_id = oc.dept_id
-- 按在用率降序排序(无数据单位排最后)
ORDER BY proportion DESC;
</select>
<delete id="deleteMaTypePropertyNames">