From da58dc92d0847f98b37dbe84debf6cf88f42632f Mon Sep 17 00:00:00 2001 From: minom Date: Wed, 22 Jul 2026 18:04:17 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AA=BF=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/App_Code/Model/Model.Context.cs | 4 + web/App_Code/Model/Model.cs | 83 ++- web/App_Code/Model/Model.edmx | 229 +++++++- web/App_Code/Model/Model.edmx.diagram | 4 + web/App_Code/Model/ViewModel/receipt.cs | 42 ++ web/App_Code/api/FollowerController.cs | 12 +- web/App_Code/api/orderController.cs | 4 + web/App_Code/api/receiptController.cs | 481 ++++++++++++++++ web/admin/activity/item_reg.aspx.cs | 2 +- web/admin/item/TabletDesigner.aspx | 99 +++- web/admin/order/fastSignUp3.vue | 12 +- web/admin/order/fastSignUp4.vue | 53 +- web/admin/print/TabletDesign.aspx | 135 +++-- web/admin/print/print_multi_new.aspx | 37 +- web/admin/print/tablet_edit/editorNewOne.html | 84 ++- web/admin/receipt/index.aspx | 419 ++++++++++++++ web/admin/receipt/index.aspx.cs | 14 + web/admin/receipt/receipt.vue | 539 ++++++++++++++++++ web/rpt/sample/receipt_sample01.docx | Bin 0 -> 20328 bytes 19 files changed, 2105 insertions(+), 148 deletions(-) create mode 100644 web/App_Code/Model/ViewModel/receipt.cs create mode 100644 web/App_Code/api/receiptController.cs create mode 100644 web/admin/receipt/index.aspx create mode 100644 web/admin/receipt/index.aspx.cs create mode 100644 web/admin/receipt/receipt.vue create mode 100644 web/rpt/sample/receipt_sample01.docx diff --git a/web/App_Code/Model/Model.Context.cs b/web/App_Code/Model/Model.Context.cs index 5362fde..d90a711 100644 --- a/web/App_Code/Model/Model.Context.cs +++ b/web/App_Code/Model/Model.Context.cs @@ -95,6 +95,10 @@ namespace Model public virtual DbSet AncestralTabletStatus { get; set; } public virtual DbSet GuaDanOrderGuest { get; set; } public virtual DbSet auto_enroll { get; set; } + public virtual DbSet receipt_detail { get; set; } + public virtual DbSet receipt_master { get; set; } + public virtual DbSet receipt_style { get; set; } + public virtual DbSet receipt_style_d { get; set; } public virtual int pager_eztrust(Nullable startRowIndex, Nullable pageSize, string tableName, string columnName, string sqlWhere, string orderBy, ObjectParameter rowCount) { diff --git a/web/App_Code/Model/Model.cs b/web/App_Code/Model/Model.cs index 43d509f..e9ae360 100644 --- a/web/App_Code/Model/Model.cs +++ b/web/App_Code/Model/Model.cs @@ -694,8 +694,8 @@ namespace Model public int num { get; set; } public int f_num { get; set; } - public System.DateTime start_date { get; set; } - public System.DateTime end_date { get; set; } + public Nullable start_date { get; set; } + public Nullable end_date { get; set; } public string receipt_title { get; set; } public string receipt_address { get; set; } @@ -1539,6 +1539,85 @@ namespace Model using System; using System.Collections.Generic; + public partial class receipt_detail + { + public int num { get; set; } + public Nullable receipt_num { get; set; } + public string title { get; set; } + public Nullable amt { get; set; } + public string receipt_no { get; set; } + public string caseofficer { get; set; } + public string c_user { get; set; } + public string c_date { get; set; } + public string c_time { get; set; } + public string u_user { get; set; } + public string u_date { get; set; } + public string u_time { get; set; } + public string addr { get; set; } + } +} +namespace Model +{ + using System; + using System.Collections.Generic; + + public partial class receipt_master + { + public int num { get; set; } + public string order_no { get; set; } + public Nullable total_amt { get; set; } + public string receipt_date { get; set; } + public Nullable style_num { get; set; } + public string c_user { get; set; } + public string c_date { get; set; } + public string c_time { get; set; } + public string u_user { get; set; } + public string u_date { get; set; } + public string u_time { get; set; } + public string source { get; set; } + } +} +namespace Model +{ + using System; + using System.Collections.Generic; + + public partial class receipt_style + { + public int num { get; set; } + public string name { get; set; } + public string c_user { get; set; } + public string c_date { get; set; } + public string c_time { get; set; } + public string u_user { get; set; } + public string u_date { get; set; } + public string u_time { get; set; } + } +} +namespace Model +{ + using System; + using System.Collections.Generic; + + public partial class receipt_style_d + { + public int num { get; set; } + public Nullable style_num { get; set; } + public string item_name { get; set; } + public string item_value { get; set; } + public string c_user { get; set; } + public string c_date { get; set; } + public string c_time { get; set; } + public string u_user { get; set; } + public string u_date { get; set; } + public string u_time { get; set; } + } +} +namespace Model +{ + using System; + using System.Collections.Generic; + public partial class Region { [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")] diff --git a/web/App_Code/Model/Model.edmx b/web/App_Code/Model/Model.edmx index 1029793..5d5431a 100644 --- a/web/App_Code/Model/Model.edmx +++ b/web/App_Code/Model/Model.edmx @@ -343,10 +343,10 @@ - - + + - + @@ -419,7 +419,7 @@ - + @@ -795,6 +795,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1140,15 +1203,15 @@ - - + + - + - + @@ -2188,6 +2251,10 @@ + + + + @@ -2246,8 +2313,8 @@ - - + + @@ -2953,7 +3020,7 @@ - + @@ -4620,6 +4687,10 @@ + + + + @@ -5343,10 +5414,10 @@ - - + + - + @@ -5376,6 +5447,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -6447,6 +6581,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/App_Code/Model/Model.edmx.diagram b/web/App_Code/Model/Model.edmx.diagram index f56637a..83927fa 100644 --- a/web/App_Code/Model/Model.edmx.diagram +++ b/web/App_Code/Model/Model.edmx.diagram @@ -165,6 +165,10 @@ + + + + diff --git a/web/App_Code/Model/ViewModel/receipt.cs b/web/App_Code/Model/ViewModel/receipt.cs new file mode 100644 index 0000000..c3925d0 --- /dev/null +++ b/web/App_Code/Model/ViewModel/receipt.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; +namespace Model.ViewModel +{ + /// + /// receipt 的摘要描述 + /// + public class receipt_master + { + public receipt_master() + { + // + // TODO: 在這裡新增建構函式邏輯 + // + } + + public int? num { get; set; } + public string order_no { get; set; } + public int? total_amt { get; set; } + public int? style_num { get; set; } + public string source { get; set; } + public string receipt_date { get; set; } + public List list { get;set ; } + + } + + public class receipt_detail + { + public receipt_detail() + { + } + public int? num { get; set; } + public int? receipt_num { get; set; } + public string title { get; set; } + public string receipt_no { get; set; } + public int? amt { get; set; } + public string caseofficer { get; set; } + public string addr { get; set; } + } +} \ No newline at end of file diff --git a/web/App_Code/api/FollowerController.cs b/web/App_Code/api/FollowerController.cs index 386502c..01b01c6 100644 --- a/web/App_Code/api/FollowerController.cs +++ b/web/App_Code/api/FollowerController.cs @@ -738,8 +738,8 @@ public class FollowerController : ApiController 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_start_date = x.start_date.Value.ToString("yyyy-MM-dd"), + auto_enroll_end_date = x.end_date.Value.ToString("yyyy-MM-dd"), auto_enroll_receipt_title = x.receipt_title?? "", auto_enroll_receipt_address = x.receipt_address?? "", }), @@ -768,7 +768,7 @@ public class FollowerController : ApiController ; _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); + CreateOrdersForActivities(item.f_num, autoEnroll.num, item.start_date.Value, item.end_date.Value, item.receipt_title, item.receipt_address); } else { @@ -781,7 +781,7 @@ public class FollowerController : ApiController 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); + CreateOrdersForActivities(item.f_num, autoEnroll.num, item.start_date.Value, item.end_date.Value, item.receipt_title, item.receipt_address); } try @@ -789,8 +789,8 @@ public class FollowerController : ApiController var ret = new { num = autoEnroll.num, - start_date = autoEnroll.start_date.ToString("yyyy-MM-dd"), - end_date = autoEnroll.end_date.ToString("yyyy-MM-dd"), + start_date = autoEnroll.start_date.Value.ToString("yyyy-MM-dd"), + end_date = autoEnroll.end_date.Value.ToString("yyyy-MM-dd"), receipt_title = autoEnroll.receipt_title, receipt_address = autoEnroll.receipt_address, }; diff --git a/web/App_Code/api/orderController.cs b/web/App_Code/api/orderController.cs index 9079577..a826abe 100644 --- a/web/App_Code/api/orderController.cs +++ b/web/App_Code/api/orderController.cs @@ -391,6 +391,7 @@ public class orderController : ApiController o_detail.qty = detail.qty; o_detail.printed_files = detail.printed_files; o_detail.style = detail.style; + o_detail.print_id = GenerateSequentialId(o_detail, order); Newtonsoft.Json.Linq.JArray mid_items = new Newtonsoft.Json.Linq.JArray(); foreach (var data in detail.mid_items) { @@ -514,6 +515,8 @@ public class orderController : ApiController qry = qry.Where(o => o.f_num != null && o.follower != null && encrypt.DecryptAutoKey(o.follower.id_code) == q.f_user.id_code); } + sortBy = sortBy ?? string.Empty; + if (sortBy.Equals("order_no")) { if (sortDesc) @@ -580,6 +583,7 @@ public class orderController : ApiController uptime=x.up_time?.ToString("yyyy-MM-dd"), keyin1_txt = Model.pro_order.keyin1_value_to_text(x.keyin1), status = x.activity.activity_check.FirstOrDefault(a => x.activity_num == a.activity_num && x.f_num == a.f_num)?.status ?? 0, + amt = _db.pro_order_detail.Where(y => y.order_no == x.order_no).Select(y => new {y.price,y.qty}).Sum(y => y.price*y.qty), }), count = count }; diff --git a/web/App_Code/api/receiptController.cs b/web/App_Code/api/receiptController.cs new file mode 100644 index 0000000..7c51570 --- /dev/null +++ b/web/App_Code/api/receiptController.cs @@ -0,0 +1,481 @@ +using DocumentFormat.OpenXml; +using DocumentFormat.OpenXml.Drawing; +using DocumentFormat.OpenXml.Packaging; +using DocumentFormat.OpenXml.Vml; +using DocumentFormat.OpenXml.Wordprocessing; +using Model; +using NPOI.OpenXmlFormats.Wordprocessing; +using NPOI.Util; +using PagedList; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net; +using System.Net.Http; +using System.Net.Http.Headers; +using System.Web; +using System.Web.Http; +using System.Web.UI.WebControls; +using Break = DocumentFormat.OpenXml.Wordprocessing.Break; +using Paragraph = DocumentFormat.OpenXml.Wordprocessing.Paragraph; +using Run = DocumentFormat.OpenXml.Wordprocessing.Run; +using Table = DocumentFormat.OpenXml.Wordprocessing.Table; +using Text = DocumentFormat.OpenXml.Wordprocessing.Text; + +/// +/// receiptController 的摘要描述 +/// +[ezAuthorize] +public class receiptController: ApiController +{ + private Model.ezEntities _db = new Model.ezEntities(); + public receiptController() + { + // + // TODO: 在這裡新增建構函式邏輯 + // + } + + public string generend_receiptNo(string source) + { + string start = source + "A"; + string no = start + DateTime.Now.ToString("yyyyMMdd"); + var qry = _db.receipt_detail.Where(x => x.receipt_no.StartsWith(no)); + var receipt_no=qry.Select(x => x.receipt_no).Max(); + if (!string.IsNullOrEmpty(receipt_no)) + { + receipt_no= receipt_no.Remove(0,(start + DateTime.Now.ToString("yyyyMMdd")).Length); + return start + DateTime.Now.ToString("yyyyMMdd")+string.Format("{0:D4}", Int32.Parse(receipt_no)+1); + } + else + { + return start + DateTime.Now.ToString("yyyyMMdd") + "0001"; + } + } + + [HttpPost] + [Route("api/receipt/UpdateReceiptWithDetail")] + public IHttpActionResult UpdateReceiptWithDetail([FromBody] Model.ViewModel.receipt_master receipt) + { + int master_no = 0; + try + { + //Model.receipt_master m = new Model.receipt_master(); + List list = new List(); + var master = _db.receipt_master.Where(x => x.num == receipt.num).FirstOrDefault(); + if (master != null) + { + master.u_time = DateTime.Now.ToString("HHmmss"); + master.u_date = DateTime.Now.ToString("yyyyMMdd"); + } + master_no=master.num; + //m.receipt_date = receipt.receipt_date; + //m.order_no = receipt.order_no; + //m.total_amt = receipt.total_amt; + //m.style_num = receipt.style_num; + //m.source = receipt.source; + //m.num=(int)receipt.num; + + //m.c_date = DateTime.Now.ToString("yyyyMMdd"); + //m.c_time = DateTime.Now.ToString("HHmmss"); + //m.u_time = DateTime.Now.ToString("HHmmss"); + //m.u_date = DateTime.Now.ToString("yyyyMMdd"); + //_db.receipt_master.Add(m); + //_db.SaveChanges(); + //master_no = m.num; + string pre_no = string.Empty; + foreach (var d in receipt.list) + { + if (d.num == 0) + { + + + receipt_detail dd = new receipt_detail(); + if (string.IsNullOrEmpty(pre_no)) + { + dd.receipt_no = generend_receiptNo(master.source); + } + else + { + string new_no = pre_no.Remove(0, 10); + dd.receipt_no = master.source + "A" + DateTime.Now.ToString("yyyyMMdd") + string.Format("{0:D4}", Int32.Parse(new_no) + 1); + } + dd.addr = d.addr; + dd.title = d.title; + dd.amt = d.amt; + dd.caseofficer = d.caseofficer; + dd.receipt_num = master.num; + dd.c_date = DateTime.Now.ToString("yyyyMMdd"); + dd.c_time = DateTime.Now.ToString("HHmmss"); + dd.u_time = DateTime.Now.ToString("HHmmss"); + dd.u_date = DateTime.Now.ToString("yyyyMMdd"); + pre_no = dd.receipt_no; + list.Add(dd); + } + else + { + var dd=_db.receipt_detail.Where(x=>x.num==d.num).FirstOrDefault(); + dd.title=d.title; + dd.amt=d.amt; + dd.caseofficer=d.caseofficer; + dd.u_time = DateTime.Now.ToString("HHmmss"); + dd.u_date = DateTime.Now.ToString("yyyyMMdd"); + } + } + _db.receipt_detail.AddRange(list); + _db.SaveChanges(); + return Ok(new { result = "Y", message = "存檔成功" }); + } + catch (Exception ex) + { + var s = _db.receipt_master.Where(x => x.num == master_no).FirstOrDefault(); + if (s != null) + { + _db.receipt_master.Remove(s); + _db.SaveChanges(); + } + return Ok(new { result = "N", message = $"存檔失敗,{ex.Message} {ex.StackTrace}" }); + } + + } + + + [HttpPost] + [Route("api/receipt/SaveReceiptWithDetail")] + public IHttpActionResult SaveReceiptWithDetail([FromBody] Model.ViewModel.receipt_master receipt) + { + int master_no = 0; + try + { + Model.receipt_master m = new Model.receipt_master(); + List list = new List(); + m.receipt_date = receipt.receipt_date; + m.order_no = receipt.order_no; + m.total_amt = receipt.total_amt; + m.style_num = receipt.style_num; + m.source = receipt.source; + + m.c_date = DateTime.Now.ToString("yyyyMMdd"); + m.c_time = DateTime.Now.ToString("HHmmss"); + m.u_time= DateTime.Now.ToString("HHmmss"); + m.u_date = DateTime.Now.ToString("yyyyMMdd"); + _db.receipt_master.Add(m); + _db.SaveChanges(); + master_no = m.num; + string pre_no = string.Empty; + foreach (var d in receipt.list) + { + + receipt_detail dd = new receipt_detail(); + if (string.IsNullOrEmpty(pre_no)) + { + dd.receipt_no = generend_receiptNo(m.source); + } + else + { + string new_no = pre_no.Remove(0,10); + dd.receipt_no = m.source + "A" + DateTime.Now.ToString("yyyyMMdd") + string.Format("{0:D4}", Int32.Parse(new_no)+1); + } + dd.addr = d.addr; + dd.title = d.title; + dd.amt = d.amt; + dd.caseofficer = d.caseofficer; + dd.receipt_num = m.num; + dd.c_date = DateTime.Now.ToString("yyyyMMdd"); + dd.c_time = DateTime.Now.ToString("HHmmss"); + dd.u_time = DateTime.Now.ToString("HHmmss"); + dd.u_date = DateTime.Now.ToString("yyyyMMdd"); + pre_no = dd.receipt_no; + list.Add(dd); + } + _db.receipt_detail.AddRange(list); + _db.SaveChanges(); + return Ok(new {result="Y",message="存檔成功"}); + } + catch (Exception ex) + { + var s=_db.receipt_master.Where(x=>x.num==master_no).FirstOrDefault(); + if (s != null) + { + _db.receipt_master.Remove(s); + _db.SaveChanges(); + } + return Ok(new { result = "N", message = $"存檔失敗,{ex.Message} {ex.StackTrace}" }); + } + + } + + [HttpPost] + [Route("api/receipt/GetList")] + public IHttpActionResult GetList([FromBody] Model.ViewModel.receipt_master r, + int page, int pageSize = 10, string sortBy = "", bool sortDesc = false) + { + var qry = _db.receipt_master.AsQueryable(); + if (r.num.HasValue) + qry = qry.Where(x => x.num == r.num.Value); + if (!string.IsNullOrEmpty(r.receipt_date)) + qry = qry.Where(x=>x.receipt_date==r.receipt_date); + if (!string.IsNullOrEmpty(r.source)) + qry = qry.Where(x => x.source == r.source); + if (!string.IsNullOrEmpty(r.order_no)) + qry = qry.Where(x => x.order_no == r.order_no); + + qry=qry.OrderBy(x => x.num); + var count = qry.Count(); + var qryList = (pageSize > 0) ? qry.ToPagedList(page, pageSize).ToList() : qry.ToList(); + var ret = new + { + list = qryList.Select(x => new + { + x.num,x.source,x.order_no,x.total_amt,x.receipt_date,x.style_num, + follower=_db.pro_order.Where(y=>y.order_no==x.order_no).Select(y=>new { + u_name=_db.followers.Where(z=>z.num==y.f_num).Select(z=>z.u_name).FirstOrDefault(), + }).FirstOrDefault(), + receipt_count=_db.receipt_detail.Where(w=>w.receipt_num==x.num).Count() + }), + count=count + }; + if (ret.list == null) throw new HttpResponseException(HttpStatusCode.NotFound); + return Ok(ret); + } + + [HttpPost] + [Route("api/receipt/GetData")] + public IHttpActionResult GetData([FromBody] Model.ViewModel.receipt_master r) + { + var qry = _db.receipt_master.AsQueryable(); + if (r.num.HasValue) + qry = qry.Where(x => x.num == r.num.Value); + if (!string.IsNullOrEmpty(r.receipt_date)) + qry = qry.Where(x => x.receipt_date == r.receipt_date); + if (!string.IsNullOrEmpty(r.source)) + qry = qry.Where(x => x.source == r.source); + if (!string.IsNullOrEmpty(r.order_no)) + qry = qry.Where(x => x.order_no == r.order_no); + + qry = qry.OrderBy(x => x.num); + var ret = new + { + data = qry.Select(x => new + { + x.num, + x.source, + x.order_no, + x.total_amt, + x.receipt_date, + x.style_num, + follower = _db.pro_order.Where(y => y.order_no == x.order_no).Select(y => new { + u_name = _db.followers.Where(z => z.num == y.f_num).Select(z => z.u_name).FirstOrDefault(), + }).FirstOrDefault(), + receipt_detail = _db.receipt_detail.Where(w => w.receipt_num == x.num).ToList(), + orderdetails=_db.pro_order_detail.Where(q=>q.order_no==x.order_no).Select(q=>new + { + records=_db.pro_order_record.Where(rc=>rc.detail_num==q.num).Select(rc=>rc.price).ToList(), + }).ToList() + }).FirstOrDefault(), + + }; + if (ret.data == null) throw new HttpResponseException(HttpStatusCode.NotFound); + return Ok(ret); + } + + [HttpPost] + [Route("api/receipt/GetAllStyle")] + public IHttpActionResult GetAllStyle() + { + var qry = _db.receipt_style.AsQueryable(); + return Ok(new { result = "Y", list = qry.ToList() }); + } + + + [HttpPost] + [Route("api/receipt/PrintReceipt")] + public HttpResponseMessage PrintReceipt([FromBody] Model.receipt_master r) + { + var qry=_db.receipt_master.AsQueryable(); + qry = qry.Where(x=>x.num==r.num); + + var data = qry.Select(x=>new + { + x.num,x.receipt_date,x.source,x.order_no,x.style_num, + details=_db.receipt_detail.Where(y=>y.receipt_num==x.num).ToList(), + styleDetail=_db.receipt_style_d.Where(z=>z.style_num==x.style_num).ToList(), + }).FirstOrDefault(); + + + try + { + string templatePath = HttpContext.Current.Server.MapPath("~/rpt/sample/receipt_sample01.docx"); + + if (!File.Exists(templatePath)) + { + return Request.CreateResponse(HttpStatusCode.NotFound, "Template file not found."); + } + byte[] templateBytes = File.ReadAllBytes(templatePath); + + // 2. 建立記憶體串流 + MemoryStream outputStream = new MemoryStream(); + outputStream.Write(templateBytes, 0, templateBytes.Length); + + // 3. 使用 Open XML 處理記憶體中的資料 + using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(outputStream, true)) + { + var body = wordDoc.MainDocumentPart.Document.Body; + var templateTable = body.Elements().FirstOrDefault(); + + if (templateTable != null && data.details != null && data.details.Count > 0) + { + OpenXmlElement currentAnchor = templateTable; + // 建立全域計數器 (請實作於迴圈外部,避免歸零) + int docPrIdCounter = 1000; + int vmlIdCounter = 2000; + for (int i = 0; i < data.details.Count; i++) + { + Table newTable = (Table)templateTable.CloneNode(true); + + + + // --- 步驟 A:修復 DrawingML 的 docPr ID --- + foreach (var docPr in newTable.Descendants()) + { + docPr.Id = (uint)docPrIdCounter++; + // 順便變更 Name,避免如 "直線接點 2" 的名稱重複 + docPr.Name = $"直線接點_{docPrIdCounter}"; + } + + // --- 步驟 B:修復 VML 的 id 與 o:spid --- + foreach (var line in newTable.Descendants()) + { + string newSpid = $"_x0000_s{vmlIdCounter++}"; + + // 更新原本的 v:line id + line.Id = $"直線接點_{vmlIdCounter}"; + + // o:spid 屬於 Office 擴充屬性,透過 SetAttribute 強制覆寫 + var oNamespace = "urn:schemas-microsoft-com:office:office"; + line.SetAttribute(new OpenXmlAttribute("spid", "o", oNamespace, newSpid)); + } + // 移除複製出來的書籤標籤,保持結構乾淨 + var bookmarksStarts = newTable.Descendants().ToList(); + var bookmarksEnds = newTable.Descendants().ToList(); + + foreach (var bm in bookmarksStarts) bm.Remove(); + foreach (var bm in bookmarksEnds) bm.Remove(); + + foreach (var p in newTable.Descendants()) + { + p.RsidParagraphAddition = null; + p.RsidParagraphDeletion = null; + p.RsidParagraphProperties = null; + p.RsidRunAdditionDefault = null; + } + var textElements = newTable.Descendants().ToList(); + foreach (var textNode in textElements) + { + // 檢查文字節點是否包含指定的關鍵字,並進行置換 + if (textNode.Text.Contains("$CompanyTitle")) + { + var companyTitle = data.styleDetail.Where(x => x.item_name == "CompanyTitle").Select(x => x.item_value).FirstOrDefault(); + textNode.Text = textNode.Text.Replace("$CompanyTitle", companyTitle ?? ""); + } + if (textNode.Text.Contains("$ApproveNo")) + { + var approveNo = data.styleDetail.Where(x => x.item_name == "ApproveNo").Select(x => x.item_value).FirstOrDefault(); + textNode.Text = textNode.Text.Replace("$ApproveNo", approveNo ?? ""); + } + if (textNode.Text.Contains("$CompanyTaxNo")) + { + var companyTaxNo = data.styleDetail.Where(x => x.item_name == "CompanyTaxNo").Select(x => x.item_value).FirstOrDefault(); + textNode.Text = textNode.Text.Replace("$CompanyTaxNo", companyTaxNo ?? ""); + } + if (textNode.Text.Contains("$CompanyAddr")) + { + var companyAddr = data.styleDetail.Where(x => x.item_name == "CompanyAddr").Select(x => x.item_value).FirstOrDefault(); + textNode.Text = textNode.Text.Replace("$CompanyAddr", companyAddr ?? ""); + } + if (textNode.Text.Contains("$CompanyTel")) + { + var companyTel = data.styleDetail.Where(x => x.item_name == "CompanyTel").Select(x => x.item_value).FirstOrDefault(); + textNode.Text = textNode.Text.Replace("$CompanyTel", companyTel ?? ""); + } + if (textNode.Text.Contains("$ReceiptNo")) + { + + textNode.Text = textNode.Text.Replace("$ReceiptNo", data.details[i].receipt_no ?? ""); + } + if (textNode.Text.Contains("$ReceiptDate")) + { + textNode.Text = textNode.Text.Replace("$ReceiptDate", data.receipt_date ?? ""); + } + if (textNode.Text.Contains("$ReceiptTitle")) + { + textNode.Text = textNode.Text.Replace("$ReceiptTitle", data.details[i].title ?? ""); + } + if (textNode.Text.Contains("$ReceiptAmt")) + { + textNode.Text = textNode.Text.Replace("$ReceiptAmt", data.details[i].amt.ToString() ?? ""); + } + if (textNode.Text.Contains("$Charge")) + { + textNode.Text = textNode.Text.Replace("$Charge", "" ?? ""); + } + if (textNode.Text.Contains("$Caseofficer")) + { + textNode.Text = textNode.Text.Replace("$Caseofficer", data.details[i].caseofficer ?? ""); + } + + } + + currentAnchor= body.InsertAfter(newTable, currentAnchor); + //currentAnchor = newTable; + + if (i < data.details.Count - 1) + { + + Paragraph pageBreakParagraph = new Paragraph( + new Run( + new Break() { Type = BreakValues.Page } + ) + ); + + // 🔥【關鍵修正】將分頁段落插入到剛才產生的新表格後方 + currentAnchor = body.InsertAfter(pageBreakParagraph, currentAnchor); + } + } + + body.RemoveChild(templateTable); + wordDoc.MainDocumentPart.Document.Save(); + } + } // wordDoc 關閉,確認資料完全寫入 outputStream + + // 🔥 關鍵步驟:重設記憶體串流指標到起點 + outputStream.Position = 0; + + // 4. 建立 HttpResponseMessage + HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK); + + // 將記憶體流包裝成 StreamContent + response.Content = new StreamContent(outputStream); + + // 設定 Content-Type 標頭(Word 專用 MIME Type) + response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/vnd.openxmlformats-officedocument.wordprocessingml.document"); + + // 設定 Content-Disposition 標頭,指定為附件並提供預設檔名 + string fileName = $"Report_{DateTime.Now:yyyyMMddHHmmss}.docx"; + response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") + { + FileName = fileName + }; + + return response; + } + catch (Exception ex) + { + // Log exception details appropriately here + return Request.CreateResponse(HttpStatusCode.InternalServerError, $"Generation failed: {ex.Message}"); + } + } + + +} \ No newline at end of file diff --git a/web/admin/activity/item_reg.aspx.cs b/web/admin/activity/item_reg.aspx.cs index 1df4cd4..ac2a18d 100644 --- a/web/admin/activity/item_reg.aspx.cs +++ b/web/admin/activity/item_reg.aspx.cs @@ -170,7 +170,7 @@ public partial class admin_activity_item_reg : MyWeb.config Model.actItem_files file=new Model.actItem_files(); file.actItem_num= _id; file.files_num = 211; - file.file.reg_time=DateTime.Now; + file.reg_time=DateTime.Now; _db.actItem_files.Add(file); _db.SaveChanges(); Model.admin_log admin_log = new Model.admin_log(); diff --git a/web/admin/item/TabletDesigner.aspx b/web/admin/item/TabletDesigner.aspx index e2ef7cf..331334e 100644 --- a/web/admin/item/TabletDesigner.aspx +++ b/web/admin/item/TabletDesigner.aspx @@ -511,11 +511,11 @@ await axios .post(HTTP_HOST + 'api/tablet/GetTabletElement', {}) .then(response => { - console.log(response) + //console.log(response) //if (response.result=="Y") { if (response.status == "200") { let data = response.data; - console.log("data:",data) + //console.log("data:",data) if (data.result == "Y") { data.data.forEach(x => { self.tabletElements.push(x); @@ -826,9 +826,18 @@ createEl(el, slice) { let html = ''; + let fontSize = el.style.fontSize; // 1. 智慧名單渲染 if (el.type === 'roster') { - html = this.renderRoster(slice, el); + let perRow = Math.floor(Number(el.height) / Number(el.textHeight)); + let rows = Math.ceil(Number(slice.length) / Number(perRow));//總行數 + let rowWidth = Math.floor(Number(el.width) / rows); + let fontSize = Math.floor(rowWidth / 2); + if (fontSize > el.style.fontSize) { + fontSize = el.style.fontSize; + rowWidth = fontSize * 2; + } + html = this.renderRoster(slice, el, rowWidth); } // 2. 正名合併置中 else if (el.type === 'combined-center') { @@ -843,11 +852,27 @@ html = el.text.replace(/(\d+)/g, '$1'); } else if (el.id === 'title1') { - html = this.renderNameList(slice, el); + let perRow = Math.floor(Number(el.height) / Number(el.textHeight)); + let rows = Math.ceil(Number(slice.length) / Number(perRow));//總行數 + let rowWidth = Math.floor(Number(el.width) / rows); + fontSize = Math.floor(rowWidth / 2); + //console.log(el.height, el.textHeight, perRow, rows, rowWidth, fontSize) + if (fontSize > el.style.fontSize) { + fontSize = el.style.fontSize; + rowWidth = fontSize * 2; + } + html = this.renderNameList(slice, el, rowWidth); } else if (el.id === 'alive') { - console.log("createEl:",slice,el) - html = this.renderLiveList(slice, el); + let perRow = Math.floor(Number(el.height) / Number(el.textHeight)); + let rows = Math.ceil(Number(slice.length) / Number(perRow));//總行數 + let rowWidth = Math.floor(Number(el.width) / rows); + fontSize = Math.floor(rowWidth / 2); + if (fontSize > el.style.fontSize) { + fontSize = el.style.fontSize; + rowWidth = fontSize * 2; + } + html = this.renderLiveList(slice, el, rowWidth); } else { html = el.text; @@ -855,12 +880,12 @@ return $(`
`) .css({ - position: "absolute", left: el.x + "mm", top: el.y + "mm", fontSize: el.style.fontSize + 'pt', fontFamily: el.style.fontFamily, "z-index": 9999, visibility: el.style.visibility + position: "absolute", left: el.x + "mm", top: el.y + "mm", fontSize: fontSize + 'pt', fontFamily: el.style.fontFamily, "z-index": 9999, visibility: el.style.visibility //position: "absolute", left: el.startX + "mm", top: el.startY + "mm", fontSize: el.fontSize + 'pt', fontFamily: el.fontFamily, "z-index": 9999, visibility: el.isActive }) .html(html); }, - renderNameList(names, el) { + renderNameList(names, el,rowWidth) { let $namelist = $(`
`).css({ "writing-mode": "vertical rl", display: "flex", @@ -880,16 +905,16 @@ //"row-gap": "1px", let self = this; names.forEach(n => { - $namelist.append(self.renderNameSpan(n, el)) + $namelist.append(self.renderNameSpan(n, el,rowWidth)) }) return $namelist; }, - renderNameSpan(name, el) { + renderNameSpan(name, el,rowWidth) { return $(`${name}`).css({ display: "block", "min-height": `${el.textHeight}px`, "max-height": `${el.height}px`, - width: `${el.textWidth}px`, + width: `${rowWidth}px`, "text-align": "justify", "text-align-last": "justify", @@ -897,8 +922,8 @@ "text-justify": "inter-character", });// "margin-bottom": `${el.textSpan}px`, }, - renderLiveList(names, el) { - console.log("renderLiveList:",names); + renderLiveList(names, el,rowWidth) { + //console.log("renderLiveList:",names); //$("#imp-text").updateActive("text",names) let $namelist = $(`
`).css({ "writing-mode": "vertical rl", @@ -919,18 +944,17 @@ //"row-gap": "1px", let self = this; names.forEach(n => { - $namelist.append(self.renderLiveSpan(n, el)) + $namelist.append(self.renderLiveSpan(n, el,rowWidth)) }) return $namelist; }, - renderLiveSpan(name, el) { - console.log("renderLiveSpan:", name, el - ); + renderLiveSpan(name, el, rowWidth) { + //console.log("renderLiveSpan:", name, el ); return $(`${name}`).css({ display: "block", "min-height": `${el.textHeight}px`, "max-height": `${el.height}px`, - width: `${el.textWidth}px`, + width: `${rowWidth}px`, "text-align": "justify", "text-align-last": "justify", @@ -1000,9 +1024,9 @@ }, select(id) { - console.log("QQ:",id); + //console.log("QQ:",id); this.activeId = id; - console.log("QQ:",this.elements); + //console.log("QQ:",this.elements); const el = this.elements.find(x => x.id === id); const el1 = this.elements.find(x => x.id === "titletriangle"); $('#attr-box').removeClass('d-none'); @@ -1024,7 +1048,7 @@ }, updateActive(key, val) { - console.log("updateActive:",key, val) + //console.log("updateActive:",key, val) const el = this.elements.find(x => x.id === this.activeId); if (key === 'fontSize') el.style.fontSize = parseFloat(val); @@ -1042,7 +1066,7 @@ position: "absolute", left: el.startX + "mm", top: el.startY + "mm", fontSize: el.style.fontSize + 'pt', fontFamily: el.fontFamily, "z-index": 9999, visibility: el.style.isActive }).html(this.renderRoster(names.slice(0 * this.rosterLimit, (0 + 1) * this.rosterLimit), el)); } else if (el.type == "combined-center") { - console.log("combined-center"); + //console.log("combined-center"); const parts = el.text.split('\n'); html = `
@@ -1058,16 +1082,33 @@ } else if (this.activeId === "title1") { let names = el.text.split('\n').filter(s => s.trim()); let slice = names.slice(0 * this.rosterLimit, (0 + 1) * this.rosterLimit); - html = this.renderNameList(slice, el); + let perRow = Math.floor(Number(el.height) / Number(el.textHeight)); + let rows = Math.ceil(Number(slice.length) / Number(perRow));//總行數 + let rowWidth = Math.floor(Number(el.width) / rows); + let fontSize = Math.floor(rowWidth / 2); + if (fontSize > el.style.fontSize) { + fontSize = el.style.fontSize; + rowWidth = fontSize * 2; + } + //console.log(el.height, el.textHeight, perRow, rows, rowWidth, fontSize) + html = this.renderNameList(slice, el, rowWidth);//el.style.fontSize $(`.tablet-element[id="${this.activeId}"]`).css({ - position: "absolute", left: el.x + "mm", top: el.y + "mm", fontSize: el.style.fontSize + 'pt', fontFamily: el.style.fontFamily, "z-index": 9999, visibility: el.style.visibility + position: "absolute", left: el.x + "mm", top: el.y + "mm", fontSize: fontSize + 'pt', fontFamily: el.style.fontFamily, "z-index": 9999, visibility: el.style.visibility }).html(html); } else if (this.activeId === "alive") { let names = el.text.split('\n').filter(s => s.trim()); let slice = names.slice(0 * this.rosterLimit, (0 + 1) * this.rosterLimit); - html = this.renderLiveList(slice, el); + let perRow = Math.floor(Number(el.height) / Number(el.textHeight)); + let rows = Math.ceil(Number(slice.length) / Number(perRow));//總行數 + let rowWidth = Math.floor(Number(el.width) / rows); + let fontSize = Math.floor(rowWidth / 2); + if (fontSize > el.style.fontSize) { + fontSize = el.style.fontSize; + rowWidth = fontSize * 2; + } + html = this.renderLiveList(slice, el, rowWidth); $(`.tablet-element[id="${this.activeId}"]`).css({ - position: "absolute", left: el.x + "mm", top: el.y + "mm", fontSize: el.style.fontSize + 'pt', fontFamily: el.style.fontFamily, "z-index": 9999, visibility: el.style.visibility + position: "absolute", left: el.x + "mm", top: el.y + "mm", fontSize: fontSize + 'pt', fontFamily: el.style.fontFamily, "z-index": 9999, visibility: el.style.visibility }).html(html); } else if (this.activeId==="righttitle") { $(`.tablet-element[id="${this.activeId}"]`).css({ @@ -1095,11 +1136,11 @@ //this.render(); }, displayItem(id) { - console.log("displayItem:", this.elements, id); + //console.log("displayItem:", this.elements, id); let el = this.elements.find(x => x.id === id); el.style.visibility = el.style.visibility === "hidden" ? "" : "hidden"; //要判斷如果所在位置超出範圍,要拉回來放 - console.log("displayItem:", this.paper, el) + //console.log("displayItem:", this.paper, el) if (el.x > this.paper.width) { el.x = this.paper.width/2 } @@ -1197,7 +1238,7 @@ orientation: $("#paperOrientation").val(), printPageCount: $("#perpage").val(), rosterLimit: 8, detail: detail } - console.log(master); + //console.log(master); let path = "SavDegignerData"; if (this.styleID != null && this.styleID != "") { path = "UpdateDegignerData" diff --git a/web/admin/order/fastSignUp3.vue b/web/admin/order/fastSignUp3.vue index 51fd5b6..08f6707 100644 --- a/web/admin/order/fastSignUp3.vue +++ b/web/admin/order/fastSignUp3.vue @@ -386,10 +386,10 @@ return ""; } let data = JSON.parse(item.f_num_tablet) - let left = data.left_items - let mid = data.mid_items - let mid_right = data.mid_right - let mid_left=data.mid_left + let left = data?.left_items + let mid = data?.mid_items + let mid_right = data?.mid_right + let mid_left=data?.mid_left let returnVal = "" if (left) { returnVal = "陽上:" + left.map(x => x.fam_name).join("、") @@ -418,7 +418,7 @@ this.tablet_list.forEach(x => { if (x.actitem_num_checked && x.actitem_num_checked == true) { - console.log("OOQ:", x) + //console.log("OOQ:", x) //console.log("OOQ:", x.num) let actItem = this.act_items.find(y => y.act_item_selected.val == x.actitem_num_selected.val) detail.push({ @@ -456,7 +456,7 @@ this.message_dialog.show_confirm = false this.message_dialog.show = true this.message_dialog.message =error - console.log(error) + //console.log(error) }); } } diff --git a/web/admin/order/fastSignUp4.vue b/web/admin/order/fastSignUp4.vue index 08bc50b..75dbd35 100644 --- a/web/admin/order/fastSignUp4.vue +++ b/web/admin/order/fastSignUp4.vue @@ -4,8 +4,8 @@

快速報名

- 儲存 - 返回 + 儲存 + 返回
@@ -24,13 +24,13 @@ - e + + label="*國籍">--> + label="*性別">--> + label="*身分別">--> + label="生日">--> + label="生日">--> + label="存/歿">--> 加入 @@ -165,7 +165,7 @@ item-value="val" v-model="alive_new.islive"> + label="存/歿">--> 加入 @@ -187,7 +187,14 @@ -
+ + + {{ snackbar.text }} + + + + + + + + + +
+ + + + + + + + + + + + 共 {{ data_table.count }} 筆, 頁數: + + + + + + + + + + + 查詢:{{search_dialog.current.title}} + mdi-close + + + + + + + + 查詢 + 清除條件 + + + + + + + + + + + + + +
+
+ + + + + + diff --git a/web/admin/receipt/index.aspx.cs b/web/admin/receipt/index.aspx.cs new file mode 100644 index 0000000..ff084c3 --- /dev/null +++ b/web/admin/receipt/index.aspx.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; +using System.Web.UI; +using System.Web.UI.WebControls; + +public partial class admin_receipt_index : MyWeb.config +{ + protected void Page_Load(object sender, EventArgs e) + { + + } +} \ No newline at end of file diff --git a/web/admin/receipt/receipt.vue b/web/admin/receipt/receipt.vue new file mode 100644 index 0000000..0a4313d --- /dev/null +++ b/web/admin/receipt/receipt.vue @@ -0,0 +1,539 @@ + + + \ No newline at end of file diff --git a/web/rpt/sample/receipt_sample01.docx b/web/rpt/sample/receipt_sample01.docx new file mode 100644 index 0000000000000000000000000000000000000000..646cbef57f567a8a6906162fd82d65e30c95de44 GIT binary patch literal 20328 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 D@JPT3 literal 0 HcmV?d00001