public ActionResult GetHistory(TableHistory th) { List<TableHistoryCustom> list = new List<TableHistoryCustom>(); IsoDateTimeConverter iso = new IsoDateTimeConverter() { DateTimeFormat = "yyyy-MM-dd HH:mm:ss" }; try { int total = 0; var Start = int.Parse(Request.Form["start"] ?? "0"); if (Request["limit"] != null) { var Limit = Convert.ToInt32(Request["limit"]); } _tableHistoryMgr = new TableHistoryMgr(connectionString); list = _tableHistoryMgr.GetHistoryByCondition(th, out total); return Content("{succes:true,totalCount:" + total + ",item:" + JsonConvert.SerializeObject(list, Formatting.None, iso) + "}"); } catch (Exception ex) { Log4NetCustom.LogMessage logMessage = new Log4NetCustom.LogMessage(); logMessage.Content = string.Format("TargetSite:{0},Source:{1},Message:{2}", ex.TargetSite.Name, ex.Source, ex.Message); logMessage.MethodName = System.Reflection.MethodBase.GetCurrentMethod().Name; log.Error(logMessage); return new EmptyResult(); } }
public HttpResponseBase QueryLastModifyRecord() { string result = string.Empty; try { if (!string.IsNullOrEmpty(Request.Form["Product_Id"])) { StringBuilder html = new StringBuilder(); int productId = Convert.ToInt32(Request.Form["Product_Id"]); bool isPro = (Request.Form["Type"] ?? "") == "product"; _tableHistoryMgr = new TableHistoryMgr(connectionString); _tableHistoryItemMgr = new TableHistoryItemMgr(connectionString); TableHistory query = new TableHistory { pk_value = productId.ToString() }; if (isPro) { query.table_name = "product"; } TableHistory lastRec = _tableHistoryMgr.QueryLastModifyByProductId(query); if (lastRec != null) { List<TableHistory> histories = _tableHistoryMgr.Query(new TableHistory { batchno = lastRec.batchno }); if (histories != null && histories.Count > 0) { List<string> tbls = histories.GroupBy(m => m.table_name).Select(m => m.Key).ToList(); uint site = 0, level = 0, userid = 0; string[] priceTable = { "price_master", "item_price" }; if (isPro) { tbls.RemoveAll(m => priceTable.Contains(m)); } else { uint.TryParse(Request.Form["Site_id"], out site); uint.TryParse(Request.Form["User_Level"], out level); uint.TryParse(Request.Form["User_id"], out userid); tbls.RemoveAll(m => !priceTable.Contains(m)); } List<TableHistoryItem> items; #region 初始化 StringBuilder pro = new StringBuilder(); StringBuilder spec = new StringBuilder(); StringBuilder category = new StringBuilder(); StringBuilder item = new StringBuilder(); StringBuilder master = new StringBuilder(); StringBuilder price = new StringBuilder(); NotificationController notification = new NotificationController(); #endregion foreach (var tbl in tbls) { string tblName = tbl.ToString().ToLower(); bool isAdd = false; #region 針對不同表的處理 switch (tblName) { case "product": #region PRODUCT items = _tableHistoryItemMgr.Query4Batch(new TableHistoryItemQuery { batchno = lastRec.batchno, table_name = tblName }); if (items != null && items.Count > 0) { StringBuilder column_1 = new StringBuilder("<tr><td style=\"border:1px solid #99bce8;\">欄位名稱</td>"); StringBuilder column_2 = new StringBuilder("<tr><td style=\"border:1px solid #99bce8;\">修改前</td>"); StringBuilder column_3 = new StringBuilder("<tr><td style=\"border:1px solid #99bce8;\">修改後</td>"); Array cols = items.GroupBy(m => m.col_name).Select(m => m.Key).ToArray(); foreach (var col in cols) { var tmp = items.FindAll(m => m.col_name == col.ToString()); if (tmp.Count == 1 && string.IsNullOrEmpty(tmp.FirstOrDefault().old_value)) { continue; } else { tmp.Remove(tmp.Find(m => string.IsNullOrEmpty(m.old_value))); var first = tmp.FirstOrDefault(); var last = tmp.LastOrDefault(); if (first == last) { notification.GetParamCon(last, true); } else { notification.GetParamCon(first, true); } notification.GetParamCon(last, false); column_1.AppendFormat("<td style=\"border:1px solid #99bce8;\">{0}</td>", first.col_chsname); column_2.AppendFormat("<td style=\"border:1px solid #99bce8;color:Red;\">{0}</td>", first == last ? last.old_value : first.old_value);//class=\"red\" column_3.AppendFormat("<td style=\"border:1px solid #99bce8;color:green;\">{0}</td>", last.col_value);//class=\"green\" isAdd = true; } } if (isAdd) { pro.AppendFormat("<table style=\"width:180px;text-align:center;font-size: 13px;border:1px solid #99bce8;\">{0}</tr>{1}</tr>{2}</tr></table>", column_1, column_2, column_3);//class=\"tbptstyle\" } } #endregion break; case "product_spec": #region SPEC StringBuilder spec_1 = new StringBuilder("<tr><td style=\"border:1px solid #99bce8;\">修改前</td>"); StringBuilder spec_2 = new StringBuilder("<tr><td style=\"border:1px solid #99bce8;\">修改後</td>"); Array specIds = histories.FindAll(m => m.table_name.ToLower() == tblName).GroupBy(m => m.pk_value).Select(m => m.Key).ToArray(); foreach (var id in specIds) { items = _tableHistoryItemMgr.Query4Batch(new TableHistoryItemQuery { batchno = lastRec.batchno, table_name = tblName, pk_value = id.ToString() }); if (items.Count == 1 && string.IsNullOrEmpty(items.FirstOrDefault().old_value)) { continue; } else { items.Remove(items.Find(m => string.IsNullOrEmpty(m.old_value))); var first = items.FirstOrDefault(); var last = items.LastOrDefault(); spec_1.AppendFormat("<td class=\"red\" style=\"border:1px solid #99bce8;color:Red;\">{0}</td>", first == last ? last.old_value : first.old_value); spec_2.AppendFormat("<td class=\"green\" style=\"border:1px solid #99bce8;color:green;\">{0}</td>", last.col_value); isAdd = true; } } if (isAdd) { spec.AppendFormat("<table style=\"width:180px;text-align:center;font-size: 13px;border:1px solid #99bce8;\">{0}</tr>{1}</tr></table>", spec_1, spec_2);//class=\"tbptstyle\" } #endregion break; case "product_category_set": #region CATEGORY items = _tableHistoryItemMgr.Query4Batch(new TableHistoryItemQuery { batchno = lastRec.batchno, table_name = tblName, pk_value = productId.ToString() }); if (items.Count > 0) { var first = items.FirstOrDefault(); var last = items.LastOrDefault(); category.Append("<table style=\"width:180px;text-align:center;font-size: 13px;border:1px solid #99bce8;\"><tr><td style=\"border:1px solid #99bce8;\">修改前</td><td style=\"border:1px solid #99bce8;\">修改後</td></tr>");// class=\"tbptstyle\" category.AppendFormat("<tr><td class=\"red\" style=\"border:1px solid #99bce8;color:Red;\">{0}</td>", first == last ? last.old_value : first.old_value); category.AppendFormat("<td class=\"green\" style=\"border:1px solid #99bce8;color:green;\">{0}</td></td></table>", last.col_value); } #endregion break; case "product_item": #region ITEM ProductItem pItem; _productItemMgr = new ProductItemMgr(connectionString); Array itemIds = histories.FindAll(m => m.table_name.ToLower() == tblName).GroupBy(m => m.pk_value).Select(m => m.Key).ToArray(); foreach (var id in itemIds) { isAdd = false; pItem = _productItemMgr.Query(new ProductItem { Item_Id = uint.Parse(id.ToString()) }).FirstOrDefault(); if (pItem != null) { string title = pItem.GetSpecName(); string top = "<div style=\"float:left\"><table style=\"width:180px;text-align:center;font-size: 13px;border:1px solid #99bce8;\"><caption style=\"text-align:center;border:1px solid #99bce8;\">" + title + "</caption><tr><td style=\"border:1px solid #99bce8;\">欄位名稱</td><td style=\"border:1px solid #99bce8;\">修改前</td><td style=\"border:1px solid #99bce8;\">修改后</td></tr>";//class=\"tbstyle\" string bottom = "</table></div>"; string strContent = "<tr><td style=\"border:1px solid #99bce8;\">{0}</td><td class=\"red\" style=\"border:1px solid #99bce8;color:Red;\">{1}</td><td class=\"green\" style=\"border:1px solid #99bce8;color:green;\">{2}</td></tr>"; string content = notification.BuildContent(lastRec.batchno, tblName, id.ToString(), strContent, ref isAdd); if (isAdd) { item.Append(top); item.Append(content); item.Append(bottom); } } } #endregion break; case "price_master": #region PRICE_MASTER PriceMaster pMaster; _pMaster = new PriceMasterMgr(connectionString); Array masterIds = histories.FindAll(m => m.table_name.ToLower() == tblName).GroupBy(m => m.pk_value).Select(m => m.Key).ToArray(); foreach (var id in masterIds) { isAdd = false; pMaster = _pMaster.Query(new PriceMaster { price_master_id = uint.Parse(id.ToString()) }).FirstOrDefault(); if (pMaster != null && pMaster.site_id == site && pMaster.user_level == level && pMaster.user_id == userid) { string siteName = notification.QuerySiteName(pMaster.site_id.ToString()); string userLevel = notification.QueryParaName(pMaster.user_level.ToString(), "UserLevel"); string userMail = pMaster.user_id == 0 ? "" : notification.QueryMail(pMaster.user_id.ToString()); string childName = string.Empty; if (pMaster.child_id != 0 && pMaster.product_id != pMaster.child_id) { _productMgr = new ProductMgr(connectionString); Product tmpPro = _productMgr.Query(new Product { Product_Id = Convert.ToUInt32(pMaster.child_id) }).FirstOrDefault(); if (tmpPro != null) { childName = tmpPro.Product_Name; } } string title = siteName + " + " + userLevel + (string.IsNullOrEmpty(userMail) ? "" : (" + " + userMail)) + (string.IsNullOrEmpty(childName) ? "<br/>" : "<br/>子商品: " + childName); if (!title.Contains("子商品")) { title += "<br/>"; } string top = "<div style=\"float:left\"><table style=\"width:180px;text-align:center;font-size: 13px;border:1px solid #99bce8;\"><caption style=\"text-align:center;border:1px solid #99bce8;\">" + title + "</caption><tr><td style=\"border:1px solid #99bce8;\">欄位名稱</td><td style=\"border:1px solid #99bce8;\">修改前</td><td style=\"border:1px solid #99bce8;\">修改后</td></tr>";// class=\"tbstyle\" string bottom = "</table></div>"; string strContent = "<tr><td style=\"border:1px solid #99bce8;\">{0}</td><td class=\"red\" style=\"border:1px solid #99bce8;color:Red;\">{1}</td><td class=\"green\" style=\"border:1px solid #99bce8;color:green;\">{2}</td></tr>"; string content = notification.BuildContent(lastRec.batchno, tblName, id.ToString(), strContent, ref isAdd); if (isAdd) { master.Append(top); master.Append(content); master.Append(bottom); } } } #endregion break; case "item_price": #region ITEM_PRICE ItemPriceCustom itemPrice; PriceMaster tmpMaster; _itemPriceMgr = new ItemPriceMgr(connectionString); _pMaster = new PriceMasterMgr(connectionString); Array priceIds = histories.FindAll(m => m.table_name.ToLower() == tblName).GroupBy(m => m.pk_value).Select(m => m.Key).ToArray(); foreach (var id in priceIds) { isAdd = false; itemPrice = _itemPriceMgr.Query(new ItemPrice { item_price_id = uint.Parse(id.ToString()) }).FirstOrDefault(); if (itemPrice != null) { tmpMaster = _pMaster.Query(new PriceMaster { price_master_id = itemPrice.price_master_id }).FirstOrDefault(); if (tmpMaster != null && tmpMaster.site_id == site && tmpMaster.user_level == level && tmpMaster.user_id == userid) { string siteName = notification.QuerySiteName(tmpMaster.site_id.ToString()); string userLevel = notification.QueryParaName(tmpMaster.user_level.ToString(), "UserLevel"); string userMail = tmpMaster.user_id == 0 ? "" : notification.QueryMail(tmpMaster.user_id.ToString()); string childName = string.Empty; if (tmpMaster.child_id != 0 && tmpMaster.product_id != tmpMaster.child_id) { _productMgr = new ProductMgr(connectionString); Product tmpPro = _productMgr.Query(new Product { Product_Id = Convert.ToUInt32(tmpMaster.child_id) }).FirstOrDefault(); if (tmpPro != null) { childName = tmpPro.Product_Name; } } string strSpec = itemPrice.spec_name_1 + (string.IsNullOrEmpty(itemPrice.spec_name_2) ? "" : (" + " + itemPrice.spec_name_2)); string title = siteName + " + " + userLevel + (string.IsNullOrEmpty(userMail) ? "" : (" + " + userMail)) + (string.IsNullOrEmpty(childName) ? "<br/>" : "<br/>子商品: " + childName) + "<br/>" + strSpec; if (strSpec == "") { title += "<br/>"; } string top = "<div style=\"float:left\"><table style=\"width:180px;text-align:center;font-size: 13px;border:1px solid #99bce8;\"><caption style=\"text-align:center;border:1px solid #99bce8;\">" + title + "</caption><tr><td style=\"border:1px solid #99bce8;\">欄位名稱</td><td style=\"border:1px solid #99bce8;\">修改前</td><td style=\"border:1px solid #99bce8;\">修改后</td></tr>";//class=\"tbstyle\" string bottom = "</table></div>"; string strContent = "<tr><td style=\"border:1px solid #99bce8;\">{0}</td><td class=\"red\" style=\"border:1px solid #99bce8;color:Red;\">{1}</td><td class=\"green\" style=\"border:1px solid #99bce8;color:green;\">{2}</td></tr>"; string content = notification.BuildContent(lastRec.batchno, tblName, id.ToString(), strContent, ref isAdd); if (isAdd) { price.Append(top); price.Append(content); price.Append(bottom); } } } } #endregion break; default: break; } #endregion } #region 批次拼接 StringBuilder batchHtml = new StringBuilder(); if (pro.Length > 0) { batchHtml.AppendFormat("<tr><td style=\"border:1px solid #99bce8;\">商品信息</td><td style=\"border:1px solid #99bce8;\">{0}</td></tr>", pro); } if (spec.Length > 0) { batchHtml.AppendFormat("<tr><td style=\"border:1px solid #99bce8;\">規格信息</td><td style=\"border:1px solid #99bce8;\">{0}</td></tr>", spec); } if (category.Length > 0) { batchHtml.AppendFormat("<tr><td style=\"border:1px solid #99bce8;\">前臺分類信息</td><td style=\"border:1px solid #99bce8;\">{0}</td></tr>", category); } if (item.Length > 0) { batchHtml.AppendFormat("<tr><td style=\"border:1px solid #99bce8;\">商品細項信息</td><td style=\"border:1px solid #99bce8;\">{0}</td></tr>", item); } if (master.Length > 0) { batchHtml.AppendFormat("<tr><td style=\"border:1px solid #99bce8;\">站臺商品信息</td><td style=\"border:1px solid #99bce8;\">{0}</td></tr>", master); } if (price.Length > 0) { batchHtml.AppendFormat("<tr><td style=\"border:1px solid #99bce8;\">站臺價格信息</td><td style=\"border:1px solid #99bce8;\">{0}</td></tr>", price); }; if (batchHtml.Length > 0) { _productMgr = new ProductMgr(connectionString); Product product = _productMgr.Query(new Product { Product_Id = Convert.ToUInt32(productId) }).FirstOrDefault(); if (product != null) { string brand = string.Empty; vbMgr = new VendorBrandMgr(connectionString); VendorBrand vendorBrand = vbMgr.GetProductBrand(new VendorBrand { Brand_Id = product.Brand_Id }); if (vendorBrand != null) { brand = vendorBrand.Brand_Name; } _historyBatchMgr = new HistoryBatchMgr(connectionString); HistoryBatch batch = _historyBatchMgr.Query(new HistoryBatch { batchno = lastRec.batchno }); html.Append("<html><head><style type=\"text/css\">table{ font-size: 13px;border:1px solid #99bce8}td{border:1px solid #99bce8} .tbstyle{width:180px;text-align:center;} .red{color:Red;}.green{color:green;} caption{text-align:center;border:1px solid #99bce8}</style></head><body>"); html.AppendFormat("<table style=\"font-size: 13px;border:1px solid #99bce8;\"><tr><td colspan='2' style=\"border:1px solid #99bce8;\">商品編號:<b>{0}</b> 品牌:<b>{1}</b></td></tr>", productId, brand); html.AppendFormat("<tr><td colspan='2' style=\"border:1px solid #99bce8;\"><b>{0}</b> (修改人:{1}", product.Product_Name, batch.kuser); html.AppendFormat(",修改時間:{0})</td></tr>", batch.kdate.ToString("yyyy/MM/dd HH:mm:ss")); html.Append(batchHtml); html.Append("</table>"); html.Append("</body></html>"); } } #endregion } result = "{success:true,html:'" + HttpUtility.HtmlEncode(html.ToString()) + "'}"; } else { result = "{success:true,html:''}"; } } } catch (Exception ex) { Log4NetCustom.LogMessage logMessage = new Log4NetCustom.LogMessage(); logMessage.Content = string.Format("TargetSite:{0},Source:{1},Message:{2}", ex.TargetSite.Name, ex.Source, ex.Message); logMessage.MethodName = System.Reflection.MethodBase.GetCurrentMethod().Name; log.Error(logMessage); result = "{success:true,html:''}"; } this.Response.Clear(); this.Response.Write(result); this.Response.End(); return this.Response; }
//add by wwei0216w 2015/1/22 /// <summary> /// 根據批次號獲得該彼此相關記錄 /// </summary> /// <param name="th">條件</param> /// <returns>IEnumerable<IGrouping<string,TableHistoryItemCustom>></returns> public List<TableHistoryItemCustom> GetHistoryInfoByConditon(TableHistory th) { try { List<TableHistoryItemCustom> result = new List<TableHistoryItemCustom>(); //根據批次獲得符合條件的歷史操作記錄集合 DataTable dt = _tableHistoryItemDao.GetHistoryInfoByCondition(th); foreach (DataRow dr in dt.Rows) { if (result.FindIndex(p=>p.table_name == dr["table_name"].ToString())>=0) continue; TableHistoryItemCustom thic = new TableHistoryItemCustom(); thic.batchno = dr["batchno"].ToString(); thic.functionname = dr["functionName"].ToString(); thic.pk_name = dr["PK_name"].ToString(); thic.pk_value = dr["PK_value"].ToString(); thic.table_name = dr["table_name"].ToString(); foreach (DataRow dr1 in dt.Rows) { if(dr1["table_name"].ToString() != dr["table_name"].ToString()) continue; TableHistoryItem thi = new TableHistoryItem(); thi.col_chsname = dr1["col_chsName"].ToString(); thi.col_name = dr1["col_name"].ToString(); thi.col_value = dr1["col_value"].ToString(); thi.old_value = dr1["old_value"].ToString(); thi.rowid = Int32.Parse(dr1["rowid"].ToString()); thi.tablehistoryid = Int32.Parse(dr1["rowid"].ToString()); thi.type = Int32.Parse(dr1["type"].ToString()); thic.historyItem.Add(thi); } result.Add(thic); } return result; } catch (Exception ex) { throw new Exception("TableHistoryItemMgr-->GetHistoryInfoByConditon" + ex.Message, ex); } }
//add by wwei0216w 2015/1/20 /// <summary> /// 根據條件獲得批次號 /// </summary> /// <param name="th">條件</param> public List<TableHistoryCustom> QueryBatchno(TableHistory th, out int total) { try { StringBuilder sb = new StringBuilder(); StringBuilder sb2 =new StringBuilder(); // sb.AppendFormat(@"SELECT DISTINCT th.batchno,mu.user_username,tb.kdate FROM t_table_history th // LEFT JOIN t_history_batch tb ON tb.batchno = th.batchno // LEFT JOIN manage_user mu ON mu.user_email = tb.kuser // WHERE th.table_name = '{0}' AND th.pk_value = {1}", th.table_name, th.pk_value); // sb2.AppendFormat(" ORDER BY tb.kdate DESC LIMIT {0},{1}", th.Start, th.Limit); //edit by wwei0216w 2015/6/18 注:之前語句查詢時間超過1秒,新語句查詢時間降至0.1秒 //edit by wwei0216w 2015/7/06 第二次修改 注:歷史記錄查詢 之前使用對應表的主鍵進行查詢,為查詢方便,現統一使用product_id,因此th.pk_value 為前臺text中輸入的值 sb.AppendFormat(@"SELECT DISTINCT tb.batchno,mu.user_username,tb.kuser,tb.kdate FROM t_history_batch tb INNER JOIN t_table_history th ON th.batchno = tb.batchno AND th.table_name = '{0}' AND SUBSTRING_INDEX(th.batchno,'_',-1) = {1} LEFT JOIN manage_user mu ON mu.user_id = tb.kuser WHERE SUBSTRING_INDEX(tb.batchno,'_',-1) = {1} ", th.table_name, th.pk_value); sb2.AppendFormat(@" ORDER BY tb.kdate DESC LIMIT {0},{1}", th.Start, th.Limit); List<TableHistoryCustom> listSum = _dbAccess.getDataTableForObj<TableHistoryCustom>(sb.ToString()); List<TableHistoryCustom> list = _dbAccess.getDataTableForObj<TableHistoryCustom>(sb.ToString() + sb2.ToString()); total = listSum.Count;//獲得結果總數 return list; } catch (Exception ex) { throw new Exception("TableHistoryDao-->QueryBatchno" + ex.Message, ex); } }
/// <summary> /// 根據條件獲得歷史記錄信息 /// </summary> /// <param name="th">查詢條件</param> /// <returns>符合條件的集合</returns> public DataTable GetHistoryInfoByCondition(TableHistory th) { StringBuilder sb = new StringBuilder(); try { sb.Append(@"SELECT th.rowid,th.table_name,f.functionName,th.PK_name,th.PK_value,th.batchno,item.col_name,item.col_chsName,item.col_value,item.old_value,item.type FROM t_table_history th LEFT JOIN t_table_historyitem item ON th.rowid = item.tableHistoryId LEFT JOIN t_function f ON f.rowid =th.functionId "); sb.AppendFormat(" WHERE th.batchno IN ('{0}') ORDER BY table_name DESC", th.batchno); return _dbAccess.getDataTable(sb.ToString()); } catch (Exception ex) { throw new Exception("TableHistoryItemDao-->GetHistoryInfoByCondition" + ex.Message, ex); } }