问题修改
This commit is contained in:
parent
bc6a0b6195
commit
5cf0ce7ec5
|
|
@ -16,6 +16,7 @@ import org.springframework.web.bind.annotation.*;
|
|||
import javax.servlet.http.HttpServletResponse;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@RestController
|
||||
@RequestMapping("/decChange")
|
||||
|
|
@ -60,7 +61,7 @@ public class DevChangeController extends BaseController {
|
|||
@ApiOperation(value = "查询工程下拉选集合")
|
||||
@PostMapping("/getVoltageLevel")
|
||||
public AjaxResult getVoltageLevel(@RequestBody JjProjectVo vo) {
|
||||
List<JjProjectVo> list = service.getVoltageLevel(vo);
|
||||
List<Map<String, Object>> list = service.getVoltageLevel(vo);
|
||||
return AjaxResult.success(list);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -5,10 +5,12 @@ import com.bonus.material.devchange.domain.*;
|
|||
import com.bonus.material.device.domain.vo.DevInfoPropertyVo;
|
||||
import com.bonus.material.device.domain.vo.DevInfoVo;
|
||||
import com.bonus.material.toolLedger.domain.ToolLedgerEntity;
|
||||
import org.apache.ibatis.annotations.MapKey;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@Mapper
|
||||
public interface DevChangeMapper {
|
||||
|
|
@ -115,7 +117,8 @@ public interface DevChangeMapper {
|
|||
* @param vo
|
||||
* @return
|
||||
*/
|
||||
List<JjProjectVo> getVoltageLevel(JjProjectVo vo);
|
||||
@MapKey("value")
|
||||
List<Map<String, Object>> getVoltageLevel(JjProjectVo vo);
|
||||
|
||||
/**
|
||||
* 修改详情
|
||||
|
|
|
|||
|
|
@ -5,6 +5,7 @@ import com.bonus.material.devchange.domain.*;
|
|||
import com.bonus.material.toolLedger.domain.ToolLedgerEntity;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
public interface DevChangeService {
|
||||
/**
|
||||
|
|
@ -60,7 +61,7 @@ public interface DevChangeService {
|
|||
* @param vo
|
||||
* @return
|
||||
*/
|
||||
List<JjProjectVo> getVoltageLevel(JjProjectVo vo);
|
||||
List<Map<String, Object>> getVoltageLevel(JjProjectVo vo);
|
||||
|
||||
AjaxResult updateDevChangeInfo(CsDeviceChangeVo vo);
|
||||
|
||||
|
|
|
|||
|
|
@ -829,7 +829,7 @@ public class DevChangeServiceImpl implements DevChangeService {
|
|||
}
|
||||
|
||||
@Override
|
||||
public List<JjProjectVo> getVoltageLevel(JjProjectVo vo) {
|
||||
public List<Map<String, Object>> getVoltageLevel(JjProjectVo vo) {
|
||||
try {
|
||||
return mapper.getVoltageLevel(vo);
|
||||
} catch (Exception e) {
|
||||
|
|
|
|||
|
|
@ -19,6 +19,7 @@ import org.apache.ibatis.annotations.Param;
|
|||
import java.math.BigDecimal;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* 设备信息Mapper接口
|
||||
|
|
@ -288,7 +289,7 @@ public interface DevInfoMapper {
|
|||
|
||||
List<String> getLineProductionDateList(DevInfoReq devInfoReq);
|
||||
|
||||
List<com.bonus.material.equipment.domain.SysDept> getUnitEquipmentConfiguration();
|
||||
List<Map<String, Object>> getUnitEquipmentConfiguration();
|
||||
|
||||
BigDecimal getPrice(Long deptId);
|
||||
|
||||
|
|
|
|||
|
|
@ -13,6 +13,7 @@ import com.bonus.material.ma.mapper.MaTypeMapper;
|
|||
import com.bonus.material.ma.vo.MaType;
|
||||
import com.bonus.system.api.domain.SysDept;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.lang3.ObjectUtils;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
|
|
@ -150,102 +151,8 @@ public class ProvinceScreenServiceImpl implements ProvinceScreenService {
|
|||
*/
|
||||
@Override
|
||||
public List<Map<String, Object>> getUnitEquipmentConfiguration() {
|
||||
devInfoMapper.getUnitEquipmentConfiguration();
|
||||
|
||||
if (sysDeptMapper == null) {
|
||||
log.error("sysDeptMapper is null");
|
||||
return new ArrayList<>();
|
||||
}
|
||||
|
||||
SysDept sysDept = new SysDept();
|
||||
DevInfoReq devInfoReq = new DevInfoReq();
|
||||
List<SysDeptVO> sysDeptList = sysDeptMapper.selectDeptVOList(sysDept);
|
||||
|
||||
|
||||
if (sysDeptList == null) {
|
||||
log.error("未找到部门数据");
|
||||
return new ArrayList<>();
|
||||
}
|
||||
sysDeptList.removeIf(item -> item.getDeptType() == null || !Objects.equals(item.getDeptType(), "地市公司"));
|
||||
|
||||
|
||||
List<Map<String, Object>> res = new ArrayList<>();
|
||||
for (SysDeptVO sysDeptNew : sysDeptList) {
|
||||
if (sysDeptNew == null || sysDeptNew.getDeptId() == null) {
|
||||
log.warn("跳过无效的部门数据");
|
||||
continue;
|
||||
}
|
||||
|
||||
Map<String, Object> dept = new HashMap<>();
|
||||
dept.put("deptName", sysDeptNew.getDeptName() != null ? sysDeptNew.getDeptName() : "未知部门");
|
||||
dept.put("deptAbbreviation", sysDeptNew.getDeptAbbreviation() != null ? sysDeptNew.getDeptAbbreviation() : "未知部门");
|
||||
devInfoReq.setOwnCo(Math.toIntExact(sysDeptNew.getDeptId()));
|
||||
|
||||
// 部门定位
|
||||
dept.put("location", Optional.ofNullable(sysDeptNew.getLocation()).orElse(""));
|
||||
|
||||
// 装备价值
|
||||
BigDecimal totalValue = devInfoMapper.getTotalValue(devInfoReq);
|
||||
dept.put("totalValue", totalValue != null ? totalValue : BigDecimal.ZERO);
|
||||
|
||||
// 装备总数
|
||||
Integer totalEquipmentQuantity = devInfoMapper.getTotalEquipment(devInfoReq);
|
||||
dept.put("totalEquipmentQuantity", totalEquipmentQuantity != null ? totalEquipmentQuantity : 0);
|
||||
|
||||
// 线路
|
||||
devInfoReq.setTypeId(1);
|
||||
int lineNum = devInfoMapper.getLineNum(devInfoReq);
|
||||
dept.put("lineNum", lineNum);
|
||||
// 变电
|
||||
devInfoReq.setTypeId(2);
|
||||
int substationNum = devInfoMapper.getLineNum(devInfoReq);
|
||||
dept.put("substationNum", substationNum);
|
||||
|
||||
// 电缆
|
||||
devInfoReq.setTypeId(3);
|
||||
int cableNum = devInfoMapper.getLineNum(devInfoReq);
|
||||
dept.put("cableNum", cableNum);
|
||||
|
||||
// 所在城市
|
||||
String cityName = sysDeptMapper.getCityName(sysDeptNew.getCity());
|
||||
dept.put("cityName", cityName != null ? cityName : "未知城市");
|
||||
|
||||
// 获取装备转换率
|
||||
try {
|
||||
DeptConfigRateSummary user = new DeptConfigRateSummary();
|
||||
List<DeptConfigRateSummary> list = sysDeptService.selectDeptConfigRatePivot(user);
|
||||
|
||||
if (list != null) {
|
||||
for (DeptConfigRateSummary deptConfigRateSummary : list) {
|
||||
if (deptConfigRateSummary != null) {
|
||||
// 总数
|
||||
dept.put("configRate", deptConfigRateSummary.getConfigRate() != null ?
|
||||
deptConfigRateSummary.getConfigRate() : 0.0);
|
||||
// 线路
|
||||
dept.put("valueA", deptConfigRateSummary.getValueA() != null ?
|
||||
deptConfigRateSummary.getValueA() : 0.0);
|
||||
// 变电
|
||||
dept.put("valueB", deptConfigRateSummary.getValueB() != null ?
|
||||
deptConfigRateSummary.getValueB() : 0.0);
|
||||
// 电缆
|
||||
dept.put("valueC", deptConfigRateSummary.getValueC() != null ?
|
||||
deptConfigRateSummary.getValueC() : 0.0);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
log.error("获取装备转换率异常: " + e.getMessage(), e);
|
||||
// 设置默认值
|
||||
dept.put("configRate", 0.0);
|
||||
dept.put("valueA", 0.0);
|
||||
dept.put("valueB", 0.0);
|
||||
dept.put("valueC", 0.0);
|
||||
}
|
||||
|
||||
res.add(dept);
|
||||
}
|
||||
return res;
|
||||
List<Map<String, Object>> list = devInfoMapper.getUnitEquipmentConfiguration();
|
||||
return list;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -338,12 +245,18 @@ public class ProvinceScreenServiceImpl implements ProvinceScreenService {
|
|||
*/
|
||||
@Override
|
||||
public AjaxResult getEquipmentUse(String proCode, String proType) {
|
||||
String[] proCodeArray = new String[]{};
|
||||
List<String> proCodeList = new ArrayList<>();
|
||||
if (ObjectUtils.isNotEmpty(proCode)) {
|
||||
proCodeArray = proCode.split(",");
|
||||
proCodeList = Arrays.asList(proCodeArray);
|
||||
}
|
||||
Map<String, Object> res = new HashMap<>();
|
||||
Integer proNum = maTypeMapper.getProNum(proType);
|
||||
Integer equipmentNum = maTypeMapper.getEquipmentNum(proType);
|
||||
res.put("proNum", proNum);
|
||||
res.put("equipmentNum", equipmentNum);
|
||||
res.put("equipmentUse", maTypeMapper.getEquipmentUse(proCode, proType));
|
||||
res.put("equipmentUse", maTypeMapper.getEquipmentUse(proCodeList, proType));
|
||||
return AjaxResult.success(res);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -107,7 +107,7 @@ public interface MaTypeMapper {
|
|||
|
||||
List<Map<String, Object>> getUsageStatisticsDetails();
|
||||
|
||||
List<Map<String, Object>> getEquipmentUse(@Param("proCode") String proCode, @Param("proType") String proType);
|
||||
List<Map<String, Object>> getEquipmentUse(@Param("proCode") List<String> proCode, @Param("proType") String proType);
|
||||
|
||||
|
||||
List<Map<String, Object>> getEquipmentDetails(String proName);
|
||||
|
|
|
|||
|
|
@ -254,11 +254,7 @@
|
|||
is_active = 1
|
||||
AND dcd.change_id = #{id}
|
||||
</select>
|
||||
<select id="getVoltageLevel" resultType="com.bonus.material.devchange.domain.JjProjectVo">
|
||||
select distinct voltage
|
||||
from jj_sing_project
|
||||
|
||||
</select>
|
||||
<select id="getDevChangeDetailsList" resultType="com.bonus.material.devchange.domain.DevChangeDetailsVo">
|
||||
select id,
|
||||
pro_id proId,
|
||||
|
|
@ -760,6 +756,13 @@
|
|||
</where>
|
||||
|
||||
</select>
|
||||
<select id="getVoltageLevel" resultType="java.util.Map">
|
||||
SELECT DISTINCT voltage AS value,
|
||||
CONCAT(voltage, 'kv') AS label
|
||||
FROM jj_sing_project
|
||||
ORDER BY CAST(voltage AS UNSIGNED); -- 将字符串转换为无符号整数
|
||||
|
||||
</select>
|
||||
|
||||
|
||||
<insert id="addChangeInfoNew" keyProperty="id" useGeneratedKeys="true">
|
||||
|
|
|
|||
|
|
@ -1451,13 +1451,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|||
and mdi.is_active = '1'
|
||||
and on_company = #{ownCo}
|
||||
</select>
|
||||
<select id="getUnitEquipmentConfiguration" resultType="com.bonus.material.equipment.domain.SysDept">
|
||||
select production_date
|
||||
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'
|
||||
</select>
|
||||
|
||||
<select id="getPrice" resultType="java.math.BigDecimal">
|
||||
select SUM(buy_price) from ma_dev_info where is_active ='1' and on_company = #{deptId}
|
||||
</select>
|
||||
|
|
@ -1635,4 +1629,46 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|||
WHERE tl.up_down_status = '1'
|
||||
and tl.id = #{maId}
|
||||
</select>
|
||||
<select id="getUnitEquipmentConfiguration" resultType="java.util.Map">
|
||||
SELECT sd.dept_name AS deptName,
|
||||
sd.dept_abbreviation AS deptAbbreviation,
|
||||
ba.name AS cityName,
|
||||
IFNULL(sd.location, CONCAT(ba.latitude, ',', ba.longitude)) AS location,
|
||||
-- 统计关联了mdi且mtv.maxTypeId=5080的总数量
|
||||
IFNULL(sum(mdi.buy_price), 0) AS totalValue,
|
||||
SUM(CASE
|
||||
WHEN sd.dept_id = mdi.on_company THEN 1 -- 仅当类型符合时计数
|
||||
ELSE 0
|
||||
END) AS totalEquipmentQuantity,
|
||||
SUM(CASE
|
||||
WHEN mtv.maxTypeId = 1 THEN 1 -- 仅当类型符合时计数
|
||||
ELSE 0
|
||||
END) AS cableNum,
|
||||
SUM(CASE
|
||||
WHEN mtv.maxTypeId = 3 THEN 1 -- 仅当类型符合时计数
|
||||
ELSE 0
|
||||
END) AS substationNum,
|
||||
SUM(CASE
|
||||
WHEN mtv.maxTypeId = 2 THEN 1 -- 仅当类型符合时计数
|
||||
ELSE 0
|
||||
END) AS lineNum,
|
||||
0.0 AS configRate,
|
||||
0.0 AS valueA,
|
||||
0.0 AS valueB,
|
||||
0.0 AS valueC
|
||||
FROM sys_dept sd
|
||||
-- 左连接设备表(过滤有效数据)
|
||||
LEFT JOIN base_address ba ON ba.code = sd.city
|
||||
LEFT JOIN ma_dev_info mdi
|
||||
ON mdi.on_company = sd.dept_id
|
||||
AND mdi.change_status != '4'
|
||||
AND mdi.is_active = '1'
|
||||
AND mdi.entry_status = '1'
|
||||
-- 左连接类型表(不在这里加maxTypeId条件,避免过滤主表)
|
||||
LEFT JOIN ma_type_view mtv
|
||||
ON mtv.typeId = mdi.type_id
|
||||
WHERE sd.del_flag = '0'
|
||||
GROUP BY sd.dept_id, sd.dept_name -- 按部门分组,确保所有部门都被列出
|
||||
ORDER BY totalValue DESC
|
||||
</select>
|
||||
</mapper>
|
||||
|
|
|
|||
|
|
@ -707,6 +707,7 @@
|
|||
LEFT JOIN sys_dept sd ON sd.dept_id = mdi.on_company
|
||||
WHERE mdi.is_active = '1'
|
||||
AND mdi.ma_status IN (1, 2, 3)
|
||||
AND mdi.entry_status = '1'
|
||||
AND mdi.on_company = #{ownCo}
|
||||
</select>
|
||||
<select id="getAddress" resultType="java.util.Map">
|
||||
|
|
@ -791,6 +792,7 @@
|
|||
mtv.maxTypeId IN ('1', '2', '3')
|
||||
and mdi.change_status != '4'
|
||||
and mdi.is_active = '1'
|
||||
AND mdi.entry_status = '1'
|
||||
AND mdi.production_date IS NOT NULL -- 排除无效出厂日期
|
||||
GROUP BY
|
||||
-- 按映射后的目标类型分组(确保结果按line/substation/cable聚合)
|
||||
|
|
@ -829,7 +831,8 @@
|
|||
FROM ma_dev_info mdi
|
||||
INNER JOIN ma_type_view mtv ON mtv.typeId = mdi.type_id
|
||||
WHERE mdi.change_status != '4'
|
||||
and mdi.is_active = '1'
|
||||
AND mdi.is_active = '1'
|
||||
AND mdi.entry_status = '1'
|
||||
and
|
||||
-- 过滤目标proType,只处理需要的三类
|
||||
mtv.maxTypeId IN (#{type})
|
||||
|
|
@ -841,15 +844,16 @@
|
|||
sum(mdi.buy_price) AS price,
|
||||
mtv.devSubcategory AS name
|
||||
FROM ma_dev_info mdi
|
||||
INNER JOIN ma_type_view mtv ON mtv.typeId = mdi.type_id and mdi.change_status != '4' and mdi.is_active ='1'
|
||||
INNER JOIN ma_type_view mtv ON mtv.typeId = mdi.type_id AND mdi.change_status != '4'
|
||||
AND mdi.is_active = '1'
|
||||
AND mdi.entry_status = '1'
|
||||
WHERE
|
||||
-- 过滤目标proType,只处理需要的三类
|
||||
mtv.maxTypeId IN (#{type})
|
||||
|
||||
GROUP BY mtv.devSubcategory
|
||||
|
||||
ORDER BY
|
||||
price DESC
|
||||
ORDER BY price DESC
|
||||
Limit 10
|
||||
</select>
|
||||
<select id="statByTypeAndAgeByCity" resultType="java.util.Map">
|
||||
|
|
@ -871,6 +875,7 @@
|
|||
ON mdi.on_company = sd.dept_id
|
||||
AND mdi.change_status != '4'
|
||||
AND mdi.is_active = '1'
|
||||
AND mdi.entry_status = '1'
|
||||
-- 左连接类型表(不在这里加maxTypeId条件,避免过滤主表)
|
||||
INNER JOIN ma_type_view mtv
|
||||
ON mtv.typeId = mdi.type_id
|
||||
|
|
@ -903,24 +908,28 @@
|
|||
ON mdi.on_company = sd.dept_id
|
||||
AND mdi.change_status != '4'
|
||||
AND mdi.is_active = '1'
|
||||
AND mdi.entry_status = '1'
|
||||
-- 左连接类型表(不在这里加maxTypeId条件,避免过滤主表)
|
||||
INNER JOIN ma_type_view mtv
|
||||
ON mtv.typeId = mdi.type_id
|
||||
ON mtv.typeId = mdi.type_id
|
||||
GROUP BY sd.dept_id, sd.dept_name -- 按部门分组,确保所有部门都被列出
|
||||
ORDER BY count DESC
|
||||
</select>
|
||||
<select id="statByTypeAndAgeByTurnoverRate" resultType="java.util.Map">
|
||||
SELECT DATE_FORMAT(cdcd.use_time, '%Y/%m') AS month,-- 月份
|
||||
SELECT DATE_FORMAT(cdcd.use_time, '%Y/%m') AS month,-- 月份
|
||||
-- 统计不同类型设备的有效使用次数(status为2/3)
|
||||
SUM(CASE WHEN mtv.maxTypeId = 1 AND cdcd.`status` IN (2, 3) THEN 1 ELSE 0 END) AS cableCount,
|
||||
SUM(CASE WHEN mtv.maxTypeId = 3 AND cdcd.`status` IN (2, 3) THEN 1 ELSE 0 END) AS substationCount,
|
||||
SUM(CASE WHEN mtv.maxTypeId = 2 AND cdcd.`status` IN (2, 3) THEN 1 ELSE 0 END) AS lineCount
|
||||
SUM(CASE WHEN mtv.maxTypeId = 1 THEN 1 ELSE 0 END) AS cableCount,
|
||||
SUM(CASE WHEN mtv.maxTypeId = 3 THEN 1 ELSE 0 END) AS substationCount,
|
||||
SUM(CASE WHEN mtv.maxTypeId = 2 THEN 1 ELSE 0 END) AS lineCount
|
||||
FROM cs_device_change_details cdcd -- 左连接设备表(过滤有效设备)
|
||||
LEFT JOIN ma_dev_info mdi ON cdcd.dev_id = mdi.ma_id -- 关联设备ID
|
||||
LEFT JOIN ma_dev_info mdi ON cdcd.dev_code = mdi.code -- 关联设备ID
|
||||
AND mdi.change_status != '4'
|
||||
AND mdi.is_active = '1' -- 左连接类型表(获取设备类型)
|
||||
AND mdi.is_active = '1'
|
||||
AND mdi.entry_status = '1'
|
||||
LEFT JOIN cs_device_change cdc ON cdc.id = cdcd.change_id AND cdc.type = '2'
|
||||
INNER JOIN ma_type_view mtv ON mtv.typeId = mdi.type_id -- 过滤无效的使用时间(可选,避免NULL的月份)
|
||||
WHERE cdcd.use_time IS NOT NULL
|
||||
AND cdcd.del_flag = '0'
|
||||
AND mdi.ma_id IS NOT NULL -- 按「设备ID+月份」分组(核心修正)
|
||||
|
||||
GROUP BY DATE_FORMAT(cdcd.use_time, '%Y/%m') -- 按月份和设备ID排序,结果更清晰
|
||||
|
|
|
|||
|
|
@ -615,34 +615,32 @@
|
|||
</if>
|
||||
</select>
|
||||
<select id="getUsageStatistics" resultType="java.util.Map">
|
||||
-- 按装备小类统计:小类在用率 + 近12个月每月出库次数(无记录时显示0)
|
||||
|
||||
SELECT
|
||||
-- 装备小类ID(兼容两边的小类标识,避免NULL)
|
||||
|
||||
COALESCE(ur.device_id, oc.device_id) AS name,
|
||||
-- 小类整体在用率(保留2位小数)
|
||||
|
||||
ur.use_rate_percent AS proportion,
|
||||
-- 近12个月每月出库次数(无记录时默认0)
|
||||
|
||||
IFNULL(oc.monthly_outbound_count, 0) AS turnoverRate
|
||||
FROM (
|
||||
-- 子查询1:按小类统计在用率
|
||||
|
||||
SELECT
|
||||
mtv.devSubcategory AS device_id, -- 装备小类(如“电缆小类A”)
|
||||
-- 计算小类的整体在用率:小类内所有设备的在用天数 / 总记录天数
|
||||
mtv.devSubcategory AS device_id,
|
||||
|
||||
ROUND(
|
||||
IF(
|
||||
-- 小类总记录天数(去重所有设备的记录日期)
|
||||
COUNT(DISTINCT DATE(mddu.create_time), mdi.ma_id) = 0, -- 精确到“设备+日期”去重
|
||||
COUNT(DISTINCT DATE(mddu.create_time), mdi.ma_id) = 0,
|
||||
0,
|
||||
-- 小类内所有设备的在用天数(状态=1的“设备+日期”去重计数)
|
||||
|
||||
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
|
||||
-- 关联类型视图,获取小类(devSubcategory)和大类(maxTypeId=5080)
|
||||
INNER JOIN ma_type_view mtv ON mtv.typeId = mdi.type_id
|
||||
WHERE
|
||||
mdi.is_active = '1'
|
||||
|
|
@ -651,31 +649,28 @@
|
|||
<if test="type != null and type != 0">
|
||||
AND mtv.maxTypeId = #{type}
|
||||
</if>
|
||||
GROUP BY mtv.devSubcategory -- 按小类分组
|
||||
) AS ur -- ur = use_rate(小类在用率)
|
||||
-- 关联小类的出库记录统计
|
||||
GROUP BY mtv.devSubcategory
|
||||
) AS ur
|
||||
|
||||
LEFT JOIN (
|
||||
-- 子查询2:按小类统计近12个月每月出库次数
|
||||
|
||||
SELECT
|
||||
mtv.devSubcategory AS device_id, -- 装备小类
|
||||
DATE_FORMAT(cdcd.use_time, '%Y-%m') AS stat_year_month, -- 统计年月
|
||||
COUNT(*) AS monthly_outbound_count -- 当月出库次数(小类内所有设备)
|
||||
mtv.devSubcategory AS device_id,
|
||||
DATE_FORMAT(cdcd.use_time, '%Y-%m') AS stat_year_month,
|
||||
COUNT(*) AS monthly_outbound_count
|
||||
FROM cs_device_change_details cdcd
|
||||
-- 关联设备信息表,筛选有效设备
|
||||
LEFT JOIN ma_dev_info mdi ON mdi.code = cdcd.dev_code
|
||||
-- 关联类型视图,限定小类和大类
|
||||
INNER JOIN ma_type_view mtv ON mtv.typeId = mdi.type_id
|
||||
WHERE
|
||||
cdcd.`use_time` is not null and cdcd.is_finished='1' -- 出库状态
|
||||
cdcd.`use_time` is not null and cdcd.is_finished='1'
|
||||
AND mdi.is_active = '1'
|
||||
AND cdcd.use_time >= DATE_SUB(CURDATE(), INTERVAL 12 MONTH) -- 近12个月
|
||||
AND cdcd.use_time >= DATE_SUB(CURDATE(), INTERVAL 12 MONTH)
|
||||
<if test="type != null and type != 0">
|
||||
AND mtv.maxTypeId = #{type}
|
||||
</if>
|
||||
GROUP BY mtv.devSubcategory, DATE_FORMAT(cdcd.use_time, '%Y-%m') -- 按小类+年月分组
|
||||
) AS oc -- oc = outbound_count(小类出库次数)
|
||||
ON ur.device_id = oc.device_id -- 按小类关联
|
||||
-- 排序:先小类,再年月倒序(最新月份在前)
|
||||
GROUP BY mtv.devSubcategory, DATE_FORMAT(cdcd.use_time, '%Y-%m')
|
||||
) AS oc
|
||||
ON ur.device_id = oc.device_id
|
||||
ORDER BY
|
||||
proportion DESC
|
||||
LIMIT 5
|
||||
|
|
@ -712,60 +707,53 @@
|
|||
-- 关联出库记录子查询
|
||||
LEFT JOIN (
|
||||
-- 子查询2:计算近12个月每月出库次数
|
||||
SELECT cdcd.dev_id AS device_id,
|
||||
SELECT mdi.ma_id AS device_id,
|
||||
mdi.device_name AS name,
|
||||
DATE_FORMAT(cdcd.use_time, '%Y-%m') AS stat_year_month,
|
||||
COUNT(*) AS monthly_outbound_count
|
||||
FROM cs_device_change_details cdcd
|
||||
LEFT JOIN ma_dev_info mdi ON mdi.ma_id = cdcd.dev_id
|
||||
WHERE cdcd.`use_time` is not null -- 出库状态
|
||||
AND mdi.is_active = '1'
|
||||
LEFT JOIN ma_dev_info mdi ON mdi.code = cdcd.dev_code
|
||||
LEFT JOIN cs_device_change cdc ON cdc.id = cdcd.change_id AND cdc.type = '2'
|
||||
WHERE mdi.is_active = '1'
|
||||
AND mdi.change_status != '4'
|
||||
AND mdi.entry_status = '1'
|
||||
AND cdcd.use_time >= DATE_SUB(CURDATE(), INTERVAL 12 MONTH)
|
||||
GROUP BY cdcd.dev_id, DATE_FORMAT(cdcd.use_time, '%Y-%m')) AS oc ON ur.device_id = oc.device_id
|
||||
GROUP BY cdcd.dev_code, DATE_FORMAT(cdcd.use_time, '%Y-%m')) AS oc ON ur.device_id = oc.device_id
|
||||
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整数,每个工程仅生成1次,与分组绑定)
|
||||
FLOOR(RAND() * (100 - 60 + 1) + 60) AS scale,
|
||||
-- 装备使用率:装备数/规模×100(保留2位小数,除数/装备数为0时显示0)
|
||||
ROUND(
|
||||
IF(
|
||||
COUNT(DISTINCT mdi.ma_id) = 0 OR FLOOR(RAND() * (100 - 60 + 1) + 60) = 0,
|
||||
0,
|
||||
-- 复用随机数逻辑:用 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
|
||||
-- 左连接设备表:保留所有工程,无设备则 inUser=0
|
||||
LEFT JOIN ma_dev_info mdi
|
||||
ON mdi.on_project = jsp.pro_code
|
||||
-- 设备筛选条件写在 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 test="proCode != null and proCode.size() > 0">
|
||||
AND jsp.voltage IN
|
||||
<foreach collection="proCode" item="code" open="(" separator="," close=")">
|
||||
#{code}
|
||||
</foreach>
|
||||
</if>
|
||||
<if test="proType != null and proType != ''">
|
||||
AND jsp.project_type = #{proType}
|
||||
</if>
|
||||
</where>
|
||||
-- 按工程唯一标识分组(核心去重:确保每个工程仅1行记录)
|
||||
GROUP BY jsp.pro_code, jsp.pro_name
|
||||
-- 排序:按使用率降序,设备数量降序
|
||||
ORDER BY `usage` DESC, inUser DESC
|
||||
</select>
|
||||
<select id="getProNum" resultType="java.lang.Integer">
|
||||
|
|
|
|||
Loading…
Reference in New Issue