问题修改

This commit is contained in:
jiang 2025-11-25 19:08:55 +08:00
parent bc6a0b6195
commit 5cf0ce7ec5
11 changed files with 124 additions and 169 deletions

View File

@ -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);
}

View File

@ -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);
/**
* 修改详情

View File

@ -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);

View File

@ -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) {

View File

@ -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);

View File

@ -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);
}

View File

@ -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);

View File

@ -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">

View File

@ -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>

View File

@ -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排序结果更清晰

View File

@ -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">