MaterialMgrCnn.h 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519
  1. #ifndef RVC_MODULE_MATERIALMGR_CNN_H_
  2. #define RVC_MODULE_MATERIALMGR_CNN_H_
  3. #pragma once
  4. #include "IHttpFunc.h"
  5. #include <vector>
  6. #include "json/json.h"
  7. #include "SpSecureClient.h"
  8. #include "GUIConsole_def_g.h"
  9. #include <ctime>
  10. using namespace GUIConsole;
  11. #pragma pack(1)
  12. // 部署位置调整
  13. // [StructName("ModInfoR")]
  14. struct ModifyEnrollInfoReq
  15. {
  16. //char UserID[16]; // 登录用户
  17. //BYTE Password[16]; // 登录密码(Hash)
  18. char TerminalNo[16]; // 终端号码
  19. BYTE EnrolGPS[8]; // 终端GPS坐标点
  20. char EnrolAddr[128]; // 终端部署地址
  21. };
  22. // 递增物料使用计数
  23. //[StructName("AddMCR")]
  24. struct AddMaterialCounterReq
  25. {
  26. //TerminalNo 终端号 字符数字 16
  27. char TerminalNo[16];
  28. //Materiel 物料代码 字符 16
  29. char Material[16];
  30. };
  31. // [StructName("AddTMR")]
  32. struct AddTradeManageReq
  33. {
  34. char TerminalNo[16];
  35. char AgentID[16];
  36. char Time[32];
  37. };
  38. //查询物料数据
  39. //[StructName("QryMCR")]
  40. struct QueryMaterialInfoReq
  41. {
  42. char DeviceNo[16];
  43. };
  44. //[StructName("QryMCA2")]
  45. struct QueryMaterialInfoRetDate
  46. {
  47. char DeviceNo[16]; //发卡器编号或终端号
  48. char Materiel[16]; //物料类型
  49. char CardGroove[2]; //卡槽号
  50. char CardBoxNo[20]; //卡箱号
  51. char PsbCode[4]; //凭证种类
  52. char PsbName[128]; //凭证种类名称
  53. unsigned int CardInit;
  54. unsigned int CardRemains;
  55. unsigned int CardIssued;
  56. unsigned int CardMixed;
  57. unsigned int CardPercent;
  58. char TerminalNo[16]; //如果是发卡器物料数据,这个是对应的Pad终端号
  59. char Maintainer[16]; //物料维护人员
  60. char MaintainTime[32]; //物料维护时间
  61. char UpdateTime[32]; //同步时间
  62. };
  63. //[StructName("QryMCA1")]
  64. struct QueryMaterialInfoRet1
  65. {
  66. unsigned int count;
  67. };
  68. struct GrayLaunchReq : CHTTPReq
  69. {
  70. GrayLaunchReq()
  71. {
  72. m_timeOut = 500;
  73. }
  74. CSimpleStringA m_terminal_no;
  75. CSimpleStringA m_branch_no;
  76. CSimpleStringA m_modular;
  77. virtual string ToJson()
  78. {
  79. char reqcontent[512];
  80. sprintf(reqcontent, "{\"terminal_no\":\"%s\",\"branch_no\":\"%s\",\"modular\":\"%s\"}", m_terminal_no.GetData(),
  81. m_branch_no.GetData(), m_modular.GetData());
  82. return reqcontent;
  83. }
  84. };
  85. struct GrayLaunchResponse : CHTTPRet
  86. {
  87. GrayLaunchResponse() :m_result(false) {}
  88. bool m_result;
  89. virtual bool Parse(string strData)
  90. {
  91. //DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("GrayLaunchResponse: data = %s", strData.c_str());
  92. Json::Value root;
  93. Json::Reader reader;
  94. reader.parse(strData, root, false);
  95. if (root["data"].isBool()) {
  96. m_result = root["data"].asBool();
  97. }
  98. return m_result;
  99. }
  100. };
  101. struct QueryMaterialInfoHTTPReq : CHTTPReq
  102. {
  103. QueryMaterialInfoHTTPReq() { m_timeOut = 500; }
  104. CSimpleStringA DeviceNo;
  105. virtual string ToJson()
  106. {
  107. char reqcontent[512];
  108. sprintf(reqcontent, "{\"deviceNo\":\"%s\"}", DeviceNo.GetData());
  109. return reqcontent;
  110. }
  111. };
  112. struct QueryMaterialInfoHTTPRet : CHTTPRet
  113. {
  114. QueryMaterialInfoHTTPRet() {}
  115. std::vector<QueryMaterialInfoRetDate> retData;
  116. virtual bool Parse(std::string strData)
  117. {
  118. //DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("QueryMaterialInfoHTTPRet: data = %s", strData.c_str());
  119. Json::Value root;
  120. Json::Reader reader;
  121. reader.parse(strData, root);
  122. if (root.isNull() || root["data"].isNull())
  123. return false;
  124. for (int i = 0; i < root["data"].size(); i++) {
  125. QueryMaterialInfoRetDate cur;
  126. auto curObject = root["data"][i];
  127. ZeroMemory(&cur, sizeof(QueryMaterialInfoRetDate));
  128. if (!curObject["DeviceNo"].isNull() && curObject["DeviceNo"].isString()) {
  129. sprintf(cur.DeviceNo, "%s", curObject["DeviceNo"].asString().c_str());
  130. } else
  131. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("parse DeviceNo failed");
  132. if (!curObject["Materiel"].isNull() && curObject["Materiel"].isString())
  133. sprintf(cur.Materiel, "%s", curObject["Materiel"].asString().c_str());
  134. else
  135. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("parse Materiel failed");
  136. if (!curObject["CardGroove"].isNull() && curObject["CardGroove"].isString())
  137. sprintf(cur.CardGroove, "%s", curObject["CardGroove"].asString().c_str());
  138. else
  139. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("parse CardGroove failed");
  140. if (!curObject["CardBoxNo"].isNull() && curObject["CardBoxNo"].isString())
  141. sprintf(cur.CardBoxNo, "%s", curObject["CardBoxNo"].asString().c_str());
  142. else
  143. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("parse CardBoxNo failed");
  144. if (!curObject["PsbCode"].isNull() && curObject["PsbCode"].isString())
  145. sprintf(cur.PsbCode, "%s", curObject["PsbCode"].asString().c_str());
  146. else
  147. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("parse PsbCode failed");
  148. if (!curObject["PsbName"].isNull() && curObject["PsbName"].isString())
  149. sprintf(cur.PsbName, "%s", curObject["PsbName"].asString().c_str());
  150. else
  151. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("parse PsbName failed");
  152. if (!curObject["CardInit"].isNull() && curObject["CardInit"].isInt())
  153. cur.CardInit = curObject["CardInit"].asInt();
  154. else
  155. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("parse CardInit failed");
  156. if (!curObject["CardRemains"].isNull() && curObject["CardRemains"].isInt())
  157. cur.CardRemains = curObject["CardRemains"].asInt();
  158. else
  159. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("parse CardRemains failed");
  160. if (!curObject["CardIssued"].isNull() && curObject["CardIssued"].isInt())
  161. cur.CardIssued = curObject["CardIssued"].asInt();
  162. else
  163. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("parse CardIssued failed");
  164. if (!curObject["CardMixed"].isNull() && curObject["CardMixed"].isInt())
  165. cur.CardMixed = curObject["CardMixed"].asInt();
  166. else
  167. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("parse CardMixed failed");
  168. if (!curObject["CardPercent"].isNull() && curObject["CardPercent"].isInt())
  169. cur.CardPercent = curObject["CardPercent"].asInt();
  170. else
  171. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("parse CardPercent failed");
  172. if (!curObject["TerminalNo"].isNull() && curObject["TerminalNo"].isString())
  173. sprintf(cur.TerminalNo, "%s", curObject["TerminalNo"].asString().c_str());
  174. else
  175. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("parse TerminalNo failed");
  176. if (!curObject["Maintainer"].isNull() && curObject["Maintainer"].isString())
  177. sprintf(cur.Maintainer, "%s", curObject["Maintainer"].asString().c_str());
  178. else
  179. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("parse Maintainer failed");
  180. if (!curObject["MaintainTime"].isNull() && curObject["MaintainTime"].isString())
  181. sprintf(cur.MaintainTime, "%s", curObject["MaintainTime"].asString().c_str());
  182. else
  183. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("parse MaintainTime failed");
  184. if (!curObject["UpdateTime"].isNull() && curObject["UpdateTime"].isString())
  185. sprintf(cur.UpdateTime, "%s", curObject["UpdateTime"].asString().c_str());
  186. else
  187. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("parse UpdateTime failed");
  188. retData.push_back(cur);
  189. }
  190. return true;
  191. }
  192. };
  193. // 获取后台物料计数
  194. // [StructName("GetMCR")]
  195. struct GetMaterialCounterReq
  196. {
  197. //TerminalNo 终端号 字符数字 16
  198. char TerminalNo[16];
  199. //Materiel 物料代码 字符 16
  200. char Material[16];
  201. //Maintainer 维护人 字符 16
  202. char Maintainer[16];
  203. };
  204. // [StructName("GetMCA")]
  205. struct GetMaterialCounterRet
  206. {
  207. //Materiel 物料代码 字符 16
  208. char Material[16];
  209. //Capacity 放置数量 整数 4
  210. int Capacity;
  211. //Counter 使用计数 整数 4
  212. int Counter;
  213. //Maintainer 上次物料添加维护人 字符 16
  214. char Maintainer[16];
  215. //维护时间 格式:年年月月日日时时分分 字符 10
  216. char MaintainTime[32];
  217. };
  218. // 物料重置
  219. // [StructName("ResetMCR")]
  220. struct ResetMaterialCounterReq
  221. {
  222. //TerminalNo 终端号 字符数字 16
  223. char TerminalNo[16];
  224. //Materiel 物料代码 字符 16
  225. char Material[16];
  226. //ResetCapacity 重置数量 整数 4
  227. int ResetCapacity;
  228. //TerminalCounter 终端对应计数 整数 4
  229. int TerminalCounter;
  230. // 实际剩余计数
  231. int RemainCounter;
  232. //Maintainer 维护人 字符 16
  233. char Maintainer[16];
  234. // 不符意见
  235. char Comment[128];
  236. };
  237. // 终端用户登录
  238. //[StructName("LOGINREQ")]
  239. struct UserLoginReq
  240. {
  241. char User[16]; // 用户
  242. char Password[16]; // 密码,Hash后
  243. };
  244. // 吞卡登记
  245. // [StructName("RegCardR")]
  246. struct RegistSwallowedCardReq
  247. {
  248. char TerminalType[16];
  249. //TerminalNo 终端号 字符数字 16
  250. char TerminalNo[16];
  251. //TerminalNo 终端号 字符数字 16
  252. char CardNo[20];
  253. //Materiel 物料代码 字符 4
  254. char ReasonCode[4];
  255. // 吞卡日期
  256. char SwallowDate[8];
  257. // 吞卡时间
  258. char SwallowTime[6];
  259. };
  260. // 吞卡登记 (xkm@20160419)
  261. // [StructName("RegCard2")]
  262. struct RegistSwallowedCardReqV2
  263. {
  264. char TerminalType[16];
  265. //TerminalNo 终端号 字符数字 16
  266. char TerminalNo[16];
  267. //TerminalNo 终端号 字符数字 16
  268. char CardNo[20];
  269. //Materiel 物料代码 字符 4
  270. char ReasonCode[4];
  271. // 吞卡日期
  272. char SwallowDate[8];
  273. // 吞卡时间
  274. char SwallowTime[6];
  275. // 发卡器编号
  276. char DeviceSciNo[20];
  277. // 保留字段
  278. char Reserved[64];
  279. };
  280. // 同步计数到数据库
  281. // [StructName("SyncMC1")]
  282. struct SyncMaterialCountReq1
  283. {
  284. char TerminalNo[16];
  285. char DeviceNo[16];
  286. char Material[16];
  287. DWORD CardBoxNum;
  288. };
  289. // [StructName("SyncMC2")]
  290. struct SyncMaterialCountReq2
  291. {
  292. bool bMaintain;
  293. char Maintainer[16];
  294. DWORD MaintainTime;
  295. char CardBoxNo[20];
  296. char PsbCode[8];
  297. char PsbName[128];
  298. DWORD CardInit;
  299. DWORD CardRemains;
  300. DWORD CardIssued;
  301. DWORD CardMixed;
  302. DWORD CardPercent;
  303. };
  304. struct SyncMaterialCountHTTPReq : CHTTPReq
  305. {
  306. SyncMaterialCountHTTPReq() { m_timeOut = 500; }
  307. SyncMaterialCountReq1 reqInfo;
  308. std::vector<SyncMaterialCountReq2> reqData;
  309. SYSTEMTIME Time_tToSystemTime(__int64 t)
  310. {
  311. auto temptm = std::gmtime(&t);
  312. SYSTEMTIME st = { 1900 + temptm->tm_year, 1 + temptm->tm_mon, temptm->tm_wday, temptm->tm_mday, temptm->tm_hour + 8, temptm->tm_min, temptm->tm_sec, 0 };
  313. return st;
  314. }
  315. std::string formatTime(__int64 time)
  316. {
  317. char tBuf[1024] = "";
  318. auto sysTime = Time_tToSystemTime(time);
  319. sprintf(tBuf, "%04u-%02u-%02u %02u:%02u:%02u", sysTime.wYear, sysTime.wMonth, sysTime.wDay, sysTime.wHour, sysTime.wMinute, sysTime.wSecond);
  320. return tBuf;
  321. }
  322. virtual string ToJson() {
  323. Json::Value root;
  324. Json::Value arrayObj;
  325. root["terminalNo"] = reqInfo.TerminalNo;
  326. root["deviceNo"] = reqInfo.DeviceNo;
  327. root["materiel"] = reqInfo.Material;
  328. root["cardBoxNum"] = (int)reqInfo.CardBoxNum;
  329. for (int i = 0; i <= reqInfo.CardBoxNum; i++)
  330. {
  331. Json::Value item;
  332. item["CardBoxNo"] = reqData[i].CardBoxNo;
  333. item["PsbCode"] = reqData[i].PsbCode;
  334. item["PsbName"] = reqData[i].PsbName;
  335. item["CardInit"] = (int)reqData[i].CardInit;
  336. item["CardRemains"] = (int)reqData[i].CardRemains;
  337. item["CardIssued"] = (int)reqData[i].CardIssued;
  338. item["CardMixed"] = (int)reqData[i].CardMixed;
  339. item["CardPercent"] = (int)reqData[i].CardPercent;
  340. item["Maintainer"] = reqData[i].Maintainer;
  341. if (reqData[i].MaintainTime == 0)
  342. item["MaintainTime"] = "";
  343. else {
  344. item["MaintainTime"] = CSmallDateTime::GetNow().ToTimeString().GetData();
  345. //DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("MaintainTime:%d", (DWORD)CSmallDateTime::GetNow());
  346. }
  347. item["bMaintain"] = reqData[i].bMaintain;
  348. arrayObj.append(item);
  349. }
  350. root["cardIssueList"] = arrayObj;
  351. return root.toStyledString();
  352. }
  353. };
  354. struct SyncMaterialCountHTTPRet : CHTTPRet
  355. {
  356. SyncMaterialCountHTTPRet() : m_success(false) {}
  357. bool m_success;
  358. virtual bool Parse(string strData)
  359. {
  360. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("SyncMaterialCountHTTPRet: data = %s", strData.c_str());
  361. Json::Value root;
  362. Json::Reader reader;
  363. reader.parse(strData, root, false);
  364. if (root["success"].isBool()) {
  365. m_success = root["success"].asBool();
  366. }
  367. return m_success;
  368. }
  369. };
  370. #pragma pack()
  371. class CMaterialMgrCnn : public SpSecureClient
  372. {
  373. public:
  374. CMaterialMgrCnn(CEntityBase* pEntity);
  375. // 全部实现成同步版本
  376. ErrorCodeEnum ModifyEnrolInfo(const char* pszUserID, const char* pszPwd, const char* pszAddr, const char* pszGPS);
  377. ErrorCodeEnum AddMaterialCounter(const char* pszTerminalNo, const char* pszMaterial);
  378. ErrorCodeEnum AddTradeManage(const char* pszTerminalNo, const char* pszAgentID, const char* pszTime);
  379. //查询物料信息
  380. ErrorCodeEnum QueryMaterialInfo(const char* pszDeviceNo, unsigned int& count, CAutoArray<CSimpleStringA>& arrDeviceNo, CAutoArray<CSimpleStringA>& arrMateriel,
  381. CAutoArray<CSimpleStringA>& CardGroove, CAutoArray<CSimpleStringA>& CardBoxNo, CAutoArray<CSimpleStringA>& PsbCode, CAutoArray<CSimpleStringA>& PsbName,
  382. CAutoArray<unsigned int>& CardInit, CAutoArray<unsigned int>& CardRemains, CAutoArray<unsigned int>& CardIssued, CAutoArray<unsigned int>& CardMixed, CAutoArray<unsigned int>& CardPercent,
  383. CAutoArray<CSimpleStringA>& TerminalNo, CAutoArray<CSimpleStringA>& Maintainer, CAutoArray<CSimpleStringA>& MaintainTime, CAutoArray<CSimpleStringA>& UpdateTime);
  384. ErrorCodeEnum GetMaterialCounter(const char* pszMaterial, const char* pszTerminalNo, const char* pszUserID,
  385. unsigned int& nLastCapacity, unsigned int& nUsedCount);
  386. ErrorCodeEnum ResetMaterialCounter(const char* pszMaterial, const char* pszTerminalNo, const char* pszUserID,
  387. int nResetCapacity, int nTerminalCount, int nRemainCount, const char* pszComment);
  388. ErrorCodeEnum MaintainerLogin(const char* pszMaintainerID, const char* pszPassword);
  389. ErrorCodeEnum RegistSwallowedCard(const char* pszTerminalType, const char* pszTerminalNo, const char* pszCardNo, const char* pszReasonCode,
  390. const char* pszDate, const char* pszTime, const char* pszDeviceSciNo);
  391. ErrorCodeEnum SyncMaterialCount(const char* pszDeviceNo, DWORD dwCardBoxNum,
  392. CAutoArray<bool>& arrMaintainFlag, CAutoArray<CSimpleStringA>& arrMaintainer, CAutoArray<unsigned int>& arrMaintainTime,
  393. CAutoArray<CSimpleStringA>& arrCardBoxNo, CAutoArray<CSimpleStringA>& arrPsbCode,
  394. CAutoArray<CSimpleStringA>& arrPsbName, CAutoArray<unsigned int>& arrCardInit, CAutoArray<unsigned int>& arrCardRemains,
  395. CAutoArray<unsigned int>& arrCardIssued, CAutoArray<unsigned int>& arrCardMixed, CAutoArray<unsigned int>& arrCardPercent);
  396. private:
  397. ~CMaterialMgrCnn();
  398. void OnDisconnect();
  399. void OnPkgAnswer(const CSmartPointer<IPackage>& pRecvPkg);
  400. ErrorCodeEnum HandleModifyEnrollInfoRet(const CSmartPointer<IPackage>& pRecvPkg);
  401. ErrorCodeEnum HandleAddMaterialCounterRet(const CSmartPointer<IPackage>& pRecvPkg);
  402. ErrorCodeEnum HandleAddTradeManageRet(const CSmartPointer<IPackage>& pRecvPkg);
  403. //查询物料信息
  404. ErrorCodeEnum HandleQueryMaterialInfoRet(const CSmartPointer<IPackage>& pRecvPkg, unsigned int& count, CAutoArray<CSimpleStringA>& arrDeviceNo, CAutoArray<CSimpleStringA>& arrMateriel,
  405. CAutoArray<CSimpleStringA>& CardGroove, CAutoArray<CSimpleStringA>& CardBoxNo, CAutoArray<CSimpleStringA>& PsbCode, CAutoArray<CSimpleStringA>& PsbName,
  406. CAutoArray<unsigned int>& CardInit, CAutoArray<unsigned int>& CardRemains, CAutoArray<unsigned int>& CardIssued, CAutoArray<unsigned int>& CardMixed, CAutoArray<unsigned int>& CardPercent,
  407. CAutoArray<CSimpleStringA>& TerminalNo, CAutoArray<CSimpleStringA>& Maintainer, CAutoArray<CSimpleStringA>& MaintainTime, CAutoArray<CSimpleStringA>& UpdateTime);
  408. ErrorCodeEnum HandleGetMaterialCounterRet(const CSmartPointer<IPackage>& pRecvPkg, unsigned int& nLastCapacity, unsigned int& nUsedCount);
  409. ErrorCodeEnum HandleResetMaterialCounterRet(const CSmartPointer<IPackage>& pRecvPkg);
  410. ErrorCodeEnum HandleMaintainerLoginRet(const CSmartPointer<IPackage>& pRecvPkg);
  411. ErrorCodeEnum HandleRegistSwallowedCardRet(const CSmartPointer<IPackage>& pRecvPkg);
  412. ErrorCodeEnum HandleSyncMaterialCount(const CSmartPointer<IPackage>& pRecvPkg);
  413. ErrorCodeEnum GetMD5(char* pStr, BYTE md5[16]);
  414. IHttpFunc* m_pHttpFunc;
  415. CSimpleStringA m_strTerminalId;
  416. CSimpleStringA m_strCallRouteBranchNo;
  417. CSimpleStringA m_materialUrl;
  418. BOOL m_forceBranch;
  419. ErrorCodeEnum LoadTerminalId()
  420. {
  421. CSystemStaticInfo Info;
  422. ErrorCodeEnum Error = m_pEntity->GetFunction()->GetSystemStaticInfo(Info);
  423. if (Error == Error_Succeed) {
  424. m_strTerminalId = Info.strTerminalID;
  425. }
  426. return Error;
  427. }
  428. };
  429. #endif //RVC_MODULE_MATERIALMGR_CNN_H_