|
@@ -59,6 +59,7 @@ HttpSocket::HttpSocket()
|
|
|
m_pgamelist = boost::make_shared<mongocxx::collection>();
|
|
|
m_pthirdtranslog = boost::make_shared<mongocxx::collection>();
|
|
|
m_pthirddeveloper = boost::make_shared<mongocxx::collection>();
|
|
|
+ m_predeemcode = boost::make_shared<mongocxx::collection>();
|
|
|
|
|
|
*m_pdb = (*m_pclient)["accounts"];
|
|
|
*m_gamelog = (*m_pclient)["gamelog"];
|
|
@@ -84,6 +85,7 @@ HttpSocket::HttpSocket()
|
|
|
*m_pgamelist = (*m_platform)["gamelist"];
|
|
|
*m_pthirdtranslog = (*m_gamelog)["thirdtranslog"];
|
|
|
*m_pthirddeveloper = (*m_platform)["thirddeveloper"];
|
|
|
+ *m_predeemcode = (*m_pvipuserdb)["redeemcode"];
|
|
|
|
|
|
m_strshahead = "X-REQUEST-SIGN";
|
|
|
m_strshaheadcontent = "6e4c91001979851a97c2b5360f044ff67b48e186d6ecd4394532851bffdeeae9";
|
|
@@ -202,6 +204,11 @@ bool HttpSocket::postmsg(std::function<void(std::string&, int)> funhttpmsg, std:
|
|
|
{
|
|
|
reelplay(getdata, funhttpmsg);
|
|
|
}
|
|
|
+ //兑换码
|
|
|
+ else if (itype == HTTPGENERATEREDEEMCODE)
|
|
|
+ {
|
|
|
+ strtojson = generateredeemcodes(getdata);
|
|
|
+ }
|
|
|
else
|
|
|
{
|
|
|
return false;
|
|
@@ -3594,3 +3601,123 @@ bool HttpSocket::updateusertrans(std::string struseracc, __int32 ikindid, std::s
|
|
|
|
|
|
|
|
|
|
|
|
+//生成兑换码
|
|
|
+std::string HttpSocket::generateredeemcodes(std::map<std::string, std::string> getdata)
|
|
|
+{
|
|
|
+ sRedeemCodeGenerate reqparam;
|
|
|
+ getvaluedata(getdata, reqparam);
|
|
|
+ std::string strret{};
|
|
|
+
|
|
|
+ bool bret = reqparam.datavalue();
|
|
|
+ if (!bret)
|
|
|
+ {
|
|
|
+ strret = funclib::rettojson(Err_ParamError, "param erro");
|
|
|
+ return strret;
|
|
|
+ }
|
|
|
+ //if (EA_LEVEL1 != getlevel(reqparam.spreaderid))
|
|
|
+ //{
|
|
|
+ // strret = funclib::rettojson(2, "you are not admin");
|
|
|
+ // return strret;
|
|
|
+ //}
|
|
|
+ auto findinfo = m_predeemcode->find_one(make_document(kvp("info", reqparam.info.c_str())));
|
|
|
+ if (findinfo)
|
|
|
+ {
|
|
|
+ strret = funclib::rettojson(Err_RedeemLableDuplicate, "lable duplicate!");
|
|
|
+ return strret;
|
|
|
+ }
|
|
|
+
|
|
|
+ //判断三方平台是否存在
|
|
|
+ auto threeadmin = m_pthreeadmin->find_one(bsoncxx::builder::stream::document{} << "authcode" << reqparam.authcode.c_str() \
|
|
|
+ << "authkey" << reqparam.authkey.c_str() << bsoncxx::builder::stream::finalize);
|
|
|
+ if (!threeadmin)
|
|
|
+ {
|
|
|
+ strret = funclib::rettojson(Err_KeyNotExist, "code or key isnot exist");
|
|
|
+ return strret;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!threeadmin->view()["adminuserid"])
|
|
|
+ {
|
|
|
+ strret = funclib::rettojson(Err_ThreeAdminLackInfo, "spreaderid isnot exist");
|
|
|
+ return strret;
|
|
|
+ }
|
|
|
+
|
|
|
+ __int64 ispreaderid = threeadmin->view()["adminuserid"].get_int64();
|
|
|
+ auto vipuser = m_pvipuser->find_one(bsoncxx::builder::stream::document{} << "userid" << ispreaderid << bsoncxx::builder::stream::finalize);
|
|
|
+ if (!vipuser || !vipuser->view()["areaid"])
|
|
|
+ {
|
|
|
+ strret = funclib::rettojson(Err_No_Agent, "spreaderid isnot exist");
|
|
|
+ return strret;
|
|
|
+ }
|
|
|
+
|
|
|
+ __int32 vipstate = 0;
|
|
|
+ if (vipuser->view()["state"])
|
|
|
+ {
|
|
|
+ vipstate = vipuser->view()["state"].get_int32();
|
|
|
+ }
|
|
|
+ else
|
|
|
+ vipstate = 1;
|
|
|
+
|
|
|
+ if (vipstate != 0)
|
|
|
+ {
|
|
|
+ strret = funclib::rettojson(Err_OutOfState_Agent, "spreaderid is disabled");
|
|
|
+ return strret;
|
|
|
+ }
|
|
|
+
|
|
|
+ __int32 iareaid = vipuser->view()["areaid"].get_int32();
|
|
|
+ // 生成兑换码
|
|
|
+ std::set<std::string> setcodes;
|
|
|
+ string strcode = "";
|
|
|
+ std::uniform_int_distribution<int> disrand(1, g_redeemcodechars.length() - 1);
|
|
|
+ while (setcodes.size() < reqparam.iquantity)
|
|
|
+ {
|
|
|
+ strcode = "";
|
|
|
+ for (size_t i = 0; i < 6; ++i) {
|
|
|
+ strcode += g_redeemcodechars.at(disrand(m_random));
|
|
|
+ }
|
|
|
+ if (setcodes.find(strcode) != setcodes.end())
|
|
|
+ continue;
|
|
|
+
|
|
|
+ if (m_predeemcode->count_documents(make_document(kvp("code", strcode.c_str()))) > 0)
|
|
|
+ continue;
|
|
|
+ setcodes.insert(strcode);
|
|
|
+ }
|
|
|
+
|
|
|
+ rapidjson::Document doc;
|
|
|
+ doc.SetObject();
|
|
|
+ rapidjson::Document::AllocatorType& allocator = doc.GetAllocator();
|
|
|
+ rapidjson::Value codesArray(rapidjson::kArrayType);
|
|
|
+
|
|
|
+ //批量插入
|
|
|
+ mongocxx::options::bulk_write bulk_opts;
|
|
|
+ bulk_opts.ordered(false); // false = 允许乱序执行,提高效率
|
|
|
+ auto bulk = m_predeemcode->create_bulk_write(bulk_opts);
|
|
|
+ __int64 itime = funclib::gettimestamp();
|
|
|
+ for (const auto& strcode : setcodes)
|
|
|
+ {
|
|
|
+ document doc;
|
|
|
+ doc.append(kvp("code", strcode.c_str()), kvp("info", reqparam.info.c_str()), kvp("codetype", reqparam.icodetype), kvp("exchangelimit", reqparam.iexchangelimit),
|
|
|
+ kvp("accountlimit", reqparam.iaccountlimit), kvp("score", reqparam.iscore), kvp("st", reqparam.istarttime), kvp("et", reqparam.iendtime),
|
|
|
+ kvp("open", 1), kvp("usedcount", 0), kvp("inserttime", itime), kvp("areaid", iareaid), kvp("spreaderid", ispreaderid));
|
|
|
+ mongocxx::model::insert_one insert_op{ doc.view() };
|
|
|
+ bulk.append(insert_op);
|
|
|
+
|
|
|
+ codesArray.PushBack(rapidjson::Value(strcode.c_str(), allocator), allocator);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 执行批量 update
|
|
|
+ auto result = bulk.execute();
|
|
|
+ if (result)
|
|
|
+ {
|
|
|
+ doc.AddMember("ret", -1, allocator);
|
|
|
+ doc.AddMember("info", rapidjson::Value("ok", allocator), allocator);
|
|
|
+ doc.AddMember("data", codesArray, allocator);
|
|
|
+ strret = funclib::doctojson(doc);
|
|
|
+ return strret;
|
|
|
+ }
|
|
|
+
|
|
|
+ strret = funclib::rettojson(2, "error");
|
|
|
+ return strret;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|