| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241 | #include "stdafx.h"#include "HttpPrcess.h"#include <yyjson.h>#include <Simplelog.h>#include "MonitorObject.h"#include "AlarmDefine.h"#include <crc32.h>#include "AppService.h"#include <gbk2utf8.h>#include "Device.h"#include "ResistAlarm.h"//处理get请求总入口void DealHttpGet(const httplib::Request& req, httplib::Response& res){	int code = 500;	auto start = chrono::steady_clock::now();	auto token = req.get_header_value("token");	if (token.length() == 0 || token.empty())		token = req.get_header_value("Authorization");	char* json = nullptr;	string body;	size_t json_len = 0;	SPDLOG_INFO("[HTTP][GET][START] {}:{} {}", req.remote_addr, req.remote_port, req.target);	try	{		if (token.empty())		{			code = 401;		}		if (req.path.find("option_svg") != -1)			code = DealOptionSvgData(req, token, res);		else if (req.path.find("get_svg") != -1)			code = DealGetSvgData(req, token, res);		else if (req.path.find("get_mp_stat") != -1)			code = DealGetMpStat(req, token, res);		else if (req.path.find("conf_read/mitie_lock") != -1)			code = DealGetMitieLock(req, token, &json, &json_len);		else if (req.path.find("conf_read/convert_resist") != -1)			code = DealGetConvertResist(req, token, &json, &json_len);		else if (req.path.find("resistance_curve") != -1)			code = DealGetResistCurve(req, token, &json, &json_len);		else if (req.path.find("resistance_report") != -1)			code = DealGetResistReport(req, token, &json, &json_len);		else if (req.path.find("move_info") != -1)			code = DealGetMoveInfo(req, token, &json, &json_len);		else if (req.path.find("operation_log") != -1)			code = DealGetOptLog(req, token, &json, &json_len);		else if (req.path.find("refer_curve") != -1)			code = DealGetrefer_curve(req, token, &json, &json_len);		else if (req.path.find("refer_option") != -1)			code = DealGetrefer_option(req, token, &json, &json_len);		else if (req.path.find("get_temp") != -1)			code = DealGetTemp(req, token, &json, &json_len);		else if (req.path.find("get_humitemp") != -1)			code = DealGetTempHumi(req, token, &json, &json_len);		else if (req.path.find("backend_type") != -1)		{			body = R"({"type":2})"; code = 200;		}		else			code = 405;	}	catch (...)	{		code = 500;	}	if (json)		res.set_content(json, "application/json");	if (!body.empty())		res.set_content(body.c_str(), "application/json");	auto cost = chrono::duration_cast<chrono::milliseconds>(chrono::steady_clock::now() - start).count();	SPDLOG_INFO("[HTTP][GET][END] code:{} COST:{} {}:{} {} {}", code, cost, req.remote_addr, req.remote_port, req.target, json ? json : "");	res.set_header("cost", to_string(cost) + " ms");	res.status = code;	if (json) free(json);}//处理post请求总入口void DealHttpPost(const httplib::Request& req, httplib::Response& res){	int code = 500;	auto start = chrono::steady_clock::now();	auto token = req.get_header_value("token");	if (token.length() == 0 || token.empty()) 		token = req.get_header_value("Authorization");	char* json = nullptr;	size_t json_len = 0;	SPDLOG_INFO("[HTTP][POST][START] {}:{} {} body:{}", req.remote_addr, req.remote_port, req.path, req.body);	try	{		if (token.empty())		{			code = 401;		}		if (req.path.find("post_svg") != -1)			code = DealPostSvgData(req, token, res);		else if (req.path.find("option_svg") != -1)			code = DealOptionSvgData(req, token, res);		else if (req.path.find("commit_record") != -1)			code = DealPostCommitRecord(req.body.c_str(), req.body.length(), token, &json, &json_len);		else if (req.path.find("get_svg") != -1)			code = DealGetSvgData(req, token, res);		//else if (req.path.find("post_soft") != -1)		//	code = DealPostBinData(req, token, res);		else if (req.path.find("conf_write/convert_resist") != -1)			code = DealPostConvertResist(req.body.c_str(), req.body.length(), token, &json, &json_len);		else if (req.path.find("conf_write/mitie_lock") != -1)			code = DealPostMitieLock(req.body.c_str(), req.body.length(), token, &json, &json_len);		else if (req.path.find("refer_curve") != -1)			code = DealPostrefer_curve(req.body.c_str(), req.body.length(), token, &json, &json_len);		else			code = 405;	}	catch (...)	{		code = 500;	}	if (json)		res.set_content(json, "application/json");	auto cost = chrono::duration_cast<chrono::milliseconds>(chrono::steady_clock::now() - start).count();	SPDLOG_INFO("[HTTP][POST][END] code:{} COST:{} {}:{} {} body:{} json:{}", code, cost, req.remote_addr, req.remote_port, req.path, req.body, json ? json : "");	res.set_header("cost", to_string(cost) + " ms");	res.status = code;	if (json) free(json);}int DealPostSvgData(const httplib::Request& req, const string token, httplib::Response& res){	if (token.find("AAAAAAAA") == -1) return 403;	auto id = req.get_header_value("id");	if (id.empty()) return 400;//参数错误	char szID[200] = { 0 };	utf82gbk(szID, 200, id.c_str(), id.length()); //处理中文	if (req.body.empty()) return 400;	CString strPath = CSimpleLog::GetAppDir() + "svg\\" + szID + ".svg";	CFile file;	if (file.Open(strPath, CFile::modeWrite | CFile::typeBinary | CFile::modeCreate))	{		file.Write(req.body.c_str(), req.body.length());		file.Close();		return 200;	}	else	{		return 500;	}	return 405;}int DealGetSvgData(const httplib::Request& req, const string token, httplib::Response& res){	auto id = req.get_param_value("id");	if (id.empty()) return 400;//参数错误	char szID[200] = { 0 };	utf82gbk(szID, 200, id.c_str(), id.length()); //处理中文	CString strPath = CSimpleLog::GetAppDir() + "svg\\" + szID + ".svg";	auto bExist = CSimpleLog::PathFileExists(strPath);	if (bExist == false) return 404;	CFile file;	if (file.Open(strPath, CFile::modeRead | CFile::typeBinary))	{		int len = file.GetLength();		auto pData = new uint8_t[len];		file.Read(pData, len);		file.Close();		res.set_content((char*)pData, len, "image/svg+xml");	}	else	{		return 500;	}	return 200;}int DealOptionSvgData(const httplib::Request& req, const string token, httplib::Response& res){	auto id = req.get_param_value("id");	if (id.empty()) return 400;//参数错误	char szID[200] = { 0 };	utf82gbk(szID, 200, id.c_str(), id.length()); //处理中文	CString strPath = CSimpleLog::GetAppDir() + "svg\\" + szID + ".svg";	auto bExist = CSimpleLog::PathFileExists(strPath);	string strResult;	if (bExist)		strResult = R"({"result":true})";	else		strResult = R"({"result":false})";	res.set_content(strResult, "application/json");	return 200;}int DealGetMpStat(const httplib::Request& req, const string token, httplib::Response& res){	auto id = req.get_param_value("id");//杭南杭甬场	if (id.empty()) return 400;//参数错误	char station[200];	int id_len = utf82gbk(station, 200, id.c_str(), id.length());	auto pStation = CMonitorObjectMng::Instance()->GetTreeByID(string(station));	if (nullptr == pStation) return 404;	if (pStation->type.compare("station") != 0) return 400;	auto doc = yyjson_mut_doc_new(nullptr);	auto root = yyjson_mut_arr(doc);	yyjson_mut_doc_set_root(doc, root);	for (const auto& it : pStation->m_lstMo)	{		auto arr = yyjson_mut_arr(doc);		yyjson_mut_arr_add_val(root, arr);		yyjson_mut_arr_add_strcpy(doc, arr, it->id.c_str());		yyjson_mut_arr_add_strcpy(doc, arr, it->name.c_str());		CDevice* pDevice = CDeviceMng::Instance()->Find(it->id);		if (pDevice)		{			string mo, mp;			if (CMonitorObjectMng::spiltByPoint(it->id, mo, mp))			{				SYSTEMTIME stAlarm = { 0 };				auto ty = CResistAlarmMng::Instance()->GetAlarmStat(mo, mp, stAlarm);				if (ty == eZL_MP_STAT::MP_STAT_OFFLINE_GRAY)				{					if (pDevice->IsDeviceOnline())						yyjson_mut_arr_add_int(doc, arr, (int)eZL_MP_STAT::MP_STAT_NORMAL_GREEN);					else						yyjson_mut_arr_add_int(doc, arr, (int)eZL_MP_STAT::MP_STAT_OFFLINE_GRAY);				}				else				{					yyjson_mut_arr_add_int(doc, arr, (int)ty);					sprintf_s(station, 200, "%04d-%02d-%02d %02d:%02d:%02d.%03d", stAlarm.wYear, stAlarm.wMonth, stAlarm.wDay, stAlarm.wHour, stAlarm.wMinute, stAlarm.wSecond, stAlarm.wMilliseconds);					yyjson_mut_arr_add_strcpy(doc, arr, station);				}			}			else			{				yyjson_mut_arr_add_int(doc, arr, (int)eZL_MP_STAT::MP_STAT_UNINSTALL_WHITE);			}		}		else		{			yyjson_mut_arr_add_int(doc, arr, (int)eZL_MP_STAT::MP_STAT_UNINSTALL_WHITE);		}	}	size_t len;	auto json = yyjson_mut_write(doc, 0, &len);	res.set_content(json, len, "application/json");	if (json)	{		free((void*)json);		json = nullptr;	}	yyjson_mut_doc_free(doc);	return 200;}int DealGetMitieLock(const httplib::Request& req, const string token, char** json, size_t* json_len){	string mo = req.get_param_value("mo");	string mp = req.get_param_value("mp");	eSuoBiPosi posi = (eSuoBiPosi)atoi(req.get_param_value("posi").c_str());	if (posi == eSuoBiPosi::SB_ZERO) posi = eSuoBiPosi::SB_UNKNOWN;	if (mo.length() == 0 || mp.length() == 0)		return 400;	auto doc = yyjson_mut_doc_new(nullptr);	auto root = yyjson_mut_obj(doc);	yyjson_mut_doc_set_root(doc, root);	SUOBI_OVER_LIMIT_INFO* pInfo = (SUOBI_OVER_LIMIT_INFO*)CResistAlarmMng::Instance()->Find(mo, mp, (uint8_t)posi, eZL_ALARMTYPE::SUOBI_LOCK_LIMIT);	if (pInfo)	{		yyjson_mut_obj_add_bool(doc, root, "enable", pInfo->enable);		if (pInfo->alarm_low_limit > INT_MIN)			yyjson_mut_obj_add_int(doc, root, "alarm_low_limit", pInfo->alarm_low_limit);		else 			yyjson_mut_obj_add_null(doc, root, "alarm_low_limit");		if (pInfo->warn_low_limit > INT_MIN)			yyjson_mut_obj_add_int(doc, root, "warn_low_limit", pInfo->warn_low_limit);		else 			yyjson_mut_obj_add_null(doc, root, "warn_low_limit");		if (pInfo->alarm_high_limit < INT_MAX)			yyjson_mut_obj_add_int(doc, root, "alarm_high_limit", pInfo->alarm_high_limit);		else			yyjson_mut_obj_add_null(doc, root, "alarm_high_limit");		if (pInfo->warn_high_limit < INT_MAX)			yyjson_mut_obj_add_int(doc, root, "warn_high_limit", pInfo->warn_high_limit);		else			yyjson_mut_obj_add_null(doc, root, "warn_high_limit");	}	else	{		yyjson_mut_obj_add_bool(doc, root, "enable", false);		yyjson_mut_obj_add_null(doc, root, "alarm_low_limit");		yyjson_mut_obj_add_null(doc, root, "warn_low_limit");		yyjson_mut_obj_add_null(doc, root, "alarm_high_limit");		yyjson_mut_obj_add_null(doc, root, "warn_high_limit");	}	*json = yyjson_mut_write(doc, 0, json_len);	yyjson_mut_doc_free(doc);	return 200;}int DealPostMitieLock(const char* body_ptr, const size_t body_len, const string token, char** json, size_t* json_len){	return 403; //关闭设置	int code = 400;	auto req_doc = yyjson_read(body_ptr, body_len, 0);	if (req_doc == nullptr) return 400;	auto req_root = yyjson_doc_get_root(req_doc);	do 	{		auto mo = yyjson_get_str(yyjson_obj_get(req_root, "mo"));		auto mp = yyjson_get_str(yyjson_obj_get(req_root, "mp"));		eSuoBiPosi posi = (eSuoBiPosi)yyjson_get_int(yyjson_obj_get(req_root, "posi"));;//预留		if (posi == eSuoBiPosi::SB_ZERO) posi = eSuoBiPosi::SB_UNKNOWN;		auto conf = yyjson_obj_get(req_root, "conf");		if (mo == nullptr || mp == nullptr || conf == nullptr)			break;		auto doc = yyjson_mut_doc_new(nullptr);		auto root = yyjson_mut_obj(doc);		yyjson_mut_doc_set_root(doc, root);		size_t len;		char* str_conf = nullptr;		//更新内存里		SUOBI_OVER_LIMIT_INFO* pInfo = (SUOBI_OVER_LIMIT_INFO*)CResistAlarmMng::Instance()->Find(mo, mp, (uint8_t)posi, eZL_ALARMTYPE::SUOBI_LOCK_LIMIT);		CString sql;		if (pInfo == nullptr)		{			SUOBI_OVER_LIMIT_INFO* pInfo = new SUOBI_OVER_LIMIT_INFO;			pInfo->type = eZL_ALARMTYPE::SUOBI_LOCK_LIMIT;			pInfo->no = (uint8_t)posi;			pInfo->enable = yyjson_get_bool(yyjson_obj_get(conf, "enable"));			yyjson_mut_obj_add_bool(doc, root, "enable", pInfo->enable);			{				auto val = yyjson_obj_get(conf, "alarm_low_limit");				if (val && yyjson_is_int(val))					pInfo->alarm_low_limit = yyjson_get_int(val);				yyjson_mut_obj_add_int(doc, root, "alarm_low_limit", pInfo->alarm_low_limit);			}			{				auto val = yyjson_obj_get(conf, "warn_low_limit");				if (val && yyjson_is_int(val))					pInfo->warn_low_limit = yyjson_get_int(val);				yyjson_mut_obj_add_int(doc, root, "warn_low_limit", pInfo->warn_low_limit);			}			{				auto val = yyjson_obj_get(conf, "alarm_high_limit");				if (val && yyjson_is_int(val))					pInfo->alarm_high_limit = yyjson_get_int(val);				yyjson_mut_obj_add_int(doc, root, "alarm_high_limit", pInfo->alarm_high_limit);			}			{				auto val = yyjson_obj_get(conf, "warn_high_limit");				if (val && yyjson_is_int(val))					pInfo->warn_high_limit = yyjson_get_int(val);				yyjson_mut_obj_add_int(doc, root, "warn_high_limit", pInfo->warn_high_limit);			}			str_conf = yyjson_mut_write(doc, 0, &len);			yyjson_mut_doc_free(doc);			CResistAlarmMng::Instance()->Insert(mo, mp, (uint8_t)posi, (uint8_t)eZL_ALARMTYPE::SUOBI_LOCK_LIMIT, pInfo);			time_t tt;			time(&tt);			sql.Format("INSERT INTO [rm_alarm_set]([mo],[mp],[no],[type],[conf],[time]) VALUES ('%s','%s',%d, %d,'%s','%I64u')",				mo, mp, (uint8_t)posi, eZL_ALARMTYPE::SUOBI_LOCK_LIMIT, str_conf, tt);		}		else		{			pInfo->enable = yyjson_get_bool(yyjson_obj_get(conf, "enable"));			yyjson_mut_obj_add_bool(doc, root, "enable", pInfo->enable);			{				auto val = yyjson_obj_get(conf, "alarm_low_limit");				if (val && yyjson_is_int(val))					pInfo->alarm_low_limit = yyjson_get_int(val);				else					pInfo->alarm_low_limit = INT_MIN;				yyjson_mut_obj_add_int(doc, root, "alarm_low_limit", pInfo->alarm_low_limit);			}			{				auto val = yyjson_obj_get(conf, "warn_low_limit");				if (val && yyjson_is_int(val))					pInfo->warn_low_limit = yyjson_get_int(val);				else					pInfo->warn_low_limit = INT_MIN;				yyjson_mut_obj_add_int(doc, root, "warn_low_limit", pInfo->warn_low_limit);			}			{				auto val = yyjson_obj_get(conf, "alarm_high_limit");				if (val && yyjson_is_int(val))					pInfo->alarm_high_limit = yyjson_get_int(val);				else					pInfo->alarm_high_limit = INT_MAX;				yyjson_mut_obj_add_int(doc, root, "alarm_high_limit", pInfo->alarm_high_limit);			}			{				auto val = yyjson_obj_get(conf, "warn_high_limit");				if (val && yyjson_is_int(val))					pInfo->warn_high_limit = yyjson_get_int(val);				else					pInfo->warn_high_limit = INT_MAX;				yyjson_mut_obj_add_int(doc, root, "warn_high_limit", pInfo->warn_high_limit);			}			str_conf = yyjson_mut_write(doc, 0, &len);			yyjson_mut_doc_free(doc);			sql.Format("update rm_alarm_set SET conf = '%s' WHERE mo = '%s' and mp = '%s' and no = %d and type = %d",				str_conf, mo, mp, (uint8_t)posi, eZL_ALARMTYPE::SUOBI_LOCK_LIMIT);		}			if (str_conf) free(str_conf);		if (CDBConnectPool::Instance()->DBExecuteSQL(sql) == FALSE)		{			ASSERT(FALSE);			CSimpleLog::Error("语句执行失败" + sql);			code = 500;			break;		}		code = 200;	} while (false);	yyjson_doc_free(req_doc);	return code;}int DealGetConvertResist(const httplib::Request& req, const string token, char** json, size_t* json_len){	string mo = req.get_param_value("mo");	string mp = req.get_param_value("mp");	if (mo.length() == 0 || mp.length() == 0)		return 400;	auto doc = yyjson_mut_doc_new(nullptr);	auto root = yyjson_mut_obj(doc);	yyjson_mut_doc_set_root(doc, root);	CONVERT_RESIST_OVER_LIMIT* pInfo = (CONVERT_RESIST_OVER_LIMIT*)CResistAlarmMng::Instance()->Find(mo, mp, 2, eZL_ALARMTYPE::CONVERT_LIMIT);	if (pInfo)	{		yyjson_mut_obj_add_bool(doc, root, "enable", pInfo->enable);		if (pInfo->dw_alarm_low_limit > INT_MIN)			yyjson_mut_obj_add_int(doc, root, "dw_alarm_low_limit", pInfo->dw_alarm_low_limit);		else			yyjson_mut_obj_add_null(doc, root, "dw_alarm_low_limit");		if (pInfo->dw_warn_low_limit > INT_MIN)			yyjson_mut_obj_add_int(doc, root, "dw_warn_low_limit", pInfo->dw_warn_low_limit);		else			yyjson_mut_obj_add_null(doc, root, "dw_warn_low_limit");		if (pInfo->up_alarm_high_limit < INT_MAX)			yyjson_mut_obj_add_int(doc, root, "up_alarm_high_limit", pInfo->up_alarm_high_limit);		else			yyjson_mut_obj_add_null(doc, root, "up_alarm_high_limit");		if (pInfo->up_warn_high_limit < INT_MAX)			yyjson_mut_obj_add_int(doc, root, "up_warn_high_limit", pInfo->up_warn_high_limit);		else			yyjson_mut_obj_add_null(doc, root, "up_warn_high_limit");	}	else	{		yyjson_mut_obj_add_bool(doc, root, "enable", false);		yyjson_mut_obj_add_null(doc, root, "dw_alarm_low_limit");		yyjson_mut_obj_add_null(doc, root, "dw_warn_low_limit");		yyjson_mut_obj_add_null(doc, root, "up_alarm_high_limit");		yyjson_mut_obj_add_null(doc, root, "up_warn_high_limit");	}	*json = yyjson_mut_write(doc, 0, json_len);	yyjson_mut_doc_free(doc);	return 200;}int DealPostConvertResist(const char* body_ptr, const size_t body_len, const string token, char** json, size_t* json_len){	return 403;	int code = 400;	auto req_doc = yyjson_read(body_ptr, body_len, 0);	if (req_doc == nullptr) return 400;	auto req_root = yyjson_doc_get_root(req_doc);	do	{		auto mo = yyjson_get_str(yyjson_obj_get(req_root, "mo"));		auto mp = yyjson_get_str(yyjson_obj_get(req_root, "mp"));		auto conf = yyjson_obj_get(req_root, "conf");		if (mo == nullptr || mp == nullptr || conf == nullptr)			break;		auto doc = yyjson_mut_doc_new(nullptr);		auto root = yyjson_mut_obj(doc);		yyjson_mut_doc_set_root(doc, root);		size_t len;		char* str_conf = nullptr;		//更新内存里		CONVERT_RESIST_OVER_LIMIT* pInfo = (CONVERT_RESIST_OVER_LIMIT*)CResistAlarmMng::Instance()->Find(mo, mp, 2, eZL_ALARMTYPE::CONVERT_LIMIT);		CString sql;		if (pInfo == nullptr)		{			CONVERT_RESIST_OVER_LIMIT* pInfo = new CONVERT_RESIST_OVER_LIMIT;			pInfo->type = eZL_ALARMTYPE::CONVERT_LIMIT;			pInfo->no = 2;			pInfo->enable = yyjson_get_bool(yyjson_obj_get(conf, "enable"));			yyjson_mut_obj_add_bool(doc, root, "enable", pInfo->enable);			{				auto val = yyjson_obj_get(conf, "dw_alarm_low_limit");				if (val && yyjson_is_int(val))					pInfo->dw_alarm_low_limit = yyjson_get_int(val);				yyjson_mut_obj_add_int(doc, root, "dw_alarm_low_limit", pInfo->dw_alarm_low_limit);			}			{				auto val = yyjson_obj_get(conf, "dw_warn_low_limit");				if (val && yyjson_is_int(val))					pInfo->dw_warn_low_limit = yyjson_get_int(val);				yyjson_mut_obj_add_int(doc, root, "dw_warn_low_limit", pInfo->dw_warn_low_limit);			}			{				auto val = yyjson_obj_get(conf, "up_alarm_high_limit");				if (val && yyjson_is_int(val))					pInfo->up_alarm_high_limit = yyjson_get_int(val);				yyjson_mut_obj_add_int(doc, root, "up_alarm_high_limit", pInfo->up_alarm_high_limit);			}			{				auto val = yyjson_obj_get(conf, "up_warn_high_limit");				if (val && yyjson_is_int(val))					pInfo->up_warn_high_limit = yyjson_get_int(val);				yyjson_mut_obj_add_int(doc, root, "up_warn_high_limit", pInfo->up_warn_high_limit);			}			str_conf = yyjson_mut_write(doc, 0, &len);			yyjson_mut_doc_free(doc);			CResistAlarmMng::Instance()->Insert(mo, mp, 2, (uint8_t)eZL_ALARMTYPE::CONVERT_LIMIT, pInfo);			sql.Format("INSERT INTO [rm_alarm_set]([mo],[mp],[no],[type],[conf],[time]) VALUES ('%s','%s',%d,%d,'%s','%I64u')",				mo, mp, 2, eZL_ALARMTYPE::CONVERT_LIMIT, str_conf, 0);		}		else		{			pInfo->enable = yyjson_get_bool(yyjson_obj_get(conf, "enable"));			yyjson_mut_obj_add_bool(doc, root, "enable", pInfo->enable);			{				auto val = yyjson_obj_get(conf, "dw_alarm_low_limit");				if (val && yyjson_is_int(val))					pInfo->dw_alarm_low_limit = yyjson_get_int(val);				else					pInfo->dw_alarm_low_limit = INT_MIN;				yyjson_mut_obj_add_int(doc, root, "dw_alarm_low_limit", pInfo->dw_alarm_low_limit);			}			{				auto val = yyjson_obj_get(conf, "dw_warn_low_limit");				if (val && yyjson_is_int(val))					pInfo->dw_warn_low_limit = yyjson_get_int(val);				else					pInfo->dw_warn_low_limit = INT_MIN;				yyjson_mut_obj_add_int(doc, root, "dw_warn_low_limit", pInfo->dw_warn_low_limit);			}			{				auto val = yyjson_obj_get(conf, "up_alarm_high_limit");				if (val && yyjson_is_int(val))					pInfo->up_alarm_high_limit = yyjson_get_int(val);				else					pInfo->up_alarm_high_limit = INT_MAX;				yyjson_mut_obj_add_int(doc, root, "up_alarm_high_limit", pInfo->up_alarm_high_limit);			}			{				auto val = yyjson_obj_get(conf, "up_warn_high_limit");				if (val && yyjson_is_int(val))					pInfo->up_warn_high_limit = yyjson_get_int(val);				else					pInfo->up_warn_high_limit = INT_MAX;				yyjson_mut_obj_add_int(doc, root, "up_warn_high_limit", pInfo->up_warn_high_limit);			}			str_conf = yyjson_mut_write(doc, 0, &len);			yyjson_mut_doc_free(doc);			sql.Format("update rm_alarm_set SET conf = '%s' WHERE mo = '%s' and mp = '%s' and no = %d and type = %d",				str_conf, mo, mp, 2, eZL_ALARMTYPE::CONVERT_LIMIT);		}		if (str_conf) free(str_conf);		if (CDBConnectPool::Instance()->DBExecuteSQL(sql) == FALSE)		{			ASSERT(FALSE);			CSimpleLog::Error("语句执行失败" + sql);			code = 500;			break;		}		code = 200;	} while (false);	yyjson_doc_free(req_doc);	return code;}int DealPostCommitRecord(const char* body_ptr, const size_t body_len, const string token, char** json, size_t* json_len){	int code = 400;	string msg;	auto req_doc = yyjson_read(body_ptr, body_len, 0);	if (req_doc == nullptr) return 400;	auto req_root = yyjson_doc_get_root(req_doc);	do	{		if (yyjson_is_arr(req_root) == false) break;		auto doc = yyjson_mut_doc_new(nullptr);		auto root = yyjson_mut_obj(doc);		yyjson_mut_doc_set_root(doc, root);		size_t n = yyjson_arr_size(req_root);		auto req_obj = yyjson_arr_get_first(req_root);		for (size_t i = 0; i < n; i++)		{			auto module = yyjson_get_int(yyjson_obj_get(req_obj, "module"));			auto dura = yyjson_get_int(yyjson_obj_get(req_obj, "dura"));			auto analyze_type = yyjson_get_int(yyjson_obj_get(req_obj, "analyze_type"));			auto station = yyjson_get_str(yyjson_obj_get(req_obj, "station"));			auto station_name = yyjson_get_str(yyjson_obj_get(req_obj, "station_name"));			auto mo = yyjson_get_str(yyjson_obj_get(req_obj, "mo"));			auto mo_name = yyjson_get_str(yyjson_obj_get(req_obj, "mo_name"));			auto mp = yyjson_get_str(yyjson_obj_get(req_obj, "mp"));			auto mp_name = yyjson_get_str(yyjson_obj_get(req_obj, "mp_name"));			auto start_time = yyjson_get_uint(yyjson_obj_get(req_obj, "start_time"));			auto end_time = yyjson_get_uint(yyjson_obj_get(req_obj, "end_time"));			time_t tt;			time(&tt);			auto name = yyjson_get_str(yyjson_obj_get(req_obj, "name"));			auto username = yyjson_get_str(yyjson_obj_get(req_obj, "username"));			if (module == 0 || dura == 0 || station == nullptr ||				station_name == nullptr || start_time == 0 || name == nullptr)				break;			auto strStation = UTF8toANSI(station);			auto strStationName = UTF8toANSI(station_name);			auto strName = UTF8toANSI(name);			CString strDuraTime;			dura = dura / 1000.0 + 0.5;			if (dura / 60)				strDuraTime.Format(" 时长:%d分%d秒", dura / 60, dura % 60);			else  if (dura)				strDuraTime.Format(" 时长:%d秒", dura);			CString sql = fmt::format("INSERT INTO [dbo].[rm_record]\			(module, dura, analyze_type, station\				, station_name, mo, mo_name, mp, mp_name, start_time\				, end_time, time, name,username,opt,mark)	VALUES\			({}, {}, {}, '{}', '{}'\			, '{}', '{}', '{}', '{}', {}\			, {}, {}, '{}', '{}',{}, '{}')",				module, dura, analyze_type, strStation, strStationName,				IS_NULL(mo), IS_NULL(mo_name), IS_NULL(mp), IS_NULL(mp_name), start_time,				end_time, tt, strName, IS_NULL(username), 1, strDuraTime).c_str();			if (CDBConnectPool::Instance()->DBExecuteSQL(sql) == FALSE)			{				ASSERT(FALSE);				msg = "语句执行失败:" + sql;				CSimpleLog::Error(msg.c_str());				code = 500;				break;			}			else			{				code = 200;			}			code = ExecSqlForRecord((eRecord_Module)module, dura, analyze_type, strStation, strStationName, mo, mo_name, mp, mp_name, start_time, end_time, tt, strName, username, eRocord_Opt::RO_RECORD, string(strDuraTime));			req_obj = unsafe_yyjson_get_next(req_obj);		}		yyjson_mut_obj_add_strcpy(doc, root, "msg", ANSItoUTF8(msg).c_str());		yyjson_mut_obj_add_int(doc, root, "code", code);		if (json) *json = yyjson_mut_write(doc, 0, json_len);	} while (false);	yyjson_doc_free(req_doc);	return code;}int DealGetOptLog(const httplib::Request& req, const string token, char** json, size_t* json_len){	string station_name = req.get_param_value("station_name");	string time = req.get_param_value("time");	string end_time = req.get_param_value("end_time");	if (time.length() == 0 )		return 400;	time_t uTime = atoll(time.c_str());	time_t uEndTime = atoll(end_time.c_str());	if (uEndTime == 0) uEndTime = uTime + 86400;	COleDateTime odt(uTime);	if (odt.GetStatus() == COleDateTime::invalid)		return 400;	string str_station_name = UTF8toANSI(station_name);	int code = 400;	string msg;	auto doc = yyjson_mut_doc_new(nullptr);	auto root = yyjson_mut_obj(doc);	yyjson_mut_doc_set_root(doc, root);	auto yy_data = yyjson_mut_arr(doc);	auto yy_name = yyjson_mut_arr(doc);	auto yy_mo = yyjson_mut_arr(doc);	auto yy_mp = yyjson_mut_arr(doc);	yyjson_mut_obj_add_val(doc, root, "data", yy_data);	yyjson_mut_obj_add_val(doc, root, "name", yy_name);	yyjson_mut_obj_add_val(doc, root, "mo_name", yy_mo);	yyjson_mut_obj_add_val(doc, root, "mp_name", yy_mp);	//query	//查询数据库	std::map<string, uint16_t> map_name;	std::map<string, uint16_t> map_mo_name;	std::map<string, uint16_t> map_mp_name;	{		//station,station_name,		CString sql;		if (str_station_name.length() == 0)			sql = fmt::format("SELECT module,dura,analyze_type, mo, mo_name, mp, mp_name, start_time, end_time, [time], name, username, opt, mark,station_name\			FROM rm_record WHERE time between {} AND {}",				uTime, uEndTime).c_str();		else			sql = fmt::format("SELECT module,dura,analyze_type, mo, mo_name, mp, mp_name, start_time, end_time, [time], name, username, opt, mark,station_name\			FROM rm_record WHERE station_name = '{}' AND time between {} AND {}",			str_station_name, uTime, uEndTime).c_str();		COdbcStatement stmt;		if (CDBConnectPool::Instance()->DBQuery(stmt, sql))		{			uint8_t umodule, analyze_type;			int16_t opt = 0;			int dura;			char /*station[100], char station_name[100], */mo[50], mo_name[50], mp[50], mp_name[50], name[100], username[50], mark[200], station_name[100];			uint64_t start_time, end_time, tt;			int nCol = 1;			stmt.BindTinyIntCol(nCol++, &umodule);			stmt.BindIntCol(nCol++, &dura);			stmt.BindTinyIntCol(nCol++, &analyze_type);			//stmt.BindCharCol(nCol++, station, sizeof(station));			//stmt.BindCharCol(nCol++, station_name, sizeof(station_name));			stmt.BindCharCol(nCol++, mo, sizeof(mo));			stmt.BindCharCol(nCol++, mo_name, sizeof(mo_name));			stmt.BindCharCol(nCol++, mp, sizeof(mp));			stmt.BindCharCol(nCol++, mp_name, sizeof(mp_name));			stmt.BindBigIntCol(nCol++, (__int64*)&start_time);			stmt.BindBigIntCol(nCol++, (__int64*)&end_time);			stmt.BindBigIntCol(nCol++, (__int64*)&tt);			stmt.BindCharCol(nCol++, name, sizeof(name));			stmt.BindCharCol(nCol++, username, sizeof(username));			stmt.BindSmallIntCol(nCol++, &opt);			stmt.BindCharCol(nCol++, mark, sizeof(mark));			stmt.BindCharCol(nCol++, station_name, sizeof(station_name));			do			{				//ZeroMemory(station, 100);				//ZeroMemory(station_name, 100);				ZeroMemory(mo, 50);				ZeroMemory(mo_name, 50);				ZeroMemory(mp, 50);				ZeroMemory(mp_name, 50);				ZeroMemory(name, 100);				ZeroMemory(username, 50);				ZeroMemory(mark, 200);				ZeroMemory(station_name, 100);				if (stmt.FetchNext() != 0)					break;				map_name[name]++;				map_mo_name[mo_name]++;				map_mp_name[mp_name]++;				auto o = yyjson_mut_obj(doc);				yyjson_mut_arr_add_val(yy_data, o);				yyjson_mut_obj_add_int(doc, o, "module", umodule);				yyjson_mut_obj_add_int(doc, o, "opt", opt);				yyjson_mut_obj_add_int(doc, o, "analyze_type", analyze_type);				yyjson_mut_obj_add_strcpy(doc, o, "mo_name", mo_name);				yyjson_mut_obj_add_strcpy(doc, o, "mp_name", mp_name);				yyjson_mut_obj_add_int(doc, o, "time", tt);				yyjson_mut_obj_add_strcpy(doc, o, "name", ANSItoUTF8(name).c_str());				yyjson_mut_obj_add_strcpy(doc, o, "mark", ANSItoUTF8(mark).c_str());				yyjson_mut_obj_add_strcpy(doc, o, "station_name", ANSItoUTF8(station_name).c_str());			} while (TRUE);		}		stmt.Close();	}	for (auto& it : map_name)		yyjson_mut_arr_add_strcpy(doc, yy_name, ANSItoUTF8(it.first).c_str());	for (auto& it : map_mo_name)		yyjson_mut_arr_add_strcpy(doc, yy_mo, it.first.c_str());	for (auto& it : map_mp_name)		yyjson_mut_arr_add_strcpy(doc, yy_mp, it.first.c_str());	code = 200;	yyjson_mut_obj_add_int(doc, root, "code", code);	yyjson_mut_obj_add_strcpy(doc, root, "msg", ANSItoUTF8(msg).c_str());	if (json)	{		*json = yyjson_mut_write(doc, 0, json_len);		/*		*json = (char*)malloc(1024);		strcpy_s(*json, 1024, R"({    "code": 200,    "msg": "",    "data": [{        "mo_name": "21#",        "mp_name": "J1",        "name": "张三",        "opt":1,        "time": 1693808336,        "mark": ""    }, {        "mo_name": "22#",        "mp_name": "J1",        "name": "李四",        "opt":1,        "time": 1693808336,        "mark": ""    }],    "name": ["张三", "李四", "王五"],    "mo_name": ["21#", "22#", "23#"],    "mp_name": ["J1", "J2", "J3"]})");*/	}	yyjson_mut_doc_free(doc);	return code;}int ExecSqlForRecord(eRecord_Module module, int dura, uint8_t analyze_type, string& strStation, string& strStationName, const char* mo, const char* mo_name, const char* mp, const char* mp_name,	uint64_t start_time, uint64_t end_time, time_t tt, string& strName, const char* username, eRocord_Opt opt, string& mark){	CString sql = fmt::format("INSERT INTO rm_record\			(module, dura, analyze_type, station\				, station_name, mo, mo_name, mp, mp_name, start_time\				, end_time, time, name,username,opt,mark)	VALUES\			({}, {}, {}, '{}', '{}'\			, '{}', '{}', '{}', '{}', {}\			, {}, {}, '{}', '{}',{}, '{}')",		int(module), dura, analyze_type, strStation, strStationName,		IS_NULL(mo), IS_NULL(mo_name), IS_NULL(mp), IS_NULL(mp_name), start_time,		end_time, tt, strName, IS_NULL(username), int(opt), mark).c_str();	if (CDBConnectPool::Instance()->DBExecuteSQL(sql) == FALSE)	{		ASSERT(FALSE);		CSimpleLog::Error("语句执行失败:" + sql);		return 500;	}	else	{		return 200;	}}int DealGetrefer_option(const httplib::Request& req, const string token, char** json, size_t* json_len){	string station = req.get_param_value("station");	string mo = req.get_param_value("mo");	string mp = req.get_param_value("mp");	string str_direct = req.get_param_value("direct");	if (station.length() == 0 || mo.length() == 0 || mp.length() == 0 || str_direct.length() == 0)		return 400;	auto direct = atoi(str_direct.c_str());	if (direct != 3 && direct != 4)		return 400;	string str_station = UTF8toANSI(station);	if (CSimpleLog::PathFileExistsA(CSimpleLog::GetAppDir() + "refer\\" + 		fmt::format("{}.{}.{}.{}.json", str_station, mo, mp, direct).c_str()))		return 200;	else		return 404;}//获取参考曲线int DealGetrefer_curve(const httplib::Request& req, const string token, char** json, size_t* json_len){	string station = req.get_param_value("station");	string mo = req.get_param_value("mo");	string mp = req.get_param_value("mp");	string str_direct = req.get_param_value("direct");	string str_show_time = req.get_param_value("show_time");	if (station.length() == 0 || mo.length() == 0 || mp.length() == 0 || str_direct.length() == 0 || str_show_time.length() == 0)		return 400;	auto direct = atoi(str_direct.c_str());	if (direct != 3 && direct != 4)		return 400;	int yy, mm, dd, hh, MM, SS, micromm;	auto ret_num = sscanf_s(str_show_time.c_str(), "%d-%d-%d %d:%d:%d.%d", &yy, &mm, &dd, &hh, &MM, &SS, µmm);	if (ret_num != 7)		return 400;	string str_station = UTF8toANSI(station);	time_t show_time = CTime(yy, mm, dd, hh, MM, SS).GetTime() * 1000 + micromm;	int code = 400;	string msg;	auto doc = yyjson_mut_doc_new(nullptr);	auto root = yyjson_mut_obj(doc);	yyjson_mut_doc_set_root(doc, root);	auto data = yyjson_mut_arr(doc);	yyjson_mut_obj_add_val(doc, root, "data", data);	yyjson_mut_obj_add_strcpy(doc, root, "station", station.c_str());	yyjson_mut_obj_add_strcpy(doc, root, "mo", mo.c_str());	yyjson_mut_obj_add_strcpy(doc, root, "mp", mp.c_str());	yyjson_mut_obj_add_int(doc, root, "direct", direct);	code = ReadReferFile(str_station, mo, mp, direct, show_time, doc, data, msg);	yyjson_mut_obj_add_int(doc, root, "code", code);	yyjson_mut_obj_add_strcpy(doc, root, "msg", ANSItoUTF8(msg).c_str());	if (json)	{		*json = yyjson_mut_write(doc, 0, json_len);	}	yyjson_mut_doc_free(doc);	return code;}int ReadReferFile(const string& station, const string& mo, const string& mp, uint8_t posi, time_t show_time, yyjson_mut_doc* mut_doc,	yyjson_mut_val* arr, OUT string& msg){	string strJsonPath = fmt::format("{}refer\\{}.{}.{}.{}.json", CSimpleLog::GetAppDir(), station, mo, mp, posi);	if (CSimpleLog::PathFileExistsA(strJsonPath.c_str()) == false)	{		msg = fmt::format("未设置参考曲线");		return 404;	}	yyjson_read_err err;	auto doc = yyjson_read_file(strJsonPath.c_str(), strJsonPath.length(), nullptr, &err);	if (doc == nullptr)	{		msg = err.msg;		return 500;	}	auto root = yyjson_doc_get_root(doc);	auto t = yyjson_obj_get(root, "t");	auto d0 = yyjson_obj_get(root, "d0");	auto d1 = yyjson_obj_get(root, "d1");	auto d2 = yyjson_obj_get(root, "d2");	if (yyjson_is_arr(t) == false || yyjson_is_arr(d0) == false || yyjson_is_arr(d1) == false || yyjson_is_arr(d2) == false)	{		msg = "参考曲线存储格式错误";		yyjson_doc_free(doc);		doc = nullptr;		return 500;	}	auto obj1 = yyjson_mut_obj(mut_doc);	auto obj2 = yyjson_mut_obj(mut_doc);	auto obj3 = yyjson_mut_obj(mut_doc);	yyjson_mut_arr_add_val(arr, obj1);	yyjson_mut_arr_add_val(arr, obj2);	yyjson_mut_arr_add_val(arr, obj3);	auto data1 = yyjson_mut_arr(mut_doc);	auto data2 = yyjson_mut_arr(mut_doc);	auto data3 = yyjson_mut_arr(mut_doc);	yyjson_mut_obj_add_val(mut_doc, obj1, "data", data1);	yyjson_mut_obj_add_val(mut_doc, obj2, "data", data2);	yyjson_mut_obj_add_val(mut_doc, obj3, "data", data3);	yyjson_mut_obj_add_val(mut_doc, obj1, "name", yyjson_val_mut_copy(mut_doc, yyjson_obj_get(root, "name0")));	yyjson_mut_obj_add_val(mut_doc, obj2, "name", yyjson_val_mut_copy(mut_doc, yyjson_obj_get(root, "name1")));	yyjson_mut_obj_add_val(mut_doc, obj3, "name", yyjson_val_mut_copy(mut_doc, yyjson_obj_get(root, "name2")));	int n = yyjson_arr_size(t);	auto it_t = yyjson_arr_get_first(t);	auto it_d0 = yyjson_arr_get_first(d0);	auto it_d1 = yyjson_arr_get_first(d1);	auto it_d2 = yyjson_arr_get_first(d2);	for (int i = 0; i < n; i++)	{		//按双数组的形式添加		auto o1 = yyjson_mut_arr(mut_doc);		yyjson_mut_arr_add_val(data1, o1);		auto o2 = yyjson_mut_arr(mut_doc);		yyjson_mut_arr_add_val(data2, o2);		auto o3 = yyjson_mut_arr(mut_doc);		yyjson_mut_arr_add_val(data3, o3);		auto t = yyjson_get_int(it_t) + show_time;		yyjson_mut_arr_add_int(mut_doc, o1, t);		yyjson_mut_arr_add_int(mut_doc, o2, t);		yyjson_mut_arr_add_int(mut_doc, o3, t);		yyjson_mut_arr_add_int(mut_doc, o1, yyjson_get_int(it_d0));		yyjson_mut_arr_add_int(mut_doc, o2, yyjson_get_int(it_d1));		yyjson_mut_arr_add_int(mut_doc, o3, yyjson_get_int(it_d2));		it_t = unsafe_yyjson_get_next(it_t);		it_d0 = unsafe_yyjson_get_next(it_d0);		it_d1 = unsafe_yyjson_get_next(it_d1);		it_d2 = unsafe_yyjson_get_next(it_d2);	}	yyjson_doc_free(doc);	doc = nullptr;	msg = "读取成功";	return 200;}int DealGetTemp(const httplib::Request& req, const string token, char** json, size_t* json_len){	string starttime = req.get_param_value("starttime");	string mo = req.get_param_value("mo");	string mp = req.get_param_value("mp");	string endtime = req.get_param_value("endtime");	if (starttime.length() == 0 || mo.length() == 0 || endtime.length() == 0 || mp.length() == 0)		return 400;	int code = 500;	static auto sz_temp = ANSItoUTF8("温度");	static auto sz_unit = ANSItoUTF8("℃");	auto doc = yyjson_mut_doc_new(nullptr);	auto root = yyjson_mut_obj(doc);	yyjson_mut_doc_set_root(doc, root);	yyjson_mut_obj_add_str(doc, root, "name", sz_temp.c_str());	yyjson_mut_obj_add_str(doc, root, "ValueSuffix", sz_unit.c_str());	auto data = yyjson_mut_arr(doc);	yyjson_mut_obj_add_val(doc, root, "data", data);	do	{		int year, month, day;		auto num = sscanf_s(starttime.c_str(), "%d-%d-%d ", &year, &month, &day);		if (num != 3) break;		CString sql = fmt::format(" SELECT TOP 100000 [acquisitiontime],[temperature] FROM rm_temphumidity_{}{:0>2} \			WHERE mo='{}' AND mp='{}' AND acquisitiontime >= '{}' AND acquisitiontime < '{}' ORDER BY acquisitiontime ", year, month, mo, mp, starttime, endtime).c_str();		COdbcStatement stmt;		if (!CDBConnectPool::Instance()->DBQuery(stmt, sql))			break;		TIMESTAMP_STRUCT ts;		int temp;		stmt.BindTimeStampCol(1, &ts);		stmt.BindIntCol(2, &temp);		while (true)		{			if (stmt.FetchNext() != 0)				break;			auto arr = yyjson_mut_arr(doc);			yyjson_mut_arr_add_val(data, arr);			yyjson_mut_arr_add_uint(doc, arr, CTime(ts.year, ts.month, ts.day, ts.hour, ts.minute, ts.second).GetTime() * 1000 + ts.fraction);			yyjson_mut_arr_add_strcpy(doc, arr, fmt::format("{:.1f}", temp / 100.0).c_str());		}		code = 200;	} while (false);	*json = yyjson_mut_write(doc, 0, json_len);	yyjson_mut_doc_free(doc);	return code;}int DealGetTempHumi(const httplib::Request& req, const string token, char** json, size_t* json_len){	string starttime = req.get_param_value("starttime");	string mo = req.get_param_value("mo");	string mp = req.get_param_value("mp");	string endtime = req.get_param_value("endtime");	if (starttime.length() == 0 || mo.length() == 0 || endtime.length() == 0 || mp.length() == 0)		return 400;	int code = 500;	static auto sz_temp = ANSItoUTF8("温度");	static auto sz_humi = ANSItoUTF8("湿度");	static auto sz_unit = ANSItoUTF8("℃");	auto doc = yyjson_mut_doc_new(nullptr);	auto root = yyjson_mut_obj(doc);	yyjson_mut_doc_set_root(doc, root);	yyjson_mut_obj_add_int(doc, root, "total", 2);	auto rows = yyjson_mut_arr(doc);	yyjson_mut_obj_add_val(doc, root, "rows", rows);	auto temp_curve = yyjson_mut_obj(doc);	auto humi_curve = yyjson_mut_obj(doc);	yyjson_mut_arr_add_val(rows, temp_curve);	yyjson_mut_arr_add_val(rows, humi_curve);	yyjson_mut_obj_add_int(doc, temp_curve, "yAxis", 0);	yyjson_mut_obj_add_int(doc, humi_curve, "yAxis", 1);	yyjson_mut_obj_add_str(doc, temp_curve, "name", sz_temp.c_str());	yyjson_mut_obj_add_str(doc, humi_curve, "name", sz_humi.c_str());	yyjson_mut_obj_add_str(doc, temp_curve, "ValueSuffix", sz_unit.c_str());	yyjson_mut_obj_add_str(doc, humi_curve, "ValueSuffix", "%");	auto temp_data = yyjson_mut_arr(doc);	yyjson_mut_obj_add_val(doc, temp_curve, "data", temp_data);	auto humi_data = yyjson_mut_arr(doc);	yyjson_mut_obj_add_val(doc, humi_curve, "data", humi_data);	do	{		int year, month, day;		auto num = sscanf_s(starttime.c_str(), "%d-%d-%d ", &year, &month, &day);		if (num != 3) break;		CString sql = fmt::format(" SELECT TOP 100000 [acquisitiontime],[temperature],[humidity] FROM rm_temphumidity_{}{:0>2} \			WHERE mo='{}' AND mp='{}' AND acquisitiontime >= '{}' AND acquisitiontime < '{}' ORDER BY acquisitiontime ", year, month, mo, mp, starttime, endtime).c_str();		COdbcStatement stmt;		if (!CDBConnectPool::Instance()->DBQuery(stmt, sql))			break;		TIMESTAMP_STRUCT ts;		int temp, humi;		stmt.BindTimeStampCol(1, &ts);		stmt.BindIntCol(2, &temp);		stmt.BindIntCol(3, &humi);		while (true)		{			if (stmt.FetchNext() != 0)				break;			uint64_t t = CTime(ts.year, ts.month, ts.day, ts.hour, ts.minute, ts.second).GetTime() * 1000 + ts.fraction;			{				auto arr = yyjson_mut_arr(doc);				yyjson_mut_arr_add_val(temp_data, arr);				yyjson_mut_arr_add_uint(doc, arr, t);				yyjson_mut_arr_add_strcpy(doc, arr, fmt::format("{:.1f}", temp / 100.0).c_str());			}			{				auto arr = yyjson_mut_arr(doc);				yyjson_mut_arr_add_val(humi_data, arr);				yyjson_mut_arr_add_uint(doc, arr, t);				yyjson_mut_arr_add_int(doc, arr, humi / 100);			}		}		code = 200;	} while (false);	*json = yyjson_mut_write(doc, 0, json_len);	yyjson_mut_doc_free(doc);	return code;}//设置参考曲线int DealPostrefer_curve(const char* body_ptr, const size_t body_len, const string token, char** json, size_t* json_len){	return 403; //暂时屏蔽	/*	int code = 400;	string msg;	auto req_doc = yyjson_read(body_ptr, body_len, 0);	if (req_doc == nullptr) return 400;	auto req_root = yyjson_doc_get_root(req_doc);	auto doc = yyjson_mut_doc_new(nullptr);	auto root = yyjson_mut_obj(doc);	yyjson_mut_doc_set_root(doc, root);	do	{		auto station = yyjson_get_str(yyjson_obj_get(req_root, "station"));		auto mo = yyjson_get_str(yyjson_obj_get(req_root, "mo"));		auto mp = yyjson_get_str(yyjson_obj_get(req_root, "mp"));		auto mo_name = yyjson_get_str(yyjson_obj_get(req_root, "mo_name"));		auto mp_name = yyjson_get_str(yyjson_obj_get(req_root, "mp_name"));		auto direct = yyjson_get_int(yyjson_obj_get(req_root, "direct"));		auto show_time = yyjson_get_str(yyjson_obj_get(req_root, "show_time"));		auto full_name = yyjson_get_str(yyjson_obj_get(req_root, "full_name"));		if (station == nullptr || show_time == 0 || mo == nullptr || mp == nullptr || (direct != 3 && direct != 4) || full_name == nullptr			|| mo_name == nullptr || mp_name == nullptr)		{			msg = "参数错误";			break;		}		auto strStation = UTF8toANSI(station);		auto strName = UTF8toANSI(full_name);		time_t tt;		time(&tt);		auto len = strlen(show_time);		if (len == 0) //取消参考曲线		{			auto strPath = CSimpleLog::GetAppDir() + "refer\\" +				fmt::format("{}.{}.{}.{}.json", strStation, mo, mp, direct).c_str();			if (CSimpleLog::PathFileExistsA(strPath))				DeleteFile(strPath);			ExecSqlForRecord(eRecord_Module::RM_REFER, 0, 0, strStation, strStation, mo, mo_name, mp, mp_name, 0, 0, tt, strName, "", eRocord_Opt::RO_CONFIG,				fmt::format("用户[{}]取消了[{}.{}][{}]的参考曲线",  strName, mo_name, mp_name, direct == 3 ? "定扳反" : "反扳定"));			msg = "操作成功.";			code = 200;			break;		}		int yy, mm, dd, hh, MM, SS, micromm;		auto ret_num = sscanf_s(show_time, "%d-%d-%d %d:%d:%d.%d", &yy, &mm, &dd, &hh, &MM, &SS, µmm);		if (ret_num != 7)		{			msg = "show_time参数错误";			break;		}		CString sql = fmt::format("SELECT start_time,idx FROM rm_move_{:0>4}{:0>2}  WHERE mo = '{}' and mp = '{}' and show_time = '{}'",			yy, mm, mo, mp, show_time).c_str();		COdbcStatement stmt;		if (CDBConnectPool::Instance()->DBQuery(stmt, sql) == FALSE)		{			ASSERT(FALSE);			msg = "语句执行失败:" + sql;			code = 500;			break;		}		TIMESTAMP_STRUCT ts = { 0 };		uint8_t idx = -1;		stmt.BindTimeStampCol(1, &ts);		stmt.BindTinyIntCol(2, &idx);		if (stmt.FetchNext() != 0)		{			msg = "查询转换记录失败";			code = 500;			break;		}		stmt.Close();		string imei; int idx_2;		if (CMonitorObjectMng::Instance()->MOMP2IMEI(string(mo), string(mp), imei, idx_2) == FALSE) 		{			msg = "查询imei失败";			code = 500;			break;		}		ASSERT(idx == idx_2);		CTime ctStart(ts.year, ts.month, ts.day, ts.hour, ts.minute, ts.second);		CTime ctEnd = ctStart + CTimeSpan(0, 0, 0, 30);		sql = fmt::format("  SELECT acquisitiontime,data0,data1,data2 FROM rm_resistance_{:0>4}{:0>2}{:0>2}\			WHERE IMEI = '{}' AND acquisitiontime between '{}' and '{}' AND idx = {}",			ts.year, ts.month, ts.day, imei, ctStart.Format("%Y-%m-%d %H:%M:%S"), ctEnd.Format("%Y-%m-%d %H:%M:%S"),idx		).c_str();		int sdata0, sdata1, sdata2;		if (CDBConnectPool::Instance()->DBQuery(stmt, sql) == FALSE)		{			ASSERT(FALSE);			msg = "语句执行失败:" + sql;			code = 500;			break;		}		int nCol = 1;		stmt.BindTimeStampCol(nCol++, &ts);		stmt.BindIntCol(nCol++, &sdata0);		stmt.BindIntCol(nCol++, &sdata1);		stmt.BindIntCol(nCol++, &sdata2);		int no = 0;		std::map<time_t, int> data0, data1, data2;		//time_t tmStart = ctStart.GetTime() * 1000; //存储数据时, 以起始时间为0		time_t tmShowTime = CTime(yy, mm, dd, hh, MM, SS).GetTime() * 1000 + micromm;		do		{			if (stmt.FetchNext() != 0)				break;			no++;			CTime ctTime;			try			{				ctTime = CTime(ts.year, ts.month, ts.day, ts.hour, ts.minute, ts.second);			}			catch (...)			{				continue;			}			time_t tm = ctTime.GetTime() * 1000 + ts.fraction / 1000000 - tmShowTime;			data0[tm] = sdata0;			data1[tm] = sdata1;			data2[tm] = sdata2;		} while (true);		stmt.Close();		if (no == 0)		{			msg = "数据为空";			code = 500;			break;		}		//存储数据		code = WriteReferFile(strStation, mo, mp, direct, data0, data1, data2, msg);		ExecSqlForRecord(eRecord_Module::RM_REFER, 0, 0, strStation, strStation, mo, mo_name, mp, mp_name, 0, 0, tt, strName, "", eRocord_Opt::RO_CONFIG,			fmt::format("用户[{}]设置了[{}.{}][{}]的参考曲线", strName, mo_name, mp_name, direct == 3 ? "定扳反" : "反扳定"));	} while (false);	yyjson_mut_obj_add_strcpy(doc, root, "msg", ANSItoUTF8(msg).c_str());	yyjson_mut_obj_add_int(doc, root, "code", code);	if (json) *json = yyjson_mut_write(doc, 0, json_len);	yyjson_doc_free(req_doc);	yyjson_mut_doc_free(doc);	return code;*/}int WriteReferFile(const string& station, const string& mo, const string& mp, uint8_t posi, 	const std::map<time_t, int>& data0, const std::map<time_t, int>& data1, const std::map<time_t, int>& data2, OUT string& msg){	string strJsonPath = fmt::format("{}refer\\{}.{}.{}.{}.json", CSimpleLog::GetAppDir(), station, mo, mp, posi);	string name1, name2, name3, out_name, in_name;	CMonitorObjectMng::Instance()->GetNameByMoMp(mo + "." + mp, name1, name2, name3, out_name, in_name);	auto doc = yyjson_mut_doc_new(nullptr);	auto root = yyjson_mut_obj(doc);	yyjson_mut_doc_set_root(doc, root);	yyjson_mut_obj_add_strcpy(doc, root, "station", ANSItoUTF8(station).c_str());	yyjson_mut_obj_add_strcpy(doc, root, "mo", mo.c_str());	yyjson_mut_obj_add_strcpy(doc, root, "mp", mp.c_str());	yyjson_mut_obj_add_int(doc, root, "posi", posi);	auto t = yyjson_mut_arr(doc);	yyjson_mut_obj_add_val(doc, root, "t", t);	auto d0 = yyjson_mut_arr(doc);	yyjson_mut_obj_add_val(doc, root, "d0", d0);	auto d1 = yyjson_mut_arr(doc);	yyjson_mut_obj_add_val(doc, root, "d1", d1);	auto d2 = yyjson_mut_arr(doc);	yyjson_mut_obj_add_val(doc, root, "d2", d2);	if (name1.find("定位") != -1)	{		yyjson_mut_obj_add_strcpy(doc, root, "name0", ANSItoUTF8("定位参考曲线").c_str());		yyjson_mut_obj_add_strcpy(doc, root, "name1", ANSItoUTF8("反位参考曲线").c_str());		yyjson_mut_obj_add_strcpy(doc, root, "name2", ANSItoUTF8("转换参考曲线").c_str());	}	else	{		yyjson_mut_obj_add_strcpy(doc, root, "name0", ANSItoUTF8("反位参考曲线").c_str());		yyjson_mut_obj_add_strcpy(doc, root, "name1", ANSItoUTF8("定位参考曲线").c_str());		yyjson_mut_obj_add_strcpy(doc, root, "name2", ANSItoUTF8("转换参考曲线").c_str());	}	for (auto& it : data0)	{		yyjson_mut_arr_add_int(doc, t, it.first);		yyjson_mut_arr_add_int(doc, d0, it.second);	}	for (auto& it : data1)		yyjson_mut_arr_add_int(doc, d1, it.second);	for (auto& it : data2)		yyjson_mut_arr_add_int(doc, d2, it.second);	yyjson_write_err err;	auto ret = yyjson_mut_write_file(strJsonPath.c_str(), doc, 0, nullptr, &err);	if (ret == false)	{		msg = fmt::format("写入文件错误:{} 错误码:{}", strJsonPath, err.msg);		CSimpleLog::Error(msg.c_str());		return 500;	}	msg = "处理成功.";	return 200;}int DealGetResistCurve(const httplib::Request& req, const string token, char** json, size_t* json_len){	string mo = req.get_param_value("mo");	string mp = req.get_param_value("mp");	string time = req.get_param_value("time");	string name = req.get_param_value("name");	if (mo.length() == 0 || mp.length() == 0 || time.length() == 0 || name.length() == 0)		return 400;	time_t uTime = atoll(time.c_str());	COleDateTime odt(uTime);	if (odt.GetStatus() == COleDateTime::invalid)		return 400;	auto doc = yyjson_mut_doc_new(nullptr);	auto root = yyjson_mut_obj(doc);	yyjson_mut_doc_set_root(doc, root);	auto convert_resist = yyjson_mut_obj(doc);	yyjson_mut_obj_add_val(doc, root, "convert_resist", convert_resist);//转换阻力	auto suobi_lock = yyjson_mut_obj(doc);	yyjson_mut_obj_add_val(doc, root, "suobi_lock", suobi_lock);//锁闭力数据	yyjson_mut_obj_add_str(doc, root, "name", name.c_str());	yyjson_mut_obj_add_str(doc, root, "unit", "N");	yyjson_mut_obj_add_uint(doc, root, "time", uTime);	//title	yyjson_mut_obj_add_strcpy(doc, convert_resist, "title", ANSItoUTF8("转换阻力峰值统计图").c_str());	yyjson_mut_obj_add_strcpy(doc, suobi_lock, "title", ANSItoUTF8("定反位锁闭力值统计图").c_str());	//curve_data and line	auto convert_curve_data = yyjson_mut_arr(doc);	yyjson_mut_obj_add_val(doc, convert_resist, "curve_data", convert_curve_data);	auto suobi_curve_data = yyjson_mut_arr(doc);	yyjson_mut_obj_add_val(doc, suobi_lock, "curve_data", suobi_curve_data);	auto convert_line = yyjson_mut_arr(doc);	yyjson_mut_obj_add_val(doc, convert_resist, "line", convert_line);	auto suobi_line = yyjson_mut_arr(doc);	yyjson_mut_obj_add_val(doc, suobi_lock, "line", suobi_line);	//curve_obj	auto d_convert_obj = yyjson_mut_obj(doc);	yyjson_mut_obj_add_strcpy(doc, d_convert_obj, "name", ANSItoUTF8("定扳反转换阻力峰值").c_str());	yyjson_mut_obj_add_str(doc, d_convert_obj, "color", "#a8ff78");// 苹果绿	yyjson_mut_arr_add_val(convert_curve_data, d_convert_obj);	auto f_convert_obj = yyjson_mut_obj(doc);	yyjson_mut_obj_add_strcpy(doc, f_convert_obj, "name", ANSItoUTF8("反扳定转换阻力峰值").c_str());	yyjson_mut_obj_add_str(doc, f_convert_obj, "color", "#FFE000");// 芒果黄	yyjson_mut_arr_add_val(convert_curve_data, f_convert_obj);	auto d_suobi_obj = yyjson_mut_obj(doc);	yyjson_mut_obj_add_strcpy(doc, d_suobi_obj, "name", ANSItoUTF8("定位锁闭力值").c_str());	yyjson_mut_obj_add_str(doc, d_suobi_obj, "color", "#a8ff78");// 苹果绿	yyjson_mut_arr_add_val(suobi_curve_data, d_suobi_obj);	auto f_suobi_obj = yyjson_mut_obj(doc);	yyjson_mut_obj_add_strcpy(doc, f_suobi_obj, "name", ANSItoUTF8("反位锁闭力值").c_str());	yyjson_mut_obj_add_str(doc, f_suobi_obj, "color", "#FFE000");// 芒果黄	yyjson_mut_arr_add_val(suobi_curve_data, f_suobi_obj);	//curve_data	auto d_convert_data = yyjson_mut_arr(doc);	yyjson_mut_obj_add_val(doc, d_convert_obj, "data", d_convert_data);	auto f_convert_data = yyjson_mut_arr(doc);	yyjson_mut_obj_add_val(doc, f_convert_obj, "data", f_convert_data);	auto d_suobi_data = yyjson_mut_arr(doc);	yyjson_mut_obj_add_val(doc, d_suobi_obj, "data", d_suobi_data);	auto f_suobi_data = yyjson_mut_arr(doc);	yyjson_mut_obj_add_val(doc, f_suobi_obj, "data", f_suobi_data);	//query	//查询数据库 填充 d_convert_data f_convert_data d_suobi_data f_suobi_data	{		string table_name = fmt::format("rm_move_{:0>4}{:0>2}", odt.GetYear(), odt.GetMonth());		CString sql = fmt::format("SELECT show_time,show_val,posi FROM {} WHERE mo = '{}' AND mp = '{}' AND show_time >= '{}' AND show_time <= '{}'", 			table_name, mo, mp, odt.Format("%Y-%m-%d 00:00:00"), odt.Format("%Y-%m-%d 23:59:59.999")).c_str();		COdbcStatement stmt;		if (CDBConnectPool::Instance()->DBQuery(stmt, sql))		{			int nCol = 1;			TIMESTAMP_STRUCT ts;			int show_val;			eDaoChaPosi posi;			stmt.BindTimeStampCol(nCol++, &ts);			stmt.BindIntCol(nCol++, &show_val);			stmt.BindTinyIntCol(nCol++, (BYTE*)&posi);			do 			{				if (stmt.FetchNext() != 0)					break;				CTime ctTime;				try				{					ctTime = CTime(ts.year, ts.month, ts.day, ts.hour, ts.minute, ts.second);				}				catch (...)				{					continue;				}				time_t tt = ctTime.GetTime() * 1000 + ts.fraction / 1000000;				auto o = yyjson_mut_arr(doc);				yyjson_mut_arr_add_int(doc, o, tt);				yyjson_mut_arr_add_int(doc, o, show_val);				switch (posi)				{				case eDaoChaPosi::DCP_FIX:					yyjson_mut_arr_add_val(d_suobi_data, o);					break;				case eDaoChaPosi::DCP_INVERT:					yyjson_mut_arr_add_val(f_suobi_data, o);					break;				case eDaoChaPosi::DCP_FIX2INVERT:					yyjson_mut_arr_add_val(d_convert_data, o);					break;				case eDaoChaPosi::DCP_INVERT2FIX:					yyjson_mut_arr_add_val(f_convert_data, o);					break;				default:					ASSERT(FALSE);					break;				}			} while (TRUE);		}		stmt.Close();	}	//line 	{		//转换阻力报警线		CONVERT_RESIST_OVER_LIMIT* pInfo = (CONVERT_RESIST_OVER_LIMIT*)CResistAlarmMng::Instance()->Find(mo, mp, 2, eZL_ALARMTYPE::CONVERT_LIMIT);		if (pInfo && pInfo->enable)		{			if (pInfo->dw_warn_low_limit > INT_MIN)			{				auto obj = yyjson_mut_obj(doc);				yyjson_mut_arr_add_val(convert_line, obj);				yyjson_mut_obj_add_strcpy(doc, obj, "name", ANSItoUTF8("预警线").c_str());				yyjson_mut_obj_add_int(doc, obj, "value", pInfo->dw_warn_low_limit);				yyjson_mut_obj_add_str(doc, obj, "color", "Orange");			}			if (pInfo->up_warn_high_limit < INT_MAX)			{				auto obj = yyjson_mut_obj(doc);				yyjson_mut_arr_add_val(convert_line, obj);				yyjson_mut_obj_add_strcpy(doc, obj, "name", ANSItoUTF8("预警线").c_str());				yyjson_mut_obj_add_int(doc, obj, "value", pInfo->up_warn_high_limit);				yyjson_mut_obj_add_str(doc, obj, "color", "Orange");			}			if (pInfo->dw_alarm_low_limit > INT_MIN)			{				auto obj = yyjson_mut_obj(doc);				yyjson_mut_arr_add_val(convert_line, obj);				yyjson_mut_obj_add_strcpy(doc, obj, "name", ANSItoUTF8("告警线").c_str());				yyjson_mut_obj_add_int(doc, obj, "value", pInfo->dw_alarm_low_limit);				yyjson_mut_obj_add_str(doc, obj, "color", "Red");			}			if (pInfo->up_alarm_high_limit < INT_MAX)			{				auto obj = yyjson_mut_obj(doc);				yyjson_mut_arr_add_val(convert_line, obj);				yyjson_mut_obj_add_strcpy(doc, obj, "name", ANSItoUTF8("告警线").c_str());				yyjson_mut_obj_add_int(doc, obj, "value", pInfo->up_alarm_high_limit);				yyjson_mut_obj_add_str(doc, obj, "color", "Red");			}		}	}	{		//锁闭力报警线		SUOBI_OVER_LIMIT_INFO* pInfo = (SUOBI_OVER_LIMIT_INFO*)CResistAlarmMng::Instance()->Find(mo, mp, -1, eZL_ALARMTYPE::SUOBI_LOCK_LIMIT);		if (pInfo && pInfo->enable)		{			if (pInfo->warn_low_limit > INT_MIN)			{				auto obj = yyjson_mut_obj(doc);				yyjson_mut_arr_add_val(suobi_line, obj);				yyjson_mut_obj_add_strcpy(doc, obj, "name", ANSItoUTF8("预警线").c_str());				yyjson_mut_obj_add_int(doc, obj, "value", pInfo->warn_low_limit);				yyjson_mut_obj_add_str(doc, obj, "color", "Orange");			}			if (pInfo->warn_high_limit < INT_MAX)			{				auto obj = yyjson_mut_obj(doc);				yyjson_mut_arr_add_val(suobi_line, obj);				yyjson_mut_obj_add_strcpy(doc, obj, "name", ANSItoUTF8("预警线").c_str());				yyjson_mut_obj_add_int(doc, obj, "value", pInfo->warn_high_limit);				yyjson_mut_obj_add_str(doc, obj, "color", "Orange");			}			if (pInfo->alarm_low_limit > INT_MIN)			{				auto obj = yyjson_mut_obj(doc);				yyjson_mut_arr_add_val(suobi_line, obj);				yyjson_mut_obj_add_strcpy(doc, obj, "name", ANSItoUTF8("告警线").c_str());				yyjson_mut_obj_add_int(doc, obj, "value", pInfo->alarm_low_limit);				yyjson_mut_obj_add_str(doc, obj, "color", "Red");			}			if (pInfo->alarm_high_limit < INT_MAX)			{				auto obj = yyjson_mut_obj(doc);				yyjson_mut_arr_add_val(suobi_line, obj);				yyjson_mut_obj_add_strcpy(doc, obj, "name", ANSItoUTF8("告警线").c_str());				yyjson_mut_obj_add_int(doc, obj, "value", pInfo->alarm_high_limit);				yyjson_mut_obj_add_str(doc, obj, "color", "Red");			}		}	}	{		//定位锁闭力报警线		SUOBI_OVER_LIMIT_INFO* pInfo = (SUOBI_OVER_LIMIT_INFO*)CResistAlarmMng::Instance()->Find(mo, mp, (uint8_t)eSuoBiPosi::SB_FIX, eZL_ALARMTYPE::SUOBI_LOCK_LIMIT);		if (pInfo && pInfo->enable)		{			if (pInfo->warn_low_limit > INT_MIN)			{				auto obj = yyjson_mut_obj(doc);				yyjson_mut_arr_add_val(suobi_line, obj);				yyjson_mut_obj_add_strcpy(doc, obj, "name", ANSItoUTF8("定位预警线").c_str());				yyjson_mut_obj_add_int(doc, obj, "value", pInfo->warn_low_limit);				yyjson_mut_obj_add_str(doc, obj, "color", "Orange");			}			if (pInfo->warn_high_limit < INT_MAX)			{				auto obj = yyjson_mut_obj(doc);				yyjson_mut_arr_add_val(suobi_line, obj);				yyjson_mut_obj_add_strcpy(doc, obj, "name", ANSItoUTF8("定位预警线").c_str());				yyjson_mut_obj_add_int(doc, obj, "value", pInfo->warn_high_limit);				yyjson_mut_obj_add_str(doc, obj, "color", "Orange");			}			if (pInfo->alarm_low_limit > INT_MIN)			{				auto obj = yyjson_mut_obj(doc);				yyjson_mut_arr_add_val(suobi_line, obj);				yyjson_mut_obj_add_strcpy(doc, obj, "name", ANSItoUTF8("定位告警线").c_str());				yyjson_mut_obj_add_int(doc, obj, "value", pInfo->alarm_low_limit);				yyjson_mut_obj_add_str(doc, obj, "color", "Red");			}			if (pInfo->alarm_high_limit < INT_MAX)			{				auto obj = yyjson_mut_obj(doc);				yyjson_mut_arr_add_val(suobi_line, obj);				yyjson_mut_obj_add_strcpy(doc, obj, "name", ANSItoUTF8("定位告警线").c_str());				yyjson_mut_obj_add_int(doc, obj, "value", pInfo->alarm_high_limit);				yyjson_mut_obj_add_str(doc, obj, "color", "Red");			}		}	}	{		//反位锁闭力报警线		SUOBI_OVER_LIMIT_INFO* pInfo = (SUOBI_OVER_LIMIT_INFO*)CResistAlarmMng::Instance()->Find(mo, mp, (uint8_t)eSuoBiPosi::SB_INVERT, eZL_ALARMTYPE::SUOBI_LOCK_LIMIT);		if (pInfo && pInfo->enable)		{			if (pInfo->warn_low_limit > INT_MIN)			{				auto obj = yyjson_mut_obj(doc);				yyjson_mut_arr_add_val(suobi_line, obj);				yyjson_mut_obj_add_strcpy(doc, obj, "name", ANSItoUTF8("反位预警线").c_str());				yyjson_mut_obj_add_int(doc, obj, "value", pInfo->warn_low_limit);				yyjson_mut_obj_add_str(doc, obj, "color", "Orange");			}			if (pInfo->warn_high_limit < INT_MAX)			{				auto obj = yyjson_mut_obj(doc);				yyjson_mut_arr_add_val(suobi_line, obj);				yyjson_mut_obj_add_strcpy(doc, obj, "name", ANSItoUTF8("反位预警线").c_str());				yyjson_mut_obj_add_int(doc, obj, "value", pInfo->warn_high_limit);				yyjson_mut_obj_add_str(doc, obj, "color", "Orange");			}			if (pInfo->alarm_low_limit > INT_MIN)			{				auto obj = yyjson_mut_obj(doc);				yyjson_mut_arr_add_val(suobi_line, obj);				yyjson_mut_obj_add_strcpy(doc, obj, "name", ANSItoUTF8("反位告警线").c_str());				yyjson_mut_obj_add_int(doc, obj, "value", pInfo->alarm_low_limit);				yyjson_mut_obj_add_str(doc, obj, "color", "Red");			}			if (pInfo->alarm_high_limit < INT_MAX)			{				auto obj = yyjson_mut_obj(doc);				yyjson_mut_arr_add_val(suobi_line, obj);				yyjson_mut_obj_add_strcpy(doc, obj, "name", ANSItoUTF8("反位告警线").c_str());				yyjson_mut_obj_add_int(doc, obj, "value", pInfo->alarm_high_limit);				yyjson_mut_obj_add_str(doc, obj, "color", "Red");			}		}	}	*json = yyjson_mut_write(doc, 0, json_len);	yyjson_mut_doc_free(doc);	return 200;}int DealGetResistReport(const httplib::Request& req, const string token, char** json, size_t* json_len){	string station = req.get_param_value("station");	string time = req.get_param_value("time");	if (time.length() == 0 || station.length() == 0)		return 400;	time_t uTime = atoll(time.c_str());	COleDateTime odt(uTime);	if (odt.GetStatus() == COleDateTime::invalid)		return 400;	auto doc = yyjson_mut_doc_new(nullptr);	auto root = yyjson_mut_arr(doc);	yyjson_mut_doc_set_root(doc, root);	{		string strStation = UTF8toANSI(station);		string table_name = fmt::format("rm_move_{:0>4}{:0>2}", odt.GetYear(), odt.GetMonth());		CString sql = fmt::format("SELECT A.*,B.name FROM (SELECT mo, mp, posi, count(*) as num, max(show_val) as l, min(show_val) as s, sum(show_val) as sum FROM {} WHERE mo in (SELECT id FROM rm_mo WHERE up = '{}') AND show_time >= '{}' AND show_time <= '{}' GROUP BY mo, mp, posi) AS A \			LEFT JOIN rm_mo AS B ON A.mo = B.id",			table_name, strStation, odt.Format("%Y-%m-%d 00:00:00"), odt.Format("%Y-%m-%d 23:59:59.999")).c_str();		//SELECT A.*,B.name FROM (SELECT mo, mp, posi, count(*) as num, max(show_val) as l, min(show_val) as s FROM rm_move_202301 WHERE mo in (SELECT id FROM rm_mo WHERE up = '温州南站') AND show_time >= '2023-01-10 00:00:00' AND show_time <= '2023-01-10 23:59:59.999' GROUP BY mo, mp, posi) AS A 			LEFT JOIN rm_mo AS B ON A.mo = B.id		COdbcStatement stmt;		struct tagData		{			string mo_name;			string mo;			string mp;			int d_convert_resist = INT_MAX;			int d_convert_resist_max = INT_MAX;			int d_convert_resist_min = INT_MAX;			int d_convert_resist_avg = INT_MAX;			uint8_t d_convert_resist_max_color = 0;   //0 为正常   1 为预警    2 为报警			uint8_t d_convert_resist_min_color = 0;			uint8_t d_convert_resist_avg_color = 0;			int f_convert_resist = INT_MAX;			int f_convert_resist_max = INT_MAX;			int f_convert_resist_min = INT_MAX;			int f_convert_resist_avg = INT_MAX;			uint8_t f_convert_resist_max_color = 0;			uint8_t f_convert_resist_min_color = 0;			uint8_t f_convert_resist_avg_color = 0;			int d_suobi_lock = INT_MAX;			int d_suobi_lock_max = INT_MAX;			int d_suobi_lock_min = INT_MAX;			int d_suobi_lock_avg = INT_MAX;			uint8_t d_suobi_lock_max_color = 0;			uint8_t d_suobi_lock_min_color = 0;			uint8_t d_suobi_lock_avg_color = 0;			int f_suobi_lock = INT_MAX;			int f_suobi_lock_max = INT_MAX;			int f_suobi_lock_min = INT_MAX;			int f_suobi_lock_avg = INT_MAX;			uint8_t f_suobi_lock_max_color = 0;			uint8_t f_suobi_lock_min_color = 0;			uint8_t f_suobi_lock_avg_color = 0;		};		std::map<string, tagData> mapData;		if (CDBConnectPool::Instance()->DBQuery(stmt, sql))		{			int nCol = 1;			char mo[50], mp[50], mo_name[50];			int num;			int max;			int min;			int64_t sum;			eDaoChaPosi posi;			stmt.BindCharCol(nCol++, mo, sizeof(mo));			stmt.BindCharCol(nCol++, mp, sizeof(mp));			stmt.BindTinyIntCol(nCol++, (BYTE*)&posi);			stmt.BindIntCol(nCol++, &num);			stmt.BindIntCol(nCol++, &max);			stmt.BindIntCol(nCol++, &min);			stmt.BindBigIntCol(nCol++, &sum);			stmt.BindCharCol(nCol++, mo_name, sizeof(mo_name));			do			{				if (stmt.FetchNext() != 0)					break;				SUOBI_OVER_LIMIT_INFO* pInfo = nullptr;				CONVERT_RESIST_OVER_LIMIT* pInfo2 = nullptr;				auto& it = mapData[fmt::format("{}.{}", mo, mp)];				it.mo_name = mo_name;				it.mo = mo;				it.mp = mp;				eSuoBiPosi idx;				switch (posi)				{				case eDaoChaPosi::DCP_FIX:					it.d_suobi_lock = num;					it.d_suobi_lock_max = max;					it.d_suobi_lock_min = min;					if (num) it.d_suobi_lock_avg = sum / num;					idx = eSuoBiPosi::SB_FIX;					pInfo = (SUOBI_OVER_LIMIT_INFO*)CResistAlarmMng::Instance()->Find(mo, mp, (uint8_t)idx, eZL_ALARMTYPE::SUOBI_LOCK_LIMIT);					if (pInfo && pInfo->enable)					{						if (max > pInfo->alarm_high_limit)							it.d_suobi_lock_max_color = UINT8_ALARM;						else if (max > pInfo->warn_high_limit)							it.d_suobi_lock_max_color = UINT8_WARN;						if (min < pInfo->alarm_low_limit)							it.d_suobi_lock_min_color = UINT8_ALARM;						else if (min < pInfo->warn_low_limit)							it.d_suobi_lock_min_color = UINT8_WARN;						if (num && (it.d_suobi_lock_avg > pInfo->alarm_high_limit || it.d_suobi_lock_avg < pInfo->alarm_low_limit))							it.d_suobi_lock_avg_color = UINT8_ALARM;						else if (num && (it.d_suobi_lock_avg > pInfo->warn_high_limit || it.d_suobi_lock_avg < pInfo->warn_low_limit))							it.d_suobi_lock_avg_color = UINT8_WARN;					}					break;				case eDaoChaPosi::DCP_INVERT:					it.f_suobi_lock = num;					it.f_suobi_lock_max = max;					it.f_suobi_lock_min = min;					if (num) it.f_suobi_lock_avg = sum / num;					idx = eSuoBiPosi::SB_INVERT;					pInfo = (SUOBI_OVER_LIMIT_INFO*)CResistAlarmMng::Instance()->Find(mo, mp, (uint8_t)idx, eZL_ALARMTYPE::SUOBI_LOCK_LIMIT);					if (pInfo && pInfo->enable)					{						if (max > pInfo->alarm_high_limit)							it.f_suobi_lock_max_color = UINT8_ALARM;						else if (max > pInfo->warn_high_limit)							it.f_suobi_lock_max_color = UINT8_WARN;						if (min < pInfo->alarm_low_limit)							it.f_suobi_lock_min_color = UINT8_ALARM;						else if (min < pInfo->warn_low_limit)							it.f_suobi_lock_min_color = UINT8_WARN;						if (num && (it.f_suobi_lock_avg > pInfo->alarm_high_limit || it.f_suobi_lock_avg < pInfo->alarm_low_limit))							it.f_suobi_lock_avg_color = UINT8_ALARM;						else if (num && (it.f_suobi_lock_avg > pInfo->warn_high_limit || it.f_suobi_lock_avg < pInfo->warn_low_limit))							it.f_suobi_lock_avg_color = UINT8_WARN;					}					break;				case eDaoChaPosi::DCP_FIX2INVERT:					it.d_convert_resist = num;					it.d_convert_resist_max = max;					it.d_convert_resist_min = min;					if (num) it.d_convert_resist_avg = sum / num;					pInfo2 = (CONVERT_RESIST_OVER_LIMIT*)CResistAlarmMng::Instance()->Find(mo, mp, 2, eZL_ALARMTYPE::CONVERT_LIMIT);					if (pInfo2 && pInfo2->enable)					{						string name1, name2, name3, out_name, in_name;						CMonitorObjectMng::Instance()->GetNameByMoMp(fmt::format("{}.{}", mo, mp), name1, name2, name3, out_name, in_name);						if (in_name.find("定扳反") == -1) //如果缩进不是定扳反, 那就是伸出						{							if (max > pInfo2->dw_alarm_low_limit)								it.d_convert_resist_max_color = UINT8_ALARM;							else if (max > pInfo2->dw_warn_low_limit)								it.d_convert_resist_max_color = UINT8_WARN;							if (num && it.d_convert_resist_avg > pInfo2->dw_alarm_low_limit)								it.d_convert_resist_avg_color = UINT8_ALARM;							else if (num && it.d_convert_resist_avg > pInfo2->dw_warn_low_limit)								it.d_convert_resist_avg_color = UINT8_WARN;						}						else						{							if (max > pInfo2->up_alarm_high_limit)								it.d_convert_resist_max_color = UINT8_ALARM;							else if (max > pInfo2->up_warn_high_limit)								it.d_convert_resist_max_color = UINT8_WARN;							if (num && it.d_convert_resist_avg > pInfo2->up_alarm_high_limit)								it.d_convert_resist_avg_color = UINT8_ALARM;							else if (num && it.d_convert_resist_avg > pInfo2->up_warn_high_limit)								it.d_convert_resist_avg_color = UINT8_WARN;						}					}					break;				case eDaoChaPosi::DCP_INVERT2FIX:					it.f_convert_resist = num;					it.f_convert_resist_max = max;					it.f_convert_resist_min = min;					if (num) it.f_convert_resist_avg = sum / num;					pInfo2 = (CONVERT_RESIST_OVER_LIMIT*)CResistAlarmMng::Instance()->Find(mo, mp, 2, eZL_ALARMTYPE::CONVERT_LIMIT);					if (pInfo2 && pInfo2->enable)					{						string name1, name2, name3, out_name, in_name;						CMonitorObjectMng::Instance()->GetNameByMoMp(fmt::format("{}.{}", mo, mp), name1, name2, name3, out_name, in_name);						if (in_name.find("反扳定") != -1) //如果反扳定是缩进						{							if (max > pInfo2->up_alarm_high_limit)								it.f_convert_resist_max_color = UINT8_ALARM;							else if (max > pInfo2->up_warn_high_limit)								it.f_convert_resist_max_color = UINT8_WARN;							if (num && it.f_convert_resist_avg > pInfo2->up_alarm_high_limit)								it.f_convert_resist_avg_color = UINT8_ALARM;							else if (num && it.f_convert_resist_avg > pInfo2->up_warn_high_limit)								it.f_convert_resist_avg_color = UINT8_WARN;						}						else						{							if (max > pInfo2->dw_alarm_low_limit)								it.f_convert_resist_max_color = UINT8_ALARM;							else if (max > pInfo2->dw_warn_low_limit)								it.f_convert_resist_max_color = UINT8_WARN;							if (num && it.f_convert_resist_avg > pInfo2->dw_alarm_low_limit)								it.f_convert_resist_avg_color = UINT8_ALARM;							else if (num && it.f_convert_resist_avg > pInfo2->dw_warn_low_limit)								it.f_convert_resist_avg_color = UINT8_WARN;						}					}					break;				default:					ASSERT(FALSE);					break;				}			} while (TRUE);		}		stmt.Close();		for (auto& it : mapData)		{			auto obj = yyjson_mut_obj(doc);			yyjson_mut_arr_add_val(root, obj);			yyjson_mut_obj_add_strcpy(doc, obj, "mo_name", ANSItoUTF8(it.second.mo_name).c_str());			yyjson_mut_obj_add_strcpy(doc, obj, "mo", it.second.mo.c_str());			yyjson_mut_obj_add_strcpy(doc, obj, "mp", it.second.mp.c_str());			if (it.second.d_convert_resist != INT_MAX)				yyjson_mut_obj_add_int(doc, obj, "d_convert_resist", it.second.d_convert_resist);			else				yyjson_mut_obj_add_str(doc, obj, "d_convert_resist", "-");			if (it.second.d_convert_resist_max != INT_MAX)				yyjson_mut_obj_add_int(doc, obj, "d_convert_resist_max", it.second.d_convert_resist_max);			else				yyjson_mut_obj_add_str(doc, obj, "d_convert_resist_max", "-");			if (it.second.d_convert_resist_min != INT_MAX)				yyjson_mut_obj_add_int(doc, obj, "d_convert_resist_min", it.second.d_convert_resist_min);			else				yyjson_mut_obj_add_str(doc, obj, "d_convert_resist_min", "-");			if (it.second.d_convert_resist_avg != INT_MAX)				yyjson_mut_obj_add_int(doc, obj, "d_convert_resist_avg", it.second.d_convert_resist_avg);			else				yyjson_mut_obj_add_str(doc, obj, "d_convert_resist_avg", "-");			//颜色			if (it.second.d_convert_resist_max_color == UINT8_ALARM)				yyjson_mut_obj_add_str(doc, obj, "d_convert_resist_max_color", "red");			else if (it.second.d_convert_resist_max_color == UINT8_WARN)				yyjson_mut_obj_add_str(doc, obj, "d_convert_resist_max_color", "orange");			if (it.second.d_convert_resist_min_color == UINT8_ALARM)				yyjson_mut_obj_add_str(doc, obj, "d_convert_resist_min_color", "red");			else if (it.second.d_convert_resist_min_color == UINT8_WARN)				yyjson_mut_obj_add_str(doc, obj, "d_convert_resist_min_color", "orange");			if (it.second.d_convert_resist_avg_color == UINT8_ALARM)				yyjson_mut_obj_add_str(doc, obj, "d_convert_resist_avg_color", "red");			else if (it.second.d_convert_resist_avg_color == UINT8_WARN)				yyjson_mut_obj_add_str(doc, obj, "d_convert_resist_avg_color", "orange");			if (it.second.f_convert_resist != INT_MAX)				yyjson_mut_obj_add_int(doc, obj, "f_convert_resist", it.second.f_convert_resist);			else 				yyjson_mut_obj_add_str(doc, obj, "f_convert_resist", "-");			if (it.second.f_convert_resist_max != INT_MAX)				yyjson_mut_obj_add_int(doc, obj, "f_convert_resist_max", it.second.f_convert_resist_max);			else				yyjson_mut_obj_add_str(doc, obj, "f_convert_resist_max", "-");			if (it.second.f_convert_resist_min != INT_MAX)				yyjson_mut_obj_add_int(doc, obj, "f_convert_resist_min", it.second.f_convert_resist_min);			else				yyjson_mut_obj_add_str(doc, obj, "f_convert_resist_min", "-");			if (it.second.f_convert_resist_avg != INT_MAX)				yyjson_mut_obj_add_int(doc, obj, "f_convert_resist_avg", it.second.f_convert_resist_avg);			else				yyjson_mut_obj_add_str(doc, obj, "f_convert_resist_avg", "-");			//颜色			if (it.second.f_convert_resist_max_color == UINT8_ALARM)				yyjson_mut_obj_add_str(doc, obj, "f_convert_resist_max_color", "red");			else if (it.second.f_convert_resist_max_color == UINT8_WARN)				yyjson_mut_obj_add_str(doc, obj, "f_convert_resist_max_color", "orange");			if (it.second.f_convert_resist_min_color == UINT8_ALARM)				yyjson_mut_obj_add_str(doc, obj, "f_convert_resist_min_color", "red");			else if (it.second.f_convert_resist_min_color == UINT8_WARN)				yyjson_mut_obj_add_str(doc, obj, "f_convert_resist_min_color", "orange");			if (it.second.f_convert_resist_avg_color == UINT8_ALARM)				yyjson_mut_obj_add_str(doc, obj, "f_convert_resist_avg_color", "red");			else if (it.second.f_convert_resist_avg_color == UINT8_WARN)				yyjson_mut_obj_add_str(doc, obj, "f_convert_resist_avg_color", "orange");			if (it.second.d_suobi_lock != INT_MAX)				yyjson_mut_obj_add_int(doc, obj, "d_suobi_lock", it.second.d_suobi_lock);			else				yyjson_mut_obj_add_str(doc, obj, "d_suobi_lock", "-");			if (it.second.d_suobi_lock_max != INT_MAX)				yyjson_mut_obj_add_int(doc, obj, "d_suobi_lock_max", it.second.d_suobi_lock_max);			else				yyjson_mut_obj_add_str(doc, obj, "d_suobi_lock_max", "-");			if (it.second.d_suobi_lock_min != INT_MAX)				yyjson_mut_obj_add_int(doc, obj, "d_suobi_lock_min", it.second.d_suobi_lock_min);			else				yyjson_mut_obj_add_str(doc, obj, "d_suobi_lock_min", "-");			if (it.second.d_suobi_lock_avg != INT_MAX)				yyjson_mut_obj_add_int(doc, obj, "d_suobi_lock_avg", it.second.d_suobi_lock_avg);			else				yyjson_mut_obj_add_str(doc, obj, "d_suobi_lock_avg", "-");			//颜色			if (it.second.d_suobi_lock_max_color == UINT8_ALARM)				yyjson_mut_obj_add_str(doc, obj, "d_suobi_lock_max_color", "red");			else if (it.second.d_suobi_lock_max_color == UINT8_WARN)				yyjson_mut_obj_add_str(doc, obj, "d_suobi_lock_max_color", "orange");			if (it.second.d_suobi_lock_min_color == UINT8_ALARM)				yyjson_mut_obj_add_str(doc, obj, "d_suobi_lock_min_color", "red");			else if (it.second.d_suobi_lock_min_color == UINT8_WARN)				yyjson_mut_obj_add_str(doc, obj, "d_suobi_lock_min_color", "orange");			if (it.second.d_suobi_lock_avg_color == UINT8_ALARM)				yyjson_mut_obj_add_str(doc, obj, "d_suobi_lock_avg_color", "red");			else if (it.second.d_suobi_lock_avg_color == UINT8_WARN)				yyjson_mut_obj_add_str(doc, obj, "d_suobi_lock_avg_color", "orange");			if (it.second.f_suobi_lock != INT_MAX)				yyjson_mut_obj_add_int(doc, obj, "f_suobi_lock", it.second.f_suobi_lock);			else				yyjson_mut_obj_add_str(doc, obj, "f_suobi_lock", "-");			if (it.second.f_suobi_lock_max != INT_MAX)				yyjson_mut_obj_add_int(doc, obj, "f_suobi_lock_max", it.second.f_suobi_lock_max);			else				yyjson_mut_obj_add_str(doc, obj, "f_suobi_lock_max", "-");			if (it.second.f_suobi_lock_min!= INT_MAX)				yyjson_mut_obj_add_int(doc, obj, "f_suobi_lock_min", it.second.f_suobi_lock_min);			else				yyjson_mut_obj_add_str(doc, obj, "f_suobi_lock_min", "-");			if (it.second.f_suobi_lock_avg != INT_MAX)				yyjson_mut_obj_add_int(doc, obj, "f_suobi_lock_avg", it.second.f_suobi_lock_avg);			else				yyjson_mut_obj_add_str(doc, obj, "f_suobi_lock_avg", "-");			//颜色			if (it.second.f_suobi_lock_max_color == UINT8_ALARM)				yyjson_mut_obj_add_str(doc, obj, "f_suobi_lock_max_color", "red");			else if (it.second.f_suobi_lock_max_color == UINT8_WARN)				yyjson_mut_obj_add_str(doc, obj, "f_suobi_lock_max_color", "orange");			if (it.second.f_suobi_lock_min_color == UINT8_ALARM)				yyjson_mut_obj_add_str(doc, obj, "f_suobi_lock_min_color", "red");			else if (it.second.f_suobi_lock_min_color == UINT8_WARN)				yyjson_mut_obj_add_str(doc, obj, "f_suobi_lock_min_color", "orange");			if (it.second.f_suobi_lock_avg_color == UINT8_ALARM)				yyjson_mut_obj_add_str(doc, obj, "f_suobi_lock_avg_color", "red");			else if (it.second.f_suobi_lock_avg_color == UINT8_WARN)				yyjson_mut_obj_add_str(doc, obj, "f_suobi_lock_avg_color", "orange");		}	}	*json = yyjson_mut_write(doc, 0, json_len);	yyjson_mut_doc_free(doc);	return 200;}int DealGetMoveInfo(const httplib::Request& req, const string token, char** json, size_t* json_len){	string mo = req.get_param_value("mo");	string mp = req.get_param_value("mp");	string start_time = req.get_param_value("start_time");	string end_time = req.get_param_value("end_time");	if (mo.length() == 0 || mp.length() == 0 || start_time.length() == 0 || end_time.length() == 0)		return 400;	auto doc = yyjson_mut_doc_new(nullptr);	auto root = yyjson_mut_obj(doc);	yyjson_mut_doc_set_root(doc, root);	auto data = yyjson_mut_arr(doc);	yyjson_mut_obj_add_val(doc, root, "data", data);	COleDateTime odtStart, odtEnd;	do {		auto ret_time = odtEnd.ParseDateTime(end_time.c_str());		if (ret_time == FALSE)			break;		ret_time = odtStart.ParseDateTime(start_time.c_str());		if (ret_time == FALSE)			break;		if (odtEnd <= odtStart)			break;		auto fix_object = yyjson_mut_obj(doc);		yyjson_mut_arr_add_val(data, fix_object);		auto invert_object = yyjson_mut_obj(doc);		yyjson_mut_arr_add_val(data, invert_object);		auto convert_object = yyjson_mut_obj(doc);		yyjson_mut_arr_add_val(data, convert_object);		static string fix_name = ANSItoUTF8("定位测力曲线");		yyjson_mut_obj_add_str(doc, fix_object, "name", fix_name.c_str());		static string invert_name = ANSItoUTF8("反位测力曲线");		yyjson_mut_obj_add_str(doc, invert_object, "name", invert_name.c_str());		static string convert_name = ANSItoUTF8("转换阻力曲线");		yyjson_mut_obj_add_str(doc, convert_object, "name", convert_name.c_str());		static string lock_low = ANSItoUTF8("锁闭力过低");		auto fix_points = yyjson_mut_arr(doc);		yyjson_mut_obj_add_val(doc, fix_object, "mark_points", fix_points);		auto invert_points = yyjson_mut_arr(doc);		yyjson_mut_obj_add_val(doc, invert_object, "mark_points", invert_points);		auto convert_points = yyjson_mut_arr(doc);		yyjson_mut_obj_add_val(doc, convert_object, "mark_points", convert_points);		string table_name = fmt::format("rm_move_{:0>4}{:0>2}", odtStart.GetYear(), odtStart.GetMonth());		CString sql = fmt::format("SELECT show_time, curr_val, show_val, posi, mark FROM {} \			WHERE mo = '{}' AND mp = '{}' AND show_time >= '{}' AND show_time <= '{}' order by posi, show_time", 			table_name, mo, mp, start_time, end_time).c_str();		COdbcStatement stmt;		if (CDBConnectPool::Instance()->DBQuery(stmt, sql))		{			TIMESTAMP_STRUCT ts;			int curr_val;			int show_val;			eDaoChaPosi posi;			char mark[200];			int nCol = 1;			stmt.BindTimeStampCol(nCol++, &ts);			stmt.BindIntCol(nCol++, &curr_val);			stmt.BindIntCol(nCol++, &show_val);			stmt.BindTinyIntCol(nCol++, (BYTE*)&posi);			stmt.BindCharCol(nCol++, mark, sizeof(mark));			do			{				if (stmt.FetchNext() != 0)					break;				auto obj = yyjson_mut_obj(doc);				switch (posi)				{				case eDaoChaPosi::DCP_FIX:				{					yyjson_mut_arr_add_val(fix_points, obj);					auto coord = yyjson_mut_arr(doc);					yyjson_mut_obj_add_val(doc, obj, "coord", coord);					yyjson_mut_arr_add_int(doc, coord, CTime(ts.year, ts.month, ts.day, ts.hour, ts.minute, ts.second).GetTime() * 1000 + ts.fraction / 1000000);					yyjson_mut_arr_add_int(doc, coord, curr_val);					yyjson_mut_obj_add_strcpy(doc, obj, "time", fmt::format("{:0>4}-{:0>2}-{:0>2} {:0>2}:{:0>2}:{:0>2}.{:0>3}",						ts.year, ts.month, ts.day, ts.hour, ts.minute, ts.second, ts.fraction / 1000000).c_str());					yyjson_mut_obj_add_int(doc, obj, "val", show_val);					if (show_val < 500)					{						yyjson_mut_obj_add_str(doc, obj, "color", "Orange");						yyjson_mut_obj_add_str(doc, obj, "label", lock_low.c_str());					}					else					{						yyjson_mut_obj_add_strcpy(doc, obj, "label", ANSItoUTF8(fmt::format("锁闭力:{}", show_val)).c_str());					}				}					break;				case eDaoChaPosi::DCP_INVERT:				{					yyjson_mut_arr_add_val(invert_points, obj);					auto coord = yyjson_mut_arr(doc);					yyjson_mut_obj_add_val(doc, obj, "coord", coord);					yyjson_mut_arr_add_int(doc, coord, CTime(ts.year, ts.month, ts.day, ts.hour, ts.minute, ts.second).GetTime() * 1000 + ts.fraction / 1000000);					yyjson_mut_arr_add_int(doc, coord, curr_val);					yyjson_mut_obj_add_strcpy(doc, obj, "time", fmt::format("{:0>4}-{:0>2}-{:0>2} {:0>2}:{:0>2}:{:0>2}.{:0>3}",						ts.year, ts.month, ts.day, ts.hour, ts.minute, ts.second, ts.fraction / 1000000).c_str());					yyjson_mut_obj_add_int(doc, obj, "val", show_val);					if (show_val < 500)					{						yyjson_mut_obj_add_str(doc, obj, "color", "Orange");						yyjson_mut_obj_add_str(doc, obj, "label", lock_low.c_str());					}					else					{						yyjson_mut_obj_add_strcpy(doc, obj, "label", ANSItoUTF8(fmt::format("锁闭力:{}", show_val)).c_str());					}				}					break;				case eDaoChaPosi::DCP_FIX2INVERT:				{					yyjson_mut_arr_add_val(convert_points, obj);					auto coord = yyjson_mut_arr(doc);					yyjson_mut_obj_add_val(doc, obj, "coord", coord);					yyjson_mut_arr_add_int(doc, coord, CTime(ts.year, ts.month, ts.day, ts.hour, ts.minute, ts.second).GetTime() * 1000 + ts.fraction / 1000000);					yyjson_mut_arr_add_int(doc, coord, curr_val);					yyjson_mut_obj_add_strcpy(doc, obj, "time", fmt::format("{:0>4}-{:0>2}-{:0>2} {:0>2}:{:0>2}:{:0>2}.{:0>3}",						ts.year, ts.month, ts.day, ts.hour, ts.minute, ts.second, ts.fraction / 1000000).c_str());					yyjson_mut_obj_add_int(doc, obj, "val", show_val);					if (curr_val < 0)						yyjson_mut_obj_add_str(doc, obj, "position", "bottom");					yyjson_mut_obj_add_strcpy(doc, obj, "label", ANSItoUTF8(fmt::format("定扳反:{}", show_val)).c_str());				}					break;				case eDaoChaPosi::DCP_INVERT2FIX:				{					yyjson_mut_arr_add_val(convert_points, obj);					auto coord = yyjson_mut_arr(doc);					yyjson_mut_obj_add_val(doc, obj, "coord", coord);					yyjson_mut_arr_add_int(doc, coord, CTime(ts.year, ts.month, ts.day, ts.hour, ts.minute, ts.second).GetTime() * 1000 + ts.fraction / 1000000);					yyjson_mut_arr_add_int(doc, coord, curr_val);					yyjson_mut_obj_add_strcpy(doc, obj, "time", fmt::format("{:0>4}-{:0>2}-{:0>2} {:0>2}:{:0>2}:{:0>2}.{:0>3}",						ts.year, ts.month, ts.day, ts.hour, ts.minute, ts.second, ts.fraction / 1000000).c_str());					yyjson_mut_obj_add_int(doc, obj, "val", show_val);					if (curr_val < 0)						yyjson_mut_obj_add_str(doc, obj, "position", "bottom");					yyjson_mut_obj_add_strcpy(doc, obj, "label", ANSItoUTF8(fmt::format("反扳定:{}", show_val)).c_str());				}				break;				default:					ASSERT(FALSE);					break;				}			} while (TRUE);		}		stmt.Close();			}while (false);	*json = yyjson_mut_write(doc, 0, json_len);	yyjson_mut_doc_free(doc);	return 200;}
 |