CZhengcanOrder.cpp 27 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082
  1. #include "../pch/pch.h"
  2. #include "CZhengcanOrder.h"
  3. #include "../tool/CSqlite3.h"
  4. void CZhengcanOrder::RefreshDiandanInfo()
  5. {
  6. m_order_history_array.clear();
  7. m_items.clear();
  8. m_total_price_show = "";
  9. m_memo = "";
  10. shopname = "";
  11. show_trade_no = "";
  12. balance = "";
  13. member_number = "";
  14. m_renshu = "";
  15. shoukuan_type = "";
  16. int order_from = 1;
  17. init_time = "";
  18. m_shangpinquan_youhui = "";
  19. m_cika_youhui = "";
  20. m_total_member_youhui = "";
  21. m_zhekou_youhui = "";
  22. m_member_zhekou_youhui = "";
  23. m_quanyika_youhui = "";
  24. m_manjian_youhui = "";
  25. m_youhuiquan_youhui = "";
  26. m_rengong_youhui = "";
  27. m_moling_youhui = "";
  28. m_jiajia = "";
  29. m_shishou_value = "";
  30. m_zhaoling_value = "";
  31. m_zhekou_value = "";
  32. m_dabao_money = "";
  33. m_total_price = "";
  34. m_items_print.clear();
  35. m_order_id = "";
  36. is_refund = "";
  37. refund_time = "";
  38. is_guazhang = "";
  39. guazhang = "";
  40. }
  41. int CZhengcanOrder::getItemNum()
  42. {
  43. return m_items.size();
  44. }
  45. bool CZhengcanOrder::GetHistoryItemById(std::string item_id, CZhengcanOrderItem& item)
  46. {
  47. for (std::vector<CZhengcanOrderHistoryXiadan>::iterator it = m_order_history_array.begin(); it != m_order_history_array.end(); it++)
  48. {
  49. for (std::vector<CZhengcanOrderItem>::iterator it1 = it->m_items.begin(); it1 != it->m_items.end(); it1++)
  50. {
  51. if (it1->item_id == item_id)
  52. {
  53. item = *it1;
  54. return true;
  55. }
  56. }
  57. }
  58. return false;
  59. }
  60. double CZhengcanOrder::getTotalPrice()
  61. {
  62. double total_price_show = 0;
  63. //先计算当前已点的商品
  64. for (std::vector<CZhengcanOrderItem>::iterator it = m_items.begin(); it != m_items.end(); it++)
  65. {
  66. total_price_show += std::stod((*it).show_price);
  67. }
  68. //再计算已下单商品
  69. for (std::vector<CZhengcanOrderHistoryXiadan>::iterator it = m_order_history_array.begin(); it != m_order_history_array.end(); it++)
  70. {
  71. for (std::vector<CZhengcanOrderItem>::iterator it1 = it->m_items.begin(); it1 != it->m_items.end(); it1++)
  72. {
  73. if (it1->is_tuicai == "1")
  74. {
  75. //退菜的不算
  76. continue;
  77. }
  78. total_price_show += std::stod((*it1).show_price);
  79. }
  80. }
  81. return total_price_show;
  82. }
  83. CZhengcanOrderItem CZhengcanOrder::getDiandanOrderItem(int index)
  84. {
  85. return m_items[index];
  86. }
  87. //这个函数的逻辑是选择一个新商品的时候,与已有商品进行对比,看看是加一个新的商品,还是对已有商品增加数量
  88. //返回值是表示新加的item,在第几个元素,方便刷新显示
  89. int CZhengcanOrder::AddItem(CZhengcanOrderItem newitem, bool& is_add_new)
  90. {
  91. int index = 0;
  92. bool is_found = false;
  93. for (std::vector<CZhengcanOrderItem>::iterator it = m_items.begin(); it != m_items.end(); it++)
  94. {
  95. CZhengcanOrderItem curItem = *it;
  96. if (curItem == newitem)
  97. {
  98. is_found = true;
  99. break;
  100. }
  101. index++;
  102. }
  103. //如果找到了,更新数量
  104. if (is_found)
  105. {
  106. std::string old_num = m_items[index].num;
  107. double d_old_num = std::stod(old_num);
  108. double d_new_num = d_old_num + std::stod(newitem.num);
  109. //如果新的数量是一个整数,那么展示的时候就把小数去掉
  110. if (d_new_num - (int)d_new_num < 0.0001)
  111. {
  112. m_items[index].num = std::to_string((int)d_new_num);
  113. }
  114. else
  115. {
  116. m_items[index].num = CLewaimaiString::DoubleToString(d_new_num, 3);
  117. }
  118. m_items[index].UpdateShowPrice();
  119. is_add_new = false;
  120. }
  121. else
  122. {
  123. //如果没找到,直接加一个新的item
  124. m_items.push_back(newitem);
  125. m_items[index].UpdateShowPrice();
  126. is_add_new = true;
  127. }
  128. return index;
  129. }
  130. void CZhengcanOrder::UpdateItemGuige(int index, std::vector<FoodNatureSelectValue>& natureSelectedArray)
  131. {
  132. m_items[index].natureSelectedArray = natureSelectedArray;
  133. this->UpdateGuigePrice(index);
  134. }
  135. //给某一项添加一个数量
  136. void CZhengcanOrder::AddNum(int index)
  137. {
  138. std::string old_num = m_items[index].num;
  139. double d_old_num = std::stod(old_num);
  140. double d_new_num = d_old_num + 1;
  141. //如果新的数量是一个整数,那么展示的时候就把小数去掉
  142. if (d_new_num - (int)d_new_num < 0.0001)
  143. {
  144. m_items[index].num = std::to_string((int)d_new_num);
  145. }
  146. else
  147. {
  148. m_items[index].num = CLewaimaiString::DoubleToString(d_new_num, 3);
  149. }
  150. m_items[index].UpdateShowPrice();
  151. }
  152. //给某一项减少一个数量,返回值为true表示商品本删掉了,也就是为0份;如果为false表示没被删掉
  153. bool CZhengcanOrder::DelNum(int index)
  154. {
  155. std::string old_num = m_items[index].num;
  156. double d_old_num = std::stod(old_num);
  157. double d_new_num = d_old_num - 1;
  158. if (d_new_num < 0.0001)
  159. {
  160. //已经减为0了,那么就删掉这个item
  161. m_items.erase(m_items.begin() + index);
  162. return true;
  163. }
  164. else
  165. {
  166. //如果新的数量是一个整数,那么展示的时候就把小数去掉
  167. if (d_new_num - (int)d_new_num < 0.0001)
  168. {
  169. m_items[index].num = std::to_string((int)d_new_num);
  170. }
  171. else
  172. {
  173. m_items[index].num = CLewaimaiString::DoubleToString(d_new_num, 3);
  174. }
  175. m_items[index].UpdateShowPrice();
  176. }
  177. return false;
  178. }
  179. //删除某一项
  180. void CZhengcanOrder::Remove(int index)
  181. {
  182. //已经减为0了,那么就删掉这个item
  183. m_items.erase(m_items.begin() + index);
  184. }
  185. //更新了某项的规格,那么重新刷新显示和价格
  186. void CZhengcanOrder::UpdateGuigePrice(int index)
  187. {
  188. m_items[index].UpdateShowPrice();
  189. }
  190. void CZhengcanOrder::SetDabao(int index)
  191. {
  192. m_items[index].SetDabao();
  193. }
  194. //清空商品
  195. void CZhengcanOrder::Clear()
  196. {
  197. m_items.clear();
  198. }
  199. void CZhengcanOrder::SetMemo(std::string memo)
  200. {
  201. m_memo = memo;
  202. }
  203. std::string CZhengcanOrder::GetMemo()
  204. {
  205. return m_memo;
  206. }
  207. bool CZhengcanOrder::UseShangpinquan(std::string shangpinquan_food_id, double& youhui_value)
  208. {
  209. for (std::vector<CZhengcanOrderItem>::iterator it = m_items.begin(); it != m_items.end(); it++)
  210. {
  211. CZhengcanOrderItem curItem = *it;
  212. if (curItem.m_is_taocan == false && curItem.food_id == shangpinquan_food_id)
  213. {
  214. //找到了可以使用的商品
  215. if (atof(curItem.num.c_str()) > 0.99999)
  216. {
  217. //如果当前份数大于1,那么抵扣价格就是商品单价
  218. youhui_value = atof(curItem.price.c_str());
  219. }
  220. else
  221. {
  222. //如果当前份数不足1份,那么就抵扣价格就是单价乘以数量
  223. youhui_value = atof(curItem.price.c_str()) * atof(curItem.num.c_str());
  224. }
  225. return true;
  226. }
  227. }
  228. //继续在已下单的订单里面找
  229. for (std::vector<CZhengcanOrderHistoryXiadan>::iterator it = m_order_history_array.begin(); it != m_order_history_array.end(); it++)
  230. {
  231. for (std::vector<CZhengcanOrderItem>::iterator it1 = it->m_items.begin(); it1 != it->m_items.end(); it1++)
  232. {
  233. if (it1->is_tuicai == "1")
  234. {
  235. //退菜的不算
  236. continue;
  237. }
  238. CZhengcanOrderItem curItem = *it1;
  239. if (curItem.m_is_taocan == false && curItem.food_id == shangpinquan_food_id)
  240. {
  241. //找到了可以使用的商品
  242. if (atof(curItem.num.c_str()) > 0.99999)
  243. {
  244. //如果当前份数大于1,那么抵扣价格就是商品单价
  245. youhui_value = atof(curItem.price.c_str());
  246. }
  247. else
  248. {
  249. //如果当前份数不足1份,那么就抵扣价格就是单价乘以数量
  250. youhui_value = atof(curItem.price.c_str()) * atof(curItem.num.c_str());
  251. }
  252. return true;
  253. }
  254. }
  255. }
  256. return false;
  257. }
  258. bool CZhengcanOrder::UseCikaDikou(std::string cika_food_id, double& youhui_value, bool is_shangpinquan_dikou)
  259. {
  260. for (std::vector<CZhengcanOrderItem>::iterator it = m_items.begin(); it != m_items.end(); it++)
  261. {
  262. CZhengcanOrderItem curItem = *it;
  263. if (curItem.m_is_taocan == false && curItem.food_id == cika_food_id)
  264. {
  265. //找到了可以使用的商品
  266. if (is_shangpinquan_dikou)
  267. {
  268. if (atof(curItem.num.c_str()) > 1.99999)
  269. {
  270. //如果当前份数大于2,那么抵扣价格就是商品单价
  271. youhui_value = atof(curItem.price.c_str());
  272. }
  273. else if (atof(curItem.num.c_str()) > 0.99999)
  274. {
  275. //如果当前份数不足2份,但是大于1份,那么就抵扣价格就是单价乘以数量
  276. youhui_value = atof(curItem.price.c_str()) * (atof(curItem.num.c_str()) - 1);
  277. }
  278. else
  279. {
  280. //如果当前份数不足1份,那么已经被商品券抵扣了,次卡不再抵扣
  281. youhui_value = 0;
  282. return false;
  283. }
  284. }
  285. else
  286. {
  287. if (atof(curItem.num.c_str()) > 0.99999)
  288. {
  289. //如果当前份数大于1,那么抵扣价格就是商品单价
  290. youhui_value = atof(curItem.price.c_str());
  291. }
  292. else
  293. {
  294. //如果当前份数不足1份,那么就抵扣价格就是单价乘以数量
  295. youhui_value = atof(curItem.price.c_str()) * atof(curItem.num.c_str());
  296. }
  297. }
  298. return true;
  299. }
  300. }
  301. //继续在已下单的订单里面找
  302. for (std::vector<CZhengcanOrderHistoryXiadan>::iterator it = m_order_history_array.begin(); it != m_order_history_array.end(); it++)
  303. {
  304. for (std::vector<CZhengcanOrderItem>::iterator it1 = it->m_items.begin(); it1 != it->m_items.end(); it1++)
  305. {
  306. if (it1->is_tuicai == "1")
  307. {
  308. //退菜的不算
  309. continue;
  310. }
  311. CZhengcanOrderItem curItem = *it1;
  312. if (curItem.m_is_taocan == false && curItem.food_id == cika_food_id)
  313. {
  314. //找到了可以使用的商品
  315. if (is_shangpinquan_dikou)
  316. {
  317. if (atof(curItem.num.c_str()) > 1.99999)
  318. {
  319. //如果当前份数大于2,那么抵扣价格就是商品单价
  320. youhui_value = atof(curItem.price.c_str());
  321. }
  322. else if (atof(curItem.num.c_str()) > 0.99999)
  323. {
  324. //如果当前份数不足2份,但是大于1份,那么就抵扣价格就是单价乘以数量
  325. youhui_value = atof(curItem.price.c_str()) * (atof(curItem.num.c_str()) - 1);
  326. }
  327. else
  328. {
  329. //如果当前份数不足1份,那么已经被商品券抵扣了,次卡不再抵扣
  330. youhui_value = 0;
  331. return false;
  332. }
  333. }
  334. else
  335. {
  336. if (atof(curItem.num.c_str()) > 0.99999)
  337. {
  338. //如果当前份数大于1,那么抵扣价格就是商品单价
  339. youhui_value = atof(curItem.price.c_str());
  340. }
  341. else
  342. {
  343. //如果当前份数不足1份,那么就抵扣价格就是单价乘以数量
  344. youhui_value = atof(curItem.price.c_str()) * atof(curItem.num.c_str());
  345. }
  346. }
  347. return true;
  348. }
  349. }
  350. }
  351. return false;
  352. }
  353. double CZhengcanOrder::getTotalMemberYouhui(std::string member_level)
  354. {
  355. double total_youhui = 0;
  356. for (std::vector<CZhengcanOrderItem>::iterator it = m_items.begin(); it != m_items.end(); it++)
  357. {
  358. CZhengcanOrderItem curItem = *it;
  359. double item_youhui = curItem.getMemberYouhui(member_level);
  360. total_youhui += item_youhui;
  361. }
  362. //继续在已下单的订单里面找
  363. for (std::vector<CZhengcanOrderHistoryXiadan>::iterator it = m_order_history_array.begin(); it != m_order_history_array.end(); it++)
  364. {
  365. for (std::vector<CZhengcanOrderItem>::iterator it1 = it->m_items.begin(); it1 != it->m_items.end(); it1++)
  366. {
  367. if (it1->is_tuicai == "1")
  368. {
  369. //退菜的不算
  370. continue;
  371. }
  372. CZhengcanOrderItem curItem = *it1;
  373. double item_youhui = curItem.getMemberYouhui(member_level);
  374. total_youhui += item_youhui;
  375. }
  376. }
  377. return total_youhui;
  378. }
  379. //计算所有商品的总的打包费
  380. double CZhengcanOrder::getDabaoMoney()
  381. {
  382. double total_dabao = 0;
  383. for (std::vector<CZhengcanOrderItem>::iterator it = m_items.begin(); it != m_items.end(); it++)
  384. {
  385. CZhengcanOrderItem curItem = *it;
  386. double item_dabao = curItem.getDabaoMoney();
  387. total_dabao += item_dabao;
  388. }
  389. //继续在已下单的订单里面找
  390. for (std::vector<CZhengcanOrderHistoryXiadan>::iterator it = m_order_history_array.begin(); it != m_order_history_array.end(); it++)
  391. {
  392. for (std::vector<CZhengcanOrderItem>::iterator it1 = it->m_items.begin(); it1 != it->m_items.end(); it1++)
  393. {
  394. if (it1->is_tuicai == "1")
  395. {
  396. //退菜的不算
  397. continue;
  398. }
  399. CZhengcanOrderItem curItem = *it1;
  400. double item_dabao = curItem.getDabaoMoney();
  401. total_dabao += item_dabao;
  402. }
  403. }
  404. return total_dabao;
  405. }
  406. //获取点单相关的参数(仅用于非套餐)
  407. std::string CZhengcanOrder::getDiandanFoodlistParam()
  408. {
  409. std::vector<std::map<string, string>> params;
  410. for (std::vector<CZhengcanOrderItem>::iterator it = m_items.begin(); it != m_items.end(); it++)
  411. {
  412. if (it->m_is_taocan)
  413. {
  414. continue;
  415. }
  416. std::map<string, string> itemParam = it->getDiandanParam();
  417. params.push_back(itemParam);
  418. }
  419. std::string s_params = CLewaimaiJson::ParamArrayToJsonstring(params);
  420. return s_params;
  421. }
  422. //获取点单相关的套餐参数(仅用于套餐)
  423. std::string CZhengcanOrder::getDiandanTaocanParam()
  424. {
  425. rapidjson::Document doc;
  426. doc.SetArray();
  427. rapidjson::Document::AllocatorType &allocator = doc.GetAllocator(); //获取分配器
  428. for (std::vector<CZhengcanOrderItem>::iterator it = m_items.begin(); it != m_items.end(); it++)
  429. {
  430. if (it->m_is_taocan == false)
  431. {
  432. continue;
  433. }
  434. Value& data = it->getDiandanTaocanParam(allocator);
  435. doc.PushBack(data, allocator);
  436. }
  437. std::string paramString = CLewaimaiJson::JsonToString(doc);
  438. return paramString;
  439. }
  440. bool CZhengcanOrder::InitData(std::string order_id)
  441. {
  442. std::map<string, string> params;
  443. params["order_id"] = order_id;
  444. std::string response;
  445. bool ret = CZhipuziHttpClient::GetInstance()->Request("/dinnercash/getorderdetail", params, response);
  446. if (!ret)
  447. {
  448. LOG_INFO("网络请求出错");
  449. return false;
  450. }
  451. rapidjson::Document document;
  452. document.Parse(response.c_str());
  453. if (document.HasParseError())
  454. {
  455. LOG_INFO("parse response error!");
  456. return false;
  457. }
  458. if (!document.HasMember("errcode") || !document.HasMember("errmsg") || !document.HasMember("data"))
  459. {
  460. LOG_INFO("json error!");
  461. return false;
  462. }
  463. rapidjson::Value& v_errcode = document["errcode"];
  464. int errcode = v_errcode.GetInt();
  465. if (errcode != 0)
  466. {
  467. LOG_INFO("response failed! message:" << document["errmsg"].GetString());
  468. return false;
  469. }
  470. //获得数据成功
  471. rapidjson::Value& data = document["data"];
  472. shopname = CShopinfo::GetInstance()->m_shop_name;
  473. m_order_id = data["id"].GetString();
  474. show_trade_no = data["show_trade_no"].GetString();
  475. m_renshu = data["person_num"].GetString();
  476. m_table_id = CLewaimaiJson::ToString(data["table_id"]);
  477. table_name = CLewaimaiJson::ToString(data["table_name"]);
  478. m_memo = CLewaimaiJson::ToString(data["note"]);
  479. m_dabao_money = data["dabao_price"].GetString();
  480. m_zhekou_value = data["discount"].GetString();
  481. m_rengong_youhui = data["coupon"].GetString();
  482. m_jiajia = data["price_plus"].GetString();
  483. m_moling_youhui = data["price_moling"].GetString();
  484. m_total_price = data["yingshou_price"].GetString();
  485. m_shishou_value = data["shishou_value"].GetString();
  486. m_zhaoling_value = data["zhaoling_value"].GetString();
  487. shoukuan_type = data["zhifu_type"].GetString();
  488. is_refund = data["is_refund"].GetString();
  489. refund_time = CLewaimaiJson::ToString(data["refund_time"]);
  490. is_guazhang = data["is_guazhang"].GetString();
  491. guazhang = data["guazhang"].GetString();
  492. m_youhuiquan_youhui = data["coupon_value"].GetString();
  493. m_total_member_youhui = data["member_delete"].GetString();
  494. m_manjian_youhui = data["promotion_value"].GetString();
  495. m_member_zhekou_youhui = data["member_discount_money"].GetString();
  496. m_zhekou_youhui = data["discount_delete"].GetString();
  497. m_cika_youhui = data["timescoupon_discount_money"].GetString();
  498. m_quanyika_youhui = data["eq_card_discount_money"].GetString();
  499. init_time = CLewaimaiJson::ToString(data["init_time"]);
  500. m_is_clear = CLewaimaiJson::ToString(data["is_clear"]);
  501. m_kaitai_time = CLewaimaiJson::ToString(data["kaitai_time"]);
  502. m_pay_time = CLewaimaiJson::ToString(data["pay_time"]);
  503. m_status = data["status"].GetString();
  504. shoukuan_type = data["zhifu_type"].GetString();
  505. std::string fromtype = data["from_type"].GetString();
  506. if (fromtype == "1")
  507. {
  508. order_from = 1;
  509. }
  510. else if (fromtype == "4")
  511. {
  512. order_from = 2;
  513. }
  514. else if (fromtype == "2" || fromtype == "3")
  515. {
  516. order_from = 3;
  517. }
  518. //开始保存订单详情
  519. rapidjson::Value& v_rows = data["item"];
  520. //这个是已经下单的次数,已经下单N次这里值就是N
  521. int nItemNum = v_rows.Size();
  522. for (rapidjson::SizeType j = 0; j < v_rows.Size(); ++j)
  523. {
  524. CZhengcanOrderHistoryXiadan newHistoryXiadan;
  525. newHistoryXiadan.xiadanNum = j;
  526. //这里每次循环,就是一次下单的商品信息
  527. rapidjson::Value& xiadanInfos = v_rows[j];
  528. //先处理非套餐
  529. rapidjson::Value& food_list = xiadanInfos["food_list"];
  530. for (rapidjson::SizeType i = 0; i < food_list.Size(); ++i)
  531. {
  532. rapidjson::Value& foodinfo = food_list[i];
  533. CZhengcanOrderItem newItem;
  534. newItem.m_is_history_item = true;
  535. newItem.item_id = CLewaimaiJson::ToString(foodinfo["id"]);
  536. newItem.food_id = CLewaimaiJson::ToString(foodinfo["food_id"]);
  537. newItem.food_name = CLewaimaiJson::ToString(foodinfo["food_name"]);
  538. newItem.type_id = CLewaimaiJson::ToString(foodinfo["type_id"]);
  539. newItem.price = CLewaimaiJson::ToString(foodinfo["single_price"]);
  540. newItem.num = CLewaimaiJson::ToString(foodinfo["quantity"]);
  541. if (CLewaimaiJson::ToString(foodinfo["is_dabao"]) == "1")
  542. {
  543. newItem.is_dabao = true;
  544. }
  545. else
  546. {
  547. newItem.is_dabao = false;
  548. }
  549. //目前服务器返回的dabao_money一直为0,是不对的,暂时不用这个,下面从数据库里读取
  550. //newItem.dabao_money = CLewaimaiJson::ToString(foodinfo["dabao_money"]);
  551. newItem.is_jiacai = CLewaimaiJson::ToString(foodinfo["is_jiacai"]);
  552. newItem.jiacai_no = CLewaimaiJson::ToString(foodinfo["jiacai_no"]);
  553. newItem.is_tuicai = CLewaimaiJson::ToString(foodinfo["is_tuicai"]);
  554. //从数据库里读这个商品的信息,获取会员价信息
  555. CFood foodinfo_bendi;
  556. CSqlite3 sqlite;
  557. bool ret = sqlite.GetFoodById(newItem.food_id, foodinfo_bendi);
  558. if (ret == true)
  559. {
  560. newItem.dabao_money = foodinfo_bendi.dabao_money;
  561. if (foodinfo_bendi.member_price_used == "1")
  562. {
  563. newItem.is_member_price_used = true;
  564. }
  565. else
  566. {
  567. newItem.is_member_price_used = false;
  568. }
  569. //处理会员价的json
  570. std::string member_price_json = foodinfo_bendi.member_price_json;
  571. rapidjson::Document document;
  572. document.Parse(member_price_json.c_str());
  573. rapidjson::Value& member_price = document;
  574. for (rapidjson::SizeType i = 0; i < member_price.Size(); ++i)
  575. {
  576. rapidjson::Value& member_price_info = member_price[i];
  577. MemberPrice newPirce;
  578. newPirce.id = CLewaimaiJson::ToString(member_price_info["id"]);
  579. newPirce.level = CLewaimaiJson::ToString(member_price_info["level"]);
  580. if (member_price_info["price"].IsString())
  581. {
  582. newPirce.price = member_price_info["price"].GetString();
  583. }
  584. else
  585. {
  586. newPirce.price = to_string(member_price_info["price"].GetDouble());
  587. }
  588. newItem.m_member_price.push_back(newPirce);
  589. }
  590. }
  591. else
  592. {
  593. //说明已下单的商品,已经被从本地删除了!
  594. newItem.is_member_price_used = false;
  595. newItem.dabao_money = "0";
  596. }
  597. newItem.UpdateShowPrice();
  598. newHistoryXiadan.m_items.push_back(newItem);
  599. }
  600. //再处理套餐
  601. rapidjson::Value& foodpackage_array = xiadanInfos["foodpackage_array"];
  602. for (rapidjson::SizeType i = 0; i < foodpackage_array.Size(); ++i)
  603. {
  604. rapidjson::Value& cur_foodpackage = foodpackage_array[i];
  605. CZhengcanOrderItem newItem;
  606. newItem.m_is_history_item = true;
  607. newItem.item_id = CLewaimaiJson::ToString(cur_foodpackage["id"]);
  608. newItem.num = cur_foodpackage["quantity"].GetString();
  609. newItem.price = cur_foodpackage["single_price"].GetString();
  610. newItem.foodpackage_id = cur_foodpackage["foodpackage_id"].GetString();
  611. newItem.is_tuicai = cur_foodpackage["is_tuicai"].GetString();
  612. if (CLewaimaiJson::ToString(cur_foodpackage["is_dabao"]) == "1")
  613. {
  614. newItem.is_dabao = true;
  615. }
  616. else
  617. {
  618. newItem.is_dabao = false;
  619. }
  620. newItem.is_jiacai = CLewaimaiJson::ToString(cur_foodpackage["is_jiacai"]);
  621. newItem.jiacai_no = CLewaimaiJson::ToString(cur_foodpackage["jiacai_no"]);
  622. newItem.is_tuicai = CLewaimaiJson::ToString(cur_foodpackage["is_tuicai"]);
  623. //从数据库读取套餐的打包费信息
  624. CFoodpackage foodpackageinfo;
  625. CSqlite3 sqlite;
  626. bool ret = sqlite.GetFoodpackageById(newItem.foodpackage_id, foodpackageinfo);
  627. if (ret == true)
  628. {
  629. newItem.dabao_money = foodpackageinfo.dabao_money;
  630. }
  631. else
  632. {
  633. //说明已下单的套餐,已经被从本地删除了!
  634. newItem.dabao_money = "0";
  635. }
  636. newItem.m_is_taocan = true;
  637. newItem.foodpackage_name = cur_foodpackage["food_name"].GetString();
  638. //接着保存套餐的item
  639. rapidjson::Value& food_item = cur_foodpackage["food_item"];
  640. for (rapidjson::SizeType m = 0; m < food_item.Size(); ++m)
  641. {
  642. rapidjson::Value& food_item_info = food_item[m];
  643. //开始保存套餐Item
  644. CZhengcanOrderItem taocanItem;
  645. taocanItem.m_is_history_item = true;
  646. taocanItem.item_id = CLewaimaiJson::ToString(food_item_info["id"]);
  647. taocanItem.food_id = CLewaimaiJson::ToString(food_item_info["food_id"]);
  648. taocanItem.food_name = CLewaimaiJson::ToString(food_item_info["food_name"]);
  649. taocanItem.type_id = CLewaimaiJson::ToString(food_item_info["type_id"]);
  650. taocanItem.price = CLewaimaiJson::ToString(food_item_info["single_price"]);
  651. taocanItem.num = CLewaimaiJson::ToString(food_item_info["quantity"]);
  652. if (CLewaimaiJson::ToString(food_item_info["is_dabao"]) == "1")
  653. {
  654. taocanItem.is_dabao = true;
  655. }
  656. else
  657. {
  658. taocanItem.is_dabao = false;
  659. }
  660. newItem.is_jiacai = CLewaimaiJson::ToString(food_item_info["is_jiacai"]);
  661. newItem.jiacai_no = CLewaimaiJson::ToString(food_item_info["jiacai_no"]);
  662. newItem.is_tuicai = CLewaimaiJson::ToString(food_item_info["is_tuicai"]);
  663. //目前服务器返回的dabao_money一直为0,是不对的,暂时不用这个,下面从数据库里读取
  664. //newItem.dabao_money = CLewaimaiJson::ToString(foodinfo["dabao_money"]);
  665. taocanItem.is_jiacai = CLewaimaiJson::ToString(food_item_info["is_jiacai"]);
  666. taocanItem.jiacai_no = CLewaimaiJson::ToString(food_item_info["jiacai_no"]);
  667. taocanItem.is_tuicai = CLewaimaiJson::ToString(food_item_info["is_tuicai"]);
  668. newItem.m_taocan_items.push_back(taocanItem);
  669. }
  670. newItem.UpdateShowPrice();
  671. newHistoryXiadan.m_items.push_back(newItem);
  672. }
  673. m_order_history_array.push_back(newHistoryXiadan);
  674. }
  675. return true;
  676. }
  677. bool CZhengcanOrder::Refund(std::string order_id)
  678. {
  679. std::string url = "/dinnercash/refund";
  680. //请求外卖的未处理订单
  681. std::map<string, string> params;
  682. params["id"] = order_id;
  683. std::string response;
  684. CZhipuziHttpClient::GetInstance()->Request(url.c_str(), params, response);
  685. rapidjson::Document document;
  686. document.Parse(response.c_str());
  687. if (document.HasParseError())
  688. {
  689. LOG_INFO("parse response error!");
  690. return false;
  691. }
  692. if (!document.HasMember("errcode") || !document.HasMember("errmsg") || !document.HasMember("data"))
  693. {
  694. LOG_INFO("json error!");
  695. return false;
  696. }
  697. rapidjson::Value& v_errcode = document["errcode"];
  698. int errcode = v_errcode.GetInt();
  699. if (errcode != 0)
  700. {
  701. LOG_INFO("response failed! message:" << document["errmsg"].GetString());
  702. return false;
  703. }
  704. return true;
  705. }
  706. void CZhengcanOrder::UpdateItemPrint()
  707. {
  708. //清空之前的打印记录
  709. m_items_print.clear();
  710. for (std::vector<CZhengcanOrderHistoryXiadan>::iterator it = m_order_history_array.begin(); it != m_order_history_array.end(); it++)
  711. {
  712. for (std::vector<CZhengcanOrderItem>::iterator it1 = it->m_items.begin(); it1 != it->m_items.end(); it1++)
  713. {
  714. CZhengcanOrderItemPrint itemPrint;
  715. CZhengcanOrderItem tuicaiItem = *it1;
  716. if (tuicaiItem.is_tuicai == "1")
  717. {
  718. itemPrint.is_tuicai = true;
  719. }
  720. itemPrint.m_quantity = tuicaiItem.num;
  721. itemPrint.m_item_price = tuicaiItem.price;
  722. itemPrint.m_type_id = tuicaiItem.type_id;
  723. if (tuicaiItem.m_is_taocan == true)
  724. {
  725. itemPrint.is_taocan = true;
  726. itemPrint.m_food_name = tuicaiItem.foodpackage_name; //不带属性商品
  727. }
  728. else
  729. {
  730. itemPrint.m_food_name = tuicaiItem.food_name; //带属性值
  731. }
  732. m_items_print.push_back(itemPrint);
  733. if (tuicaiItem.m_is_taocan == true)
  734. {
  735. //开始保存套餐里面的商品详情,主要用于厨房打印
  736. //接下来要把这个套餐的详情也保存下来
  737. for (std::vector<CZhengcanOrderItem>::iterator it = tuicaiItem.m_taocan_items.begin(); it != tuicaiItem.m_taocan_items.end(); it++)
  738. {
  739. std::string food_id = it->food_id;
  740. //要根据商品ID找出商品的名字
  741. CFood foodinfo;
  742. CSqlite3 sqlite;
  743. bool is_found = sqlite.GetFoodById(food_id, foodinfo);
  744. if (!is_found)
  745. {
  746. continue;
  747. }
  748. CZhengcanOrderItemPrint foodpackageitemPrint;
  749. foodpackageitemPrint.m_food_name = foodinfo.name;
  750. foodpackageitemPrint.m_quantity = tuicaiItem.num;
  751. foodpackageitemPrint.m_item_price = foodinfo.price;
  752. foodpackageitemPrint.m_type_id = foodinfo.type_id;
  753. foodpackageitemPrint.is_taocan = false;
  754. foodpackageitemPrint.is_taocan_item = true;
  755. m_items_print.push_back(foodpackageitemPrint);
  756. }
  757. }
  758. }
  759. }
  760. }
  761. void CZhengcanOrder::UpdateItemPrintForJiacai(std::string jiacai_no)
  762. {
  763. //清空之前的打印记录
  764. m_items_print.clear();
  765. for (std::vector<CZhengcanOrderHistoryXiadan>::iterator it = m_order_history_array.begin(); it != m_order_history_array.end(); it++)
  766. {
  767. for (std::vector<CZhengcanOrderItem>::iterator it1 = it->m_items.begin(); it1 != it->m_items.end(); it1++)
  768. {
  769. if (jiacai_no != "-1")
  770. {
  771. if (it1->jiacai_no != jiacai_no)
  772. {
  773. //如果jiacai_no不想等,就直接忽略
  774. continue;
  775. }
  776. }
  777. CZhengcanOrderItemPrint itemPrint;
  778. CZhengcanOrderItem tuicaiItem = *it1;
  779. itemPrint.m_quantity = tuicaiItem.num;
  780. itemPrint.m_item_price = tuicaiItem.price;
  781. itemPrint.m_type_id = tuicaiItem.type_id;
  782. if (tuicaiItem.m_is_taocan == true)
  783. {
  784. itemPrint.is_taocan = true;
  785. itemPrint.m_food_name = tuicaiItem.foodpackage_name; //不带属性商品
  786. }
  787. else
  788. {
  789. itemPrint.m_food_name = tuicaiItem.food_name; //带属性值
  790. }
  791. m_items_print.push_back(itemPrint);
  792. if (tuicaiItem.m_is_taocan == true)
  793. {
  794. //开始保存套餐里面的商品详情,主要用于厨房打印
  795. //接下来要把这个套餐的详情也保存下来
  796. for (std::vector<CZhengcanOrderItem>::iterator it = tuicaiItem.m_taocan_items.begin(); it != tuicaiItem.m_taocan_items.end(); it++)
  797. {
  798. std::string food_id = it->food_id;
  799. //要根据商品ID找出商品的名字
  800. CFood foodinfo;
  801. CSqlite3 sqlite;
  802. bool is_found = sqlite.GetFoodById(food_id, foodinfo);
  803. if (!is_found)
  804. {
  805. continue;
  806. }
  807. CZhengcanOrderItemPrint foodpackageitemPrint;
  808. foodpackageitemPrint.m_food_name = foodinfo.name;
  809. foodpackageitemPrint.m_quantity = tuicaiItem.num;
  810. foodpackageitemPrint.m_item_price = foodinfo.price;
  811. foodpackageitemPrint.m_type_id = foodinfo.type_id;
  812. foodpackageitemPrint.is_taocan = false;
  813. foodpackageitemPrint.is_taocan_item = true;
  814. m_items_print.push_back(foodpackageitemPrint);
  815. }
  816. }
  817. }
  818. }
  819. }
  820. void CZhengcanOrder::UpdateItemPrintForTuicai(std::string tuicai_item_id)
  821. {
  822. //清空之前的打印记录
  823. m_items_print.clear();
  824. for (std::vector<CZhengcanOrderHistoryXiadan>::iterator it = m_order_history_array.begin(); it != m_order_history_array.end(); it++)
  825. {
  826. for (std::vector<CZhengcanOrderItem>::iterator it1 = it->m_items.begin(); it1 != it->m_items.end(); it1++)
  827. {
  828. if (it1->item_id != tuicai_item_id)
  829. {
  830. //如果jiacai_no不想等,就直接忽略
  831. continue;
  832. }
  833. CZhengcanOrderItemPrint itemPrint;
  834. itemPrint.is_tuicai = true;
  835. CZhengcanOrderItem tuicaiItem = *it1;
  836. itemPrint.m_quantity = tuicaiItem.num;
  837. itemPrint.m_item_price = tuicaiItem.price;
  838. itemPrint.m_type_id = tuicaiItem.type_id;
  839. if (tuicaiItem.m_is_taocan == true)
  840. {
  841. itemPrint.is_taocan = true;
  842. itemPrint.m_food_name = tuicaiItem.foodpackage_name; //不带属性商品
  843. }
  844. else
  845. {
  846. itemPrint.m_food_name = tuicaiItem.food_name; //带属性值
  847. }
  848. m_items_print.push_back(itemPrint);
  849. if (tuicaiItem.m_is_taocan == true)
  850. {
  851. //开始保存套餐里面的商品详情,主要用于厨房打印
  852. //接下来要把这个套餐的详情也保存下来
  853. for (std::vector<CZhengcanOrderItem>::iterator it = tuicaiItem.m_taocan_items.begin(); it != tuicaiItem.m_taocan_items.end(); it++)
  854. {
  855. std::string food_id = it->food_id;
  856. //要根据商品ID找出商品的名字
  857. CFood foodinfo;
  858. CSqlite3 sqlite;
  859. bool is_found = sqlite.GetFoodById(food_id, foodinfo);
  860. if (!is_found)
  861. {
  862. continue;
  863. }
  864. CZhengcanOrderItemPrint foodpackageitemPrint;
  865. foodpackageitemPrint.m_food_name = foodinfo.name;
  866. foodpackageitemPrint.m_quantity = tuicaiItem.num;
  867. foodpackageitemPrint.m_item_price = foodinfo.price;
  868. foodpackageitemPrint.m_type_id = foodinfo.type_id;
  869. foodpackageitemPrint.is_taocan = false;
  870. foodpackageitemPrint.is_taocan_item = true;
  871. m_items_print.push_back(foodpackageitemPrint);
  872. }
  873. }
  874. }
  875. }
  876. }