using com.itextpdf.text.pdf; using DocumentFormat.OpenXml; using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Wordprocessing; using Model; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using NPOI.POIFS.Properties; using NPOI.Util.Optional; using NPOI.XWPF.UserModel; using PagedList; using System; using System.Collections; using System.Collections.Generic; using System.Data.Entity; using System.Data.SqlClient; using System.IO; using System.Linq; using System.Net; using System.Net.Http; using System.Web; using System.Web.Http; using System.Windows; using static TreeView; /// /// orderdetail 的摘要说明 /// public class orderdetailController:ApiController { private Model.ezEntities _db = new Model.ezEntities(); [HttpPost] [Route("api/orderdetail/GetList")] public IHttpActionResult GetList([FromBody] Model.ViewModel.pro_order q, int page, int pageSize = 10, string sortBy = "", bool sortDesc = false) { int activity_num = Convert.ToInt32(q.activity_num); //現在的牌位預覽只會出現功德主,修改為所有人都會出現 //var aIDt = _db.actItems.AsEnumerable().Where(f => f.subject.Contains(q.actItemTxt.Trim())).Select(f => f.num);//品項 //var OrderList = _db.pro_order.Where(u => u.activity_num == activity_num).Select(j => j.order_no).ToList(); //var gdzOrderList = _db.pro_order_detail.Where(o => OrderList.Contains(o.order_no) && o.print_id.Contains("主")).Select(o => o.order_no).Distinct().ToList(); //var qry = _db.pro_order.Where(u => gdzOrderList.Contains(u.order_no)).AsEnumerable(); var qry = _db.pro_order.Where( u => u.activity_num == activity_num).OrderByDescending(o => o.reg_time); 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 { 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), //detail = x.pro_order_detail.Where(u => u.printed_files != null) detail = new { count = x.pro_order_detail .Where(u => (u.parent_num != null) || u.actItem.subject.Contains("牌") || !string.IsNullOrEmpty(u.f_num_tablet)) .Count(), actItem = x.pro_order_detail.Where(u => u.printed_files != null).Select(u => u.print_id).FirstOrDefault() } }), count = count }; if (ret.list == null) throw new HttpResponseException(HttpStatusCode.NotFound); return Ok(ret); } [HttpPost] [Route("api/orderdetail/GetDetailToPrint")] public IHttpActionResult GetDetailToPrint([FromBody] dynamic data) { if (data.param is Newtonsoft.Json.Linq.JArray items) { string[] details = new string[items.Count]; int i = 0; foreach (var item in items) { details[i] = item["order_no"] + item["num"].ToString(); i++; } var parameters = details.Select((s,j)=>"@p"+j).ToArray(); string sql = $"select * from pro_order_detail where order_no+convert(varchar,num) in ({string.Join(",",parameters)}) "; int l =0; List sqlList = new List(); foreach (var item in details) { sqlList.Add( new SqlParameter("@p" + l, item)); l++; } SqlParameter[] p = sqlList.ToArray(); var ret = _db.Database.SqlQuery(sql, p).ToList(); if (ret == null) throw new HttpResponseException(HttpStatusCode.NotFound); return Ok(ret); } else { throw new HttpResponseException(HttpStatusCode.NotFound); } } [HttpPost] [Route("api/orderdetail/GetShuwenData")] public IHttpActionResult GetShuwenData([FromBody] dynamic data) { var json = data; var mode = (json.mode == null ? "" : (string)json.mode); var num = (json.activity_num == null ? 0 : (int)json.activity_num); var act = _db.activities.AsQueryable().Where(v=>v.num==num).FirstOrDefault(); var query = _db.pro_order_detail.AsQueryable(); query=query.Where(x => (_db.act_bom.AsQueryable().Where(y => y.package_num == null).Select(y => y.item_num).ToList()). Contains(x.actItem_num)); query = query.Where(x => (_db.pro_order.AsQueryable(). Where(w => w.activity_num ==num ).Select(w => w.order_no)).ToList().Contains(x.order_no)); //query = query.Include(x=>x.actItem).Where(x=>x.actItem.subject.StartsWith("消")); //這些是功德主 var list = query.OrderByDescending(x=>x.price).Select(x => new { x.num,x.order_no,x.actItem_num,x.parent_num,x.print_id,x.f_num_tablet,x.price, subject= _db.actItems.Where(w => w.num == x.actItem_num).Select(w => w.subject).FirstOrDefault(), childs =_db.pro_order_detail. Where(z=>z.order_no==x.order_no&&z.parent_num==x.num).Select(z=>new { z.num, z.order_no, z.actItem_num, z.parent_num, z.print_id, z.f_num_tablet, z.price, subject=_db.actItems.Where(w=>w.num==z.actItem_num).Select(w=>w.subject).FirstOrDefault(), }).ToList() }).ToList(); var query1 = _db.pro_order_detail.AsQueryable(); query1 = query1.Where(x => !(_db.act_bom.AsQueryable().Where(y => y.package_num == null).Select(y => y.item_num).ToList()). Contains(x.actItem_num)); query1 = query1.Where(x => x.parent_num == null); query1 = query1.Where(x => (_db.pro_order.AsQueryable(). Where(w => w.activity_num == num).Select(w => w.order_no)).ToList().Contains(x.order_no)); query1 = query1.Include(x => x.actItem).Where(x => x.actItem.subject.StartsWith(mode=="消"?"消":"超")); //這些是非功德主 var list1 = query1.Select(x => new { x.num, x.order_no, x.actItem_num, x.parent_num, x.print_id, x.f_num_tablet, x.price, subject = _db.actItems.Where(w => w.num == x.actItem_num).Select(w => w.subject).FirstOrDefault(), }).ToList(); //string filePath = "範例文件.docx"; string folderPath = HttpContext.Current.Server.MapPath("~/App_Data/"); // 確保資料夾存在 if (!Directory.Exists(folderPath)) { Directory.CreateDirectory(folderPath); } // 2. 使用 GUID 命名防衝突 string fileName = Guid.NewGuid().ToString() + ".docx"; string fullPath = Path.Combine(folderPath, fileName); if (mode == "消") { // 1. 建立 Word 文件 using (WordprocessingDocument wordDocument = WordprocessingDocument.Create(fullPath, WordprocessingDocumentType.Document, true)) { Body body = new Body(); var doc = GenerateDocument(wordDocument, body); string preItemName = string.Empty; foreach (var dd in list) { if (dd.childs.Count > 0) { if (preItemName != dd.subject) { body.Append(RenderParagraph(44, $"{act.subject}{dd.subject} 消災祈福名單", true)); } if (string.IsNullOrEmpty(preItemName)) { preItemName = dd.subject; } List preItemTitle = new List(); foreach (var child in dd.childs) { if (!child.subject.StartsWith("消")) { continue; } //preItemTitle.Append(child) JObject obj = JObject.Parse(child.f_num_tablet); JArray arr = (JArray)obj["mid_items"]; foreach (var item in arr) { preItemTitle.Add((string)item["fam_name"]); } } body.Append(RenderParagraph(44, $" {string.Join(" ", preItemTitle)}", false)); } } //ChangePage(body); //if (list1.Count > 0) //{ // Hashtable ht = new Hashtable(); // string preOrderNo = string.Empty; // body.Append(RenderParagraph(44, $"{act.subject} 消災祈福名單", true)); // List preItemTitle = new List(); // foreach (var dd in list1) // { // if (preOrderNo != dd.order_no) // { // if (preItemTitle.Count > 0) // { // body.Append(RenderParagraph(44, $" {string.Join(" ", preItemTitle)}", false)); // } // ht.Clear(); // preItemTitle.Clear(); // } // JObject obj = JObject.Parse(dd.f_num_tablet); // JArray arr = (JArray)obj["mid_items"]; // foreach (var item in arr) // { // if (ht.ContainsKey((string)item["fam_name"])) // { // continue; // } // if (string.Join(" ", preItemTitle).Length + ((string)item["fam_name"]).Length > 25) // { // body.Append(RenderParagraph(44, $" {string.Join(" ", preItemTitle)}", false)); // preItemTitle.Clear(); // } // preItemTitle.Add((string)item["fam_name"]); // ht.Add((string)item["fam_name"], (string)item["fam_name"]); // } // preOrderNo = dd.order_no; // } // if (preItemTitle.Count > 0) // { // body.Append(RenderParagraph(44, $" {string.Join(" ", preItemTitle)}", false)); // } //} SetStraight(body); } }else if (mode=="超") { List shuwenList= new List(); Shuwen shuwen = new Shuwen(); string preOrderNo=string.Empty; foreach (var dd in list) { if (preOrderNo!=dd.order_no) { //if(!string.IsNullOrEmpty(shuwen.order_no)&&shuwen.mid_item.Count>0) // shuwenList.Add(shuwen); shuwen = new Shuwen(); shuwen.order_no = dd.order_no; shuwen.subject = dd.subject; shuwen.mid_item = new List(); } if (dd.childs.Count > 0) { foreach (var item in dd.childs) { if (!item.subject.StartsWith("超")) { continue; } JObject obj = JObject.Parse(item.f_num_tablet); JArray mid = (JArray)obj["mid_items"]; JArray left = (JArray)obj["left_items"]; List leftList=new List(); List midList = new List(); foreach (var o in mid) { midList.Add((string)o["fam_name"]); } foreach (var o in left) { leftList.Add((string)o["fam_name"]); } var wen=shuwenList.Where(z => z.alive == string.Join(" ", leftList)&&z.order_no==dd.order_no).FirstOrDefault(); if (wen != null&&wen.alive== string.Join(" ", leftList)) { wen.mid_item.AddRange(midList); shuwen = new Shuwen(); shuwen.order_no = dd.order_no; shuwen.subject = dd.subject; shuwen.mid_item = new List(); } else { shuwen.alive = string.Join(" ", leftList); shuwen.mid_item.AddRange(midList); shuwenList.Add(shuwen); } } //if (shuwen.mid_item.Count > 0) //{ // shuwenList.Add(shuwen); //} } preOrderNo = dd.order_no; } using (WordprocessingDocument wordDocument = WordprocessingDocument.Create(fullPath, WordprocessingDocumentType.Document, true)) { Body body = new Body(); var doc = GenerateDocument(wordDocument, body); string preItem = string.Empty; foreach(var shu in shuwenList) { if (preItem != shu.subject) { body.Append(RenderParagraph(44, $"{act.subject}{shu.subject} 超薦名單", true)); } body.Append(RenderParagraph(44, "佛力超薦", true)); //foreach (var wen in shu.mid_item) //{ // body.Append(RenderParagraph(44, $" {wen}", false)); //} //這裡要改切段落 List para= new List(); foreach (var p in shu.mid_item) { if (string.Join(" ",para).Length+p.Length>25) { body.Append(RenderParagraph(44, $"{string.Join(" ", para)}", false)); para.Clear(); } para.Add(p.ToString()); } if (para.Count>0) { body.Append(RenderParagraph(44, $"{string.Join(" ", para)}", false)); para.Clear(); } body.Append(RenderParagraph(44, $"陽上報恩人", true)); body.Append(RenderParagraph(44, $"{shu.alive}", false)); preItem=shu.subject; } SetStraight(body); } } return Ok(new { result = "Y", data = new { list = list, list1 = list1 } }); } public void ChangePage(Body body) { Paragraph paragraph1 = new Paragraph() { RsidParagraphAddition = "00A56886", RsidRunAdditionDefault = "00D919D0" }; Run pageBreakRun = new Run(); pageBreakRun.Append(new Break() { Type = BreakValues.Page }); // 指定 Break 類型為 Page (換頁) paragraph1.Append(pageBreakRun); body.Append(paragraph1); } public WordprocessingDocument GenerateDocument(WordprocessingDocument document1,Body body) { MainDocumentPart mainPart = document1.AddMainDocumentPart(); mainPart.Document = new DocumentFormat.OpenXml.Wordprocessing.Document(); mainPart.Document.AppendChild(body); return document1; } public void SetStraight(Body body) { SectionProperties sectionProperties1 = new SectionProperties() { RsidR = "00A56886", RsidSect = "00D919D0" }; PageSize pageSize1 = new PageSize() { Width = 16838U, Height = 11906U, Orient = PageOrientationValues.Landscape }; PageMargin pageMargin1 = new PageMargin() { Top = 1440, Right = 1440U, Bottom = 1440, Left = 1440U, Header = 720U, Footer = 720U, Gutter = 0U }; Columns columns1 = new Columns() { Space = "720" }; TextDirection textDirection3 = new TextDirection() { Val = TextDirectionValues.TopToBottomRightToLeft }; DocGrid docGrid1 = new DocGrid() { LinePitch = 326 }; sectionProperties1.Append(pageSize1); sectionProperties1.Append(pageMargin1); sectionProperties1.Append(columns1); sectionProperties1.Append(textDirection3); sectionProperties1.Append(docGrid1); body.Append(sectionProperties1); } public Paragraph RenderParagraph(int fontSize,string content,bool isBold) { Paragraph paragraph2 = new Paragraph() { RsidParagraphAddition = "00A56886", RsidRunAdditionDefault = "00D919D0" }; ParagraphProperties paragraphProperties2 = new ParagraphProperties(); TextDirection textDirection2 = new TextDirection() { Val = TextDirectionValues.TopToBottomRightToLeft }; // 2. 建立縮排物件 Indentation indent = new Indentation(); // --- 請依需求選擇以下一種縮排方式設定 --- // 懸首縮排 (Hanging): 第一行不動,其餘行縮排。 (1公分約為 567 dxa) indent.Left = "1134"; // 整體左縮排量 indent.Hanging = "1134"; indent.FirstLine = "1134"; paragraphProperties2.Append(indent); paragraphProperties2.Append(textDirection2); Run run2 = new Run(); RunProperties runProperties2 = new RunProperties(); RunFonts runFonts2 = new RunFonts() { Hint = FontTypeHintValues.EastAsia, Ascii = "微軟正黑體", EastAsia = "微軟正黑體" }; FontSize fontSize2 = new FontSize() { Val = $"{fontSize}" }; runProperties2.Append(runFonts2); runProperties2.Append(fontSize2); if (isBold) { runProperties2.Append(new Bold()); } Text text2 = new Text(); text2.Space = SpaceProcessingModeValues.Preserve; text2.Text = $"{content}"; run2.Append(runProperties2); run2.Append(text2); paragraph2.Append(paragraphProperties2); paragraph2.Append(run2); return paragraph2; } } public class Shuwen { public Shuwen() { } public string order_no { get; set; } public List mid_item { get; set; } public string alive { get; set; } public string subject { get; set; } }