using CounsellorBL.BLStructure; using CounsellorBL.Common; using CounsellorBL.Helper; using CounsellorBL.ORD; using MonumentDefine; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using OT.COM.ArsenalDB; using OT.COM.LogisticsUtil; using OT.COM.SignalerMessage; using SoldierData.EnterprizeV4; using System; using System.Collections.Generic; using System.Linq; using System.Net.Http; using static CounsellorBL.Helper.FbRestHelper; namespace CounsellorBL.MEB { public class MemberListService : SingleDataTableTemplate { protected class MemberModel : tb_meb_member { public string age { get; set; } public int return_count { get; set; } public int amount { get; set; } } public class FbToken { public string access_token { get; set; } public string token_type { get; set; } public bool is_valid { get; set; } } public class FbGetGroups { public List data { get; set; } public JObject paging { get; set; } } public class Groups { public string name { get; set; } public string id { get; set; } public string privacy { get; set; } } private class CusMemberModel { public string uid { get; set; } public string group_user_id { get; set; } public string group_id { get; set; } public string fb_pic { get; set; } public string user_token { get; set; } } private class BatchModel { public int code { get; set; } public string body { get; set; } } public class PictureModel { public Picture picture { get; set; } public string id { get; set; } public class Picture { public PictureData data { get; set; } public class PictureData { public string url { get; set; } } } } public MemberListService() { dgReadCommandGenerator = readCommandGenerator; dgReadCommandPostDataHandler = readCommandPostDataHandler; } public bool CheckUserIsInGroup(string group_id,string access_token) { var IsInGroup = false; do { try { // 送出資料 string uri = "https://graph.facebook.com/v8.0/me/groups?limit=10000?"; var dicData = new Dictionary() { { "limit", "10000" }, { "access_token",access_token} }; APIHelper.BaseGet(uri, null, dicData, out HttpResponseMessage responseMessage); if (responseMessage.IsSuccessStatusCode) { var fb_error = GetFbApiError(responseMessage); if (!string.IsNullOrWhiteSpace(fb_error)) { Logger.Error($"{nameof(CheckUserIsInGroup)} FB API response error message: {fb_error} "); break; } var responseData = JsonConvert.DeserializeObject(responseMessage.Content.ReadAsStringAsync().Result); IsInGroup = responseData.data.Any(x => x.id == group_id); } } catch (Exception ex) { throw ex; } } while (false); return IsInGroup; } [Auth(false)] public new CResponseMessage ReadMemberInfo(CRequestMessage i_crmInput) { string sMsg; Command cRes = null; CResponseMessage crmRes = null; do { try { Dictionary dicObjCondition = GetQueryMasterFirstWhereData(i_crmInput).ToDictionary(x => x.Key, x => x.Value.ToString()); List lsMainColumns = EntityBase.GetAllColumnName(typeof(tb_meb_member)); // 取得所有欄位名稱 QueryJsonElementCollection lBlocks = new QueryJsonElementCollection(); QueryJsonElement qjeMember = lBlocks.GetInst(); qjeMember.table = tb_meb_member.TABLENAME; qjeMember.displaycols = lsMainColumns; if (dicObjCondition != null && dicObjCondition.Any()) { qjeMember.dicwherecols = dicObjCondition; } lBlocks.Add(qjeMember); QueryJsonElement qjeBranch = lBlocks.GetInst(); qjeBranch.table = tb_grp_branch.TABLENAME; qjeBranch.displaycols = new List { tb_grp_branch .CN_BRANCH_NAME}; qjeBranch.jointable = qjeMember; qjeBranch.joincols = new Dictionary { { tb_grp_branch.CN_UID, tb_meb_member.CN_DEFAULT_BRANCH } }; lBlocks.Add(qjeBranch); sMsg = MakeSelectJoinByBlocks(lBlocks, out cRes); if (sMsg != null) { break; } ArsenalInterface ai = ArsenalDBMgr.GetInst(cRes); var qdsMember = ai.RunQueryDataSet(cRes); crmRes = new CSuccessResponseMessage(null, i_crmInput); // 多傳一些參數到前端 crmRes.param.Add("member", new QueryResponse(qdsMember)); } catch (Exception ex) { sMsg = $"{nameof(ReadMemberInfo)} unknwon exception. i_crmInput={JsonConvert.SerializeObject(i_crmInput)}. ex={ex.Message}"; #if DEBUG System.Diagnostics.Debug.WriteLine(sMsg); #endif } } while (false); if (!string.IsNullOrEmpty(sMsg)) { crmRes = new CErrorResponseMessage(sMsg, i_crmInput); Logger.Error(JsonConvert.SerializeObject(i_crmInput)); Logger.Error(JsonConvert.SerializeObject(crmRes)); } return crmRes; } [Auth(false)] public new CResponseMessage Read(CRequestMessage i_crmInput) => base.Read(i_crmInput); protected string readCommandGenerator(CRequestMessage i_crmInput, JArray i_jaData, tb_sys_session i_sSessionUser, out Command o_c, [System.Runtime.CompilerServices.CallerLineNumber] int i_nCodeLine = 0, [System.Runtime.CompilerServices.CallerMemberName] string i_sMemberName = "", [System.Runtime.CompilerServices.CallerFilePath] string i_sSourcePath = "") { string sMsg; Command cRes = null; try { do { Dictionary dicObjCondition = GetQueryMasterFirstWhereData(i_crmInput); List lsMainColumns = EntityBase.GetAllColumnName(typeof(tb_meb_member)); // 取得所有欄位名稱 var lsBranch = ProjectHelper.GetUserGroup(i_crmInput); // 取得可讀取社團資料的社團uid清單 var lsMember = new List(); if (dicObjCondition.ContainsKey(tb_meb_member.CN_UID)) { var aMember = dicObjCondition[tb_meb_member.CN_UID] as JArray; foreach (var member in aMember) { lsMember.Add(member.ToString()); } dicObjCondition.Remove(tb_meb_member.CN_UID); } Dictionary dicCondition = new Dictionary(); foreach (var condition in dicObjCondition) { dicCondition.Add(condition.Key, condition.Value.ToString()); } QueryJsonElementCollection lBlocks = new QueryJsonElementCollection(); QueryJsonElement qjeMember = lBlocks.GetInst(); qjeMember.table = tb_meb_member.TABLENAME; qjeMember.displaycols = lsMainColumns; qjeMember.aliascols = new Dictionary> { { "'0'", new List() { "return_count" } } }; if (lsMember.Any()) { qjeMember.wherecols = new WhereNode(tb_meb_member.CN_UID, WhereNode.EColumnOperation.EOT_IN, typeof(tb_meb_member), lsMember.ToArray()); } if (dicCondition != null && dicCondition.Any()) { qjeMember.dicwherecols = dicCondition; } lBlocks.Add(qjeMember); QueryJsonElement qjeGroup = lBlocks.GetInst(); qjeGroup.table = tb_grp_group.TABLENAME; qjeGroup.jointable = qjeMember; qjeGroup.jointype = QueryJsonElement.LEFT_JOIN; qjeGroup.joincols = new Dictionary() { { tb_grp_group.CN_FB_GROUP_ID,tb_meb_member.CN_GROUP_ID }}; if (!dicCondition.ContainsKey(tb_meb_member.CN_GROUP_USER_ID)) { qjeGroup.wherecols = new WhereNode(tb_grp_group.CN_UID, WhereNode.EColumnOperation.EOT_IN, typeof(tb_grp_group), lsBranch.ToArray()); } lBlocks.Add(qjeGroup); QueryJsonElement qjePurchase = lBlocks.GetInst(); qjePurchase.table = tb_ord_purchase.TABLENAME; qjePurchase.jointype = QueryJsonElement.LEFT_JOIN; qjePurchase.jointable = qjeMember; qjePurchase.joincols = new Dictionary() { { tb_ord_purchase.CN_MEMBER_UID,tb_meb_member.CN_UID }}; qjePurchase.aliascols = new Dictionary> { { QueryJsonElement.SUM(tb_ord_purchase.CN_AMOUNT), new List() { "amount" } }, }; lBlocks.Add(qjePurchase); qjeMember.groupcols = new List> { Tuple.Create(qjeMember, tb_meb_member.CN_UID), Tuple.Create(qjeMember, tb_meb_member.CN_GROUP_ID), Tuple.Create(qjeMember, tb_meb_member.CN_GROUP_USER_ID), Tuple.Create(qjeMember, tb_meb_member.CN_MESSAGE_USER_ID), Tuple.Create(qjeMember, tb_meb_member.CN_EMAIL), Tuple.Create(qjeMember, tb_meb_member.CN_RANK), Tuple.Create(qjeMember, tb_meb_member.CN_FB_PIC), Tuple.Create(qjeMember, tb_meb_member.CN_NAME), Tuple.Create(qjeMember, tb_meb_member.CN_NICKNAME), Tuple.Create(qjeMember, tb_meb_member.CN_GENDER), Tuple.Create(qjeMember, tb_meb_member.CN_JOB), Tuple.Create(qjeMember, tb_meb_member.CN_BIRTHDAY), Tuple.Create(qjeMember, tb_meb_member.CN_CELLPHONE), Tuple.Create(qjeMember, tb_meb_member.CN_PHONE), Tuple.Create(qjeMember, tb_meb_member.CN_LAST_CALL_MESSAGE), Tuple.Create(qjeMember, tb_meb_member.CN_LINE_ID), Tuple.Create(qjeMember, tb_meb_member.CN_AREA), Tuple.Create(qjeMember, tb_meb_member.CN_ADDRESS), Tuple.Create(qjeMember, tb_meb_member.CN_LINK), Tuple.Create(qjeMember, tb_meb_member.CN_SHOPPING_ACCOUNT), Tuple.Create(qjeMember, tb_meb_member.CN_STATUS_FLAG), Tuple.Create(qjeMember, tb_meb_member.CN_DEFAULT_BRANCH), Tuple.Create(qjeMember, tb_meb_member.CN_DELETE_FLAG), Tuple.Create(qjeMember, tb_meb_member.CN_WPRICE_PAYMENT), Tuple.Create(qjeMember, tb_meb_member.CN_CREATE_DATE), Tuple.Create(qjeMember, tb_meb_member.CN_UPDATE_DATE), Tuple.Create(qjeMember, tb_meb_member.CN_CREATE_USER_UID), Tuple.Create(qjeMember, tb_meb_member.CN_UPDATE_USER_UID), Tuple.Create(qjeMember, tb_meb_member.CN_RETURN_COUNT), Tuple.Create(qjeMember, tb_meb_member.CN_FIREBASE_TOKEN), }; sMsg = MakeSelectJoinByBlocks(lBlocks, out cRes); if (sMsg != null) { break; } } while (false); } catch (Exception ex) { LogHelper.DBLog(Util.GetLastExceptionMsg(ex), i_nCodeLine, i_sMemberName, i_sSourcePath); sMsg = $"{nameof(readCommandGenerator)} unknwon exception. i_crmInput={JsonConvert.SerializeObject(i_crmInput)}. Call from {i_sMemberName} {i_sSourcePath}({i_nCodeLine})."; #if DEBUG System.Diagnostics.Debug.WriteLine(sMsg); #endif } o_c = cRes; return sMsg; } protected string readCommandPostDataHandler(CRequestMessage i_crmInput, ArsenalInterface i_aiArsenal, Command i_cCmd, JArray i_jaData, tb_sys_session i_sSessionUser, out object o_oReault, [System.Runtime.CompilerServices.CallerLineNumber] int i_nCodeLine = 0, [System.Runtime.CompilerServices.CallerMemberName] string i_sMemberName = "", [System.Runtime.CompilerServices.CallerFilePath] string i_sSourcePath = "") { string sMsg = null; List oResultData = null; try { do { Dictionary dicCondition = GetQueryMasterFirstWhereData(i_crmInput); // 取得condition List qds = i_aiArsenal.RunQueryList(i_cCmd); if (!i_cCmd.IsSuccess) { sMsg = i_cCmd.LastErrorCode; break; } if (dicCondition.ContainsKey("birthdayMonth")) { qds = qds.Where(x => x.birthday.HasValue && x.birthday.Value.Month == Convert.ToInt32(dicCondition["birthdayMonth"])).ToList(); } // 不顯示現貨銷售 if (dicCondition.ContainsKey("hideSpotSale")) { qds = qds.Where(x => x.name != "現貨銷售").ToList(); } foreach (var data in qds) { if (data.birthday.HasValue) { var age = CalculateAgeCorrect(data.birthday.Value, DateTime.Now); data.age = age == 0 ? "" : age.ToString(); } } oResultData = qds.OrderByDescending(x => x.create_date).ToList(); } while (false); } catch (Exception ex) { LogHelper.DBLog(Util.GetLastExceptionMsg(ex), i_nCodeLine, i_sMemberName, i_sSourcePath); sMsg = $"{nameof(readCommandPostDataHandler)} unknwon exception. i_crmInput={JsonConvert.SerializeObject(i_crmInput)}. Call from {i_sMemberName} {i_sSourcePath}({i_nCodeLine})."; #if DEBUG System.Diagnostics.Debug.WriteLine(sMsg); #endif } o_oReault = oResultData; return sMsg; } public int CalculateAgeCorrect(DateTime birthDate, DateTime now) { int age = now.Year - birthDate.Year; if (now.Month < birthDate.Month || (now.Month == birthDate.Month && now.Day < birthDate.Day)) age--; return age; } /// /// 取得應用程式權杖 /// /// /// /// /// public bool GetAppToken(string APP_ID, string CLIENT_SECRET, out FbToken responseData) { responseData = new FbToken(); string uri = string.Format("https://graph.facebook.com/oauth/access_token?client_id={0}&client_secret={1}&grant_type=client_credentials", APP_ID, CLIENT_SECRET); APIHelper.BaseGet(uri, null, new Dictionary(), out HttpResponseMessage responseMessage); if (responseMessage.IsSuccessStatusCode) { responseData = JsonConvert.DeserializeObject(responseMessage.Content.ReadAsStringAsync().Result); } return responseMessage.IsSuccessStatusCode; } public bool GetFBPagesID(string i_sASID, string PAGE_ID, string i_sToken, out string o_sPSID) { o_sPSID = null; string uri = string.Format("https://graph.facebook.com/{0}/ids_for_pages?page={1}&access_token={2}", i_sASID, PAGE_ID, i_sToken); APIHelper.BaseGet(uri, null, new Dictionary(), out HttpResponseMessage responseMessage); if (responseMessage.IsSuccessStatusCode) { var sResponse = responseMessage.Content.ReadAsStringAsync().Result; Logger.Info(uri + " && " + sResponse); var joResult = JsonConvert.DeserializeObject(sResponse) as JObject; var oResult = joResult.ToObject>(); var jaData = oResult["data"] as JArray; if (jaData.Any()) { var joData = jaData.First() as JObject; if (joData != null) { var objData = joData.ToObject>(); o_sPSID = objData["id"].ToString(); } } } return responseMessage.IsSuccessStatusCode; } [Auth(false)] public CResponseMessage GetQrCode(CRequestMessage i_crmInput) { string sMsg = null; CResponseMessage crmRes = null; do { try { Dictionary dicCondition = GetQueryMasterFirstWhereData(i_crmInput); // 取得condition if (!string.IsNullOrEmpty(sMsg)) { break; } var group_id = dicCondition[tb_meb_member.CN_GROUP_ID].ToString(); // 先查詢資料是否存在 tb_meb_member cMember = new tb_meb_member(); cMember.SetDirty(tb_meb_member.CN_UID, tb_meb_member.CN_GROUP_USER_ID); tb_meb_member cMemberCon = new tb_meb_member() { group_user_id = dicCondition[tb_meb_member.CN_GROUP_USER_ID].ToString(), group_id = group_id }; Command cMemberSelect = Command.SetupSelectCmd(cMember, cMemberCon); ArsenalInterface ai = ArsenalDBMgr.GetInst(cMemberSelect); tb_meb_member qdsMember = ai.RunQuerySingleORM(cMemberSelect); crmRes = new CSuccessResponseMessage(null, i_crmInput); // 多傳一些參數到前端 crmRes.param.Add("member", qdsMember); } catch (Exception ex) { sMsg = $"{nameof(PatchMemberInfo)} unknwon exception. i_crmInput={JsonConvert.SerializeObject(i_crmInput)}. ex={ex.Message}"; #if DEBUG System.Diagnostics.Debug.WriteLine(sMsg); #endif } } while (false); if (!string.IsNullOrEmpty(sMsg)) { crmRes = new CErrorResponseMessage(sMsg, i_crmInput); Logger.Error(JsonConvert.SerializeObject(i_crmInput)); Logger.Error(JsonConvert.SerializeObject(crmRes)); } return crmRes; } [Auth(false)] public CResponseMessage CheckTokenValid(CRequestMessage i_crmInput) { string sMsg = null; CResponseMessage crmRes = null; do { try { Dictionary dicCondition = GetQueryMasterFirstWhereData(i_crmInput); // 取得condition var fbHelper = new FbRestHelper(); sMsg = fbHelper.CallFbGetInformation(dicCondition["token"].ToString(), out UserInfo userInfo); if (!string.IsNullOrEmpty(sMsg)) { break; } var group_id = dicCondition[tb_meb_member.CN_GROUP_ID].ToString(); var groupData = GetGroupSettings(group_id); string sPSID = null; if (groupData == null) { sMsg = "社團資訊錯誤"; break; } #region 取得 pages_user_id 到貨通知需要 var result = GetAppToken(groupData.app_id, groupData.client_secret, out FbToken resData); if (result) { GetFBPagesID(userInfo.id, groupData.page_id, resData.access_token, out sPSID); } string privacy = null; bool isSuccess = getPrivacy(group_id, out privacy); var IsOpen = false; if (privacy == "OPEN") { IsOpen = true; } #endregion var IsInGroups = CheckUserIsInGroup(group_id, dicCondition["token"].ToString()); // 更新會員資料 List lCmdUpdate = new List(); // 先查詢資料是否存在 tb_meb_member cMember = new tb_meb_member(); cMember.SetFullDirty(); tb_meb_member cMemberCon = new tb_meb_member() { group_user_id = userInfo.id, group_id = group_id }; Command cMemberSelect = Command.SetupSelectCmd(cMember, cMemberCon); ArsenalInterface ai = ArsenalDBMgr.GetInst(cMemberSelect); tb_meb_member qdsMember = ai.RunQuerySingleORM(cMemberSelect); string asid = userInfo.id; if (qdsMember == null) { // 新增 tb_meb_member mNew = new tb_meb_member() { }; mNew.message_user_id = sPSID; mNew.group_user_id = asid; mNew.last_call_message = DateTime.Now; mNew.gender = userInfo.gender; mNew.email = userInfo.email; mNew.fb_pic = userInfo.picture.data.url; if (DateTime.TryParse(userInfo.birthday, out DateTime birthday)) { mNew.birthday = birthday; } mNew.group_user_id = userInfo.id; mNew.group_id = dicCondition["group_id"].ToString(); lCmdUpdate.Add(Command.SetupInsertCmd(mNew)); } else { // 更新 tb_meb_member mUpd = new tb_meb_member(); mUpd.message_user_id = sPSID; if (qdsMember.last_call_message == null) // 紀錄最後傳送時間 { mUpd.last_call_message = DateTime.Now; } mUpd.message_user_id = sPSID; mUpd.group_user_id = asid; mUpd.last_call_message = DateTime.Now; mUpd.gender = userInfo.gender; mUpd.email = userInfo.email; mUpd.fb_pic = userInfo.picture.data.url; if (DateTime.TryParse(userInfo.birthday, out DateTime birthday)) { mUpd.birthday = birthday; } mUpd.group_user_id = userInfo.id; List lswnMain = new List(); lswnMain.Add(new WhereNode(tb_meb_member.CN_GROUP_USER_ID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_meb_member), asid)); lswnMain.Add(new WhereNode(tb_meb_member.CN_GROUP_ID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_meb_member), group_id)); lCmdUpdate.Add(Command.SetupUpdateCmd(mUpd, new WhereNode(WhereNode.ENodeOperation.ENO_AND, lswnMain.ToArray()))); } ai = ArsenalDBMgr.GetInst(lCmdUpdate[0], GetDefaultSystemColumnInfo()); ai.RunEditCmds(lCmdUpdate); sMsg = GetLastErrorCode(lCmdUpdate); if (sMsg != null) { if (sMsg == "msg.sqlserver_2627") // 此錯誤為重複 Insert 相同 group_user_id and group_id 改為更新 { List lCmdUpdateWhenErr = new List(); // 更新 tb_meb_member mUpdErr = new tb_meb_member(); mUpdErr.message_user_id = sPSID; mUpdErr.message_user_id = sPSID; mUpdErr.group_user_id = asid; mUpdErr.last_call_message = DateTime.Now; mUpdErr.gender = userInfo.gender; mUpdErr.email = userInfo.email; mUpdErr.fb_pic = userInfo.picture.data.url; if (DateTime.TryParse(userInfo.birthday, out DateTime birthday)) { mUpdErr.birthday = birthday; } mUpdErr.group_user_id = userInfo.id; List lswnMainErr = new List(); lswnMainErr.Add(new WhereNode(tb_meb_member.CN_GROUP_USER_ID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_meb_member), asid)); lswnMainErr.Add(new WhereNode(tb_meb_member.CN_GROUP_ID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_meb_member), group_id)); lCmdUpdateWhenErr.Add(Command.SetupUpdateCmd(mUpdErr, new WhereNode(WhereNode.ENodeOperation.ENO_AND, lswnMainErr.ToArray()))); ArsenalInterface ai2 = ArsenalDBMgr.GetInst(lCmdUpdateWhenErr[0], GetDefaultSystemColumnInfo()); ai2.RunEditCmds(lCmdUpdateWhenErr); sMsg = GetLastErrorCode(lCmdUpdateWhenErr); // 傳必要參數至前端 crmRes.param.Add("psid", sPSID); crmRes.param.Add("branch_status", 1); break; } else { break; } } crmRes = new CSuccessResponseMessage(null, i_crmInput); // 多傳一些參數到前端 crmRes.param.Add("psid", sPSID); if (IsOpen == true) { crmRes.param.Add("joinGroups", "Y"); } else { crmRes.param.Add("joinGroups", IsInGroups == true ? "Y" : "N"); } crmRes.param.Add("fbid", userInfo.id); // 只顯示公開的分店 List branches = GetBranches(group_id); var enabledBranches = branches.Where(x => x.public_status == (int)Enums.Flag.Enable).Select(x => new { value = x.uid, display = x.branch_name }); // 沒有預設分店 string default_branch = qdsMember?.default_branch; int branch_status = 0; // 0:未填寫 1:已填寫 -1:已填寫但分店消失 if (!string.IsNullOrEmpty(default_branch)) { branch_status = enabledBranches.Any(x => x.value == default_branch) ? 1 : -1; crmRes.param.Add("default_branch", enabledBranches.Where(x => x.value == default_branch).FirstOrDefault().display); } if (branch_status != 1) { crmRes.param.Add("branch_data", enabledBranches); } crmRes.param.Add("branch_status", branch_status); Logger.Info($"group_id: {group_id} group_user_id: {asid} branch_status: {branch_status} enabledBranches: {enabledBranches.Count()}"); // 紀錄是否第一次登入 if (qdsMember == null) { crmRes.param.Add("first_login", true); } //在查一次傳uid cMember = new tb_meb_member(); cMember.SetFullDirty(); cMemberCon = new tb_meb_member() { group_user_id = userInfo.id, group_id = group_id }; cMemberSelect = Command.SetupSelectCmd(cMember, cMemberCon); ai = ArsenalDBMgr.GetInst(cMemberSelect); qdsMember = ai.RunQuerySingleORM(cMemberSelect); if (qdsMember == null) { crmRes.param.Add("uid", tb_meb_member.CN_UID); } crmRes.param.Add("token", Guid.NewGuid().ToString()); // 如果超過指定天數沒有按,提醒使用者 bool sendMessageAgain = qdsMember?.message_user_id != null && qdsMember?.last_call_message <= DateTime.Now.AddMonths(-1); crmRes.param.Add("send_msg_again", sendMessageAgain); } catch (Exception ex) { sMsg = $"{nameof(PatchMemberInfo)} unknwon exception. i_crmInput={JsonConvert.SerializeObject(i_crmInput)}. ex={ex.Message}"; #if DEBUG System.Diagnostics.Debug.WriteLine(sMsg); #endif } } while (false); if (!string.IsNullOrEmpty(sMsg)) { crmRes = new CErrorResponseMessage(sMsg, i_crmInput); Logger.Error(JsonConvert.SerializeObject(i_crmInput)); Logger.Error(JsonConvert.SerializeObject(crmRes)); } return crmRes; } [Auth(false)] public CResponseMessage PatchMemberInfo(CRequestMessage i_crmInput) { string sMsg = null; CResponseMessage crmRes = null; try { do { sMsg = getCommonParameter(i_crmInput, BLWording.ADD_MASTER, out JArray jaDataArray, out tb_sys_session sUserSession); if (sMsg != null) { break; } if (jaDataArray.Count != 1 || jaDataArray[0] == null) { sMsg = MessageWording.PARAM_NOT_EXPECTED; break; } JObject joData = jaDataArray[0] as JObject; Dictionary dicData = new Dictionary(); if (joData != null) { dicData = joData.ToObject>(); } string sPSID = null; var group_id = dicData[tb_meb_member.CN_GROUP_ID].ToString(); var groupData = GetGroupSettings(group_id); if (groupData == null) { sMsg = "社團資訊錯誤"; break; } #region 取得 pages_user_id 到貨通知需要 var result = GetAppToken(groupData.app_id, groupData.client_secret, out FbToken resData); if (result) { GetFBPagesID(dicData[BLWording.ASID].ToString(), groupData.page_id, resData.access_token, out sPSID); } #endregion // 更新會員資料 List lCmdUpdate = new List(); // 先查詢資料是否存在 tb_meb_member cMember = new tb_meb_member(); cMember.SetFullDirty(); tb_meb_member cMemberCon = new tb_meb_member() { group_user_id = dicData[BLWording.ASID].ToString(), group_id = group_id }; Command cMemberSelect = Command.SetupSelectCmd(cMember, cMemberCon); ArsenalInterface ai = ArsenalDBMgr.GetInst(cMemberSelect); tb_meb_member qdsMember = ai.RunQuerySingleORM(cMemberSelect); string asid = dicData[BLWording.ASID].ToString(); if (qdsMember == null) { // 新增 tb_meb_member mNew = new tb_meb_member() { }; mNew.message_user_id = sPSID; mNew.group_user_id = asid; mNew.last_call_message = DateTime.Now; mNew.FillData(dicData); lCmdUpdate.Add(Command.SetupInsertCmd(mNew)); } else { // 更新 dicData.Remove("group_id"); tb_meb_member mUpd = new tb_meb_member(); mUpd.message_user_id = sPSID; if (qdsMember.last_call_message == null) // 紀錄最後傳送時間 { mUpd.last_call_message = DateTime.Now; } mUpd.FillData(dicData); List lswnMain = new List(); lswnMain.Add(new WhereNode(tb_meb_member.CN_GROUP_USER_ID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_meb_member), asid)); lswnMain.Add(new WhereNode(tb_meb_member.CN_GROUP_ID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_meb_member), group_id)); lCmdUpdate.Add(Command.SetupUpdateCmd(mUpd, new WhereNode(WhereNode.ENodeOperation.ENO_AND, lswnMain.ToArray()))); } ai = ArsenalDBMgr.GetInst(lCmdUpdate[0], GetDefaultSystemColumnInfo()); ai.RunEditCmds(lCmdUpdate); sMsg = GetLastErrorCode(lCmdUpdate); if (sMsg != null) { if (sMsg == "msg.sqlserver_2627") // 此錯誤為重複 Insert 相同 group_user_id and group_id 改為更新 { List lCmdUpdateWhenErr = new List(); // 更新 dicData.Remove("group_id"); tb_meb_member mUpdErr = new tb_meb_member(); mUpdErr.message_user_id = sPSID; mUpdErr.FillData(dicData); List lswnMainErr = new List(); lswnMainErr.Add(new WhereNode(tb_meb_member.CN_GROUP_USER_ID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_meb_member), asid)); lswnMainErr.Add(new WhereNode(tb_meb_member.CN_GROUP_ID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_meb_member), group_id)); lCmdUpdateWhenErr.Add(Command.SetupUpdateCmd(mUpdErr, new WhereNode(WhereNode.ENodeOperation.ENO_AND, lswnMainErr.ToArray()))); ArsenalInterface ai2 = ArsenalDBMgr.GetInst(lCmdUpdateWhenErr[0], GetDefaultSystemColumnInfo()); ai2.RunEditCmds(lCmdUpdateWhenErr); sMsg = GetLastErrorCode(lCmdUpdateWhenErr); // 傳必要參數至前端 crmRes.param.Add("psid", sPSID); crmRes.param.Add("branch_status", 1); break; } else { break; } } crmRes = new CSuccessResponseMessage(null, i_crmInput); // 多傳一些參數到前端 crmRes.param.Add("psid", sPSID); // 只顯示公開的分店 List branches = GetBranches(group_id); var enabledBranches = branches.Where(x => x.public_status == (int)Enums.Flag.Enable).Select(x => new { value = x.uid, display = $"{x.branch_name} - {x.address = x.address }" }); // 沒有預設分店 string default_branch = qdsMember?.default_branch; int branch_status = 0; // 0:未填寫 1:已填寫 -1:已填寫但分店消失 if (!string.IsNullOrEmpty(default_branch)) { branch_status = enabledBranches.Any(x => x.value == default_branch) ? 1 : -1; crmRes.param.Add("default_branch", enabledBranches.Where(x => x.value == default_branch).FirstOrDefault().display); } if (branch_status != 1) { crmRes.param.Add("branch_data", enabledBranches); } crmRes.param.Add("branch_status", branch_status); Logger.Info($"group_id: {group_id} group_user_id: {asid} branch_status: {branch_status} enabledBranches: {enabledBranches.Count()}"); // 紀錄是否第一次登入 if (qdsMember == null) { crmRes.param.Add("first_login", true); } // 如果超過指定天數沒有按,提醒使用者 bool sendMessageAgain = qdsMember?.message_user_id != null && qdsMember?.last_call_message <= DateTime.Now.AddMonths(-1); crmRes.param.Add("send_msg_again", sendMessageAgain); } while (false); } catch (Exception ex) { sMsg = $"{nameof(PatchMemberInfo)} unknwon exception. i_crmInput={JsonConvert.SerializeObject(i_crmInput)}. ex={ex.Message}"; #if DEBUG System.Diagnostics.Debug.WriteLine(sMsg); #endif } if (string.IsNullOrEmpty(sMsg)) { //Logger.Info(JsonConvert.SerializeObject(i_crmInput)); //Logger.Info(JsonConvert.SerializeObject(crmRes)); } else { crmRes = new CErrorResponseMessage(sMsg, i_crmInput); Logger.Error(JsonConvert.SerializeObject(i_crmInput)); Logger.Error(JsonConvert.SerializeObject(crmRes)); } return crmRes; } private List GetBranches(string group_id) { // 從group_id找到uid,再用uid去撈分店名稱跟分店uid QueryJsonElementCollection lBlocks = new QueryJsonElementCollection(); QueryJsonElement qjeOrigin = lBlocks.GetInst(); qjeOrigin.table = tb_grp_group.TABLENAME; qjeOrigin.displaycols = new List() { tb_grp_group.CN_UID }; qjeOrigin.wherecols = new WhereNode(tb_grp_group.CN_FB_GROUP_ID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_grp_group), group_id); lBlocks.Add(qjeOrigin); string sMsg = MakeSelectJoinByBlocks(lBlocks, out Command cRes); var ai = ArsenalDBMgr.GetInst(cRes); var group = ai.RunQuerySingleORM(cRes); if (group == null) { return null; } lBlocks = new QueryJsonElementCollection(); qjeOrigin = lBlocks.GetInst(); qjeOrigin.table = tb_grp_branch.TABLENAME; qjeOrigin.displaycols = new List() { tb_grp_branch.CN_UID, tb_grp_branch.CN_BRANCH_NAME, tb_grp_branch.CN_PUBLIC_STATUS, tb_grp_branch.CN_ADDRESS }; qjeOrigin.wherecols = new WhereNode(tb_grp_branch.CN_GROUP_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_grp_branch), group.uid); lBlocks.Add(qjeOrigin); sMsg = MakeSelectJoinByBlocks(lBlocks, out cRes); ai = ArsenalDBMgr.GetInst(cRes); var data = ai.RunQueryList(cRes); return data; } public CResponseMessage GetMatchedMember(CRequestMessage i_crmInput) { CResponseMessage crmRes = null; string sMsg = null; try { do { tb_meb_member sDisplay = new tb_meb_member(); sDisplay.SetFullDirtyEx(EntityBaseExtension.EColumnFilter.ES_NO_SYSTEMCOLUMN); Command cAllSetting = Command.SetupSelectCmd(sDisplay); crmRes = this.simpleQuery(i_crmInput, BLWording.QRY_MASTER, null, cAllSetting); } while (false); } catch (Exception ex) { LogHelper.DBLog(Util.GetLastExceptionMsg(ex)); sMsg = $"{nameof(GetMatchedMember)} unknwon exception. Call from)."; #if DEBUG System.Diagnostics.Debug.WriteLine(sMsg); #endif } if (sMsg != null) { crmRes = new CErrorResponseMessage(sMsg); Logger.Error(JsonConvert.SerializeObject(i_crmInput)); Logger.Error(JsonConvert.SerializeObject(crmRes)); } else { //Logger.Info(JsonConvert.SerializeObject(i_crmInput)); //Logger.Info(JsonConvert.SerializeObject(crmRes)); } return crmRes; } public CResponseMessage GetMemberProfile(CRequestMessage i_crmInput) { CResponseMessage crmRes = null; string sMsg = null; Command cRes = null; try { do { Dictionary dicCondition = GetQueryMasterFirstQJEDicwherecols(i_crmInput); var lsBranch = ProjectHelper.GetUserGroup(i_crmInput); QueryJsonElementCollection lBlocks = new QueryJsonElementCollection(); QueryJsonElement qjeMember = lBlocks.GetInst(); qjeMember.table = tb_meb_member.TABLENAME; qjeMember.dicwherecols = dicCondition; lBlocks.Add(qjeMember); QueryJsonElement qjeGroup = lBlocks.GetInst(); qjeGroup.table = tb_grp_group.TABLENAME; qjeGroup.jointable = qjeMember; qjeGroup.jointype = QueryJsonElement.LEFT_JOIN; qjeGroup.joincols = new Dictionary() { { tb_grp_group.CN_FB_GROUP_ID,tb_meb_member.CN_GROUP_ID }}; if (!dicCondition.ContainsKey(tb_meb_member.CN_GROUP_USER_ID)) { qjeGroup.wherecols = new WhereNode(tb_grp_group.CN_UID, WhereNode.EColumnOperation.EOT_IN, typeof(tb_grp_group), lsBranch.ToArray()); } lBlocks.Add(qjeGroup); QueryJsonElement qjeGroupUser = lBlocks.GetInst(); qjeGroupUser.table = tb_grp_group2user.TABLENAME; qjeGroupUser.jointable = qjeGroup; qjeGroupUser.jointype = QueryJsonElement.LEFT_JOIN; qjeGroupUser.joincols = new Dictionary { { tb_grp_group2user.CN_GROUP_UID, tb_grp_group.CN_UID } }; qjeGroupUser.displaycols = new List() { tb_grp_group2user.CN_USER_TOKEN }; lBlocks.Add(qjeGroupUser); sMsg = MakeSelectJoinByBlocks(lBlocks, out cRes); ArsenalInterface ai = ArsenalDBMgr.GetInst(cRes); List qds = ai.RunQueryList(cRes); var user_token = ""; foreach (var data in qds) { user_token = data.GetValue("user_token").ToString(); } string uri = ""; if (dicCondition.ContainsKey(tb_meb_member.CN_GROUP_USER_ID)) { uri = string.Format("https://graph.facebook.com/{0}?fields={1}&access_token={2}", dicCondition[tb_meb_member.CN_GROUP_USER_ID], "picture.type(normal)", user_token); } APIHelper.BaseGet(uri, null, new Dictionary(), out HttpResponseMessage responseMessage); if (responseMessage.IsSuccessStatusCode) { var joResult = JsonConvert.DeserializeObject(responseMessage.Content.ReadAsStringAsync().Result) as JObject; var oResult = joResult.ToObject>(); if (oResult.Any()) { crmRes = new CSuccessResponseMessage(null, i_crmInput); crmRes.param.Add("data", oResult); } } else { LogHelper.DBLog("url獲取picture失敗:" + uri); crmRes = new CErrorResponseMessage("獲取picture失敗"); } } while (false); } catch (Exception ex) { LogHelper.DBLog(Util.GetLastExceptionMsg(ex)); sMsg = $"{nameof(GetMemberProfile)} unknwon exception. Call from)."; #if DEBUG System.Diagnostics.Debug.WriteLine(sMsg); #endif } if (sMsg != null) { crmRes = new CErrorResponseMessage(sMsg); Logger.Error(JsonConvert.SerializeObject(i_crmInput)); Logger.Error(JsonConvert.SerializeObject(crmRes)); } else { //Logger.Info(JsonConvert.SerializeObject(i_crmInput)); //Logger.Info(JsonConvert.SerializeObject(crmRes)); } return crmRes; } public CResponseMessage RefreshAllMemberInfo(CRequestMessage i_crmInput) { CResponseMessage crmRes = null; string sMsg = null; Command cRes = null; try { do { Dictionary dicCondition = GetQueryMasterFirstWhereData(i_crmInput); string[] aMemberUID = new string[0]; if (dicCondition.ContainsKey(tb_meb_member.CN_UID)) { if (dicCondition[tb_meb_member.CN_UID] != null) { var jaMemberUID = dicCondition[tb_meb_member.CN_UID] as JArray; aMemberUID = jaMemberUID.Select(x => x.ToString()).ToArray(); } } QueryJsonElementCollection lBlocks = new QueryJsonElementCollection(); QueryJsonElement qjeMember = lBlocks.GetInst(); qjeMember.table = tb_meb_member.TABLENAME; qjeMember.displaycols = new List() { tb_meb_member.CN_UID, tb_meb_member.CN_GROUP_USER_ID, tb_meb_member.CN_GROUP_ID, tb_meb_member.CN_FB_PIC }; qjeMember.wherecols = new WhereNode(tb_meb_member.CN_UID, WhereNode.EColumnOperation.EOT_IN, typeof(tb_meb_member), aMemberUID.ToArray()); lBlocks.Add(qjeMember); QueryJsonElement qjeGroup = lBlocks.GetInst(); qjeGroup.table = tb_grp_group.TABLENAME; qjeGroup.jointable = qjeMember; qjeGroup.jointype = QueryJsonElement.LEFT_JOIN; qjeGroup.joincols = new Dictionary() { { tb_grp_group.CN_FB_GROUP_ID,tb_meb_member.CN_GROUP_ID }}; lBlocks.Add(qjeGroup); QueryJsonElement qjeGroupUser = lBlocks.GetInst(); qjeGroupUser.table = tb_grp_group2user.TABLENAME; qjeGroupUser.jointable = qjeGroup; qjeGroupUser.jointype = QueryJsonElement.LEFT_JOIN; qjeGroupUser.joincols = new Dictionary { { tb_grp_group2user.CN_GROUP_UID, tb_grp_group.CN_UID } }; qjeGroupUser.displaycols = new List() { tb_grp_group2user.CN_USER_TOKEN }; lBlocks.Add(qjeGroupUser); sMsg = MakeSelectJoinByBlocks(lBlocks, out cRes); ArsenalInterface ai = ArsenalDBMgr.GetInst(cRes); List qds = ai.RunQueryList(cRes); List lCmdUpdate = new List(); List lswnMain = new List(); var user_token = ""; if(qds.Count()>0) { user_token = qds[0].user_token.ToString(); } string strPostUrl = "https://graph.facebook.com/me"; var lsData = new List() { new APIHelper.DataContent { Key = "access_token" , Type = typeof(StringContent) , Content = user_token }, new APIHelper.DataContent { Key = "include_headers", Type = typeof(StringContent), Content = "false" } }; var listBacth = new List>(); var dicBacth = new Dictionary(); var iRowNO = 0; foreach (CusMemberModel MemberData in qds) { iRowNO++; dicBacth = new Dictionary(); dicBacth.Add("method", "GET"); dicBacth.Add("relative_url", string.Format("{0}?fields={1}", MemberData.group_user_id, "picture.type(normal)")); listBacth.Add(dicBacth); try { //每50執行一次批次 if (iRowNO % 50 == 0 || iRowNO == qds.Count()) { lsData.Add(new APIHelper.DataContent { Key = "batch", Type = typeof(StringContent), Content = JsonConvert.SerializeObject(listBacth) }); listBacth = new List>(); APIHelper.BasePost(strPostUrl, null, lsData, out HttpResponseMessage responseMessage); if (responseMessage.IsSuccessStatusCode) { string sContent = responseMessage.Content.ReadAsStringAsync().Result; var lstReturn = JsonConvert.DeserializeObject>(sContent); foreach (BatchModel BatchModel in lstReturn) { if (BatchModel.code == 200) { var PictureModel = JsonConvert.DeserializeObject(BatchModel.body); var strPicurl = PictureModel.picture.data.url; if (!string.IsNullOrEmpty(strPicurl)) { //更新 tb_meb_member mUpd = new tb_meb_member(); mUpd.fb_pic = strPicurl; mUpd.update_date = DateTime.Now; lswnMain = new List(); lswnMain.Add(new WhereNode(tb_meb_member.CN_GROUP_USER_ID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_meb_member), PictureModel.id)); lCmdUpdate.Add(Command.SetupUpdateCmd(mUpd, new WhereNode(WhereNode.ENodeOperation.ENO_AND, lswnMain.ToArray()))); } } } } else { Logger.Error($"CallFbPostPushAPI f7"); sMsg = JsonConvert.SerializeObject(responseMessage); Logger.Error($"CallFbPostPushAPI sMsg={sMsg}"); break; } } } catch (Exception ex) { LogHelper.DBLog(Util.GetLastExceptionMsg(ex)); Logger.Error(MemberData.uid + "error"); sMsg = MemberData.uid + "error"; #if DEBUG System.Diagnostics.Debug.WriteLine(sMsg); #endif } } // 更新fb_pic資料 if (lCmdUpdate.Count() > 0) { ai = ArsenalDBMgr.GetInst(lCmdUpdate[0], GetDefaultSystemColumnInfo()); ai.RunEditCmds(lCmdUpdate); sMsg = GetLastErrorCode(lCmdUpdate); if (sMsg != null) { break; } } //查詢最新的fb_pic lBlocks = new QueryJsonElementCollection(); qjeMember = lBlocks.GetInst(); qjeMember.table = tb_meb_member.TABLENAME; qjeMember.displaycols = new List() { tb_meb_member.CN_UID, tb_meb_member.CN_GROUP_USER_ID, tb_meb_member.CN_GROUP_ID, tb_meb_member.CN_FB_PIC }; qjeMember.wherecols = new WhereNode(tb_meb_member.CN_UID, WhereNode.EColumnOperation.EOT_IN, typeof(tb_meb_member), aMemberUID.ToArray()); lBlocks.Add(qjeMember); sMsg = MakeSelectJoinByBlocks(lBlocks, out cRes); ai = ArsenalDBMgr.GetInst(cRes); qds = ai.RunQueryList(cRes); crmRes = new CSuccessResponseMessage(null, i_crmInput); crmRes.param.Add(BLWording.DATA, qds); } while (false); } catch (Exception ex) { LogHelper.DBLog(Util.GetLastExceptionMsg(ex)); sMsg = $"{nameof(GetMemberProfile)} unknwon exception. Call from)."; #if DEBUG System.Diagnostics.Debug.WriteLine(sMsg); #endif } if (sMsg != null) { crmRes = new CErrorResponseMessage(sMsg); Logger.Error(JsonConvert.SerializeObject(i_crmInput)); Logger.Error(JsonConvert.SerializeObject(crmRes)); } return crmRes; } [Auth(false)] public CResponseMessage SetDefaultBranch(CRequestMessage i_crmInput) { return UpdateCommand(i_crmInput, (dicData) => { var defaultBranch = dicData[tb_meb_member.CN_DEFAULT_BRANCH] as string; var group_user_id = dicData[tb_meb_member.CN_GROUP_USER_ID] as string; var group_id = dicData[tb_meb_member.CN_GROUP_ID] as string; // 更新預設分店 tb_meb_member updateEntity = new tb_meb_member { default_branch = defaultBranch }; tb_meb_member updateEntityCond = new tb_meb_member { group_user_id = group_user_id, group_id = group_id }; return Command.SetupUpdateCmd(updateEntity, updateEntityCond); }); } [Auth(false)] public CResponseMessage CallSendMessage(CRequestMessage i_crmInput) { return UpdateCommand(i_crmInput, (dicData) => { var group_user_id = dicData[tb_meb_member.CN_GROUP_USER_ID] as string; var group_id = dicData[tb_meb_member.CN_GROUP_ID] as string; // 更新最後傳遞訊息時間 tb_meb_member updateEntity = new tb_meb_member { last_call_message = DateTime.Now }; tb_meb_member updateEntityCond = new tb_meb_member { group_user_id = group_user_id, group_id = group_id }; return Command.SetupUpdateCmd(updateEntity, updateEntityCond); }); } private CResponseMessage UpdateCommand(CRequestMessage i_crmInput, Func, Command> func) { CResponseMessage crmRes = null; string sMsg = null; Dictionary dicData = (i_crmInput.param[BLWording.UPD_MASTER] as JObject).ToObject>(); try { do { Command cmd = func(dicData); var ai = ArsenalDBMgr.GetInst(cmd, GetDefaultSystemColumnInfo()); ai.RunEditSingleCmd(cmd); sMsg = GetLastErrorCode(cmd); } while (false); } catch (Exception ex) { LogHelper.DBLog(Util.GetLastExceptionMsg(ex)); sMsg = $"{nameof(UpdateCommand)} unknwon exception. Call from)."; #if DEBUG System.Diagnostics.Debug.WriteLine(sMsg); #endif } if (sMsg != null) { crmRes = new CErrorResponseMessage(sMsg); Logger.Error(JsonConvert.SerializeObject(i_crmInput)); Logger.Error(JsonConvert.SerializeObject(crmRes)); } else { crmRes = new CSuccessResponseMessage(null, i_crmInput); //Logger.Info(JsonConvert.SerializeObject(i_crmInput)); //Logger.Info(JsonConvert.SerializeObject(crmRes)); } return crmRes; } public CResponseMessage RefreshMemberInfo(CRequestMessage i_crmInput) { string sMsg = null; CResponseMessage crmRes = null; try { do { sMsg = getCommonParameter(i_crmInput, BLWording.ADD_MASTER, out JArray jaDataArray, out tb_sys_session sUserSession); if (sMsg != null) { break; } if (jaDataArray.Count != 1 || jaDataArray[0] == null) { sMsg = MessageWording.PARAM_NOT_EXPECTED; break; } JObject joData = jaDataArray[0] as JObject; Dictionary dicData = new Dictionary(); if (joData != null) { dicData = joData.ToObject>(); } string sPSID = null; string fbGroupId = null; if (dicData.ContainsKey(tb_meb_member.CN_GROUP_ID)) { fbGroupId = dicData[tb_meb_member.CN_GROUP_ID].ToString(); } var groupData = GetGroupSettings(fbGroupId); var result = GetAppToken(groupData.app_id, groupData.client_secret, out FbToken resData); if (result) { GetFBPagesID(dicData[BLWording.ASID].ToString(), groupData.page_id, resData.access_token, out sPSID); } // 更新會員資料 List lCmdUpdate = new List(); // 先查詢資料是否存在 tb_meb_member cMember = new tb_meb_member(); cMember.SetFullDirty(); tb_meb_member cMemberCon = new tb_meb_member() { group_user_id = dicData[BLWording.ASID].ToString(), group_id = fbGroupId }; Command cMemberSelect = Command.SetupSelectCmd(cMember, cMemberCon); ArsenalInterface ai = ArsenalDBMgr.GetInst(cMemberSelect); tb_meb_member qdsMember = ai.RunQuerySingleORM(cMemberSelect); string asid = dicData[BLWording.ASID].ToString(); var group_id = fbGroupId; // 更新 dicData.Remove(tb_grp_article.CN_GROUP_UID); tb_meb_member mUpd = new tb_meb_member(); mUpd.message_user_id = sPSID; mUpd.fb_pic = dicData[tb_meb_member.CN_FB_PIC].ToString(); List lswnMain = new List(); lswnMain.Add(new WhereNode(tb_meb_member.CN_GROUP_USER_ID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_meb_member), asid)); lswnMain.Add(new WhereNode(tb_meb_member.CN_GROUP_ID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_meb_member), group_id)); lCmdUpdate.Add(Command.SetupUpdateCmd(mUpd, new WhereNode(WhereNode.ENodeOperation.ENO_AND, lswnMain.ToArray()))); ai = ArsenalDBMgr.GetInst(lCmdUpdate[0], GetDefaultSystemColumnInfo()); ai.RunEditCmds(lCmdUpdate); sMsg = GetLastErrorCode(lCmdUpdate); if (sMsg != null) { break; } crmRes = new CSuccessResponseMessage(null, i_crmInput); crmRes.param.Add("psid", sPSID); } while (false); } catch (Exception ex) { sMsg = $"{nameof(RefreshMemberInfo)} unknwon exception. i_crmInput={JsonConvert.SerializeObject(i_crmInput)}. ex={ex.Message}"; #if DEBUG System.Diagnostics.Debug.WriteLine(sMsg); #endif } if (string.IsNullOrEmpty(sMsg)) { //Logger.Info(JsonConvert.SerializeObject(i_crmInput)); //Logger.Info(JsonConvert.SerializeObject(crmRes)); } else { crmRes = new CErrorResponseMessage(sMsg, i_crmInput); Logger.Error(JsonConvert.SerializeObject(i_crmInput)); Logger.Error(JsonConvert.SerializeObject(crmRes)); } return crmRes; } public CResponseMessage GetAllMembers(CRequestMessage i_crmInput) { string sMsg; Command cRes = null; CResponseMessage crmRes = null; try { do { Dictionary dicObjCondition = GetQueryMasterFirstWhereData(i_crmInput); List lsMainColumns = EntityBase.GetAllColumnName(typeof(tb_meb_member)); // 取得所有欄位名稱 var lsBranch = ProjectHelper.GetUserGroup(i_crmInput); // 取得可讀取社團資料的社團uid清單 var lsMember = new List(); if (dicObjCondition.ContainsKey(tb_meb_member.CN_UID)) { var aMember = dicObjCondition[tb_meb_member.CN_UID] as JArray; foreach (var member in aMember) { lsMember.Add(member.ToString()); } dicObjCondition.Remove(tb_meb_member.CN_UID); } Dictionary dicCondition = new Dictionary(); foreach (var condition in dicObjCondition) { dicCondition.Add(condition.Key, condition.Value.ToString()); } QueryJsonElementCollection lBlocks = new QueryJsonElementCollection(); QueryJsonElement qjeMember = lBlocks.GetInst(); qjeMember.table = tb_meb_member.TABLENAME; qjeMember.displaycols = lsMainColumns; List lswnMain = new List(); if (lsMember.Any()) { qjeMember.wherecols = new WhereNode(tb_meb_member.CN_UID, WhereNode.EColumnOperation.EOT_IN, typeof(tb_meb_member), lsMember.ToArray()); } lBlocks.Add(qjeMember); QueryJsonElement qjeGroup = lBlocks.GetInst(); qjeGroup.table = tb_grp_group.TABLENAME; qjeGroup.jointable = qjeMember; qjeGroup.jointype = QueryJsonElement.LEFT_JOIN; qjeGroup.joincols = new Dictionary() { { tb_grp_group.CN_FB_GROUP_ID,tb_meb_member.CN_GROUP_ID }}; if (dicObjCondition.ContainsKey(tb_meb_member.CN_GROUP_ID)) { qjeGroup.wherecols = new WhereNode(tb_grp_group.CN_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_grp_group), dicObjCondition[tb_meb_member.CN_GROUP_ID].ToString()); } else { qjeGroup.wherecols = new WhereNode(tb_grp_group.CN_UID, WhereNode.EColumnOperation.EOT_IN, typeof(tb_grp_group), lsBranch.ToArray()); } lBlocks.Add(qjeGroup); sMsg = MakeSelectJoinByBlocks(lBlocks, out cRes); ArsenalInterface ai = ArsenalDBMgr.GetInst(cRes, GetDefaultSystemColumnInfo()); List qds = ai.RunQueryList(cRes); sMsg = GetLastErrorCode(cRes); if (sMsg != null) { break; } crmRes = new CSuccessResponseMessage(null, i_crmInput); crmRes.param.Add("data", qds); } while (false); } catch (Exception ex) { sMsg = $"{nameof(GetAllMembers)} unknwon exception. i_crmInput={JsonConvert.SerializeObject(i_crmInput)}. ex={ex.Message}"; #if DEBUG System.Diagnostics.Debug.WriteLine(sMsg); #endif } return crmRes; } [Auth(false)] public CResponseMessage SetShoppingPoints(CRequestMessage i_crmInput) { CResponseMessage crmRes = null; string sMsg = null; Command cRes = null; try { do { sMsg = getCommonParameter(i_crmInput, BLWording.UPD_MASTER, out JArray jaDataArray, out tb_sys_session sUserSession); if (sMsg != null) { break; } if (jaDataArray.Count != 1 || jaDataArray[0] == null) { sMsg = MessageWording.PARAM_NOT_EXPECTED; break; } JObject joData = jaDataArray[0] as JObject; Dictionary dicData = joData[BLWording.WHEREDATA].ToObject>(); tb_meb_member cMember = new tb_meb_member(); cMember.SetDirty(tb_meb_member.CN_UID); tb_meb_member cCon = new tb_meb_member() { group_user_id = dicData[tb_meb_member.CN_GROUP_USER_ID].ToString(), group_id = dicData[tb_meb_member.CN_GROUP_ID].ToString() }; Command cSelect = Command.SetupSelectCmd(cMember, cCon); ArsenalInterface ai = ArsenalDBMgr.GetInst(cSelect); List qdsMember = ai.RunQueryList(cSelect); List lCmdUpdate = new List(); string sNewArticleUid = Guid.NewGuid().ToString(); tb_meb_shopping_points_record mNew = new tb_meb_shopping_points_record() { }; mNew.uid = sNewArticleUid; mNew.member_uid = qdsMember[0].uid; mNew.amount = 30; mNew.memo = "首登"; lCmdUpdate.Add(Command.SetupInsertCmd(mNew)); lCmdUpdate.Add(Command.SetupUpdateCmd(new tb_meb_member() { shopping_account = 30 } , new tb_meb_member() { uid = qdsMember[0].uid })); ai = ArsenalDBMgr.GetInst(lCmdUpdate[0], GetDefaultSystemColumnInfo()); ai.RunEditCmds(lCmdUpdate); sMsg = GetLastErrorCode(lCmdUpdate); if (sMsg != null) { break; } crmRes = new CSuccessResponseMessage(null, i_crmInput); } while (false); } catch (Exception ex) { LogHelper.DBLog(Util.GetLastExceptionMsg(ex)); sMsg = $"{nameof(SetShoppingPoints)} unknwon exception. Call from)."; #if DEBUG System.Diagnostics.Debug.WriteLine(sMsg); #endif } if (sMsg != null) { crmRes = new CErrorResponseMessage(sMsg); Logger.Error(JsonConvert.SerializeObject(i_crmInput)); Logger.Error(JsonConvert.SerializeObject(crmRes)); } else { //Logger.Info(JsonConvert.SerializeObject(i_crmInput)); //Logger.Info(JsonConvert.SerializeObject(crmRes)); } return crmRes; } class ShoppingPointsModel : tb_meb_shopping_points_record { public string name { get; set; } } [Auth(false)] public CResponseMessage GetShoppingPoints(CRequestMessage i_crmInput) { CResponseMessage crmRes = null; string sMsg = null; Command cRes = null; try { do { Dictionary dicObjCondition = GetQueryMasterFirstWhereData(i_crmInput); string[] aMember = null; string group_user_id = null; string group_id = null; if (dicObjCondition.ContainsKey(tb_meb_shopping_points_record.CN_MEMBER_UID)) { var jaMember = dicObjCondition[tb_meb_shopping_points_record.CN_MEMBER_UID] as JArray; aMember = jaMember.Select(x => x.ToString()).ToArray(); } else if (dicObjCondition.ContainsKey(tb_meb_member.CN_GROUP_USER_ID)) { group_user_id = dicObjCondition[tb_meb_member.CN_GROUP_USER_ID].ToString(); group_id = dicObjCondition[tb_meb_member.CN_GROUP_ID].ToString(); } else { sMsg = "參數錯誤"; break; } QueryJsonElementCollection lBlocks = new QueryJsonElementCollection(); QueryJsonElement qjeMember = lBlocks.GetInst(); qjeMember.table = tb_meb_member.TABLENAME; qjeMember.displaycols = new List() { tb_meb_member.CN_UID, tb_meb_member.CN_NAME, tb_meb_member.CN_SHOPPING_ACCOUNT, }; if (aMember != null) { qjeMember.wherecols = new WhereNode(tb_meb_member.CN_UID, WhereNode.EColumnOperation.EOT_IN, typeof(tb_meb_member), aMember); } else if (group_user_id != null && group_id != null) { List lswnMember = new List(); lswnMember.Add(new WhereNode(tb_meb_member.CN_GROUP_USER_ID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_meb_member), group_user_id)); lswnMember.Add(new WhereNode(tb_meb_member.CN_GROUP_ID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_meb_member), group_id)); qjeMember.wherecols = new WhereNode(WhereNode.ENodeOperation.ENO_AND, lswnMember.ToArray()); } lBlocks.Add(qjeMember); sMsg = MakeSelectJoinByBlocks(lBlocks, out cRes); ArsenalInterface ai = ArsenalDBMgr.GetInst(cRes, GetDefaultSystemColumnInfo()); List qds = ai.RunQueryList(cRes); sMsg = GetLastErrorCode(cRes); if (sMsg != null) { break; } crmRes = new CSuccessResponseMessage(null, i_crmInput); crmRes.param.Add("data", qds); } while (false); } catch (Exception ex) { LogHelper.DBLog(Util.GetLastExceptionMsg(ex)); sMsg = $"{nameof(GetShoppingPoints)} unknwon exception. Call from)."; #if DEBUG System.Diagnostics.Debug.WriteLine(sMsg); #endif } if (sMsg != null) { crmRes = new CErrorResponseMessage(sMsg); Logger.Error(JsonConvert.SerializeObject(i_crmInput)); Logger.Error(JsonConvert.SerializeObject(crmRes)); } else { //Logger.Info(JsonConvert.SerializeObject(i_crmInput)); //Logger.Info(JsonConvert.SerializeObject(crmRes)); } return crmRes; } public CResponseMessage UpdateShoppingPoints(CRequestMessage i_crmInput) { CResponseMessage crmRes = null; string sMsg = null; Command cRes = null; try { do { sMsg = getCommonParameter(i_crmInput, BLWording.UPD_MASTER, out JArray jaDataArray, out tb_sys_session sUserSession); if (sMsg != null) { break; } if (jaDataArray.Count != 1 || jaDataArray[0] == null) { sMsg = MessageWording.PARAM_NOT_EXPECTED; break; } JObject joData = jaDataArray[0] as JObject; Dictionary dicData = joData[BLWording.WHEREDATA].ToObject>(); string memberUid = dicData[tb_meb_member.CN_UID].ToString(); int type = Convert.ToInt32(dicData["type"]); int amount = type == 0 ? Convert.ToInt32(dicData[tb_meb_shopping_points_record.CN_AMOUNT]) : -Convert.ToInt32(dicData[tb_meb_shopping_points_record.CN_AMOUNT]); string memo = dicData[tb_meb_shopping_points_record.CN_MEMO].ToString(); tb_meb_member cMember = new tb_meb_member(); cMember.SetDirty(tb_meb_member.CN_SHOPPING_ACCOUNT); tb_meb_member cCon = new tb_meb_member() { uid = memberUid }; Command cSelect = Command.SetupSelectCmd(cMember, cCon); ArsenalInterface ai = ArsenalDBMgr.GetInst(cSelect); List qdsMember = ai.RunQueryList(cSelect); List lCmdUpdate = new List(); string sNewArticleUid = Guid.NewGuid().ToString(); tb_meb_shopping_points_record mNew = new tb_meb_shopping_points_record() { }; mNew.uid = sNewArticleUid; mNew.member_uid = memberUid; mNew.amount = amount; mNew.memo = string.IsNullOrEmpty(memo) ? null : memo; lCmdUpdate.Add(Command.SetupInsertCmd(mNew)); // 更新member shopping_account if (qdsMember[0].shopping_account + amount < 0) { sMsg = "購物金不得小於0"; break; } lCmdUpdate.Add(Command.SetupUpdateCmd(new tb_meb_member() { shopping_account = qdsMember[0].shopping_account + amount } , new tb_meb_member() { uid = memberUid })); ai = ArsenalDBMgr.GetInst(lCmdUpdate[0], GetDefaultSystemColumnInfo()); ai.RunEditCmds(lCmdUpdate); sMsg = GetLastErrorCode(lCmdUpdate); if (sMsg != null) { break; } crmRes = new CSuccessResponseMessage(null, i_crmInput); } while (false); } catch (Exception ex) { LogHelper.DBLog(Util.GetLastExceptionMsg(ex)); sMsg = $"{nameof(UpdateShoppingPoints)} unknwon exception. Call from)."; #if DEBUG System.Diagnostics.Debug.WriteLine(sMsg); #endif } if (sMsg != null) { crmRes = new CErrorResponseMessage(sMsg); Logger.Error(JsonConvert.SerializeObject(i_crmInput)); Logger.Error(JsonConvert.SerializeObject(crmRes)); } else { //Logger.Info(JsonConvert.SerializeObject(i_crmInput)); //Logger.Info(JsonConvert.SerializeObject(crmRes)); } return crmRes; } public CResponseMessage ResetReturnCount(CRequestMessage i_crmInput) { CResponseMessage crmRes = null; string sMsg = null; try { do { tb_meb_member dicData = new tb_meb_member(); if (i_crmInput != null && i_crmInput.param != null && i_crmInput.param.ContainsKey(BLWording.UPD_MASTER)) { JArray joData = i_crmInput.param[BLWording.UPD_MASTER] as JArray; if (joData.Any()) { dicData = joData[0][BLWording.WHEREDATA].ToObject(); } } Command cCmd = Command.SetupUpdateCmd(new tb_meb_member() { return_count = 0 } , new tb_meb_member() { uid = dicData.uid }); ArsenalInterface ai = ArsenalDBMgr.GetInst(cCmd, GetDefaultSystemColumnInfo()); ai.RunEditSingleCmd(cCmd); string sErrorCode = GetLastErrorCode(cCmd); if (sErrorCode != null) { sMsg = sErrorCode; } if (sMsg != null) { break; } crmRes = new CSuccessResponseMessage(null, i_crmInput); } while (false); } catch (Exception ex) { LogHelper.DBLog(Util.GetLastExceptionMsg(ex)); sMsg = $"{nameof(ResetReturnCount)} unknwon exception. Call from)."; #if DEBUG System.Diagnostics.Debug.WriteLine(sMsg); #endif } if (sMsg != null) { crmRes = new CErrorResponseMessage(sMsg); Logger.Error(JsonConvert.SerializeObject(i_crmInput)); Logger.Error(JsonConvert.SerializeObject(crmRes)); } else { //Logger.Info(JsonConvert.SerializeObject(i_crmInput)); //Logger.Info(JsonConvert.SerializeObject(crmRes)); } return crmRes; } [Auth(false)] public CResponseMessage VerifyFirebaseToken(CRequestMessage i_crmInput) { string sMsg = null; CResponseMessage crmRes = null; try { do { sMsg = getCommonParameter(i_crmInput, BLWording.QRY_MASTER, out JArray jaDataArray, out tb_sys_session sUserSession); if (sMsg != null) { break; } if (jaDataArray.Count != 1 || jaDataArray[0] == null) { sMsg = MessageWording.PARAM_NOT_EXPECTED; break; } JObject joData = jaDataArray[0][BLWording.WHEREDATA] as JObject; Dictionary dicData = new Dictionary(); if (joData != null) { dicData = joData.ToObject>(); } string firebaseToken = dicData[tb_meb_member.CN_FIREBASE_TOKEN].ToString(); string group_id = dicData[tb_meb_member.CN_GROUP_ID].ToString(); string asid = dicData[tb_meb_member.CN_GROUP_USER_ID].ToString(); // 查詢Token tb_meb_member cMember = new tb_meb_member(); cMember.SetFullDirty(); tb_meb_member cMemberCon = new tb_meb_member() { group_user_id = asid, group_id = group_id }; Command cMemberSelect = Command.SetupSelectCmd(cMember, cMemberCon); ArsenalInterface ai = ArsenalDBMgr.GetInst(cMemberSelect); tb_meb_member qdsMember = ai.RunQuerySingleORM(cMemberSelect); // 更新會員資料 List lCmdUpdate = new List(); if (qdsMember.firebase_token == null || firebaseToken != qdsMember.firebase_token) { // 更新 tb_meb_member mUpd = new tb_meb_member(); mUpd.firebase_token = firebaseToken; List lswnMain = new List(); lswnMain.Add(new WhereNode(tb_meb_member.CN_GROUP_USER_ID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_meb_member), asid)); lswnMain.Add(new WhereNode(tb_meb_member.CN_GROUP_ID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_meb_member), group_id)); lCmdUpdate.Add(Command.SetupUpdateCmd(mUpd, new WhereNode(WhereNode.ENodeOperation.ENO_AND, lswnMain.ToArray()))); ai = ArsenalDBMgr.GetInst(lCmdUpdate[0], GetDefaultSystemColumnInfo()); ai.RunEditCmds(lCmdUpdate); string sErrorCode = GetLastErrorCode(lCmdUpdate); if (sErrorCode != null) { sMsg = sErrorCode; } if (sMsg != null) { sMsg = "已偵測裝置變更"; } } crmRes = new CSuccessResponseMessage(sMsg, i_crmInput); } while (false); } catch (Exception ex) { sMsg = $"{nameof(VerifyFirebaseToken)} unknwon exception. i_crmInput={JsonConvert.SerializeObject(i_crmInput)}. ex={ex.Message}"; #if DEBUG System.Diagnostics.Debug.WriteLine(sMsg); #endif } if (string.IsNullOrEmpty(sMsg)) { //Logger.Info(JsonConvert.SerializeObject(i_crmInput)); //Logger.Info(JsonConvert.SerializeObject(crmRes)); } else { crmRes = new CErrorResponseMessage(sMsg, i_crmInput); Logger.Error(JsonConvert.SerializeObject(i_crmInput)); Logger.Error(JsonConvert.SerializeObject(crmRes)); } return crmRes; } protected class tokenModel { public string group_id { get; set; } public string code { get; set; } public string redirect_uri { get; set; } public string access_token { get; set; } } [Auth(false)] public CResponseMessage GetAccessToken(CRequestMessage i_crmInput) { CResponseMessage crmRes = null; string sMsg = null; try { do { tokenModel dicData = new tokenModel(); tokenModel rawResult = null; if (i_crmInput != null && i_crmInput.param != null && i_crmInput.param.ContainsKey(BLWording.UPD_MASTER)) { JArray joData = i_crmInput.param[BLWording.UPD_MASTER] as JArray; if (joData.Any()) { dicData = joData[0][BLWording.WHEREDATA].ToObject(); } } var groupData = GetGroupSettings(dicData.group_id); string uri = string.Format("https://graph.facebook.com/v3.2/oauth/access_token?client_id={0}&redirect_uri={1}&code={2}&client_secret={3}", groupData.app_id, dicData.redirect_uri, dicData.code, groupData.client_secret); APIHelper.BaseGet(uri, null, new Dictionary(), out HttpResponseMessage responseMessage); if (responseMessage.IsSuccessStatusCode) { rawResult = JsonConvert.DeserializeObject(responseMessage.Content.ReadAsStringAsync().Result); if (string.IsNullOrEmpty(rawResult.access_token)) { sMsg = "獲取token失敗"; } } if (sMsg != null) { break; } crmRes = new CSuccessResponseMessage(null, i_crmInput); crmRes.param.Add("access_token", rawResult.access_token); } while (false); } catch (Exception ex) { LogHelper.DBLog(Util.GetLastExceptionMsg(ex)); sMsg = $"{nameof(GetAccessToken)} unknwon exception. Call from)."; #if DEBUG System.Diagnostics.Debug.WriteLine(sMsg); #endif } if (sMsg != null) { crmRes = new CErrorResponseMessage(sMsg); Logger.Error(JsonConvert.SerializeObject(i_crmInput)); Logger.Error(JsonConvert.SerializeObject(crmRes)); } else { //Logger.Info(JsonConvert.SerializeObject(i_crmInput)); //Logger.Info(JsonConvert.SerializeObject(crmRes)); } return crmRes; } protected class checkedTokenModel { public Data data { get; set; } public class Data { public string user_id { get; set; } public string app_id { get; set; } public bool is_valid { get; set; } } } [Auth(false)] public CResponseMessage CheckAccessToken(CRequestMessage i_crmInput) { CResponseMessage crmRes = null; string sMsg = null; try { do { tokenModel dicData = new tokenModel(); checkedTokenModel rawResult = null; if (i_crmInput != null && i_crmInput.param != null && i_crmInput.param.ContainsKey(BLWording.UPD_MASTER)) { JArray joData = i_crmInput.param[BLWording.UPD_MASTER] as JArray; if (joData.Any()) { dicData = joData[0][BLWording.WHEREDATA].ToObject(); } } var groupData = GetGroupSettings(dicData.group_id); var result = GetAppToken(groupData.app_id, groupData.client_secret, out FbToken responseData); string uri = string.Format("https://graph.facebook.com/debug_token?input_token={0}&access_token={1}", dicData.access_token, responseData.access_token); APIHelper.BaseGet(uri, null, new Dictionary(), out HttpResponseMessage responseMessage); if (responseMessage.IsSuccessStatusCode) { rawResult = JsonConvert.DeserializeObject(responseMessage.Content.ReadAsStringAsync().Result); if (!rawResult.data.is_valid) { sMsg = "驗證token失敗"; break; } } else { sMsg = "驗證token失敗"; break; } if (sMsg != null) { break; } crmRes = new CSuccessResponseMessage(null, i_crmInput); } while (false); } catch (Exception ex) { LogHelper.DBLog(Util.GetLastExceptionMsg(ex)); sMsg = $"{nameof(GetAccessToken)} unknwon exception. Call from)."; #if DEBUG System.Diagnostics.Debug.WriteLine(sMsg); #endif } if (sMsg != null) { crmRes = new CErrorResponseMessage(sMsg); Logger.Error(JsonConvert.SerializeObject(i_crmInput)); Logger.Error(JsonConvert.SerializeObject(crmRes)); } else { //Logger.Info(JsonConvert.SerializeObject(i_crmInput)); //Logger.Info(JsonConvert.SerializeObject(crmRes)); } return crmRes; } public bool getPrivacy(string group_id,out string privacy) { var result = false; privacy = null; string sMsg = null; QueryJsonElementCollection lBlocks = new QueryJsonElementCollection(); QueryJsonElement qjeGroups = lBlocks.GetInst(); qjeGroups.table = tb_grp_group.TABLENAME; qjeGroups.wherecols = new WhereNode(tb_grp_group.CN_FB_GROUP_ID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_grp_group2user), group_id); lBlocks.Add(qjeGroups); QueryJsonElement qjeGroupUser = lBlocks.GetInst(); qjeGroupUser.table = tb_grp_group2user.TABLENAME; qjeGroupUser.jointable = qjeGroups; qjeGroupUser.displaycols = new List() { tb_grp_group2user.CN_USER_TOKEN }; qjeGroupUser.jointype = QueryJsonElement.LEFT_JOIN; qjeGroupUser.joincols = new Dictionary() { { tb_grp_group2user.CN_GROUP_UID,tb_grp_group.CN_UID }}; lBlocks.Add(qjeGroupUser); Command cRes = null; sMsg = MakeSelectJoinByBlocks(lBlocks, out cRes); ArsenalInterface ai = ArsenalDBMgr.GetInst(cRes); tb_grp_group2user qdsGroups = ai.RunQuerySingleORM(cRes); if (qdsGroups != null) { var groupsInfo = GetPrivacy(group_id, qdsGroups.user_token); privacy = groupsInfo.privacy; result = true; } return result; } public Groups GetPrivacy(string group_id, string access_token) { Groups GroupInfo = null; do { try { // 送出資料 string uri = $"https://graph.facebook.com/v8.0/{group_id}?"; var dicData = new Dictionary() { { "access_token",access_token}, { "fields","privacy"} }; APIHelper.BaseGet(uri, null, dicData, out HttpResponseMessage responseMessage); if (responseMessage.IsSuccessStatusCode) { var fb_error = GetFbApiError(responseMessage); if (!string.IsNullOrWhiteSpace(fb_error)) { Logger.Error($"{nameof(GetPrivacy)} FB API response error message: {fb_error} "); break; } GroupInfo = JsonConvert.DeserializeObject(responseMessage.Content.ReadAsStringAsync().Result); } } catch (Exception ex) { throw ex; } } while (false); return GroupInfo; } private tb_grp_group GetGroupSettings(string group_id) { // 獲得該社團的token, app id, client secret tb_grp_group cGroup = new tb_grp_group(); cGroup.SetDirty(tb_grp_group.CN_APP_ID, tb_grp_group.CN_PAGE_ID, tb_grp_group.CN_CLIENT_SECRET); tb_grp_group cCon = new tb_grp_group() { fb_group_id = group_id }; Command cSelect = Command.SetupSelectCmd(cGroup, cCon); ArsenalInterface ai2 = ArsenalDBMgr.GetInst(cSelect); tb_grp_group qds2 = ai2.RunQuerySingleORM(cSelect); return qds2; } } }