联动设置/故障分级/二合一

parent 437999e3
......@@ -541,8 +541,8 @@ const FAN_SPEED_MAP: Record<number, string> = {
export async function deviceData() {
console.log('[设备数据集成] 开始执行...');
try {
await integrateAcDeviceData();
await integrateMeterDeviceData();
await integrateAcDeviceData(); // 空调设备
await integrateMeterDeviceData(); // 电表设备
// 电费数据集成:拉取当天房间电费日使用详情,按 deviceTime 去重后写入 device_expansion
await saveRoomExpensesToExpansion(getTodayDateStr(), '电能监测');
console.log('[设备数据集成] 完成');
......@@ -795,9 +795,10 @@ export async function alertWorkData() {
return;
}
const todayDate = getTodayDateStr();
try {
// 1. 拉取最近 100 条故障记录(不再限制当天)
const result = await getIndoorUnitAlarmErrorHis({ page: 1, limit: 100 });
const result = await getIndoorUnitAlarmErrorHis({ page: 1, limit: 100, occurrenceTime: todayDate });
const rows: any[] = result?.rows || [];
console.log(`[预警工单集成] 获取 ${rows.length} 条故障记录`);
......@@ -831,7 +832,7 @@ export async function alertWorkData() {
// 4. 收集所有故障码,批量查询故障详情(缓存去重)
const alarmCodes = [...new Set(rows.map((r: any) => r.alarmCode).filter(Boolean))] as string[];
const faultInfoMap = new Map<string, { errorInfo: string; scheme: string | null }>();
const faultInfoMap = new Map<string, { errorInfo: string; scheme: string | null; faultLevel: string }>();
if (alarmCodes.length > 0) {
console.log(`[预警工单集成] 查询 ${alarmCodes.length} 个不同故障码的详情...`);
const infoResults = await Promise.all(
......@@ -867,6 +868,12 @@ export async function alertWorkData() {
&& faultInfo.errorInfo !== r.alarmCode
&& faultInfo.errorInfo !== '查询失败';
const errorMsg = faultFound ? faultInfo.errorInfo : '未找到主内机';
// faultLevel → 工单 level:故障=1级、警示=2级、提示=3级;未设置/未查到时默认 2级
const faultLevel = faultInfo ? faultInfo.faultLevel || '' : '';
let level = 2;
if (faultLevel === '故障') level = 1;
else if (faultLevel === '警示') level = 2;
else if (faultLevel === '提示') level = 3;
toInsert.push({
device_id: deviceId,
......@@ -875,7 +882,7 @@ export async function alertWorkData() {
fault_description: errorMsg,
fault_origin_id: r.indoorUnitAlarmId,
occurred_time: r.deviceTime ? new Date(r.deviceTime) : new Date(),
level: 2,
level,
status: 0,
});
}
......
......@@ -921,20 +921,32 @@ export async function getDeviceEnergyList(regionGroup?: string, regionType?: str
}
}
// 5. 组装返回(仅返回有能耗数据的区域)
const dataList = Object.keys(agg)
// 5. 组装返回(仅返回有能耗数据的区域,昨日/今日分离为两条记录)
const dataList: any[] = [];
Object.keys(agg)
.map((rkStr) => Number(rkStr))
.filter((rk) => regionMap[rk])
.map((rk) => {
.sort((a, b) => a - b)
.forEach((rk) => {
const region = regionMap[rk];
return {
const regionName = [region.groups, region.type, region.name].filter(Boolean).join('_');
const yesterdayEnergy = Math.round(agg[rk].yesterdayEnergy * 100) / 100;
const todayEnergy = Math.round(agg[rk].todayEnergy * 100) / 100;
// 昨日记录
dataList.push({
series: '昨日',
regionKey: rk,
regionName: [region.groups, region.type, region.name].filter(Boolean).join('_'),
yesterdayEnergy: Math.round(agg[rk].yesterdayEnergy * 100) / 100,
todayEnergy: Math.round(agg[rk].todayEnergy * 100) / 100
};
})
.sort((a, b) => a.regionKey - b.regionKey);
regionName,
yesterdayEnergy
});
// 今日记录
dataList.push({
series: '今日',
regionKey: rk,
regionName,
todayEnergy
});
});
return { total: dataList.length, dataList };
}
......
import { selectPaginatedDataWithOrder } from "../data/findData";
import { selectPaginatedDataWithOrder, selectDataListByParam } from "../data/findData";
import { TABLENAME } from "../config/dbEnum";
/** 故障等级映射 */
......@@ -60,10 +60,41 @@ export async function getDeviceFaultList(params: AlertWorkOrderQueryParams) {
[["created_at", "DESC"]],
);
// 通过设备编号查询所属区域,拼接 regionName(groups_type_name)
const rows = (result.data as any[]) || [];
const deviceIds = [...new Set(rows.map((item: any) => item.device_id).filter(Boolean))];
const deviceRegionNameMap: { [deviceId: string]: string } = {};
if (deviceIds.length > 0) {
const deviceResult = await selectDataListByParam(
TABLENAME.设备表,
{ device_id: { "%in%": deviceIds } },
["device_id", "region_key"]
);
const regionKeys = [...new Set((deviceResult.data || []).map((d: any) => d.region_key).filter(Boolean))];
const regionMap: { [id: number]: any } = {};
if (regionKeys.length > 0) {
const regionResult = await selectDataListByParam(
TABLENAME.区域表,
{ id: { "%in%": regionKeys } },
["id", "groups", "type", "name"]
);
(regionResult.data || []).forEach((r: any) => {
regionMap[r.id] = r;
});
}
(deviceResult.data || []).forEach((d: any) => {
const region = regionMap[d.region_key];
deviceRegionNameMap[d.device_id] = region
? [region.groups, region.type, region.name].filter(Boolean).join('_')
: '';
});
}
// 映射中文名
const list = (result.data as any[]).map((item: any) => ({
const list = rows.map((item: any) => ({
id: item.id,
device_id: item.device_id || '',
regionName: deviceRegionNameMap[item.device_id] || '',
fault_type: item.fault_type || '',
fault_code: item.fault_code || '',
fault_description: item.fault_description || '',
......@@ -74,7 +105,7 @@ export async function getDeviceFaultList(params: AlertWorkOrderQueryParams) {
status: item.status,
statusName: statusMap[item.status] || '未知',
order_address: '', // 预留:工单地址,todo
order_send: 'on', // 预留:工单推送,默认 on,todo
order_send: item.level === 1 ? 'on' : 'off', // 工单推送:一级推送 on,其他 off
}));
return {
......
......@@ -68,7 +68,9 @@ export async function getLinkageList(params: {
TABLENAME.设备联动调节表,
queryParam,
["id", "device_id", "linkage_type", "threshold_max", "threshold_min", "threshold_mid",
"setting_max", "setting_min", "setting_mid", "divide_method", "begin_validity", "end_validity", "created_at", "updated_at"],
"setting_max", "setting_min", "setting_mid",
"fan_speed_max", "fan_speed_mid", "fan_speed_min", "is_use",
"divide_method", "begin_validity", "end_validity", "created_at", "updated_at"],
pageNumber,
pageSize,
[["id", "DESC"]],
......@@ -101,6 +103,10 @@ export async function getLinkageList(params: {
settingMax: item.setting_max ?? '',
settingMin: item.setting_min ?? '',
settingMid: item.setting_mid ?? '',
fanSpeedMax: item.fan_speed_max ?? '',
fanSpeedMid: item.fan_speed_mid ?? '',
fanSpeedMin: item.fan_speed_min ?? '',
isUse: item.is_use ?? 'on',
divideMethod: item.divide_method || '',
beginValidity: item.begin_validity
? (typeof item.begin_validity === "string" ? item.begin_validity : formatLocalTime(new Date(item.begin_validity)))
......@@ -134,7 +140,9 @@ export async function getLinkageDetail(id: number): Promise<any> {
TABLENAME.设备联动调节表,
{ id },
["id", "device_id", "linkage_type", "threshold_max", "threshold_min", "threshold_mid",
"setting_max", "setting_min", "setting_mid", "divide_method", "begin_validity", "end_validity", "created_at", "updated_at"]
"setting_max", "setting_min", "setting_mid",
"fan_speed_max", "fan_speed_mid", "fan_speed_min", "is_use",
"divide_method", "begin_validity", "end_validity", "created_at", "updated_at"]
);
const rows: any[] = res.data || [];
if (rows.length === 0) {
......@@ -167,6 +175,10 @@ export async function getLinkageDetail(id: number): Promise<any> {
settingMax: item.setting_max ?? '',
settingMin: item.setting_min ?? '',
settingMid: item.setting_mid ?? '',
fanSpeedMax: item.fan_speed_max ?? '',
fanSpeedMid: item.fan_speed_mid ?? '',
fanSpeedMin: item.fan_speed_min ?? '',
isUse: item.is_use ?? 'on',
divideMethod: item.divide_method || '',
beginValidity: item.begin_validity
? (typeof item.begin_validity === "string" ? item.begin_validity : formatLocalTime(new Date(item.begin_validity)))
......@@ -200,6 +212,9 @@ export async function addLinkage(params: {
settingMax?: string;
settingMin?: string;
settingMid?: string;
fanSpeedMax?: string;
fanSpeedMid?: string;
fanSpeedMin?: string;
divideMethod?: string;
beginValidity?: string;
endValidity?: string;
......@@ -228,6 +243,10 @@ export async function addLinkage(params: {
setting_max: params.settingMax ?? null,
setting_min: params.settingMin ?? null,
setting_mid: params.settingMid ?? null,
fan_speed_max: params.fanSpeedMax ?? null,
fan_speed_mid: params.fanSpeedMid ?? null,
fan_speed_min: params.fanSpeedMin ?? null,
is_use: 'on', // 新增默认启用
divide_method: params.divideMethod ?? null,
begin_validity: params.beginValidity || null,
end_validity: params.endValidity || null,
......@@ -253,6 +272,9 @@ export async function batchAddLinkage(params: {
settingMax?: string;
settingMin?: string;
settingMid?: string;
fanSpeedMax?: string;
fanSpeedMid?: string;
fanSpeedMin?: string;
divideMethod?: string;
beginValidity?: string;
endValidity?: string;
......@@ -291,6 +313,10 @@ export async function batchAddLinkage(params: {
setting_max: params.settingMax ?? null,
setting_min: params.settingMin ?? null,
setting_mid: params.settingMid ?? null,
fan_speed_max: params.fanSpeedMax ?? null,
fan_speed_mid: params.fanSpeedMid ?? null,
fan_speed_min: params.fanSpeedMin ?? null,
is_use: 'on', // 新增默认启用
divide_method: params.divideMethod ?? null,
begin_validity: params.beginValidity || null,
end_validity: params.endValidity || null,
......@@ -317,6 +343,10 @@ export async function editLinkage(params: {
settingMax?: string;
settingMin?: string;
settingMid?: string;
fanSpeedMax?: string;
fanSpeedMid?: string;
fanSpeedMin?: string;
isUse?: string;
divideMethod?: string;
beginValidity?: string;
endValidity?: string;
......@@ -340,6 +370,10 @@ export async function editLinkage(params: {
if (params.settingMax !== undefined) dbEdits.setting_max = params.settingMax;
if (params.settingMin !== undefined) dbEdits.setting_min = params.settingMin;
if (params.settingMid !== undefined) dbEdits.setting_mid = params.settingMid;
if (params.fanSpeedMax !== undefined) dbEdits.fan_speed_max = params.fanSpeedMax;
if (params.fanSpeedMid !== undefined) dbEdits.fan_speed_mid = params.fanSpeedMid;
if (params.fanSpeedMin !== undefined) dbEdits.fan_speed_min = params.fanSpeedMin;
if (params.isUse !== undefined) dbEdits.is_use = params.isUse;
if (params.divideMethod !== undefined) dbEdits.divide_method = params.divideMethod;
if (params.beginValidity !== undefined) dbEdits.begin_validity = params.beginValidity || null;
if (params.endValidity !== undefined) dbEdits.end_validity = params.endValidity || null;
......
......@@ -578,9 +578,9 @@ export async function getIndoorUnitAlarmErrorHis(params: any): Promise<any> {
* 接口文档:空调故障码对接服务与解析流程.pdf
* @param brandCode 品牌编码,如 "1"=日立
* @param errorCode 错误编码,如 "LOST"
* @returns { errorInfo: string, scheme: string | null } 故障信息描述、解决方案
* @returns { errorInfo: string, scheme: string | null, faultLevel: string } 故障信息描述、解决方案、故障等级(故障/警示/提示,未设置返回空字符串)
*/
export async function getFaultCodeInfo(brandCode: string, errorCode: string): Promise<{ errorInfo: string; scheme: string | null }> {
export async function getFaultCodeInfo(brandCode: string, errorCode: string): Promise<{ errorInfo: string; scheme: string | null; faultLevel: string }> {
const url = 'https://errorcode.feiyikj.cn/prod-api/feiyi/app/errorCode/info';
const query = { brandCode, errorCode };
let result: any;
......@@ -588,20 +588,21 @@ export async function getFaultCodeInfo(brandCode: string, errorCode: string): Pr
result = await get(url, query);
} catch (err) {
console.error(`[故障码查询] 请求失败 brandCode=${brandCode} errorCode=${errorCode}:`, err);
return { errorInfo: '查询失败', scheme: null };
return { errorInfo: '查询失败', scheme: null, faultLevel: '' };
}
if (!result || result.code !== 200) {
console.error(`[故障码查询] 接口返回异常 brandCode=${brandCode} errorCode=${errorCode}:`, result);
return { errorInfo: '查询失败', scheme: null };
return { errorInfo: '查询失败', scheme: null, faultLevel: '' };
}
const data = result.data || [];
if (data.length === 0) {
console.warn(`[故障码查询] 未查到故障码信息 brandCode=${brandCode} errorCode=${errorCode}`);
return { errorInfo: errorCode, scheme: null };
return { errorInfo: errorCode, scheme: null, faultLevel: '' };
}
return {
errorInfo: data[0].errorInfo || errorCode,
scheme: data[0].scheme || null,
faultLevel: data[0].faultLevel || '',
};
}
......
......@@ -25,6 +25,8 @@ import { systemConfig } from "../config/serverConfig";
* "temperature": 22.5,
* "tvoc": 1.56
* }
*
* 消息示例2:{"applicationID":1,"battery":100,"cellularIP":"0.0.0.0","devEUI":"24e12472506d8c79","deviceName":"cgq14","gatewayTime":"2026-09-03T09:41:18+08:00","humidity":51,"temperature":22.7}
*/
export async function processDeviceData(message) {
const requestTime = new Date();
......
......@@ -499,7 +499,7 @@ export async function getRunAnalysis(regionGroup: string, regionType: string) {
device_id: f.device_id || '',
faultCode: f.fault_code || '',
order_address: deviceOrderAddressMap.get(deviceRegionKeyMap.get(f.device_id)?.toString()) || '',
order_send: 'on', // TODO: 后续需要实现工单推送的实际逻辑
order_send: f.level === 1 ? 'on' : 'off', // 工单推送:一级推送 on,其他 off
}));
// } else {
// alertWorkOrders = sortedFaults.map((f: any) => ({
......@@ -934,7 +934,7 @@ export async function getAcRunningPop(regionKey: number, deviceId: string) {
let deviceType = devices?.data[0].device_type;
if (deviceType !== "环境监测") {
if (deviceType !== "环境监测" && deviceType !== "温湿监测") {
// 通过飞奕内机列表获取实时设备数据
let detailData = await getIndoorUnitStatus(deviceId);
detailData.fanSpeed = detailData && detailData.fanSpeed ? acDeviceKeyMap[detailData.fanSpeed] : 2;
......@@ -1147,14 +1147,19 @@ async function findEffectiveLinkage(deviceId: string, deviceType: string): Promi
const res = await selectDataListByParam(
TABLENAME.设备联动调节表,
{ device_id: deviceId },
["id", "device_id", "linkage_type", "threshold_max", "threshold_min", "begin_validity", "end_validity"]
["id", "device_id", "linkage_type",
"threshold_max", "threshold_min", "threshold_mid",
"setting_max", "setting_min", "setting_mid",
"fan_speed_max", "fan_speed_mid", "fan_speed_min", "is_use",
"begin_validity", "end_validity"]
);
const rows: any[] = res.data || [];
if (rows.length === 0) return null;
const now = new Date();
// 过滤有效期内的配置
// 过滤有效期 + 启用(is_use=on)的配置
const valid = rows.filter((r: any) => {
if (r.is_use === 'off') return false;
const begin = r.begin_validity ? new Date(r.begin_validity) : null;
const end = r.end_validity ? new Date(r.end_validity) : null;
if (begin && begin > now) return false;
......@@ -1299,7 +1304,48 @@ console.log(`若是空调设备,判断联动是否开启 ${acDevices.data.leng
console.log(`空调联动设备按日程过滤后 ${acDevices.data.length} 台参与控制`);
}
if (acDevices.data.length > 0) {
const { tempSet, fanSpeed, onOff } = calcAcTempSet(temperature, season);
// ===== 自动联动温度计算:写死三段式改为查询联动表(device_linkage) =====
// 注释原写死调用(保留 calcAcTempSet 作为无配置兜底,不删除)
// const { tempSet, fanSpeed, onOff } = calcAcTempSet(temperature, season);
let tempSet: number, fanSpeed: number, onOff: number;
let linkageConf: any = null;
// 遍历本区域空调,取第一台存在有效联动配置的设备(按 制冷/制热 类型匹配当前季节)
for (const ac of acDevices.data) {
linkageConf = await findEffectiveLinkage(ac.device_id, '空调');
if (linkageConf) break;
}
if (linkageConf
&& Number.isFinite(Number(linkageConf.threshold_max)) && Number.isFinite(Number(linkageConf.threshold_min))
&& Number.isFinite(Number(linkageConf.setting_max)) && Number.isFinite(Number(linkageConf.setting_min)) && Number.isFinite(Number(linkageConf.setting_mid))) {
const tMax = Number(linkageConf.threshold_max);
const tMin = Number(linkageConf.threshold_min);
const sMax = Number(linkageConf.setting_max);
const sMin = Number(linkageConf.setting_min);
const sMid = Number(linkageConf.setting_mid);
// 风速档位:1 高风 2 中风 4 低风(联动表未配置时兜底 2 中风)
const fMax = Number.isFinite(Number(linkageConf.fan_speed_max)) ? Number(linkageConf.fan_speed_max) : 2;
const fMid = Number.isFinite(Number(linkageConf.fan_speed_mid)) ? Number(linkageConf.fan_speed_mid) : 2;
const fMin = Number.isFinite(Number(linkageConf.fan_speed_min)) ? Number(linkageConf.fan_speed_min) : 2;
// 制冷(夏季):temperature >= threshold_max → setting_max + fan_speed_max;中间 → setting_mid + fan_speed_mid;< threshold_min → setting_min + fan_speed_min
// 制热(冬季):temperature > threshold_max → setting_max + fan_speed_max;中间 → setting_mid + fan_speed_mid;<= threshold_min → setting_min + fan_speed_min
if (season === 'summer') {
if (temperature >= tMax) { tempSet = sMax; fanSpeed = fMax; }
else if (temperature < tMin) { tempSet = sMin; fanSpeed = fMin; }
else { tempSet = sMid; fanSpeed = fMid; }
} else {
if (temperature > tMax) { tempSet = sMax; fanSpeed = fMax; }
else if (temperature <= tMin) { tempSet = sMin; fanSpeed = fMin; }
else { tempSet = sMid; fanSpeed = fMid; }
}
onOff = 1; // 默认开机
console.log(`空调联动使用联动表配置: device=${linkageConf.device_id}, type=${linkageConf.linkage_type}, 室温${temperature}℃ → 设定${tempSet}℃ 风速${fanSpeed}`);
} else {
// 无有效联动配置,回退原写死三段式
const fallback = calcAcTempSet(temperature, season);
tempSet = fallback.tempSet;
fanSpeed = fallback.fanSpeed;
onOff = fallback.onOff;
}
const workMode = season === 'summer' ? 1 : 2; // 1制冷 2制热
const modeName = season === 'summer' ? '制冷' : '制热';
......
......@@ -601,6 +601,27 @@ export const TablesConfig = [
allowNull: true,
comment: '中间设置:处于阈值区间内的设定值'
},
fan_speed_max: {
type: DataTypes.STRING(20),
allowNull: true,
comment: '上限风速:高于阈值上限时的风速档位'
},
fan_speed_mid: {
type: DataTypes.STRING(20),
allowNull: true,
comment: '中间风速:处于阈值区间内的风速档位'
},
fan_speed_min: {
type: DataTypes.STRING(20),
allowNull: true,
comment: '下限风速:低于阈值下限时的风速档位'
},
is_use: {
type: DataTypes.STRING(20),
allowNull: true,
defaultValue: 'on',
comment: '是否启用:on启用/off停用'
},
divide_method: {
type: DataTypes.STRING(50),
allowNull: true,
......
......@@ -19,7 +19,7 @@ async function lanuch() {
/**创建http服务 */
httpServer.createServer(systemConfig.port);
/**启动MQTT订阅服务 */
// await mqttSrv.startMqttClient();
await mqttSrv.startMqttClient();
/**启动定时任务 */
startSchedule();
/**启动预警工单定时任务(10分钟) */
......
......@@ -553,12 +553,15 @@ async function addLinkage(req, res) {
settingMax: 'String',
settingMin: 'String',
settingMid: 'String',
fanSpeedMax: 'String',
fanSpeedMid: 'String',
fanSpeedMin: 'String',
divideMethod: 'String',
beginValidity: 'Date',
endValidity: 'Date',
};
const NotMustHaveKeys = ["thresholdMax", "thresholdMin", "thresholdMid", "settingMax", "settingMin", "settingMid", "divideMethod", "beginValidity", "endValidity"];
let { deviceId, linkageType, thresholdMax, thresholdMin, thresholdMid, settingMax, settingMin, settingMid, divideMethod, beginValidity, endValidity } =
const NotMustHaveKeys = ["thresholdMax", "thresholdMin", "thresholdMid", "settingMax", "settingMin", "settingMid", "fanSpeedMax", "fanSpeedMid", "fanSpeedMin", "divideMethod", "beginValidity", "endValidity"];
let { deviceId, linkageType, thresholdMax, thresholdMin, thresholdMid, settingMax, settingMin, settingMid, fanSpeedMax, fanSpeedMid, fanSpeedMin, divideMethod, beginValidity, endValidity } =
eccReqParamater(reqConf, req.body, NotMustHaveKeys);
if (!deviceId || !linkageType) {
res.error("缺少必填参数:deviceId, linkageType");
......@@ -573,6 +576,9 @@ async function addLinkage(req, res) {
settingMax: settingMax ?? undefined,
settingMin: settingMin ?? undefined,
settingMid: settingMid ?? undefined,
fanSpeedMax: fanSpeedMax ?? undefined,
fanSpeedMid: fanSpeedMid ?? undefined,
fanSpeedMin: fanSpeedMin ?? undefined,
divideMethod: divideMethod ?? undefined,
beginValidity: beginValidity ?? undefined,
endValidity: endValidity ?? undefined,
......@@ -596,12 +602,15 @@ async function batchAddLinkage(req, res) {
settingMax: 'String',
settingMin: 'String',
settingMid: 'String',
fanSpeedMax: 'String',
fanSpeedMid: 'String',
fanSpeedMin: 'String',
divideMethod: 'String',
beginValidity: 'Date',
endValidity: 'Date',
};
const NotMustHaveKeys = ["thresholdMax", "thresholdMin", "thresholdMid", "settingMax", "settingMin", "settingMid", "divideMethod", "beginValidity", "endValidity"];
let { deviceIds, linkageType, thresholdMax, thresholdMin, thresholdMid, settingMax, settingMin, settingMid, divideMethod, beginValidity, endValidity } =
const NotMustHaveKeys = ["thresholdMax", "thresholdMin", "thresholdMid", "settingMax", "settingMin", "settingMid", "fanSpeedMax", "fanSpeedMid", "fanSpeedMin", "divideMethod", "beginValidity", "endValidity"];
let { deviceIds, linkageType, thresholdMax, thresholdMin, thresholdMid, settingMax, settingMin, settingMid, fanSpeedMax, fanSpeedMid, fanSpeedMin, divideMethod, beginValidity, endValidity } =
eccReqParamater(reqConf, req.body, NotMustHaveKeys);
if (!deviceIds || !Array.isArray(deviceIds) || deviceIds.length === 0 || !linkageType) {
res.error("缺少必填参数:deviceIds, linkageType");
......@@ -616,6 +625,9 @@ async function batchAddLinkage(req, res) {
settingMax: settingMax ?? undefined,
settingMin: settingMin ?? undefined,
settingMid: settingMid ?? undefined,
fanSpeedMax: fanSpeedMax ?? undefined,
fanSpeedMid: fanSpeedMid ?? undefined,
fanSpeedMin: fanSpeedMin ?? undefined,
divideMethod: divideMethod ?? undefined,
beginValidity: beginValidity ?? undefined,
endValidity: endValidity ?? undefined,
......@@ -639,12 +651,16 @@ async function editLinkage(req, res) {
settingMax: 'String',
settingMin: 'String',
settingMid: 'String',
fanSpeedMax: 'String',
fanSpeedMid: 'String',
fanSpeedMin: 'String',
isUse: 'String',
divideMethod: 'String',
beginValidity: 'Date',
endValidity: 'Date',
};
const NotMustHaveKeys = ["deviceId", "linkageType", "thresholdMax", "thresholdMin", "thresholdMid", "settingMax", "settingMin", "settingMid", "divideMethod", "beginValidity", "endValidity"];
let { id, deviceId, linkageType, thresholdMax, thresholdMin, thresholdMid, settingMax, settingMin, settingMid, divideMethod, beginValidity, endValidity } = eccReqParamater(reqConf, req.body, NotMustHaveKeys);
const NotMustHaveKeys = ["deviceId", "linkageType", "thresholdMax", "thresholdMin", "thresholdMid", "settingMax", "settingMin", "settingMid", "fanSpeedMax", "fanSpeedMid", "fanSpeedMin", "isUse", "divideMethod", "beginValidity", "endValidity"];
let { id, deviceId, linkageType, thresholdMax, thresholdMin, thresholdMid, settingMax, settingMin, settingMid, fanSpeedMax, fanSpeedMid, fanSpeedMin, isUse, divideMethod, beginValidity, endValidity } = eccReqParamater(reqConf, req.body, NotMustHaveKeys);
if (!id) {
res.error("缺少必填参数:id");
return;
......@@ -659,6 +675,10 @@ async function editLinkage(req, res) {
settingMax: settingMax ?? undefined,
settingMin: settingMin ?? undefined,
settingMid: settingMid ?? undefined,
fanSpeedMax: fanSpeedMax ?? undefined,
fanSpeedMid: fanSpeedMid ?? undefined,
fanSpeedMin: fanSpeedMin ?? undefined,
isUse: isUse ?? undefined,
divideMethod: divideMethod ?? undefined,
beginValidity: beginValidity ?? undefined,
endValidity: endValidity ?? undefined,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment