using DocumentFormat.OpenXml.Drawing.Charts; using DocumentFormat.OpenXml.Office2010.Excel; using Model; using MyWeb; using Newtonsoft.Json; using OfficeOpenXml.FormulaParsing.Excel.Functions.DateTime; using PagedList; using System; using System.Collections; using System.Collections.Generic; using System.Data.Entity; using System.Diagnostics; using System.Linq; using System.Net; using System.Net.Http; using System.Web.Http; using System.Web.Razor.Tokenizer; // api/Follower //[ezAuthorize(Roles = "admin")]//群組:* [ezAuthorize] //[RoutePrefix("api/follower")] public class FollowerController : ApiController { private Model.ezEntities _db = new Model.ezEntities(); // GET api/ // TODO: CRITICAL - 無參數 Get() 會載入所有信眾到內存(可能數千筆) // 建議:停用此方法,強制使用分頁版本 Get(page, pageSize) 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.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)).ToList(); var prod = _db.followers.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.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).AsQueryable();////不確定是否新增欄位? 先註解 var qry = _db.followers.AsQueryable(); 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) { var tmpBirthday2 = Convert.ToDateTime(q.birthday2.Value).AddDays(1); qry = qry.Where(o => o.birthday < tmpBirthday2); } 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"); } } // 電話/證號搜尋 (使用 search_keywords HEX 編碼) if (!string.IsNullOrEmpty(q.phone_idcode) && GlobalVariables.UseSearchKeywords) { MyWeb.encrypt enc = new MyWeb.encrypt(); string hexSearch = enc.ConvertToHex(q.phone_idcode.Trim()); if (!string.IsNullOrEmpty(hexSearch)) { qry = qry.Where(o => o.search_keywords != null && o.search_keywords.Contains(hexSearch)); } } 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 qryList = (pageSize > 0) ? qry.ToPagedList(page, pageSize).ToList() : qry.ToList(); var ret = new { list = qryList.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(); // 優化:使用子查詢在數據庫層面執行,避免載入所有家族成員 ID // 生成 SQL: WHERE num IN (SELECT...) OR leader IN (SELECT...) var qry = _db.followers.Where(f => cc.Contains(f.num) || (f.leader.HasValue && cc.Contains(f.leader.Value))); 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(); var count = qry.Count(); //pageSize = count;//一次取回?? var qryList = (pageSize > 0) ? qry.ToPagedList(page, pageSize).ToList() : qry.ToList(); int i = 1; var ret = new { list = qryList.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(); } } [HttpGet] [Route("api/follower/GetAutoEnrollList/{id}")] public IHttpActionResult GetAutoEnrollList(int id) { var prod = _db.auto_enroll.Where(q => q.f_num == id).ToList(); var ret = new { list = prod.Select(x => new { num = x.num, auto_enroll_start_date = x.start_date.ToString("yyyy-MM-dd"), auto_enroll_end_date = x.end_date.ToString("yyyy-MM-dd"), auto_enroll_receipt_title = x.receipt_title?? "", auto_enroll_receipt_address = x.receipt_address?? "", }), }; return Ok(ret); } [HttpPost] [Route("api/follower/SaveAutoEnrollList")] public IHttpActionResult SaveAutoEnrollList([FromBody] Model.auto_enroll item) { Model.auto_enroll autoEnroll; if (item.num == 0) { // ===== 新增 ===== autoEnroll = new Model.auto_enroll() { f_num = item.f_num, start_date = item.start_date, end_date = item.end_date, receipt_title = string.IsNullOrEmpty(item.receipt_title) ? null : item.receipt_title.Trim(), receipt_address = string.IsNullOrEmpty(item.receipt_address) ? null : item.receipt_address.Trim(), } ; _db.auto_enroll.Add(autoEnroll); _db.SaveChanges(); CreateOrdersForActivities(item.f_num, autoEnroll.num, item.start_date, item.end_date, item.receipt_title, item.receipt_address); } else { // ===== 更新 ===== autoEnroll = _db.auto_enroll.Where(q => q.num == item.num).FirstOrDefault(); if (autoEnroll == null) return NotFound(); autoEnroll.start_date = item.start_date; autoEnroll.end_date = item.end_date; autoEnroll.receipt_title = item.receipt_title?.Trim() ?? null; autoEnroll.receipt_address = item.receipt_address?.Trim() ?? null; _db.SaveChanges(); CreateOrdersForActivities(item.f_num, autoEnroll.num, item.start_date, item.end_date, item.receipt_title, item.receipt_address); } try { var ret = new { num = autoEnroll.num, start_date = autoEnroll.start_date.ToString("yyyy-MM-dd"), end_date = autoEnroll.end_date.ToString("yyyy-MM-dd"), receipt_title = autoEnroll.receipt_title, receipt_address = autoEnroll.receipt_address, }; return Ok(ret); } catch(Exception ex) { return InternalServerError(ex); } } [HttpPost] [Route("api/follower/GetAffectedOrders")] public IHttpActionResult GetAffectedOrders([FromBody] Model.auto_enroll item, bool is_delete = false) { if (item == null) return BadRequest(); try { IQueryable query = _db.pro_order .Where(o => o.f_num == item.f_num && o.order_no.StartsWith("AU") && o.au_num == item.num); if (is_delete) { // 刪除:查期間內所有自動報名訂單 query = query.Where(o => o.activity.startDate_solar >= item.start_date && o.activity.startDate_solar <= item.end_date ); } else { // 修改:查不在新範圍內的訂單 query = query.Where(o => o.activity.startDate_solar < item.start_date || o.activity.startDate_solar > item.end_date ); } var rawOrders = query.Select(o => new { o.order_no, o.activity.subject, o.activity.startDate_solar }).ToList(); var affectedOrders = rawOrders.Select(o => new { order_no = o.order_no, activityname = o.subject, activitydate = o.startDate_solar?.ToString("yyyy/MM/dd") ?? "" }).ToList(); return Ok(new { count = affectedOrders.Count, list = affectedOrders }); } catch (Exception ex) { return InternalServerError(ex.GetBaseException()); } } [HttpDelete] [Route("api/follower/DeleteAutoEnroll/{id}")] public IHttpActionResult DeleteAutoEnroll(int id) { try { var prod = _db.auto_enroll.Where(q => q.num == id).FirstOrDefault(); if (prod != null) { _db.auto_enroll.Remove(prod); _db.SaveChanges(); return Ok(); } else return NotFound(); } catch (Exception ex) { return BadRequest(ex.Message); } } [HttpGet] [Route("api/follower/GetUnfilledActivityOrders/{id}")] public IHttpActionResult GetUnfilledActivityOrders(int id, int page, int pageSize = 10, string sortBy = "", bool sortDesc = false) { try { var config = _db.auto_enroll.FirstOrDefault(x => x.num == id); if (config == null) return NotFound(); var query = from o in _db.pro_order join a in _db.activities on o.activity_num equals a.num where o.f_num == config.f_num && a.startDate_solar >= config.start_date && a.startDate_solar <= config.end_date && !_db.pro_order_detail.Any(d => d.order_no == o.order_no) select new { o, a }; int totalCount = query.Count(); var pagedData = query .OrderByDescending(x => x.o.order_no) .Skip((page - 1) * pageSize) .Take(pageSize) .ToList() .Select(x => new { order_no = x.o.order_no, startdate = x.a.startDate_solar?.ToString("yyyy/MM/dd") ?? "", enddate = x.a.endDate_solar?.ToString("yyyy/MM/dd") ?? "", activityname = x.a.subject, category = x.a.activity_category_kind?.kind ?? "" }); return Ok(new { list = pagedData, count = totalCount, page = page, pageSize = pageSize }); } catch (Exception ex) { return BadRequest(ex.Message); } } [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.Where(x=> x.f_num == _follower); qry = qry.OrderByDescending(o => o.num); var count = qry.Count(); //pageSize = count;//一次取回?? var qryList = (pageSize > 0) ? qry.ToPagedList(page, pageSize).ToList() : qry.ToList(); int i = 1; var ret = new { list = qryList.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.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, startdate = x.activity.startDate_solar, enddate = x.activity.endDate_solar, 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/pending_orders")] public IHttpActionResult GetPendingOrders(int id, string targetDate) { DateTime today = DateTime.Today; if (!DateTime.TryParse(targetDate, out DateTime limitDate)) { limitDate = new DateTime(2099, 12, 31); } var orderrecord = _db.pro_order .Where(x => x.f_num == id && x.activity.startDate_solar >= today && x.activity.startDate_solar < limitDate) .Include(x => x.activity) .ToList(); var data = new { list = orderrecord.Select(x => new { orderno = x.order_no, activitydate = x.activity.startDate_solar.Value.ToString("yyyy/MM/dd"), activityname = x.activity.subject, }) }; 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); } private void CreateOrdersForActivities(int f_num, int au_num, DateTime start_date, DateTime end_date, string receipt_title, string receipt_address) { var follower = _db.followers.Where(x => x.num == f_num).FirstOrDefault(); var activities = _db.activities .Where(x => x.startDate_solar >= start_date && x.startDate_solar <= end_date ) .ToList(); foreach (var activity in activities) { var existOrder = _db.pro_order .Where(o => o.activity_num == activity.num && o.f_num == f_num) .FirstOrDefault(); if (existOrder != null) { existOrder.au_num = au_num; _db.SaveChanges(); continue; } string newOrderNo = AutoOrderService.CreateAutoOrderNumber(_db); string finalPhone = follower?.cellphone ?? follower?.phone ?? ""; var newOrder = new pro_order { order_no = newOrderNo, up_time = DateTime.Now, reg_time = DateTime.Now, keyin1 = "A01", f_num = f_num, au_num = au_num, phone = finalPhone, address = string.IsNullOrEmpty(receipt_address) ? "" : receipt_address, activity_num = activity.num, receipt_title = receipt_title ?? "", demo = "", customize_data = "", }; _db.pro_order.Add(newOrder); // 抓取同活動分類的上一筆訂單,複製品項 var latestOrder = _db.pro_order .Where(o => o.f_num == f_num && o.activity.kind == activity.kind && o.order_no != newOrderNo && _db.pro_order_detail.Any(d => d.order_no == o.order_no) ) .OrderByDescending(o => o.order_no) .FirstOrDefault(); if (latestOrder != null) { var prevDetails = _db.pro_order_detail .Where(d => d.order_no == latestOrder.order_no) .ToList(); foreach (var detail in prevDetails) { var newDetail = new pro_order_detail { order_no = newOrderNo, actItem_num = detail.actItem_num, parent_num = detail.parent_num, print_id = detail.print_id, f_num = detail.f_num, f_num_tablet = detail.f_num_tablet, address = detail.address, from_id = detail.from_id, from_id_tablet = detail.from_id_tablet, bed_type = detail.bed_type, qty = detail.qty, price = detail.price, start_date = DateTime.Today, pay = detail.pay, keyin1 = detail.keyin1, demo = detail.demo, customize_data = detail.customize_data, printed_files = detail.printed_files, UpdateTime = DateTime.Now, }; _db.pro_order_detail.Add(newDetail); } } } _db.SaveChanges(); } } public static class AutoOrderService { private static readonly object _lock = new object(); public static string CreateAutoOrderNumber(Model.ezEntities _db) { lock (_lock) { string prefix = "AU" + DateTime.Now.ToString("yyMMdd"); var company = _db.companies.FirstOrDefault(q => q.num == 1); if (company == null) return ""; string order_no; if (!string.IsNullOrEmpty(company.last_auto_order_no) && company.last_auto_order_no.StartsWith(prefix)) { string serialStr = company.last_auto_order_no.Replace(prefix, ""); int nextSerial = int.Parse(serialStr) + 1; order_no = prefix + nextSerial.ToString("0000"); } else { order_no = prefix + "0001"; } company.last_auto_order_no = order_no; _db.SaveChanges(); return order_no; } } }