|
|
namespace CounsellorBL.GROUP { using CounsellorBL.BLStructure; using CounsellorBL.Common; using CounsellorBL.GROUP.ConstDefinition; using CounsellorBL.GROUP.Helper; using CounsellorBL.Helper; using ICSharpCode.SharpZipLib.Zip; using MonumentDefine; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using NPOI.SS.Formula.Functions; using OT.COM.ArsenalDB; using OT.COM.ArsenalDB.SQL; using OT.COM.LogisticsUtil; using OT.COM.SignalerMessage; using SoldierData.EnterprizeV4; using System; using System.Collections.Generic; using System.Data; using System.Globalization; using System.IO; using System.Linq; using System.Net; using static CounsellorBL.GROUP.ConstDefinition.GrpBLWording; using static CounsellorBL.GROUP.Helper.FbHelper; using static MonumentDefine.Enums;
class ArticleManage2Service : SingleDataTableTemplate<tb_grp_article> { private class GroupViewModel { public string message { get; set; } public string fb_group_id { get; set; } public string user_token { get; set; } public string announcement { get; set; } public string group_user_uid { get; set; } public int status_flag { get; set; } }
private class GroupArticleModel : GroupViewModel { public string uid { get; set; } public string group_uid { get; set; } public DateTime release_date { get; set; } public string name { get; set; } public string user_tokne { get; set; } }
class MediaInfo { public string uid { get; set; } public string display { get; set; } public string mediatype { get; set; } } class ArticleMediaInfo : tb_grp_article { public string media_type { get; set; } public string media_id { get; set; } public string media_uid { get; set; } public int seq { get; set; } public int cost_price { get; set; } }
public ArticleManage2Service() { dgReadCommandGenerator = readCommandGenerator; dgCreateCommandGenerator = createCommandGenerator;
dgUpdateCommandGenerator = updateCommandGenerator;
dgDeleteCommandGenerator = deleteCommandGenerator; }
[Auth(false)]
public CResponseMessage UpdateStatus(CRequestMessage i_crmInput) { return commonEditor(i_crmInput, BLWording.UPD_MASTER, updateSingleCommandGeneratorDefault); }
[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 { List<string> lsEmpColumns = EntityBase.GetAllColumnName(typeof(tb_grp_article));
// 取得condition
Dictionary<string, string> dicCondition = GetQueryMasterFirstQJEDicwherecols(i_crmInput); var lsBranch = ProjectHelper.GetUserGroup(i_crmInput);
QueryJsonElementCollection lBlocks = new QueryJsonElementCollection();
QueryJsonElement qjeArticle = lBlocks.GetInst(); qjeArticle.table = tb_grp_article.TABLENAME; qjeArticle.displaycols = lsEmpColumns; qjeArticle.wherecols = new WhereNode(tb_grp_article.CN_GROUP_UID, WhereNode.EColumnOperation.EOT_IN, typeof(tb_grp_article), lsBranch.ToArray()); if (dicCondition.Any()) { qjeArticle.dicwherecols = dicCondition; } qjeArticle.ordercols = new List<Tuple<QueryJsonElement, string, string>>() { new Tuple<QueryJsonElement, string, string>(qjeArticle, tb_grp_article.CN_CREATE_DATE, BLWording.ORDER_DESC) };
QueryJsonElement qjeMain = lBlocks.GetInst(); qjeMain.table = tb_ord_order_master.TABLENAME; qjeMain.jointype = QueryJsonElement.LEFT_JOIN; qjeMain.jointable = qjeArticle; qjeMain.joincols = new Dictionary<string, string>() { { tb_ord_order_master.CN_ARTICLE_UID,tb_grp_article.CN_UID }}; qjeMain.displaycols = new List<string>() { tb_ord_order_master.CN_ORDER_CODE }; lBlocks.Add(qjeArticle); lBlocks.Add(qjeMain); sMsg = MakeSelectJoinByBlocks(lBlocks, out Command cRead);
if (sMsg != null) { break; } cRes = cRead; } 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; } [Auth(false)] public new CResponseMessage Update(CRequestMessage i_crmInput) => base.Update(i_crmInput);
[Auth(false)]
public CResponseMessage GetArticleInRange(CRequestMessage i_crmInput) { return simpleRead(i_crmInput, new SQLLib(new MSSQLDirectSQLHelper()).GetArticleInRange(out Command cRes), cRes);
}
[Auth(false)]
public CResponseMessage GetScheduleWaitingArticleInRange(CRequestMessage i_crmInput) { return simpleRead(i_crmInput, new SQLLib(new MSSQLDirectSQLHelper()).GetScheduleWaitingArticleInRange(out Command cRes), cRes);
}
[Auth(false)]
public CResponseMessage GetMediadWaitingArticleInRange(CRequestMessage i_crmInput) { return simpleRead(i_crmInput, new SQLLib(new MSSQLDirectSQLHelper()).GetMediadWaitingArticleInRange(out Command cRes), cRes);
}
[Auth(false)]
public CResponseMessage GetFailWaitingArticleInRange(CRequestMessage i_crmInput) { return simpleRead(i_crmInput, new SQLLib(new MSSQLDirectSQLHelper()).GetFailWaitingArticleInRange(out Command cRes), cRes);
}
[Auth(false)]
public CResponseMessage GetArticleInRangeTest(CRequestMessage i_crmInput) { return simpleRead(i_crmInput, new SQLLib(new MSSQLDirectSQLHelper()).GetArticleInRangeTest(out Command cRes), cRes); }
protected string deleteCommandGenerator(CRequestMessage i_crmInput, JArray i_jaItems, tb_sys_session i_sSessionUser, out List<Command> o_lcResult, List<string> i_saQryContainKeys, [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; Command cRes = null; List<Command> lcCmds = new List<Command>();
try { do { foreach (JToken jtkItem in i_jaItems) { Dictionary<string, object> dicItem = jtkItem.ToObject<Dictionary<string, object>>();
sMsg = getManualLog(i_crmInput, dicItem, BLWording.LOG_ACTION_NAME_DELETESQL, out Command cLog);
if (sMsg != null) { break; }
if (cLog != null) { lcCmds.Add(cLog); }
string sMstUID = null; if (dicItem.ContainsKey(BLWording.WHEREDATA) && dicItem[BLWording.WHEREDATA] is JObject wheredata) { Dictionary<string, object> wheredataDic = wheredata.ToObject<Dictionary<string, object>>(); // Get all MsterID
if (wheredataDic.ContainsKey("action") && wheredataDic.ContainsKey(BLWording.UID)) // For article-scheduler 因為此段刪除須要將文章轉草稿
{ if (wheredataDic["action"].ToString() == "update") { sMstUID = wheredataDic[BLWording.UID].ToString(); var oData = new tb_grp_article(); oData.post_status = 0; oData.release_date = null; Command c = Command.SetupUpdateCmd(oData, new WhereNode(tb_grp_article.CN_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_grp_article), sMstUID)); lcCmds.Add(c); } } else if (wheredataDic.ContainsKey(BLWording.UID)) { sMstUID = wheredataDic[BLWording.UID].ToString();
QueryJsonElementCollection lBlocks = new QueryJsonElementCollection(); QueryJsonElement qjeA = lBlocks.GetInst(); qjeA.table = tb_grp_article.TABLENAME; qjeA.displaycols = new List<string>() { tb_grp_article.CN_DRAFT_UID }; qjeA.wherecols = new WhereNode(tb_grp_article.CN_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_grp_article), sMstUID); lBlocks.Add(qjeA);
sMsg = MakeSelectJoinByBlocks(lBlocks, out cRes); if (sMsg != null) { break; } ArsenalInterface ai = ArsenalDBMgr.GetInst(cRes); var qds = ai.RunQueryList<tb_grp_article>(cRes);
var draft_uid = qds[0].draft_uid;
lBlocks = new QueryJsonElementCollection(); QueryJsonElement qjeAll = lBlocks.GetInst(); qjeAll.table = tb_grp_article.TABLENAME; qjeAll.displaycols = new List<string>() { tb_grp_article.CN_UID }; qjeAll.wherecols = new WhereNode(tb_grp_article.CN_DRAFT_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_grp_article), draft_uid);
lBlocks.Add(qjeAll);
sMsg = MakeSelectJoinByBlocks(lBlocks, out cRes); if (sMsg != null) { break; } ArsenalInterface aiAll = ArsenalDBMgr.GetInst(cRes); var qdsAll = aiAll.RunQueryList<tb_grp_article>(cRes); List<string> detailColumnUID = new List<string>(); foreach (var data in qdsAll) { detailColumnUID.Add(data.uid.ToString()); }
tb_grp_article u = new tb_grp_article() { status_flag = BLWording.STATUS_FLAG_OFF }; tb_grp_article_media m = new tb_grp_article_media() { status_flag = BLWording.STATUS_FLAG_OFF };
tb_prd_article2product p = new tb_prd_article2product() { status_flag = BLWording.STATUS_FLAG_OFF };
Command c = Command.SetupUpdateCmd(u, new WhereNode(tb_grp_article.CN_UID, WhereNode.EColumnOperation.EOT_IN, typeof(tb_grp_article), detailColumnUID.ToArray())); Command c1 = Command.SetupUpdateCmd(m, new WhereNode(tb_grp_article_media.CN_ARTICLE_UID, WhereNode.EColumnOperation.EOT_IN, typeof(tb_grp_article_media), detailColumnUID.ToArray())); Command c2 = Command.SetupUpdateCmd(p, new WhereNode(tb_prd_article2product.CN_ARTICLE_UID, WhereNode.EColumnOperation.EOT_IN, typeof(tb_prd_article2product), detailColumnUID.ToArray())); lcCmds.Add(c); lcCmds.Add(c1); lcCmds.Add(c2); // Get all action in this program
//lcCmds.Add(Command.SetupDeleteCmd(new tb_prd_article2product() { article_uid = sMstUID }));
//lcCmds.Add(Command.SetupDeleteCmd(new tb_grp_article_media() { article_uid = sMstUID }));
//lcCmds.Add(Command.SetupDeleteCmd(new tb_grp_article() { uid = sMstUID }));
} } } } while (false); } catch (Exception ex) { LogHelper.DBLog(Util.GetLastExceptionMsg(ex), i_crmInput); sMsg = $"{nameof(deleteCommandGenerator)} 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_lcResult = lcCmds; return sMsg; } private string updateCommandGenerator(CRequestMessage i_crmInput, JArray i_jaData, tb_sys_session i_sSessionUser, out List<Command> o_lcCmds, List<string> i_saQryContainKeys, [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<Command> lCmds = new List<Command>();
try { do { foreach (JToken joData in i_jaData) { Dictionary<string, object> dicData = joData.ToObject<Dictionary<string, object>>();
JObject jwheredata = dicData[BLWording.WHEREDATA] as JObject; JObject allData = dicData[BLWording.DATA] as JObject; string uid = jwheredata[tb_grp_article.CN_UID].ToString(); tb_grp_article upData = new tb_grp_article() { message = allData[tb_grp_article.CN_MESSAGE].ToString(), release_date = Convert.ToDateTime(allData[tb_grp_article.CN_POST_DATE].ToString()), name = allData[tb_grp_article.CN_NAME].ToString(), group_uid = allData[tb_grp_article.CN_GROUP_UID].ToString(), }; tb_grp_article upCon = new tb_grp_article() { uid = uid }; lCmds.Add(Command.SetupUpdateCmd(upData, upCon)); } } while (false); } catch (Exception ex) { LogHelper.DBLog(Util.GetLastExceptionMsg(ex), i_nCodeLine, i_sMemberName, i_sSourcePath); sMsg = $"{nameof(updateCommandGenerator)} 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_lcCmds = lCmds; return sMsg; }
protected string createCommandGenerator(CRequestMessage i_crmInput, JArray i_jaData, tb_sys_session i_sSessionUser, out List<Command> o_lResult, List<string> i_saQryContainKeys, [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<Command> lCmds = new List<Command>();
try { do { foreach (JToken joData in i_jaData) { Dictionary<string, object> dicData = joData.ToObject<Dictionary<string, object>>(); JObject jdata = dicData[BLWording.DATA] as JObject; Dictionary<string, object> dicInput = jdata.ToObject<Dictionary<string, object>>(); string sNewArticleUid = Guid.NewGuid().ToString();
if (dicInput.ContainsKey("isProductValid")) { if (Convert.ToBoolean(dicInput["isProductValid"]) == false) { sMsg = "商品價格錯誤"; break; } }
tb_grp_article cInsert = new tb_grp_article() { uid = sNewArticleUid, name = (dicInput[tb_grp_article.CN_NAME] ?? "").ToString(), group_uid = (dicInput[tb_grp_article.CN_GROUP_UID] ?? "").ToString(), // fb_article_id = (dicInput[tb_grp_article.CN_FB_ARTICLE_ID] ?? "").ToString(),
message = dicInput[tb_grp_article.CN_MESSAGE].ToString(), post_status = Convert.ToInt32(dicInput[tb_grp_article.CN_POST_STATUS]), draft = 1, draft_uid = sNewArticleUid, dutyfree = (dicInput[tb_grp_article.CN_DUTYFREE] ?? "").ToString().ToLower() == "true" ? "1" : "0" }; // 發布時間可能為空
if (dicInput.ContainsKey(tb_grp_article.CN_RELEASE_DATE) && dicInput[tb_grp_article.CN_RELEASE_DATE] != null) { cInsert.release_date = Convert.ToDateTime(dicInput[tb_grp_article.CN_RELEASE_DATE].ToString()); } // 截團時間可能為空
if (dicInput.ContainsKey(tb_grp_article.CN_CLOSE_DATE) && dicInput[tb_grp_article.CN_CLOSE_DATE] != null) { cInsert.close_date = Convert.ToDateTime(dicInput[tb_grp_article.CN_CLOSE_DATE].ToString()); } Command c = Command.SetupInsertCmd(cInsert); lCmds.Add(c);
// Log
sMsg = getManualLog(i_crmInput, dicData, BLWording.LOG_ACTION_NAME_INSERTSQL, out Command cLog);
if (sMsg != null) { break; }
if (cLog != null) { lCmds.Add(cLog); }
string sMediaKey = nameof(tb_grp_article_media); if (!jdata.ContainsKey(sMediaKey)) { sMsg = "common.no_media_fle"; break; }
List<MediaInfo> lmi = jdata[sMediaKey].ToObject<List<MediaInfo>>(); var seq = 1; lmi.ForEach(f => { lCmds.Add(Command.SetupInsertCmd(new tb_grp_article_media() { article_uid = sNewArticleUid, media_id = f.uid, type = f.mediatype, seq = seq++ })); });
string sProductKey = nameof(tb_prd_article2product); if (!jdata.ContainsKey(sProductKey)) { sMsg = "grp.no_product"; break; }
List<tb_prd_article2product> la2pProducts = jdata[sProductKey].ToObject<List<tb_prd_article2product>>(); if (!la2pProducts.Any()) { sMsg = "grp.no_product"; break; } new Article2ProductService().CreateProduct(sNewArticleUid, la2pProducts, cInsert.group_uid, ref lCmds); } } while (false); } catch (Exception ex) { LogHelper.DBLog(Util.GetLastExceptionMsg(ex), i_nCodeLine, i_sMemberName, i_sSourcePath); sMsg = $"{nameof(createCommandGenerator)} 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_lResult = lCmds; return sMsg; }
[Auth(false)] public CResponseMessage PushPost(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; } sMsg = _PushPostDetail(jaDataArray[0][BLWording.WHEREDATA][BLWording.UID].ToString(), jaDataArray[0][GrpBLWording.GRP_DOWNLOADURL].ToString(), true, out _); if (sMsg != null) { break; } crmRes = new CSuccessResponseMessage(null, i_crmInput); // 填寫回傳
} while (false); } catch (Exception ex) { sMsg = $"{nameof(PushPost)} exception. i_crmInput={JsonConvert.SerializeObject(i_crmInput)}. ex={ex.Message}"; Logger.Error(sMsg); #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 string _PushPostDetail(string i_sUID, string i_sURL, bool i_bHandlePhoto, out string o_sResult) { string sMsg = null; string sResult = null; Logger.Info($"_PushPostDetail 處理 Uid:{i_sUID} i_sURL={i_sURL}"); try { do { /**開始組指令**/ QueryJsonElementCollection lBlocks = new QueryJsonElementCollection(); QueryJsonElement qjeArticle = lBlocks.GetInst(); qjeArticle.table = tb_grp_article.TABLENAME; qjeArticle.displaycols = new List<string>() { tb_grp_article.CN_MESSAGE }; qjeArticle.wherecols = new WhereNode(tb_grp_article.CN_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_grp_article), i_sUID); lBlocks.Add(qjeArticle);
QueryJsonElement qjeGroup = lBlocks.GetInst(); qjeGroup.table = tb_grp_group.TABLENAME; qjeGroup.jointable = qjeArticle; qjeGroup.jointype = QueryJsonElement.LEFT_JOIN; qjeGroup.joincols = new Dictionary<string, string> { { tb_grp_group.CN_UID, tb_grp_article.CN_GROUP_UID } }; qjeGroup.displaycols = new List<string>() { tb_grp_group.CN_FB_GROUP_ID,tb_grp_group.CN_ANNOUNCEMENT }; 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<string, string> { { tb_grp_group2user.CN_UID, tb_grp_group.CN_POST_USER_UID } }; qjeGroupUser.displaycols = new List<string>() { tb_grp_group2user.CN_USER_TOKEN }; qjeGroupUser.aliascols = new Dictionary<string, List<string>>() { { tb_grp_group2user.CN_UID, new List<string>() { "group_user_uid" } }, }; lBlocks.Add(qjeGroupUser);
sMsg = MakeSelectJoinByBlocks(lBlocks, out Command cRes);
if (sMsg != null) { break; } ArsenalInterface ai = ArsenalDBMgr.GetInst(cRes); List<GroupViewModel> qdArticle = ai.RunQueryList<GroupViewModel>(cRes); GroupViewModel data = qdArticle.FirstOrDefault();
var mailHelper = new MailHelper(); // 取得當發文錯誤要發送的名單
string sMsgMailList = SystemSettingHelper.GetSetting(BLWording.ERROR_MAILLIST, out var mailList); if (sMsg != null) { Logger.Error(sMsgMailList); } List<MailAccountInfo> lsMailList = new List<MailAccountInfo>(); if (mailList != null && !string.IsNullOrEmpty(mailList.key_value)) { var lsMail = mailList.key_value.Split(new String[] { ",", ";" }, StringSplitOptions.RemoveEmptyEntries).ToList(); foreach (var mail in lsMail) { lsMailList.Add(new MailAccountInfo() { EMail = mail }); } }
lBlocks.Clear(); List<string> lsPhotoId = new List<string>(); bool bNeedRPA = false; bool bHasPicError = false; int nPhotoCountOrigin = 0; if (i_bHandlePhoto) { List<string> lsFailURIs = new List<string>(); Logger.Info($"_PushPostDetail HandlePhoto Start Uid:{i_sUID}"); QueryJsonElement qjeMedia = lBlocks.GetInst(); qjeMedia.table = tb_grp_article_media.TABLENAME; qjeMedia.displaycols = new List<string>() { tb_grp_article_media.CN_MEDIA_ID, tb_grp_article_media.CN_URI, tb_grp_article_media.CN_TYPE };
qjeMedia.wherecols = WhereNode.GenNode<tb_grp_article_media>(f => f.article_uid == i_sUID); lBlocks.Add(qjeMedia); sMsg = MakeSelectJoinByBlocks(lBlocks, out Command cResom); if (sMsg != null) { break; }
ai = ArsenalDBMgr.GetInst(cResom); List<tb_grp_article_media> qdMedia = ai.RunQueryList<tb_grp_article_media>(cResom); nPhotoCountOrigin = qdMedia.Count; Logger.Info($"_PushPostDetail CallFbPostPushAPI nPhotoCountOrigin = {nPhotoCountOrigin}"); // 如果是上傳的圖片則組uri(圖片需要分次上傳)
foreach (tb_grp_article_media x in qdMedia.Where(x => x.type == BLWording.MediaType.Photo)) { string uri = string.Format("{0}{1}", i_sURL, x.media_id); Logger.Info($"_PushPostDetail CallFbPicturePushAPI uri = {uri}"); // TODO: 可以考慮Retry
string sMsgPic = new FbHelper().CallFbPicturePushAPI(data.user_token, data.fb_group_id, uri, out string sID); if (sMsgPic != null) { bHasPicError = true; lsFailURIs.Add(uri); Logger.Error($"_PushPostDetail 發文錯誤:{sMsgPic}, GroupViewModel:{JsonConvert.SerializeObject(data)}"); var mailMsg = mailHelper.Send("發文錯誤", string.Format("圖片上傳錯誤:{0}", sMsg), lsMailList); if (string.IsNullOrEmpty(mailMsg)) { Logger.Info(string.Format("信件發送成功:{0} => {1}", sMsg, lsMailList)); } else { Logger.Error(string.Format("信件發送失敗:{0} => {1}", mailMsg, lsMailList)); } continue; } else { lsPhotoId.Add(sID); } Logger.Info($"_PushPostDetail CallFbPicturePushAPI end uri = {uri} "); }
Logger.Info($"_PushPostDetail HandlePhoto:F1 bHasPicError={bHasPicError} ({lsFailURIs.Count}/{nPhotoCountOrigin})"); // 判斷是否有影片決定更新RPA狀況
bNeedRPA = bHasPicError || (qdMedia != null && qdMedia.Any(x => x.type == BLWording.MediaType.Video)); Logger.Info($"_PushPostDetail HandlePhoto End Uid:{i_sUID} bHasPicError={bHasPicError} bNeedRPA={bNeedRPA}"); }
if (bHasPicError) { // 只要有圖錯就不要發文
sMsg = "有一張以上圖失敗就放棄上傳"; Logger.Error($"_PushPostDetail {sMsg}"); break; }
Logger.Info($"_PushPostDetail CallFbPostPushAPI before lsPhotoId.Count= {nPhotoCountOrigin}"); sMsg = new FbHelper().CallFbPostPushAPI(data.user_token, data.message + "\n" + data.announcement, data.fb_group_id, lsPhotoId, out string sPostID); Logger.Info($"_PushPostDetail CallFbPostPushAPI after sMsg={sMsg}"); if (sMsg != null) { Logger.Error($"F5 _PushPostDetail {sMsg}"); mailHelper.Send("發文錯誤", string.Format("貼文上傳錯誤:{0}", sMsg), lsMailList); // break; <= 2021/06/17 CallFbPostPushAPI 理論上網路正常的狀況FB已經上了
break; }
Logger.Info($"_PushPostDetail before Update"); tb_grp_article u = new tb_grp_article() { post_status = (int)EPostStatus.EPS_COMPLETE, fb_article_id = sPostID, group_user_uid = data.group_user_uid, post_date = DateTime.Now };
if (!bNeedRPA) { u.rpa_status = (int)Enums.Flag.Enable; }
Command c = Command.SetupUpdateCmd(u, new WhereNode(tb_grp_article.CN_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_grp_article), i_sUID)); ai = ArsenalDBMgr.GetInst(c, GetDefaultSystemColumnInfo()); ai.RunEditSingleCmd(c);
Logger.Info($"_PushPostDetail after Update"); if (!c.IsSuccess) { sMsg = c.LastErrorCode; Logger.Error($"_PushPostDetail c.LastErrorCode={c.LastErrorCode}"); break; }
sResult = sPostID; } while (false); } catch (Exception ex) { sMsg = ex.Message; Logger.Error($"Exception:{sMsg}"); #if DEBUG
System.Diagnostics.Debug.WriteLine(sMsg); #endif
}
o_sResult = sResult;
Logger.Info($"_PushPostDetail 處理 Uid :{i_sUID} i_sURL={i_sURL} 結束 sMsg={sMsg} o_sResult = {o_sResult} "); return sMsg; }
public CResponseMessage TransferOrder(CRequestMessage i_crmInput) { string sMsg = null; CResponseMessage crmRes = 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; }
var article_uid = jaDataArray[0][BLWording.WHEREDATA][BLWording.UID].ToString(); var data = jaDataArray[0][BLWording.WHEREDATA][BLWording.DATA] as JArray;
sMsg = new FbHelper().CheckOrder(article_uid, data); if (sMsg != null) { break; } } while (false); } catch (Exception ex) { LogHelper.DBLog(Util.GetLastExceptionMsg(ex)); Logger.Error(ex); sMsg = $"{nameof(TransferOrder)} unknwon exception.)."; #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; }
private string GetMemberPSID(string i_sArticleUID, out List<string> lsPSID) { string sMsg = null; lsPSID = null; try { do { QueryJsonElementCollection lBlocks = new QueryJsonElementCollection(); QueryJsonElement qjeOrder = lBlocks.GetInst(); qjeOrder.table = tb_ord_order_detail.TABLENAME; lBlocks.Add(qjeOrder);
QueryJsonElement qjeMain = lBlocks.GetInst(); qjeMain.table = tb_ord_order_master.TABLENAME; qjeMain.jointable = qjeOrder; qjeMain.jointype = QueryJsonElement.LEFT_JOIN; qjeMain.joincols = new Dictionary<string, string> { { tb_ord_order_master.CN_UID, tb_ord_order_detail.CN_ORDER_UID } }; qjeMain.wherecols = new WhereNode(tb_ord_order_master.CN_ARTICLE_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_master), i_sArticleUID); lBlocks.Add(qjeMain);
QueryJsonElement qjeMember = lBlocks.GetInst(); qjeMember.table = tb_meb_member.TABLENAME; qjeMember.jointable = qjeOrder; qjeMember.jointype = QueryJsonElement.LEFT_JOIN; qjeMember.joincols = new Dictionary<string, string> { { tb_meb_member.CN_UID, tb_ord_order_detail.CN_MEMBER_UID } }; qjeMember.displaycols = new List<string>() { tb_meb_member.CN_MESSAGE_USER_ID }; lBlocks.Add(qjeMember);
sMsg = MakeSelectJoinByBlocks(lBlocks, out Command cRes);
if (sMsg != null) { break; } ArsenalInterface ai = ArsenalDBMgr.GetInst(cRes); List<tb_meb_member> qds = ai.RunQueryList<tb_meb_member>(cRes); lsPSID = qds.Select(x => x.message_user_id).ToList(); } while (false); } catch (Exception ex) { LogHelper.DBLog(Util.GetLastExceptionMsg(ex)); sMsg = $"{nameof(TransferOrder)} unknwon exception.)."; #if DEBUG
System.Diagnostics.Debug.WriteLine(sMsg); #endif
} return sMsg; } public CResponseMessage GetArticleMedia(CRequestMessage i_crmInput) { string sMsg; Command cRes = null; CResponseMessage crmRes = null;
try { do { // 分頁
int nPageIdx = -1; int nPageNum = -1;
if (i_crmInput != null) { if (i_crmInput.param.ContainsKey(BLWording.QRY_PAGE_IDX) && Int32.TryParse(i_crmInput.param[BLWording.QRY_PAGE_IDX].ToString(), out int nPageIdxFromUI) && nPageIdxFromUI >= 0) { nPageIdx = nPageIdxFromUI; }
if (i_crmInput.param.ContainsKey(BLWording.QRY_PAGE_NUM) && Int32.TryParse(i_crmInput.param[BLWording.QRY_PAGE_NUM].ToString(), out int nPageNumFromUI) && nPageNumFromUI >= 0) { nPageNum = nPageNumFromUI; } }
List<string> lsEmpColumns = EntityBase.GetAllColumnName(typeof(tb_grp_article));
// 取得condition
Dictionary<string, string> dicCondition = GetQueryMasterFirstQJEDicwherecols(i_crmInput); var lsBranch = ProjectHelper.GetUserGroup(i_crmInput);
// Filter& Sort
Dictionary<string, string> mainOrderData = null; string mainFullTextPattern = null; if (i_crmInput != null && i_crmInput.param != null && i_crmInput.param.ContainsKey(BLWording.QRY_MASTER)) { JArray joData = i_crmInput.param[BLWording.QRY_MASTER] as JArray;
if (joData.Any() && joData[0][BLWording.ORDERDATA] != null) { JArray jaData = joData[0][BLWording.ORDERDATA] as JArray; mainOrderData = jaData[0].ToObject<Dictionary<string, string>>(); } if (joData.Any() && joData[0][BLWording.FULLTEXT_PATTERN] != null) { mainFullTextPattern = joData[0][BLWording.FULLTEXT_PATTERN].ToString(); } }
QueryJsonElementCollection lBlocks = new QueryJsonElementCollection(); List<WhereNode> lswnArticle = new List<WhereNode>(); lswnArticle.Add(new WhereNode(tb_grp_article.CN_GROUP_UID, WhereNode.EColumnOperation.EOT_IN, typeof(tb_grp_article), lsBranch.ToArray())); QueryJsonElement qjeArticle = lBlocks.GetInst(); qjeArticle.table = tb_grp_article.TABLENAME; qjeArticle.displaycols = lsEmpColumns; if (dicCondition.Any()) { qjeArticle.dicwherecols = dicCondition; }
if (!string.IsNullOrEmpty(mainFullTextPattern)) { lswnArticle.Add(new WhereNode(tb_grp_article.CN_NAME, WhereNode.EColumnOperation.EOT_LIKE, typeof(tb_grp_article), mainFullTextPattern)); } qjeArticle.wherecols = new WhereNode(WhereNode.ENodeOperation.ENO_AND, lswnArticle.ToArray());
QueryJsonElement qjeGroup = lBlocks.GetInst(); qjeGroup.table = tb_grp_group.TABLENAME; qjeGroup.jointable = qjeArticle; qjeGroup.jointype = QueryJsonElement.LEFT_JOIN; qjeGroup.joincols = new Dictionary<string, string> { { tb_grp_group.CN_UID, tb_grp_article.CN_GROUP_UID } }; if (!string.IsNullOrEmpty(mainFullTextPattern)) { qjeGroup.wherecols = new WhereNode(tb_grp_group.CN_NAME, WhereNode.EColumnOperation.EOT_LIKE, typeof(tb_grp_group), mainFullTextPattern); }
// Sort
List<Tuple<QueryJsonElement, string, string>> mainOrder = new List<Tuple<QueryJsonElement, string, string>>(); if (mainOrderData != null) { mainOrder.Add(Tuple.Create(qjeArticle, mainOrderData.First().Key, mainOrderData.First().Value)); } else { mainOrder.Add(Tuple.Create(qjeArticle, tb_grp_article.CN_RELEASE_DATE, BLWording.ORDER_DESC)); } qjeArticle.ordercols = mainOrder;
// 先依照分頁條件查出資料
lBlocks.Add(qjeArticle); _ = MakeSelectJoinByBlocks(lBlocks, out Command cResOrderMst); cResOrderMst.NeedCount = true; ArsenalInterface ai = ArsenalDBMgr.GetInst(cResOrderMst); var qdsOrderMst = ai.RunQueryDataSet(cResOrderMst, i_nPageIdx: nPageIdx, i_nNumOfPage: nPageNum); List<string> orderMstArray = new List<string>(); foreach (DataRow data in qdsOrderMst.DATA.Tables[0].Rows) { orderMstArray.Add(data[tb_grp_article.CN_UID].ToString()); }
lBlocks = new QueryJsonElementCollection(); qjeArticle = lBlocks.GetInst(); qjeArticle.table = tb_grp_article.TABLENAME; qjeArticle.displaycols = lsEmpColumns; qjeArticle.wherecols = new WhereNode(tb_grp_article.CN_UID, WhereNode.EColumnOperation.EOT_IN, typeof(tb_grp_article), orderMstArray.ToArray());
qjeGroup = lBlocks.GetInst(); qjeGroup.table = tb_grp_group.TABLENAME; qjeGroup.jointable = qjeArticle; qjeGroup.jointype = QueryJsonElement.LEFT_JOIN; qjeGroup.joincols = new Dictionary<string, string> { { tb_grp_group.CN_UID, tb_grp_article.CN_GROUP_UID } };
QueryJsonElement qjeMedia = lBlocks.GetInst(); qjeMedia.table = tb_grp_article_media.TABLENAME; qjeMedia.jointable = qjeArticle; qjeMedia.jointype = QueryJsonElement.LEFT_JOIN; qjeMedia.joincols = new Dictionary<string, string> { { tb_grp_article_media.CN_ARTICLE_UID, tb_grp_article.CN_UID } }; qjeMedia.aliascols = new Dictionary<string, List<string>> { { tb_grp_article_media.CN_TYPE, new List<string>() { "media_type" } }, { tb_grp_article_media.CN_UID, new List<string>() { "media_uid" } }, { tb_grp_article_media.CN_MEDIA_ID, new List<string>() { "media_id" } } }; qjeMedia.wherecols = new WhereNode(tb_grp_article_media.CN_TYPE, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_grp_article_media), "photo"); qjeMedia.displaycols = new List<string>() { tb_grp_article_media.CN_SEQ };
QueryJsonElement qjeProduct = lBlocks.GetInst(); qjeProduct.table = tb_prd_article2product.TABLENAME; qjeProduct.jointable = qjeArticle; qjeProduct.jointype = QueryJsonElement.LEFT_JOIN; qjeProduct.joincols = new Dictionary<string, string> { { tb_prd_article2product.CN_ARTICLE_UID, tb_grp_article.CN_UID } }; qjeProduct.displaycols = new List<string>() { tb_prd_article2product.CN_COST_PRICE };
lBlocks.Add(qjeArticle); lBlocks.Add(qjeGroup); lBlocks.Add(qjeMedia); lBlocks.Add(qjeProduct);
sMsg = MakeSelectJoinByBlocks(lBlocks, out Command cRead);
ai = ArsenalDBMgr.GetInst(cRead); var qds = ai.RunQueryList<ArticleMediaInfo>(cRead); var groupData = qds.OrderByDescending(x => x.release_date).GroupBy(x => new { x.draft_uid }).ToList();
if (dicCondition.ContainsKey(tb_grp_article.CN_POST_STATUS)) { if (dicCondition[tb_grp_article.CN_POST_STATUS] == "2") { groupData = qds.OrderBy(x => x.release_date).GroupBy(x => new { x.draft_uid }).ToList(); } }
var lsFirstData = new List<ArticleMediaInfo>(); foreach (var data in groupData.OrderByDescending(x => x.Last().release_date)) { var firstData = data.OrderBy(x => x.seq).First(); var haveNullCost = data.Where(x => x.uid == firstData.uid).Any(x => x.cost_price <= 0); firstData.cost_price = haveNullCost ? (int)Enums.Flag.Disable : (int)Enums.Flag.Enable; lsFirstData.Add(firstData); } var res = lsFirstData.Select(x => new { x.uid, x.type, x.group_uid, x.name, x.fb_article_id, x.message, close_date = x.close_date.HasValue ? x.close_date.Value.ToString("yyyy-MM-dd HH:mm:ss") : "", release_date = x.release_date.HasValue ? x.release_date.Value.ToString("yyyy-MM-dd HH:mm:ss") : "", x.post_status, x.remark, x.status_flag, x.media_id, x.media_type, x.media_uid, x.create_date, x.draft_uid, x.draft, x.cost_price }).ToList(); crmRes = new CSuccessResponseMessage(null, i_crmInput); crmRes.param.Add(BLWording.DATA, new { records = res, totalCount = qdsOrderMst.Total }); } while (false); } catch (Exception ex) { LogHelper.DBLog(Util.GetLastExceptionMsg(ex)); sMsg = $"{nameof(GetArticleMedia)} unknwon exception. i_crmInput={JsonConvert.SerializeObject(i_crmInput)}. "; #if DEBUG
System.Diagnostics.Debug.WriteLine(sMsg); #endif
}
if (null != sMsg) { crmRes = new CErrorResponseMessage(sMsg, i_crmInput); } return crmRes; }
public CResponseMessage GetArticleMediaForScheduler(CRequestMessage i_crmInput) { string sMsg; Command cRes = null; CResponseMessage crmRes = null;
try { do { List<string> lsEmpColumns = EntityBase.GetAllColumnName(typeof(tb_grp_article));
// 取得condition
Dictionary<string, string> dicCondition = GetQueryMasterFirstQJEDicwherecols(i_crmInput); var lsBranch = ProjectHelper.GetUserGroup(i_crmInput);
QueryJsonElementCollection lBlocks = new QueryJsonElementCollection();
QueryJsonElement qjeArticle = lBlocks.GetInst(); qjeArticle.table = tb_grp_article.TABLENAME; qjeArticle.displaycols = lsEmpColumns; qjeArticle.wherecols = new WhereNode(WhereNode.ENodeOperation.ENO_AND, new WhereNode(tb_grp_article.CN_GROUP_UID, WhereNode.EColumnOperation.EOT_IN, typeof(tb_grp_article), lsBranch.ToArray()), new WhereNode(tb_grp_article.CN_STATUS_FLAG, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_grp_article), 1), new WhereNode(tb_grp_article.CN_RELEASE_DATE, WhereNode.EColumnOperation.EOT_ISNOTNULL, typeof(tb_grp_article)) ); if (dicCondition.Any()) { qjeArticle.dicwherecols = dicCondition; } lBlocks.Add(qjeArticle);
QueryJsonElement qjeMedia = lBlocks.GetInst(); qjeMedia.table = tb_grp_article_media.TABLENAME; qjeMedia.jointable = qjeArticle; qjeMedia.jointype = QueryJsonElement.LEFT_JOIN; qjeMedia.joincols = new Dictionary<string, string> { { tb_grp_article_media.CN_ARTICLE_UID, tb_grp_article.CN_UID } }; qjeMedia.aliascols = new Dictionary<string, List<string>> { { tb_grp_article_media.CN_TYPE, new List<string>() { "media_type" } }, { tb_grp_article_media.CN_UID, new List<string>() { "media_uid" } }, { tb_grp_article_media.CN_MEDIA_ID, new List<string>() { "media_id" } } }; qjeMedia.wherecols = new WhereNode(tb_grp_article_media.CN_TYPE, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_grp_article_media), "photo"); qjeMedia.displaycols = new List<string>() { tb_grp_article_media.CN_SEQ }; lBlocks.Add(qjeMedia);
QueryJsonElement qjeProduct = lBlocks.GetInst(); qjeProduct.table = tb_prd_article2product.TABLENAME; qjeProduct.jointable = qjeArticle; qjeProduct.jointype = QueryJsonElement.LEFT_JOIN; qjeProduct.joincols = new Dictionary<string, string> { { tb_prd_article2product.CN_ARTICLE_UID, tb_grp_article.CN_UID } }; qjeProduct.displaycols = new List<string>() { tb_prd_article2product.CN_COST_PRICE }; lBlocks.Add(qjeProduct);
sMsg = MakeSelectJoinByBlocks(lBlocks, out Command cRead);
ArsenalInterface ai = ArsenalDBMgr.GetInst(cRead); var qds = ai.RunQueryList<ArticleMediaInfo>(cRead); var groupData = qds.OrderByDescending(x => x.create_date).GroupBy(x => new { x.draft_uid }).ToList();
if (dicCondition.ContainsKey(tb_grp_article.CN_POST_STATUS)) { if (dicCondition[tb_grp_article.CN_POST_STATUS] == "2") { groupData = qds.OrderBy(x => x.release_date).GroupBy(x => new { x.draft_uid }).ToList(); } } var lsFirstData = new List<ArticleMediaInfo>(); foreach (var data in groupData.OrderByDescending(x => x.Last().create_date)) { var firstData = data.OrderBy(x => x.seq).First(); var haveNullCost = data.Where(x => x.uid == firstData.uid).Any(x => x.cost_price <= 0); firstData.cost_price = haveNullCost ? (int)Enums.Flag.Disable : (int)Enums.Flag.Enable; lsFirstData.Add(firstData); } var res = lsFirstData.Select(x => new { x.uid, x.type, x.group_uid, x.name, x.fb_article_id, x.message, close_date = x.close_date.HasValue ? x.close_date.Value.ToString("yyyy-MM-dd HH:mm:ss") : "", release_date = x.release_date.HasValue ? x.release_date.Value.ToString("yyyy-MM-dd HH:mm:ss") : "", x.post_status, x.status_flag, x.media_id, x.media_type, x.media_uid, x.create_date, x.draft_uid, x.draft, x.cost_price }).ToList(); crmRes = new CSuccessResponseMessage(null, i_crmInput); crmRes.param.Add(BLWording.DATA, res); } while (false); } catch (Exception ex) { LogHelper.DBLog(Util.GetLastExceptionMsg(ex)); sMsg = $"{nameof(GetArticleMedia)} unknwon exception. i_crmInput={JsonConvert.SerializeObject(i_crmInput)}. "; #if DEBUG
System.Diagnostics.Debug.WriteLine(sMsg); #endif
}
if (null != sMsg) { crmRes = new CErrorResponseMessage(sMsg, i_crmInput); } return crmRes; } private string createCopyArticle(CRequestMessage i_crmInput, JArray i_jaData, int draft, List<string> productUid) { string sMsg = null; List<Command> lCmds = new List<Command>(); string sNewArticleUid = "";
try { do { foreach (JToken joData in i_jaData) { List<string> lsEmpColumns = EntityBase.GetAllColumnName(typeof(tb_grp_article)); var lsBranch = ProjectHelper.GetUserGroup(i_crmInput); Dictionary<string, object> dicData = joData.ToObject<Dictionary<string, object>>();
JObject jdata = dicData[BLWording.DATA] as JObject; Dictionary<string, object> dicInput = jdata.ToObject<Dictionary<string, object>>(); sNewArticleUid = Guid.NewGuid().ToString();
tb_grp_article cInsert = new tb_grp_article() { uid = sNewArticleUid, name = (dicInput[tb_grp_article.CN_NAME] ?? "").ToString(), group_uid = (dicInput[tb_grp_article.CN_GROUP_UID] ?? "").ToString(), // fb_article_id = (dicInput[tb_grp_article.CN_FB_ARTICLE_ID] ?? "").ToString(),
message = dicInput[tb_grp_article.CN_MESSAGE].ToString(), post_status = Convert.ToInt32(dicInput[tb_grp_article.CN_POST_STATUS]), draft = draft, draft_uid = draft == 1 ? sNewArticleUid : (dicInput[tb_grp_article.CN_DRAFT_UID] ?? "").ToString(), remark = (dicInput[tb_grp_article.CN_REMARK])?.ToString(), dutyfree = (dicInput[tb_grp_article.CN_DUTYFREE] ?? "").ToString().ToLower() == "true" ? "1" : "0" }; // 發布時間可能為空
if (dicInput.ContainsKey(tb_grp_article.CN_RELEASE_DATE) && dicInput[tb_grp_article.CN_RELEASE_DATE] != null) { cInsert.release_date = Convert.ToDateTime(dicInput[tb_grp_article.CN_RELEASE_DATE].ToString()); } // 截團時間可能為空
if (dicInput.ContainsKey(tb_grp_article.CN_CLOSE_DATE) && dicInput[tb_grp_article.CN_CLOSE_DATE] != null) { cInsert.close_date = Convert.ToDateTime(dicInput[tb_grp_article.CN_CLOSE_DATE].ToString()); } Command c = Command.SetupInsertCmd(cInsert); lCmds.Add(c); //}
// Log
sMsg = getManualLog(i_crmInput, dicData, BLWording.LOG_ACTION_NAME_INSERTSQL, out Command cLog);
if (sMsg != null) { break; }
if (cLog != null) { lCmds.Add(cLog); }
string sMediaKey = nameof(tb_grp_article_media); if (!jdata.ContainsKey(sMediaKey)) { sMsg = "common.no_media_fle"; break; }
List<MediaInfo> lmi = jdata[sMediaKey].ToObject<List<MediaInfo>>(); lmi.ForEach(f => { lCmds.Add(Command.SetupInsertCmd(new tb_grp_article_media() { uid = Guid.NewGuid().ToString(), article_uid = sNewArticleUid, media_id = f.display.Substring(f.display.IndexOf('=') + 1), type = f.mediatype, status_flag = BLWording.STATUS_FLAG_ON })); });
string sProductKey = nameof(tb_prd_article2product); if (!jdata.ContainsKey(sProductKey)) { sMsg = "grp.no_product"; break; }
//List<tb_prd_article2product> la2pProducts = jdata[sProductKey].ToObject<List<tb_prd_article2product>>();
//new Article2ProductService().CreateProduct(sNewArticleUid, la2pProducts, dicInput[tb_grp_article.CN_GROUP_UID].ToString(), ref lCmds);
if (dicInput.ContainsKey(nameof(tb_prd_article2product))) { List<tb_prd_article2product> la2pFrontEnd = (dicInput[nameof(tb_prd_article2product)] as JArray).ToObject<List<tb_prd_article2product>>();
var count = 0; // Only in dicInput => Add
la2pFrontEnd.ForEach((f) => { string sProductUid = ""; if (f.prd_uid == null && productUid.Count != 0) { sProductUid = productUid[count]; count++; } else { sProductUid = f.prd_uid; } tb_prd_product pDisplay = new tb_prd_product(); pDisplay.SetFullDirty(); tb_prd_product p = new tb_prd_product() { uid = sProductUid };
Command cSelectP = Command.SetupSelectCmd(pDisplay, p);
ArsenalInterface ai = ArsenalDBMgr.GetInst(cSelectP, GetDefaultSystemColumnInfo());
List<tb_prd_article2product> la2pOri = ai.RunQueryList<tb_prd_article2product>(cSelectP);
if (la2pOri.FirstOrDefault() == null) { sProductUid = Guid.NewGuid().ToString(); // Create Product first
lCmds.Add(Command.SetupInsertCmd(new tb_prd_product() { uid = sProductUid, name = f.name, group_id = dicInput[tb_grp_article.CN_GROUP_UID].ToString(), price = f.price, wholesale_price = f.wholesale_price, cost_price = f.cost_price })); }
lCmds.Add(Command.SetupInsertCmd(new tb_prd_article2product() { uid = Guid.NewGuid().ToString(), price = f.price, wholesale_price = f.wholesale_price, name = f.name, article_uid = sNewArticleUid, prd_uid = sProductUid, seq = f.seq, specification = f.specification.ToUpper(), cost_price = f.cost_price }));
}); }
ArsenalInterface ai = ArsenalDBMgr.GetInst(lCmds[0], GetDefaultSystemColumnInfo()); ai.RunEditCmds(lCmds); sMsg = GetLastErrorCode(lCmds); if (sMsg != null) { return sMsg; } } } while (false); } catch (Exception ex) { LogHelper.DBLog(Util.GetLastExceptionMsg(ex)); sMsg = $"{nameof(createCopyArticle)} unknwon exception. i_crmInput={JsonConvert.SerializeObject(i_crmInput)}. "; #if DEBUG
System.Diagnostics.Debug.WriteLine(sMsg); #endif
throw new Exception(sMsg); }
return sNewArticleUid; } public CResponseMessage UpdateArticle(CRequestMessage i_crmInput) { string sMsg = null; List<Command> lCmds = new List<Command>(); CResponseMessage crmRes = null; JArray i_jaData = i_crmInput.param[BLWording.UPD_MASTER] as JArray; try { do { string post_status = null; string opost_status = "0"; bool isSchedule = false; string action = null; string oriArticleId = null; string downloadurl = null; List<string> productUid = new List<string>(); foreach (JToken joData in i_jaData) { Dictionary<string, object> dicData = joData.ToObject<Dictionary<string, object>>(); if (dicData.ContainsKey("isProductValid")) { if (Convert.ToBoolean(dicData["isProductValid"]) == false) { sMsg = "商品價格錯誤"; break; } } JObject jalldata = dicData[BLWording.DATA] as JObject; downloadurl = dicData[GrpBLWording.GRP_DOWNLOADURL].ToString(); oriArticleId = jalldata[tb_grp_article.CN_UID].ToString();
sMsg = getManualLog(i_crmInput, dicData, BLWording.LOG_ACTION_NAME_INSERTSQL, out Command cLog);
if (sMsg != null) { crmRes = new CErrorResponseMessage(sMsg, i_crmInput); break; }
if (cLog != null) { lCmds.Add(cLog); }
if (dicData.ContainsKey("action")) { action = dicData["action"].ToString();
} // 判斷有無release_date 來決定是否排程與是否發佈
if (jalldata.ContainsKey(tb_grp_article.CN_RELEASE_DATE)) { bool isDateTime = DateTime.TryParse(jalldata[tb_grp_article.CN_RELEASE_DATE].ToString(), out DateTime release_date); if (isDateTime && release_date < DateTime.Now.AddMinutes(-30) && action != "Save") { sMsg = "datetime wrong"; break; } if (isDateTime && action != "Save") { isSchedule = true; } else if (isDateTime && action == "Save") { isSchedule = true; } } // 判斷是否為草稿
if (jalldata.ContainsKey(tb_grp_article.CN_POST_STATUS)) { post_status = jalldata[tb_grp_article.CN_POST_STATUS].ToString(); } if (jalldata.ContainsKey("opost_status")) { opost_status = jalldata["opost_status"].ToString(); }
//List<Command> lcMst = getUpdListCommand(i_crmInput, i_jaData, typeof(tb_grp_article).GetField("TABLENAME").GetValue(null).ToString(), i_saQryContainKeys, out sMsg);
//判斷是否為Establish 如果是就不Update
//if (action == "Establish")
//{
// //lCmds.Add(lcMst[0]);
// continue;
//}
var oData = new tb_grp_article(); if (jalldata[tb_grp_article.CN_CLOSE_DATE].ToString() == "") { oData.close_date = null; } else { oData.close_date = Convert.ToDateTime(jalldata[tb_grp_article.CN_CLOSE_DATE].ToString()); } if (jalldata[tb_grp_article.CN_RELEASE_DATE].ToString() == "") { oData.release_date = null; } else { oData.release_date = Convert.ToDateTime(jalldata[tb_grp_article.CN_RELEASE_DATE].ToString()); } oData.message = jalldata[tb_grp_article.CN_MESSAGE].ToString(); oData.name = jalldata[tb_grp_article.CN_NAME].ToString(); oData.group_uid = jalldata[tb_grp_article.CN_GROUP_UID].ToString(); oData.remark= jalldata[tb_grp_article.CN_REMARK].ToString(); oData.dutyfree = jalldata[tb_grp_article.CN_DUTYFREE].ToString().ToLower() == "true" ? "1" : "0"; if (int.Parse(opost_status) > 2) { if (action == "Post") { oData.post_status = int.Parse(opost_status); post_status = opost_status; } } else { if (action == "Post") { oData.post_status = int.Parse(post_status); } } if (action != "Establish" && action != "Post") { Command c = Command.SetupUpdateCmd(oData, new WhereNode(tb_grp_article.CN_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_grp_article), oriArticleId)); lCmds.Add(c);
}
if (sMsg != null) { break; } //lCmds.AddRange(lcMst);
if (!dicData.ContainsKey(BLWording.DATA)) { continue; } JObject jdata = dicData[BLWording.DATA] as JObject; JObject jwheredata = dicData[BLWording.WHEREDATA] as JObject; Dictionary<string, object> dicWhere = new Dictionary<string, object>(); if (null != JProperty2Dic(jwheredata, ref dicWhere)) { sMsg = MessageWording.PARAM_NOT_EXPECTED; //參數錯誤
break; } Dictionary<string, object> dicInput = jdata.ToObject<Dictionary<string, object>>();
string sArticleUid = dicWhere[tb_grp_article.CN_UID].ToString();
if (dicInput.ContainsKey(nameof(tb_grp_article_media))) { tb_grp_article_media a2mDisplay = new tb_grp_article_media(); a2mDisplay.SetFullDirty(); tb_grp_article_media a2m = new tb_grp_article_media() { article_uid = sArticleUid };
Command cSelecta2m = Command.SetupSelectCmd(a2mDisplay, a2m);
ArsenalInterface ai = ArsenalDBMgr.GetInst(cSelecta2m, GetDefaultSystemColumnInfo());
List<tb_grp_article_media> la2mOri = ai.RunQueryList<tb_grp_article_media>(cSelecta2m);
if (!cSelecta2m.IsSuccess) { sMsg = cSelecta2m.LastErrorCode; break; } List<MediaInfo> la2mFrontEnd = (dicInput[nameof(tb_grp_article_media)] as JArray).ToObject<List<MediaInfo>>();
var seq = 1; // Only in dicInput => Add
la2mFrontEnd.ForEach(f => {
tb_grp_article_media a2mMatch = la2mOri.FirstOrDefault(g => g.uid == f.uid); if (f.uid == BLWording.CREATEUID || a2mMatch == null) { lCmds.Add(Command.SetupInsertCmd(new tb_grp_article_media() { uid = Guid.NewGuid().ToString(), article_uid = sArticleUid, media_id = f.display.Substring(f.display.IndexOf('=') + 1), type = f.mediatype, status_flag = BLWording.STATUS_FLAG_ON })); } else { // update seq
lCmds.Add(Command.SetupUpdateCmd(new tb_grp_article_media() { seq = seq++ }, new tb_grp_article_media() { uid = f.uid } )); } }); // Only in la2mOri => Delete
la2mOri.ForEach(f => { MediaInfo a2mMatch = la2mFrontEnd.FirstOrDefault(g => g.uid == f.uid); if (a2mMatch == null) { lCmds.Add(Command.SetupDeleteCmd( new tb_grp_article_media() { uid = f.uid } )); } }); }
if (dicInput.ContainsKey(nameof(tb_prd_article2product))) { tb_prd_article2product a2pDisplay = new tb_prd_article2product(); a2pDisplay.SetFullDirty(); tb_prd_article2product a2p = new tb_prd_article2product() { article_uid = sArticleUid };
Command cSelectA2P = Command.SetupSelectCmd(a2pDisplay, a2p);
ArsenalInterface ai = ArsenalDBMgr.GetInst(cSelectA2P, GetDefaultSystemColumnInfo());
List<tb_prd_article2product> la2pOri = ai.RunQueryList<tb_prd_article2product>(cSelectA2P);
if (!cSelectA2P.IsSuccess) { sMsg = cSelectA2P.LastErrorCode; break; } List<tb_prd_article2product> la2pFrontEnd = (dicInput[nameof(tb_prd_article2product)] as JArray).ToObject<List<tb_prd_article2product>>();
// Only in dicInput => Add
la2pFrontEnd.ForEach(f => { string sProductUid = f.prd_uid;
if (sProductUid == null) { sProductUid = Guid.NewGuid().ToString(); productUid.Add(sProductUid); // Create Product first
lCmds.Add(Command.SetupInsertCmd(new tb_prd_product() { uid = sProductUid, name = f.name, group_id = dicInput[tb_grp_article.CN_GROUP_UID].ToString(), price = f.price, wholesale_price = f.wholesale_price, cost_price = f.cost_price })); }
tb_prd_article2product a2pMatch = la2pOri.FirstOrDefault(g => g.uid == f.uid); if (f.uid == BLWording.CREATEUID || a2pMatch == null) { lCmds.Add(Command.SetupInsertCmd(new tb_prd_article2product() { uid = Guid.NewGuid().ToString(), price = f.price, wholesale_price = f.wholesale_price, name = f.name, article_uid = sArticleUid, prd_uid = sProductUid, seq = f.seq, specification = f.specification.ToUpper(), cost_price = f.cost_price })); } else { // Update
lCmds.Add(Command.SetupUpdateCmd( new tb_prd_article2product() { price = f.price, wholesale_price = f.wholesale_price, name = f.name, article_uid = sArticleUid, prd_uid = sProductUid, seq = f.seq, specification = f.specification.ToUpper(), cost_price = f.cost_price }, new tb_prd_article2product() { uid = a2pMatch.uid } ));
lCmds.Add(Command.SetupUpdateCmd( new tb_prd_product() { name = f.name }, new tb_prd_product() { uid = sProductUid } )); } }); // Only in la2pOri => Delete
la2pOri.ForEach(f => { tb_prd_article2product a2pMatch = la2pFrontEnd.FirstOrDefault(g => g.uid == f.uid); if (a2pMatch == null) { if (int.Parse(opost_status) >= (int)Enums.EPostStatus.EPS_ORDER) { sMsg = "已結單文章不得刪除商品"; return; } lCmds.Add(Command.SetupDeleteCmd( new tb_prd_article2product() { uid = f.uid } )); } });
}
}
if (sMsg != null) { break; }
ArsenalInterface ai_upd = ArsenalDBMgr.GetInst(lCmds[0], GetDefaultSystemColumnInfo());
int iRes = ai_upd.RunEditCmds(lCmds);
sMsg = GetLastErrorCode(lCmds);
if (sMsg != null) { sMsg = GetLastErrorMessage(lCmds); break; }
crmRes = new CSuccessResponseMessage(null, i_crmInput); crmRes.param.Add(BLWording.AFFECTCOUNT, iRes);
if (sMsg != null) { break; } // 開始判斷各種Action邏輯
string newArticleId = null; if (int.Parse(opost_status) > 2) // status > 2 為已發文
{ if (isSchedule) { if (action == "Establish") // 是Establish就新增為底稿
{ createCopyArticle(i_crmInput, i_jaData, 1, productUid); } else if (action == "Post") // 是Post新增為非底稿
{ createCopyArticle(i_crmInput, i_jaData, 0, productUid); } } else { if (action == "Establish") // 是Establish就新增為底稿
{ createCopyArticle(i_crmInput, i_jaData, 1, productUid); } else if (action == "Post") // 是Post新增為非底稿
{ newArticleId = createCopyArticle(i_crmInput, i_jaData, 0, productUid); } } } else { if (action == "Establish") // 非上傳文章之Establish 新增為底稿
{ newArticleId = createCopyArticle(i_crmInput, i_jaData, 1, productUid); } }
// 非排程且action為Post 就直接上傳
if (!isSchedule && action == "Post") { if (newArticleId != null) { sMsg = _PushPostDetail(newArticleId, downloadurl, true, out _); } else { sMsg = _PushPostDetail(oriArticleId, downloadurl, true, out _); } }
if (sMsg != null) { break; } } while (false); } catch (Exception ex) { LogHelper.DBLog(Util.GetLastExceptionMsg(ex)); sMsg = $"{nameof(UpdateArticle)} unknwon exception. i_crmInput={JsonConvert.SerializeObject(i_crmInput)}. "; #if DEBUG
System.Diagnostics.Debug.WriteLine(sMsg); #endif
} if (null != sMsg) { crmRes = new CErrorResponseMessage(sMsg, i_crmInput); } return crmRes; }
/// <summary>
/// 與原版的UpdateArticle差別在只更新社團ID進去
/// </summary>
/// <param name="i_crmInput"></param>
/// <returns></returns>
public CResponseMessage UpdateArticleManual(CRequestMessage i_crmInput) { string sMsg = null; List<Command> lCmds = new List<Command>(); CResponseMessage crmRes = null; JArray i_jaData = i_crmInput.param[BLWording.UPD_MASTER] as JArray; try { do { lCmds = getUpdListCommand(i_crmInput, i_jaData, typeof(tb_grp_article).GetField("TABLENAME").GetValue(null).ToString(), new List<string>() { "uid" }, out sMsg);
ArsenalInterface ai_upd = ArsenalDBMgr.GetInst(lCmds[0], GetDefaultSystemColumnInfo());
int iRes = ai_upd.RunEditCmds(lCmds); sMsg = GetLastErrorCode(lCmds);
if (sMsg != null) { sMsg = GetLastErrorMessage(lCmds); break; }
crmRes = new CSuccessResponseMessage("", i_crmInput);
} while (false); } catch (Exception ex) { LogHelper.DBLog(Util.GetLastExceptionMsg(ex)); sMsg = $"{nameof(UpdateArticle)} unknwon exception. i_crmInput={JsonConvert.SerializeObject(i_crmInput)}. "; #if DEBUG
System.Diagnostics.Debug.WriteLine(sMsg); #endif
} if (null != sMsg) { crmRes = new CErrorResponseMessage(sMsg, i_crmInput); } return crmRes; }
public CResponseMessage SearchArticle(CRequestMessage i_crmInput) { string sMsg; CResponseMessage crmRes = null; try { do { List<string> lsEmpColumns = EntityBase.GetAllColumnName(typeof(tb_grp_article));
// 取得condition
Dictionary<string, string> dicCondition = GetQueryMasterFirstQJEDicwherecols(i_crmInput); var lsBranch = ProjectHelper.GetUserGroup(i_crmInput);
// 取回文章ID跟UserToken
sMsg = GetUserToken(dicCondition[tb_grp_article.CN_GROUP_UID].ToString(), out List<GroupViewModel> qdGroup);
if (sMsg != null) { break; }
var Articledata = new FbHelper().CallFbPostGetDataAPI(qdGroup.First().user_token, qdGroup.First().fb_group_id);
//QueryJsonElement qjeArticle = lBlocks.GetInst();
//qjeArticle.table = tb_grp_article.TABLENAME;
//qjeArticle.displaycols = lsEmpColumns;
//List<WhereNode> lwnMainInfo = new List<WhereNode>();
//lwnMainInfo.Add(new WhereNode(tb_grp_article.CN_GROUP_UID, WhereNode.EColumnOperation.EOT_IN, typeof(tb_grp_article), lsBranch.ToArray()));
//lwnMainInfo.Add(new WhereNode(tb_grp_article.CN_STATUS_FLAG, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_grp_article), BLWording.STATUS_FLAG_ON));
//if (dicCondition.ContainsKey(tb_grp_article.CN_NAME))
//{
// lwnMainInfo.Add(new WhereNode(tb_grp_article.CN_NAME, WhereNode.EColumnOperation.EOT_LIKE, typeof(tb_grp_article), dicCondition[tb_grp_article.CN_NAME].ToString()));
//}
//qjeArticle.wherecols = new WhereNode(WhereNode.ENodeOperation.ENO_AND, lwnMainInfo.ToArray());
//lBlocks.Add(qjeArticle);
//sMsg = MakeSelectJoinByBlocks(lBlocks, out Command cRead);
//ArsenalInterface ai = ArsenalDBMgr.GetInst(cRead);
//var qds = ai.RunQueryList<ArticleMediaInfo>(cRead);
//var groupData = qds.OrderByDescending(x => x.create_date).GroupBy(x => new { x.draft_uid }).ToList();
string filter = dicCondition.ContainsKey(tb_grp_article.CN_NAME) ? dicCondition[tb_grp_article.CN_NAME].ToString() : ""; var res = Articledata.data.Where(x => { if (x.message != null) { return x.message.Contains(filter); } return false; }).Select(x => new { x.full_picture, x.id, x.message, x.source, x.created_time }).ToList(); crmRes = new CSuccessResponseMessage(null, i_crmInput); crmRes.param.Add(BLWording.DATA, res); } while (false); } catch (Exception ex) { LogHelper.DBLog(Util.GetLastExceptionMsg(ex)); sMsg = $"{nameof(SearchArticle)} unknwon exception. i_crmInput={JsonConvert.SerializeObject(i_crmInput)}. "; #if DEBUG
System.Diagnostics.Debug.WriteLine(sMsg); #endif
}
if (null != sMsg) { crmRes = new CErrorResponseMessage(sMsg, i_crmInput); }
return crmRes; }
public CResponseMessage ImportArticle(CRequestMessage i_crmInput) { string sMsg; CResponseMessage crmRes = null; List<Command> lCmds = new List<Command>();
try { do { JArray i_jaData = i_crmInput.param[BLWording.ADD_MASTER] as JArray;
foreach (JToken joData in i_jaData) { Dictionary<string, object> dicData = joData.ToObject<Dictionary<string, object>>(); JObject jdata = dicData[BLWording.DATA] as JObject; Dictionary<string, object> dicInput = jdata.ToObject<Dictionary<string, object>>(); if (dicInput.ContainsKey("isProductValid")) { if (Convert.ToBoolean(dicInput["isProductValid"]) == false) { sMsg = "商品價格錯誤"; crmRes = new CErrorResponseMessage(sMsg, i_crmInput); break; } } if (!dicInput.ContainsKey("id")) { sMsg = "文章資料錯誤"; crmRes = new CErrorResponseMessage(sMsg, i_crmInput); break; } // 先查詢資料是否存在
tb_grp_article cArticle = new tb_grp_article(); cArticle.SetFullDirty(); tb_grp_article cArticleCon = new tb_grp_article() { fb_article_id = dicInput["id"].ToString(), status_flag = BLWording.STATUS_FLAG_ON }; Command cArticleSelect = Command.SetupSelectCmd(cArticle, cArticleCon); ArsenalInterface ai = ArsenalDBMgr.GetInst(cArticleSelect); tb_grp_article qdsArticle = ai.RunQuerySingleORM<tb_grp_article>(cArticleSelect);
if (qdsArticle != null) { sMsg = "此文章已存在於系統"; crmRes = new CErrorResponseMessage(sMsg, i_crmInput); break; }
string sNewArticleUid = Guid.NewGuid().ToString(); string newArticleMediaUid = Guid.NewGuid().ToString(); string newArticleMediaId = Guid.NewGuid().ToString(); string newArticleMediaName = string.Format(CultureInfo.CurrentCulture, "{0}_{1}", (i_crmInput.customparam[BLWording.SESSION_USER] as tb_sys_session).update_user_uid, DateTime.Now.ToString("yyyyMMddHHMMssfff", CultureInfo.CurrentCulture)); WebClient webClient = new WebClient(); string filePath = Path.Combine(RootPath, SystemSettingHelper.FileFolder(SystemSettingHelper.EPath.EP_FILETMP)) + "\\" + newArticleMediaName + ".jpg";
// if FB Post has full_picture
if (!dicInput.ContainsKey("full_picture")) { sMsg = "欲匯入文章沒有圖片"; crmRes = new CErrorResponseMessage(sMsg, i_crmInput); break; }
webClient.DownloadFile(dicInput["full_picture"].ToString(), filePath);
FileUploadHelper fuh = new FileUploadHelper(GetFileUploadInfo(), i_crmInput); sMsg = fuh.UploadLocalFile(filePath, out tb_sys_uploadlog ulRes);
if (sMsg != null) { crmRes = new CErrorResponseMessage(sMsg, i_crmInput); break; }
lCmds.Add(Command.SetupInsertCmd(new tb_grp_article_media() { uid = newArticleMediaUid, article_uid = sNewArticleUid, media_id = ulRes.uid, type = "photo", seq = 1, status_flag = BLWording.STATUS_FLAG_ON }));
tb_grp_article cInsert = new tb_grp_article() { uid = sNewArticleUid, name = (dicInput[tb_grp_article.CN_NAME] ?? "").ToString(), group_uid = (dicInput[tb_grp_article.CN_GROUP_UID] ?? "").ToString(), fb_article_id = (dicInput["id"] ?? "").ToString(), post_date = Convert.ToDateTime(dicInput["created_time"]), message = dicInput[tb_grp_article.CN_MESSAGE].ToString(), post_status = (int)Enums.EPostStatus.EPS_COMPLETE, draft = 1, draft_uid = sNewArticleUid }; // 發布時間可能為空
if (dicInput.ContainsKey(tb_grp_article.CN_RELEASE_DATE) && dicInput[tb_grp_article.CN_RELEASE_DATE] != null) { cInsert.release_date = Convert.ToDateTime(dicInput[tb_grp_article.CN_RELEASE_DATE].ToString()); } Command c = Command.SetupInsertCmd(cInsert); lCmds.Add(c);
// Log
sMsg = getManualLog(i_crmInput, dicData, BLWording.LOG_ACTION_NAME_INSERTSQL, out Command cLog);
if (sMsg != null) { crmRes = new CErrorResponseMessage(sMsg, i_crmInput); break; }
if (cLog != null) { lCmds.Add(cLog); }
string sProductKey = nameof(tb_prd_article2product); if (!jdata.ContainsKey(sProductKey)) { sMsg = "grp.no_product"; crmRes = new CErrorResponseMessage(sMsg, i_crmInput); break; }
List<tb_prd_article2product> la2pProducts = jdata[sProductKey].ToObject<List<tb_prd_article2product>>(); if (!la2pProducts.Any()) { sMsg = "grp.no_product"; crmRes = new CErrorResponseMessage(sMsg, i_crmInput); break; } new Article2ProductService().CreateProduct(sNewArticleUid, la2pProducts, cInsert.group_uid, ref lCmds);
ArsenalInterface ai_upd = ArsenalDBMgr.GetInst(lCmds[0], GetDefaultSystemColumnInfo());
int iRes = ai_upd.RunEditCmds(lCmds);
sMsg = GetLastErrorCode(lCmds);
if (sMsg != null) { sMsg = GetLastErrorMessage(lCmds); crmRes = new CErrorResponseMessage(sMsg, i_crmInput); break; }
crmRes = new CSuccessResponseMessage(null, i_crmInput); crmRes.param.Add(BLWording.AFFECTCOUNT, iRes); } } while (false); } catch (Exception ex) { LogHelper.DBLog(Util.GetLastExceptionMsg(ex)); sMsg = $"{nameof(ImportArticle)} unknwon exception. i_crmInput={JsonConvert.SerializeObject(i_crmInput)}. "; #if DEBUG
System.Diagnostics.Debug.WriteLine(sMsg); crmRes = new CErrorResponseMessage(sMsg, i_crmInput); #endif
} return crmRes; } public CResponseMessage BindFbPostToArticle(CRequestMessage i_crmInput) { string sMsg; CResponseMessage crmRes = null; List<Command> lCmds = new List<Command>();
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<string, object> dicCondition = new Dictionary<string, object>();
if (joData != null) { dicCondition = joData[BLWording.DATA].ToObject<Dictionary<string, object>>(); }
// 判斷為社團ID還是分店ID
sMsg = GetUserToken(dicCondition[tb_grp_article.CN_GROUP_UID].ToString(), out List<GroupViewModel> qdGroup);
if (sMsg != null || qdGroup == null) { sMsg = "尋找社團資訊時發生了問題"; break; }
qdGroup = qdGroup.Where(x => x.status_flag == BLWording.STATUS_FLAG_ON).ToList();
if(qdGroup.Count == 0) { sMsg = "尋找社團資訊時發生了問題"; break; }
if (qdGroup.First().fb_group_id != dicCondition[tb_grp_group.CN_FB_GROUP_ID].ToString()) { sMsg = "社團網址錯誤"; break; }
var Articledata = new FbHelper().CallSingleFbPostGetDataAPI(qdGroup.First().user_token, dicCondition[tb_grp_article.CN_FB_ARTICLE_ID].ToString().Split("_")[1]); if (Articledata == null) { sMsg = "與FB貼文連結失敗"; break; }
tb_grp_article upData = new tb_grp_article() { fb_article_id = dicCondition[tb_grp_article.CN_FB_ARTICLE_ID].ToString(), post_date = Articledata.created_time, post_status = (int)Enums.EPostStatus.EPS_COMPLETE }; tb_grp_article upCon = new tb_grp_article() { uid = dicCondition[tb_grp_article.CN_UID].ToString() }; lCmds.Add(Command.SetupUpdateCmd(upData, upCon));
ArsenalInterface ai = ArsenalDBMgr.GetInst(lCmds[0], GetDefaultSystemColumnInfo()); ai.RunEditCmds(lCmds); sMsg = GetLastErrorCode(lCmds);
if (sMsg != null) { sMsg = GetLastErrorMessage(lCmds); crmRes = new CErrorResponseMessage(sMsg, i_crmInput); break; }
crmRes = new CSuccessResponseMessage(null, i_crmInput); } while (false); } catch (Exception ex) { LogHelper.DBLog(Util.GetLastExceptionMsg(ex)); sMsg = $"{nameof(BindFbPostToArticle)} unknwon exception. i_crmInput={JsonConvert.SerializeObject(i_crmInput)}. "; #if DEBUG
System.Diagnostics.Debug.WriteLine(sMsg); crmRes = new CSuccessResponseMessage(sMsg, i_crmInput); #endif
} if (null != sMsg) { crmRes = new CErrorResponseMessage(sMsg, i_crmInput); } return crmRes;
} private string GetUserToken(string groupUid, out List<GroupViewModel> qdGroup) { string sMsg = null; // 取回文章ID跟UserToken
QueryJsonElementCollection lBlocks = new QueryJsonElementCollection();
QueryJsonElement qjeGroup = lBlocks.GetInst(); qjeGroup.table = tb_grp_group.TABLENAME; qjeGroup.displaycols = new List<string>() { tb_grp_group.CN_FB_GROUP_ID }; qjeGroup.wherecols = new WhereNode(tb_grp_group.CN_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_grp_group), groupUid); 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<string, string> { { tb_grp_group2user.CN_GROUP_UID, tb_grp_group.CN_UID } }; qjeGroupUser.displaycols = new List<string>() { tb_grp_group2user.CN_USER_TOKEN, tb_grp_group2user.CN_STATUS_FLAG }; lBlocks.Add(qjeGroupUser);
sMsg = MakeSelectJoinByBlocks(lBlocks, out Command cRes);
if (sMsg != null) { qdGroup = null; return "error"; } ArsenalInterface ai = ArsenalDBMgr.GetInst(cRes); qdGroup = ai.RunQueryList<GroupViewModel>(cRes); sMsg = GetLastErrorCode(cRes); if (sMsg != null) { return sMsg; } return null; }
/// <summary>
/// 自動匯入FB社團文章ID, 處理使用發文API後FB回傳發文失敗錯誤訊息(Internal Server Error), 但文章還是會發送去社團的狀況
/// </summary>
/// <param name="i_crmInput"></param>
/// <returns></returns>
//public CResponseMessage AutoImportArticle(CRequestMessage i_crmInput)
//{
// var information = "";
// var grabDate = 10;
// int groupArticleTotalCount = 0, matchFbPosts = 0, updateSuccessCount = 0;
// var articleGroup = GetIntradayNoFbPostIdArticle(grabDate).GroupBy(x => x.fb_group_id);
// foreach (var articles in articleGroup)
// {
// FbGetPost getPost = new FbHelper().CallFbPostGetDataAPI(articles.FirstOrDefault().user_token, articles.Key);
// //FbGetPost getPost = new FbHelper().CallFbPostGetDataAPI(articles.FirstOrDefault().user_token, articles.Key, grabDate);// 找出指定群組內的貼文
// matchFbPosts = 0;
// updateSuccessCount = 0;
// groupArticleTotalCount = articles.Count();
// foreach (var article in articles)
// {
// // 取發布貼文日期正負10分鐘的同名貼文
// var fbPost = getPost.data.Where(
// x => x.message != null &&
// x.message.Contains(article.name) &&
// x.created_time > article.release_date.AddMinutes(-10) &&
// x.created_time < article.release_date.AddMinutes(10)
// ).FirstOrDefault();
// if (fbPost != null)
// {
// matchFbPosts++;
// if (UpdateArticleFbPostId(article.uid, fbPost.id))
// {
// updateSuccessCount++;
// }
// }
// }
// information += $@"{nameof(AutoImportArticle)} porcess FB group id: {articles.FirstOrDefault()?.fb_group_id} Complete, {nameof(groupArticleTotalCount)} = {groupArticleTotalCount}, {nameof(matchFbPosts)} = {matchFbPosts}, {nameof(updateSuccessCount)} = {updateSuccessCount} .";
// }
// Logger.Debug($@"{information}");// 紀錄匹配文章數量與db更新成功數量
// CResponseMessage crmRes = new CSuccessResponseMessage(
// $"{information}",
// i_crmInput
// );
// return crmRes;
//}
/// <summary>
/// 取得當天所有已發布貼文卻沒有FB貼文ID的文章
/// </summary>
/// <returns></returns>
private List<GroupArticleModel> GetIntradayNoFbPostIdArticle(int grabDate_) { string sMsg = null; QueryJsonElementCollection lBlocks = new QueryJsonElementCollection();
QueryJsonElement article = lBlocks.GetInst(); article.table = tb_grp_article.TABLENAME; article.displaycols = new List<string>() { tb_grp_article.CN_UID, tb_grp_article.CN_NAME, tb_grp_article.CN_GROUP_UID, tb_grp_article.CN_RELEASE_DATE, }; article.wherecols = new WhereNode(WhereNode.ENodeOperation.ENO_AND, new WhereNode(tb_grp_article.CN_FB_ARTICLE_ID, WhereNode.EColumnOperation.EOT_ISNULL, typeof(tb_grp_article)), //new WhereNode(tb_grp_article.CN_POST_DATE, WhereNode.EColumnOperation.EOT_GT, typeof(tb_grp_article), DateTime.Now.AddDays(-1).ToString("yyyy/MM/dd HH:mm:ss"))
new WhereNode(tb_grp_article.CN_RELEASE_DATE, WhereNode.EColumnOperation.EOT_GT, typeof(tb_grp_article), DateTime.Now.AddDays(-grabDate_).ToString("yyyy/MM/dd HH:mm:ss")) );
QueryJsonElement group = lBlocks.GetInst(); group.table = tb_grp_group.TABLENAME; group.displaycols = new List<string>() { tb_grp_group.CN_FB_GROUP_ID }; group.jointable = article; group.joincols = new Dictionary<string, string>() { { tb_grp_group.CN_UID,tb_grp_article.CN_GROUP_UID }};
QueryJsonElement group2user = lBlocks.GetInst(); group2user.table = tb_grp_group2user.TABLENAME; group2user.displaycols = new List<string>() { tb_grp_group2user.CN_USER_TOKEN }; group2user.jointable = article; group2user.joincols = new Dictionary<string, string>() { { tb_grp_group2user.CN_GROUP_UID,tb_grp_article.CN_GROUP_UID }};
lBlocks.Add(article); lBlocks.Add(group); lBlocks.Add(group2user);
sMsg = MakeSelectJoinByBlocks(lBlocks, out Command cRes);
if (sMsg != null) { throw new Exception(sMsg); } ArsenalInterface ai = ArsenalDBMgr.GetInst(cRes); var result = ai.RunQueryList<GroupArticleModel>(cRes); sMsg = GetLastErrorCode(cRes); if (sMsg != null) { throw new Exception(sMsg); }
return result; }
/// <summary>
/// 使用UID更新fb_article_id
/// </summary>
/// <param name="article_uid_"></param>
/// <param name="fb_article_id_"></param>
/// <returns></returns>
private bool UpdateArticleFbPostId(string article_uid_, string fb_article_id_) { var sMsg = ""; var Commands = new List<Command>(); var oData = new tb_grp_article(); oData.fb_article_id = fb_article_id_;// Just update Data
Command c = Command.SetupUpdateCmd(oData, new WhereNode(tb_grp_article.CN_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_grp_article), article_uid_));
Commands.Add(c);
ArsenalInterface ai = ArsenalDBMgr.GetInst(Commands[0], GetDefaultSystemColumnInfo()); ai.RunEditCmds(Commands); sMsg = GetLastErrorCode(Commands); if (sMsg != null) { Logger.Error($"{nameof(UpdateArticleFbPostId)} => {sMsg}"); return false; }
return true; } } }
|