using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Http; using System.Web.Http; using PagedList; using Newtonsoft.Json; using System.Collections; using DocumentFormat.OpenXml.Office2010.Excel; using MyWeb; using System.Data.Entity; // api/Follower //[ezAuthorize(Roles = "admin")]//群組:* [ezAuthorize] //[RoutePrefix("api/follower")] public class FollowerController : ApiController { private Model.ezEntities _db = new Model.ezEntities(); // GET api/ public IEnumerable Get() { var list = _db.followers.ToList(); if (list == null) throw new HttpResponseException(HttpStatusCode.NotFound); return list; } public IEnumerable Get(int page, int pageSize = 10, string sortBy="", bool sortDesc=false) { var list = _db.followers.OrderBy(o=>o.f_number).ToPagedList(page, pageSize); if (list == null) throw new HttpResponseException(HttpStatusCode.NotFound); return list; } // GET api//5 public Model.follower Get(int id) { var item = _db.followers.Where(q => q.num == id).FirstOrDefault(); //if (item == null) throw new HttpResponseException(HttpStatusCode.NotFound); return item; } // POST api/ public void Post([FromBody] Model.follower item) { } // PUT api//5 public void Put(int id, [FromBody] Model.follower item) { } // DELETE api//5 public void Delete(int id) { var prod = _db.followers.AsEnumerable().Where(q => q.num == id).FirstOrDefault(); //刪除該筆資料 /*if (prod != null) { prod.pro_order_detail.Clear(); // Clear 方法來清除相關聯的 Child 資料,針對選擇性關聯欄位,它就會自動將欄位值更新成 null。 prod.pro_order.Clear(); prod.leader = null;//清空leader _db.followers.Remove(prod); _db.SaveChanges();//執行 Model.admin_log admin_log = new Model.admin_log(); MyWeb.admin admin = new MyWeb.admin();//api裡不可以用MyWeb if (admin.isLoign()) { admin_log.writeLog(admin.info.u_id, (int)Model.admin_log.Systems.Follower, (int)Model.admin_log.Status.Delete, prod.f_number+prod.u_name); } }*/ if (prod != null) { ////prod.IsDel = true; ////不確定是否新增欄位? 先註解 _db.SaveChanges(); Model.admin_log admin_log = new Model.admin_log(); MyWeb.admin admin = new MyWeb.admin();//api裡不可以用MyWeb if (admin.isLoign()) { admin_log.writeLog(admin.info.u_id, (int)Model.admin_log.Systems.Follower, (int)Model.admin_log.Status.Delete, prod.f_number + prod.u_name); } } } [HttpDelete] [Route("api/follower/Delete/{nums}")] public void Delete(string nums) { if (!string.IsNullOrEmpty(nums)) { var getDelItem = nums.TrimEnd(',').Split(',').Select(s => int.Parse(s)); var prod = _db.followers.AsEnumerable().Where(q => getDelItem.Contains(q.num)).ToList(); if (prod.Count() > 0) { foreach (var item in prod) { foreach (var item2 in item.pro_order_detail1) item2.from_id = null; //清空訂單明細的陽上報恩者from_id //f_num設定串聯刪除 foreach (var item2 in item.pro_order) item2.introducer = null; item.leader = null;//清空leader } _db.followers.RemoveRange(prod); _db.SaveChanges(); Model.admin_log admin_log = new Model.admin_log(); MyWeb.admin admin = new MyWeb.admin();//api裡不可以用MyWeb if (admin.isLoign()) { admin_log.writeLog(admin.info.u_id, (int)Model.admin_log.Systems.Follower, (int)Model.admin_log.Status.Delete, admin_log.LogViewBtn(prod.Select(x => x.f_number + x.u_name).ToList())); } } } } [HttpGet] [Route("api/follower/count")] public int Count() { var count = _db.followers.Count(); return count; } [HttpPost] [Route("api/follower/GetList")] public IHttpActionResult GetList([FromBody] Model.ViewModel.follower q, int page, int pageSize = 10, string sortBy = "", bool sortDesc = false) { ////var qry = _db.followers.Where(a => a.IsDel == false).AsEnumerable();////不確定是否新增欄位? 先註解 var qry = _db.followers.AsEnumerable(); if (!string.IsNullOrEmpty(q.f_number)) qry = qry.Where(o => o.f_number.Contains(q.f_number.Trim())); if (!string.IsNullOrEmpty(q.u_name)) qry = qry.Where(o => o.u_name.Contains(q.u_name.Trim())); if (q.birthday.HasValue) qry = qry.Where(o => o.birthday >= q.birthday.Value); if (q.birthday2.HasValue) qry = qry.Where(o => o.birthday < Convert.ToDateTime(q.birthday2.Value).AddDays(1)); if (!string.IsNullOrEmpty(q.address)) qry = qry.Where(o => o.address !=null && o.address.Contains(q.address?.Trim())); //if (q.num.HasValue && q.num.Value>0) // qry = qry.Where(o => o.num==q.num.Value); if (q.ept_self.HasValue && q.ept_self.Value )//排除自己 { qry = qry.Where(o => o.num != q.num.Value); } if (!string.IsNullOrEmpty(q.country)) qry = qry.Where(o => o.country== q.country); if (!string.IsNullOrEmpty(q.country2)) { if (q.country2 == "1") { qry = qry.Where(o => o.country == "158"); }else if (q.country2 == "2") { qry = qry.Where(o => o.country != "158"); } } if (sortBy.Equals("f_number")) { if (sortDesc) qry = qry.OrderByDescending(o => o.f_number); else qry = qry.OrderBy(o => o.f_number); } else if (sortBy.Equals("u_name")) { if (sortDesc) qry = qry.OrderByDescending(o => o.u_name); else qry = qry.OrderBy(o => o.u_name); } else if (sortBy.Equals("identity_type_desc")) { if (sortDesc) qry = qry.OrderByDescending(o => o.identity_type); else qry = qry.OrderBy(o => o.identity_type); } else if (sortBy.Equals("sex")) { if (sortDesc) qry = qry.OrderByDescending(o => o.sex); else qry = qry.OrderBy(o => o.sex); } else if (sortBy.Equals("birthday")) { if (sortDesc) qry = qry.OrderByDescending(o => o.birthday); else qry = qry.OrderBy(o => o.birthday); } else qry = qry.OrderByDescending(o => o.num); MyWeb.encrypt encrypt = new MyWeb.encrypt(); var tdesc = publicFun.enum_desc(); var count = qry.Count(); //pageSize = count;//一次取回?? var ret = new { list = qry.ToPagedList(page, pageSize).Select(x => new { num = x.num, f_number = x.f_number, u_name = x.u_name, sex = x.sex, birthday = x.birthday, //?.ToString("yyyy/MM/dd"), birthday2 = publicFun.chagenDate(x.birthday), //?.ToString("yyyy/MM/dd"), sign = Model.follower.chagenSign(x.birthday), //NULL?? sexagenary = Model.follower.sexagenary(x.birthday), identity_type = x.identity_type, //identity_type_string = Enum.GetName( typeof(Model.follower.type), x.identity_type), //identity_type_string1 = ((Model.follower.type)(x.identity_type??0)).ToString(), identity_type_desc = tdesc[x.identity_type ?? 1] ,//TryGetValue.. phone = x.phone, phoneDes = encrypt.DecryptAutoKey(x.phone), //--MyWeb.function X refugedate=x.refugedate, refuge_name = x.refuge_name, email = x.email, address = x.address, cellphone = x.cellphone, cellphoneDes = encrypt.DecryptAutoKey(x.cellphone), }), count = count }; /* SQL: SELECT [Extent1].[num] AS [num], [Extent1].[f_number] AS [f_number], [Extent1].[u_name] AS [u_name], [Extent1].[sex] AS [sex], [Extent1].[identity_type] AS [identity_type], [Extent1].[birthday] AS [birthday], [Extent1].[phone] AS [phone], [Extent1].[email] AS [email], [Extent1].[refugedate] AS [refugedate], [Extent1].[refuge_name] AS [refuge_name], [Extent1].[address] AS [address], [Extent1].[demo] AS [demo], [Extent1].[nation] AS [nation], [Extent1].[leader] AS [leader] FROM [dbo].[followers] AS [Extent1] */ //LINQ查詢必需要寫成: 能轉成SQL指令的查詢, 故小心呼叫自訂函數(或無法) //要學會用原生的寫法, 新式的寫法, 東西都往 MyWeb.function 裡塞, 是錯的, 要思考其合理性 //API應該儘量提供資料而不是"格式" //日期轉字串: 如要用VUE做, 傳回date而不要tostring, 用filter + moment.js做 if (ret.list == null) throw new HttpResponseException(HttpStatusCode.NotFound); return Ok(ret); } /* write a post action: checkHashFollower input: phone, idcode pass to encrypt.cs: followerHash, get hash query db: followers where follower_hash==hash to follower output: follower (or null) */ [HttpPost] [Route("api/follower/GetFamilyList")] public IHttpActionResult GetFamilyList([FromBody] Model.ViewModel.follower q, int page, int pageSize = 10, string sortBy = "", bool sortDesc = false) { int _follower = q.num.HasValue && q.num.Value > 0 ? q.num.Value : 0; if (_follower > 0) { //家族 : 家長是我的人,跟我同家長的人,我的家長本人,我本人 //var cc = _db.followers.AsEnumerable().Where(x => x.num == 103 || x.leader == 103).Select(x => x.num); //var aa = _db.followers.Where(x => x.num == 103 || x.leader == 103).Select(x => x.num); //var bb = _db.followers.Where(i => aa.Any(x => x == i.num) || aa.Any(x => x == i.leader)).ToList(); int myLeader = _db.followers.Where(x => x.num == _follower).Select(x => x.leader??0).FirstOrDefault(); //我的家長 var cc = _db.followers.Where(x => x.num == _follower || x.leader == _follower).Select(x => x.num); //var qry = //from c in foDt //where c.leader == _follower || // ((from o in foDt // where o.num == _follower // select o.leader).Contains(c.leader) && c.leader != null) || // (from o in foDt // where o.num == _follower // select o.leader).Contains(c.num) || // c.num == _follower //select c; if (q.ept_self.HasValue && q.ept_self.Value) //排除自己 { //qry = //from c in foDt //where c.leader == _follower || // ((from o in foDt // where o.num == _follower // select o.leader).Contains(c.leader) && c.leader != null) // && c.num != _follower //select c; if (myLeader > 0)//有家長 { //跟我同家長的人 cc = _db.followers.Where(x => x.num != _follower && (x.leader == _follower || x.leader == myLeader)).Select(x => x.num); } else { cc = _db.followers.Where(x => x.num != _follower && x.leader == _follower).Select(x => x.num); } } //int ccc = cc.Count(); var qry = _db.followers.AsEnumerable().Where(f => cc.Any(x => x == f.num) || cc.Any(x => x == f.leader)); if (!string.IsNullOrEmpty(q.f_number)) qry = qry.Where(o => o.f_number.Contains(q.f_number.Trim())); if (!string.IsNullOrEmpty(q.u_name)) qry = qry.Where(o => o.u_name.Contains(q.u_name.Trim())); if (q.birthday.HasValue) qry = qry.Where(o => o.birthday >= q.birthday.Value); if (q.birthday2.HasValue) qry = qry.Where(o => o.birthday < Convert.ToDateTime(q.birthday2.Value).AddDays(1)); if (!string.IsNullOrEmpty(q.address)) qry = qry.Where(o => o.address.Contains(q.address.Trim())); qry = qry.OrderByDescending(o => o.num); MyWeb.encrypt encrypt = new MyWeb.encrypt(); var tdesc = publicFun.enum_desc(); int i = 1; var count = qry.Count(); //pageSize = count;//一次取回?? var ret = new { list = qry.ToPagedList(page, pageSize).Select(x => new { id = i++, num = x.num, f_number = x.f_number, u_name = x.u_name, address = x.address, birthday = x.birthday, phone = x.phone, phoneDes = encrypt.DecryptAutoKey(x.phone), demo = x.demo, identity_type_desc = tdesc[x.identity_type ?? 1], f_num_selected = new { text = x.u_name, val = x.num, }, //data_tmp = new //tmp 暫存用 //{ // f_num_selected = new // { // text = x.u_name, // val = x.num, // }, // identity_type_desc = tdesc[x.identity_type ?? 1], // birthday = x.birthday, // phoneDes = encrypt.DecryptAutoKey(x.phone), // demo = x.demo, //}, appellation_id_selected = new { text = x.appellation?.title, val = x.appellation_id, }, }), count = count }; if (ret.list == null) throw new HttpResponseException(HttpStatusCode.NotFound); return Ok(ret); } else { return Ok("此訂單沒有姓名/名稱"); } } [HttpPost] [Route("api/follower/familySave")] public IHttpActionResult SaveDetailData([FromBody] Model.ViewModel.follower item) { if (item.leader.HasValue && item.leader.Value > 0 && item.f_num.HasValue && item.f_num.Value > 0) { if (item.num.HasValue && item.num.Value > 0) { //原先就有設定家長 , -> 家人 :不變 or 變更 if (item.num.Value == item.f_num.Value) { //變更其家人稱謂 Model.follower _data = _db.followers.Where(q => q.num == item.f_num.Value).FirstOrDefault();//修改 if (_data != null) { _data.appellation_id = item.appellation_id.Value; _db.SaveChanges(); var ret = _data.num; return Ok(ret); } else return NotFound(); } else { //移除原先的家長設定 Model.follower _data2 = _db.followers.Where(q => q.num == item.num.Value).FirstOrDefault();//修改 if (_data2 != null) { _data2.leader = null; _data2.appellation_id = null; _db.SaveChanges(); } //變更其家長設定 Model.follower _data = _db.followers.Where(q => q.num == item.f_num.Value).FirstOrDefault();//修改 if (_data != null) { _data.leader = item.leader.Value; _data.appellation_id = item.appellation_id.Value; _db.SaveChanges(); var ret = _data.num; return Ok(ret); } else return NotFound(); } } else { //新增家人 //變更其家長設定 Model.follower _data = _db.followers.Where(q => q.num == item.f_num.Value).FirstOrDefault();//修改 if (_data != null) { _data.leader = item.leader.Value; _data.appellation_id = item.appellation_id.Value; _db.SaveChanges(); var ret = _data.num; return Ok(ret); } else return NotFound(); } } else { return NotFound(); } } [HttpPost] [Route("api/follower/familyDelete")] public IHttpActionResult familyDelete([FromBody] Model.ViewModel.follower item) { if (item.leader.HasValue && item.leader.Value > 0 && item.num.HasValue && item.num.Value > 0) { //移除原先的家長設定 Model.follower _data2 = _db.followers.Where(q => q.num == item.num.Value).FirstOrDefault();//修改 if (_data2 != null) { _data2.leader = null; _db.SaveChanges(); return Ok(); } else return NotFound(); } else { return NotFound(); } } [HttpPost] [Route("api/follower/GetTabletList")] public IHttpActionResult GetTabletList([FromBody] Model.follower q, int page, int pageSize = 10, string sortBy = "", bool sortDesc = false) { int _follower = q.num; pageSize = (pageSize < 0) ? 0 : pageSize; if (_follower > 0) { var qry = _db.followers_tablet.AsEnumerable().Where(x=>( x.f_num??0) == _follower); qry = qry.OrderByDescending(o => o.num); var count = qry.Count(); //pageSize = count;//一次取回?? int i = 1; var ret = new { list = qry.ToPagedList(page, pageSize).Select(x => new { id = i++, num = x.num, f_num = x.f_num, type = x.type, title = x.title, }), count = count }; if (ret.list == null) throw new HttpResponseException(HttpStatusCode.NotFound); return Ok(ret); } return NotFound(); } [HttpPost] [Route("api/follower/tabletSave")] public IHttpActionResult tabletSave([FromBody] Model.ViewModel.followers_tablet item) { if (item.num.HasValue && item.num.Value > 0) { //變更 Model.followers_tablet _data = _db.followers_tablet.Where(q => q.num == item.num.Value).FirstOrDefault();//修改 if (_data != null) { _data.type = item.type; _data.title = item.title; _db.SaveChanges(); var ret = _data.num; return Ok(ret); } else return NotFound(); } else { //新增 Model.followers_tablet _data = new Model.followers_tablet(); _data.f_num = item.f_num; _data.type = item.type; _data.title = item.title; _db.followers_tablet.Add(_data); _db.SaveChanges(); var ret = _data.num; return Ok(ret); } } [HttpDelete] [Route("api/follower/tabletDelete/{id}")] public void tabletDelete(int id) { var prod = _db.followers_tablet.AsEnumerable().Where(q => q.num == id).FirstOrDefault(); //刪除該筆資料 if (prod != null) { _db.followers_tablet.Remove(prod); _db.SaveChanges();//執行 } } [HttpPost] [Route("api/follower/checkHashFollower")] public IHttpActionResult CheckHashFollower([FromBody] dynamic request) { if (request == null || request.phone == null || request.id_code == null) { return BadRequest("Invalid input"); } string phone = request.phone; string id_code = request.id_code; // Pass phone and idcode to encrypt.cs to get the followerHash encrypt enc = new encrypt(); string followerHash = enc.followerHash(phone, id_code); // Query the database for followers where follower_hash == followerHash var follower = _db.followers.FirstOrDefault(f => f.follower_hash == followerHash); // Return the follower or null return Ok(follower); } [HttpPost] [Route("api/follower/orderrecord")] public IHttpActionResult GetOrderRecord(int id = 0) { //獲取信眾報名活動記錄 if (id == 0) { return Ok(); } var orderrecord = _db.pro_order.Where(x => x.f_num == id).Include(x => x.pro_order_detail).Include(x => x.follower).ToList(); var data = new { list = orderrecord.Select(x => new { orderno = x.order_no, startdate = x.reg_time, endtime = x.up_time, pwcount = x.pro_order_detail.Where(a => a.actItem.act_bom.Where(b => b.item_num == a.actItem_num && b.package_num == null).Count() == 0).Count(), amount = x.pro_order_detail.Select(o => (float?)o.price).Sum(), activityname = x.activity.subject, category = x.activity.activity_category_kind.kind, order_item = x.pro_order_detail.Where(b => b.parent_num == null).Select(c => c.actItem.subject).Distinct().ToList(), }) }; return Ok(data); } [HttpPost] [Route("api/follower/totalorderamount")] public IHttpActionResult GetTotalOrderCount(int id) { //獲取信眾的報名次數和報名總功德金 var orderList = _db.pro_order.Where(x => x.f_num == id).Select(x => x.order_no).ToList(); var totalprice = _db.pro_order_detail.Where(d => orderList.Contains(d.order_no)).Sum(d => (float?)d.price) ?? 0; /*var totalPrice = (from d in _db.pro_order_detail join o in _db.pro_order on d.order_no equals o.order_no where o.f_num == id select d.price).Sum();*/ var activityTimes = _db.pro_order.Where(x => x.f_num == id).Count(); return Ok(new { totalamount = totalprice, activity_times = activityTimes }); } [HttpPost] [Route("api/follower/orderreordpwlist")] public IHttpActionResult GetPwList([FromUri] string orderno) { if (string.IsNullOrEmpty(orderno)) { return Ok(); } var pwlist = _db.pro_order_detail.Where(x => x.order_no == orderno).OrderBy(k => k.actItem_num).ToList(); var data = new { list = pwlist.Select(j => new { id = j.num, orderno = j.order_no, printid = j.print_id, price = j.price, pwname = j.actItem.subject, }) }; return Ok(data); } }