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 static TreeView; using Model; using System.IdentityModel.Metadata; using MyWeb; using DocumentFormat.OpenXml.Drawing.Charts; // api/order //[ezAuthorize(Roles = "admin")]//群組:* //[ezAuthorize] public class orderController : ApiController { private Model.ezEntities _db = new Model.ezEntities(); // GET api/ public IEnumerable Get() { var list = _db.pro_order.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.pro_order.OrderBy(o => o.order_no).ToPagedList(page, pageSize); if (list == null) throw new HttpResponseException(HttpStatusCode.NotFound); return list; } // GET api//5 public Model.pro_order Get(string id) { var item = _db.pro_order.Where(q => q.order_no == id).FirstOrDefault(); //if (item == null) throw new HttpResponseException(HttpStatusCode.NotFound); return item; } // POST api/ public void Post([FromBody] Model.pro_order item) { } // PUT api//5 public void Put(int id, [FromBody] Model.pro_order item) { } // DELETE api//5 public void Delete(string id) { var prod = _db.pro_order.AsEnumerable().Where(q => q.order_no == id).FirstOrDefault(); //刪除該筆資料 if (prod != null) { //刪除掛單表單 var prod3 = _db.bed_order.AsEnumerable().Where(q => q.order_no == id).ToList(); if (prod3.Count > 0) { //刪除掛單明細 foreach (var item3 in prod3) { var prod4 = _db.bed_order_detail.AsEnumerable().Where(q => q.bed_order_no == item3.bed_order_no).ToList(); if (prod4.Count > 0) { _db.bed_order_detail.RemoveRange(prod4); //查詢結果全部刪除 } } _db.bed_order.RemoveRange(prod3); //查詢結果全部刪除 } _db.pro_order_detail.RemoveRange(prod.pro_order_detail); _db.pro_order.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.Order, (int)Model.admin_log.Status.Delete, prod.order_no); } } } [HttpDelete] [Route("api/order/DeleteItem/{id}")] public void DeleteDetail(int id) //刪除訂單明細 { if (id > 0) { var prod = _db.pro_order_detail.AsEnumerable().Where(q => q.num == id).FirstOrDefault(); //刪除該筆資料 if (prod != null) { //刪除掛單表單 var prod3 = _db.bed_order.AsEnumerable().Where(q => q.order_no == prod.order_no).ToList(); if (prod3.Count > 0) //count = 1 { //刪除掛單明細 foreach (var item3 in prod3) { var prod4 = _db.bed_order_detail.AsEnumerable().Where(q => q.bed_order_no == item3.bed_order_no).ToList(); if (prod4.Count > 0) { _db.bed_order_detail.RemoveRange(prod4); //查詢結果全部刪除 } } _db.bed_order.RemoveRange(prod3); //查詢結果全部刪除 } _db.pro_order_detail.Remove(prod); _db.SaveChanges(); //執行 } } } [HttpDelete] [Route("api/order/DeleteAll/{nums}")] public void DeleteAll(string nums) { if (!string.IsNullOrEmpty(nums)) { var ids = nums.TrimEnd(',').Split(','); var prod = _db.pro_order.AsEnumerable().Where(q => ids.Contains(q.order_no)).ToList(); if (prod.Count() > 0) { var prod2 = _db.pro_order_detail.AsEnumerable().Where(q => ids.Contains(Convert.ToString(q.order_no))).ToList(); if (prod2.Count > 0) { foreach (var item2 in prod2) { var prod3 = _db.bed_order.AsEnumerable().Where(q => q.order_no == item2.order_no && q.o_detail_id == item2.num).ToList(); if (prod3.Count > 0) { foreach (var item3 in prod3) { var prod4 = _db.bed_order_detail.AsEnumerable().Where(q => q.bed_order_no == item3.bed_order_no).ToList(); if (prod4.Count > 0) { _db.bed_order_detail.RemoveRange(prod4); } } _db.bed_order.RemoveRange(prod3); } //var prod32 = _db.bed_order.AsEnumerable().Where(q => q.order_no == item2.order_no && q.o_detail_id == item2.num).ToList(); //var prod42 = _db.bed_order_detail.AsEnumerable().Where(q => prod32.Select(qf => qf.order_no).ToArray().Contains(q.bed_order_no)).ToList(); //_db.bed_order_detail.RemoveRange(prod42); //_db.bed_order.RemoveRange(prod32); } _db.pro_order_detail.RemoveRange(prod2); //_db.SaveChanges(); } _db.pro_order.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.Order, (int)Model.admin_log.Status.Delete, admin_log.LogViewBtn(prod.Select(x => x.order_no).ToList())); } } } } [HttpGet] [Route("api/order/count")] public int Count() { var count = _db.pro_order.Count(); return count; } [HttpPost] [Route("api/order/GetList")] public IHttpActionResult GetList([FromBody] Model.ViewModel.pro_order q, int page, int pageSize = 10, string sortBy = "", bool sortDesc = false) { var qry = _db.pro_order.AsEnumerable(); //var aIDt = _db.actItems.AsEnumerable().Where(f => f.subject.Contains(q.actItemTxt.Trim())).Select(f => f.num);//品項 if (!string.IsNullOrEmpty(q.order_no)) qry = qry.Where(o => o.order_no.Contains(q.order_no.Trim())); if (!string.IsNullOrEmpty(q.keyin1)) qry = qry.Where(o => o.keyin1.Contains(q.keyin1)); if (q.f_num.HasValue && q.f_num > 0) qry = qry.Where(o => o.f_num == q.f_num); if (q.activity_num.HasValue && q.activity_num > 0) qry = qry.Where(o => o.activity_num == q.activity_num); if (q.up_time1.HasValue) qry = qry.Where(o => o.up_time >= q.up_time1.Value); if (q.up_time2.HasValue) qry = qry.Where(o => o.up_time < Convert.ToDateTime(q.up_time2.Value).AddDays(1)); if (!string.IsNullOrEmpty(q.address)) qry = qry.Where(o => o.address.Contains(q.address.Trim())); if (!string.IsNullOrEmpty(q.subject)) qry = qry.Where(o => o.activity_num.HasValue && o.activity.subject.Contains(q.subject?.Trim())); if (!string.IsNullOrEmpty(q.u_name)) qry = qry.Where(o => o.f_num.HasValue && o.follower.u_name.Contains(q.u_name?.Trim())); if (!string.IsNullOrEmpty(q.introducerTxt)) qry = qry.Where(o => o.introducer.HasValue && o.follower1.u_name.Contains(q.introducerTxt?.Trim())); if (!string.IsNullOrEmpty(q.actItemTxt)) { //qry = qry.Where(o => o.pro_order_detail.Where(f2 => f2.order_no == o.order_no && aIDt.ToArray().Contains(f2.actItem_num?.ToString())).Count() > 0); // qry = qry.Where(o => o.pro_order_detail.Where(f2 => f2.order_no == o.order_no && aIDt.Any(x => x == f2.actItem_num)).Count() > 0); qry = qry.Where(o => o.pro_order_detail.Where(f2 => f2.actItem_num.HasValue && f2.actItem.subject.Contains(q.actItemTxt?.Trim())).Count() > 0); } if (!string.IsNullOrEmpty(q.country)) qry = qry.Where(o => o.f_num != null && o.follower?.country == q.country); if (!string.IsNullOrEmpty(q.country2)) { if (q.country2 == "1") { qry = qry.Where(o => o.f_num != null && o.follower?.country == "158"); } else if (q.country2 == "2") { qry = qry.Where(o => o.f_num != null && o.follower?.country != "158"); } } if (sortBy.Equals("order_no")) { if (sortDesc) qry = qry.OrderByDescending(o => o.order_no); else qry = qry.OrderBy(o => o.order_no); } else if (sortBy.Equals("keyin1_txt")) { if (sortDesc) qry = qry.OrderByDescending(o => o.keyin1); else qry = qry.OrderBy(o => o.keyin1); } else if (sortBy.Equals("up_time")) { if (sortDesc) qry = qry.OrderByDescending(o => o.up_time); else qry = qry.OrderBy(o => o.up_time); } else if (sortBy.Equals("u_name")) { if (sortDesc) qry = qry.OrderByDescending(o => o.follower?.u_name); else qry = qry.OrderBy(o => o.follower?.u_name); } else if (sortBy.Equals("subject")) { if (sortDesc) qry = qry.OrderByDescending(o => o.activity?.subject); else qry = qry.OrderBy(o => o.activity?.subject); } else qry = qry.OrderByDescending(o => o.reg_time); var count = qry.Count(); //pageSize = count;//一次取回?? var ret = new { list = qry.ToPagedList(page, pageSize).Select(x => new { order_no = x.order_no, f_num = x.f_num, u_name = x.f_num.HasValue ? x.follower.u_name : "", activity_num = x.activity_num, subject = x.activity_num.HasValue ? x.activity.subject : "", keyin1 = x.keyin1, up_time = x.up_time, keyin1_txt = Model.pro_order.keyin1_value_to_text(x.keyin1), }), count = count }; if (ret.list == null) throw new HttpResponseException(HttpStatusCode.NotFound); return Ok(ret); } [HttpPost] [Route("api/order/GetItemList")] public IHttpActionResult GetItemList([FromBody] Model.ViewModel.pro_order_detail q, int page, int pageSize = 10, string sortBy = "", bool sortDesc = false) { string order_no = q.order_no; if (!string.IsNullOrEmpty(order_no)) { //檢查 var prod = _db.pro_order.Where(o => o.order_no == order_no).FirstOrDefault(); if (prod != null) { try { int activity = prod.activity_num.HasValue ? prod.activity_num.Value : 0; //活動 var bedDt = _db.bed_order_detail.AsEnumerable().Where(b => b.bed_order.order_no == order_no); ;//掛單明細 //var qry1 = _db.pro_order_detail.AsEnumerable(); //qry1 = qry1.Where(o => o.order_no == order_no); //var qry1 = prod.pro_order_detail.AsEnumerable(); var qry1 = prod.pro_order_detail.AsQueryable(); //if (!string.IsNullOrEmpty(q.subject)) // qry = qry.Where(o => o.subject.Contains(q.subject)); if (q.actItem_kind_num.HasValue) { //項目分類 var _subKinds = new TreeView().subKinds(_db.actItem_kind.Select(o => new TreeItem() { num = o.num, root = o.root, }).ToList(), q.actItem_kind_num.Value); qry1 = qry1.Where(o => o.actItem.kind == q.actItem_kind_num || _subKinds.Any(s => s == o.actItem.kind)); } if (sortBy.Equals("subject")) { if (sortDesc) qry1 = qry1.OrderByDescending(o => o.actItem.subject); else qry1 = qry1.OrderBy(o => o.actItem.subject); } else { qry1 = qry1.OrderByDescending(o => o.num); } var tdesc = publicFun.enum_desc(); int i = 1; //已有值 var qry1_list = qry1.ToList(); if (pageSize > 0) qry1_list = (List)qry1_list.ToPagedList(page, pageSize); var count = qry1_list.Count(); var ret = new { list = qry1_list.Select(x => new { id = i++, num = x.num, order_no = x.order_no, actitem_num_selected = new { text = x.actItem_num.HasValue ? x.actItem.subject : "", val = x.actItem_num.HasValue ? x.actItem_num.Value : 0, }, parent_num = x.parent_num, f_num_selected = new { text = x.f_num.HasValue ? x.follower.u_name : "", val = x.f_num.HasValue ? x.f_num.Value : 0, }, f_num_tablet = x.f_num_tablet, print_id = x.print_id, address = x.address, due_date = x.due_date, start_date = x.start_date, extend_date = x.extend_date, from_id_selected = new { text = x.from_id.HasValue ? x.follower1.u_name : "", val = x.from_id.HasValue ? x.from_id : 0, }, from_id_tablet = x.from_id_tablet, price = x.price ?? 0, qty = x.qty ?? 0, writeBedQty = bedDt.Where(b => b.bed_order.o_detail_id.Value == x.num && b.checkIn_date.HasValue && b.bed_kind_detail_id.HasValue).Count(), //已劃數量 notBedQty = bedDt.Where(b => b.bed_order.o_detail_id.Value == x.num && (!b.checkIn_date.HasValue || !b.bed_kind_detail_id.HasValue)).Count(), //未劃數量 //total = x.total.HasValue ? x.total.Value : 0, category = x.actItem?.category, //pay = x.pay ?? 0, pay = x.pro_order_record.Select(c => c.price).Sum(), pay_date = x.pay_date, keyin1_selected = new { text = tdesc[x.keyin1.HasValue && x.keyin1.Value > 0 ? x.keyin1.Value : 1], val = x.keyin1, }, demo = x.demo, files = x.actItem?.actItem_files.Select(f => new { num = f.file.num, subject = f.file.subject, word = f.file.word, cuz_column = f.file.customize_data ?? "", //?? paperset = f.file.paperset ?? "", }), customize_data = x.customize_data ?? "", customize_data_comb = new { from_id_cuz_data = "", activity_cuz_data = "", actitem_cuz_data = "", order_cuz_data = "", }, printed_files = x.printed_files ?? "", isPackage = (x.actItem.act_bom .Any(ab => ab.package_num == null && ab.item_num != null) ? 1 : 0), bom_order = (x.actItem.act_bom .Any(ab => ab.package_num == null && ab.item_num != null) ? x.num.ToString() : (x.parent_num.ToString() + x.num.ToString()) ), //cash_record = x.pro_order_record.Select( c => new { // c, // //pay_kind = tdesc2[c.payment.HasValue && x.keyin1.Value > 0 ? x.keyin1.Value : 1], //}), }) .ToList() .OrderByDescending(x => (x.isPackage + (x.parent_num == null ? 0 : 1))) //.ThenBy(x => (x.parent_num == null ? 1 : 2)) // Top-level items first .ThenBy(x => x.bom_order) // Group child items with their parents .ThenBy(x => x.parent_num) // Group child items with their parents .ThenBy(x => x.num) // Order by num within each group .ToList(), count = count, }; if (prod.pro_order_detail.Count() == 0) { //未有資料 //帶活動預設 if (activity > 0) { i = 1; //var qry2 = _db.activity_relating.AsEnumerable(); //qry2 = qry2.Where(o => o.activity_num == activity); var qry2 = _db.activity_relating .Where(o => o.activity_num == activity); if (q.actItem_kind_num.HasValue) { //項目分類 var _subKinds = new TreeView().subKinds(_db.actItem_kind.Select(o => new TreeItem() { num = o.num, root = o.root, }).ToList(), q.actItem_kind_num.Value); qry2 = qry2.Where(o => o.actItem.kind == q.actItem_kind_num || _subKinds.Any(s => s == o.actItem.kind)); } var count2 = qry2.Count(); pageSize = (pageSize <= 0) ? count2 : pageSize; var qry2a = qry2.Select(ar => new { ar.num, order_no = q.order_no, actItem = ar.actItem, actitem_num_selected = new { text = ar.actItem.subject, val = ar.actItem_num, }, parent_num = q.num, f_num_selected = new { text = "", val = 0, }, f_num_tablet = "", address = "", // due_date = // start_date = // extend_date = from_id_selected = new { text = "", val = 0, }, from_id_tablet = "", price = ar.price > 0 ? ar.price : ar.actItem.price, ar.qty, //writeBedQty //notBedQty category = ar.actItem.category, pay = 0, //pay_date keyin1_selected = new { text = "", val = 0, }, demo = ar.actItem.demo, files = ar.actItem.actItem_files.Select(af => new { num = af.file.num, subject = af.file.subject, word = af.file.word, cuz_column = af.file.customize_data ?? "", //定義欄位需求 paperset = af.file.paperset ?? "", }), customize_data = ar.actItem.customize_data ?? "", customize_data_comb = new { from_id_cuz_data = "", activity_cuz_data = "", actitem_cuz_data = ar.actItem.customize_data, order_cuz_data = "", }, printed_files = "", ar.reg_time, //actItem = ar.actItem, isPackage = ar.actItem.act_bom .Any(ab => ab.package_num == null && ab.item_num != null) ? 1 : 0 }); //var orderedQry2a = sortDesc // ? qry2a.OrderByDescending(ar => ar.num) // : qry2a.OrderBy(ar => ar.num); var orderedQry2a = qry2a .OrderByDescending(ar => ar.isPackage) // Ensure top-level items come first .ThenBy(ar => sortDesc ? 0 : 1) // This is a trick to conditionally switch between ThenBy and ThenByDescending .ThenBy(ar => sortDesc ? ar.num : 0) // Apply existing sort order based on sortDesc .ThenByDescending(ar => sortDesc ? 0 : ar.num); // Apply existing sort order based on sortDesc var ret2 = new { list = orderedQry2a.ToList() //.ToPagedList(page, pageSize) .Select(x => new { id = i++, num = 0, //? order_no = order_no, // ? actitem_num_selected = new { text = x.actItem.subject, val = x.actItem.num, }, f_num_selected = new { text = "", val = 0, }, address = "", due_date = DateTime.Today.AddMonths(x.actItem.cycle ?? 0).ToString("yyyy-MM-dd"), // 期滿日期:依據 項目維護 所設定的 收費週期 計算後帶入日期 start_date = DateTime.Today.ToString("yyyy-MM-dd"), //預設今天 extend_date = (x.actItem.extend ?? "").Equals("Y") ? DateTime.Today.AddMonths(x.actItem.cycle ?? 0).ToString("yyyy-MM-dd") : "", //應續約日:預設的日期值與期滿日期相同(項目是"續約項目"者) from_id_selected = new { text = prod.f_num.HasValue ? prod.follower.u_name : "", //預設帶報名者 val = prod.f_num.HasValue ? prod.f_num.Value : 0, }, price = x.price ?? 0, qty = x.qty ?? 0, writeBedQty = 0, notBedQty = 0, //total = x.price.HasValue && x.qty.HasValue ? Convert.ToDouble(x.price.Value) * Convert.ToInt32(x.qty.Value) :0, category = x.actItem?.category, pay = 0, pay_date = "", keyin1_selected = new { text = tdesc[1], val = 1, }, demo = "", files = x.actItem?.actItem_files.Select(f => new { num = f.file.num, subject = f.file.subject, word = f.file.word, cuz_column = f.file.customize_data ?? "", //定義欄位需求 paperset = f.file.paperset ?? "", }), customize_data = "", customize_data_comb = new { from_id_cuz_data = prod.f_num.HasValue ? prod.follower.customize_data ?? "" : "", activity_cuz_data = prod.activity_num.HasValue ? prod.activity.customize_data ?? "" : "", actitem_cuz_data = x.actItem.customize_data, order_cuz_data = prod.customize_data, }, printed_files = "", x.isPackage //cash_record = new { }, }), count = count2 }; if (ret2.list == null) { throw new HttpResponseException(HttpStatusCode.NotFound); } return Ok(ret2); } else { //不須帶預設資料,自行新增項目 return Ok(); } } else return Ok(ret); } catch (Exception ex) { return NotFound(); } } else { return NotFound(); } } else { return NotFound(); } } [HttpPost] [Route("api/order/SaveDetailData")] public IHttpActionResult SaveDetailData([FromBody] Model.pro_order_detail item) { if (!string.IsNullOrEmpty(item.order_no)) { //if有資料-修改 , else 新增 if (item.num > 0) { Model.pro_order_detail order = _db.pro_order_detail .Include("actItem") .Include("actItem.act_bom") .Where(q => q.num == item.num) .FirstOrDefault();//修改 if (order != null) { order.actItem_num = (item.actItem_num.HasValue && item.actItem_num.Value > 0) ? item.actItem_num : null; order.f_num = (item.f_num.HasValue && item.f_num.Value > 0) ? item.f_num : null; order.from_id = (item.from_id.HasValue && item.from_id.Value > 0) ? item.from_id : null; order.f_num_tablet = item.f_num_tablet; order.from_id_tablet = item.from_id_tablet; order.print_id = item.GenerateSequentialId(); order.address = item.address; order.start_date = item.start_date.HasValue ? item.start_date : null; order.due_date = item.due_date.HasValue ? item.due_date : null; order.extend_date = item.extend_date.HasValue ? item.extend_date : null; order.price = item.price.HasValue ? item.price : null; order.qty = (item.qty.HasValue && item.qty.Value > 0) ? item.qty : null; order.pay = item.pay.HasValue ? item.pay : null; order.pay_date = item.pay_date.HasValue ? item.pay_date : null; order.keyin1 = item.keyin1; order.demo = item.demo; order.customize_data = item.customize_data; order.UpdateTime = DateTime.Now; _db.SaveChanges(); var ret = new { num = order.num, customize_data = order.customize_data, print_id = order.print_id, f_num_tablet = order.f_num_tablet, isPackage = order.actItem != null ? (order.actItem.act_bom .Any(ab => ab.package_num == null && ab.item_num != null) ? 1 : 0) : 0 }; return Ok(ret); } else { return NotFound(); } } else { Model.pro_order_detail orderDetail = new Model.pro_order_detail() { order_no = item.order_no, parent_num = item.parent_num, actItem_num = (item.actItem_num.HasValue && item.actItem_num.Value > 0) ? item.actItem_num : null, f_num = (item.f_num.HasValue && item.f_num.Value > 0) ? item.f_num : null, from_id = (item.from_id.HasValue && item.from_id.Value > 0) ? item.from_id : null, f_num_tablet = item.f_num_tablet, from_id_tablet = item.from_id_tablet, print_id = item.GenerateSequentialId(), address = item.address, start_date = item.start_date.HasValue ? item.start_date : null, due_date = item.due_date.HasValue ? item.due_date : null, extend_date = item.extend_date.HasValue ? item.extend_date : null, price = item.price.HasValue ? item.price : null, qty = (item.qty.HasValue && item.qty.Value > 0) ? item.qty : null, pay = item.pay.HasValue ? item.pay : null, pay_date = item.pay_date.HasValue ? item.pay_date : null, keyin1 = item.keyin1, demo = item.demo, customize_data = item.customize_data, UpdateTime = DateTime.Now, }; _db.pro_order_detail.Add(orderDetail); _db.SaveChanges(); // 重新查詢以獲取完整的關聯數據 var savedOrder = _db.pro_order_detail .Include("actItem") .Include("actItem.act_bom") .FirstOrDefault(x => x.num == orderDetail.num); var isPackage = savedOrder.actItem != null ? (savedOrder.actItem.act_bom .Any(ab => ab.package_num == null && ab.item_num != null) ? 1 : 0) : 0; var ret = new { num = savedOrder.num, customize_data = savedOrder.customize_data, print_id = savedOrder.print_id, f_num_tablet = savedOrder.f_num_tablet, isPackage = isPackage }; return Ok(ret); } } else { return NotFound(); } } [HttpPost] [Route("api/order/GetUnpayList")] public IHttpActionResult GetUnpayList([FromBody] Model.ViewModel.follower q, string order_no, 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) { try { //家族 : 家長是我的人,跟我同家長的人,我的家長本人,我本人 var cc = _db.followers.Where(x => x.num == _follower || x.leader == _follower).Select(x => x.num); var qry = _db.followers.AsEnumerable().Where(f => cc.Any(x => x == f.num) || cc.Any(x => x == f.leader)); //未付款資料 var unpayDt = _db.pro_order_detail.AsEnumerable(); var coDt = unpayDt.Where(x => x.keyin1 == (int)Model.pro_order.detailKeyin1.Collection);//只列出報名狀態為"收款中"的項目 //未付款訂單 var orderDt = _db.pro_order.AsEnumerable(); if (!string.IsNullOrEmpty(order_no)) orderDt = orderDt.Where(x => x.order_no == order_no); orderDt = orderDt.Where(x => coDt.Select(d => d.order_no).Contains(x.order_no)); //orderDt = orderDt.Where(x => qry.Select(d => d.num).Contains(x.f_num.Value)); orderDt = orderDt.Where(x => qry.Select(f => f.num).Any(f => f == x.f_num)); orderDt = orderDt.OrderByDescending(x => x.reg_time); int i = 1; //已有值 var count = orderDt.Count(); var ret = new { list = orderDt.ToPagedList(page, pageSize).Select(x => new { id = i++, order_no = x.order_no, up_time = x.up_time, reg_time = x.reg_time, f_num = x.f_num, u_name = x.f_num.HasValue ? x.follower.u_name : "", totalPrice = unpayDt.Where(d => d.order_no == x.order_no).Select(o => o.price ?? 0 * o.qty ?? 0).Sum(), //訂單金額 payPrice = unpayDt.Where(d => d.order_no == x.order_no).Select(o => o.pay).Sum(), //已收金額 }), count = count, }; if (ret.list == null) throw new HttpResponseException(HttpStatusCode.NotFound); return Ok(ret); } catch (Exception ex) { } } return NotFound(); } [HttpPost] [Route("api/order/GetUnpayDetail")] public IHttpActionResult GetUnpayDetail([FromBody] Model.ViewModel.pro_order q, int page, int pageSize = 10, string sortBy = "", bool sortDesc = false) { //未付款資料 var unpayDt = _db.pro_order_detail.AsEnumerable(); unpayDt = unpayDt.Where(x => x.keyin1 == (int)Model.pro_order.detailKeyin1.Collection);//只列出報名狀態為"收款中"的項目 if (!string.IsNullOrEmpty(q.order_no)) unpayDt = unpayDt.Where(x => x.order_no == q.order_no); unpayDt = unpayDt.OrderByDescending(x => x.num); int i = 1; //已有值 var count = unpayDt.Count(); var ret = new { list = unpayDt.ToPagedList(page, pageSize).Select(x => new { id = i++, order_no = x.order_no, actItem_num = x.actItem_num, actItem_numTxt = x.actItem_num.HasValue ? x.actItem.subject : "", f_num = x.f_num, u_name = x.f_num.HasValue ? x.follower.u_name : "", price = x.price ?? 0 * x.qty ?? 0, //訂單金額 pay = x.pay ?? 0, //已收金額 }), count = count, }; if (ret.list == null) throw new HttpResponseException(HttpStatusCode.NotFound); return Ok(ret); } [HttpGet] [Route("api/order/printFileLog/{num}/{detail}")] public IHttpActionResult printFileLog(int num, int detail) { string _num = "\"" + num.ToString() + "\""; Model.pro_order_detail order = _db.pro_order_detail.Where(q => q.num == detail && !((q.printed_files ?? "").Contains(_num))).FirstOrDefault();//修改 if (order != null) { order.printed_files = (order.printed_files ?? "") + _num + ","; _db.SaveChanges(); return Ok(order.printed_files); } return NotFound(); } [HttpPost] [Route("api/order/printMultiFileLog")] public IHttpActionResult printMultiFileLog([FromBody] List list, int item, int file) { string _num = "\"" + file.ToString() + "\""; var order = _db.pro_order_detail.Where(q => list.Any(a => a == q.num) && !((q.printed_files ?? "").Contains(_num))).ToList(); if (order.Count > 0) { foreach (var row in order) row.printed_files = (row.printed_files ?? "") + _num + ","; _db.SaveChanges(); return Ok(); } return NotFound(); } [HttpGet] [Route("api/order/copyDetailData/{num}/{qty}")] public IHttpActionResult copyDetailData(int num, int qty) { if (qty > 0) { var detail = _db.pro_order_detail.Where(q => q.num == num).FirstOrDefault(); if (detail != null) { string jsonStr = JsonConvert.SerializeObject(detail, new JsonSerializerSettings() { StringEscapeHandling = StringEscapeHandling.EscapeNonAscii }); for (int i = 0; i < qty; i++) { Model.pro_order_detail order = new Model.pro_order_detail();//新增 //Get properties from EF that are read / write and not marked witht he NotMappedAttribute //var sourceProperties = typeof(Model.pro_order_detail) // .GetProperties() // .Where(p => p.CanRead && p.CanWrite && // p.GetCustomAttributes(typeof(System.ComponentModel.DataAnnotations.NotMappedAttribute), true).Length == 0); //foreach (var property in sourceProperties) //{ // Copy value // property.SetValue(order, property.GetValue(detail, null), null); //} //order = (Model.pro_order_detail)detail.Clone(); order = JsonConvert.DeserializeObject(jsonStr); // order = detail; //直接給物件,會傳址,若order.pay = null , 則 detail.pay = null , 且 _db.SaveChanges();只會新增一筆 order.print_id = ""; order.pay = null; order.keyin1 = (int)Model.pro_order.detailKeyin1.Unconfirmed; order.printed_files = null; _db.pro_order_detail.Add(order); } _db.SaveChanges(); return Ok(); } } return NotFound(); } [HttpPost] [Route("api/order/GetPastOrderList")] public IHttpActionResult GetPastOrderList([FromBody] Model.pro_order q, int page, int pageSize = 10, string sortBy = "", bool sortDesc = false) { int u_name = q.f_num ?? 0; if (u_name > 0 && (!string.IsNullOrEmpty(q.order_no))) { //檢查 var prod = _db.pro_order.Where(o => o.f_num == u_name && o.order_no != q.order_no).ToList(); if (prod.Count > 0) { var orderNumbers = prod.Select(x => x.order_no).ToList(); var qry = _db.pro_order_detail .Where(o => orderNumbers.Contains(o.order_no)) .Select(x => new { num = x.num, order_no = x.order_no, up_time = x.pro_order.up_time, activity_selected = new { text = x.pro_order.activity_num.HasValue ? x.pro_order.activity.subject : "", val = x.pro_order.activity_num.HasValue ? x.pro_order.activity_num.Value : 0, }, actitem_num_selected = new { text = x.actItem_num.HasValue ? x.actItem.subject : "", val = x.actItem_num.HasValue ? x.actItem_num.Value : 0, } }) .OrderBy(x => x.num); // 加一個預設排序 var count = qry.Count(); IEnumerable resultList; if (pageSize < 0) { resultList = qry.ToList(); } else { var pagedList = qry.ToPagedList(page, pageSize); resultList = pagedList; } var ret = new { list = resultList.Select((x, index) => new { id = index + 1, num = x.num, order_no = x.order_no, up_time = x.up_time, activity_selected = x.activity_selected, actitem_num_selected = x.actitem_num_selected }), count = count, }; return Ok(ret); } } return Ok("沒有以往報名"); } [HttpPost] [Route("api/order/copyMultiPastItem")] public IHttpActionResult copyMultiPastItem([FromBody] List list, string order_no) { var detail = _db.pro_order_detail.Where(q => list.Any(a => a == q.num)).OrderByDescending(q => q.order_no).ToList(); if (detail.Count > 0 && (!string.IsNullOrEmpty(order_no))) { foreach (var row in detail) { string jsonStr = JsonConvert.SerializeObject(row, new JsonSerializerSettings() { StringEscapeHandling = StringEscapeHandling.EscapeNonAscii }); Model.pro_order_detail order = new Model.pro_order_detail();//新增 order = JsonConvert.DeserializeObject(jsonStr); order.order_no = order_no; order.pay = null; order.keyin1 = (int)Model.pro_order.detailKeyin1.Unconfirmed; order.printed_files = null; _db.pro_order_detail.Add(order); } _db.SaveChanges(); return Ok(); } return NotFound(); } [HttpPost] [Route("api/order/GetPayOrderList")] public IHttpActionResult GetPayOrderList([FromBody] Model.pro_order_record q, int page, int pageSize = 10, string sortBy = "", bool sortDesc = false) { int detail_num = q.detail_num ?? 0; if (detail_num > 0) { //檢查 var prod = _db.pro_order_record.AsEnumerable().Where(o => o.detail_num == detail_num) .OrderByDescending(o => o.pay_date).ToList(); int i = 1; var count = prod.Count(); var ret = new { list = prod.ToPagedList(page, pageSize).Select(x => new { id = i++, num = x.num, order_no = x.pro_order_detail.order_no, pay_date = x.pay_date, payment_selected = new { text = x.payment.HasValue && x.payment.Value > 0 ? x.accounting_kind2.kind : "", val = x.payment.HasValue ? x.payment.Value : 0, }, price = x.price ?? 0, organization = x.organization, bank_code = x.bank_code, }), count = count, }; return Ok(ret); } return Ok("沒有資料"); } [HttpDelete] [Route("api/order/DeleteRecordDetail/{id}")]//刪除收款註記 public void DeleteRecordDetail(int id) { var prod = _db.pro_order_record.AsEnumerable().Where(q => q.num == id).FirstOrDefault(); //刪除該筆資料 if (prod != null) { _db.pro_order_record.Remove(prod); _db.SaveChanges(); //執行 } } [HttpPost] [Route("api/order/SaveRecordDetail")]//取得子項目 public IHttpActionResult SaveRecordDetail([FromBody] Model.pro_order_record item) { if (item.detail_num > 0) { float total = _db.pro_order_detail.AsEnumerable().Where(x => x.num == item.detail_num).Select(x => x.price.Value * x.qty.Value).Sum(); float pay = _db.pro_order_record.AsEnumerable().Where(x => x.detail_num == item.detail_num).Select(x => x.price.Value).Sum(); if (pay + item.price.Value <= total) { //if有資料-修改 , else 新增 if (item.num > 0) { _db.Entry(item).State = System.Data.Entity.EntityState.Modified; _db.SaveChanges(); //Model.bed_kind_detail _detail = _db.bed_kind_detail.Where(q => q.num == item.num).FirstOrDefault();//修改 //if (_detail != null) //{ // _detail.bed_name = item.bed_name; // if (item.bed_type.HasValue) { _detail.bed_type = item.bed_type.Value; } // else { _detail.bed_type = null; } // _detail.demo = item.demo; // _db.SaveChanges(); var ret = item.num; return Ok(ret); //} //else // return NotFound(); } else { item.reg_time = DateTime.Now; _db.pro_order_record.Add(item); _db.SaveChanges(); var ret = item.num; return Ok(ret); } } else { return Ok("已收金額不能超過小計"); } } else { return NotFound(); } } [HttpPost] [Route("api/order/GetChildItems")]//取得BOM子項目 public IHttpActionResult GetChildItems(int item_num, string order_no, int order_detail_num) { var parentItem = _db.act_bom.FirstOrDefault(item => item.item_num == item_num); if (parentItem != null) { var bom = parentItem.act_bom1.ToList(); // Create a new list for pro_order_detail items List orderDetails = new List(); // Iterate over each bom item to create a new pro_order_detail int? null_int = null; var tempCounter = -1; foreach (var x in bom) { var newOrderDetail = new { order_no = order_no, num = tempCounter--, // 每個項目遞減,確保唯一性, 暫時KEY actitem_num_selected = new { text = x.actItem.subject, val = x.item_num, }, f_num_selected = new { text = "", val = null_int, }, actItem_num = x.item_num, parent_num = order_detail_num, from_id_selected = new { text = "", //預設帶報名者? val = null_int, }, price = 0,//x.price ?? 0, qty = 0,//x.qty ?? 0, writeBedQty = 0, notBedQty = 0, category = x.actItem?.category, pay = 0, pay_date = "", keyin1_selected = new { text = "",//tdesc[1], val = null_int, }, demo = "", files = new { },// ??, customize_data = "", customize_data_comb = new { from_id_cuz_data = "", activity_cuz_data = "", actitem_cuz_data = x.actItem.customize_data, order_cuz_data = "", }, // Initialize other necessary properties as needed }; // Add the newly created pro_order_detail to the list orderDetails.Add(newOrderDetail); } // Return the list of pro_order_detail items // Assuming your method returns IHttpActionResult, you can wrap the result with Ok() return Ok(orderDetails); } else { // Handle the case where there is no parent item found return NotFound(); // Or however you wish to handle this scenario } //var childItems = _db.act_bom // .Where(bom => bom.item_num == item_num && bom.package_num == bom.num).ToList(); //return Ok(childItems); //return NotFound(); } }